aboutsummaryrefslogtreecommitdiffstats
path: root/examples/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'examples/widgets')
-rw-r--r--examples/widgets/animation/animatedtiles/animatedtiles.py242
-rw-r--r--examples/widgets/animation/animatedtiles/animatedtiles.pyproject3
-rw-r--r--examples/widgets/animation/animatedtiles/animatedtiles_rc.py2768
-rw-r--r--examples/widgets/animation/animatedtiles/doc/animatedtiles.pngbin0 -> 299266 bytes
-rw-r--r--examples/widgets/animation/animatedtiles/doc/animatedtiles.rst8
-rw-r--r--examples/widgets/animation/appchooser/appchooser.py134
-rw-r--r--examples/widgets/animation/appchooser/appchooser.pyproject2
-rw-r--r--examples/widgets/animation/appchooser/appchooser_rc.py1070
-rw-r--r--examples/widgets/animation/appchooser/doc/appchooser.pngbin0 -> 22259 bytes
-rw-r--r--examples/widgets/animation/appchooser/doc/appchooser.rst9
-rw-r--r--examples/widgets/animation/easing/doc/easing.pngbin0 -> 24136 bytes
-rw-r--r--examples/widgets/animation/easing/doc/easing.rst9
-rw-r--r--examples/widgets/animation/easing/easing.py360
-rw-r--r--examples/widgets/animation/easing/easing.pyproject3
-rw-r--r--examples/widgets/animation/easing/easing.qrc5
-rw-r--r--examples/widgets/animation/easing/easing_rc.py361
-rw-r--r--examples/widgets/animation/easing/form.ui101
-rw-r--r--examples/widgets/animation/easing/images/qt-logo.pngbin5149 -> 0 bytes
-rw-r--r--examples/widgets/animation/easing/ui_form.py82
-rw-r--r--examples/widgets/animation/states/doc/states.pngbin0 -> 21700 bytes
-rw-r--r--examples/widgets/animation/states/doc/states.rst8
-rw-r--r--examples/widgets/animation/states/states.py313
-rw-r--r--examples/widgets/animation/states/states.pyproject2
-rw-r--r--examples/widgets/animation/states/states_rc.py47
-rw-r--r--examples/widgets/codeeditor/codeeditor.py141
-rw-r--r--examples/widgets/codeeditor/main.py52
-rw-r--r--examples/widgets/desktop/screenshot/doc/screenshot.pngbin0 -> 13890 bytes
-rw-r--r--examples/widgets/desktop/screenshot/doc/screenshot.rst8
-rw-r--r--examples/widgets/desktop/screenshot/screenshot.py156
-rw-r--r--examples/widgets/desktop/screenshot/screenshot.pyproject3
-rw-r--r--examples/widgets/desktop/systray/images/bad.png (renamed from examples/widgets/systray/images/bad.png)bin2496 -> 2496 bytes
-rw-r--r--examples/widgets/desktop/systray/images/heart.png (renamed from examples/widgets/systray/images/heart.png)bin25780 -> 25780 bytes
-rw-r--r--examples/widgets/desktop/systray/images/trash.png (renamed from examples/widgets/systray/images/trash.png)bin12128 -> 12128 bytes
-rw-r--r--examples/widgets/desktop/systray/main.py21
-rw-r--r--examples/widgets/desktop/systray/rc_systray.py (renamed from examples/widgets/systray/rc_systray.py)338
-rw-r--r--examples/widgets/desktop/systray/systray.pyproject (renamed from examples/widgets/systray/systray.pyproject)0
-rw-r--r--examples/widgets/desktop/systray/systray.qrc (renamed from examples/widgets/systray/systray.qrc)0
-rw-r--r--examples/widgets/desktop/systray/window.py236
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard.py628
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard.pyproject3
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard.qrc4
-rw-r--r--examples/widgets/dialogs/classwizard/classwizard_rc.py5632
-rw-r--r--examples/widgets/dialogs/classwizard/doc/classwizard.pngbin0 -> 32720 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/doc/classwizard.rst11
-rw-r--r--examples/widgets/dialogs/classwizard/images/background.pngbin22578 -> 20018 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo1.pngbin1619 -> 0 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo2.pngbin1619 -> 0 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/logo3.pngbin1619 -> 0 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/watermark1.pngbin14516 -> 12190 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/images/watermark2.pngbin14912 -> 0 bytes
-rw-r--r--examples/widgets/dialogs/classwizard/listchooser.py173
-rw-r--r--examples/widgets/dialogs/dialogs.pyproject4
-rw-r--r--examples/widgets/dialogs/extension.py113
-rw-r--r--examples/widgets/dialogs/extension/extension.py77
-rw-r--r--examples/widgets/dialogs/extension/extension.pyproject3
-rw-r--r--examples/widgets/dialogs/findfiles.py210
-rw-r--r--examples/widgets/dialogs/licensewizard/doc/licensewizard.pngbin0 -> 47064 bytes
-rw-r--r--examples/widgets/dialogs/licensewizard/doc/licensewizard.rst9
-rw-r--r--examples/widgets/dialogs/licensewizard/images/logo.pngbin0 -> 1810 bytes
-rw-r--r--examples/widgets/dialogs/licensewizard/images/watermark.pngbin0 -> 34998 bytes
-rw-r--r--examples/widgets/dialogs/licensewizard/licensewizard.py298
-rw-r--r--examples/widgets/dialogs/licensewizard/licensewizard.pyproject3
-rw-r--r--examples/widgets/dialogs/licensewizard/main.py15
-rw-r--r--examples/widgets/dialogs/standarddialogs.py319
-rw-r--r--examples/widgets/dialogs/standarddialogs/standarddialogs.py437
-rw-r--r--examples/widgets/dialogs/standarddialogs/standarddialogs.pyproject3
-rw-r--r--examples/widgets/dialogs/tabdialog/doc/tabdialog.pngbin0 -> 13222 bytes
-rw-r--r--examples/widgets/dialogs/tabdialog/doc/tabdialog.rst13
-rw-r--r--examples/widgets/dialogs/tabdialog/tabdialog.py178
-rw-r--r--examples/widgets/dialogs/tabdialog/tabdialog.pyproject3
-rw-r--r--examples/widgets/dialogs/trivialwizard.py112
-rw-r--r--examples/widgets/dialogs/trivialwizard/trivialwizard.py63
-rw-r--r--examples/widgets/dialogs/trivialwizard/trivialwizard.pyproject3
-rw-r--r--examples/widgets/draganddrop/draggableicons/doc/draggableicons.pngbin0 -> 21766 bytes
-rw-r--r--examples/widgets/draganddrop/draggableicons/doc/draggableicons.rst9
-rw-r--r--examples/widgets/draganddrop/draggableicons/draggableicons.py128
-rw-r--r--examples/widgets/draganddrop/draggableicons/draggableicons.qrc7
-rw-r--r--examples/widgets/draganddrop/draggableicons/images/boat.pngbin0 -> 2772 bytes
-rw-r--r--examples/widgets/draganddrop/draggableicons/images/car.pngbin0 -> 2963 bytes
-rw-r--r--examples/widgets/draganddrop/draggableicons/images/house.pngbin0 -> 3292 bytes
-rw-r--r--examples/widgets/draganddrop/draggabletext/draggabletext.py126
-rw-r--r--examples/widgets/draganddrop/draggabletext/draggabletext.pyproject3
-rw-r--r--examples/widgets/draganddrop/draggabletext/draggabletext_rc.py6
-rw-r--r--examples/widgets/draganddrop/dropsite/doc/dropsite.rst8
-rw-r--r--examples/widgets/draganddrop/dropsite/droparea.py67
-rw-r--r--examples/widgets/draganddrop/dropsite/dropsite.pyproject3
-rw-r--r--examples/widgets/draganddrop/dropsite/dropsitewindow.py115
-rw-r--r--examples/widgets/draganddrop/dropsite/main.py15
-rw-r--r--examples/widgets/effects/blurpicker/blureffect.py33
-rw-r--r--examples/widgets/effects/blurpicker/blurpicker.py105
-rw-r--r--examples/widgets/effects/blurpicker/blurpicker.pyproject17
-rw-r--r--examples/widgets/effects/blurpicker/doc/blurpicker.pngbin0 -> 48358 bytes
-rw-r--r--examples/widgets/effects/blurpicker/doc/blurpicker.rst9
-rw-r--r--examples/widgets/effects/blurpicker/images/README.txt5
-rw-r--r--examples/widgets/effects/blurpicker/images/accessories-calculator.pngbin0 -> 3760 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/accessories-text-editor.pngbin0 -> 4746 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/background.jpgbin0 -> 16259 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/help-browser.pngbin0 -> 5392 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/internet-group-chat.pngbin0 -> 2809 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/internet-mail.pngbin0 -> 3899 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/internet-web-browser.pngbin0 -> 6376 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/office-calendar.pngbin0 -> 4010 bytes
-rw-r--r--examples/widgets/effects/blurpicker/images/system-users.pngbin0 -> 5353 bytes
-rw-r--r--examples/widgets/effects/blurpicker/main.py20
-rw-r--r--examples/widgets/effects/lighting.py144
-rw-r--r--examples/widgets/effects/lighting/lighting.py107
-rw-r--r--examples/widgets/effects/lighting/lighting.pyproject (renamed from examples/widgets/effects/effects.pyproject)0
-rw-r--r--examples/widgets/gallery/main.py56
-rw-r--r--examples/widgets/gettext/doc/gettext.rst7
-rw-r--r--examples/widgets/gettext/gettext.pyproject4
-rw-r--r--examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.mobin0 -> 463 bytes
-rw-r--r--examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.pot32
-rw-r--r--examples/widgets/gettext/locales/example.pot32
-rw-r--r--examples/widgets/gettext/main.py60
-rw-r--r--examples/widgets/graphicsview/anchorlayout.py125
-rw-r--r--examples/widgets/graphicsview/anchorlayout/anchorlayout.py90
-rw-r--r--examples/widgets/graphicsview/anchorlayout/anchorlayout.pyproject3
-rw-r--r--examples/widgets/graphicsview/collidingmice/collidingmice.py212
-rw-r--r--examples/widgets/graphicsview/collidingmice/collidingmice.pyproject2
-rw-r--r--examples/widgets/graphicsview/collidingmice/mice_rc.py47
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene.py1150
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene.pyproject2
-rw-r--r--examples/widgets/graphicsview/diagramscene/diagramscene_rc.py574
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py279
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject2
-rw-r--r--examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py6
-rw-r--r--examples/widgets/graphicsview/elasticnodes.py413
-rw-r--r--examples/widgets/graphicsview/elasticnodes/elasticnodes.py391
-rw-r--r--examples/widgets/graphicsview/elasticnodes/elasticnodes.pyproject3
-rw-r--r--examples/widgets/graphicsview/graphicsview.pyproject3
-rw-r--r--examples/widgets/imageviewer/imageviewer.py277
-rw-r--r--examples/widgets/imageviewer/imageviewer.pyproject3
-rw-r--r--examples/widgets/imageviewer/main.py27
-rw-r--r--examples/widgets/itemviews/address_book/adddialogwidget.py65
-rw-r--r--examples/widgets/itemviews/address_book/address_book.py99
-rw-r--r--examples/widgets/itemviews/address_book/address_book.pyproject4
-rw-r--r--examples/widgets/itemviews/address_book/addresswidget.py215
-rw-r--r--examples/widgets/itemviews/address_book/doc/address_book.pngbin0 -> 4922 bytes
-rw-r--r--examples/widgets/itemviews/address_book/doc/address_book.rst9
-rw-r--r--examples/widgets/itemviews/address_book/newaddresstab.py56
-rw-r--r--examples/widgets/itemviews/address_book/tablemodel.py (renamed from examples/widgets/itemviews/addressbook/tablemodel.py)57
-rw-r--r--examples/widgets/itemviews/addressbook/adddialogwidget.py102
-rw-r--r--examples/widgets/itemviews/addressbook/addressbook.py130
-rw-r--r--examples/widgets/itemviews/addressbook/addressbook.pyproject4
-rw-r--r--examples/widgets/itemviews/addressbook/addresswidget.py247
-rw-r--r--examples/widgets/itemviews/addressbook/newaddresstab.py93
-rw-r--r--examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py178
-rw-r--r--examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.pyproject3
-rw-r--r--examples/widgets/itemviews/basicsortfiltermodel.py202
-rw-r--r--examples/widgets/itemviews/dirview/dirview.py59
-rw-r--r--examples/widgets/itemviews/dirview/dirview.pyproject3
-rw-r--r--examples/widgets/itemviews/dirview/doc/dirview.rst5
-rw-r--r--examples/widgets/itemviews/editabletreemodel/default.txt40
-rw-r--r--examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.pngbin0 -> 111556 bytes
-rw-r--r--examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.rst10
-rw-r--r--examples/widgets/itemviews/editabletreemodel/editabletreemodel.pyproject7
-rw-r--r--examples/widgets/itemviews/editabletreemodel/main.py14
-rw-r--r--examples/widgets/itemviews/editabletreemodel/mainwindow.py163
-rw-r--r--examples/widgets/itemviews/editabletreemodel/treeitem.py94
-rw-r--r--examples/widgets/itemviews/editabletreemodel/treemodel.py199
-rw-r--r--examples/widgets/itemviews/fetchmore.py147
-rw-r--r--examples/widgets/itemviews/fetchmore/fetchmore.py137
-rw-r--r--examples/widgets/itemviews/fetchmore/fetchmore.pyproject3
-rw-r--r--examples/widgets/itemviews/itemviews.pyproject3
-rw-r--r--examples/widgets/itemviews/jsonmodel/doc/jsonmodel.pngbin0 -> 14837 bytes
-rw-r--r--examples/widgets/itemviews/jsonmodel/doc/jsonmodel.rst8
-rw-r--r--examples/widgets/itemviews/jsonmodel/example.json26
-rw-r--r--examples/widgets/itemviews/jsonmodel/jsonmodel.py320
-rw-r--r--examples/widgets/itemviews/jsonmodel/jsonmodel.pyproject3
-rw-r--r--examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst5
-rw-r--r--examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py79
-rw-r--r--examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.pyproject3
-rw-r--r--examples/widgets/itemviews/spreadsheet/doc/spreadsheet.pngbin0 -> 40187 bytes
-rw-r--r--examples/widgets/itemviews/spreadsheet/doc/spreadsheet.rst10
-rw-r--r--examples/widgets/itemviews/spreadsheet/main.py19
-rw-r--r--examples/widgets/itemviews/spreadsheet/spreadsheet.py544
-rw-r--r--examples/widgets/itemviews/spreadsheet/spreadsheetdelegate.py67
-rw-r--r--examples/widgets/itemviews/spreadsheet/spreadsheetitem.py122
-rw-r--r--examples/widgets/itemviews/stardelegate/doc/stardelegate.pngbin0 -> 22482 bytes
-rw-r--r--examples/widgets/itemviews/stardelegate/doc/stardelegate.rst10
-rw-r--r--examples/widgets/itemviews/stardelegate/stardelegate.py109
-rw-r--r--examples/widgets/itemviews/stardelegate/stareditor.py80
-rw-r--r--examples/widgets/itemviews/stardelegate/starrating.py86
-rw-r--r--examples/widgets/layouts/basiclayouts.py134
-rw-r--r--examples/widgets/layouts/basiclayouts/basiclayouts.py98
-rw-r--r--examples/widgets/layouts/basiclayouts/basiclayouts.pyproject3
-rw-r--r--examples/widgets/layouts/basiclayouts/doc/basiclayouts.pngbin0 -> 20931 bytes
-rw-r--r--examples/widgets/layouts/basiclayouts/doc/basiclayouts.rst9
-rw-r--r--examples/widgets/layouts/borderlayout/borderlayout.py248
-rw-r--r--examples/widgets/layouts/borderlayout/borderlayout.pyproject3
-rw-r--r--examples/widgets/layouts/borderlayout/doc/borderlayout.pngbin0 -> 5450 bytes
-rw-r--r--examples/widgets/layouts/borderlayout/doc/borderlayout.rst10
-rw-r--r--examples/widgets/layouts/dynamiclayouts.py170
-rw-r--r--examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.pngbin0 -> 14088 bytes
-rw-r--r--examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.rst10
-rw-r--r--examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py134
-rw-r--r--examples/widgets/layouts/dynamiclayouts/dynamiclayouts.pyproject3
-rw-r--r--examples/widgets/layouts/flowlayout.py155
-rw-r--r--examples/widgets/layouts/flowlayout/doc/flowlayout.pngbin0 -> 29229 bytes
-rw-r--r--examples/widgets/layouts/flowlayout/doc/flowlayout.rst11
-rw-r--r--examples/widgets/layouts/flowlayout/flowlayout.py120
-rw-r--r--examples/widgets/layouts/flowlayout/flowlayout.pyproject3
-rw-r--r--examples/widgets/layouts/layouts.pyproject3
-rw-r--r--examples/widgets/linguist/doc/linguist.rst7
-rw-r--r--examples/widgets/linguist/example_de.ts40
-rw-r--r--examples/widgets/linguist/linguist.pyproject3
-rw-r--r--examples/widgets/linguist/linguist.qrc5
-rw-r--r--examples/widgets/linguist/linguist_rc.py68
-rw-r--r--examples/widgets/linguist/main.py55
-rw-r--r--examples/widgets/mainwindows/application/application.py415
-rw-r--r--examples/widgets/mainwindows/application/application.pyproject2
-rw-r--r--examples/widgets/mainwindows/application/application_rc.py458
-rw-r--r--examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.pngbin0 -> 41007 bytes
-rw-r--r--examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.rst9
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets.py358
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject2
-rw-r--r--examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py266
-rw-r--r--examples/widgets/mainwindows/mdi/images/copy.pngbin1338 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/cut.pngbin1323 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/new.pngbin852 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/open.pngbin2073 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/paste.pngbin1645 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/images/save.pngbin1187 -> 0 bytes
-rw-r--r--examples/widgets/mainwindows/mdi/mdi.py632
-rw-r--r--examples/widgets/mainwindows/mdi/mdi.pyproject2
-rw-r--r--examples/widgets/mainwindows/mdi/mdi.qrc10
-rw-r--r--examples/widgets/mainwindows/mdi/mdi_rc.py608
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing.py501
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing.pyproject2
-rw-r--r--examples/widgets/painting/basicdrawing/basicdrawing_rc.py90
-rw-r--r--examples/widgets/painting/basicdrawing/doc/basicdrawing.pngbin0 -> 18655 bytes
-rw-r--r--examples/widgets/painting/basicdrawing/doc/basicdrawing.rst15
-rw-r--r--examples/widgets/painting/concentriccircles.py146
-rw-r--r--examples/widgets/painting/concentriccircles/concentriccircles.py109
-rw-r--r--examples/widgets/painting/concentriccircles/concentriccircles.pyproject (renamed from examples/widgets/painting/painting.pyproject)0
-rw-r--r--examples/widgets/painting/concentriccircles/doc/concentriccircles.pngbin0 -> 51606 bytes
-rw-r--r--examples/widgets/painting/concentriccircles/doc/concentriccircles.rst12
-rw-r--r--examples/widgets/painting/painter/doc/painter.pngbin0 -> 11442 bytes
-rw-r--r--examples/widgets/painting/painter/doc/painter.rst8
-rw-r--r--examples/widgets/painting/painter/painter.py204
-rw-r--r--examples/widgets/painting/painter/painter.pyproject3
-rw-r--r--examples/widgets/painting/plot/doc/plot.pngbin0 -> 13030 bytes
-rw-r--r--examples/widgets/painting/plot/doc/plot.rst36
-rw-r--r--examples/widgets/painting/plot/plot.py66
-rw-r--r--examples/widgets/painting/plot/plot.pyproject3
-rw-r--r--examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.rst34
-rw-r--r--examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.webpbin0 -> 8556 bytes
-rw-r--r--examples/widgets/rhi/simplerhiwidget/examplewidget.py135
-rw-r--r--examples/widgets/rhi/simplerhiwidget/main.py35
-rw-r--r--examples/widgets/rhi/simplerhiwidget/rc_simplerhiwidget.py163
-rw-r--r--examples/widgets/rhi/simplerhiwidget/shader_assets/color.frag.qsbbin0 -> 738 bytes
-rw-r--r--examples/widgets/rhi/simplerhiwidget/shader_assets/color.vert.qsbbin0 -> 1091 bytes
-rw-r--r--examples/widgets/rhi/simplerhiwidget/shaders/color.frag10
-rw-r--r--examples/widgets/rhi/simplerhiwidget/shaders/color.vert16
-rw-r--r--examples/widgets/rhi/simplerhiwidget/simplerhiwidget.pyproject4
-rw-r--r--examples/widgets/rhi/simplerhiwidget/simplerhiwidget.qrc6
-rw-r--r--examples/widgets/richtext/orderform.py296
-rw-r--r--examples/widgets/richtext/orderform/orderform.py265
-rw-r--r--examples/widgets/richtext/orderform/orderform.pyproject3
-rw-r--r--examples/widgets/richtext/richtext.pyproject3
-rw-r--r--examples/widgets/richtext/syntaxhighlighter.py202
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.pngbin0 -> 43420 bytes
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.rst8
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py180
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject3
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc5
-rw-r--r--examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py143
-rw-r--r--examples/widgets/richtext/textedit/doc/textedit.pngbin0 -> 120703 bytes
-rw-r--r--examples/widgets/richtext/textedit/doc/textedit.rst8
-rw-r--r--examples/widgets/richtext/textedit/example.html79
-rw-r--r--examples/widgets/richtext/textedit/images/logo32.pngbin0 -> 1410 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/checkbox-checked.pngbin0 -> 1167 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/checkbox.pngbin0 -> 779 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/editcopy.pngbin0 -> 1468 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/editcut.pngbin0 -> 1512 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/editpaste.pngbin0 -> 1906 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/editredo.pngbin0 -> 1752 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/editundo.pngbin0 -> 1746 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/exportpdf.pngbin0 -> 12637 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/filenew.pngbin0 -> 1172 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/fileopen.pngbin0 -> 2168 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/fileprint.pngbin0 -> 2087 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/filesave.pngbin0 -> 2699 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/format-indent-less.pngbin0 -> 1201 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/format-indent-more.pngbin0 -> 993 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textbold.pngbin0 -> 1611 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textcenter.pngbin0 -> 1404 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textitalic.pngbin0 -> 1164 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textjustify.pngbin0 -> 1257 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textleft.pngbin0 -> 1235 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textright.pngbin0 -> 1406 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textunder.pngbin0 -> 1183 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/textundercolor.pngbin0 -> 6916 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/zoomin.pngbin0 -> 1696 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/mac/zoomout.pngbin0 -> 1662 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/checkbox-checked.pngbin0 -> 1167 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/checkbox.pngbin0 -> 779 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/editcopy.pngbin0 -> 1325 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/editcut.pngbin0 -> 1896 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/editpaste.pngbin0 -> 1482 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/editredo.pngbin0 -> 1787 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/editundo.pngbin0 -> 1768 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/exportpdf.pngbin0 -> 1215 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/filenew.pngbin0 -> 768 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/fileopen.pngbin0 -> 1662 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/fileprint.pngbin0 -> 1456 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/filesave.pngbin0 -> 1205 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/format-indent-less.pngbin0 -> 1201 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/format-indent-more.pngbin0 -> 993 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textbold.pngbin0 -> 1134 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textcenter.pngbin0 -> 627 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textitalic.pngbin0 -> 829 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textjustify.pngbin0 -> 695 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textleft.pngbin0 -> 673 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textright.pngbin0 -> 677 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textunder.pngbin0 -> 971 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/textundercolor.pngbin0 -> 6916 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/zoomin.pngbin0 -> 1208 bytes
-rw-r--r--examples/widgets/richtext/textedit/images/win/zoomout.pngbin0 -> 1226 bytes
-rw-r--r--examples/widgets/richtext/textedit/main.py42
-rw-r--r--examples/widgets/richtext/textedit/textedit.py721
-rw-r--r--examples/widgets/richtext/textedit/textedit.pyproject3
-rw-r--r--examples/widgets/richtext/textedit/textedit.qrc54
-rw-r--r--examples/widgets/richtext/textedit/textedit_rc.py6029
-rw-r--r--examples/widgets/richtext/textobject/doc/textobject.pngbin0 -> 5844 bytes
-rw-r--r--examples/widgets/richtext/textobject/doc/textobject.rst31
-rw-r--r--examples/widgets/richtext/textobject/textobject.py165
-rw-r--r--examples/widgets/state-machine/eventtrans.py92
-rw-r--r--examples/widgets/state-machine/factstates.py111
-rw-r--r--examples/widgets/state-machine/pingpong.py96
-rw-r--r--examples/widgets/state-machine/rogue.py202
-rw-r--r--examples/widgets/state-machine/state-machine.pyproject4
-rw-r--r--examples/widgets/state-machine/trafficlight.py139
-rw-r--r--examples/widgets/state-machine/twowaybutton.py70
-rw-r--r--examples/widgets/systray/main.py58
-rw-r--r--examples/widgets/systray/window.py273
-rw-r--r--examples/widgets/thread_signals/thread_signals.py62
-rw-r--r--examples/widgets/thread_signals/thread_signals.pyproject3
-rw-r--r--examples/widgets/threads/thread_signals.py100
-rw-r--r--examples/widgets/tools/regularexpression/doc/regularexpression.pngbin0 -> 33814 bytes
-rw-r--r--examples/widgets/tools/regularexpression/doc/regularexpression.rst10
-rw-r--r--examples/widgets/tools/regularexpression/regularexpression.py21
-rw-r--r--examples/widgets/tools/regularexpression/regularexpression.pyproject3
-rw-r--r--examples/widgets/tools/regularexpression/regularexpressiondialog.py456
-rw-r--r--examples/widgets/tutorials/addressbook/doc/addressbook.pngbin0 -> 4989 bytes
-rw-r--r--examples/widgets/tutorials/addressbook/doc/addressbook.rst9
-rw-r--r--examples/widgets/tutorials/addressbook/part1.py82
-rw-r--r--examples/widgets/tutorials/addressbook/part2.py203
-rw-r--r--examples/widgets/tutorials/addressbook/part3.py261
-rw-r--r--examples/widgets/tutorials/addressbook/part4.py338
-rw-r--r--examples/widgets/tutorials/addressbook/part5.py403
-rw-r--r--examples/widgets/tutorials/addressbook/part6.py465
-rw-r--r--examples/widgets/tutorials/addressbook/part7.py522
-rw-r--r--examples/widgets/tutorials/cannon/cannon.pyproject5
-rw-r--r--examples/widgets/tutorials/cannon/doc/cannon.pngbin0 -> 2845 bytes
-rw-r--r--examples/widgets/tutorials/cannon/doc/cannon.rst8
-rw-r--r--examples/widgets/tutorials/cannon/t1.py20
-rw-r--r--examples/widgets/tutorials/cannon/t10.py152
-rw-r--r--examples/widgets/tutorials/cannon/t11.py224
-rw-r--r--examples/widgets/tutorials/cannon/t12.py275
-rw-r--r--examples/widgets/tutorials/cannon/t13.py356
-rw-r--r--examples/widgets/tutorials/cannon/t14.py410
-rw-r--r--examples/widgets/tutorials/cannon/t2.py23
-rw-r--r--examples/widgets/tutorials/cannon/t3.py25
-rw-r--r--examples/widgets/tutorials/cannon/t4.py30
-rw-r--r--examples/widgets/tutorials/cannon/t5.py41
-rw-r--r--examples/widgets/tutorials/cannon/t6.py51
-rw-r--r--examples/widgets/tutorials/cannon/t7.py73
-rw-r--r--examples/widgets/tutorials/cannon/t8.py116
-rw-r--r--examples/widgets/tutorials/cannon/t9.py122
-rw-r--r--examples/widgets/tutorials/modelview/1_readonly.py38
-rw-r--r--examples/widgets/tutorials/modelview/2_formatting.py65
-rw-r--r--examples/widgets/tutorials/modelview/3_changingmodel.py53
-rw-r--r--examples/widgets/tutorials/modelview/4_headers.py43
-rw-r--r--examples/widgets/tutorials/modelview/5_edit.py73
-rw-r--r--examples/widgets/tutorials/modelview/6_treeview.py42
-rw-r--r--examples/widgets/tutorials/modelview/7_selections.py71
-rw-r--r--examples/widgets/tutorials/modelview/doc/modelview.rst4
-rw-r--r--examples/widgets/tutorials/modelview/modelview.pyproject9
-rw-r--r--examples/widgets/widgets/charactermap/charactermap.pyproject4
-rw-r--r--examples/widgets/widgets/charactermap/characterwidget.py133
-rw-r--r--examples/widgets/widgets/charactermap/doc/charactermap.rst8
-rw-r--r--examples/widgets/widgets/charactermap/fontinfodialog.py47
-rw-r--r--examples/widgets/widgets/charactermap/main.py17
-rw-r--r--examples/widgets/widgets/charactermap/mainwindow.py167
-rw-r--r--examples/widgets/widgets/digitalclock/digitalclock.py41
-rw-r--r--examples/widgets/widgets/digitalclock/digitalclock.pyproject3
-rw-r--r--examples/widgets/widgets/digitalclock/doc/digitalclock-screenshot.pngbin0 -> 726 bytes
-rw-r--r--examples/widgets/widgets/digitalclock/doc/digitalclock.rst14
-rw-r--r--examples/widgets/widgets/hellogl_openglwidget_legacy.py288
-rw-r--r--examples/widgets/widgets/tetrix.py498
-rw-r--r--examples/widgets/widgets/tetrix/doc/tetrix-screenshot.pngbin0 -> 5396 bytes
-rw-r--r--examples/widgets/widgets/tetrix/doc/tetrix.rst38
-rw-r--r--examples/widgets/widgets/tetrix/tetrix.py472
-rw-r--r--examples/widgets/widgets/tetrix/tetrix.pyproject3
-rw-r--r--examples/widgets/widgets/widgets.pyproject3
-rw-r--r--examples/widgets/widgetsgallery/doc/widgetsgallery.pngbin0 -> 49870 bytes
-rw-r--r--examples/widgets/widgetsgallery/doc/widgetsgallery.rst16
-rw-r--r--examples/widgets/widgetsgallery/main.py16
-rw-r--r--examples/widgets/widgetsgallery/widgetgallery.py (renamed from examples/widgets/gallery/widgetgallery.py)113
-rw-r--r--examples/widgets/widgetsgallery/widgetsgallery.pyproject (renamed from examples/widgets/gallery/gallery.pyproject)0
401 files changed, 27482 insertions, 17965 deletions
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles.py b/examples/widgets/animation/animatedtiles/animatedtiles.py
index b15635185..02fc75bf5 100644
--- a/examples/widgets/animation/animatedtiles/animatedtiles.py
+++ b/examples/widgets/animation/animatedtiles/animatedtiles.py
@@ -1,58 +1,31 @@
+# Copyright (C) 2010 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2010 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import animatedtiles_rc
+import sys
+import math
+
+from PySide6.QtCore import (QEasingCurve, QObject, QParallelAnimationGroup,
+ QPointF, QPropertyAnimation, QRandomGenerator,
+ QRectF, QTimer, Qt, Property, Signal)
+from PySide6.QtGui import (QBrush, QLinearGradient, QPainter,
+ QPainterPath, QPixmap, QTransform)
+from PySide6.QtWidgets import (QApplication, QGraphicsItem, QGraphicsPixmapItem,
+ QGraphicsRectItem, QGraphicsScene, QGraphicsView,
+ QGraphicsWidget, QStyle)
+from PySide6.QtStateMachine import QState, QStateMachine
+
+import animatedtiles_rc # noqa: F401
# Deriving from more than one wrapped class is not supported, so we use
# composition and delegate the property.
-class Pixmap(QtCore.QObject):
+class Pixmap(QObject):
def __init__(self, pix):
- super(Pixmap, self).__init__()
+ super().__init__()
- self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix)
- self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+ self.pixmap_item = QGraphicsPixmapItem(pix)
+ self.pixmap_item.setCacheMode(QGraphicsItem.DeviceCoordinateCache)
def set_pos(self, pos):
self.pixmap_item.setPos(pos)
@@ -60,40 +33,40 @@ class Pixmap(QtCore.QObject):
def get_pos(self):
return self.pixmap_item.pos()
- pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos)
+ pos = Property(QPointF, get_pos, set_pos)
-class Button(QtWidgets.QGraphicsWidget):
- pressed = QtCore.Signal()
+class Button(QGraphicsWidget):
+ pressed = Signal()
def __init__(self, pixmap, parent=None):
- super(Button, self).__init__(parent)
+ super().__init__(parent)
self._pix = pixmap
self.setAcceptHoverEvents(True)
- self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+ self.setCacheMode(QGraphicsItem.DeviceCoordinateCache)
def boundingRect(self):
- return QtCore.QRectF(-65, -65, 130, 130)
+ return QRectF(-65, -65, 130, 130)
def shape(self):
- path = QtGui.QPainterPath()
+ path = QPainterPath()
path.addEllipse(self.boundingRect())
return path
def paint(self, painter, option, widget):
- down = option.state & QtWidgets.QStyle.State_Sunken
+ down = option.state & QStyle.State_Sunken
r = self.boundingRect()
- grad = QtGui.QLinearGradient(r.topLeft(), r.bottomRight())
- if option.state & QtWidgets.QStyle.State_MouseOver:
- color_0 = QtCore.Qt.white
+ grad = QLinearGradient(r.topLeft(), r.bottomRight())
+ if option.state & QStyle.State_MouseOver:
+ color_0 = Qt.white
else:
- color_0 = QtCore.Qt.lightGray
+ color_0 = Qt.lightGray
- color_1 = QtCore.Qt.darkGray
+ color_1 = Qt.darkGray
if down:
color_0, color_1 = color_1, color_0
@@ -101,12 +74,12 @@ class Button(QtWidgets.QGraphicsWidget):
grad.setColorAt(0, color_0)
grad.setColorAt(1, color_1)
- painter.setPen(QtCore.Qt.darkGray)
+ painter.setPen(Qt.darkGray)
painter.setBrush(grad)
painter.drawEllipse(r)
- color_0 = QtCore.Qt.darkGray
- color_1 = QtCore.Qt.lightGray
+ color_0 = Qt.darkGray
+ color_1 = Qt.lightGray
if down:
color_0, color_1 = color_1, color_0
@@ -114,7 +87,7 @@ class Button(QtWidgets.QGraphicsWidget):
grad.setColorAt(0, color_0)
grad.setColorAt(1, color_1)
- painter.setPen(QtCore.Qt.NoPen)
+ painter.setPen(Qt.NoPen)
painter.setBrush(grad)
if down:
@@ -122,7 +95,7 @@ class Button(QtWidgets.QGraphicsWidget):
painter.drawEllipse(r.adjusted(5, 5, -5, -5))
painter.drawPixmap(-self._pix.width() / 2, -self._pix.height() / 2,
- self._pix)
+ self._pix)
def mousePressEvent(self, ev):
self.pressed.emit()
@@ -132,128 +105,127 @@ class Button(QtWidgets.QGraphicsWidget):
self.update()
-class View(QtWidgets.QGraphicsView):
+class View(QGraphicsView):
def resizeEvent(self, event):
super(View, self).resizeEvent(event)
- self.fitInView(self.sceneRect(), QtCore.Qt.KeepAspectRatio)
+ self.fitInView(self.sceneRect(), Qt.KeepAspectRatio)
if __name__ == '__main__':
+ app = QApplication(sys.argv)
- import sys
- import math
-
- app = QtWidgets.QApplication(sys.argv)
+ kinetic_pix = QPixmap(':/images/kinetic.png')
+ bg_pix = QPixmap(':/images/Time-For-Lunch-2.jpg')
- kineticPix = QtGui.QPixmap(':/images/kinetic.png')
- bgPix = QtGui.QPixmap(':/images/Time-For-Lunch-2.jpg')
-
- scene = QtWidgets.QGraphicsScene(-350, -350, 700, 700)
+ scene = QGraphicsScene(-350, -350, 700, 700)
items = []
for i in range(64):
- item = Pixmap(kineticPix)
- item.pixmap_item.setOffset(-kineticPix.width() / 2,
- -kineticPix.height() / 2)
+ item = Pixmap(kinetic_pix)
+ item.pixmap_item.setOffset(-kinetic_pix.width() / 2,
+ -kinetic_pix.height() / 2)
item.pixmap_item.setZValue(i)
items.append(item)
scene.addItem(item.pixmap_item)
# Buttons.
- buttonParent = QtWidgets.QGraphicsRectItem()
- ellipseButton = Button(QtGui.QPixmap(':/images/ellipse.png'), buttonParent)
- figure8Button = Button(QtGui.QPixmap(':/images/figure8.png'), buttonParent)
- randomButton = Button(QtGui.QPixmap(':/images/random.png'), buttonParent)
- tiledButton = Button(QtGui.QPixmap(':/images/tile.png'), buttonParent)
- centeredButton = Button(QtGui.QPixmap(':/images/centered.png'), buttonParent)
-
- ellipseButton.setPos(-100, -100)
- figure8Button.setPos(100, -100)
- randomButton.setPos(0, 0)
- tiledButton.setPos(-100, 100)
- centeredButton.setPos(100, 100)
-
- scene.addItem(buttonParent)
- buttonParent.setTransform(QtGui.QTransform().scale(0.75, 0.75))
- buttonParent.setPos(200, 200)
- buttonParent.setZValue(65)
+ button_parent = QGraphicsRectItem()
+ ellipse_button = Button(QPixmap(':/images/ellipse.png'), button_parent)
+ figure_8button = Button(QPixmap(':/images/figure8.png'), button_parent)
+ random_button = Button(QPixmap(':/images/random.png'), button_parent)
+ tiled_button = Button(QPixmap(':/images/tile.png'), button_parent)
+ centered_button = Button(QPixmap(':/images/centered.png'), button_parent)
+
+ ellipse_button.setPos(-100, -100)
+ figure_8button.setPos(100, -100)
+ random_button.setPos(0, 0)
+ tiled_button.setPos(-100, 100)
+ centered_button.setPos(100, 100)
+
+ scene.addItem(button_parent)
+ button_parent.setTransform(QTransform().scale(0.75, 0.75))
+ button_parent.setPos(200, 200)
+ button_parent.setZValue(65)
# States.
- rootState = QtCore.QState()
- ellipseState = QtCore.QState(rootState)
- figure8State = QtCore.QState(rootState)
- randomState = QtCore.QState(rootState)
- tiledState = QtCore.QState(rootState)
- centeredState = QtCore.QState(rootState)
+ root_state = QState()
+ ellipse_state = QState(root_state)
+ figure_8state = QState(root_state)
+ random_state = QState(root_state)
+ tiled_state = QState(root_state)
+ centered_state = QState(root_state)
# Values.
+ generator = QRandomGenerator.global_()
+
for i, item in enumerate(items):
# Ellipse.
- ellipseState.assignProperty(item, 'pos',
- QtCore.QPointF(math.cos((i / 63.0) * 6.28) * 250,
- math.sin((i / 63.0) * 6.28) * 250))
+ ellipse_state.assignProperty(item, 'pos',
+ QPointF(math.cos((i / 63.0) * 6.28) * 250,
+ math.sin((i / 63.0) * 6.28) * 250))
# Figure 8.
- figure8State.assignProperty(item, 'pos',
- QtCore.QPointF(math.sin((i / 63.0) * 6.28) * 250,
- math.sin(((i * 2)/63.0) * 6.28) * 250))
+ figure_8state.assignProperty(item, 'pos',
+ QPointF(math.sin((i / 63.0) * 6.28) * 250,
+ math.sin(((i * 2) / 63.0) * 6.28) * 250))
# Random.
- randomState.assignProperty(item, 'pos',
- QtCore.QPointF(-250 + QtCore.qrand() % 500,
- -250 + QtCore.qrand() % 500))
+ random_state.assignProperty(item, 'pos',
+ QPointF(-250 + generator.bounded(0, 500),
+ -250 + generator.bounded(0, 500)))
# Tiled.
- tiledState.assignProperty(item, 'pos',
- QtCore.QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2,
- ((i // 8) - 4) * kineticPix.height() + kineticPix.height() / 2))
+ width = kinetic_pix.width()
+ height = kinetic_pix.height()
+ tiled_state.assignProperty(item, 'pos',
+ QPointF(((i % 8) - 4) * width + width / 2,
+ ((i // 8) - 4) * height + height / 2))
# Centered.
- centeredState.assignProperty(item, 'pos', QtCore.QPointF())
+ centered_state.assignProperty(item, 'pos', QPointF())
# Ui.
view = View(scene)
view.setWindowTitle("Animated Tiles")
- view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
- view.setBackgroundBrush(QtGui.QBrush(bgPix))
- view.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
- view.setRenderHints(
- QtGui.QPainter.Antialiasing | QtGui.QPainter.SmoothPixmapTransform)
+ view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
+ view.setBackgroundBrush(QBrush(bg_pix))
+ view.setCacheMode(QGraphicsView.CacheBackground)
+ view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform)
view.show()
- states = QtCore.QStateMachine()
- states.addState(rootState)
- states.setInitialState(rootState)
- rootState.setInitialState(centeredState)
+ states = QStateMachine()
+ states.addState(root_state)
+ states.setInitialState(root_state)
+ root_state.setInitialState(centered_state)
- group = QtCore.QParallelAnimationGroup()
+ group = QParallelAnimationGroup()
for i, item in enumerate(items):
- anim = QtCore.QPropertyAnimation(item, b'pos')
+ anim = QPropertyAnimation(item, b'pos')
anim.setDuration(750 + i * 25)
- anim.setEasingCurve(QtCore.QEasingCurve.InOutBack)
+ anim.setEasingCurve(QEasingCurve.InOutBack)
group.addAnimation(anim)
- trans = rootState.addTransition(ellipseButton.pressed, ellipseState)
+ trans = root_state.addTransition(ellipse_button.pressed, ellipse_state)
trans.addAnimation(group)
- trans = rootState.addTransition(figure8Button.pressed, figure8State)
+ trans = root_state.addTransition(figure_8button.pressed, figure_8state)
trans.addAnimation(group)
- trans = rootState.addTransition(randomButton.pressed, randomState)
+ trans = root_state.addTransition(random_button.pressed, random_state)
trans.addAnimation(group)
- trans = rootState.addTransition(tiledButton.pressed, tiledState)
+ trans = root_state.addTransition(tiled_button.pressed, tiled_state)
trans.addAnimation(group)
- trans = rootState.addTransition(centeredButton.pressed, centeredState)
+ trans = root_state.addTransition(centered_button.pressed, centered_state)
trans.addAnimation(group)
- timer = QtCore.QTimer()
+ timer = QTimer()
timer.start(125)
timer.setSingleShot(True)
- trans = rootState.addTransition(timer.timeout, ellipseState)
+ trans = root_state.addTransition(timer.timeout, ellipse_state)
trans.addAnimation(group)
states.start()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles.pyproject b/examples/widgets/animation/animatedtiles/animatedtiles.pyproject
index 08ee55685..20f4abe43 100644
--- a/examples/widgets/animation/animatedtiles/animatedtiles.pyproject
+++ b/examples/widgets/animation/animatedtiles/animatedtiles.pyproject
@@ -1,4 +1,3 @@
{
- "files": ["animatedtiles.qrc", "animatedtiles.py",
- "animatedtiles_rc.py"]
+ "files": ["animatedtiles.qrc", "animatedtiles.py"]
}
diff --git a/examples/widgets/animation/animatedtiles/animatedtiles_rc.py b/examples/widgets/animation/animatedtiles/animatedtiles_rc.py
index d0819862d..065aca760 100644
--- a/examples/widgets/animation/animatedtiles/animatedtiles_rc.py
+++ b/examples/widgets/animation/animatedtiles/animatedtiles_rc.py
@@ -1,892 +1,11 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
-\x00\x006\xe2\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00d\x00\x00\x00d\x08\x06\x00\x00\x00p\xe2\x95T\
-\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
-\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
-\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
-\x95+\x0e\x1b\x00\x00\x00\x07tIME\x07\xd9\x03\x03\
-\x0e\x1c$|\x1a\xa6\xff\x00\x00 \x00IDATx\
-\xda\xed\x9dw\x98\x9de\x9d\xf7?\xf7SN\x9f\x993\
-3\x99Lf\x122\xa9\xa4\x03\x91\x90\x10j\xe8H\xd9\
-\x05\xa5\x88\xc8\xba\xeb\xcb\xb2\xae\x04QW_W]]\
-v]EQVPqYu\xa5Y\xc0\x12:\x16\x88\
-\x94\x00\x09)\xa4M\xea\xb4L\xa6\xcf\x9c9\xbd=\xf5\
-~\xff8\xf3<\x99A\x944}\xdf\xeb\xbd\xb8\xaf+\
-W2\xc9\xc9y\xca\xf7\xfe\xb5\xef\xaf\xdc\xf0\xeezw\
-\xbd\xbb\xde]\xef\xaew\xd7\xbb\xeb\xdd\xf5\xeezw\xfd\
-\x7f\xbf\xc4\xb1\xfc\xe7\xba\xba\xba\xab\x0c\xc3\x08N\x992\
-\xe5s+W\xae<QQ\x14\xb6m\xdbFmm\xed\
-\xa1\x0b\xb8\x02\x09 \xe4\x1f\x5cMU\xd5\x94\xa2(\xf9\
-r\xb9\xac\xbf\xfa\xea\xab\xb3\xfeo\xbf\x8c\xda\xda\xda\x9f\
-]w\xdduW\x97\xcbe\x17@A\xe0H\x89\xf8#\
-o\xc9q\x1c\x02\x81\x00\xaf\xbf\xfe\xba\xb3`\xc1\x82\xc2\
-\xc0\xc0@l\xcb\x96-\xd3-\xcbJ\x1e\xed=h\xc7\
-\xf2\x00\x8b\x16-\xfa\xe1\xcc\x993\xeb7o\xdeL\xa9\
-T\xc2\xb6m\xea\xeb\xebihh@\x08A\xbf\x95b\
-\xda\x05E\xaa\xa2:N:\x88\x93\xd1qs:vJ\
-C\x165\x80\xb0\x94\xf2\x0f\xbew\xda\xb4i\xa2\xb7\xb7\
-W\xfe%@\xa8\xaa\xaa\xba`\xc5\x8a\x15kt]7\
-\x1d\xc7\xa9\xe9\xef\xed\xd3m\x0b\x84\x2210\x09\xc5\x04\
-\xb2\xa0M\xd8LB\x08\xf6\xee\xdd\xcb\xd2\xa5K\xbd\x8d\
-\x85\xa6i\xb1X,\x86\xeb\xba\xa7\x85B\xa1lmm\
-\xed\xae\x81\x81\x81\xec\x9f\x1d\x90E\x8b\x16\xb1w\xef\xde\
-\x90\xe38(\x8a\xe2\x94J%\x5c\xd7\xc54Ml\xdb\
-\xc6\xb2,\xca\xe52B\x08\x8a\xdd\x09\xba\xba\xc3Hi\
-\x220\x91\xaa\x8b@\x80\xa8<\xf08\x19\x95g\x9cq\
-\x86\x04\xc8f\xb3\xb4\xb6\xb6\x8a\xbf\x94T\x94\xcb\xe5\xe6\
-\xc9\x93'W\x9b\xa6\x89\x82\xe0`\xb8\x87\x85\x17*\xd8\
-\xc3A\xecD\x10g4\x88\x8c\x0a\xa4\xa9 -\xa5\xf2\
-\xd24\x0dUU1M\x13EQp]\x17\xc300\
-MS^u\xd5U\xbf\x11B\xf0\xdak\xaf]\x00\xfc\
-\xfe\xcf\x0eHGG\xc7\x9c\xd3N;\xad\xad\xb6\xb6\x96\
-B\xa1\x80i\x9a\x13\x00\xf1nNQ\x14\xa6Lm\x22\
-\x1c\x0e\xa3\x08A\xabq\x80\xe5\x1f\x82@@\xc1\x1e\xd5\
-\xb1z\xa3\x98\x83\x01\x9c\xe1 B\xa9(\x05)%\xc1\
-`\xf0/\xab\xb3\x85\xf07\x92\x86\x8a;?C ^\
-C ^\x82\x13K\x13>;\xf4\xe8$\xdc\xa2\x8a\xeb\
-\xbaH)1\x0c\x03!\x04RJ,\xcb\xc2u]a\
-\x18\x06\x9a\xa6\x01\xb8\x7f\x11\x95U.\x97\x1b\x1a\x1a\x1a\
-\x08\x85B\xe4\xf3y\x0c\xc3\xf0o\xceq\x1c\x1c\xc7\xf1\
-o4\x10\x08T\xc0\x11\x82^{\x84\xf3bM\xb8F\
-\x90%KNa\xe7\xe4W\x89\x08\x89\xa2\xe8\xa4_\xae\
-\xa2\xb0'\x8c\x94\x12\xd7u\xff\xec D\xa3\xd1\xb3\xae\
-\xb9\xe6\x9au\xa5R\xa9\xf2B])C\xf5B\xb8)\
-\x9d\x19\xbbNat\x97\xacH\xf0[\xe4\xb4m\xef.\
-f\xcc\x98\xe1\x032^B\xca\xe5\xb2\xbf1\xa5\x94\x94\
-\xcb\xe5\x8fWUU]WUU\xf5@\x7f\x7f\xff\xa6\
-?\xab\x0d\xb1m\x1b\xc30|i\xf0n\xc4q\x1c\x7f\
-\xb7\x09!PU\x15\xcb\xb2\x90\xaeK}:\xc4\xc1\xa7\
-\x15N\x08.&W?\x05;1\x17\xac0I:)\
-\x0c\x988y\xc7\x07\xe4\xec\xb3\xcf\xfe\x1f)e \x99\
-L\x86{{{\xff6\x9b\xcd\xe6\x8f' R\xca\xb0\
-\xaa\xaa\x15\x89\x96\x92]\x93w\x8a\xf3\xaf\xac\xc3\x956\
-vVCd\xc3\xd8Y\x0d'\xabQ\xde\x1fA:\xc2\
-\x97\xa6r\xb9\x8c\xa2TT\x97\x07\x88'!\x8e\xe3T\
-\x9eWJ\xb9j\xd5\xaa\xab\x9b\x9b\x9by\xf0\xc1\x07\xd7\
-\x03\x7f\x1e@\xa6M\x9b\xb6\xb0T*\xcd\xb7m\x1b)\
-%\x8e\xe3LPY\x8e\xe3\x00\xf8*K\xd34\xff3\
-\x0b\x1bf\x13MU\x91$Aw\x7f7\xf1\xf7\x14\xd0\
-\xcc\x00\xd1D\x9cH\xbd\x86\xac\x11HC\x01W\x80\xe0\
-#\x00\xe1p\x98\xdd\xbbw\x7f\x148&@\x9a\x9a\x9a\
-\x18\x18\x18\x18\x0f\x884M\x13\xd341]\x9bX\xb5\
-\x0e\xb6\xc2\xf2\xc9\xef\xa7\xaa%\xc4K\x9d\xbfb\xfa\xbc\
-&\x86\x8c.\xf2\x1d*N\xa9\x02\x80\xf7\x9c\xe3\xed\x86\
-\xf7gO2\xc6\xde\x87\xc8f\xb3D\xa3Q\x14E\x91\
-\x7f6\x95U[[\xbbf\xd9\xb2e\xf3\xd2\xe9\xb4o\
-/\x1c\xa7\xb2\xb3=/+\x18\x0c2f\xf0\x09\x06\x83\
-\xb8\xae\x8beY\xbe\xb1WQ\xd8\x17\xee\xe0\xc2\x05\xd5\
-@\xf1-\x0a]\x92^WC\xb9-\x02\x80eY\xc7\
-E\x22\x06\x06\x06hjj\x9a\x04,\x01\x1c\xc30N\
-N$\x12d\xb3Yl\x5c\xec\x11\x9b\x9d\xcf\x17\xb8\xf2\
-}\xf3y\xfa\xd55\xcck\xbe\x82\xf7\xd4\xaf\xe4\xbf\xb6\
-\x7f\x8al*\x87.\xc3\xbe\x9b\xeb\x01\x02P(\x14p\
-\x1c\x07\xd7u)\x95J\x9e\xed\xc0\xf3\x1c=M\xf1g\
-\x03DJ\xa9\x14\x0a\x05\x1f\x08\xdb\xb6\xc9\xe5r\xd8\xb6\
-M>\x9f\xf7uk\xa9TBQ\x14\xc2\xe10\xb6m\
-c\xdb\xf6\xa1\x87\x91\x02\xc2\x15\xf1\xff\xc8\xc2\xbb\x91\x8a\
-K\xda\xedd\xe3\xd6.\x92U\xeb\x18\x1d\xfb\x9c\xb7#\
-\x8f\xd7*\x95J7\x9f\x7f\xfe\xf9w\xaa\xaa\x8a@\x90\
-03L?\xbd\x1aw8\x8c3\xda\x82H\xc3\x8f\xbe\
-\xf3S\x14U\xf0\x1a[xUn&\xa0\xcd'\x9fl\
-'\x1aU\x91Rz\xb6\xc1\x07\xa4X,\xfa\xef\x22\x9b\
-\xcd\x12\x8b\xc5|0\xc6IKc,\x16\x9b\x95\xcf\xe7\
-;\xff\x1c\x80\xf8/\xd8\xb2,l\xdb\xf6_\x9e\xa6i\
->\x10\xaa\xaa\xfa\xdeK\xb1X\xf4\x8d\xbd'!X\x92\
-\xd1^\x83\xa9\xef\x99\xcbu?Z\xca\xcf>\xb2\x81\xa6\
-\x93\xd2\xac\xed\xc9\xb2'\xfb*\xf9\x9c\xe9\xab>\xa0\xce\
-\xbb\xfe\xf4\xe9\xd3\x93\x07\x0f\x1et\x8f\xd2nD\xbd\x0d\
-StM\xb4s\xfa\xa9\x9d\x1f\xc1\x92\x83H\x1bD6\
-\x86\x9dQqR:\xf9-\xd5\xa0H\x1ci\xfb\xb6\xc2\
-\x93\x90T*\x85\xaa\xaa8\x8e\xe3\xc5\x1f\x08!\xd04\
-\x0dEQ\xc8\xe5r\x04\x83A\x22\x91\x08\xa6i\xca\x93\
-O>\xf9\x9b\xaa\xaa\xde\xf1\xca+\xafT\xfd9\x00\x91\
-\x1e\x10\xdeNQ\x14\x05\xdb\xb6\x994i\x127\xddt\
-\x13\xdf\xf9\xcew\xa8\xad\xade\xfa\xf4\xe9tuu\x91\
-\xcdf}c\xed8\x0e\x96\x10\xa8\xdb\x5c\x8a\xf9\xa9\xdc\
-\xf4\xab\x0fP\x1b8\x95\x9b\xd6\xdd\x88\xae\xa9\xa8v\x08\
-Mk$^\xe3\xc7(\xf2\xca+\xaf\xdc\xe7\xfd\xff\xf5\
-\xeb\xd7\xcf\x07\xf6\x1d\xad\x94x*\xc4tM\xe2\xe1\x00\
-\x85\x8c\xcbM'\xdf\x81\xab\x16Y\xb3\xf7^&74\
-2\x9c\xefe\xf4\xd50J@NP\xc9\xde\x86TU\
-\xd5\x07$\x16\x8b!\x84\xf07\xa1\xa2(\xfe5\x02\x81\
-\x00\x96e\x09!\x04\xe1p\xb8p\xb8\xf7\xa8\x1c\xce\x87\
-\xa6L\x992i\xca\x94)/\xb9\xae;\xcd\xb3\x05\xd9\
-l%\x08\xbd\xea\xaa\xabhll\xe4W\xbf\xfa\x15\xcd\
-\xcd\xcd\x00\xac]\xbb\x96\xdbo\xbf\x9dP(\x84\xa6i\
-\xbeq7\x0c\x83r\xa9\x84\xd0\x04\xa1X\x90\xda\xdaZ\
-\xba\xd5!\x16|\xbc\xcc\xac\x8f\x16i\xb9u\x94\xc9\xd7\
-$\x89\x9fn\x10i\x16\x04\x83\x01\x11\x0c\x06\x09\x06\x83\
-\xd4\xd7\xd7\xe38\xce1\xe90\xc30\xbc\x00\x0eE(\
-\x9c\x14~?\xa1j\x9b\xe7\xdfx\x9dE\xda\xf5\xac>\
-\xe3njB\xf5\x94\xcb\xe5\xca\xbd\x96\xcb\x98\xa6I6\
-\x9b\xf57V \x10\xf0\xa5\xe1\xb2\xcb.#\x12\x89P\
-__\xcf\xdc\xb9s}`4M\xf3\xb5\x87\xe7}\x1d\
-W@\x92\xc9d\xed\x05\x17\x5cpn(\x14\x8aX\x96\
-\xe5_\xb8\x5c.\xf3\xe1\x0f\x7f\x18\xc30\xb8\xff\xfe\xfb\
-Y\xbe|\xb9\xaf;\xbd\x1b_\xb0`\x01\xb7\xddv\xdb\
-\x04\xe3\xee\xc5-\xa6a\xe2\x04L4M%\x9bt\xb8\
-j\xe1\xc7\xa8\x9b\x1a#\xb28K\xed\x15\xc3\xe8\x0bR\
-\x18\xa51o\xc84\x8f\xd8@644\x5c\x1e\x8dF\
-o\x8a\xc5b7J)\x97\x0c\x0d\x0d188Hb\
-h\x84\x817\xb3\xf4\xed\x18\xe0\xb95k\xd9\xf1\xfa\x0e\
-\xf6m\xda\xc3\xfd\x0f|\x97\x9d/v\x91/d}\xe0\
-<\x0f\xca\xf3\xa2\xce>\xfbl\xaa\xab\xab\x91R\x92H\
-$|\xa3\x9eH$\x18\x93\x06_ue\xb3Y_]\
-\x1fW\xa3\xee\xf9\xdf\xde\xc5\x15E\xe1\xfc\xf3\xcf\xa7\xb5\
-\xb5\x95\xc7\x1f\x7f\x9c\xba\xba:\x9ez\xea)\x9ey\xe6\
-\x19B\xa1\x10W]u\x15\xa7\x9f~:\xa9T\x8a\xfb\
-\xef\xbf\x9f\xbe\xbe>\x0c\xc3 \x99L\xfa\xd1\xb8i\x9a\
- Aj\x92r\xc9\xe1\xae\xf7>\xc5\xa3\xad\xdf\xe0\xa6\
-\xf9_e\xed\x8e\x17P\x1b\xfax\xcd\xdeV\xb1#J\
-eg\x1e\xe9\x9a<y\xf2\xb7\x97-[6\xcb\xb2,\
-T\xa1P\xacN\xcbX\xb5&\xdc\xac\x8e\x9d\xd4\xe9\xdb\
-6\x0c\x02\xea\xb5i\x8c\xa6s$d\x96\xa6\xc0\x0a\xf6\
-\x8f\xbeDS\xa0\xc9\x7f\x91\x9eM\xb4,\x8bH$\xe2\
-{\x91\x1b7n$\x16\x8b\x91H$\xa8\xae\xaeF\x08\
-\xc1\xb4i\xd3\x18\x1e\x1e&\x9f\xcf\xfb1\xdb\x91H\xb6\
-r\xb8\x80x`\x14\x8bE\xa6M\x9b\xc6\xbf\xfc\xcb\xbf\
-\xa0i\x1a\xcf=\xf7\x1c}}}\xc4b1\x82\xc1\xa0\
-\xef\xeen\xdb\xb6\x0dM\xd3&\xf8\xff\x9e\xcd9$!\
-\x95(?\xa0F\x98\xd68\x85\x84\xd8\x85\xb4BH\x09\
-\x8e\xb4p\x1d\x07\xc34|\xd1\xb7\xde\xe2\x07755\
-\xbd\xd3};\xe5r\x99r\xb9\xcc\xeel\x17\x91s\x07\
-E\xe8\xac~B\x97uP\xf5\xe1}\xd4|\xf0\x00\xa1\
-s\xfb\x113\x93\x95\xebX&\x96{(\x9e\xf0$\xbd\
-\xbe\xbe\x1eM\xd3\xd0u\x9d\x97^z\xc9\xb7)\xba\xae\
-\xfbR\x14\x0e\x871\x0c\xc3\x07\xcf\xb35c\x804\xad\
-\x5c\xb9R\xd6\xd7\xd7\xcf?nF\xdd\x8b;L\xd3\xa4\
-T*100@$\x12ahh\x08\xc7q\xe8\xef\
-\xef\xf7\xe9\xe8\xd1\xd1\xd1\x0a\x975e\x0a\x9f\xfd\xecg\
-q\x1c\x87`0\x88\xaa\x1er\x1f\xbdw\xeb\xb4\x97\xd8\
-\xf0\xef*\xa7\xfe\xdb\xa9\x00<\xcf\x87\xde\xf6\xfa\xd9l\
-\x96\xf9\xf3\xe7wy\xee\xf0\xd0\xd0\xd0\xbf\x0d\x0c\x0c\xdc\
-\xf1N^\xa1\x07\xa6)-\x14\x14\xc8L\xe6\x8e\xcb\xbf\
-G{z3\xdf{\xf9\xdfX\xbcd\x0e\xddu\x9dd\
-wi\xbe4\x18\x86A*\x95\xf2\x8d\xf3\xf5\xd7_\xcf\
-\x9a5k\xc8d2\xd4\xd5U\x9c\xbe\xd1\xd1Q\xff\x1a\
-\xf5\xf5\xf5\x98\xa6I8\x1cfhh\x08UU\x89\xc7\
-\xe3\xe8\xbaN.\x97\x03`\xee\xdc\xb9\xec\xda\xb5\xcb9\
-.\x80X\x96U\xf0^\xa0\xa2(\x14\x8bE>\xf3\x99\
-\xcfP]]\xed\xe7>\xc6{\x22\xde\x9f\x93\xc9$\x81\
-@\xc0\x07\xe4\x87?\xfc!\x86a\xf0\xf1\x8f\x7f\xdc\xe7\
-\xbbTT\x96,YRQ\x89\xd2!9\xf7\x00s\x16\
-Fpr*\xd6p\x08{(\x885\x18DH\x05\xa1\
-\xbb\xfe5\x86\x86\x86\x0e\xdb\x90\xdb\x96\x8d\xab:\x08E\
-p\xdd\x82O\xb3\xbe\xf7I\x9c\x91i\x5c7\xf7K\x9c\
-\x7f\xea\x99\xdc\xfe\xe8\xe5\xbek\xab\xaa\xaa\x1f\x03yl\
-\xc3\x96-[*\xe4\xe3\x98s2i\xd2$\xa4\x94\x08\
-!(\x95J\xfe\xc6TU\x95P(D\xb1X$\x12\
-\x89\xf8\xa1\x80eY\xfe\xf7\x1f3 \xb5\xb5\xb5\xb7,\
-]\xba\xf4.\x8f.9\xe1\x84\x13H\xa5R\x04\x02\x01\
-\xd2\xe9\xb4\xaf\x82\xa4\x94(\x8a\xe2\xb3\x9f\xde\xee\x1a\xa3\
-\x16\x5ce,\x9a\x9a6m\x1a\x8e\xe3P(\x14\x10\x08\
-liQ,\x16)\x97\xcb\xf4YIZ\xa6;\xc8H\
-\x89\xc6I\xd3IM\xedC\x0a\x07\xd35QJa\x86\
-\x1e\x99\x5cIt\x1d\x01EbY\x16\xb6e!\x15\x89\
-\xa2\x09\x1a\xaa\x9b9X\xfa=\xc9$d\xdd~\xeaN\
-0\x08\x07#^\xcc3A\xe5x*\xb6\xa7\xa7\x87P\
-(\x84\xeb\xba\xac^\xbd\x9a\xad[\xb7\xd2\xd9\xd9\xe9{\
-R\xaaZa\x80kjj\xc8f\xb3\xa8\xaaJ,\x16\
-\xf3\xd5\x9e\x17\xbb\x1d\x8eS\xf2\x8e\x80\x98\xa69\xb5\xa9\
-\xa9\xa9\xa6\xa7\xa7\x07\xd34\xb9\xe7\x9e{\xd8\xb3g\x0f\
-7\xdex#?\xf8\xc1\x0fH$\x12\xd4\xd6\xd6\x12\x0c\
-\x06y\xe9\xa5\x97X\xb8p!\xbbv\xed\xa2\xa7\xa7\x87\
-\xb9s\xe7\xb2m\xdb6\xf6\xef\xdf\x7f\xfb\x82\x05\x0b\xbe\
-\xf3\xec\xb3\xcfr\xd1E\x17Q.\x97}\x95%t\xc5\
-\xf7\xbe\x5c\xc7EU\x04\xa1\xec|>q\xd1\x9dh2\
-\xca\x17\x9e\xf8\x08\x1f>\xfbF~\xb6\xfdn,\xcb\xac\
-\xe4R\xfe\xc8\x83\x0d\x0c\x0c0k\xd6\xac;\xa3\xd1\xe8\
-T\x00\xe9\xca)\xc9\xd1\x14\xd2uA\xb7\xe9\xfc\xa5\xc2\
-w_\xf8\x16i\xf7 F6\x88M\x89\xeeu\x9dt\
-\x0d\xe60\xcd\xb0\x0fH8\x1cf\xc6\x8c\x19\x0c\x0e\x0e\
-b\x9af\xaaT*\xf58\x8e\xb3DQ\x14q\xd7]\
-wI\xd7u\x85\xb7\x01=\x1b\x0b\xf8\x86\x1c \x95J\
-\x11\x8b\xc5\xfcMz\xb84\x8av8\x06\xdd4M\x0a\
-\x85\x02\xaa\xaa\xf2\xa3\x1f\xfd\x88o\x7f\xfb\xdb\xfc\xf4\xa7\
-?e\xfd\xfa\xf5\xa8\xaa\x8a\xae\xebh\x9aF*\x95b\
-\xef\xde\xbd\xe4\xf3y\xca\xe52\x89D\xc2S_!U\
-U\xd9\xb0a\x03\xaf\xbf\xfe\xba\xef\xab\x8f\xbd4\xdf\xdf\
-\xb7\xb1qqY\xd6p\x19\x8fl\xfb*\xb3\xb4\xf3\xb9\
-\xf6\xa4\xd5\xb4\xd4LA\xa0T\xd4\x9c\x22\xde\xc9\xb3\xfa\
-\xfb\xe9\xd3\xa7\xd7\x0b!(8eX8L}<\x8c\
-\xd3\x1f\xc1\xea\x0b\x93\x19M\x22\x88\x11\xaa\x98e\x8aC\
-\x92Fq\x22\x1df\x87\xcf8TWW\x13\x8f\xc7I\
-\xa5R\x98\xa6\xf9\xec\x9e={n\x8a\xc7\xe3\xd7Z\x96\
-5\xcb\xb2\xac\xaf]p\xc1\x05\xacX\xb1\x82G\x1f}\
-\xd4\xb7\xab^\x10\xe9QJ\x8a\xa20<<L4\x1a\
-=\x22^\xeb\xb0\x00\xf1\xbe\xccs\xf5N;\xed4_\
--\x8d\xb7\x1fB\x08z{{\xfd?\x1f8p\xc0\xf3\
-\xbc\xd2\xfb\xf7\xef\xff\xab\xb1\xe8\x95P(\xf4\xf8\x89'\
-\x9e\xa8~\xf1\x8b_\xe4s\x9f\xfb\x1c\xa6iV\xf2)\
-\xaa\x8d\x10\x10\xd0\x228\xae\x8da\x9add\x8a\xaeL\
-\xe2\x10\x85!\xf0w\xe6\xdb-\x8f\x85\x05x#\xbf\x9f\
-\xebO\xaf\xc1\xb2s\x94Z\x06\xa9\xd6\xc2\x08GE\x1a\
-*\xc5=Q\xf2\xdbb *;=\x95J\xf9\xd7(\
-\x95J\xa4R\xa9\x09\xcf\x98N\xa7\x7f\x01\x9c\xb8j\xd5\
-\xaa\xaf\xddy\xe7\x9d\xe8\xba\x8ea\x18tuu\xb1t\
-\xe9R~\xf9\xcb_\xf2\xbe\xf7\xbd\x8f-[\xb6\xb0g\
-\xcf\x1e.\xbd\xf4R\x86\x86\x86X\xbbv\xad\xbf\xa9\x17\
-,X\xf0fkk\xeb\xaal6\xbb\xe5\x98%\xc43\
-p\x93'Ofhh\xc8\xb7\x15\xdeM\xbb\xae\xeb\xff\
-\xf2x\xac\xb1\x07|B\xd7\xf5\xbd\xc3\xc3\xc3\xafz\xdf\
-\xd9\xd2\xd2\x22\x9f{\xee9^|\xf1E\x96/_\xce\
-\x86\x0d\x1b*\xbb,\xe42\xb4\xce\xe2\xf9\xf8\xd3\xc8\xc8\
-(\xfd\xca\x1b\x18V\x89\xaa\x1a\x9d\x83C\x06\x85\xa2\xed\
-\xdfS,\x16;w\xf1\xe2\xc5_\x02\x84a\x18v[\
-[\xdbW<\xbe\xc9\xf7\x8e\x85D\x22Y \xaeg\xc5\
-{N!m\xf6\xb3a\xdfkdB\xfb)\x06l,\
-\xcbD\x22\xd14\xcd'2]\xd7\x95\xaa\xaa\x0a\xc7q\
-\x88\xc7\xe3$\x12\x89\xf1\xe8+CCC\xec\xde\xbd\x9b\
-\xe6\xe6f<\x97z\xe3\xc6\x8d\x00\xbc\xf6\xdak\x94\xcb\
-et]\xe7\xb5\xd7^\xa3\xa1\xa1\xc1\xbf_\xc30\xa8\
-\xa9\xa9\x89Y\x96\xa5\x1f\xab\x97%m\xdbFUU\x1e\
-~\xf8a\xa6N\x9d\xca#\x8f<\xc2\xce\x9d;\x09\x85\
-B$\x93I\xa2\xd1(\x83\x83\x83\x04\x02\x01b\xb1\x18\
-###d2\x19\xd2\xe94mmmW\xbf\xdd.\
-~\xf6\xd9g\xa9\xad\xad%\x97\xcb\xf94E\xa9T\xa4\
-.\xb9\x08\x07\x0b\x91\xa9\xa1\xcf\x19\x224\xbd\x8c\x99\x0d\
-\xd0\xc8<&\xaf\xa8\xe4\xb5\xa5%@a\x95\x10\xac\x1a\
-\x8biJ\x1e \xe3%D\x00\x03\xfdy\xfe\xf3o>\
-\xce\xc7\x7f}6_>\xe7ij\xecy\xa85)\xbe\
-\xb5\xe9\xab\x18\x86\x09\xa2\xc2Yy*T\xd3418\
-8\xd8988\xb8M\x08\xe1\x06\x02\x81\xb5o\xdd\xa0\
-\xabW\xaf\xc6\xb6mB\xa1\xd0\x045t\xf0\xe0\xc1\x09\
-?\x1f8p\xc0\xb7!\x85B\xe1\x0f>\x7fT\x80(\
-\x8a2\xc7\xb2,TU\xa5T*Q,\x16\x99;w\
-.o\xbe\xf9&K\x96,axx\x98\xda\xdaZ\xb2\
-\xd9,\xe5r\x99H$\xc29\xe7\x9c\xc33\xcf<\xf3\
-G/\xaei\x1a_\xfa\xd2\x97|C\xe8\xc5\x0b\x05\xa5\
-L\xa9TB\xa4\x05B\x08v\xe8\xfbx\xef\x195\xd8\
-\xd6x\xcfJ\xe2\x18\x0a\x99\x17\xea0\x87\x03\x80\xfc\x03\
-\xb0}\x9aE\x07\xc7\x86\x80\xae\xa3)\x01\x10\x90\xc8\x0f\
-\xf2F\xff\x03HW\x8e\xa9\xc0\x8a\x94744\xf86\
-@Q\x94_g2\x99\xd5o\x17\x8ey\xae\xbc\xb7\xeb\
-\x0f3\xed\xed\x7f\xff\xb1\x022\xbd\xb6\xb6\xf6F\xc30\
-\xa4\xa6i\xe2\xee\xbb\xef\xa6\xb1\xb1\x91\xbd{\xf7\xe2\xba\
-.\x83\x83\x83\x18\x86A8\x1c\xa6P( \xa5dt\
-t\x94]\xbbv\xfdI\xee\xa9X,\xe6\xa5\x94\xde\xb5\
-\x83\xe1pXw\x1c\x07\xddRq\xdcC*G\x09\x09\
-,\xc7fE\xf4\x16\x16\xcf\x5c\xc0\x96\xe4\xe3\xe4\x92\x1a\
-\xbb\xdd\xe7p\xb4\x18\x96\x09\x129\xc1\xa6\xb8\xae+}\
-\x03\x1a\x12\xc4'\x85(\x18e\x02!\x95\x9a\xaaZL\
-\xa5\x88\x16\xd2@\xa9\x00\x22\x91\xbe\xfamnnfh\
-h\x88\xb7+M\x02\x08\x04\x02\xed\x1d\x1d\x1d\x8d\xf3\xe7\
-\xcf\x1f\x9a2e\x0a7\xdcp\x03\x8f=\xf6\x98o{\
-\xbc\x80\xd7\xdb`\x1e\xc3\xa1\xeb\xba\xcf\x8a\x1f+ \x11\
-!\x04\xb9\x5cN\xd4\xd7\xd73<<\xcc\xe0\xc0\x10 \
-\x10\x02\x1f\xf1r\xb9\xec\x07T\xde6\x8e\xc5b\xa2T\
-*\xbdm\xf4,\x84\xf0+\xe9f\xce\x9c\xf9\xa0\xaa\xaa\
-\x1f\xbe\xfc\xf2\xcb\xfd\x00\xec\x90+)I\x0d\x0a\xfe\xee\
-\xe6\x9b\xb9\xe9gK\xf9\x97\xb3\x1f\xa3\x18/0\xd3l\
-\xe6'\xbfy\x02\xc3\x90\x9e\x0d\x08]t\xd1E#\x80\
-\x14\x8e\xa8\xb3,\x89\xa2\xc0\x22;\xc2\xf0\xc3\x0a\xd7?\
-t-R\x09q\xfd\x7f]\x83e[\x04\xb5\x08\xdb[\
-{\xa9\x8a\xc4}J\xdd#?\xff\x18\x18\xe3\xf2\x222\
-\x16\x8b\xf1\xe2\x8b/\xb2q\xe3FZZZ\xd8\xbau\
-+\xe1p\x98\xf5\xeb\xd7\xfb61\x12\x89\xd0\xd2\xd2\xc2\
-\xae]\xbb\x18\x1d\x1d\xf5\x93t\xc7\xac\xb2\xa4\x94\xe8\xba\
-\xce\xbe}\xfb\x90\xae\xa4f\xb1N$\xac\x92\xeb\xb7)\
-\x0e9H\xf7m\xd5\x9c(\x97\xcb\x9d\x8a\xa2|\xf3\xed\
-\x9c\x84\xb7\xb0\x00\xfa\x07>\xf0\x01\xe6\xcc\x99\xc3\x07?\
-\xf8An\xbd\xf5V?\xcf \x10T\x05\xe3\xd8\xb2D\
-\xbc\xaa\x8a\xe6\xda\xa9<\xbf\xe3\xd7<\xd1w\x1f\xb6\xd5\
-\x88i\xb9P\xd9\xe1\xa2\xa6\xa6f\x92@\xd05m\x0f\
-\xa7]\x14\xc6\x18\xac\xd4U\xd9\x83\x01\x9c\xac\x06\x96\x8e\
-[RPu\x0dMS)\xe5Ml#\xe5%\xddd\
-4\x1a\x15###\x84B\xa1w\xe4\xf8\x1c\xc7\xe1\x95\
-W^!\x1e\x8f\xe3\xba.\xfd\xfd\xfd~\xa2\xcaK\xc8\
-y\xeco]]\x1d\x03\x03\x03h\x9a\xe6\x05\x91\xb1\xe3\
-\x02\xc8\xec\xd9\xb3+\x14@\xb2\x22\x9aQ)\x89\xd4\xcb\
-\x09\xa5;\x9e\x975\xb6\xe3z\x06\x06\x06\xfe\xebp\xe9\
-\x8d\xb9s\xe7\xfaQ\xed!u'\xb0]\x13Eh\x80\
-\xa0d\x15\xd1T\x8d\xa0\x16\xc5q\x5cL\xd3\xf2\x839\
-\xcb\xb2(8ej\xa7)H[%Z\x1fF\x99b\
-a\xccO\xf8\x9b`\xe0\xa1IH[\xf1=A\x8f[\
-SUUtuu=\xe0\xed\x11]\xd7\x7f\xfd\xa7\xee\
-\xd7u]>\xf9\xc9O\xfa\xdf3~\xed\xdbw(\x7f\
-\xd6\xdf\xdf\xef{\xa1\xf1x\x1c\xc7q\xa8\xaa\xaa\xfar\
-:\x9d~\xe1\x98\x00Y\xb1b\x05\x97]v\x19g\x9f\
-}6\xdf\xfb\xde\xf7hmm\xe5\xe4\x93O\xe6\xf5\xd7\
-_g\xee\xdc\xb9d2\x19Z[[\x09\x87\xc3\xcc\x9c\
-9\x937\xdex\xe3\xb0)\xf2@ \xc0\x0b/\xbc\xc0\
-\xde\xbd{\xe9\xed\xed\xf5\x19T!\x04\x85\xd6\x1cCF\
-#\xff\xeb\xa5[\x18\xcc\xea|\xea\xb1O`\x186y\
-'\x8e]\x14D\x22\x87\xa4\xae\xa2\x1e%\xca\xeb\x939\
-\xf8\x86\xe0\xc1\x07~\xc4\xfe\x9e.~\xbb\xf7\xa7\xfc\xed\
-\xaa\x8fr\xf7\xba[1M\x0bi\x1f\x02B\xd7u\x9f\
-J\x1f\x19\x19\xf9\xc8\xe1\xdes>\x9f'\x12\x89\x1c\x02\
-\xc3\x01\xcbt\xc7\xee\x05\x84*P\xd41m0\xf6\x91\
-\xd1\xd1Q_=\x1e\x8b\x84\xb8\xde.\x88\xc7\xe3\x84\xc3\
-a\x9ft\x0b\x04\x02,]\xba\x94\xee\xeen\xaa\xab\xab\
-}\xa3\xa5\xeb\xfa;^\xf4-*+\xa0(\x0a\x07\x0f\
-\x1e\xf4\x8a\x06d\xb9\x5c\x16\x00\xe5b\x91i+f\x92\
-\xcb\xe5\x88iu\xa4g\x1c\xa0iF\x80\xaa\xb4\x8e\x93\
-\x1d\xfb\x95\xd6ps\x1ab\xecI\xc2\xe10\xe9T\x9a\
-\xf5=\xcf\xb2\xe9\xcd..>\xf9\x06\x1ac\xd3\x11(\
-\x95X\xc7\xaaH\xd4\xbcy\xf3\xfcl\xe6\xe1\x12\x95\x00\
-555#\x1d\x1d\x1dM\xa7\x9cr\xca@*\x95B\
-Hpg\x0b\x96_YC~\xc0\xa18l\x93\x1bp\
-(\x0e\xd9\x18\x19\x17\xcf$y\xef\xf0O\xd9\xa8w\x04\
-$\x1a\x8d.\x07\xd8\xb6m\x1b\x89D\x82\xe1\xe1a\x8a\
-\xc5J\xe9\xce\xee\xdd\xbb\xfd\xc0\xd0\x03\xcdu]^~\
-\xf9\xe5#J&%\x93\xc9/\x0e\x0d\x0d}w\xcc\x8d\
-\x9c\xbe`\xc1\x82\x87\x0fy#\x95\x0a\x96r\xb9L\xca\
-\xcd1u\xae\x89\xa8\xb2i\x9c\xd6D\xd9\xcdQr\x12\
-(\x0a\xd8y\x95\xe1\x9fN\xf6\x1f\x5cJ\x89W\xb2\x9e\
-)\x8d\x925\x12\x08EL\x00$\x93\xc9p\xf5\xd5W\
-\xf3\xf4\xd3O\xfb1\xc8\xe1\xacL&\x83\xae\xebR\xd3\
-4\x9a\x9a\x9a*6\xa2\x7f\x80\x8e\x07\x15,\xc7E(\
-:\xae\xab\xa2\x11@\x09\xbb~N\xc4S\xe5\xc7\x04\x88\
-\xae\xeb\x7f\xe3e\xf8\xfa\xfa\xfa\xfc\xa4\xcc\xf8\xdf\x8fu\
-\x15\x0a\x85\xbd\xc0\xde\xb1\x1f\xe7{\x8c\x80\x10\x02\xa5P\
-y\x89\xa6ab+\x0e\xaa\xaa\xd0\xa2\xae\xe2\xefV\xde\
-JM\xa0\x9e\x0f|\xef|n\xbb\xeaV~\xb1\xfe\xfb\
-\x13\xe8s\xdb\xb1Y0\xe94\x92ST\x06r\xdd\x04\
-\xd5\xd3QP0\xcd2\xaeU\x89\x832\x99\x0cO?\
-\xfd\xb4\xef\x96\x1e\xe9R\x14\x85\x07\x1ex\x80\xe1\xe1a\
-\x84\x10<\xfe\xf8\xe3\xc4\xe3q:;;innf\
-\xcb\x96-\xcc\x9a5\x0b\xc7q\xd8\xb7o\x1f\xcd\xcd\xcd\
-ttt\x1c\x1b\x97%\xa5Tc\xb1\x18{\xf6\xecA\
-\x08A\xf4|\x9d\x15\x17\xd5 \x01#'I\xee5\x18\
-m\xb7\xc8t\x98\x98\x85C\xf9\x90\x9a\x9a\x9a\x11\xe0}\
-G[\xa6\xfa\xd3\x9f\xfe\x94B\xa1\xc0\xe7?\xffy\xbf\
-0\xc1RM\x84\x90\x9c<\xe5l~\xd7\xfe\x00\xa9\xce\
-\x06\xaeX\xf8\xb7\xcc\xa8Y\x84\xedT\xaa`<\x09\xe9\
-\xee\xee\xe6k\xff\xfb\xbb\x95\xc4V)\xc5\xc6\x9f\xec\xe2\
-\xc0 dSy\x8f\x02\x92\x8a\xa2\x08\xaf\x8e\xea\x9dv\
-\xed\xdb\xd9U\x8f]\x9e?\x7f>]]]\x8c\x8c\x8c\
-x\xcf\xce\xc9'\x9f\xcc\xe6\xcd\x9b\x19\x19\x19a\xd1\xa2\
-E\xa4R)FGG\xd14\xed\xd8$\xc4\x8b\xaa=\
-\xef\xc9\xd9\xa9\xf1fG\x96|\xbf\x83U\x94(\x9e\xf1\
-RUTU\xfa\xb9\x91@ \xe0\x0e\x0c\x0c\x1cU\xd3\
-\xca\xbcy\xf3hnnftt\x94\xe6\xe6\xe6J\x85\
-\xbde\xe2\xe0\x00\x02M\x09`K\x0b\xdb\xb1\x18H\x0f\
-\xd3\x95\x0e\xa3\x09\xdd\x8f_4M\x03\xcd\xa1\xa4\xa6p\
-\xb2\x1a\x8a\xd4\xc9\xe6\xb2\xc4\xf48\xb9\x5c\x07\x8a\xa2\xa0\
-\xeb\xba(\x14\x0a;7m\xda\xf4OB\x08UQ\x94\
-#.\x91TU\x95\xaf|\xe5+\xcc\x9f?\x9f\xcd\x9b\
-7\xa3\xeb:\x1d\x1d\x1d\xb8\xae\xcb\xab\xaf\xbe\x8a\xa6i\
-$\x93I\xda\xdb\xdb\xc7\x9b\x00\xa4\x945\xc7\x22!H\
-)\xf9\xd1\x8f~\xc4\xacY\xb3\xb8\xf7\xde{+e\x93\
-sJ~\x92\xaaX,\x22\xa5d\xd2\xa4Ituu\
-\x91\xc9d\x8e\xb8:dB\x85y[\x1b/\xbd\xf4\x12\
----\x1c8p\x80x<^I\xc3b\xa3k!\
-R\xc6 \xd3\xa7\xcc\xa3~Z\x1d\x9bz\xba\xa9\x8dL\
-\x1e\x8b\xba\x0f\xb9\xc0z\x5cR\xf7\xfe\x01F\x9e\xae\xc3\
-\xe8\xad\xd0+\x8e\xe3\xf8\xe5;c\xbf'\x8b\xc5\xe2\xf3\
-Gs\x8fc\x84\xab\xab\xeb\xba\xb2s\xe7\xceJ\x0b\x85\
-\x00UU\x90\x12b\x91\x18\x96kU\x1c,\x81\x1f\xab\
-\x8d\xd5x-8&\x09\x997o\x1e\xb3g\xcf\xe6\x84\
-\x13N`\xd9\xb2el\xdd\xba\x95e\xcb\x96\xf1\xe4\x93\
-Or\xf1\xc5\x17\xb3{\xf7n6l\xd8\xc0\x99g\x9e\
-Iss3\xcf>\xfb\xec\x9f\xa4\xc7\xdfiE\x22\x11\
-\xbe\xf5\xado!\x84`hh\xa8R\x01h\x98\xd8\xaa\
-\xcb\x86\xff\x1ed\x93\xf9U\xe65.\xc1\x95.;\xfa\
-6\xd1\xfah\x1b\x1d#\xbd\x14\x86\x0e\xbd,MSY\
-\xf7\xb5a\x8c\xd1Q\x9c\x92d\xc6\x8c\x19\xe8\xba\xce\xd1\
-\xaa\xa8\xb7\xf1\x0c\x87v\xee\xdcy\xf1\xacY\xb3^(\
-\x95J\xb8*L\xbd!\xca\xc9\xcbc\xd8\x8eCSx\
-\x1e\xc3F;\x8e\xe1r\xf0\xd5\x12\xfb\x9e\xc8\xa3\xa8\x15\
-\xa7'\xe2\xf9\xeaG\x0bHgg'\xbf\xfc\xe5/9\
-\xe5\x94Sx\xe5\x95W\xc8\xe5r\xf4\xf4\xf4`\x18\x06\
-O>\xf9\xa4_\x99\xf1\x9b\xdf\xfc\x86@ \xe0\xa7>\
-\x8fr\x8d\x0e\x0d\x0d}C\xd7uk\xec\xc1?\x98J\
-\xa5f\xe4\xf3y,S2+<\x83\x193\xa6W\xa4\
-T\x1a,\xbb~\x16U\x912\x0d\xc3'c\x0d\x06q\
-F+i'\xa1HP$L\x83\x5c.\xc7\xc8\xc8\x08\
-\xd1h\x94x<\xcei\xa7\x9d\xc6\xcb/\xbf|\x5c\x1c\
-\x12?\xcd+\xa1\xd4j\xb3c\x7f\x8e|\xaf\x83ml\
-\xc4.J\xecr\xa5?Q\x0fh\xbe#p\xac\xd4I\
-4\x1a\x8d\xf2\xf4\xd3O\xf3\xc4\xe3O\x1c\xf2F\x84\xc7\
-I)~O\x8bP*\x89\xac\xea\xeaji\xdb\xf6\xd1\
-\xea\xac\x91\xde\xde\xde\xff\xed\xfdP__\xbf\x5cQ\x94\
-\x19\xaa\xa2\x80\x03\xae\xe3\x92\xcf\xe7\x11\xc0f\xab\x8dK\
-Z\xa2\xb8J\x8e\xe0\xd4\x22\x8a,\xa1j\x0avZ\xa7\
-\xbc/F~[\xd4g\x01\xbc\xea\xc1|>_\xc9\xe5\
-\x8b\xe3\xd31gY\x16\xb7\xdcr\x0b\x00/\xae}\x11\
-QV\xd0\xb4\x02B\x17\x18\xba\x81\xac\x96~l\x94H\
-$\x0e+k\xa8\xbd\x83A\xaf\xf7\x92\xf9\xae\x0a\x93\xe6\
-\x05\xd0u\x81\xb4u\xe6N^HGj\x07(PN\
-9\xa4\xbb|\x1d.l\xdb\xee\xe0\xf8,%\x10\x080\
-}\xe1\xc2JF\xcf\x1a\xa3\xd6\xbd\x88X\x11\xac\xac\xbe\
-\x85\xf7\x9d~-;\x86_\xe6\x85-/\xa15\x0f\xd3\
-\xd67\xe0\x13\x85^\xc2\xca\x8b\x05\xd6\xaf_\xef\xf1U\
-\xc7\xbc\xce>\xfbl.\xb8\xe0\x02\xe6\xcc\x99C\xa1P\
-\xa0\xb7\xb7\x97\x8b/\xbe\x98\xc7\x1f\x7f\x9c\xf3\xce;\x8f\
-b\xb1\xc8\xab\xaf\xbe\xca\xfc\xf9\xf3\x89\xc5b<\xf5\xd4\
-S~\x09\xeeQ\x01\xa2(\x8a\xa8\xaf\xaf\xa7\x90/`\
-E$K?RGu\x8d\x86t%\xc9\xb6~\xea\xf6\
-U1\xbc\xdd\xc0\x1au\x88\xc5\x82\xbe'144\xf4\
-\xe6\xf1x`\xd7u\xb9\xfd\xf6\xdb\xa9\xae\xae\xe6\x8a+\
-\xae\xe0\xa2\x8b.\xaa\xe4 $\x10\x82L\xba\xc4eg\
-\x5c\xcf-\xbf<\x93\x9f\xff\xcd.N\x08-%\xe1\xec\
-g\xf7\xfa;0\x0c\xcd\x0fZ\xcb\xe52\xd1h\x94`\
-0xX\xae\xe7\xe1\xaem\xdb\xb61u\xeaT\x06\x06\
-\x06PU\x95\xda\xdaZv\xec\xd8\x81\x10\x82\x8e\x8e\x0e\
-\xbf\x16x\xe7\xce\x9d\xac\x5c\xb9\xf2\xd8\xe9w\x8f{)\
-\x95K\xe8\x8e\xce\x9bw\xa7\x91\x16X\xc5C9t\xa1\
-L\xd4\x8dGB\x9b\x1c\xce2M\x93\xfa\xfaz\xbf\xe2\
-\xdc\xb2\xacJ'o\x08\x0c\xc3%\x14\x0c\xe0R\xa9?\
-\xeb\x1e:\xc8\xc6\xfcc(\xa8\x13\x92G\x1e\xf7\xd4\xd6\
-\xd66\xb7X,\x8e\x00\xb2\xa1\xa1\xc18\x1e6\xe4\xea\
-\xab\xafF\xd3\xb4?HV\xb5\xb7\xb7\xfb\xc4\xa2\x94\x92\
-_\xfc\xe2\x17\x95\xf7u\xac\xf4\xfb%\x97\x5c\xc2\x87>\
-\xf4!\x5c\xd7\xe5\xc9'\x9f\xa4\xab\xab\x8bh4\xca\xc1\
-\x83\x07\x89\xc5bTUUq\xe0\xc0\x01r\xb9\x1c\x8d\
-\x8d\x8d\xf4\xf4\xf4\x1c\xb7\x1d(\x84\xe0\x87?\xfc!\xcb\
-\x96-\xe3?\xfe\xe3?\x0e\x05\x7f\x08\xa4\x0b\xf1x\x88\
-d&MM\xa0\xbe\xe2VJ\x9b\x80\x88 ]\x89e\
-\xd9~\xad\x98W\xd6\xa9\xebz\xceu\xdd\x0cpD\xfc\
-\xd5\x1f\x91^s|\xbe\xc7\x09@u\x5c\xc5q]&\
-\x87gPr\xd3\x14\xac,BH\x8c\xac\x8b[\x92~\
-\xf6\xf0\xa8\x01\x19k\xc0\xa4\xb5\xb5\x95\x1bn\xb8\x81m\
-\xdb\xb6Q*\x95\xa8\xab\xabc\xd9\xb2el\xdc\xb8\x91\
-`0H8\x1c&\x93\xc9\x1c\xf7\xb6f)\xa5[U\
-U%w\xec\xd8Q)Y\xf0JP%H!\x89E\
-\xc2<\xbe\xfb~\xbeu\xe5o\xf8\xcd\xfe\x87x\xa9\xe3\
-e\xce:\xe9t^s7b\x18\xa6\xcf\xe8zT\x8c\
-m\xdb\xb3\xea\xeb\xeb\x03\xa3\xa3\xa3=\xc7zo\xb6m\
-\xb7\x09!*\xc5\x82\x08F\x96H\xfe\xee\xf6f$.\
-Q3BP\x0frp\xb8\x80U\x90\xbc~W\x0a\xe9\
-T4\xce1\xb9\xbdB\x08\xbe\xf9\xcdor\xfb\xed\xb7\
-\xf3\xc9O~\x92\xb6\xb66\x5c\xd7\x9d\xd0_8\xd6\x9f\
-\x8d\x94\x92\x9e\x9e\x9e\xe3\x0aH*\x95\xba\xe8\xf9\xe7\x9f\
-\xa7\xa5\xa5\xa5}\xce\x9c9\xb3\xb3\xd9l\xa5nX(\
-\x14j$%3\xca~\xf9\x1c\xdfyVg\xd5\xe9\xa7\
-\x90Pv\xf0\xcc\xbe]\x0c\xb5\xe5H\xa5*\x01k(\
-\x14\xa2\xa5\xa5\x85R\xa9\xc4\xb5\xd7^\xfbz[[\xdb\
-\x86u\xeb\xd6\xad<\x1e\x0e\x87\xef\xfa\x0a\x85\xba\x83\x92\
-}O\x15\x18\xdan\x90\xef\xdb8A5\xa9B\x03\x8d\
-\xb7\xcd\x9f\x1c\xb1\x0d\x89\xc7\xe3\xdcw\xdf}~\xc2\xc8\
-+4\x00\xd05\x1d];\xe4\x0a{\xe5\xa3\xfb\xf7\xef\
-\x9fq<\xed\x88W-\xef\xbd\x00\x81@5\x5c\xb40\
-\xe4{\xe1\xf5\xce\x9f\xf3\xe4O~LyDb\x95\x5c\
-\xcai\xd7\x8f\x85TU%\x9dN\x13\x0a\x85\x18\x19\x19\
-9\xa2^\x8d\xc3!\x18/\xbc\xf0Bn\xbc\xf1F\xbe\
-\xf5\xado\xa1\xf6\xa9\x10\xcc\xd18\x1b\xbf\x7f\xbf\x5c.\
-SUUE*\x95\xc2\xeb\x8b?j@b\xb1\x98\xdc\
-\xb4iS\xa5\x92#\x06\x0b\xcf\x8f\xa1\x07\x04J\xa9\x9e\
-\x0b\x16_\xca\xef:\x1fA\x0b\xa8\x8c\xee3\x19\xd8\x5c\
-\xf6\x12NR\xd7\xf5)\xc7\x13\x10\xd7u\x1d/i\xa5\
-\xaa*\x8b\x17/\xa6\xb3\xbd\x83\xd7\xfe\xa9\x5c\xd9\x1b\x0a\
-\xa0T(\x12\xe1\xba\x84B\xd2\xa7*\xbc\x11\x18c=\
-\x7f\xc7\xb5\x91\xb4X,\xf2\xe9O\x7f\x9aT*\xc5'\
-?\xf9I\x1ez\xe8!N_y:\xdd\xdd\xdd\xcc\x9b\
-7\x8f\xdf\xfe\xf6\xb7\xac\x5c\xb9\x12]\xd7\xc9f\xb3\xec\
-\xd8\xb1\xc3\xaf\x9a?*@BcOf\xdb6\xb2\xda\
-e\xc695h\x08\xac\xb2\xc1\xeb#?C\xb5\xc3$\
-Z\x0d\x92\xfb+\xc1\xcf\x98\xdb+\x86\x87\x87\x8f\xc9\xaa\
-\xc7\xe3\xf1\x96\xb9s\xe7\x1e\x08\x04\x02\x15OOQq\
-\x84M\xa9T\xe2\xdb\xdf\xfe6MMM$\x12\x09~\
-\xf7\xbb\xdf\xf9\x05\x04\x00###L\x9d:\x95d2\
-\xc9\xc8\xc8\x08\xaa\xaa\x92L&\x09\x85B\x94\xcbe\x02\
-\x81\xc0q\x05$\x14\x0a\xb1c\xc7\x0ef\xcf\x9e\xcd\x0b\
-/\xbc\xe0\xf7\xd0\x8c\x8e\x8e\xfa\x95\x90\x83\x83\x83\xc4\xe3\
-q\xbfx\xf0\x9dX\x8cw\xb4!\x9e\x1b[\x9d\x83\x0d\
-wd\xdf2\xaa\xa8\xa2F\x82\x11}\x82\x18\x1f\x87\x9d\
-\x17\x98={6\xb6m\xa3\x0a\x95Vu?g\xdd\x10\
-d\xfd\x7f8\xbe+<o\xde<\x1e{\xec1\x9a\x9b\
-\x9b\xa9\xad\xade\xde\xbcy\xdcs\xcf=h\x9a\xc6\xc2\
-\x85\x0b\xd1u\x9d_\xff\xfa\xd7~V\xd0\xab^?\x9e\
-\x80\x84\xc3a\xbe\xfa\xd5\xafNPC\xad\xad\xad\x00\xec\
-\xdf\xbf\xdf\xa7\xe8\xc7\xab\xdec\x02DJ\xc9?\xfe\xe3\
-?2w\xee\x5cjkky\xe2\x89'8x\xf0 \
-\x9a\xa6\xf9\x85\xd4s\xe7\xce\xa5\xbd\xbd\x9dD\x22As\
-s3\x07\x0e\x1c8.\xee\xae\xd7h\xa3\x09\x95L<\
-\x03r2\x91H\x84\xaf\x7f\xfd\xeb\x9cz\xea\xa9~\xed\
-\x97\xc7$\xe8\xbaN\xb1Xd\xd7\xae]~O\xbc\xe7\
-\xf7\x8f\xa7,\x8e\x17 \xf1x\xfc\x1b^@\x08 \x15\
-\x89\xa6\x09\x5c\x17\xa2\xa1(\x05#Wi\x10\x12\xe0\xda\
-\x87\x18\xdfw\xba\xbe\xf6N\x5c\xcd\xfc\xf9\xf3\xc9\xe5r\
-\x5cz\xe9\xa5\xfc\xfe\xf7\xbfg\xce\x9c9\xd4\xd7\xd73\
-s\xe6L\x1ez\xe8!t]g\xd2\xa4Ix\xcd\xa0\
-\xc7\xc3\xcb\x1a?\xa1GR)B(\x17%\xf9\xb4A\
-DSY\xbb\xb6R\xdd\xa9\xabA\x14\xadR#\xe65\
-\x00yv\xc2\x8b\xc8\xbd\xder/MkY\xd6\xa4P\
-(t\x9d\x10\x22\x00\x88\xba\xba\xbaW\xfb\xfa\xfa\xba\x8e\
-\xc2\xaeM\xaf\xaf\xaf\xaf\xd8\x04E\xa0\x9d\xafs\xe9\xb5\
-\x93(\x96\x0d.;\xf1f\xb6\x8c>Eb(I\xae\
-\xdfa\xc37\x93>\xcb\x1c\x8dF\x87\x8f\x1a\x90`0\
-\xc8\xbd\xf7\xde\xcb\xe7>\xf79>\xf6\xb1\x8f\xd1\xdf\xdf\
-\xef\x8b\xbd7\xdb$\x95JaY\x16\xa5R\xc9\xcf\x85\
-\xc8\xb1\xc8\xf0\xad\x0d4G\x0a\x88a\x188(\xa8\xaa\
-Bo\xa7\xc1\xdd\xf7~\x95o<\xfb/|\xe1\xfc/\
-\x13\x8f\xc4\xf9\x9f\xad_\xa4\xfd79\x8c\x11\xc5\xaf\xec\
-8\xe1\x84\x13hlld\xfb\xf6\xed\xd45Uq\xc2\
-\xccF\x96OZ\x86\xea\xea\x15\x07@0G\x22\x1f\xf3\
-\xd2\xd0?\xfc\xe1\x0f\xff\x06\xe8:\x8a{\x94\xe3U\xb4\
-\x18\x81\xe1]e\x12{-\xbe\xfa\xdd{I\xee\xb3p\
-M\x89\xa2\x0b\x14M\xf15\x8e\x10B9&\x1b\x92H\
-$\xb8\xfd\xf6\xdb\x0f\xeb&\xbd\x1eC!\xc4\xa2\xa6C\
-\x9e\x9f\xf6\x00\x00\x16VIDAT\xa6\xa6S\x06\x06\
-\x06\xb6\x1dC\xe0U\x01]*\xa8B\x05\x14\x96.;\
-\x85\x86\xb6*\x96\xaf8\x8d)\xb5M\xac)\xa9Tm\
-\x8c\xa0\xe4\x85\xaf\xd3g\xcc\x98\xe1y\x88L:\xdd\xa5\
-\xf9\xec4\xd2M\xe3\x00\xc6@\x00\xa3-B\xb93\x82\
-\x10\x15\xdeMU\xd5\xa3v@TUe\xe1\xc2\x85\x9c\
-t\xd2Il\xd8\xb0\x81\x815\x15\xa3\x1ep\x1c&7\
-\xba~\xac\xe6mbo\xb0\xdbQ\x032<<\xdc\xe5\
-\xba\xee\x5c\xaf\x80\xa0\xe9\xac0\x91\x88\x82\xb4u\xdew\
-\xd2-<\xb3\xef\x87\xd8\x18\xd8\x86\xe4\xc0\xef\x8b~\x0a\
-\xb5\xaa\xaa*R,\x16\xe3G\xf2pS\xa6Ly_\
-\xb1X\xbc\x10p\xa5\x94\xf1\xce\xce\xce\x8a\xee\x97\x82\xb2\
-a2\xd0S\xe2\xab\x89o\xb2\xa7m\x98;\xb6\xfd+\
-\xb1P5\x1b\x0e\x1e\xc4\xee\x8b\xa2XA\x7f\x07\xb6\xb6\
-\xb6\xfami\x81b3w^\xf4#6\xf6\xfe\x96\x1f\
-\xbc\xf8\x9f\xcc\x9cQ\xc7P9Ovw\xa5\xb6W\xd7\
-\xf5c\xa2\xe2\x83\xc1 \xdf\xfc\xe67\x89\xc5b45\
-5\xb1c\xc7\x0e\xce=\xf7\x5c\xd6\xacY\xc3\xca\x95+\
-ikkC\x08\xc1\xacY\xb3\xc8d2\xbc\xf2\xca+\
-\xc7\xc6\xf6Z\x96\xd5\x16\x0c\x06/\xf6\xf2\xd5\xd3/\x09\
-\x13\x8fk\xe4\xfam~3p\x1f\xb6\x22(\x0c8\xa4\
-\xbb\x0f\x19M]\xd7}7\xf4\x08I\xc4[\xaf\xbb\xee\
-\xba\xf3\xa5\x94\xb8H2U\xa34M\x0f\xe0f\xbc\xfa\
-+\x9dt\x22\xc7\xa9\x0d\xe7`\x16m\x92\xc5$\xa77\
-]\xc9\xb3[\x9f!\x18t|\x09U\x14\x05\xe9J\xa4\
-%\xb8v\xf9\x87\xf8\xef\x0d\xff\xca\xf2\xd8\x87X\xd9p\
-#+\x17,\xe0;\xad_\x99\xd0\xfb~\xb4\x80H)\
-\x9d\xf1\x05\xe5\x9e\x93\xe3\xb9\xd9^\xc7Yww7\x81\
-@\x80\xda\xdaZ\x7f\x9c\xd3\xb1\x90\x8b\x0a@uu5\
-\xb6m\xb3\xe3kE\xac\x9cDh \x14\x10\xaaW\x81\
-\xa1\xa2i\x87\x22\xe3\xa3\x1c\xab\xa4'\x93I\x5c\xd7%\
-c\x17\x99sE\x06[\xad\xa8})ltM\x85\xa4\
-\x82q J\xfe\x8d\xb1\xe10c\xde\xd4\xf8\x12\xa0H\
-8L2\x98\xe3\xcc\x8fE8\xff\xfc\x0b\xf8\xd1\xce\xe7\
-\x18J\x8d\xb0\xb7\x7f'\xc5\x9a\xed\xa8Tjl\x85z\
-t\xe3\x93\x00\x1a\x1b\x1bO\x94R\xae\x08\x85B\x5cs\
-\xcd5\xc4b1\x7f\x13n\xdd\xba\x15EQ\xd8\xb3g\
-\x8f_\xf4100\xe0\x17\x18\x1e+ \x9c|\xf2\xc9\
-|\xe9K_\xc2\xb6m\x1e~\xf8a\x0e\x1c80a\
-\x8eG<\x1egpp\xd0\x8fF\xbd\xc14G\x9b\x81\
-s]\x17\xcb\xb1Q\x84B\xba'\xcc#\x7f\xff;\xfa\
-\x0b\xfb\xb9\xe3\xb7\x7f\xc7\xec\xc6yt\x96\xdb0\xca!\
-\x14\xfd\xd0D7\xdf\xf5\xf4\x8a\xf6\x14\x85@@\xc7\xb2\
-\x0c4%\x88\xaah\x04\xb4 !\xadB\x85\x1b\xa6\x81\
-\xa2\x8a\xa3\x9e\xc7U*\x95Z\x9a\x9b\x9b\xc3\x85B\x81\
-\xaa\xaa*\x9f2\x1a\xbf\xfeX\xb1\xa0\x170\x1e5 \
-+V\xac`\xf7\xee\xdd\xfc\xf5_\xff5g\x9cq\x06\
-B\x08\x22\x91J\x1b\xb1\x97\x0e-\x16\x8b\x0c\x0f\x0f\xd3\
-\xdc\xdc\xcc\xe0\xe0\xa0o\x97\x8f\xf4A\xbd\xb9\x8d\x16\x15\
-U\xb0z\xd5\xbf\xf2\xf3=_'y\xa0\x9a\x05\xdaU\
-\xdcr\xc6\xdf\xf3\x99\x9e\xf7W\x5c\x5c\xa7\xa2r\x82\xc1\
-\xa0?\xdb\xd1u]\x0c\xd3\xc4*\x18d\xd7,\xe6\x8b\
-\xbf\xfa\x22\x8e\xb4\xd9\xcb\xe3\x94\x0d\x8b\xcc\xcb\x02\xe4\x0c\
-f\xcf\x96 *\xb9\x8a\xcb/\xbf\xfc\x7f\x84\x10\xdf\x07\
-\xd8\xbcys\xc7\xde\xbd{\x97\x1c\xae'\x98N\xa7+\
-\x1d\xc4\x01\xb8\xe4\xdf\x1aPT\x01\xa84\xd7\x9f@\x7f\
-\xea\x00\xa3\xfbL\x0e\xbcX$\xd5^\x91\xe0\xaa\xaa*\
-\xf2\xf9\xfc\xfd\xc7\x14\x18\xfe\xfc\xe7?\xe7\x03\x1f\xf8\x00\
-w\xdf}7\xeb\xd7\xaf\xf7\xfd\xfd|>\xef\xd3%\xa9\
-TjB\xaaTJIcc\xe3\x97\x14E\xb9\xa5\xaf\
-\xaf\xef\xc0\x91J\x88\x83\x83\x22U\xa6\xd4Ma\xff@\
-\x91\xa2\x05\x1d\xc3\xfbyr\xef}\xd8\xb6\x85eUt\
-\xa9i\x9a\x04\x83AN=\xf5T\xf6\xee\xddK\x22\x91\
- \x9dNc\xba&V\xd9\xc60*S\x91v\xd7n\
-\xe6\x9ckc8\xb9\xca\x1cE7\x13\xc4\xc9j8\x19\
-\x0dk \x18@\xfa3\x15\x83G`C\xd0\xf5J=\
-\x98\xee*\x0cl6)\x0e;\x14\x86\x1c^\x1dHP\
-N\xb9\x95\xba5M\xf8\xb5\x08c6\xcb>&\x1b\xe2\
-\xba.\x0f<\xf0\xc0\xa1\x1b\xf1\x02M\x01\x99t\x06\xcf\
-\xad\x16\xa2\xc2\xdbxc\xfd\xe6\xcc\x99sQ&\x93\xa9\
-\x07\xfe( \xf3\xe6\xcd{\x8f\xae\xebBQ\x14gx\
-x8V.U&{Z\x8aM\xbe?\xc0\xae]\xbb\
-H\xe4\x0a\xa4\x07l\xb2\x89,\xa3\x07\x8b\xe4\x07-L\
-K\xa2\xc8\x0a\x80\x86a\xd0\xdc\xdc\xcc\x8e\x1d;P\x94\
-J\xeb\xb4#\x0fM\x1e2\x5c\x8bp-(\x8e\xc6\xb4\
-\xfa\x05\xc4gT\xb1sp\x03u\x91\xc9d\xe5\x10\x03\
-\x0f6\xe0\x14\x0e\xa9\xbc#I/WUU\xb1z\xf5\
-j\xf6\xec\xd9\xc3\x81}\x07\x08\x18eT\xc7!V\xef\
-b\xd7\xd8\xfe\x98\x0e/n\xf3\xbc\xbfc\x89C\xfe\xfb\
-\xe0\xc1\x83\x17\xdb\xb6=S\x08A1&9\xf5\xf2j\
-\xf4\x80\xa00R\xc5\xfb\xcf\xb8\x9eg\xf6\xfd\x00M\xd5\
-\x19\xdan0\xb8\xb5\x84P\x84?\xed\xe7\x1d\x1e\xb0\xe1\
-\xb4\xd3N\xdb\xac\xaa\xaa\x10B \x91P[\x82l\x10\
-\xe1\xa8\xb0\x11\x9e\xd8\xf8\xd4!\xde\x88\x1av\x1c\x18d\
-\xf4`\x0cG\xe6\xb0M\xe9\x1bs\xaf\x16\xcc\x9b\xec\xe6\
-\x9a\xae\xdfjmI\x07EU\xe8\xdeo\xf3\x95[\xbf\
-\xc2\x0f\xd6~\x97KZn\xe1\x8a%\x1f\xe4S\xcf_\
-\x80eZ\xd8\xa6sD\x80xi\xd9o\x7f\xfb\xdb$\
-\x12\x09n\xbe\xf9f\x9e{\xee9\xbfr\xb1\xbd\xbd\x9d\
-e\xcb\x96\x11\x0e\x87\xd9\xb6m\x1b\xdb\xb6mc\xe9\xd2\
-\xa5l\xd8\xb0\xe1\x1d\xbf\xfbO\x02\x92\xcb\xe5\xb667\
-7\x0f\x1b\x861S\x08\x81\xa1;\xb4\x9cW\x8d\x9d\x92\
-\xa4;\x0c\x1e\xfd\xed\x03\x14\x07\x04V\xd1\xa2\x9c\x92\x84\
-\xc2!\xdf\xf5}\xa7\xf60@/\x97\xcb\xc2\xb6m\x10\
-\xb05\xb2\x8b\xf7\x9e_\x87+]\x1c\xc3E\xb1\x83H\
-K\xc1\xc9\xab\xe4^\xab\xc1)\xaa>\xb1\x98L&\xfd\
-\xe0\xd1\xa3G\x5c\xd7\xa5\xb3\xb3S\xbe\xf1\xc6\x1b\xe2\xd1\
-G\x1fe\xdb\xb6m\x15\xc7C:\xa8\x9a\xc2\x09\xd5K\
-8\x98\xdf\xcdH\xf9 \xff\xeb\xc4\xdb\x09j!B\xa1\
- \x96cc\x99\xbe\x1azGDjjj>q\xde\
-y\xe7}\xa3\xb5\xb5\x95G\x1ey\x84/\x7f\xf9\xcb\xf4\
-\xf5\xf5\xb1w\xef^r\xb9\x9cO\xd3\xac]\xbb\x96\x99\
-3g\xd2\xd3\xd3\x83\xe38\x8c\x8e\x8e\x1e\x9f\xc1\x01\x95\
-\x0d!8\xe9\xa4\x93\xe8\xee\xeaf\xe3\xe7\xcaH{\xcc\
-!\x16\x1a\x08\x15\xe98\x84B\xba\xffr\xbc\x12\xfcw\
-\xba\x01\xbf<\x07I\xa0\xae\xd2\xd9t\xd6\xa4\x0f\xd32\
-\xb9\x85\xa7;\xbe\xc7\xcc\xaaS\xd8\x9a\xfa\x0d\xf6\xc60\
-\xb6u\xa8\x8ad|\x1bD\xa1P\xb8c\xff\xfe\xfd\xff\
->i\xd2\xa4\x81\x91\x91\x91\xc6\xb5k\xd7\xb2h\xd1\x22\
-6n\xdcX\xe9\xc8R]\x92\xbf/\xd3;u\x90{\
-6?@2\x97\xe0\x0b\xbf\xfb\x12\xaa\xa2\xd2\x9d\x05+\
-\x7fH2&O\x9e|\xc2\xb4i\xd3^\x05T\xc7q\
-\xd8\xb9s\xe7u\xc9d\xb2\xe7-lD\xad\xa2(\x9a\
-\x94\x92M\x9b6q\xd1E\x17\xf9\xe4\xe6[\xd7\xfe\xfd\
-\xfb}\x82s\xeb\xd6\xad\xc4\xe3\xf1c\x07\xc4\xb2,n\
-\xbd\xf5V\xce;\xef<\x0c\xc3\xe0\xb1\xc7\x1e\xf3\x07A\
-z\x9e\xd6\x9c9s\xd8\xbbw\xafO\x0d\x0c\x0c\x0cx\
-7\xb9p\xda\xb4i\xc9\xde\xde\xde\xb7\xe3\x8a\x1c\x8f\xaf\
-\x92\x02\x14E\xd0\xbd\xcf\xe6\xdb\x7fu\x13\xff\xf0\xe3+\
-\xf8\xe2\xc5\xdf'\x1en`t{'\x83\xd6\x08\x86\xe1\
-\xf8\x80{\xc4\xe1\xb8*I\xa9\xaa*\xb7\xdez+\x9f\
-\xff\xfc\xe7\xb9\xff\xfe\xfb\xfd\x09<\xb6p\xd1\x8a\x1a\xb1\
-\x13\xaa(e,\x0a\x96`d\xd9V\xe2\xb1\x10\x93F\
-\xc2\xd8\xf5A\xdc\xb2\x8a4\x14\xa4\xa9\x84\x91\xe2L/\
-\xf7\xfd\xe6\x9bo\x86\xdeN]\x8dO[+\xaaJ\xb8\
-J#\x10\x14\x87:\xa6\x04\xd8%\x17\xbb\xa4\xf86W\
-Q\x14J\xa5\x92e\x9af\xe2\x98\x00q\x1c\x87\xd9\xb3\
-g\x93L&9\xe5\x94S\x08\x85B\x9cr\xca)D\
-\xa3Q\xa2\xd1(?\xf9\xc9O\xa8\xa9\xa9\xe1\xcc3\xcf\
-$\x9dN\xb3n\xdd:\x02\x81\x00\xb6m\xf3\x9e\xf7\xbc\
-\xe7\xe1\xf6\xf6\xf6\x1f\xf7\xf6\xf6\xde4F66\x01\xab\
-\x01\xd3u\xdd\xea\xde\xde\xdeJ\x012`Z&\xf9l\
-\x8c;\xef\xfc\x1a=\xedY\x1e\x1fz\x86L!\xc3+\
-}oR\xe8\x0a\x13\xd3k=\xb6\x94\xaa\xaa*r\xb9\
-\xdc\x84\xd1\x17B\x08\xda\xda\xda\xb8\xe9\xa6\x9b\xc8\xe5r\
-TUUUf\x09\x0b\x17\xdc\xb19\xed\xc0\x906\xc2\
-\xc2\x85\x01l\xcb\x84\xa6\x89#\x93\xb2\x9b\xc7*\x1e\x85\
-\xf4\x0b#\xfe\x18\xf1\xd9\xd0\xd00\xd6\x82\x00\xb5\xe7\x04\
-Y|Z\x8c\xa1\xedeF\xf7Y\x8c\xee6q\xed\xb7\
-u\x04\x0e\x0c\x0e\x0e\xdewL\x80D\x22\x11\xee\xbc\xf3\
-N\xce<\xf3L\xee\xb9\xe7\x1e\x8a\xc5\xe2\x84\xec\x97i\
-\x9a\xac]\xbb\x16\xdb\xaed\xf4\x82\xc1\xa0\xff\xef\xde\xf0\
-.o\x8d\x8c\x8c\xac\xba\xf2\xca+?\xefQ\xf4\x19\xb3\
-(kg;B&\xc3\xb8\xc9\x00\xd8\x92=ov2\
-YY\xc0\xa6\x8d\x95\xe9\xdc\xd3\xb4\xe5t\xba\x1d~\x8e\
-:\x12\x89\x10\x0c\x06\xfd\x91G\xe3\xa8\x97{\x86\x87\x87\
-\xab\x84\x10n\xb9\x5c^.\x84\xb8\xb8\x5c.\xe3(.\
-\xa1Px\xac\xe2Q\x80*1M\x87\x0f\xcc\xbc\x93\xee\
-\xec.N\x9a\xb5\x98\xffz\xee>\xec\xbav\x1c'\x82\
-eZ\xa0\xc8\xb7\x8d\xe2\x03\x81\xc0l)e\x9d7H\
-a\xd1\xa2E\x04\x02\x01\xfa^\xebe\xe7\xcb\x12I\x00\
-)ub\x91\x90\xafR\xbd_^a\xc81\xab,\xdb\
-\xb6\x83\x8a\xa2\xf0\xdak\xafU\xf4\xa1d\xc2d\x05!\
-\xc0\xb6\x1c\x84R1\xe6^.\xa2P(L\x18,\xec\
-=\x933nPrva\xa7\x98yF\x14\xcb5q\
-\x1c\x17%\x17\xab\xc4\x07\xde\xec\xdc1\xf7\xd2\x9b\x17,\
-\xa5\xf4\xe9\xfe\xfa\xfaz\x12\x89C\xd2\x9fL&\xbf\xe6\
-\x19\xfb\xc9\x93'\x7fL\xd3\xb4\x8b\xa5\x94\x08\x1b\xb0]\
-\xffP\x00\xcb4H\xec\x93T5W\xf3\xfc\x9b?\xc6\
-:\xf01\x16(g\x12SV\xf0X\xefO\xc9\x8d\x06\
-@Ho\xf0\xd8)\x81@\xa0^UUQ*\x95v\
-_r\xc9%\xed===X\x96%kkk\xc5?\
-\xff\xf3?\xb3x\xf1b\xee\xbd\xf7^\xf6\xed\xdb\xc7\xe2\
-\xc5\x8by\xf3\xcd7iii\xa1\xbf\xbf\x9ft:\xcd\
-\x94)S\x90R\xb2}\xfbv\xd2\xe9\xf4\xb1\x03r\xe0\
-\xc0\x81\xbf\xcb\xe5r\x9b\xd41~\x22\x1fr9\xff\x96\
-:\xcaY\x07\xbb$)\xa5\x5c\xd2]\x16\x99\x036\xee\
-8\xa0&M\x9a\xe4\xd1+U\xb1XlF>\x9f?\
-\x00\xb8\xe3wJ8\xa2a\x14%\x97\xcf\xfc'&\xd7\
-\xd5\xf2\xf3=\xdf V\xd7H\xa2\xf9\x00\xc9\xf5!_\
-\xf7:\x8eC:\x9dFJI8\x1c\xc6\xb2,\x06\x06\
-\x06\xbc\x06\x98\xb7\xf3\x1cTM\xd3X\xbdz5\xf9|\
-\x9e\x1f\xff\xf8\xc7~\x02\xad\xae\x5cEh\xeb\x1c\xee\xda\
-|\x17\xaa2\x87\xdf\x06\x9e \xa4\xebHCe\x8a\xb3\
-\x98\xa6\x13\xbd\x9d&\xb9\xfa\xea\xab\x7f\xeeU\x8e\xacY\
-\xb3f\xaaW\x13l\xdb\xb67\x8f\xd7\x1f6\xe3\xba.\
-\x93'Of\xfa\xf4\xe9\x94\xcbef\xcc\x98\xc1\xbau\
-\xeb\xfcd\xde\xce\x9d;\x8f\x8f\x97eY\xd6\xd6@ \
- =5\x13\x01v\xfe\xc0|Kn]'\xa4\xeb\xa0\
-\x1f\x8ab5M\xc3\xb2,\x1a\x1b\x1b\xffz\xc9\x92%\
-\x97\xbd\xf8\xe2\x8b_\xb5,\xeb\xe4\xbe\xbe\xbeCc\x9d\
-\xde(\xa0\xb5W\xb3\xeb\xc46\xbe\xb1\xf9\x19fN\x99\
-\x89\x1e\x9fB\xdb\xe0N\xf2C\xae_\x1c\xf0\x16\xd1/\
-wtt<4\x96\xf134M{\xe5\xedr)\xef\
-{\xdf\xfb\xa8\xaf\xaf\xe7\xb6\xdbn\xe3\xd1G\x1f\xf5S\
-\xba\xaet)\x9b\x15\xb5\xbb!\xdd\xca{o\x0dO\x18\
-3e\x0d\x070{\xc2\x98\x07\xc389\x8d\xf1\xb3T\
-\xbc*z/\xc6\xb9\xed\xb6\xdb\x08\x06\x83\x94J%\xa4\
-\x94|\xff\xfb\xdf\x9f\xd0\x7f\x22\xa5d\xf7\xee\xdd\xb4\xb6\
-\xb6\x1e6\x89yX\xed\xa7\xae\xeb\xf2\xd1\x8f~\x94s\
-\xce9\x87\x8e\x8e\x0ev\xee\xdcIgg\xa7?\xdb\xc3\
-4MN?\xfdt\xf6\xef\xdf\xcf\x9e={\x98={\
-6\x1d\x1d\x1d~&\xb1\x5c.\xeb\xe7\x9e{\xee\xbf*\
-BaX\x1b\x96\xd3O\x12\xc2\x1c\x0cc\x0f\x07qS\
-:;6\xee\xa5E=\x11g\xc4\xa5wx\x90&m\
-)\xeb\x13\xaf\xfb\xbd\xe0^q\xc0\x18\x91\x98O$\x12\
-\x1f\xfd\x93\x0f\xa5i\xbc\xf2\xca+\xacY\xb3\x86\x91\x91\
-\x11\x8a\xc5\xa2?O\xd7+\x0b\x02(\x0a\x93hm\x0c\
-\x92\xd3\xb8\xfd\x92/\xf1\x8b\xd6\xffd$2\x82=7\
-Kb\xb3E\xea\xe5*T\xad\xd2\xb2}\xd6Yg\xad\
-\xf3\x00)\x95J\x84\xc3\x95\xf3N\x8a\xb9J9\xa9P\
-\x15\x94?^\xd6,\x01\x91J\xa5\xa2\xc7\x05\x10)%\
-\xd7\x5cs\x0d[\xb6la\xd5\xaaU$\x12\x09\x16-\
-Z\xc4\xf6\xed\xdbihh\xa0\xb3\xb3\x93\x9a\x9a\x1a\x16\
-.\x5cH \x10\xa0\xbd\xbd\xdd\x1f\x00\xe9\xbd\x80\xfe\xfe\
-~\x1c)\xa9\xbe>/\xc2\x8bc\x84\x97fA\x91H\
-S\xc1Nk\xb8Y\x9d\xd4\xf3\xb58\x96\x8b\xe6\x1e\xaa\
-.\xf1\x06\xa7\xd5\xd5\xd5M\x985\xffN\x91t\xb1X\
-\xe4\x9cs\xce\xf1\xc1\xf4\xf4w]]\x9d\xff\xbdM=\
-*{\xbf\x5c\x87\xedf\xf8\x9b\xff\xfc\x18\x02\x9d@@\
-E\x1aQ\x14]\x22t\x13\xd5U\xbc\xd1\xb8\xb3\x0c\xc3\
-\xc0\xb6m\xaa\xab\xab+\xc9'\x04\xb5K\x82\xe8\x08\xf2\
-\x03\x0eF\xc6\x9d0\x9c\xc8\x93\x0aM\xd3D6\x9b}\
-\xc3\xb6\xed\xf7\x1e\x17@t]\xe7\xfa\xeb\xaf\xe7\xae\xbb\
-\xee\xe2\xeb_\xff:\xdd\xdd\xdd\x13N\xd2)\x16\x8bt\
-uu\x91\xcb\xe5\xfc)\x9d\xaa\xaa\x92\xcdf\xa9\xad\xad\
-\xc5u]\x7f\xc8\xc0\xc0\x036o(\xde\xb0Ie\x1c\
-eaR\xb4\xdahii\x99\x90\xb7\xf7&\xea|\xf4\
-\xa3\x1f\xe5\xfe\xfb\xef?\xac2#\xc30r\xb6mw\
-{u]B\x88\xe9\xaa\xaa\x0aO\xda\xfd\x89\xa8\x01\x8d\
-\x9aI1,\xcbb\xb4lS}\xe9\x10\xb5\x93td\
-I\xc3\x1c\x0aR\xec\x08@\x22\xeaWNz\xf1G(\
-\x14\xe2\x13\x9f\xf8\x04\xc9d\x92\xed\xdb\xb7W\x1a\x95j\
--d\xfc\x90\xf3\xe1\xfd\xee\x15]\x94J\xa5r\x22\x91\
-H\x1d\x17@\xbc\xb9\x8a_\xf8\xc2\x17\xfe\xe8g\xf2\xf9\
-\xbcO\xcdK)\x19;\xb1\xccg\x81\x87\x86\x86*\x85\
-\xda\x93\xe3\xa8\xaaJ[[\x9b?\xcbw\xf1\xe2\xc5c\
-\xd4G\xd9\xcfq\xd8\xb6\xed\xe7\x0e\xaa\xaa\xaa\xfc\xf9\x86\
-\x87\x03H:\x9d~p\xd3\xa6M\x0fz?O\x9f>\
-\xddRUU;\xf1\xc4\x13\xe9\xee\xee\xf6\x81\xf6^\x98\
-a\x18${Fh^\x7f\x12\xd9R\x89u\xeb\xd6\xa1\
-i\x1a\xcb\x97/\xa7\xa1\xa1\x816\xa5}\xc2\x09:\x17\
-^x!\x93'O\xe63\x9f\xf9\x0c\x8f<\xf2\x08/\
-\xbf\xfc2\x97]v\x19\xbf\xff\xfd\xef\x995k\x16\xc3\
-\xc3\xc3l\xd8\xb0\x81X,\xc6\xa9\xa7\x9e\xcas\xcf=\
-w\xd8\xa4\xe5a\x01\x92J\xa5\xfe*\x9b\xcd~\xa3\xa6\
-\xa6fQ>\x9f\xf7\xcb\xfb\xc7\x1b\xaa\xb7\x1a-\xaf\xc8\
-\xce\x03\xc5\xcbuTUU\x11\x08\x04hjjb\xe6\
-\xcc\x99\x0c\x0c\x0cL8\xbfj\xfc1B\xe3\x8b\x93\xbd\
-\xe1hG\x93\xfc\x92R\xb2n\xdd:\x86\x86\x86X\xbd\
-z\xb5\x1fKyR\xe8yJ\xb6m\x93N\xa79\xeb\
-\xac\xb3\x88\xc5b$\x93I2\x99\xcc\xf8S\xd80M\
-\x93\xbd{\xf7r\xdbm\xb7122\xc2\x8e\x1d;p\
-]\x97\xed\xdb\xb7\xe3\xba.\xfb\xf6\xed\xf3\x9f\xbdP(\
-088xD,\xf2a\x01\x92L&\x7f]WW\
-\xf7\xcf\xcb\x97/g\xf5\xea\xd5tww\xb3y\xf3f\
-\xba\xba\xba\x08\x04\x02~\xe2~\xea\xd4\xa9\xf4\xf5\xf5\x91\
-N\xa7\x994i\x92\xcf~\xfa%=\xe3b\x10\xcb\xb2\
-\xc8\xe7\xf3>M>\xfe@\xb1\xf1\xb3s\xc7^\x5cj\
-``\xe0\xe1\xb1\xff7r4eE\x86a\xf8R\x9b\
-\xcdf\xfd\xef\x1f?t\xdfSK\xa6i\xfa\x07\xd5x\
-\xff\xe6\xfd\xbd\xe38\x8c\x8c\x8c\xb0j\xd5*_\x9dC\
-\xa5\x9b\xca\x1f\xeb1n\x83\xbe\xf1\xc6\x1bG\xd4Bw\
-$\xe7\x87\x88\x8f\x7f\xfc\xe3\x0c\x0e\x0er\xed\xb5\xd7b\
-\xdb6\xb3g\xcf\xa6\xaf\xaf\x0f\xdb\xb6\xa9\xab\xabC\x88\
-J2\xa6\xbd\xbd\x9db\xb1H0\x18\xf4\x87${\xb6\
-\xc0\x03\xc4/\xf3\x19\x03a\xbc$\xa9\xaaJ \x10\xa0\
-\xa5\xa5\xc5\x9b;5\xd2\xd9\xd9\xf9\x89\xf11\xce\xf8\xa0\
-\xf0pT\xee\xc5\x17_\xccE\x17]\xc4\xf0\xf0\xb0\xaf\
-\xb2B\xa1\x90\x9f\x8a\xf6\xd4\xd7x\x06`\xfc\xe1g\xde\
-\xdc\xc9\xb1\x0d:\x81L\x1c_r\xfbv\xd7\x96Rv\
-I)\xfb\x8e7 |\xfa\xd3\x9f\xe6\xa1\x87\x1e\xe2g\
-?\xfb\x19/\xbe\xf8\xe2\x84\xf38\x0c\xc3 \x1a\x8d\xfa\
-e\xf7\xde\x91\x0e\x9ek\xec\xa9\xaf\xf1\xa7\xd5\x8c?\xe9\
-\xcd{!\xc5b\xd1\xaf2\x9c:u*\xe9t\xfa\x0f\
-(\x87#\x01\xc3SYMMM\xec\xde\xbd\xdbW\xb7\
-\x9eZ\x1c\x7f\x14\x85\xf7gOZ\xc7\xd7T\x99\xa6\x89\
-\xae\xeb\xdcq\xc7\x1d\x5cp\xc1\x05\xfc\xfb\xbf\xff\xbb\x97\
-_\xf7YkO\xda\xab\xaa\xaa\xfcA=RJv\xed\
-\xda5\xeb\xb8K\x88\xe7>~\xf0\x83\x1f\x9c\xd0S8\
-\xdevx\x93\x9d=\xfdYUU\xe5\x9f\xc4\xe3\xedJ\
-\x8f#\xf2\xa4\xc5\xf3F<\x8a\xc4\xa3\xab\xa5\x94\x13\x06\
-\x80\x1d\xcbJ\xa7\xd3\xb36o\xde\x8ceY\xf9\xe9\xd3\
-\xa7w\xacZ\xb5\xaa\xf6S\x9f\xfa\x147\xdf|3\xf9\
-|\xde\xef\xb5\xf7\xdcZo\x1c\xdfx\x9a?\x93\xc90\
-{\xf6l\xce=\xf7\x5c\xa2\xd1(\xe7\x9cs\x0e\x1b6\
-l\xe0\x92K.a\xcd\x9a5\x5cy\xe5\x95<\xf9\xe4\
-\x93,\x5c\xb8\x90\xda\xdaZTU\xe5\xb9\xe7\x9e\x9b0\
-\xed\xfax\x03\xf2\x8b\xee\xee\xee\xed\x8a\xa2\xac~\xef{\
-\xdf\x8b\xa2(\xb4\xb7\xb7c\x18\x86?\xef\xdc\xd3\xb75\
-558\x8e\xe3\x0f\x94\x14B\x90J\xa5\xfc\x01\xf5\xe3\
-U\x96W\xd1\xe7}n\xacZ]:\x8e#l\xdb\xa6\
-\xa6\xa6\x86L&\xa3\x1e# ~N\xa3X,\xbaw\
-\xddu\x17\xeb\xd7\xaf\xa7\xba\xba\x9a\x91\x91\x11\x7f\xf7\x8f\
-\xb7g\x1e\xd52>\xd1\x96\xcb\xe5\xd8\xbd{7\x0d\x0d\
-\x0dx\xe7\xffzn\xef\xd6\xad[\xb1m\x9b\x9e\x9e\x1e\
-\x7f\x10\x8d7\x92\xe9\x88\xec\xdd\xe1|\xc8;\xab\x0f\xd0\
-\x96,Ybm\xdd\xba\x95\x9d;w\xd2\xd3\xd3\xc3\x96\
--[X\xb1b\x05?\xf8\xc1\x0f\xb8\xf0\xc2\x0b\xe9\xec\
-\xec$\x18\x0c2\x7f\xfe|:;;y\xf5\xd5W\xc9\
-f\xb3\x0c\x0f\x0f\x13\x8b\xc5\xfcrS\xef\x04\x01)\xa5\
-\xdf\x9f\x18\x8dF\xfd\x03Q\x06\x07\x07\x13\xe5r\xf9\xe5\
-1\xbb\xb4gdd\xe4\x8b\x1c\x87u\xe2\x89'&n\
-\xbc\xf1\xc6\xfaK/\xbd\x94\xcf~\xf6\xb3\x0c\x0c\x0cP\
-*\x95\xfc9\xed\x85B\x81)S\xa6\xf8\x07\x9cy\xe3\
-oUUe\xe6\xcc\x99d2\x19\xff\xb4\x87\xb7s\x1e\
-\xde\x9a\xe6\xb5m\x9b7\xdf|S\x1cW\x09\x19\xa7\xc3\
-\x15\xcb\xb2x\xf8\xe1\x87\xb9\xec\xb2\xcbx\xf4\xd1GI\
-&\x93\xbc\xf0\xc2\x0bH)\x19\x1c\x1cd\xdf\xbe}\x95\
-\xb3\xa5\xba\xbb'd\x10\xbd\xc1/\xe9t\x9a`0\xe8\
-\x0fO\x8eF\xa3\xbe\xd4\x18\x86\xc1\xec\xd9\xb3\xc9d2\
-(\x8a\xb2+\x93\xc9\x5c\xc3q^\xba\xae\xf3\xe4\x93O\
-\xf2\xd4SO\x91\xcf\xe7\x99<y2\x9f\xfd\xecg\xf9\
-\xf4\xa7?\xed\x0fK\xf3F\x8d\xc7\xe3q\x9f6\xff\xfc\
-\xe7?\xcf}\xf7\xdd\xe7\x8f\x05\xf4\xc8NO\x9d\xd7\xd5\
-\xd5\x91\xcf\xe7I\xa5R4662<<\x8ceY\
-}\x8a\xa2\xe4\xff,*\xcb[\xa1P\x88{\xee\xb9\x87\
-\xfb\xee\xbb\xcf\x8f\x13<u\xd3\xdd\xdd\x8d\x10\xc2\x1fv\
-\xe6\xddlUU\x95O\xc5{'-{\xb6\xc6;\xef\
-\xd0\x8b?\xf6\xec\xd9s\x5c\xfb\x00\xdf\xbaFGG_\
-\x09\x87\xc3\xd5c\xf7\xb6\xf2\x1b\xdf\xf8F\xe4\xb5\xd7^\
-\xf3\xef\xcd\xb3a\xe3\x8f\xdep]\x97U\xabV1u\
-\xeaT\x96-[\xc6\xd3O?Muu5[\xb6l\
-\xa1\xb9\xb9\x99\xad[\xb7\xb2r\xe5J\x0a\x85\x02\xed\xed\
-\xed\x1c<x\x90h4Joo\xef\xe5\xdd\xdd\xdd\xdb\
-\x8f\xa4\x0b\xe0H\xad\xa56s\xe6\xcc'\xa3\xd1h@\
-\xd7\xf5\x0bO<\xf1DB\xa1\x10\xaa\xaa\xb2o\xdf>\
-\xbf\x059\x1c\x0e\xfb\xd3\x0dB\xa1\x90\x7f\x1cP&\x93\
-!\x97\xcbM\xe0\xb9\x82\xc1 \x17^x!/\xbf\xfc\
-2\xde\xbcu!\x04\xed\xed\xed\xaf\x0f\x0c\x0c\x9cy<\
-\xc1\x18\xb3G\xfe\xcfs\xe7\xce\xdd{\xed\xb5\xd7\xce\xbb\
-\xf9\xe6\x9b\xb9\xfc\xf2\xcbY\xb6l\x19---<\xf9\
-\xe4\x93\xbej\xfd\x87\x7f\xf8\x07\x1ey\xe4\x11\x0c\xc3\xe0\
-\x86\x1bn`\xd3\xa6M\x8c\x8e\x8e\xfa\xae\xb0\xd7\x93\xa2\
-\xeb\xba\x7f\x0cG0\x18D\xd7u\xba\xbb\xbb\x97\x1d<\
-xp\xcb\x91\xdc\xe3\x91\xf6\x9f\xd9]]]\x97\xb7\xb6\
-\xb6^\x17\x0a\x858\xf3\xcc3\xf9\xc2\x17\xbe@4\x1a\
-\xa5\xb9\xb9\x99\xa9S\xa7RUU\xc5\x8c\x193\xa8\xa9\
-\xa9\xa1\xae\xae\x8eH$\x82\xeb\xba~\xa0\xb5r\xe5J\
-\x02\x81\x00\x0d\x0d\x0d\xc4\xe3q\x82\xc1 \xd1h\x94\xb1\
-\x81\xcdon\xdf\xbe\xfd\x9f\xb6o\xdf\xfe\x19\xe0+\xc7\
-[:\xc6\x831&\xa1\xca\x0b/\xbc\xc0%\x97\x5c\x82\
-\x10\x82{\xee\xb9\xc7?\x9fp\xc3\x86\x0d\x18\x86\xc1\x15\
-W\x5cA\x22\x91@\xd7u~\xf9\xcb_\xd2\xdd\xddM\
-\xa1P\xa0X,N89\xc7s\xedC\xa1\x90\xf4\xcb\
-\x91\x5c\xf7\x88\xdd\xc3\xa3:-Z\xd3\xb4\x80\x10\x82\x07\
-\x1f|\x90\x87\x1ez\xe8\x0f\xfe\xfd\xe0\xc1\x83\x7f\xd49\
-x\xab\x1b\xeb8\x0e\xbf\xfd\xedo\xbdIo\xbbr\xb9\
-\xdc\x7f\x02\xefX\xb6\x7f<V6\x9b\x95\x9e\x8a\x12B\
-\xf0\xfc\xf3\xcfs\xfa\xe9\xa7\xb3c\xc7\x0e6l\xd8@\
-}}=\x0f>\xf8 \x0f>\xf8 w\xdf}\xb7\xef\
-\xba{A\xafw\xc2\x90\x97\xbe\x1eSo\xa2\xad\xad\xed\
-\x5c\xc7q\xf6\xd4\xd5\xd5%\x8e\xf4\x9e\x8e\xca\xc1\x0f\x85\
-B\xb1\xba\xba\xba\xcf\x85B!\x17\xb8*\x1c\x0e/>\
-\x1c\xbd\xefMz\xf0\xa6<{\x996\xcf\xdfO\xa7\xd3\
-kzzz\xde\xcf_~E\x16/^\x5c\xf0\xfaE\
-t]g\xe9\xd2\xa5\xec\xdb\xb7\xcfw\xc9\x0f\xc7}\xf5\
-\xf8\xb1\xed\xdb\xb7\xcf-\x14\x0a\xedGs#\xc7<8\
-\xaa\xb9\xb9\xf9\xe7MMM\xd7\x1e\xce\x5cs\x0f\x14\x8f\
-\xce\xae\xa9\xa9\xa1P(\x14[[[\xa3\xe3\xbe\x8f\xfe\
-\xfe\xfe\xbf4 \xc1\x96\x96\x96m\xf1x\x5c\xe4\xf3\xf9\
-Hcc\xe3\x09RJ\x0a\x85\xc2a\x8f\x90-\x14\x0a\
-\x98\xa6y\x9f\xeb\xbaV\xb9\x5c\xfe\x8f\xa1\xa1\xa1\xd1\xff\
-+\x80\x00\x81\xb1\xef\x09\x86B\xa1\xa5\x87\x1b\xd7xQ\
-{8\x1cNd2\x99]\xfc?\xb2\x82\xc1`m8\
-\x1c\xfeG\xd7u\x9d#`\x08d \x10H\x9e|\xf2\
-\xc9\xff\xf3\xc2\x0b/H\xde]\xef\xaew\xd7\xbb\xeb\xdd\
-\xf5\xeezw\xbd\xbb\xde]\xff\x8f\xad\xff\x03!\xf6p\
-\xa0\xc1\x03\x97\x85\x00\x00\x00\x00IEND\xaeB`\
-\x82\
\x00\x00:y\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -1825,433 +944,7 @@ a\x02S\xa7N\xa5\xa7\xa7\x87\xee\xee\xee2\xb9\xc1\xfe\
\xd1\xf8h|4>\x1a\x1f\x8d\x8f\xc6G\xe3\xa3\xf1\xd1\
8`\xfc\x7f\xa7\x8cK\xc9\xd0\xc3l\x1c\x00\x00\x00\x00\
IEND\xaeB`\x82\
-\x00\x00\x1ax\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00d\x00\x00\x00i\x08\x06\x00\x00\x00\xcc|\x86\x8a\
-\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
-\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
-\x00\x00\x09pHYs\x00\x00\x88&\x00\x00\x88&\x01\
-\xac\x91\x9d\x06\x00\x00\x00\x07tIME\x07\xd9\x03\x03\
-\x0e\x04:\x04\x0e\x03\xc5\x00\x00\x19\xf8IDATx\
-\xda\xed\x9d{tT\xf5\xbd\xe8?\xbf\xbdg\xcfd\x92\
-\x0cy\x12\xc2#\x01J(\x8fJ\x90\xa2\x16k\xc3\xa9\
-\xa0\x02\xf5\xd4.\xbd\xda.[\xee\xa5\x85z\xb4u\xf5\
-\xae\x16\xef\x83\xf6\xf6\x9cs[\xd0z{\xafK\xaf\xbd\
-\xb4\x97\xd5z=*\xb7\xd6\x1e=\xe7\xd4Z\xa1*x\
-\x05\x0fJ\x00Q\x08\xa4\x09\xaf\xc8#\x04\xf2\x9a$3\
-\x99\xcc\xec\xc7\xef\xfe1\xccf\x1e{\x87\x09L\x12p\
-\xe5;k\xafd\xf6\xfe\xfd~\xfb\xf7\xfb\xbe\xbf\xdf\xdf\
-c\x04@eee\x9d\x10b\x07c0\xea\xa0\x00\xaa\
-eY\xda\x18*\xae\x0e\xf0\x00\x85\xa6i\x16\xaa\xaa\x0a\
-\x80\x94\x12\xcb\xb2\xc603B \x84@Q\x94\x14\x82\
-\x94\x1b\x86Q\xe6\xf5z\x01\xc8\xcf\xcfg\xe5\xca\x95c\
-\x98\x1a!\xd8\xbf\x7f?{\xf7\xeeM!\xc8D\xc30\
-*\xd3\x0b\x9a\xa6\x89\xae\xebc\x18\x1bF\xc9\xf0\xf9|\
-\x08!2T\xd6\xf8\x0b\x97\x0dRJ\xfa\xfb\xfbik\
-k\x1b\xc3\xdc0A^^\x1eS\xa6LAJ\x99A\
-\x90\x80eY\x81\xf4\x0a\xc3eK\x84\x10((\x08@\
- \x88\x19&1\xcb@\xf5\x9b\xf1;1\x0f\xaa\xa5\x82\
-\x00\xa1H\x10 \x91\x9f8\x82\xa4\x13\x22\x99 ^!\
-\x84\xe6T0]\x9cr\x01A\xa3\x8f\x93\xfa9\xba\x8d\
-\x10\x032\xc6gn\xc8gvm\x01Iv\x8d\xfe\x1e\
-\x89l\xcf'v\xce\x87\xd5\xee\xc73\x90\x17'\x90\xdd\
-\xb1O6A\x14\xcb\xb2\xd4d\x22X\x96\x95S\x09\x11\
-@\x8f\x19\xa6a\xe0\x04\x1df\x0fB*L\x9d\x9e\xc7\
-\x8a\xa5e\xe4\xe5)\x98&H\x09\xe2\x824\x14\x94\x0a\
-(\xebG\xcc\x09\x83\x02\xb1\x01\x89\xec\xd30z5d\
-\x9f\x86\x19\xf2`\x854\xac\xb0\x07+\xa4\xa2\xe8\x9a-\
-M\xf1K^\x13\x04I\xe09\x9d \xc2I\x12\xdc(\
-x9\x10\xb2\x22\xfck\x7f\x03RJT\xa9R1\xc9\
-\xcb\x17\xbfT\x8a\xb4\xc00$B\x08\x12]\x10q\x1d\
-\x05R \x11`H4U\x81b\x13o\xb1\x09\x0c\x10\
-\xef\xda\x85r\xc0@Hb\x9c\xcf\xc3h\xf7\xa1\xb7\xf9\
-\xf0\x84\xf3mN\x10W\xa9D\x0d&!\xae\x94\xcb\x85\
-\x84\x18\xd2dW\xff\xa1\x0b\x12 \xf0\xe5\x09n\xbb\xab\
-\x0cie\xa9\x16\xed\xe7\xc2\xf1\x96\x04\xfcE\x02\x8a\x07\
-\x10\xb3\x07@\x01=fa\xf6z\xb0z\xbd\x18\xbd*\
-\xb2\xcf\x8b\x19V\x91!\x0fFHA\x89z\x11B\xc6\
-\xc3\xe2Q\x92\xa8\xc1$\xc4\xb5B.\xa4\xe4\xa4~\x0e\
-C\x9a(\x17\xb0X3\xb7\x00E\x11\xc8\x1c1\xae\xdd\
-\x86\x14H\x13\xa4\x09\x1e\xa1\xe0)\x92P\x14\xbd0\x96\
-\xfe\x14\x89\xd2\xa3\x92\x816\x0d\xeb\x9c\x9fH\x9b\x07O\
-w\xbe\xad\xeeFJ\xa2\xb2\x96\x90db\xe4\x82 \xed\
-FO\x8a\x14TN\xf6\x0e\xab]\x16N\xff%K\x94\
-\x94x\xfd\x02\xef\x0c\x1dQ\xa3S\xa2HL\xab\x83X\
-\x8f\x02=^b=*\xf4z1\xc2\x0a\x845b!\
-\x81\x12\xd1\x10jn%\xc9\x0d\xbf\xc3N\x90\x90\x8c\xa4\
-|/,RG= \x03\xc0\x8aK\xa94@\x11\x0a\
-y\x85\x12\x0ac\xe4M\x06I\x04d\xc2\x96\x81e@\
-\xd7\x9fK\x90]y9'HV*+\x97\x0410\
-\xe3\x86\xfa\x02\xf8|\xa3K\x10W\x02\xa5\xcbV\xc2c\
-\x93\xa0\xfa@\xd1\xc0\x90r\xe4\x09\x92K\xef\x8a\xf8x\
-l\xfb\x01\xa0\x88k,\x8c\x10I\x03\x19\x01\x18TB\
-\xc6\xb2\xbe\xc3\x97\xb9\x18\x92\x0d\xc9\xb5\xa4d\xb6%\x87\
-P\xf7\x82Z\x11\xf1zq\xc4H[\xdd\x08.\xc60\
-\xc3J\x90\x1c\x8b\xc8\x90\xbc\xac\x04'\xe4\x82#\x84\x88\
-\x1b\xcdTP\xb2\xaa\xab\xa8\xd0\xd5\xaes\xead\x1f5\
-\x15s\xb8a\xc6MT\x96N`z\xe5\xa7P\x15\xe8\
-\xeco\xe3d\xf0/\xb4\x85>\xe6xw\x03\x8aP\x1d\
-\xde\x953\x0c\xe6\x5cB\x86\x1c\x87\x0c\xb7cz)\xc9\
-x\xfbO\xdd\xf4\xb4\xc3\xab?\xfb\xbf\xcc\x9f>\x1f\x8f\
-\xeaq\xec\xa7)\x0d\xce\xf4\x1e\xe5\xd7{\xff\x96\xf3\xa1\
-\x93\xa8\x8as\xb9DF\xc0\x92V\x5c\xf2\x10Y\xe7\xeb\
-\xe40\xa8@'<+\xd9x\x01Wr]\x0e\xc4\x06\
-,^}\xb1\x0d-V\xc6G\xcf\xec`a\xcdBT\
-Eu\xf5\x92<\x8a\xc6\xd4\xe29l\xb8\xeden\xfd\
-\xd4}\x18\x96\xeeX.\xd4k\xb0\xedO\xedL\xb6\xea\
-\xb8\xbfv-K>\xf5U\xe6\x8c\xff\x5c\xd6\x0c\x92+\
-\x9c\x0c\x86\x97aw{\x11\x82\xf4f\x06k\xd7\xb2\xe0\
-\xf5\x7f\xec$\xe0/\xe5\xfd_\xbe\x89\xdf\xeb\xcf*\xc5\
-\x92\x90\x80\xfbk\xff#\xc5y\x15\xfcc\xc3\xff\xc4\xab\
-\xfa\xec\xe7\xaaG\xd0rd\x80\xe6\xc3=\xdc\xff\xf7\x7f\
-C\xcd\xc4\x99\x00\xb4t\x1f\xe6\xf0\xf9\xf7\xb3\xa0\x88\x95\
-S\xad\xe1\xa4\xae\x06UY\xb9\xf3\xf3\xe3\xaen2\xa7\
-*\x8a;r\x0f\x7f\xd0G\xa4\xdf\xe4\xe7\x0f>b\x13\
-#\x1d\xa2F\x84\xf7\xff\xb2\x1bM\xf8\xb9a\xd6\x02\xbc\
-\x1eo\x0aaV|z\x15M\x1d{i\xee\xfc\xe0\x22\
-AT\xc1\xc9c\x03TV\x94P3q\xa6M@\x04\
-)s\xdaW\xaajs\xee\xf6\xe6B\xe5\x5c\xb6\x1f#\
-\x05\x87?\x0cQ^\x12\xe0\xdf\xdev\xbfc\xa9s\xa1\
-S\xfc\xb7\x9d\xab\xe9\xe9\x0b\xb3\xf5\xe5N\xaa'T\xf1\
-\xde/\xde\xca\x08\xf4\xfe\xcdg\xfe=\x8f\xbd\xb3\xca\xfe\
-\x1e\x09[\xf4\xf5\x98\xdc<oavI\xcda\xca\xed\
-]J\x0b)\x83\x89\x93eYW|%\x5c\xc6\xc4'\
-\xfd{\xe2\xa3\xa8\x82\x86}}t\xf7\x84\xf9\xdf\x8f<\
-\xe1j\x04_\xf8\xf0Q\x22F\x98\xbc|\xc1\xedw\x97\
-p\xf0H\x13w\xfe\xf8\xde\x0c\x04W\x15\xcd\xa4\xa6t\
->\xa6e \x91tw\xe8H$\xd7\xd7\x5c\xe7\xe8\xd2\
-^\xf2\x93#|$.7/Kq2~\xb9\xe4\x06\
-\x91\xf6q\xba'\x10(B\xa1\xf9`?\x15\xe5E,\
-\xb9~\x89\xa3Q\xee\x8e\x9c\xa3\xb1\xbd\x1e\x81@ZP\
-P\xa82s\xf68\xde\xfbp?\xef7\xd6g\xd4Y\
-\xb3\xf0\xa7X\xc4\xd0T\x85sma\xf4\x98\xc1\xbcO\
-\xcd\xc9p\x9f\x84\x14\x5c\xea\x93k7+\xeb\xc00\xd9\
-\x1d\xcb\xdd\x8c\xa1\xc8 Q:t\xb4\xc5\xd0c\xb0\xe2\
-\xe6\xbfr\x8d%\xde9\xf1O\xa8\xc2\x13\xaf\x7f\xa1\x89\
-\x09\x93}\x9c<\x16\xe5\x9d\x8f\xfe\x95EsnJ\x19\
-G\xb1\x7f<M;Kh:v\x8a\xed\xbfx\x99\xfe\
-\xaf\xc7\x983%\x95 \x01_\x09\x9f\xabZ\xce\x80\x11\
-A7#\xb4\x87[\xe9\xe8?\xe3(E\xb9\x8eCF\
-\xc7\xcb\xca\x12\xba\xdau\x84\x80\x053\xe7\xb9\x96i\xee\
-\xfc\x00U\xa4\xba\xbf%e\xf1\xe5\x00\x07\x8e58&\
-\x0d\xe7U\xcd\xa7\xe1/\x1f3\xa9d2%S\xca3\
-\xda,\xcb\x9f\xc8\xaa\x05\x7f\x1bO\xecJ\x8b\xffw\xe2\
-e^9\xf4\xf4\xd5eC\x86#\x0f\x94\xfar\x99q\
-\x85zM\xa4\x94TULtm\xe7tO3B(\
-)\xf5\x0a\x02*RJ\xcev\xb6;\xd6\x99;\xf53\
-Y\x05v\x82xFAIk\xff\xe2u\x15$\x17s\
-\xc1\x11\x8aHUQ\xc2\xc5}\x0c\xf7Y\x08!\xa8\x99\
-<\xd3\xb5-\xc323\x8c\xb7?_A\x08Ak\xc7\
-\x19\xc7:\xd3&M\xc62\xa1\xc0\xe7O\x89W\x06W\
-\xaf\xc2\xd9\xf0\xcbQ\x9a\xa0J\xcfi]y,\x22.\
-\xe9\xd3\x87CqdW\x96\x959G\xeff\xd4\x11\x91\
-\xaa'\x9e\xfe\x08G#\xce\x122\xb3\x9a\xaf\xfdM%\
-\x13\xef\x9bEYQ\x11G\xfe\xe1P\xaa\x1b\xddw\x8a\
-\x7f>\xf8\x0c\x9a\xe2\xa3\xc0WHG\xf4cg\x82X\
-W\x81\x0d\x19I\xd0c\xf1\xc1\x96\x14\x16;?7\x07\
-\x5c\x93L\x9aO\x10\x899?/\xce\x1b\x8f\xc7\xa3\x90\
-\xe7\xc9\xc7225t\xc4\xe8\xe3@\xc7\x9b\xa92\xe2\
-\xb4\x0ag\xd8\xd5\xf8 ^Vn\xd7ee\x17\x80\x99\
-F\xbcc\xf9\xde\x80\xab\x84\xb8\x81\xd7\xab\x10\xeew^\
-\x87\xecU\xf3.\xa6\x0c\x84s\xf7D6\x19\xe2\xd1\xcc\
-\xf6&b\x91\x5c\xac\x5c\x8c\xe3A\xa4}w \x889\
-x\xf4\xac\x9bQW\xd2\xfa|\x0a\xbaa:>\xd3T\
-\xef\xc5\xf5s\x0e\xed\x0bW\xab\x96\x8d\xea\xcd\xb5*\x1f\
-d>d\xa4g\x0c\x0dC\x0e:\xdf\x1e\x1bTe)\
-\x18\xba\x85i\x99\x19YaM\xf1]\x94\x84+\xc8G\
-\xe5\x1a\x1f\xc9\x11\xfb\x88g{\xb3Q\xc0\x8a\x10\xf6L\
-\xe0P\xb8SB\xea\xaa\xc7a\xe2\xea8>\x86?R\
-WFB4\xb3\x01U\x15\xe8\x86;\x07\xda\xb6\xc0\x81\
-\xdez\xccBU\xe3;\x91\xd2\x07iZ\xc6\x05\x0c\x08\
-W\x09\x1b-\xc8Ze\xb9\xcdf]I.+\xcd\x8a\
-:\xbb\xaf\x03\xee\x8c\xa0\xa9>\xc7z\x08\x81\x11\x13h\
-\x9a\xc7q\x90\xba\x15\x03q1\x8b\xe6J\xd5Q\xca\xf6\
-fmC\x92\xb3\xb5#%!\x08\x88\x9a\x11|j\xe6\
-<\x88m\x0b\x5c\x5cf\xaf\xe6qq\x06b\xb9A \
-\x16\xb9DG\xd6\xd9\xde\x5cJ\x87\x9bMrJo\xfb\
-\xfcqus\xae\xfb\xbc\x8b\xca\xf29\xd6\x13\x02b1\
-I\x9e\xe6u\xce\x00\xc4\x82\x17\xd3\xfe\xd2\x0d\xd9\x97\xfe\
-\x0cG\xb6wH\x81a\xee\x88\x929C\xa88\x98\xae\
-\xfc\x02\x15EQ\xe8\xea\x09R]>\xd5Qe\x09\xe9\
-\x10\xb4I\xe2\xa9\x91|g\x1b\xd3\x1b\xed\x8e\xef\xd8\x12\
-\x02\xb7\x89A%\x8b\x94\x9e\xcc\xf1\x14\xee\x90\x92\x8b9\
-\x9d\x0f\x11\xd99\x0c\xfe\xfc\xb8\xbb\xda\xda\xd96\x88\x1d\
-\xf1f\x1am#\xfe\x8e\xc2\xbc\x80\x0bA:\x93\xe2S\
-qEJ+\xd70j\xb9\xacl\xa0p\x5c\x9c \xc7\
-[[\x5c\xcbT\x17\xcf\xe2H\xc7G))\xf8p(\
-\x1e\x10V\x8f\x9f\xe2X\xa7-\xd4\x92#\xe41\xba\xb9\
-,\xb7U\x11\x97=\x9a4\x9d\x9d\x0e%\xe5\x1aH\xc9\
-\xfe\xa3\x07\x5c\x9b\x99Q2\x9f\xa6\xf6\x0fRTL\x7f\
-\xc8\x02)\x19_R\xeaX\xe7l\xdf\x09\xdb\x068\x8e\
-'\xcbM\xa5r\x98V\x9ddm\xd4s\x16\x8b\x08\x01\
-\x8ab_\x82\xf8.\xdc\xf4Oi\xb9\x06\x8a\xc2\xa1\x13\
-\xcd\xae\x1c\xf4\xb9\xaa\xe5X\xd2L\xa9\x17\xec4@Q\
-X8k\x81\xe38N\x06\x9b\xe2\x04T\x04\xc2a\xb5\
-\x8b\xa6\xe6\xa1\xc8\xe4\x16\x9d\xfb7\x12i\x93AmH\
-2\x05Gb\xa1\x9c\xd7'\x982\xcd\xc7\xc1\xa3\xcd\x1c\
-=\xdb\x9c\xd1a)%\x13\x0a\xab\xa9,\x9c\x9a\x82\xf0\
-\xf3\xad1,\xcb\xa2\xae\xf6s\x19\x03n\x09\x1e\xe6|\
-\xe8T\xdc\xadV\x04\xb1hf\x02rBA\x15\xba\x15\
-E7tN\x9f\xee\xa37\xe8\x9c\x13\x93\x96\xcc\xe9B\
-\xb9\xac%\xc4-\x1e\xb9\xa2U'\xe9\x04r\x98\x903\
-\x0dX\xb0(\x80G\xd5\xf8\xbb\xff\xf3\xb8+G\xdd2\
-\xf5.L\xcbDQ\x05\xbdA\x83\xa3\xcd\xbd,\xbdq\
-\x11\xb5\xd3k3\xea\xbc\xd6\xf8\x1b<\x8a\x06\x12\xbc>\
-\x85H4\x13\xd9\xaa\xe2\xe1?\xd7=\xcb\xd4\xe8\xdd\xac\
-\xb9\xfeg\xac\xff\xebg\x1d\xfb7\x1c\xabN\xb2\xb6!\
-\x09$\xe6&\xdb\xeb\xb0:]8\xc7\x02\xf9\x85*S\
-\xa7\x17\xb0m\xdf{\x1cm=J\xcd\xa4\x9a\x8crw\
-\xd4\xac\xa4\xab\xff,\xbf\xdd\xf9\x02;\xdf\xe8\xe3\xcbu\
-\xb7\xf3\xcc\x7f\xf8_\x19\xe5Nt\x1f\xa2\xa9s\x9f\xbd\
-\xce\xb7\xb8\xd4CO\xb7A\xd3\xe9&fM\x99\x952\
-\xcei\xa5\xb3Y\xf7\xb5\xd9\x00\x9c\xeai\x1a$\xa0\x1f\
-\xfe\x94\x922\x98w\x95+\x09\x89\x13E\x5c\xdcV\xe0\
-p\xd9\x8b\x12n(\x04\x09?\xfb\xedS\xae\xb6\xe4\xfe\
-\xf9\xff\x89\x8d_{\x9d\xc3\xcf\xedd\xf3\x0f\x7f\x8dO\
-\xf3e8\x0co\x1c}!\xe5}Sk\xf2@\xc2?\
-\xed|mP[)P\x1c\xfb\x97Xu2\xe2\xeb\xb2\
-F\xc3\xe5M\x86\xf2J\x8d\x1bn\x19\xc7+\xdb\xff\xcc\
-\xaf\xfe\xb4)\x13a\x17\xbeW\x8f\xafbRIU\xc6\
-\x80\x04\x82W\x0e\xfd\x82\x03m\xef\xa6\xdc\x9fT\xed\xe3\
-\xc6\xc5\xe3x\xea\xa5g\xf8\xf5\x96\xe7\x1cm\xd4\xbb-\
-\x7f\xe0\xf9\x0f\x1f\xcd\xc6Q\xcc\x99\xdb\x9bU\xfa=\x97\
-\xfbC\x86\xec\x0e\x9a\x92\x9a\xb9~\x06\x06\x8a\xf9/\x9b\
-\xfe;\x05\xbe\x00\xff\xee\xb6\xfb]\x83\xbad\xc4\x1a\x96\
-\xce\x96\xe6\x7f`\xdb\xf1\xdf\xc5mG\xca\x98$3f\
-\xfb\x99>\xd3\xcf\x96\x8f\x7f\xc1\x9f6n\xe4\xf3so\
-\xa4\xbc\xa8\x9c\x96\xee\xc3\x9c\xedk\xc1\xa3x\xf0(^\
-g\xd54L3\x86#\x1e\x87\x88\xcb\xb09R\xc2\xdc\
-\xeb\xf3\x99\x5c\xed\xe3\xd1\x17\x1f\xe7\xb7o\xfc\x0b\xcf\xae\
-{\x8a\x89\xa5\x93\x5c\xeb\xedo}\x9b\xd7\x9b\x9f\xe5l\
-\xa8%\x83\x18\xc9\xed\x0a\x05\xa6T\x15\x02\x92\x93\xe1\x83\
-\x9c\x0cK\x04\xf19\xf7\xc1l\x845B\xabN\x94l\
-\xf3-#\xb9?$\x81\xc0\xe22\x0f\x7f\xfd\xb52*\
-\xae;\xc3\xc2\x87?\xcf\xb2uw\xd3\xdau\xd6\xb1\xfc\
-\xef\x0e>\xc1\xb9\xf0\xc9!\xec\xa0\x12\x17\xd6a\xa9\x17\
-\xed\xdb\x10\x82\xdb+\xc5\x99[\xc4~\xc9\x19C\xd34\
-\x87\x1c\xfe\xa7\xa4\xbf\x0d#e\xbf\xbdi\x19\x08K\xb8\
-\xe7\x8bdj\xe6\xc80\xa1\xb0\x04f\xce.f\xf7\x9e\
-\x8fxc\xef6\xbeyG\xe6\x89w\x9f\xa9X\xc4\xfb\
-\xa7^\xbfD\xe6If\x9d\xaa\x92i7#\xfd\x11\xfa\
-\xfb\x8d\xdcyS\x8a\x92\xbd\xca\xb2,\x0b]\xd7\x09\x87\
-\xc3W,\xa6Q\xdd@X\xa9\xf3\x13\xf22\xdc\xc7\x92\
-\xf1`\x18\x06\xef5\xec\xe5\x9bw\xac\x8c\xa7\xde\x93\x14\
-\xe2\x8aO\x7f\x93\xe6\x8e\x0f\xe8\x8b\x061\xa4\x8e1\xc8\
-*\x95ltk\xfa\x84V\xb4\xdf\xc00rG\x10\xc3\
-0\x18\x18\x18\xc88\xb5\xcfQ\xbec\xb1\x18\xb1X,\
-g6$\xd9\xedM\xec\xeb\x1b\xea5\xb1\xca\x87\xd7\xab\
-\xf0\xcf\x17\xdc\xd6t\x8e\x1e_0\x85\xbf\xbb\xf5\xb7\xfc\
-\xd7%\xbf\xe3\xceO\xaf\xc6\xb0bC{G\xc6*}\
-q1\x1eS\xa0\xaf-w\xc4\x18r\x1cb\x9afN\
-\xf7\x87\xe4*?y\xcb\xed\xc5\xb4w\xf5\xf1\xf7/l\
-p\xd4\xf9^O\x1e%\xf9\x15\x14\xfa\x8as\xb6\x8dY\
-Q\x05g\x0fE1BfN\xe3\x10\xb7\x88]\x19.\
-cn\x1b\xaf\x1c\x05\xb7\x96%\x99T\xed\xa3\xf6\xb3%\
-\xfc\x8f\xcd\x9bxk\xff\xf6\xac\xed\xd8\x151\x82\x80\xc3\
-/\xf6\xa2xs\x8b\x97\xcb\xf2\xb2\xae&HH\xc4\xe7\
-\x97\x141wA\x80o<\xb6\x9a\x97w\xbdD{\xef\
-yB\x03\xbd\xe8f\x94\xa8\x11!\xa2\x87\xe9\x8f\xf5r\
-\xa5\x9c\x90`\xa6\x13o\xf7\x13\x0b\x9a#6N\x8f{\
-\xfeI\xe4&w\x93c\x0e\xb6,XxK\x80y\x0b\
-\x0b\xf8}\xf3c\xfc\xf9\xf4FJ\x03%\xf8}~L\
-\xcb$fF\x08\xc7z\xd1\x14\xef\x15\xbdG\xf3+\x9c\
-\xd8\xd5\xcf\x91\x7f\x09\x0dK\x0e\xcb\x0d\xbf\x1e\xaeA\x90\
-\x16h^\x85\x12o\x1e\x10%\x18k#\x18\xbb\xccD\
-\xe0\x85UIR\x82\x11\x95\x981\x0b#\x229\xb6\xbd\
-\x9f3;\x22\xa8\x9a\x18V\x89w:\xb7wx%\xe4\
-jR{\x0a\x085n\xa8\x0dC\xd2sF\xa7\xb7\xc5\
-\xa0\xe7\xb4N\xff\x19\x13\xbd_\xa2\xf7[\xc4\xfa,\xa4\
-\x89M\x8c\xe1\xc2Cb\x0d\xf55/!\xd9\xc6\x13f\
-L\xdaW4d\x11<e\xd0sL\xa7\xfbc\x9d\xc8\
-\x19#\xcetJ\x9cP\xe9\xd6T\x0c\xb3u\x1d5\x09\
-\x91b\xf8\xce\x98\xb49^\x11\x98R\xd2{\xd6\xa0\xaf\
-\xc5\xa0\xe7\x8cA\xf8\xb4A,,1\xc2\x16\xb1~\x89\
-\x19\x89\xaf\xe1J\xa8(O\xde\xe8\xfb3Y\xdb\x90\x5c\
-\x8ah~\x97B\xa4\xd8\xe2\xb2\xd7\x9e's\xbc.\xb1\
-b\x12S\x97\xc4\xfa%\xc1\xd3:\xbd\xc7\x0c\xba>\xd6\
-\xe9?i\xc6\xc39\x9b\xe3EJ\xf4\xa8\x5ce\xba\xc0\
-\x8d\xe9=C\xa5\xe0Pa\xdcy\x15\x8f.\xe8\xad0\
-\x11Rd\xc5\xf1B\x11H$\xbd\xe7MB\x1f'8\
-\xde$\xd6g\xd9\x1co\xf4K{\xa9\x95\x10\xe0\xf1\x89\
-\x1c\xe4\x9aG\x1f\x5c\x93\x8b\xb9[u\x02\x05\xdd\xf1\xb3\
-\xdcCe\x16\xc9{*-#\xae\xdf-]\xa2\x0fH\
-zZ\x8d8\xc7\x9f\xd4\x09\xb7\x98`\xe2\xaa\xe3\x15\x95\
-k\x1e\xb2^(\xe7fp\xae\x84(\x85\xdd*\xaa.\
-h\xffK\x8cp\x9bI\xf8\x94I\xb4\xcfB\x0fI\xf4\
-\xb0\x85\x1e\x96q[\xa3\xc49^\xf5\x88O\xa2\xcb\x91\
-\xa1\xb2\xb2\xf6\xb2r\xed\xeaI\x01\xfe\x90\xca\xa1_\x87\
->\xb1\x1c\x9f\x0b\xc3>\xb2q\x88\x00E\x13\x8c\x81{\
-\xa4\xae\x8c\xa1\xe6\x1a0\xea9\xb7!cpen\xaf\
-\xc8r\x8b\x17\x80\xaa\xaah\x9a\x86eY\xf6to.\
-7Z^m^P.\xeb\x0d)\xb9\xe8\xa6\xe3,\xcb\
-b``\x80;\xef\xbc\x93;\xef\xbc\x93\xf1\xe3\xc7\x13\
-\x08\x04\x88\xc5b\x04\x83Av\xef\xde\xcd\xee\xdd\xbb\xd1\
-4-\xc5\x8bp\xfa\x9b\xed\xb3\xa1\x96K\xf43\x19A\
-n\xe5\xae\xf4]N\x7f\x13S\xe0\xb1X\xcc\x959\xdd\
-\xee{\xb2Ix%\xc3g?\xfbY~\xf9\xcb_R\
-\x96v&I\x22v\xb9\xf5\xd6[\xe9\xed\xed\xe5\xe9\xa7\
-\x9f\xe6\xe8\xd1\xa3\x19\x03O\xb4\x9d>[\x96>\xd8\xc1\
-\xbeg[n\xb0\xff\xdd\xbe[\x96\x95r\x88\xdb`\xfd\
-u\xeb\x97\xc7\xe3\xc1\xeb\xf5\xe2\xf7\xfb\xe9\xef\xef\xb7g\
-`\xb3\x91$\xe5R\xfa-q\x19\x86\xc1\x8f~\xf4#\
-^z\xe9%\x9b\x18\xe9\xcbE\x13\x10\x08\x04X\xb7n\
-\x1d_\xff\xfa\xd7]\x17\x06\xe4\xe7\xe7SWWG\xe2\
-\x07-\xaf\xc6 -]3\xdcz\xeb\xad\x8c\x1f?>\
-+5$\xa5DQ\x14\x0a\x0a\x0a\xc8\xcb\xcbs\x9d\xcb\
-\x1f\xb2\x97\x95\xa8\xf4\xfd\xef\x7f\x9fU\xabV\xd9\x1d\xaf\
-\xaf\xafg\xf5\xea\xd5l\xdd\xba\xd5.k\x18\x06?\xff\
-\xf9\xcfY\xb3f\x0d\x07\x0e\x1c\xe0\x8e;\xee\xe0\x9e{\
-\xeeq\x1c\xec\x8a\x15+\xf8\xcew\xbe\xc3M7\xdd4\
-\xea\x84P\x14\x85i\xd3\xa6\x0dZn\xee\xdc\xb9l\xd8\
-\xb0\x81\x87\x1ezh\xc8\xf6\xc1\xe7\xf3\xe1\xf3\xf9.\xcf\
-\xcb\xbax\x02\xb4\xb0\x7f l\xce\x9c9|\xef{\xdf\
-Ky\xd1\xb9s\xe7\xf0\xf9|L\x992\xc5\xae\xf7\xf4\
-\xd3O\xd3\xd8\xd8\xc8\xda\xb5k\x997/~2\xdc=\
-\xf7\xdc\xc3\xfe\xfd\xfbiiiI\xe9\xe4\xce\x9d;\x89\
-F\xa3\x1c<xpT\x09\x12\x8dFy\xe8\xa1\x87\xb8\
-\xf9\xe6\x9by\xe0\x81\x07\x5c\xcb\x1d?~\x9c'\x9f|\
-\x92\x03\x07\x0e\x5cV\xe0\xe7\xf3\xf90\x0c\xc3y\x01\xfa\
-P$\xc40\x0c6m\xda\x94q\xff\xdc\xb9sH)\
-\xa9\xac\xacDJ\xc9\x0b/\xbc@SS\x13\xabW\xaf\
-f\xde\xbcy)R\xb1v\xed\xda\x94\x05w~\xbf\x9f\
-P(\xc4[o\xbdE8\x1cv|\xaf\xa6ih\x9a\
-\x86\x94\x92\xbc\xbc<\x02\x81\x00\xf9\xf9\xf9Y\x9e\xb1\x1b\
-\x7fG \x10\xa0\xa0\xa0\xc0\x9d\x1b=\x1e\xaa\xab\xabY\
-\xb9r%\xcd\xcd\xcd\xe4\xe7\xe7\xe3\xf7g\xee\x91\xf7\xf9\
-|x\xbd^\xb6l\xd9\xc2\xf1\xe3\xc7\x07\x956UU\
-),,d\xdc\xb8q\x14\x16\x16\xda*Y\x08\xe1\xd8\
-vVF=\xf9Z\xb4h\x11\x13&L\xc8H8\xb6\
-\xb5\xb5!\x84\xa0\xa2\xa2\x82\x17_|\x917\xdf|\x93\
-\x07\x1ex\x80\xba\xba\xba\x0c]ZRR\xc2\xdc\xb9s\
-inn\xa6\xa4\xa4\x84\xa7\x9ez\xca&\xc4\xb7\xbf\xfd\
-mG;r\xef\xbd\xf7\xe2\xf1x\xe8\xea\xea\xe2\xab_\
-\xfd*~\xbf\x9fH$\xc2\x9bo\xbe\xc9\xb3\xcf>;\
-(\x92\x1f~\xf8an\xb9\xe5\x16,\xcb\xc2\xe3\xf1\xb0\
-g\xcf\x1e\x1e}4uU{,\x16\xe3\xc1\x07\x1f\xe4\
-\xde{\xef\xb5U\xe8\xb2e\xcb\xa8\xaf\xaf\xe7\x87?\xfc\
-\xa1].\x12\x89\xb0q\xe3Fjjj\x88F\xa3\xfc\
-\xf8\xc7?f\xff\xfe\xfd\x19\xef\xd5u\x9d\xeb\xae\xbb\x8e\
-G\x1ey\x84\xda\xdaZ,\xcbBUU6l\xd8\xc0\
-\x1f\xff\xf8G\x9bX\xaa\xaa\xda\x8e\xc3eIHB\xc7\
-'W\x94R\xd2\xda\xdaJuu5;v\xec`\xfb\
-\xf6\xed\xdcw\xdf},^\xbc8s{\xc0\x85z\xb3\
-g\xc77\xc4tww\xb3j\xd5*\xf2\xf3\xf3\xe9\xec\
-\xect\xfd\xbd\xdd\xea\xeaj\x96,Y\xc2\xf2\xe5\xcby\
-\xf0\xc1\x07Y\xbe|9g\xce\x9c\xe1\xae\xbb\xee\xc2\xe3\
-\xf1\xb8z-k\xd7\xae\xe5\xb6\xdbnc\xe3\xc6\x8d|\
-\xe5+_a\xf3\xe6\xcd\xd4\xd5\xd5\xb1dI\xea\xd1\xb3\
-^\xaf\x97M\x9b6\xb1y\xf3f\x00\xd6\xad[\xc7\xd2\
-\xa5KY\xb7n]\x86\xa4=\xfc\xf0\xc3\xd4\xd7\xd7S\
-\x5c\x5c\xcc\xd9\xb3\xcek\x8bg\xcf\x9e\xcd\xf3\xcf?O\
-QQ\x11+V\xac\xa0\xb6\xb6\x96e\xcb\x96\xd9*.\
-\x81\x87K91\x97\xf4\xb2&L\x98\x90\xf1<\x18\x0c\
-\xd2\xd7\xd7\xc7\xc0\xc0\x00\x9b7of\xd9\xb2e\xdcu\
-\xd7]\x83\xfa\xd7%%%6\xd2JKKQU\x95\
-\x8f>\xfa\xc8\xb5\x83\x93&M\xa2\xa0\xa0\x80\xf5\xeb\xd7\
-\x13\x0e\x87\xf1z\xbd\xec\xde\xbd\x1b\x80\xb2\xb2\xb2\x0c\x82\
-\x18\x86\xc1\x82\x05\x0bX\xbcx1\x7f\xf8\xc3\x1f\xd8\xb2\
-e\x0b>\x9f\xcfV1EEE\x8e\x04\xac\xae\xae\x06\
-\xe0\xe4\xc9\x93\x83\xaa\xa2\xa9S\xa7b\x9a\xa6c9)\
-%?\xf8\xc1\x0fl\xf5\xdc\xd9\xd9Iaa!]]\
-]\x9c8q\x22\x15\xe1\x8a2t/+\xb9\xe0\xb8q\
-\xe32\x9e\x1f:t(\xbe\xd1\xb2\xae\x8eh4:\xe8\
-\x82\xec\x04$t\xb9i\x9a\xd4\xd6\xc6\xf7\x03\x1e<x\
-0\x83 \x09DO\x9c8\x91\x96\x96\x16N\x9c8a\
-;\x17UUU\x00\xb4\xb7\xb7g\x1e2\xa3\xeb\xb6\xe3\
-\xf1\xcc3\xcfPXXH^^\x1e\xb7\xdf~;\x96\
-e\xd1\xd8\xd8\xe88\xce\xaa\xaa*,\xcb\xe2\xd4\xa9S\
-\x83\x06q\xd3\xa6M\xe3\xd0\xa1C\x19c\x95RRT\
-T\xc4\x8d7\xde\xc8\x87\x1f~Hss\xb3m\xe7\x14\
-E\xc9\xb0y\xc9\xef\xb8\xac\x19\xc3`0\x98q\xbf\xb1\
-\xb1\x11UUY\xbat)\x07\x0e\x1c`\xdb\xb6m,\
-]\xba\x94\xf2\xf2r\xd7\xb6B\xa1\x90M\x90\x84\x07\x96\
-\xdc\xf9tn\x04\xd8\xb1c\x07\x9a\xa6\xd9\xf5\xae\xbf\xfe\
-z\x82\xc1`J\xf0\x96\x80\xc9\x93'SQQA$\
-\x12\xe1'?\xf9\x09\x81@\x80\xea\xeaj\xda\xda\xda\xd8\
-\xb0a\x03\x0d\x0d\x0dx<\x9e\x8c\xd8b\xfa\xf4\xe94\
-66\xa2\xeb\xba\xfd\xae\xf42\x09)\xaa\xaf\xaf\xcf`\
- \xc30X\xbe|9\x00/\xbd\xf4\x12\x89\xdf\xa5\x1f\
-L\xda\x06K-y.\x15$9\xe9\xcc\xc3\x87\x0fS\
-YY\x89\xaa\xaa,^\xbc\x98\xe6\xe6f\xde~\xfbm\
-\xee\xbb\xef>\xd7\x17vtt\xd8\x03\xbc\xee\xba\xeb\xe8\
-\xea\xea\xc24\xcd\x0c\xc4&\x10\x0f\xa4\xa8\xb4\xd2\xd2R\
-\xc6\x8d\x1bGCC\x83c6!\xc1\x0cg\xce\x9ca\
-\xd7\xae]ttt\xd0\xd0\xd0@0\x18\xc4\xe3\xf1d\
-\x10CJ\xc9\xc4\x89\xf13\x82\xf7\xec\xd9\x93\xf1<\xb9\
-?\x8b\x16-\x02`\xf7\xee\xdd\x19\x041M\x93\x193\
-f\x00p\xe2\xc4\x89Kz\x81\xc9{\x1b/+R\xaf\
-\xaf\xafOi(\x12\x89\x10\x0e\x87\xed\xc1\xdct\xd3M\
-\x04\x02\x01\xdey\xe7\x1d\x0c\xc3p\xdc\xbb\x97 bB\
-\xff\xe7\xe7\xe7\xd3\xda\xda\xea\x8a\x80\xf9\xf3\xe7\x03\xa4\xa8\
-\x91\xc9\x93'\xdb\x08\x1fl\xa0G\x8e\x1c\xe1\xb5\xd7^\
-\xe3\xbd\xf7\xde#\x1c\x0e;r}\xfa{\xf6\xec\xd9\xe3\
-j\xcb\x0c\xc3\xb0\x1d\x9b\xa6\xa6\xa6\x8crB\x08\xa2\xd1\
-\xa8\xad6]O\xbeKK\xcd\xb8\xd9[\xe5R\xe9\xf7\
-}\xfb\xf6q\xe4\xc8\x11\xfb^\xc2\xddM6\xf6\xabV\
-\xad\x22\x18\x0c\xf2\xfb\xdf\xff\xde\xb1\xad\xd3\xa7O\xd3\xd4\
-\xd4d\x1bk7\xc9K\xc0\x9c9sl\x82%\xde\x9b\
-\x08@\xdd\x08r\xfe\xfcy[\x05y\xbd^T5~\
-\xbaPyy9\x85\x85\x85\x99\x87\xd6\x98&s\xe7\xce\
-MA\xb4\xdb\x8f4/X\xb0\x80\xd6\xd6V\xc7\xd5\xfc\
-\xaa\xaa\xda\xc1\xed\x97\xbe\xf4%;o\xa5i\x1a\xaa\xaa\
-\xa6HD\xe2\xd9`F\xfd\x923\x86~\xbf\x9f\xef~\
-\xf7\xbbl\xdd\xba\x15UU9u\xea\x14\x91H\x84\x8a\
-\x8a\x0a\xbb\xc3\xb5\xb5\xb5L\x9f>\x9d\xad[\xb7\xb2d\
-\xc9\x12*++St\xf0\x13O<a\xeb\xd6\x04b\
-\xdd\x082i\xd2$TU\xa5\xad-\xf5T\xa0\x84A\
-w#H{{;\xcf=\xf7\x1c\xdf\xfa\xd6\xb7x\xfc\
-\xf1\xc79s\xe6\x0c\xe5\xe5\xe5\xcc\x9e=\x9b5k\xd6\
-dr\xa2\xa2\xd8\x1e\xd8O\x7f\xfaS\x0c\xc3\xe0\xf5\xd7\
-_g\xe7\xce\x9d)\xeak\xca\x94)\xf8|>N\x9f\
->\xed\x1a\xf7\xbc\xf1\xc6\x1b|\xe3\x1b\xdf`\xcd\x9a5\
-\xcc\x981\x83H$\xc2\xc2\x85\x0bY\xbf~=\xbbv\
-\xed\xb2\xddt]\xd7m\x95\xe6F\x10\x15\xb8A\xd3\xb4\
-\xea\xbc\xbc\xbc\xdaDG\xa7M\x9b\xc6\xc0\xc0\x00==\
-\xf1\xdf\xb1\x0d\x87\xc3tvvRWWGii)\
-_\xf8\xc2\x17\x985k\x96\x9db\x07X\xb8p!u\
-uu\x04\x02\x01;o#\xa5\xe4\xf9\xe7\x9f\xa7\xb1\xb1\
-\xd1.WTTD__\x1f\xf5\xf5\xf5\xf4\xf6\xf6f\
-t(\x10\x08 \xa5\xa4\xbe\xbe>\x05\xf9\xa5\xa5\xa5t\
-tt\xf0\xee\xbb\xef\xda*\x22\x9dS\x0f\x1d:\xc4\xbe\
-}\xfb(++#\x10\x08\xd0\xd0\xd0\xc0c\x8f=F\
-___f\x00\xa6(466\xd2\xd7\xd7GUU\
-\x15g\xcf\x9ee\xfb\xf6\xed\x0c\x0c\x0c\xa4\x94M\xb8\xcb\
-;v\xec\xa0\xa5\xa5\xc5\xd5\xf9y\xe5\x95W\x08\x87\xc3\
-L\x980\x81h4\xca\xaf~\xf5+\xf6\xee\xddkK\
-\x89\xae\xeb)R\xaai\x1a\xa5\xa5\xa5\x04\x83A\xba\xbb\
-\xbb/\xb6\x05<\xe8\xf7\xfb\xbfP\x5c\x5c\xbc2A\xf1\
-/~\xf1\x8b\x04\x83\xc1\x14\x9f\xdb0\x0c\xee\xbe\xfbn\
-\xd6\xaf_\x9fu\xd2\xee7\xbf\xf9\x0d;v\xec\xb0;\
-%\xa5\xc40\x0cL\xd3LQ\x11\xc9il\xd34m\
-NJ\xae\xa7\xeb\xba\x1dy;\xa5\xc7\x93\xf7D&r\
-FB\x08\x9b\xdb\xdd\xd2\xed\xb1X\xcc\xb6}\x89TM\
-r\xfb\x96e\x11\x8b\xc5R\xfa\xe3\x96~\x8f\xc5b)\
-\xefM\xd8\x1b]\xd7m\x07&9\xdb]SS\xc3\xf1\
-\xe3\xc7S\xd21\x9elS\xd2\x1e\x8f\x87W_}\x95\
-\xfa\xfaz6n\xdc\xc8\xf4\xe9\xd3\x1d\x0d\xa1eY\xb4\
-\xb6\xb6\xf2\xe4\x93O\xd2\xd9\xd9\x99Q&\x91>p\xdd\
-\xb0\xa2(x\xbd\x99\x07\x95\xa5#\xd65\xd2M\xaa\x9f\
-\xcd\xc9x\x9a\xa6\xa5D\xfeN\x99\x06\x9f\xcf\x97\xd5\xae\
-\xe2d\x977y\xa2j('\xf4\x0di\xc6P\x08\xc1\
-\xd9\xb3g\xf9\xf2\x97\xbfLmm-\xb5\xb5\xb5L\x9a\
-4\x89\x8a\x8a\x0aB\xa1\x10\xed\xed\xed\x1c;v\x8cc\
-\xc7\x8e9\xba\x99\x83\xcd\xd49\xfd\xbd\xd4\x0c\xa3[\xbb\
-C\xbd\x7f\xb9\xe5.5\xbb\xe84Wt\xd9\x04qk\
-(\xc1\xe1\xcd\xcd\xcd\xb6\xe7\x94\xf33\xb6>\x01\x0b\x18\
-.\x85\x8f!M\xe1f\xbb.k\x8c\x00WN\xb8!\
-g{\xc7`x\xa5h\xc8q\xc8\x18\x8c,Q\xc6$\
-dLB\xc6`LB\xae!O\xccUB\xc6\x8d\x1b\
-\xc7\xacY\xb3\xc607L\x90\x989tTY\xe9\x01\
-\x8fS\xaeh\x0cr\x0b\x96e\x11\x8dF3\x16\x12z\
-\x00K\x88\x8b\xfbd\x0d\xc3`\xdb\xb6mc\x18\x1b\xa5\
-X\xc4\x03\xe8@,]\x9c\xc6`\x94T\x19\x10\x16B\
-\x0c\x8cyT\xa3\x0fR\xc6w\x16/\x05&j\x9aV\
-!\xa5\xf4p-\xee%\xbev\xc0\x14B\xc4\x80^E\
-Q:TU=\xa7iZP\xd3\xb4\x88\xc7\xe31\x00\
-\xf9\xff\x01\xfa\x90K\xa0\xc0O~5\x00\x00\x00\x00I\
-END\xaeB`\x82\
-\x00\x00\x03|\
+\x00\x006\xe2\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00d\x00\x00\x00d\x08\x06\x00\x00\x00p\xe2\x95T\
@@ -2259,56 +952,879 @@ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
\x95+\x0e\x1b\x00\x00\x00\x07tIME\x07\xd9\x03\x03\
-\x0e\x1c\x0e\xa7\xa1o)\x00\x00\x02\xfcIDATx\
-\xda\xed\xd6\xbfo\x1cE\x18\xc6\xf1\xef\xcc\xed\xda\xb1\x0f\
-\x9b\x93\x85\x90-\xb08\x12\x09wn\xac\x14n\x10\xe0\
-\x8b\x90K7\x14\xc8\x7f\x03\xfc\x01T'QB\x81(\
-\xdd\xd0\x906m0\x8ep*DD\x94 \x17\xc8\x0e\
-\x06d\x90\xec\xe4\x02\xde\xf3\xde\x9e\xf7\xd7\xecP\x1c9\
-\x892R\xaeX\xf1|\xa4\xedv\xa4\x9d}\xe7y\xdf\
-\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
-\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
-\x11y1L\x9d>vqq\xf1\x13cL\xf8\x9c\xcb\
-\xa6\x80\xcfNOO\xffVA^\xb0\xf5\xf5u\xdfn\
-\xb7\xf1\xdeSQQ\xbe\xf9\x94\x97\xaeLS>\x99\xc6\
-\x9d\xcd\x8c^\xb2`\xac\x1f\xef,\x8ec\xf6\xf6\xf6V\
-\xb2,;\xaa\xc3\x1e\x83\xbaE:MS\x0cp?\xff\
-\x85\xce\xf5\x19\x1a\xe1\x05\x99\xbb\xa4\x19^\x81$\xa0<\
-\x9f\x22\xfbu\x86\xe1\xe1,\x00eYb\x8c\xf1u\xd9\
-\x9f\xadS1\xaa\xaa\x22\xcfs\xf2\xbc\xc0Sa\x8d\xe1\
-\xaay\x9f\xcf;wx\xe7\xf5\x0f\x98\xe7\x1a\x8bW[\
-\xd8W2\x8a\xa2\xa0(\x0a\x9cs\xb5:p\xb5J\x88\
-s\x8e<\xcf\xc1\x8f&\xc3`\x90\xf2\xe1{\x1f\xf3\xd1\
-\xad\x1b|\xbd\xfd\x90w_;\xe3$}\xc0\x17\xf7?\
-%\xcfs\xbc\xf7\xcf\x12\xa2\x82L\x82\xf7\x9e,\xcb0\
-\x18\x98\x82\xe1\xc01\xd7l\x92W)\x00\x87\x7f\x1e\xf2\
-cr\x0b\xe3-Y\x96\x8dS\xa5\x82L\xb8e\x19\x00\
-\x0fs\xf3S\x0c\x86C\xa6\x1b\xa3yQ\xe1)]\x81\
-\xf7\x8c\x92\xf4\xec\xe6R\xa3\x82\xd8:&$\xcbr*\
-</\xcf7\xb9\xfd\xf3M\xba7n\xf2\xe0\xf4.\xf7\
-\xfe\xf8\x96\xb7\xdf\xd8\xa2(\xf3\x7f\xdf\xcb\xd4\xb2&\xa9\
-(\x0a\xe28\xc6\x1aK2Wq\x995\xf9\xc1}E\
-uo\x8eW\xafe\x1c\x97\xdf\xf0\xfbO{D\x8f\x13\
-\xce\xcf\x13\xbc\xf7\xcc\xce\xceb\xadUA&\x16ik\
-1\x18L\x05\x8diC\xc3\x86|\xf7\xdb\x97\x5c\xdc1\
-<y\x94\x90\xfe\xe5H\x1e;\x8c1\xb5JFm\x0b\
-\xe2\x9ccaa\x81\xf0l\xc8\xf7\xdd\x0b.\x9fV\x18\
-\x03\xc6\x8e\x1eo\x0cA\x10\x8cgN\x9d\xd2Q\xcb[\
-V\xb7\xdbecc\x83\xfd\xfd}\x0e\x0e\x0e\xe8\xf5z\
-\x94eIUUDQD\xab\xd5\x22I\x12z\xbd\x1e\
-\x8dF\x83~\xbf\x8f\xf7\xbe>\x1d\xa0n3\xa4\xddn\
-srr\xc2\xe6\xe6&Q\x14\xb1\xb4\xb4\xc4\xda\xda\x1a\
-\xdb\xdb\xdbx\xefi\xb5Z\xac\xac\xac\xd0\xe9t(\xcb\
-\x920\x0ck\x95\x90Z5\xd9\xd5\xd5U\xbf\xbc\xbc\xcc\
-\xd6\xd6\x16\xbb\xbb\xbb\xa3\x01o\xed\xf8\xc7GQD\x18\
-\x86x\xefI\xd3\x14\xe7\x1c\xce9\x8e\x8e\x8e\xde\x1a\x0c\
-\x06\x8f\xd4\xb2&\xa0\xdf\xef\xb3\xb3\xb33\x9e\x13\xff9\
-]\xc6P\x14\xc5hcA@\x10\x04\x14E\xa1k\xef\
-\xa4\x1c\x1f\x1f?\x04\xca\xe7Y\x13\x86\xe1L\xb3\xd9L\
-\xe38FDDDDDDDDDDDDD\
-DDDDDDDDDDDDDDDD\
-DDD\xfeO\xfe\x01\xd1\xc0Q%\xbd%\x7f`\x00\
-\x00\x00\x00IEND\xaeB`\x82\
+\x0e\x1c$|\x1a\xa6\xff\x00\x00 \x00IDATx\
+\xda\xed\x9dw\x98\x9de\x9d\xf7?\xf7SN\x9f\x993\
+3\x99Lf\x122\xa9\xa4\x03\x91\x90\x10j\xe8H\xd9\
+\x05\xa5\x88\xc8\xba\xeb\xcb\xb2\xae\x04QW_W]]\
+v]EQVPqYu\xa5Y\xc0\x12:\x16\x88\
+\x94\x00\x09)\xa4M\xea\xb4L\xa6\xcf\x9c9\xbd=\xf5\
+~\xff8\xf3<\x99A\x944}\xdf\xeb\xbd\xb8\xaf+\
+W2\xc9\xc9y\xca\xf7\xfe\xb5\xef\xaf\xdc\xf0\xeezw\
+\xbd\xbb\xde]\xef\xaew\xd7\xbb\xeb\xdd\xf5\xeezw\xfd\
+\x7f\xbf\xc4\xb1\xfc\xe7\xba\xba\xba\xab\x0c\xc3\x08N\x992\
+\xe5s+W\xae<QQ\x14\xb6m\xdbFmm\xed\
+\xa1\x0b\xb8\x02\x09 \xe4\x1f\x5cMU\xd5\x94\xa2(\xf9\
+r\xb9\xac\xbf\xfa\xea\xab\xb3\xfeo\xbf\x8c\xda\xda\xda\x9f\
+]w\xdduW\x97\xcbe\x17@A\xe0H\x89\xf8#\
+o\xc9q\x1c\x02\x81\x00\xaf\xbf\xfe\xba\xb3`\xc1\x82\xc2\
+\xc0\xc0@l\xcb\x96-\xd3-\xcbJ\x1e\xed=h\xc7\
+\xf2\x00\x8b\x16-\xfa\xe1\xcc\x993\xeb7o\xdeL\xa9\
+T\xc2\xb6m\xea\xeb\xebihh@\x08A\xbf\x95b\
+\xda\x05E\xaa\xa2:N:\x88\x93\xd1qs:vJ\
+C\x165\x80\xb0\x94\xf2\x0f\xbew\xda\xb4i\xa2\xb7\xb7\
+W\xfe%@\xa8\xaa\xaa\xba`\xc5\x8a\x15kt]7\
+\x1d\xc7\xa9\xe9\xef\xed\xd3m\x0b\x84\x2210\x09\xc5\x04\
+\xb2\xa0M\xd8LB\x08\xf6\xee\xdd\xcb\xd2\xa5K\xbd\x8d\
+\x85\xa6i\xb1X,\x86\xeb\xba\xa7\x85B\xa1lmm\
+\xed\xae\x81\x81\x81\xec\x9f\x1d\x90E\x8b\x16\xb1w\xef\xde\
+\x90\xe38(\x8a\xe2\x94J%\x5c\xd7\xc54Ml\xdb\
+\xc6\xb2,\xca\xe52B\x08\x8a\xdd\x09\xba\xba\xc3Hi\
+\x220\x91\xaa\x8b@\x80\xa8<\xf08\x19\x95g\x9cq\
+\x86\x04\xc8f\xb3\xb4\xb6\xb6\x8a\xbf\x94T\x94\xcb\xe5\xe6\
+\xc9\x93'W\x9b\xa6\x89\x82\xe0`\xb8\x87\x85\x17*\xd8\
+\xc3A\xecD\x10g4\x88\x8c\x0a\xa4\xa9 -\xa5\xf2\
+\xd24\x0dUU1M\x13EQp]\x17\xc300\
+MS^u\xd5U\xbf\x11B\xf0\xdak\xaf]\x00\xfc\
+\xfe\xcf\x0eHGG\xc7\x9c\xd3N;\xad\xad\xb6\xb6\x96\
+B\xa1\x80i\x9a\x13\x00\xf1nNQ\x14\xa6Lm\x22\
+\x1c\x0e\xa3\x08A\xabq\x80\xe5\x1f\x82@@\xc1\x1e\xd5\
+\xb1z\xa3\x98\x83\x01\x9c\xe1 B\xa9(\x05)%\xc1\
+`\xf0/\xab\xb3\x85\xf07\x92\x86\x8a;?C ^\
+C ^\x82\x13K\x13>;\xf4\xe8$\xdc\xa2\x8a\xeb\
+\xbaH)1\x0c\x03!\x04RJ,\xcb\xc2u]a\
+\x18\x06\x9a\xa6\x01\xb8\x7f\x11\x95U.\x97\x1b\x1a\x1a\x1a\
+\x08\x85B\xe4\xf3y\x0c\xc3\xf0o\xceq\x1c\x1c\xc7\xf1\
+o4\x10\x08T\xc0\x11\x82^{\x84\xf3bM\xb8F\
+\x90%KNa\xe7\xe4W\x89\x08\x89\xa2\xe8\xa4_\xae\
+\xa2\xb0'\x8c\x94\x12\xd7u\xff\xec D\xa3\xd1\xb3\xae\
+\xb9\xe6\x9au\xa5R\xa9\xf2B])C\xf5B\xb8)\
+\x9d\x19\xbbNat\x97\xacH\xf0[\xe4\xb4m\xef.\
+f\xcc\x98\xe1\x032^B\xca\xe5\xb2\xbf1\xa5\x94\x94\
+\xcb\xe5\x8fWUU]WUU\xf5@\x7f\x7f\xff\xa6\
+?\xab\x0d\xb1m\x1b\xc30|i\xf0n\xc4q\x1c\x7f\
+\xb7\x09!PU\x15\xcb\xb2\x90\xaeK}:\xc4\xc1\xa7\
+\x15N\x08.&W?\x05;1\x17\xac0I:)\
+\x0c\x988y\xc7\x07\xe4\xec\xb3\xcf\xfe\x1f)e \x99\
+L\x86{{{\xff6\x9b\xcd\xe6\x8f' R\xca\xb0\
+\xaa\xaa\x15\x89\x96\x92]\x93w\x8a\xf3\xaf\xac\xc3\x956\
+vVCd\xc3\xd8Y\x0d'\xabQ\xde\x1fA:\xc2\
+\x97\xa6r\xb9\x8c\xa2TT\x97\x07\x88'!\x8e\xe3T\
+\x9eWJ\xb9j\xd5\xaa\xab\x9b\x9b\x9by\xf0\xc1\x07\xd7\
+\x03\x7f\x1e@\xa6M\x9b\xb6\xb0T*\xcd\xb7m\x1b)\
+%\x8e\xe3LPY\x8e\xe3\x00\xf8*K\xd34\xff3\
+\x0b\x1bf\x13MU\x91$Aw\x7f7\xf1\xf7\x14\xd0\
+\xcc\x00\xd1D\x9cH\xbd\x86\xac\x11HC\x01W\x80\xe0\
+#\x00\xe1p\x98\xdd\xbbw\x7f\x148&@\x9a\x9a\x9a\
+\x18\x18\x18\x18\x0f\x884M\x13\xd341]\x9bX\xb5\
+\x0e\xb6\xc2\xf2\xc9\xef\xa7\xaa%\xc4K\x9d\xbfb\xfa\xbc\
+&\x86\x8c.\xf2\x1d*N\xa9\x02\x80\xf7\x9c\xe3\xed\x86\
+\xf7gO2\xc6\xde\x87\xc8f\xb3D\xa3Q\x14E\x91\
+\x7f6\x95U[[\xbbf\xd9\xb2e\xf3\xd2\xe9\xb4o\
+/\x1c\xa7\xb2\xb3=/+\x18\x0c2f\xf0\x09\x06\x83\
+\xb8\xae\x8beY\xbe\xb1WQ\xd8\x17\xee\xe0\xc2\x05\xd5\
+@\xf1-\x0a]\x92^WC\xb9-\x02\x80eY\xc7\
+E\x22\x06\x06\x06hjj\x9a\x04,\x01\x1c\xc30N\
+N$\x12d\xb3Yl\x5c\xec\x11\x9b\x9d\xcf\x17\xb8\xf2\
+}\xf3y\xfa\xd55\xcck\xbe\x82\xf7\xd4\xaf\xe4\xbf\xb6\
+\x7f\x8al*\x87.\xc3\xbe\x9b\xeb\x01\x02P(\x14p\
+\x1c\x07\xd7u)\x95J\x9e\xed\xc0\xf3\x1c=M\xf1g\
+\x03DJ\xa9\x14\x0a\x05\x1f\x08\xdb\xb6\xc9\xe5r\xd8\xb6\
+M>\x9f\xf7uk\xa9TBQ\x14\xc2\xe10\xb6m\
+c\xdb\xf6\xa1\x87\x91\x02\xc2\x15\xf1\xff\xc8\xc2\xbb\x91\x8a\
+K\xda\xedd\xe3\xd6.\x92U\xeb\x18\x1d\xfb\x9c\xb7#\
+\x8f\xd7*\x95J7\x9f\x7f\xfe\xf9w\xaa\xaa\x8a@\x90\
+03L?\xbd\x1aw8\x8c3\xda\x82H\xc3\x8f\xbe\
+\xf3S\x14U\xf0\x1a[xUn&\xa0\xcd'\x9fl\
+'\x1aU\x91Rz\xb6\xc1\x07\xa4X,\xfa\xef\x22\x9b\
+\xcd\x12\x8b\xc5|0\xc6IKc,\x16\x9b\x95\xcf\xe7\
+;\xff\x1c\x80\xf8/\xd8\xb2,l\xdb\xf6_\x9e\xa6i\
+>\x10\xaa\xaa\xfa\xdeK\xb1X\xf4\x8d\xbd'!X\x92\
+\xd1^\x83\xa9\xef\x99\xcbu?Z\xca\xcf>\xb2\x81\xa6\
+\x93\xd2\xac\xed\xc9\xb2'\xfb*\xf9\x9c\xe9\xab>\xa0\xce\
+\xbb\xfe\xf4\xe9\xd3\x93\x07\x0f\x1et\x8f\xd2nD\xbd\x0d\
+StM\xb4s\xfa\xa9\x9d\x1f\xc1\x92\x83H\x1bD6\
+\x86\x9dQqR:\xf9-\xd5\xa0H\x1ci\xfb\xb6\xc2\
+\x93\x90T*\x85\xaa\xaa8\x8e\xe3\xc5\x1f\x08!\xd04\
+\x0dEQ\xc8\xe5r\x04\x83A\x22\x91\x08\xa6i\xca\x93\
+O>\xf9\x9b\xaa\xaa\xde\xf1\xca+\xafT\xfd9\x00\x91\
+\x1e\x10\xdeNQ\x14\x05\xdb\xb6\x994i\x127\xddt\
+\x13\xdf\xf9\xcew\xa8\xad\xade\xfa\xf4\xe9tuu\x91\
+\xcdf}c\xed8\x0e\x96\x10\xa8\xdb\x5c\x8a\xf9\xa9\xdc\
+\xf4\xab\x0fP\x1b8\x95\x9b\xd6\xdd\x88\xae\xa9\xa8v\x08\
+Mk$^\xe3\xc7(\xf2\xca+\xaf\xdc\xe7\xfd\xff\xf5\
+\xeb\xd7\xcf\x07\xf6\x1d\xad\x94x*\xc4tM\xe2\xe1\x00\
+\x85\x8c\xcbM'\xdf\x81\xab\x16Y\xb3\xf7^&74\
+2\x9c\xefe\xf4\xd50J@NP\xc9\xde\x86TU\
+\xd5\x07$\x16\x8b!\x84\xf07\xa1\xa2(\xfe5\x02\x81\
+\x00\x96e\x09!\x04\xe1p\xb8p\xb8\xf7\xa8\x1c\xce\x87\
+\xa6L\x992i\xca\x94)/\xb9\xae;\xcd\xb3\x05\xd9\
+l%\x08\xbd\xea\xaa\xabhll\xe4W\xbf\xfa\x15\xcd\
+\xcd\xcd\x00\xac]\xbb\x96\xdbo\xbf\x9dP(\x84\xa6i\
+\xbeq7\x0c\x83r\xa9\x84\xd0\x04\xa1X\x90\xda\xdaZ\
+\xba\xd5!\x16|\xbc\xcc\xac\x8f\x16i\xb9u\x94\xc9\xd7\
+$\x89\x9fn\x10i\x16\x04\x83\x01\x11\x0c\x06\x09\x06\x83\
+\xd4\xd7\xd7\xe38\xce1\xe90\xc30\xbc\x00\x0eE(\
+\x9c\x14~?\xa1j\x9b\xe7\xdfx\x9dE\xda\xf5\xac>\
+\xe3njB\xf5\x94\xcb\xe5\xca\xbd\x96\xcb\x98\xa6I6\
+\x9b\xf57V \x10\xf0\xa5\xe1\xb2\xcb.#\x12\x89P\
+__\xcf\xdc\xb9s}`4M\xf3\xb5\x87\xe7}\x1d\
+W@\x92\xc9d\xed\x05\x17\x5cpn(\x14\x8aX\x96\
+\xe5_\xb8\x5c.\xf3\xe1\x0f\x7f\x18\xc30\xb8\xff\xfe\xfb\
+Y\xbe|\xb9\xaf;\xbd\x1b_\xb0`\x01\xb7\xddv\xdb\
+\x04\xe3\xee\xc5-\xa6a\xe2\x04L4M%\x9bt\xb8\
+j\xe1\xc7\xa8\x9b\x1a#\xb28K\xed\x15\xc3\xe8\x0bR\
+\x18\xa51o\xc84\x8f\xd8@644\x5c\x1e\x8dF\
+o\x8a\xc5b7J)\x97\x0c\x0d\x0d188Hb\
+h\x84\x817\xb3\xf4\xed\x18\xe0\xb95k\xd9\xf1\xfa\x0e\
+\xf6m\xda\xc3\xfd\x0f|\x97\x9d/v\x91/d}\xe0\
+<\x0f\xca\xf3\xa2\xce>\xfbl\xaa\xab\xab\x91R\x92H\
+$|\xa3\x9eH$\x18\x93\x06_ue\xb3Y_]\
+\x1fW\xa3\xee\xf9\xdf\xde\xc5\x15E\xe1\xfc\xf3\xcf\xa7\xb5\
+\xb5\x95\xc7\x1f\x7f\x9c\xba\xba:\x9ez\xea)\x9ey\xe6\
+\x19B\xa1\x10W]u\x15\xa7\x9f~:\xa9T\x8a\xfb\
+\xef\xbf\x9f\xbe\xbe>\x0c\xc3 \x99L\xfa\xd1\xb8i\x9a\
+ Aj\x92r\xc9\xe1\xae\xf7>\xc5\xa3\xad\xdf\xe0\xa6\
+\xf9_e\xed\x8e\x17P\x1b\xfax\xcd\xdeV\xb1#J\
+eg\x1e\xe9\x9a<y\xf2\xb7\x97-[6\xcb\xb2,\
+T\xa1P\xacN\xcbX\xb5&\xdc\xac\x8e\x9d\xd4\xe9\xdb\
+6\x0c\x02\xea\xb5i\x8c\xa6s$d\x96\xa6\xc0\x0a\xf6\
+\x8f\xbeDS\xa0\xc9\x7f\x91\x9eM\xb4,\x8bH$\xe2\
+{\x91\x1b7n$\x16\x8b\x91H$\xa8\xae\xaeF\x08\
+\xc1\xb4i\xd3\x18\x1e\x1e&\x9f\xcf\xfb1\xdb\x91H\xb6\
+r\xb8\x80x`\x14\x8bE\xa6M\x9b\xc6\xbf\xfc\xcb\xbf\
+\xa0i\x1a\xcf=\xf7\x1c}}}\xc4b1\x82\xc1\xa0\
+\xef\xeen\xdb\xb6\x0dM\xd3&\xf8\xff\x9e\xcd9$!\
+\x95(?\xa0F\x98\xd68\x85\x84\xd8\x85\xb4BH\x09\
+\x8e\xb4p\x1d\x07\xc34|\xd1\xb7\xde\xe2\x07755\
+\xbd\xd3};\xe5r\x99r\xb9\xcc\xeel\x17\x91s\x07\
+E\xe8\xac~B\x97uP\xf5\xe1}\xd4|\xf0\x00\xa1\
+s\xfb\x113\x93\x95\xebX&\x96{(\x9e\xf0$\xbd\
+\xbe\xbe\x1eM\xd3\xd0u\x9d\x97^z\xc9\xb7)\xba\xae\
+\xfbR\x14\x0e\x871\x0c\xc3\x07\xcf\xb35c\x804\xad\
+\x5c\xb9R\xd6\xd7\xd7\xcf?nF\xdd\x8b;L\xd3\xa4\
+T*100@$\x12ahh\x08\xc7q\xe8\xef\
+\xef\xf7\xe9\xe8\xd1\xd1\xd1\x0a\x975e\x0a\x9f\xfd\xecg\
+q\x1c\x87`0\x88\xaa\x1er\x1f\xbdw\xeb\xb4\x97\xd8\
+\xf0\xef*\xa7\xfe\xdb\xa9\x00<\xcf\x87\xde\xf6\xfa\xd9l\
+\x96\xf9\xf3\xe7wy\xee\xf0\xd0\xd0\xd0\xbf\x0d\x0c\x0c\xdc\
+\xf1N^\xa1\x07\xa6)-\x14\x14\xc8L\xe6\x8e\xcb\xbf\
+G{z3\xdf{\xf9\xdfX\xbcd\x0e\xddu\x9dd\
+wi\xbe4\x18\x86A*\x95\xf2\x8d\xf3\xf5\xd7_\xcf\
+\x9a5k\xc8d2\xd4\xd5U\x9c\xbe\xd1\xd1Q\xff\x1a\
+\xf5\xf5\xf5\x98\xa6I8\x1cfhh\x08UU\x89\xc7\
+\xe3\xe8\xbaN.\x97\x03`\xee\xdc\xb9\xec\xda\xb5\xcb9\
+.\x80X\x96U\xf0^\xa0\xa2(\x14\x8bE>\xf3\x99\
+\xcfP]]\xed\xe7>\xc6{\x22\xde\x9f\x93\xc9$\x81\
+@\xc0\x07\xe4\x87?\xfc!\x86a\xf0\xf1\x8f\x7f\xdc\xe7\
+\xbbTT\x96,YRQ\x89\xd2!9\xf7\x00s\x16\
+Fpr*\xd6p\x08{(\x885\x18DH\x05\xa1\
+\xbb\xfe5\x86\x86\x86\x0e\xdb\x90\xdb\x96\x8d\xab:\x08E\
+p\xdd\x82O\xb3\xbe\xf7I\x9c\x91i\x5c7\xf7K\x9c\
+\x7f\xea\x99\xdc\xfe\xe8\xe5\xbek\xab\xaa\xaa\x1f\x03yl\
+\xc3\x96-[*\xe4\xe3\x98s2i\xd2$\xa4\x94\x08\
+!(\x95J\xfe\xc6TU\x95P(D\xb1X$\x12\
+\x89\xf8\xa1\x80eY\xfe\xf7\x1f3 \xb5\xb5\xb5\xb7,\
+]\xba\xf4.\x8f.9\xe1\x84\x13H\xa5R\x04\x02\x01\
+\xd2\xe9\xb4\xaf\x82\xa4\x94(\x8a\xe2\xb3\x9f\xde\xee\x1a\xa3\
+\x16\x5ce,\x9a\x9a6m\x1a\x8e\xe3P(\x14\x10\x08\
+liQ,\x16)\x97\xcb\xf4YIZ\xa6;\xc8H\
+\x89\xc6I\xd3IM\xedC\x0a\x07\xd35QJa\x86\
+\x1e\x99\x5cIt\x1d\x01EbY\x16\xb6e!\x15\x89\
+\xa2\x09\x1a\xaa\x9b9X\xfa=\xc9$d\xdd~\xeaN\
+0\x08\x07#^\xcc3A\xe5x*\xb6\xa7\xa7\x87P\
+(\x84\xeb\xba\xac^\xbd\x9a\xad[\xb7\xd2\xd9\xd9\xe9{\
+R\xaaZa\x80kjj\xc8f\xb3\xa8\xaaJ,\x16\
+\xf3\xd5\x9e\x17\xbb\x1d\x8eS\xf2\x8e\x80\x98\xa69\xb5\xa9\
+\xa9\xa9\xa6\xa7\xa7\x07\xd34\xb9\xe7\x9e{\xd8\xb3g\x0f\
+7\xdex#?\xf8\xc1\x0fH$\x12\xd4\xd6\xd6\x12\x0c\
+\x06y\xe9\xa5\x97X\xb8p!\xbbv\xed\xa2\xa7\xa7\x87\
+\xb9s\xe7\xb2m\xdb6\xf6\xef\xdf\x7f\xfb\x82\x05\x0b\xbe\
+\xf3\xec\xb3\xcfr\xd1E\x17Q.\x97}\x95%t\xc5\
+\xf7\xbe\x5c\xc7EU\x04\xa1\xec|>q\xd1\x9dh2\
+\xca\x17\x9e\xf8\x08\x1f>\xfbF~\xb6\xfdn,\xcb\xac\
+\xe4R\xfe\xc8\x83\x0d\x0c\x0c0k\xd6\xac;\xa3\xd1\xe8\
+T\x00\xe9\xca)\xc9\xd1\x14\xd2uA\xb7\xe9\xfc\xa5\xc2\
+w_\xf8\x16i\xf7 F6\x88M\x89\xeeu\x9dt\
+\x0d\xe60\xcd\xb0\x0fH8\x1cf\xc6\x8c\x19\x0c\x0e\x0e\
+b\x9af\xaaT*\xf58\x8e\xb3DQ\x14q\xd7]\
+wI\xd7u\x85\xb7\x01=\x1b\x0b\xf8\x86\x1c \x95J\
+\x11\x8b\xc5\xfcMz\xb84\x8av8\x06\xdd4M\x0a\
+\x85\x02\xaa\xaa\xf2\xa3\x1f\xfd\x88o\x7f\xfb\xdb\xfc\xf4\xa7\
+?e\xfd\xfa\xf5\xa8\xaa\x8a\xae\xebh\x9aF*\x95b\
+\xef\xde\xbd\xe4\xf3y\xca\xe52\x89D\xc2S_!U\
+U\xd9\xb0a\x03\xaf\xbf\xfe\xba\xef\xab\x8f\xbd4\xdf\xdf\
+\xb7\xb1qqY\xd6p\x19\x8fl\xfb*\xb3\xb4\xf3\xb9\
+\xf6\xa4\xd5\xb4\xd4LA\xa0T\xd4\x9c\x22\xde\xc9\xb3\xfa\
+\xfb\xe9\xd3\xa7\xd7\x0b!(8eX8L}<\x8c\
+\xd3\x1f\xc1\xea\x0b\x93\x19M\x22\x88\x11\xaa\x98e\x8aC\
+\x92Fq\x22\x1df\x87\xcf8TWW\x13\x8f\xc7I\
+\xa5R\x98\xa6\xf9\xec\x9e={n\x8a\xc7\xe3\xd7Z\x96\
+5\xcb\xb2\xac\xaf]p\xc1\x05\xacX\xb1\x82G\x1f}\
+\xd4\xb7\xab^\x10\xe9QJ\x8a\xa20<<L4\x1a\
+=\x22^\xeb\xb0\x00\xf1\xbe\xccs\xf5N;\xed4_\
+-\x8d\xb7\x1fB\x08z{{\xfd?\x1f8p\xc0\xf3\
+\xbc\xd2\xfb\xf7\xef\xff\xab\xb1\xe8\x95P(\xf4\xf8\x89'\
+\x9e\xa8~\xf1\x8b_\xe4s\x9f\xfb\x1c\xa6iV\xf2)\
+\xaa\x8d\x10\x10\xd0\x228\xae\x8da\x9add\x8a\xaeL\
+\xe2\x10\x85!\xf0w\xe6\xdb-\x8f\x85\x05x#\xbf\x9f\
+\xebO\xaf\xc1\xb2s\x94Z\x06\xa9\xd6\xc2\x08GE\x1a\
+*\xc5=Q\xf2\xdbb *;=\x95J\xf9\xd7(\
+\x95J\xa4R\xa9\x09\xcf\x98N\xa7\x7f\x01\x9c\xb8j\xd5\
+\xaa\xaf\xddy\xe7\x9d\xe8\xba\x8ea\x18tuu\xb1t\
+\xe9R~\xf9\xcb_\xf2\xbe\xf7\xbd\x8f-[\xb6\xb0g\
+\xcf\x1e.\xbd\xf4R\x86\x86\x86X\xbbv\xad\xbf\xa9\x17\
+,X\xf0fkk\xeb\xaal6\xbb\xe5\x98%\xc43\
+p\x93'Ofhh\xc8\xb7\x15\xdeM\xbb\xae\xeb\xff\
+\xf2x\xac\xb1\x07|B\xd7\xf5\xbd\xc3\xc3\xc3\xafz\xdf\
+\xd9\xd2\xd2\x22\x9f{\xee9^|\xf1E\x96/_\xce\
+\x86\x0d\x1b*\xbb,\xe42\xb4\xce\xe2\xf9\xf8\xd3\xc8\xc8\
+(\xfd\xca\x1b\x18V\x89\xaa\x1a\x9d\x83C\x06\x85\xa2\xed\
+\xdfS,\x16;w\xf1\xe2\xc5_\x02\x84a\x18v[\
+[\xdbW<\xbe\xc9\xf7\x8e\x85D\x22Y \xaeg\xc5\
+{N!m\xf6\xb3a\xdfkdB\xfb)\x06l,\
+\xcbD\x22\xd14\xcd'2]\xd7\x95\xaa\xaa\x0a\xc7q\
+\x88\xc7\xe3$\x12\x89\xf1\xe8+CCC\xec\xde\xbd\x9b\
+\xe6\xe6f<\x97z\xe3\xc6\x8d\x00\xbc\xf6\xdak\x94\xcb\
+et]\xe7\xb5\xd7^\xa3\xa1\xa1\xc1\xbf_\xc30\xa8\
+\xa9\xa9\x89Y\x96\xa5\x1f\xab\x97%m\xdbFUU\x1e\
+~\xf8a\xa6N\x9d\xca#\x8f<\xc2\xce\x9d;\x09\x85\
+B$\x93I\xa2\xd1(\x83\x83\x83\x04\x02\x01b\xb1\x18\
+###d2\x19\xd2\xe94mmmW\xbf\xdd.\
+~\xf6\xd9g\xa9\xad\xad%\x97\xcb\xf94E\xa9T\xa4\
+.\xb9\x08\x07\x0b\x91\xa9\xa1\xcf\x19\x224\xbd\x8c\x99\x0d\
+\xd0\xc8<&\xaf\xa8\xe4\xb5\xa5%@a\x95\x10\xac\x1a\
+\x8biJ\x1e \xe3%D\x00\x03\xfdy\xfe\xf3o>\
+\xce\xc7\x7f}6_>\xe7ij\xecy\xa85)\xbe\
+\xb5\xe9\xab\x18\x86\x09\xa2\xc2Yy*T\xd3418\
+8\xd8988\xb8M\x08\xe1\x06\x02\x81\xb5o\xdd\xa0\
+\xabW\xaf\xc6\xb6mB\xa1\xd0\x045t\xf0\xe0\xc1\x09\
+?\x1f8p\xc0\xb7!\x85B\xe1\x0f>\x7fT\x80(\
+\x8a2\xc7\xb2,TU\xa5T*Q,\x16\x99;w\
+.o\xbe\xf9&K\x96,axx\x98\xda\xdaZ\xb2\
+\xd9,\xe5r\x99H$\xc29\xe7\x9c\xc33\xcf<\xf3\
+G/\xaei\x1a_\xfa\xd2\x97|C\xe8\xc5\x0b\x05\xa5\
+L\xa9TB\xa4\x05B\x08v\xe8\xfbx\xef\x195\xd8\
+\xd6x\xcfJ\xe2\x18\x0a\x99\x17\xea0\x87\x03\x80\xfc\x03\
+\xb0}\x9aE\x07\xc7\x86\x80\xae\xa3)\x01\x10\x90\xc8\x0f\
+\xf2F\xff\x03HW\x8e\xa9\xc0\x8a\x94744\xf86\
+@Q\x94_g2\x99\xd5o\x17\x8ey\xae\xbc\xb7\xeb\
+\x0f3\xed\xed\x7f\xff\xb1\x022\xbd\xb6\xb6\xf6F\xc30\
+\xa4\xa6i\xe2\xee\xbb\xef\xa6\xb1\xb1\x91\xbd{\xf7\xe2\xba\
+.\x83\x83\x83\x18\x86A8\x1c\xa6P( \xa5dt\
+t\x94]\xbbv\xfdI\xee\xa9X,\xe6\xa5\x94\xde\xb5\
+\x83\xe1pXw\x1c\x07\xddRq\xdcC*G\x09\x09\
+,\xc7fE\xf4\x16\x16\xcf\x5c\xc0\x96\xe4\xe3\xe4\x92\x1a\
+\xbb\xdd\xe7p\xb4\x18\x96\x09\x129\xc1\xa6\xb8\xae+}\
+\x03\x1a\x12\xc4'\x85(\x18e\x02!\x95\x9a\xaaZL\
+\xa5\x88\x16\xd2@\xa9\x00\x22\x91\xbe\xfamnnfh\
+h\x88\xb7+M\x02\x08\x04\x02\xed\x1d\x1d\x1d\x8d\xf3\xe7\
+\xcf\x1f\x9a2e\x0a7\xdcp\x03\x8f=\xf6\x98o{\
+\xbc\x80\xd7\xdb`\x1e\xc3\xa1\xeb\xba\xcf\x8a\x1f+ \x11\
+!\x04\xb9\x5cN\xd4\xd7\xd73<<\xcc\xe0\xc0\x10 \
+\x10\x02\x1f\xf1r\xb9\xec\x07T\xde6\x8e\xc5b\xa2T\
+*\xbdm\xf4,\x84\xf0+\xe9f\xce\x9c\xf9\xa0\xaa\xaa\
+\x1f\xbe\xfc\xf2\xcb\xfd\x00\xec\x90+)I\x0d\x0a\xfe\xee\
+\xe6\x9b\xb9\xe9gK\xf9\x97\xb3\x1f\xa3\x18/0\xd3l\
+\xe6'\xbfy\x02\xc3\x90\x9e\x0d\x08]t\xd1E#\x80\
+\x14\x8e\xa8\xb3,\x89\xa2\xc0\x22;\xc2\xf0\xc3\x0a\xd7?\
+t-R\x09q\xfd\x7f]\x83e[\x04\xb5\x08\xdb[\
+{\xa9\x8a\xc4}J\xdd#?\xff\x18\x18\xe3\xf2\x222\
+\x16\x8b\xf1\xe2\x8b/\xb2q\xe3FZZZ\xd8\xbau\
++\xe1p\x98\xf5\xeb\xd7\xfb61\x12\x89\xd0\xd2\xd2\xc2\
+\xae]\xbb\x18\x1d\x1d\xf5\x93t\xc7\xac\xb2\xa4\x94\xe8\xba\
+\xce\xbe}\xfb\x90\xae\xa4f\xb1N$\xac\x92\xeb\xb7)\
+\x0e9H\xf7m\xd5\x9c(\x97\xcb\x9d\x8a\xa2|\xf3\xed\
+\x9c\x84\xb7\xb0\x00\xfa\x07>\xf0\x01\xe6\xcc\x99\xc3\x07?\
+\xf8An\xbd\xf5V?\xcf \x10T\x05\xe3\xd8\xb2D\
+\xbc\xaa\x8a\xe6\xda\xa9<\xbf\xe3\xd7<\xd1w\x1f\xb6\xd5\
+\x88i\xb9P\xd9\xe1\xa2\xa6\xa6f\x92@\xd05m\x0f\
+\xa7]\x14\xc6\x18\xac\xd4U\xd9\x83\x01\x9c\xac\x06\x96\x8e\
+[RPu\x0dMS)\xe5Ml#\xe5%\xddd\
+4\x1a\x15###\x84B\xa1w\xe4\xf8\x1c\xc7\xe1\x95\
+W^!\x1e\x8f\xe3\xba.\xfd\xfd\xfd~\xa2\xcaK\xc8\
+y\xeco]]\x1d\x03\x03\x03h\x9a\xe6\x05\x91\xb1\xe3\
+\x02\xc8\xec\xd9\xb3+\x14@\xb2\x22\x9aQ)\x89\xd4\xcb\
+\x09\xa5;\x9e\x975\xb6\xe3z\x06\x06\x06\xfe\xebp\xe9\
+\x8d\xb9s\xe7\xfaQ\xed!u'\xb0]\x13Eh\x80\
+\xa0d\x15\xd1T\x8d\xa0\x16\xc5q\x5cL\xd3\xf2\x839\
+\xcb\xb2(8ej\xa7)H[%Z\x1fF\x99b\
+a\xccO\xf8\x9b`\xe0\xa1IH[\xf1=A\x8f[\
+SUUtuu=\xe0\xed\x11]\xd7\x7f\xfd\xa7\xee\
+\xd7u]>\xf9\xc9O\xfa\xdf3~\xed\xdbw(\x7f\
+\xd6\xdf\xdf\xef{\xa1\xf1x\x1c\xc7q\xa8\xaa\xaa\xfar\
+:\x9d~\xe1\x98\x00Y\xb1b\x05\x97]v\x19g\x9f\
+}6\xdf\xfb\xde\xf7hmm\xe5\xe4\x93O\xe6\xf5\xd7\
+_g\xee\xdc\xb9d2\x19Z[[\x09\x87\xc3\xcc\x9c\
+9\x937\xdex\xe3\xb0)\xf2@ \xc0\x0b/\xbc\xc0\
+\xde\xbd{\xe9\xed\xed\xf5\x19T!\x04\x85\xd6\x1cCF\
+#\xff\xeb\xa5[\x18\xcc\xea|\xea\xb1O`\x186y\
+'\x8e]\x14D\x22\x87\xa4\xae\xa2\x1e%\xca\xeb\x939\
+\xf8\x86\xe0\xc1\x07~\xc4\xfe\x9e.~\xbb\xf7\xa7\xfc\xed\
+\xaa\x8fr\xf7\xba[1M\x0bi\x1f\x02B\xd7u\x9f\
+J\x1f\x19\x19\xf9\xc8\xe1\xdes>\x9f'\x12\x89\x1c\x02\
+\xc3\x01\xcbt\xc7\xee\x05\x84*P\xd41m0\xf6\x91\
+\xd1\xd1Q_=\x1e\x8b\x84\xb8\xde.\x88\xc7\xe3\x84\xc3\
+a\x9ft\x0b\x04\x02,]\xba\x94\xee\xeen\xaa\xab\xab\
+}\xa3\xa5\xeb\xfa;^\xf4-*+\xa0(\x0a\x07\x0f\
+\x1e\xf4\x8a\x06d\xb9\x5c\x16\x00\xe5b\x91i+f\x92\
+\xcb\xe5\x88iu\xa4g\x1c\xa0iF\x80\xaa\xb4\x8e\x93\
+\x1d\xfb\x95\xd6ps\x1ab\xecI\xc2\xe10\xe9T\x9a\
+\xf5=\xcf\xb2\xe9\xcd..>\xf9\x06\x1ac\xd3\x11(\
+\x95X\xc7\xaaH\xd4\xbcy\xf3\xfcl\xe6\xe1\x12\x95\x00\
+555#\x1d\x1d\x1dM\xa7\x9cr\xca@*\x95B\
+Hpg\x0b\x96_YC~\xc0\xa18l\x93\x1bp\
+(\x0e\xd9\x18\x19\x17\xcf$y\xef\xf0O\xd9\xa8w\x04\
+$\x1a\x8d.\x07\xd8\xb6m\x1b\x89D\x82\xe1\xe1a\x8a\
+\xc5J\xe9\xce\xee\xdd\xbb\xfd\xc0\xd0\x03\xcdu]^~\
+\xf9\xe5#J&%\x93\xc9/\x0e\x0d\x0d}w\xcc\x8d\
+\x9c\xbe`\xc1\x82\x87\x0fy#\x95\x0a\x96r\xb9L\xca\
+\xcd1u\xae\x89\xa8\xb2i\x9c\xd6D\xd9\xcdQr\x12\
+(\x0a\xd8y\x95\xe1\x9fN\xf6\x1f\x5cJ\x89W\xb2\x9e\
+)\x8d\x925\x12\x08EL\x00$\x93\xc9p\xf5\xd5W\
+\xf3\xf4\xd3O\xfb1\xc8\xe1\xacL&\x83\xae\xebR\xd3\
+4\x9a\x9a\x9a*6\xa2\x7f\x80\x8e\x07\x15,\xc7E(\
+:\xae\xab\xa2\x11@\x09\xbb~N\xc4S\xe5\xc7\x04\x88\
+\xae\xeb\x7f\xe3e\xf8\xfa\xfa\xfa\xfc\xa4\xcc\xf8\xdf\x8fu\
+\x15\x0a\x85\xbd\xc0\xde\xb1\x1f\xe7{\x8c\x80\x10\x02\xa5P\
+y\x89\xa6ab+\x0e\xaa\xaa\xd0\xa2\xae\xe2\xefV\xde\
+JM\xa0\x9e\x0f|\xef|n\xbb\xeaV~\xb1\xfe\xfb\
+\x13\xe8s\xdb\xb1Y0\xe94\x92ST\x06r\xdd\x04\
+\xd5\xd3QP0\xcd2\xaeU\x89\x832\x99\x0cO?\
+\xfd\xb4\xef\x96\x1e\xe9R\x14\x85\x07\x1ex\x80\xe1\xe1a\
+\x84\x10<\xfe\xf8\xe3\xc4\xe3q:;;innf\
+\xcb\x96-\xcc\x9a5\x0b\xc7q\xd8\xb7o\x1f\xcd\xcd\xcd\
+ttt\x1c\x1b\x97%\xa5Tc\xb1\x18{\xf6\xecA\
+\x08A\xf4|\x9d\x15\x17\xd5 \x01#'I\xee5\x18\
+m\xb7\xc8t\x98\x98\x85C\xf9\x90\x9a\x9a\x9a\x11\xe0}\
+G[\xa6\xfa\xd3\x9f\xfe\x94B\xa1\xc0\xe7?\xffy\xbf\
+0\xc1RM\x84\x90\x9c<\xe5l~\xd7\xfe\x00\xa9\xce\
+\x06\xaeX\xf8\xb7\xcc\xa8Y\x84\xedT\xaa`<\x09\xe9\
+\xee\xee\xe6k\xff\xfb\xbb\x95\xc4V)\xc5\xc6\x9f\xec\xe2\
+\xc0 dSy\x8f\x02\x92\x8a\xa2\x08\xaf\x8e\xea\x9dv\
+\xed\xdb\xd9U\x8f]\x9e?\x7f>]]]\x8c\x8c\x8c\
+x\xcf\xce\xc9'\x9f\xcc\xe6\xcd\x9b\x19\x19\x19a\xd1\xa2\
+E\xa4R)FGG\xd14\xed\xd8$\xc4\x8b\xaa=\
+\xef\xc9\xd9\xa9\xf1fG\x96|\xbf\x83U\x94(\x9e\xf1\
+RUTU\xfa\xb9\x91@ \xe0\x0e\x0c\x0c\x1cU\xd3\
+\xca\xbcy\xf3hnnftt\x94\xe6\xe6\xe6J\x85\
+\xbde\xe2\xe0\x00\x02M\x09`K\x0b\xdb\xb1\x18H\x0f\
+\xd3\x95\x0e\xa3\x09\xdd\x8f_4M\x03\xcd\xa1\xa4\xa6p\
+\xb2\x1a\x8a\xd4\xc9\xe6\xb2\xc4\xf48\xb9\x5c\x07\x8a\xa2\xa0\
+\xeb\xba(\x14\x0a;7m\xda\xf4OB\x08UQ\x94\
+#.\x91TU\x95\xaf|\xe5+\xcc\x9f?\x9f\xcd\x9b\
+7\xa3\xeb:\x1d\x1d\x1d\xb8\xae\xcb\xab\xaf\xbe\x8a\xa6i\
+$\x93I\xda\xdb\xdb\xc7\x9b\x00\xa4\x945\xc7\x22!H\
+)\xf9\xd1\x8f~\xc4\xacY\xb3\xb8\xf7\xde{+e\x93\
+sJ~\x92\xaaX,\x22\xa5d\xd2\xa4Ituu\
+\x91\xc9d\x8e\xb8:dB\x85y[\x1b/\xbd\xf4\x12\
+---\x1c8p\x80x<^I\xc3b\xa3k!\
+R\xc6 \xd3\xa7\xcc\xa3~Z\x1d\x9bz\xba\xa9\x8dL\
+\x1e\x8b\xba\x0f\xb9\xc0z\x5cR\xf7\xfe\x01F\x9e\xae\xc3\
+\xe8\xad\xd0+\x8e\xe3\xf8\xe5;c\xbf'\x8b\xc5\xe2\xf3\
+Gs\x8fc\x84\xab\xab\xeb\xba\xb2s\xe7\xceJ\x0b\x85\
+\x00UU\x90\x12b\x91\x18\x96kU\x1c,\x81\x1f\xab\
+\x8d\xd5x-8&\x09\x997o\x1e\xb3g\xcf\xe6\x84\
+\x13N`\xd9\xb2el\xdd\xba\x95e\xcb\x96\xf1\xe4\x93\
+Or\xf1\xc5\x17\xb3{\xf7n6l\xd8\xc0\x99g\x9e\
+Iss3\xcf>\xfb\xec\x9f\xa4\xc7\xdfiE\x22\x11\
+\xbe\xf5\xado!\x84`hh\xa8R\x01h\x98\xd8\xaa\
+\xcb\x86\xff\x1ed\x93\xf9U\xe65.\xc1\x95.;\xfa\
+6\xd1\xfah\x1b\x1d#\xbd\x14\x86\x0e\xbd,MSY\
+\xf7\xb5a\x8c\xd1Q\x9c\x92d\xc6\x8c\x19\xe8\xba\xce\xd1\
+\xaa\xa8\xb7\xf1\x0c\x87v\xee\xdcy\xf1\xacY\xb3^(\
+\x95J\xb8*L\xbd!\xca\xc9\xcbc\xd8\x8eCSx\
+\x1e\xc3F;\x8e\xe1r\xf0\xd5\x12\xfb\x9e\xc8\xa3\xa8\x15\
+\xa7'\xe2\xf9\xeaG\x0bHgg'\xbf\xfc\xe5/9\
+\xe5\x94Sx\xe5\x95W\xc8\xe5r\xf4\xf4\xf4`\x18\x06\
+O>\xf9\xa4_\x99\xf1\x9b\xdf\xfc\x86@ \xe0\xa7>\
+\x8fr\x8d\x0e\x0d\x0d}C\xd7uk\xec\xc1?\x98J\
+\xa5f\xe4\xf3y,S2+<\x83\x193\xa6W\xa4\
+T\x1a,\xbb~\x16U\x912\x0d\xc3'c\x0d\x06q\
+F+i'\xa1HP$L\x83\x5c.\xc7\xc8\xc8\x08\
+\xd1h\x94x<\xcei\xa7\x9d\xc6\xcb/\xbf|\x5c\x1c\
+\x12?\xcd+\xa1\xd4j\xb3c\x7f\x8e|\xaf\x83ml\
+\xc4.J\xecr\xa5?Q\x0fh\xbe#p\xac\xd4I\
+4\x1a\x8d\xf2\xf4\xd3O\xf3\xc4\xe3O\x1c\xf2F\x84\xc7\
+I)~O\x8bP*\x89\xac\xea\xeaji\xdb\xf6\xd1\
+\xea\xac\x91\xde\xde\xde\xff\xed\xfdP__\xbf\x5cQ\x94\
+\x19\xaa\xa2\x80\x03\xae\xe3\x92\xcf\xe7\x11\xc0f\xab\x8dK\
+Z\xa2\xb8J\x8e\xe0\xd4\x22\x8a,\xa1j\x0avZ\xa7\
+\xbc/F~[\xd4g\x01\xbc\xea\xc1|>_\xc9\xe5\
+\x8b\xe3\xd31gY\x16\xb7\xdcr\x0b\x00/\xae}\x11\
+QV\xd0\xb4\x02B\x17\x18\xba\x81\xac\x96~l\x94H\
+$\x0e+k\xa8\xbd\x83A\xaf\xf7\x92\xf9\xae\x0a\x93\xe6\
+\x05\xd0u\x81\xb4u\xe6N^HGj\x07(PN\
+9\xa4\xbb|\x1d.l\xdb\xee\xe0\xf8,%\x10\x080\
+}\xe1\xc2JF\xcf\x1a\xa3\xd6\xbd\x88X\x11\xac\xac\xbe\
+\x85\xf7\x9d~-;\x86_\xe6\x85-/\xa15\x0f\xd3\
+\xd67\xe0\x13\x85^\xc2\xca\x8b\x05\xd6\xaf_\xef\xf1U\
+\xc7\xbc\xce>\xfbl.\xb8\xe0\x02\xe6\xcc\x99C\xa1P\
+\xa0\xb7\xb7\x97\x8b/\xbe\x98\xc7\x1f\x7f\x9c\xf3\xce;\x8f\
+b\xb1\xc8\xab\xaf\xbe\xca\xfc\xf9\xf3\x89\xc5b<\xf5\xd4\
+S~\x09\xeeQ\x01\xa2(\x8a\xa8\xaf\xaf\xa7\x90/`\
+E$K?RGu\x8d\x86t%\xc9\xb6~\xea\xf6\
+U1\xbc\xdd\xc0\x1au\x88\xc5\x82\xbe'144\xf4\
+\xe6\xf1x`\xd7u\xb9\xfd\xf6\xdb\xa9\xae\xae\xe6\x8a+\
+\xae\xe0\xa2\x8b.\xaa\xe4 $\x10\x82L\xba\xc4eg\
+\x5c\xcf-\xbf<\x93\x9f\xff\xcd.N\x08-%\xe1\xec\
+g\xf7\xfa;0\x0c\xcd\x0fZ\xcb\xe52\xd1h\x94`\
+0xX\xae\xe7\xe1\xaem\xdb\xb61u\xeaT\x06\x06\
+\x06PU\x95\xda\xdaZv\xec\xd8\x81\x10\x82\x8e\x8e\x0e\
+\xbf\x16x\xe7\xce\x9d\xac\x5c\xb9\xf2\xd8\xe9w\x8f{)\
+\x95K\xe8\x8e\xce\x9bw\xa7\x91\x16X\xc5C9t\xa1\
+L\xd4\x8dGB\x9b\x1c\xce2M\x93\xfa\xfaz\xbf\xe2\
+\xdc\xb2\xacJ'o\x08\x0c\xc3%\x14\x0c\xe0R\xa9?\
+\xeb\x1e:\xc8\xc6\xfcc(\xa8\x13\x92G\x1e\xf7\xd4\xd6\
+\xd66\xb7X,\x8e\x00\xb2\xa1\xa1\xc18\x1e6\xe4\xea\
+\xab\xafF\xd3\xb4?HV\xb5\xb7\xb7\xfb\xc4\xa2\x94\x92\
+_\xfc\xe2\x17\x95\xf7u\xac\xf4\xfb%\x97\x5c\xc2\x87>\
+\xf4!\x5c\xd7\xe5\xc9'\x9f\xa4\xab\xab\x8bh4\xca\xc1\
+\x83\x07\x89\xc5bTUUq\xe0\xc0\x01r\xb9\x1c\x8d\
+\x8d\x8d\xf4\xf4\xf4\x1c\xb7\x1d(\x84\xe0\x87?\xfc!\xcb\
+\x96-\xe3?\xfe\xe3?\x0e\x05\x7f\x08\xa4\x0b\xf1x\x88\
+d&MM\xa0\xbe\xe2VJ\x9b\x80\x88 ]\x89e\
+\xd9~\xad\x98W\xd6\xa9\xebz\xceu\xdd\x0cpD\xfc\
+\xd5\x1f\x91^s|\xbe\xc7\x09@u\x5c\xc5q]&\
+\x87gPr\xd3\x14\xac,BH\x8c\xac\x8b[\x92~\
+\xf6\xf0\xa8\x01\x19k\xc0\xa4\xb5\xb5\x95\x1bn\xb8\x81m\
+\xdb\xb6Q*\x95\xa8\xab\xabc\xd9\xb2el\xdc\xb8\x91\
+`0H8\x1c&\x93\xc9\x1c\xf7\xb6f)\xa5[U\
+U%w\xec\xd8Q)Y\xf0JP%H!\x89E\
+\xc2<\xbe\xfb~\xbeu\xe5o\xf8\xcd\xfe\x87x\xa9\xe3\
+e\xce:\xe9t^s7b\x18\xa6\xcf\xe8zT\x8c\
+m\xdb\xb3\xea\xeb\xeb\x03\xa3\xa3\xa3=\xc7zo\xb6m\
+\xb7\x09!*\xc5\x82\x08F\x96H\xfe\xee\xf6f$.\
+Q3BP\x0frp\xb8\x80U\x90\xbc~W\x0a\xe9\
+T4\xce1\xb9\xbdB\x08\xbe\xf9\xcdor\xfb\xed\xb7\
+\xf3\xc9O~\x92\xb6\xb66\x5c\xd7\x9d\xd0_8\xd6\x9f\
+\x8d\x94\x92\x9e\x9e\x9e\xe3\x0aH*\x95\xba\xe8\xf9\xe7\x9f\
+\xa7\xa5\xa5\xa5}\xce\x9c9\xb3\xb3\xd9l\xa5nX(\
+\x14j$%3\xca~\xf9\x1c\xdfyVg\xd5\xe9\xa7\
+\x90Pv\xf0\xcc\xbe]\x0c\xb5\xe5H\xa5*\x01k(\
+\x14\xa2\xa5\xa5\x85R\xa9\xc4\xb5\xd7^\xfbz[[\xdb\
+\x86u\xeb\xd6\xad<\x1e\x0e\x87\xef\xfa\x0a\x85\xba\x83\x92\
+}O\x15\x18\xdan\x90\xef\xdb8A5\xa9B\x03\x8d\
+\xb7\xcd\x9f\x1c\xb1\x0d\x89\xc7\xe3\xdcw\xdf}~\xc2\xc8\
++4\x00\xd05\x1d];\xe4\x0a{\xe5\xa3\xfb\xf7\xef\
+\x9fq<\xed\x88W-\xef\xbd\x00\x81@5\x5c\xb40\
+\xe4{\xe1\xf5\xce\x9f\xf3\xe4O~LyDb\x95\x5c\
+\xcai\xd7\x8f\x85TU%\x9dN\x13\x0a\x85\x18\x19\x19\
+9\xa2^\x8d\xc3!\x18/\xbc\xf0Bn\xbc\xf1F\xbe\
+\xf5\xado\xa1\xf6\xa9\x10\xcc\xd18\x1b\xbf\x7f\xbf\x5c.\
+SUUE*\x95\xc2\xeb\x8b?j@b\xb1\x98\xdc\
+\xb4iS\xa5\x92#\x06\x0b\xcf\x8f\xa1\x07\x04J\xa9\x9e\
+\x0b\x16_\xca\xef:\x1fA\x0b\xa8\x8c\xee3\x19\xd8\x5c\
+\xf6\x12NR\xd7\xf5)\xc7\x13\x10\xd7u\x1d/i\xa5\
+\xaa*\x8b\x17/\xa6\xb3\xbd\x83\xd7\xfe\xa9\x5c\xd9\x1b\x0a\
+\xa0T(\x12\xe1\xba\x84B\xd2\xa7*\xbc\x11\x18c=\
+\x7f\xc7\xb5\x91\xb4X,\xf2\xe9O\x7f\x9aT*\xc5'\
+?\xf9I\x1ez\xe8!N_y:\xdd\xdd\xdd\xcc\x9b\
+7\x8f\xdf\xfe\xf6\xb7\xac\x5c\xb9\x12]\xd7\xc9f\xb3\xec\
+\xd8\xb1\xc3\xaf\x9a?*@BcOf\xdb6\xb2\xda\
+e\xc695h\x08\xac\xb2\xc1\xeb#?C\xb5\xc3$\
+Z\x0d\x92\xfb+\xc1\xcf\x98\xdb+\x86\x87\x87\x8f\xc9\xaa\
+\xc7\xe3\xf1\x96\xb9s\xe7\x1e\x08\x04\x02\x15OOQq\
+\x84M\xa9T\xe2\xdb\xdf\xfe6MMM$\x12\x09~\
+\xf7\xbb\xdf\xf9\x05\x04\x00###L\x9d:\x95d2\
+\xc9\xc8\xc8\x08\xaa\xaa\x92L&\x09\x85B\x94\xcbe\x02\
+\x81\xc0q\x05$\x14\x0a\xb1c\xc7\x0ef\xcf\x9e\xcd\x0b\
+/\xbc\xe0\xf7\xd0\x8c\x8e\x8e\xfa\x95\x90\x83\x83\x83\xc4\xe3\
+q\xbfx\xf0\x9dX\x8cw\xb4!\x9e\x1b[\x9d\x83\x0d\
+wd\xdf2\xaa\xa8\xa2F\x82\x11}\x82\x18\x1f\x87\x9d\
+\x17\x98={6\xb6m\xa3\x0a\x95Vu?g\xdd\x10\
+d\xfd\x7f8\xbe+<o\xde<\x1e{\xec1\x9a\x9b\
+\x9b\xa9\xad\xade\xde\xbcy\xdcs\xcf=h\x9a\xc6\xc2\
+\x85\x0b\xd1u\x9d_\xff\xfa\xd7~V\xd0\xab^?\x9e\
+\x80\x84\xc3a\xbe\xfa\xd5\xafNPC\xad\xad\xad\x00\xec\
+\xdf\xbf\xdf\xa7\xe8\xc7\xab\xdec\x02DJ\xc9?\xfe\xe3\
+?2w\xee\x5cjkky\xe2\x89'8x\xf0 \
+\x9a\xa6\xf9\x85\xd4s\xe7\xce\xa5\xbd\xbd\x9dD\x22As\
+s3\x07\x0e\x1c8.\xee\xae\xd7h\xa3\x09\x95L<\
+\x03r2\x91H\x84\xaf\x7f\xfd\xeb\x9cz\xea\xa9~\xed\
+\x97\xc7$\xe8\xbaN\xb1Xd\xd7\xae]~O\xbc\xe7\
+\xf7\x8f\xa7,\x8e\x17 \xf1x\xfc\x1b^@\x08 \x15\
+\x89\xa6\x09\x5c\x17\xa2\xa1(\x05#Wi\x10\x12\xe0\xda\
+\x87\x18\xdfw\xba\xbe\xf6N\x5c\xcd\xfc\xf9\xf3\xc9\xe5r\
+\x5cz\xe9\xa5\xfc\xfe\xf7\xbfg\xce\x9c9\xd4\xd7\xd73\
+s\xe6L\x1ez\xe8!t]g\xd2\xa4Ix\xcd\xa0\
+\xc7\xc3\xcb\x1a?\xa1GR)B(\x17%\xf9\xb4A\
+DSY\xbb\xb6R\xdd\xa9\xabA\x14\xadR#\xe65\
+\x00yv\xc2\x8b\xc8\xbd\xder/MkY\xd6\xa4P\
+(t\x9d\x10\x22\x00\x88\xba\xba\xbaW\xfb\xfa\xfa\xba\x8e\
+\xc2\xaeM\xaf\xaf\xaf\xaf\xd8\x04E\xa0\x9d\xafs\xe9\xb5\
+\x93(\x96\x0d.;\xf1f\xb6\x8c>Eb(I\xae\
+\xdfa\xc37\x93>\xcb\x1c\x8dF\x87\x8f\x1a\x90`0\
+\xc8\xbd\xf7\xde\xcb\xe7>\xf79>\xf6\xb1\x8f\xd1\xdf\xdf\
+\xef\x8b\xbd7\xdb$\x95JaY\x16\xa5R\xc9\xcf\x85\
+\xc8\xb1\xc8\xf0\xad\x0d4G\x0a\x88a\x188(\xa8\xaa\
+Bo\xa7\xc1\xdd\xf7~\x95o<\xfb/|\xe1\xfc/\
+\x13\x8f\xc4\xf9\x9f\xad_\xa4\xfd79\x8c\x11\xc5\xaf\xec\
+8\xe1\x84\x13hlld\xfb\xf6\xed\xd45Uq\xc2\
+\xccF\x96OZ\x86\xea\xea\x15\x07@0G\x22\x1f\xf3\
+\xd2\xd0?\xfc\xe1\x0f\xff\x06\xe8:\x8a{\x94\xe3U\xb4\
+\x18\x81\xe1]e\x12{-\xbe\xfa\xdd{I\xee\xb3p\
+M\x89\xa2\x0b\x14M\xf15\x8e\x10B9&\x1b\x92H\
+$\xb8\xfd\xf6\xdb\x0f\xeb&\xbd\x1eC!\xc4\xa2\xa6C\
+\x9e\x9f\xf6\x00\x00\x16VIDAT\xa6\xa6S\x06\x06\
+\x06\xb6\x1dC\xe0U\x01]*\xa8B\x05\x14\x96.;\
+\x85\x86\xb6*\x96\xaf8\x8d)\xb5M\xac)\xa9Tm\
+\x8c\xa0\xe4\x85\xaf\xd3g\xcc\x98\xe1y\x88L:\xdd\xa5\
+\xf9\xec4\xd2M\xe3\x00\xc6@\x00\xa3-B\xb93\x82\
+\x10\x15\xdeMU\xd5\xa3v@TUe\xe1\xc2\x85\x9c\
+t\xd2Il\xd8\xb0\x81\x815\x15\xa3\x1ep\x1c&7\
+\xba~\xac\xe6mbo\xb0\xdbQ\x032<<\xdc\xe5\
+\xba\xee\x5c\xaf\x80\xa0\xe9\xac0\x91\x88\x82\xb4u\xdew\
+\xd2-<\xb3\xef\x87\xd8\x18\xd8\x86\xe4\xc0\xef\x8b~\x0a\
+\xb5\xaa\xaa*R,\x16\xe3G\xf2pS\xa6Ly_\
+\xb1X\xbc\x10p\xa5\x94\xf1\xce\xce\xce\x8a\xee\x97\x82\xb2\
+a2\xd0S\xe2\xab\x89o\xb2\xa7m\x98;\xb6\xfd+\
+\xb1P5\x1b\x0e\x1e\xc4\xee\x8b\xa2XA\x7f\x07\xb6\xb6\
+\xb6\xfami\x81b3w^\xf4#6\xf6\xfe\x96\x1f\
+\xbc\xf8\x9f\xcc\x9cQ\xc7P9Ovw\xa5\xb6W\xd7\
+\xf5c\xa2\xe2\x83\xc1 \xdf\xfc\xe67\x89\xc5b45\
+5\xb1c\xc7\x0e\xce=\xf7\x5c\xd6\xacY\xc3\xca\x95+\
+ikkC\x08\xc1\xacY\xb3\xc8d2\xbc\xf2\xca+\
+\xc7\xc6\xf6Z\x96\xd5\x16\x0c\x06/\xf6\xf2\xd5\xd3/\x09\
+\x13\x8fk\xe4\xfam~3p\x1f\xb6\x22(\x0c8\xa4\
+\xbb\x0f\x19M]\xd7}7\xf4\x08I\xc4[\xaf\xbb\xee\
+\xba\xf3\xa5\x94\xb8H2U\xa34M\x0f\xe0f\xbc\xfa\
++\x9dt\x22\xc7\xa9\x0d\xe7`\x16m\x92\xc5$\xa77\
+]\xc9\xb3[\x9f!\x18t|\x09U\x14\x05\xe9J\xa4\
+%\xb8v\xf9\x87\xf8\xef\x0d\xff\xca\xf2\xd8\x87X\xd9p\
+#+\x17,\xe0;\xad_\x99\xd0\xfb~\xb4\x80H)\
+\x9d\xf1\x05\xe5\x9e\x93\xe3\xb9\xd9^\xc7Yww7\x81\
+@\x80\xda\xdaZ\x7f\x9c\xd3\xb1\x90\x8b\x0a@uu5\
+\xb6m\xb3\xe3kE\xac\x9cDh \x14\x10\xaaW\x81\
+\xa1\xa2i\x87\x22\xe3\xa3\x1c\xab\xa4'\x93I\x5c\xd7%\
+c\x17\x99sE\x06[\xad\xa8})ltM\x85\xa4\
+\x82q J\xfe\x8d\xb1\xe10c\xde\xd4\xf8\x12\xa0H\
+8L2\x98\xe3\xcc\x8fE8\xff\xfc\x0b\xf8\xd1\xce\xe7\
+\x18J\x8d\xb0\xb7\x7f'\xc5\x9a\xed\xa8Tjl\x85z\
+t\xe3\x93\x00\x1a\x1b\x1bO\x94R\xae\x08\x85B\x5cs\
+\xcd5\xc4b1\x7f\x13n\xdd\xba\x15EQ\xd8\xb3g\
+\x8f_\xf4100\xe0\x17\x18\x1e+ \x9c|\xf2\xc9\
+|\xe9K_\xc2\xb6m\x1e~\xf8a\x0e\x1c80a\
+\x8eG<\x1egpp\xd0\x8fF\xbd\xc14G\x9b\x81\
+s]\x17\xcb\xb1Q\x84B\xba'\xcc#\x7f\xff;\xfa\
+\x0b\xfb\xb9\xe3\xb7\x7f\xc7\xec\xc6yt\x96\xdb0\xca!\
+\x14\xfd\xd0D7\xdf\xf5\xf4\x8a\xf6\x14\x85@@\xc7\xb2\
+\x0c4%\x88\xaah\x04\xb4 !\xadB\x85\x1b\xa6\x81\
+\xa2\x8a\xa3\x9e\xc7U*\x95Z\x9a\x9b\x9b\xc3\x85B\x81\
+\xaa\xaa*\x9f2\x1a\xbf\xfeX\xb1\xa0\x170\x1e5 \
++V\xac`\xf7\xee\xdd\xfc\xf5_\xff5g\x9cq\x06\
+B\x08\x22\x91J\x1b\xb1\x97\x0e-\x16\x8b\x0c\x0f\x0f\xd3\
+\xdc\xdc\xcc\xe0\xe0\xa0o\x97\x8f\xf4A\xbd\xb9\x8d\x16\x15\
+U\xb0z\xd5\xbf\xf2\xf3=_'y\xa0\x9a\x05\xdaU\
+\xdcr\xc6\xdf\xf3\x99\x9e\xf7W\x5c\x5c\xa7\xa2r\x82\xc1\
+\xa0?\xdb\xd1u]\x0c\xd3\xc4*\x18d\xd7,\xe6\x8b\
+\xbf\xfa\x22\x8e\xb4\xd9\xcb\xe3\x94\x0d\x8b\xcc\xcb\x02\xe4\x0c\
+f\xcf\x96 *\xb9\x8a\xcb/\xbf\xfc\x7f\x84\x10\xdf\x07\
+\xd8\xbcys\xc7\xde\xbd{\x97\x1c\xae'\x98N\xa7+\
+\x1d\xc4\x01\xb8\xe4\xdf\x1aPT\x01\xa84\xd7\x9f@\x7f\
+\xea\x00\xa3\xfbL\x0e\xbcX$\xd5^\x91\xe0\xaa\xaa*\
+\xf2\xf9\xfc\xfd\xc7\x14\x18\xfe\xfc\xe7?\xe7\x03\x1f\xf8\x00\
+w\xdf}7\xeb\xd7\xaf\xf7\xfd\xfd|>\xef\xd3%\xa9\
+TjB\xaaTJIcc\xe3\x97\x14E\xb9\xa5\xaf\
+\xaf\xef\xc0\x91J\x88\x83\x83\x22U\xa6\xd4Ma\xff@\
+\x91\xa2\x05\x1d\xc3\xfbyr\xef}\xd8\xb6\x85eUt\
+\xa9i\x9a\x04\x83AN=\xf5T\xf6\xee\xddK\x22\x91\
+ \x9dNc\xba&V\xd9\xc60*S\x91v\xd7n\
+\xe6\x9ckc8\xb9\xca\x1cE7\x13\xc4\xc9j8\x19\
+\x0dk \x18@\xfa3\x15\x83G`C\xd0\xf5J=\
+\x98\xee*\x0cl6)\x0e;\x14\x86\x1c^\x1dHP\
+N\xb9\x95\xba5M\xf8\xb5\x08c6\xcb>&\x1b\xe2\
+\xba.\x0f<\xf0\xc0\xa1\x1b\xf1\x02M\x01\x99t\x06\xcf\
+\xad\x16\xa2\xc2\xdbxc\xfd\xe6\xcc\x99sQ&\x93\xa9\
+\x07\xfe( \xf3\xe6\xcd{\x8f\xae\xebBQ\x14gx\
+x8V.U&{Z\x8aM\xbe?\xc0\xae]\xbb\
+H\xe4\x0a\xa4\x07l\xb2\x89,\xa3\x07\x8b\xe4\x07-L\
+K\xa2\xc8\x0a\x80\x86a\xd0\xdc\xdc\xcc\x8e\x1d;P\x94\
+J\xeb\xb4#\x0fM\x1e2\x5c\x8bp-(\x8e\xc6\xb4\
+\xfa\x05\xc4gT\xb1sp\x03u\x91\xc9d\xe5\x10\x03\
+\x0f6\xe0\x14\x0e\xa9\xbc#I/WUU\xb1z\xf5\
+j\xf6\xec\xd9\xc3\x81}\x07\x08\x18eT\xc7!V\xef\
+b\xd7\xd8\xfe\x98\x0e/n\xf3\xbc\xbfc\x89C\xfe\xfb\
+\xe0\xc1\x83\x17\xdb\xb6=S\x08A1&9\xf5\xf2j\
+\xf4\x80\xa00R\xc5\xfb\xcf\xb8\x9eg\xf6\xfd\x00M\xd5\
+\x19\xdan0\xb8\xb5\x84P\x84?\xed\xe7\x1d\x1e\xb0\xe1\
+\xb4\xd3N\xdb\xac\xaa\xaa\x10B \x91P[\x82l\x10\
+\xe1\xa8\xb0\x11\x9e\xd8\xf8\xd4!\xde\x88\x1av\x1c\x18d\
+\xf4`\x0cG\xe6\xb0M\xe9\x1bs\xaf\x16\xcc\x9b\xec\xe6\
+\x9a\xae\xdfjmI\x07EU\xe8\xdeo\xf3\x95[\xbf\
+\xc2\x0f\xd6~\x97KZn\xe1\x8a%\x1f\xe4S\xcf_\
+\x80eZ\xd8\xa6sD\x80xi\xd9o\x7f\xfb\xdb$\
+\x12\x09n\xbe\xf9f\x9e{\xee9\xbfr\xb1\xbd\xbd\x9d\
+e\xcb\x96\x11\x0e\x87\xd9\xb6m\x1b\xdb\xb6mc\xe9\xd2\
+\xa5l\xd8\xb0\xe1\x1d\xbf\xfbO\x02\x92\xcb\xe5\xb667\
+7\x0f\x1b\x861S\x08\x81\xa1;\xb4\x9cW\x8d\x9d\x92\
+\xa4;\x0c\x1e\xfd\xed\x03\x14\x07\x04V\xd1\xa2\x9c\x92\x84\
+\xc2!\xdf\xf5}\xa7\xf60@/\x97\xcb\xc2\xb6m\x10\
+\xb05\xb2\x8b\xf7\x9e_\x87+]\x1c\xc3E\xb1\x83H\
+K\xc1\xc9\xab\xe4^\xab\xc1)\xaa>\xb1\x98L&\xfd\
+\xe0\xd1\xa3G\x5c\xd7\xa5\xb3\xb3S\xbe\xf1\xc6\x1b\xe2\xd1\
+G\x1fe\xdb\xb6m\x15\xc7C:\xa8\x9a\xc2\x09\xd5K\
+8\x98\xdf\xcdH\xf9 \xff\xeb\xc4\xdb\x09j!B\xa1\
+ \x96cc\x99\xbe\x1azGDjjj>q\xde\
+y\xe7}\xa3\xb5\xb5\x95G\x1ey\x84/\x7f\xf9\xcb\xf4\
+\xf5\xf5\xb1w\xef^r\xb9\x9cO\xd3\xac]\xbb\x96\x99\
+3g\xd2\xd3\xd3\x83\xe38\x8c\x8e\x8e\x1e\x9f\xc1\x01\x95\
+\x0d!8\xe9\xa4\x93\xe8\xee\xeaf\xe3\xe7\xcaH{\xcc\
+!\x16\x1a\x08\x15\xe98\x84B\xba\xffr\xbc\x12\xfcw\
+\xba\x01\xbf<\x07I\xa0\xae\xd2\xd9t\xd6\xa4\x0f\xd32\
+\xb9\x85\xa7;\xbe\xc7\xcc\xaaS\xd8\x9a\xfa\x0d\xf6\xc60\
+\xb6u\xa8\x8ad|\x1bD\xa1P\xb8c\xff\xfe\xfd\xff\
+>i\xd2\xa4\x81\x91\x91\x91\xc6\xb5k\xd7\xb2h\xd1\x22\
+6n\xdcX\xe9\xc8R]\x92\xbf/\xd3;u\x90{\
+6?@2\x97\xe0\x0b\xbf\xfb\x12\xaa\xa2\xd2\x9d\x05+\
+\x7fH2&O\x9e|\xc2\xb4i\xd3^\x05T\xc7q\
+\xd8\xb9s\xe7u\xc9d\xb2\xe7-lD\xad\xa2(\x9a\
+\x94\x92M\x9b6q\xd1E\x17\xf9\xe4\xe6[\xd7\xfe\xfd\
+\xfb}\x82s\xeb\xd6\xad\xc4\xe3\xf1c\x07\xc4\xb2,n\
+\xbd\xf5V\xce;\xef<\x0c\xc3\xe0\xb1\xc7\x1e\xf3\x07A\
+z\x9e\xd6\x9c9s\xd8\xbbw\xafO\x0d\x0c\x0c\x0cx\
+7\xb9p\xda\xb4i\xc9\xde\xde\xde\xb7\xe3\x8a\x1c\x8f\xaf\
+\x92\x02\x14E\xd0\xbd\xcf\xe6\xdb\x7fu\x13\xff\xf0\xe3+\
+\xf8\xe2\xc5\xdf'\x1en`t{'\x83\xd6\x08\x86\xe1\
+\xf8\x80{\xc4\xe1\xb8*I\xa9\xaa*\xb7\xdez+\x9f\
+\xff\xfc\xe7\xb9\xff\xfe\xfb\xfd\x09<\xb6p\xd1\x8a\x1a\xb1\
+\x13\xaa(e,\x0a\x96`d\xd9V\xe2\xb1\x10\x93F\
+\xc2\xd8\xf5A\xdc\xb2\x8a4\x14\xa4\xa9\x84\x91\xe2L/\
+\xf7\xfd\xe6\x9bo\x86\xdeN]\x8dO[+\xaaJ\xb8\
+J#\x10\x14\x87:\xa6\x04\xd8%\x17\xbb\xa4\xf86W\
+Q\x14J\xa5\x92e\x9af\xe2\x98\x00q\x1c\x87\xd9\xb3\
+g\x93L&9\xe5\x94S\x08\x85B\x9cr\xca)D\
+\xa3Q\xa2\xd1(?\xf9\xc9O\xa8\xa9\xa9\xe1\xcc3\xcf\
+$\x9dN\xb3n\xdd:\x02\x81\x00\xb6m\xf3\x9e\xf7\xbc\
+\xe7\xe1\xf6\xf6\xf6\x1f\xf7\xf6\xf6\xde4F66\x01\xab\
+\x01\xd3u\xdd\xea\xde\xde\xdeJ\x012`Z&\xf9l\
+\x8c;\xef\xfc\x1a=\xedY\x1e\x1fz\x86L!\xc3+\
+}oR\xe8\x0a\x13\xd3k=\xb6\x94\xaa\xaa*r\xb9\
+\xdc\x84\xd1\x17B\x08\xda\xda\xda\xb8\xe9\xa6\x9b\xc8\xe5r\
+TUUUf\x09\x0b\x17\xdc\xb19\xed\xc0\x906\xc2\
+\xc2\x85\x01l\xcb\x84\xa6\x89#\x93\xb2\x9b\xc7*\x1e\x85\
+\xf4\x0b#\xfe\x18\xf1\xd9\xd0\xd00\xd6\x82\x00\xb5\xe7\x04\
+Y|Z\x8c\xa1\xedeF\xf7Y\x8c\xee6q\xed\xb7\
+u\x04\x0e\x0c\x0e\x0e\xdewL\x80D\x22\x11\xee\xbc\xf3\
+N\xce<\xf3L\xee\xb9\xe7\x1e\x8a\xc5\xe2\x84\xec\x97i\
+\x9a\xac]\xbb\x16\xdb\xaed\xf4\x82\xc1\xa0\xff\xef\xde\xf0\
+.o\x8d\x8c\x8c\xac\xba\xf2\xca+?\xefQ\xf4\x19\xb3\
+(kg;B&\xc3\xb8\xc9\x00\xd8\x92=ov2\
+YY\xc0\xa6\x8d\x95\xe9\xdc\xd3\xb4\xe5t\xba\x1d~\x8e\
+:\x12\x89\x10\x0c\x06\xfd\x91G\xe3\xa8\x97{\x86\x87\x87\
+\xab\x84\x10n\xb9\x5c^.\x84\xb8\xb8\x5c.\xe3(.\
+\xa1Px\xac\xe2Q\x80*1M\x87\x0f\xcc\xbc\x93\xee\
+\xec.N\x9a\xb5\x98\xffz\xee>\xec\xbav\x1c'\x82\
+eZ\xa0\xc8\xb7\x8d\xe2\x03\x81\xc0l)e\x9d7H\
+a\xd1\xa2E\x04\x02\x01\xfa^\xebe\xe7\xcb\x12I\x00\
+)ub\x91\x90\xafR\xbd_^a\xc81\xab,\xdb\
+\xb6\x83\x8a\xa2\xf0\xdak\xafU\xf4\xa1d\xc2d\x05!\
+\xc0\xb6\x1c\x84R1\xe6^.\xa2P(L\x18,\xec\
+=\x933nPrva\xa7\x98yF\x14\xcb5q\
+\x1c\x17%\x17\xab\xc4\x07\xde\xec\xdc1\xf7\xd2\x9b\x17,\
+\xa5\xf4\xe9\xfe\xfa\xfaz\x12\x89C\xd2\x9fL&\xbf\xe6\
+\x19\xfb\xc9\x93'\x7fL\xd3\xb4\x8b\xa5\x94\x08\x1b\xb0]\
+\xffP\x00\xcb4H\xec\x93T5W\xf3\xfc\x9b?\xc6\
+:\xf01\x16(g\x12SV\xf0X\xefO\xc9\x8d\x06\
+@Ho\xf0\xd8)\x81@\xa0^UUQ*\x95v\
+_r\xc9%\xed===X\x96%kkk\xc5?\
+\xff\xf3?\xb3x\xf1b\xee\xbd\xf7^\xf6\xed\xdb\xc7\xe2\
+\xc5\x8by\xf3\xcd7iii\xa1\xbf\xbf\x9ft:\xcd\
+\x94)S\x90R\xb2}\xfbv\xd2\xe9\xf4\xb1\x03r\xe0\
+\xc0\x81\xbf\xcb\xe5r\x9b\xd41~\x22\x1fr9\xff\x96\
+:\xcaY\x07\xbb$)\xa5\x5c\xd2]\x16\x99\x036\xee\
+8\xa0&M\x9a\xe4\xd1+U\xb1XlF>\x9f?\
+\x00\xb8\xe3wJ8\xa2a\x14%\x97\xcf\xfc'&\xd7\
+\xd5\xf2\xf3=\xdf V\xd7H\xa2\xf9\x00\xc9\xf5!_\
+\xf7:\x8eC:\x9dFJI8\x1c\xc6\xb2,\x06\x06\
+\x06\xbc\x06\x98\xb7\xf3\x1cTM\xd3X\xbdz5\xf9|\
+\x9e\x1f\xff\xf8\xc7~\x02\xad\xae\x5cEh\xeb\x1c\xee\xda\
+|\x17\xaa2\x87\xdf\x06\x9e \xa4\xebHCe\x8a\xb3\
+\x98\xa6\x13\xbd\x9d&\xb9\xfa\xea\xab\x7f\xeeU\x8e\xacY\
+\xb3f\xaaW\x13l\xdb\xb67\x8f\xd7\x1f6\xe3\xba.\
+\x93'Of\xfa\xf4\xe9\x94\xcbef\xcc\x98\xc1\xbau\
+\xeb\xfcd\xde\xce\x9d;\x8f\x8f\x97eY\xd6\xd6@ \
+ =5\x13\x01v\xfe\xc0|Kn]'\xa4\xeb\xa0\
+\x1f\x8ab5M\xc3\xb2,\x1a\x1b\x1b\xffz\xc9\x92%\
+\x97\xbd\xf8\xe2\x8b_\xb5,\xeb\xe4\xbe\xbe\xbeCc\x9d\
+\xde(\xa0\xb5W\xb3\xeb\xc46\xbe\xb1\xf9\x19fN\x99\
+\x89\x1e\x9fB\xdb\xe0N\xf2C\xae_\x1c\xf0\x16\xd1/\
+wtt<4\x96\xf134M{\xe5\xedr)\xef\
+{\xdf\xfb\xa8\xaf\xaf\xe7\xb6\xdbn\xe3\xd1G\x1f\xf5S\
+\xba\xaet)\x9b\x15\xb5\xbb!\xdd\xca{o\x0dO\x18\
+3e\x0d\x070{\xc2\x98\x07\xc389\x8d\xf1\xb3T\
+\xbc*z/\xc6\xb9\xed\xb6\xdb\x08\x06\x83\x94J%\xa4\
+\x94|\xff\xfb\xdf\x9f\xd0\x7f\x22\xa5d\xf7\xee\xdd\xb4\xb6\
+\xb6\x1e6\x89yX\xed\xa7\xae\xeb\xf2\xd1\x8f~\x94s\
+\xce9\x87\x8e\x8e\x0ev\xee\xdcIgg\xa7?\xdb\xc3\
+4MN?\xfdt\xf6\xef\xdf\xcf\x9e={\x98={\
+6\x1d\x1d\x1d~&\xb1\x5c.\xeb\xe7\x9e{\xee\xbf*\
+BaX\x1b\x96\xd3O\x12\xc2\x1c\x0cc\x0f\x07qS\
+:;6\xee\xa5E=\x11g\xc4\xa5wx\x90&m\
+)\xeb\x13\xaf\xfb\xbd\xe0^q\xc0\x18\x91\x98O$\x12\
+\x1f\xfd\x93\x0f\xa5i\xbc\xf2\xca+\xacY\xb3\x86\x91\x91\
+\x11\x8a\xc5\xa2?O\xd7+\x0b\x02(\x0a\x93hm\x0c\
+\x92\xd3\xb8\xfd\x92/\xf1\x8b\xd6\xffd$2\x82=7\
+Kb\xb3E\xea\xe5*T\xad\xd2\xb2}\xd6Yg\xad\
+\xf3\x00)\x95J\x84\xc3\x95\xf3N\x8a\xb9J9\xa9P\
+\x15\x94?^\xd6,\x01\x91J\xa5\xa2\xc7\x05\x10)%\
+\xd7\x5cs\x0d[\xb6la\xd5\xaaU$\x12\x09\x16-\
+Z\xc4\xf6\xed\xdbihh\xa0\xb3\xb3\x93\x9a\x9a\x1a\x16\
+.\x5cH \x10\xa0\xbd\xbd\xdd\x1f\x00\xe9\xbd\x80\xfe\xfe\
+~\x1c)\xa9\xbe>/\xc2\x8bc\x84\x97fA\x91H\
+S\xc1Nk\xb8Y\x9d\xd4\xf3\xb58\x96\x8b\xe6\x1e\xaa\
+.\xf1\x06\xa7\xd5\xd5\xd5M\x985\xffN\x91t\xb1X\
+\xe4\x9cs\xce\xf1\xc1\xf4\xf4w]]\x9d\xff\xbdM=\
+*{\xbf\x5c\x87\xedf\xf8\x9b\xff\xfc\x18\x02\x9d@@\
+E\x1aQ\x14]\x22t\x13\xd5U\xbc\xd1\xb8\xb3\x0c\xc3\
+\xc0\xb6m\xaa\xab\xab+\xc9'\x04\xb5K\x82\xe8\x08\xf2\
+\x03\x0eF\xc6\x9d0\x9c\xc8\x93\x0aM\xd3D6\x9b}\
+\xc3\xb6\xed\xf7\x1e\x17@t]\xe7\xfa\xeb\xaf\xe7\xae\xbb\
+\xee\xe2\xeb_\xff:\xdd\xdd\xdd\x13N\xd2)\x16\x8bt\
+uu\x91\xcb\xe5\xfc)\x9d\xaa\xaa\x92\xcdf\xa9\xad\xad\
+\xc5u]\x7f\xc8\xc0\xc0\x036o(\xde\xb0Ie\x1c\
+eaR\xb4\xdahii\x99\x90\xb7\xf7&\xea|\xf4\
+\xa3\x1f\xe5\xfe\xfb\xef?\xac2#\xc30r\xb6mw\
+{u]B\x88\xe9\xaa\xaa\x0aO\xda\xfd\x89\xa8\x01\x8d\
+\x9aI1,\xcbb\xb4lS}\xe9\x10\xb5\x93td\
+I\xc3\x1c\x0aR\xec\x08@\x22\xeaWNz\xf1G(\
+\x14\xe2\x13\x9f\xf8\x04\xc9d\x92\xed\xdb\xb7W\x1a\x95j\
+-d\xfc\x90\xf3\xe1\xfd\xee\x15]\x94J\xa5r\x22\x91\
+H\x1d\x17@\xbc\xb9\x8a_\xf8\xc2\x17\xfe\xe8g\xf2\xf9\
+\xbcO\xcdK)\x19;\xb1\xccg\x81\x87\x86\x86*\x85\
+\xda\x93\xe3\xa8\xaaJ[[\x9b?\xcbw\xf1\xe2\xc5c\
+\xd4G\xd9\xcfq\xd8\xb6\xed\xe7\x0e\xaa\xaa\xaa\xfc\xf9\x86\
+\x87\x03H:\x9d~p\xd3\xa6M\x0fz?O\x9f>\
+\xddRUU;\xf1\xc4\x13\xe9\xee\xee\xf6\x81\xf6^\x98\
+a\x18${Fh^\x7f\x12\xd9R\x89u\xeb\xd6\xa1\
+i\x1a\xcb\x97/\xa7\xa1\xa1\x816\xa5}\xc2\x09:\x17\
+^x!\x93'O\xe63\x9f\xf9\x0c\x8f<\xf2\x08/\
+\xbf\xfc2\x97]v\x19\xbf\xff\xfd\xef\x995k\x16\xc3\
+\xc3\xc3l\xd8\xb0\x81X,\xc6\xa9\xa7\x9e\xcas\xcf=\
+w\xd8\xa4\xe5a\x01\x92J\xa5\xfe*\x9b\xcd~\xa3\xa6\
+\xa6fQ>\x9f\xf7\xcb\xfb\xc7\x1b\xaa\xb7\x1a-\xaf\xc8\
+\xce\x03\xc5\xcbuTUU\x11\x08\x04hjjb\xe6\
+\xcc\x99\x0c\x0c\x0cL8\xbfj\xfc1B\xe3\x8b\x93\xbd\
+\xe1hG\x93\xfc\x92R\xb2n\xdd:\x86\x86\x86X\xbd\
+z\xb5\x1fKyR\xe8yJ\xb6m\x93N\xa79\xeb\
+\xac\xb3\x88\xc5b$\x93I2\x99\xcc\xf8S\xd80M\
+\x93\xbd{\xf7r\xdbm\xb7122\xc2\x8e\x1d;p\
+]\x97\xed\xdb\xb7\xe3\xba.\xfb\xf6\xed\xf3\x9f\xbdP(\
+088xD,\xf2a\x01\x92L&\x7f]WW\
+\xf7\xcf\xcb\x97/g\xf5\xea\xd5tww\xb3y\xf3f\
+\xba\xba\xba\x08\x04\x02~\xe2~\xea\xd4\xa9\xf4\xf5\xf5\x91\
+N\xa7\x994i\x92\xcf~\xfa%=\xe3b\x10\xcb\xb2\
+\xc8\xe7\xf3>M>\xfe@\xb1\xf1\xb3s\xc7^\x5cj\
+``\xe0\xe1\xb1\xff7r4eE\x86a\xf8R\x9b\
+\xcdf\xfd\xef\x1f?t\xdfSK\xa6i\xfa\x07\xd5x\
+\xff\xe6\xfd\xbd\xe38\x8c\x8c\x8c\xb0j\xd5*_\x9dC\
+\xa5\x9b\xca\x1f\xeb1n\x83\xbe\xf1\xc6\x1bG\xd4Bw\
+$\xe7\x87\x88\x8f\x7f\xfc\xe3\x0c\x0e\x0er\xed\xb5\xd7b\
+\xdb6\xb3g\xcf\xa6\xaf\xaf\x0f\xdb\xb6\xa9\xab\xabC\x88\
+J2\xa6\xbd\xbd\x9db\xb1H0\x18\xf4\x87${\xb6\
+\xc0\x03\xc4/\xf3\x19\x03a\xbc$\xa9\xaaJ \x10\xa0\
+\xa5\xa5\xc5\x9b;5\xd2\xd9\xd9\xf9\x89\xf11\xce\xf8\xa0\
+\xf0pT\xee\xc5\x17_\xccE\x17]\xc4\xf0\xf0\xb0\xaf\
+\xb2B\xa1\x90\x9f\x8a\xf6\xd4\xd7x\x06`\xfc\xe1g\xde\
+\xdc\xc9\xb1\x0d:\x81L\x1c_r\xfbv\xd7\x96Rv\
+I)\xfb\x8e7 |\xfa\xd3\x9f\xe6\xa1\x87\x1e\xe2g\
+?\xfb\x19/\xbe\xf8\xe2\x84\xf38\x0c\xc3 \x1a\x8d\xfa\
+e\xf7\xde\x91\x0e\x9ek\xec\xa9\xaf\xf1\xa7\xd5\x8c?\xe9\
+\xcd{!\xc5b\xd1\xaf2\x9c:u*\xe9t\xfa\x0f\
+(\x87#\x01\xc3SYMMM\xec\xde\xbd\xdbW\xb7\
+\x9eZ\x1c\x7f\x14\x85\xf7gOZ\xc7\xd7T\x99\xa6\x89\
+\xae\xeb\xdcq\xc7\x1d\x5cp\xc1\x05\xfc\xfb\xbf\xff\xbb\x97\
+_\xf7YkO\xda\xab\xaa\xaa\xfcA=RJv\xed\
+\xda5\xeb\xb8K\x88\xe7>~\xf0\x83\x1f\x9c\xd0S8\
+\xdevx\x93\x9d=\xfdYUU\xe5\x9f\xc4\xe3\xedJ\
+\x8f#\xf2\xa4\xc5\xf3F<\x8a\xc4\xa3\xab\xa5\x94\x13\x06\
+\x80\x1d\xcbJ\xa7\xd3\xb36o\xde\x8ceY\xf9\xe9\xd3\
+\xa7w\xacZ\xb5\xaa\xf6S\x9f\xfa\x147\xdf|3\xf9\
+|\xde\xef\xb5\xf7\xdcZo\x1c\xdfx\x9a?\x93\xc90\
+{\xf6l\xce=\xf7\x5c\xa2\xd1(\xe7\x9cs\x0e\x1b6\
+l\xe0\x92K.a\xcd\x9a5\x5cy\xe5\x95<\xf9\xe4\
+\x93,\x5c\xb8\x90\xda\xdaZTU\xe5\xb9\xe7\x9e\x9b0\
+\xed\xfax\x03\xf2\x8b\xee\xee\xee\xed\x8a\xa2\xac~\xef{\
+\xdf\x8b\xa2(\xb4\xb7\xb7c\x18\x86?\xef\xdc\xd3\xb75\
+558\x8e\xe3\x0f\x94\x14B\x90J\xa5\xfc\x01\xf5\xe3\
+U\x96W\xd1\xe7}n\xacZ]:\x8e#l\xdb\xa6\
+\xa6\xa6\x86L&\xa3\x1e# ~N\xa3X,\xbaw\
+\xddu\x17\xeb\xd7\xaf\xa7\xba\xba\x9a\x91\x91\x11\x7f\xf7\x8f\
+\xb7g\x1e\xd52>\xd1\x96\xcb\xe5\xd8\xbd{7\x0d\x0d\
+\x0dx\xe7\xffzn\xef\xd6\xad[\xb1m\x9b\x9e\x9e\x1e\
+\x7f\x10\x8d7\x92\xe9\x88\xec\xdd\xe1|\xc8;\xab\x0f\xd0\
+\x96,Ybm\xdd\xba\x95\x9d;w\xd2\xd3\xd3\xc3\x96\
+-[X\xb1b\x05?\xf8\xc1\x0f\xb8\xf0\xc2\x0b\xe9\xec\
+\xec$\x18\x0c2\x7f\xfe|:;;y\xf5\xd5W\xc9\
+f\xb3\x0c\x0f\x0f\x13\x8b\xc5\xfcrS\xef\x04\x01)\xa5\
+\xdf\x9f\x18\x8dF\xfd\x03Q\x06\x07\x07\x13\xe5r\xf9\xe5\
+1\xbb\xb4gdd\xe4\x8b\x1c\x87u\xe2\x89'&n\
+\xbc\xf1\xc6\xfaK/\xbd\x94\xcf~\xf6\xb3\x0c\x0c\x0cP\
+*\x95\xfc9\xed\x85B\x81)S\xa6\xf8\x07\x9cy\xe3\
+oUUe\xe6\xcc\x99d2\x19\xff\xb4\x87\xb7s\x1e\
+\xde\x9a\xe6\xb5m\x9b7\xdf|S\x1cW\x09\x19\xa7\xc3\
+\x15\xcb\xb2x\xf8\xe1\x87\xb9\xec\xb2\xcbx\xf4\xd1GI\
+&\x93\xbc\xf0\xc2\x0bH)\x19\x1c\x1cd\xdf\xbe}\x95\
+\xb3\xa5\xba\xbb'd\x10\xbd\xc1/\xe9t\x9a`0\xe8\
+\x0fO\x8eF\xa3\xbe\xd4\x18\x86\xc1\xec\xd9\xb3\xc9d2\
+(\x8a\xb2+\x93\xc9\x5c\xc3q^\xba\xae\xf3\xe4\x93O\
+\xf2\xd4SO\x91\xcf\xe7\x99<y2\x9f\xfd\xecg\xf9\
+\xf4\xa7?\xed\x0fK\xf3F\x8d\xc7\xe3q\x9f6\xff\xfc\
+\xe7?\xcf}\xf7\xdd\xe7\x8f\x05\xf4\xc8NO\x9d\xd7\xd5\
+\xd5\x91\xcf\xe7I\xa5R4662<<\x8ceY\
+}\x8a\xa2\xe4\xff,*\xcb[\xa1P\x88{\xee\xb9\x87\
+\xfb\xee\xbb\xcf\x8f\x13<u\xd3\xdd\xdd\x8d\x10\xc2\x1fv\
+\xe6\xddlUU\x95O\xc5{'-{\xb6\xc6;\xef\
+\xd0\x8b?\xf6\xec\xd9s\x5c\xfb\x00\xdf\xbaFGG_\
+\x09\x87\xc3\xd5c\xf7\xb6\xf2\x1b\xdf\xf8F\xe4\xb5\xd7^\
+\xf3\xef\xcd\xb3a\xe3\x8f\xdep]\x97U\xabV1u\
+\xeaT\x96-[\xc6\xd3O?Muu5[\xb6l\
+\xa1\xb9\xb9\x99\xad[\xb7\xb2r\xe5J\x0a\x85\x02\xed\xed\
+\xed\x1c<x\x90h4Joo\xef\xe5\xdd\xdd\xdd\xdb\
+\x8f\xa4\x0b\xe0H\xad\xa56s\xe6\xcc'\xa3\xd1h@\
+\xd7\xf5\x0bO<\xf1DB\xa1\x10\xaa\xaa\xb2o\xdf>\
+\xbf\x059\x1c\x0e\xfb\xd3\x0dB\xa1\x90\x7f\x1cP&\x93\
+!\x97\xcbM\xe0\xb9\x82\xc1 \x17^x!/\xbf\xfc\
+2\xde\xbcu!\x04\xed\xed\xed\xaf\x0f\x0c\x0c\x9cy<\
+\xc1\x18\xb3G\xfe\xcfs\xe7\xce\xdd{\xed\xb5\xd7\xce\xbb\
+\xf9\xe6\x9b\xb9\xfc\xf2\xcbY\xb6l\x19---<\xf9\
+\xe4\x93\xbej\xfd\x87\x7f\xf8\x07\x1ey\xe4\x11\x0c\xc3\xe0\
+\x86\x1bn`\xd3\xa6M\x8c\x8e\x8e\xfa\xae\xb0\xd7\x93\xa2\
+\xeb\xba\x7f\x0cG0\x18D\xd7u\xba\xbb\xbb\x97\x1d<\
+xp\xcb\x91\xdc\xe3\x91\xf6\x9f\xd9]]]\x97\xb7\xb6\
+\xb6^\x17\x0a\x858\xf3\xcc3\xf9\xc2\x17\xbe@4\x1a\
+\xa5\xb9\xb9\x99\xa9S\xa7RUU\xc5\x8c\x193\xa8\xa9\
+\xa9\xa1\xae\xae\x8eH$\x82\xeb\xba~\xa0\xb5r\xe5J\
+\x02\x81\x00\x0d\x0d\x0d\xc4\xe3q\x82\xc1 \xd1h\x94\xb1\
+\x81\xcdon\xdf\xbe\xfd\x9f\xb6o\xdf\xfe\x19\xe0+\xc7\
+[:\xc6\x831&\xa1\xca\x0b/\xbc\xc0%\x97\x5c\x82\
+\x10\x82{\xee\xb9\xc7?\x9fp\xc3\x86\x0d\x18\x86\xc1\x15\
+W\x5cA\x22\x91@\xd7u~\xf9\xcb_\xd2\xdd\xddM\
+\xa1P\xa0X,N89\xc7s\xedC\xa1\x90\xf4\xcb\
+\x91\x5c\xf7\x88\xdd\xc3\xa3:-Z\xd3\xb4\x80\x10\x82\x07\
+\x1f|\x90\x87\x1ez\xe8\x0f\xfe\xfd\xe0\xc1\x83\x7f\xd49\
+x\xab\x1b\xeb8\x0e\xbf\xfd\xedo\xbdIo\xbbr\xb9\
+\xdc\x7f\x02\xefX\xb6\x7f<V6\x9b\x95\x9e\x8a\x12B\
+\xf0\xfc\xf3\xcfs\xfa\xe9\xa7\xb3c\xc7\x0e6l\xd8@\
+}}=\x0f>\xf8 \x0f>\xf8 w\xdf}\xb7\xef\
+\xba{A\xafw\xc2\x90\x97\xbe\x1eSo\xa2\xad\xad\xed\
+\x5c\xc7q\xf6\xd4\xd5\xd5%\x8e\xf4\x9e\x8e\xca\xc1\x0f\x85\
+B\xb1\xba\xba\xba\xcf\x85B!\x17\xb8*\x1c\x0e/>\
+\x1c\xbd\xefMz\xf0\xa6<{\x996\xcf\xdfO\xa7\xd3\
+kzzz\xde\xcf_~E\x16/^\x5c\xf0\xfaE\
+t]g\xe9\xd2\xa5\xec\xdb\xb7\xcfw\xc9\x0f\xc7}\xf5\
+\xf8\xb1\xed\xdb\xb7\xcf-\x14\x0a\xedGs#\xc7<8\
+\xaa\xb9\xb9\xf9\xe7MMM\xd7\x1e\xce\x5cs\x0f\x14\x8f\
+\xce\xae\xa9\xa9\xa1P(\x14[[[\xa3\xe3\xbe\x8f\xfe\
+\xfe\xfe\xbf4 \xc1\x96\x96\x96m\xf1x\x5c\xe4\xf3\xf9\
+Hcc\xe3\x09RJ\x0a\x85\xc2a\x8f\x90-\x14\x0a\
+\x98\xa6y\x9f\xeb\xbaV\xb9\x5c\xfe\x8f\xa1\xa1\xa1\xd1\xff\
++\x80\x00\x81\xb1\xef\x09\x86B\xa1\xa5\x87\x1b\xd7xQ\
+{8\x1cNd2\x99]\xfc?\xb2\x82\xc1`m8\
+\x1c\xfeG\xd7u\x9d#`\x08d \x10H\x9e|\xf2\
+\xc9\xff\xf3\xc2\x0b/H\xde]\xef\xaew\xd7\xbb\xeb\xdd\
+\xf5\xeezw\xbd\xbb\xde]\xff\x8f\xad\xff\x03!\xf6p\
+\xa0\xc1\x03\x97\x85\x00\x00\x00\x00IEND\xaeB`\
+\x82\
\x00\x00~\xd7\
\xff\
\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\
@@ -6040,6 +5556,490 @@ R\x22\xd4\xca\xc6\x0aMn\x1a\x04\x81G\xd6\xdb@\xd5\
\xbd\xcdH7\xday\xe13\x95\xf7\xf8\x1f\xcb\xb6\x8e\xf6\
\x8f\xf1\xef\x16\x00\x00\x00\x00IEND\xaeB`\x82\
\
+\x00\x00\x1ax\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00d\x00\x00\x00i\x08\x06\x00\x00\x00\xcc|\x86\x8a\
+\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09pHYs\x00\x00\x88&\x00\x00\x88&\x01\
+\xac\x91\x9d\x06\x00\x00\x00\x07tIME\x07\xd9\x03\x03\
+\x0e\x04:\x04\x0e\x03\xc5\x00\x00\x19\xf8IDATx\
+\xda\xed\x9d{tT\xf5\xbd\xe8?\xbf\xbdg\xcfd\x92\
+\x0cy\x12\xc2#\x01J(\x8fJ\x90\xa2\x16k\xc3\xa9\
+\xa0\x02\xf5\xd4.\xbd\xda.[\xee\xa5\x85z\xb4u\xf5\
+\xae\x16\xef\x83\xf6\xf6\x9cs[\xd0z{\xafK\xaf\xbd\
+\xb4\x97\xd5z=*\xb7\xd6\x1e=\xe7\xd4Z\xa1*x\
+\x05\x0fJ\x00Q\x08\xa4\x09\xaf\xc8#\x04\xf2\x9a$3\
+\x99\xcc\xec\xc7\xef\xfe1\xccf\x1e{\x87\x09L\x12p\
+\xe5;k\xafd\xf6\xfe\xfd~\xfb\xf7\xfb\xbe\xbf\xdf\xdf\
+c\x04@eee\x9d\x10b\x07c0\xea\xa0\x00\xaa\
+eY\xda\x18*\xae\x0e\xf0\x00\x85\xa6i\x16\xaa\xaa\x0a\
+\x80\x94\x12\xcb\xb2\xc603B \x84@Q\x94\x14\x82\
+\x94\x1b\x86Q\xe6\xf5z\x01\xc8\xcf\xcfg\xe5\xca\x95c\
+\x98\x1a!\xd8\xbf\x7f?{\xf7\xeeM!\xc8D\xc30\
+*\xd3\x0b\x9a\xa6\x89\xae\xebc\x18\x1bF\xc9\xf0\xf9|\
+\x08!2T\xd6\xf8\x0b\x97\x0dRJ\xfa\xfb\xfbik\
+k\x1b\xc3\xdc0A^^\x1eS\xa6LAJ\x99A\
+\x90\x80eY\x81\xf4\x0a\xc3eK\x84\x10((\x08@\
+ \x88\x19&1\xcb@\xf5\x9b\xf1;1\x0f\xaa\xa5\x82\
+\x00\xa1H\x10 \x91\x9f8\x82\xa4\x13\x22\x99 ^!\
+\x84\xe6T0]\x9cr\x01A\xa3\x8f\x93\xfa9\xba\x8d\
+\x10\x032\xc6gn\xc8gvm\x01Iv\x8d\xfe\x1e\
+\x89l\xcf'v\xce\x87\xd5\xee\xc73\x90\x17'\x90\xdd\
+\xb1O6A\x14\xcb\xb2\xd4d\x22X\x96\x95S\x09\x11\
+@\x8f\x19\xa6a\xe0\x04\x1df\x0fB*L\x9d\x9e\xc7\
+\x8a\xa5e\xe4\xe5)\x98&H\x09\xe2\x824\x14\x94\x0a\
+(\xebG\xcc\x09\x83\x02\xb1\x01\x89\xec\xd30z5d\
+\x9f\x86\x19\xf2`\x854\xac\xb0\x07+\xa4\xa2\xe8\x9a-\
+M\xf1K^\x13\x04I\xe09\x9d \xc2I\x12\xdc(\
+x9\x10\xb2\x22\xfck\x7f\x03RJT\xa9R1\xc9\
+\xcb\x17\xbfT\x8a\xb4\xc00$B\x08\x12]\x10q\x1d\
+\x05R \x11`H4U\x81b\x13o\xb1\x09\x0c\x10\
+\xef\xda\x85r\xc0@Hb\x9c\xcf\xc3h\xf7\xa1\xb7\xf9\
+\xf0\x84\xf3mN\x10W\xa9D\x0d&!\xae\x94\xcb\x85\
+\x84\x18\xd2dW\xff\xa1\x0b\x12 \xf0\xe5\x09n\xbb\xab\
+\x0cie\xa9\x16\xed\xe7\xc2\xf1\x96\x04\xfcE\x02\x8a\x07\
+\x10\xb3\x07@\x01=fa\xf6z\xb0z\xbd\x18\xbd*\
+\xb2\xcf\x8b\x19V\x91!\x0fFHA\x89z\x11B\xc6\
+\xc3\xe2Q\x92\xa8\xc1$\xc4\xb5B.\xa4\xe4\xa4~\x0e\
+C\x9a(\x17\xb0X3\xb7\x00E\x11\xc8\x1c1\xae\xdd\
+\x86\x14H\x13\xa4\x09\x1e\xa1\xe0)\x92P\x14\xbd0\x96\
+\xfe\x14\x89\xd2\xa3\x92\x816\x0d\xeb\x9c\x9fH\x9b\x07O\
+w\xbe\xad\xeeFJ\xa2\xb2\x96\x90db\xe4\x82 \xed\
+FO\x8a\x14TN\xf6\x0e\xab]\x16N\xff%K\x94\
+\x94x\xfd\x02\xef\x0c\x1dQ\xa3S\xa2HL\xab\x83X\
+\x8f\x02=^b=*\xf4z1\xc2\x0a\x845b!\
+\x81\x12\xd1\x10jn%\xc9\x0d\xbf\xc3N\x90\x90\x8c\xa4\
+|/,RG= \x03\xc0\x8aK\xa94@\x11\x0a\
+y\x85\x12\x0ac\xe4M\x06I\x04d\xc2\x96\x81e@\
+\xd7\x9fK\x90]y9'HV*+\x97\x0410\
+\xe3\x86\xfa\x02\xf8|\xa3K\x10W\x02\xa5\xcbV\xc2c\
+\x93\xa0\xfa@\xd1\xc0\x90r\xe4\x09\x92K\xef\x8a\xf8x\
+l\xfb\x01\xa0\x88k,\x8c\x10I\x03\x19\x01\x18TB\
+\xc6\xb2\xbe\xc3\x97\xb9\x18\x92\x0d\xc9\xb5\xa4d\xb6%\x87\
+P\xf7\x82Z\x11\xf1zq\xc4H[\xdd\x08.\xc60\
+\xc3J\x90\x1c\x8b\xc8\x90\xbc\xac\x04'\xe4\x82#\x84\x88\
+\x1b\xcdTP\xb2\xaa\xab\xa8\xd0\xd5\xaes\xead\x1f5\
+\x15s\xb8a\xc6MT\x96N`z\xe5\xa7P\x15\xe8\
+\xeco\xe3d\xf0/\xb4\x85>\xe6xw\x03\x8aP\x1d\
+\xde\x953\x0c\xe6\x5cB\x86\x1c\x87\x0c\xb7cz)\xc9\
+x\xfbO\xdd\xf4\xb4\xc3\xab?\xfb\xbf\xcc\x9f>\x1f\x8f\
+\xeaq\xec\xa7)\x0d\xce\xf4\x1e\xe5\xd7{\xff\x96\xf3\xa1\
+\x93\xa8\x8as\xb9DF\xc0\x92V\x5c\xf2\x10Y\xe7\xeb\
+\xe40\xa8@'<+\xd9x\x01Wr]\x0e\xc4\x06\
+,^}\xb1\x0d-V\xc6G\xcf\xec`a\xcdBT\
+Eu\xf5\x92<\x8a\xc6\xd4\xe29l\xb8\xeden\xfd\
+\xd4}\x18\x96\xeeX.\xd4k\xb0\xedO\xedL\xb6\xea\
+\xb8\xbfv-K>\xf5U\xe6\x8c\xff\x5c\xd6\x0c\x92+\
+\x9c\x0c\x86\x97aw{\x11\x82\xf4f\x06k\xd7\xb2\xe0\
+\xf5\x7f\xec$\xe0/\xe5\xfd_\xbe\x89\xdf\xeb\xcf*\xc5\
+\x92\x90\x80\xfbk\xff#\xc5y\x15\xfcc\xc3\xff\xc4\xab\
+\xfa\xec\xe7\xaaG\xd0rd\x80\xe6\xc3=\xdc\xff\xf7\x7f\
+C\xcd\xc4\x99\x00\xb4t\x1f\xe6\xf0\xf9\xf7\xb3\xa0\x88\x95\
+S\xad\xe1\xa4\xae\x06UY\xb9\xf3\xf3\xe3\xaen2\xa7\
+*\x8a;r\x0f\x7f\xd0G\xa4\xdf\xe4\xe7\x0f>b\x13\
+#\x1d\xa2F\x84\xf7\xff\xb2\x1bM\xf8\xb9a\xd6\x02\xbc\
+\x1eo\x0aaV|z\x15M\x1d{i\xee\xfc\xe0\x22\
+AT\xc1\xc9c\x03TV\x94P3q\xa6M@\x04\
+)s\xdaW\xaajs\xee\xf6\xe6B\xe5\x5c\xb6\x1f#\
+\x05\x87?\x0cQ^\x12\xe0\xdf\xdev\xbfc\xa9s\xa1\
+S\xfc\xb7\x9d\xab\xe9\xe9\x0b\xb3\xf5\xe5N\xaa'T\xf1\
+\xde/\xde\xca\x08\xf4\xfe\xcdg\xfe=\x8f\xbd\xb3\xca\xfe\
+\x1e\x09[\xf4\xf5\x98\xdc<oavI\xcda\xca\xed\
+]J\x0b)\x83\x89\x93eYW|%\x5c\xc6\xc4'\
+\xfd{\xe2\xa3\xa8\x82\x86}}t\xf7\x84\xf9\xdf\x8f<\
+\xe1j\x04_\xf8\xf0Q\x22F\x98\xbc|\xc1\xedw\x97\
+p\xf0H\x13w\xfe\xf8\xde\x0c\x04W\x15\xcd\xa4\xa6t\
+>\xa6e \x91tw\xe8H$\xd7\xd7\x5c\xe7\xe8\xd2\
+^\xf2\x93#|$.7/Kq2~\xb9\xe4\x06\
+\x91\xf6q\xba'\x10(B\xa1\xf9`?\x15\xe5E,\
+\xb9~\x89\xa3Q\xee\x8e\x9c\xa3\xb1\xbd\x1e\x81@ZP\
+P\xa82s\xf68\xde\xfbp?\xef7\xd6g\xd4Y\
+\xb3\xf0\xa7X\xc4\xd0T\x85sma\xf4\x98\xc1\xbcO\
+\xcd\xc9p\x9f\x84\x14\x5c\xea\x93k7+\xeb\xc00\xd9\
+\x1d\xcb\xdd\x8c\xa1\xc8 Q:t\xb4\xc5\xd0c\xb0\xe2\
+\xe6\xbfr\x8d%\xde9\xf1O\xa8\xc2\x13\xaf\x7f\xa1\x89\
+\x09\x93}\x9c<\x16\xe5\x9d\x8f\xfe\x95EsnJ\x19\
+G\xb1\x7f<M;Kh:v\x8a\xed\xbfx\x99\xfe\
+\xaf\xc7\x983%\x95 \x01_\x09\x9f\xabZ\xce\x80\x11\
+A7#\xb4\x87[\xe9\xe8?\xe3(E\xb9\x8eCF\
+\xc7\xcb\xca\x12\xba\xdau\x84\x80\x053\xe7\xb9\x96i\xee\
+\xfc\x00U\xa4\xba\xbf%e\xf1\xe5\x00\x07\x8e58&\
+\x0d\xe7U\xcd\xa7\xe1/\x1f3\xa9d2%S\xca3\
+\xda,\xcb\x9f\xc8\xaa\x05\x7f\x1bO\xecJ\x8b\xffw\xe2\
+e^9\xf4\xf4\xd5eC\x86#\x0f\x94\xfar\x99q\
+\x85zM\xa4\x94TULtm\xe7tO3B(\
+)\xf5\x0a\x02*RJ\xcev\xb6;\xd6\x99;\xf53\
+Y\x05v\x82xFAIk\xff\xe2u\x15$\x17s\
+\xc1\x11\x8aHUQ\xc2\xc5}\x0c\xf7Y\x08!\xa8\x99\
+<\xd3\xb5-\xc323\x8c\xb7?_A\x08Ak\xc7\
+\x19\xc7:\xd3&M\xc62\xa1\xc0\xe7O\x89W\x06W\
+\xaf\xc2\xd9\xf0\xcbQ\x9a\xa0J\xcfi]y,\x22.\
+\xe9\xd3\x87CqdW\x96\x959G\xeff\xd4\x11\x91\
+\xaa'\x9e\xfe\x08G#\xce\x122\xb3\x9a\xaf\xfdM%\
+\x13\xef\x9bEYQ\x11G\xfe\xe1P\xaa\x1b\xddw\x8a\
+\x7f>\xf8\x0c\x9a\xe2\xa3\xc0WHG\xf4cg\x82X\
+W\x81\x0d\x19I\xd0c\xf1\xc1\x96\x14\x16;?7\x07\
+\x5c\x93L\x9aO\x10\x899?/\xce\x1b\x8f\xc7\xa3\x90\
+\xe7\xc9\xc7225t\xc4\xe8\xe3@\xc7\x9b\xa92\xe2\
+\xb4\x0ag\xd8\xd5\xf8 ^Vn\xd7ee\x17\x80\x99\
+F\xbcc\xf9\xde\x80\xab\x84\xb8\x81\xd7\xab\x10\xeew^\
+\x87\xecU\xf3.\xa6\x0c\x84s\xf7D6\x19\xe2\xd1\xcc\
+\xf6&b\x91\x5c\xac\x5c\x8c\xe3A\xa4}w \x889\
+x\xf4\xac\x9bQW\xd2\xfa|\x0a\xbaa:>\xd3T\
+\xef\xc5\xf5s\x0e\xed\x0bW\xab\x96\x8d\xea\xcd\xb5*\x1f\
+d>d\xa4g\x0c\x0dC\x0e:\xdf\x1e\x1bTe)\
+\x18\xba\x85i\x99\x19YaM\xf1]\x94\x84+\xc8G\
+\xe5\x1a\x1f\xc9\x11\xfb\x88g{\xb3Q\xc0\x8a\x10\xf6L\
+\xe0P\xb8SB\xea\xaa\xc7a\xe2\xea8>\x86?R\
+WFB4\xb3\x01U\x15\xe8\x86;\x07\xda\xb6\xc0\x81\
+\xdez\xccBU\xe3;\x91\xd2\x07iZ\xc6\x05\x0c\x08\
+W\x09\x1b-\xc8Ze\xb9\xcdf]I.+\xcd\x8a\
+:\xbb\xaf\x03\xee\x8c\xa0\xa9>\xc7z\x08\x81\x11\x13h\
+\x9a\xc7q\x90\xba\x15\x03q1\x8b\xe6J\xd5Q\xca\xf6\
+fmC\x92\xb3\xb5#%!\x08\x88\x9a\x11|j\xe6\
+<\x88m\x0b\x5c\x5cf\xaf\xe6qq\x06b\xb9A \
+\x16\xb9DG\xd6\xd9\xde\x5cJ\x87\x9bMrJo\xfb\
+\xfcqus\xae\xfb\xbc\x8b\xca\xf29\xd6\x13\x02b1\
+I\x9e\xe6u\xce\x00\xc4\x82\x17\xd3\xfe\xd2\x0d\xd9\x97\xfe\
+\x0cG\xb6wH\x81a\xee\x88\x929C\xa88\x98\xae\
+\xfc\x02\x15EQ\xe8\xea\x09R]>\xd5Qe\x09\xe9\
+\x10\xb4I\xe2\xa9\x91|g\x1b\xd3\x1b\xed\x8e\xef\xd8\x12\
+\x02\xb7\x89A%\x8b\x94\x9e\xcc\xf1\x14\xee\x90\x92\x8b9\
+\x9d\x0f\x11\xd99\x0c\xfe\xfc\xb8\xbb\xda\xda\xd96\x88\x1d\
+\xf1f\x1am#\xfe\x8e\xc2\xbc\x80\x0bA:\x93\xe2S\
+qEJ+\xd70j\xb9\xacl\xa0p\x5c\x9c \xc7\
+[[\x5c\xcbT\x17\xcf\xe2H\xc7G))\xf8p(\
+\x1e\x10V\x8f\x9f\xe2X\xa7-\xd4\x92#\xe41\xba\xb9\
+,\xb7U\x11\x97=\x9a4\x9d\x9d\x0e%\xe5\x1aH\xc9\
+\xfe\xa3\x07\x5c\x9b\x99Q2\x9f\xa6\xf6\x0fRTL\x7f\
+\xc8\x02)\x19_R\xeaX\xe7l\xdf\x09\xdb\x068\x8e\
+'\xcbM\xa5r\x98V\x9ddm\xd4s\x16\x8b\x08\x01\
+\x8ab_\x82\xf8.\xdc\xf4Oi\xb9\x06\x8a\xc2\xa1\x13\
+\xcd\xae\x1c\xf4\xb9\xaa\xe5X\xd2L\xa9\x17\xec4@Q\
+X8k\x81\xe38N\x06\x9b\xe2\x04T\x04\xc2a\xb5\
+\x8b\xa6\xe6\xa1\xc8\xe4\x16\x9d\xfb7\x12i\x93AmH\
+2\x05Gb\xa1\x9c\xd7'\x982\xcd\xc7\xc1\xa3\xcd\x1c\
+=\xdb\x9c\xd1a)%\x13\x0a\xab\xa9,\x9c\x9a\x82\xf0\
+\xf3\xad1,\xcb\xa2\xae\xf6s\x19\x03n\x09\x1e\xe6|\
+\xe8T\xdc\xadV\x04\xb1hf\x02rBA\x15\xba\x15\
+E7tN\x9f\xee\xa37\xe8\x9c\x13\x93\x96\xcc\xe9B\
+\xb9\xac%\xc4-\x1e\xb9\xa2U'\xe9\x04r\x98\x903\
+\x0dX\xb0(\x80G\xd5\xf8\xbb\xff\xf3\xb8+G\xdd2\
+\xf5.L\xcbDQ\x05\xbdA\x83\xa3\xcd\xbd,\xbdq\
+\x11\xb5\xd3k3\xea\xbc\xd6\xf8\x1b<\x8a\x06\x12\xbc>\
+\x85H4\x13\xd9\xaa\xe2\xe1?\xd7=\xcb\xd4\xe8\xdd\xac\
+\xb9\xfeg\xac\xff\xebg\x1d\xfb7\x1c\xabN\xb2\xb6!\
+\x09$\xe6&\xdb\xeb\xb0:]8\xc7\x02\xf9\x85*S\
+\xa7\x17\xb0m\xdf{\x1cm=J\xcd\xa4\x9a\x8crw\
+\xd4\xac\xa4\xab\xff,\xbf\xdd\xf9\x02;\xdf\xe8\xe3\xcbu\
+\xb7\xf3\xcc\x7f\xf8_\x19\xe5Nt\x1f\xa2\xa9s\x9f\xbd\
+\xce\xb7\xb8\xd4CO\xb7A\xd3\xe9&fM\x99\x952\
+\xcei\xa5\xb3Y\xf7\xb5\xd9\x00\x9c\xeai\x1a$\xa0\x1f\
+\xfe\x94\x922\x98w\x95+\x09\x89\x13E\x5c\xdcV\xe0\
+p\xd9\x8b\x12n(\x04\x09?\xfb\xedS\xae\xb6\xe4\xfe\
+\xf9\xff\x89\x8d_{\x9d\xc3\xcf\xedd\xf3\x0f\x7f\x8dO\
+\xf3e8\x0co\x1c}!\xe5}Sk\xf2@\xc2?\
+\xed|mP[)P\x1c\xfb\x97Xu2\xe2\xeb\xb2\
+F\xc3\xe5M\x86\xf2J\x8d\x1bn\x19\xc7+\xdb\xff\xcc\
+\xaf\xfe\xb4)\x13a\x17\xbeW\x8f\xafbRIU\xc6\
+\x80\x04\x82W\x0e\xfd\x82\x03m\xef\xa6\xdc\x9fT\xed\xe3\
+\xc6\xc5\xe3x\xea\xa5g\xf8\xf5\x96\xe7\x1cm\xd4\xbb-\
+\x7f\xe0\xf9\x0f\x1f\xcd\xc6Q\xcc\x99\xdb\x9bU\xfa=\x97\
+\xfbC\x86\xec\x0e\x9a\x92\x9a\xb9~\x06\x06\x8a\xf9/\x9b\
+\xfe;\x05\xbe\x00\xff\xee\xb6\xfb]\x83\xbad\xc4\x1a\x96\
+\xce\x96\xe6\x7f`\xdb\xf1\xdf\xc5mG\xca\x98$3f\
+\xfb\x99>\xd3\xcf\x96\x8f\x7f\xc1\x9f6n\xe4\xf3so\
+\xa4\xbc\xa8\x9c\x96\xee\xc3\x9c\xedk\xc1\xa3x\xf0(^\
+g\xd54L3\x86#\x1e\x87\x88\xcb\xb09R\xc2\xdc\
+\xeb\xf3\x99\x5c\xed\xe3\xd1\x17\x1f\xe7\xb7o\xfc\x0b\xcf\xae\
+{\x8a\x89\xa5\x93\x5c\xeb\xedo}\x9b\xd7\x9b\x9f\xe5l\
+\xa8%\x83\x18\xc9\xed\x0a\x05\xa6T\x15\x02\x92\x93\xe1\x83\
+\x9c\x0cK\x04\xf19\xf7\xc1l\x845B\xabN\x94l\
+\xf3-#\xb9?$\x81\xc0\xe22\x0f\x7f\xfd\xb52*\
+\xae;\xc3\xc2\x87?\xcf\xb2uw\xd3\xdau\xd6\xb1\xfc\
+\xef\x0e>\xc1\xb9\xf0\xc9!\xec\xa0\x12\x17\xd6a\xa9\x17\
+\xed\xdb\x10\x82\xdb+\xc5\x99[\xc4~\xc9\x19C\xd34\
+\x87\x1c\xfe\xa7\xa4\xbf\x0d#e\xbf\xbdi\x19\x08K\xb8\
+\xe7\x8bdj\xe6\xc80\xa1\xb0\x04f\xce.f\xf7\x9e\
+\x8fxc\xef6\xbeyG\xe6\x89w\x9f\xa9X\xc4\xfb\
+\xa7^\xbfD\xe6If\x9d\xaa\x92i7#\xfd\x11\xfa\
+\xfb\x8d\xdcyS\x8a\x92\xbd\xca\xb2,\x0b]\xd7\x09\x87\
+\xc3W,\xa6Q\xdd@X\xa9\xf3\x13\xf22\xdc\xc7\x92\
+\xf1`\x18\x06\xef5\xec\xe5\x9bw\xac\x8c\xa7\xde\x93\x14\
+\xe2\x8aO\x7f\x93\xe6\x8e\x0f\xe8\x8b\x061\xa4\x8e1\xc8\
+*\x95ltk\xfa\x84V\xb4\xdf\xc00rG\x10\xc3\
+0\x18\x18\x18\xc88\xb5\xcfQ\xbec\xb1\x18\xb1X,\
+g6$\xd9\xedM\xec\xeb\x1b\xea5\xb1\xca\x87\xd7\xab\
+\xf0\xcf\x17\xdc\xd6t\x8e\x1e_0\x85\xbf\xbb\xf5\xb7\xfc\
+\xd7%\xbf\xe3\xceO\xaf\xc6\xb0bC{G\xc6*}\
+q1\x1eS\xa0\xaf-w\xc4\x18r\x1cb\x9afN\
+\xf7\x87\xe4*?y\xcb\xed\xc5\xb4w\xf5\xf1\xf7/l\
+p\xd4\xf9^O\x1e%\xf9\x15\x14\xfa\x8as\xb6\x8dY\
+Q\x05g\x0fE1BfN\xe3\x10\xb7\x88]\x19.\
+cn\x1b\xaf\x1c\x05\xb7\x96%\x99T\xed\xa3\xf6\xb3%\
+\xfc\x8f\xcd\x9bxk\xff\xf6\xac\xed\xd8\x151\x82\x80\xc3\
+/\xf6\xa2xs\x8b\x97\xcb\xf2\xb2\xae&HH\xc4\xe7\
+\x97\x141wA\x80o<\xb6\x9a\x97w\xbdD{\xef\
+yB\x03\xbd\xe8f\x94\xa8\x11!\xa2\x87\xe9\x8f\xf5r\
+\xa5\x9c\x90`\xa6\x13o\xf7\x13\x0b\x9a#6N\x8f{\
+\xfeI\xe4&w\x93c\x0e\xb6,XxK\x80y\x0b\
+\x0b\xf8}\xf3c\xfc\xf9\xf4FJ\x03%\xf8}~L\
+\xcb$fF\x08\xc7z\xd1\x14\xef\x15\xbdG\xf3+\x9c\
+\xd8\xd5\xcf\x91\x7f\x09\x0dK\x0e\xcb\x0d\xbf\x1e\xaeA\x90\
+\x16h^\x85\x12o\x1e\x10%\x18k#\x18\xbb\xccD\
+\xe0\x85UIR\x82\x11\x95\x981\x0b#\x229\xb6\xbd\
+\x9f3;\x22\xa8\x9a\x18V\x89w:\xb7wx%\xe4\
+jR{\x0a\x085n\xa8\x0dC\xd2sF\xa7\xb7\xc5\
+\xa0\xe7\xb4N\xff\x19\x13\xbd_\xa2\xf7[\xc4\xfa,\xa4\
+\x89M\x8c\xe1\xc2Cb\x0d\xf55/!\xd9\xc6\x13f\
+L\xdaW4d\x11<e\xd0sL\xa7\xfbc\x9d\xc8\
+\x19#\xcetJ\x9cP\xe9\xd6T\x0c\xb3u\x1d5\x09\
+\x91b\xf8\xce\x98\xb49^\x11\x98R\xd2{\xd6\xa0\xaf\
+\xc5\xa0\xe7\x8cA\xf8\xb4A,,1\xc2\x16\xb1~\x89\
+\x19\x89\xaf\xe1J\xa8(O\xde\xe8\xfb3Y\xdb\x90\x5c\
+\x8ah~\x97B\xa4\xd8\xe2\xb2\xd7\x9e's\xbc.\xb1\
+b\x12S\x97\xc4\xfa%\xc1\xd3:\xbd\xc7\x0c\xba>\xd6\
+\xe9?i\xc6\xc39\x9b\xe3EJ\xf4\xa8\x5ce\xba\xc0\
+\x8d\xe9=C\xa5\xe0Pa\xdcy\x15\x8f.\xe8\xad0\
+\x11Rd\xc5\xf1B\x11H$\xbd\xe7MB\x1f'8\
+\xde$\xd6g\xd9\x1co\xf4K{\xa9\x95\x10\xe0\xf1\x89\
+\x1c\xe4\x9aG\x1f\x5c\x93\x8b\xb9[u\x02\x05\xdd\xf1\xb3\
+\xdcCe\x16\xc9{*-#\xae\xdf-]\xa2\x0fH\
+zZ\x8d8\xc7\x9f\xd4\x09\xb7\x98`\xe2\xaa\xe3\x15\x95\
+k\x1e\xb2^(\xe7fp\xae\x84(\x85\xdd*\xaa.\
+h\xffK\x8cp\x9bI\xf8\x94I\xb4\xcfB\x0fI\xf4\
+\xb0\x85\x1e\x96q[\xa3\xc49^\xf5\x88O\xa2\xcb\x91\
+\xa1\xb2\xb2\xf6\xb2r\xed\xeaI\x01\xfe\x90\xca\xa1_\x87\
+>\xb1\x1c\x9f\x0b\xc3>\xb2q\x88\x00E\x13\x8c\x81{\
+\xa4\xae\x8c\xa1\xe6\x1a0\xea9\xb7!cpen\xaf\
+\xc8r\x8b\x17\x80\xaa\xaah\x9a\x86eY\xf6to.\
+7Z^m^P.\xeb\x0d)\xb9\xe8\xa6\xe3,\xcb\
+b``\x80;\xef\xbc\x93;\xef\xbc\x93\xf1\xe3\xc7\x13\
+\x08\x04\x88\xc5b\x04\x83Av\xef\xde\xcd\xee\xdd\xbb\xd1\
+4-\xc5\x8bp\xfa\x9b\xed\xb3\xa1\x96K\xf43\x19A\
+n\xe5\xae\xf4]N\x7f\x13S\xe0\xb1X\xcc\x959\xdd\
+\xee{\xb2Ix%\xc3g?\xfbY~\xf9\xcb_R\
+\x96v&I\x22v\xb9\xf5\xd6[\xe9\xed\xed\xe5\xe9\xa7\
+\x9f\xe6\xe8\xd1\xa3\x19\x03O\xb4\x9d>[\x96>\xd8\xc1\
+\xbeg[n\xb0\xff\xdd\xbe[\x96\x95r\x88\xdb`\xfd\
+u\xeb\x97\xc7\xe3\xc1\xeb\xf5\xe2\xf7\xfb\xe9\xef\xef\xb7g\
+`\xb3\x91$\xe5R\xfa-q\x19\x86\xc1\x8f~\xf4#\
+^z\xe9%\x9b\x18\xe9\xcbE\x13\x10\x08\x04X\xb7n\
+\x1d_\xff\xfa\xd7]\x17\x06\xe4\xe7\xe7SWWG\xe2\
+\x07-\xaf\xc6 -]3\xdcz\xeb\xad\x8c\x1f?>\
++5$\xa5DQ\x14\x0a\x0a\x0a\xc8\xcb\xcbs\x9d\xcb\
+\x1f\xb2\x97\x95\xa8\xf4\xfd\xef\x7f\x9fU\xabV\xd9\x1d\xaf\
+\xaf\xafg\xf5\xea\xd5l\xdd\xba\xd5.k\x18\x06?\xff\
+\xf9\xcfY\xb3f\x0d\x07\x0e\x1c\xe0\x8e;\xee\xe0\x9e{\
+\xeeq\x1c\xec\x8a\x15+\xf8\xcew\xbe\xc3M7\xdd4\
+\xea\x84P\x14\x85i\xd3\xa6\x0dZn\xee\xdc\xb9l\xd8\
+\xb0\x81\x87\x1ezh\xc8\xf6\xc1\xe7\xf3\xe1\xf3\xf9.\xcf\
+\xcb\xbax\x02\xb4\xb0\x7f l\xce\x9c9|\xef{\xdf\
+Ky\xd1\xb9s\xe7\xf0\xf9|L\x992\xc5\xae\xf7\xf4\
+\xd3O\xd3\xd8\xd8\xc8\xda\xb5k\x997/~2\xdc=\
+\xf7\xdc\xc3\xfe\xfd\xfbiiiI\xe9\xe4\xce\x9d;\x89\
+F\xa3\x1c<xpT\x09\x12\x8dFy\xe8\xa1\x87\xb8\
+\xf9\xe6\x9by\xe0\x81\x07\x5c\xcb\x1d?~\x9c'\x9f|\
+\x92\x03\x07\x0e\x5cV\xe0\xe7\xf3\xf90\x0c\xc3y\x01\xfa\
+P$\xc40\x0c6m\xda\x94q\xff\xdc\xb9sH)\
+\xa9\xac\xacDJ\xc9\x0b/\xbc@SS\x13\xabW\xaf\
+f\xde\xbcy)R\xb1v\xed\xda\x94\x05w~\xbf\x9f\
+P(\xc4[o\xbdE8\x1cv|\xaf\xa6ih\x9a\
+\x86\x94\x92\xbc\xbc<\x02\x81\x00\xf9\xf9\xf9Y\x9e\xb1\x1b\
+\x7fG \x10\xa0\xa0\xa0\xc0\x9d\x1b=\x1e\xaa\xab\xabY\
+\xb9r%\xcd\xcd\xcd\xe4\xe7\xe7\xe3\xf7g\xee\x91\xf7\xf9\
+|x\xbd^\xb6l\xd9\xc2\xf1\xe3\xc7\x07\x956UU\
+),,d\xdc\xb8q\x14\x16\x16\xda*Y\x08\xe1\xd8\
+vVF=\xf9Z\xb4h\x11\x13&L\xc8H8\xb6\
+\xb5\xb5!\x84\xa0\xa2\xa2\x82\x17_|\x917\xdf|\x93\
+\x07\x1ex\x80\xba\xba\xba\x0c]ZRR\xc2\xdc\xb9s\
+inn\xa6\xa4\xa4\x84\xa7\x9ez\xca&\xc4\xb7\xbf\xfd\
+mG;r\xef\xbd\xf7\xe2\xf1x\xe8\xea\xea\xe2\xab_\
+\xfd*~\xbf\x9fH$\xc2\x9bo\xbe\xc9\xb3\xcf>;\
+(\x92\x1f~\xf8an\xb9\xe5\x16,\xcb\xc2\xe3\xf1\xb0\
+g\xcf\x1e\x1e}4uU{,\x16\xe3\xc1\x07\x1f\xe4\
+\xde{\xef\xb5U\xe8\xb2e\xcb\xa8\xaf\xaf\xe7\x87?\xfc\
+\xa1].\x12\x89\xb0q\xe3Fjjj\x88F\xa3\xfc\
+\xf8\xc7?f\xff\xfe\xfd\x19\xef\xd5u\x9d\xeb\xae\xbb\x8e\
+G\x1ey\x84\xda\xdaZ,\xcbBUU6l\xd8\xc0\
+\x1f\xff\xf8G\x9bX\xaa\xaa\xda\x8e\xc3eIHB\xc7\
+'W\x94R\xd2\xda\xdaJuu5;v\xec`\xfb\
+\xf6\xed\xdcw\xdf},^\xbc8s{\xc0\x85z\xb3\
+g\xc77\xc4tww\xb3j\xd5*\xf2\xf3\xf3\xe9\xec\
+\xect\xfd\xbd\xdd\xea\xeaj\x96,Y\xc2\xf2\xe5\xcby\
+\xf0\xc1\x07Y\xbe|9g\xce\x9c\xe1\xae\xbb\xee\xc2\xe3\
+\xf1\xb8z-k\xd7\xae\xe5\xb6\xdbnc\xe3\xc6\x8d|\
+\xe5+_a\xf3\xe6\xcd\xd4\xd5\xd5\xb1dI\xea\xd1\xb3\
+^\xaf\x97M\x9b6\xb1y\xf3f\x00\xd6\xad[\xc7\xd2\
+\xa5KY\xb7n]\x86\xa4=\xfc\xf0\xc3\xd4\xd7\xd7S\
+\x5c\x5c\xcc\xd9\xb3\xcek\x8bg\xcf\x9e\xcd\xf3\xcf?O\
+QQ\x11+V\xac\xa0\xb6\xb6\x96e\xcb\x96\xd9*.\
+\x81\x87K91\x97\xf4\xb2&L\x98\x90\xf1<\x18\x0c\
+\xd2\xd7\xd7\xc7\xc0\xc0\x00\x9b7of\xd9\xb2e\xdcu\
+\xd7]\x83\xfa\xd7%%%6\xd2JKKQU\x95\
+\x8f>\xfa\xc8\xb5\x83\x93&M\xa2\xa0\xa0\x80\xf5\xeb\xd7\
+\x13\x0e\x87\xf1z\xbd\xec\xde\xbd\x1b\x80\xb2\xb2\xb2\x0c\x82\
+\x18\x86\xc1\x82\x05\x0bX\xbcx1\x7f\xf8\xc3\x1f\xd8\xb2\
+e\x0b>\x9f\xcfV1EEE\x8e\x04\xac\xae\xae\x06\
+\xe0\xe4\xc9\x93\x83\xaa\xa2\xa9S\xa7b\x9a\xa6c9)\
+%?\xf8\xc1\x0fl\xf5\xdc\xd9\xd9Iaa!]]\
+]\x9c8q\x22\x15\xe1\x8a2t/+\xb9\xe0\xb8q\
+\xe32\x9e\x1f:t(\xbe\xd1\xb2\xae\x8eh4:\xe8\
+\x82\xec\x04$t\xb9i\x9a\xd4\xd6\xc6\xf7\x03\x1e<x\
+0\x83 \x09DO\x9c8\x91\x96\x96\x16N\x9c8a\
+;\x17UUU\x00\xb4\xb7\xb7g\x1e2\xa3\xeb\xb6\xe3\
+\xf1\xcc3\xcfPXXH^^\x1e\xb7\xdf~;\x96\
+e\xd1\xd8\xd8\xe88\xce\xaa\xaa*,\xcb\xe2\xd4\xa9S\
+\x83\x06q\xd3\xa6M\xe3\xd0\xa1C\x19c\x95RRT\
+T\xc4\x8d7\xde\xc8\x87\x1f~Hss\xb3m\xe7\x14\
+E\xc9\xb0y\xc9\xef\xb8\xac\x19\xc3`0\x98q\xbf\xb1\
+\xb1\x11UUY\xbat)\x07\x0e\x1c`\xdb\xb6m,\
+]\xba\x94\xf2\xf2r\xd7\xb6B\xa1\x90M\x90\x84\x07\x96\
+\xdc\xf9tn\x04\xd8\xb1c\x07\x9a\xa6\xd9\xf5\xae\xbf\xfe\
+z\x82\xc1`J\xf0\x96\x80\xc9\x93'SQQA$\
+\x12\xe1'?\xf9\x09\x81@\x80\xea\xeaj\xda\xda\xda\xd8\
+\xb0a\x03\x0d\x0d\x0dx<\x9e\x8c\xd8b\xfa\xf4\xe94\
+66\xa2\xeb\xba\xfd\xae\xf42\x09)\xaa\xaf\xaf\xcf`\
+ \xc30X\xbe|9\x00/\xbd\xf4\x12\x89\xdf\xa5\x1f\
+L\xda\x06K-y.\x15$9\xe9\xcc\xc3\x87\x0fS\
+YY\x89\xaa\xaa,^\xbc\x98\xe6\xe6f\xde~\xfbm\
+\xee\xbb\xef>\xd7\x17vtt\xd8\x03\xbc\xee\xba\xeb\xe8\
+\xea\xea\xc24\xcd\x0c\xc4&\x10\x0f\xa4\xa8\xb4\xd2\xd2R\
+\xc6\x8d\x1bGCC\x83c6!\xc1\x0cg\xce\x9ca\
+\xd7\xae]ttt\xd0\xd0\xd0@0\x18\xc4\xe3\xf1d\
+\x10CJ\xc9\xc4\x89\xf13\x82\xf7\xec\xd9\x93\xf1<\xb9\
+?\x8b\x16-\x02`\xf7\xee\xdd\x19\x041M\x93\x193\
+f\x00p\xe2\xc4\x89Kz\x81\xc9{\x1b/+R\xaf\
+\xaf\xafOi(\x12\x89\x10\x0e\x87\xed\xc1\xdct\xd3M\
+\x04\x02\x01\xdey\xe7\x1d\x0c\xc3p\xdc\xbb\x97 bB\
+\xff\xe7\xe7\xe7\xd3\xda\xda\xea\x8a\x80\xf9\xf3\xe7\x03\xa4\xa8\
+\x91\xc9\x93'\xdb\x08\x1fl\xa0G\x8e\x1c\xe1\xb5\xd7^\
+\xe3\xbd\xf7\xde#\x1c\x0e;r}\xfa{\xf6\xec\xd9\xe3\
+j\xcb\x0c\xc3\xb0\x1d\x9b\xa6\xa6\xa6\x8crB\x08\xa2\xd1\
+\xa8\xad6]O\xbeKK\xcd\xb8\xd9[\xe5R\xe9\xf7\
+}\xfb\xf6q\xe4\xc8\x11\xfb^\xc2\xddM6\xf6\xabV\
+\xad\x22\x18\x0c\xf2\xfb\xdf\xff\xde\xb1\xad\xd3\xa7O\xd3\xd4\
+\xd4d\x1bk7\xc9K\xc0\x9c9sl\x82%\xde\x9b\
+\x08@\xdd\x08r\xfe\xfcy[\x05y\xbd^T5~\
+\xbaPyy9\x85\x85\x85\x99\x87\xd6\x98&s\xe7\xce\
+MA\xb4\xdb\x8f4/X\xb0\x80\xd6\xd6V\xc7\xd5\xfc\
+\xaa\xaa\xda\xc1\xed\x97\xbe\xf4%;o\xa5i\x1a\xaa\xaa\
+\xa6HD\xe2\xd9`F\xfd\x923\x86~\xbf\x9f\xef~\
+\xf7\xbbl\xdd\xba\x15UU9u\xea\x14\x91H\x84\x8a\
+\x8a\x0a\xbb\xc3\xb5\xb5\xb5L\x9f>\x9d\xad[\xb7\xb2d\
+\xc9\x12*++St\xf0\x13O<a\xeb\xd6\x04b\
+\xdd\x082i\xd2$TU\xa5\xad-\xf5T\xa0\x84A\
+w#H{{;\xcf=\xf7\x1c\xdf\xfa\xd6\xb7x\xfc\
+\xf1\xc79s\xe6\x0c\xe5\xe5\xe5\xcc\x9e=\x9b5k\xd6\
+dr\xa2\xa2\xd8\x1e\xd8O\x7f\xfaS\x0c\xc3\xe0\xf5\xd7\
+_g\xe7\xce\x9d)\xeak\xca\x94)\xf8|>N\x9f\
+>\xed\x1a\xf7\xbc\xf1\xc6\x1b|\xe3\x1b\xdf`\xcd\x9a5\
+\xcc\x981\x83H$\xc2\xc2\x85\x0bY\xbf~=\xbbv\
+\xed\xb2\xddt]\xd7m\x95\xe6F\x10\x15\xb8A\xd3\xb4\
+\xea\xbc\xbc\xbc\xdaDG\xa7M\x9b\xc6\xc0\xc0\x00==\
+\xf1\xdf\xb1\x0d\x87\xc3tvvRWWGii)\
+_\xf8\xc2\x17\x985k\x96\x9db\x07X\xb8p!u\
+uu\x04\x02\x01;o#\xa5\xe4\xf9\xe7\x9f\xa7\xb1\xb1\
+\xd1.WTTD__\x1f\xf5\xf5\xf5\xf4\xf6\xf6f\
+t(\x10\x08 \xa5\xa4\xbe\xbe>\x05\xf9\xa5\xa5\xa5t\
+tt\xf0\xee\xbb\xef\xda*\x22\x9dS\x0f\x1d:\xc4\xbe\
+}\xfb(++#\x10\x08\xd0\xd0\xd0\xc0c\x8f=F\
+___f\x00\xa6(466\xd2\xd7\xd7GUU\
+\x15g\xcf\x9ee\xfb\xf6\xed\x0c\x0c\x0c\xa4\x94M\xb8\xcb\
+;v\xec\xa0\xa5\xa5\xc5\xd5\xf9y\xe5\x95W\x08\x87\xc3\
+L\x980\x81h4\xca\xaf~\xf5+\xf6\xee\xddkK\
+\x89\xae\xeb)R\xaai\x1a\xa5\xa5\xa5\x04\x83A\xba\xbb\
+\xbb/\xb6\x05<\xe8\xf7\xfb\xbfP\x5c\x5c\xbc2A\xf1\
+/~\xf1\x8b\x04\x83\xc1\x14\x9f\xdb0\x0c\xee\xbe\xfbn\
+\xd6\xaf_\x9fu\xd2\xee7\xbf\xf9\x0d;v\xec\xb0;\
+%\xa5\xc40\x0cL\xd3LQ\x11\xc9il\xd34m\
+NJ\xae\xa7\xeb\xba\x1dy;\xa5\xc7\x93\xf7D&r\
+FB\x08\x9b\xdb\xdd\xd2\xed\xb1X\xcc\xb6}\x89TM\
+r\xfb\x96e\x11\x8b\xc5R\xfa\xe3\x96~\x8f\xc5b)\
+\xefM\xd8\x1b]\xd7m\x07&9\xdb]SS\xc3\xf1\
+\xe3\xc7S\xd21\x9elS\xd2\x1e\x8f\x87W_}\x95\
+\xfa\xfaz6n\xdc\xc8\xf4\xe9\xd3\x1d\x0d\xa1eY\xb4\
+\xb6\xb6\xf2\xe4\x93O\xd2\xd9\xd9\x99Q&\x91>p\xdd\
+\xb0\xa2(x\xbd\x99\x07\x95\xa5#\xd65\xd2M\xaa\x9f\
+\xcd\xc9x\x9a\xa6\xa5D\xfeN\x99\x06\x9f\xcf\x97\xd5\xae\
+\xe2d\x977y\xa2j('\xf4\x0di\xc6P\x08\xc1\
+\xd9\xb3g\xf9\xf2\x97\xbfLmm-\xb5\xb5\xb5L\x9a\
+4\x89\x8a\x8a\x0aB\xa1\x10\xed\xed\xed\x1c;v\x8cc\
+\xc7\x8e9\xba\x99\x83\xcd\xd49\xfd\xbd\xd4\x0c\xa3[\xbb\
+C\xbd\x7f\xb9\xe5.5\xbb\xe84Wt\xd9\x04qk\
+(\xc1\xe1\xcd\xcd\xcd\xb6\xe7\x94\xf33\xb6>\x01\x0b\x18\
+.\x85\x8f!M\xe1f\xbb.k\x8c\x00WN\xb8!\
+g{\xc7`x\xa5h\xc8q\xc8\x18\x8c,Q\xc6$\
+dLB\xc6`LB\xae!O\xccUB\xc6\x8d\x1b\
+\xc7\xacY\xb3\xc607L\x90\x989tTY\xe9\x01\
+\x8fS\xaeh\x0cr\x0b\x96e\x11\x8dF3\x16\x12z\
+\x00K\x88\x8b\xfbd\x0d\xc3`\xdb\xb6mc\x18\x1b\xa5\
+X\xc4\x03\xe8@,]\x9c\xc6`\x94T\x19\x10\x16B\
+\x0c\x8cyT\xa3\x0fR\xc6w\x16/\x05&j\x9aV\
+!\xa5\xf4p-\xee%\xbev\xc0\x14B\xc4\x80^E\
+Q:TU=\xa7iZP\xd3\xb4\x88\xc7\xe31\x00\
+\xf9\xff\x01\xfa\x90K\xa0\xc0O~5\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x03|\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00d\x00\x00\x00d\x08\x06\x00\x00\x00p\xe2\x95T\
+\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\
+\x00\x00\x09pHYs\x00\x00\x0e\xc4\x00\x00\x0e\xc4\x01\
+\x95+\x0e\x1b\x00\x00\x00\x07tIME\x07\xd9\x03\x03\
+\x0e\x1c\x0e\xa7\xa1o)\x00\x00\x02\xfcIDATx\
+\xda\xed\xd6\xbfo\x1cE\x18\xc6\xf1\xef\xcc\xed\xda\xb1\x0f\
+\x9b\x93\x85\x90-\xb08\x12\x09wn\xac\x14n\x10\xe0\
+\x8b\x90K7\x14\xc8\x7f\x03\xfc\x01T'QB\x81(\
+\xdd\xd0\x906m0\x8ep*DD\x94 \x17\xc8\x0e\
+\x06d\x90\xec\xe4\x02\xde\xf3\xde\x9e\xf7\xd7\xecP\x1c9\
+\x892R\xaeX\xf1|\xa4\xedv\xa4\x9d}\xe7y\xdf\
+\x01\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
+\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\x11\
+\x11y1L\x9d>vqq\xf1\x13cL\xf8\x9c\xcb\
+\xa6\x80\xcfNOO\xffVA^\xb0\xf5\xf5u\xdfn\
+\xb7\xf1\xdeSQQ\xbe\xf9\x94\x97\xaeLS>\x99\xc6\
+\x9d\xcd\x8c^\xb2`\xac\x1f\xef,\x8ec\xf6\xf6\xf6V\
+\xb2,;\xaa\xc3\x1e\x83\xbaE:MS\x0cp?\xff\
+\x85\xce\xf5\x19\x1a\xe1\x05\x99\xbb\xa4\x19^\x81$\xa0<\
+\x9f\x22\xfbu\x86\xe1\xe1,\x00eYb\x8c\xf1u\xd9\
+\x9f\xadS1\xaa\xaa\x22\xcfs\xf2\xbc\xc0Sa\x8d\xe1\
+\xaay\x9f\xcf;wx\xe7\xf5\x0f\x98\xe7\x1a\x8bW[\
+\xd8W2\x8a\xa2\xa0(\x0a\x9cs\xb5:p\xb5J\x88\
+s\x8e<\xcf\xc1\x8f&\xc3`\x90\xf2\xe1{\x1f\xf3\xd1\
+\xad\x1b|\xbd\xfd\x90w_;\xe3$}\xc0\x17\xf7?\
+%\xcfs\xbc\xf7\xcf\x12\xa2\x82L\x82\xf7\x9e,\xcb0\
+\x18\x98\x82\xe1\xc01\xd7l\x92W)\x00\x87\x7f\x1e\xf2\
+cr\x0b\xe3-Y\x96\x8dS\xa5\x82L\xb8e\x19\x00\
+\x0fs\xf3S\x0c\x86C\xa6\x1b\xa3yQ\xe1)]\x81\
+\xf7\x8c\x92\xf4\xec\xe6R\xa3\x82\xd8:&$\xcbr*\
+</\xcf7\xb9\xfd\xf3M\xba7n\xf2\xe0\xf4.\xf7\
+\xfe\xf8\x96\xb7\xdf\xd8\xa2(\xf3\x7f\xdf\xcb\xd4\xb2&\xa9\
+(\x0a\xe28\xc6\x1aK2Wq\x995\xf9\xc1}E\
+uo\x8eW\xafe\x1c\x97\xdf\xf0\xfbO{D\x8f\x13\
+\xce\xcf\x13\xbc\xf7\xcc\xce\xceb\xadUA&\x16ik\
+1\x18L\x05\x8diC\xc3\x86|\xf7\xdb\x97\x5c\xdc1\
+<y\x94\x90\xfe\xe5H\x1e;\x8c1\xb5JFm\x0b\
+\xe2\x9ccaa\x81\xf0l\xc8\xf7\xdd\x0b.\x9fV\x18\
+\x03\xc6\x8e\x1eo\x0cA\x10\x8cgN\x9d\xd2Q\xcb[\
+V\xb7\xdbecc\x83\xfd\xfd}\x0e\x0e\x0e\xe8\xf5z\
+\x94eIUUDQD\xab\xd5\x22I\x12z\xbd\x1e\
+\x8dF\x83~\xbf\x8f\xf7\xbe>\x1d\xa0n3\xa4\xddn\
+srr\xc2\xe6\xe6&Q\x14\xb1\xb4\xb4\xc4\xda\xda\x1a\
+\xdb\xdb\xdbx\xefi\xb5Z\xac\xac\xac\xd0\xe9t(\xcb\
+\x920\x0ck\x95\x90Z5\xd9\xd5\xd5U\xbf\xbc\xbc\xcc\
+\xd6\xd6\x16\xbb\xbb\xbb\xa3\x01o\xed\xf8\xc7GQD\x18\
+\x86x\xefI\xd3\x14\xe7\x1c\xce9\x8e\x8e\x8e\xde\x1a\x0c\
+\x06\x8f\xd4\xb2&\xa0\xdf\xef\xb3\xb3\xb33\x9e\x13\xff9\
+]\xc6P\x14\xc5hcA@\x10\x04\x14E\xa1k\xef\
+\xa4\x1c\x1f\x1f?\x04\xca\xe7Y\x13\x86\xe1L\xb3\xd9L\
+\xe38FDDDDDDDDDDDDD\
+DDDDDDDDDDDDDDDD\
+DDD\xfeO\xfe\x01\xd1\xc0Q%\xbd%\x7f`\x00\
+\x00\x00\x00IEND\xaeB`\x82\
"
qt_resource_name = b"\
@@ -6047,22 +6047,14 @@ qt_resource_name = b"\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
-\x00\x0b\
-\x08R\xaa\xc7\
-\x00f\
-\x00i\x00g\x00u\x00r\x00e\x008\x00.\x00p\x00n\x00g\
\x00\x0a\
\x0bSG\xc7\
\x00r\
\x00a\x00n\x00d\x00o\x00m\x00.\x00p\x00n\x00g\
\x00\x0b\
-\x0a\x12^\xc7\
-\x00k\
-\x00i\x00n\x00e\x00t\x00i\x00c\x00.\x00p\x00n\x00g\
-\x00\x0c\
-\x05\x8f\xe2\xc7\
-\x00c\
-\x00e\x00n\x00t\x00e\x00r\x00e\x00d\x00.\x00p\x00n\x00g\
+\x08R\xaa\xc7\
+\x00f\
+\x00i\x00g\x00u\x00r\x00e\x008\x00.\x00p\x00n\x00g\
\x00\x14\
\x00\x22\x00G\
\x00T\
@@ -6076,6 +6068,14 @@ qt_resource_name = b"\
\x00(X'\
\x00t\
\x00i\x00l\x00e\x00.\x00p\x00n\x00g\
+\x00\x0b\
+\x0a\x12^\xc7\
+\x00k\
+\x00i\x00n\x00e\x00t\x00i\x00c\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x05\x8f\xe2\xc7\
+\x00c\
+\x00e\x00n\x00t\x00e\x00r\x00e\x00d\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -6083,20 +6083,20 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x82\x00\x00\x00\x00\x00\x01\x00\x00\x8f_\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00\xcc\x00\x00\x00\x00\x00\x01\x00\x018M\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00d\x00\x00\x00\x00\x00\x01\x00\x00\x8b\xdf\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00\xb0\x00\x00\x00\x00\x00\x01\x00\x01\x0e:\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x99\
\x00\x00\x00H\x00\x00\x00\x00\x00\x01\x00\x00qc\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00.\x00\x00\x00\x00\x00\x01\x00\x006\xe6\
-\x00\x00\x01e\xaf\x16\xd2\x99\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00\x92\x00\x00\x00\x00\x00\x01\x00\x01\x1aQ\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00\xc4\x00\x00\x00\x00\x00\x01\x00\x01t\xa2\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00v\x00\x00\x00\x00\x00\x01\x00\x00\xf0>\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00,\x00\x00\x00\x00\x00\x01\x00\x00:}\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x01\x00\x01Z&\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01z\xe7\xee'\x01\
"
def qInitResources():
diff --git a/examples/widgets/animation/animatedtiles/doc/animatedtiles.png b/examples/widgets/animation/animatedtiles/doc/animatedtiles.png
new file mode 100644
index 000000000..95a05fb06
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/doc/animatedtiles.png
Binary files differ
diff --git a/examples/widgets/animation/animatedtiles/doc/animatedtiles.rst b/examples/widgets/animation/animatedtiles/doc/animatedtiles.rst
new file mode 100644
index 000000000..083fee071
--- /dev/null
+++ b/examples/widgets/animation/animatedtiles/doc/animatedtiles.rst
@@ -0,0 +1,8 @@
+Animated Tiles Example
+======================
+
+The Animated Tiles example animates items in a graphics scene.
+
+.. image:: animatedtiles.png
+ :width: 400
+ :alt: Animated Tiles Screenshot
diff --git a/examples/widgets/animation/appchooser/appchooser.py b/examples/widgets/animation/appchooser/appchooser.py
index 74e9f1c02..610050210 100644
--- a/examples/widgets/animation/appchooser/appchooser.py
+++ b/examples/widgets/animation/appchooser/appchooser.py
@@ -1,61 +1,30 @@
+# Copyright (C) 2010 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2010 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import appchooser_rc
-
-
-class Pixmap(QtWidgets.QGraphicsWidget):
- clicked = QtCore.Signal()
+import sys
+
+from PySide6.QtCore import (QPointF, QPropertyAnimation, QRect, QRectF, Qt,
+ Signal)
+from PySide6.QtGui import QPixmap
+from PySide6.QtWidgets import (QApplication, QGraphicsScene, QGraphicsView,
+ QGraphicsWidget)
+from PySide6.QtStateMachine import QState, QStateMachine
+
+import appchooser_rc # noqa: F401
+
+
+class Pixmap(QGraphicsWidget):
+ clicked = Signal()
def __init__(self, pix, parent=None):
- super(Pixmap, self).__init__(parent)
+ super().__init__(parent)
- self.orig = QtGui.QPixmap(pix)
- self.p = QtGui.QPixmap(pix)
+ self.orig = QPixmap(pix)
+ self.p = QPixmap(pix)
def paint(self, painter, option, widget):
- painter.drawPixmap(QtCore.QPointF(), self.p)
+ painter.drawPixmap(QPointF(), self.p)
def mousePressEvent(self, ev):
self.clicked.emit()
@@ -66,63 +35,60 @@ class Pixmap(QtWidgets.QGraphicsWidget):
if rect.size().width() > self.orig.size().width():
self.p = self.orig.scaled(rect.size().toSize())
else:
- self.p = QtGui.QPixmap(self.orig)
+ self.p = QPixmap(self.orig)
-def createStates(objects, selectedRect, parent):
+def create_states(objects, selectedRect, parent):
for obj in objects:
- state = QtCore.QState(parent)
+ state = QState(parent)
state.assignProperty(obj, 'geometry', selectedRect)
parent.addTransition(obj.clicked, state)
-def createAnimations(objects, machine):
+def create_animations(objects, machine):
for obj in objects:
- animation = QtCore.QPropertyAnimation(obj, b'geometry', obj)
+ animation = QPropertyAnimation(obj, b'geometry', obj)
machine.addDefaultAnimation(animation)
if __name__ == '__main__':
+ app = QApplication(sys.argv)
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
-
- p1 = Pixmap(QtGui.QPixmap(':/digikam.png'))
- p2 = Pixmap(QtGui.QPixmap(':/akregator.png'))
- p3 = Pixmap(QtGui.QPixmap(':/accessories-dictionary.png'))
- p4 = Pixmap(QtGui.QPixmap(':/k3b.png'))
+ p1 = Pixmap(QPixmap(':/digikam.png'))
+ p2 = Pixmap(QPixmap(':/akregator.png'))
+ p3 = Pixmap(QPixmap(':/accessories-dictionary.png'))
+ p4 = Pixmap(QPixmap(':/k3b.png'))
- p1.setGeometry(QtCore.QRectF(0.0, 0.0, 64.0, 64.0))
- p2.setGeometry(QtCore.QRectF(236.0, 0.0, 64.0, 64.0))
- p3.setGeometry(QtCore.QRectF(236.0, 236.0, 64.0, 64.0))
- p4.setGeometry(QtCore.QRectF(0.0, 236.0, 64.0, 64.0))
+ p1.setGeometry(QRectF(0.0, 0.0, 64.0, 64.0))
+ p2.setGeometry(QRectF(236.0, 0.0, 64.0, 64.0))
+ p3.setGeometry(QRectF(236.0, 236.0, 64.0, 64.0))
+ p4.setGeometry(QRectF(0.0, 236.0, 64.0, 64.0))
- scene = QtWidgets.QGraphicsScene(0, 0, 300, 300)
- scene.setBackgroundBrush(QtCore.Qt.white)
+ scene = QGraphicsScene(0, 0, 300, 300)
+ scene.setBackgroundBrush(Qt.white)
scene.addItem(p1)
scene.addItem(p2)
scene.addItem(p3)
scene.addItem(p4)
- window = QtWidgets.QGraphicsView(scene)
+ window = QGraphicsView(scene)
window.setFrameStyle(0)
- window.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
- window.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
- window.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ window.setAlignment(Qt.AlignLeft | Qt.AlignTop)
+ window.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ window.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
- machine = QtCore.QStateMachine()
- machine.setGlobalRestorePolicy(QtCore.QStateMachine.RestoreProperties)
+ machine = QStateMachine()
+ machine.setGlobalRestorePolicy(QStateMachine.RestoreProperties)
- group = QtCore.QState(machine)
- selectedRect = QtCore.QRect(86, 86, 128, 128)
+ group = QState(machine)
+ selected_rect = QRect(86, 86, 128, 128)
- idleState = QtCore.QState(group)
- group.setInitialState(idleState)
+ idle_state = QState(group)
+ group.setInitialState(idle_state)
objects = [p1, p2, p3, p4]
- createStates(objects, selectedRect, group)
- createAnimations(objects, machine)
+ create_states(objects, selected_rect, group)
+ create_animations(objects, machine)
machine.setInitialState(group)
machine.start()
@@ -130,4 +96,4 @@ if __name__ == '__main__':
window.resize(300, 300)
window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/animation/appchooser/appchooser.pyproject b/examples/widgets/animation/appchooser/appchooser.pyproject
index 14bc351a1..f4c122bef 100644
--- a/examples/widgets/animation/appchooser/appchooser.pyproject
+++ b/examples/widgets/animation/appchooser/appchooser.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["appchooser_rc.py", "appchooser.py", "appchooser.qrc"]
+ "files": ["appchooser.py", "appchooser.qrc"]
}
diff --git a/examples/widgets/animation/appchooser/appchooser_rc.py b/examples/widgets/animation/appchooser/appchooser_rc.py
index c96fe80c6..acc8c8594 100644
--- a/examples/widgets/animation/appchooser/appchooser_rc.py
+++ b/examples/widgets/animation/appchooser/appchooser_rc.py
@@ -1,529 +1,11 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
-\x00\x00\x13\x09\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
-\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
-\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\
-\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\
-\xd7\x09\x17\x17\x15\x19I\x86pA\x00\x00\x12\x96ID\
-ATx\xda\xed[\x09t\x5c\xd5y\xfe\xee{\xb3k\
-\xb4Z\xb2%\xd9\x96dcl\x8316\xb6\x81\x00\xe1\
-\xb04\x14\xc2\xda\x94\x86\x04\xd2\x90Br ] \x14\
-h\x08KH\x09\x87\xda\xadsRR\x02$\xad{ \
-\xe4\xb0\x95\xcd@\xb0\x1bV/\x80\xb1-\xdb\xd8\xb2l\
-l\xd9\xb2,\xc9\x1aK\x1ai\xf6\xe5m\xf7\xf6\x7f3\
-\xef\xf0\xf4:\x9a\x19\x1b&=\xc9i~\x9dO\xf7\xbd\
-\xfb\xee\x9by\xdfw\xff\xe5\xbe+\x1b\x7f\xb4?\xda\xff\
-oc8\x0e\x1b\xbb\x05uR\xed\xf4\x8b]3\x97\x5c\
-\x06\xb7\xef<\xa1\xa4<\xd0\xb3\xc3B\xcd\x0cq5\x15\
-\x12J\x22\xc4S\xe3!\x91\x8d\x85\x84\xc0\x10\x80\x10\xe1\
-\xe8\xd4\x9fC\xf9\x83\x16@\xfc\xd8\x7f\x95h]v7\
-\xe7X\xc6\xd3Q\x99\x08Bp\x01\xe1\x0e\x12\xaa\xc0e\
-?\x84\xec\x81`n\x82\x0b\x90\x5c\x10\x82\x03\xdc\x00\xd7\
-\xd2\x02\xba2.\x0cmH\xe8jHhJH\xe8\xd9\
-\x10W\xd3$T|Hh\xd9\x900\x85\x12\x08M\x7f\
-\x0c\x99\xdf;\x01\xc4\x03\x9e?\xc7\xf9\xf7\xbf\x88\xe6E\
-\xcc$\x04\xae\x03&9C\x052\x11\x80\xc4\x80\x9a\xcc\
-C\xcf@h\x19\xf0l\x82\x90\x02W\x92\xe0\xa6P\xb2\
-\x0f\x5cH\x04S\x13N\xd0\xc1u-'\x14@\xd7\x0d\
-\x03$\x0aA\x8d\x0a\xae\x87\x08C\xc2\xa06\x07\x95\x04\
-3\xa1\x0c\x09n\x84\x00\x84:\x1eG\xf2\xffN\x80\xa7\
-.\xee\xc4\x99\xb7,\x85\xb0\xc8s#\x07\xc7\xb9(\xd6\
-\xa7\xe7\xa1\x98\xe2d\xed>\xd3\x84\x00W3\xa4\xa3B\
-\xc8\x82s\x0e\x03np\x12\xd6P29\x01\x0d\x12R\
-\xcf\xc4\x01\xba&\xcc\x1fn\x80<\x89\xa0'h`N\
-\x90\x1c\x04\x0f\x01<\xc4d\x98\xd8\xd9q)\xba\xd9\xc5\
-\x10\x95\x11\xe0\x85kSXxm ?\xf3F\x09\x01\
-\x9cb8\xc6\x8b\xdc5\x1b\xa2\xc8X\xf2\x1e@\x00\x14\
-N\x90\xdc\x80\xcbG\xf0\xe7<F\xd7u\x18\x9a\x96\xf3\
- \x9d3\x12'\x09=5\x06u\xa4\x07z\xa2\x0f\xae\
-\x00\x03\xf3\xe4o7\x14\xf1:5\xdf\xe8X\x81\x04\xca\
-\x98\x0be\x8d\xb9r\x0f\x97\x8bi\x82c\xc6\xb9\x89\x82\
-c\xc7xaX-\xb7\xfa\x8b\x8c5!\xc9\xf9>\xcd\
-\xf4\x96\xd4\xa7\xe2H4\xc6c\x0b\x95\x0f?\xd9\x0b\xd4\
-\xd7\x00\xb3.\x85\xde4\x97\x9c\xec\x03\xe8C\xab\xc1\xb3\
-\x06\xd48\xae\xc8\x8c\x88U\xa2\x1b_c\x0bP\xd2$\
-\x945\x0e\x88\x89\x04x\x01\x81\xa2\xd7E1\x91\x8a|\
-\xd6\xb1~\xb6iZ\x1aH\x1c\x01\x0e\xbf\x0f\xd7\xbe5\
-\xa8Z\xba\x02\x9e\xe9\xcb\x00\x96\x1f\x0a\xce\xbe\xda\xf38\
-N\x00>\xaf\x00BLp\xdd\x223iyD\xd9\x87\
-\xe7\xe5\xbd\x80P\xfe\xb3\xedky\x11\x0e\xbc\x09\xac\xbd\
-\x13zf\x16RC\x02\xe9a\x015)\x98\xa1bI\
-%\x04(|8\xce\x8b\xccl1a\x8e\x918/\x15\
-Z\x93\x08\x13'\xf2\xe91\xe4\xec\x93\xd50\x12^\xa4\
-\x8f\x9a\xe4\xf3\xb7B\xc0_\x81\x1c \x0a\xc9\xd8\x84J\
-\x92q\x1e\x97\x0a%^F\x9cB\xf1l\xf2\xf6D1\
-\xdd,\xaf\xd6#\xc3\xb2\xcf-@\xa1\xdb\x15xA\xb1\
-\xd8u\x1e\x17\x0f\x95\xc2DY\xc6\xc3\xe2\x83D>\x8c\
-\x02\xe3\x1a\x84\xc5\xbcr\x02@\x14\xcd\xe86\x81\xe3M\
-\x88E\xae\x17\x92-\x1c\x1f\x1bp\x90w\x98\xa1C\xa0\
-\xd2\x02\x08A0\x8e=\xa3\x17\x86J\xf9$\xc8\x8f1\
-)\xc6K\x90'\x13\xa6\x07L\x9c\xb7\x0a\x09\xe0$[\
-\xbe\xd4\x95_\x03\x94\xff\xacB\x0f\x8b\xf5\x03\xa9Q\x94\
-4C\xb7\x89W8\x04,\x18\x05\x0fW\x9eL\x91k\
-(\xa8&\xc5E\x8d\x1d.O\x1e\xc8/\x93\xe1\x14\xa0\
-\x12e\xd0A\xb6\x10E26l\xa2\xb9~\x10\x98u\
-\x0en\x9d\x13`\xf7M\x9a\x10\xcb\xcf\xbc3\x09\x026\
-D%\x04@\xc9D5\xb9\x10\xb0\x88\xb1c$n\xc2\
->\xb6\xbf'j\xce\xfc\x08\x8e\xd5\x04\xd7-\xe2\x16*\
-\xe4\x01eVz\x0e\x22\xc5\x88\x95\x12\xc3\xeas\x0a\x87\
-X_\x01\xf9\xb2f8\xca`%\x05(\x1f\xdbN!\
-\x9cd\x0a=\xc2&n\x0bdX\xe0@\x9c\xc8g\x88\
-\xbcT\xe4}\xb5t\x15p\xa0\xd2+\xc1\x828\xb7`\
-\x93\x13\xff\xdb\x0b,b\xc2\xe1\xe66Y\x82\xe38~\
-\x88\xc8\x0f\x03\xb25TX\xe0(g\xf6:\xc0\xf6\x82\
-\x0a\xaf\x04=U@\xfd\x09\xf9\xa7\xd1\xd3@&\x0c$\
-\x8f\x02Z\xd2\x99\xe8\xecX.\x14\x889\x12\xa3S\xa8\
-xo\x9e\xbcd==\xb3E\xb0\xfd\xbat\x15\xb0\xcb\
-`\xe5\xd6\x01\xb6\x08\xfe)\xc0\xdcK\xe14\x91\x17a\
-l/\x10\xfa(\xe7\xbe\x85\xeeO\x10\x13\xfa\x84\xc3\xe5\
-\xf3m\xe2\x90\x93\xbcM\xd6\xd9\xf2\x12\xcc\xac$X\xe9\
-u\x80#\xbb\x17\x1a\x03\x82-y\xb4_\x98\x17\xe0\xe0\
-k\xc0H\xa73\x1c\x18\x016y\xb3\xb5\xc9\x9b3\x7f\
-\xd4r\xfb2\x02\xc0\x1eSr\x1d \x08\x15M\x82\xb0\
-P\xcej:\x80\xd3n\x05\xce\xb8\x17\xa8\x9e>!\xce\
-\xed|`\x9f[\xe4\xb3\x16y\x09\xd4Z\x90\xca\x80\xa1\
-\xf8\xcb\x90\xa8d\x15\xc0$\x19\xdfP\xca\xaf2\xea\xe7\
-\x01\xe7,\x07:.s\x84\x84\x0d\x93\xfcA\x22\x1f\xb2\
-I\x95\x03+-\x820\xf4\xcaW\x01\x22j'\xaaH\
-\x0f\xb0\xeen@\xe8\xf9so5\x10l&\xb2'\x02\
-\xd3\x96\xd1y}\xc1v\x22N\xba\x01\xa8\x9b\x03\xec\x5c\
-\x09\x18\x9a\x95\x00\x09\x89\x03\x80b\x91\x17\x93\x00\x8eD\
-h\x1b\xb7\xa7\xad \x1c\xb8\xe6\x8c\x16Q\xe92\x88\x89\
-\xe5O\x07\xb2a\xc200\xba\x1d\xe8y\x16h\x5c\x04\
-\xcc\xfe3\xa0\xba\x1d\x0ek9\x17\xf0\x90X\x9d\x14\x16\
-\x9a\x0a${\xec\x99\x17%\x92\x9cp\x10v\x92f\x13\
- \x9c\x1e\x90\xfbU\xb1\x10`\x02\xce\x9a?Y\x19\xb3\
-\xb6\xbaG\xb6\x00\x9b\x7f\x00|\xb2\x8a\xba\xb2p\xd8\x94\
-\xc5\xc0\x92\xfb\x81t\x9fI\xbex\xcc\xdb\xfd\xc7\x17\x1a\
-\xa6\xd9e\x90P\xa9$\x08QX\xd7m\xf2\x85\xab>\
-S\x88\x815$\xc4\x1d@j\x10\x0ek:\x138\xf5\
-\xfb\x05d\xcb\x82M\x1a\xff\xce~\xf6;]\x09Z\x04\
-\xfd\x8d@\xfb\x05\x80\xbb*\x17oH\x0f\x01\xf1\x83\xc0\
-x\x17`\xa8\x13D\xa06u\x18\xd8J\x22,y\x10\
-\xa8\x99\x8bOm\xfe\xdf\x00\xa3\x1f\x00\x87\x9e\x01P&\
-\xfeQ\xc2\xf5%G\x9e\xc8\x83\xeb\xf6\xed\xa22\xeb\x00\
-\xe7\xcc\xfb\xea\x80\xd6\xb3`\xdbR\x02\xf2+\xc1\xa1w\
-\x80\xbe\xd5t\x1c\xb1\x17;Z\x14\xd8~\x17\x89\xf0\xcf\
-N\x11\xce|\x04\x18y\xd7\xac\xfd\xc5\xe3\x9f\x17\xf5O\
-'i\xc9>\x17\x10\x16\xf1\x8a\x87\x80\xed\xee\x93\x9a;\
-\x08\xb4_\x05\x9c\xf5S\xa0q\xa9\xf3\xe5f|+\xb0\
-\xfer@\x8b\xd9\xe3=\x0d\xa4\xddO\xca\xd7|f\xb7\
-6\x8a\x84\x06\x9b\xc4\xa1*#\x80s%X\xd2<\xf5\
-\xc0\xe2\xfb\x80\xb6+\xf2^\x90\xd8\x07(G\x80T\x0f\
-\xb0\xfdV8\xac\xfdZ\xa0\xe1\xb4\xcfP\xfbK\xc2\xb1\
-\x12\x14\xa2b\x02p\x0b\x02Pb@x\x170\xb2\x0d\
-H\x0eN\xf2-\x0c\x98\xfb]\xa0\xf1L ;h?\
-x\xffSt\xcf;\x13\x86Q\xe7)\xf7\x1dg\x22,\
-q\xcc\x9c\xc4\x05*\x97\x03\xec\xfa?\xbe\x17\xd8p\x1b\
-\x00\xdd\x0a\x09\xeb\x05\xa9\xe3J`\xc6\xc5\xce\xa5\xd9\xc2\
-\x1f\x11\xe1\xdf\x02\x91N\xfbAw\xdf\x05\x5c\xb8\xd5\x1e\
-\xd7Ja\x13l\x03\x92\xfd\xce\xd8g6\x0ac\xbd\x04\
-\x80\xcf\xb6'\xf8\xe0}7-\xdc\xf2\xf6O\xa5\xd2U\
-\x80\xc0U\xe7\x92\x18\x84L\x08\xd8\xfb\x18\xb0\xfd\x87\x80\
-\x91\x99\xf0\xc9n\xe0\x0b\xbf\x06\x5c.{\x16\xe3\xdb\x80\
-\xd1\x89^ \x03\xed\xdf,;\xf3N\x14\xef\x17\xec3\
-\xe6\x80\xb77\xf7\xae~k\xc3\xbe_\x90\x08\xach\x0e\
-(\xdc\xf3s.\x90\xc6:\x81\x0fo\xb4\xfa,\xab\x9e\
-\x0f\xb4]\xe7\x8c\xe3\xfe_\xc2a\xd3\xaf.A\xbaL\
-\xdc\xa3\xe0\xdc\x0e\x83\xe3\xc9\x01\xe3\x8a\x9e\xed\xdc58\
-\x7f\xc7\xee\xc1\x7f%\x11Jo\x89\x81;\x84\xb0wo\
-\xf7\x00\x87\x9f\x03\xf6\xac\x84\xc3\xe6\xdd\xe5$7\xba\x06\
-0\xd2\xf6\xf5\xda\xc5\x80\x7fj\x01\xe9\xe3$n\x0b \
->\x83\x07$3\x19C\x81\xfb\xce\xd7\xdf\xec\xba\xe6P\
-\xff\xd8C\xc5\xdf\x06\x09\x81\x16\xe0\x8c\x1f\x03\x17=O\
-\xed\x0a 83O>=\x80\x9c\xed\xa5\x9a\xaf\xc5'\
-x\xc1\xc9@\xcd|\x9b\x94 \xf2\xd1\x0f\x9dIs\xca\
-\xd9\x85\xa4Q6\xde\x0b\xc93'q!\xb9\xe5c\x12\
- \x95\xc9\x1a)\xdd\xc8\x8eE\x92\xb7<\xbbz\xeb=\
-k_x\xf0\x9e\xc2?\x8d\xf1|\xe6^r'Po\
-\x12r\x01u\xd4\x9e\xbe\xc2v{\x86\xfc\xe2\xe7\xc8\xab\
-p\xd8\xd4\x8b\x9d3\x1b\xdb\x0c\x87\xd5.:\x0e\xa2e\
-D\x80\x05\xfa\xb5\xcbw\xfa/\x96?p\xeb\xeb\x8f=\
-\xfc\xc3\xef\xfc\xec'\xf7N/Z\x052\x8a\xa2'\xd2\
-\x19\xff\xf6M\x9b^Z\xbat\xe9k\xcf\xbc\xbc\xf9\xa1\
-\x0f\xff{\xe5\xc8\xd9\x97\xfc\xc3*G\x12\xac\x99\x0dT\
-\xb5\xc0a\xee\x1a\xe0\xe4\xef\x01\xdb\xbfo\xf7\x8dn\x00\
-:\xbe9\xc1\x0bNq\xbawf\x1f\x1cVu\xc2\xf1\
-\x91G\x89\xbe\x09%p\xe3\xa6.\xcf\x86\xa1\xfd\x977\
-\xd4\xd7^>sf\x8b\xf8\xea\xd5W\xec\x9a6m\xda\
-{UU5\xeb3Y\xf5\x83\x7f{\xe4\xe7\xa39\x01\
-\x14M\xe3\x14\x06~\x90q\xce\xffvgw\xff\xb9/\
-\xbd\xb1\xedq\xca\x07\xc38\xfc\xa4-\x80\x96)\xb2\xf9\
-q\x0a\x1c\x96\x19\x80\xc3|\xcd\xce\x87V\x87\xe00o\
-KY\x82\xe5\xc9;c\x9f\x83aj\x9d\xf7\xad\xdaT\
-\xed\x02&\xb9Z\x87G\xa2ll<\xb9\xa8\xb7oh\
-\x91,\xcb\xb7\xa9\xaa\xca\xe7\xcc\x99s{N\x00]\xd7\
-Y:\x9b\x0d\x80l\xc7\x8e\x1d\x83\x0b\x16,\xf8\xbb5\
-o\xef|\xbaeZ\xeds'\x9d0S\x0er\xc3\xda\
-\xc1\xe9\x07\xd2G\x81@3\x1c\x96<\x0c\xe7\x02\x5c\x86\
-\xc3\x5c\xb5\xce5\xbf\x91\x82\xc3\xe4*\x1c\x97\xb1\xc9\xfb\
-F\xb2>\xbc\x1f\xa9\xc3\xc1L-\x0egk0\x1eK\
-_\xa4\xebI\xc4b1(\xe4\xe5\x84}\xc4\xb5\x95s\
-^o\xf9\xe2,\xf3\x17\xb8\x10\x8c\xf2@\x10\x96uw\
-w?c\x18\xc6\xd3\xff\xf9\xf4\xba\xc0k\x91\xb9rZ\
-x\x00n\xfd\xe3\xc8\xf5\xb7\xe5W\x83\xb0,;\x0a\xec\
-|\xc8I\xb0\xaa\x03\x0e\xd3\xe3p\xee\xef{P`\xf6\
-\xfd\xc7e\xe3Y7~\xb5\xb7\x19\xd7\xbf\xbd\x00\xcb\xfb\
-\xcf\xc5{\xb1\x99\xd8\xdc\xaf\xe0\xc0\xde.\xd4%\xbaQ\
-\xa7\xf4?ZSSs\xe1\xca\x95+g\x90\x00Kg\
-\xcf\x9e\xdd#I\x12\xacoz\xcb\x05\xb2\x80\xcf\xd3\x94\
-U\x95FL0\x12\xe0&U5N^\xfe\xd8\xda\xd3\
-<\xb7\x5c\x86\xcb\x9b\xfa\xe03_{\x93}$\xf5&\
-`\xee\xd7\xf3\x1a\xf6<\x01\xa8$\x82<\xe1\xe1[.\
-\x83\xc3R\xbd6yF\x90\xeb\xe10m\x1c\x10\xc7!\
-\x82\x99\xe0F\xaa\xf0\xec\xee\xa9\xd8\x12\x9e\x06M\xd7\x10\
-\x8f\x8fCD\xdf\xc3\xe5s\x0d\xccY\xe4\xc3\x89\xb3\xda\
-\xe0\xadm\xa6<}A_\xfb\x95\xf7\x0c\x03\x10\x0f?\
-\xfc0#[,D.k_Mx\xc3u\xcf\xdf_\
-\x83\xc7\xd6\xeelJ\xa6\xd5\x16\xcb-8\x01\x07\x0f\x1e\
-L\xb7\xb5\xb5}%\x1aIl]\xf1\xcb\xdf6\xc97\
-~\x11\x97d\x87\xe0\x96\x00\x16\xeb\x07\xdb\xfe/\x80y\
-,\xe3\xd3\xedl\xc6\xac\x87\xdf\xf9\x03\xe0\xc0\xa3f\xc9\
-\xcc#\xfc.\xc0'\xb8\xafo\x0e\x1c\xa6Z\x028E\
-\x98\xb4o\xf3`\x10\xab\xb65c\xd3a/\xa2\xd1\x08\
-b\x91\x8f\xf1\xa59\x0a~t\x9e\x84\xf3\x17\xce\x04\xab\
-\x9b\x87=\x83@d\xe8\x10\xa2\x07;\x11\xee\xddy\xf0\
-\x9dp\xf3\x01\x00|\xc5\x8a\x15\xcb\xc8\x1b<$\xc0\xeb\
-\x00r\xa5\xca\xd5\xd8X#e\x15\xad\xdf\xd05\x0e\xa0\
-\x86\x90&h\x041\xbb\xbf\xffp\xf4\x84\xa6\xeb\x87\x8e\
-\x8c\xacY\xf1\xe4&\x96\xb9\xfaj\x9co\xbc\x08\x8f\xac\
-A\x96\xcdJH\xa0V\xa6\x96Y\xe7\x8c\x13\xc2]`\
-\x11\x82\x9c\xaf\x9c)]\xc6\xa1\xb1\x00\x8e\xc4<\x18\x8a\
-z\x10z\xf5\xbf\x10\xd3\xd7!\xcd\xa6#e\xd4\x01$\
-l-\xef@\x8d\xcf\xc0\xd4j\x0ds\x9b2X6#\
-\x85)~\x1d\xa6\x0d'\xdc\xd8p\xb0\x1a/uM\xc1\
-\xc7\x83\x12\xc2\xe10\x22\xe3\xe3\xf8\x8b\xa5\xc0\x037\x07\
-p\xe2\xbc/\xe4\x12\xb1\x88\x1d\x811\xb4\x1d\x91}1\
-\xa4\x14\x91O7n\xb75E`---\x17\x9b\xf9\
-\x80\xecyX\xe6\xba\xfd\xdeU\x1c^\xff\x12\xa8Y\x93\
-\xfc\x14B\x15!F\xc8\x10\xf8\x99\xd3G\xd7m<\x5c\
-\xf7`o\xdf\x91\xfb\x1f~IB\xf4O\xaf\xc22u\
-5<.\x1d.W\x9e\xbc\xcb\x12\x81\x13\xdbP\xda\x8b\
-\xc1\xb8\x17\xfdQ\x1f\x8e$\x83\xd8?\xecBoHC\
-:\x93E6\x9b\x85\xaaf D\x1a>_\x06\x81\xc0\
-(\x82\xf2\x18<H#o\x12\x09\xe4BF\xf7\xc0\xef\
-\xaf\xc7\xecf/=Z5\x14\xe1C\x86\xee\x1f\x0a\x8d\
- <6\x86\xa0\x17x\xed\x8ez\x5c\xf2'\xe7\x03\xb5\
-'C()\x18\x07\xd7\xe6\x04\x10\x06\xc0Iy\xc1\x04\
-\x84\xe0t\xec\xca\x15_\xf3\xbb\xeb\xeb\xeb\xaf\xef\xeb\xeb\
-\xcb\x80nw\xbe\x0d*\xf4\xe9\x00\xb7PG\xf0\x13\xa2\
-\x9b\x81D\xbb\x0eva{\xf4\xb9\xf7\x0e\xd7\xce>\xd4\
-7\xf0\x97O\xbc\xc9\xb0\xff\xa4\xf35ytK\xca`\
-\xae\xa0\xaf\xaa\xc6\xe5\xae\x9e\x82\x81\xa8\x84\x811\x8eh\
-<\x8dT*\x83D2\x8d\x804\x88\x93Zu\x5c\xbb\
-T\xc2\xbc\x19@[\xb3\x84\xf6\xd6 \x9a\xbf\xf4\x22$\
-3Q\xbaH\xf3\x9d7\x83\x99\x9b&\xba\x02(I0\
-5\x85\xa7\xd6\xeb\xb8\xf1?R\x18\x19\xe1\x85\xc9\x9e\x01\
-\xabo\x0b\xe0\xbc+\xbe\x05\xe1i\x82H\x0eC\xdb\xf7\
-\x12\x90I\x12a\x19\x0c\xc8\x91\xe7\xd6\x96\x92\x90h\xa6\
-\x00\xf6\xca+\xaf\xdc\x10\x08\x04fG\xa3\xd1U ^\
-\xc5\x0a\x8a\x8b\x10$4\x10\xbc\x84ds\x10\x89\xf3\xe7\
-\x815\x04Q\xfb\x9b\xfd\x0dw)\xdc\xfd\xdd\xd6\xd6V\
-\xf4\xf7\xf7\xa1*\xe0\x0574\x84\x86#0\x0c\x8ei\
-\xb5\x14\x87\xf3%\x9c;\x8f\xe1\x82\xa5Mh\x9f=\x8b\
-*\x5c\x13\x98\xbf\x01\xcc[\x0b\xe6\x0e\x82A\x03\xb8\x92\
-\x033\xb2\x10j\x14,=\x08\xa4\x87s\xdb\xecL\xcb\
-\xe2\xd0Q\x81\xb3\x97\xd7b$\x1c\x01Yn\xc6;\x1a\
-%\xec\x09\x01\xa7\xb5\x09|\xf0\xb3\x0b \xd1\xeb7O\
-G\xa0\xedy\x06\x22\x9b\xb47\xaau\x81M\x078\x14\
-\x8d\x83\x09\xae'\x1b\x16/|\xba\xa7N'\xf2[>\
-\xfa\xe8#\xcf\xc0\xc0\xc0\xa9\x00z\x8b\xed\x07\xe8\x848\
-A\xb5D\xa8\x1dN\x22\xf0z\x17\xa2'5#|\xde\
-\xac\xc8\x9d\xef\xf65\xb3\xde\xde\xde\x9b\xcdX\x22o\xb4\
-f\x85\xe1\x9c9\xae\xc8\xbd_\x9f\xe5\x9f\xb5\xe8Bo\
-\xb0u!s\xfb\x82H\x0b\x05\xc4\x90\xa0\x101\x82\xaa\
-\xd0a\x14<\xd9\x9f\xdb,\x91\x94\x10$=\x01\x99\x09\
-\xc8B@\x12f\xcb\xd0=\x5c\x0d\x0e97\xdb7\x9e\
-\x03|\xeblPh\x00\x7f\xfdB-f4$\x10\x97\
-\xdb\xe0J+H\xedZ\x0d\x91\xce\xd0}f\xfc\x09\x08\
-\x9d#\x95\x11T\x1a\x01\xb3'e\xf8\x1eyd}\xba\
-\xbauz\xfd\xbf\xf7\xf4\xf4\xd4\x11\xf9\x1bL\xf2\xe56\
-D\xb8\x15\xff#\x04E\x00\x8d)\x15S;\xfb\x11\xdb\
-\xd6/\xc6[\x1b\x95\xefi\x9a6\x04\xe0\xdb\x846\x02\
-\xbcn\xb9w\xd9\x895\xf7\xb6_\xf9\xe8u5SZ\
-\xdaT%-\xa53\x09\xb7\xa6\xa6]Jr\x14\xa3\xfd\
-\xbd\x99p\xff\xc7n#\xbe\xbfZ6\xe2\xbe\x80WT\
-y=\xc2\x13\xf0\x08)\xe0a\xb9\xca\xe2\x22\xb8\x19\xc0\
-\x0d\xe0\xdd\x819H$\xba0\xb3\x1e[\x82n\xecy\
-m\x07j=.Q'\x04?\xefp\x18\xfa\xc7=\x11\
-\xc9\x88\xbf*\xf3x\x04\x01\xb7\xcc<L\x80q\x01E\
-\x15b\xdf0\xd4\xa3\x096z(\xea\xde\xf8\xe1\xa0\xdf\
-5\xeb\xc4\xa6\xd5T\xd1\x9a\xf7\xee\xdd{7\x80_\x1d\
-\xeb\x8e\x90\xb0\xbc`\xdcj\x1b\x09\x0d\x02\x08\x1c\x09\x8f\
-\x87\x01\xac\x90e\xf9\x9f|>\xdf\xf6T*\xb5\xd0\xe3\
-\xf5\xbe\xdcq\xfa\xd5\xef\xcf>\xe5\xec\xaf\x09.\x06\x0c\
-CS\xe2\x91p\xf7\xde\x1d\x1bwo\xfc\xcd\x93\xa3\xaa\
-\x9a\xf6AW}\x86\x11\x0c\x08\xdd[%\xb8VE\xa1\
-\x13dB\xaf\x97\x99\xde\xe0\x96\x8c\xdaj\x9fA-\x0f\
-\xc6\xa4\x99\xf3;\xfb\xa4*UQ\xe2\x0b\xe6\xe0\x0e\x83\
-#\xab\xab\xf0eT\xe1\xf3\xbb\xb8\xa7\xfb\x88\xb1d\xcd\
-;\x9d\xcf\xca.\xd6\x00x\x83\x0c\xc2\xc7`\xb8\x05\x87\
-\x94H\xc3\x08\xa7\xb8r$*\xbc\x9ag\xda\x17;\xe6\
-\xcc\x98\xd1\xd5\xd5\x95\x08\x85B\xf7\x00x\xf4\xb3l\x89\
-\x19\x84\x84%\xc2\x14\x0b3\x08\x11\xc30\xc6\x1a\x1a\x1a\
-\xb6d2\x99\x85\xfe@p\xd7Wn\xbcw\x9a\xcb\xed\
-5\xb3\xed\xfb]\xbb\xf7\xbc\xb1\xa3sk\x94C\x97\x1a\
-O\xfa2\xe3\x5ce\xa4\x89\xc4\xf5,3\xd4\xb4\xa4+\
-)IW\x932eoY\xa3\x96gS\xee1-\xed\
-\x19\x1cc\x0b\xdd\xcd\xcb\x1e\xdd\xd9\xf5:$\x86\x07;\
-\xa6b\x9b\x00\x1dj\x90\xb8L\xe9\xc4\xa5\xde>,\xd8\
-[O\xae\x1f\x9bu\xe1\xb2Y\xcf\xb74\xf8\xd3\xe3\xb1\
-\xd4\xb4\xd1h\xfa\x84pL\x9foH\xfe\x99\x9e@]\
-\xa3\xab\xc6\x1f\x8c\x86\xc3\xea\xce\xee\xf7^\xd6u}9\
-\x80]\x04\xed\xf3\xfc\xaf1f\x89UK\x98j\x95\xca\
-$\xd5\xd5\x9b\xa8&\xdf\xd6\xdc\xdc\xfc\x0dz\x87P\xd2\
-\xe9t\xe2\x8d7\xde\xd8=\xc9\x96\x86\x80\x05\xd3\x98\x10\
-\x9c\xc3\xe0B7\xe8H\xe5\x86\x9a\x11\xdb\xb6\xed\xa8\x86\
-\xb7z\xed\xde\xbd\x9f\xcc\xeb\xec\xec\xdc\x0e\xe0L\x82\xfe\
-\x8f\x00\xd6-\x06K\x8d\x83Ec\x90{\x13\xec,\xba\
-\xf3y\xb7\xdb\xdd\xec\xf5zUj\x99\xcb\xe5r\x93\x81\
-\xc8\x1a\xf1x|\xbf\xa2(k\x01\xfcZ\x08\xd1]@\
-\xbc\x9c\x07\x94\x08\x09\x8d\x10!(\x84&\xc2\x14UU\
-\xe3\xe6\xba\x9a\xda\xa6\x97\xc9\xc8+8\x00\x97S\x00\xe7\
-\x9f=\x18c\x1c\x8cA\xa2\x1fx\xdc\x02\xf0\xf1w7\
-|\xd4\xee\xf7W=\x91\x88\xc6\xe6m\xdb\xb6m\x14\xc0\
-5\xd6x\x99\x04\x90\xf01d\xab*\xd5\xe4wTp\
-\x0b\xe5\xa1\xb3\x08\xb5\xd6s\x85\x09\xfb\x09\xa6p}\xd6\
-bNTfW\xb80$\x92\xd6\x97fi\xc67\x92\
-\x00J\x22\x918\xe3\xc0\x81\x03\xafQy\xe4t.\x13\
-I\x13\x92U!r\xe4\xf3\x13/\x0c\xab\x95H,\xb1\
-n\xdd\xba6\xba~=-O\xbfs\xe8\xd0!\xff\xa6\
-M\x9b\xc6\xe9\xda_\x01\xc8\x12\xda&|\xa76\xc1\x0b\
-\x93\x84\xdd\x84NB\x8a\x90\xb1&E/G\xbat\x08\
-\x1c\xff}2!\xe0\xf1x\xbeM\x1e\xb0\x9c\xc2`\xe5\
-\xa9\xa7\x9e\xba\x9e\x92\xa3\x9b\x5c\x93Q\x82\xe4\xe4\x9a:\
-\x09\xa2r\xce\x0d\x1a#(_\xc8\xe3\xe3\xe33\xfc~\
-\xff)4\xe6\x22j\x97Q\x82b\x94\xa1\x0d\xea\xff\x10\
-\xc0*\xc2Q\x8bP\xc2*\xc9\xb1\x1cQ'AnA\
-\xe0s\x1a\xab\xc0\xfd&\xaec\x8c=L\xa4j\xab\xaa\
-\xaa\x86\x89X\x8a\xda\x0c\x09 <y\xf3\xd1\xf5\x06B\
-\x8d9\xfb\xe49\x88D\x22\xc6\xd0\xd0P/y\xc2\x06\
-ki:`\x11M\x12\xd2\x96\x08\x9aM\xf6wc\x0c\
-\x95\xb3*\xc2\x97\x09\xa7\x13\xda,\xc2u\x047\xe7\x5c\
-\xb2^A#\x84\x83\x84n\xc2\xfb\x84~k\xa6\x8dr\
-\x7f\xd6\xfb\x03\x10\xa0\xf0\xf3\x1c\xff\x0a\xc0\xf9\x17V\x81\
-\xdf\x13\xfb\x1f\x84\xaf\xe2\x02\x22\xe6\xe9\x93\x00\x00\x00\x00\
-IEND\xaeB`\x82\
-\x00\x00\x0d\x06\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
-\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\
-\x00\x00\x00\x09pHYs\x00\x00\x06\xec\x00\x00\x06\xec\
-\x01\x1eu85\x00\x00\x00\x19tEXtSof\
-tware\x00www.inksca\
-pe.org\x9b\xee<\x1a\x00\x00\x0c\x83ID\
-ATx\xda\xed\x9b[hU\xd9\x19\xc7\xd7IN\xa2\
-&&\x1a\xe351^\xc6T\xad\x97J\x95)8\x14\
-\xc4\x22\xb6\xccs\x9f*\xf4a^|\x10\xc4\xc2\x0c\x08\
-}(\xf8TJ\x1f\x15\xa4O\xf6Q\x0aR\x90N\x07\
-A\x94\xfa\xe0\xfd\xd6\xaa\x03^\xc6\xfb5Qc.F\
-\xcd\xc5~\xbf\x0d\xbfa\xcf1\x92\x8c\x1c\x83\xc1,X\
-\xec\xbd\xd7Y{\xad\xef\xfb\x7f\xf7\xb5\x93\xc2\xeb\xd7\xaf\
-\xd3\xc7\xdc*\xa2\x8f\x030\x0e\xc08\x00\xe3\x00\x8c\x03\
-0\x0e\xc0G\xda\x8a\x1f\x1aA\xc7\x8e\x1d\xdbS]]\
-\xfd\xb3i\xd3\xa6}\xe1\x98\xad\xad\xad\xed\x8f\x95\x95\x95\
-\xf3W\xaf^\xfd\x8br\xed\xf7A$B\xdb\xb6m[\
-P,\x16\xff\x10\xb7\x9f\xcd\x9e=\xbbe\xf2\xe4\xc9\x93\
-\x18\x876\xaf\xb6\x81\x81\x81\xc1K\x97.\xdd\x1a\x1c\x1c\
-\xbc\xd4\xd1\xd1\xf1\xb7\xbd{\xf7\x1e\x1a\xd3\x00l\xd9\xb2\
-\xe5\xb3\xfa\xfa\xfa\xc3!\xf5\xaa!\x09,\x14\xd2\xdb\xc6\
-\x03\x84t\xfd\xfa\xf5C\x15\x15\x15\xbf\xd9\xb3g\xcf\xab\
-\xb1d\x022\xff\xcb\x9a\x9a\x9aC!\x84\xe2\xcb\x97/\
-\x87cx\xc8\xb1\x96\x96\x96\xf5\xd7\xae]\xfb&\x1e\x7f\
-5\x96\x9c\xa0\x0c\xfc\xb3\xbf\xbf?\x13B\x00\x91\xaa\xaa\
-\xaaR\x98\x02=\xbb\xb7;n\x9f8qb\xc6<\xa0\
-\xd1\x9b\x9a\x9a\xd6o\xd8\xb0a\xdd\x98\xd2\x80\xcd\x9b7\
-\xff9\x98i\xec\xeb\xebK\xcf\x9e=K\x0f\x1e<@\
-\xa5G\x0a\x5c\x0a'\x99\x1a\x1b\x1b\x93\xad\xae\xae\xee\xaf\
-q\xf9t\xac\x00\x00\xb3_\x04\xf3H\x10\xef\x9e\x16-\
-Z\x94\xc2\xf9\xa5\xe7\xcf\x9f#e\xe7\xa4\xce\xce\xce\xd4\
-\xd0\xd0\x901\xfc\xf4\xe9\xd34i\xd2\xa4t\xfa\xf4\xe9\
-\xf4\xe4\xc9\x93D\x0b\xff\x91hS\xa6L\xf9\xf9\xc6\x8d\
-\x1b\x8b\x07\x0e\x1c\xe8\xff\xe0\x01\xd8\xb4iSu\xb4\xe9\
-q\x0b\xc3x\xf6\xb4j\xd5\xaa4a\xc2\x84t\xe3\xc6\
-\x8d4k\xd6\xact\xea\xd4\xa9\xd4\xda\xda\x9a\xe6\xcf\x9f\
-\x8f\x9d\xc3`\xbaz\xf5jZ\xb8pa:{\xf6l\
-\xf6Nww\xb7\xe6\x00h\x95/^\xbc\xd8\x14K\xfe\
-\xfd\x83\x88\x02\xdb\xb7oo|\xf4\xe8\xd1\xba \xbc?\
-\x88\x9d\x17\xd2[1s\xe6\xcc\xdf\xde\xb9s\xa7+\x88\
-\x9e\x1cc\xd3\x83\xe0\x84\x16\x00B\xc4\xf7w\xd1\xa2L\
-3\x02\xcc\x0c\x84[\xb7n\xed\x0b\x8d\xd9O8\x8d~\
-4\xd6\xfc\xf7\x89\x13'\x1e\xbc\x17\x00~\x1dm\xc5\x8a\
-\x15\x95\xc1Tm0\xd3z\xe6\xcc\x99\xdf\xafY\xb3\xa6\
-9\x18}\x10\xd2h\xbap\xe1B\xed\xb2e\xcb\xd2\xdd\
-\xbbw\xd3\xd4\xa9SSWWWz\xfc\xf8qFl\
-\x84\xad\xc4\xbe\xd8>\x12\x0c\xa0\x90\xa8\x9e~\xc4\x0dM\
-a\x1d\x1c(f\xc3\xfd\xe5\xcb\x97\xf1\x07\x98\x13\xfb\xbc\
-\x0e\xad\xba\x1cN\xf4\x1f===\xff\xda\xbf\x7f\xff\x89\
-\x9838b\x00v\xec\xd8\xb1\xf4\xe6\xcd\x9b_\xc5m\
-\xcb\xe2\xc5\x8bo\xd6\xd6\xd6\xd6\x04\xa1\x8bz{{[\
-\xcf\x9f?\xdf\xc8&\xa8$\x92\x84Q\x18\xc0c\xf3\x8c\
-m\xbfz\xf5\xca\xae'wi\xa4\xce8D\xd2\x99\xcf\
-\x18L\x0c\x1b\x0e\x01-hQ\x0bx?c\xd8\xe7\x90\
-z\x8a\xe8\x82\xf9\x00>~\x22\xdb;\xe8\xeeloo\
-\xff&\xf6\xfd2\xe6\xdc\x1e\x12\x80\xdd\xbbw\xa3\x8b\xbf\
-{\xf8\xf0\xe1_\x8e\x1f?>;\xd4\x88\x97\x0d7\x10\
-\x08\xe1y\x06\x91\x1e\x1b\xdb\xdfxFBt\x1bk\xe0\
-\xd0d\x9e=`\x8c{\xae\xf9n\xf3=\xaf\xac\xeb\x95\
-\x0e\x00y\xe7\x19\x1a\x09\x08\x00\xc5\xfa8O\xfcH\xe6\
-gB\x1b\xae\x1f=z\xf4\x937\x00\xd8\xb5kWM\
-\xd8\xd0\xd7\xa1\xaa\xebb\x92L\xb2\x10\x1d\xc6\xd8\x14\xbb\
-\x858\x09\x18\x16\x006\x869\x1b\xce\x0b-\x810\xc6\
-\xed#\x01\x80.\x93y\x10X\xcb\x88\xe0\xef\x87\x0f\x1f\
-f\x1f\x98V\x08\xdc\xd3\xfb\xc3$\xebo\xdf\xbe\xdd[\
-\xf4\x85\x9d;w\xb6D8\xfa6T\xb9\x96\xd0\x93'\
-\x02d\x91\x18\xe3a\xf3i\xee\xdc\xb9)^\x06\x086\
-\x960\x89\xcb\xe6\x00`\xe4\xea? \xd6\xe6\xfa\x00%\
-\x08j\x80\xfb9\xce\x9a9@\x87\xd4\x00;\xcc\xf1\x1e\
-\xfe\x06\x8d z`V\x08\x12 B\xab\x11$\xeb\x17\
-\xc3\x17\xfd\x09_\x9d\x01\xb0o\xdf\xbe\xc6\x90\xca\xb5(\
-2\xaad:\xcf<I\xca\xca\x95+\x13\xed\xc8\x91#\
- \x9d\x81\x10~\x00\xe9\xe6\x01\xc8\x88\x8e\x82\x86\x8d\x01\
-\x8d5\xb2Mmj\x14\x8d\xb90\xc7\x1e\xd3\xa7O\xc7\
-y\xf1\x9b\x1a\x02\xe1C\x81$ \xa5 \xc88\xe0+\
-y\xd6\xc0\x0c\xe8\xd6\x0f\xfc\x86\xe3\xfd*\x9e\xf7d\x00\
-\xdc\xbbw\xef?\x11w\xabTS\x99\xd7\xfe\xc9\xb8\x02\
-1\x9cHF\xa4\xf3$\x16\xfb\x82\x10\xcd#\x22\x00\x8c\
-\xf2,\x00\xae\x9b\xadA\x13\x00\x12 \xd6F\xa3\xc8\x01\
-\xf2NP\xa65=\x9b)q\xe9o\xac\x8d\x83\xc4\xe1\
-B\x07\xeb\xd2\xb6n\xdd\x9a\xdd\x9f;w\x0egM\xa4\
-@\x0b+\x02\x88O\x8b!\xfd\xdaP\x8d\x9f\xe6\xbd\xac\
-\xc4\xa9\x8a\x84)PC\xa2\x80\x81\x84O\x9e<\xc94\
-\xc6\xd9T\x00@\x18\x86\x95\x8e%\xec\x0f4\x806o\
-\xde<\x9c*Z\x041\xec\x07\xb8\x864\x9e]\x03\x1a\
-t\xb6\xec\x87vq\xcd\xfb\x09\xe6\xb0\xaf\xeb\x93\x1f\x08\
-6\x91 \xfb}\xce\x9c9\x198W\xae\x5c1ZM\
-+\xc6K\xad\x11\x8f\x0b\xbc\xa8csA\x91\x9e1c\
-F\xb6\xb0\xa9\xea\xc1\x83\x07\x9d\x87\x8a\xb1\xd1\x1bj\xc9\
-\x06\xda\xbfD\x0a\xc4\xf2\xe5\xcbIe1'\x18\x05T\
-\xcc\x0a\xa2\x19\xd7\x9e\x95$\xb4 A4\x0d:\x98\x03\
-\xb3\xa8<W#\x13\x82P \x8c\xabE\xf87\xae\xbc\
-W\xea\x5c\x0b\xc5\xd8\xa0\x10\x8d|\x9b\x8d\xf3^\x7fH\
-\xc6h\x10\xc6o<\x03\x00\x0bC0D\xd25\x0dC\
-\x9f\xef1\x8e/!\xa5%\x09\x82i\xf6\x05`\xd6@\
-\xc3\xb8\xc2\xb4\x0e\xcf}\xd5J\xf61\x17\xc0\xff\xb0&\
-k\x01\x12{\xd2\xa0\x01>\xbc\xd7\x17\xd9\xf3\x0d\x0d\xe0\
-e\x88\xd0\x86\xe9\x82\x90\x0f\x7f\x02a\x1e\xfe\x86]j\
-\x7f\x02\xa0Y\xd8\xc8\xed/^\xbc\x08hH\x1d\x89\x03\
-\x00>\x08i\xb2/\x84\xeb\x00\xe92\x8b\xf4U[\xe6\
-@\x07k\xe0\xf0X\x83\x88\xc3<\x0b&S\xebaS\
-\xec\xa2*\xf4\xaeM/\x9dk\x10\x85\xa4J\xd3V\x9c\
-\x1c\x0c\x10&\x91\x0cs\xd0\x06\x00\x83\x01\x1c\x14k\xe1\
-\xb1\xd1\x1e\xf3\x07\x01a]hEs\xb8G\x0b\x99\x03\
-\xe3\x80\x00\xf3\xbc\x8bC%\x04\x1a\xc5\xb8\xda\x87\x01\xa0\
-L\x0d\xc2`\xc0\x06QH\x18U\x85P}G\x14F\
-\x5ca\x1c\x8d\xc11\xf2\x1e\x0c\xb3\x06\x0cA\x1b\x0c\xd2\
-\x01M\xed\x831\xd6\xa5\x94\xc6yZ\x1a\xb3G6~\
-\xff\xfe}\x9c\xec\xb0\xf5\x05> \x95\xbbi2F\x15\
-\x98\x8ac+31M\x0bF\xa8\xe02\x82\x97,Y\
-B\xb1\xc4\x19_iF\x88\xb4a\x1e\xa6Y\x03\x86\x01\
-\x8e\xe8\x01\xd3\x5cq\xd0\xac\xc9\x95u\x19\xc3TL\xb3\
-\x05\xe2\xfdk\x80\x9b\xda\xb0G\xc2(\x04@\xac!\x92\
-+\xb6\x8f9\x00\x00\xe6\x01\xe1\xe6\x0d\xe6!&/\xfa\
-\x03}\x92v\x0e8\x80\x82\xc6\xa8%\x8c\x13\xfaX\x1f\
-\xad\x1a\xd6\x07\x94\xb3\x11&!\x02P\xb5A\xd4\xbf\x94\
-yT\x17\x82\x91&~@M\xe4\x1d#\x8ay\x88\xe9\
-0s`\xd4\xb9\xccC[\xe4\x819\x00\x05 y\xc7\
-m\x1b\x15\x0d0\x03cc%D\x83Y\x01\x80\x09\xa4\
-M\xb9\x8a\xad2fJ\x8cd5\x15\xcf\x0ed\xce\x08\
-\x01\xc8\x98\x0b\x8e\xd5\x04\x88\xf7\xd4\x06C&\x9a\x85\x1f\
-a\x9d\xd1\xd2\x00\xe36\x1d\x86pJ\x84\xaf|\xa6\x08\
-\xf1\x84]=9\x0c\xe8\xd4\xb0a\xa3\x00\xa01nx\
-\x86y\xde\xb1\xe0\xa1\x13\x05\x04>\x9f\x00\xc1\xb4{Q\
-gp\xffV'XV\x0d\x90Q\x9a\xea\x8e\x9a\xe7U\
-\xd2:\x9d(\xc0\xb8g\x06\x8c1\x17\xa6\xb8\x1a\xfb\xcd\
-\xf4\x90<\xcf\xfa\x05\x8b\x1f\x9a\xd9\xa2i5`\xd0\x0c\
-\x9bh\x1c\xfb\x8e\xaa\x06h\xabJ\xd11\x98p\x1e\xfb\
-C8\x04\xeb\xe1q`\xf3f,IM\xd3>I\x03\
-\x13B\xdd\xbbo\xa3)0l\x8d`\xdeo\xea\xab\x84\
-\x87\xca\x1e\xc91\x00\xd5|\xe2\xfd\xfa\x80<!\x82\x9b\
-\xaf\xdaTU\x88\xb7\xb4\x05\x00AP\x0b\xe6\xcf\x5c\x9a\
-\xfak\x1f\xa7\xe6\xa6\x96T\xdd\x96\x85L\xed\x1dFt\
-\xb6\xac\xc7;\xaeo\x04\x92'\xfd\x0a\xa6\x88)\x00@\
-Y5`\xd8#+\x01\xb0\xa9\x01\xee+\xd1\x8c\xe55\
-\xa1P\xf72-X\xb44\x15\xeb\xfaR\xb1\xba9u\
-\x90*\xc7;f\x99\x9e1\xa2\x19\xac\xaf)[\xd0\xe5\
-\xa3\x10\xe1\xd0\xcc\xb3\xb4U\x94\xd3\x07\xc8\xa8\x04 \x95\
-R`\xf2g\x0e\xf9{\x9f=#|\xde\xdf\x1e\xcc>\
-J\xb5U\xf5\xa9>\xca\xd8\x89u\x93S\xfd\xec\xc8\x19\
-\x1a\xa68\xcf\xf7\x5c\xc3\xee\xfev5\x0d\xb0\xde\x04\xa0\
-\xdc> O@\xbe\xa2\xf3\xdeL\xd0\xef\x7f0\xeb\x5c\
-\xfb\xf71\xbf\xa77u\x84\xeaw\xb5\xb7\xa5\xee\xb6\xf6\
-\xd4\x1bj<!\xbe\x9c\x0f\xe64\x8c\xf5,\x99\x05T\
-\xe9k\x86f\x93\xac[\xda\x8a\x12Sn\x00\x8c\xdd:\
--\x9a\xa1\xd13\x02U\x9fy:5\xed\x1bo^\xc5\
-\x07\x8f\xfa\xba\xd4\xf7\xbc'=\x8d2\xb9\xb3\xa7;\xf5\
-\x15\x99\xfb}\xc5\x0a\x00\xbc\x83\xa7W\xd2\xa5%8{\
-P\x83p\x1d\x1d\x00$@\x00,\xb9uJ\x82\xc2\xbd\
-\x85\x92\xcck\xe3\xcc\xc9\xca\xe3\xcaBzE2U]\
-\x91\xba\xba;#\xb7N\xa9\xab\xb3\xcb\x13k\x22\x06`\
-\x19\xf7e\xdc\xc6\x98\xc5\xd2\x90\xad\xa8W.W\xf3$\
-WB\xcc\xe3!B\x7f\x03\xb1f~H\x0e\xdb\xa4\x9b\
-\xfe\xe6m\x96\x10V7\xb3!M\xa8\x9c\x98\xbaz\xbb\
-\xd2\xa3+\x0f\x01\x0c-aM\xee\xcd\x1a=\x87T\xab\
-\xbc\x1f\xddT\x18\x06\xf2\x84\xc0\x84\xa0\xd0Lz\x90\x9a\
-\x80Q\x10\x91\x12#\xfd|\xf1\x83`<\x95\xceg\x82\
-\xda3\x8cs\x82\xb4`\xc1\x02\xcf'\x05\xd8\xc4\x89D\
-it\x8b!\x9d\x9a\xcd\xb3:\x80\x80`m\x14\xd5g\
-\x0cf\x01\x8a\xda=>[e\xc0\x18\xeb\xad\x05\xb4e\
-A\xf0\x9c2>\xdbq@+\xd0\xcc\xc9;B\xb5\x84\
-=GO\x03LG\x05\x82g\x08\xf1h\x8b1\x99\xf6\
-\xd0\xd3\x12\x1a\x10Pyk\x04\xabA\xdf\xf1\xec\x12\x9a\
-\xa9 9\x12\xf3\x5c\xd03J\x80\xf5\xd3\x1d\xe6\x05\xf3\
-\xa3u b\xfd\xaf\xf3\xd3\x0c`\xcajM\x02!\x1a\
-@\xf2\x1fG\x19\x83!\x8b\x17\xa4\xed<\xc3'_w\
-\x00\x94J\x12\x06\xd9\x03\xe65\x09\xfd\x0fB\xe0X\x8c\
-\xdfF\xd7\x07X\xcf\xeb\x84Tw+@\x982\x13\xb4\
-t6\x1c\xf2\x9bE\x8b\x15\x9d\x1fRaD\x8f\x1e_\
-\xaa\xd1\x0eO\x95\x00\x8f\xf73\xa0<)jnn6\
-\xed\x1dU\x1f \xc3\x1eE\xeb\x18\x01\x85|\xdc\x83N\
-\xf3z\x011\xf4\xe1 aT\xd3\x00\x00\xde\xa1\xf6g\
-\x1d\xd7\xd4!ZL\xb1'ct\xd6\xc0\xf9\x01\xfa\x88\
-\x00\xe0\x0bq\xb9\x01\xc0\xa1i\xbfflH\x0b\xf5\xd5\
-W\xc0\xb8\xde\xdeR\xd7DJ\xa6Js\x0bU\xde\x22\
-'\x9f\x0cyb\x84\xf41\xbb\x11)l1P\xaea\
-\xd1rT\x7f6\x88\xb3\x04.\x05\x06\x10 T\xe7\x05\
-\x13\xac\x81\xdd#q\xa5jm`FI\xb7\xb6'\xf9\
-\xf1T)\xffu\x8aw\xf9\xd6\xc0\xbc\xb5k\xd7r\xec\
-\xa6\x06\xe9$\xf9.!\xdd\x00\xde\x87\x064\xf0\xf0\x0e\
-\xcd\x8c\xeemZ\x80-*9\xbb\xc7\xde\x10\xe7\x87\x0d\
-\x08\xf1K\x8e\xa7\xba\x1e\x8cp\xc6\x0fS\x00\xc5\xf19\
-k\xc8\x98\xef m\x00c=+N*@\xd6\xf6=\
-@\xf5\xbc\x01\xba\xa0\x01 o\x15\xf9\xdb[\xff\x14\xed\
-\xc7\xb6|\xf5\xa5\xbd\xea\xfd\xd9\xc0\xdfJ\x9bN\x12\x8f\
-\x0eQH\x15\xa2\xf3i34\xd1y\x9fd\xc7F\xe6\
-gh3)\xe2}K]\x01\xf8\xee\xbb\xef\x86\x22Y\
-\x00\xd1\xd0\xb3\x11I\xfe[\x8c\x81\x9bdZl\xca\x22\
-\xf9\xd8\x9b\xaf\xeb\xed,nM\x0fa~\xa8\x90(\x8f\
-\xb8\xecn\xea\xb5\xa4y\x86\xef\x91\xd8pi\xb9f\x82\
-\xcf\xf0\x0b\xb6\xe7\x83#1W\xfd\xc7\x85\xf8\xfb\x86/\
-c\xa8\xad\x18R\xea\x08oy(\x08_\xef_X\x04\
-\x832\xe2U\xe2e\x12/?\x10D|\x1b\x8f\xcf\xf2\
-i\xae\xcd\xf8>\x82&8\x95\x01\xe8\xd4Xcz\xd0\
-P\x13\x9d\xbfW\x80>\xf6\x1b\x88\xf1\xbe\xb8\xbc\x88\xa9\
-\x8f\xc3A>\x09\xa0~l\x02\x83\xd0:\xc2\x9c.E\
-8\xfe:\xd6\xbb\xc0)~!\xfe\xf6~R,\xbc:\
-T\xf6\xf3@wY\xfc\xf0\x13\xfe\xcc\x8d\xf9y\xc9K\
-g4\xa0\xbe\x1d\xb6t$\x88\xf8_\xbc\xdb\x99\xdeO\
-s\xc3B\xb4\xd7e\xc8O\x90\x0e\xb4\x12\x1b\xefE\x7f\
-\x12\x7fq\xfa:\x0b\x81\xf1\xf7}\xd3\x02\xed\x96`f\
-n<\x83~}\x00A\xfd\xca\xefH\xb2\x10\x9d{\xfa\
-`\xdc\xb3P{\xcc\xb9\x16\xd7\xa7il4@\xec#\
-h\x04\xe3}\x0e\x9a\x03\x00B\x15\x99l\xf4\x9a\xe8\x18\
-\xa2\xfa\xeb\xb5@g!T\x07\x7fD\x07\xc54\x86\xdb\
-\xf8\xbf\xce\xa64\xfe_c\xe3\x00\x8c\x03\xf0\x11\xb7\xff\
-\x03\x7f\x19\x0a\xe4\xd7bc\xda\x00\x00\x00\x00IEN\
-D\xaeB`\x82\
\x00\x00\x15\x14\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -864,6 +346,313 @@ h\xac\xe8y\x0b\x8b8f?\x89\xcd\xd5\x82\xeb\x964\
\xe8,&\xde\x84\xa1k\x84_.b\xfd\xb7\xff\x05\xc7\
\xfd\xe7\xdb#]\x138\x00\x00\x00\x00IEND\xae\
B`\x82\
+\x00\x00\x13\x09\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
+\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x1b\xaf\x00\x00\
+\x1b\xaf\x01^\x1a\x91\x1c\x00\x00\x00\x07tIME\x07\
+\xd7\x09\x17\x17\x15\x19I\x86pA\x00\x00\x12\x96ID\
+ATx\xda\xed[\x09t\x5c\xd5y\xfe\xee{\xb3k\
+\xb4Z\xb2%\xd9\x96dcl\x8316\xb6\x81\x00\xe1\
+\xb04\x14\xc2\xda\x94\x86\x04\xd2\x90Br ] \x14\
+h\x08KH\x09\x87\xda\xadsRR\x02$\xad{ \
+\xe4\xb0\x95\xcd@\xb0\x1bV/\x80\xb1-\xdb\xd8\xb2l\
+l\xd9\xb2,\xc9\x1aK\x1ai\xf6\xe5m\xf7\xf6\x7f3\
+\xef\xf0\xf4:\x9a\x19\x1b&=\xc9i~\x9dO\xf7\xbd\
+\xfb\xee\x9by\xdfw\xff\xe5\xbe+\x1b\x7f\xb4?\xda\xff\
+oc8\x0e\x1b\xbb\x05uR\xed\xf4\x8b]3\x97\x5c\
+\x06\xb7\xef<\xa1\xa4<\xd0\xb3\xc3B\xcd\x0cq5\x15\
+\x12J\x22\xc4S\xe3!\x91\x8d\x85\x84\xc0\x10\x80\x10\xe1\
+\xe8\xd4\x9fC\xf9\x83\x16@\xfc\xd8\x7f\x95h]v7\
+\xe7X\xc6\xd3Q\x99\x08Bp\x01\xe1\x0e\x12\xaa\xc0e\
+?\x84\xec\x81`n\x82\x0b\x90\x5c\x10\x82\x03\xdc\x00\xd7\
+\xd2\x02\xba2.\x0cmH\xe8jHhJH\xe8\xd9\
+\x10W\xd3$T|Hh\xd9\x900\x85\x12\x08M\x7f\
+\x0c\x99\xdf;\x01\xc4\x03\x9e?\xc7\xf9\xf7\xbf\x88\xe6E\
+\xcc$\x04\xae\x03&9C\x052\x11\x80\xc4\x80\x9a\xcc\
+C\xcf@h\x19\xf0l\x82\x90\x02W\x92\xe0\xa6P\xb2\
+\x0f\x5cH\x04S\x13N\xd0\xc1u-'\x14@\xd7\x0d\
+\x03$\x0aA\x8d\x0a\xae\x87\x08C\xc2\xa06\x07\x95\x04\
+3\xa1\x0c\x09n\x84\x00\x84:\x1eG\xf2\xffN\x80\xa7\
+.\xee\xc4\x99\xb7,\x85\xb0\xc8s#\x07\xc7\xb9(\xd6\
+\xa7\xe7\xa1\x98\xe2d\xed>\xd3\x84\x00W3\xa4\xa3B\
+\xc8\x82s\x0e\x03np\x12\xd6P29\x01\x0d\x12R\
+\xcf\xc4\x01\xba&\xcc\x1fn\x80<\x89\xa0'h`N\
+\x90\x1c\x04\x0f\x01<\xc4d\x98\xd8\xd9q)\xba\xd9\xc5\
+\x10\x95\x11\xe0\x85kSXxm ?\xf3F\x09\x01\
+\x9cb8\xc6\x8b\xdc5\x1b\xa2\xc8X\xf2\x1e@\x00\x14\
+N\x90\xdc\x80\xcbG\xf0\xe7<F\xd7u\x18\x9a\x96\xf3\
+ \x9d3\x12'\x09=5\x06u\xa4\x07z\xa2\x0f\xae\
+\x00\x03\xf3\xe4o7\x14\xf1:5\xdf\xe8X\x81\x04\xca\
+\x98\x0be\x8d\xb9r\x0f\x97\x8bi\x82c\xc6\xb9\x89\x82\
+c\xc7xaX-\xb7\xfa\x8b\x8c5!\xc9\xf9>\xcd\
+\xf4\x96\xd4\xa7\xe2H4\xc6c\x0b\x95\x0f?\xd9\x0b\xd4\
+\xd7\x00\xb3.\x85\xde4\x97\x9c\xec\x03\xe8C\xab\xc1\xb3\
+\x06\xd48\xae\xc8\x8c\x88U\xa2\x1b_c\x0bP\xd2$\
+\x945\x0e\x88\x89\x04x\x01\x81\xa2\xd7E1\x91\x8a|\
+\xd6\xb1~\xb6iZ\x1aH\x1c\x01\x0e\xbf\x0f\xd7\xbe5\
+\xa8Z\xba\x02\x9e\xe9\xcb\x00\x96\x1f\x0a\xce\xbe\xda\xf38\
+N\x00>\xaf\x00BLp\xdd\x223iyD\xd9\x87\
+\xe7\xe5\xbd\x80P\xfe\xb3\xedky\x11\x0e\xbc\x09\xac\xbd\
+\x13zf\x16RC\x02\xe9a\x015)\x98\xa1bI\
+%\x04(|8\xce\x8b\xccl1a\x8e\x918/\x15\
+Z\x93\x08\x13'\xf2\xe91\xe4\xec\x93\xd50\x12^\xa4\
+\x8f\x9a\xe4\xf3\xb7B\xc0_\x81\x1c \x0a\xc9\xd8\x84J\
+\x92q\x1e\x97\x0a%^F\x9cB\xf1l\xf2\xf6D1\
+\xdd,\xaf\xd6#\xc3\xb2\xcf-@\xa1\xdb\x15xA\xb1\
+\xd8u\x1e\x17\x0f\x95\xc2DY\xc6\xc3\xe2\x83D>\x8c\
+\x02\xe3\x1a\x84\xc5\xbcr\x02@\x14\xcd\xe86\x81\xe3M\
+\x88E\xae\x17\x92-\x1c\x1f\x1bp\x90w\x98\xa1C\xa0\
+\xd2\x02\x08A0\x8e=\xa3\x17\x86J\xf9$\xc8\x8f1\
+)\xc6K\x90'\x13\xa6\x07L\x9c\xb7\x0a\x09\xe0$[\
+\xbe\xd4\x95_\x03\x94\xff\xacB\x0f\x8b\xf5\x03\xa9Q\x94\
+4C\xb7\x89W8\x04,\x18\x05\x0fW\x9eL\x91k\
+(\xa8&\xc5E\x8d\x1d.O\x1e\xc8/\x93\xe1\x14\xa0\
+\x12e\xd0A\xb6\x10E26l\xa2\xb9~\x10\x98u\
+\x0en\x9d\x13`\xf7M\x9a\x10\xcb\xcf\xbc3\x09\x026\
+D%\x04@\xc9D5\xb9\x10\xb0\x88\xb1c$n\xc2\
+>\xb6\xbf'j\xce\xfc\x08\x8e\xd5\x04\xd7-\xe2\x16*\
+\xe4\x01eVz\x0e\x22\xc5\x88\x95\x12\xc3\xeas\x0a\x87\
+X_\x01\xf9\xb2f8\xca`%\x05(\x1f\xdbN!\
+\x9cd\x0a=\xc2&n\x0bdX\xe0@\x9c\xc8g\x88\
+\xbcT\xe4}\xb5t\x15p\xa0\xd2+\xc1\x828\xb7`\
+\x93\x13\xff\xdb\x0b,b\xc2\xe1\xe66Y\x82\xe38~\
+\x88\xc8\x0f\x03\xb25TX\xe0(g\xf6:\xc0\xf6\x82\
+\x0a\xaf\x04=U@\xfd\x09\xf9\xa7\xd1\xd3@&\x0c$\
+\x8f\x02Z\xd2\x99\xe8\xecX.\x14\x889\x12\xa3S\xa8\
+xo\x9e\xbcd==\xb3E\xb0\xfd\xbat\x15\xb0\xcb\
+`\xe5\xd6\x01\xb6\x08\xfe)\xc0\xdcK\xe14\x91\x17a\
+l/\x10\xfa(\xe7\xbe\x85\xeeO\x10\x13\xfa\x84\xc3\xe5\
+\xf3m\xe2\x90\x93\xbcM\xd6\xd9\xf2\x12\xcc\xac$X\xe9\
+u\x80#\xbb\x17\x1a\x03\x82-y\xb4_\x98\x17\xe0\xe0\
+k\xc0H\xa73\x1c\x18\x016y\xb3\xb5\xc9\x9b3\x7f\
+\xd4r\xfb2\x02\xc0\x1eSr\x1d \x08\x15M\x82\xb0\
+P\xcej:\x80\xd3n\x05\xce\xb8\x17\xa8\x9e>!\xce\
+\xed|`\x9f[\xe4\xb3\x16y\x09\xd4Z\x90\xca\x80\xa1\
+\xf8\xcb\x90\xa8d\x15\xc0$\x19\xdfP\xca\xaf2\xea\xe7\
+\x01\xe7,\x07:.s\x84\x84\x0d\x93\xfcA\x22\x1f\xb2\
+I\x95\x03+-\x820\xf4\xcaW\x01\x22j'\xaaH\
+\x0f\xb0\xeen@\xe8\xf9so5\x10l&\xb2'\x02\
+\xd3\x96\xd1y}\xc1v\x22N\xba\x01\xa8\x9b\x03\xec\x5c\
+\x09\x18\x9a\x95\x00\x09\x89\x03\x80b\x91\x17\x93\x00\x8eD\
+h\x1b\xb7\xa7\xad \x1c\xb8\xe6\x8c\x16Q\xe92\x88\x89\
+\xe5O\x07\xb2a\xc200\xba\x1d\xe8y\x16h\x5c\x04\
+\xcc\xfe3\xa0\xba\x1d\x0ek9\x17\xf0\x90X\x9d\x14\x16\
+\x9a\x0a${\xec\x99\x17%\x92\x9cp\x10v\x92f\x13\
+ \x9c\x1e\x90\xfbU\xb1\x10`\x02\xce\x9a?Y\x19\xb3\
+\xb6\xbaG\xb6\x00\x9b\x7f\x00|\xb2\x8a\xba\xb2p\xd8\x94\
+\xc5\xc0\x92\xfb\x81t\x9fI\xbex\xcc\xdb\xfd\xc7\x17\x1a\
+\xa6\xd9e\x90P\xa9$\x08QX\xd7m\xf2\x85\xab>\
+S\x88\x815$\xc4\x1d@j\x10\x0ek:\x138\xf5\
+\xfb\x05d\xcb\x82M\x1a\xff\xce~\xf6;]\x09Z\x04\
+\xfd\x8d@\xfb\x05\x80\xbb*\x17oH\x0f\x01\xf1\x83\xc0\
+x\x17`\xa8\x13D\xa06u\x18\xd8J\x22,y\x10\
+\xa8\x99\x8bOm\xfe\xdf\x00\xa3\x1f\x00\x87\x9e\x01P&\
+\xfeQ\xc2\xf5%G\x9e\xc8\x83\xeb\xf6\xed\xa22\xeb\x00\
+\xe7\xcc\xfb\xea\x80\xd6\xb3`\xdbR\x02\xf2+\xc1\xa1w\
+\x80\xbe\xd5t\x1c\xb1\x17;Z\x14\xd8~\x17\x89\xf0\xcf\
+N\x11\xce|\x04\x18y\xd7\xac\xfd\xc5\xe3\x9f\x17\xf5O\
+'i\xc9>\x17\x10\x16\xf1\x8a\x87\x80\xed\xee\x93\x9a;\
+\x08\xb4_\x05\x9c\xf5S\xa0q\xa9\xf3\xe5f|+\xb0\
+\xfer@\x8b\xd9\xe3=\x0d\xa4\xddO\xca\xd7|f\xb7\
+6\x8a\x84\x06\x9b\xc4\xa1*#\x80s%X\xd2<\xf5\
+\xc0\xe2\xfb\x80\xb6+\xf2^\x90\xd8\x07(G\x80T\x0f\
+\xb0\xfdV8\xac\xfdZ\xa0\xe1\xb4\xcfP\xfbK\xc2\xb1\
+\x12\x14\xa2b\x02p\x0b\x02Pb@x\x170\xb2\x0d\
+H\x0eN\xf2-\x0c\x98\xfb]\xa0\xf1L ;h?\
+x\xffSt\xcf;\x13\x86Q\xe7)\xf7\x1dg\x22,\
+q\xcc\x9c\xc4\x05*\x97\x03\xec\xfa?\xbe\x17\xd8p\x1b\
+\x00\xdd\x0a\x09\xeb\x05\xa9\xe3J`\xc6\xc5\xce\xa5\xd9\xc2\
+\x1f\x11\xe1\xdf\x02\x91N\xfbAw\xdf\x05\x5c\xb8\xd5\x1e\
+\xd7Ja\x13l\x03\x92\xfd\xce\xd8g6\x0ac\xbd\x04\
+\x80\xcf\xb6'\xf8\xe0}7-\xdc\xf2\xf6O\xa5\xd2U\
+\x80\xc0U\xe7\x92\x18\x84L\x08\xd8\xfb\x18\xb0\xfd\x87\x80\
+\x91\x99\xf0\xc9n\xe0\x0b\xbf\x06\x5c.{\x16\xe3\xdb\x80\
+\xd1\x89^ \x03\xed\xdf,;\xf3N\x14\xef\x17\xec3\
+\xe6\x80\xb77\xf7\xae~k\xc3\xbe_\x90\x08\xach\x0e\
+(\xdc\xf3s.\x90\xc6:\x81\x0fo\xb4\xfa,\xab\x9e\
+\x0f\xb4]\xe7\x8c\xe3\xfe_\xc2a\xd3\xaf.A\xbaL\
+\xdc\xa3\xe0\xdc\x0e\x83\xe3\xc9\x01\xe3\x8a\x9e\xed\xdc58\
+\x7f\xc7\xee\xc1\x7f%\x11Jo\x89\x81;\x84\xb0wo\
+\xf7\x00\x87\x9f\x03\xf6\xac\x84\xc3\xe6\xdd\xe5$7\xba\x06\
+0\xd2\xf6\xf5\xda\xc5\x80\x7fj\x01\xe9\xe3$n\x0b \
+>\x83\x07$3\x19C\x81\xfb\xce\xd7\xdf\xec\xba\xe6P\
+\xff\xd8C\xc5\xdf\x06\x09\x81\x16\xe0\x8c\x1f\x03\x17=O\
+\xed\x0a 83O>=\x80\x9c\xed\xa5\x9a\xaf\xc5'\
+x\xc1\xc9@\xcd|\x9b\x94 \xf2\xd1\x0f\x9dIs\xca\
+\xd9\x85\xa4Q6\xde\x0b\xc93'q!\xb9\xe5c\x12\
+ \x95\xc9\x1a)\xdd\xc8\x8eE\x92\xb7<\xbbz\xeb=\
+k_x\xf0\x9e\xc2?\x8d\xf1|\xe6^r'Po\
+\x12r\x01u\xd4\x9e\xbe\xc2v{\x86\xfc\xe2\xe7\xc8\xab\
+p\xd8\xd4\x8b\x9d3\x1b\xdb\x0c\x87\xd5.:\x0e\xa2e\
+D\x80\x05\xfa\xb5\xcbw\xfa/\x96?p\xeb\xeb\x8f=\
+\xfc\xc3\xef\xfc\xec'\xf7N/Z\x052\x8a\xa2'\xd2\
+\x19\xff\xf6M\x9b^Z\xbat\xe9k\xcf\xbc\xbc\xf9\xa1\
+\x0f\xff{\xe5\xc8\xd9\x97\xfc\xc3*G\x12\xac\x99\x0dT\
+\xb5\xc0a\xee\x1a\xe0\xe4\xef\x01\xdb\xbfo\xf7\x8dn\x00\
+:\xbe9\xc1\x0bNq\xbawf\x1f\x1cVu\xc2\xf1\
+\x91G\x89\xbe\x09%p\xe3\xa6.\xcf\x86\xa1\xfd\x977\
+\xd4\xd7^>sf\x8b\xf8\xea\xd5W\xec\x9a6m\xda\
+{UU5\xeb3Y\xf5\x83\x7f{\xe4\xe7\xa39\x01\
+\x14M\xe3\x14\x06~\x90q\xce\xffvgw\xff\xb9/\
+\xbd\xb1\xedq\xca\x07\xc38\xfc\xa4-\x80\x96)\xb2\xf9\
+q\x0a\x1c\x96\x19\x80\xc3|\xcd\xce\x87V\x87\xe00o\
+KY\x82\xe5\xc9;c\x9f\x83aj\x9d\xf7\xad\xdaT\
+\xed\x02&\xb9Z\x87G\xa2ll<\xb9\xa8\xb7oh\
+\x91,\xcb\xb7\xa9\xaa\xca\xe7\xcc\x99s{N\x00]\xd7\
+Y:\x9b\x0d\x80l\xc7\x8e\x1d\x83\x0b\x16,\xf8\xbb5\
+o\xef|\xbaeZ\xeds'\x9d0S\x0er\xc3\xda\
+\xc1\xe9\x07\xd2G\x81@3\x1c\x96<\x0c\xe7\x02\x5c\x86\
+\xc3\x5c\xb5\xce5\xbf\x91\x82\xc3\xe4*\x1c\x97\xb1\xc9\xfb\
+F\xb2>\xbc\x1f\xa9\xc3\xc1L-\x0egk0\x1eK\
+_\xa4\xebI\xc4b1(\xe4\xe5\x84}\xc4\xb5\x95s\
+^o\xf9\xe2,\xf3\x17\xb8\x10\x8c\xf2@\x10\x96uw\
+w?c\x18\xc6\xd3\xff\xf9\xf4\xba\xc0k\x91\xb9rZ\
+x\x00n\xfd\xe3\xc8\xf5\xb7\xe5W\x83\xb0,;\x0a\xec\
+|\xc8I\xb0\xaa\x03\x0e\xd3\xe3p\xee\xef{P`\xf6\
+\xfd\xc7e\xe3Y7~\xb5\xb7\x19\xd7\xbf\xbd\x00\xcb\xfb\
+\xcf\xc5{\xb1\x99\xd8\xdc\xaf\xe0\xc0\xde.\xd4%\xbaQ\
+\xa7\xf4?ZSSs\xe1\xca\x95+g\x90\x00Kg\
+\xcf\x9e\xdd#I\x12\xacoz\xcb\x05\xb2\x80\xcf\xd3\x94\
+U\x95FL0\x12\xe0&U5N^\xfe\xd8\xda\xd3\
+<\xb7\x5c\x86\xcb\x9b\xfa\xe03_{\x93}$\xf5&\
+`\xee\xd7\xf3\x1a\xf6<\x01\xa8$\x82<\xe1\xe1[.\
+\x83\xc3R\xbd6yF\x90\xeb\xe10m\x1c\x10\xc7!\
+\x82\x99\xe0F\xaa\xf0\xec\xee\xa9\xd8\x12\x9e\x06M\xd7\x10\
+\x8f\x8fCD\xdf\xc3\xe5s\x0d\xccY\xe4\xc3\x89\xb3\xda\
+\xe0\xadm\xa6<}A_\xfb\x95\xf7\x0c\x03\x10\x0f?\
+\xfc0#[,D.k_Mx\xc3u\xcf\xdf_\
+\x83\xc7\xd6\xeelJ\xa6\xd5\x16\xcb-8\x01\x07\x0f\x1e\
+L\xb7\xb5\xb5}%\x1aIl]\xf1\xcb\xdf6\xc97\
+~\x11\x97d\x87\xe0\x96\x00\x16\xeb\x07\xdb\xfe/\x80y\
+,\xe3\xd3\xedl\xc6\xac\x87\xdf\xf9\x03\xe0\xc0\xa3f\xc9\
+\xcc#\xfc.\xc0'\xb8\xafo\x0e\x1c\xa6Z\x028E\
+\x98\xb4o\xf3`\x10\xab\xb65c\xd3a/\xa2\xd1\x08\
+b\x91\x8f\xf1\xa59\x0a~t\x9e\x84\xf3\x17\xce\x04\xab\
+\x9b\x87=\x83@d\xe8\x10\xa2\x07;\x11\xee\xddy\xf0\
+\x9dp\xf3\x01\x00|\xc5\x8a\x15\xcb\xc8\x1b<$\xc0\xeb\
+\x00r\xa5\xca\xd5\xd8X#e\x15\xad\xdf\xd05\x0e\xa0\
+\x86\x90&h\x041\xbb\xbf\xffp\xf4\x84\xa6\xeb\x87\x8e\
+\x8c\xacY\xf1\xe4&\x96\xb9\xfaj\x9co\xbc\x08\x8f\xac\
+A\x96\xcdJH\xa0V\xa6\x96Y\xe7\x8c\x13\xc2]`\
+\x11\x82\x9c\xaf\x9c)]\xc6\xa1\xb1\x00\x8e\xc4<\x18\x8a\
+z\x10z\xf5\xbf\x10\xd3\xd7!\xcd\xa6#e\xd4\x01$\
+l-\xef@\x8d\xcf\xc0\xd4j\x0ds\x9b2X6#\
+\x85)~\x1d\xa6\x0d'\xdc\xd8p\xb0\x1a/uM\xc1\
+\xc7\x83\x12\xc2\xe10\x22\xe3\xe3\xf8\x8b\xa5\xc0\x037\x07\
+p\xe2\xbc/\xe4\x12\xb1\x88\x1d\x811\xb4\x1d\x91}1\
+\xa4\x14\x91O7n\xb75E`---\x17\x9b\xf9\
+\x80\xecyX\xe6\xba\xfd\xdeU\x1c^\xff\x12\xa8Y\x93\
+\xfc\x14B\x15!F\xc8\x10\xf8\x99\xd3G\xd7m<\x5c\
+\xf7`o\xdf\x91\xfb\x1f~IB\xf4O\xaf\xc22u\
+5<.\x1d.W\x9e\xbc\xcb\x12\x81\x13\xdbP\xda\x8b\
+\xc1\xb8\x17\xfdQ\x1f\x8e$\x83\xd8?\xecBoHC\
+:\x93E6\x9b\x85\xaaf D\x1a>_\x06\x81\xc0\
+(\x82\xf2\x18<H#o\x12\x09\xe4BF\xf7\xc0\xef\
+\xaf\xc7\xecf/=Z5\x14\xe1C\x86\xee\x1f\x0a\x8d\
+ <6\x86\xa0\x17x\xed\x8ez\x5c\xf2'\xe7\x03\xb5\
+'C()\x18\x07\xd7\xe6\x04\x10\x06\xc0Iy\xc1\x04\
+\x84\xe0t\xec\xca\x15_\xf3\xbb\xeb\xeb\xeb\xaf\xef\xeb\xeb\
+\xcb\x80nw\xbe\x0d*\xf4\xe9\x00\xb7PG\xf0\x13\xa2\
+\x9b\x81D\xbb\x0eva{\xf4\xb9\xf7\x0e\xd7\xce>\xd4\
+7\xf0\x97O\xbc\xc9\xb0\xff\xa4\xf35ytK\xca`\
+\xae\xa0\xaf\xaa\xc6\xe5\xae\x9e\x82\x81\xa8\x84\x811\x8eh\
+<\x8dT*\x83D2\x8d\x804\x88\x93Zu\x5c\xbb\
+T\xc2\xbc\x19@[\xb3\x84\xf6\xd6 \x9a\xbf\xf4\x22$\
+3Q\xbaH\xf3\x9d7\x83\x99\x9b&\xba\x02(I0\
+5\x85\xa7\xd6\xeb\xb8\xf1?R\x18\x19\xe1\x85\xc9\x9e\x01\
+\xabo\x0b\xe0\xbc+\xbe\x05\xe1i\x82H\x0eC\xdb\xf7\
+\x12\x90I\x12a\x19\x0c\xc8\x91\xe7\xd6\x96\x92\x90h\xa6\
+\x00\xf6\xca+\xaf\xdc\x10\x08\x04fG\xa3\xd1U ^\
+\xc5\x0a\x8a\x8b\x10$4\x10\xbc\x84ds\x10\x89\xf3\xe7\
+\x815\x04Q\xfb\x9b\xfd\x0dw)\xdc\xfd\xdd\xd6\xd6V\
+\xf4\xf7\xf7\xa1*\xe0\x0574\x84\x86#0\x0c\x8ei\
+\xb5\x14\x87\xf3%\x9c;\x8f\xe1\x82\xa5Mh\x9f=\x8b\
+*\x5c\x13\x98\xbf\x01\xcc[\x0b\xe6\x0e\x82A\x03\xb8\x92\
+\x033\xb2\x10j\x14,=\x08\xa4\x87s\xdb\xecL\xcb\
+\xe2\xd0Q\x81\xb3\x97\xd7b$\x1c\x01Yn\xc6;\x1a\
+%\xec\x09\x01\xa7\xb5\x09|\xf0\xb3\x0b \xd1\xeb7O\
+G\xa0\xedy\x06\x22\x9b\xb47\xaau\x81M\x078\x14\
+\x8d\x83\x09\xae'\x1b\x16/|\xba\xa7N'\xf2[>\
+\xfa\xe8#\xcf\xc0\xc0\xc0\xa9\x00z\x8b\xed\x07\xe8\x848\
+A\xb5D\xa8\x1dN\x22\xf0z\x17\xa2'5#|\xde\
+\xac\xc8\x9d\xef\xf65\xb3\xde\xde\xde\x9b\xcdX\x22o\xb4\
+f\x85\xe1\x9c9\xae\xc8\xbd_\x9f\xe5\x9f\xb5\xe8Bo\
+\xb0u!s\xfb\x82H\x0b\x05\xc4\x90\xa0\x101\x82\xaa\
+\xd0a\x14<\xd9\x9f\xdb,\x91\x94\x10$=\x01\x99\x09\
+\xc8B@\x12f\xcb\xd0=\x5c\x0d\x0e97\xdb7\x9e\
+\x03|\xeblPh\x00\x7f\xfdB-f4$\x10\x97\
+\xdb\xe0J+H\xedZ\x0d\x91\xce\xd0}f\xfc\x09\x08\
+\x9d#\x95\x11T\x1a\x01\xb3'e\xf8\x1eyd}\xba\
+\xbauz\xfd\xbf\xf7\xf4\xf4\xd4\x11\xf9\x1bL\xf2\xe56\
+D\xb8\x15\xff#\x04E\x00\x8d)\x15S;\xfb\x11\xdb\
+\xd6/\xc6[\x1b\x95\xefi\x9a6\x04\xe0\xdb\x846\x02\
+\xbcn\xb9w\xd9\x895\xf7\xb6_\xf9\xe8u5SZ\
+\xdaT%-\xa53\x09\xb7\xa6\xa6]Jr\x14\xa3\xfd\
+\xbd\x99p\xff\xc7n#\xbe\xbfZ6\xe2\xbe\x80WT\
+y=\xc2\x13\xf0\x08)\xe0a\xb9\xca\xe2\x22\xb8\x19\xc0\
+\x0d\xe0\xdd\x819H$\xba0\xb3\x1e[\x82n\xecy\
+m\x07j=.Q'\x04?\xefp\x18\xfa\xc7=\x11\
+\xc9\x88\xbf*\xf3x\x04\x01\xb7\xcc<L\x80q\x01E\
+\x15b\xdf0\xd4\xa3\x096z(\xea\xde\xf8\xe1\xa0\xdf\
+5\xeb\xc4\xa6\xd5T\xd1\x9a\xf7\xee\xdd{7\x80_\x1d\
+\xeb\x8e\x90\xb0\xbc`\xdcj\x1b\x09\x0d\x02\x08\x1c\x09\x8f\
+\x87\x01\xac\x90e\xf9\x9f|>\xdf\xf6T*\xb5\xd0\xe3\
+\xf5\xbe\xdcq\xfa\xd5\xef\xcf>\xe5\xec\xaf\x09.\x06\x0c\
+CS\xe2\x91p\xf7\xde\x1d\x1bwo\xfc\xcd\x93\xa3\xaa\
+\x9a\xf6AW}\x86\x11\x0c\x08\xdd[%\xb8VE\xa1\
+\x13dB\xaf\x97\x99\xde\xe0\x96\x8c\xdaj\x9fA-\x0f\
+\xc6\xa4\x99\xf3;\xfb\xa4*UQ\xe2\x0b\xe6\xe0\x0e\x83\
+#\xab\xab\xf0eT\xe1\xf3\xbb\xb8\xa7\xfb\x88\xb1d\xcd\
+;\x9d\xcf\xca.\xd6\x00x\x83\x0c\xc2\xc7`\xb8\x05\x87\
+\x94H\xc3\x08\xa7\xb8r$*\xbc\x9ag\xda\x17;\xe6\
+\xcc\x98\xd1\xd5\xd5\x95\x08\x85B\xf7\x00x\xf4\xb3l\x89\
+\x19\x84\x84%\xc2\x14\x0b3\x08\x11\xc30\xc6\x1a\x1a\x1a\
+\xb6d2\x99\x85\xfe@p\xd7Wn\xbcw\x9a\xcb\xed\
+5\xb3\xed\xfb]\xbb\xf7\xbc\xb1\xa3sk\x94C\x97\x1a\
+O\xfa2\xe3\x5ce\xa4\x89\xc4\xf5,3\xd4\xb4\xa4+\
+)IW\x932eoY\xa3\x96gS\xee1-\xed\
+\x19\x1cc\x0b\xdd\xcd\xcb\x1e\xdd\xd9\xf5:$\x86\x07;\
+\xa6b\x9b\x00\x1dj\x90\xb8L\xe9\xc4\xa5\xde>,\xd8\
+[O\xae\x1f\x9bu\xe1\xb2Y\xcf\xb74\xf8\xd3\xe3\xb1\
+\xd4\xb4\xd1h\xfa\x84pL\x9foH\xfe\x99\x9e@]\
+\xa3\xab\xc6\x1f\x8c\x86\xc3\xea\xce\xee\xf7^\xd6u}9\
+\x80]\x04\xed\xf3\xfc\xaf1f\x89UK\x98j\x95\xca\
+$\xd5\xd5\x9b\xa8&\xdf\xd6\xdc\xdc\xfc\x0dz\x87P\xd2\
+\xe9t\xe2\x8d7\xde\xd8=\xc9\x96\x86\x80\x05\xd3\x98\x10\
+\x9c\xc3\xe0B7\xe8H\xe5\x86\x9a\x11\xdb\xb6\xed\xa8\x86\
+\xb7z\xed\xde\xbd\x9f\xcc\xeb\xec\xec\xdc\x0e\xe0L\x82\xfe\
+\x8f\x00\xd6-\x06K\x8d\x83Ec\x90{\x13\xec,\xba\
+\xf3y\xb7\xdb\xdd\xec\xf5zUj\x99\xcb\xe5r\x93\x81\
+\xc8\x1a\xf1x|\xbf\xa2(k\x01\xfcZ\x08\xd1]@\
+\xbc\x9c\x07\x94\x08\x09\x8d\x10!(\x84&\xc2\x14UU\
+\xe3\xe6\xba\x9a\xda\xa6\x97\xc9\xc8+8\x00\x97S\x00\xe7\
+\x9f=\x18c\x1c\x8cA\xa2\x1fx\xdc\x02\xf0\xf1w7\
+|\xd4\xee\xf7W=\x91\x88\xc6\xe6m\xdb\xb6m\x14\xc0\
+5\xd6x\x99\x04\x90\xf01d\xab*\xd5\xe4wTp\
+\x0b\xe5\xa1\xb3\x08\xb5\xd6s\x85\x09\xfb\x09\xa6p}\xd6\
+bNTfW\xb80$\x92\xd6\x97fi\xc67\x92\
+\x00J\x22\x918\xe3\xc0\x81\x03\xafQy\xe4t.\x13\
+I\x13\x92U!r\xe4\xf3\x13/\x0c\xab\x95H,\xb1\
+n\xdd\xba6\xba~=-O\xbfs\xe8\xd0!\xff\xa6\
+M\x9b\xc6\xe9\xda_\x01\xc8\x12\xda&|\xa76\xc1\x0b\
+\x93\x84\xdd\x84NB\x8a\x90\xb1&E/G\xbat\x08\
+\x1c\xff}2!\xe0\xf1x\xbeM\x1e\xb0\x9c\xc2`\xe5\
+\xa9\xa7\x9e\xba\x9e\x92\xa3\x9b\x5c\x93Q\x82\xe4\xe4\x9a:\
+\x09\xa2r\xce\x0d\x1a#(_\xc8\xe3\xe3\xe33\xfc~\
+\xff)4\xe6\x22j\x97Q\x82b\x94\xa1\x0d\xea\xff\x10\
+\xc0*\xc2Q\x8bP\xc2*\xc9\xb1\x1cQ'AnA\
+\xe0s\x1a\xab\xc0\xfd&\xaec\x8c=L\xa4j\xab\xaa\
+\xaa\x86\x89X\x8a\xda\x0c\x09 <y\xf3\xd1\xf5\x06B\
+\x8d9\xfb\xe49\x88D\x22\xc6\xd0\xd0P/y\xc2\x06\
+ki:`\x11M\x12\xd2\x96\x08\x9aM\xf6wc\x0c\
+\x95\xb3*\xc2\x97\x09\xa7\x13\xda,\xc2u\x047\xe7\x5c\
+\xb2^A#\x84\x83\x84n\xc2\xfb\x84~k\xa6\x8dr\
+\x7f\xd6\xfb\x03\x10\xa0\xf0\xf3\x1c\xff\x0a\xc0\xf9\x17V\x81\
+\xdf\x13\xfb\x1f\x84\xaf\xe2\x02\x22\xe6\xe9\x93\x00\x00\x00\x00\
+IEND\xaeB`\x82\
\x00\x00 \x1c\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -1380,39 +1169,250 @@ O\x9c?\xff\xdc\xe1\xfd\x07\xbez\xe1\xd4\xf8\xd3Q\xcf\
T\xcb\xa0\x80\xcd\x08\x0c\xd7\xaf\xf5\x8f\xa8\x9d\xdf\xb0_\
\xad7\xf5:\x7f\xfe\x1f_\xbc\xdd\xe6\x1aS\x0c\xc2\x00\
\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x0d\x06\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00@\x00\x00\x00@\x08\x06\x00\x00\x00\xaaiq\xde\
+\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\
+\x00\x00\x00\x09pHYs\x00\x00\x06\xec\x00\x00\x06\xec\
+\x01\x1eu85\x00\x00\x00\x19tEXtSof\
+tware\x00www.inksca\
+pe.org\x9b\xee<\x1a\x00\x00\x0c\x83ID\
+ATx\xda\xed\x9b[hU\xd9\x19\xc7\xd7IN\xa2\
+&&\x1a\xe351^\xc6T\xad\x97J\x95)8\x14\
+\xc4\x22\xb6\xccs\x9f*\xf4a^|\x10\xc4\xc2\x0c\x08\
+}(\xf8TJ\x1f\x15\xa4O\xf6Q\x0aR\x90N\x07\
+A\x94\xfa\xe0\xfd\xd6\xaa\x03^\xc6\xfb5Qc.F\
+\xcd\xc5~\xbf\x0d\xbfa\xcf1\x92\x8c\x1c\x83\xc1,X\
+\xec\xbd\xd7Y{\xad\xef\xfb\x7f\xf7\xb5\x93\xc2\xeb\xd7\xaf\
+\xd3\xc7\xdc*\xa2\x8f\x030\x0e\xc08\x00\xe3\x00\x8c\x03\
+0\x0e\xc0G\xda\x8a\x1f\x1aA\xc7\x8e\x1d\xdbS]]\
+\xfd\xb3i\xd3\xa6}\xe1\x98\xad\xad\xad\xed\x8f\x95\x95\x95\
+\xf3W\xaf^\xfd\x8br\xed\xf7A$B\xdb\xb6m[\
+P,\x16\xff\x10\xb7\x9f\xcd\x9e=\xbbe\xf2\xe4\xc9\x93\
+\x18\x876\xaf\xb6\x81\x81\x81\xc1K\x97.\xdd\x1a\x1c\x1c\
+\xbc\xd4\xd1\xd1\xf1\xb7\xbd{\xf7\x1e\x1a\xd3\x00l\xd9\xb2\
+\xe5\xb3\xfa\xfa\xfa\xc3!\xf5\xaa!\x09,\x14\xd2\xdb\xc6\
+\x03\x84t\xfd\xfa\xf5C\x15\x15\x15\xbf\xd9\xb3g\xcf\xab\
+\xb1d\x022\xff\xcb\x9a\x9a\x9aC!\x84\xe2\xcb\x97/\
+\x87cx\xc8\xb1\x96\x96\x96\xf5\xd7\xae]\xfb&\x1e\x7f\
+5\x96\x9c\xa0\x0c\xfc\xb3\xbf\xbf?\x13B\x00\x91\xaa\xaa\
+\xaaR\x98\x02=\xbb\xb7;n\x9f8qb\xc6<\xa0\
+\xd1\x9b\x9a\x9a\xd6o\xd8\xb0a\xdd\x98\xd2\x80\xcd\x9b7\
+\xff9\x98i\xec\xeb\xebK\xcf\x9e=K\x0f\x1e<@\
+\xa5G\x0a\x5c\x0a'\x99\x1a\x1b\x1b\x93\xad\xae\xae\xee\xaf\
+q\xf9t\xac\x00\x00\xb3_\x04\xf3H\x10\xef\x9e\x16-\
+Z\x94\xc2\xf9\xa5\xe7\xcf\x9f#e\xe7\xa4\xce\xce\xce\xd4\
+\xd0\xd0\x901\xfc\xf4\xe9\xd34i\xd2\xa4t\xfa\xf4\xe9\
+\xf4\xe4\xc9\x93D\x0b\xff\x91hS\xa6L\xf9\xf9\xc6\x8d\
+\x1b\x8b\x07\x0e\x1c\xe8\xff\xe0\x01\xd8\xb4iSu\xb4\xe9\
+q\x0b\xc3x\xf6\xb4j\xd5\xaa4a\xc2\x84t\xe3\xc6\
+\x8d4k\xd6\xact\xea\xd4\xa9\xd4\xda\xda\x9a\xe6\xcf\x9f\
+\x8f\x9d\xc3`\xbaz\xf5jZ\xb8pa:{\xf6l\
+\xf6Nww\xb7\xe6\x00h\x95/^\xbc\xd8\x14K\xfe\
+\xfd\x83\x88\x02\xdb\xb7oo|\xf4\xe8\xd1\xba \xbc?\
+\x88\x9d\x17\xd2[1s\xe6\xcc\xdf\xde\xb9s\xa7+\x88\
+\x9e\x1cc\xd3\x83\xe0\x84\x16\x00B\xc4\xf7w\xd1\xa2L\
+3\x02\xcc\x0c\x84[\xb7n\xed\x0b\x8d\xd9O8\x8d~\
+4\xd6\xfc\xf7\x89\x13'\x1e\xbc\x17\x00~\x1dm\xc5\x8a\
+\x15\x95\xc1Tm0\xd3z\xe6\xcc\x99\xdf\xafY\xb3\xa6\
+9\x18}\x10\xd2h\xbap\xe1B\xed\xb2e\xcb\xd2\xdd\
+\xbbw\xd3\xd4\xa9SSWWWz\xfc\xf8qFl\
+\x84\xad\xc4\xbe\xd8>\x12\x0c\xa0\x90\xa8\x9e~\xc4\x0dM\
+a\x1d\x1c(f\xc3\xfd\xe5\xcb\x97\xf1\x07\x98\x13\xfb\xbc\
+\x0e\xad\xba\x1cN\xf4\x1f===\xff\xda\xbf\x7f\xff\x89\
+\x9838b\x00v\xec\xd8\xb1\xf4\xe6\xcd\x9b_\xc5m\
+\xcb\xe2\xc5\x8bo\xd6\xd6\xd6\xd6\x04\xa1\x8bz{{[\
+\xcf\x9f?\xdf\xc8&\xa8$\x92\x84Q\x18\xc0c\xf3\x8c\
+m\xbfz\xf5\xca\xae'wi\xa4\xce8D\xd2\x99\xcf\
+\x18L\x0c\x1b\x0e\x01-hQ\x0bx?c\xd8\xe7\x90\
+z\x8a\xe8\x82\xf9\x00>~\x22\xdb;\xe8\xeeloo\
+\xff&\xf6\xfd2\xe6\xdc\x1e\x12\x80\xdd\xbbw\xa3\x8b\xbf\
+{\xf8\xf0\xe1_\x8e\x1f?>;\xd4\x88\x97\x0d7\x10\
+\x08\xe1y\x06\x91\x1e\x1b\xdb\xdfxFBt\x1bk\xe0\
+\xd0d\x9e=`\x8c{\xae\xf9n\xf3=\xaf\xac\xeb\x95\
+\x0e\x00y\xe7\x19\x1a\x09\x08\x00\xc5\xfa8O\xfcH\xe6\
+gB\x1b\xae\x1f=z\xf4\x937\x00\xd8\xb5kWM\
+\xd8\xd0\xd7\xa1\xaa\xebb\x92L\xb2\x10\x1d\xc6\xd8\x14\xbb\
+\x858\x09\x18\x16\x006\x869\x1b\xce\x0b-\x810\xc6\
+\xed#\x01\x80.\x93y\x10X\xcb\x88\xe0\xef\x87\x0f\x1f\
+f\x1f\x98V\x08\xdc\xd3\xfb\xc3$\xebo\xdf\xbe\xdd[\
+\xf4\x85\x9d;w\xb6D8\xfa6T\xb9\x96\xd0\x93'\
+\x02d\x91\x18\xe3a\xf3i\xee\xdc\xb9)^\x06\x086\
+\x960\x89\xcb\xe6\x00`\xe4\xea? \xd6\xe6\xfa\x00%\
+\x08j\x80\xfb9\xce\x9a9@\x87\xd4\x00;\xcc\xf1\x1e\
+\xfe\x06\x8d z`V\x08\x12 B\xab\x11$\xeb\x17\
+\xc3\x17\xfd\x09_\x9d\x01\xb0o\xdf\xbe\xc6\x90\xca\xb5(\
+2\xaad:\xcf<I\xca\xca\x95+\x13\xed\xc8\x91#\
+ \x9d\x81\x10~\x00\xe9\xe6\x01\xc8\x88\x8e\x82\x86\x8d\x01\
+\x8d5\xb2Mmj\x14\x8d\xb90\xc7\x1e\xd3\xa7O\xc7\
+y\xf1\x9b\x1a\x02\xe1C\x81$ \xa5 \xc88\xe0+\
+y\xd6\xc0\x0c\xe8\xd6\x0f\xfc\x86\xe3\xfd*\x9e\xf7d\x00\
+\xdc\xbbw\xef?\x11w\xabTS\x99\xd7\xfe\xc9\xb8\x02\
+1\x9cHF\xa4\xf3$\x16\xfb\x82\x10\xcd#\x22\x00\x8c\
+\xf2,\x00\xae\x9b\xadA\x13\x00\x12 \xd6F\xa3\xc8\x01\
+\xf2NP\xa65=\x9b)q\xe9o\xac\x8d\x83\xc4\xe1\
+B\x07\xeb\xd2\xb6n\xdd\x9a\xdd\x9f;w\x0egM\xa4\
+@\x0b+\x02\x88O\x8b!\xfd\xdaP\x8d\x9f\xe6\xbd\xac\
+\xc4\xa9\x8a\x84)PC\xa2\x80\x81\x84O\x9e<\xc94\
+\xc6\xd9T\x00@\x18\x86\x95\x8e%\xec\x0f4\x806o\
+\xde<\x9c*Z\x041\xec\x07\xb8\x864\x9e]\x03\x1a\
+t\xb6\xec\x87vq\xcd\xfb\x09\xe6\xb0\xaf\xeb\x93\x1f\x08\
+6\x91 \xfb}\xce\x9c9\x198W\xae\x5c1ZM\
++\xc6K\xad\x11\x8f\x0b\xbc\xa8csA\x91\x9e1c\
+F\xb6\xb0\xa9\xea\xc1\x83\x07\x9d\x87\x8a\xb1\xd1\x1bj\xc9\
+\x06\xda\xbfD\x0a\xc4\xf2\xe5\xcbIe1'\x18\x05T\
+\xcc\x0a\xa2\x19\xd7\x9e\x95$\xb4 A4\x0d:\x98\x03\
+\xb3\xa8<W#\x13\x82P \x8c\xabE\xf87\xae\xbc\
+W\xea\x5c\x0b\xc5\xd8\xa0\x10\x8d|\x9b\x8d\xf3^\x7fH\
+\xc6h\x10\xc6o<\x03\x00\x0bC0D\xd25\x0dC\
+\x9f\xef1\x8e/!\xa5%\x09\x82i\xf6\x05`\xd6@\
+\xc3\xb8\xc2\xb4\x0e\xcf}\xd5J\xf61\x17\xc0\xff\xb0&\
+k\x01\x12{\xd2\xa0\x01>\xbc\xd7\x17\xd9\xf3\x0d\x0d\xe0\
+e\x88\xd0\x86\xe9\x82\x90\x0f\x7f\x02a\x1e\xfe\x86]j\
+\x7f\x02\xa0Y\xd8\xc8\xed/^\xbc\x08hH\x1d\x89\x03\
+\x00>\x08i\xb2/\x84\xeb\x00\xe92\x8b\xf4U[\xe6\
+@\x07k\xe0\xf0X\x83\x88\xc3<\x0b&S\xebaS\
+\xec\xa2*\xf4\xaeM/\x9dk\x10\x85\xa4J\xd3V\x9c\
+\x1c\x0c\x10&\x91\x0cs\xd0\x06\x00\x83\x01\x1c\x14k\xe1\
+\xb1\xd1\x1e\xf3\x07\x01a]hEs\xb8G\x0b\x99\x03\
+\xe3\x80\x00\xf3\xbc\x8bC%\x04\x1a\xc5\xb8\xda\x87\x01\xa0\
+L\x0d\xc2`\xc0\x06QH\x18U\x85P}G\x14F\
+\x5ca\x1c\x8d\xc11\xf2\x1e\x0c\xb3\x06\x0cA\x1b\x0c\xd2\
+\x01M\xed\x831\xd6\xa5\x94\xc6yZ\x1a\xb3G6~\
+\xff\xfe}\x9c\xec\xb0\xf5\x05> \x95\xbbi2F\x15\
+\x98\x8ac+31M\x0bF\xa8\xe02\x82\x97,Y\
+B\xb1\xc4\x19_iF\x88\xb4a\x1e\xa6Y\x03\x86\x01\
+\x8e\xe8\x01\xd3\x5cq\xd0\xac\xc9\x95u\x19\xc3TL\xb3\
+\x05\xe2\xfdk\x80\x9b\xda\xb0G\xc2(\x04@\xac!\x92\
++\xb6\x8f9\x00\x00\xe6\x01\xe1\xe6\x0d\xe6!&/\xfa\
+\x03}\x92v\x0e8\x80\x82\xc6\xa8%\x8c\x13\xfaX\x1f\
+\xad\x1a\xd6\x07\x94\xb3\x11&!\x02P\xb5A\xd4\xbf\x94\
+yT\x17\x82\x91&~@M\xe4\x1d#\x8ay\x88\xe9\
+0s`\xd4\xb9\xccC[\xe4\x819\x00\x05 y\xc7\
+m\x1b\x15\x0d0\x03cc%D\x83Y\x01\x80\x09\xa4\
+M\xb9\x8a\xad2fJ\x8cd5\x15\xcf\x0ed\xce\x08\
+\x01\xc8\x98\x0b\x8e\xd5\x04\x88\xf7\xd4\x06C&\x9a\x85\x1f\
+a\x9d\xd1\xd2\x00\xe36\x1d\x86pJ\x84\xaf|\xa6\x08\
+\xf1\x84]=9\x0c\xe8\xd4\xb0a\xa3\x00\xa01nx\
+\x86y\xde\xb1\xe0\xa1\x13\x05\x04>\x9f\x00\xc1\xb4{Q\
+gp\xffV'XV\x0d\x90Q\x9a\xea\x8e\x9a\xe7U\
+\xd2:\x9d(\xc0\xb8g\x06\x8c1\x17\xa6\xb8\x1a\xfb\xcd\
+\xf4\x90<\xcf\xfa\x05\x8b\x1f\x9a\xd9\xa2i5`\xd0\x0c\
+\x9bh\x1c\xfb\x8e\xaa\x06h\xabJ\xd11\x98p\x1e\xfb\
+C8\x04\xeb\xe1q`\xf3f,IM\xd3>I\x03\
+\x13B\xdd\xbbo\xa3)0l\x8d`\xdeo\xea\xab\x84\
+\x87\xca\x1e\xc91\x00\xd5|\xe2\xfd\xfa\x80<!\x82\x9b\
+\xaf\xdaTU\x88\xb7\xb4\x05\x00AP\x0b\xe6\xcf\x5c\x9a\
+\xfak\x1f\xa7\xe6\xa6\x96T\xdd\x96\x85L\xed\x1dFt\
+\xb6\xac\xc7;\xaeo\x04\x92'\xfd\x0a\xa6\x88)\x00@\
+Y5`\xd8#+\x01\xb0\xa9\x01\xee+\xd1\x8c\xe55\
+\xa1P\xf72-X\xb44\x15\xeb\xfaR\xb1\xba9u\
+\x90*\xc7;f\x99\x9e1\xa2\x19\xac\xaf)[\xd0\xe5\
+\xa3\x10\xe1\xd0\xcc\xb3\xb4U\x94\xd3\x07\xc8\xa8\x04 \x95\
+R`\xf2g\x0e\xf9{\x9f=#|\xde\xdf\x1e\xcc>\
+J\xb5U\xf5\xa9>\xca\xd8\x89u\x93S\xfd\xec\xc8\x19\
+\x1a\xa68\xcf\xf7\x5c\xc3\xee\xfev5\x0d\xb0\xde\x04\xa0\
+\xdc> O@\xbe\xa2\xf3\xdeL\xd0\xef\x7f0\xeb\x5c\
+\xfb\xf71\xbf\xa77u\x84\xeaw\xb5\xb7\xa5\xee\xb6\xf6\
+\xd4\x1bj<!\xbe\x9c\x0f\xe64\x8c\xf5,\x99\x05T\
+\xe9k\x86f\x93\xac[\xda\x8a\x12Sn\x00\x8c\xdd:\
+-\x9a\xa1\xd13\x02U\x9fy:5\xed\x1bo^\xc5\
+\x07\x8f\xfa\xba\xd4\xf7\xbc'=\x8d2\xb9\xb3\xa7;\xf5\
+\x15\x99\xfb}\xc5\x0a\x00\xbc\x83\xa7W\xd2\xa5%8{\
+P\x83p\x1d\x1d\x00$@\x00,\xb9uJ\x82\xc2\xbd\
+\x85\x92\xcck\xe3\xcc\xc9\xca\xe3\xcaBzE2U]\
+\x91\xba\xba;#\xb7N\xa9\xab\xb3\xcb\x13k\x22\x06`\
+\x19\xf7e\xdc\xc6\x98\xc5\xd2\x90\xad\xa8W.W\xf3$\
+WB\xcc\xe3!B\x7f\x03\xb1f~H\x0e\xdb\xa4\x9b\
+\xfe\xe6m\x96\x10V7\xb3!M\xa8\x9c\x98\xbaz\xbb\
+\xd2\xa3+\x0f\x01\x0c-aM\xee\xcd\x1a=\x87T\xab\
+\xbc\x1f\xddT\x18\x06\xf2\x84\xc0\x84\xa0\xd0Lz\x90\x9a\
+\x80Q\x10\x91\x12#\xfd|\xf1\x83`<\x95\xceg\x82\
+\xda3\x8cs\x82\xb4`\xc1\x02\xcf'\x05\xd8\xc4\x89D\
+it\x8b!\x9d\x9a\xcd\xb3:\x80\x80`m\x14\xd5g\
+\x0cf\x01\x8a\xda=>[e\xc0\x18\xeb\xad\x05\xb4e\
+A\xf0\x9c2>\xdbq@+\xd0\xcc\xc9;B\xb5\x84\
+=GO\x03LG\x05\x82g\x08\xf1h\x8b1\x99\xf6\
+\xd0\xd3\x12\x1a\x10Pyk\x04\xabA\xdf\xf1\xec\x12\x9a\
+\xa9 9\x12\xf3\x5c\xd03J\x80\xf5\xd3\x1d\xe6\x05\xf3\
+\xa3u b\xfd\xaf\xf3\xd3\x0c`\xcajM\x02!\x1a\
+@\xf2\x1fG\x19\x83!\x8b\x17\xa4\xed<\xc3'_w\
+\x00\x94J\x12\x06\xd9\x03\xe65\x09\xfd\x0fB\xe0X\x8c\
+\xdfF\xd7\x07X\xcf\xeb\x84Tw+@\x982\x13\xb4\
+t6\x1c\xf2\x9bE\x8b\x15\x9d\x1fRaD\x8f\x1e_\
+\xaa\xd1\x0eO\x95\x00\x8f\xf73\xa0<)jnn6\
+\xed\x1dU\x1f \xc3\x1eE\xeb\x18\x01\x85|\xdc\x83N\
+\xf3z\x011\xf4\xe1 aT\xd3\x00\x00\xde\xa1\xf6g\
+\x1d\xd7\xd4!ZL\xb1'ct\xd6\xc0\xf9\x01\xfa\x88\
+\x00\xe0\x0bq\xb9\x01\xc0\xa1i\xbfflH\x0b\xf5\xd5\
+W\xc0\xb8\xde\xdeR\xd7DJ\xa6Js\x0bU\xde\x22\
+'\x9f\x0cyb\x84\xf41\xbb\x11)l1P\xaea\
+\xd1rT\x7f6\x88\xb3\x04.\x05\x06\x10 T\xe7\x05\
+\x13\xac\x81\xdd#q\xa5jm`FI\xb7\xb6'\xf9\
+\xf1T)\xffu\x8aw\xf9\xd6\xc0\xbc\xb5k\xd7r\xec\
+\xa6\x06\xe9$\xf9.!\xdd\x00\xde\x87\x064\xf0\xf0\x0e\
+\xcd\x8c\xeemZ\x80-*9\xbb\xc7\xde\x10\xe7\x87\x0d\
+\x08\xf1K\x8e\xa7\xba\x1e\x8cp\xc6\x0fS\x00\xc5\xf19\
+k\xc8\x98\xef m\x00c=+N*@\xd6\xf6=\
+@\xf5\xbc\x01\xba\xa0\x01 o\x15\xf9\xdb[\xff\x14\xed\
+\xc7\xb6|\xf5\xa5\xbd\xea\xfd\xd9\xc0\xdfJ\x9bN\x12\x8f\
+\x0eQH\x15\xa2\xf3i34\xd1y\x9fd\xc7F\xe6\
+gh3)\xe2}K]\x01\xf8\xee\xbb\xef\x86\x22Y\
+\x00\xd1\xd0\xb3\x11I\xfe[\x8c\x81\x9bdZl\xca\x22\
+\xf9\xd8\x9b\xaf\xeb\xed,nM\x0fa~\xa8\x90(\x8f\
+\xb8\xecn\xea\xb5\xa4y\x86\xef\x91\xd8pi\xb9f\x82\
+\xcf\xf0\x0b\xb6\xe7\x83#1W\xfd\xc7\x85\xf8\xfb\x86/\
+c\xa8\xad\x18R\xea\x08oy(\x08_\xef_X\x04\
+\x832\xe2U\xe2e\x12/?\x10D|\x1b\x8f\xcf\xf2\
+i\xae\xcd\xf8>\x82&8\x95\x01\xe8\xd4Xcz\xd0\
+P\x13\x9d\xbfW\x80>\xf6\x1b\x88\xf1\xbe\xb8\xbc\x88\xa9\
+\x8f\xc3A>\x09\xa0~l\x02\x83\xd0:\xc2\x9c.E\
+8\xfe:\xd6\xbb\xc0)~!\xfe\xf6~R,\xbc:\
+T\xf6\xf3@wY\xfc\xf0\x13\xfe\xcc\x8d\xf9y\xc9K\
+g4\xa0\xbe\x1d\xb6t$\x88\xf8_\xbc\xdb\x99\xdeO\
+s\xc3B\xb4\xd7e\xc8O\x90\x0e\xb4\x12\x1b\xefE\x7f\
+\x12\x7fq\xfa:\x0b\x81\xf1\xf7}\xd3\x02\xed\x96`f\
+n<\x83~}\x00A\xfd\xca\xefH\xb2\x10\x9d{\xfa\
+`\xdc\xb3P{\xcc\xb9\x16\xd7\xa7il4@\xec#\
+h\x04\xe3}\x0e\x9a\x03\x00B\x15\x99l\xf4\x9a\xe8\x18\
+\xa2\xfa\xeb\xb5@g!T\x07\x7fD\x07\xc54\x86\xdb\
+\xf8\xbf\xce\xa64\xfe_c\xe3\x00\x8c\x03\xf0\x11\xb7\xff\
+\x03\x7f\x19\x0a\xe4\xd7bc\xda\x00\x00\x00\x00IEN\
+D\xaeB`\x82\
"
qt_resource_name = b"\
-\x00\x0d\
-\x0b4-\xe7\
-\x00a\
-\x00k\x00r\x00e\x00g\x00a\x00t\x00o\x00r\x00.\x00p\x00n\x00g\
-\x00\x0b\
-\x01\xad\xabG\
-\x00d\
-\x00i\x00g\x00i\x00k\x00a\x00m\x00.\x00p\x00n\x00g\
\x00\x1a\
\x08\xdd\xe1\xa7\
\x00a\
\x00c\x00c\x00e\x00s\x00s\x00o\x00r\x00i\x00e\x00s\x00-\x00d\x00i\x00c\x00t\x00i\
\x00o\x00n\x00a\x00r\x00y\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x0b4-\xe7\
+\x00a\
+\x00k\x00r\x00e\x00g\x00a\x00t\x00o\x00r\x00.\x00p\x00n\x00g\
\x00\x07\
\x0e\x95W\x87\
\x00k\
\x003\x00b\x00.\x00p\x00n\x00g\
+\x00\x0b\
+\x01\xad\xabG\
+\x00d\
+\x00i\x00g\x00i\x00k\x00a\x00m\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x00\x13\x0d\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00<\x00\x00\x00\x00\x00\x01\x00\x00 \x17\
-\x00\x00\x01e\xaf\x16\xd2\x99\
+\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x00HE\
+\x00\x00\x01z\xe7\xee'\x05\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-\x00\x00\x00v\x00\x00\x00\x00\x00\x01\x00\x005/\
-\x00\x00\x01e\xaf\x16\xd2\x99\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00:\x00\x00\x00\x00\x00\x01\x00\x00\x15\x18\
+\x00\x00\x01z\xe7\xee'\x01\
+\x00\x00\x00Z\x00\x00\x00\x00\x00\x01\x00\x00(%\
+\x00\x00\x01z\xe7\xee'\x05\
"
def qInitResources():
diff --git a/examples/widgets/animation/appchooser/doc/appchooser.png b/examples/widgets/animation/appchooser/doc/appchooser.png
new file mode 100644
index 000000000..1bd31e755
--- /dev/null
+++ b/examples/widgets/animation/appchooser/doc/appchooser.png
Binary files differ
diff --git a/examples/widgets/animation/appchooser/doc/appchooser.rst b/examples/widgets/animation/appchooser/doc/appchooser.rst
new file mode 100644
index 000000000..05af3e8b8
--- /dev/null
+++ b/examples/widgets/animation/appchooser/doc/appchooser.rst
@@ -0,0 +1,9 @@
+Application Chooser Example
+===========================
+
+Simple application that shows the effect of selecting an
+application from the corners of the widget.
+
+.. image:: appchooser.png
+ :width: 400
+ :alt: Application Chooser Screenshot
diff --git a/examples/widgets/animation/easing/doc/easing.png b/examples/widgets/animation/easing/doc/easing.png
new file mode 100644
index 000000000..f310fa1b3
--- /dev/null
+++ b/examples/widgets/animation/easing/doc/easing.png
Binary files differ
diff --git a/examples/widgets/animation/easing/doc/easing.rst b/examples/widgets/animation/easing/doc/easing.rst
new file mode 100644
index 000000000..5061319db
--- /dev/null
+++ b/examples/widgets/animation/easing/doc/easing.rst
@@ -0,0 +1,9 @@
+Easing Example
+==============
+
+The Easing Curves example shows how to use easing curves to control the speed
+of an animation.
+
+.. image:: easing.png
+ :width: 400
+ :alt: Easing Screenshot
diff --git a/examples/widgets/animation/easing/easing.py b/examples/widgets/animation/easing/easing.py
index 18b5c09de..ba5032458 100644
--- a/examples/widgets/animation/easing/easing.py
+++ b/examples/widgets/animation/easing/easing.py
@@ -1,69 +1,42 @@
+# Copyright (C) 2010 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from enum import IntEnum
+import sys
+
+from PySide6.QtCore import (Property, QEasingCurve, QObject, QPropertyAnimation,
+ QPoint, QPointF, QRect, QRectF, QSize, Qt)
+from PySide6.QtGui import (QBrush, QColor, QIcon, QLinearGradient, QPainter,
+ QPainterPath, QPixmap)
+from PySide6.QtWidgets import (QApplication, QGraphicsPixmapItem,
+ QGraphicsItem, QGraphicsScene,
+ QListWidgetItem, QWidget)
-#############################################################################
-##
-## Copyright (C) 2010 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import easing_rc
from ui_form import Ui_Form
-class Animation(QtCore.QPropertyAnimation):
- LinearPath, CirclePath = range(2)
+class PathType(IntEnum):
+ LINEAR_PATH = 0
+ CIRCLE_PATH = 1
+
+class Animation(QPropertyAnimation):
def __init__(self, target, prop):
- super(Animation, self).__init__(target, prop)
- self.setPathType(Animation.LinearPath)
+ super().__init__(target, prop)
+ self.set_path_type(PathType.LINEAR_PATH)
- def setPathType(self, pathType):
- self.m_pathType = pathType
- self.m_path = QtGui.QPainterPath()
+ def set_path_type(self, pathType):
+ self._pathType = pathType
+ self._path = QPainterPath()
def updateCurrentTime(self, currentTime):
- if self.m_pathType == Animation.CirclePath:
- if self.m_path.isEmpty():
+ if self._pathType == PathType.CIRCLE_PATH:
+ if self._path.isEmpty():
end = self.endValue()
start = self.startValue()
- self.m_path.moveTo(start)
- self.m_path.addEllipse(QtCore.QRectF(start, end))
+ self._path.moveTo(start)
+ self._path.addEllipse(QRectF(start, end))
dura = self.duration()
if dura == 0:
@@ -71,26 +44,27 @@ class Animation(QtCore.QPropertyAnimation):
else:
progress = (((currentTime - 1) % dura) + 1) / float(dura)
- easedProgress = self.easingCurve().valueForProgress(progress)
- if easedProgress > 1.0:
- easedProgress -= 1.0
- elif easedProgress < 0:
- easedProgress += 1.0
+ eased_progress = self.easingCurve().valueForProgress(progress)
+ if eased_progress > 1.0:
+ eased_progress -= 1.0
+ elif eased_progress < 0:
+ eased_progress += 1.0
- pt = self.m_path.pointAtPercent(easedProgress)
+ pt = self._path.pointAtPercent(eased_progress)
self.updateCurrentValue(pt)
self.valueChanged.emit(pt)
else:
super(Animation, self).updateCurrentTime(currentTime)
-# PySide2 doesn't support deriving from more than one wrapped class so we use
+
+# PySide6 doesn't support deriving from more than one wrapped class so we use
# composition and delegate the property.
-class Pixmap(QtCore.QObject):
+class Pixmap(QObject):
def __init__(self, pix):
- super(Pixmap, self).__init__()
+ super().__init__()
- self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix)
- self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache)
+ self.pixmap_item = QGraphicsPixmapItem(pix)
+ self.pixmap_item.setCacheMode(QGraphicsItem.DeviceCoordinateCache)
def set_pos(self, pos):
self.pixmap_item.setPos(pos)
@@ -98,162 +72,148 @@ class Pixmap(QtCore.QObject):
def get_pos(self):
return self.pixmap_item.pos()
- pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos)
+ pos = Property(QPointF, get_pos, set_pos)
-class Window(QtWidgets.QWidget):
+class Window(QWidget):
def __init__(self, parent=None):
- super(Window, self).__init__(parent)
+ super().__init__(parent)
- self.m_iconSize = QtCore.QSize(64, 64)
- self.m_scene = QtWidgets.QGraphicsScene()
+ self._iconSize = QSize(64, 64)
+ self._scene = QGraphicsScene()
m_ui = Ui_Form()
m_ui.setupUi(self)
- m_ui.easingCurvePicker.setIconSize(self.m_iconSize)
- m_ui.easingCurvePicker.setMinimumHeight(self.m_iconSize.height() + 50)
+ m_ui.easingCurvePicker.setIconSize(self._iconSize)
+ m_ui.easingCurvePicker.setMinimumHeight(self._iconSize.height() + 50)
m_ui.buttonGroup.setId(m_ui.lineRadio, 0)
m_ui.buttonGroup.setId(m_ui.circleRadio, 1)
- dummy = QtCore.QEasingCurve()
+ dummy = QEasingCurve()
m_ui.periodSpinBox.setValue(dummy.period())
m_ui.amplitudeSpinBox.setValue(dummy.amplitude())
m_ui.overshootSpinBox.setValue(dummy.overshoot())
- m_ui.easingCurvePicker.currentRowChanged.connect(self.curveChanged)
- m_ui.buttonGroup.buttonClicked[int].connect(self.pathChanged)
- m_ui.periodSpinBox.valueChanged.connect(self.periodChanged)
- m_ui.amplitudeSpinBox.valueChanged.connect(self.amplitudeChanged)
- m_ui.overshootSpinBox.valueChanged.connect(self.overshootChanged)
-
- self.m_ui = m_ui
- self.createCurveIcons()
-
- pix = QtGui.QPixmap(':/images/qt-logo.png')
- self.m_item = Pixmap(pix)
- self.m_scene.addItem(self.m_item.pixmap_item)
- self.m_ui.graphicsView.setScene(self.m_scene)
-
- self.m_anim = Animation(self.m_item, b'pos')
- self.m_anim.setEasingCurve(QtCore.QEasingCurve.OutBounce)
- self.m_ui.easingCurvePicker.setCurrentRow(int(QtCore.QEasingCurve.OutBounce))
-
- self.startAnimation()
-
- def createCurveIcons(self):
- pix = QtGui.QPixmap(self.m_iconSize)
- painter = QtGui.QPainter()
-
- gradient = QtGui.QLinearGradient(0, 0, 0, self.m_iconSize.height())
- gradient.setColorAt(0.0, QtGui.QColor(240, 240, 240))
- gradient.setColorAt(1.0, QtGui.QColor(224, 224, 224))
-
- brush = QtGui.QBrush(gradient)
-
- # The original C++ code uses undocumented calls to get the names of the
- # different curve types. We do the Python equivalant (but without
- # cheating)
- curve_types = [(n, c) for n, c in QtCore.QEasingCurve.__dict__.items()
- if isinstance(c, QtCore.QEasingCurve.Type) \
- and c != QtCore.QEasingCurve.Custom \
- and c != QtCore.QEasingCurve.NCurveTypes \
- and c != QtCore.QEasingCurve.TCBSpline]
- curve_types.sort(key=lambda ct: ct[1])
-
- painter.begin(pix)
-
- for curve_name, curve_type in curve_types:
- painter.fillRect(QtCore.QRect(QtCore.QPoint(0, 0), self.m_iconSize), brush)
- curve = QtCore.QEasingCurve(curve_type)
-
- painter.setPen(QtGui.QColor(0, 0, 255, 64))
- xAxis = self.m_iconSize.height() / 1.5
- yAxis = self.m_iconSize.width() / 3.0
- painter.drawLine(0, xAxis, self.m_iconSize.width(), xAxis)
- painter.drawLine(yAxis, 0, yAxis, self.m_iconSize.height())
-
- curveScale = self.m_iconSize.height() / 2.0
-
- painter.setPen(QtCore.Qt.NoPen)
-
- # Start point.
- painter.setBrush(QtCore.Qt.red)
- start = QtCore.QPoint(yAxis,
- xAxis - curveScale * curve.valueForProgress(0))
- painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)
-
- # End point.
- painter.setBrush(QtCore.Qt.blue)
- end = QtCore.QPoint(yAxis + curveScale,
- xAxis - curveScale * curve.valueForProgress(1))
- painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)
-
- curvePath = QtGui.QPainterPath()
- curvePath.moveTo(QtCore.QPointF(start))
- t = 0.0
- while t <= 1.0:
- to = QtCore.QPointF(yAxis + curveScale * t,
- xAxis - curveScale * curve.valueForProgress(t))
- curvePath.lineTo(to)
- t += 1.0 / curveScale
-
- painter.setRenderHint(QtGui.QPainter.Antialiasing, True)
- painter.strokePath(curvePath, QtGui.QColor(32, 32, 32))
- painter.setRenderHint(QtGui.QPainter.Antialiasing, False)
-
- item = QtWidgets.QListWidgetItem()
- item.setIcon(QtGui.QIcon(pix))
- item.setText(curve_name)
- self.m_ui.easingCurvePicker.addItem(item)
-
- painter.end()
-
- def startAnimation(self):
- self.m_anim.setStartValue(QtCore.QPointF(0, 0))
- self.m_anim.setEndValue(QtCore.QPointF(100, 100))
- self.m_anim.setDuration(2000)
- self.m_anim.setLoopCount(-1)
- self.m_anim.start()
-
- def curveChanged(self, row):
- curveType = QtCore.QEasingCurve.Type(row)
- self.m_anim.setEasingCurve(curveType)
- self.m_anim.setCurrentTime(0)
-
- isElastic = (curveType >= QtCore.QEasingCurve.InElastic
- and curveType <= QtCore.QEasingCurve.OutInElastic)
- isBounce = (curveType >= QtCore.QEasingCurve.InBounce
- and curveType <= QtCore.QEasingCurve.OutInBounce)
-
- self.m_ui.periodSpinBox.setEnabled(isElastic)
- self.m_ui.amplitudeSpinBox.setEnabled(isElastic or isBounce)
- self.m_ui.overshootSpinBox.setEnabled(curveType >= QtCore.QEasingCurve.InBack
- and curveType <= QtCore.QEasingCurve.OutInBack)
-
- def pathChanged(self, index):
- self.m_anim.setPathType(index)
-
- def periodChanged(self, value):
- curve = self.m_anim.easingCurve()
+ m_ui.easingCurvePicker.currentRowChanged.connect(self.curve_changed)
+ m_ui.buttonGroup.idClicked.connect(self.path_changed)
+ m_ui.periodSpinBox.valueChanged.connect(self.period_changed)
+ m_ui.amplitudeSpinBox.valueChanged.connect(self.amplitude_changed)
+ m_ui.overshootSpinBox.valueChanged.connect(self.overshoot_changed)
+
+ self._ui = m_ui
+ self.create_curve_icons()
+
+ pix = QPixmap(':/qt-project.org/logos/pysidelogo.png')
+ self._item = Pixmap(pix)
+ self._scene.addItem(self._item.pixmap_item)
+ self._ui.graphicsView.setScene(self._scene)
+
+ self._anim = Animation(self._item, b'pos')
+ self._anim.setEasingCurve(QEasingCurve.OutBounce)
+ self._ui.easingCurvePicker.setCurrentRow(0)
+
+ self.start_animation()
+
+ def create_curve_icons(self):
+ pix = QPixmap(self._iconSize)
+
+ gradient = QLinearGradient(0, 0, 0, self._iconSize.height())
+ gradient.setColorAt(0.0, QColor(240, 240, 240))
+ gradient.setColorAt(1.0, QColor(224, 224, 224))
+
+ brush = QBrush(gradient)
+
+ curve_types = [(f"QEasingCurve.{e.name}", e) for e in QEasingCurve.Type if e.value <= 40]
+
+ with QPainter(pix) as painter:
+
+ for curve_name, curve_type in curve_types:
+ painter.fillRect(QRect(QPoint(0, 0), self._iconSize), brush)
+ curve = QEasingCurve(curve_type)
+
+ painter.setPen(QColor(0, 0, 255, 64))
+ x_axis = self._iconSize.height() / 1.5
+ y_axis = self._iconSize.width() / 3.0
+ painter.drawLine(0, x_axis, self._iconSize.width(), x_axis)
+ painter.drawLine(y_axis, 0, y_axis, self._iconSize.height())
+
+ curve_scale = self._iconSize.height() / 2.0
+
+ painter.setPen(Qt.NoPen)
+
+ # Start point.
+ painter.setBrush(Qt.red)
+ start = QPoint(y_axis, x_axis - curve_scale * curve.valueForProgress(0))
+ painter.drawRect(start.x() - 1, start.y() - 1, 3, 3)
+
+ # End point.
+ painter.setBrush(Qt.blue)
+ end = QPoint(y_axis + curve_scale,
+ x_axis - curve_scale * curve.valueForProgress(1))
+ painter.drawRect(end.x() - 1, end.y() - 1, 3, 3)
+
+ curve_path = QPainterPath()
+ curve_path.moveTo(QPointF(start))
+ t = 0.0
+ while t <= 1.0:
+ to = QPointF(y_axis + curve_scale * t,
+ x_axis - curve_scale * curve.valueForProgress(t))
+ curve_path.lineTo(to)
+ t += 1.0 / curve_scale
+
+ painter.setRenderHint(QPainter.Antialiasing, True)
+ painter.strokePath(curve_path, QColor(32, 32, 32))
+ painter.setRenderHint(QPainter.Antialiasing, False)
+
+ item = QListWidgetItem()
+ item.setIcon(QIcon(pix))
+ item.setText(curve_name)
+ self._ui.easingCurvePicker.addItem(item)
+
+ def start_animation(self):
+ self._anim.setStartValue(QPointF(0, 0))
+ self._anim.setEndValue(QPointF(100, 100))
+ self._anim.setDuration(2000)
+ self._anim.setLoopCount(-1)
+ self._anim.start()
+
+ def curve_changed(self, row):
+ curve_type = QEasingCurve.Type(row)
+ self._anim.setEasingCurve(curve_type)
+ self._anim.setCurrentTime(0)
+
+ is_elastic = (curve_type.value >= QEasingCurve.InElastic.value
+ and curve_type.value <= QEasingCurve.OutInElastic.value)
+ is_bounce = (curve_type.value >= QEasingCurve.InBounce.value
+ and curve_type.value <= QEasingCurve.OutInBounce.value)
+
+ self._ui.periodSpinBox.setEnabled(is_elastic)
+ self._ui.amplitudeSpinBox.setEnabled(is_elastic or is_bounce)
+ self._ui.overshootSpinBox.setEnabled(curve_type.value >= QEasingCurve.InBack.value
+ and curve_type.value <= QEasingCurve.OutInBack.value)
+
+ def path_changed(self, index):
+ self._anim.set_path_type(index)
+
+ def period_changed(self, value):
+ curve = self._anim.easingCurve()
curve.setPeriod(value)
- self.m_anim.setEasingCurve(curve)
+ self._anim.setEasingCurve(curve)
- def amplitudeChanged(self, value):
- curve = self.m_anim.easingCurve()
+ def amplitude_changed(self, value):
+ curve = self._anim.easingCurve()
curve.setAmplitude(value)
- self.m_anim.setEasingCurve(curve)
+ self._anim.setEasingCurve(curve)
- def overshootChanged(self, value):
- curve = self.m_anim.easingCurve()
+ def overshoot_changed(self, value):
+ curve = self._anim.easingCurve()
curve.setOvershoot(value)
- self.m_anim.setEasingCurve(curve)
+ self._anim.setEasingCurve(curve)
if __name__ == '__main__':
-
- import sys
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
w = Window()
w.resize(600, 600)
w.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/animation/easing/easing.pyproject b/examples/widgets/animation/easing/easing.pyproject
index 2677e28ea..416b9979e 100644
--- a/examples/widgets/animation/easing/easing.pyproject
+++ b/examples/widgets/animation/easing/easing.pyproject
@@ -1,4 +1,3 @@
{
- "files": ["easing.qrc", "ui_form.py", "easing.py", "easing_rc.py",
- "form.ui"]
+ "files": ["easing.py", "form.ui"]
}
diff --git a/examples/widgets/animation/easing/easing.qrc b/examples/widgets/animation/easing/easing.qrc
deleted file mode 100644
index 7e112d3a9..000000000
--- a/examples/widgets/animation/easing/easing.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
- <qresource>
- <file>images/qt-logo.png</file>
- </qresource>
- </RCC> \ No newline at end of file
diff --git a/examples/widgets/animation/easing/easing_rc.py b/examples/widgets/animation/easing/easing_rc.py
deleted file mode 100644
index 26c31654b..000000000
--- a/examples/widgets/animation/easing/easing_rc.py
+++ /dev/null
@@ -1,361 +0,0 @@
-# Resource object code (Python 3)
-# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
-# WARNING! All changes made in this file will be lost!
-
-from PySide2 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x14\x1d\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00.\x00\x00\x007\x08\x06\x00\x00\x00s`xd\
-\x00\x00\x13\xe4IDATx\x9cb\xfc\xff\xff?\xc3\
-\xdf\x7f\x7f\x99\x99\x99\x98\xff>x\xf1Xf\xe9\x9eU\
-\x09\x87/\x9e\xb6y\xf7\xe9\xad\x98\xa4\xf2?~Q\xb9\
-\xbf\xfc\xcc\x1c?\xf8\xfe\xfd\xff\xc7\xca\xc5\xc6\xf7F\x9c\
-[\xf6\x96$\xaf\xd25)>\xa5\xcb\xd2\xbcJ\xd7\xc4\
-xd\xef\x08p\x8a>ccf\xff\xc5\x80\x05\xfcg\
-\xf8\xcf\xf4\xef\xff?&\x06\x86\xff\x0c\x8c\x0c\x8c\xff\x19\
-\x19\x18\xff30Bi\x0a\x00\x00\x00\x00\xff\xffb\xfc\
-\xfb\xf7/3\x13\x13\xd3\xdfY\x9b\x17\xa6T\xcfm\xed\
-}\xf3\xe6\x0d\x1f\x17/\xdb\x7f{/aFYEN\
-\x06\x86\x7f\x8c\x0c\x0c\xff\x99\x18\x18\x18\x18\x18\xfe\xfd\xff\
-\xc7\xf0\xe7\xdfo\x86\x7f\xff\xff00002\xb00\
-\xb12p\xb2\xf0|\xe3c\x17z&\xcc%u_\x9c\
-G\xee\xa6\x04\x8f\xc2u\x09^\x85\x9b\xa2\x5cR\xf7\x05\
-8\xc5\x9e\xb1\xb3p\xfc\xc0n\xf5\x7f\xc6\x7f\xff\xff1\
-\xc39$z\x08\x00\x00\x00\xff\xffb\xfc\xff\xff?\xc3\
-\xa4\xb5\xb3s\xf2\xbb\xf3&s\xf2\x09\xffcgc\xfb\
-\xef\x1e,\xc4 !\xc3\xc6\xf8\xed\xeb?FF\x889\
-\x8cp\x0b\x18\x99\xfe320\xfcg```\xf8\xff\
-\xff?\xd3\xbf\xff\x7f\x19\xff\xfc\xff\x03\xf1\xd0\xbf?\x0c\
-\xff\x19\xfe3\xb00\xb22\xb0\xb3p\xff\xe5g\x17~\
-!\xcc%y_\x8cG\xee\xa6\x14\xaf\xe2u\x09\x1e\x85\
-\xeb\xa2<2w\x859%\x9ep\xb0r}\xc5\xe7\xa1\
-\xffpK\x19\xff1b\xf1\x10\x00\x00\x00\xff\xffl\x92\
-\xbd\x0a\xc20\x14F\xbf/\x16\x7f\xd2\x06!\x83\xc6A\
-\xc5]p\xec\xa8\xbb\xcf\xe2k\xbavp(\xa8\x83\xe0\
-\xd6\xb1\x88 $\xf7:\x88[^\xe0\x1c\x0e\x1c6\xb7\
-\xcbv\x7f:\x9e\x85\xea\xe2\x87\xb2\xabKS\x1f\xa6x\
-\xbf\x04f\x90\x03gL\xa0\xfe\x0a\xa9\xc4\x7f\x8fd\xa2\
-D$\x89H\x1a\xa1*0,0.\xac\xb8\x91\xef\xfc\
-$<f\xe5\xf2\xbap\x9b6T\xebv^\xad\xee\xde\
-\x86\xa7\x1d\xba\x9ey\x0fE\xc5(\x94\x04\xf0\x05\x00\x00\
-\xff\xffb\x99\xbcvV\xee\xa7\xef_y\xf9\xb9\xf9\xfe\
-2\xb2\xffeV\xd6\xe4b\xf8\xfd\xeb?\x03#\x13Q\
-\x8ef````\xfc\xcf\xf0\x9f\xf1\xff\x7f\xf4\x18f\
-\xfc\xcf\xca\xc4\xf6\x9f\x8d\x99\x1d\xc9C\x0c\x8c\xff\xfe\xff\
-e\xfe\xf8\xe3\xb5\xc4\xbb\xef\xcf$n\xbc9e\x01\xf1\
-\x103\x03;3\xe7\x7f\x1e6\xc1\xb7\x82\x9c\xe2\x0f\xc5\
-ydo\x8b\xf3(\x5c\x97\xe4U\xb8.\xce#w[\
-\x98K\xe2\x11\x0f\x9b\xc0;&F\xa6\xbf0\xd3\x01\x00\
-\x00\x00\xff\xffbT\x894\xbe\xfb\xf4\xed\x0b%\x86\xff\
-\xcc\xff\x85DX\x18\xbd\xc3E\x88v1\xb9\x00\x9a\x9e\
-\xff1\xa2y\xe8\xef\x7fH\x0c\xfd\xf9\xf7\x9b\xe1\xff\xff\
-\x7f\x0c\x8c\x8c\xcc\x0cl\xcc\x1c\x0c<\xac\xfc\x1f\x049\
-\xc5\x1e\x89r\xcb\xde\x91\xe0Q\xb8&\xc9\xabp\x03\x00\
-\x00\x00\xff\xff\xbc\xd1\xb1\x0d\x800\x10\x03@;\x05T\
-T\xb4\x912\x0e\xa2e\xffE\xc8\xff\xdbT\x94\xb4\x8c\
-p:n\xe7\xb8\x01/s\x1a}\xac8\xae\x1d\x11\x06\
-?\xbe~\x00\x99\xa0^\x90\xadVN\x96\x02\xa9\x84\x5c\
- \x1b\x1e\x00\x00\x00\xff\xff\xb4\x92!\x12\x00 \x0c\xc3\
-\xda[\x81\xff\x7f\x98\xa0&p\x18*s\x11\x11\x0d0\
-\xdd\xd6\xfb=\xbe\x0ca\x81\x91\xae\x92r\xa8\x0c\x96\xbc\
-\x9b\x1d\x00\x00\x00\xff\xff\x94\x94\xb1\x0d\x00 \x0c\xc3\xdc\
-\x96\xffOv\x19\xd8\x10Bp@ly\xc9\xd8\x96\x7f\
-\x22!3\xa8*l\xd1\x05\xc8\x08\xd6'4\xb6W\xc6\
-\x93\xe7\x104\x01\x00\x00\xff\xff\x8c\x91\xc1\x0a\x80 \x10\
-\x05g\xdd5\xa5\xfe\xff;\x83(A\xad\xadKg\xeb\
-\xddg\x18x6\x02F\xc1jB\x9e\x8d\xbd\x1c\xac[\
-!j$M\x09\x01\xaa7N\xefh0\xb2-\x04Q\
-\xfc\xbe>\xac\xef\xed?\xf7\x00\x00\x00\xff\xff\x22\xd9\xe1\
-\xff\xff10pp23|\xfb\xfa\x87\xe1\xf4\xc9\xc7\
-\x0cR\x5c\xea\x0c^&>\x0c\xc6\xaa\x86\x0c\xa2\x02\x22\
-\x0c\x8c\x8c\x0c\x0c_~}`x\xf6\xe9\x1e\xc3\xb5\xd7\
-'\x19\xae\xbe:\xc1\xf0\xf5\xf7'\x06nV>\x9c\x8e\
-gdd`\x80\x95JL\x8cL\x0c\xff\xff\xffg\xf8\
-O\xc0\x13\x00\x00\x00\x00\xff\xff\x22\xc9\xe1\xff\xffC\x1c\
-}\xe7\xc6\x17\x86\xa3\xfb\xde2T\x84T0\x14\x85g\
-0\xb0\xb3\xb32\xfc\x87T\xe9p\xb5Zb\x16\x0c\xae\
-*\xd1\x0c\xcf??`Xsu\x22\xc3\xe9';\x19\
-\xb8\xd8\xf8\x180\x8bM\x06\x86_?\xff1\xb0\xb0\xb0\
-002\xfde\xf8\xf6\xfb\x0b\x03\x0b\x13\x0b\x03+\x13\
-;^\xc7\x03\x00\x00\x00\xff\xff\x22:;\xfe\xff\xc7\xc0\
-\xc0\xce\xc1\xc4p\xe3\xf2W\x86\x9dk_0\xcc.\x9c\
-\xceP\x19\x97\xcb\xc0\xc2\xca\xc4\xf0\xf7\xdf_\x86\xff\xff\
-\xff\xc1+\x9b?\x7f\x7f3\xfc\xfe\x03)\xd2$y\xe5\
-\x19r-\xfa\x19Bt\xf2\x19\xbe\xfd\xfa\xcc\xc0\x04-\
-\x01\xfe\xffg``ecdx\xf5\xec\x0f\xc3\x92Y\
-\x0f\x18<\xc4K\x18\xba\xbc62\xd4\xd8/f0\x94\
-td\xf8\xf1\xe7\x1b\x5c-6\x00\x00\x00\x00\xff\xff\x8c\
-\xd4!\x0e\xc2@\x10@\xd1?3\xbbu\x0d\x06\x01\x0e\
-S\x82D5X$\xa6\x12\x8d \xe1\x04xn\xc4\x01\
-\xb8\x0ci\x10\x08\x0cI1]\xb6\x83B\x92p\x82\xff\
-\xd4\xff\x0b\xfe\x8d<\xee\x99\xcb\xf9\xcai\x7fd\xbbn\
-\xe8SBE15D\x14\xd3\x80I X\xa4\x08\x05\
-\x0e\x0c\xeed\xcf4\x8b\x03\x9b\xf9\x8e\xae\x7f\xa2b\xb8\
-;\xaa\xc2\xad}\x11\xbd\xa4\xaeV\x8c\xe2\x94j\xbcd\
-R\xcex\x0f\x09\xf8\xfd\xe4\x0f\x00\x00\x00\xff\xff\x22:\
-\xc4\x19\x19\x99\x18\x0e\xee~\xce\xa0\xa9\xac\xcbP\x16\x95\
-\xcb\xc0\xc0\xc0\xc0\xc0\xca\xc2\xc2\xc0\xc8\xc8\xc8\xf0\xff?\
-$\x99\xdcx{\x92\xa1fC:\x83Oe\x04\xc3\xda\
-C[\xa0!\xc6\x08\x0f\xb9\x10\xed<\x06EAm\x86\
-\x9f\x7f\xbe10313\xfc\xff\xc7\xc8\xf0\xf4\xf1\x17\
-\x06m%U\x06\x19Qi\xa8c\x19\x18\xfe\x13Q\x12\
-\x01\x00\x00\x00\xff\xff\x84\xd4+\x0e\xc2@\x14F\xe1\xf3\
-\xdf\xa6L\x05\xeb@\xa0P,\x02\x0dIu\x05\x0e\xc9\
-\x1eX\x09\x8a-\x90`p$x\x12\x14b\x12\x02\x02\
-\x0c\x8f\xb6w\xb0\x18\xc2\x0e\x8e\xf8r\xfe\x86\xa7\x04\x9d\
- \xe2\xe9M<\xde\x99M*B^\xd0\xb4\x0d\x92\xf0\
-\xe4H\xe2p\xdd\xb3\xd8L\x89\xb6\xe5\xd6\xdd1\x9e\x97\
-,\xd7+L\xc2\xdd\xf1\xd4\x92g\x81Q\xaf\xa2\xf6\x1a\
-\x99x=\xc4\xe5\xfcd\xd8\x1f\x00|\xed4\xc3d\x98\
-\x0c\xfd\xe0\xf2\x01\x00\x00\xff\xff\x22\x1c\xe2\xff!e\xf5\
-\x8d+\x1f\x19\x04\x84\xc4\x19\xfc\xad=\x19\x18\x18\x18\x18\
-\x98\xa1-0Xdn\xbe1\x8b\xe1\xdf\xff\xbf\x0c\xec\
-\x0c\x02\x0c\xa6\xe6\x92\x0cr\x9a\x22\x0cU3\xda\x18\xbe\
-\xff\x82\x84.#\xb4\x086\x94t`\x90\xe1Wf`\
-b\xfd\xc5\xf0\xf2\xc5g\x86\xdf/\xdf3X\xe9\x98 \
-,c``\xf8\xf5\xf7;\xc3\xd7\xdf\x9f\x18\xbe\xff\xf9\
-\xca\xf0\xeb/\xf6V1\x00\x00\x00\xff\xff\x22\xe8p&\
-f\x06\x86\x9f\xdf\x19\x18\xee\xdf\xfb\xc8`\xa9c\xc4 \
-%,\x09\x0f\xe5\xff\x0c\xff\x19\x18\x19\x99\x18>\xfcx\
-\xcd\xf0\xe0\xfdU\x06\x0e\x16.\x86?\xff~3\xfc\xfe\
-\xf3\x87ASG\x90\xe1\xe1\xe3\xfb\x0c\x07.\x1c\x85\x84\
-\xe6\xff\x7f\x0c\x7f\xff\xfde`g\xe1d\xe0\xfdd\xc4\
-\xb0b\xfeC\x86d\xd3F\x86\xcd3v0\xb8\x988\
-@\x03\x03R\xc8)\x08j3\x98\xc9\xb83h\x88\x98\
-0H\xf2(`u\x17\x00\x00\x00\xff\xff\xc2[\x1c\xfe\
-\xff\xcf\xc0\xc0\xc2\xc2\xc8\xf0\xfe\xdd_\x86\xef\xef\x7f0\
-X\xe9\x9aB\x1c\xf1\xef\x1f\x03\x133\xa4\xbcedd\
-dx\xf9\xe5!\xc3\x97_\x1f\x19\xd8Y\xb8 \xc9\xe2\
-\xef\x7f\x06a16\x06\x06\xe6\x7f\x0c\xa7\xae\x9dc\xf0\
-4s\x85\xe7\x03\x06\x06\x06\x06MQ3\x86w\x8f\xfa\
-\x19T\xc5\xb4\x194\xe5\xd5\x18\xfe\xfe\xfb\x0bu8$\
-\x16-e\xbd\x19,d<\x19\x18\x19\x99\x18\x9e\x7f\xbe\
-\xcf\xd0\xb0/\x02\xc3m\x00\x00\x00\x00\xff\xff\xc2\x1f\xe2\
-\xff\x19\x18\x98\x98\x19\x19\xde\xbf\xfd\xcd\xc0\xf0\x8f\x99A\
-_E\x8b\x81\x81\x81\x81\x81\x11\xde\x02\x83D\xed\x9bo\
-\xcf\x19\xfe\xfc\xfb\xcd\xc0\xc8\xc0\xc8\xc0\xc8\x08I\xab\x9c\
-\xdcL\x0c\xcc\x5c,\x0c7\x1f\xdf\x83\xebad\x82\xe8\
-\xd3S\xd1d\xe0\xe2\xe3g\xf8\xf3\xf7\x0fn\x8b\x09T\
-@\x00\x00\x00\x00\xff\xff\x22\x98T\x18\x19\x19\x18>\xbc\
-\xff\xc5\xc0\xc4\xce\xc9\xa0 !\x07\x11\x83\x86\x1c\xcc\xe8\
-O?\xdeB\x9a\xa1P\xfe\xbf\x7f\x0c\x0c\xac\xac\x0c\x0c\
-\xdc\xdc\xac\x0c\xcf\xdf\xbc\x84X\xc4\xc8\x04\xd7'%,\
-\xc1\xa0\xa9&\xc5p\xf1\xfe%\x86\xa7\xaf\x9f\xc3C\x1a\
-\x06\xfe\xfc\xfd\xcb\xf0\xfb\xcf?\x14\xbb\xd0\x01\x00\x00\x00\
-\xff\xff\x22\x5cs\xfeg`\xf8\xfc\xe97\x03/\x177\
-\x83(\xbf0\xd43\xd0N\x15T\xc9\xb7\xdf\x9fQ<\
-\xc2\xc0\x00\xc9\x1b\x1c\x1c,\x0c\xef?\x7f\x82\xeb\xf9\x0f\
-\x0dINvN\x86\x88(-\x86\xd4\xced\x06\x13i\
-\x17\x86\xc3S72\xfc\xff\xff\x9f\xe1\x1f\xc3?\x06f\
-Ff\x86\xed7\x172\xec\xba\xbd\x82A\x84[\x92\x01\
-\xa9\xef\x80\x02\x00\x00\x00\x00\xff\xff|\x95M\x0a\x80 \
-\x18D\x9f\xf9C\x88P\xf7\xbf['\x886-41\
-\xfdZ\xb8\x11\x8a\xf6\x03\xf3\x86\x19\x98\x7fp\xd5w\x9e\
-b!\xf8\x85\xe0\xc3\xa7,\xdf\x91\xf1,DzS\xce\
-i\xe2\x95(\xb5`\xb5\x05\x81\x860)\x85\xb7+\xd6\
-\x18\x8c\x1e\x11z\xf4\xd4N\xf6\xbc\x91\xe4\xa0\xb6\x8a\xd3\
-\xf3\xcb\xf3\x01\x00\x00\xff\xff\x84\x97\xc1\x0a\x800\x0cC\
-_\xb7\xae\x9b\xc5\xff\xffW\xad\x16\x0f\x9ed\x03\xef!\
-y\x10\x08\xe4\x7f\xc7\x81\x88d\xb3AW[j\x22c\
-:\x1e\x22\xa0Z8\xe2\xe4\xbac\x82\xf3\xb6\x93\x99|\
-{zM\x8aT\x9a\x0c\xac:]}\x99\xf9\x00\x00\x00\
-\xff\xff\x22\xaa\x1c\xff\xfb\xf7?\x03\x0b33\x03\x13\x13\
-\x13\xb2\xf9p\x00i\xf5\xa1\xbb\x1c\x92\xb1\xff\xfe\xfb\x0b\
-u *`eb\x83&\x1dli\x18\xd2:\xfc\xff\
-\xff\x1f\xceZ\x14\x00\x00\x00\xff\xff\x22\xb2\xad\x02)\xf6\
-\x18q\xf6\xe7\xb0\x97\x00\x8cP)l\xb2L\x8c\xc4\x0d\
-!\xe0\x02\x00\x00\x00\x00\xff\xff\x22\xca\xe1LL\x8c\x0c\
-\x7f\xff\xfdc\xf8\x87\xa5I\xca\xc0\xc0\x80\xbdZ\x86:\
-\x98\x91\x11{\xb9@i\xcf\x08\x00\x00\x00\xff\xff\x22\xaa\
-8da\x85\xa4\xd5\xdf\x7f~\xc3\x1d\x85\x0cX\x18Y\
-\xb1\xb6\x9d\xff\xfd\xfd\xcf\xc0\xcc\xc4\xc4\xc0\x84e\x80\xe6\
-\xf7\xbf\x9f\xd0\xa2\x8e\xbc\x918\x00\x00\x00\x00\xff\xff\x22\
-\x1c\xe2\x8c\x0c\x0c\xec\xec,\x0c\xdf~|g\xf8\xf1\x0b\
-{\xbb\x81\x95\x99\x1d\xc3\xfe\xff\x0c\x0c\x0c\x7f\xfe\xfec\
-`eee`aFv8$\xfc\x7f\xfc\xf9\x06-\
-\x22\xc9\x03\x00\x00\x00\x00\xff\xff\x22Xs2220\
-psC\xfa\x96\x1f\xbf~\x82\x0a\xff\x87;\x8e\x81\x81\
-\x81\x81\x93\x95\x9b\x012\xa8\x89p\xda\xff\x7f\x0c\x0c\xbf\
-\x7f\xfde\xe0d\xe7\x80\x14\x85P\x09X>\xf9\xfa\xeb\
-#$\x89\x91\xe9r\x00\x00\x00\x00\xff\xff\x22*\x8d\xf3\
-\xf2\xb12|\xff\xf1\x8d\xe1\xe5\xfb\xd7\x10\x07\xffG8\
-\x90\x81\x81\x81\x81\x87M\x80\x81\x81\x01)\xf4\x18!\x0e\
-\xff\xf9\xf3/\x03\x1f\x17/D\x0e\xaa\x89\x91\x81\x91\xe1\
-\xcf\xbf\xdf\x0c\x9f~\xbec`fd!\xd8\xb7\xc4\x05\
-\x00\x00\x00\x00\xff\xff\xc2\xefp\xa8\x03\xf8\x05\xd9\x18\x18\
-\xfe\xfcd\xb8\xf7\xec!\xd4\xe1\xa8\x96\x09p\x88\xa2t\
-\xb3\x18\x19\x19\x18\xfe\xfc\x81T\x5cb\x82B\x0c\x0c\x0c\
-\x90\x9e\x10\xcc\x8d\x9f~\xbe\x838\x9c\x89\x85\x81\xdc \
-\x07\x00\x00\x00\xff\xff\x22\x18\xe2\x7f\xff\xfdg\xe0\x17d\
-a``a`\xb8x\xe7*\x9a\xbf a.\xc2%\
-\xc5\xc0\xc6\xc2\x09))\xa0\xed\xf7\x9f?\xfe3\xfc\xfc\
-\xf6\x87A^B\x06\xeeYX\xe8\xbe\xfc\xf2\x88\xe1\xeb\
-\xaf\x8f\x0c\xcc\x8c\xccd\xa7q\x00\x00\x00\x00\xff\xff\xc2\
-\xebpFF\x06\x86\xbf\x7f\xfe3\xf0\xf011\xf0\x0a\
-s2\x9c\xbcz\x8e\x81\x81\x81\x81\x81\x19^\x11A\x1c\
-.\xca-\xc3 \xc0.\xc2\xf0\x17\xdaOdbf`\
-\xf8\xfc\xe1\x0f\x03\xc3\xaf\xff\x0c\xba\xca\x9aP\xd3\x10-\
-\xbe{\xef.3\xfc\xfe\xfb\x0b\x9a\xc6\x91\x9d\x8eHN\
-L\x8cL\x0c\xac,,\x0c\xcc\xcc\xd8\xcb{\x00\x00\x00\
-\x00\xff\xff\x22\x5c\xe5\xffc``eg`PP\xe2\
-g8{\xe32\xc3\xa3W\x8f\xa1]6H\xfb\xfa\xdf\
-\xff\x7f\x0c\x9c\xac<\x0cJB:\x0c\xbf\xfe\xfdd`\
-d`b`bbdx\xfa\xe8;\x03+'/\x83\
-\x8d\xae\x05\xc4\x22\xa4n\xd8\xb5W'\x18X\xa0\xc9\x04\
-\xa5<\x87\xfa\x81\x87M\x90\xe1\xeb\xef\x8f\x0c/\xdf\xbd\
-ax\xf7\xf1#\xd6\x16\x22\x00\x00\x00\xff\xff\x22\xaa8\
-\xfc\xf7\xf7?\x83\x9a\x06/\xc3\xe7\x8fo\x186\x1f\xdb\
-\xc9\xc0\xc0\xc0\x80Q\x8d\xdb+\x860\xfc\xfb\xfb\x97\x81\
-\x99\xed\x1f\xc3\xcfoL\x0c\xa7\x8e>`\x08u\xf2f\
-P\x93Qa\xf8\xf7\xef\x1f\x03##$$\x9f|\xba\
-\xc3p\xfb\xedE\x06\x0eV.\x06V6&\x86\xcf\xdf\
-\xbe000@jfXmj%\xef\xc5`-\x92\
-\xc0\xa0\xfc'\x80!Uw\x02\x83(\x8f4$\x86\x90\
-<\x00\x00\x00\x00\xff\xff\x22\xaa\x02\xfa\xfd\xeb?\x83\x84\
-\x0c\x1b\x83\x84\x12\x1f\xc3\xf4\xf5\x8b\x18~\xfd\xf9\xc5\xc0\
-\xc2\xcc\xcc\xf0\x9f\xe1?|\xe4I[\xcc\x82!L/\
-\x9f\xe1\xd3\xa7\xef\x0c[\xd6=d\xb0\xd5sa\x98\x98\
-\xd7\x0a5\x83\x91\xe1\x1f\x03\xc4\xa3\xfb\xef\xadb\xf8\xfa\
-\xeb\x13\x03\x0b\x0b3\x83\x98\x18'\xc3\xc3\x17O\x19\x9e\
-\xbf{\x01\x0dpH\x90\xf3\xb2\x093\x14\xb9\xb60\xb4\
-%\xb418\xe9:3\xc0\x87\xe7\x90\x9a\x1c\x00\x00\x00\
-\x00\xff\xff\x22\xae\xad\xc2\xc0\xc0\xf0\x9f\xf1\x1f\x83\xad\x93\
-\x04\xc3\xd5[\x17\x19\xa6\xac\x9b\xcd\xc0\xc0\xc0\xc0\xf0\xfb\
-\xcf\x1f\xb8\xc3\xfe\xff\xff\xcf\xe0\xa7\x91\xc1Pg\xb7\x86\
-aM\xf9F\x86\xbd\x13\xd70\x88\xf0\x8b@\xc6V\x18\
-\xfe203\xb20\xdc{w\x99\xe1\xd0\x83\xf5\x0c\xdc\
-l|\x0c\xbf~\xfdfP\xd7\xe1g\xf8\xf8\xf1\x15\xc3\
-\xca=\x9b \xf6\xfc\x83\xe5\x03\xb4!8,9\x18\x00\
-\x00\x00\xff\xff\x22j\x08\x8e\x91\x91\x81\xe1\xf7\xcf\xff\x0c\
-\x122,\x0c\xd6\xee2\x0c\x95S\xdb\x18L5\x8d\x18\
-lu-\x19~\xff\xf9\xcd\xc0\xc4\xc4\xc4\xc0\xcc\xc4\xc4\
-\xf0\xff\xff?\x06U)U\x06U)H)\x02I\xbf\
-\xff\x19\x98\x19Y\x18>\xfd|\xc70\xe7l-\xc3\xdf\
-\x7f\xbf\x19\xd8Y8\x19~\xff\xfe\xc7 $\xc6\xcc\xe0\
-\x1a(\xcb\xd0\xb1\xaa\x9bA\x5cX\x94!\xc4\xde\x9f\x81\
-\x99\x81\x91\xe1\xff\xff\x7f\x0c\x9f\x7f}`x\xf8\xe1:\
-\xc3\xa9';\x19\xde|{\xc6\xc0\xca\xcc\x86\xd2R\x04\
-\x00\x00\x00\xff\xffb\xe4\xf1\x90\xfb\xcf\xc8\xc8\xc0\xf0\xeb\
-\xe7\x7f\x06YEv\x06\xb7@\xdc\x03\xfb\xff\xff30\
-pp03\x9c:\xf2\x96\xe1\xe6\xf9\xbf\x0cKkf\
-3xY:B\xcauh\x1a\xfe\xf7\xff\x1f\xc3\xff\xff\
-\x90\x92\x076\x9e\xf8\xe4\xe3m\x86\xe9\xa7\xca\x18\x9e~\
-\xba\xcb\xc0\xc9\xca\x03\x1f\xfc\xfc\xff\x9f\x81\x81\x9d\x9d\x89\
-\xe1\xcb\x97_\x0c/_~eP\x93Qf\x10\x17\x12\
-c\xf8\xf1\xe7\x1b\xc3\xfb\xef/\x19>\xfex\x03\xcf\xfc\
-\xe8\x19\x14\x00\x00\x00\xff\xff\x22\xc9\xe10\xcb89Y\
-\x18\x1e\xde\xff\xccp\xf1\xf4G\x06o\xfdP\x86d\xcf\
-x\x06\x1d%M\x06Vho\x06\xe6\xe0o\xbf?3\
-\xac\xbd:\x99\xe1\xf0\x83\x0d\x0c\x7f\xfe\xfd\x82\x8c\x02\xa0\
-\x8d\xd8\xc2\x86\xacYX\x98\x18~\xfc\xfa\xc1\xf0\xfb\xcf\
-\x1f\xc8\x8c\x03\x13+\xb4\xe4a\xc4:\xca\x0b\x00\x00\x00\
-\xff\xff\x22y\x0e\x82\x91\x91\x81\xe1\xfb\xb7?\x0c2r\
-\xdc\x0c~\xe1\xd2\x0cw\x1971\x18%X1\xb4.\
-\xeec````\xf8\xfb\x17a\xc9\x9f\x7f\xbf\x18\x0e\
-\xde_\xcb\xc0\xc0\xc0\xc0\xc0\xc5\xca\x8b\xd5\x01\x8cL\x90\
-Q\x81\x9f?\xff203\xb01p\xb0r3\xb0\xb3\
-p203B'\x0b\xb0\x0fM\xff\x07\x00\x00\x00\xff\
-\xff\x22k\xf2\x84\x91\x89\x81\xe1\xd7\xaf\x7f\x0c?\xbe\xfd\
-ePS\x15g\x10\x94\xe0e\xd8zl\x0f\x03\x03\x03\
-\x03\x03\x1333<\xc9\xf0\xb1\x0b3\xb8\xa9\xc60|\
-\xf8\xf1\x8a\xe1\xe3\xcf\xb7\xd04\x8f=*\x19\x19\x19P\
-z=x\xdb0\xff\x19\xfe\x00\x00\x00\x00\xff\xff\x22k\
-F\x02n\xd1?\x06\x86\xff\x8c\x7f\x18\xd45\x04\x19\xce\
-\x1c\xbd\xcap\xe9\xde\x15\x06=%\x1d\xc8\x80\x11\xb4v\
-\x0d\xd4\xcaf\x90\xe1Sex\xf1\xe9\x11\xc3\xb1'\x9b\
-\x19>\xfcx\x85\xb3\xfdN\x84\xad\xff\xff\xfd\xff\xc3\xc8\
-\xcf.\xfa\x0c\x00\x00\x00\xff\xff\xa2l\xba\x8a\x91\x81\xe1\
-\xf7\xef\xff\x0c\xea\xba\xbc\x0c\x7f\xfe\x7fc\x98\xb1q!\
-\x03\x03\x03\x03\xc3\x9f\xbf\x7f\xe0\x0d1\x16FV\x06+\
-9\x1f\x86 \x9d,\x06^6\x01\x86\xbf\xff\xfe0\xe0\
-\xcc@\x04\x00\x13#\xe3\xbf\xdf\x7f\x7f2\xa8\x0a\x1b\xed\
-\x07\x00\x00\x00\xff\xff\xa2\xc8\xe1\x8c\x8c\x0c\x0c\x7f\x7f\xff\
-g\xe0\x15`dpt\x97e\x98\xb9v1\xc3\xf6\x13\
-{\x19\xd8X\xd9\xe0\x0e\xff\xcf\xf0\x9f\x88\xf9\x1f\xa2\xc0\
-\xff\xff\x0c\xff\x99\x98\x99\xd8~;(\x06\xcf\x02\x00\x00\
-\x00\xff\xff\xa2x\x82\x90\x91\x89\x81\xe1\xe7\x8f\x7f\x0c\xda\
-\x86<\x0c\xf6>\xc2\x0ci\x932\x19fl\x9a\xcf\xf0\
-\xe1\xf3g\x86\xff\xff\x11m\x94o\xbf?3\xfc\xf9\xff\
-\x1b\xe7\xc8\x14\x0e\xd3\xff322\xfdcbd\xfe\xc3\
-\xc2\xc4\xfa\xfb\xfd\xf7W\x8c\x0e\x0a\xa1S\xd4E\x8d\x8e\
-\x03\x00\x00\x00\xff\xff\x22\xb98\xc4\x05`e\xfc\xb7\xef\
-\xbf\x19\x9e<\xfd\xc0 ) \xc5\xa0()\xc7\xc0\xce\
-\xc6\xce\xf0\xfd\xf7g\x86\x8f?\xdeAG\xbc0\xd36\
-db\x16\xba\x82\x02\xba\xd8\xe0?\xc3?\xe6\x7f\xff \
-\x0b\x1c\xfe\xfe\xfb\xfd\xef\xf7\xdf_L\xb6\xf2A+R\
-M[bX\x98X\xfe\x02\x00\x00\x00\xff\xff\x22;s\
-bX\xce\xc8\xc0\xf0\xe3\xfb_\x06\x16ff\x065\x15\
-1\x86_\xbf\xbf1\xdc\xffx\x09>\xb5\x0d\x9df\xf9\
-\x0fY\x09\xc1\x04o\xe3\xfeg\xf8\xc7\xfc\xf7\xdf_\xc6\
-\xbf\xff~3\xfe\xfd\xf7\x87\xe1\xef\xbf\xbf\x0c\x8c\x0c\x90\
-~,\x17+\xdf\x17qN\xb1\xc7\xa2\x5c2\xb7\xcdd\
-\xdc\x97\x9a\xcbz\xac\x82\x0c\xb4\xffg\x04\x00\x00\x00\xff\
-\xffb\x81\xacz\xf8O\x95\x09pH\xf3\xfa?\xc3\xcf\
-\x1f\x7f\xfe32\xb2\xfc\xe7de\x83/\xd7\xf8\xf7\xff\
-/\xf3\xdf\x7f\x7f\x18\x7f\xff\xfb\xcd\xf8\xe7\xdf\x1f\x86\x7f\
-\xff k^\xd8 \x0e\xfc*\xc0!\xffX\x94[\xe6\
-\xb6$\xaf\xc2uI^\xc5\xab\x92\xbc\x0a7E\xb8\xa4\
-\x1e\xf0q\x08\xbdfbd\xfe\xc7\xc0\xc0\xc0\xf0\xff\xff\
-?&\x06h\xac\x00\x00\x00\x00\xff\xffb\xf9\xf3\xe7\x0f\
-\x03\x1b\x1b\xdb?\x06\x86\xdfL$%?\x88S\xff3\
-22\xa0\x85\xe0\x7f\xe6\x7f\xff\xff0\xfe\xfe\xfb\x8b\xf1\
-\xef\x9f\xdf\xf0\x10dafg\xe0f\xe5\xfb*\xc6!\
-\xffX\x94[\xfa\x0e\xc4\x81JW%x\x14n\x8ar\
-K\xddGv :\x80,\xc8\xf9\xcf\xc0\xc4\xc8\x0c\xcf\
-\xe5\x00\x00\x00\x00\xff\xffb\x11\x13\x10~\xf2\xf4\xeds\
-Yvf\xee\xbf\xff\xff30cw<\xe3\x7f\xa4\xc5\
-.(i\x10\x11\x82\x103Ya\x0e\xe4\x16}\x22\xca\
--s[\x82W\xe1\xba\x14\xaf\xe25\x09\x1e\x85\x9b\x22\
-\xdc\xd2\xf7\xf99\x84^\xe1r\xe0\xff\xff\xff\x98\xff\xc3\
-c\x1f\xba\x18\x81\x91\xf1?\x13\x96![\x00\x00\x00\x00\
-\xff\xffb\xd9\xd3\xbf\xc1.\xa4.n\xd3\xc5+\x97t\
-Y\x98\xa5\xfeB\x06S\x99\xfe31\x22V\x01\xfd\xfd\
-\xff\x87\xf1\xcf_\xc8\x0a\x86\xbf\xff\xa1!\xc8\xc4\xce\xc0\
-\xcd\xc6\xf7]\x94C\x0e\x12\x82<\x8a\xd7$y\x15\xaf\
-I\xf0\xca\xdf\x10\xe5\x96\xb9\xcf\xcf.\xf4\x8a\x89\x09\xb7\
-\x03\xffA\x17\xcc@\x03\x05\xb2\x04\x84\x91\xe9/\xb1\x91\
-\x0e\x00\x00\x00\xff\xffb\xfc\xff\xff?\xc3\xeb\x8fo\x84\
-\xbdJ\xa27?\xfev\xd928F\xee\xdf\xd7o\xdf\
-\x99\xfe3@\x062Y\x99\xd8\x18\xb8Xy?\x09p\
-\x88=\x11\xe1\x96\xbe#\xc1\xa3pC\x92W\xe1\x9a8\
-\x8f\xfcMQn\xa9\x07\xfc\xec\xc2x\x1d\x88-\x04\x89\
-t\x1b^\x00\x00\x00\x00\xff\xffb\xfc\xf3\xf7\x0f33\
-\x13\xf3\xdfW\xef\xde\xf3f\xcfN\xde.\xa1\xfdVO\
-\x96O\xfd\xac\x04\xaf\xc2ui>\x95KR\xbc\x8a\xd7\
-\xc4\xb8e\xef\x08p\x8a\xbedfb\xc6\xde\xe2\xf9\xff\
-\x8f\xf9\x1f\xc3?h\xc3\x96\x11i\xa9\x13\xd9\x9dx\x82\
-\x00\x00\x00\x00\xff\xff\x03\x00<\x1e\x17\xa6\x18\xe4\xa8\x9e\
-\x00\x00\x00\x00IEND\xaeB`\x82\
-"
-
-qt_resource_name = b"\
-\x00\x06\
-\x07\x03}\xc3\
-\x00i\
-\x00m\x00a\x00g\x00e\x00s\
-\x00\x0b\
-\x05R\xbf'\
-\x00q\
-\x00t\x00-\x00l\x00o\x00g\x00o\x00.\x00p\x00n\x00g\
-"
-
-qt_resource_struct = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x99\
-"
-
-def qInitResources():
- QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/examples/widgets/animation/easing/form.ui b/examples/widgets/animation/easing/form.ui
index 61a792115..364aebeda 100644
--- a/examples/widgets/animation/easing/form.ui
+++ b/examples/widgets/animation/easing/form.ui
@@ -49,12 +49,27 @@
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="groupBox_2">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>16777215</height>
+ </size>
+ </property>
<property name="title">
<string>Path type</string>
</property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
<widget class="QRadioButton" name="lineRadio">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>40</height>
+ </size>
+ </property>
+ <property name="layoutDirection">
+ <enum>Qt::LeftToRight</enum>
+ </property>
<property name="text">
<string>Line</string>
</property>
@@ -66,8 +81,14 @@
</attribute>
</widget>
</item>
- <item>
+ <item row="1" column="0">
<widget class="QRadioButton" name="circleRadio">
+ <property name="maximumSize">
+ <size>
+ <width>16777215</width>
+ <height>40</height>
+ </size>
+ </property>
<property name="text">
<string>Circle</string>
</property>
@@ -96,6 +117,18 @@
</property>
<item row="0" column="0">
<widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
<property name="text">
<string>Period</string>
</property>
@@ -106,6 +139,18 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
@@ -117,18 +162,17 @@
</property>
</widget>
</item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_2">
- <property name="text">
- <string>Amplitude</string>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
+ <item row="2" column="1">
<widget class="QDoubleSpinBox" name="amplitudeSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
@@ -140,18 +184,30 @@
</property>
</widget>
</item>
- <item row="2" column="0">
+ <item row="4" column="0">
<widget class="QLabel" name="label_3">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
<property name="text">
<string>Overshoot</string>
</property>
</widget>
</item>
- <item row="2" column="1">
+ <item row="4" column="1">
<widget class="QDoubleSpinBox" name="overshootSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
<property name="minimum">
<double>-1.000000000000000</double>
</property>
@@ -163,6 +219,19 @@
</property>
</widget>
</item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>30</height>
+ </size>
+ </property>
+ <property name="text">
+ <string>Amplitude</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -196,10 +265,6 @@
<resources/>
<connections/>
<buttongroups>
- <buttongroup name="buttonGroup">
- <property name="exclusive">
- <bool>false</bool>
- </property>
- </buttongroup>
+ <buttongroup name="buttonGroup"/>
</buttongroups>
</ui>
diff --git a/examples/widgets/animation/easing/images/qt-logo.png b/examples/widgets/animation/easing/images/qt-logo.png
deleted file mode 100644
index 14ddf2a02..000000000
--- a/examples/widgets/animation/easing/images/qt-logo.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/animation/easing/ui_form.py b/examples/widgets/animation/easing/ui_form.py
index c2279c5c5..2925cbae7 100644
--- a/examples/widgets/animation/easing/ui_form.py
+++ b/examples/widgets/animation/easing/ui_form.py
@@ -3,26 +3,33 @@
################################################################################
## Form generated from reading UI file 'form.ui'
##
-## Created by: Qt User Interface Compiler version 5.14.0
+## Created by: Qt User Interface Compiler version 6.7.0
##
## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################
-from PySide2.QtCore import (QCoreApplication, QMetaObject, QObject, QPoint,
- QRect, QSize, QUrl, Qt)
-from PySide2.QtGui import (QColor, QFont, QIcon, QPixmap)
-from PySide2.QtWidgets import *
+from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
+ QMetaObject, QObject, QPoint, QRect,
+ QSize, QTime, QUrl, Qt)
+from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
+ QFont, QFontDatabase, QGradient, QIcon,
+ QImage, QKeySequence, QLinearGradient, QPainter,
+ QPalette, QPixmap, QRadialGradient, QTransform)
+from PySide6.QtWidgets import (QApplication, QButtonGroup, QDoubleSpinBox, QFormLayout,
+ QGraphicsView, QGridLayout, QGroupBox, QLabel,
+ QListView, QListWidget, QListWidgetItem, QRadioButton,
+ QSizePolicy, QSpacerItem, QVBoxLayout, QWidget)
class Ui_Form(object):
def setupUi(self, Form):
- if Form.objectName():
+ if not Form.objectName():
Form.setObjectName(u"Form")
Form.resize(545, 471)
self.gridLayout = QGridLayout(Form)
self.gridLayout.setObjectName(u"gridLayout")
self.easingCurvePicker = QListWidget(Form)
self.easingCurvePicker.setObjectName(u"easingCurvePicker")
- sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
+ sizePolicy = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.easingCurvePicker.sizePolicy().hasHeightForWidth())
@@ -40,30 +47,33 @@ class Ui_Form(object):
self.verticalLayout.setObjectName(u"verticalLayout")
self.groupBox_2 = QGroupBox(Form)
self.groupBox_2.setObjectName(u"groupBox_2")
- self.verticalLayout_2 = QVBoxLayout(self.groupBox_2)
- self.verticalLayout_2.setObjectName(u"verticalLayout_2")
+ self.groupBox_2.setMaximumSize(QSize(16777215, 16777215))
+ self.gridLayout_2 = QGridLayout(self.groupBox_2)
+ self.gridLayout_2.setObjectName(u"gridLayout_2")
self.lineRadio = QRadioButton(self.groupBox_2)
self.buttonGroup = QButtonGroup(Form)
self.buttonGroup.setObjectName(u"buttonGroup")
- self.buttonGroup.setExclusive(False)
self.buttonGroup.addButton(self.lineRadio)
self.lineRadio.setObjectName(u"lineRadio")
+ self.lineRadio.setMaximumSize(QSize(16777215, 40))
+ self.lineRadio.setLayoutDirection(Qt.LeftToRight)
self.lineRadio.setChecked(True)
- self.verticalLayout_2.addWidget(self.lineRadio)
+ self.gridLayout_2.addWidget(self.lineRadio, 0, 0, 1, 1)
self.circleRadio = QRadioButton(self.groupBox_2)
self.buttonGroup.addButton(self.circleRadio)
self.circleRadio.setObjectName(u"circleRadio")
+ self.circleRadio.setMaximumSize(QSize(16777215, 40))
- self.verticalLayout_2.addWidget(self.circleRadio)
+ self.gridLayout_2.addWidget(self.circleRadio, 1, 0, 1, 1)
self.verticalLayout.addWidget(self.groupBox_2)
self.groupBox = QGroupBox(Form)
self.groupBox.setObjectName(u"groupBox")
- sizePolicy1 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred)
+ sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Preferred)
sizePolicy1.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
@@ -73,50 +83,66 @@ class Ui_Form(object):
self.formLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
self.label = QLabel(self.groupBox)
self.label.setObjectName(u"label")
+ sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
+ sizePolicy2.setHorizontalStretch(0)
+ sizePolicy2.setVerticalStretch(0)
+ sizePolicy2.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
+ self.label.setSizePolicy(sizePolicy2)
+ self.label.setMinimumSize(QSize(0, 30))
self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label)
self.periodSpinBox = QDoubleSpinBox(self.groupBox)
self.periodSpinBox.setObjectName(u"periodSpinBox")
self.periodSpinBox.setEnabled(False)
+ sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Fixed)
+ sizePolicy3.setHorizontalStretch(0)
+ sizePolicy3.setVerticalStretch(0)
+ sizePolicy3.setHeightForWidth(self.periodSpinBox.sizePolicy().hasHeightForWidth())
+ self.periodSpinBox.setSizePolicy(sizePolicy3)
+ self.periodSpinBox.setMinimumSize(QSize(0, 30))
self.periodSpinBox.setMinimum(-1.000000000000000)
self.periodSpinBox.setSingleStep(0.100000000000000)
self.periodSpinBox.setValue(-1.000000000000000)
self.formLayout.setWidget(0, QFormLayout.FieldRole, self.periodSpinBox)
- self.label_2 = QLabel(self.groupBox)
- self.label_2.setObjectName(u"label_2")
-
- self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2)
-
self.amplitudeSpinBox = QDoubleSpinBox(self.groupBox)
self.amplitudeSpinBox.setObjectName(u"amplitudeSpinBox")
self.amplitudeSpinBox.setEnabled(False)
+ self.amplitudeSpinBox.setMinimumSize(QSize(0, 30))
self.amplitudeSpinBox.setMinimum(-1.000000000000000)
self.amplitudeSpinBox.setSingleStep(0.100000000000000)
self.amplitudeSpinBox.setValue(-1.000000000000000)
- self.formLayout.setWidget(1, QFormLayout.FieldRole, self.amplitudeSpinBox)
+ self.formLayout.setWidget(2, QFormLayout.FieldRole, self.amplitudeSpinBox)
self.label_3 = QLabel(self.groupBox)
self.label_3.setObjectName(u"label_3")
+ self.label_3.setMinimumSize(QSize(0, 30))
- self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3)
+ self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label_3)
self.overshootSpinBox = QDoubleSpinBox(self.groupBox)
self.overshootSpinBox.setObjectName(u"overshootSpinBox")
self.overshootSpinBox.setEnabled(False)
+ self.overshootSpinBox.setMinimumSize(QSize(0, 30))
self.overshootSpinBox.setMinimum(-1.000000000000000)
self.overshootSpinBox.setSingleStep(0.100000000000000)
self.overshootSpinBox.setValue(-1.000000000000000)
- self.formLayout.setWidget(2, QFormLayout.FieldRole, self.overshootSpinBox)
+ self.formLayout.setWidget(4, QFormLayout.FieldRole, self.overshootSpinBox)
+
+ self.label_2 = QLabel(self.groupBox)
+ self.label_2.setObjectName(u"label_2")
+ self.label_2.setMinimumSize(QSize(0, 30))
+
+ self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_2)
self.verticalLayout.addWidget(self.groupBox)
- self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)
+ self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Expanding)
self.verticalLayout.addItem(self.verticalSpacer)
@@ -125,11 +151,11 @@ class Ui_Form(object):
self.graphicsView = QGraphicsView(Form)
self.graphicsView.setObjectName(u"graphicsView")
- sizePolicy2 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
- sizePolicy2.setHorizontalStretch(0)
- sizePolicy2.setVerticalStretch(0)
- sizePolicy2.setHeightForWidth(self.graphicsView.sizePolicy().hasHeightForWidth())
- self.graphicsView.setSizePolicy(sizePolicy2)
+ sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)
+ sizePolicy4.setHorizontalStretch(0)
+ sizePolicy4.setVerticalStretch(0)
+ sizePolicy4.setHeightForWidth(self.graphicsView.sizePolicy().hasHeightForWidth())
+ self.graphicsView.setSizePolicy(sizePolicy4)
self.gridLayout.addWidget(self.graphicsView, 1, 1, 1, 1)
@@ -146,7 +172,7 @@ class Ui_Form(object):
self.circleRadio.setText(QCoreApplication.translate("Form", u"Circle", None))
self.groupBox.setTitle(QCoreApplication.translate("Form", u"Properties", None))
self.label.setText(QCoreApplication.translate("Form", u"Period", None))
- self.label_2.setText(QCoreApplication.translate("Form", u"Amplitude", None))
self.label_3.setText(QCoreApplication.translate("Form", u"Overshoot", None))
+ self.label_2.setText(QCoreApplication.translate("Form", u"Amplitude", None))
# retranslateUi
diff --git a/examples/widgets/animation/states/doc/states.png b/examples/widgets/animation/states/doc/states.png
new file mode 100644
index 000000000..37fb0c3c9
--- /dev/null
+++ b/examples/widgets/animation/states/doc/states.png
Binary files differ
diff --git a/examples/widgets/animation/states/doc/states.rst b/examples/widgets/animation/states/doc/states.rst
new file mode 100644
index 000000000..440becced
--- /dev/null
+++ b/examples/widgets/animation/states/doc/states.rst
@@ -0,0 +1,8 @@
+States Example
+==============
+
+The States example shows how to use the Qt state machine to play animations.
+
+.. image:: states.png
+ :width: 400
+ :alt: States Screenshot
diff --git a/examples/widgets/animation/states/states.py b/examples/widgets/animation/states/states.py
index 1a859245a..509c3a7aa 100644
--- a/examples/widgets/animation/states/states.py
+++ b/examples/widgets/animation/states/states.py
@@ -1,114 +1,85 @@
+# Copyright (C) 2010 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2010 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+import sys
-from PySide2 import QtCore, QtGui, QtWidgets
+from PySide6.QtCore import (QPointF, QPropertyAnimation,
+ QSequentialAnimationGroup, QRect, QRectF, QSizeF,
+ Qt)
+from PySide6.QtGui import QPixmap
+from PySide6.QtWidgets import (QApplication, QGraphicsLinearLayout,
+ QGraphicsObject, QGraphicsProxyWidget,
+ QGraphicsWidget, QGraphicsScene, QGraphicsView,
+ QGroupBox, QPushButton, QRadioButton,
+ QTextEdit, QVBoxLayout)
-import states_rc
+from PySide6.QtStateMachine import QState, QStateMachine
+import states_rc # noqa: F401
-class Pixmap(QtWidgets.QGraphicsObject):
+
+class Pixmap(QGraphicsObject):
def __init__(self, pix):
- super(Pixmap, self).__init__()
+ super().__init__()
- self.p = QtGui.QPixmap(pix)
+ self.p = QPixmap(pix)
def paint(self, painter, option, widget):
- painter.drawPixmap(QtCore.QPointF(), self.p)
+ painter.drawPixmap(QPointF(), self.p)
def boundingRect(self):
- return QtCore.QRectF(QtCore.QPointF(0, 0), QtCore.QSizeF(self.p.size()))
+ return QRectF(QPointF(0, 0), QSizeF(self.p.size()))
if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
# Text edit and button.
- edit = QtWidgets.QTextEdit()
+ edit = QTextEdit()
edit.setText("asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy "
"asdf lkjha yuoiqwe asd iuaysd u iasyd uiy!")
- button = QtWidgets.QPushButton()
- buttonProxy = QtWidgets.QGraphicsProxyWidget()
- buttonProxy.setWidget(button)
- editProxy = QtWidgets.QGraphicsProxyWidget()
- editProxy.setWidget(edit)
+ button = QPushButton()
+ button_proxy = QGraphicsProxyWidget()
+ button_proxy.setWidget(button)
+ edit_proxy = QGraphicsProxyWidget()
+ edit_proxy.setWidget(edit)
- box = QtWidgets.QGroupBox()
+ box = QGroupBox()
box.setFlat(True)
box.setTitle("Options")
- layout2 = QtWidgets.QVBoxLayout()
+ layout2 = QVBoxLayout()
box.setLayout(layout2)
- layout2.addWidget(QtWidgets.QRadioButton("Herring"))
- layout2.addWidget(QtWidgets.QRadioButton("Blue Parrot"))
- layout2.addWidget(QtWidgets.QRadioButton("Petunias"))
+ layout2.addWidget(QRadioButton("Herring"))
+ layout2.addWidget(QRadioButton("Blue Parrot"))
+ layout2.addWidget(QRadioButton("Petunias"))
layout2.addStretch()
- boxProxy = QtWidgets.QGraphicsProxyWidget()
- boxProxy.setWidget(box)
+ box_proxy = QGraphicsProxyWidget()
+ box_proxy.setWidget(box)
# Parent widget.
- widget = QtWidgets.QGraphicsWidget()
- layout = QtWidgets.QGraphicsLinearLayout(QtCore.Qt.Vertical, widget)
- layout.addItem(editProxy)
- layout.addItem(buttonProxy)
+ widget = QGraphicsWidget()
+ layout = QGraphicsLinearLayout(Qt.Vertical, widget)
+ layout.addItem(edit_proxy)
+ layout.addItem(button_proxy)
widget.setLayout(layout)
- p1 = Pixmap(QtGui.QPixmap(':/digikam.png'))
- p2 = Pixmap(QtGui.QPixmap(':/akregator.png'))
- p3 = Pixmap(QtGui.QPixmap(':/accessories-dictionary.png'))
- p4 = Pixmap(QtGui.QPixmap(':/k3b.png'))
- p5 = Pixmap(QtGui.QPixmap(':/help-browser.png'))
- p6 = Pixmap(QtGui.QPixmap(':/kchart.png'))
+ p1 = Pixmap(QPixmap(':/digikam.png'))
+ p2 = Pixmap(QPixmap(':/akregator.png'))
+ p3 = Pixmap(QPixmap(':/accessories-dictionary.png'))
+ p4 = Pixmap(QPixmap(':/k3b.png'))
+ p5 = Pixmap(QPixmap(':/help-browser.png'))
+ p6 = Pixmap(QPixmap(':/kchart.png'))
- scene = QtWidgets.QGraphicsScene(0, 0, 400, 300)
+ scene = QGraphicsScene(0, 0, 400, 300)
scene.setBackgroundBrush(scene.palette().window())
scene.addItem(widget)
- scene.addItem(boxProxy)
+ scene.addItem(box_proxy)
scene.addItem(p1)
scene.addItem(p2)
scene.addItem(p3)
@@ -116,29 +87,29 @@ if __name__ == '__main__':
scene.addItem(p5)
scene.addItem(p6)
- machine = QtCore.QStateMachine()
- state1 = QtCore.QState(machine)
- state2 = QtCore.QState(machine)
- state3 = QtCore.QState(machine)
+ machine = QStateMachine()
+ state1 = QState(machine)
+ state2 = QState(machine)
+ state3 = QState(machine)
machine.setInitialState(state1)
# State 1.
state1.assignProperty(button, 'text', "Switch to state 2")
- state1.assignProperty(widget, 'geometry', QtCore.QRectF(0, 0, 400, 150))
- state1.assignProperty(box, 'geometry', QtCore.QRect(-200, 150, 200, 150))
- state1.assignProperty(p1, 'pos', QtCore.QPointF(68, 185))
- state1.assignProperty(p2, 'pos', QtCore.QPointF(168, 185))
- state1.assignProperty(p3, 'pos', QtCore.QPointF(268, 185))
- state1.assignProperty(p4, 'pos', QtCore.QPointF(68 - 150, 48 - 150))
- state1.assignProperty(p5, 'pos', QtCore.QPointF(168, 48 - 150))
- state1.assignProperty(p6, 'pos', QtCore.QPointF(268 + 150, 48 - 150))
+ state1.assignProperty(widget, 'geometry', QRectF(0, 0, 400, 150))
+ state1.assignProperty(box, 'geometry', QRect(-200, 150, 200, 150))
+ state1.assignProperty(p1, 'pos', QPointF(68, 185))
+ state1.assignProperty(p2, 'pos', QPointF(168, 185))
+ state1.assignProperty(p3, 'pos', QPointF(268, 185))
+ state1.assignProperty(p4, 'pos', QPointF(68 - 150, 48 - 150))
+ state1.assignProperty(p5, 'pos', QPointF(168, 48 - 150))
+ state1.assignProperty(p6, 'pos', QPointF(268 + 150, 48 - 150))
state1.assignProperty(p1, 'rotation', 0.0)
state1.assignProperty(p2, 'rotation', 0.0)
state1.assignProperty(p3, 'rotation', 0.0)
state1.assignProperty(p4, 'rotation', -270.0)
state1.assignProperty(p5, 'rotation', -90.0)
state1.assignProperty(p6, 'rotation', 270.0)
- state1.assignProperty(boxProxy, 'opacity', 0.0)
+ state1.assignProperty(box_proxy, 'opacity', 0.0)
state1.assignProperty(p1, 'opacity', 1.0)
state1.assignProperty(p2, 'opacity', 1.0)
state1.assignProperty(p3, 'opacity', 1.0)
@@ -148,21 +119,21 @@ if __name__ == '__main__':
# State 2.
state2.assignProperty(button, 'text', "Switch to state 3")
- state2.assignProperty(widget, 'geometry', QtCore.QRectF(200, 150, 200, 150))
- state2.assignProperty(box, 'geometry', QtCore.QRect(9, 150, 190, 150))
- state2.assignProperty(p1, 'pos', QtCore.QPointF(68 - 150, 185 + 150))
- state2.assignProperty(p2, 'pos', QtCore.QPointF(168, 185 + 150))
- state2.assignProperty(p3, 'pos', QtCore.QPointF(268 + 150, 185 + 150))
- state2.assignProperty(p4, 'pos', QtCore.QPointF(64, 48))
- state2.assignProperty(p5, 'pos', QtCore.QPointF(168, 48))
- state2.assignProperty(p6, 'pos', QtCore.QPointF(268, 48))
+ state2.assignProperty(widget, 'geometry', QRectF(200, 150, 200, 150))
+ state2.assignProperty(box, 'geometry', QRect(9, 150, 190, 150))
+ state2.assignProperty(p1, 'pos', QPointF(68 - 150, 185 + 150))
+ state2.assignProperty(p2, 'pos', QPointF(168, 185 + 150))
+ state2.assignProperty(p3, 'pos', QPointF(268 + 150, 185 + 150))
+ state2.assignProperty(p4, 'pos', QPointF(64, 48))
+ state2.assignProperty(p5, 'pos', QPointF(168, 48))
+ state2.assignProperty(p6, 'pos', QPointF(268, 48))
state2.assignProperty(p1, 'rotation', -270.0)
state2.assignProperty(p2, 'rotation', 90.0)
state2.assignProperty(p3, 'rotation', 270.0)
state2.assignProperty(p4, 'rotation', 0.0)
state2.assignProperty(p5, 'rotation', 0.0)
state2.assignProperty(p6, 'rotation', 0.0)
- state2.assignProperty(boxProxy, 'opacity', 1.0)
+ state2.assignProperty(box_proxy, 'opacity', 1.0)
state2.assignProperty(p1, 'opacity', 0.0)
state2.assignProperty(p2, 'opacity', 0.0)
state2.assignProperty(p3, 'opacity', 0.0)
@@ -172,14 +143,14 @@ if __name__ == '__main__':
# State 3.
state3.assignProperty(button, 'text', "Switch to state 1")
- state3.assignProperty(p1, 'pos', QtCore.QPointF(0, 5))
- state3.assignProperty(p2, 'pos', QtCore.QPointF(0, 5 + 64 + 5))
- state3.assignProperty(p3, 'pos', QtCore.QPointF(5, 5 + (64 + 5) + 64))
- state3.assignProperty(p4, 'pos', QtCore.QPointF(5 + 64 + 5, 5))
- state3.assignProperty(p5, 'pos', QtCore.QPointF(5 + 64 + 5, 5 + 64 + 5))
- state3.assignProperty(p6, 'pos', QtCore.QPointF(5 + 64 + 5, 5 + (64 + 5) + 64))
- state3.assignProperty(widget, 'geometry', QtCore.QRectF(138, 5, 400 - 138, 200))
- state3.assignProperty(box, 'geometry', QtCore.QRect(5, 205, 400, 90))
+ state3.assignProperty(p1, 'pos', QPointF(0, 5))
+ state3.assignProperty(p2, 'pos', QPointF(0, 5 + 64 + 5))
+ state3.assignProperty(p3, 'pos', QPointF(5, 5 + (64 + 5) + 64))
+ state3.assignProperty(p4, 'pos', QPointF(5 + 64 + 5, 5))
+ state3.assignProperty(p5, 'pos', QPointF(5 + 64 + 5, 5 + 64 + 5))
+ state3.assignProperty(p6, 'pos', QPointF(5 + 64 + 5, 5 + (64 + 5) + 64))
+ state3.assignProperty(widget, 'geometry', QRectF(138, 5, 400 - 138, 200))
+ state3.assignProperty(box, 'geometry', QRect(5, 205, 400, 90))
state3.assignProperty(p1, 'opacity', 1.0)
state3.assignProperty(p2, 'opacity', 1.0)
state3.assignProperty(p3, 'opacity', 1.0)
@@ -188,77 +159,77 @@ if __name__ == '__main__':
state3.assignProperty(p6, 'opacity', 1.0)
t1 = state1.addTransition(button.clicked, state2)
- animation1SubGroup = QtCore.QSequentialAnimationGroup()
- animation1SubGroup.addPause(250)
- animation1SubGroup.addAnimation(QtCore.QPropertyAnimation(box, b'geometry', state1))
- t1.addAnimation(animation1SubGroup)
- t1.addAnimation(QtCore.QPropertyAnimation(widget, b'geometry', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p1, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p2, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p3, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p4, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p5, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p6, b'pos', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p1, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p2, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p3, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p4, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p5, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p6, b'rotation', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p1, b'opacity', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p2, b'opacity', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p3, b'opacity', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p4, b'opacity', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p5, b'opacity', state1))
- t1.addAnimation(QtCore.QPropertyAnimation(p6, b'opacity', state1))
+ animation_1sub_group = QSequentialAnimationGroup()
+ animation_1sub_group.addPause(250)
+ animation_1sub_group.addAnimation(QPropertyAnimation(box, b'geometry', state1))
+ t1.addAnimation(animation_1sub_group)
+ t1.addAnimation(QPropertyAnimation(widget, b'geometry', state1))
+ t1.addAnimation(QPropertyAnimation(p1, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p2, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p3, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p4, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p5, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p6, b'pos', state1))
+ t1.addAnimation(QPropertyAnimation(p1, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p2, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p3, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p4, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p5, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p6, b'rotation', state1))
+ t1.addAnimation(QPropertyAnimation(p1, b'opacity', state1))
+ t1.addAnimation(QPropertyAnimation(p2, b'opacity', state1))
+ t1.addAnimation(QPropertyAnimation(p3, b'opacity', state1))
+ t1.addAnimation(QPropertyAnimation(p4, b'opacity', state1))
+ t1.addAnimation(QPropertyAnimation(p5, b'opacity', state1))
+ t1.addAnimation(QPropertyAnimation(p6, b'opacity', state1))
t2 = state2.addTransition(button.clicked, state3)
- t2.addAnimation(QtCore.QPropertyAnimation(box, b'geometry', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(widget, b'geometry', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p1, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p2, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p3, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p4, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p5, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p6, b'pos', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p1, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p2, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p3, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p4, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p5, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p6, b'rotation', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p1, b'opacity', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p2, b'opacity', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p3, b'opacity', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p4, b'opacity', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p5, b'opacity', state2))
- t2.addAnimation(QtCore.QPropertyAnimation(p6, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(box, b'geometry', state2))
+ t2.addAnimation(QPropertyAnimation(widget, b'geometry', state2))
+ t2.addAnimation(QPropertyAnimation(p1, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p2, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p3, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p4, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p5, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p6, b'pos', state2))
+ t2.addAnimation(QPropertyAnimation(p1, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p2, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p3, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p4, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p5, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p6, b'rotation', state2))
+ t2.addAnimation(QPropertyAnimation(p1, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(p2, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(p3, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(p4, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(p5, b'opacity', state2))
+ t2.addAnimation(QPropertyAnimation(p6, b'opacity', state2))
t3 = state3.addTransition(button.clicked, state1)
- t3.addAnimation(QtCore.QPropertyAnimation(box, b'geometry', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(widget, b'geometry', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p1, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p2, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p3, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p4, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p5, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p6, b'pos', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p1, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p2, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p3, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p4, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p5, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p6, b'rotation', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p1, b'opacity', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p2, b'opacity', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p3, b'opacity', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p4, b'opacity', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p5, b'opacity', state3))
- t3.addAnimation(QtCore.QPropertyAnimation(p6, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(box, b'geometry', state3))
+ t3.addAnimation(QPropertyAnimation(widget, b'geometry', state3))
+ t3.addAnimation(QPropertyAnimation(p1, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p2, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p3, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p4, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p5, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p6, b'pos', state3))
+ t3.addAnimation(QPropertyAnimation(p1, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p2, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p3, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p4, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p5, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p6, b'rotation', state3))
+ t3.addAnimation(QPropertyAnimation(p1, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(p2, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(p3, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(p4, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(p5, b'opacity', state3))
+ t3.addAnimation(QPropertyAnimation(p6, b'opacity', state3))
machine.start()
- view = QtWidgets.QGraphicsView(scene)
+ view = QGraphicsView(scene)
view.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/animation/states/states.pyproject b/examples/widgets/animation/states/states.pyproject
index d94cf2e65..45ad44e97 100644
--- a/examples/widgets/animation/states/states.pyproject
+++ b/examples/widgets/animation/states/states.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["states.py", "states_rc.py"]
+ "files": ["states.py"]
}
diff --git a/examples/widgets/animation/states/states_rc.py b/examples/widgets/animation/states/states_rc.py
index fe8a05c45..8b87b5e5e 100644
--- a/examples/widgets/animation/states/states_rc.py
+++ b/examples/widgets/animation/states/states_rc.py
@@ -1,45 +1,6 @@
-# -*- coding: utf-8 -*-
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
# Resource object code
#
@@ -48,7 +9,7 @@
#
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x1b\x48\
diff --git a/examples/widgets/codeeditor/codeeditor.py b/examples/widgets/codeeditor/codeeditor.py
deleted file mode 100644
index 331069f4a..000000000
--- a/examples/widgets/codeeditor/codeeditor.py
+++ /dev/null
@@ -1,141 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2019 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtCore import Slot, Qt, QRect, QSize
-from PySide2.QtGui import QColor, QPainter, QTextFormat
-from PySide2.QtWidgets import QPlainTextEdit, QWidget, QTextEdit
-
-
-class LineNumberArea(QWidget):
- def __init__(self, editor):
- QWidget.__init__(self, editor)
- self.codeEditor = editor
-
- def sizeHint(self):
- return QSize(self.codeEditor.line_number_area_width(), 0)
-
- def paintEvent(self, event):
- self.codeEditor.lineNumberAreaPaintEvent(event)
-
-
-class CodeEditor(QPlainTextEdit):
- def __init__(self):
- QPlainTextEdit.__init__(self)
- self.line_number_area = LineNumberArea(self)
-
- self.blockCountChanged[int].connect(self.update_line_number_area_width)
- self.updateRequest[QRect, int].connect(self.update_line_number_area)
- self.cursorPositionChanged.connect(self.highlight_current_line)
-
- self.update_line_number_area_width(0)
- self.highlight_current_line()
-
- def line_number_area_width(self):
- digits = 1
- max_num = max(1, self.blockCount())
- while max_num >= 10:
- max_num *= 0.1
- digits += 1
-
- space = 3 + self.fontMetrics().width('9') * digits
- return space
-
- def resizeEvent(self, e):
- super().resizeEvent(e)
- cr = self.contentsRect()
- width = self.line_number_area_width()
- rect = QRect(cr.left(), cr.top(), width, cr.height())
- self.line_number_area.setGeometry(rect)
-
- def lineNumberAreaPaintEvent(self, event):
- painter = QPainter(self.line_number_area)
- painter.fillRect(event.rect(), Qt.lightGray)
- block = self.firstVisibleBlock()
- block_number = block.blockNumber()
- offset = self.contentOffset()
- top = self.blockBoundingGeometry(block).translated(offset).top()
- bottom = top + self.blockBoundingRect(block).height()
-
- while block.isValid() and top <= event.rect().bottom():
- if block.isVisible() and bottom >= event.rect().top():
- number = str(block_number + 1)
- painter.setPen(Qt.black)
- width = self.line_number_area.width()
- height = self.fontMetrics().height()
- painter.drawText(0, top, width, height, Qt.AlignRight, number)
-
- block = block.next()
- top = bottom
- bottom = top + self.blockBoundingRect(block).height()
- block_number += 1
-
- @Slot()
- def update_line_number_area_width(self, newBlockCount):
- self.setViewportMargins(self.line_number_area_width(), 0, 0, 0)
-
- @Slot()
- def update_line_number_area(self, rect, dy):
- if dy:
- self.line_number_area.scroll(0, dy)
- else:
- width = self.line_number_area.width()
- self.line_number_area.update(0, rect.y(), width, rect.height())
-
- if rect.contains(self.viewport().rect()):
- self.update_line_number_area_width(0)
-
- @Slot()
- def highlight_current_line(self):
- extra_selections = []
-
- if not self.isReadOnly():
- selection = QTextEdit.ExtraSelection()
-
- line_color = QColor(Qt.yellow).lighter(160)
- selection.format.setBackground(line_color)
-
- selection.format.setProperty(QTextFormat.FullWidthSelection, True)
-
- selection.cursor = self.textCursor()
- selection.cursor.clearSelection()
-
- extra_selections.append(selection)
-
- self.setExtraSelections(extra_selections)
diff --git a/examples/widgets/codeeditor/main.py b/examples/widgets/codeeditor/main.py
deleted file mode 100644
index 14c2e0826..000000000
--- a/examples/widgets/codeeditor/main.py
+++ /dev/null
@@ -1,52 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2019 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import sys
-from PySide2.QtWidgets import QApplication
-from codeeditor import CodeEditor
-
-"""PySide2 port of the widgets/codeeditor example from Qt5"""
-
-if __name__ == "__main__":
- app = QApplication([])
- editor = CodeEditor()
- editor.setWindowTitle("Code Editor Example")
- editor.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/desktop/screenshot/doc/screenshot.png b/examples/widgets/desktop/screenshot/doc/screenshot.png
new file mode 100644
index 000000000..4e2b78083
--- /dev/null
+++ b/examples/widgets/desktop/screenshot/doc/screenshot.png
Binary files differ
diff --git a/examples/widgets/desktop/screenshot/doc/screenshot.rst b/examples/widgets/desktop/screenshot/doc/screenshot.rst
new file mode 100644
index 000000000..48f00b67b
--- /dev/null
+++ b/examples/widgets/desktop/screenshot/doc/screenshot.rst
@@ -0,0 +1,8 @@
+Screenshot Example
+==================
+
+The Screenshot example shows how to take a screenshot of the desktop.
+
+.. image:: screenshot.png
+ :width: 373
+ :alt: Screenshot program screenshot
diff --git a/examples/widgets/desktop/screenshot/screenshot.py b/examples/widgets/desktop/screenshot/screenshot.py
new file mode 100644
index 000000000..a5688da7a
--- /dev/null
+++ b/examples/widgets/desktop/screenshot/screenshot.py
@@ -0,0 +1,156 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/desktop/screenshot example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtCore import (QDir, QPoint, QRect, QStandardPaths, Qt, QTimer,
+ Slot)
+from PySide6.QtGui import QGuiApplication, QImageWriter
+from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog, QFileDialog,
+ QGridLayout, QGroupBox, QHBoxLayout, QLabel,
+ QMessageBox, QPushButton, QSizePolicy, QSpinBox,
+ QVBoxLayout, QWidget)
+
+
+class Screenshot(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ self.screenshot_label = QLabel(self)
+
+ self.screenshot_label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+ self.screenshot_label.setAlignment(Qt.AlignCenter)
+
+ screen_geometry: QRect = self.screen().geometry()
+ self.screenshot_label.setMinimumSize(
+ screen_geometry.width() / 8, screen_geometry.height() / 8
+ )
+
+ main_layout = QVBoxLayout(self)
+ main_layout.addWidget(self.screenshot_label)
+
+ options_group_box = QGroupBox("Options", self)
+ self.delay_spinbox = QSpinBox(options_group_box)
+ self.delay_spinbox.setSuffix(" s")
+ self.delay_spinbox.setMaximum(60)
+
+ self.delay_spinbox.valueChanged.connect(self.update_checkbox)
+
+ self.hide_this_window_checkbox = QCheckBox("Hide This Window", options_group_box)
+
+ options_group_box_layout = QGridLayout(options_group_box)
+ options_group_box_layout.addWidget(QLabel("Screenshot Delay:", self), 0, 0)
+ options_group_box_layout.addWidget(self.delay_spinbox, 0, 1)
+ options_group_box_layout.addWidget(self.hide_this_window_checkbox, 1, 0, 1, 2)
+
+ main_layout.addWidget(options_group_box)
+
+ buttons_layout = QHBoxLayout()
+ self.new_screenshot_button = QPushButton("New Screenshot", self)
+ self.new_screenshot_button.clicked.connect(self.new_screenshot)
+ buttons_layout.addWidget(self.new_screenshot_button)
+ save_screenshot_button = QPushButton("Save Screenshot", self)
+ save_screenshot_button.clicked.connect(self.save_screenshot)
+ buttons_layout.addWidget(save_screenshot_button)
+ quit_screenshot_button = QPushButton("Quit", self)
+ quit_screenshot_button.setShortcut(Qt.CTRL | Qt.Key_Q)
+ quit_screenshot_button.clicked.connect(self.close)
+ buttons_layout.addWidget(quit_screenshot_button)
+ buttons_layout.addStretch()
+ main_layout.addLayout(buttons_layout)
+
+ self.shoot_screen()
+ self.delay_spinbox.setValue(5)
+
+ self.setWindowTitle("Screenshot")
+ self.resize(300, 200)
+
+ def resizeEvent(self, event):
+ scaled_size = self.original_pixmap.size()
+ scaled_size.scale(self.screenshot_label.size(), Qt.KeepAspectRatio)
+ if scaled_size != self.screenshot_label.pixmap().size():
+ self.update_screenshot_label()
+
+ @Slot()
+ def new_screenshot(self):
+ if self.hide_this_window_checkbox.isChecked():
+ self.hide()
+ self.new_screenshot_button.setDisabled(True)
+
+ QTimer.singleShot(self.delay_spinbox.value() * 1000, self.shoot_screen)
+
+ @Slot()
+ def save_screenshot(self):
+ fmt = "png" # In order to avoid shadowing built-in format
+ initial_path = QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
+ if not initial_path:
+ initial_path = QDir.currentPath()
+ initial_path += f"/untitled.{fmt}"
+
+ fileDialog = QFileDialog(self, "Save As", initial_path)
+ fileDialog.setAcceptMode(QFileDialog.AcceptSave)
+ fileDialog.setFileMode(QFileDialog.AnyFile)
+ fileDialog.setDirectory(initial_path)
+ mime_types = []
+
+ for bf in QImageWriter.supportedMimeTypes():
+ mime_types.append(bf.data().decode("utf8"))
+ fileDialog.setMimeTypeFilters(mime_types)
+ fileDialog.selectMimeTypeFilter("image/" + fmt)
+ fileDialog.setDefaultSuffix(fmt)
+ if fileDialog.exec() != QDialog.Accepted:
+ return
+
+ file_name = fileDialog.selectedFiles()[0]
+ if not self.original_pixmap.save(file_name):
+ path = QDir.toNativeSeparators(file_name)
+ QMessageBox.warning(
+ self,
+ "Save Error",
+ f"The image could not be saved to {path}.",
+ )
+
+ def shoot_screen(self):
+ screen = QGuiApplication.primaryScreen()
+ window = self.windowHandle()
+ if window:
+ screen = window.screen()
+ if not screen:
+ return
+
+ if self.delay_spinbox.value() != 0:
+ QApplication.beep()
+
+ self.original_pixmap = screen.grabWindow(0)
+ self.update_screenshot_label()
+
+ self.new_screenshot_button.setDisabled(False)
+ if self.hide_this_window_checkbox.isChecked():
+ self.show()
+
+ @Slot()
+ def update_checkbox(self):
+ if self.delay_spinbox.value() == 0:
+ self.hide_this_window_checkbox.setDisabled(True)
+ self.hide_this_window_checkbox.setChecked(False)
+ else:
+ self.hide_this_window_checkbox.setDisabled(False)
+
+ def update_screenshot_label(self):
+ self.screenshot_label.setPixmap(
+ self.original_pixmap.scaled(
+ self.screenshot_label.size(),
+ Qt.KeepAspectRatio,
+ Qt.SmoothTransformation,
+ )
+ )
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ screenshot = Screenshot()
+ screenshot.move(screenshot.screen().availableGeometry().topLeft() + QPoint(20, 20))
+ screenshot.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/desktop/screenshot/screenshot.pyproject b/examples/widgets/desktop/screenshot/screenshot.pyproject
new file mode 100644
index 000000000..d4bdb4d76
--- /dev/null
+++ b/examples/widgets/desktop/screenshot/screenshot.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["screenshot.py"]
+}
diff --git a/examples/widgets/systray/images/bad.png b/examples/widgets/desktop/systray/images/bad.png
index c8701a241..c8701a241 100644
--- a/examples/widgets/systray/images/bad.png
+++ b/examples/widgets/desktop/systray/images/bad.png
Binary files differ
diff --git a/examples/widgets/systray/images/heart.png b/examples/widgets/desktop/systray/images/heart.png
index cee1302b7..cee1302b7 100644
--- a/examples/widgets/systray/images/heart.png
+++ b/examples/widgets/desktop/systray/images/heart.png
Binary files differ
diff --git a/examples/widgets/systray/images/trash.png b/examples/widgets/desktop/systray/images/trash.png
index 4c24db926..4c24db926 100644
--- a/examples/widgets/systray/images/trash.png
+++ b/examples/widgets/desktop/systray/images/trash.png
Binary files differ
diff --git a/examples/widgets/desktop/systray/main.py b/examples/widgets/desktop/systray/main.py
new file mode 100644
index 000000000..c52c51387
--- /dev/null
+++ b/examples/widgets/desktop/systray/main.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtWidgets import QApplication, QMessageBox, QSystemTrayIcon
+
+from window import Window
+
+if __name__ == "__main__":
+ app = QApplication()
+
+ if not QSystemTrayIcon.isSystemTrayAvailable():
+ QMessageBox.critical(None, "Systray", "I couldn't detect any system tray on this system.")
+ sys.exit(1)
+
+ QApplication.setQuitOnLastWindowClosed(False)
+
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/systray/rc_systray.py b/examples/widgets/desktop/systray/rc_systray.py
index 2d59adc74..9a6dec317 100644
--- a/examples/widgets/systray/rc_systray.py
+++ b/examples/widgets/desktop/systray/rc_systray.py
@@ -1,9 +1,9 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.15.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00d\xb4\
@@ -1620,164 +1620,6 @@ U\xa0\xef\xf5r\x00\x00@z\x1f\x8c}\xa3\xa8\x7f\xa3\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x0e\xf2\x0b@\
;\x84\xc7\x9dY\x0c\xd3\x00\x00\x00\x00IEND\xae\
B`\x82\
-\x00\x00\x09\xc0\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x9c\x00\x00\x00\xb2\x08\x03\x00\x00\x00\x80\xc0V9\
-\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
-\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\
-\x9bx\x00\x00\x00\x07tIME\x07\xdc\x03\x09\x08\x1d\
-0D&N\xa6\x00\x00\x02\xd3PLTE\x00\x00\x00\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x02\x01\x00\x03\x02\
-\x00\x04\x02\x00\x05\x03\x00\x06\x03\x00\x06\x04\x00\x07\x04\x00\
-\x08\x05\x00\x09\x05\x00\x0a\x06\x00\x0b\x07\x00\x0c\x07\x00\x0d\
-\x08\x00\x0e\x08\x00\x0f\x09\x00\x10\x0a\x00\x11\x0a\x00\x12\x0b\
-\x00\x13\x0b\x00\x14\x0c\x00\x15\x0d\x00\x16\x0d\x00\x17\x0e\x00\
-\x18\x0e\x00\x19\x0f\x00\x1a\x10\x00\x1b\x10\x00\x1c\x11\x00\x1d\
-\x11\x00\x1e\x12\x00\x1f\x13\x00 \x13\x00!\x14\x00\x22\x14\
-\x00#\x15\x00$\x16\x00%\x16\x00&\x17\x00'\x17\x00\
-(\x18\x00)\x19\x00*\x19\x00+\x1a\x00,\x1a\x00-\
-\x1b\x00.\x1c\x00/\x1c\x000\x1d\x001\x1d\x002\x1e\
-\x003\x1f\x004\x1f\x005 \x006 \x007!\x00\
-8\x22\x009\x22\x00:#\x00;#\x00<$\x00=\
-%\x00>%\x00?&\x00@&\x00A'\x00B(\
-\x00C(\x00D)\x00E)\x00F*\x00G+\x00\
-I,\x00J,\x00K-\x00L.\x00M.\x00N\
-/\x00O/\x00P0\x00Q1\x00R1\x00S2\
-\x00U3\x00W4\x00X5\x00Y5\x00Z6\x00\
-[7\x00\x5c7\x00]8\x00^8\x00_9\x00`\
-:\x00a:\x00c;\x00e=\x00g>\x00h>\
-\x00i?\x00j@\x00k@\x00lA\x00mA\x00\
-nB\x00oC\x00pC\x00qD\x00sE\x00t\
-F\x00uF\x00vG\x00wG\x00yI\x00zI\
-\x00{J\x00|J\x00|K\x00}K\x00~L\x00\
-\x7fL\x00\x80M\x00\x81M\x00\x82N\x00\x83O\x00\x84\
-O\x00\x86P\x00\x87Q\x00\x88R\x00\x8aS\x00\x8bS\
-\x00\x8eU\x00\x8fV\x00\x91W\x00\x93X\x00\x94Y\x00\
-\x95Y\x00\x96Z\x00\x98[\x00\x99\x5c\x00\x9c^\x00\x9d\
-^\x00\x9e_\x00\x9f_\x00\xa0`\x00\xa1a\x00\xa2a\
-\x00\xa3b\x00\xa4b\x00\xa5c\x00\xa6d\x00\xa7d\x00\
-\xaaf\x00\xacg\x00\xadh\x00\xafi\x00\xb0j\x00\xb1\
-j\x00\xb2k\x00\xb3k\x00\xb4l\x00\xb5m\x00\xb6m\
-\x00\xb8n\x00\xbap\x00\xbbp\x00\xbcq\x00\xbdq\x00\
-\xber\x00\xbfs\x00\xc0s\x00\xc1t\x00\xc2t\x00\xc3\
-u\x00\xc5v\x00\xc7w\x00\xc8x\x00\xc9y\x00\xcay\
-\x00\xcbz\x00\xccz\x00\xce|\x00\xcf|\x00\xd0}\x00\
-\xd1}\x00\xd2~\x00\xd3\x7f\x00\xd4\x7f\x00\xd5\x80\x00\xd6\
-\x80\x00\xd7\x81\x00\xd8\x82\x00\xd9\x82\x00\xda\x83\x00\xdb\x83\
-\x00\xdc\x84\x00\xdd\x85\x00\xde\x85\x00\xdf\x86\x00\xe0\x86\x00\
-\xe1\x87\x00\xe2\x88\x00\xe3\x88\x00\xe4\x89\x00\xe5\x89\x00\xe6\
-\x8a\x00\xe7\x8b\x00\xe8\x8b\x00\xe9\x8c\x00\xea\x8c\x00\xeb\x8d\
-\x00\xec\x8e\x00\xed\x8e\x00\xee\x8f\x00\xef\x8f\x00\xf0\x90\x00\
-\xf1\x91\x00\xf2\x91\x00\xf3\x92\x00\xf4\x92\x00\xf5\x93\x00\xf6\
-\x94\x00\xf7\x94\x00\xf8\x95\x00\xf9\x95\x00\xfa\x96\x00\xfb\x97\
-\x00\xfc\x97\x00\xfd\x98\x00\xfe\x98\x00\xff\x99\x00\xff\xff\xff\
-s\xb6\xc7\xfa\x00\x00\x00\x08tRNS\x00\x09\x0e\x1b\
-(=\x5cr\xeeu#\xcb\x00\x00\x00\x01bKGD\
-\xf05\xb8\xefT\x00\x00\x06RIDATx\xda\xed\
-\x9c\xf9_\x94U\x14\xc6\xad\xacf\x18mTP\xc0\x04\
-\xc4\x85E\x05\xc1\x0d\xc9P\xd1\xc8\x5cZ\x15\xb5\xc5$\
-\xca4\xcb4\xcbJ\xcd\xca\xd2\xd4RJ\xcd\xca4\xb2\
-\x12\xcd\xcaL\xb1 \x90\x08DS@\xf6M\xf6\x01F\
-\x99a\xe6\x9d\x7f!\xd6\x98\xe5]\xeer\xee0\x9f\xbc\
-\xcf\xcf\x9c\xf7~\x99y\xdf\xf7\x9e\xf3\x9cs\xa7_?\
-...........W\xd5\x1dw\xbb\
-\x88\xfa\x8b\xc0\xdd\xa9r\x11\xdd\xc5\xe1n)\xb8dc\
-\x9f\xaa@\x16.\xc5\xd2\xa7*\xe3p\x1c\x8e\xc3\xc1\xc1\
-\x99]\x18\xae0\xe4G\xe2\xa5u\x8c\xe1\xcaBT\xda\
-S\x84lY\xbe;\x98\xc2U\x84\xb6\xff\xcd\x903D\
-l\x17\x86\xabT\x9b\x19\xc2U\x85un~\xee\xbf\x11\
-\xb0\xa5{w\x84\xbe\xcd\x0c\xae6\xa2{kv?\x8b\
-\xcd\x96\xe6\xdd\x15\xbaI`\x03W\x17\xf9_\xe2\xe0~\
-\x0e\x93\xedO\xaf\x9e\xd0\x97\x05\x16pM\xd1Vi\x8d\
-\xc7y,\xb6T\xaf\xde\xd0\x97\xcc\xf0p\xcdsm\x92\
-.\xcfT\x0c\xb6d\x0f\xeb\xd0\xb86h\xb8\x96\x18\xbb\
-\x94\xd0+\x0d\x99\xed\x9c\x87m\xe8\xb3m\xb0p7\x1f\
-qHX\xbd\xd2\x11\xd9\xcez\xd8\x87>c\x84\x84k\
-}L$\x9d\xf6\xbe\x80\xc4v\xc6\xdd1tI+\x1c\
-\x9cq\xb9h\xb2\xef\x9d\x81\xc0\xf6\xab\xbbX\xe8\xe37\
-\xa1\xe0\xda\x9e\x96(E|\xb2\x15\xd9N\x0f\x11\x0f}\
-\xf4\x06\x0c\x9c\xf9y\xc9B\xc9\xf7\xa2\x02\xdb\xc9AR\
-\xa1\xf3\x9a \xe0\xcc/\xca\x94q~9\xb2l'\xb4\
-\xd2\xa11:z8a\x8dl\x91\xe9wI\x86-I\
-+\x17\x1aUG\x0d\xf7\x9aB\x09<\xf2\xb2$\xdbq\
-\xad|\xe8\x8cZJ\xb87\x14\x0bt\xff\x7f$\xd8~\
-\x18\xa8\x14\x1aYM\x05\xf7\x1e\x82}06_\x94-\
-Q\xa3\x1c:\xa9\x9c\x02n'\x92\xb9\x11pM\x84\xed\
-\x1b\x0dJhX\x191\xdc.D\xeb%\xb0\xc0\x81\xed\
-\x88\x06-4\xb8\x80\x10\xeecdc(\xb0\xd0\x8e\xed\
-k\x0djhP>\x11\xdc~5\xbam\x15Td\xc3\
-vX\x83\x1e\x1a\x90G\x00w\x10\x83M\xa5\x0a\xb5\xbe\
-y\xbet\xc3\x09\xf5\xcf\xc1\x86;\x8a\xb5@;]9\
-\xd1G\xde\xf9\x22\xcf\xc6\x84K\xd4\xa805\xb1\xa2;\
-\xf435n\xa8\xef\xdfxp\xcb\xf0\xed\xd2\xc8:\x82\
-\xef\xb4{\x9f\xc5\x833.\xc5_\x22\xbc\xb2=0A\
-\x8d\x1f\x18Q\x8dy\xcf\x19b\x09\x16\xa9\xb1\xec#`\
-\x8b\xaa\xc7~Z\x0dK\xf0\x97\x99\xfe.\x81{>\xb3\
-\x9e\xe0=gX\xec\x14g\x7fV\x03\xd1\x0eqc\x91\
-\x13\xd8f7\x12\xee\xad\xfa\x85\xcc\xd9\xa2\x1b\x89\xb3\x12\
-\xfd\x02\xc6l\x0f\xb5P\xe4s\xfa\xf9L\xd9\xe6\xb7P\
-e\xc2-\xf3\x18\xb2-l\xa1\xac!t\xd1\xcc\xd8\x16\
-\xe9\xa9K\xc3\xc6Y\x8c\xd8\x1e\xd6\x03\x14\xd5\x8d3\x99\
-\xb0\x89\xf9%\x04vDC\x14\x03\xb6\xd8V #\xa7\
-\xe1~p\xb6\xa5\x060\x0b\xacf\x1a0\xdbr\x03\xa0\
-yX=\x15\x94\xedI\x03\xa8\xedz}\x0a \xdbS\
-\xa0\xcef\x07\xddd0\xb6\xe7L\xe0V\x7f\xd5$ \
-\xb6x\x13\x83&Ie8\x08\xdb\x0b&&\xed\xa5\xd2\
-\x09\x00l\xabL\x8c\x1as%\xe3\xa9\xd9V\x9b\x99\xb5\
-4\x8b\xc7Q\xb2\xad\x13\x186\x83\x8b\x83\xa9\xd8^\x15\
-\x98\xb6\xd1\xf3\xc6P\xb0m\x10\x18\x0f \xe4\x92\xd3m\
-Tb\xa3\x1f\xdd\xc8\x1dM\xc8\xf6\xba\x22\x1b\xc0\x5c\xc9\
-\xd5QDl[\x9d3\xf4\xf2\xd7=\x04l\xdb\x9c3\
-\x91\xd3\xfc \xc9\x07\xb7\xc9)pM1d\xb7\xdc\x9b\
-N\x80kz\x80\xf4a\xdd\xce\x1cN7\x97\xfc5\xf7\
-!c\xb8z\xaaZg'S\xb8:\xcaJ\xe7#\x86\
-p\xb53h\x93\x92]\xec\xc6\x85\xee\xa3O\xe7\xf60\
-\x82\xab\x89\x04\xc85\xd5\x09L\xe0\xaa\xa7\x83d\xe9\xea\
-O\x19\xc0U@\xd57\xea\xfd\xe0p\x15\xe1*(\xa9\
-\x0f\x00\xc3\x95\x87\x01\xd6\xd4\xea\x83\xa0pe\x13A\xdd\
-\x08\xb7\xc3\x80p\xa5\xa1\xc0>\x8e\xdb\x110\xb8\xc2`\
-\x15\xb44G\x81\xe0\x0a\x82\x18x\x87\x9aD\x10\xb8k\
-\x81L\x5cW\xcd\xb7\x00p\xf9l\xd8\xda\xe9\x8eQ\xc3\
-\xe5\x050s\xfa\x07&Q\xc2\xe5\x8ee\xd8#\xd1\x9e\
-\xa0\x82\xbb\xe4\xcf\xb4\xbb\xa4=I\x01\x973\x92q_\
-\xce~\x08\x1f\x03\xee\xa2\x1f\xf3\x8e\xe6\xa0\x9f\x08\xe1\xb2\
-\xd9\xb3\xd9\x1f\x11@\x86\xcb\xf2\xc5_j0\xfe\xf8\x81\
-\xcd\x10>*\x5c\xc7\xf1\x05\x5cy\xa6\x10\x0cnX\x0f\
-\xe1#\xc2\xa5{\xe3\xb3\x0d\xcf\xb0X\xf6\xe1\x87y$\
-c\xc2\xa5\x11\xb0\xdd\xdb9\xd3\xbc\x97\x80\xee<\x1e\xdc\
-\x1a\x92\xef\xb4+t;~\xe8\x846,8\xd3j\xdc\
-\x05Fd\xf6\xfc\xfb\x9f`\x87fa\xdes\xc2z\xbc\
-\x05|2{o\xeb\x0f0o\x87L\xec\xa7U\xd8\x88\
-\xb3\x80\xbf\xcd\xb4\xf0\xfb8\xa1\xc3RI^\xc2\xef\xa0\
-/0\xcanVx\x1bz\xe8\xd0\x14\xb2\xed\x0b\xf9\xd6\
-\x1e}\xc5>\xbd\xd8\x8a\xfc\xa4\xfeA\xba\xf1\xef!e\
-\xb3X\xb6 n)\xa7\xc9S&\xa4a\xdc1W\xc5\
-\xca\x81\xcdH\xfb\xfe/4\xc9\xe6\x01\xe5\xed(\xb8P\
-\xb4\x90\x126 \xe4\xc2\xc7\xe9\xd2\xf4\xcf\x95&0\xc7\
-\x15I\x14\xc8\xca/\xa3\x01\xdf\xd3\x168_\xc8\xd3\x8d\
-/\x964>\x84u\xd8\x955vixl\x80\xdc\xc6\
-S,ch\x09\xaf\xc8\xb2}\x05QT\x7f'}\xae\
-!\xa4D\xd6\xa8\x14\xd6\xca\xb89\x87`\xec\x88S\x83\
-%\x16\x08-U0\xa0\xcd\xab$\xe1\x12\xa0\x8c\x9c\x9f\
-\xc5\xcfGM\xaeTl,H\x9e|\xda\x0bg\x81%\
-\x0f\x15\xb9\xfe\x94*\x84\x86\x91)^\x94m\x07\xa4y\
-\xf8\xfb0\x87\xebO\xbd\x8et\x9a\xcf\x14\x87\xd1B$\
-\xb4]S<\xed\xae?\x0d\x8d\xad\x9dn\xa5\x03\xdb\x16\
-h\xc3:c\x84\xcd\xf5#\xaa\x91O\x90\x9aV\xd8\xb1\
-\xbd\x05o\xf5g\xfaX]\xdfjd[Y\xc6e\xa8\
-\xe3\x1b\xe4M\x92\xcb\xbd\xeds\xeb\x91m\x04\x19\xac\x8f\
-\x08\xac\x15\x98\xb4\x97\xae\xf4\x0cF\xcc\xc6c\xb39\x22\
-\x10of\xd4\x98+\xec\x1a\xc8\xb1\x1d\xd9F\xa3\xeb\x19\
-\xc2\x8f31ki\x16u\x8cZ\xcd\xd1Y\xf0\xd5\xfa\
-D'\xdb\x0a\x13\xc3fpI\xa8\xc3\xc86\xa2:\x8f\
-\x08\xc4\x1a\x99\xb6\xd1\x8bW6Z\xc8\xa4_\xa0Zl\
-`?WB(\xdd\xfaf\x8b\xcb\xc29g\x22\x87\xc3\
-q8\x0e\xe7\x02p\xbb\x93\xfaT\x87d\xe1\x5cA\x1c\
-\xee\x96\x81\xbb\xad\xbf\x8b\xe8v\xfe\x83\xac\x5c\x5c\x5c\x5c\
-\x5c\x5c\x5c\x5c\x5c\x5c\x5c\xffC\xfd\x0b\x99\xa5\x5c~G\
-q`B\x00\x00\x00\x00IEND\xaeB`\x82\
\x00\x00/`\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -2538,6 +2380,164 @@ j:\xe6\xb9\xfe\x83\xfe\x9f\x1f\xab\xfd\xdf\xfb\xe9\xbf\xa3\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x8c\xe0\xff\x01/\x9b\xa0\xe9\xec\
0\x8e\x92\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x09\xc0\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x9c\x00\x00\x00\xb2\x08\x03\x00\x00\x00\x80\xc0V9\
+\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\
+\x09pHYs\x00\x00\x0d\xd7\x00\x00\x0d\xd7\x01B(\
+\x9bx\x00\x00\x00\x07tIME\x07\xdc\x03\x09\x08\x1d\
+0D&N\xa6\x00\x00\x02\xd3PLTE\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x01\x01\x00\x02\x01\x00\x03\x02\
+\x00\x04\x02\x00\x05\x03\x00\x06\x03\x00\x06\x04\x00\x07\x04\x00\
+\x08\x05\x00\x09\x05\x00\x0a\x06\x00\x0b\x07\x00\x0c\x07\x00\x0d\
+\x08\x00\x0e\x08\x00\x0f\x09\x00\x10\x0a\x00\x11\x0a\x00\x12\x0b\
+\x00\x13\x0b\x00\x14\x0c\x00\x15\x0d\x00\x16\x0d\x00\x17\x0e\x00\
+\x18\x0e\x00\x19\x0f\x00\x1a\x10\x00\x1b\x10\x00\x1c\x11\x00\x1d\
+\x11\x00\x1e\x12\x00\x1f\x13\x00 \x13\x00!\x14\x00\x22\x14\
+\x00#\x15\x00$\x16\x00%\x16\x00&\x17\x00'\x17\x00\
+(\x18\x00)\x19\x00*\x19\x00+\x1a\x00,\x1a\x00-\
+\x1b\x00.\x1c\x00/\x1c\x000\x1d\x001\x1d\x002\x1e\
+\x003\x1f\x004\x1f\x005 \x006 \x007!\x00\
+8\x22\x009\x22\x00:#\x00;#\x00<$\x00=\
+%\x00>%\x00?&\x00@&\x00A'\x00B(\
+\x00C(\x00D)\x00E)\x00F*\x00G+\x00\
+I,\x00J,\x00K-\x00L.\x00M.\x00N\
+/\x00O/\x00P0\x00Q1\x00R1\x00S2\
+\x00U3\x00W4\x00X5\x00Y5\x00Z6\x00\
+[7\x00\x5c7\x00]8\x00^8\x00_9\x00`\
+:\x00a:\x00c;\x00e=\x00g>\x00h>\
+\x00i?\x00j@\x00k@\x00lA\x00mA\x00\
+nB\x00oC\x00pC\x00qD\x00sE\x00t\
+F\x00uF\x00vG\x00wG\x00yI\x00zI\
+\x00{J\x00|J\x00|K\x00}K\x00~L\x00\
+\x7fL\x00\x80M\x00\x81M\x00\x82N\x00\x83O\x00\x84\
+O\x00\x86P\x00\x87Q\x00\x88R\x00\x8aS\x00\x8bS\
+\x00\x8eU\x00\x8fV\x00\x91W\x00\x93X\x00\x94Y\x00\
+\x95Y\x00\x96Z\x00\x98[\x00\x99\x5c\x00\x9c^\x00\x9d\
+^\x00\x9e_\x00\x9f_\x00\xa0`\x00\xa1a\x00\xa2a\
+\x00\xa3b\x00\xa4b\x00\xa5c\x00\xa6d\x00\xa7d\x00\
+\xaaf\x00\xacg\x00\xadh\x00\xafi\x00\xb0j\x00\xb1\
+j\x00\xb2k\x00\xb3k\x00\xb4l\x00\xb5m\x00\xb6m\
+\x00\xb8n\x00\xbap\x00\xbbp\x00\xbcq\x00\xbdq\x00\
+\xber\x00\xbfs\x00\xc0s\x00\xc1t\x00\xc2t\x00\xc3\
+u\x00\xc5v\x00\xc7w\x00\xc8x\x00\xc9y\x00\xcay\
+\x00\xcbz\x00\xccz\x00\xce|\x00\xcf|\x00\xd0}\x00\
+\xd1}\x00\xd2~\x00\xd3\x7f\x00\xd4\x7f\x00\xd5\x80\x00\xd6\
+\x80\x00\xd7\x81\x00\xd8\x82\x00\xd9\x82\x00\xda\x83\x00\xdb\x83\
+\x00\xdc\x84\x00\xdd\x85\x00\xde\x85\x00\xdf\x86\x00\xe0\x86\x00\
+\xe1\x87\x00\xe2\x88\x00\xe3\x88\x00\xe4\x89\x00\xe5\x89\x00\xe6\
+\x8a\x00\xe7\x8b\x00\xe8\x8b\x00\xe9\x8c\x00\xea\x8c\x00\xeb\x8d\
+\x00\xec\x8e\x00\xed\x8e\x00\xee\x8f\x00\xef\x8f\x00\xf0\x90\x00\
+\xf1\x91\x00\xf2\x91\x00\xf3\x92\x00\xf4\x92\x00\xf5\x93\x00\xf6\
+\x94\x00\xf7\x94\x00\xf8\x95\x00\xf9\x95\x00\xfa\x96\x00\xfb\x97\
+\x00\xfc\x97\x00\xfd\x98\x00\xfe\x98\x00\xff\x99\x00\xff\xff\xff\
+s\xb6\xc7\xfa\x00\x00\x00\x08tRNS\x00\x09\x0e\x1b\
+(=\x5cr\xeeu#\xcb\x00\x00\x00\x01bKGD\
+\xf05\xb8\xefT\x00\x00\x06RIDATx\xda\xed\
+\x9c\xf9_\x94U\x14\xc6\xad\xacf\x18mTP\xc0\x04\
+\xc4\x85E\x05\xc1\x0d\xc9P\xd1\xc8\x5cZ\x15\xb5\xc5$\
+\xca4\xcb4\xcbJ\xcd\xca\xd2\xd4RJ\xcd\xca4\xb2\
+\x12\xcd\xcaL\xb1 \x90\x08DS@\xf6M\xf6\x01F\
+\x99a\xe6\x9d\x7f!\xd6\x98\xe5]\xeer\xee0\x9f\xbc\
+\xcf\xcf\x9c\xf7~\x99y\xdf\xf7\x9e\xf3\x9cs\xa7_?\
+...........W\xd5\x1dw\xbb\
+\x88\xfa\x8b\xc0\xdd\xa9r\x11\xdd\xc5\xe1n)\xb8dc\
+\x9f\xaa@\x16.\xc5\xd2\xa7*\xe3p\x1c\x8e\xc3\xc1\xc1\
+\x99]\x18\xae0\xe4G\xe2\xa5u\x8c\xe1\xcaBT\xda\
+S\x84lY\xbe;\x98\xc2U\x84\xb6\xff\xcd\x903D\
+l\x17\x86\xabT\x9b\x19\xc2U\x85un~\xee\xbf\x11\
+\xb0\xa5{w\x84\xbe\xcd\x0c\xae6\xa2{kv?\x8b\
+\xcd\x96\xe6\xdd\x15\xbaI`\x03W\x17\xf9_\xe2\xe0~\
+\x0e\x93\xedO\xaf\x9e\xd0\x97\x05\x16pM\xd1Vi\x8d\
+\xc7y,\xb6T\xaf\xde\xd0\x97\xcc\xf0p\xcdsm\x92\
+.\xcfT\x0c\xb6d\x0f\xeb\xd0\xb86h\xb8\x96\x18\xbb\
+\x94\xd0+\x0d\x99\xed\x9c\x87m\xe8\xb3m\xb0p7\x1f\
+qHX\xbd\xd2\x11\xd9\xcez\xd8\x87>c\x84\x84k\
+}L$\x9d\xf6\xbe\x80\xc4v\xc6\xdd1tI+\x1c\
+\x9cq\xb9h\xb2\xef\x9d\x81\xc0\xf6\xab\xbbX\xe8\xe37\
+\xa1\xe0\xda\x9e\x96(E|\xb2\x15\xd9N\x0f\x11\x0f}\
+\xf4\x06\x0c\x9c\xf9y\xc9B\xc9\xf7\xa2\x02\xdb\xc9AR\
+\xa1\xf3\x9a \xe0\xcc/\xca\x94q~9\xb2l'\xb4\
+\xd2\xa11:z8a\x8dl\x91\xe9wI\x86-I\
++\x17\x1aUG\x0d\xf7\x9aB\x09<\xf2\xb2$\xdbq\
+\xad|\xe8\x8cZJ\xb87\x14\x0bt\xff\x7f$\xd8~\
+\x18\xa8\x14\x1aYM\x05\xf7\x1e\x82}06_\x94-\
+Q\xa3\x1c:\xa9\x9c\x02n'\x92\xb9\x11pM\x84\xed\
+\x1b\x0dJhX\x191\xdc.D\xeb%\xb0\xc0\x81\xed\
+\x88\x06-4\xb8\x80\x10\xeecdc(\xb0\xd0\x8e\xed\
+k\x0djhP>\x11\xdc~5\xbam\x15Td\xc3\
+vX\x83\x1e\x1a\x90G\x00w\x10\x83M\xa5\x0a\xb5\xbe\
+y\xbet\xc3\x09\xf5\xcf\xc1\x86;\x8a\xb5@;]9\
+\xd1G\xde\xf9\x22\xcf\xc6\x84K\xd4\xa805\xb1\xa2;\
+\xf435n\xa8\xef\xdfxp\xcb\xf0\xed\xd2\xc8:\x82\
+\xef\xb4{\x9f\xc5\x833.\xc5_\x22\xbc\xb2=0A\
+\x8d\x1f\x18Q\x8dy\xcf\x19b\x09\x16\xa9\xb1\xec#`\
+\x8b\xaa\xc7~Z\x0dK\xf0\x97\x99\xfe.\x81{>\xb3\
+\x9e\xe0=gX\xec\x14g\x7fV\x03\xd1\x0eqc\x91\
+\x13\xd8f7\x12\xee\xad\xfa\x85\xcc\xd9\xa2\x1b\x89\xb3\x12\
+\xfd\x02\xc6l\x0f\xb5P\xe4s\xfa\xf9L\xd9\xe6\xb7P\
+e\xc2-\xf3\x18\xb2-l\xa1\xac!t\xd1\xcc\xd8\x16\
+\xe9\xa9K\xc3\xc6Y\x8c\xd8\x1e\xd6\x03\x14\xd5\x8d3\x99\
+\xb0\x89\xf9%\x04vDC\x14\x03\xb6\xd8V #\xa7\
+\xe1~p\xb6\xa5\x060\x0b\xacf\x1a0\xdbr\x03\xa0\
+yX=\x15\x94\xedI\x03\xa8\xedz}\x0a \xdbS\
+\xa0\xcef\x07\xddd0\xb6\xe7L\xe0V\x7f\xd5$ \
+\xb6x\x13\x83&Ie8\x08\xdb\x0b&&\xed\xa5\xd2\
+\x09\x00l\xabL\x8c\x1as%\xe3\xa9\xd9V\x9b\x99\xb5\
+4\x8b\xc7Q\xb2\xad\x13\x186\x83\x8b\x83\xa9\xd8^\x15\
+\x98\xb6\xd1\xf3\xc6P\xb0m\x10\x18\x0f \xe4\x92\xd3m\
+Tb\xa3\x1f\xdd\xc8\x1dM\xc8\xf6\xba\x22\x1b\xc0\x5c\xc9\
+\xd5QDl[\x9d3\xf4\xf2\xd7=\x04l\xdb\x9c3\
+\x91\xd3\xfc \xc9\x07\xb7\xc9)pM1d\xb7\xdc\x9b\
+N\x80kz\x80\xf4a\xdd\xce\x1cN7\x97\xfc5\xf7\
+!c\xb8z\xaaZg'S\xb8:\xcaJ\xe7#\x86\
+p\xb53h\x93\x92]\xec\xc6\x85\xee\xa3O\xe7\xf60\
+\x82\xab\x89\x04\xc85\xd5\x09L\xe0\xaa\xa7\x83d\xe9\xea\
+O\x19\xc0U@\xd57\xea\xfd\xe0p\x15\xe1*(\xa9\
+\x0f\x00\xc3\x95\x87\x01\xd6\xd4\xea\x83\xa0pe\x13A\xdd\
+\x08\xb7\xc3\x80p\xa5\xa1\xc0>\x8e\xdb\x110\xb8\xc2`\
+\x15\xb44G\x81\xe0\x0a\x82\x18x\x87\x9aD\x10\xb8k\
+\x81L\x5cW\xcd\xb7\x00p\xf9l\xd8\xda\xe9\x8eQ\xc3\
+\xe5\x050s\xfa\x07&Q\xc2\xe5\x8ee\xd8#\xd1\x9e\
+\xa0\x82\xbb\xe4\xcf\xb4\xbb\xa4=I\x01\x973\x92q_\
+\xce~\x08\x1f\x03\xee\xa2\x1f\xf3\x8e\xe6\xa0\x9f\x08\xe1\xb2\
+\xd9\xb3\xd9\x1f\x11@\x86\xcb\xf2\xc5_j0\xfe\xf8\x81\
+\xcd\x10>*\x5c\xc7\xf1\x05\x5cy\xa6\x10\x0cnX\x0f\
+\xe1#\xc2\xa5{\xe3\xb3\x0d\xcf\xb0X\xf6\xe1\x87y$\
+c\xc2\xa5\x11\xb0\xdd\xdb9\xd3\xbc\x97\x80\xee<\x1e\xdc\
+\x1a\x92\xef\xb4+t;~\xe8\x846,8\xd3j\xdc\
+\x05Fd\xf6\xfc\xfb\x9f`\x87fa\xdes\xc2z\xbc\
+\x05|2{o\xeb\x0f0o\x87L\xec\xa7U\xd8\x88\
+\xb3\x80\xbf\xcd\xb4\xf0\xfb8\xa1\xc3RI^\xc2\xef\xa0\
+/0\xcanVx\x1bz\xe8\xd0\x14\xb2\xed\x0b\xf9\xd6\
+\x1e}\xc5>\xbd\xd8\x8a\xfc\xa4\xfeA\xba\xf1\xef!e\
+\xb3X\xb6 n)\xa7\xc9S&\xa4a\xdc1W\xc5\
+\xca\x81\xcdH\xfb\xfe/4\xc9\xe6\x01\xe5\xed(\xb8P\
+\xb4\x90\x126 \xe4\xc2\xc7\xe9\xd2\xf4\xcf\x95&0\xc7\
+\x15I\x14\xc8\xca/\xa3\x01\xdf\xd3\x168_\xc8\xd3\x8d\
+/\x964>\x84u\xd8\x955vixl\x80\xdc\xc6\
+S,ch\x09\xaf\xc8\xb2}\x05QT\x7f'}\xae\
+!\xa4D\xd6\xa8\x14\xd6\xca\xb89\x87`\xec\x88S\x83\
+%\x16\x08-U0\xa0\xcd\xab$\xe1\x12\xa0\x8c\x9c\x9f\
+\xc5\xcfGM\xaeTl,H\x9e|\xda\x0bg\x81%\
+\x0f\x15\xb9\xfe\x94*\x84\x86\x91)^\x94m\x07\xa4y\
+\xf8\xfb0\x87\xebO\xbd\x8et\x9a\xcf\x14\x87\xd1B$\
+\xb4]S<\xed\xae?\x0d\x8d\xad\x9dn\xa5\x03\xdb\x16\
+h\xc3:c\x84\xcd\xf5#\xaa\x91O\x90\x9aV\xd8\xb1\
+\xbd\x05o\xf5g\xfaX]\xdfjd[Y\xc6e\xa8\
+\xe3\x1b\xe4M\x92\xcb\xbd\xeds\xeb\x91m\x04\x19\xac\x8f\
+\x08\xac\x15\x98\xb4\x97\xae\xf4\x0cF\xcc\xc6c\xb39\x22\
+\x10of\xd4\x98+\xec\x1a\xc8\xb1\x1d\xd9F\xa3\xeb\x19\
+\xc2\x8f31ki\x16u\x8cZ\xcd\xd1Y\xf0\xd5\xfa\
+D'\xdb\x0a\x13\xc3fpI\xa8\xc3\xc86\xa2:\x8f\
+\x08\xc4\x1a\x99\xb6\xd1\x8bW6Z\xc8\xa4_\xa0Zl\
+`?WB(\xdd\xfaf\x8b\xcb\xc29g\x22\x87\xc3\
+q8\x0e\xe7\x02p\xbb\x93\xfaT\x87d\xe1\x5cA\x1c\
+\xee\x96\x81\xbb\xad\xbf\x8b\xe8v\xfe\x83\xac\x5c\x5c\x5c\x5c\
+\x5c\x5c\x5c\x5c\x5c\x5c\x5c\xffC\xfd\x0b\x99\xa5\x5c~G\
+q`B\x00\x00\x00\x00IEND\xaeB`\x82\
"
qt_resource_name = b"\
@@ -2549,14 +2549,14 @@ qt_resource_name = b"\
\x08\x97\x8a'\
\x00h\
\x00e\x00a\x00r\x00t\x00.\x00p\x00n\x00g\
-\x00\x07\
-\x08wW\x87\
-\x00b\
-\x00a\x00d\x00.\x00p\x00n\x00g\
\x00\x09\
\x08\x9b\xa0G\
\x00t\
\x00r\x00a\x00s\x00h\x00.\x00p\x00n\x00g\
+\x00\x07\
+\x08wW\x87\
+\x00b\
+\x00a\x00d\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -2564,12 +2564,12 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00*\x00\x00\x00\x00\x00\x01\x00\x00d\xb8\
-\x00\x00\x01r\x0e\xc2\x8cT\
+\x00\x00\x00B\x00\x00\x00\x00\x00\x01\x00\x00\x94\x1c\
+\x00\x00\x01z\xe7\xee'\x0d\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01r\x0e\xc2\x8cW\
-\x00\x00\x00>\x00\x00\x00\x00\x00\x01\x00\x00n|\
-\x00\x00\x01r\x0e\xc2\x8cW\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00*\x00\x00\x00\x00\x00\x01\x00\x00d\xb8\
+\x00\x00\x01z\xe7\xee'\x0d\
"
def qInitResources():
diff --git a/examples/widgets/systray/systray.pyproject b/examples/widgets/desktop/systray/systray.pyproject
index eadfb0d7a..eadfb0d7a 100644
--- a/examples/widgets/systray/systray.pyproject
+++ b/examples/widgets/desktop/systray/systray.pyproject
diff --git a/examples/widgets/systray/systray.qrc b/examples/widgets/desktop/systray/systray.qrc
index a8b653584..a8b653584 100644
--- a/examples/widgets/systray/systray.qrc
+++ b/examples/widgets/desktop/systray/systray.qrc
diff --git a/examples/widgets/desktop/systray/window.py b/examples/widgets/desktop/systray/window.py
new file mode 100644
index 000000000..0b5bc39dc
--- /dev/null
+++ b/examples/widgets/desktop/systray/window.py
@@ -0,0 +1,236 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import Slot
+from PySide6.QtGui import QAction, QIcon
+from PySide6.QtWidgets import (QCheckBox, QComboBox, QDialog,
+ QGridLayout, QGroupBox, QHBoxLayout, QLabel,
+ QLineEdit, QMenu, QMessageBox, QPushButton,
+ QSpinBox, QStyle, QSystemTrayIcon, QTextEdit,
+ QVBoxLayout)
+
+import rc_systray # noqa: F401
+
+
+class Window(QDialog):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._icon_group_box = QGroupBox()
+ self._icon_label = QLabel()
+ self._icon_combo_box = QComboBox()
+ self._show_icon_check_box = QCheckBox()
+
+ self._message_group_box = QGroupBox()
+ self._type_label = QLabel()
+ self._duration_label = QLabel()
+ self._duration_warning_label = QLabel()
+ self._title_label = QLabel()
+ self._body_label = QLabel()
+
+ self._type_combo_box = QComboBox()
+ self._duration_spin_box = QSpinBox()
+ self._title_edit = QLineEdit()
+ self._body_edit = QTextEdit()
+ self._show_message_button = QPushButton()
+
+ self._minimize_action = QAction()
+ self._maximize_action = QAction()
+ self._restore_action = QAction()
+ self._quit_action = QAction()
+
+ self._tray_icon = QSystemTrayIcon()
+ self._tray_icon_menu = QMenu()
+
+ self.create_icon_group_box()
+ self.create_message_group_box()
+
+ self._icon_label.setMinimumWidth(self._duration_label.sizeHint().width())
+
+ self.create_actions()
+ self.create_tray_icon()
+
+ self._show_message_button.clicked.connect(self.show_message)
+ self._show_icon_check_box.toggled.connect(self._tray_icon.setVisible)
+ self._icon_combo_box.currentIndexChanged.connect(self.set_icon)
+ self._tray_icon.messageClicked.connect(self.message_clicked)
+ self._tray_icon.activated.connect(self.icon_activated)
+
+ self._main_layout = QVBoxLayout()
+ self._main_layout.addWidget(self._icon_group_box)
+ self._main_layout.addWidget(self._message_group_box)
+ self.setLayout(self._main_layout)
+
+ self._icon_combo_box.setCurrentIndex(1)
+ self._tray_icon.show()
+
+ self.setWindowTitle("Systray")
+ self.resize(400, 300)
+
+ def setVisible(self, visible):
+ self._minimize_action.setEnabled(visible)
+ self._maximize_action.setEnabled(not self.isMaximized())
+ self._restore_action.setEnabled(self.isMaximized() or not visible)
+ super().setVisible(visible)
+
+ def closeEvent(self, event):
+ if not event.spontaneous() or not self.isVisible():
+ return
+ if self._tray_icon.isVisible():
+ QMessageBox.information(self, "Systray",
+ "The program will keep running in the system tray. "
+ "To terminate the program, choose <b>Quit</b> in the context "
+ "menu of the system tray entry.")
+ self.hide()
+ event.ignore()
+
+ @Slot(int)
+ def set_icon(self, index):
+ icon = self._icon_combo_box.itemIcon(index)
+ self._tray_icon.setIcon(icon)
+ self.setWindowIcon(icon)
+ self._tray_icon.setToolTip(self._icon_combo_box.itemText(index))
+
+ @Slot(str)
+ def icon_activated(self, reason):
+ if reason == QSystemTrayIcon.Trigger:
+ pass
+ if reason == QSystemTrayIcon.DoubleClick:
+ self._icon_combo_box.setCurrentIndex(
+ (self._icon_combo_box.currentIndex() + 1) % self._icon_combo_box.count()
+ )
+ if reason == QSystemTrayIcon.MiddleClick:
+ self.show_message()
+
+ @Slot()
+ def show_message(self):
+ self._show_icon_check_box.setChecked(True)
+ selected_icon = self._type_combo_box.itemData(self._type_combo_box.currentIndex())
+ msg_icon = QSystemTrayIcon.MessageIcon(selected_icon)
+
+ if selected_icon == -1: # custom icon
+ icon = QIcon(self._icon_combo_box.itemIcon(self._icon_combo_box.currentIndex()))
+ self._tray_icon.showMessage(
+ self._title_edit.text(),
+ self._body_edit.toPlainText(),
+ icon,
+ self._duration_spin_box.value() * 1000,
+ )
+ else:
+ self._tray_icon.showMessage(
+ self._title_edit.text(),
+ self._body_edit.toPlainText(),
+ msg_icon,
+ self._duration_spin_box.value() * 1000,
+ )
+
+ @Slot()
+ def message_clicked(self):
+ QMessageBox.information(None, "Systray",
+ "Sorry, I already gave what help I could.\n"
+ "Maybe you should try asking a human?")
+
+ def create_icon_group_box(self):
+ self._icon_group_box = QGroupBox("Tray Icon")
+
+ self._icon_label = QLabel("Icon:")
+
+ self._icon_combo_box = QComboBox()
+ self._icon_combo_box.addItem(QIcon(":/images/bad.png"), "Bad")
+ self._icon_combo_box.addItem(QIcon(":/images/heart.png"), "Heart")
+ self._icon_combo_box.addItem(QIcon(":/images/trash.png"), "Trash")
+
+ self._show_icon_check_box = QCheckBox("Show icon")
+ self._show_icon_check_box.setChecked(True)
+
+ icon_layout = QHBoxLayout()
+ icon_layout.addWidget(self._icon_label)
+ icon_layout.addWidget(self._icon_combo_box)
+ icon_layout.addStretch()
+ icon_layout.addWidget(self._show_icon_check_box)
+ self._icon_group_box.setLayout(icon_layout)
+
+ def create_message_group_box(self):
+ self._message_group_box = QGroupBox("Balloon Message")
+
+ self._type_label = QLabel("Type:")
+
+ self._type_combo_box = QComboBox()
+ self._type_combo_box.addItem("None", QSystemTrayIcon.NoIcon)
+ self._type_combo_box.addItem(
+ self.style().standardIcon(QStyle.SP_MessageBoxInformation),
+ "Information",
+ QSystemTrayIcon.Information,
+ )
+ self._type_combo_box.addItem(
+ self.style().standardIcon(QStyle.SP_MessageBoxWarning),
+ "Warning",
+ QSystemTrayIcon.Warning,
+ )
+ self._type_combo_box.addItem(
+ self.style().standardIcon(QStyle.SP_MessageBoxCritical),
+ "Critical",
+ QSystemTrayIcon.Critical,
+ )
+ self._type_combo_box.addItem(QIcon(), "Custom icon", -1)
+ self._type_combo_box.setCurrentIndex(1)
+
+ self._duration_label = QLabel("Duration:")
+
+ self._duration_spin_box = QSpinBox()
+ self._duration_spin_box.setRange(5, 60)
+ self._duration_spin_box.setSuffix(" s")
+ self._duration_spin_box.setValue(15)
+
+ self._duration_warning_label = QLabel("(some systems might ignore this hint)")
+ self._duration_warning_label.setIndent(10)
+
+ self._title_label = QLabel("Title:")
+ self._title_edit = QLineEdit("Cannot connect to network")
+ self._body_label = QLabel("Body:")
+
+ self._body_edit = QTextEdit()
+ self._body_edit.setPlainText("Don't believe me. Honestly, I don't have a clue.\n"
+ "Click this balloon for details.")
+
+ self._show_message_button = QPushButton("Show Message")
+ self._show_message_button.setDefault(True)
+
+ message_layout = QGridLayout()
+ message_layout.addWidget(self._type_label, 0, 0)
+ message_layout.addWidget(self._type_combo_box, 0, 1, 1, 2)
+ message_layout.addWidget(self._duration_label, 1, 0)
+ message_layout.addWidget(self._duration_spin_box, 1, 1)
+ message_layout.addWidget(self._duration_warning_label, 1, 2, 1, 3)
+ message_layout.addWidget(self._title_label, 2, 0)
+ message_layout.addWidget(self._title_edit, 2, 1, 1, 4)
+ message_layout.addWidget(self._body_label, 3, 0)
+ message_layout.addWidget(self._body_edit, 3, 1, 2, 4)
+ message_layout.addWidget(self._show_message_button, 5, 4)
+ message_layout.setColumnStretch(3, 1)
+ message_layout.setRowStretch(4, 1)
+ self._message_group_box.setLayout(message_layout)
+
+ def create_actions(self):
+ self._minimize_action = QAction("Minimize", self)
+ self._minimize_action.triggered.connect(self.hide)
+
+ self._maximize_action = QAction("Maximize", self)
+ self._maximize_action.triggered.connect(self.showMaximized)
+
+ self._restore_action = QAction("Restore", self)
+ self._restore_action.triggered.connect(self.showNormal)
+
+ self._quit_action = QAction("Quit", self)
+ self._quit_action.triggered.connect(qApp.quit) # noqa: F821
+
+ def create_tray_icon(self):
+ self._tray_icon_menu = QMenu(self)
+ self._tray_icon_menu.addAction(self._minimize_action)
+ self._tray_icon_menu.addAction(self._maximize_action)
+ self._tray_icon_menu.addAction(self._restore_action)
+ self._tray_icon_menu.addSeparator()
+ self._tray_icon_menu.addAction(self._quit_action)
+
+ self._tray_icon = QSystemTrayIcon(self)
+ self._tray_icon.setContextMenu(self._tray_icon_menu)
diff --git a/examples/widgets/dialogs/classwizard/classwizard.py b/examples/widgets/dialogs/classwizard/classwizard.py
index fc2feb498..0efbde69f 100644
--- a/examples/widgets/dialogs/classwizard/classwizard.py
+++ b/examples/widgets/dialogs/classwizard/classwizard.py
@@ -1,404 +1,380 @@
-# -*- coding: utf-8 -*-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from __future__ import unicode_literals
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import classwizard_rc
-
-
-class ClassWizard(QtWidgets.QWizard):
- def __init__(self, parent=None):
- super(ClassWizard, self).__init__(parent)
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
- self.addPage(IntroPage())
- self.addPage(ClassInfoPage())
- self.addPage(CodeStylePage())
- self.addPage(OutputFilesPage())
- self.addPage(ConclusionPage())
+import os
+from pathlib import Path
+import sys
- self.setPixmap(QtWidgets.QWizard.BannerPixmap,
- QtGui.QPixmap(':/images/banner.png'))
- self.setPixmap(QtWidgets.QWizard.BackgroundPixmap,
- QtGui.QPixmap(':/images/background.png'))
+from PySide6.QtCore import QDir, QFileInfo, QUrl, Slot
+from PySide6.QtGui import QDesktopServices, QPixmap
+from PySide6.QtWidgets import (QApplication, QComboBox, QCheckBox, QFormLayout,
+ QFileDialog, QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QToolButton, QVBoxLayout, QWizard,
+ QWizardPage)
- self.setWindowTitle("Class Wizard")
+from listchooser import PropertyChooser, SignalChooser
- def accept(self):
- className = self.field('className')
- baseClass = self.field('baseClass')
- macroName = self.field('macroName')
- baseInclude = self.field('baseInclude')
+import classwizard_rc # noqa: F401
- outputDir = self.field('outputDir')
- header = self.field('header')
- implementation = self.field('implementation')
- block = ''
+BASE_CLASSES = ['<None>', 'PySide6.QtCore.QObject',
+ 'PySide6.QtWidgets.QDialog', 'PySide6.QtWidgets.QMainWindow',
+ 'PySide6.QtWidgets.QWidget']
- if self.field('comment'):
- block += '/*\n'
- block += ' ' + header + '\n'
- block += '*/\n'
- block += '\n'
- if self.field('protect'):
- block += '#ifndef ' + macroName + '\n'
- block += '#define ' + macroName + '\n'
- block += '\n'
+PYTHON_TYPES = ['int', 'list', 'str']
- if self.field('includeBase'):
- block += '#include ' + baseInclude + '\n'
- block += '\n'
- block += 'class ' + className
- if baseClass:
- block += ' : public ' + baseClass
+INTRODUCTION = ("This wizard will generate a skeleton Python class definition, "
+ "including a few functions. You simply need to specify the class name and set "
+ "a few options to produce a Python file.")
- block += '\n'
- block += '{\n'
- if self.field('qobjectMacro'):
- block += ' Q_OBJECT\n'
- block += '\n'
+def property_accessors(property_type, name):
+ """Generate the property accessor functions."""
+ return (f' @Property({property_type})\n'
+ f' def {name}(self):\n'
+ f' return self._{name}\n\n'
+ f' @{name}.setter\n'
+ f' def {name}(self, value):\n'
+ f' self._{name} = value\n')
- block += 'public:\n'
- if self.field('qobjectCtor'):
- block += ' ' + className + '(QObject *parent = 0);\n'
- elif self.field('qwidgetCtor'):
- block += ' ' + className + '(QWidget *parent = 0);\n'
- elif self.field('defaultCtor'):
- block += ' ' + className + '();\n'
+def property_initialization(property_type, name):
+ """Generate the property initialization for __init__()."""
+ return f' self._{name} = {property_type}()\n'
- if self.field('copyCtor'):
- block += ' ' + className + '(const ' + className + ' &other);\n'
- block += '\n'
- block += ' ' + className + ' &operator=' + '(const ' + className + ' &other);\n'
- block += '};\n'
+def signal_initialization(signature):
+ """Generate the Signal initialization from the function signature."""
+ paren_pos = signature.find('(')
+ name = signature[:paren_pos]
+ parameters = signature[paren_pos:]
+ return f' {name} = Signal{parameters}\n'
- if self.field('protect'):
- block += '\n'
- block += '#endif\n'
- headerFile = QtCore.QFile(outputDir + '/' + header)
+class ClassWizard(QWizard):
+ def __init__(self, parent=None):
+ super().__init__(parent)
- if not headerFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
- QtWidgets.QMessageBox.warning(None, "Class Wizard",
- "Cannot write file %s:\n%s" % (headerFile.fileName(), headerFile.errorString()))
- return
+ self.addPage(IntroPage())
+ self._class_info_index = self.addPage(ClassInfoPage())
+ self._qobject_index = self.addPage(QObjectPage())
+ self._output_index = self.addPage(OutputFilesPage())
+ self.addPage(ConclusionPage())
- headerFile.write(QtCore.QByteArray(block.encode("utf-8")))
+ self.setPixmap(QWizard.BannerPixmap,
+ QPixmap(':/images/banner.png'))
+ self.setPixmap(QWizard.BackgroundPixmap,
+ QPixmap(':/images/background.png'))
- block = ''
+ self.setWindowTitle("Class Wizard")
- if self.field('comment'):
- block += '/*\n'
- block += ' ' + implementation + '\n'
- block += '*/\n'
+ def nextId(self):
+ """Overrides QWizard.nextId() to insert the property/signal
+ page in case the class is a QObject."""
+ idx = self.currentId()
+ if idx == self._class_info_index:
+ qobject = self.field('qobject')
+ return self._qobject_index if qobject else self._output_index
+ return super(ClassWizard, self).nextId()
+
+ def generate_code(self):
+ imports = [] # Classes to be imported
+ module_imports = {} # Module->class list
+
+ def add_import(class_str):
+ """Add a class to the import list or module hash depending on
+ whether it is 'class' or 'module.class'. Returns the
+ class name."""
+ dot = class_str.rfind('.')
+ if dot < 0:
+ imports.append(class_str)
+ return class_str
+ module = class_str[0:dot]
+ class_name = class_str[dot + 1:]
+ class_list = module_imports.get(module)
+ if class_list:
+ if class_name not in class_list:
+ class_list.append(class_name)
+ else:
+ module_imports[module] = [class_name]
+ return class_name
+
+ class_name = self.field('className')
+ qobject = self.field('qobject')
+ base_class = self.field('baseClass')
+ if base_class.startswith('<'): # <None>
+ base_class = ''
+ if qobject and not base_class:
+ base_class = 'PySide6.QtCore.QObject'
+
+ if base_class:
+ base_class = add_import(base_class)
+
+ signals = self.field('signals')
+ if signals:
+ add_import('PySide6.QtCore.Signal')
+
+ property_types = []
+ property_names = []
+ for p in self.field('properties'):
+ property_type, property_name = str(p).split(' ')
+ if property_type not in PYTHON_TYPES:
+ property_type = add_import(property_type)
+ property_types.append(property_type)
+ property_names.append(property_name)
+
+ if property_names:
+ add_import('PySide6.QtCore.Property')
+
+ signals = self.field('signals')
+ if signals:
+ add_import('PySide6.QtCore.Signal')
+
+ property_types = []
+ property_names = []
+ for p in self.field('properties'):
+ property_type, property_name = str(p).split(' ')
+ if property_type not in PYTHON_TYPES:
+ property_type = add_import(property_type)
+ property_types.append(property_type)
+ property_names.append(property_name)
+
+ if property_names:
+ add_import('PySide6.QtCore.Property')
+
+ # Generate imports
+ block = '# This Python file uses the following encoding: utf-8\n\n'
+ for module, class_list in module_imports.items():
+ class_list.sort()
+ class_list_str = ', '.join(class_list)
+ block += f'from {module} import {class_list_str}\n'
+ for klass in imports:
+ block += f'import {klass}\n'
+
+ # Generate class definition
+ block += f'\n\nclass {class_name}'
+ if base_class:
+ block += f'({base_class})'
+ block += ':\n'
+ description = self.field('description')
+ if description:
+ block += f' """{description}"""\n'
+
+ if signals:
block += '\n'
+ for s in signals:
+ block += signal_initialization(str(s))
+
+ # Generate __init__ function
+ block += '\n def __init__(self'
+ if qobject:
+ block += ', parent=None'
+ block += '):\n'
+
+ if base_class:
+ block += ' super().__init__('
+ if qobject:
+ block += 'parent'
+ block += ')\n'
+
+ for i, name in enumerate(property_names):
+ block += property_initialization(property_types[i], name)
+
+ if not base_class and not property_names:
+ block += ' pass\n'
- block += '#include "' + header + '"\n'
- block += '\n'
-
- if self.field('qobjectCtor'):
- block += className + '::' + className + '(QObject *parent)\n'
- block += ' : ' + baseClass + '(parent)\n'
- block += '{\n'
- block += '}\n'
- elif self.field('qwidgetCtor'):
- block += className + '::' + className + '(QWidget *parent)\n'
- block += ' : ' + baseClass + '(parent)\n'
- block += '{\n'
- block += '}\n'
- elif self.field('defaultCtor'):
- block += className + '::' + className + '()\n'
- block += '{\n'
- block += ' // missing code\n'
- block += '}\n'
-
- if self.field('copyCtor'):
- block += '\n'
- block += className + '::' + className + '(const ' + className + ' &other)\n'
- block += '{\n'
- block += ' *this = other;\n'
- block += '}\n'
- block += '\n'
- block += className + ' &' + className + '::operator=(const ' + className + ' &other)\n'
- block += '{\n'
-
- if baseClass:
- block += ' ' + baseClass + '::operator=(other);\n'
-
- block += ' // missing code\n'
- block += ' return *this;\n'
- block += '}\n'
-
- implementationFile = QtCore.QFile(outputDir + '/' + implementation)
-
- if not implementationFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
- QtWidgets.QMessageBox.warning(None, "Class Wizard",
- "Cannot write file %s:\n%s" % (implementationFile.fileName(), implementationFile.errorString()))
+ # Generate property accessors
+ for i, name in enumerate(property_names):
+ block += '\n' + property_accessors(property_types[i], name)
+
+ return block
+
+ def accept(self):
+ file_name = self.field('file')
+ output_dir = self.field('outputDir')
+ python_file = Path(output_dir) / file_name
+ name = os.fspath(python_file)
+ try:
+ python_file.write_text(self.generate_code())
+ except (OSError, PermissionError) as e:
+ reason = str(e)
+ QMessageBox.warning(None, "Class Wizard",
+ f"Cannot write file {name}:\n{reason}")
return
- implementationFile.write(QtCore.QByteArray(block.encode("utf-8")))
+ if self.field('launch'):
+ url = QUrl.fromLocalFile(QDir.fromNativeSeparators(name))
+ QDesktopServices.openUrl(url)
super(ClassWizard, self).accept()
-class IntroPage(QtWidgets.QWizardPage):
+class IntroPage(QWizardPage):
def __init__(self, parent=None):
- super(IntroPage, self).__init__(parent)
+ super().__init__(parent)
self.setTitle("Introduction")
- self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
- QtGui.QPixmap(':/images/watermark1.png'))
-
- label = QtWidgets.QLabel("This wizard will generate a skeleton C++ class "
- "definition, including a few functions. You simply need to "
- "specify the class name and set a few options to produce a "
- "header file and an implementation file for your new C++ "
- "class.")
+ self.setPixmap(QWizard.WatermarkPixmap,
+ QPixmap(':/images/watermark1.png'))
+
+ label = QLabel(INTRODUCTION)
label.setWordWrap(True)
- layout = QtWidgets.QVBoxLayout()
+ layout = QVBoxLayout(self)
layout.addWidget(label)
- self.setLayout(layout)
-class ClassInfoPage(QtWidgets.QWizardPage):
+class ClassInfoPage(QWizardPage):
def __init__(self, parent=None):
- super(ClassInfoPage, self).__init__(parent)
+ super().__init__(parent)
self.setTitle("Class Information")
self.setSubTitle("Specify basic information about the class for "
- "which you want to generate skeleton source code files.")
- self.setPixmap(QtWidgets.QWizard.LogoPixmap,
- QtGui.QPixmap(':/images/logo1.png'))
+ "which you want to generate a skeleton source code file.")
+ self.setPixmap(QWizard.LogoPixmap,
+ QPixmap(':/qt-project.org/logos/pysidelogo.png'))
- classNameLabel = QtWidgets.QLabel("&Class name:")
- classNameLineEdit = QtWidgets.QLineEdit()
- classNameLabel.setBuddy(classNameLineEdit)
+ class_name_line_edit = QLineEdit()
+ class_name_line_edit.setClearButtonEnabled(True)
- baseClassLabel = QtWidgets.QLabel("B&ase class:")
- baseClassLineEdit = QtWidgets.QLineEdit()
- baseClassLabel.setBuddy(baseClassLineEdit)
+ self._base_class_combo = QComboBox()
+ self._base_class_combo.addItems(BASE_CLASSES)
+ self._base_class_combo.setEditable(True)
- qobjectMacroCheckBox = QtWidgets.QCheckBox("Generate Q_OBJECT &macro")
+ base_class_line_edit = self._base_class_combo.lineEdit()
+ base_class_line_edit.setPlaceholderText('Module.Class')
+ self._base_class_combo.currentTextChanged.connect(self._base_class_changed)
- groupBox = QtWidgets.QGroupBox("C&onstructor")
+ description_line_edit = QLineEdit()
+ description_line_edit.setClearButtonEnabled(True)
- qobjectCtorRadioButton = QtWidgets.QRadioButton("&QObject-style constructor")
- qwidgetCtorRadioButton = QtWidgets.QRadioButton("Q&Widget-style constructor")
- defaultCtorRadioButton = QtWidgets.QRadioButton("&Default constructor")
- copyCtorCheckBox = QtWidgets.QCheckBox("&Generate copy constructor and operator=")
+ self._qobject_check_box = QCheckBox("Inherits QObject")
- defaultCtorRadioButton.setChecked(True)
+ self.registerField('className*', class_name_line_edit)
+ self.registerField('baseClass', base_class_line_edit)
+ self.registerField('description', description_line_edit)
+ self.registerField('qobject', self._qobject_check_box)
- defaultCtorRadioButton.toggled.connect(copyCtorCheckBox.setEnabled)
+ layout = QFormLayout(self)
+ layout.addRow("&Class name:", class_name_line_edit)
+ layout.addRow("B&ase class:", self._base_class_combo)
+ layout.addRow("&Description:", description_line_edit)
+ layout.addRow(self._qobject_check_box)
- self.registerField('className*', classNameLineEdit)
- self.registerField('baseClass', baseClassLineEdit)
- self.registerField('qobjectMacro', qobjectMacroCheckBox)
- self.registerField('qobjectCtor', qobjectCtorRadioButton)
- self.registerField('qwidgetCtor', qwidgetCtorRadioButton)
- self.registerField('defaultCtor', defaultCtorRadioButton)
- self.registerField('copyCtor', copyCtorCheckBox)
+ @Slot(str)
+ def _base_class_changed(self, text):
+ is_qobject = text.startswith('PySide')
+ self._qobject_check_box.setChecked(is_qobject)
- groupBoxLayout = QtWidgets.QVBoxLayout()
- groupBoxLayout.addWidget(qobjectCtorRadioButton)
- groupBoxLayout.addWidget(qwidgetCtorRadioButton)
- groupBoxLayout.addWidget(defaultCtorRadioButton)
- groupBoxLayout.addWidget(copyCtorCheckBox)
- groupBox.setLayout(groupBoxLayout)
- layout = QtWidgets.QGridLayout()
- layout.addWidget(classNameLabel, 0, 0)
- layout.addWidget(classNameLineEdit, 0, 1)
- layout.addWidget(baseClassLabel, 1, 0)
- layout.addWidget(baseClassLineEdit, 1, 1)
- layout.addWidget(qobjectMacroCheckBox, 2, 0, 1, 2)
- layout.addWidget(groupBox, 3, 0, 1, 2)
- self.setLayout(layout)
+class QObjectPage(QWizardPage):
+ """Allows for adding properties and signals to a QObject."""
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.setTitle("QObject parameters")
+ self.setSubTitle("Specify the signals, slots and properties.")
+ self.setPixmap(QWizard.LogoPixmap,
+ QPixmap(':/qt-project.org/logos/pysidelogo.png'))
+ layout = QVBoxLayout(self)
+ self._properties_chooser = PropertyChooser()
+ self.registerField('properties', self._properties_chooser, 'items')
+ layout.addWidget(self._properties_chooser)
+ self._signals_chooser = SignalChooser()
+ self.registerField('signals', self._signals_chooser, 'items')
+ layout.addWidget(self._signals_chooser)
+
+
+class OutputFilesPage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setTitle("Output Files")
+ self.setSubTitle("Specify where you want the wizard to put the "
+ "generated skeleton code.")
+ self.setPixmap(QWizard.LogoPixmap,
+ QPixmap(':/qt-project.org/logos/pysidelogo.png'))
-class CodeStylePage(QtWidgets.QWizardPage):
- def __init__(self, parent=None):
- super(CodeStylePage, self).__init__(parent)
-
- self.setTitle("Code Style Options")
- self.setSubTitle("Choose the formatting of the generated code.")
- self.setPixmap(QtWidgets.QWizard.LogoPixmap,
- QtGui.QPixmap(':/images/logo2.png'))
-
- commentCheckBox = QtWidgets.QCheckBox("&Start generated files with a "
- "comment")
- commentCheckBox.setChecked(True)
-
- protectCheckBox = QtWidgets.QCheckBox("&Protect header file against "
- "multiple inclusions")
- protectCheckBox.setChecked(True)
-
- macroNameLabel = QtWidgets.QLabel("&Macro name:")
- self.macroNameLineEdit = QtWidgets.QLineEdit()
- macroNameLabel.setBuddy(self.macroNameLineEdit)
-
- self.includeBaseCheckBox = QtWidgets.QCheckBox("&Include base class "
- "definition")
- self.baseIncludeLabel = QtWidgets.QLabel("Base class include:")
- self.baseIncludeLineEdit = QtWidgets.QLineEdit()
- self.baseIncludeLabel.setBuddy(self.baseIncludeLineEdit)
-
- protectCheckBox.toggled.connect(macroNameLabel.setEnabled)
- protectCheckBox.toggled.connect(self.macroNameLineEdit.setEnabled)
- self.includeBaseCheckBox.toggled.connect(self.baseIncludeLabel.setEnabled)
- self.includeBaseCheckBox.toggled.connect(self.baseIncludeLineEdit.setEnabled)
-
- self.registerField('comment', commentCheckBox)
- self.registerField('protect', protectCheckBox)
- self.registerField('macroName', self.macroNameLineEdit)
- self.registerField('includeBase', self.includeBaseCheckBox)
- self.registerField('baseInclude', self.baseIncludeLineEdit)
-
- layout = QtWidgets.QGridLayout()
- layout.setColumnMinimumWidth(0, 20)
- layout.addWidget(commentCheckBox, 0, 0, 1, 3)
- layout.addWidget(protectCheckBox, 1, 0, 1, 3)
- layout.addWidget(macroNameLabel, 2, 1)
- layout.addWidget(self.macroNameLineEdit, 2, 2)
- layout.addWidget(self.includeBaseCheckBox, 3, 0, 1, 3)
- layout.addWidget(self.baseIncludeLabel, 4, 1)
- layout.addWidget(self.baseIncludeLineEdit, 4, 2)
- self.setLayout(layout)
+ output_dir_label = QLabel("&Output directory:")
+ output_dir_layout = QHBoxLayout()
+ self._output_dir_line_edit = QLineEdit()
+ output_dir_layout.addWidget(self._output_dir_line_edit)
+ output_dir_label.setBuddy(self._output_dir_line_edit)
+ output_dir_button = QToolButton()
+ output_dir_button.setText('...')
+ output_dir_button.clicked.connect(self._choose_output_dir)
+ output_dir_layout.addWidget(output_dir_button)
- def initializePage(self):
- className = self.field('className')
- self.macroNameLineEdit.setText(className.upper() + "_H")
+ self._file_line_edit = QLineEdit()
- baseClass = self.field('baseClass')
- is_baseClass = bool(baseClass)
+ self.registerField('outputDir*', self._output_dir_line_edit)
+ self.registerField('file*', self._file_line_edit)
- self.includeBaseCheckBox.setChecked(is_baseClass)
- self.includeBaseCheckBox.setEnabled(is_baseClass)
- self.baseIncludeLabel.setEnabled(is_baseClass)
- self.baseIncludeLineEdit.setEnabled(is_baseClass)
+ layout = QFormLayout(self)
+ layout.addRow(output_dir_label, output_dir_layout)
+ layout.addRow("&File name:", self._file_line_edit)
- if not is_baseClass:
- self.baseIncludeLineEdit.clear()
- elif QtCore.QRegExp('Q[A-Z].*').exactMatch(baseClass):
- self.baseIncludeLineEdit.setText('<' + baseClass + '>')
- else:
- self.baseIncludeLineEdit.setText('"' + baseClass.lower() + '.h"')
+ def initializePage(self):
+ class_name = self.field('className')
+ self._file_line_edit.setText(class_name.lower() + '.py')
+ self.set_output_dir(QDir.tempPath())
+ def set_output_dir(self, directory):
+ self._output_dir_line_edit.setText(QDir.toNativeSeparators(directory))
-class OutputFilesPage(QtWidgets.QWizardPage):
- def __init__(self, parent=None):
- super(OutputFilesPage, self).__init__(parent)
+ def output_dir(self):
+ return QDir.fromNativeSeparators(self._output_dir_line_edit.text())
- self.setTitle("Output Files")
- self.setSubTitle("Specify where you want the wizard to put the "
- "generated skeleton code.")
- self.setPixmap(QtWidgets.QWizard.LogoPixmap,
- QtGui.QPixmap(':/images/logo3.png'))
-
- outputDirLabel = QtWidgets.QLabel("&Output directory:")
- self.outputDirLineEdit = QtWidgets.QLineEdit()
- outputDirLabel.setBuddy(self.outputDirLineEdit)
-
- headerLabel = QtWidgets.QLabel("&Header file name:")
- self.headerLineEdit = QtWidgets.QLineEdit()
- headerLabel.setBuddy(self.headerLineEdit)
-
- implementationLabel = QtWidgets.QLabel("&Implementation file name:")
- self.implementationLineEdit = QtWidgets.QLineEdit()
- implementationLabel.setBuddy(self.implementationLineEdit)
-
- self.registerField('outputDir*', self.outputDirLineEdit)
- self.registerField('header*', self.headerLineEdit)
- self.registerField('implementation*', self.implementationLineEdit)
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(outputDirLabel, 0, 0)
- layout.addWidget(self.outputDirLineEdit, 0, 1)
- layout.addWidget(headerLabel, 1, 0)
- layout.addWidget(self.headerLineEdit, 1, 1)
- layout.addWidget(implementationLabel, 2, 0)
- layout.addWidget(self.implementationLineEdit, 2, 1)
- self.setLayout(layout)
+ def file_name(self):
+ return f"{self.output_dir()}/{self._file_line_edit.text()}"
- def initializePage(self):
- className = self.field('className')
- self.headerLineEdit.setText(className.lower() + '.h')
- self.implementationLineEdit.setText(className.lower() + '.cpp')
- self.outputDirLineEdit.setText(QtCore.QDir.toNativeSeparators(QtCore.QDir.tempPath()))
+ def _choose_output_dir(self):
+ directory = QFileDialog.getExistingDirectory(self, "Output Directory",
+ self.output_dir())
+ if directory:
+ self.set_output_dir(directory)
+ def validatePage(self):
+ """Ensure we do not overwrite existing files."""
+ name = self.file_name()
+ if QFileInfo.exists(name):
+ question = f'{name} already exists. Would you like to overwrite it?'
+ r = QMessageBox.question(self, 'File Exists', question)
+ if r != QMessageBox.Yes:
+ return False
+ return True
-class ConclusionPage(QtWidgets.QWizardPage):
+
+class ConclusionPage(QWizardPage):
def __init__(self, parent=None):
- super(ConclusionPage, self).__init__(parent)
+ super().__init__(parent)
self.setTitle("Conclusion")
- self.setPixmap(QtWidgets.QWizard.WatermarkPixmap,
- QtGui.QPixmap(':/images/watermark2.png'))
+ self.setPixmap(QWizard.WatermarkPixmap,
+ QPixmap(':/images/watermark1.png'))
- self.label = QtWidgets.QLabel()
+ self.label = QLabel()
self.label.setWordWrap(True)
- layout = QtWidgets.QVBoxLayout()
+ self._launch_check_box = QCheckBox("Launch")
+ self.registerField('launch', self._launch_check_box)
+
+ layout = QVBoxLayout(self)
layout.addWidget(self.label)
- self.setLayout(layout)
+ layout.addWidget(self._launch_check_box)
def initializePage(self):
- finishText = self.wizard().buttonText(QtWidgets.QWizard.FinishButton)
- finishText.replace('&', '')
- self.label.setText("Click %s to generate the class skeleton." % finishText)
+ finish_text = self.wizard().buttonText(QWizard.FinishButton)
+ finish_text = finish_text.replace('&', '')
+ self.label.setText(f"Click {finish_text} to generate the class skeleton.")
+ self._launch_check_box.setChecked(True)
if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
wizard = ClassWizard()
wizard.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/dialogs/classwizard/classwizard.pyproject b/examples/widgets/dialogs/classwizard/classwizard.pyproject
index 1c1fe9998..fcc96ef28 100644
--- a/examples/widgets/dialogs/classwizard/classwizard.pyproject
+++ b/examples/widgets/dialogs/classwizard/classwizard.pyproject
@@ -1,4 +1,3 @@
{
- "files": ["classwizard.qrc", "classwizard.py", "classwizard_rc.py",
- "classwizard_rc.pyc"]
+ "files": ["classwizard.qrc", "classwizard.py", "listchooser.py"]
}
diff --git a/examples/widgets/dialogs/classwizard/classwizard.qrc b/examples/widgets/dialogs/classwizard/classwizard.qrc
index 41a5ddc7d..c5885dd75 100644
--- a/examples/widgets/dialogs/classwizard/classwizard.qrc
+++ b/examples/widgets/dialogs/classwizard/classwizard.qrc
@@ -2,10 +2,6 @@
<qresource>
<file>images/background.png</file>
<file>images/banner.png</file>
- <file>images/logo1.png</file>
- <file>images/logo2.png</file>
- <file>images/logo3.png</file>
<file>images/watermark1.png</file>
- <file>images/watermark2.png</file>
</qresource>
</RCC>
diff --git a/examples/widgets/dialogs/classwizard/classwizard_rc.py b/examples/widgets/dialogs/classwizard/classwizard_rc.py
index e79a959f1..e9feae425 100644
--- a/examples/widgets/dialogs/classwizard/classwizard_rc.py
+++ b/examples/widgets/dialogs/classwizard/classwizard_rc.py
@@ -1,3477 +1,11 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
-\x00\x00:@\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\xa8\x00\x00\x01w\x08\x03\x00\x00\x00\x06\x8a\xf0\xc8\
-\x00\x00\x02\xd9PLTE\xad\xac\xff\xc4\x90\xc4\xe2Z\
-c\xe6\xc1\xd5\xe9\x9c\xa7\xb8\xb6\xfe\xc8\xc6\xfe\xcb\xcb\xfe\
-\xbb\xbb\xff\xc0\xbe\xfe\xc3\xc3\xfe\xd2\xd2\xff\xd8\xd7\xff\xdc\
-\xdb\xfe\xb3\xb3\xfe\xe2\xe2\xfe\xb0\xae\xfe\xd0\xce\xfe\xeb\xeb\
-\xfe\xf3\xf3\xfe\xfc\xfb\xfe\xdd\x06\x08\xda\x22,\xdc\x0d\x12\
-\xb7\x8f\xd1\xe0\xde\xfe\xeaZZ\xdd\x09\x0b\xdd\x19\x1e\xfc\
-\xec\xec\xde\x00\x00\xf0\xef\xfd\xe1\x13\x13\xbf\xa1\xde\xbb\xb2\
-\xf4\xe3##\xe522\xe6::\xe6AB\xcc\xc3\xf4\
-\xe9SS\xdc\x14\x1a\xbd\x81\xbb\xecll\xedrr\xee\
-{{\xf2\x9b\x9b\xf2\xa2\xa2\xd2\x81\xa2\xf4\xac\xac\xf6\xb9\
-\xb9\xfa\xdb\xdb\xfa\xf5\xfa\xfb\xe2\xe2\xdd\x10\x15\xbd\xab\xeb\
-\xfd\xf2\xf3\xe4,,\xebcc\xf0\x8b\x8b\xf5\xcd\xd1\xd6\
-+<\xd8-;\xd8FX\xcaV{\xd9%1\xd94\
-C\xd9BR\xd9m\x83\xda\x1b%\xcau\x9e\xda1=\
-\xdaRd\xdb\x1a\x22\xdb\x85\x9d\xb2\xa9\xf5\xdc\xd3\xf5\xcc\
-i\x8d\xcc\x84\xad\xcc\x8b\xb4\xbb\xa3\xe3\xcdJi\xddP\
-^\xb7\xb0\xf7\xdf07\xcdZ{\xcd\xa1\xcd\xe2\x1a\x1a\
-\xceq\x94\xce\xc0\xef\xe4\xaa\xbd\xcf9T\xcf@[\xcf\
-\xba\xe7\xd0_~\xe8EE\xe8LL\xd0\xad\xd8\xe9o\
-t\xbe\x8a\xc3\xd1Vq\xea\xe6\xfb\xd2z\x9a\xc4\xab\xe3\
-\xd2\x89\xab\xecvx\xd2\xcb\xf7\xc5\x83\xb4\xee\x8f\x91\xef\
-\x81\x81\xf0\x84\x84\xf8\xcb\xcb\xd3D\x5c\xf1\x93\x93\xd3S\
-m\xd45I\xd4Kb\xd4i\x84\xf4\xe2\xe9\xf5\xb3\xb3\
-\xe0\x0b\x0b\xd4\xc2\xeb\xf6\xd8\xdc\xf7\xc3\xc3\xd5b{\xf9\
-\xd4\xd4\xc8\xbd\xf3\xd5\xa5\xc8\xd6'7\xbe\x9a\xd5\xd7I\
-]\xd4Zs\xca\x86\xb2\xcbt\x9b\xf8\xc5\xc5\xd69L\
-\xce\x80\xa6\xcba\x85\xcd\x9a\xc4\xdf\xa8\xc0\xd3\x9a\xbe\xcb\
-z\xa2\xe4y\x84\xd4Ng\xd5@T\xe6s|\xc4\xba\
-\xf4\xe6\xc6\xda\xe7jp\xe7\xb8\xc9\xc5f\x92\xe8^`\
-\xe8\x84\x8c\xc5s\xa1\xcd\x92\xbb\xb6\x9b\xe0\xcd\xb0\xde\xeb\
-\xad\xb7\xeb\xe2\xf4\xc5\x8a\xbb\xd7\xb5\xd8\xcd\xac\xda\xc5\xa0\
-\xd5\xed\xa3\xaa\xcd\xba\xea\xceUv\xc6\x5c\x86\xc8\x92\xc1\
-\xd9Ym\xf0\xac\xb1\xc8\xb3\xe8\xd9\x87\xa1\xf1\x9e\xa1\xc0\
-\xb6\xf4\xb9\x87\xc6\xf2\xbf\xc5\xda)5\xc2\x9b\xd3\xca\x5c\
-\x81\xf4\xe9\xf1\xd0m\x8d\xdbKZ\xd0\xa6\xd0\xcad\x8c\
-\xdc:F\xc2\xa2\xda\xde\x98\xaf\xd1\x8d\xb1\xd1\xc5\xf1\xb9\
-\xa6\xe9\xd2\xbb\xe5\xd2\x9d\xc2\xcc\xa5\xd2\xde\xb1\xcc\xd3t\
-\x92\xe1<B\xe3HN\xcb\x9d\xcb\xe4dm\xe2NV\
-\xc4{\xac\xcb\xb2\xe2\xd41D\xbf\x94\xce\xbc\x9c\xdb\xca\
-\xa8\xd8\xd5\x93\xb4\xcdEc\xc5l\x98\xb9\x8e\xce\xd0o\
-\x90\xc4\x7f\xb0\xda=L\xb7\xab\xf2\xdas\x89\xf4\xc6\xcb\
-\xcal\x93\xd8x\x92\xd4p\x8d\xc3\xb2\xec\xec\x92\x97\xec\
-\xd3\xe3\xf6\xde\xe3\xc5\x88\xba\xd1\x86\xa9\xe1\x82\x92\xf8\xd3\
-\xd5\xe1\x9b\xaf\xe1\x9c\xb0\xd3.B\xd0\xaa\xd3\xdb\x93\xac\
-\xdb\xc7\xe9\xe2\xdb\xf7\xc7y\xa7\xdbat\xe1\xbd\xd5\xd1\
-Fa\xe4TZ\xc9~\xa9\xd2:R\xe8\xcf\xe2\xc2\x95\
-\xcc\xbd=\xa6\xd0\x00\x007\x22IDATx^\x94\
-]\xe3\xa3m\xbb\xae__\x06\xa7\xb5\x8cm\xdb8\xb6\
-m\xdb\xb6\x8dK\xdb\xb6m\x1b\xcf\xb6\xed\xf7\x17\xbc6\
-\x0d\x9a\xb6\xf3\xec\xfb20\xc79\x9f~;j\x92\xa6\
-Y\x13\x8dF\xb3!\xd43OQ\x98\xc7^\xe6\x06\xc2\
-\x9f\x1c\x1e\xf3\xae\xeb\xc2\x5c\xf6\xd7~\xd5y^\x0bU\
-\x95y\x95\xf6*\xcd\xaf\xa2\xb6\xbd\xe1\x81\xbb\xdd\xc6\x17\
-\xd1\x04\xde\xe62\xb7}\x145\x9aM\x0b\xb5\xc9H\x0d\
-L\xc1\x09\x1fD\xb9EW\xd4\x16*\x80to\x86Y\
-\xd9W\x89w\x09(\xe1;\xa0\xb6\x80\x84\x87\xde\x02\xb6\
-k\x91\x9aK\x93\x05iQ6\x89\xa3\x8c\x14\xa0\xf6\x0a\
-&\x00h.\x8b77/\xe0&\x22e\xac\x15 #\
-\xa4\xfc\x12\x94\x02U\xa1\x14\xa8pu=\x84\xd3\xee\x87\
-P2N\x07\xd5b\xec\x99\x87\x05/\x848\x9d\x0a\xe4\
-\x9a\xa1UU\x02_\xe1B\xccL\x22zz)\x98]\
-\x80\x08\xfc\xc4o\xf3\xd5\xf5Do/\x0f)\x0a\xbcA\
-R\xef\x11SsPQDY\xd7\x80\x95\x18Z\xe5\x16\
-h\xe5\xaeJ14\xa2v;3D\xf2\xcf\x80\xab\x88\
-\xb4\x0b\x00\x01b,\xfa\xd0\x9a\x0ax\x03Jx1Y\
-\x84\xccI\x03\xba\xceEK\xf3\xaa&\x9c\xc0U\xd4N\
-\xf3%\x5c\xcd2\x107|e\x1e?\xb3\x0ce\x0e`\
-\x01$P70&C\xc8P\x11~\xd1\x13\xa3o0\
-G\xf9\x05\x1c5o\xa0\x9c\xde\x15\xca\xbf4\x1c\xa5K\
-\x11\x8b=\x03\x8c\x09\x1d\xedv\x010\x1a\x13!&\x1d\
-M\xb9'#o\xf8p\xc2\x17\x9e\x8as\xaa\xddo\x0e\
-\x97\x11=\x19\x93\x98=rR\xc3\xcdXS\xdb\xb1\x92\
-\x12G\xe1\x01\x07\xd5\x15\x83j\x92\xe4\x9b\xca=Y\x96\
-\xbaGH\xbc(\xfe\xb2\xdc\xf3\xdc\x09\x1dYJ0\xe1\
-\xb7\xaa\xc4\x90\x18\xa1\xe1*P;\xd3H\xbb\xe4\x9db\
-\x1d\x05'\xcah\xc5\xe8A?\x01\xabF\x8a\x9c%\xbe\
-\x16\x06e\x85\x1c\x05\xfd\xb4\xf0\x1c\xd8Z\x98)\x18\xf9\
-\xdb\x82l\xdb\x9b\xd9\xda\x15\xd3\x07\x90\xf4\x9aN\x19S\
-O|\xbd\x05\x0bb\x17\x1dec\xd2\xc2\xd7\xebRi\
-\x11\x03L\xb8+s1:~\x80\xa3h\xfd\x9a\xa5\xa2\
-\x9f\x11G\x09j\xecI\xc1\x90d\x01E\xf7\xe4P\xb2\
-\xe8\x11h.\xa2\x07i\x03\xcc\x94\x8a\xb2[\x02\x9ef\
-JC\xb5-\x85@\xc5\xdd\xdb\x0b\x17\xa4\x1er\xd4\x17\
-}\x8dpY\xec\xc0PT\xd3\xca\x88\x9fx\xa9\x04\xcf\
-\xfe)c\x96fLme\xf9]\xb8IA\xbb\x91\x1f\
-%\xacB\x80\x17Ha\xcdy\xbd\x17\x99\xc3\x0f\x9aS\
-U;\xab'\xb0\xf0\x1dS\x1b1\x02G\x05%:|\
-D\x1a\xc5%\xca\x92\x88\xa1\x12\x96h\xca\x91\x9f\xf6\x8d\
-\xbe4\x17\xc1\xa3\xf4y\x0d\x0d\x9c\x13\xf9\xd0\x8c\x89%\
-/\xb6\x84:\xda\x0e\x84?\x8d\xc6\xa4\xa3\x12@\x09p\
-\xc9\xea\x1b\x8e\x9bh\xf4\xa2\xa6 ut\xf690\x14\
-\xf8\xa98\xaa\xbcSfn{9\xfd|\xfbQg1\
-G\xc5=\xbd\x941\x01\x89\x9eZ\xa20O\xcc>\x87\
-\xa7f\xd1\x13T\xa2\xca>>Y\x8cb\xf2\x80\x90\x19\
-\xba\xe2\x97O/\xff\xbd\xc5\xc5\x1f50\xdcc\x96*\
-f\xe2\xcf4\xeb\xa8\x8a\x9fz@\x18\xe6\x11L\xc4\xea\
-\x0b\x1f\x03g\x85\x15\x97|!4&\xc2\xea\xd8y\xeb\
-e{F\x8b\x8e\x0e+\xfd\x10\x0fq\xb2#\x8d\xe3Q\
-\xa1\x1eB\xb50]\xb4\xe7\xa1\xe4\x98\x94<\xbe\xc0D\
-\xefT\x050+\x01Yf\xee>\x7f\xfd\xa2\xd0\xcdM\
-\xe0\xa7\x04%\x14\xe2'\xdcS\xe0\xf2\x99\xa3\x8cP\xa0\
-\xe2-K(\xad\xf6\xc4Pg\xfb\x08\x12\xde\x9a\xb2r\
-\xf9S\x8b>\xad\x19\xa8\xa8Y\x8c>b)X\x12C\
-\xed!O\x0b\x5c\xf3{p\x19\xac\x80\x10C\xd1B,\
-Ig#\xd6\x972GaQR:j\x9f\xa7\xa7\x14\
-\xce\xd1\xfea*\xc2O\xaf\xf5\x9a\xa1\x05\xf2\x14\xf5\x13\
-m\x89)G[\xa2t\x84\xd9Y)\xc9+\x8e>}\
-\x96H\xffp\x87ov\xcb\x8e\xc3\xb6\x1e0_W\x19\
-\xa0\x19a\x9cP\x09\x1e9|\xb4\xa7&\xc5\xf7\x82\x15\
-\x90\xe2\x12\x8a0EI\xc5\xe6I\xf2\xb5\xc7Os\xb9\
- \x9f\xc3\xa6\xaa|\xfb\xe2\xe8\x1b5\x1a\xfd\xcf\x00\xe6\
-\xe6\x85A\xab2\xeaz\xe6\x9aM\xc3>\x02%\xb0\x88\
-6N\xef\xd8\xe6e\x0d5\x18\x1dG%(\x01\x80Q\
-\xb2\x0c\xaf\x5cY=F\xf8\x10;\xdf\xf8\xa5\xbb>7\
-5\x7f\xf4\xd4h\xb4\xaa\x8f,=\xdf\x02\xdd<ld\
-H\x8d\x06\xc1\x9c\xc0Gt4\xe0\xaaK\x96\x15\xd4\x1e\
-{\xfc\x841\xb9$\xc4<\xe8\x9e\x04\xa5vL\xe5\x19\
-/\x82\x0br~\xe8\x85\xdc9\xa7\x0f[\xa0\xab\xff\xee\
-\xd6\xe7\xbfz\xd4\xd9\x97\xbdx\xef\xd9_\xfdv\xdb\x13\
-\xbd\xb9\xd3\xf1h\xda\xe1\xcb2\x8a<\xed17s\x90\
-\xbc5\xaa\x1c\xd7&\xed\xa0jZ\xa0\xaaO\xbf\xa8\x8c\
-\xe6\x8e\x19\xc7\xd1?^\x0ch\xee\xb8sUV\xdf\xd6\
-\xf1h\x9b4\x94\x96\xd0\xa6\x06\x0a/a\xaa\xcfQ\x5c\
-\xe1A\x07HIs\xc9\xec\xd0\x9a\x96\x9f\x0c0\x98\xa5\
-\x9b\xfa\xce\xeaW\xec\x09\x91\x8eV\xe7\xed\x8c\xc5\xaec\
-\xbcPG\xa3\x15\x14t\x14szmN\x94\xdb\x81\xc3\
-\x87[\x17KH\xf8G;\x89\xaf\x9c\xdd\xbc\xf9*\xeb\
-\xdf7\xf6\xd1\xeao\x9d[\x0ci{\xed\xfb\xa6\xb1\xf1\
-(F$\x02\x14\xddS\xc0\xce\xf7?\x7f\xd7\x15=\xa8\
-\x92`\x18\x9a\xe7\x90\xd9k\xb9\x13\xce\x8b\x00\xe7\xba\x1d\
-\xc3~\xb3\x91?\xbcz\xf1\xaa}\x04\xb4\xbc\xf1\xa4\xfd\
-\x96\xc7{V\xaeZ\xb3n\x16\x9c\xea\x85}\x01\xdae\
-Ue\xd2\x05\x08\xe5\x9b\xd8\xeaq\x05}\xff\xb6#\xd7\
-\x1b\x0e\xad\x1aH\xa5\x04\x90\xe6X\xd5\xb9\xe0\xb9\x8b\x9e\
-\xbd\xe8\x97O8\x8e\xe6\x16\xed\x89\x16\xc0\xed\xc3\x99\x1c\
-\xfcSyK\xbf\xe3\xd6yx\x17\xa7\xfd\xcf\x17\x07\xfd\
-Ng\xa6\xd9|x\xde\x0a\x7fX\x8b\x86\x8a\x82\xb6\xbb\
-\xda\xa0\x08$\xfe\xaa\x95\x09`m\x9bt\xba4\x9a[\
-(\x0a\xd4P \xe7\x98~|\x0f\xaa\xdd\xdc)\xe8B\
-\x0d\x81[\xdf\xdaZq\xe3\xe7?z\xeb\x09\xa7?\xff\
-\xde\xe5\xfe\xe2\xe4\xd1\xb7-K\x97\x01P\xb5,Ih\
-rH\xf7\xc4\x1c\xfd&)\xfdh\xf4\xee\x161\x94\xa8\
->\xc3[\xb9G\xb3\x05\x09\xff^1\xa3\x91\xfd\x19\x9d\
-s#\x85yO\x1f~\xccr\x0a\x9b\xff\xf5x\xcb\x82\
-+\x87\xa50\x94\x0b:I\xd1{.\x1f\x82{\x0aJ\
-\xec\xf3\xa7\x82dc?\xcfa\xbd'\x98\xef8Z\x9b\
-\xc5\x8e\x1cyzFd1s\xff\x04\x1c\x05\x1e^x\
-\xcaYYv\xee\xaf\x8eZ\xef$\xb1s\xe0gwl\
-Gq\x98\x17\x97\x9ep\x09\x05\xac\x17[0\x93o\xdd\
-\xbf\xe8\x94T`\xe6\xf5\x0d#\xc6\xb1l\x19x\xf2>\
-\xad\xf6'FH/|\x0f\xf0t\xb9\xc3=?\xc5\xce\
-\xeb\xe0\xb0jg^r\xa7\xd7\xcf\xb6\x02\xcarw\x84\
-%\x1d'\xfc\xde\xe5\x7f\xbfc\xf7\xb0\xff\x1a\x0bd\xa1\
-G\x09\x09\xa8\xe8\xe1\x0e\xc2\xfe?_\x18\xf4\xaf\xff\xa9\
-\xfd|<\xc7 \xbf<N\xfe\x11\x0f9\x8f\xb4\xb9a\
-e\xff\x07\x81\x17\x9d\xda>l L\x0e\xf0\x83\xca\xb3\
-\x88\x1e\xeef\xe0I)\xb9\xeb9G\xfa\x0a\x8b\xe3\xc1\
-\x16\xc0$\xba\xc2\x0an\xf6\x85a\xbfa`\x7f\xc0\x02\
-\xd8\xd2\xaa*\x84\x9a\xbf\xf1\x83[\xb6\xef\xb8\xf3\x91\x07\
-\x06\xfd\xf7\xfc\x0d\xb0{PZ:Y\xe1\xbcj\xf7\x00\
-\xfc=3\xb4\x8b\x0bRLA\xfd\xa1\xa0\xb5\xbe\xd0%\
-\xb2\xb5s\xb0\xbe\x007\xc9\xe6\xeb\xc7~zpa\xd0\
-\xc9\xf3\x1b\xcf<\xfd\xb5 \xec\xd9~U\x8a\xd7\xaf\xf2\
-\xdaeM{\x17!\xa0\x83\xea\xc3\xf9\x02s\xf2\xb6\x07\
-\x06\xad\xb2-@M\x0e\xda%cJ\xc5\xa3Q\x94\x07\
-i\x88\xc3\xcau\xdcc\xac\x90\x07\x06\xa5\x8f\xb5\xd12\
-\xcc<\xf3\x17\xcc\xa1\xf9!U\xa0\xce:\xff\xd5\x1c\x91\
-~\x1dl\xee\xc0\x10\xbc\xd3Y{\x16\xe7o;\xb8y\
-\xd3m;v\xef\xea\x14\x921\x8bAq\xf0\xf4\x92\x0e\
-\xbf\xc0\xb5\x1eU\x14\xa2g\xb8\xef\xb7@\xf6\xf5\x1cD\
-\x11\xff\x13_R\xb2\xdcY\xd4P&\xfb\x80\xf1\xe4\xd7\
-<\x01\x01\xe9\xad\xc78\xe3\xde\xdd\xcf\xc0\x91\xee\xbdd\
-a\x00\xf1\x17\x96q\xb9\x92\xdb\x05\xd9\x8b~\xa6E\xaf\
-\xa2\x12L\xebTu\xf4\xbb\xa8\xa4\xc0O\x96\xfe\xf7\x0c\
- \x9f\xeen\xb9\xfa\xe8\x09\xa0\x81'\xde\xf3\xba\xa7p\
-9\x18\xdd6\xcc3\x8b\x14\x88\xb7F\xb2\x92-^r\
-;J\xee\xe2J\x89NF\x5c\x1e\xfa\x9b\xbf\xff\xacN\
-\xeeF\xa4\xa4\x9e\x96^0\x85\x99\xcf\xec\xe6\xadw^\
-\x08J\xea*z/c\xe8\x8c\xb3\x99a\xed\x81\xb1\x96\
-\xc8QOIU\xe0lP+\xa0\xd1\x96\xd8\xc5O^\
-\xf0\xbe\x8b\x0d\xae\xed\x066\xc2d%\x05\x98Dk'\
-\xc1\xfdl\xde=\xec\xb4\x1a\xc5]\xe6{\xfd\xd0\x19\xd2\
-r\x8ds\xe5\x9d\xc3\x1e\xaeL\xeeAi\x03_\xe1\x9b\
-\xcd\x9e\xd7%\xf3\xf9Ry\xfd-\x9f<\xc6\x09\x0b`\
-\xf5\x84\xa3\xa0\xa4\xa3\x85\xc2\x07z\xba\x05\xb1\xea\x91a\
-\xc3\xe6JO\x80.\x1e|\xec\xba\xbdF\xf6\xd5\xbcD\
-\xa3\xa3u\x0f\xee\xea\xe7\x94\xddY\xc2\xdd\x06E\xac\xa5\
-\x13\xe4H\x85\xb4\xe8\x9b\x86\x97\x0f\x1f\xb7^\x99F\x83\
-\xac^<)!\xad\xcdm\x19:\xbf{`\xff\xa3\xfa\
-\x8dI\xc0e\xa3\xac\xd3\x0cWO7\xe6s\xd5\xea\xfd\
-\xfb\xd7\xdd\xbcuaW\xab\xa6\xea\x13p\x95D\x0f7\
-\x9b\x12\xe0\xa4]\x11z\xd2y}\xf3UAT\xbbu\
-\xc6O\x95\xd1\x93\x8a{\xba\xd1ej6z\xae\xce\x9c\
-\x12}|\xb4a\x84\x7f\xc3\xcd;\x87\xcdV\xa7\xd3\xea\
-\xe5T%\x13\xc1\x13G\xc1\x942\xcdR\x854\xad\xa3\
-\x88S\xe8\xc0\x120\x94=),\xf79\xd3\xbb :\
-\xbe\xbe\xce\xdfp\x03\xb0\x13i\xfdB\xcb\xba\xcf\xbc\x97\
-s-O(\xcb\xd8\xf0A?\xe1B\x94\x8c\xd3|\xcb\
-Z\x1f\xeb\xe8\x93\x0e\xe7\xfc\xcd[\x1f}a\xeb\x95P\
-o\x19\xfa\x1c}\x0c\x94\xb4'F\xff\x06\xa7\xc9_;\
-b\xca3\xef\xf5\x9bv\x0esH\x9b!\xabWH}\
-\xbb\xa7M\xc6Lk(\xd7G\xa3\xb5\x9e\xddho\x19\
-\x18\xd0\xd6\xe1\xd2L\xd3\xb8\xa8/\x1bT\xab\x86EA\
-\xf5\xdc\x1c\x95\xb4\xe9\xb1\xf4>m\xda[\xd6\xaf\xbb\xfb\
-q\x93}\xd4\x5c\xc6\xab\xecU\x97B\x82T\xf6\x982\
-eN,\xfa\x908e\xfaM\xf0#\x0b\x03\xfb]\x18\
-\xa4\xe7-\xeeytHi\x93^\xee\x89~\xbe\x07\x02\
-j\xc7\xca\x8d\xfb\x96\x8a~\xab\xa8\xad\xcd\xfbe\x9d@\
-\xf2X\xc6\xe7\xed0\xb5\x19*\xdb7\xdd\x08(\xc7\xf7\
-G\x1a\x18S;\x87\x16&\xacN\xb7\xbc\xef\x81]\xba\
-\x82\xef\x944_\xfe\xb2g&\xe7O\x82\xbd\xd0O\xfc\
-h\xd1\xe1\x5c\xb6\xf1\xb0a\xabv\x05\x9d\xaat\xafR\
-\xa0\x0a3\x19&`\xa3_^\x95\xba\xe8\xf0\xbb\x00\x18\
-I\xd7\xf0\xbf5g83;\xb4:\x80d?\xd4\xde\
-2(\xe9\xec\xbc\x83v[\x03\xd6\xa6'\xdf\xb6n\xcd\
-O\xae\xf9\xf8\xae\xa5&U\xcaJ\xfb\x01\x18\xe9\xf2L\
-\x8a\xb7AK\xf7\xab\xc5.\x85\xbct!\x17nX\xcb\
-w\x0c\xdc\xe62Raof\xe9\xbb\x9eeu\x04\x1d\
-@gZ\xb4:\xcdFO*zuI\xc2G\xb6*\
-\x8b\xf7wB3xH\xee\xba\x09B\xa0\xeaB.\xaa\
-\xe8\x9d\x1d\x17?)\xa4\x00\xf2\x86g\xe6uf\xb1\xb3\
-\x9f\xe3n\x98j\xd6\xb0FT\x0bJ\x8d\xb4$\xa0`\
-\xf3\x8c0\xf3\xc2Q\x00\xa9\xb2\xa60\xc2\x7f\x128\xda\
-\x81\x22>\xd1\xe5'=\xf6p\xcf\xc2\xfc\xdaH\xa1\x9c\
-\x9f\xdd:\xec\xf7 \xb1\xcf\x0b]#\xb3\xbfeE\x84\
- +VR\x14\xbd(@h\xf4\xdd k\x12\xa3\xa2\
-\xc2\xd3w`\xa5\xee\xcb\xb6H\xaf\xb8\xda\x18\xf5\x89\x1d\
-\xe3\xf0\xef\x1b\xc9\xc2=?\xbbe\xe7\xb0?\xd3\xe00\
-\x9f\x8bO\xf6&\xa0\x22w6%x\x891\xc1\x0d\xec\
-\xf4c\x12\xe5\x9d\xdai\xf7dE\xbbr\x094\xd4\x81\
-\xbdz\xbd\xc5\xb6\xafY\x14\xaf#y\x9f\x83 \x11%\
-<\xb5G\x95\x88\xbed\xb0\x0a*\xb9'\xe1\xa8\xc7T\
-\xde\xb9\x83\x8fqe\xc7?\x842L\x0b\xf9Y|\xf7\
-\xcbs\xb0\x00\x0c\x0d\xd0\xcb\x8d~\x1e\xff\xd6-;\x07\
-K\x9d\x06xQBJ\xdc\x14\xaap\xd7\x8e\xc0\xaaE\
-\x94\x8c\x09\xe0\x91\xd5\xc7\x1b\xf6\x91\x86Ns\x84\x0f\xfe\
-\xe9!([|\xff[\xbd\xc6w^u\x1c&\x18\x0f\
-\xbd0\xb4\xe6\xf4\xa17\x9ad\xb2\xd3\xc0\xfd\x86\x00\xa9\
-{J,\xe7aw\x0e\xa4u\xf0(\x0dE3\x02\xb8\
-\x98\x85\xa4q\xb6\x13V\x8fW\xe31\x0a*$6\x19\
-m\x1d6\xf5^\x83 \x05S\x8a8Z\xd6\xdc\xf8\xc0\
-\x18+\x96<\x00%\xd9;\x8efq<\xaa\xeb\x8e\xba\
-\xb1\x00^\xe7,\x06\xb4\xe6\xf1a\x8b J\xcdY\xb1\
-\xd4\xdbe\xc2\xce\x07D\x0b8\xb5\xc3\xa7\x95I\xb4\xd3\
-\x92J\xeb9\xc2\x8f;u\xfc\x12\xd9\xc7\x14\xcc\xd5\xdb\
-MiAsSeL\x96\x22~R7QM\x1a\x0a\
-8\xc5\x96\xd0\xdfg\xa2\xa6\xf1\x16#/N\xe3w\xee\
->\xb9\x9fP\xae:h\xec\xbb\x09\x05\xbd\x90\xa7\x92\xd7\
-\xe3%0\x81*\xe4(\x1bS\x15YS\x96\xd1*\x0f\
-\xfce\xd1#\xdc\xe4n\x83\xceA\x9bo\xbe{\xe3\xc6\
-M\x07w\x98jR\x93:\xca\x98\x04\xa4\x92\xbd\x904\
-\xbe@\xed!\x82\x097\xb0Q\xaeR[\x93\x94t\x92\
-\xc6\xa4\xa853\x03\xc8\x99\x9b\x0d\xdah\xd2\xb2g\x94\
-\x9ap\xbb\xbe*EI\x85\x9f,{\xbd\xcc\x97Xx\
-\xf2\x9aJ\xe2\x1a~\x5c)\x91\xa0D\xc2<\xa1\x9a/\
-Y=\x0b\xf6\xf7hM\xd2\x9d\x17\xb6@\xf0K\xc1\x14\
-\xa2\x08?\x1d\x8f*\xac\x02So\x84\xe6\x82\x8f6\xeb\
-\xe1\xd2\xed\x8e(z\xba<\xca\xbc\x9e\xa2D\xbf#2\
-Q\xfd\xb4=\xff\x048\x83]P\x07S\xdaG\xf56\
-85B\x8c\x93zU\xd9\x07A\xd6\x9a\xa1\xa0\xa4m\
-\xe6h\x92\xc4\x87\xc6\x05\x88@K{\x08\xb70\x17H\
-_pR\xd7(w\x96\x08\xe2\xaab\xab\xb7\xdf,v\
-\xc2\x9c\xb1{*i\xed\x04\xbc!S\xc7\xafLz\x9f\
-\x09u\x94\xf7\xc2t;\x11\xf4\x8f2>\xe5\x9e*\xb8\
-J\x04j\x11\xeaN\xd76\xbe\xb3R\xf0e\x8a\x93\xa2\
-\xa4\x09jF\x9b\xa1\xb2{G\x85G\xd1Q{\xe7\xac\
-\xa9E\x91\x0aI\x80\x91\xc0a\x0f%\x1b{\x09\xcc\xa4\
-NR\x88L\x05*_\xd1\xe6\xcd4\xea\xa8\xaa:\x02\
-5\x02%\xad\xf1E\x1c\xe5\x1e\xe7BG\xf8\xd29\x9c\
-h\xca\x04\x80\xe0N\xa9@\x96\xb0y\xb5-\x12\x17r\
-\xd1u\xba\x08\x9f7\x1b\xe2\x1e\xe7:\xd6\xce\xdc\x13=\
-\xf7\x91Ql\x02\x97G\x80\xd2\x01\x0e1\xa2\xf0YI\
-5\xe9\x8d\x06xs\xda\xa4vli\x1b\x5cP\xc2C\
-puv\xc7b\xafk\x95/e(\xf1d\xa3\xeb\x04\
-\xde\x02RsTYSQ0O\x0dF\xf3\x08KE\
-Q-L\x81\xaaq\x026\x88L\x04d\x9djw,\
-\xd3._\xdc(\xfc&Z\xde\x84@\xea\xc8Ol\xd4\
-\x02\xddt\x0f^\x8e\xab\xa0\xa3\xd1\xb9\x060\xfd\x9a \
-FY(\x94\xc4\xa9\x92W\x0a;%\x9dO\xd5u\x02\
-[\xe2\xe6Q\x92}D\x0c\xb2\xce\xfd\x0e\x88\x92\x8c\xc9\
-WQx+\xb3\x07K\x027\x1a\xf7c3dB\x19\
-\xaf\xf5\xc0Ua\xa7\x18\xbc\x94\x1ft\xf7\xa0\xbct4\
-J\x1c\xc5d\x04\x81\xc6\x8b\xbdJ\xef\xe2E)\xf6\xa4\
-\xa1\xe8\x0b|\xa0N\x86\x15|\xc1I\xbf\x04\x98H\x15\
- \xd89U\xe2\xee\x85P7\xd5\xaa\xc4\xd2W\xebS\
-*]\x16\x12\x93Jr\xd4\xf7\xa7\xfc\xa1\xa1\x02\x91n\
-\xd61J\xf9HI\x1d\x10\xa63{\xcc\xed\xd8\xdd[\
-\x88\xa8\xa5\x88V\x88\xd7z\xf7&\xb2\xa0\xd1\xe8I\xde\
-t\x0a\x038+\xe82O\xec\xca7\x95~\xd7S\x8a\
-\xa1\xd3\xe1~=\x8b\x1f.\xe0\xac\x8eE\xc1\x99\xe2\x8a\
-$\xf6\xa4\xe2\x12\xdf\x8c\xea\xb4\xe0\xe1\x8a\xce\x08\x09P\
-\xe4g\xc8QE\xc4P\xca\x97\x84rVP\x8a\xf3\xc2\
-\xe4\x8e\xac^\xae\x04X\xc1\xe9p\xeb\xc5\x9e\x1d\xe9\xa1\
-\xdb\xdb\x85\x9f\xda\x960\x22\x09\xda\xdbE\x078\xb8\xa7\
-W*\xc2\xcf\xda^\xe8\x9c\x0eE\xe9\x15\x10\xad\xf4h\
-\xea\xa8\x9e\x80\x13\xff\x87\xa1\x86\x1f\x8f\xb2\x97\xd2\xbaZ\
-\xe2\x8bx\x89wP\x1a\x0f\xdcSIv\x1f\x83\x8d\x9a\
-\xb1\x05\xa7\xb8'\x87\x91 6$p\x16\xa4\xc2\xd2B\
-\xbbR\x11=\xacN\xc2L\xbd\x84\xea\xf5S<}\xd2\
-\x95N\x8b\xe8c=\xa5HO\xf5\x8eJ,*P5\
-N\x0fi\x85\xa2\xaf\xb5r\xf2\xaf\xc2{\xc8F\x9d\xc8\
-\x94P\xd6\xccQ\x9f\x1cR\x12{\x1afpH\xa8J\
-\xe4\xa0\x9e\xe0C\xb9\x13Oc\xa8\x0d\xedH{\x08\x17\
-\xfd\xa8@\xad\xa3e\x94o\x8d\x95q\x92\x13\xadb\xaf\
-\x9fTN\xd5\x8e\x1bS\xea\xf8EA\xbeT\x13\xb5e\
-2R\xfa\x12\x9cdM^rW{k\x91X\x13\xfb\
-\xfc\x90\xa5\x11\xa59\xeaL^N\x0b\xe1\xe5\x91\xc4\xa3\
-1/E\xf4\x08\x14\x9e\xf8\x80\x98hg\xe2\x00\xeb8\
-\x0acQ\xdf\xe3\x17r\xde\x92\x97N\xfc\xc0(/\xc2\
-+\xa2'\xf1\x87\x82G/\x9a\xce\xed\xd3R\x9f\xe6T\
-D\xa3\x05\x98\x12\x98h\xaa\x95\xf0\xe3EI^\x88\xb6\
-\xf2\xc5\xdf&\xac\xc4N~O\xa4\x81\x8e_\x99\xe4\xec\
-MOg\xf5\x124I^/Kh\xecE\xeb\x14K\
-\xdb\x1c\xe5'\xad\xe9\x10\x1c\x85[\x05%\xe8\x9f\xe0\x1d\
-\x87\xa3y\x8d\xa018\xd1:\xcaX+x\x02\x94\x0e\
-\x9f\xb2}q\xf8\x87\xe4hLdL1G\xc9\x90\x88\
-\xa7\xf0\x0e\xd9*\xc2\xaf\xf4Z/*\x10\x1bS\xda\xec\
-\xd3k=\xf3\x13\xcc\x1e\xef\x98(\xa9\x8b2\xd1\xb2\x14\
-\xa6\xf2\x86}\x1c\xe6\x89\xe0\x15\xcc\xd8\xe8\xd3~T\x83\
-%\xa4\xeeu\x8bW\xcc\x8b0\xeaBI)w*\x1a\
-\x95\xf3\xf5xK\xdc\xcc\xfe>\xbd\x17\x1aUr\xf5\x15\
-\x14\xc6Y?Q\x0d\x04\xafl\x83\xfbqS%X5\
-W\x05\xa6f\xea\xf8\xf3L\xc2N\xc1* u\xc6\x9c\
-\xf3R\x9f\x0aJ*\x08\x98\x08' V\x06\xc5b\xd7\
-\x09\x09\x92b)\xfc&\x0f\xb5\x08D\x85\x14P\x22\xd4\
-\x5cJz>\xcc \xbb+\xc9\xa28\xb9\xab\x12\xf1\xbd\
-\xc0\xa4\x97\xf2\xa5c\x8bdL\x92+\x93\xcb'\xe1\xcb\
-\x81+\xf0P\xb9d\xf6\x01\xd1\x22O\x1f\x1a$?*\
-t\x8ee\x1f\xbbT\xda\xb8\xd3:\xca\x87\x03\xd1\x90\x98\
-\x10\x1f\x97\x1e\x85\xa7`H\xc2\xd12&\x02\xa8\xa3\x91\
-8j\x86W\xca\xeay\x09-\x84\xab=\x8cH\xb41\
-I.O\xfe)\xd4Q\x0c\x9f\x88\xa7\xc2\xe0v`L\
-\xa1oJo\x8a\xa4\x83\x12\x01\x8b(\x1dC\xb7\xcd\x9f\
-|R\xa3\xc8\xd5\x091\x92:|\x855\xe7\xf4)[\
-\x119k\xa8\xe4\xccA@\x0a7\xe7#\xd3R\x1fM\
-\xa4\xcbT$[\xfb9\xbb\xcb\xfc\xc1Fx\xda\xb2\xe0\
-\x1d\xf0B/\xa1\xbc\xc5\xcc\xbb\xa0U\x00Xl>\xb4\
-z%\xf9v\xcc\xd1\xc8\x9c\x0a\x00\x0a\xce\xe9X\xb7\x1d\
-\xde\xc7B.\x9f\xb9#\xb4\xbe\x1b-\xf9\x06\xab\xc7\xae\
-\x0d\x0f)\xaf\xf3\x826\xb2\xfa4\xcei\x0eJ\x84z\
-\x00\x169\xfa\x8f\x8b\x96\xce\xdb\xdd\xc7\x14\x14\x80\xfa\xbb\
-\x22L\xc2N\xb1\xf68(\x01\xa0^\x8c\x1f\xc5yA\
-\xcfx;\x88\xf0\xe3h\x14\x9b\x89\xfe\xcd\xf2s\xd3\xbe\
-\xa5\x1e\xc0D\xd1sj\x1f\xc3\xac\x18,\xbcu;\x11\
-\x82D\x94\xfc\xa1\x84?\xd6?\x05\x82\xc7b\x0eo\x86\
-\x9dd\xb7\xc4wu\xa4\x88_\xa3I\xd5)7*\xce\
-^\xf8*lU\xc6\xa4\xf3\xfa\xd8\x96\x22\x8e\xb6|\x96\
-\x16\x08V6mm\xaf\xc1\xca\x81>\xba\x0c\x9a)\x0b\
-S\xa1\x22|x\xe8[:\xf3b\xeb\x97\xd0$aN\
-\xf0\x95\xce\xeb\xb5\xe8\x01d\xcf\xfa&\xab\xa2\xbb\x1b\xfe\
-\x12\xea\xa5M\xc0\xda \x17\xf1\xfd=J\x1fI\xe2\xa6\
-\xf1y=\x8b_\x9d\x0c\xe4cB\x1a&\x00\xc5T\xe4\
-jw\x84J\xf6\xeb\x83\xe8\x9e\xa9\x0c\xda\x89\xf0W\x82\
-\x12\xc1\xaa3\x91\xb4\x86&*\xce\xadV\xe0\x9e\xf4x\
-\xa2)\xdbB\xdcG\x98\xf0\xca\xe1\x85*\x9a\xee)\xa0\
-\x10_\x93\xb6y\xb8\xd3\x05\x9d\xf4\xbc\xa7\x98\xa46\xda\
-p]d+\x87\x80S\xf5\xe8X\xae&Iq\xb3N\
-T\xc5\x03\x96\x96A\x22\xe2~\xc2(\x8f: \xe2|\
-\x99\xe0\xfe@\x94\x14\x91:*8\xcdG\xc8\xa5.\x92\
-\x0aQA_b\x9208\x89\x1d\xber\xa3\xe9\x02D\
-\x11\x8c\xd0\x02\x8f\xbf\xb5\xa3\xfa\x9e\xdc\xb9\xabt\xe5\x01\
-\xb0bG\xd9\xd8\x15\x1f9\xaa\x1c\x14\xd9<\xde\xb1\x1f\
-\xb5*\x1a\xa4K\xea\x94\xed\x1e\xe8j-B\x96\xd2\x18\
-\x00A[\xaa(\x9f\xca\x0f\xda\x94\x10\xa0\xd8Q\xa9\x94\
-T\xb0\xb6c\x8e*\xa3\xd7\x11>|\xd8\xa0d\xdd@\
-\xb8\x89H\xbd\xa9T\x85@\xad\xb0CK\xf2&y\xda\
-q\x8c_\xa6\xa3<\x0dvZ8\x9a6&\xc7\xd0'\
-\xad\xd9\xcf\x0e\x91\x9fbN2\xb5@/\xa1%< \
-tnp\x1f\x9f0\x87\x86\xafX\x1aY}\x0b\x1f\x01\
-*\x11\xa9\xeb,\xdc>(\xc47\x01\xa1\x8e\x86\x8aZ\
-\x09D):V\xc9l\xb9\x8cMI\xe7\xa1\x01\xd6\xd4\
-\xd6\xb2\xa8\xe8\xd3#\x00:{=\x00en\xe2q`\
-\xf2\xfa\x9a\xd2\x85'_\xee)\x98\xb2\xce'\x19:\x0d\
-y}\x94\x87\x16\x04\xf7\x95s8\xa5\xc3\xf3O\xcc\xd4\
-\x90\x9db\xe8\xfc#\xad:\xa4\x9bHdF\xd1r\xcf\
-,\x8d7\xc4b\x12\xb0\xc5\x7f;\xa0S\xfb\xd8\x94\x04\
-d.\xf3\xd3\xf4\xa6\xad\x18{\xcc\xd4\xb6\x96|zp\
-^\xbc\x86*\x87\xdf,\x18\xa28\xd2\xf7}\xfc\x00\x9e\
-\x11!kB\xf1S\xef\xa8\x22\xe9\xc3\xaf\xb5\x0f\xadT\
-\xaa\x9c,>\x012B\xaa\xc5\xae\xf3z\xfe-\xd4^\
-h\xef[n\xb9\xa7E\x94\xdc\x13<*\x19\xad\xd0\x9a\
-X\xe2\x22\xf6\xa4g*#w\x8f\x97\xc3\x9bn~\x11\
-\x90\x8c\x92\xfbt\x8e\xc5\xe5>\xeau5\x97\xe6%\xde\
-\xe2\xf1\xe3:.\x82d\xc4!\xe9\x13\x18\xf1\xf8\x8ft\
-y\xd4q\x15\x97{\x030n\xc5\xd6\x06%9\x88T\
- \xd3.T\xf3SH-J\x11G#\x88dL\xae\
-\xf2\xf4\x15w\xac\x8d&\xaah\xacQD\xaa\xf6\xc3\xd2\
--Z\x0a\xb3\x80e\xa1'\x9ar\xa7\x13~\xb4Ge\
-\x1d\xae\x8f\xedA%\x05\xe2\x11\x10E\xbc\x11^U\x15\
->\xd8_\x10((\x1f\x18\x80\x83W\xf8(v\xa6\xe3\
-Q\x89\xf0\x9b\xd2\x98\xc9\xfbL\xe6\x17\x93QP\xd2]\
-4w\xd4\xfe\x00\xce1\xed\xed\x95\x01\x08\x0f\xad\xf5\x95\
-\x9a\xa0%~\x89\xe6\xe6iv*=U\xee\x89-\xde\
-\x81\xf4Z5\x80PIG;\x1b~\x83\x1e\x1b;C\
--\xcb\xa8\x15\x1f\xdeu\xb8\x0f\xae|i\x16j(\xbd\
-\xe2\xf9\xa3\xa11\xe9\xe0\x09\xa4\xff=8\xae\xf8\xca\xf7\
-\x17\x82\x93Cf\x04[\xe9lDi\xa9j*\xd1y\
-St\x8eU\xc7\xa3q\xffhj\x9f\xc9\xdehN8\
-\xeba\xcfw\x84\x9d\xbc\xd5\x14\xee4E\xbbLq\xda\
-4.\xcaS!\x1e~\xa4\xfdhA\x0c\x15\xb8`O\
-7-\xe2\x01\xc0\x0eg \xb2\xdb\x90'\x12\xbc\xd8\x8f\
-\xb2\xa5\x8b\x92\x86k\xfd\x84\x02+\xa47\x1b\xd2\xdb\xf6\
-T\x1a\x7f\xcc\x01\xbdy\x00\xc2\x0f\xba\xf3\x94n\x0a[\
-K\xd2\xd4\x80\xb07\x8f\x8e\xb3\xfd\xba\xf1h3\xa1\xa0\
-\xe2\xa2x6\x11\x9cyX\xbd\xbb\x0fV\x0f(\x99\x99\
-\x9a\xa5\xf1&\xa3@\x95\xeaC\x86\xef,S\xec\x1c\x1b\
-\x8fN\xf3\x86\x98\xc0\x0c\x92;n{\xfb\xe7?:l\
-\xd0\x07\x86\xb2\xf85L\x01\x18\xe6\xcaq\xa9$\xcdP\
-\xd9\x0f9\xd4t\x22\x81\x9b\xdef\xa2\xf2xT#\x8b\
-\xcdi\xfc\x1cg\xf7\xc2\xf3\xcb1\x8d\x8fG\xd5\x06\x0e\
-q\xd27\xfc\x9en{\xd2\x00\x8bx\xdb\x96d\xae\x0d\
-Jbf9\xff\x1f\x99\xbd\xeax\x8c\xfbGc\xe21\
-J\x8a\xa7\xb2s';c\x22~N\xe5%\x8eJ\xda\
-\xbdpTw;\xea\xcax\xba-S\x8fL\xf4\xb6k\
-\xb1}\x98\xa8\x06|\xaa\x0f\x1f_z\xe84\xa2\xc4w\
-\xe5\xc5\xf6\x19<\x08\x94mI\x80\x8e\x8fG\xc3\xce\xe1\
-\x82\x9br\xa9KK\xb15W\xebR\x11\x04%x\xe4\
-\x8a\xa2\xbd\xa8@\x8aS \xc0Ae\xeeV\x91\xf3\xf8\
-\x99\xe8A\xed\xa9\x90^\x22\xb7\xd5\xe4q\xb4\x96\xd8\xa9\
-fs\xf2O2\x96\x12\x92\xaa\xc1\xe8U2\x0b5\x10\
-\x11\xa7\x0f\xd5sK\xc4\xd3\xe9t<Z\xa8\xa1?!\
-\xd5aT\x02Orz{\xcaC\xb5\xd9\xe4e\xaa\xeb\
-\x98\xcc>\xb5\x0d\x8e\x97\x82*\x91\xb3>\xc9\x86V/\
-wj\xf9\x14\xb41\xb5y\xe60\xcd\xf2U\xe7\xd6\xbb\
-\x80\xb2\x0b4\xbe\xe5-\x91\xdb\xab\x09\xa4\xb9\xbfs\x07\
-O\xc8\xd4`\x82\xb3p6l\xd2\xe2Y\xbe\xf6F\x94\
-H0\xa1\xc4\xe0\x0c\xe3\xbc\xa6\xee\xd2a\xff\xc9 \x1b\
-z\x847\x0a\x9f&d'Y\xea\xa0\x92\x8e*\xc1g\
-<U\x03`f\xdaAu\xbd\xb1/\xe9\x95\xa9\x99^\
-\x9btW\x01Y\xbd?pZ<T\xdcI\x88 \xa3\
-q\x15\xe9i\xbe\xfe\x18\xe7\xe9\xb7\x5c\x1a\xe5#\xa0\x9e\
-\xda\xe8\x0b\xde\xaf\x8fgc\x87Kh(w@\xc9\x9e\
-\xb4\xc6K\x9d\xadO\xe3\xec2\xd2S/\x9d2\x15\xaf\
-\xcf\xd6\xe91J\xf1\xca\x14.Jx\xfb\xfb\xf5H\x85\
-\x7f^\xa0D\x9f\x1f\x13\xc3%\x8c\xf0\xf6\x8d\x09\x8f\x04\
-\x9f<2@\xefh\x06v\x9f\xd8\xb7\xf3\xc7z*\xe1\
-\x13R\x9c\x91\x8b\xac\x8d\xd2z\xf9\xd21\x09\x8f\xc5.\
-\x15G#\xe1\xff\x16\x9c\xf6\xee'\xe2\xd1h\xb3\x01\xd7\
-z\x8aH{\x08S\x82'\xae\xe4E.*\xda\xaf\xaf\
-=\x98\x99\xaf\xa5m\xb8J\xb1$\x1a\xf9\xb2\xc1\xc6\xe8\
-\xe7\x0d\xdb\xc9A\x00z\x9c/\x132\x94\x81\xaam\xf0\
-\x9cWP\xbd\x15&G\x82k>e\xcd\xc1\x93\xa7\x9f\
-@\xb2.\xd1\x14\xef\xee;\x8f\xde\xb8}a\xd01\x9f\
-\xf1h\x05\x0d\x936m\x81\x95z@2/L\xbc\x82\
-\x0aT\x9d\x92\x00\xbe\xb0@\xc6\x0e\x0a\xe8\xd4k\x8f\xba\
-6\x8c\xf2\x00k3\xcf\x92\x87\xac5R*<\xf4\x0a\
-\x16\xbbn'\x92C\x18\xda7U^\xfeA\x0e*\xdc\
-\x0ce\xa0\xe7n8\xff\x1fL\x95\xf8'3\x08R\xd6\
-\xa66{{]q\xd6\xee\x9ef;\xf2\xf4\x0f\xe5\xee\
-\xd1\x96\x08\xac\xee\x22\xd3\xbd\x1a\x08R\x9f\xbcb\xfd\xdc\
-p\xefh\x84\xc3\xaf<\xabww\xd7\xca|\xc3\x17\x0e\
-?\xbbT\xa2oic*\x88\xa1\x05^\xc2\xd2\x9c\xa7\
-\xf9\xca91@\x1c\x9eg*i\xe6O\x5c%A\xa8\
-\xbf-3\x11\x16\xca\x8c[ \x1c7O\xddp\xd4\xe1\
-#\xa8t\x0aC\xdf\xc9\x8d\x05\xe1\xf04\x22mJ \
-yuxYSE'Bi\x8a{\x5c\xcb\x03\xab\xbf\
-k\x91\xe9\xc1\x86\x96}\xf7\x0b<\xc4\xeb/\xcb\xb8#\
-W[\x93\x93\xbc\xb0\x15\x89L\x09\xde\x14\x94\x84X\x01\
-\xe8\xb8\x92\x0e\x99\xfd_\xb9\xe9\xb8s\xe6\xbd\xb1\xe3\xa3\
-\xecv\x7f\xe6\x0d\xf0\xeau\xe3\xf1\xc8*n&\x05\x05\
-\xa4\xb1\xe8E\xe6E\x98\x89\x94\xfa\xc8\x00,\xa5\x02R\
-\xbc\xe8\xad\xaf\xb9}\xc7\xbe\xc1\xb1\xa0\xa4\x8a\xa3\x13\xa2\
-\x15\x8b\x07:\x8cr|\x0d?\x15\x96\x00P\xbc\xf3\xc4\
-\xe10\xe9{\xc3)%\xf0\x1b\x85$\xf0TE\x9ee\
-_\x85\x11\x9c\xda\x9aN\xb5\x03\x18Wo^m\xde\x93\
-\xa2\xa4\xf1x\xe4\xa2`\xa4x+\xd1Ku\xbc\x8e\x04\
-\x0f\xf8\xc0\xa2\x90\xcaOo\xd8\x80}:\x82\xd3\xde\x14\
-\xe6\xfd\x0e(i\xcf\x83\xd95H/8\xec\x8bK\xad\
-\x8b\xacn\xec\xce\x14G\xd3\xe5\xfb\x18f\xa16\x9a\xd8\
-\x9e\x94\x83*+\xda\xbc\xa96\x5cal\x17fwW\
-:\xb5\x93\xa5\xfe\x5cT\xd2L\x8d\xff\x98\xb0\xdf\xd3\xa0\
-\xa4\x85\xe2\xa804LG\x10*\xa3\xcdUcA.\
-\x1c\xd53\x92-=}\xb4\x9d\x016\x1a\xed\xab\x83a\
-\x15~@\x92\xdd\x0b3\xb9\xa2\xf1i]CS\xa1\x92\
-j\x8c\x85\xdc2\x85\xb2\xe7\xf3S\x80\x06\xc92\x1f`\
-\x05\xa4\x97\xd1\xd8\xdc\x86\x8f\x13c'F\xfar\xa7\xa4\
-\x99r\xf8\xf0t/\x85>&\xd5\x01\x91LF\xa8\xee\
-\xa8U\x14X*:\x0aH\x99\x9bp\x13G\xef\xc3\xa9\
-\xc3\xaf\xef(\x97\x1f\xccG\xbe\x16\xb6\xae\xc9\x93\xca\xe4\
-\x17\x03\xf4-\xb0g\x94)\x8e\xa6\xcbd\xc4P\xae<\
-\x22R\xad\xa3\xb9\xea\xc4\x16CZ1\xb987\x85\x03\
-g+\x07r\xc5\x0agL\xa8\xa4\x107[%\xbdf\
-F\x80\xf2\x907QR\xed\xf0\x95j\x8a\xd5\xa7\xdc\x13\
-\xf0\x94t\x14\xb54\x97\xe3\x96xU+N[z=\
-\xcc\x8b\xca\x0d\xc8\xff\xfd\x8f\xc9\xf5Fc\x8f=aE\
-\x99P\xd2%\xc8D\xbb]\x1eP\x04aI\xa8\xa4\x02\
-Skj\xaaF\xa6\x9a\x1fdk\xb9\xd0\xe7\xd6yD\
-\xee{GNI\xffkR&\x10\xff\x89u\xfd\x02\xf5\
-\xe5n\xb9g\x86\xe2=a\x80\x1a%\x1dM\x0e&>\
-\xf3\x91{\xa7\xe6\x8eY\x11\x0eJ\x05xR{\x12\xc1\
-KO\x09\x22\xd5}:\xc2Q\x91~\xbd\x02f\xabv\
-,\x18\xa1\xd7\x03PBz\xed\xc8*iO\x1b\x93\xd1\
-SR\xd2+\xb1_`s\x09\x1c\xc5\x08\x8aHJ\x0f\
-R\xc5\x07b\xb8\x1c<\xeb\xe2x\xc5\xa3?*\x1e9\
-\xbe\xfaM\xc1l\xd7sjQQ\xe7I7u\xb4\xcb\
-\x87\x22\xc9g s\x92\xa1\xdc\x13\x89\xdeQ\xd6Q\xc5\
-R\xd5T\x02n\x1e\xf5T\xac\x1e\xed\x9e\x07}\xc9(\
-\xe4\xb9uwl\xd9z`\x19\xb8\x82O\xe5\xa5\xa4v\
-\xbf\x90\xe5\xbeKP'\xa6?bbj\x9fV>r\
-\xbd\xf3\xa3qC\x11|D\x89\x08M*\x81\x07\xf3\x10\
-\x86\xfa\x06t\xf8{\x9f\xbb\xee:TR\xc2i\x86\xd3\
-\xb6\x8a\xba\x5c{\x0e\xc4\xca}\x96\xbcSRY\xeeA\
-A\x7f\xf5\x94\x96\xc1\xaa\x8d\x97,\xb5\xda\x108\xc7]\
-\x84\xe1\xc0i\xed\x9f\xc0\xd7\x03\xd2\xa8Uc\xc3\x87\x8f\
-6L\x9b\xdbU\xc3Z\x8fc\xec\xb6\x0c\xd1\xedg\xf7\
-\xc1\xea\x9e\xa3\xe8K\xf2\xa4=\xe4'\x5c$s\xc8E\
-m\x9a\xd7\xa2\xbe\xa7\xa6gO\x85\x84O\xa4\xa31O\
-\x81\xab*\xb3C\xb8\x9f~\x0a\xa1\xdd\xd9\x03\x96\x1e\x01\
-87\x01NX\x99\xf6Z\x91\xae\xe9x9=.\xf7\
-\xdd\x0d/\xbf\xec\xd2\x0d\xb0\x80\x9eM\x9c\xdc\xf4\xa0\x9d\
-\xbbM\x8b\xd3\x98R\x1e\xfd\xc6\x1c5\xa0\x98\xa3\x05I\
-\xbe\xda\xb0\xd7\x02}\xd9\x08\x81\x1e\x9c\xa9JV\xd2\xdd\
-\x1d\x09\x9f\xee\xb1\x9d4C\x1e\x96\xda\xce\xac\x92N\xbe\
-\xedp\xd0\xc9\xa9\x7f\xb7HO\x9d4\xea\xb1\xd1\x80l\
-\x15\xedx\x1b<yl=]*\xf1{\xb4@\xfa\xcf\
-]g\x1c\xe5)M\x03\xf4\xccE\x04zU\x1f\xac\xe9\
-\x1d\xc0\x99a!a\xde\xe9\xa0\x935\xb3\xb4\xab\x8c{\
-K\xb3k\x91^\xdc\xef\xb7z\x89\xd2\xb8@\x8cZ\xde\
-\x14T\x04\xa9\xdb5\xaaW/\x03h\xeb\xfa\xd6\xe4\xef\
-\xdfs\xe1\x95\xab\xadcwJ\x0a\x9et\xf5PF\xa7\
-\xb9\xb4n\xa1\xe7\x18j\x22Ae\xdds\x0b-\xa9\x97\
-\xa4g\x8d\xfb\x0e_\xd6&e\xf5\xb9\x1eF\xc7\xc6\x84\
-<\x5c6\x04\xffT\xf4;\xdfpJ\x0a\xd5\x87\xc3a\
-\x98a%c=-\x03G\xc3\xc2\xc0\x5c~\xf6\xdch\
-\xa4\xac\xfb\x8e\x85A\x09n4\x1eW\x91^B\x8b\x02\
-\x1f\xedG\xa5\xed\xe9\xe7\xaf8s\xdbE\xaf\x00\x98\xf9\
-Z\xe2\xc9\xe3\x05:\xd2?\x1b\x81\x92\x8a'\xbd3/\
-\x89V\xcc\xc1\xc0y#z\xf0\xa0@h8\xfb\x96Z\
-9\xcduM\x8e\xffH\xf7\xe3\x8a\xdd\x93\xecs\xb4\xf9\
-\xb5\xdf<\x06\x87{\x9ed\xb0\x1a\x032\xdct\xf3\xd0\
-kL\x96&\x9d\x92\x96\xe4I\xd7u8l\x86<\xf9\
-\xe3K\xb66\xbe\x9e\xfe\xfa\x84\x059\x98)d\x84\xbb\
-T\xf0\xd3\xedDZ\xf4(\xf8\x86JC\x0d\xc1\x04l\
-\xa4\xd1k\xac\xfc\xd7\xfe\xc5`%()FO\xb5\xb5\
-\xec\xb9a\xc5J\xba\xb8\xa9\xc6@\xef\xb5NI\x1a\xd6\
-\x83\xbe\xdd&\x00\xe7]C a\xec\xa8\xe0\xec\xf2\x1f\
-\xb7L\x9f\xb9\x13\x1b\x22\x1d\x15\xb9\x7f\xe8\xa6{&\xbf\
-r\xf5z\xc4\x88\x19\xed\xda:7\xe0^\x8bJ\xea\x22\
-\xd23XIa\xb97\xb4\xe6\xaf\xf7\x96+>\x7f\xbe\
-\x9b\xf7|\xc7\xd0\x85z\x1b>\xf8\xd9}\xfdNQ\xea\
-\x02\xa9\xcb\x9c 0\xd5P\xc5\x94\xb4\xf8\x03\x1d\xbd\xfc\
-\xfeI\x8bn\x13\x951\xf6 \xd2\xd9\x86\xed\xd6\xd8&\
-Jj\xa0\xee\x05%mU\x86x\xb9\x1f\xb1yo\x1c\
-\xb62G\x86\xc9\xfe\xc0\xcc.*\xa8\xa3d\x07D\x9c\
-\xd4sD\x8a\xb4v\xd2\x0f\x11n\x7f|\xd7\xe0=o\
-\xfe!\x00x\xc4\xfa\xfcO$\x95\xd4P\xf9\xdcb@\
-\x07\x863<\xbb\x9f\x07\x93e\xac\x9e\xbc\x17\x9a\xee$\
-k\x0aNe\xf9\x05\xe9\xe8\x05\x9e#\xb9}\xd8o\xe5\
-\x96\x8e\x03\xe1\xcfX\xa4\xc7\x83\x92\x82\xd9\xe7U9\x09\
-\x9e\xd4\xc0\xfc\xfc]#\x0ds\xfe\x8ea\x87\x0b\xb8\xe1\
-\x0coD\x8b\x08\xe3\xde\xbcV(v\xb9\x00\xa8\xbd\xd6\
-\x1e\xcd8\xef\x1e\xce\xe4H_\x83*\x81\x05JJZ\
-\xd9\xeb\x0a`\xf5\xe6\x1b\xbeN\x7f\x8d\xe9\xa1\xd58\x7f\
-\xd3\xce\x00\xa6\x94\xa9\x1c7\xd6\xd3^\xddxx\x7fX\
-\x19/\xf4\x81\x01\xa2\xcb\xcfy\xd3\xed\xae\xa09\xec\xc8\
-_Bp\x07I\x8c\x96\xbe\xda~\x1d\xd6\x03\x9c\x1f%\
-.^\xf8}\xd4\xcf\x87\xf6\x9d\xf6\xee\xdb\xb6?\xfa\xc0\
-\xb0SdD\x96\x95\xc0P\x01\x0a\x0f%$\xd1\x96\x18\
-\x80l\xc5~4\xcaE\x9a-\xd0\xd3O\x0de\x00\xe9\
-\x13\xa0\x09}R\xd2u\x1d\xbbos\xc2\xbc\x94\xe3\xce\
-\x81\xa2\xdd\xcd;v\x15e\x96\xd7T\xd0)K\xa7\xa3\
-j\xfa,\xf1\x14)\xde\x06Ow\x91\xe1\x1c\x15\x9d\x86\
->\x03\x15\x85~\xceTCP\xdc\xb7\xb2\x7f\x1d \xbd\
-\xe9\x8c\xfb\x09&t\xc9\xfd\xcb\x0f\xb6\xec0.\xa8Q\
-\xa3\xbf\xf7J%$\xf5\x0c\x7f\xd9\x93\x22Kc\x1dm\
-y\xc9\xb2\xb6\xfc0(9\x05\x80v\xa4%\xf7\x9b\xa0\
-\xb3\x00\xf4\xc7*s\xb8\xdb\xc2\xbc\xca\x0c\x7f\xaf\xf2<\
-\x18\x94J$GZDM'\x88\xa5\x13)\xf7\xa4\xfb\
-\x89\xc6\xc7\xa3f\xaa<\xb8\xc1\x19\x89\x9e\x8e\x00c\xea\
-\xd4\x96^\x14\x9cS\x8f?p\xc4fS\xfe\x9c\xd1m\
-\x99\x99\x7f\xc9\x9f\xeb\x10\x1dE\xacpu\x0f\x1d\x94\x14\
-*\xb1W\x7f|\xd7\x8au\xee\x11.<\x1eiQ\xfd\
-\xe7\xae\x9ek}\xf9\x18\xc5B\xf3;\x86y\xddl$\
-k\xe3\xd1\x9f\xb0/\xc7\xcd\x1fMo\xdf\x8c=\xb6\xae\
-\x07\xe2C\xc6\xb3\xfe\x92\x1c\xe8\x1d'\x02\xac\xcf\x0ej\
-\xa4\x9b\xd6<d\xb2\xa5U[\x87K\x05\xef\x87k\xd2\
-\xa7B\x01bj\xfeh\xfa\xfcMK\xa7v\x02P~\
-\x18(\xfe\xfd\x95\x1f>\xb6\xedK\xcf\xe2R5;h\
-\xd5L\xa7\x99\xb9\xd4K\x9d\xc2\x95\xf1\xd3'\xacCF\
-fc\x1b\xb4\xa2\xf6\xf6\x06\x99S,\xffp\xd2\xd7\xbb\
-\x9c1\x8f\xfc\x05\xb1\x13\x96\x9c+\xda\x08\xaf\xeat\xa3\
-\xab\xcf\xd9,:o\xc9W\xba\xa7$\x92|\xd8T\xd2\
-\x80\x18\xefx\xc4'\x01F'*=\x01X\xfa\xab\xe0\
-\xf6C\x13\xfa\xcf,q\xe4\xeeP\xf3G\xc5=\x05y\
-H\xbce\x0fJJ\x0c\x1d\xcd\x1efV)\xcdN\xc0\
-*\xfai\x91\x0a\xd4L\xba\xdb\xb3\x8c`\xfe?\xe6\x8f\
-\xaa\xb2\x93\x7f\xb1/e\xa0\xa0\xa4w\xbe{\xe3\xca\x95\
-\xab\xd7\xdd\xbe0\x9c\xe1:\xa9\xae9;\x91\xcb\xb0q\
-\xbd\x85c\xc1\xa2{J\xd9\xfc\xb8^|\xa9>h\x0d\
-E\xa4z26(\xe9\xdd\x9d\xbc\xd1\xe9wf\x1a\xc1\
-\xbc\xe9*\x9a>ko\xe9}Q#\xbc\xc5\xee\x7f\xfd\
-\xf9\xa3\x96Z\x0a\xa5b\xa9 \xad\x9d'\x9d\xf5\x17Q\
-\x9f*,\xe5\x12\xc9f}\xdcD\x8a\x5c\xcd\x12\x83\xa9\
-\xa4-3\x0c\xf30rN\xfbQE\xf53&\xd1\xd9\
-3,\xb8\xfe\x10\x9e\xaf\xafb\xa4\x95\xc6\xa8\x8e\x08e\
-\x8995\xda\xdd\xeb)o\xcd\xf46S\x02\xe96k\
-I\x7f\xdb\x90\xbc><\x80\x810ev{\xd2\xec\x05\
-j<\x22UK>\xfe+\x18a\xb1$m\xfa\xcb-\
-\xd0-\x1d\x84\xa9\xaa\xce\xfc\x87%4KE\xf2\xd8:\
-\xe8\x9dcU\xf3\x9e\xb4\xed\x87\xb2\x8f9J\xf8\xd8\x8e\
-\xf4\xd4\xe1y\xc89^\xf5\xbbW\xdc\x94\xe7\xaa<\xca\
-\xc2\xb7T\x0bW\xd3\xc7W\xe5\xe0\x95f)_\xe3\xfd\
-h2gjDJj=\xe9\x9c\xcd(G\x97\x80\xe4\
-s\x0f$\xf2\x95Q\x8a\xc7\x97M&\xb6z\xff\xef\xdf\
-\xc4\xcd\x8e\x81=\xa5G+D\x03\x7f\x04\xec\x13\xdbd\
-m\x9a\xed\xa7\x8e3Eb\xd7'\x9a2\xf6\xa5lN\
-\x91\xdd\x8f\x9f\xed\xa8\xa2\xd1\xa8\xddQ\xb0\xd6\xf5\xd4h\
-\xe4%y\xa93w%\xfeE!\x0dVO\xf3\xf5T\
-4\xd3\xf3G\xf5!\x0c}\x9e)\xb2%\xbd\xdd\xa0j\
-d\xcfs@2Z\xb3}8C8\x8b\xc4\x80\xbf\x0a\
-\xa7\xb8\x07m\x99\xed\xd0G\xbd\xe4\xfc\xd1C\x8e\xfaJ\
-\xebgn\xb2\xfb\xd1\x08\xaaZ;\x16\x06\xd7\xf7\xf2\xe8\
-(\x9b4:\xa2n\x02GC\x12\xa4@\xbf\xee\xfcQ\
-\xd8d\x8a\xfb\xf0\xc9C1Ks{\xddt\xe4\xbaM\
-&\xc7\xe8\xcb\xdf\xe7\xfa\xbf\xca\xce\xddU\xb2\xac\x0a\xe3\
-\xbe\xea<vu\xdd\xe6\xf6\xbd\xed\x5cT\x1a\xbb\x07\xc4\
-\x99@\xc5i\x1duP&R\x04\x15D\xc4\x89\xd4D\
-\x06\xf1\x89\x184Fb \x9aud$\x18\x0a\xc2\x80\
-\x99h&\x9au\xa0\xe1\x04\x820\xa1\x88\x7f\x83]\xfb\
-|\xac\xc7\xf9\xed%\xed\xa9[u\x1a:Y\xac\xbd\xd7\
-\xf3\xf1\xad\x1d\x95M.\xc9\x22\x8bOx\x5cI\xba\x8f\
-\xe1\x14\xd0D\xc4q\x1e>\x81\x9f\xb9\xbe|\xfb\xf6i\
-\x8e\x86I\x1c\x05\xd4Wk@\xf8\x8b\xb8y\xd6\xd7^\
-\xe1\x8f\x12\xd7\xf3\xc4NW\xf14\x8d\x8a\x5cv2\xe3\
-\xec2\x14\xbe\xce\x9d\xc3\xc0k\xdas\xa7c\x97J=\
-\xd4\xf8\xa3A\x92\x14\x85\x96X\x15\x11\xc8y\x12\xa5\xf6\
-\xc0\x84\xaei\xb0e<we\xc8\xd8RN\x87\x1a\x7f\
-\x94\xe1\xb2\x17\xc2\xe7\x848=\xc7Q\x11\x14nm.\
-\x94\xa0\xae\xa2\xd61\x8a\x08\xf3\xa6\x04D\xe6(\xf1G\
-\x99\x80\xe0p\xbd\xde\xa9\xba\x9cy\xca\x93w(\xaa\xd5\
-&\x99\x9c\xaf\x87\x10\xdf\x05\xc7\xb9\xc6\x1f\xa5\xc2g\xb0\
-\x5c\xef\xaf\xcf\x1be\x06\xb3\x96\x11\x15\xbd\x98a\xe5\x90\
-5\x81\x08k\xac\xf1[\xc8>hM0\x8f\xddKb\
-\x9d\xa5\x9c\xb1n$\xd7\xa7k\x9dX\xce\xd9\x82\xd2t\
-\xf4'xy\xb5\xd2O\x8bM\xdd2q\x0eC|d\
-\xb4\x9c1j\xe8\x91\xf2\x91\xd4\xe3\xe4\xfb\xc7\x19j9\
-\x1d\xce\x82\xbb\xad\x17uYEa8\xf0\xe0\x98\x9e\x8a\
-\x98\x0f\x0b\x86oj\x8e\xa2\xbb]t\xc6\xfc\xc3e\x98\
-\x170\x96Z[\x09\x9a\x86E\xa5\xc8\xb4\x111\x0c\xde\
-\x01,\xb5&T\x1c\xf5\xb3\x9f\x93\xd6\x8f\xdd\xc3\xa2q\
-\xce\x87\xcf\xc7\x85)\xbay\xa2n\x87\x88\xff\xff@\xcf\
-\x92\xa1\xe2\xa4\x84\xdf\x1f\x0d\x87a-W\xf2G\xf2\x1e\
-\x04\x22\xbaf\xf0\xf6$M\x84\xa3\xa2z\x82\x0d\x15G\
-\x01C9\xe7\xe5\x5c@\xff\xc8\x92\x8f\x87\xe0\xed\xba\xa1\
-\xcf\x06\x8f\x9c\xb0g\x85\x8f\xdb\x7f72\x8fI\x8f\x8a\
-\xd2a\xf7\xb0\xa2e\xc1dn\xdc\xc5\xa0%p\x9c1\
-r7\x1ee+\xa6\x18mg\x07\xcd\xa7\x1f\xfd\xdc\xa6\
-\x1d\x9dMt\xaeF\x22`\xde\x00\x00\x11y\x9a\xe3%\
-\xc6L\xbe\xb8>6:R\x8d\xba~\x1a\xe2\xe6\xad\xd6\
-Jv~u\xa9\x82\xa9'P\xaa\xfee\x14\x8e\x13z\
-X\x0dn\x01\x93\xc84\xa1\xcfM\x846\xc5\xa8\xe6'\
-9P\xfd\xe3ns\x95\x7f\xc8`\xa9\xcc\x93\x10B\x8b\
-\xeb:f\xbd3\xa4\xab4\xa8\x9b\xd0\xd6I\xdd\xabQ\
-?\xf6\xed\xcf\xfb\xf1/(K\x05\x84\x92\x18[-6\
-\xa5\xcc\xd3\x84j\xe6\xae\xa3\xbe\xcc\xb6\x87\x11\xf9\xbc\x04\
-\xa2\x04f\x8a\x8f\xf1\x93\x9eg\xc3\xcd\xbb\x94]*:\
-3\x9b\x06\x04\x030\x15\x12z\xf2D\x8d\x9bu&\x9f\
- J:\xf6\xf8C\xf5\x94\x9ed\xe5/\xf3&\x84\xd6\
-\x8f_\x93w\xda\x1c\x19\xb2\xa3M\xa7\xcf\x11F\xfdE\
-\x86\x22\x0a\xd57\x07w7\xd5\xba\x0e\x89|\x9c\xb9\xd3\
-\xa3\x9b\xa97-g[\x0c\xe5-\xce/\xc3\xd4\x8b\xbc\
-:\x0a-\xb6\x04\xa7\x15=\x9e/A\x17\xbe\xff\x13[\
-\xf9\x88S\x03\x99\xcf\xbe\xa8C})O\x92WI!\
-A:*\xdd\x043\x8fMw-\xaf\x91\x9a\x87p:\
-t\x9b\xf5t\xd2\xdc\x85\x1e\xca\xd2`\xbc\xbe\xc4\xc3\xd7\
-\x0c\xa3\x87\xcc\xde\xdf\x1e\x81\xd1G\xbct\x81\x0a5\x11\
-\xf0\xb5^\x7f\x12$\xca^\xe5\xf4M\xa85\xc5\x99P\
-\xfd\xf8H\x8b\x1a\xc7\xa7\x9cv\xf2\x08\x14\x04&\xb6\xba\
-\xc5\x87\xb1G\x8cG<|\xd9y\xf3\x9d0(d\x18\
-\xdem\xca0%\x04\x01\x91\x83\xbf\xaei,\xd8\xeei\
-\xa2\x92c\xeb5\x1e\xfe%\x86\xc1\xa5\xa5\xb2\xa1o>\
-\x1c\x98Wse\xf4~c\xa8\x11I\xc7\x99\x00\x10\x22\
-5\xe9\xd3\x9br\xe3\x95\xd0\x15.\x153agd\xb3\
-\xa5gP\xf8!\x06\xa5\x97\x87d\x9e\xf4\x14\x00U\xe0\
-:\x0d\xf1\xf0\xf3\x9c\x10\xb6\x09\xb5\x16oi#\xfa\xb0\
-R\xf8\x1a\xbc\xc2\x93r\xf8,\x89\xd95\xa5e*\xba\
-\x08\xb9Ud\xd27\x0aR\xf6H\x17\xc7{Z\x85\xf7\
-\x04\xe3t\x91m>\xcf~h?o\xd0\x9bgZ\x14\
-\xa5\xbb\x84\xa14M\xb8\xa3\xf9\xf8\x97\x0a\xefI\xb2$\
-b\xc7\xb5\xd0\xb1\x1eU\x1a\x175\x11o\xd5p\x1a\x13\
-\xdc|\x9b\xc1\xd1\x12\xefI\xc4e\x04-\xc2\x94\xf8\x1f\
-\x8d(\xb3\x8e\x8c\xeb\xb1F\xcc\x912\xe7\x12\xda\xd1\x7f\
-(\xf7\xb1z\xc7\xbc8\xd5h\x8dX bq\xf06\
-\x0c,\xf4\x97\xf0\xb8\xac\x1b\xb5\xdc{\xc3\x12#a\xfb\
-\x81?Y\xe0\xe1\xcfsY\xb2\x8d\x147a,`[\
-\xa8\xb3\xb4\xae\x83\xba\x81\x22\x92\x8e\xe7\x9d\x89\x91Kv\
-\xe6\x0b\x90Yj|\xa5\xef\xec\xed\x0f2\xfb\x9c\xaf\xf7\
-*#Y\xeaZ4RY\x03S\x01&7\x90\x9a\xa4\
-\x9e\xab%Db\xfc[M\x96R\xd3\x93G\xcc<x\
-FM7\xaa.\xb3j\x0b\xa17\xb1WZ\xa7\xd16\
-\x89\xa3~\xfa\xc0 L)GdGQ\x0e\xaf\xd1\x89\
-\xdcufp'i\x0f\x80?\x9d\xa3\x96!]|^\
-=.;[\x17\xc0\xccw\x22\x896\x8e\x06-\x10Z\
-D#\xde[\xc0\xfdL!V\x86\xb5w\xa1\xe7\xe8:\
-\x8a\xb6\x94(}\xa8\x9eN\xf5r\x89\xac\x9f\xb89P\
-\x93\x81S&ru\x8b\xd4\xe2\x9c\xfd!\xa5t\x10+\
-\x9b,\x11(\x15\xdb-=X\x22~\x96\xeeg\xb4\xa2\
-c\xd8\xbc\x18\x82rC\xb0+|\xe3%=R{q\
-\x7f=\x05I\x92\x14H\xc5ZS(|\xc4L\x5c\xcf\
-t\x10S\x9dT\xaaRZ{\x9aP\xc2\xbce\xae6\
-\xf7\x9eh\xea3\x82R\x86\xd2q\xb4L.\xe4\x83\x83\
-?\xdc\x82\x91\xf1\xf0u\xeae\xf3K\xd3\x07K\x9a\xe8\
-\x94d+\xba\xa6\xdc\x83\x9b\xf9%\xd2\x19\x22ez{\
-cl\xe4D!\xedh\xab\xf1\xf0\x93\xc6'\x04D\x94\
-yV\xc3v\x8d\xae\xc0\xcd;\xf1\xd4\x1d\x227\x05v\
-\x93N\xdeb\xa7\xd1R>\xa7\xaf\x9b*z\xf7~\xec\
- Wz\xb4\xde}\xc3\xdc\xd3\xd1\xd4(!jj,\
-\x9d3q\xb1rK\xae\x8a\xa1\xd8d\xfd6\xe7\xa8}\
-P\xb4E$b\xd2\x0f\x8e\xb6\x04\xef\x98\x1b\x9fD\x9f\
-#\xd2)\xf5\xc8E\x9c\xe2*\xf3\x8du\x83\x16\x92\xa3\
-I\xecG\xf9\xf1\xe0.\x03\x13]\x12\xbf\xaeK\x81\x91\
-\xea\xae^\x115E\x97\x84\x96\xc9\x1c\xd2\xa8\xe8\xf3\x1d\
-\xa5\x8a\x02z\xfb\xe2\xc4\xea\xdb\x92\xad\xbf\xb0\x9aH\xb1\
-\xd5\x96{M\x89\x87O\xc1\xf7\xdcc4\xf2\xa2R1\
-\x13\x8f]/\xe6\xf3\x12\xb5\xb1\xe7-\xb5=9\x95\xe3\
-\x94\x0e\xd4h`\xed\x11q=\xe0\xfd&d \xf4\xb2\
-\x95\x91tI\xa3\xa5_\x90\xc5\xa7\xe8\x1b\x1e>\xc5\x09\
-\xc2\xa4\xaf;%J\x91E\xa7\xc49\xba:\x863a\
-\xbc\xb1\xcd\x1aq=\xa4\x89$F\x90\x5c\xa2\xa5\xb6\x94\
-\xd2\x11\x91\xd0\xa5\xbeq\x9d[\x9a\x9c\xa34\xf3\xbc\x9f\
-\x84LL\xdd\xe3\xfa\xc6HD\x1b\xac\x0d\xddO%&\
-c\xa8[OG\xcd#|{VM\x14\xa8\xa4P\xfd\
-au\x99x\xf8\xd5\x96\xe0\xfe\x07'/\x06wc+\
-\x9aj\x22\x5cik\xf24\xdc\xb6\x0e\xb7\x84\xce=C\
-\x12\xd9\xa5(\xf7\xdcg\xdc\x82(e\xfd\xc4\xd0.m\
-\xb8\xd4/\x12\x10\x84\xc2\x07\xa5\xb2\xed\x0d\xbb\xac'\xb2\
-t\xd1o\x10zVmM\xe9\xb3|\x03\x13Z\xf9\xa3\
-\xfa\x83Yr4\xba\x9c\x18\xf7Dn\x0c\xf1\xea&\xc2\
-H-\xb6\x09\xf5/\x9e!\xfahY_n\xc12Y\
-\x85\xd1\xde+j\xa1\x0d+\x1b\xcc\x86\x9a\x19\x85z\x02\
-3\xb9\x8b\x11m\xae&\xf5\x99\xad\xcd\x5c\xbei\xce\x9d\
-\x0f\xab\x1d\xfc(5\x0e\xd3D\xe3\xa97\xf3y\x1c\xbb\
-J\x10\xa4\xf4\x9e$L\xc6IjQ\xe3i\x94\xaa\x8b\
-$R\xceU\xda\xa6\x02\xce\xf7\x08\x5cO\x80\xd4\xd0\x1f\
-M\xe4\xce\x11\xf6\xa59\x81e\xbdV\xa2$\xc6\xc2\xcb\
-c\xf6Iz\x14\x93\xcb\xc1\xc9#G\x13\x9d\x1e-O\
-\x86\xa7\xb2\xae\xa6\xfa\x09\xdd\x0eABt\x07~\x16\x99\
-\x12 \x92Q\x9e\x1c\x1f\x95\x81\xbd\xfa^\x1c\x83\x90\x86\
-\xc9UT\x08\x9a\x197\x81\xd2J=\x1dK\x7f\xd4\x02\
-f8O\xab\xfeB\xe7Kc\xc5\x16#\x18\x00o\xf7\
-\x10\x94G\x7f+I\x92\x91j2o!H\xf4\x9e\xf4\
-q\xc8\x1f\xc7\xf64\xc1\x876\xc5\x8a\x9ee\xc8L\xe6\
-\x9e\xf2%52K\x7f\xd4\x93\x0f\x8c\xeeDi\xd8a\
-\x0eC\x8f\xbd\xf0z\x11\x18\x9dR?:\xfb\xca\x1f\xd5\
-\x91\xfboz$H\x1e\x8c0\xa6O\xf5\xda\x05\xf9f\
-\xb0\x12\xe5\x9b\xa1\x22u`\x15\xab\xdd\xe8\xdf\xc4\xa1t\
-\x86F\xef~\xcd\xc2\x94\xd4=\x15>\xb1\xe6/*\xa7\
-d\x06\xdeS\x1af\x9b\xe2\xc2\xc8\xe4;/F\xa9@\
-\x1dE\xab\x9f?#\xbc\xe0\xe6a\xe76\x1el5\xd5\
-\x17\xc5\x9bH,\xfdQ\xdfk\xeaa\x93\xaaw+\x89\
-\xcc\xb7\x94iG\x90J0_\x17'\x16n%\xf4B\
-O\xcb:t\xb6\xd5\x5c\xd96\xb5\xe2\x92\xa6,>Y\
-Z\xb4\x13U\x0b\xf9\x98\xc9u\xc9\x97\xecO3\x90\xe6\
-\xf3v\x89b\x8a\x11\xd9\xbch\xe9\xf5.=|\x96\x99\
-\xce_:\xf7A\x98\xd8\xeb(A\xd2\x0b+\x1b\xf4f\
-\xad\xc1EI\xe7N\x0f\xbf\x1ac\xac#\x11?\xfa\xcd\
-\xe73^\xea\x92n\xe5\xfa5D\xcb,\x85\x22/^\
-W\x1a|l\x9d\xe5P:zN\x9e\xd7\xee\x82\xd0{\
-vL\xf5\x06\x81M\xafh\x22\x14?\x99\x1cO\xa5\x86\
-\xbah\x9bu\xbd\xe7\xf3y\xf4\x22\xb9pH=\xe1\xbc\
-\x9e\xbf\xc5f\xae\xc3AT\x82\xa9\xa50\x9d\xb0\xd3\xd6\
-\x19\x0a\x15\x15\xf1\xf0'u\xea\xa4LI\x8eA\x1b\x05\
-\xa9\x0f3\xd948i\xd4g4x\x05\xb1\x17C\xe3\
-\xb1\x1f\xa3Q\x8aQ\xe8 \x08\x8dm/\x8d\x93\x0d\xa2\
-\xf6L,-\xbd\xf2\xf8l\xd0\xaa'm\xed\x86\x0e\x02\
-\xe6\x14\x87\x92\xccX\xc4\xb1\x1eg\x9b\x0cs\xd9\xdf\xc6\
-1\xe0\xdf\xfb0\x9b\xd7\xc3n\x1c\x14\x9d\xbehe\x9b\
-\xb0Z\xc0I\x15q\xbew{\xcd+\x8f\xf2\xf0M?\
-\xfd\x83(e\x0e\xaa\xb0L\xd8\xd5!\x99\x02;\xfd-\
-\x8b\x0fy\xf2\x15\xeb\xabF.\xe9\xe3K\x8a\x80\x01\xe1\
-\xe3\xab\x85\x9bw\x0b\xf5zT\xc4\x9c\xd6\xa0\xa4r\xfb\
-plu\xd3\xec2\x5c=\xcd\xb1\x99e*z\x09\x19\
-8\x11R\x83\x1dO\xd4\xf7\xda\x86\xc0\x1c\xbe\xf5\xe6\x89\
-\xab\x1aj\xa1@\xe9\xb3\x1b\x07OC\xebL\x8d\x9b8\
-\x89@\xd1\xaa\x1f\xe6I<\x18A\x12\xd7$I\x13\xc1\
-\x99B\xed\xe4\xca\x90*\xf5\xd2m6c\x9f\xeaz=\
-{_Z\x0c\xed\xf4\xdaiRA@\xf4O\xc6\x1a\x8f\
-uP\x09\x162d\x91N\x17}\xa6\xf2\xf6\xd9\xa7\xf4\
-\xf8\xb9[\xd16d\xc9\xd4\xee\xa6\x1d\xac\xc2\xc5\xe7\xb9\
-\xdb\x86CVmwm\xce\x8cB\x8b\xd1\xe5\x0c\xfbc\
-Bd\xed\x99\xadq\x93\x94\xfa\x07\xd3\xd9\xb3\xda \xcd\
-\xb4\x8cC\xbb\xa2\xdb\xf1\x04A\xaa\xc6\x05L\xf6}(\
-\x10`\x00^\x14\x03\x99\xd6\xf9\x10\x91*\xb8\xdfp\x98\
- \xad\xcaL\xac\x89\xb5\x9c U\x97;\xd5\x93\xad\xeb\
-\x00D\x0d<g\xf8N\xc1\x84\xb2U\xa3\xc6Nc?\
-\x11\xb7H\xcd\xbbY\xf0\x08\x02 @\x15\x0c\x07\x1ao\
-\x194\xf1\xe1(\x1b\xf3\xa3vO\xb3z\x82\xd4\xcf\xc9\
-*%R\xa5E%F\xae\xeb\xdd\x92\xee\xc5\x89O\x9d\
-\xc3\xc7\x0d\x8d\xa4\xb27\x8f&\xb4?\xdb+\xf2S\x13\
-\xd6F$\xe0\xfdJ\x9e\xf2\xe8G\xc0\x89\xb9\x830\xf5\
-\x0e\xa7G\x11\xa8\xb1\xd4\x00jV'\xd5\xc0i\x96\x0b\
-\xec\x0b\x85\x13Z\xdb\xfa\x5c\x0a\x8d\xfe\xfd\xd1\xbb\x5c'\
-\xf3G\x0d\xbc?w\xbc\xad\xc6\xd3e\xd1\xafoB\xe8\
-r\xa4=\xb1\x0b6/\xd7\xc7/7\x8f\x0f\xc1?|\
-\xf2\xca\x8e\x1e\xae\x93d^\xd0DN\xa53\xd4L\xa8\
-\xbc\xfc\xe4\x93\xa2\x7f\xb4\xb8\xa3s\xc2\xf8Br\xdc\xe6\
-B\xd3\xa9\xcf\xee\x8b:\xa9\x01Lg\x7fK\xc3(#\
-\x9e\xaa\x12z\x83\xf2\x0d\xbat\x8aB\x93\xb2\x8f\xec\xd4\
-\xf9\xca\x8f\x1e?~\xed\xe5\xc5\xe4\x9e\xc0y\x0a\x96\x0c\
-+\x13\xe9\xd1\x82\xa3\xa2\xf1d\x14\x02E\x89\x88:\xa2\
-\x90d\xb6\x07\x1dH\xf5\xd1\x9f$\xf9b\xab)\xd1\xdf\
-\xfc\xed\x87/\xbar\x02Ss\xb5\x9eC\xd6\x05J\x09\
-\x98i\xce\xa8\xc5\xf5p\xf5^\x14\xe0\xca\xbb\x9a\xa1\xbe\
-\xf8\xe1?\xf8\xf1\xd3\xff}\xf4o\x07\xad@\xc6\xb9\x9e\
-_\x16\xaa\x06\xac(<''6.\x0a\x86\xa1\xff\x9d\
-\x10G\x9f\xff\x96\xd8\x19\x19\xfaZ\xc7\x8c\xf9\xe4m\xf9\
-\xf5\x00-(\xc6\x05nR\xe5\xee\x84\x0e\xfc\xed'h\
-R!\xb7\xeb\x82\x86@$\x12\xfb\xdbw\xfc\xe5\xf9\x8e\
-\xe8y\x5cD\xa9\xcb\xfdW;\xa1\xef\xbfZ\xcduF\
-\x02\xdf\xffQx\xf8<z\x9c\xbc\x0f\xb3\xa5\xde<_\
-\xd7\xd1\xbf\xebt\xfc\xc2s\x1d\xbb(\xa0\x92\xe9yr\
-\xc6\xb7y\x8a\x09\xd8\xb6\x0d\xacf\xf1yIA'Q\
-5\xd8\x89\x8f\xd5\x5cvI[~\x0c\x90\xec\x8cS\xfa\
-\xbe+\xc5Lk\x90\xa57\xef\xde{\xf4\xdd\x87\xb7\xb5\
-K\x8c~^\x8c\x9a\xa0\x9f\xf6d\x9a\xa4\x0f\xbc\x92\xb6\
-o\xc8\xf5p9Vp:\xba\xdeO\xe6\x81\x0d}\xfd\
-\x9d\x1f\xbb\xba\xdc6\xb0\xe6\x98\x9e%\xc6\x91z*\xba\
-5\x8c\xe4\xfe\xabs\x9f\x82\x9b\x87\xbd7B\xcf\xba\xdf\
-\x11\xe3O\xe2hv\xf2\x0e\x86=Z\x0e6\x80N\xe4\
-\xf0/m\xa7\xed\xf9\xa5\xb1\xab\xfdt\xfd<\xc7\xe9\x1b\
-u\x13\x19\xa9\x1b\x94\xca\xe7\xcf\xb8\xa4w\x88\x9b'\x90\
-T=\x02\x9e\xad\xf3\xa3\x8c\x99\x9cX\x11\xa9Uw\x9a\
-\x0d<\xb2sx\x9a\x94\xca\xcb\x11\x93\xf2\xb9g,\xf9\
-\x17\xae\xbb\xce\xdf\x91\xd9\xa9\x14\xa9\x22\x16L5\x05U\
-\x97\xc1m\x7f\xbdEN\xd8\x10\xac\xbf\xa6+\xd0Y\xeb\
-\xc4\xcas\xfa\xecY\x0d\xbd5\xeb\xe0\xa3\xbd\x17\xa9N\
-'+\xb6d)\xfdQQ:\x1b\xb1E\xb8\xec\xdbW\
-\x9d\xa3q\xc0\xbeC@~\xfb$\x9d_pTk\x82\
-)\xf3\xec\xcb$b\x81O6\x14\xb9q\xff\xb3p9\
-]R\xb9\xcd\xbf\xef&\xe8\xf1/7V\xda\x82\x01\xad\
-gzr\xff\xfc\xda\xc8\x04\x8eR\xe9=#}_\x86\
-\xcb-*{\xe7\xaa\xb3\xd4\xe5\xfeM!\xc1\xfdcR\
-0b\xa4>\xf9\xd5\xe3\xe7\xee\xfd\xf9\xf2\xec@w:\
-\xd9\xe5ZN6\x88\xa5\xd5v&\x90\x1a\x15)\x82&\
-\xa9\xfc7>\xb79'\x9f\xba\xb3K\x92<\xe9\xf0\xc9\
-\xd7gBu\xfaP\xf9~\xf0\xd9\xe5\xbbU\x8e0\xa2\
-]\x83\x86ijPN\xdb5}\xf0h\xc3\xf0\xbe\x8a\
-\x8e\xde\xd9\xcf\xeb\xbb<\xaeWA\xcf\x16\xf9\xd1\xa1q\
-b\xc7[n,aX\x1f\xb2\xb9TN\xdamx\xff\
-l\xd6?\xfe\xd1\xeb[\xb9r\xd7W\x06\xde\xfd\xfeU\
-\xc0\xc3\x87\x19\xad\xb2O\xb0JDn\xcf\xb4\xb6\xd0\x9f\
-\x83+\xaa\xa4x\xeb\xdb\x10\xde\xba\x9a\xbb\xca\x0f\xd2\xf4\
-\x9d\x8e]{[\x10\xde\x05\x9aJ\x91\x1f%\x84Vt\
-\xf6\x98\xc3M;\xf6]\xeaW1u;\xfe\xb7wB\
-\x8fN\xa6H\xfdW\x87\xf4?\x9ei\xce3bz\xa1\
-\x0eZ\x83P\xce\x9e,+\x0ab~\xf4\x91\xa5\x0e\x01\
-q\xbe\x96\xafo\xe6^\xc6\xde\x95\xfd\xd9\x14\xfc\xf5\xba\
-Sg\xe1\x1d*#\xbe\xc6\x1c`\x15\xd1\xdc\xcf\x97\x12\
-%\xe4\x1d\xf3*cS\xa2~\xf4a\x8d\xd4\x06\xa6+\
-\xf84'\xf5\xef\xe7E\xc5W\xb6\xbf\xbeh(\xe1\x15\
-\xe5\x1d\xe5\x16\x0c\xc2\xd4\xe4\xfd\xf5\xceP\x1d}[\xe5\
-\x93~\xedZ%F\x0f\x95\xcf\x8b\xc1~~[\x10\xa4\
-\x16\x86d\xe7\xbe\x94\xfa\xec\x95\xd8\xfez\xd1(j\xeb\
-\xfd\xf5Y\xdb\x0bO\xa7\x9b\xfb{/M9A\xda\xf7\
-Y\xde\xbd>:\xa8\x0a\xfd\xe6\x90\x1f\xad\x11]\xad\xb4\
-\xb8\xed\xb5e!\xbc\xa58\x94\xfdY\x0e:\xfcG\xbf\
-\xa4\xcb\xea\x0a\xff\xe9\xde\x89\x0f\x5c\xb7\x8d\xcc\x03\xda2\
-U\xb1\xf7KJ$B\x7fr`\x8f&B\xee\xaf\x0f\
-\xcd\xd8\x01\xa1F\x97t\xd9Y\xd0W\xcf\xdb>\xcc'\
-Y\x08\xa8R\xcf\xdf\x88J\x0c\x0d\x140J\xd8_O\
-\xb8\xc4\xad\xd9\xf5g}3\xe9\xbe\x17\xff\xd5M\x8b\xca\
-\x85\xaa\x0a8,/K\x98\x88\xf4\x95\xb1\xde\x9c\xa5\xd8\
-_\x9f\xf7\x19{ks\xfbb\xdf\xd4\xb3\xbb\xa4\xcb\xfd\
-\x9f\xber=\x8b\xc8C\x17}\xd8\xa4z\xe6\x0e\xf1\x92\
-\x1f=\x19\x8a\xfd\xf5\xc0\xa0T&\xf7\xcb}c\xd4$\
-,%O\xe3\x9e\x8e\x9b?\xea\xd0\xd84\xa0\xb5z\xc2\
-%\x1d.b\x8cft2\xf34e\x85\xbf\xa1g\xbd\
-\xdc\xf7\xb1}\xe3\x13\x93\xc8\x0c\xb3\x96\xf2\x9b\xe5\x90p\
-\xc2\x1eW\xd48\x0a\xa0\x0a'\x96R/e\xaf7\xe2\
-z\x81}\xb5\x17\xde\xbb9O\xec&2\xf7~9\x14\
-\x08\x10\xfe\xad'\x1b\xc8T\x91\xea\xd9f\xdb_\xcf\xb8\
-\xde7\xc5>\xe8\xa0\xbf\x1f|x\xb2FR/7x\
-\x1c\xd2\xcf~!\xe0tQ\xaf\xd7J\x99\xb2^\xaf\xdf\
-\x96\xf2\xa3d\xa8\x88\xdc\x08]\x9e\xee\xdd\xbd\xfb\x9e\x87\
-w\xf63-\x87\x0b\x0b\x99\x95.\xa1\x83W!\xa8\xd1\
-\xbbwy*\xbb\xde\x9a-\x8d\xcc\xf4\x1a\xee\xc7\x1b\x1f\
-y\xe5\xa5\xab\x93\xcd\xb0\xe6\xda\x9d\x09\x13\x8ch\xbc\xa8\
-\xe0(S%\xe8}\x81\x9f\x97[\xf3\xe6\xec:o\x95\
-\xdbi\xb6>g>Z{\x84\xe6\xf6\xac\xed\x19\xd7W\
-hO\xe8x\xd3\xd1cD,Y\xfb\xb8\xc0Z\xe5p\
-\xcc\x09m\x17\x94\xaa\x09\xa1\x1d\xd4\x13\xbd\xd1\xf3\x0b\xf5\
-\xfa\xc9\xea\xf5\xc3\xb8I\x97t\xe9o+\x80K\x91\xaa\
-\x06*;\xdf\xdf\x1e\xdc\xb1\x7f\x94\x8d\xae'H<V\
-\xdf\x8c\xb3\xf8z\xed\xa2z\x81P\x12\xa4\xc4\x9b\xb1\xad\
-Q\x0b\xde=\xfaG\x11\xd7\xbb\x22\xd5\x9b0\x10\xaa\xd1\
-\xbb\xcc\x03\xafB\xca)\xf6\x93\x8d\xc8\x5c\xa4\x97:\x8f\
-+\xe4a\xdeQ\x1f\x0aM4\x8a\xaf|\x9a\xb3s\x10\
-\xd37l\xd8\xef\xa6?\xe3d\x02\x94\x0aS\x8c\xbbz\
-\xfd\x8dz\xf3(N\xf2E:\xd1(4X\x06\xdf\xc4\
-){\xf8\x19\xef)\xc6L\x89`\xb4\xe1G\xc7\x84\x92\
-\xcf\x04\xae\x11\xeb\x1b\x04\x81\x9bgNI\xd1?*\x86\
-\xb6\x90 e\x87\xd6R\xb0t\x1c\x86\x9eP\xbdqE\
-\x0f\xa7\xc4M\xe9\xe4\x0e~\x1e\x10\xd2K\xd8\xfd\xfd\xe3\
-4\x9a0\xd9\xe1\x8f\xd3\x8e\xa0S\x1c-\xea\xf5C\xa7\
-D1\x9d\xcf\xd7O\xec\x1f\x8d\xa8d\xaeG\xe3@K\
-H\x8b/5\x92\xf3.\x5c>\x0d\xc1\x89R\xc0LL\
-2\xd9N\xf0\xb4\x13\x9ag\xc4x\xf4\xe5\x8c\x98\x0e\xbe\
-\x1c\xc1\x18\x91Yx\xa4V\x06\xf7\xfd\xf5l\xcc\x14\xa9\
-\x00\x9c\xde\xcd\x88\x1dF\xb4\xa6\x81\xa6\x1aZ\xc1\x13y\
-\x9cg\x9a\xbcV\x1b\x00\xc9&\x00+D\xa9O\x11\x93\
-\x84\x88P\xa9\xc4r\x05?\xb1\xc4<\xdf\xd4\xc2.\xb9\
-c\x929*\xe2\xd4Q&\xb6\x8a\xd6tE\x87 \x84\
-.\xf8\xcf\x84\xa5C\xa4'$ L\x8a\xe6V\xf7\x8f\
-\xb6\x15\xe3\x02\xd4\xa2\xba\xa8\x98b$O}\xb1)E\
-\x89q}\x8b\x80\x9e\x04\xcd\x0b\xe0\xf2\xba\x02\x9c\x0a\x15\
-\x1e\xba\x1c\xe7q\x11<N_qUlvD\xeb\xdd\
-\x22-\xc3)\x0d13\xc3\xdc\x95\xaaw\xf4GGF\
-\xd4\xefgQ\xb9\xf3\xb3\xa7a\xd2'\xb1\xd5\xef\xa8S\
-\xba\xa4\xaf\x9c'\xb1\x14\xfeh6\x9f\x85\x22e\x92\x0c\
-\x91\x08,S\xc2\xcd\xf3;\x9a\x06m\xd9?\xba\xec\xfb\
-\xb1\x13\x0a\xa1B&\xf8\xa3\xe5\xaaX\x1a&#\x15\xfe\
-h\x86Nk-a+,\xa1\x7f\xd4\xf9\xe9\x98d\x19\
-\xfeEI\x12\xfa\xa3Y;]@=9\xb1(\x8bP\
-C!W\x82\xfeQq\xd6\xb9\x19}\xbc\x94\x1f]\xea\
-\xfe\xd1\x0b\xa8\xa7*\xa8\xd7\xf1\xc7\x00\x14\xf50Y\xfb\
-\x0c\xfe\xe1\xa3\xe0\xfa\xb8\xd8g\x8c7P\xc9\xfc(\xd1\
-2Y\xc0\x01?\x89\xeaIP2\xfd\x09:\x8d\x8f\x1b\
-'\xce\xdc\xb9\x09\xc5\xe3\xf3\xab\x1c\x06g\x18\xea\xb8y\
-\xfabg\xc3\x1a\x9e\x86V\xb2CFJ\xa5\x9fW?\
-^j\xe0\xba\x0evg\x05\xdc<\x22xc\x81\x5c\x08\
-AE\xa5\xda4\xf4A\xc8L\x05Z\x17m\xe9\x98\x88\
-d\x8e\xb2\xc9\xbf\x07G\x8dTj\xa7\xc3\x12\xd6p\x16\
->~\xf1p\xa3-\x87\x03yG\xcd\x86N\xe1\x9b9\
-\xba\xed\x0c\x15K9\xd6Ph{\xf0\x14cB\x99N\
-h|\xb1Rb\xeft\x22\x8b\xbb\x8aRUn0\xdd\
-\xb0\x1b\x0c\x1d\xfa\xce\xd5\xd1\x0fL\x93(\x06\xad1I\
-6\x8fQ\x9c]\x94V\xd8P\x15\x16\xb1\xa3\xc7\x98\x09\
-\x93\xf4\xac\xc0\xfd<})Q\x8e\x83w*\x9d\xa3\xb6\
-\xf4\x88\xa0\x1a\xfe\xa1\xbe/9\xfa_\xc1*\xd8\xa0\xc5\
-Q\x93\x08\x00\x00\x00\x00IEND\xaeB`\x82\
-\x00\x00\x06S\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00@\x00\x00\x00@\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
-\x00\x00\x02\xebPLTE\x00\x00\x00\xff\x00\x00\xff\xff\
-\xff\xff\xff\xff\xbf\x00\x00\xff\xff\xff\xcc\x00\x00\xff\xff\xff\
-\xdf\x00\x00\xe2\x00\x00\xe5\x00\x00\xff\xff\xff\xe7\x00\x00\xff\
-\xff\xff\xd4\x00\x00\xff\xff\xff\xd7\x00\x00\xda\x12\x12\xff\xff\
-\xff\xdd\x00\x00\xe4\x00\x00\xff\xff\xff\xff\xff\xff\xda\x00\x00\
-\xff\xff\xff\xdc\x00\x00\xe2\x00\x00\xff\xff\xff\xda\x00\x00\xff\
-\xff\xff\xdb\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-\xff\xdc\x00\x00\xde\x00\x00\xe4GG\xff\xff\xff\xff\xff\xff\
-\xdc\x00\x00\xdd\x00\x00\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xdd\
-\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\xff\xdd\x00\x00\xfa\xd5\
-\xd5\xff\xff\xff\xff\xff\xff\xe488\xdd\x00\x00\xff\xff\xff\
-\xff\xff\xff\xff\xff\xff\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xdf\
-\x00\x00\xdd\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xdd\x00\
-\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-\xde\x00\x00\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xebpp\xdd\
-\x00\x00\xe0\x02\x02\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\
-\xff\xf0\x8c\x8c\xde\x00\x00\xff\xff\xff\xdf\x00\x00\xff\xff\xff\
-\xdf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xde\x00\x00\xff\
-\xff\xff\xecuu\xdf\x00\x00\xe8QQ\xde\x00\x00\xf9\xdc\
-\xdc\xff\xff\xff\xde\x00\x00\xdf\x00\x00\xff\xff\xff\xde\x00\x00\
-\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xf5\xb2\xb2\xff\
-\xff\xff\xdf\x00\x00\xff\xff\xff\xdf\x00\x00\xdf\x00\x00\xde\x00\
-\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xedqq\
-\xde\x00\x00\xff\xff\xff\xe3''\xde\x00\x00\xde\x00\x00\xfd\
-\xf4\xf4\xf0\x87\x87\xff\xff\xff\xff\xff\xff\xe3$$\xff\xff\
-\xff\xe3\x1f\x1f\xff\xff\xff\xfa\xd9\xd9\xff\xff\xff\xe2\x1a\x1a\
-\xdf\x00\x00\xde\x00\x00\xde\x00\x00\xff\xff\xff\xff\xff\xff\xdf\
-\x00\x00\xde\x00\x00\xea\x5c\x5c\xff\xff\xff\xe2\x1b\x1b\xe0\x0a\
-\x0a\xdf\x03\x03\xde\x00\x00\xff\xff\xff\xff\xff\xff\xde\x02\x02\
-\xff\xff\xff\xdf\x02\x02\xff\xff\xff\xff\xff\xff\xebcc\xdf\
-\x00\x00\xdf\x01\x01\xff\xff\xff\xdf\x00\x00\xe0\x08\x08\xde\x00\
-\x00\xff\xff\xff\xecmm\xde\x00\x00\xe1\x10\x10\xf4\xae\xae\
-\xdf\x00\x00\xdf\x00\x00\xff\xff\xff\xff\xff\xff\xf6\xbd\xbd\xfd\
-\xf4\xf4\xdf\x00\x00\xde\x00\x00\xe3\x22\x22\xf6\xc1\xc1\xff\xff\
-\xff\xe9ZZ\xf0\x8b\x8b\xff\xff\xff\xdf\x00\x00\xff\xff\xff\
-\xe3\x22\x22\xdf\x01\x01\xe522\xe8HH\xf6\xb7\xb7\xfc\
-\xea\xea\xfd\xf0\xf0\xfd\xf2\xf2\xff\xfe\xfe\xdf\x02\x02\xe9L\
-L\xe2\x1a\x1a\xe0\x04\x04\xe4&&\xe4''\xe0\x05\x05\
-\xe533\xe655\xe6;;\xe7>>\xe8DD\xe0\
-\x06\x06\xe2\x19\x19\xe9OO\xe9RR\xeaWW\xeaX\
-X\xeaYY\xebaa\xebbb\xecff\xecjj\
-\xeett\xeeuu\xee{{\xef~~\xef\x81\x81\xf1\
-\x8f\x8f\xf3\x9e\x9e\xf3\x9f\x9f\xf3\xa2\xa2\xf4\xaa\xaa\xf4\xab\
-\xab\xf5\xb0\xb0\xf5\xb1\xb1\xf6\xb4\xb4\xe0\x09\x09\xf7\xbe\xbe\
-\xf8\xc4\xc4\xf9\xd0\xd0\xfa\xd4\xd4\xfa\xd5\xd5\xfa\xdb\xdb\xfb\
-\xde\xde\xfb\xe0\xe0\xfc\xe4\xe4\xe0\x0b\x0b\xfd\xec\xec\xe1\x0e\
-\x0e\xe2\x15\x15\xfe\xf7\xf7\xfe\xfb\xfb\xff\xfc\xfc\xe2\x16\x16\
-\xe2\x17\x17f\xeer`\x00\x00\x00\xb6tRNS\x00\
-\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
-\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
-!$%''*+,-./2669;\
-<=@ADEHKLMNOPTTU\
-Z\x5c]]`acegghkllmp\
-qsx|~\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
-\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
-\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
-\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
-\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
-\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
-\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02aIDA\
-Tx^\xdd\xd7Up\x13Q\x14\xc7\xe1\xd3R(\xda\
-B\xf1\xe2^\xdc[(\x10\xdc\xdd\xdd\xdd\x0aE\x8a\xb4\
-\xb8{p)^$P\xa0\xe8\xd9\xa4*\xb8\xbb\xbb\xbb\
-\xeb#\x93=w\xee\xcb\xe6f\x98\x93\x17\xa6\xbf\xd7\xff\
-\xe6\x9b}\xc8\x9c\x99\x85\x14R\xfaR9]\xfa\xf9\x80\
-(\xc4\x95A&60\x10\xa9\x19\xd9x\x80\xc7N\x14\
-\xed\xaa\xca\x02r\xa3\xec`%\x96\xb0\x1ee\x1b3p\
-\x80\xfa6\x09\xd8F\x00\xa7^\x17\xbe\xa0\xe8h\x19\x96\
-P}\xca\xeeh\x02\xae\xb6\x03^\x9e}\x08\xb0\x8e\x02\
-fE\x098a\xe6\x02y\x05\x10\xf9?\x03n.\x01\
-%G/9\xb0*4\x90\x0d4\x8f\xa2}2\x13\xf0\
-\xb3\xa0h*\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80u\
-<\x0b\xe8-\x81sf\x16`\x92\xc0\xdd\xe9\x0a\xc0\xd7\
-)\xe06\x0b)k|7\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
-,\xcb.\xda\xe7+\x1f\xcd>\xa0h3\x09\x87\x147\
-\xc9\xbb\xdf\xbeG\xb1\x9f\xb4q\x85@\xd5B\x02bZ\
-\xa8\xfe\xb19*7\x0a(\x08\xea\xc2P\xb4\xa2\x95\x17\
-p\xaa\x85\xb2m\xc5X\xc2<\x94\xed\xc8\xc7\x01\xca\xa2\
-,\xb9'\x07\xe8\x81\xb2\x9b!\x0c\xc0o\x8f\x04l\xaf\
-\x870\x80`\x14\xe1\x9f'\xc7\xaa0\x80\xf9\x04\x1c\xbf\
-\xf7.q]\x03`\xb4\x89\x80\x17\xab\xbb\x96p\x07F\
-Y\x91\x8a\xab\xe1\xe2U\xd6r9\x9c\xfd\xbb\x88\x9a2\
-\x8fj(\x8a&4c\x01^\x16\xa4N\xfdl\xcc\x02\
-\x02Q\xf4tQj\x16\xd0\x17\xa9\xe8\xc4:\xc0\x02\x96\
-\x22\x15;\xd7\x9d\x05\x14A\xea\xbc\x16\x00,\xa05R\
-o\xa6\x01\x0f\x98Hc\xb2V\x81\x07\xa4\xddN\x17\xfb\
-m\x08\xf0\x00\x7f\xda\xae\x1f.\x0d\xea\xca\x13\xf0*R\
-yjN\x7f\x18\x0eN\xea@\xc0\xd9\x080\xb6@\x9f\
-n\xed-\xac\x04|\xeb\x05o%\xe0\xf6L\xe3\x9a\x9f\
-\xde\xed\xf3 P\x949\x08e\x8f\xfb\x1b\xf7&\xfar\
-'\x22\x8f\x0a\x18\x8c\xb2\xefq\x0d\x8d\xfb\x18\xfb\xf2\xed\
-kwP\x94\xc6\x82\xb2g\xe1\xc6s\xe0\xa1\xdf\xaa\x07\
-[\xb2\xff\xc3\xf7\xc25\xad\xb6q\xaf\xa8\xbfZBG\
-P\xb6\x16E7\x12F\x82\xb1\xb6\xf6\xe9a\xb8\xb7\x1a\
-0%\xe9\xc0\xef\xe7\xdaPGO\xb5D\xc4\x93?\xda\
-\x80\x93\xda\x1f9\x13s\xffe\xfc\x86\x9a\x0e\xd7\x8c\xcb\
-\xf1\xd2\xfb\xc5\x9e\xe0\xacr\xc3fO\xea\x5c\xcdG\xb1\
-f\x9a\xf3kMqp\xa9\x02\xa9 %\xf7\x17\x09\xba\
-99\xea\xb1au\x00\x00\x00\x00IEND\xaeB\
-`\x82\
-\x00\x00X2\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\xdc\x00\x00\x01|\x08\x06\x00\x00\x00\xa41\xd5\xdb\
-\x00\x00W\xf9IDATx^\xec\xdd\xc1KUi\
-\x18\xc7\xf1\xdf\xb9\xd7\xeb\x95\x0b\x95a\x10:\xad$P\
-P\x08\x12\x0aqV!\x83%H\x10\x11-lQ\x11\
-B\x81\x04\xddjF\xbc\xaf`P\xa3\xb6(\x89 r\
-q!\x5c\xb4\x90\xac\x08\x936\xcd\xb4r\x06#b\x86\
-\x1a7R\xdc\xc8\x82\xb1\xc2l\x91\xf2\xf4l\x82\x10\xbc\
-HYi~?\xf0\xe5\xf9\x0b~\xbc\x8b\xb38\xfa\x11\
-\x00\x00\x00\x00\x00\x00\x00\x00\x82\xf4\x8b\xb7Cy\x001\
-}\x11\x9c\x94\xd6\x06\xa9_\xd2\xed\xa8\xa0\xa0E_\x0f\
-\x18\x1c\xafZRzh\xd2\x9e\x9f\xb6n\x1dJOL\
-<0\xb3\x94\xe6\x01\x14\xe8s0\xb4\x94I\xbfK:\
-\x1cO$&\xea\xbb\xbb\xfbj[[\x9fJ\xba\xeb\xbd\
-\xd3\xa2\x01\x18\xdb\x16\xef\x91g\xbd\x15\x15\x7fL\x8e\x8f\
-\x9f6\xb3\xc3^\x99\x16\x07\x80CR\x22H\x1d\x19\xe9\
-}G,69|\xfcx\xd6\xcc\x82\xb7\xdd+\xf8d\
-\x90E\xde!\xafr\xb7\x14\xf7;\xe4\x1d\xd3\xc2\x00\x08\
-R\xa57\xe2YOi\xe9\xdf\xb9\xd1\xd1\xb3fv\xd4\
-+\xd7\x1c\xbfJ\xeb\x834\x15\xa2\xe8IF\xea\x0c\x92\
-\xf5\xd5\xd5uiA\x00\xc6v\xd0\x9b\xf6\x01M\x0f4\
-7_\x9d\x9d\x9d\xed0\xb3]^\x91\xe6q\xa7\xad\xad\
-\xcb_\xc1\x99 Yg2\xf9\xf6\xbf[\xb7\xbaB\x08\
-1\xe5\x07\xc0\x87v\xfdLI\xc9\xfd\xb1\xe1\xe1sf\
-v\xc2\xabV\x1e\xedR\xcd\xa9T\xea^\x90lN7\
-\x95\x1f\x003\xab\xf1\x82\xd7\xec\xadV~\xcaH\x17}\
-\xa4S\x17\xaa\xaa\xfe\x0a\x92]\xae\xad\xbd\xdf\xdf\xd4t\
-c`\xdf\xbe\x1e3K(/\xf0Y\x00\x8f\xbd\x97Q\
-\x14=\xd1\x02\x1c\x18\x19\xe9.\xdb\xb4\xe9\xc5\x9b\x5c.\
-q\xbe\xbc\xbc&Y\x5c\xfcz\xef\xe0\xe0\xa0\xa4Bo\
-\x95\xf7\xbfV,DZT0\xb3\xa4\xa4jo,[\
-_\x9f\xdd\xd8\xd0\x90\xfb9\x9d>\xa2\xaf\x0e`|\xdb\
-\xbc\x16}\x13\x00\x83\x8b\xb4R\x01\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf8\
-G\x1f\x80\x8c\xd4\x16\xa4W~\xc3\xca\x18\x1eb\xfan\
-\xb0z\xc3\x86\x7f$\xad\x89EQ&#\xdd\x0bR\x8b\
-\x96\x130\xb8 \x15\xfe&\x95j\x19\x98z\xfe\xfcH\
-,\x1e\x9f)\xdd\xbc\xf9\xdf\xd4\xbau%Q\x14\xf5\x06\
-ig\xbbT\xb7[\x8ak)\x022R:H]\x92\
-\x22\xbf\x97\xbcgZ\xe2\x82\xd4\xe4\xd9\x95\xc6\xc6?\xcd\
-,\x5c\xdb\xbf\x7f(H\xf6\xb1\x8c\x94\xd5R\x04|h\
-\xef*\xa0\xaa\xca\xda\xf6\xbe\xa2\x82\xd9\x1d`\x8c\x9dc\
-\x8d\xdd\xdd9\xea\x98c\xd7\xd8\x8d\x88\x08\x16\x12ba\
-\xa0\x98\x01\x82\x8d\x05\x82\x01\x8a\x8aXX\x18\x08b\x22\
-) \xa1\xf2?\xef]\xfb\xacu\xbf\xfb\xe3\xcc\xe0\x10\
-\xd7\x99\xf7Y\xebY\x87\xb3\xcfa>\xef\xb7y\xef\xde\
-\xfb\x8d\xe7]\x96#\xc7z\xf9Gz\x08\xd7\xaf\x1bk\
-\xd5\xa2?\xe2\xc2:jhy\xc1\xc9`\xa0y\xae\x5c\
-Q\xd1\xaf^\x99{[ZV\x82\x81\x85\xad.Z\xf4\
-\xbd\xfb\x82\x05\x07\xb66n\xecKF\xb7,g\xce\xea\
-B\xd7\xc0`\xc4\x85\x855\xb4.S\xe6\x95\xb2:\xec\
-\xeb\xd1\xc3{G\xdb\xb6\xddt\xd4\xe0\x9a\xc0\xb8\xbe\x90\
-A\xed\xea\xd0\xc1\x17\xab[\x07\xdc\xdb\xd2\xfd\x15[\xdb\
-=\xb8\x1f\xb3\xaej\xd5\xeb\xa6*\xd5\xd7\xd7\xfe\xfe\xad\
-1^\x07\xdcm\x22DO\xc1`\xe8\xc0\x8a\xf1\x13V\
-\x87[\xd2\xd8\xb4\xf9\x93\xd0A\x5c\xb5\xb5]gU\xaa\
-\xd4\x9b5\xa5J\x85Z\x97-[\x1b\x06\x95\xb4\xbez\
-\xf5\x070\xb6)f\xfa\xfam\xc9\xf8\xb6\xb7h\xe1\x8f\
-\xfb\xe6x\xd6Pc\x9bi/\xb2\x12\x0cv\x9a|\x11\
-\x22Wv}\xfdl?u\xe9\xe2\x9a\xa7X\xb1\xb0|\
-\xa5K\xbf\x1d\xe4\xea\xba\xb9\xd7\xf6\xed\x9b\xe6DD\xe4\
-\x12:\x88&3fl\x9d\xf1\xf2\xa5\xed\x8c\xe7\xcf\x1d\
-\x12\xa2\xa3\xcd1\x94#o\xc9\x92q1aa\xee_\
-\x13\x13\xad\xb3\xe5\xc8\xf1\xa9\xfb\xa6M\x1e\x18\x7f\x96\xb7\
-D\x89\x10\x01\xe4)^<\xac\xec/\xbf\xe4\x81\x11\xaa\
-\xe7,\xcb\x9c*\x0c\x06V\x82\xd9\xe0\xc2\x0d5j\xf8\
-\xaf\xc8\x9f?\x1a\xf7]\xc0\xbe`\xa5\xbfX\x1d\xaba\
-\xd5p\xc4\xb5I\x16\xfc\x9bs\x81\xb5.YYU\xd9\
-\xd3\xa5\x8b\xb7\xf3\xc0\x81G\xb0\x82\x8d\xa3\x95\xccu\xe8\
-Pw<\xeb%W\xf0\xf24vh\xd0\xa0\xf3\x18[\
-\x02\x16\xc1\xbd3\x9d\xf9\xc0IY\x11\xbfc\xb0\xc1\x15\
-\x02sz,\x5c8\xe0\xc6\x96-\x8e\xb8/+\xfe\x1c\
-\xe4\xcd\x9c\x06\xc6\xe3\xac\x14\xbb\xbdy\xf3_\xb3\xf0\xdf\
-^\x18\x1c\x06\x1a\xc3\x89\xe2D\xc6e_\xaf\xde]\xdc\
-\xe7\x95\x06W\x8b\xc6\x5c~\xfb\xed0\xc6r\x90\x81\xad\
-,Xp\xab\xc66s\x8a\xc8\x220\xd8\xf0\xf2\xc9?\
-\xde\xc2\x7f\xb2\xaa\x95\xc5\xca\xe0\x8ek\xca\xca\xc2\x85\x03\
-\x9e_\xb8`\x8b\xf7G\xea\xc0*\x9d\x13\xac\xe3\xbf}\
-\xfb\xf6\x9b\xdb\xb6Y\xe2>\xbb\x00L\x84hJ\x86u\
-t\xec\xd8=\x8b\x85\xa8\x0d\x03\xf3\xa1{r\x12\x9d\x9a\
-1\xe3\xd8\xfd#G\x86\xcb\xcf\xe3\x02V\x14:\x04\x06\
-\xc7\xeb\x86\x82\x91\xe4\xa4\xd8\xdf\xb3\xe7\x91\xe4\xc4D3\
-\x18\xdbo`^\x1dY\xa9\xf5\xc0\xa6\xe0\x100\x874\
-\xb8\x8ed`p\xb0<\xc15i\xa9J\x15w\xb0_\
-?\xe7\xe4O\x9f\xe8\xdf>\x09\xecb\xae\xaf\xef+W\
-\xbb\x8f\xb8V\x11Y\x09\x06c\x81\x10E`h\xea\xed\
-\x9aE\xee\xdc\xcf\x03\x9c\x9c6\xc2\xc8\x16\x81\x0d\x85\x8e\
-a\xa1\x10\xc5\xb0\x92U\xd7X\x91'*\xdb\xc75%\
-K\xde|\xe1\xedM+\xf2\x02\xb0\x11\xa8\x12\x80\xb9\x81\
-\xc1\xdbU\x85\x0bG8\x0d\x18p\xea\xd1\x993\xd5D\
-\x16\x82\xc1a\x83.06\x8a\xd1}\xdd\xf6\xcb/g\
-\xe2\xc2\xc3-(\xd6\xa5\xc3\x81q\x17\xf03\xb8\x19\xdc\
-D1;\x9c\xedb\xdd\xe7\xcfw\xa5\x8c\x14p\x10\x98\
-O\xe3\xfd\x1a`\x0a\x1c/W.-_\xbeme\xa1\
-B7\xe4\xd6\xd3\x09\xf4\xa1-\xe9\xb7R\xe0Dz\x81\
-\xc1\x98\x0dO:\xfd\xc1\x82_\x91\x89\xf2\xe6\xea\xda\xb5\
-\xdb`d&`+Pg\xc3!^\xa6\xa6\xf5\x90)\
-\xe3\xaf\xacj\xcb\xf3\xe6}\xf3\xe1\xf1\xe3\xd50\xb2Y\
-`\xf5T\xb6\xc9\xb3\xe9\xbd\x0d\xd5\xab?\x96\x86\x9a\xb2\
-\xb2H\x91)\xab\x8a\x165\xa1q2\xd8\xd4\x82\xe6x\
-\xe6\x09\xee\x98/D\x01\xc1`\xfc\xd3m\x19\xa5N\x81\
-)\xc8\xda\xb8\x1c\xf9\xe2\xc5J\x0a*\x83\xa5\x7f\x10\xc7\
-\xcfx\xf2\xb6Z\x95.\xfd\x86Vf\x04\xca\xa7a\xcc\
-@\xa4\x02xY=\x14\xe34\xcb\x91#\x96\xae\xa7\xa7\
-O\xdf\x82\xb4\xb0\x17\xb8O\xda\xdd\xa9\xd3\xe5\x8b\x16\x16\
-\xbd5\xd2\xcar\x92\x91-\xd3\xd7\xf7\xc1\xf6:\xc8q\
-\xe4H\x03\xf1\x0f\xc1\xe0m\xa4\xc1\x8a\x02\x05\xce!L\
-\xb0Sn\xc3\xba\x82\xd9\x7f o\xab\x0a\xac\x9f\x94\x90\
-0\xef\x99\xa7\xe7:r\xa4|\xebs\xc2\xe0\x12\xd4\xe9\
-l\xdd\xbb{\xef\xea\xd4I\xed<\xc1\x99.\x0a\xce\x95\
-\xc4+66\x8e\xf2\xbc\xd7_\xbe\x7f\x17+^\x108\
-099\xb9\xdf\xdb\x80\x805\xf4\xbf#\x18\x8ctX\
-)\x86\x833\xc1\x8a?\xf0g0\x00[\xff\xd9\xca\xec\
-\xbep\xe1\xcc\xf3&&\x87\xf0\xceb8U\xae\x92\xc1\
--\xcd\x96\xed\xf3\xc5\xe5\xcbwcl\x9a\xe6y\xcf\xa1\
-y\xf3\xd1X\xd5\xc2\xe9\x1d\x18\xeaA<k\x9c^\xdb\
-k\x06\x1b\x9c\xfe\x7f\xe4s\xd6\x04'\x82\x86p\xae\xdc\
-\x81\xb1}\xf1Z\xba\xd4\x09\xf73\xc0\x02Z\xefVv\
-\x192\xe4,\x19\x9cS\xff\xfe\xb6r\x9b\xfa=`0\
-\x18/}}\xdb\xf9m\xdd\xbaC:X\x0a\xa5\xb2\x05\
--\x89\x95-\xc6\xa6\x5c\xb9\xd0\xcfIIs(\xd8.\
-\xfe\x11\x18\x0cNq\xeb\x07\x16U\x9cG2\x0be2\
-\x98\x1d?o\xc7\xf5\xeb\xad\x9d;\x1d\xf0N=\xf17\
- C\x0c\xa7\xf1{\x7fQ\xee\xc4`\xb0\xf3\xa8 \xb2\
-P\x02dx\xe0!\xf8es\x83\x06\xb7`l\xe3@\
-\x95\xd6\xbbUd\x22\xf7u20p\xa04\xb8\xeaf\
-zz\xef\xe4\x7fc\x9c\xf86\x18\x0cFbl\xec\xe8\
-\xe3\xe3\xc7\xbb!L\xf0\x91\x8c\x06uwO\x8eO\x9e\
-\xdcB\xbbj\x02\x8c\x901\xcb0zOr\x86\xa9\x91\
-\x91\x01\xb2X>X\xe4\xc9\x13\xfb\xca\xdf\xbf\xb7`0\
-\x18\x7fY\x06\xd4-\xfc\xe9\xd3\x15\xbb\xda\xb7\xbfFN\
-\x95%\xb0C\x13!zk\x18\xdcQ\x8c'\x5c47\
-\xdfGa\x94\x88g\xcfV\x91a\xca\xca\xf4\x93`\xca\
-\xa9i\xd3\x8e\xe1Y'\xf1\xb7\xc0`\xb0\xe1\x15\x07\x87\
-?>qb#\xca\x7fn\xed\xed\xd9s\x94\x90@\xcc\
-\xee\x93\xad\x91Q\x88\xf4lV\x03\xeb\x86=~<\x1e\
-!\x04u }M\x89\x12/\xe1d\x99\x9bv\xcf/\
-\x83\xc1\x86W\x15\xfc\x03\x9c$$\xb0\xdd\x8c\xa2\xac\x96\
-W\x01\x01\x86\x1a\xefe\xc7\xf9/\x8e\xb6\x99\xe4\xf9\xfc\
-\xfe\x009\x83\xc1F\x97M3\xf3\xc6\xben\xddc\xb4\
-\x92\xc1\xc0v-\x10\xa2\x90,\xd0\x9dEcp\xb2\x04\
-\xe0\xdd\x09\xa0\x8a\xb6\xa1\xe4\xf5\x04\xef\xe0\x99\x03\x1c*\
-UE\xda\xc0`0\x9eyx\xb4D\xce\xe93\x0dg\
-\xc9\x07\xba\xc2;\x99\x18r\xf5*\x05\xc8\x8dp?U\
-f\xb1\xc4\x99e\xcf\x1e\xa9\xfeY\xa5z\x89kZ\xf3\
-S\x19\x0c^\xf1\x12?}\x1a\xebcm\xbdwO\xd7\
-\xae\xc7Q\xa1@\x86\x94\x02}\xcc;x6\x80\x92\x9d\
-q\x9f\x00o\xe5\x0b\xd4\xe3\xad\xc5\x98\xe9\xdd}\xfb\xb6\
-\xc2\xf0\x92`\x80\x81\xb2\x0a\xbd\xb1\xf8\xdb`0\xd8\xe8\
-\xb2\x83\xed\xc0\xb1\xa8\xab\xdbKbLjQ\xddz\xf5\
-Z+*\xd1\xa4\x0e-\xab\xd1\xcb\x83\xf5\xf7v\xeb\xe6\
-\xa5\xa1\xad\x92,k\xef\xd2\x08\x06\x83\x8d\xaf\xe4\xc7w\
-\xef\xcc|\xd7\xad\xdb\x99\x98\x98X\x1f\x06\xd5\x01L9\
-\xd0\xa7\xcfI\xa1\x01$K\xef\x95\x82\xb6\xd7\x8e\x8c\x1a\
-u\xf2\xd9\x85\x0b\x8d\xc4w\x81\xc1`\xa3+\x00\xf6\x04\
-\x7f\xfaC\x08}\xacxQ8\xd3\xd1*\xd6\x9fr2\
-\xc1\xc18\xc3E\xd3x\xec\xfb\xf7T\x025\xea}`\
- \xad\x86\xe3\xb1\xda\x1d\xc1\xf5(\xaeSp\xcd/\xd2\
-\x06\x06\x83\x81\xf3\xddR%.\xa7I\x0fcc\x17\x18\
-[\x9b\xf1B\xe4\xa0\x940\xe9X\x89\x05\xe3\xe5;\x81\
-\x7f\xd3\x9b\xc9\xca\xcb\x0c\x06\xadn\xa4\x1cVo\xe4\xc8\
-m\x93\xee\xdc\xb1\xe9de\xb5\xabl\x93&\x9e\x02(\
-X\xbe|H\x1b3\xb3+d\x8f%\x85\xf8M%D\
-\x17\xbd\x9c9\x13\xbb\xad_\xef2?<\xdc\xba\xd9\xec\
-\xd9GU\xd9\xb2U\xcc\xa1\xa7w85\xa5h\xf2p\
-\x82y\x05\x83\xc1P\x8cB\x8c\x90N\x91\x9b\xebk\xd6\
-\x1c\x1c\xe0\xec<\xca\xba\x5c\xb9\x07\xd4l\xe4\x9e\xb3\xf3\
-\x16R\x8f\x96\xef\xed\xc5\x16\xf3\x8be\xc9\x92\xef\xe8\xd9\
-\xaa\x22E\x0e#\xabe\xb0\xcb\xd0\xa1\xe7\xe8\xf7-\x8b\
-\x15\xeb\x22$4*\x19\xde\x81\xd6r\x88\xc1`\xf8\xf9\
-\xf9\xe5\x80\xcc\xfaa$5\xc7)\xdbH\x18T\xfc\x99\
-Y\xb3\xa8\xca|\xb4\x90\x80Z\xd8\x0ez\x16\xe4\xe5\xb5\
-\x16\xc9\xd2\xc7\xf0~4\xe9d\xae*T\xe8<\x8d\xef\
-\xef\xd3g\xb9\x14=\x1a\x88{_\xf0\x14\x8d_X\xb6\
-\x0c\x17M0\x18\xec@\xe9\x0c\xe5\xb0U\xc7\xc6\x8c9\
-\xe9\xd8\xba\xb5\xdb\x03WW\x8a\xc5\xcd\x01K\x08\x89\xfd\
-}\xfb\xf6\xa2\x95\x0dN\x94GO\xcf\x9d\x1bB\xc9\xd2\
-;Z\xb5\xba\x801\xb5\x92\x18V\xc6Y\x02030\
-h\xa9\x04\xceQ\x81\x10\xf3\xe8\xf8\xf1%\xe2\xff\x83\xc1\
-\xe0P\x018\x00\x9c\x0d\x8e\x00\xf3i=\xcf\xed:l\
-\x98\x1b\x19\x1d\x18\xb1<\x7f\xfe\x9d>VVf\x8f\xdd\
-\xdc6bu\xbb\x84\xe7}\xe4{\xf9\xd7V\xaa\xf4\x9c\
-<\x9e\xa4\xbd\x82w\x93`|Vs\x85\xc8'\xd2\x04\
-\x06\x83\x8d\xb2\xd1u{\xfb\x9d\xd0\xc8\xbc-\x0d)\x05\
-+\x9e\xa7L\x96\xfeI\x9e\xf5\x06\xd08\xe4\xda/\x04\
-\x9e9\xb3a]\x95*\x8f\xe4\x19\xd1]\xa4\x19\x0c\x06\
-\x1b]mp\xf6\x87'OV\xe3,w\xf4\xd4\x1f\x7f\
-,\xc3}.E\xd6\x8fd\xfaH9\x8c\x02\xeb\x18\xff\
-\x19\x9c\x0a\x91\xde\xddW\xd7\xad[\xf1_(\xffQ\x89\
-t\x06\x83!\xa5\xf7*\x82u\xc0b\xe0A\x15\x82\xe4\
-\x14,\xc7\xfd\x81\xa63g\x1e\xeblcc\x871/\
-\xf9\xee/\xe0O\xa0+\xc6\xe2\xc5?\x07\x83\xc1\x90\x1e\
-\xca\x14\xc76m.\x07\x04\x04d\xa4b\x18\x83\xc1\x08\
-\x0c\x0c\xd4'\x99\x07\x19^x\x01\x03\x5c\x8fk\x8f\xef\
-m\x9f\xbcX\x88\x9f\xf1\xfb\xfd\xbe\xb1Sc0\x18\x90\
-X\xefzb\xf2\xe4\x93V\xa5J\xddW\x9a\x8f\x98\x08\
-\xd1\xf6;\x83\xf2\xbb\xa5\xf1zS ]\xa4\x0a\x06\x83\
-\xcfx\x1d\xc1E\xd4\x15(\xf8\xca\x15+\xdc\xb7\x11\xdf\
-\x81\xb3\xf3\xe7\xb7\xa3\xec\x16\xd4\xe9\x05~\x08\x0c\xfc\x93\
-$i\x06\x83\x8d.\x87\x14,\xea\x00\x96\x15\xdf\x81\xa5\
-zz\xfb\xd4\xc2\xb6\xbbv9\x90\xf0\x91H;\x18\x0c\
-\x06U\x8f\x93J\xb4\xb1\x10\xe5\xfe\xe4\x9d&\xe0\xd7\x0d\
-5j<|p\xe4\x88\x89\xf3\xc0\x81z\xe2\xbb\xc0`\
-\xb0\xc1\xed\x04S\xccr\xe6\xdc.R\x87\x0a\x06\xa9v\
-\xbe(\xc4}0\xae\x15\xb9<G\xfd\x7f\x8e\xa0n\x9c\
-\xad\xc4\xdf\x00\x83\xd1\xc1\xcaj}\xd5>}.\x0f=\
-u*\xe4\x1b\x069\x5c\x85U\xd0\xb0U+\xff\xee\x1b\
-7:\xa0th\x97^\x8e\x1c\xc5Tzzg\xfe\xf3\
-)b\xb2\xea7eu\xb1bKq\xcdo,D%\
-\xc1`\xfcu_\xbc1\xe0 \xcdq*r\x85\xb1\x15\
-\xa7\x9e\xed\x10:\xfa\x10\xfb\xe1\x03U\x9a\x0f\x04\xfba\
-K\xa9.\x03\xb2*W\xae\xe3\x7fu[P\x1f\xac\x02\
-\xc6\xa26*46,l\x1e\x8c\xcf\x0b\xf7\x97\xc4\xf7\
-\x81\xc1\x81s\xd2\xcfL\x02S<\x97,q\xa6~\xed\
-B\x02\xe9b\x97(!\xfa\xe5\x8d\x1b\x03\xfes[J\
-\x18\x15\xb9yo\x82w\x85Je\x80e\xdfm\x7f\x8f\
-\x1e\xe5T\x18\xaf\xde\xb7o\xc4\xf7\xf4%c0\x0c\x9b\
-5\xdb\xae\x9f?\x7f\x98\x00\x9e\x9e9c\x84\xcb\x15P\
-\x98\x08\xd1=9>\xbee\xa5N\x9d\xae\x97m\xd80\
-B\xfc\x17a[\xb1\xe2u\xe5@k\xf7\xd3Ow\xb0\
-\xba}B\xb0\xf39\xfaV\x1b\xcb\xd2\x8e\xb4\x82\xc1[\
-\xcd\xd2\x09\xb1\xb1\x8b\xa8\x1b\xd0\xb9\xb9s\xad\x97\xe5\xcb\
-W\x15\xab\xde\x1a\xf01\xfa\x9aGG\x86\x84X\xe0\x9d\
-\xc2\xff\xa5md^\x18\x96\x19);!F\x92\x00\xbd\
-\xfa\xd7\xdb[\xb4\xb8\xa9\x18\xde\x8e\xd6\xad\xfd\x92\x92\x92\
-\xfe\x89\x94\x1a\x83\x8d.7\xd8\x03\x9c\xba\xb2H\x11\x92\
-^OVK\xb2\xd7\xaf\x7f\x1fY,\x9d\xffk\xe7\xb6\
-\xf2\xa8\x83\x8aR\x0c\xec\xfa\xc6\x8d;\x0f\xf6\xed{\x82\
-\xee\x91\x0d\x10A{l\xe8\xd7W\x10@*\xcd\x00/\
-\xa6U\xbd\x97\xc1}\xdc\xef\xbb\xb8l\xb4\xabT)\x08\
-+\xdc'\xc7n\xddJ\x8a\xff\x1avw\xeatR1\
-8te\x89\xc35\xc1\xb6|\xf9g_\x92\x93\x97F\
-\x04\x05\xad\xc2\x92\xdfD\xbb<\x88\xb4\x0c)Egy\
-\xbe|\xcbD\xda\xc0`\xa3\xab\x02N\x8f\x0b\x0b\xb3\xc0\
-\xf5g\xf1_\x02\xb5\xa7\xc5\x0a\x97`cd\xf4\xf2\xda\
-\x86\x0d\xbb\xc8\x88\xd4\x8aM\xc5\x8b\xbf{x\xe4Hg\
-\x18[\x03\xb0\x80<\xe8\xb6\xc4\xaa\x16\x86\xe7K\xaen\
-\xdbV\x02\xda\x16\xeb\xe3\xc3\xc3\xe7\xcb\xae.i\x05\x83\
-e\xda\xeb\x81\xb9\xffkn[\x1f\xea\xa4\xf9\xf4\xec\xd9\
-\xf5\x10\x9b\xd9\xa7n\x08\xd1\xa4\xc9\x9du\x95+\x07\xee\
-\xeb\xd1\xa3\x9a\xb6L\x1a\xb6\x99\xb7\x95R\x8d\xc3\xa3F\
-\x0d$\x83\x14\x7f\x0f\x0c\x06\x03\xc1\xc8c\xe7\xe6\xcds\
-\xf1\xdf\xb1c\x11\xb5\xb5\xc5V\xf2\xf1\xe7\xcf\x9f\x17\xc1\
-\x90\x16\xa7\xd6\xae6).n\x0aIe/\xd3\xd7\x8f\
-\xbd\xb0jUu\x91f0\x18\x5cv1\x17\x86gK\
-\xba\x84\xb2\xb5Qm0\x0f\xa8\x12Z\x80\x03\xe5\x0fZ\
-\xe1\xc8\xcd\x8b\xe7]\xffJ\x01\xf8\xff\xab\xf42\x18\xbc\
-\x97\xce\xfb\xf0\xe8\xd1\xd2\xef\x1f>\x5c\x8d\xfb\xc1Z\xde\
-\xc8n\x147Y D\x11\xfc\x5c\x18\xfc\xb0\xbaH\x91\
-\xd7I\xf1\xf1\x0b\x14\xa1\x19\xad\xf7\xf3\xcbt\x9e:\xb2\
-\xebf\x12x\x05\x1c%\xfe\x07\x0c\x06\x1b^KP_\
-\xeb\x8c7Wfv\x87\xe3z\x01L\x81Z\xd3n\xbc\
-\x97Z8@\x85\xe7\xa1\x14\xd4\xc4\xf5-\xc4CC\xe0\
-\x01u\x86xh\xb0<\xf7\xed\x07\xff$S\x86\xc1`\
-C,O\xdeK\xe8\xcc\xbf\x92a\x83\xc4\x8b+V\xac\
-\xc3x\xaa\x86\xb3\xa3M\x9b\xe9f9r\xc4\xd3\xbb6\
-\xe5\xca\x85\xa2\xee\xc9\x22>\x22\xc2tg\xbbv\xd7i\
-\xcb\xba\xaaT)C\xf1\xa7`0\xd8\xe8\x1a \xbdk\
-\xc1\x89\x89\x13OZ\xe4\xca\x15\xa7\xacV\xa9\x09\xc9\x5c\
-03\xebJ\xc1r\x0a\x9a#s\x85\xf4/\x92p\xee\
-\xb3\xfa\x9c\x988\x98\xe2z0\xd4\xa6\xe2/\xc1`\xb0\
-\xd1\xe5\x02\xbb\x86?\x7f\xbebw\xc7\x8eW\xd0\xf0\xe1\
-\xbe]\xe3\xc6\xf9S\xcd\x0e\x876}\xe0\xa9S\x1b\x9e\
-yz\xae\x83\xa2\xef}l-\xa3\x97\xe7\xc9S\x82\x94\
-|\xd3\x96\x93\xc9`\xb0\xe1\x15\x03\x87\x81\xa6`\x03\x19\
-\x10\xa7\xfc\xb8\x91\xb8v\xa6\xd5og\x87\x0eW\xe4;\
-\x95\xc0\xc9\xc9\x9f>\x99)g><\xef\x03\xfe\x1d\x01\
-\x1a\x06\x83\x1b2Be7\x0c\xdc\x8b\x9b\xcd\xa0\xbf\xcc\
-\xf5\x1a\x05\xee\x04O\xa2\xb9_l\xcf\xad[/`\xf8\
-,\xde{F\xefe70p\xc2\xf5\x1e\x0c-'\xae\
-kAO\xfc<U\xde\xa7\x05\x0c\x06\xe3CPP\x93\
-\xc3#F\x9c\x93\xce\x92\xafk+T\xf0JML\x86\
-<\x94\xd8\x8a>\x91-n\x93p\xfdL[\xd0\xb4\xc7\
-\xea\x18\x0c\x96O\xeb\xf96 \xc0\x92J{\xd4\xed\x8f\
-\x84\x88\xa1<M\xad\xf3\xdd\x18Y\x96\x11\xe06e\x8a\
-\xd3\xc6\xda\xb5\xcf\x90\x81\xc2\xf8\xce\xa7=\x5c\xc0`\xb0\
-\xe1\x95\x02\x7f\xbf\x7f\xe8\xd0\xe6]\x1d:x\xfa\xda\xdb\
-\xd7\xd5\x88\xcf\xe5\x07\xdf\xae(P \xecSt4\x9d\
-\xe9\xc6\x83\x13\xa1Y\x7f\x83\x8c\x10\xc1\xf4\xefl\xe2\xce\
-`\xb0\xe1\xd5\x02\xa7\x83\xad\xe4\xca\xe6F\x01q0\xe5\
-\x82\x85\xc5A\x8c\xb7\x10\x12\xd8b^\xa7\xd8\xde\x9b{\
-\xf7\xda\xfeE\xdd^=\xea-\xbdH\x882BW\xc1\
-`\xc8|\xc6\x1a\x22\x0b\xb1\xa6t\xe9\xb9TMN\x06\
-wt\xf4h'\x18\x9c\x9e\x926Fc{\xbbv\xf5\
-!#\x94c\xa5aX\xcbeV\xca\x0alK++\
-]\x5c@*\x1d\x8a\xa52!\xa1\x8b`\xb0\x97\xb2\xb0\
-\x10\x8e)\xea\x9cF\x91euGs^\xbd:3\xc6\
-\xc7g\xa3a\x8b\x16\xfe0\xac\xc0y*Un\xea\xaa\
-\x89G6\xf0`\xc6t\xdf\xb2\xc5\x0b?\x07`\xacF\
-\x8a\x10\xf7UB,\xc2\xfd\x10p!>,\x95\x035\
-nkjzY?o\xdex\xfd|\xf9\x12\xc7\xfb\xfb\
-\xc7\x08]\x05\x83{{mi\xd0\xe02\xa4\x13\x1a\xe1\
-g_\xb0J\x16m3\x0d\xe5\xb9m62Q\xfa*\
-\x15\xe6\x07\xfa\xf6\xbd(\xcb\x80\x94\xda\xbcx\x94\x0b\x1d\
-\xa4J\xf3\x1b\x9b7;\xa2\x8a!\x0ac\x1f\xa4\xb2\xaf\
-\x22\xb5\xd6Z\xe8\x10\x18lh\xd60\xac3\xb8\x86A\
-\xfb\xef\x03\x94\x91V \xd3\x83\xee\xbf\xec\xef\xdb\xb7\xbb\
-\x0e$I\xab\xdc\xa6N=\x80\x7f\xd3G\xa8\x82\xbd\xc4\
-\xbd\xfeB!J\x90\xc7rK\xc3\x86we\x13\xf8_\
-\xc0\x8ew\xf6\xec\xb1\x92^\xcf\x14\x92}@\xad\xdeL\
-\x9d\xaa0g0\xe0\x09\x9cC\xeev0\x05\x8d\x13\x02\
-w\xb6ooO?#s\xdf\x9b\x14ou\xc4\xb1\xd2\
-\x02=\xa3\x97E\xbfzE\xfd\xa4\xa9\xf4\xa7(\x98\xb2\
-\xadi\xd3\xdb\xb8/($|\xd7\xad\xab@\xe3dt\
-\x10\x9f\xd9\x8cg5\x85.\x80\xc1\xa0s\x1a\x0e?\xa5\
-\x1c\x9a7'\x83KYY\xa8P\xa4\x868P,\xfe\
-\xb8I\xb4\xa5\xa4\x0ey3\x0b\x83M\xe4\x8a\xa5ZS\
-\xb2\xe4S\xf9E\xf1\xab\xc6g\x9a\x01\xa6lo\xd5\xea\
-&\xde\x1b%uXjb\xcc\x02+\xb6-8\x08\xcf\
-\x0dD\x16\x80\xc1\x06\xe7L\xe2\xad\xb8Fa\x95{\xf7\
-\xf1\xcd\x9b\xe56\x86\x86\xa1\x8a\xd1\xad\xabV\xcdE\xe8\
-0|\xac\xac\xa6\xe0\xcc\x16CF\x07Cz\x09\xde\x94\
-_\x16\xf1\xef\x1f<\xa0\xe2\xd8\x92\x18\x9b\xa0\xac\xde\xca\
-\x15c\xcf2\xdd\x13\xcb`\xb8\x8e\x1c\xd9\x84\xfe8\xc9\
-\xb8 _\x17cW\xa5\xcaI\xb5\xdb\xbd{w\x9f3\
-3g\x1eE]\xdb\xec\xbf0\xd8\x8a\xf3\x85(\x90\x85\
-+^\xfe\xd77o.w\x1d6\xec,T\xc4|\x10\
-J \xe3K9\xd8\xbf\xff\x05\xcad!\x0dM\xf03\
-m/ON\x9e|\x0cFh\x89\xeb\x09\xbc\x97\x04\xc7\
-\xca\xbbLM\x11c0\xb0%\x9bH\x06\xb6\xa9N\x9d\
-\x87\xcav\x92d\xef w\xb7\x01\xabCop$\xa8\
-G\xb19\x8ae\x81m5\xb7cX)\xa2\xc1w\xe0\
-\xb8,\xdef\x0e\x07\x17\x1e\xe8\xd3\xe7\x22\x0c\xe9\x0b\x09\
-\x86\xba\x0e\x1dZV&<\xa7\x90\xb3\x85>\x17\x9c(\
-\x87_\xf8\xf8\x0c\xf7X\xb4\xc8Iv\xfb\x99\xfb'\xab\
-\x7f\xc1tK\x1fc0(\x03\x03\x86\x12\xb9\xb2`\xc1\
-\xd7\x10\xd8\x5c\xb6\xaeJ\x95@\xfac\xa5,\x0e\xc8\x97\
-{\x0b\x09\x18Y{%\xebC2\x82\xceA\x02ph\
-\xd6l%\x8da;z\x5c\x07\xcew*\xb0\xe9\xe3\x13\
-'6\xc2\xa3\xe9\x14\xf7\xe1C\x19\xd4\xd5\xa9\xbfP.\
-,[v\xf0\xf0\xf0\xe1'\x11^\xf8H\x9f\xd9\xbal\
-Y{\x1a\xdf\xd2\xa8\xd1q\xa1\x01\xd2a\xa1\xab\xdc\x86\
-\xc6J\x99\x88\xc3\xe9\xb1\xfddp(`\x12\x0c,\xf1\
-\xf6\xde\xbd\xdbv\xb5o\xbf\x86\x0c\xc7i\xe0@/j\
-\x82\x1e\xfb\xee\xddB\xea\xdf\x851C\x90\xe2Z\x9f\xa0\
-9ylO\x97.\x9eH\xad\x0a\xc5j\x91H\x86\x88\
-jn\x7fd\xfc'\x85^\xbbf\x83\xf7\x8b\x0a\x1d\x80\
-\xec)=\x16\xac\xb4\xa9a\xc3\xaa0\xba$T\x93\x07\
-?>}z\x14\x9d\xeb\xb66n\xecM\xdbL\xa9$\
-\xe6\xa4\xb1\xa2\xb5\x93g<z\x9e\x02\xa3<\x8f\x90\x83\
-\x1b\xc5\xf9\xf0y\xe306X|/\x18\x8c\xdb\xbbw\
-\xe7\x09\xf6\xf1\xb1\x8cx\xf1b\x1ae\xeac{\x15\x82\
-\xae%&2\xaf\xb1)H]M\x17\x92!^\xb1\xb5\
-\xdd\x83\xfb\xb9\xe0dd\xf8\xaf\x86\xd1E\xe0\x5c\x94\xa4\
-6\xd2\x01\x03\xbc0\xde_\xe8(`T\xcejuh\
-\x95\xea=z\xd8\xad\x0dpqY\xf0\xc0\xd5\xd5~C\
-\xcd\x9a\x8f\xde=x\xb0P\xc3\xe0r\xa2\xda\xfc\x8c\xb2\
-\x92\xe3\xcb\xc5;\xfa\xf5\xeb\x99$x\x8b\xad\xf7k\xec\
-\x04\xce\x08\x06\xe3\x1fn\xc1ZEDD\x14@\xf0\xd8\
->\xe4\xeaU[\xad\x9e\x00\x02[\xb0\xcddT!W\
-\xae\xccS\xa4\x0ep5\xd8\xd7\xb3\xe7I\x1a\x87\x870\
-\x22\xf6\xfd{S\x8c\x15\xd0\xe1\xcfY\xf3\xea\xda\xb5\xbb\
-\xe1}U\x87\x10\x88p\x10]\x87l\xdf,\x0a\x94\x0b\
-\x0d\xec\xea\xd8q?\x19\x1b\x04\x90\xdeK\xc3\x0bE\xf9\
-\xd0\xb0\xcfII3e\xc5z\xba9Y\x18,\xee:\
-P[\xc8\x15N\x86%\xd2\xa9\xb2_s\x1cN\x88\xa3\
-4~\xde\xd8\xf8\x10~\xa7\x8d\xd2\xc6J\xc6\xbb\x0cu\
-\xd1\xe8\xc0\x05/.]Z\x0b\xc7\xca\x99\xcd?\xff|\
-(2(\xa8\xa0\xa6\xc4\x9fL\x82\xfe\x88\xad\xe4\x8b/\
-_\xbe,\xf5Z\xba\xd4\x09\x8a\xd1a0\xce\xa3R\x9f\
-\xa5\x0a\xa8'2\x0a\x0c\xc6\xbd\x03\x07\xca\x91\x9a\x96\x8c\
-s\xed\x01IEy7\x98\x82f\x8c\xc1H\x9b\xa2U\
-\x82D\x5c\xe7\x81Q\x1a\xb1._\x13!\x1a\xe8`\xd1\
-km\xa9\x9db\x0cV\x95\x95\x11\x0bd)\xcf.\xfa\
-\x9ct\xa6\xc5\xb3\xfa`K\xac\x82\xc6X\xddL2m\
-ec0^\xf9\xf9M\xb7\xaf[\xf7\x01\x9c\x0f\xb1d\
-PJ\xda\xd4=g\xe7-t\xde\xc3\xfdh\x1aC\x0e\
-\xe6K\xac\x1e\x87\xe0\x94\xb8\x88w?\xe2\x1d\x8a\xef\xb5\
-\xd0\xd1\x15=\x9b\xc6\xaa\x16\x89\xebg\x99\x97y\x8b\x1c\
-.\x1a\xef\xe5\x03\xab\x89\xcc\x02\x83A\xe73p\x02i\
-D\x92{\x9d\x8c\x8bt$\xb1\x9d\xb4\x95[1\x7f\x1a\
-\x83\x91%\xef\xeb\xde\xdd\x1d\x8e\x86\xd9\x10s\xb5'=\
-J\xc4\xc3\xee\x09\x1d\xc7\x93s\xe7f\xdb\xd7\xabw\x97\
->\x03\xc5\xef\xac\xcb\x95[J\xd2\xeb\x22\x0b\xc1`\xa3\
-\xd3\x03\x0d\xc1\xa6\xd77m\xda\x8c\xb3]\xb0C\x8b\x16\
-+\x05\x80\xac\x8d\x08J\x07C\xd8\xe0\x12\x85\x0b\xc8\xd1\
-\x00o\xdf4\xc4\xb8\xfc\xc8\x10ON\x9aT\xe8\x1ba\
-\x89\xa1\xa0+8\xddX\x88\x0aY\xf8\xd9J\x82\x13n\
-l\xd9\xe2\x88J\x84W2\xf5\xcb\xeb;S\xe5JK\
-\xd9\xf6\xb5`A\xf1O\xc1`\xc8\xf3\xcd\x1cp\x81\x00\
-,K\x94\xb8\x8dVT\x09\xf7\x0f\x1f\x9e\x1bt\xf1\xa2\
-\x1d\x02\xe8\xfer\xdb\x99@J\xca/}}\x9bh\xf6\
-\x1d\x00\xed\xf0|\x83\xccy\x0c\x92\xe7\xc38pL\x16\
-{l\xebC-z\x1e\xa5\xb4\x1d\xe8\xd7o\x07\xee\xf5\
-\xbf'\x19\x1c\xab\x7f\xb4\xdcz\xa7_\x1e*\x83\xfb.\
-+\xa1\x80\xb3\xf3\xe6M@p\xf83\xb6\x99\xe1(\x5c\
-\x9d\x1a\x17\x11\xf1\x07Jdv\x22U\xec\xe5\xc6Z\xb5\
-\x1ek\x86\x1a\xd0+@\x1d`\x97\xfd\xc0CH\xf0\x95\
-2C\xd6\x94(\xf1J\x8e\xb7\xd2\x81\xcf\xd5I\xd6\xd7\
-\x95\xf8\x0e\x83\x1b\xa0|\xbe\xad\x8d\x1a]&G\x8dH\
-g0\xd8\xf8\xf2\xa1:|\x1b\x9c&1J\xea\x17\xb6\
-\x9c.8\x1bY\xbe\xbd{w\x0d)si\xbc[O\
-\xb3\x1aa\x99\x81\xc1S\xa7\xfe\xfd\xc7\xc5\x86\x85\xcd%\
-7|\xd0\x85\x0bm\x7f\xe0\xca\x0b\x03\xac\xd2At\xbe\
-\x95\x95\xe9\x94@\xadR\xf22\x97\xe0\x92^[g\x06\
-\x1b]\xe5\x84\x98\x18\xe3\x0b\xe6\xe6\x07\xd0z\xd8\x8f\xce\
-r\xc8\xccX\xac\xdd\x88C\xca\x96\xa7\xc0\xb9\xe2}b\
-\xf2\xe4\x93\xd8\x8a\xaaKk\x90\xc9\xd1J&K7\x14\
-\x1a0\x11\xa2+U$\xfc \xa9r\xc6dhH\x93\
-\xbbFW\xb4W>\x22\x8d\xad\x15\xf8B\x9e\x0d?\x81\
-\x83\x04\x83\x91.Y\xfbr;\x96\xf8\xf1\xe32\x5c\xa7\
-\x08\x80<~$\x87 c^O\xe1\xbd\x8cDa\xab\
-9\x9e\xf7\x08\x7f\xfat\xc5\xb9\xf9\xf3\x0fE\x05\x077\
-He\xc5\xc8K\xc9\xc3`\x1c\xf5\x0a\xd7\xf5Dp\x19\
-4\x0f\xf241\xd9A\xc6\xe5\xf6\xc7\x1f\x8e\xb8Z\x80\
-\x9f5\xb6\xd1\xef\xb0\xcd6\xc7\xfd\x1cp\x98Z\xf5\x9d\
-\xc1\xf8\xa71.\xd9\xf5\xc6H\x1a\xcef\xf9\xcd~\x9e\
-V\x80\xb3s\xe6\x1c\xc1\xb3\xf6\xf2\xdd\xa2\xe0\xaf`=\
-\x0dC\x1b\x8dw\x7f\xc75\x9b\xcb\xb0aS\x91\xaby\
-\x8a\x12\x91\x85\x8eB&=\x1f$\xfd\x97\xbb\x07\x0el\
-E\x1c\xd2T\x86\x18\xa2\xa5\x91=\xc1\xd95\x11ip\
-\x1f\xa3CCW\xc4~\xf8\xb0\x04\x0e\xa5\x00\xb9\xe2]\
-LWu4\x06c\x7f\xaf^?\xe3\x9b\xff\x81Rk\
-wz\xfa\xf4\x03\x81\x81\x81\xdf\xf4\x00\xe2\x9d\xb3r\xfb\
-u\xf3\xe8\xef\xbf\xff.\x93\xa6K\x0a\x1d\x84\xb1\x10F\
-R\xfb2\xc5\xb6B\x85\xe7\xc8\xbc\x19k\x9a-\xdb\x22\
-%9\x00\x09\xd0gP\x97\xe7N\xf7\xe4\xfd\xc4\xe7\xe8\
-\x0c\xe6\x83\xca\xf4^Y\x91\xe0\xef\xd8\xad\x9b\xfa\xb3\xc9\
-\xdey\xff\x1c\x0c\x0e\x9c\xe3\x0fq\x9a\x97\x99\x99\x13U\
-\x19Hc\xba\xaa4\xef\xd0\x06d\x1e\xda\xec\xee\xdc\xf9\
-*\xbd\x87\xd2\x9f\xd3\xba\xae\xb8ur\xea\xd4\x158\xaf\
-\x86\x93\x01\xc1\xdbj\x8d\x1a\xc1\xaa\x0eM\x9b\xde\xban\
-o\xbf\xf3\xed\xbd{+\x11\x1a\x89\xc5\x195\x04)b\
-s\x94P\x83U\x992\xd3\xe9}Z\x11\xe9\x9c\x8b\x9f\
-;\x81Q\xe0\x22\xdaz\x8b\xf4\x00\x83\xfb\x81\xa3\x95\xb0\
-\x89\xcb\x90!\x1e\x88\xbf\xc5\xac.Qb\xd07\xde\xcd\
-i]\xa6\x8c\x1f\xc5\xf0\x9e\xb9\xbb\xdb\xe2\xbe\xa0\x8e\x7f\
-\xb6\xba\xf4\xb9P\x06\xe4\x86\xaa\x84\xc9\xb8\xcf\x85x\xe4\
-\x02\xa4\xc4-\x5c\x91/\xdf>r\x0a\xf9;:n\xc7\
-\xf8\xcfB\x02\xdb\xcb~dp\x90{0\xa5\xf3-V\
-\xc9mt/WvW\x91^`p\x08\x01\xecK\xd9\
-\xf8\xb8\x8e\xd48\x07\xd5\x07\x0d\x149s\xa5\x1e\x0d\xef\
-\x0cI\xe5\xcc\x94SG?W\x1fp\x84\xfc\x0c\x0f\xc8\
-\x89\x02~Al\xf2\xb6\x14\xb4Ui|\x86f\xea\xf3\
-]\xd1\xa2\x8fp\x8dW\xb6\xa4G\xc7\x8e=}z\xe6\
-L\x1b\xac\x8aN\x18;\x07\xd6\x11\xe9\x04\x06w\xcd)\
-\x22\xcfA\x95\x14%-\xa9\xfc\xfc\x88\x1c\x0e\x10\xa3\xb5\
-P\xdeQ@\xed\xac\xe4\x1f\xf2e\xbc\xa7\xb3I\xc5'\
-\xa6L\xe9\x8b4\xb1\xe7dH\xc8\xbcy\x06c+\xa7\
-\xe5hiB\xcfdH\xe4\xaa\xdf\xd6\xad\x9bd\xbd\xdd\
-\x14\x22b\x9a\xe7\xe8\xb9\xec\x87\xb7\x5c\xa4'\x18\x0c\xe8\
-\x8d\xac2\xcf\x95+B\xd9V9\x0f\x1a\xe4I!\x86\
-\xd4\x1a4\x22v\xf7\x9a\xde\x81\xe7\xef$\xae[\xc1f\
-:\xb8\xe2\x95\xc6\x99m\xb6\xc7\xc2\x85.\xa7g\xcc\xd8\
-G\xdbd\x0a\x8f(1E\x18\x11I7$\xdf\xda\xb5\
-\xcbA\x1a\xdah\xb0\xb2\x12@G\x22x\x94e\xc9\x92\
-\xefP\xa5q\x0f\xe7^?\x8d&+\xe9r\x9ee\xf0\
-\x8a\xd7\x10\xce\x12\xb3\xfd\xbd{SiO2y3a\
-P[\xb4e\xecp?XQ\xe1ZS\xaa\xd4\x13*\
-\x01\x92\xba\x9a\xedt\xd0\xe8r\x82\xed\xc0?\xc0\x22$\
-'\x0f&\x83\xc7\xe4\x96\xd9Gn5\x8d\xb4>\xe3(\
-z\xee6m\xdaq8\x9bf\xa37\x9e9\x85Y\xf0\
-{\xb7h\xab\x0av\x11\xe9\x00\x06\x1b]A\xf0\xd7\x17\
-\xde\xdek\xe9\x9b]\x86\x11\x96k&\x06\xc3\xb8\x82-\
-\xf2\xe4\x89\x80\xe4\xf9rZ\x19B\xaf_\xb7\x81\x870\
-\x12F\xfaF\xe88\x8e\x8d\x19\xf3\xd3\xfaj\xd5\xfc\x94\
-U\xdc\xf9\xd7_=\xde<}Z<\x95\x8c\x95\x1b\xa4\
-\x15\xfa\xe1\xc9\x13c|\xfe=\xf8lA&B\xfc\xb2\
-\xa9n\xdd)\x18\x8f\x91\xdb\xef-\x22\x9d\xc0`\xc3+\
-\x0fN$\xa1\x1f\xe8\xa5P1(\x89\x19\xcd\x07\xf7\x91\
-\x11\xba/X\xe0\x8a\xe7\xdd\xc1\x22`\x05x4_P\
-\xed]ttt\x11\x1d\xff\x5c\xb9\xc0q\x14.\xc0\xea\
-\xfcV\x1a\xde2\xa1\x012,\x1a\xa7\xb0\x02D\x9d\x14\
-\xe3\xa4\xea\xfa\x09\xc8WmM+;\x09\xf6B\xc6}\
-3%\x18\xe0Y\xe1\xf4\x12\xb3e\xb0\xc0Q\x03\x19\xa3\
-2\xc0\xd6\xf1\x85,\xe7I@B\xb4\x89\x92\x85\x8f\xb1\
-64\xbe\xabS'_\x8c\xd5\xd4L\xb5\x82\x83\xa56\
-\x9e\xe5\xd7\xc1\xcf\xd5\x10e@\xf3\xcf\x9b\x98\x1czt\
-\xfc\xf8X\xad\xed\xe4n\xe5s\x92\x87\x13a\x85p\xba\
-\x0f8t\xc8\x04\xd7K8\xf7%\xdd;x\x90*\xed\
-\x17\x82%1\x16\xa8\x08\xf1\xa6\x9bh-\x83\xf1\xfa\xf6\
-\xed\x11\x14\x0c\xa72\xa0\xed\xcd\x9b/U23`P\
-\xb7\xa9\xe9\x08\xb44W\x91k~\x81\x10\x85\xb0\x12\x9e\
-\xd0\xe8!\x10\x87\xab\x83\xae\xad\x02\xa4|&\xb3N\xfa\
-\x0a\x09\xca\x17\x85\xd1$(\x15\xf5p\xb8\xec\xb5\xfb\xe9\
-\xa7gT\x85n_\xbf\xbe+\x8d\x1f\x1b7\xee8\xad\
-\x92J2\x00*-\x86\xad,P\xe0\xb5\x5c\x09\xfd\xd3\
-\xb3\xd3+\x83e\x1e\x86B\xbea\x05\xae#aH\xb3\
-\xc1h\xd9\x92\xf84m1\xe5\xf9\xc7\x8b\xc6P\x02\xe4\
-\x8b\x1cLgl\xc5\xee\xc84+\x7f]\xcf\xe0\x80\xc1\
-\x8c\x00S\xcc\xf5\xf5?\xd1\xb6\x93\x1c&\xa4#CJ\
-\xd8\x14>@\xd23u\x03\x9a\xaf\x99\x08@[\xeag\
-\x9e\x9ek\x94~xD\xdaz\xcf\x16\x22\x8fH\x070\
-\xd8\xf0*\x81F\x96e\xca\xd4A\xb6\x86\xba\xaenw\
-\xc7\x8eT\xe8\x99[J\xf4\xa5\x10!\xf8\x1a\xee\xbep\
-\xa1=\xc6\x17(\xb9\x8c\x88m\xcd\xd5\xf5l\x9c\x8b\xcb\
-\x97\xefxx\xf4(\xc5\xe4\xa6 \xdf\xb2\xa1bD(\
-\xe6}G\x89\xcf\x18\xaf*\xb4\x00\xa3<D^]\xd2\
-\xde\xdc\xd1\xb2\xe5\x0d2R\x8b\x02\x05\xea\x89t\x04\x83\
-\x0d//\xea\xef\xe6\x9d\x988\xf1\xa4\xaf\x9d\x1d\x95\x02\
-\xa9\xc8].\xdd\xedW\xd6V\xa8\xf0Hz9\xdd/\
-ZX\x8c\xa2-\x9aM\xf9\xf2W~\x00\xdd\x98\xa6R\
-\xc6/\x17\x0c\xed7)\xce\x94D\xa2L\xa9\xc5%i\
-\x0bI\xab\x1f\x19\x9a\xdcj\x8eJNL4\xc3\xb5\x8b\
-L\x19;D\xff\x9d\xf4(\x03b\xb0\xd1\xe5\x01{\x82\
-c\xc0\xec\x94\xb9O\xcdHP\x00{?\xe1\xe3\xc7\x99\
-0\xb4\xfd\xf0\xea\xbd\xa6\xd8\x17\x9d\xfd6\xd7\xaf\x7f\x8f\
-<{?P\x05yq$B\xfb\x9e\x9a1\xe3\x98\x0c\
-\x8cg\xd3N\x02\xa0\x8a\x0a\xc4+\xe3\x94^x\x02\x90\
-\xa5Q\xf9\xe8\xf7\xf1\xb9\xdf\xc8U\xd2\x1bl(\xd2\x13\
-\x0c\xc6\x8e\xd6\xad=\x94\x95\xed\xfc\xe2\xc5\xa3)\xa9\x18\
-\xf1\xaeS\x08\xa2\x7f\x22\xaf m=\x7f0\xa5\xb4Q\
-\xb2<)\xbfF\x0e\xe6\x00Z\xb1p\x1d\x0b\xa6\x1c\x19\
-5\xea,}\xf1\xa4b\xb0\xe5\xb1\xb2'\xae.R\xe4\
-\x03\xae\x9f\xc8\xeb\x09b8\x9d\xc0`$\xc5\xc5\xfd\xb2\
-\xbfO\x1f\x92\xebS\xd7\xa8ae\xbb\x8f\xb3\x90#2\
-\xf7\xad\x92>}\xfa#\x8d+L\x13\x92\xf0\xcbjg\
-\x0b\xadV\x1aAq'\x8d\x15\xeb-\x82\xfeoI\xda\
-\x82V\xfbT\x02\xe8\xea\xb3\x1dmG\xf1\xf9\xadm\x8d\
-\x8c\x14\x99\x87\x99\x22\x1d\xc1\xe0\xf8]\xf77w\xeeX\
-Q?8\xfcA>\x87\xd1\xc5\x1e\x197\xaeYZ\x15\
-\x94ap\xeb\xa4\xd7\xef\x09\xaee\x85\x0e\xe0]@@\
-=\xac\xd8\xe7i\xc5\x22\xe3Y_\xb5\xea\xd3\x07\x87\x0f\
-\xf7H\xe5l\xd7\x9a\x9e;\xb6n}]6\xd5,G\
-\x0dY\x90\xa5\x13\x8b\x5c\xd4\x0f\xe9\x1e\xb3c\xb0\xa8\x11\
-8\x08\x5c,\xf5U\xd2\x1c\x9f\x82\xa7\xf3\xa0\xe2%\xdc\
-\xdf\xbf\x7fC\x1d\xca\xcf\xecG+\x16\xa4\x1c\xeeJM\
-\xcfh\xe5|\xa6\xc4'1v\x0b\xc5\xbb\xb1\xef\x1f>\
-\x5c\xad\xc8\xfd\xe1\xaa\x8f3\xe1e2\xc4\x8bVV\xe5\
-\x04\x83\x91A\xe9Tu\xc0|\x22\x0d@\x88\xe1gE\
-:\x81\x88\x9ex\xbd\x84\x04b\x0b\x14`/\x92\xc5\x86\
-W\x0e\x1cwk\xe7N\x07\xc8\xb4\xdfp\x1e8\xb0\x8b\
-R+\x08\x8e\xd7\x88O\xf6\x10\x1a\xc0\x0aw\x9d<\xb6\
-X)[h\xac\xe4u\xc0\xb1\xd4\xf55+Vr\x06\
-C\xa5N\xa3\xd2\xd3K@\xeb\xe57\xd4\xe1\x95\xdc\xf5\
-\x1aulOe+\xe2\xb1:\xb0\xe2\xd5\x03g\x82C\
-(\xd8-k\x05\x93\xd5g\xbb\xd8\xd8E\xd2I\xa4\x18\
-VIl\xaf\xe3\xa81\x0b\xc6\x1bK\x1dM'%+\
-G\xa3\xfen=\xeb\xab02\xd3\x1d\xff\xab\xd2\xd9\xd5\
-\xa6\x5c\xb9\x17\xa4\xc3\x12\x1b\x19Y\x0fcK(\xc4\xa0\
-\xaczr\x05,\xad\x0b\xe2\xae\xb2o\x9dj}\x8d\x1a\
-\x9b(\xdf\x12\xfc\xb2\xb6R%\x8a\xc1\x15\x97E\xbe\x15\
-`H\xf7)#\xc5\x7f\xfb\xf6\xed\xb1\xb1\xb1\x94\x87\xe9\
-\x02\xa6 \x91\xfa6r:\xd7\x93\xbe\x0a\xad\x96\x8aL\
-;\x15\x03\x8b\x0c\x06\x83\x8d-7\xf8\x02\xf1\xbbp\xea\
-\xecj\x9e;w(\xf5\xc7C\x96\x8a\x9f\x145\x8a\xa5\
-+Je\x1eRsG\xbbJ\x95\x1c\xa4\x01\x1e\x05K\
-\xeb\x80\xe1\xb5\xa2\xfe\x0e\xf4\xef\x93\x86\x93@\x82M`\
-8\xdd\xbb\x0e\x1bF\x92\x83c\x95/\x95mM\x9b^\
-\x91\x81\xf2\x81`[p\x02T\xd6.+_(\x14<\
-\x17\x19\x04\x06\x1b\xdb2\xac\x02o4;\xbb\x92\xe2\x96\
-\xb2\x9aAQ\xf9,\x0cL-eN\xc6\x86\xe7]\x1f\
-\x9f=[\x8fV\x0d\x99\x11\xb2UG\xce\xad\x15\xc1I\
-t\xbeC\xbf\xbb\xab\xe8\xe2\xfa\x002\x0e>>\xd6\xd6\
-;e\x95Aq\x0a+\xa0\xa4):.,\x8c\x8c\xad\
-\x81\xd0\xc0\xd9\xb9s'Kc\xa4\xdc\xcdF\xf8y\x15\
-\x8coe\xbaV^0\x18\xab\x8b\x17\xef\x85\x00\xb9:\
-!\x1a[+\x7f\xe7\xc9\x93\xf3\xae.Z\xf4\x1e\x09\xb8\
-^\xb5\xb3\xdbu\xd1\xdc|\x1f=C\x7f\xf3K\xe4\x01\
-U\xf2\x1f\x91\xcd\x1f\x83\xc2\xd2\xa7\x90T\x98\x86{\x15\
-u\x08R\x84l\xb3X\x8c\xb7\xa1\xd4H1\x95\x9c\x04\
-\x1aQ\xe5\x04\xf8\x15\xf1\xc9k\xb8o#\xab.zQ\
-\xa5\x85R\xb5\x80\x8a\x0c\xef\x88\xe7\xcfW\x92T\x04\xbe\
-Hv\xcb\xd5\xf2-8:]>\x17\x83A\xee\xf3\xb0\
-\xc0\xc0\xe5\x08\x94\xfb\x22$\xf0\x1c\xa51\xc5\x92\x93\x93\
-{Q\x85B\x5cd\xe4\x0c\xaclA\x1a2\xed\x85\x84\
-\x04\x0aB\x83q^zA+\x05y\x09\x11lV\xb6\
-s\xbe`q\x1d\x91\xa0\xcf\xaf\xd1X\xc4\x80Ve\xfb\
-\x9f\x7f\x0e /.%}\xcb,\x940<\x9bH\x06\
-(\xd3\xe5:\xcb\xec\x1d+28\xc4\xef\x94\xd5\xfe\x86\
-\x89\x10\xcdE:\x80\xc1FW\x0c\x1c.W\x84&X\
-\xddZ\xe2\xfc\x16\x08'\x84\xab\xb6L\xbb\x02\xa4N\xdd\
-\xa6\xea\x04\xd4\xa5\xcd\xc5;!`\xca\x8a\x02\x05\xa2\xf0\
-\xbb\xefV\x97,I\x92\x7f\x8b\xa5\xe8\xad\xce\x00+\xf2\
-Ei<\xa6\x02p_\xb4h5y6\x15\x83RV\
-;\xba\x92!\xe23\xbe\x87\xe6\xcc\xf2\xc3#F\x9c\xc3\
-96^\xaex\xfb\xd3\xebs1\xd8\xf0J\x83\xd9H\
-\xc2\x0f\xf5i\xc1dD8\xcf%\xbd\xbc~\x9d\x82\xe8\
-9\x85\x06,\x8b\x17?\xaf\xd1~\xeb9*\x18\xf6$\
-\xc6\xc5\xd1{\xa6\x10\x022S\x0aaA\x13]Q\xdd\
-\xba{\xf0`\x1fH8\x84I\x03\xdbup\xc0\x80\x09\
-\xa8\xb2P\x1b!*-n\xec\xed\xd6M\xe9\x0b\xb1\x96\
-\xc6\xce\xcc\x9au\x14\xfa1\xbd\xae\xae_?\x1d\x15\xf7\
-\x96x'\x88\xc6\x97f\xcf>_0\x18\xe9y\x16\x8a\
-\x8f\x8c\x9c\x874\xb1sp>D\x1d\x1e9r\xa2\x90\
-PV\x00j\xb9\x8cz\xb5H$K\xef\xa5>\xe82\
-.\xd6\x04,\x05\xbd\x95\x81dp\x088+\xbd\xf3&\
-\xeaJ\xed]\xe4\x8b\x17sQA\x11\xa0\x19\x87\x93\x1a\
-\x9a\xa6`+\xd2\x00\xc5X\x92t\x08%RX\x01\xbc\
-\x15\xe4\xe5U\x9e\x1c.\xb4\xaaS\xf3M\xbc\xabh\xce\
-\x0cJ\x972 \x06\xd7\xde\x81\xbd\xc0%\xe0\x10\xd9F\
-\xeb\xac\x5c\xb16\x83)T\xfc)\xe5\xf0\xea\x83z\x1a\
-\x09\xc4\xa7\xc9\xab\x89\xf2\x19K\x92;\x8f\xfb\xf0\x81$\
-\xce\xab\xd1\xaa\x82k}\x1d(o\x1a\xf5\xcc\xc3c\x1d\
-*\x0eNoo\xd1\xc2\xeb\xb1\x9b\xdbF\xa4\xc2\xd5\xa1\
-\x95\x98\xfe\xed8\x8f&S\xa3L\x88\xda\xbe$\xc3\x83\
-\xcc\x85\xc73?\xbf\x02\xb8?I^P\xfc~s\x8c\
-W\xc1\xbb\x89\xd2h/\xa5\xd7\xe7b\xb0\xe1\x15\x07\xf3\
-Q\xf5\x00\x9c'\x17\x95U\x01\xabX\x08\xe4\x10\xa6\xa4\
-R\xafFZ\x92_\xb66ir'\xf2\xe5\xcb\xfe8\
-79\xa1\xf1\x07iN6\x83c%\x8e\x9eI!\xdb\
-\xdcY\xec\xcd\xac\x0d\x8e\x00g\x81\xc3a0{I\x98\
-Hm`\x9d:]\xc1\xd88h\xaa\xdc\xa0\x15^:\
-\x8c\x0a\xca/\xa0\x89 y8O\x92a\xd2\xbb\x94\x9d\
-#\xb3U\xb6\xa5[\x0c\x8f\xc1\x80\xf7\xb2?\xc5\xea\xa0\
-\xaa\x15IF\x07O\xe5eRV\xd6*\x8f\xb1\xa6g\
-\x97W\xae\xdc\x8fp\xc3u\xa9\xad\xf2\xc1\xcb\xcb+;\
-\xa4\xfe\x9c\xe4}\x92Y\xce\x9c}\x85\x0e\x01\xd9*\xbd\
-\xb0eT\x9f\xef\xd0::\xd8\xa1U\xab\xb6W\xd6\xad\
-kL\x1a\xa0A\x97/\xf7%\xcf\xab\xac\xd5\xcb\x81\x03\
-\x5c\x01Z\xddp\xe6\xa3P\xc9l\xca\xce\xd1H\x13\x8b\
-\x02\xe7\xa4W/\x08\x06w\x03jC\xd9(H\x1c\xf6\
-D\xce\xa5\x1f\xae\x0543V\xb0\x8aE\x22F\x17\x8f\
-\x95\xe1-\xadf\xb2\x9c&\xd0\xdb\xd2\xb2\x1eV\x82\xb7\
-d\xacH\x8a^C\xd9\xff&B4\x92\x0d+{\xe8\
-\xc0g+\x83\xcf\xb5\x84\x8c\x87\xcen\xb4b\xe1K\xc1\
-\xf1\xe1\xf1\xe3\xbf\xe13\xdd\xa3\x15Mh\x00\xa9b\xd3\
-\x92\xe2\xe3MON\x9f^\x1d\xde\x5c\xea\x02\xfb\x0a\xbd\
-\x12v\xc0\x99\xf4J\x1a\xde:\x91\x1e`0d|k\
-\x00h\xaa\xd9\x9f\x5c\xa9\xc6\x96\x0e\x87OT\x9bG\xf7\
-\x946\x05\xaf'\x15\xc8&\xcb3\xd0\xaf`q\xd2\xd0\
-\xc4{\x8a\xd7\xf0,\xae5t@%\xad\x7f\xe8\xb5k\
-6p\xac\xdc&\xc7\x8a\x92G\xea:b\xc4NZ\xdd\
-\xb4J\xa1jI9B\xa55W\x1ft\x03zJz\
-,\x81g\xce\xcc\x90\xe7\xda\xf4\x03\x83e\xfc\xb4\xb6\x93\
-\xb7\xa4w2\xf6\xee\xfe\xfd[\xdc\xa6L\xd9C\xf7H\
-\xb1z-s\x1a\xdd\xe4\x19(\xbb\x92|\x1c\x15\x12\xb2\
-dC\x8d\x1a\x8f\xa5\xa1&\xc1\xf0\xech\xcb\x96\xc5\x86\
-g\x08\x8e\xa7\x84g\xcb\x12%B\xd0p\xf2%Dl\
-\xe7i\x87F\xb0B7\xd0h\xcd5\x0e\x8e\xa2\xf6d\
-\x9c\x07\xfb\xf5\xbb\x80\xfb\x0cM\x82f0T\x9b\xea\xd5\
-[\x84\xf3O\x08\x5c\xe8v\xf4\x07\x8b\xad\xa5\xbd\xb2\xe2\
-\xc1yr\x07N\x96\x85\xda\xad\xb8|\xb7n-\x8b\xb3\
-S8U'l\xa8Y\xf3\xbe\x92\x14\xad#U\xf4?\
-#um.U\xd2\x93'V\xa3\x9bOy)E\x7f\
-\x99\x1c&t\xce\xa3Z=\x8c\xe7G\xee\xe9\xb1\xf8\xa8\
-(SZ-\xff\x8b\x89\xb9\xadD\xa6\x81!\xc3\x03\x8b\
-e\xd6JN\xc5iB\xc6\x14\x11\x14\xb4J\x91e\xd7\
-Z\x15\xcd\xe9\x1dj\xcd\x8c\xe7\xf3nl\xde\xec\x18\xe0\
-\xecL\xa1\x88\x1c\x187\xcc\xeat*\xaa\x18\x07\x9bi\
-\xa4\x88m\x92+\xb1\x1b}6:\xcb\xd26T\xe3\xfd\
-Q`\x13\xf1_\x04&<H]\x0f%\xc4,\x91\x99\
-\xe0n@zR\xaeA\x1d\x8f\x93}\x01\xba\xa5\xa6\xb0\
-Em\xb7\x90\xc1\xf1\x04\xcf\xa7K)\x85\xc6\xb2l\x86\
-\xaa\xb8\x15\xb9\x87\xc3`E\xa1\x038\xfa\xfb\xef5\x90\
-oz[Y\xb9\x91\xf6\xe5\x16\x19\x14D\xaa\xd0\x0c*\
--A\xae\x9fr>\x98'2\x1bl|\xadC\xae^\
-\xb5\x95b\xadz\xd2\xc8\xf2\xa6\xa6\xb0\x85\xe7\xd5\x85\x16\
-\xd6U\xab\xb6@\xd9\x92\xca~xK\xc1l:\x108\
-\x9fx\xc5\xd6v\x0f<\x92\xef\xff\xe9\xdf\x16\xad\xe2\xa4\
-\x92\xf6\xaf\xe8\x06D[\x14\xc8\xa9-A\x90\xf6\x15\xf6\
-\xda\xf1\x9c\x82\x93%\x01\xe6\xc6`Ail\x0d)~\
-\x05\xba\x82#\xc9\x90\x90\x95\x7fM\xe9{\xae@1L\
-\xc4\xeb^\xa3\x106\x9cVHZ\x05\xa5\xe1\x1d\xd0\x91\
-\xcf\xf5\x0b\xc99P\x5c\xf2\x99\xbb\xfb\xd0\x7f`p\x13\
-\xa5\xd1\xbe\x06{\x89\x1f\x1d\x81\x81\x81\xfa\xc8b\x7f\x09\
-F\xc5\xc7\xc7\x1b\x8a,\x03\x83\x82\xc1\xeb\xabWw\x85\
-!}\x96\xc2\xb5_B||l\xa4\xc2\x96\xf6\xbb+\
-\xc0\x14(I\x1f\xa0\x98]Bt\xf4L\x1b#\xa3\x97\
-4f\xa6\xaf\xdfVGV\xf0\xdc`W\xb0\x9b\xf8N\
-\xe0\xefr\x86l\xd5\x15\x87R \xf2\xf2fG\xb8\xa4\
-\xaa\xf8Q\x81\xe5z\xb8tI\xbbk\x1e\xda\xe5\x81\xbc\
-=)U\x89L\x03\x83bU\x08&oZ[\xb1\xa2\
-z\xc5\x82'3\x1c\xf3\xd0[\xcb\xd8*\xd2\x16\x12\x95\
-\xe6\x81x\x7f\x1a\xa8G\x843e\xb6\xf4x\xee\x11:\
-\x864\x0b\xe7j\x97\x01\xa1\xbb\xed\xa7\xc8H\xb3UE\
-\x8bZ\xca:=\x0a\xa9\x94\x14?\x12`Lu1q\
-\xaf\x90\xf5\xf0\x9e\xe4\xbf\xa9?\x99T\xa7Z\xa7\x044\
-%\x1fd\xaa\xe1\xb1\xd1UC\x88`\xfa\x05\x0b\x8b\x83\
-\xa8G{\x07\xe7\xd6c-\xcf\xa5z\x15$\xc3\xd4\x14\
-\xb2E\xc8\xe1\x17\xf56\xb4U+/\xa1\x85\x99B\xe4\
-\xca*\xd5-Z\x95@opVZR\xba\x942\xa0\
-ss\xe7\x1e\xa6zC\xf0\xe73\xc6\xc6\xe5\x10N\xf9\
-(S\xe0\xae\xfch[\x98\x14\x8d\x0f\xd4BN\xa6\x09\
-\x8da\xa2\x9f!\x13\xe2\xb0C\xf3\xe6>\xd4C\x1a\x13\
-\x1c\x83gC\xa8<C\xfb,A\xab$\xf7\x1e\xcb\x90\
-\x1e\x02-`x\x8b\xa01\xb2\x8c\xb6\x95X\xe9:S\
-\x81'\x98\xe2\xd8\xb6\xad/\xc6F\x08@;\x93\xc5\xd3\
-\xc4d\xb7\xbc/\x0cZ\x91L\x9e<\xdf\xbd\x04\xcd\xb3\
-\x22\x8f1<(\xa8)\xbc\x97T%\xee\x87\xcf\xd1]\
-\xfc\x05\x942 )\xd2\x94\x80\x1a;c\xdc\x1b\x98\xe7\
-\xc93\x84\xc6\xd0^\xf9&R\xc5\xac~\xa4\xbe\x10\x02\
-\xe99>TV\x0f5'\x12\x86\xc9.\xcb/\xc2 \
-\x91\x16\x14\x17\x1en!\xf5.fQy\x06*\x95\x95\
-\xda-\x17\xadI\xee\xa31\x99C\xd9\xf1\x92\xfe=\x04\
-\xc0\x06`\x0er\xa4(\xf9\x97H\x0c\xbe\xfc\xe4\xcc\x99\
-r\x1a\xbb\x95\xaax\x16\x8cy\x8aF=\xdaT\x12\xa6\
-\xc5\xbdZ\xde\x0e[2\x7f\xa8+\xbb\xc2k\xf8P\xae\
-\x0c\x1eR\xfcG\x95\xc9\xe5L}\x82.]\x9a\x8cj\
-\xf9\x032NW\xedO\x16\x8338\xc3R\xc7W\x17\
-8\xf5\x94\xfe\x07\xcf\xc0\x97\xa4\x9e\x86/!\xaa1\x1c\
-\x0c\xe6\xfa\x91&s\x04mK\xa0\xb8;\x9f\x0c\x8e&\
-I\xc9\xed\x93\xf2h*\xf9^\xc9-\x8d\x1a\xf9\xd1\xb3\
-\xcb\x96\x96\xf6\x14\x03\xd2\xf4H\xa1\xc8r\xa7\xa2mA\
-\xfa\xf5\x22\xc3\xc0R\x0f\xa4\x13\x89\x06\x1c!r\xc5\x0a\
-\xc6u1\xae3\xc1pr\xb2\x5c\xb1\xb1\xd9#{\xa0\
-\xef\x00\xbf\xee\xeb\xd1\xc3SJ\xde\xcd\x02\x17\xa1\xda\xfc\
-8mGe\xdbe\xcb\xacH\x82\x06G]03\x9b\
-\x86\xa4\xe6\xcb0 [\x18SA\x8d\xed\xf2|\xdc\x87\
-j\x94\x01\x8d\xa7\xae\xaf\xe7\xe6\xcd;\xac\xfc\x8d\x91\x11\
-b\xbc\xcd\x8f:\x89\xb5\xc1N\xb2nK\x85\xf3\xdck\
-|\x03\xc5R\x1e\x9c\xd0\x00V\xc1\xf9\x94)N\xab\x9e\
-\xd0\xc2U[\xdb~\x08+|\xc6a\xfd\x09\x19\xaa\xc8\
-H\xb0\xd1\xd5\xc46s\x16Jy\x5c\xa1\x1e\xa6\xfe\xe6\
-\x97^\xbcw\x1e\xc6\xc6N\xe4D\xb1\xaaP\xa1\x8a\xcc\
-a\xa4\x9d\x8b1\xf8\xb3\xfc\xdd\x1c`+l\xed\x9e\xcb\
-,\x10\x0b\x5c\x0d\xc0\x1eTF\x94\xd9\x7fw0\xa4\x89\
-;\xdb\xb7_L}\xc8\xc1\xb1R\x9a\xa2\x03\x0cK\x1d\
-\xbfC\x0ei`LLL1\x0a\xf2\xdfwq\x19\x84\
-\xb3l\x22\xa5\xc6\xd1\xe7\x97\x89\xd2?>NN\x99\xb2\
-\x8c\x14z\xe9\xcc\x86\x89\x18\x06\xe6T\xfaF\x83&`\
-\xf9T<\x9d\xc7h\xf9\x0f<uj\x03\x9eW\x11\x19\
-\x0a\x864\x9c\xb6\xe0\x22\xca\xcb$\x91W\xd9\x9cd6\
-HM\xf8\xd5\x01q\x190W\x14\xa0UB\x02\xca\xd1\
-\x9e\xf4\xc7\x0c\xc3\x9da\x9a-\xdb`i\xb4\x8f\xc0n\
-Y\xf19\xa2BC\xa78\xb4l9JY\xc5c\xde\
-\xbe5=\xd8\xbf\xff\x85\x8d\xb5k\xdf\x80\xb7\xd6\x90\x02\
-\xe7\xa0\x0b\x1d\x7fdVN\xed\x7f\xd5\xb6\xe5\xa6\x83\x83\
-\x03V\xbaHEwP\xf9\x06\xd2\xce\x06'(-}\
-wv\xe8@\xcb\xff0\x91\x99`\xc33\x90:\x93\xed\
-\xe55\x87\x00\xb0\xdbP\x17\xb9~x\xfa\xf4w\xb9M\
-[/\xdbk\xf5\x11@bll]Y:T\xd3\xd9\
-\xd9Y\x0f\x19\xff\xea-\x9c\xe4):\x0ffE\xd9\x0f\
-\x98_#\xfdm h\x0ay\xc2\x89\x8a\xbe\x0a\xe2\x8c\
-\xc1\x18\x1b\xfdo\x9c\xc8\xaa(\xb7X\xe8ce\xb5g\
-C\xf5\xeaW\xb0\xcc_t\x1e4h\xd47\xdc\xbd\x01\
-\xd8\x02\xc4\x84?\x7f\xbe\x82\x8cUd9\x18v\x95+\
-\x8f\x972\x0f'p\xcd\x86>\xe6\xbdQo\xa7|\x81\
-z\xac\xabU\xab\x1a\xcd\xb1\x9c\xc3\x0e4\xee\xd0\xb4\xe9\
--h\x93xcw\x93,\xb5Hl\xc0\x82:\xa0\x1b\
-\xa3w\xdd\xde~\x1b\x1cy\xea\x12\xa6}\xdd\xbbw\xfe\
-\xd7\xd6r\x81\xedd\xd2\xac)8A\xb6=\x9a\xa6D\
-\xfa11\x7f\xd0d\x9d\x98<\xf9$\x9ew\xd12\xc6\
-*\xe0\x92\xcco\xe1\xc4\x88\x8c\x8c,H2\x08\xd2\xc0\
-6_\xb6\xb1\xa9\x89\x04bs\x94\xf9\xc4\xc9\xe2\xd7=\
-\x02\x90^\xe9{8\xff\xc5~x\xfcx\x159\xd1H\
-<\x08g\xf1\x07\xca\xee\x86j\xeft\xc1\xcf\x802\xa0\
-yO\xcf\x9e]O\x0e\xa1\xffL!%\x09|RL\
-G)\x84\x04\xc3-\x8b\x15{\x85\xd5\x90\xbc\x9c\x06Z\
-\x067Zz\xd2\xc23\xbf\x84\x84\xf1\xfe\xf1\xe3!\x90\
-f\x7f \xe7 \x19FvG)\x97\x91N\x072\xb6\
-)2\x9b%~W\xa7N[p\x7f\xcbu\xe8\xd0\xbe\
-W\xac\xad\xd7\xd28z\x10\x90\xb7\xba\xb4\x94=o\xa6\
-\x03e@\xad\xc12\xe2\xbf\x84\x80C\x87\xe6\xc3\x1b\xa9\
-\x8e\xe7\x101Q\xbeqQQ\x8d\x05\xa0\xa5iQ\x0c\
-\xe7\xc0hx<\xa3\x1e\xba\xb9\xd5V\x14\xabD\xa6\x81\
-\x9bN\xc2\xb0FR\xb6\x0a\xbc\x92\x01X\xc5\xde\xa3\xee\
-N\xe9\xfd]O\x06\xc5? \xc1\xe1=*\xce\xdf*\
-\xf3y\xb0o\xdf\xc1p\xa4,\xc1\xbcEC\xc6o5\
-\xe9hj$\x10;\x83\xe5E\xa6\x82'\xb2,8\x05\
-]W\xf6j\xa8\xf4\xde\xd2>hc\xcc\x98\x9e\x9d\x9d\
-=\x9bd\xc0;\xe0~\x88\x9c\xb4\xe3x\xb7\xb2\xc8,\
-p5B+p.h\xfa\xe5\xcb\x97\xa5\xd8\x96u\xa5\
-m&\xe6\xe3\x08\xcd\x07\xc5\xed^\x5c\xbch-\x9b\x95\
-\x04PC\x92\xa0k\xd7JB\x10\x96\x9av\xf4T\xf2\
-\x19)\x06Fq>\xca\xe1\x04\xcd3?\xb3\x88'\xb2\
-\x09\xbe-\x17Q\x0b[\xea\x8f\x86o\xcaEB\x82\xb4\
-\x07i\xeb\x09\xd5\xaa`\xec\xbd\xe7\x90w\x13\x8d\xdc\x0d\
-\x10\xff\xb9.\xcf\x10\x0e\x22\xb3\xc1jbe\xc0\x1a\x88\
-\xddU\x86\xe1\xa8\xbf()\xde\xfa\xdc\xd3s\xc9\x95m\
-\xdb\x0a\xc3i\xe2%\xd5\xc2\xca\x83*Y6\x94C\xa9\
-8\xa7\xfa\xb6\x87G\x8fn\xc2J\x99@\xf728=\
-\x8c3\x8b2\xbf\xfc\xa2\x072\x19\x96\xe2:M\xe3\xfc\
-6\x0dL\xf1^\xb3f\x1fm_\xe4X6\xa4\x18=\
-\x83\xb7\xec\xd3\xeb\xdb\xb7M\xc9\x08\xff\xa2\x97\xf6\x90\x8c\
-)\xa6d\xbc\xb9{w\xbec\x9b67h\xc5\x02\xa9\
-puYdp\xf0(d\xb1\x8c\xa7F\x8d\x9a=\xbd\
-W\x16-\xda\x0a\x95$'hW\xb3\xbbc\xc7iJ\
-\xe3I\x1c\x17\x94\xdd\xcd\xd5\xac\x11we\xf5\xe1rB\
-\x02g\x80Y4\x19h`\xb1\x03\xe3*M'\xca\x91\
-\x91#\xcf\xd2VE)\xbf\xc0\xd8Tp\x19\xd8G\xc9\
-v\xc0$*\xe2:~\x19\xd2A\x94\xe7\xab(8\x92\
-\x02\xe3$[\xa7\x91\x0b{\x93Dh\x0f\xfe\xfak}\
--o\xf5\xbc\x97\xfe\xfe\x95\xa9\x8f9V\xc5Ht\xcc\
-Y\x16\xec\xe3\xb3\x9a\x12$P\x00\xfb\xf4C``V\
-6ed\xb8\x9b\x9a\x1ab;\xf9\x9a\xb2O\xe8\xcc&\
-57\xa2\xa8\xd4D\x1e\xda\xf3H\x095ulH!\
-M8\xe5szYX4\x91\x93\x19\x14|\xf7n!\
-\x91Q`\xc3\xab\x0eN\xa7>\x01P\x89\x0eS\x92\xa2\
-\xbf\xa1\xaf\xb2@\xb35\x17\xcet;q\xaf\xee\x0d.\
-S\xc7\x18Y)\xa1\x16z\xe3\xc6\xac\x1d-[\xde\x80\
-\xd1\xdc\xa6N24Y\xc8\xf5s!\x85'\xe9f~\
-\x01\xa3\x8a\x876\xa3\xd3\x8d-[\x1c\x0f\xfd\xf6\x9b;\
-\xa5\xee`\x8c\xae\xbb\xe9}\x1a\x97\xado3\x16|\xbe\
-k\x19\xfb\xe1\xc3\x12\xea\xf3\x16\xfd\xf2\xa59\xee\x0b\x0b\
-\x0d\xe0pN\x9e\xca\x18\x9c\xc9_P\x221\x1d\x07p\
-\x96sF\x89\x90:\xb9\x18\xd4\x91s\x1c\x9f\xef\xc6\x91\
-g\x0c\x1dXn\xd2\xb7!\xca\x81\xae\xcbF\x0f-\xc0\
-\x14\xa7\x81\x03\xbdp?\x07\xec\x0c\x0es\x19:\xf4\x1c\
-\x8dK\x8f\xd9]\x0a\xb6g\xeadr\x19P_\xb0\x83\
-\x5c\xd1\x0a\x82\x1e\xd8u,\xc4u/\xf8\xf5\xf6\xee\xdd\
-\xdb\xf0\xbc\xae|\xbf!\xb8\x04\xe4\xe6\x8b:\x98\xb1\xd2\
-\x9a\xce\x0ba\x0f\x1f\xce%\x83S\xd2\x89\x8e\x8d\x1bG\
-\x85\xafy\x85\xc4\x89)SFJ/f\x12\xb4<H\
-\xcd\xcaHd\x09\x18T!\x8e\x80\xf8Ue\xbb\x0f9\
-\x07\xea\x117V3\xf1X\x87\x8d\x8d\xb7\x98`]\xb0\
-#\xa8\xa2\x06\xed\xd8\x92$R\x03?c!\x8c4b\
-w\xa64\xb9\x07\xfa\xf6\xbd(\xa5\xb0\x95\xec\x961\xe0\
-\xb8\xcc\xd5^d`\xfb8\x98\xd4\x00\xa8\xa8U\x1dF\
-\xc8\x9b\xf7\xdc?\xf1\x1c\xd3\xf9<\x8b\xba\xbd2\xe0j\
-\xde\xaf>\xb3\xa9T\xe1\x94\xa1\xae(\xf5\xe2\xf0\x1e\x05\
-\xc1\x18*\x98\xa4-\xcd\x0c\xa5\xcc^\xf2\xablZh\
- 2\x0b\x5c\x06\xd4\x1e^I\xb3\x03}\xfa\x5c\xb4*\
-[\xf6\xea);;}\xf1\x1d C\x05\xdfK\xe1\xe1\
-N\x22\xd3\xc1\x93Y\x83\xb2\x1c\xec\xeb\xd6\xf5Cl\xee\
-\xa5R\x82\xe1>\x7f\xbe+\xd5HQ\xfe%\x8d\x91^\
-\xa6\xc7\xe2\xc5\xfb)\xf0\x8as\xdd-)\x1f\xe7*2\
-\x1b\xac\x16\xfd+h\xfaOj\xd1\x10R\xb8\xab|q\
-fv\xed\x1d\xc0\x90\xdb\xccy\xe4XQ4\x15\x91\xe5\
-\xfeD\xea\xe6\xaf\x93\x06\xf7\x19[\x9a\x08\x97\xdf~[\
-\x85\xac\x95\xc9p\xc0\xf8\xd3{\xd8\x8e6\x14\x99\x0en\
-\xc3%\xbe\x13\xca\xb9}[\xd3\xa6\xb7OL\x98p\xfc\
-\xc1\xb1c\x1de\x8b\xe65\x99_\x91\xc0\x13Y\x04\x15\
-\xcb\xc3\xd0z\xf7\x04Z\x199\x91\xdb\x19\x07\xf6\xedd\
-p~\x0e\x0e;\xd6V\xaa\xa4h\xd5{ok\xd6L\
-\x1d2\x80L\xbb\x89\xc8t0L\x84\xe8\x89y\xf8-\
--)]J\xdd\xa4F\x19\xd0\xb0O\x1f?\xb65\xcf\
-\x95\xeb\x8c\xa2\xaa\x9c5\xe2\xae\x5c\xbd\xdc\x05\x9c\x07\x96\
-\xda\xda\xa8\xd1\x1f2\x8d\xe84V\xb6)\xd8R\xeeF\
-:Q\x08\x8d\x11\xcf\x9b\x98X\x88L\x07\x83\xb2\x83\x90\
-\xc0@=\xc8/P\x87\xd6\xbfipS\xe5\xae$\xee\
-@\xbf~\xb6\x8a\xe3\x05\x9d_\xcf\xd2.\x06\xbb\x9a\x87\
-\x07z\xf7n)\xb2\x0e\x8c\xa8\xa8\xa8B\x1bk\xd5z\
-\xac\xc8\xba9\xf5\xef?\x07-o\x17\xa3;\xcbq*\
-'\x81L\xc0\x08\x91U\xe0/\xc6\xa1~\xdb\xb7OA\
-\xf8\x86\xb6\x84\x8e\x14\x18\xff\x13c+L5\x91\x90,\
-\x0fC\xb7\xa0p\x9aO)\xdf7\x1e\xd7/\xf8b\xbd\
-+\xcf\x86\xfdD\xd6\x82\x91\x10\x17\xd7\x17\x92}\x97\xa0\
-\xd6\x14'\x9d%aP\x15\xde\x01w5MP#\x91\
-\x95`\xc3\xab\x02\x8ew\x192d.\xe6\xe5&\xc9\xdb\
-i\xca\x99S^,\xc6L5\xcb\x80>EG\x9bA\
-\x5c\xf8\x1c\xaaK\xe2iL\xa3Y\xe3O\xa0\x8e\x84\x0b\
-8\xed\xa8\x0f\x89\xd2BM\xd8\x09\x89\xb6\xfe\xd6\x86\x86\
-;1VBgd\xd2X\x1d\xba\xe9\xa7\xa8\xa8\xc9(\
-J^M\xb9\xb0\x8aP\x11\xaeE\xb13Q\xcb\xddA\
-\xb8\xf5c\xd8\xe3\xc7se\xef\xf3^nS\xa7\x1e\xd7\
-j\xd6\xa8c\xe0\x89-\x0dvU\x0a)S\xe9&\xc3\
-\xc8\xfa\x9ep=\xb1ZM\xc69\x9b\x9al4\x11@\
-\x88\xaf\xef\x14J\xeb\xa3x\xab]\x95*V\x18\xcf\x0f\
-\x16\xc6\xca\x16J\xaap\xc8\xdf4\x95\x9eO]\x05\x17\
-\xbe\xea\xf4\x04\xf1\xfc\x94\x02G\x82\xcd\x15\xef3\xf8\xfb\
-+??k\x1c\x03Fc\x05|\x08\xaa\x8f\x07\xd47\
-\x0e\xcf\xfem*\xdd\x0c\x92\x02\xa0\x8c\x15L\xf4\xef\xb8\
-\xf6!)v\xea\x1a\x841CJ5\xe2\x8a\xe5\x8c\x91\
-\xb7\xd3Nr\x00k\x22\x943\x1a\xdbKu\x19\x10\x14\
-\x00.\xfdK\xcfm\x0c\xc4\x7f\xb6\xd2$\x7f\x83\xb1\x94\
-\xaf)2\x03l\x88\x95i\x1bI\x8e\x93\xd33fX\
-\xfdK+A\x18\xd8\xd2t\xa2\x0e\xaf\xd4\x01\x08}\x10\
-\xec\xd1Hb\x13\x0e\xee[\x0e\x0d\x1e\xbc\x0d\x9a,V\
-Q\xc1\xc1\x15\x05 \xeb\xf4\xeaSp\x17FXId\
-\x088[\x05\xec\x07\xce\x00s\x89\xff\x10T\xff\xa5\xb3\
-\xdf\x85\xa5Km`h\xd3+t\xe8\xb0\x7f\xa4\xbb\xbb\
-\x0b\x86\xf5\xc1\x9c`v\xd0{\x89JU\x06\xd1X;\
-\xdck\xe6\x0a^\x04\x07\x98\x09\xf1A\xa4\x0d\x0c\x06\xeb\
-\xae -\xcc\xdfLO/Q[\x1f\x13+ZS\x92\
-\x7f#I\x88=]\xba\xb8\x5cZ\xb1\xc2\x01\x9a\xf6\xe7\
-e\xec\xef\xdewt\x0ee0\x18\xc1\x97/\xf7\xa4m\
-%\xb2\xd6\xbd5Wx\x18\xdbcdM\xc4@\xc3\x9e\
-b|\xf3ef\xfc\xa8mM\x9a\xa8s8\x91!\xf1\
-\x9bH;\x18\x0c\x0e+\xa0\xfcG\xad\x08\x86\x92\xa0.\
-\xb2\xc0\xb5\x92T\x18;IRp\x9az\x1e\xc1\xbe\xbe\
-\xbde\x9f2\x17\x8d\x96\xbe\x07\xd3p\xbec08\x88\
-\xeeme\xb5\xfb\xdd\xc3\x87\x9d\xa5\x11\x8d\x07S\x1e\x1c\
->\xbcF\xbb?\x02\xda\xf4\xe6\xa3g\xdb[\xb6\xf4\x16\
-\x00\xb6\x97vt\x0f&\x80K\xff^\xf53\x83\xc1F\
-\xd7\x04l,\x00S=\xbdndD\xf0Z\x9a\xa4\x92\
-x;@J\xc39\x09\x00\xdbQ\x1f\xe4\x01&\xa1\x1d\
-\xd4cdK\xc4\xa4\xb13\x10\x83\xc1\xf0\xda\xb0!/\
-\x95\x8dX\xe4\xc9\xf3\x8a\x82\xe4Z\x05\x93\x11\xa8\xd9\x8a\
-\x89\x0c\x09\x99\x8d\xfbj\xe0W*\x80\x85\xb1.F\x22\
-\xae9\xae\xa4\xadi\x8d\xf1+\x7f\xd1]\x86\xc1`\x90\
-\xf7\x91<\x94\xd0\xdbW\xf7\xbc\x86\x07\xf3*\x0c\x88\x8c\
-k\x9dl\xf1\x14Ez\xfa\xd4\xc0\x9d\xc6\xc0\x94{\x07\
-\x0elF\x1b\xdc\x89\x10\xd4\xb9gch\xd8nU\xb1\
-b#\xb1\xda\xc5J\xbd\x95m\xbc\xcdd0\xbe]\xab\
-\xb5\x0aL!B3\xf3\xbeu\xd9\xb2\xf7\xd5\xdd?U\
-\xaa\xd7H\xb6u\x97=\xb2\xc7 \xab\xbd0\xc6b\xd0\
-\x1b;tO\xb7n\x07\x15\xfd\x15l1\xed\xa2\xde\xbd\
-\xab\xb4\xaeJ\x95g\x10\xb0\xfd\x8c:=o4,I\
-Md\x87\xc1`l\xaa]\xbb\xc1\xa6:u|Po\
-GF\xf6\x15\x86\xe5\x0e\xc5\xb0\xe5\xa4\xb1\x22\xab\x12F\
-\x82\xfa0\xc2IRQ,\x86\xaeH\x15\xfbHW\x8f\
-E\x8b\xf6\xe1\x99\x19\x8d\x1d\x195\xea\xac\xfc\x9d:\x1a\
-\x06\xddI:Wr\x0b5\x18\x0c\x16\xa9\xfd#:4\
-t\xc5\x8e\xd6\xad\xaf\xc8\xda\xad\x9b\x90\xf4>t\xc9\xce\
-N\xe9W\xae\xa2\xb6\xbc\x1a\x8a\xd0\x97\xa9\x09%\xddC\
-\xeao7U-C*\xe06\xb2\xe1\x17jw\xe7T\
-\x8a/M\x84\xe8+\x140\x18\x82\x0d\xcf\x90DOI\
-[\x1f]B\x9fA\xc0\xe8\xce\xd6\xc6\x8d\xcb\xcaU\xaa\
-\x89bl\xa4\xcdH\xd5\xe68\xf3\xdd\xa5VOX\xe9\
-\xa8\xc3\xeb[\xd9\xbc\xb0\xa6|\x7f\x18\x0c\xcd\x1dF\xf6\
-K\xd8\xa3G\xd5<\x16.tI]>\x80\xc1`\xc3\
-k\x0f\x9aJ*\xb5Z\xaa\xe3\x13&lr\x9b6\xed\
-8\xc6\x8c\xa1.V\x13\xe7\xb5X\xe9dI\xbew\xf0\
-\xe0\x16\x8cw\xd5\xa8L\xe8\x85\xe7qt\xce3\xcb\x99\
-s\xdf\x9b{\xf7\x06\xe1yu\x91:\x18\x0c\xae\xe5\x02\
-\x0d\xc1l\x1acm\xc0\xd9\xa0\x11\x0c\xa9\x86\xb2\xe2\x1d\
-\x9f8\xd1\x0dc\xe3@=\xcd\xdek\x81nn\xeb\xe8\
-L\x88\xed\xe9s/S\xd3\xb4\xaaD3\x18\x0c\x8d\xc6\
-\x92Eqf\xbb\xba\xa5A\x83{2\xef\xb2\xa0\xd0\x02\
-r/\xb7\x93A^]\xbbv7\x9e\xd7\x17\xff\x08\x0c\
-\x06\x1b\xdf\x88/\xc9\xc9\xe4\xc9\xac*\xab\x0d\xfa\x82]\
-\x05 W\xc0\xa4\x0d5k\xde\xc7\xf3\xc9\xe0_\xc6\xe5\
-\xa4c\x86:\x07\xd5\x12\xa9\x82\xc1\xe0n@\x86\x1a\xee\
-\x7f_0E6%\xb9\x883\x5c\xf23O\xcfux\
-\xa7R*\xb1\xbf\xfa\xe0b\xbcg\xbcX\x88\x9a\x8a\x0c\
-\x04\xee\xc30\xfe\x19\x5c%\xfe\x1c\x0c\x06W\x94# \
-\xeeM\x86F\x86gU\xa6L\xe8\xfb\xfb\xf7G\x0b-\
-\xc0\xa8\x96+As\x85\x18[(\x80\x9d\xed\xda\xed\xa6\
-{xG\xd7\xfe\xf5\xaa\xc8`\xb0L\xdc\x10Z\xd5\x14\
-\xb5h\x18_8\xae\x03\xb4\x9bY\xa0\x05\xf3\xb3[\x8e\
-\x8e\xdb.\xaeXq\x00Z\x8e\x0feJ\xd8t\xbc\x1f\
-\x81pCXBl\xec\x22\xea\x1e+\xfe\x12\x0c\x06\x1b\
-^%\x90\xfa \xec\x81a\xbdFB\xf4%\x0d\x83\xdb\
-\x01\xa6\x84^\xbbfCg@\xb0\xd7\xc7\xb7og`\
-5|M\xe3D\x9f5k\xf6b\xbc\x89H\x13\x18\x0c\
-\xd6\xce\xfc\x05\x0dH\x16$'&\x92c\xa5\xa8\x00\x10\
-L?D\xabYxP\xd0\x10\xc5\xe3\x89\xab\xde\x96\x86\
-\x0d=\xc9\xd8\xd6W\xaf\xfe\x08\xf7S\xbfo;\xc9`\
-\xb0\xe1\xe5\x06\xab\x83*\x99\xb7\xa9\xce\xb9\x5cS\xaa\xd4\
-iE\xde\x81\xfa\xa2!\x8f\xf3>%>?uw_\
-O2r\xb2\xb5\xd3`p\x198\x99\xda3\x8b\xb4\x81\
-\xc1`\xbc\xf4\xf5-\x8b\xb6L\xc1r\xfb\x18\x80s\xdb\
->\xf0\x19\xddC\xb8\xe8\x0a\x8c\xed7\x12\xa6\xc5\xd8\x0d\
--\xa7\xca;\x5c\xcb\x8b\xb4\x81\xc1`\xc4GD\x8c@\
-\xb7\x19\x0f$G\xdf\xa1\x8aq2(\x14\xb8\xc6\x22\x17\
-s9\xc9\x82\xe3~+\x8dm\xfb\xe5\x97\x0b\x0f\x8f\x1f\
-\xdfDr\xe0H\x15\x8b\xc7\xbb\x8f0\xbe\xc4X\x08#\
-\xf1\xef\x03\x83\xb65\x22\xa3\xc0M\xea\xfb\x83&\xb7\xf7\
-\xee\xdd\x06cR\x97\x05\x1d\xe8\xdb\xd7\x8a\xb6\x92H\x88\
-\x8eFM^0=\x07{\x80}\xdc\x17,\xd8\xa7\xb1\
-\xe2\xc5\x9b\x08\xf1/\xeb6\xc3\xc6\x96\x8d\xb6:\xa0\x17\
-i\xf0\x8b\x8c\x02\x1b\x9e\xd1k\x7f\xffU\xbb;w\xbe\
-zv\xde\xbc1T)N\x15\x08\x1b\xeb\xd4!\xe7I\
-5!\xb1\xbbc\xc7\x81dl\xf0x\xc6\x22\xa5\xec>\
-\xb45g\x8a\x7f\x17\x18\xf0\xa8\xf9K\x11\xd4g\x22#\
-\xc1\x86W\x06\x1cM\x14\x80e\x89\x12\xf7\xc9\xe8V\x97\
-(\xd1C\xee4r*\xe1\x04\xa5Z\x01\x9c+3S\
-\x86`|\x22V\xbc\xe6?\xb6\x8a6\xafp\x0d\xa9\xa8\
-\x92&\x19\x9a\x1d\xc1\xd2\xad\x9d\x09`x-]:\x09\
-\xe1\x83x\x18\x1de\xac<\x00\x03\xc1\x14\xabR\xa5^\
-%%$\xcc\xa3\x00;\x1c/\xad0\xf6A\xcb\xb1r\
-\xcbX\x88\x0aB\xa7\xc1H-\xde\xa3J\x11\xc2NO\
-O/I\x00\x06\x85\x0a\xc5\xd3{\xd2\x10\xf3\x92B\x95\
-L\xd2\xcd\x00\xf0\xb9\xb9\x8d\xa9\xe9\xdeAG\x8f\xdaW\
-\xe9\xd9\xd3;O\xc9\x921*\x95\xcaH\x00m\xcc\xcc\
-\xce\xe6\xd0\xd7\xf7\x98\xa6R}\x8ez\xf1\xc2\x05CE\
-*u\xea\xe4\xd1w\xef^\x87\xea\xfd\xfa\x9d\xcf\x96-\
-[\xed\x1c*\x15U\xac\xffH\xbd\xf3\xd8\xe00aC\
-TB4\xab\xd4\xa5\x8b\x9f\x00r\x15*\x14\x8bK\x1c\
-\x8c\xac\x11\xae\xfex6\x0b\xbfD\x09\xbav\x22=\xc1\
-\xc6F\xbb\x88\xb7X\xd9\xf6\x04\xec\xdb\xe72\xe4\xd8\xb1\
-\x03\xed\x96-\xbb\x8f\xb1\xec\xa5 n\xd4`\xdc\xb8k\
-x~\xab\xb0\x10\xedq-\x96-{\xf6\xcfA\x9e\x9e\
-\xado\xac_\x9f\xa7\x8b\x9d\x9ds+ccW\xac~\
-%\xf1\x059'\x95\xfc\xcd\xb9\x98\xd7\xa3B\xb7\xc0\x90\
-\xe7\x82\x97\x10\xca\x09{t\xec\x98Zax\x7f\xef\xde\
-\x94\xf9nL\xe5&tO\xb4,^\xfc\xdd\xb6\xa6M\
-\x1d\xd2\xb7\xb7\x17;\xaa\xd6V\xa8\xe0h\x8a\x15\x8c\xe4\
-\xf9p\x7f\x1b\xd7\xc4\x95\x05\x0a\xbc\x96M\xe7\x8d\xe4{\
-}\xc0\x94\xe3\xe3\xc7\xbbAW\xe5<\x0c4\x91\xe6\x0c\
-\xd9*\x0b\xe9\xec\x87\xdc\xcc\xcb\x02\xa0x\x1e\x85\x11L\
-\x84\xe8M\xff\x9d5%J\x5c\xd1\xa1\xe6\x87\x0c\xda&\
-b\x826\x83)\x9e\xa6\xa6\xce\xe7\xe6\xce\x9d(\xd5\xa9\
-\x12\xe8\xba\xb2`\xc1'+\xf2\xe5\x8b\x86NcR\x88\
-\x8f\x8f-&o\x09XP\xa4'\xd8\x81\xd2\xf1\xb1\x9b\
-\xdbF\xc4\xe0\xaeC~/\x18r{\x1e\xd1\xaf_\xaf\
-\xd0\xd4CY$D)R\x18\xc3\x97^\x10*\x14\xc6\
-\x05yy\xd9A\xa2\xef\x16\xcd\x91\x0c\xa0{\x0b\x00\xde\
-\xe5\xca0\xb4\x8f\xca\xb8\xbf\xa3\xe3v\xccWY\xa1\x13\
-`\xa80)o\xa5\xeb9\x06\xcd\x09\xe7C\x89\xb8\xaf\
-\x9c\xac\xaf\xdb[\xb5:\x8fX\x90+\xdd#^t1\
-><|\x08&\x9d\xcaL\xa6\xa6{\xbc\x8e\x8d\xae\x0a\
-8\x054\x95\xec\xa4\x9d[\xe9\xf2\xdbo\xea\x9cL\xac\
-\x86\xcf7T\xaf\xbe8\xec\xe1\xc3\xb9W\xed\xecv\xad\
-.^\xfc\xcd}\x17\x97\x8d\x8a\xdc\xc3\xf1q\xe3\xf6\xd0\
-\x9c\xc9\xc6%\x1fuh\xbe\x18\xd7\xb7l\x19\x8e\xc9S\
-\x97\x95`\x1b\xe3\x8d\xab\x014\x1a\xdd\xbc\xd7\xac\xd9\xf7\
-)2\xd2\x0c\x9e\xb3\xd7P\xa7\x8a\x80f\xa3\xd9\xd3\xb3\
-g\x8bc\xb2C\xa4w\xecf\x86\x1c\xd4\xd9\xf0\x8a\x81\
-E\xbe\xf1\xac\x86\xe7\x92%\xce\xe8\xe8\x1a\xa64\x16\x81\
-\x00\xed\xb9\x98\xb7o\x17S\x89\x90\x00\xc6\x0b\x91\x03\xbb\
-\x91@\xccY\xecE\x0b\x8b\x03\x96\xc5\x8a\xbd\x92\xef\xfa\
-I9\xf7,\x06OpIp\xea\xb5\xf5\xebw\xa1G\
-\x9a9\xee\xf5\x1f\x9d<9\xc6o\xdb6\xeb5\xa5K\
-\xaf\xa6\xc9\xa2U\x0e\xe3m\x05\x007\xf5\xfde\xfa\xfa\
-\x09\x08\x1b\xdcq\x1d:\xb4\x94\xf8\x062\xac\x91!\xcf\
-W\x03\xc8\xf5\x99\xf8o\xdf\xbe}K\xa3F\x97\xa0\xa1\
-\xe2{v\xf6\xec\x0a\x8a\x91R}\x1d\xcd\xd9\xc9\xa9S\
-O`l$B\x0a\x0b\xa8\x1d\x17\xcex\xde\xa7\x16.\
-,\xa6yv\xcc\xda\x86$\x5cV\xd2\x04\x1c\x0a\xe6\xc6\
-d\xec\x97[\x92$\xd4l\x05a\x82I\xb5*\x87\x00\
-\xb0\xda=@>\xe0\x1b\xb9\xedi)\x83\xb0oq%\
-\xe3\xcc+'\xd3\x8a\x0e\xf4\xe0\xd0\x0c\x0b\xccr\xaf\xec\
-\x16\xe0d9\x0f\xcd\x95\xd5\x8d\xe4\x1ahU\x83\xa1\x91\
-\xc8\x91\x01\x98\x0b\xec\x0a\x9a\x80\x0d5\x0cn4\x18\xa5\
-\x039\x9a\x8c\xeb\x0e\x0e\xb5\x1c\x9a7\xf7%\xef\x17\xa5\
-\x15\x85\xdc\xb8\xd1XH \xe16\x18\x0d-^\xc8\x82\
-K\x95\x99\x81Ak\x0d\xe9\x803\x02\xc0\xef\xac\xa4{\
-I\xcf\x0c\x95\xfbf\xe3+\xa8\xe9XQz%$%\
-%5\x14\x1a\xd0\xee\x7f\x07\xc7L1\x1c\x17\xa2pf\
-\xf7\xd2\x8d/E\xae\xe7\x1a\xf9\xc0\xd5\xd5\x1e]C]\
-\xe9\x5c\xa1!v\x1a\x06U\xaa\xc0\x9b\xfb\xf7\x97\xc6\xe4\
-Z\x90\xeb\x99\xbcg\xe4T\xf123\xb3\xc2\xbb9!\
-\x82\x1a\x80\x950\xcey\xf0`\x0flA\xef\xec\xef\xd9\
-\xb3\xc4\x1fB\xe8g\xf8\x16\x86\xa1\x82.\xca92:\
-\x9c\xb5\xcf\x90\x1a\xd8\xb7j\xea(\xb4\x83\x941\xb5\xa4\
-\xdf\xd2\x1c9\xc6\x08\x9d\x00\x1b^\x0dp\x0ch$$\
-\xa08\x1cG\xf18\xc4\xe8\x82h\xb2\x90\x03x\x1d\xe1\
-\x02k\xbc\xb3\x80\xde\xb524lO\xe3\xfb\xbaw\xf7\
-&\xaf\xdb\x87'OV\xe3\xda\x14c\xce`\x0c\xb8\x80\
-\x8cOd\x08\x18\xc9\xc9\xc9m\xf6\xf7\xeau\x09\xded\
-%4@\xba)&\xdf\x98\xdf\xb2h\xa9\x1c\x08'\x0b\
-\xcdKi\xa1\x13\xe0\xb0A\x0d\x8d}\x7fA*)\xa1\
-\x89\xc4$E\x9c\x999s\xb7<C\xfc\x0a\xe6\x93\xef\
-\xec\xa7w\x9e{z\xda`5\xdc\x80\x9f\xe3a\x9c\xe3\
-\x0e\xf4\xee\xddru\x91\x22J\x11\xe6]0\xe3T\x89\
-y\x87\xd2-1.n\x199\xc2\x0e\xf6\xebw\xf8\xea\
-\xbau\xc34\xe6\xb0\x22X\x0d,KU\xe7(\x15\x1a\
-C;\x14l-O\x8b\xac\x05C:DRp=\x0d\
-\x8e\xc3\xcf\xaf\xc1\xaf\x0eM\x9b\xde\x92+\xd7,\xb0\x9a\
-\xc6d\x96\xa4-&\xce\x07A\xb6\x15*\x5cU\xceq\
-v\x95*\xd9\xfbl\xd8`\x04q\x9dw8\x03\xc6c\
-\xf5;\xf8\xcc\xcf\xaf\x80\x90\xc8\x983\x04\xf73\x07\xdb\
-\x81\x13\xc1\x812\xc9\xa19\xcd\x87\x16)\xae\xf7U\xaa\
-\x8d\x0d\x11Y\x07\x86i\x8d\x1a9w\xb4lyB\xd1\
-\x5c$'\xca\x85e\xcbv\xcal\x93\xee\xa0\xbe\x96\x81\
-\x9a\xc8\xd5O\xfd>\xa4\xdfB\xe9z\xd1\xdc|\x17\x9e\
-9\xd1\xe4R|\x0f\xbf7O\xcbP\xc7\x82\x9e\x8b\x85\
-\xc8\xe0\xc6\x17\x9cF\x06\x89\xbe9\x88\xe5\xad?9i\
-\xd2\x96\x83\x03\x06\xectl\xd7n\xbfc\x9b6\xe7\x90\
-\xe4p\x13\xce\xb0#Y\x1c gP\x95\xb2Zs\xb1\
-f\xcd\x87d<\x10==\xa5(\x0fkBV-\xbf\
-R\x0c\xf3\xd8\xd8\xb1\xce\x108\xf5\xa5{\xf4_;)\
-\xd3\x8f<\xf1\xbb\xd3A\x03\xf9;\xca\xd5\x8a~\xc7\xd6\
-\xc8\xa8\x8d\xc8P0d\xf8\xa7\x0f8\x04\xfc\x1d\x9c\x04\
-\xce\x04\x17\x82\xc6\xbaS\x92\xc5\x9a\x8b\x93\xa9=S\xec\
-\xfb\xf7\xa3\xbf\xf1\xedY\x8f\x12j)\xe7\x922\x1c\xa8\
-\xd9\x05\xf2\x02\xef\xd2v\x85VH\xeb2e\x1e'\xc5\
-\xc7\xd3\xcaXZ\xae\x86\x0b)\x0e\x04\xce\x89x\xf6\xac\
-\xce\x0booR\x1d\x1e&\xb2\x1a\x1c\x8f\xd5\xa1\x15\x8e\
-'\xa3\x11\xd8L|\x03O\xce\x9c1\xbe\xbbo\xdfV\
-\xfa\xc6\x0c\xbey\xb34\x8c-A\x8a\xe5\xc4\xbc\xf2\xf7\
-\xb7\xa6\xdf\x17\x12k\xabU\xab\x853\xddSz\x0e\x06\
-\xde9x\xb0\x954\xc6\xbf\x09\x06\x83\x8d\xb2\x82\xf4X\
-\xe6\xc7y\xecg\x19\x0f\xfa\x0a/\x19y3\x07h\xf7\
-b\x0b<sf\x05m%\xad\x0d\x0d\x03\xbew+\xc3\
-`0d.\xe5\xa1\xc1\x83wQ+_\xa9*\x9cS\
-h\x01[\xcd\xa3\xe0\x97\xc7'Nl\x94\xed\x9f\xfe\x01\
-\x18\x0c^\xf1:\xc8\x80x\x09yn3\xc7\xaa\xb7\x02\
-\xcco\x22\x84:@N\x8e\x15<\x1f\xfew\xa5\x08\xc0\
-\xcd\xf8\xefLJ%9\x9a\xc1`h\x86\x0e\xe0P\xd9\
-!\xe3zop}\x8e\xc0\xf8G\xc4\xf3\xa8)}q\
--\xc32\xc0;S\xc0\xd3D\xdcO\x04s\xabKO\
-\xf4\xf4\xae\xc9s\xdfq\xf1\xa7`0\xd8\xf8\x9a^^\
-\xb5j?\xaa\xc8\xdf\xc9\xf6M\x11\xe7ML\xe6ho\
-Ead'd 6^C\x9d\xea\x18=\xdb\xda\xa4\
-\x89+\xdd\xa3\xe4\xc4\xfa\xaf[;1\x18\xdc=\xb4i\
-BL\x8c\xf1\x91\x91#\xcfR]\x9d4(K\xed\xec\
-\x16hu\x5c\x8b\x0b\x0b\xb3\xa0\x8c\x16\x14\xc4z\xca\xf8\
-\xde!\x5c\x13\xd6V\xaa\xf4\x9c\xe2y\x7f\xdf\x85\xcd`\
-p\x13\xc3^o\x03\x02,\xb7\xb7ly\x1d\xc5\x91N\
-\x1a\x8d\xebw\x83)\xafn\xde\xb4\x92\xa9Iu\xc1\x9e\
-\xf6\xf5\xea=P\x82\xea\x0f\x8e\x1c\xb1\xc7X\x1a\xb3R\
-\x18\x0c6\xbcR2\xdba\x89\xe2X\x81|\x00\xe9\xe9\
-\x7f\xbdw\xe0\xc0p\xa1\x01H}\x9f\x22\x83C\x1a\xd2\
-\x0d*\x1d\x12\xdf\x0d\x06\x83\x0d/\xaf\x90@n\xdf(\
-2,\xd4\xd3\x05*\xb5\x5c\xb8\xaf\x83.2\xa1(\x98\
-\xfc\xf4\xfe\xe1\xc3\xd5d\x9c\xc6B\x94\xc3\xf8:\xd0\x13\
-\xdb\xd0\x03\xb8\xb6\x13i\x07\x83\xc1\xf2\x01{\xbbu\xbb\
-\xacd\xb2\x83!`<\xdd\x1f\x1d=\xfa4\x9e\xf7\xc0\
-}E\xd9;-\x05^K\xa5\xee+\x09\xec$t\x12\
-\x0cV^\xd6Q@\xe2;f\xa8\x9b\xdb\x92\x9e[\xb7\
-:V\xe9\xd1\xe3T\x9eb\xc5\xa20\x9c+\x07\xcaz\
-:XZ\xfa\xe0gO\xd0\x06\xef\x15h:k\x96\xcb\
-\x92\xcf\x9f\xad&\xde\xbae\x9d\xa7x\xf1(U\xb6l\
-.0\xc4\xb3\xe0@\x91&0\x18\xbc\xd25\x04\xc7<\
-9{\xd6\x16\x89\xcf\xea*\x04\xb4\xeeu\x90\xad\x9d\x12\
-m\x8c\x8c\x82\xf1|\x8et\xaa\xd4\xf7\xdd\xb0a\x95V\
-\x9d\xd7\x12\x91f0\x18lx\xd9\xd1\xa4~:U \
-\x04]\xbe<Z\x008\xcf\xc5\xa3\x93LH\x5c\x5c\x5c\
-Y!aS\xb1bw24(V\xbdw\x19:\xf4\
-\x9c\x97\xa9\xe9T\xf1}`08[\x05l\x0fv\x15\
-\xc0\xba\xaaU=\xa4\xaa\xb0\x05\xaeEAC\xd0\x9b\xc6\
-\xae\xd8\xd8\xec\x91U\xce$\x1d\xd0\x00\xcb\xdcz)\xfb\
-\xb7\x00L\xab\xe47\x83\xc1xx\xe4Hge\x9bI\
-Tz\xdaAM\xec\x91\x94\x0b\xcf\x86\xb1\xe1\x8a|\x1f\
-\xe9\xaa\xc8\xf7>\x9a\x08\xd1S0\x18\xec4\xf9\xdb2\
-\x01\xb5.m\xdc\xe8;\xfe\xe6M\xcb\xce66{+\
-w\xef\xee\xaa\x87\xa2W\x95\x9e\xde\x97\xaevv\xe7\xf0\
-\xca\xd9\x05*U>\x5c\xb7\x82\xaaj\x90\xef[\x1c\x1f\
-\xbf\xa6\xdb\x86\x0d\xbb\xf5\xf3\xe6\xfd\xa2\xa7R\x1d\x86\xf1\
-\xfd$\xb4@y\x9a\xb2u\x14\x83\xc1\x90\xc6V\x18\xfc\
-L\xaa\xce\x88\xd3\x8d~{\xf7n_\xe7_\x7fU\xab\
-D\xef\xed\xda\xd5\x87d\x034[;A\x06<\x9c\xae\
-\xe8\xfes\x03g\xc0\xb1\x0f\x0e\x1f^C\xf7\xd0\xe3w\
-L\xc5\x90w\x82\x81\x1aC\x0c\x06\xe3\xe8\xef\xbf\x1b\xc3\
-\x80\xdek\xc4\xe9R\xec*W\xbe\x81f#\xcb\x14}\
-}\x13!:*q\xbb\xcb\x96\x96{\xf1~(\x19\xea\
-\xf2<yv!!\xfa3R\xc9\xfc\xa5\x91\x95\x06=\
-@K0\x05\xe9c\xe7)\x0e(\x140\x18\x82\x1d(\
-\xb5\xe2#\x22LN\xcf\x9cy\x04\x92\xde\x17\x5c\x87\x0d\
-\xdb\xf3\xe5\xcb\x97\xa5\x18o\xa1\xb1Z\xe5FEB$\
-2Sb\xdc\xa6O\x1f\x97\x10\x1b\xbb\xe8\xf0\xf0\xe1'\
-Q\x1e\xa4\x0e\x92\x1f\x1a4\x88\x0cK\x8f\x94\xa0\xcdr\
-\xe4x@cD\xa8Y9i\x95\x0a1\x18\x0c\x12\x9d\
-\x05{\x80\xf3\xc1\xb9`\x0d\xa1\x05\xc8\xc1-\xa7T0\
-)l\xe4tj\xda4\xd37w\xee\xacA.\xe6\xf5\
-`o\xefUJ/5\x84\x10v\xc9R\xa0\xcfR\xa5\
-\xf8\x10\xae\xe5E\xda\xc0`p\x1b\xae\xa7\x1e\x1e\xd6\xe8\
-*z\x93\xe2vdT\xb8\xbe~y\xed\xda4\x92\x89\
-\x13\x00)\x0f\xc3\x83\xf9\x1e\x8a\xd0\xefa\x8cV\x8e\xad\
-[_\xa7j\x04\x18]$\xde\xff\x8e\x95\x8e\xc1\xe0\xde\
-wSp\xbe[\x8eV\xca\x87\x1c\xdb\xb6=\x14p\xfc\
-\xb8!\xc6r(z\x98`\x8a\xcf\x9a5{1\xd6\x05\
-\x1cI\xa5?8'\xba\x84\x87\x86\x96\x13\xdf\x05\x06\x83\
-\x0d\xaf\x1c\xd8]J\xb3\xd7U\xcey`<d\xd9\x03\
-\xa5\xc8Q6\xf9nup\x02XM\xa4\x0f\x18\x0c\xc6\
-\x5c!\xf2a;\xf9\x19\x9d\x5c_>8~\xbc\xbe\xc8\
-X0\x18\x8c\x13\x93&m \x99>\x18\x1e\x85\x19\x1c\
-\xc0>\x19\xd4\xb7\x9c\xc1\x99&\x8c\x1e\x9b6ml\xbf\
-r\xe5\xfe\xc2\x15+\xbeC\xb9\x0fU\x98\x1f\x01W\x88\
-\x8c\x03\x83\xc1q=pAth\xe8\x8a\x9b\xdb\xb7o\
-\x8b\xfd\xf0!\xdd\xbb\x812\x18*P\x82!cr\xe5\
-\xc1*`\x14V\xbb\xab\xe2\xc7\x00\x83\xc1=\xd82\xe1\
-\x0b\x8d\xc1`P \x1dA\xf3'0:?0#E\
-j\x19\x0c\x06y8\x91F\xf6\x1a\xfc\xb4\xadI\x93\x9f\
-D\xc6\x82\xc1`\xbc\xbd\x7f\x7f\xe2+??\x92ao\
-+$\x18\x8c\x0c\x92\x08g\x94\xa8Q\xc3\x19\x97\xfa\xe0\
-u\x91\xfe`0\x18$T\x0b\xdadB\xc23\x83\x03\
-\xdf\x8c\x14!\x16\xe22S/\x07T\x1a2\x16\x0c\x06\
-\xc3}\xc1\x82\xa6\xa8D\xb8\x06\x09\x87\x8c\xd6\xc2d\xf0\
-\x19\x8e\xd1a\xe5\xca{\xb8\xec\x01\xa3\xc5\x0f\x01\x06\x83\
-\xcf\x81'\xb1<^\xc4\xb5\xa1\xf8\xd7\x81A\xba\x8d\x13\
-H\x1aN\xe8\x04\x18yK\x96\xf4U\x09\xd1J\xa8T\
-\x9e\xd4\x09\xc8X\x08#\xf1\xef\x01C\x0a\xa3>\xc4\xb5\
-\x8b\xc8r0\xd0\xffn#\xcd\x89\xa6\xb8-\xb8\xef_\
-\x92\xb1\xc289u\xea\x09H\x85G\xcb\x09>\xb9X\
-\x88\xca\x22K\xc0\xa0^w0\xae8\x8b\x5c\xb9>\x9e\
-\x9d=\xfb\x08\xfa\x228l\xaaS\xe7\xa6T\x8d>)\
-\xfe\x15\xe0\x0c\xf9N\x90\x17x\x0ea\x9d\xcf\x10\xceI\
-\xc6\x84\x93\xf1\x15\x9d)D.\x91\xa9`\xc8\xde\x07J\
-\xff\xbb\xd9`\x8f\xcf\x9f?Ouh\xda\xf4\x16\x8d\x9b\
-\xe5\xca\xd5H\xfc\xf0\xe0I\xee\x07\xa6\xec\xeb\xd1\xc3\xfb\
-\xa9\xbb\xfb\xfa\xd33f\x1c@\xbb\xdf=\xd4\xe8\x10\x1c\
-7P\x08=\x91\xe1`\x98\x08\xd1\x5c\x11\xb4u\x1e8\
-\xf085.\x11\x12\x07\xfa\xf5\xb3\xa5\xf1=]\xba\x18\
-\xcb9\xdb\x8a\xb9\xb1\xc3\xb5\xb0\xf8\xe1\xc0\x06\xf7\xdc<\
-W\xae\xa8\xe8\x97/\xcd\xa9\xbf\x1a\xf8\xfb\xc9\xc9\x93G\
-\x91\xce\x87\xdcf\xfa\x83\xadDF\x82\xe7\x80\x9cW7\
- F\x1b\xbf\xb1V\xadG\xe8\xe6\x9a\x8c\xb1nx\xa4\
-\xc2\xd5\x00sq\x90\xe6\xe2\xfa\xe6\xcds\x05\xb0L_\
-\x7f\xaf\x9c\x9bG?`\x09\x10;M\xce\xcc\x9au\x14\
-\x86\xd6AHX\x95+7\x8b\xc67\xd6\xac\xf9\x18\x7f\
-\x04\xb1R\x18\xd5)}=f\x0c\xf2\x0e\xc3\xd0\xc6\x80\
-\x0bi\x1e\x0e\x8f\x18q.\xe6\xed[c\x9br\xe5B\
-\xa5A\xbd\xc7\xb3`\xd9\x11\x88T\xc5\xfa\x0b\x00[\xcc\
-M4vd\xd4\xa8\xfd\x18\xa36]M\xc06B\x03\
-\xd2X\xe7\x80\x1d\x84\xce\x80\x91-_\xe9\xd2!\x1dV\
-\xad\xf2\xc6\xcde\xa5\x96+\xe6\xe5\xcb\xf9\x06\x05\x0b\x86\
-\xfd\xee\xe3\xb3\x7f\xd2\xdd\xbb\x1b\x0d[\xb6\xf4\xcb\xa6R\
-\x0d@\x94\xfc\xe1\x12z%]\xc0(%\x84\x91J\x88\
-\x8d\xe0\x0a\xbd\x9c9\x13\xda\x9a\x9b_\xc9W\xa2\xc4\xfa\
-\x81\xce\xce\x96\x95:u\xf2\xd1\xcf\x9f?)g\xee\xdc\
-\x02?\x9f\x1f\xe9\xe9yH\x08\x11\xb0P\x88\x12!W\
-\xaf\x0eE\xf8\xe0M\xf7\xcd\x9b\xef`,6E\x08s\
-\x5c\xbd`\x5cG\xc9\xf1\x22WM:\x83O\x03\xdd1\
-g\xdb\x84n\x80\xf1\xcc\xd3s\x1dV\xb7zB\x02\x93\
-cM\xab\x1b\xf4\xfa\xef_]\xb7n\x10\xd4\x88\xd7\xe3\
-\xf9(\xe7A\x83<i\x1c\x0d0\xecD\xba\x81\xe1\xb7\
-e\xcb\x12[#\xa3\x17\xb4b\xc1;\x19\x02\x83*\x86\
-\xf9\xc8\x05\xfe\x0e\x9aJ.\x06[ICZ\x07\xa6\xdc\
-\xd8\xbc\xd9\x11c\x0d\x04\xf0\xe8\xf8\xf1\x16\xe8\x22\x14G\
-\xca\xd2\x1b\xaaW7\x12\x12;\xdb\xb7\xdf-;\x0a\xd9\
-\xe2\xdd\x9cB'\xc0^\xcaa\xa0J\x00\x08\x09T\x85\
-\xc1%\x22L\xf0I#\x06\x94\x88C|\x01\xe8\xf3\x07\
-\xae*\x5c8\x82\x1ah\xe0\xfd<\x22\xbd\xc0^\xe2J\
-\xf0D\xce\xf206v\xd9X\xbb\xf6\x15\xf7\xf9\xf3\x0d\
-5\x9e\x15\x96\xe2\xb5\xb9\x85\x04\xces\xaf\xd1f\xeb5\
-\xc6&*\xf3\x86y\x19C\xf3\xe52d\x88\x07\xc6\xba\
-\x09\x80\x0c\x17\xefFY\x95.\xfd&)!a\x9et\
-\xc2\xe8\x02\xb8\x8d/u\x8f\xa1\xc07x\x92\x9c%\x8f\
-\xdd\xdc6:\x0d\x18\xe0E\x93\xb8\xbbK\x97K\xa4R\
-\xec<d\xc8\xef\xcf<<h5l)\xb7,\x9dd\
-\xc3\x0bo\xd0\x01l!\xbe\x17<\x079\xc06\xa01\
-\xd8L\xfc\x09V\xe4\xcf\xff\x80\x9a\x93\xb8\x0e\x1d\xdaW\
-\xceC^0\x14\xe3a\xf2\xcb0\x9f\x1c\xdf\x0c\xa6\xec\
-\xea\xd4\xc9\xd7u\xc4\x88\x09:\xe4mf\xc0pL\x94\
-\xcc\x86\xad\x8d\x1a\xdd\xc6\xa4\x8d\xd8\xdf\xab\xd7b|;\
-\xbe\x96\xde\xcb\xc2`yp \xa8\xa7lk\x10\xb7\xfb\
-\x88mP \x8c4I\xae\x86\xe3\xc4w\x83\xf1w\xb6\
-}7\xec\xedGX\xe4\xc9\x13+\xe7\xeb)\x98\x00\xa6\
-x\x99\x999\xd1\x97\xa1\xdc\xa9\xd4\xc5\x98\xe2eV\x18\
-\x08\xd6\x11Y\x0f\xc6#/\xaf\xa2\x07\xfb\xf5;\x8b\xe6\
-\xf3\x89\xe4\x91\x5c\x9e7\xef\xfe}\xdd\xbbW\xc4\x04.\
-\xf1\xdd\xb0a4\x0c\xe9w\x0d\xaf\xe6x0eu\xd1\
-\xa2\xcfC\xaf_\xb7\xa13\xc6\x87'OV\xaf\xadX\
-1HnC\xf7`\xc2k\x8a\x8c\x02\x1be\xa1\xe7^\
-^\xcb\xb1\x039\x8b4\xb0S4\x178\xbf\xc5$D\
-GS\xbf\x84\xec\xf2\x1c\xeeE\xf3\xb8\xabC\x07_t\
-|\xdd\x7f\xa0O\x9f\xf3P\x96N\xa6/H\x8c\x97\x14\
-\x12Zs\xba(\x13\x93\x1dX\x8f\x11\xecM\x1a\x1c\xb4\
-\xc2\xc90@\xb4\xb5\xa1\xe1J\x5c\xef\xd3\xb9A\x004\
-!x\x16\x81\x16\xbe!q\xe1\xe1\x16\xf8\x9dA`\x19\
-\xb0rTh\xe8\x94e9s&\xaa[\xfb\x16,h\
-,\x80?\x84\xc8\x98s\x03\xcfWqpT\xa8\x9f\x9f\
-\xe9\x96\x86\x0doC\xac(\xe9\xd8\xf8\xf1\x0317\xcd\
-0_Ci\x0e\xec\xeb\xd6}\x80wL\xe4\xaed\x1c\
-\xfa\xe2\x1d\xa1q\xcbb\xc5\xd6\x0a-\xc0\x10\xb7\xcbU\
-\xf0\x05~\x7f\x90\xc84\xf0D\x96\x05\xc7\xdd\xda\xb5\xcb\
-\x01\xdb\xc9`e;\x02\xed\xfd\x13\x18\xaf\x88\xfb>\xb2\
-C\xa83\xc5\xed\xb4\xb7CX\x19?,\xcf\x97/&\
-\xfa\xd5\xab\xe9x/\xa7L\x8a\xde@gD\x91\x11\xe0\
-\xf9R\x81\xa3>EF\x9ac%\x9b\xaa\xb9\x85\xdc\xdd\
-\xb9\xf3U<3\x12\x12\x8fO\x9e\xfcE\xc6\xf3\xae\x0a\
--$%%5Bg\xd8s\xf4\x1c\x0e\xb3\x0b\x22\xd3\
-\xc1\x93X\x17\x9e\xb39\x94@\x8bmK \xbc\x5c\xf3\
-1f\x80\x09\x99\x01\xa6<9{v)\xbd'\xb4\x80\
-j\xe7\xb5d\xacx\xd6N\x06]\x95\x8c\xf7p\x5c\xa7\
-\x82\x19S\xf0\xca\xf3U\x03,td\xf4\xe8\x0d\xd8^\
-F\x91\x97\x19\xd9C\xf1\xe4u\xd6H\x1d\xebIs\x81\
-\xad\xa8g*s\x9e\x0d\xe7uojh\x02\xc3\xdc\x80\
-\xfb\x12\x22\xf3\xc1\x07x\xb0\xbd\x8c\x015\x14\x00\xb6#\
-\x03i\xd2\xb65k\xb6\xfd\x1b\xbf\xd3\x08\x1c\xbf\xfe\xe7\
-\x9fK\xd3\x96\x14\xee\xeb\x90k\xeb\xd7\xef\x82\xdb\xfa\x8d\
-4\xbe\x00jt/2\x0a<gM?\xbey\xb3\x8c\
-rbax\xb10\xa0w2!z\x03\x98\x84\x94\xb0\
-\xd8`\x1f\x9f\xd5d`B\x034'j\x8ff\xfb\xf6\
-\xb4*\x0e\x17Y\x0a\x9e\xc4\x82\xcaj\xb6e\xfc\xf8\x1c\
-\x96%K\xbe\x93I\xb6#\xc47\xb0H\x882p]\
-\x87\xdesv\xde\x92\x9c\x9c\xdc\xcf\xba\x5c\xb9`r\xc8\
-`\xc2c\xe4\x8aw\x0c\xd7\x0c\x12He\xa7\x0aX\xf7\
-\xd6\xce\x9dv\xab\x8b\x15{\xad\xec2\xb0\xd5\x0f\x92\xbb\
-\x8f>Z\x0e\x93\xec\x98\x8f{X\x15?\x86?}\xba\
-\x02\xcf\x8b\xfd\xa9|{\xe6\x82\xe1\xe7\xe00we\xc1\
-\x82\x91\x14\x06\xc0\x04\x5c\x00\x17\xc8\xec\x14\x03\xad\x89\x9f\
-\x00\x8e\xc56e\xb8\x12\x94\x8d\x08\x0aZE\x8d\x0f\xe9\
-\x1eq\xa3\xa1\x22\xa3\xc1m\x96\x17\x04]\xbch\xf7\xe2\
-\xd2\xa5\xb5_\xbe|Y*\x83\xe5\x06Z!\xa1)4\
-\x1f\xc7'Nt\xc3\xb3\xae\xe2O \xe7\xfa\x84\xb1\x10\
-\x15D\xe6\x81\xdd\xd2\xef\xee\xdd[\xea\xd8\xa6\xcd\x0dd\
-\xb5\xab3Rh\xeb\x82B\xc9ZZ\xef\x15\xc1\x19\xb0\
-\xb8fP\xd6\xd3\xc4\xa49<j\x89\x08!\xbc\xc0\x19\
-1\xe3cv<W\xb9\xc1\xc6`;\xb06\x98\x8d\x1c\
-_\xb2\x82\xfc'\xb00\xf8aU\xd1\xa2\xaf\x92\xe2\xe3\
-\x17PJ\x99\xd0\x86\xacX\x90\xdeLG0ym\x85\
-\x0a\x99\x1c\xcf\xe3\x89,\x00\x8e\xf9\x14\x1dm\x1e\xe2\xe3\
-cKW:\xef\xa5\xb2\x05\xb1\x00S.,[v\x90\
-\x82\xb2\xb8\x9fH\xf1\xa0\x07\xae\xae\xf6\xb8\xcf\x82X\x1d\
-\x83v\x1c\xb2\xf4*\x01\x86\xa7\xae&\xa7s6\x9d\xbf\
-\xbf\x91\x14a-\xab\x16&\xc5EE5z\xe1\xed\xbd\
-\x16\xef\xf6\x13Y\x06nR\xdf\x0c\xfc\x054\xd08\x80\
-\x0f\x03+b\x92>\xe1\xdb\xf0\x09\x9eM\x07\xb3C2\
-\xa0 \xbc`4a\xbf\x8b,\x03o5\x03O\x9d\xda\
-`W\xb9\xf2c26\xaa\xbdC\x0co7\xe6&U\
-\x0f2\xe2y\xcd\xb1C\x09\x91g\xc1\xdb\xafn\xdfn\
-A%ABg\xc0ib\x07\xe4\xe4\xc4b\xfb\xf1\xe5\
-\xe1\xd1\xa3\x9b0A\xd5\x85\x84\xdc\xde\x14\x14Y\x096\
-\xba\xca\xe0\x1f\x97W\xad\xda\x8fj\x90\x0f\xd2\x91uY\
-[\xa8HI\xa0\x86\x03F\x9d\xca\xb7\xaeJ\x15\x1f\x1d\
-\x9b;Fdhh=*\xa4\xa4\xeae\xf2fR\xa0\
-u\xae\x10\xf9\x84.\x82\xb3\x8b\x9a%\xc4\xc4\x18\x1f\x19\
-9\xf2,J\x84n\xb8\x0e\x1b\x96ZO\x04\x15\xb6\xa1\
-\x97\xe9\xec\x1dz\xed\x1a\xa5\xf2\x19\x0a\x9d\x03g\xbe\xf7\
-|{\xf7\xae\xe5\xf6\x16-n\xd2*\x87\x04\xe7\x81B\
-W\xc1\xf3\x95\x07\xec\x05.\x01\x1b\xcb]\xcaz\xd0D\
-\xa6\xf2\xfd*\x03\xe6^\xb2\xe2\x5cG\xc1\x13Y\x0a\xfc\
-=2$d%\xae:np\x0c\xa5\xac\x87\x80\xd5\xec\
-\x18\x19\x99\x94w\x08]\x9e'Ox\xec\xfb\xf7\xa6\xe4\
-,K\xc51V\x16\xef\xcd\x05\xcd\xa8d+\xeb\xcb\x80\
-x\x22\xab\x83e\xc5\x8f\x04\x9e\xb3\xf6\xe7\x8d\x8d\x0f\xa1\
-\x0cH}\xbeC\xc6\xd0[\xaf\xa5K\xc7\xa5\xa24\xd6\
-\x9f\x0a\x94\xb5\x84ko\xca\x8a\x844\x80\xc1\xe0\xf3]\
-kZ\xd5\x9c\x06\x0e\xf4\xc2y<I&:,\xd0X\
-\xd9\xca\x83\xf1x\x16\x85\xc4\xe9\xdd\x14Z\x802\xc0y\
-\x0a9\xe0\x18\x11\x84\xf7M\xd3\xde'\x8f\xc1\xe0xk\
-\x7fr\x96lm\xdc\xf8&\x92\x1b6\x0b\x09%9]\
-\xa6\x8bM\x05\xbb\x80#.\x98\x99\x1d\xa0q\xa2M\xa5\
-J\xf5E\x9a\xc1`\xb0\xe1\x19\x82\xe3A\x130\xbf\x00\
-\x10\xbf[JF\x85b\xd8\xb9\x9az)\xde\xd6\xd6m\
-i\xdc\xbe^=\xaa\xc7\xeb.\xbe\x1b\x0c\x06\x97\x01\xe5\
-\x15\x12\x0e\xcd\x9a\x91a}\xc59\xef\x89\xe6\x99\x8d\x9c\
-&\x07\xfb\xf7\xdfM*\x00$\xcb!\xd2\x07\x0c\x06\x97\
-oA\x1e\xdfK6\x1a\xa1JqR\x0e\xcb;[\x08\
-\x0a3t\x02\xd3\xb9\x1b\x13\x83\xc1F\xd7\xdc\xd3\xd4\xd4\
-ye\xa1B\xef4\xbc\x94\x89$V+2\x04\x0c\x06\
-\x1b]#T~\x98\xdc\xde\xbbw\xdb\xcev\xedN\x9c\
-\x9a>}\xf5\xa7\xa8\xa8\x8a\xdf!\xb9\x9f\x1b\x1c\x0dZ\
-\xc0hg\xe3ZQ\xfc\x0b\xa1\x12\xff\x10\x0c\x86<\xdb\
-\xd5\x06\xeb\x80_\xc1\xf3*\x95\xeay\x1a:\x07uV\
-\x09\xb1\x03,\xad1\xfc%E\x88q\xcb\x84p\x14\xe9\
-\x06\x06\x83\x9b\xc9\xd4\xc3\x8a\xf6\x11\xb1\xbb\xc4\x13\x13'\
-\x1e\xa4\xcc$*\xdfB\x91\xf3\x07\xa9,\xd0L\xfck\
-\x90\xc5%\xf3\x0c\x06V1\x13===\xd1k\xc7\x8e\
-\xbd=\xec\xed\xfd\x0a\x96+w\xaaz\xbf~{\xda\x9a\
-\x99\xed\x15*\x95\xc8]\xb4\xa8\x89\x90\xf8gic\x0c\
-\x06\xafn\xd9Q\x89\x10M\x82\xb5\xd8\x96N\x02\x0bj\
-*\x06\xd8\x18\x19\x05[\x96(\x11\x8aq\x15\xe9e\x82\
-\x91\xf8\x9d\xc5\xdf!X\xcb`0\x16\x0b\xf13y6\
-\xd1\x00\xf4\xb8\x12\xe3\xd3\x04tN\x9f\x93\xdc\xbe\xba\x07\
-\x9e\x9e^7zW\xf2y\x1aE\xa8\x18\x0c\x06)s\
-C\xad;nc\x9d:WSq\xa4\xa8\x85k\xd1\xe3\
-\xe2\x12U\x9e@\xf5m\x0b\xdd\xbb\xfc\xf6\x9b\x07\x8c0\
-\xd0\xa1eKj\xdf\xa5ZDm\xf6\xfe\x1e\x18\x0c\x06\
-\x8c\xed\x92\x5c\xb5zi\x18[w\xd25%YE(\
-\x8eY\xed\xee\xdb\xb78\x82\xeb\xb1\xb6\x15*\xbc\xa0J\
-u\xc8\xf9Y\xe0\xfa+\xde\x99\x09~\x01\xb7P{.\
-\x91:\x18\x0c\x06)\x81\x81c\xa1\x97rSvbJ\
-\xc4\xf5\x0c\x8c\xc7\x1d\xd7\xcf\xa8\xc9\x8b\x86\xb7\x92\xe49\
-\xfaa\xec\x0fz\x87z\xe8\xd9\xff\xfc\xf3<<O@\
-.\xe7\xa6=\x9d;\x97\xb2\xabT\xc9OQ\xf7\x96J\
-\xd3\x0c\x06#\x95-co\xe5Lf[\xb1b0\xba\
-7y\xa0#\xd3\xb5\xe5\xf9\xf3_\xd9\xdd\xa9\xd3N\xd2\
-\xd2$]\xd3\xa0\xa0 \x03\xeaQ\x01%\xe9\x8f{\xba\
-v=C\xa1\x02\xd9\xbd\xc9\xef\xd5\xabW\xb9\xd1\x91\xd7\
-\x0f\xab\xdfW\x04\xdd=\xce/[V\x97\x85k\xb5\xc1\
-`H\x17?tJ\xb7n\xaa[\xf7!<\x95\x9f\xb1\
-\xd2\xbd}r\xfa\xb4\xadl\xb1<\x17\xec#\xfbYt\
-\x00S\xa8C\x10]\x91F\xf6B\x9e\xed.\xa30v\
-\xb1\xfa\xe7>}\xbcd3\xcbV\x1a\xc6V\x87\x0c\x95\
-\x82\xea\xb8e0\x18T\xe4\x0a\xcezp\xe4\x88=5\
-!\xa1\xfe\x07\xe8S\xfe\x02\xdb\xc5\xf6\x1a*pG\x94\
-\x95\x105y\xdeg\xe7\xccQ\xdfc;y\x99\xde\xb7\
-)W\xee!\x9a\xcd\x98\x90\xfc\x9f\xd2RM\xfe\xdeP\
-\x18\xf2'\xcb\xe2\xc5\x8d\x05\xc0`0d\xe7\x1e\xb0\xda\
-3w\xf7Uh\x02\xeaa\xf7\xd3OgN\xcf\x99\xd3\
-A9\xe7\xc1h\xdej\x88\x18-\xc1\xf6s\x9f\xd4\xd3\
-\xa4^\x15\x11\x10\xabZ\x83\xf1\x06\xf2\xfd\x0eR\xe0v\
-\xe3\x91\x09\x13\xca\xbf\xbaqcMBl\xec|\xd9\xa8\
-\x92\xc1`h\x06\xba\xc1q\xa0\x09\xd8[H\xbc\xb9{\
-w\xa0\x8f\xb5\xf5^\xb9e\xac\x0aI\x87\xab\xd2\xc9\xf2\
-\xe5\xba\xbd\xfdNM\x15h\x8c\xe7G\x13Q\xc5\xeb\x19\
-\xb1\xb3c\xc7\xbe\x7f\xa1\xf0\xcd`\xb0\x9eJ*\x868\
-\x00,GN\x10\xacx\xf1dP\x87\x06\x0d:\x8f\xb1\
-)\xda}\xd1\xd1\x9c\x92<\x9fQ\xd8\xa2F?ts\
-\xab-\xbe\x1f\x0c\x06\xe3\xf8\xf8\xf1\x0b\xd0\xf8\xf3\xc6\xe7\
-\xa4$\xe3\xd4Zk\x99f\xcb6\x8f\x0c\xf2\xcc\xacY\
-Ge\x97^\x9d\xc2\x0f\xb5\xb7e0zn\xd9\xe2\x86\
-K\x0ax\x06%@a\x94c\xa9\x12\xa2+\xee\x97&\
-a\x81K\xf9\xfa\xd58\x1f\x1a\x81vX\xb5\xca\x1bc\
-\x97\xfefLp\x16.\xc5\xc1\x15fB\xc4h<b\
-0\x18\x9a\xa2E\xd8b\x8e\xa3@9\x18\x0f\xe3\xbb\x85\
-\xebW\xf4B %\xb1z\xda\xb5\x9f2\xf6w\x14\xef\
-\x9d\xc7u\x89\xa2\xc5\x02\xcf\xe8zy\xee\x0b\x01\x0d\xc4\
-7\xc1`\xb0\xf1\x95\xa5\xb0\x02\xd2\xbe\x9e\x92\xd1P\xa7\
-\xdd\x93\x93&m755\xcd\xa6\xd5d\xc6D:[\
->I\x8d\xcd\x140\x10,\x8a\x98\xdeL\xba\xdf\xd1\xaa\
-\x95\xfb_\xf77g0\xd8\xe8\xaa\x81\xd3\xbd\xcc\xcc\x9c\
-V\x15*\x14A\xc6#W\xb1\x9c\x02\xa0\x8e\xad\xb4\xf2\
-\xa1\xd4\xe7\xc9+??\xeb\x8f\xef\xde-\xa7\x9e\x85\x14\
-p\xc7\xeav\x1d\xef>1\xcf\x95+\x06\xc5\xaf\x16\xe4\
-\xa4\x11\x7f\x09\x06\x83\x8d.;\xd8\x92:\xed:\x0f\x1e\
-\xec\x81\xd6\xd6\xbe\xe8\x0aTP\x9e\xd1&\x83)\x90k\
-w\xa2>\x17`\x0d\xb0\xed\xe1\xe1\xc3O\xd38\xd1m\
-\xda4*\x11\xea$\xd2\x06\x06\x83\x9b\x92\x80}AS\
-\xb0\xbe\x00\xb0\xcd\x1c+\xeb\xee\xb6\x08\x0dl\xfd\xe5\x97\
-\xc54N5w\xc8V\x99'\xcf\x86\xff\x04\x0c\x06w\
-\x03Z[\xa3\x86!\x9d\xed\xc0\x8f\x8b\x85\xa8+\x00*\
-\xe7\xc1V\xf2\x22\x19\x9c\xdf\xd6\xad;\xc88\xa9\x8f!\
-\xee\x17\x81\xe7\xf0\xcc\x0d\xd7Q\x22\xed`0\x18\x88\xcb\
-\xedD\x02t\xb2<\xdf\x85\x11\xe9\xe7\xcd\xf5\xeb\x07\xc0\
-\xd8&\xac)Q\x22\x0f\xee}i\x0cg\xbbX\x0d\x9d\
-Mc\x16\x11J#\x18\x8c\xce\xd6\xd6+\x87\x9c8a\
-_g\xd8\xb0\x93E*Uz\xa4\x12\xa2\x88\x00Z\x19\
-\x1b_&{\x84#e*\xae\xbfT\xea\xd4\xe9\xc2\xc2\
-\x8f\x1fmf\x85\x86\xae,\xdd\xa0A\x00\xde3\x87\xe1\
-yR\x0f<\xe9\x84\xf9\x9b`0x\x9bY\x01\x1c\x1e\
-\x15\x1a\xba\x84\x9a\x8d\xa8\xcfoe\xcb\xde\x16\x00\xc2\x05\
-\x17\xb1\xb2}\xc1Y\x8e:\xc16\x03\xebD\x04\x07\x8f\
-\xa0\xad\xa8\xc6jwZ|\x17\x18\x0c6\xbe\x01\xfe\xdb\
-\xb7o\xbf{\xe0\x8099K\x90\x7f\xe9\x8d\xea\x83\x84\
-\x97\xbe\xbe\xed\x84\xc4\x86\xd6\xad\xf3R8\x81j\xf1\x8e\
-\x8d\x1d{\xea\xf8\x84\x09\xeb(w\x93S\xbb\xd2\x0e\x06\
-\xc3\xf5\xe7\xd1\xa3_\xe0Z\x09\x14\xc5j\xd5\xf2\x0a\xbd\
-r\xa5\xf9\xde.]\x16\x1a#.\x07\xc3\x88\x0c\xbbx\
-q\x1d\x1e\xa9\xaa\xf6\xee}\xa5\xd7\xb6mnt\x04;\
-\xf4\xeb\xaf?Q\xad\x1d\xc6\x0d\xc1\xb7_\x85\xd8k!\
-\xc4\x1d\xf1\xf7\xc1`0^\x05\x04\x18\xa2\xc0\xf5\x8e\x86\
-\x14\xdfg\xbaB\xaa/\x22.,l)5\xa7$Y\
-?\x127\x92\x1d\x83\xe2\xe56\xf3K\xda\x1c+\x0c\x06\
-\x0b\x1a\x19\x92\xdc^rrr?\x7fG\xc7\xed\x90\xe2\
-s^\x9e/\xdf+E\xb8\x08\xc6\xd6F\x00\xb2\x7fy\
-\xca\x86\x1a5\x1e\xc5\x85\x87[<<~|\x93\xad\x91\
-\xd1\x0bi\xa0\x83\xbf\xf1\xdf.\xfd\xbf^J\x06\x83q\
-2\x07\xb6\x91\x16\xfa\xfa\xb5r\x15,x\xb4X\x8d\x1a\
-O\xbe$$\x14-X\xbe|H\x1b3\xb3+x\xee\
-C-\xb8TB\xd47(T(\xea\xc3\xa3G\x95\xad\
-K\x97\x1eqo\xcf\x9e\xa0\xd1\xde\xde\xb69\xf3\xe6\x8d\
-\xd5\xcf\x9f\x7f\x89\xd0\x02\x06&\xa4\x08\x11\xa4at\x0c\
-\x06\xc3m\xfa\xf4>Ve\xca<\xd3\xd8N~]\x91\
-/\xdfS\xa9\x1cVK\x00\xd4hR\xc6\xed\xee\xd1\xca\
-f]\xb6l\x80\x8c\xd9y@\xd8\xe8\x0d\xb6\x9e1x\
-\x97\xf4TT\x18?\x08Z\x914;\x9e=\x8f~\xff\
-\xbe\xb2\x00\x00\x06\x83A\x02D\xe8q7\xcb{\xcd\x9a\
-}\xdb\x9a4\xb9\x88\x02\xd7\xc3\xb4e\xc4\xf8`\xa1\x01\
-\xd2\xc0\xa4\xd0\xc1\x96\x06\x0d\xa8\xf8u\x1a\x12\xa0\xf7\xa3\
-\xe5\xf2\x1b\xb9\xcd\x0c\xc4\x98\x91\x00\xcc\x0d\x0c\x8e)\xc6\
-\xbb\xb7kW\x9f\xc4\xd8\xd8\xfa\xe2\x7f\xc0`\xb0\xd1\xe5\
-\x90*b3\xc0\x85`\x1bP%4p\xd7\xc9\xe9\xd7\
-\xd5\xc5\x8a\x85\xd1\x0a\x08\xa7\x89\x07\x8c\xc9\x22,0\xd0\
-\xdcu\xe8Pw\xef\xd5\xab\xf7)\xcaa\x97--'\
-\xd0;\xa8D\xf8,\x0d\xef\xba\x89\x10ME\xda\xc0`\
-p_\xf3\xf0\xe7\xcf\xe7\xef\xed\xde\xdd\xc7\x5c_?\x5c\
-z+c\xd1vy\x11\xe9\xab\xc8\xd7T\x18\xbb@\xb1\
-\xbb\xa7\xee\xee\xebQ\x91p\x0e\xc2G\xf1\xb2\x06\xaf\x9d\
-H\x13\x18\x0c6\xba<\xe0\xb0\xe4O\x9f\xcc\xae\xd8\xda\
-\xeeql\xd3\xc6\xed\xa2\xb9y+2F\xa9(\xdd\x9f\
-\x0c\xf1@\xdf\xbe\x1706\x04\xec\x0d)?K\xd7\xe1\
-\xc3O=>q\xa2\xa5J|\x0f\x18\x0c6\xbc\xc2\xb8\
-\xd4\x05k\x83O\xa0\xafrZz&\xaf\xe600\xa8\
-1#8xm\xde\xe2\xc5m1\x1eE\xdd\x7f\xf0\xa8\
-#\x18,\xd2\x0f\x0c\x06\x03\x0e\x93\xfb\xcb\xf3\xe4\xf9x\
-m\xfd\xfa\x91\x19\x5c-\xc0`0\xda\x98\x9aZ\x93\x9a\
-\xf4\xe9i\xd36\x99\x0aq\x18\x1c\x85\xa0z\x99\x0c0\
-8\x06\x83\xd1b\xc1\x82\xe3}\xf7\xec\xd9\x5c\xaa~\xfd\
-G*==\xd2\xc5tDP\xfd\x84\xc8\x180\x18\x0c\
-R\xfe\x02g$\xc6\xc5-#\xc9\xbe\xb0\xc7\x8f\xe7*\
-\x15\xe8\x19\xe74a0\xd8\xf0J\xe3RM\xda\x99\x0f\
-\x1c(\x09\xe2_\x09\x06\x83\xc1`0\xfe\x0f\x1d\x9b\x1f\
-\x99f\xa1:\xad\x00\x00\x00\x00IEND\xaeB`\
-\x82\
-\x00\x008\xb4\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\xa8\x00\x00\x01w\x08\x03\x00\x00\x00\x06\x8a\xf0\xc8\
-\x00\x00\x02\xc1PLTE\x7f\x00\x00\xa3m\x93\xa4u\
-\xa1\xae\x96\xd0\xbb\xb2\xec\xcb\x9d\xa4\xd7\xcd\xed\xbb\xbb\xfe\
-\xcb\xcb\xfe\xd0\xce\xfe\xd2\xd2\xff\xc8\xc6\xfe\xc3\xc3\xfe\xdc\
-\xdb\xfe\xc0\xbe\xfe\xb8\xb6\xfe\xd8\xd7\xff\xb3\xb3\xfe\xe2\xe2\
-\xfe\xeb\xeb\xfe\xf3\xf3\xfe\xfc\xfb\xfe\xb0\xae\xfe\xf0\xef\xfd\
-\xad\x80\xa3\xf9\xf7\xfb\xaa\x9b\xe0\xad\xac\xfe\xa4b{\xbc\
-{{\xbd\xb9\xf5\xbf\x80\x80\x911=\xa7PP\xa9S\
-S\xca\xc4\xf2\x95,,\x96@S\xcc\x9b\x9b\xcf\xcb\xf7\
-\xae\xa6\xf1\x9cSm\xdc\xb9\xb9\xe0\xdf\xff\x9cZ{\xb5\
-\xb0\xf4\xee\xe0\xe1\xb7pp\x9eAB\xf5\xec\xec\xbb\x83\
-\x8f\x8f !\xbe\xb1\xe4\xd5\xac\xac\xce\xa0\xa1\xbe\xa8\xd3\
-\xb2lr\xd7\xb0\xb0\xdd\xc2\xc8\xed\xe3\xeb\xa9v\x99\x8b\
-\x22,\xb6\xa9\xe4\x9dj\x98\x89\x13\x14\xb9ss\xb9v\
-x\xb9\x9f\xcc\x9fh\x90\xa3\x81\xbb\xbc\xa2\xcb\xbc\xaa\xdb\
-\x9c::\xa6q\x94\xc1\xbb\xf3\xa6\x88\xc2\xc4\x91\x98\xc5\
-\xba\xea\xc6\xba\xe5\xc6\xc0\xf4\x95Ji\xa8\x85\xb9\x960\
-1\xcb\xaa\xbd\xb5ll\xaa\x84\xb3\xcd\xa3\xaa\xb5\xa0\xd5\
-\x8b\x1a\x1b\xd0\xa2\xa2\xacZ[\xd1\xac\xb5\xac^b\xac\
-\x84\xad\xaddm\x97V}\x9833\xb6\x99\xc4\xdf\xdb\
-\xf7\x99FY\x9a=D\xe4\xcd\xd1\xe6\xd0\xd2\xe8\xe6\xfb\
-\xea\xd7\xd8\xaf``\xec\xda\xdb\xb3\x92\xbb\xaf\x8a\xb5\x9b\
-J\x5c\xf1\xe3\xe3\xf3\xed\xf3\xb1cc\xb1\xa3\xe2\xf7\xf0\
-\xf0\xf8\xf3\xf3\x8c&2\xb3\x89\xab\xba\xaf\xe8\x8d,;\
-\xb6\x84\x9a\xac\x8a\xbb\xba\xb4\xf4\x89\x1a\x22\xa1P\x5c\xcb\
-\xc1\xec\xd9\xb3\xb3\x85\x10\x13\x95C\x5c\xc1\x83\x83\xa3T\
-a\xc2\xb4\xe2\xb0\x9e\xdb\x99CR\xb1\x86\xa9\xc7\xa8\xc0\
-\xb1\x8b\xb3\xa3\x87\xc6\xb2\x9c\xd3\xa5LL\xa5h\x84\xb4\
-s|\xb4\xa1\xdb\xb4\xae\xf3\x9aLb\x94Eb\xa6\x8e\
-\xce\xd5\xb8\xc5\xd6\xc1\xd5\xb6x\x83\xa6\x8f\xd1\xd8\xd3\xf5\
-\xb6\x90\xb2\x9bWx\xd9\xc6\xda\xa7`p\xa7\x90\xd1\x9b\
-d\x91\xdd\xcf\xe2\x8d0D\x8e8R\xe1\xc4\xc4\xb9\x8b\
-\xa3\xe4\xcb\xcb\xa9\x8b\xc3\x8b'9\xe6\xe1\xf4\x9d`\x85\
-\x90.;\xea\xe4\xf2\xbb\x9a\xbe\x905I\x9fEM\x96\
-Id\xa1DD\xad\x90\xc7\xa1MV\xaer\x86\x924\
-C\xa3j\x8d\x91,4\xc0\x86\x8a\x83\x0a\x0b\x9fRf\
-\xbc\x93\xac\xc4\x8b\x8b\xc3\x9c\xb0\x89\x16\x1a\xcf\xc2\xe5\xe9\
-\xd4\xd4\xb1\xa6\xe9\xb5\xab\xeb\xc9\x94\x94\xa1n\x98\xae\x99\
-\xd4\x9eXs\xd5\xbc\xcc\xbf\xa1\xc3\xae\xa9\xf5\x9bUs\
-\xafx\x92\xc1\xab\xd4\xc1\xb7\xec\x87\x19#\xb6\x9b\xcb\xa4\
-r\x9d\xaal\x83\xb7{\x87\xaar\x8d\xc4\xa9\xc9\x92=\
-S\xaa\x98\xdc\xb1\x92\xc1\xc7\x91\x92\xa4z\xab\xba\x95\xb5\
-\xe8\xda\xe3\xba\x9c\xc3\xca\xb1\xcc\xba\xab\xe2\x94;L\x9a\
-\x5c\x82\xae\x95\xcd\x959F\xa2Ym\xcf\xbb\xd7\xb4\x85\
-\xa1\x9dc\x8c\xbc\xa5\xd1\x99Om\xa6x\xa3\x91$$\
-\x9fo\xa1\x86\x14\x1a\x8e)5\x0d\x87*p\x00\x005\
-\xaeIDATx^\x84]S\xb7,\xcd\xb2\xed\xb7\
-r\xb5\x17\xb6m\x1b\x1fm\xdb\xb6\x8dc\xdb\xb6m\xeb\
-\xda\xb6m\xfd\x8a\x9b\x19\xe8YQQ=NveV\
-\xed\x97=\xe6\x08gDd\xae^\x9e\x0fr\x8c,O\
-\xc3\x1af\x1a\x7f\xfc\xe8(u-i\xca\xab,J\x19\
-u\x9c5=e\x12\x9e2\xb1\xa3\x1f\x9e\xb8\x0c\x87\xf2\
-\xc4\xa5\x1f~:V\xc6ge|\xe2W\x5cW\xf2X\
-\x11f/\x1f\x0c\xf2\x01\xd0f9C\x15\xb0\xadQ\xd2\
-\x14\xa8a\xa5Y\x16\x0a\x97A\xd64\x02\xb22\xfe\x04\
-p\xcdP\xfb\x01]\x12'#\x0d3\xe0\xec\xf7\x814\
-\x0c\x8bR\xb1\xf6\x22\xc80\x05iF3\x8d8\xe9\xc9\
-,E\x89\x8c\xf4\x13z\x82\xa2\xb5<4\x93\x004\xac\
-4JK\xd6\x00\x92\xa0\x0aA\xe9\xb14%\xa2:\xac\
-=\xa0\x04=\x99\x98Yx\xe2\xa2X-`\xb0\xde0\
-\x9f\xa9\x19I\x9b\xcc\xa89\xa3(\x91S\x99\x1ef\xe0\
-;Q\xb3\xcf(\x01\x95\xb8opF\xd6\xc7_\x03i\
-\x84E\x88\x09-\x81\xcd\x0dD\x85\x09\x82\x02(C\x8d\
-\x13\x1c\xa7\x85\xc9)\xbc\x0f\x0c'\xa22Z\x82\x89!\
-\x10\x15%(\xda\xa5MY&\x8a\x94\x1bBB\x99\xf8\
-\xc5\x98\x0b\x03S\xa5\x94\xe8\x19\x95\x0a\x5c\xe7IH\x03\
-8a\xbf\xd1%\xd6# 5\x14\x8d\x9c\x07\xd4\x8c9\
-O\x22\xaa\x04M1<i\x0b\xa1k\x0d\xc5\xa7Q\x92\
-t\xd6\x80\x09m\x1a\x8a\x9c\x86\xc1z\xaf\xac_\xa9o\
-\x91U\xa8\x12\xc9\xa8\xa2\x04\xebUJ\x9d\xe6\xabaJ\
-\xe5M\xb3(\x9a\xe6\x09\x14U\xa4\xa5\xa5hD\x09\xf3\
-\x04]\x02XPs\x08\xa4\xbd\x81r~\x00\xd6\x8b\x0d\
-\x0d\xdf,\x02\x96\xff\x05\x01U\xde+\xd0$NZ\x09\
-$\xc14J\xcf\x04\x15\x19MH\x8d\xc4\x88\xb6\xb8\xcf\
-`\xa1\xf6P&6\xa5\xe0|*O\x06\xbe\x03'\xa3\
-\xb4V\x14C\x84\x94\x91\xd2\x1b(\x85\xa2B\xcc~\x18\
-\xc0j\xa1\x0eA\xcey\xca\xd4tI\xf2J\xed\x00\xdb\
-\xf9\xdb#e\xb5g\xe3T\x1b\xa2\xf6\x1b\xbco\xe0\xa4\
-\x09\x0bJS\xe1\x82\xf5\xa4IF\x99\x94\xa8\xaa\xf5Y\
-\x1b&\xa0\x1a\x82\x122u\xa25\x19\xfd\xba\x05S<\
-\x13S\x94\xb0\x0e=M\xa1\xf3\xde\x8e\x02f&\x1e)\
-cU\x92\x913\xd7\xc1v^Z\x864\x01A\xc53\
-\xb1\x0c`\xb0y\x029i\xf6\x0d\xd3\xe1B\xe91.\
-T\xb1f\xca\xfdhH\x19%x\xefm\x13\x7fY\xa8\
-I\xc9Zo\xe1\xc1\xdc\xb3\x0b%\xa0\x82\xd5\x8e\xee\x98\
-\x84)\xda\x22\xa98\xfa\x8cE5\xf3@K\xc3z\xb8\
-P\x98}U&\xa2q\x0b\xabxQ\xa5(?\x0d\xae\
-\xcb+L\xef\xeb\x19i\x98P{\xfc,D\x88\xa8\x13\
-R\xe5\xbe\xb8O`t\xae)\xda{\xa6\xe7\xff\xecz\
-\x92\x11\x12V\x8br\xd8-\xa3\x83\xa6\x94fq\xcc\xf4\
-)Se*\xc2\x13fj\xd4=-\x8c*\x89\x01\x85\
-2\x19\x17J?&\xe8\xee\x8f\xff\xda\x93\xe7\xf6z\xdf\
-\xce-\xf3\x05*\xd8\x0f\xd6+\xe3\xc1\xfb\x8cF\xca0\
-\xdb\xa3\x80o\x22\xb0\x88G1\x94\xaaP{\x8b\xb5\xbc\
-\xf8\xcfz:\xeeM4\xd4S\x8b\x84\xe8\xd9\xc6\xa3L\
-M\x80\xcd\x04j\x9ej\x00\x9d\xcd@\x16\xec\x95l\x08\
-e!&\x09\xcf@I\x82\x89\xc8I\xd6ayz\xaf\
-1\xce\xaa\x08\xa6\xa3(-\x9e\xf5\xc6\xdd\xf3h\x00L\
-\xc1{\xb0\x9eAB\x99\x12Lb?\x13\xb4v\xf4\xfc\
-\xa5\x9e\x19\xfb&\x00\x8a@\x94@:\x17*$\x85\x88\
-\x0a]I@\xad\xbd/\x14)\x82\x92\x96.\xa9\xb0\x12\
-\xcb\x09\xa9%\xe9\xbbzv\x5c51\xa4\xd47}\xb6\
-(\xda&(d4\xe2\xcc2\x13\x8f\x14\xd8/\x15\x85\
-\x0b\x9d\x19\xa4.$\xa5q}\xfd\x93\xa0\xaa\xe0\xbb\xe5\
-\xe6\x1d\xf7]\xf7D\xf8X?\x85\x0f\x05H\xeb\xee\xd5\
-\xe0\x0f\x80\x15Z\xafv\x144\x05\xeb\xc3\xa0WAp\
-\x0d\xd8ZA\xd2\x9b\xc3\xd2+{\xbd\xbf.%\x1e\xbd\
-\x95`\xae\xdd?\x19\xd4\xc1\xa6>\xbc\xef\xac\xe5\x91A\
-\x09b\x1aO\x0f\xd6\x03e\x84\x19'\xe1D\xdc\x5c(\
-R\x0e\xf4\x09\xab\xc0,\x14%\xbb%%iR\x9fv\
-\xce\xab\xbf\xd0[G\x0c\x1e\x0b\xf7w\x11\xceINf\
-4\xcc<\x1f&\x80\x09\xa2z\xcd7\x14e\xc6\xe7\x02\
-\x94!\xd2\x9aAD\x05\xa8be\xa00K`\xfe\xad\
-\xff\xd0\xc3\xf8\x5c\xc9@o'\x05z\xd3\x95K\x9f\xb8\
-\xfd\x8a\xf7l\xde~\xfb9\xefJ\xa0K\x82qnP\
-b\xed\xa8\x1a\xd2HM\x11\xd3\xa6&\x15\xc2zF\xe9\
-\xa3<AZ\xef\x8e01\x0e\x8c\x12\x1aj\x9a0\xbe\
-\xb3\xdb\xda&\x15\x00\xa0]\xa1\x14\xb5fTyO.\
-)\x079\x0b6\xa3\x08\xf2\x18\xa7\xb5\xa1\xb2\xd4\xf5\xf5\
-\xbfo\xe1\xec\x1dK\x80\xdfs\xe3\x82\xd4\x9bQ\x81h\
-\xa3'cG3\x86)\xaco:\xd0\xac\xc8\xd8\x87\x96\
-Mg_ &I\xb0\xd4\xc93\x0cb\xd3Mg\x1d\
-x\x22~\x5c\xb38d\xde\xdf\xea\x91^W\x8b\xdaC\
-\xe3\xbb\xf7\xf5\xb4\x17\xb1\x04M\x89\xf5j\xf4\xe3r\xfe\
-\xd2\xdd\xab\xc2\x1b\x91\xbdM@\x14\x8a\x965\xea\x14B\
-\xb0a\xc7\xf2\xa8\xaa\xd2W\xdc\xd3[\xff\xd48\x91\xb1\
-\xfbc\x9b\x18\xdf\xd7\xbf\xb9a\x03}\xdc06\xd4\xd4\
-\xe7\xe7\xed\xeb\xc3$\x9aj\xd8\x1c\xbe^\xb7t7\xdb\
-fDQ\xd8\x91\x14i}\xf6\xad\x17~\xe4\x94;\xd7\
-\xd4\x1a:'\xf5wI\xb9\xa7\xa3\xa2\xa4,\xce\xd6\xf1\
-(A\xa6$\xad>\xf9\x95\xf1x<\x1a\xe5\x83\x94\x90\
-NK\xe8<vLn_\xaf0\xa1\xf7jG\x19\xea\
-\xd2\xf3\xca\xa3\xc7M\x9aLt\xea\xfa_W\x16\xbe \
-$\x0d\x14%\x9btc\xf5\xd2io\xfd\xd6#K\xa7\
-/]y\x1a\x12N\xc3\xb4\x0e\xb2\xca#\xd9\x1dq\x9e\
-A@\x87v\xdf\xe4,\xa93ODODO\xf9\x87\
-!L7\x0f@N\x11\xd5\xbfh\x0a\xdbkg\xfc\xff\
-T[\x0e\x7f\x14\xa0\xf2x}\xef\xd3Oj|\x7f.\
-\xbb\xfbi\xddTye<M\xc5)\xacw\x9eIG\
-\x10\xcf\x03\x00r\xe6\x98\x14\xbf\x90\xa101v\xa4\xbc\
-\xaf\xebR\x99\x1f\xb3\xbb\xff\xe5\xf0y\xf0\xc7\xbb\x93z\
-\xf7\x8a%!\xc0\x9eE\xb7\xb1wvt[`\xbd\x17\
-Q\x1e\x9a\xcd#\x08\xc7\xee\x09\xcb\x1d\x13B\xa9P\xb3\
-\x17\x01\xe3\x8c3\xc8\xd2\xdc\xaf&\xffy\x8f\xf4\x8b\xa4\
-\xf6+\x9c\xd2\xff\xa5r~a\xb8\x10\x96\xe6\x86\x19\x03\
-[\x11\xe5\xbb\xb8Q\x80\xcd.\xfa\xe9\x8e=\x931\x11\
-\xf6\xa9\x8c\x02\x13\x1d\x82`\xd3\x96\xfd\xcb\xe3\xfb\xbf\x1d\
-?\x1fH\xc5\xe0'\x7f\x04$?\xfc!\xbd^\x93&\
-\x09Q\xd4\x8e\xe3\xd3\x1c\x04]X \x80\x08\xf3\x9c\xd6\
-\x0f\x8co\x02\xce,\x958\xffN\xfaO+\xa1(\xbd\
-\xcaU\x11\xc0M'\xa6\xf7\xe7EP\xaa\x08`KU\
-'\xb2\xbf+\xdf\x7f\xdd\x96\xe3;\xee{\xe8\xe4dr\
-\xff\x0b\x1cy\xd2\xe6\xce\xc2|\xdbc\xcb\x851\xf7\x0b\
-\x8c\xb3S\xeb\x01\x94h\x09\xa0\xc4z\xc6\x99nd!\
-\x0d\x081\xca\xa5\xd7\x1e\xd8\xbf\x1c\xc0\xff\xfd#\xdf\xdb\
-\xbe\x8eP\x8fi\xb7\x9c\xd4u\x9ceQr\x94\xff\x1c\
-a\x9a\x92o\xfaU\xa0<\xf5\x07'\x17+\xda\x88\xd0\
-\xf42\x0a\xac\xc6\x85z]\xca\x1a\xa9\xf1\xcddII\
-\x87\x18ex\xd2\xbc\xaa\x8a\xf2\x11\xb2\x9al\xbb\xa7\xb4\
-\x07\x09\xcbi\xbb\x96\x02DB\x9c\xbc\xf3\xfb\x11\xd6\x13\
-\x93\x80\x93,\xd2\xa6\x03\x07^s\xe6%A\xa0F\xa9\
-\xc9\x94\x04\xf9\x5c0{e\x1f=Yu\x02\xca8e\
-\xbc\x9d\x844g}\x8f\x93#\xe7K/|\x99\xa2T\
-!\xad\xa3\xaf\xff\xdf^\xef\x1d\x97Sx\x7f\xed\xd7D\
-\xb9\xc7\xa2\xf7G\xf7O\xa2e+\xc8\xaa\x82\xe7\xf22\
-2\xea](\xd02\xeb\x81\x95\x06\x84\x14\x14%[z\
-\xa8\x87!BJ\x16\xea\xbf\x08\xdb\xba\xed\x9b\x9f\x7f\x95\
-\x10\xfb\xb3\xd3\x82\x92d}\xb5\xfc\x92\xc7o\xa6\xc6#\
-E\x11>\x03\xaf\xa7(t?{x\xf3\xc7\x08\xa9\xb2\
-~\xabXRr\xf1EA\xef\xf29\x8d\x80nZ}\
-\xe3\x89\x97\x91\x90\xf2V\xd9\x19\xd2_Y\x1e\x04\x94\x0c\
-\x95<S\xb3\xd443O\xe1Q\x19\x0d\xb3\x9d\xcds\
-\xe5\x86\x8d\xe7\x9d\xf7\xbaW\xc4\xb0&\xe0E\xb2\xec\xbb\
-lIio\xaf\x14e\x10k\xf7LGU\x9e\xdeM\
-B\xca\x99\xfc\xb7Z\x98\xff}\xef4\xd7\xb4#\xe3\xec\
-+IY\x95\x84\xf5\x90Q\x10\x14\xac\xb75\xa6g7\
-c\x87\xb8\x98!\xf7\x94\xad\x22w\x9f\xb1\xf3\xe4]\x1e\
-\xf9\x96;\x1e\x9a\x0e\xca0.\xfa\x1aQn\xd5GN\
-\x8bDmJ\xee\xfa\xe3\xcb\xe3r\x96r\x8e\xf5\x05z\
-\x09\xce&EEF]\x8a\x0c\xac\x17\xac\xaf\xf8\x8e!\
-\xc4\x9e\x1cBZ\x9c\xc7B\xcaQI\xa0\xa8\x10\xf4\x86\
-\x93\x8b\xe4\xe2\xcf?u\xb6\x03\xfeP@\xfa\xbdh\x90\
-.\xd8\xb4i\xfdYG\xf6O\xab\x82\x04\x13e\xc6!\
-Q\x94\xa0\xdaM\xa8\xca\xa8S{\xebB\x7f\xb3g\xc7\
-\x8d\xa3\x14\xe1^\xc9\x91:\xe1d\xad'MZ=\xa5\
-H\xea\x91\x1e\xc6\x89<\x88\xe9\xd2\xea\x87\xa6U5\x0a\
-2Q$2\xa0E\xfa!9|PT\xed\xfdB{\
-'\xbaM\x5c(\xf1_pb<\xb8\xd8\xc8=d\x9b\
-#\x9f\xd9\xb2\x84\xa1\xaa\xb4a\x5c\x96kNy\xa6\x87\
-q\xc6\xe3\x15)TZ\xa0 F\x04\xc5@\x85\x110\
-iQ_\xbf\xd0\x99q\x96qT\xd3AG>\xf3\x99\
-\xeb\xdeF^o9\xcd\x80\x94\x85\x94\x08J#]\xc3\
-\xae~spJ\x18?\xdb\xfb\xd0\xb4\xd0\xf2\x8d$\xa0\
-\x0cF\xc9;jQ\xccr\xde\xc8\xa87\xf8q\xe6\xd9\
-A\x8a0n\x9e.\x8e\x06y\xba\xf5\xdb\x91~Sx\
-\xa6\x22;\x9b\x22\xb9\x8aq\x92\x8b\x8a\xd016\x1d\xe9\
-\xddt\xc9\x03\xd3qU\xa2 F\xe4\xac\x81\x92\x9f(\
-\xa3\x022|\x01&=]\xbb\xa6m\xdb\xb6!\x01\xf1\
-UR\xe1\xa7\xa6\x03\xb1\xf5\xc1\xef}n\xda\xd8\xd3s\
-\xc0\xb7:ZR\x0d\xf5\x8c\xb9\xdf\xfb\xf4\xb8\x18W\x99\
-\xd6B\xc9\xe1\xd7`=\x8a\x0d\xc0\x0b}\xc2\xb0\xe9\x07\
-\x0c\xe4\xf0\xef&=\x9f\xcc|\xd3\xd6\x8f~e\xc2E\
-\x11E\xfa\xcfQ\x1a\xc6a\x9f\xf7\xe8\xa9\xbdUY\xdc\
-\xd4\x1dz\xb9\xc2<\x16T\xc7T\xee\x08d\x0d\xd6\x0b\
-V\xd5v}h\xf2@\x1c\xca\xd3\x85yb\x99(w\
-\xb5<hy\xd0\xb0\x08T\xe1\xf4m\x9aR\xc8)0\
-9\xef\xc0\x86o\xde\xf2\x8e\xe3\x8f/\x0e\x0a\x94\xc1k\
-\xa1\xa8\xe2\x04I\xd5\x81\x0a:U\xa7\xbe\xef+\xb0\x96\
-\x14u\xa6\x01\xa9\xfc+'\xad@O\x02\xfd\xad\x11\xe7\
-\xf9\xbbL\x06v\x12`\xd26\xbf\x1aU\x83Tk\xa1\
-\xa6f\x9f\xc8\xafIQ)\xd9\xa3\xca\x0c\xc6#\xa5\x03\
-\xb4~\xbbL@\xef\x1b\xe5\xb9!i\xf8,\x22A\x0f\
-\xf1\x8e\x19\xe3\x86\x07&\x05g\x1fRds\xa4v#\
-\x93\xb3\xa3\x80\xc9^\x9eP\x8a2\xc1\x92\xa2\xd0\xe4\xd8\
-\x8eL\x09G\xceo\x22\x9d\x1e5p\xe6\xf9e\xdbW\
-]\x1aS$\x87\xd8\xadb\xdct\xe3\xf2$/\x09\xa9\
-\x1d5\xff\x98\xeb\xed\xec8\x94)`fK\x0a\xbd\xb7\
-\xbc\xf7\xfa4\xcb\xe1\xff\x02\x09\xde8\xe2S\xf9\xbc,\
-\xe63v\x86\xcf\xedM\x90\xb7lyh:\x1ee\x9c\
-\x22a\xa4)\x83D\xfb\x03\x98\x0f\xc5'MR\xd6S\
-\xf44\xa7\x0e\xae0i\xfa\x12\xe3 \x828\xb8\xd8`\
-<\x1b\x9f\xa7\xf3\x22\xfb\xd1\x8c\x92\x01\xe4d\x94\xab%\
--\xc9\xe5[z2A\xc5\xe2\x03%\xa9\x11\x94\xa9\xaf\
-\xda\x9e\x98zXx\x80\xd5\x87y\x5c\x07\x7f\x81\xd3\x83\
-\xba\x19\xf9[F\xb7i\x9a\xa7\xe9e1\x16:v\xe4\
-o&\x8b\xa3\x9cs\x10\x0a\xd3\xd7\xc0\x13\xc9:\x93u\
-r\xc6\x89x\xcf\x5cw\xca$0\xc5Fy;\xaa\xa1\
-\xe8F\xde\x16\xfe\xdd\xd6,\xbb\xec\xabo?([\xdd\
-\x13\xd3(\x04\x97~\xf4\xe4d\x1cA\xc6x\x19N\x94\
-\xb8oh\x8a|\xb3X(Wf\x12;\xaf U\x99\
-|~\xb4\xbbA+\x8eU\xaa\xd0\xcd\xf8i\x9awU\
-E\xc0{\xc9\x94\xa2\xc6D_\xa4HJ\xd1\x12~\x09\
-~4\x82\x12!\xb0\xb5PH)p\xc23\xd1\xb3U\
-\xdc\x0c\xc6\xbe\xe0n,JI\x8f\x96\x02\x92\x16\x85\xa9\
-o&g\x84\x0c\x9c\x02U\xab\xcb\xfa\xb3\xd4\x04\x5ck\
-\xf2}\xf9\xe6c6\x15|x:\x96\xbd\xbd\x1d\xa5\x08\
-\xa9\xc1\x89\xa2\x98V\x97[\xb5pTB\x15%\x87Q\
-\xc6\x8c\x1a\x11\x05PW\x15\xf9\xecU\x8a\xf2\x8e\x9f\xec\
-\x99\x8e\x07\x06dd2\xd9w\x12Ua\xbe\x11P\xc6\
-\x19\x16\xfd\x91\xe6\x0b\xebQ\x06g\x9a\xd2\xe2\xcd\x13\x83\
-\xec\xd4z\xd3W\xf0\x1b\x97\x5cs\xcd\xde\x9f\xec\x08\xd9\
-\xa4J}}\x06\xa4\xba\x0aJ\xb1\xa3\xben\xc7\xe0J\
-\x9a-\xbdG\x13!3\xde4\x11\x82\xac\x1dv\x14\xf9\
-Q\x0e\x9c\x06\xd5\xce\xaaj\xc6$\x88\xa0\xd0\xebH \
-\x1dEY\x99jS\x10\xb7m\x1a\xcazo\x9e\xe0\x98\
-\x1c\xdb\x91\x1f5\x05FzxGoJb\xbe\x89,\
-Lo\xee#=\xc1wZ|\xdc\xcc\x93\x17\x87\x13$\
-\x9d\x93vt9\xe7\x0cE[\xa8\x91\xab\xd7\x03\xac6\
-\xe3\x99\x1f\xc0\x02-\x07%\x02\xd2\x82\x85\x1d\x85\xf2\xaf\
-\xe0z\xbd+4i*\x8f\xcb7`<\x06hJ\xb0\
-\x0d\xf3\x99\xf7\xecA\xc1z\xd8'\x8d\x9e4\xd4\x03N\
-\xdb\xab\xd1Y\x15\x19\x18\x9c\x0c5|\x13F\xcf\xf80\
-\xc1\xfb\xc6\xa8\xf5E\xe1\xc8\x1c\xd6\xf75z\x02@\xe3\
-@\x81\xd3g\x9cm\x0d\x5c\xa1j7\xae\xd7yt\xe5\
-\xa6bI\xd1\xec\xc62*T\x05AK\xebBy\x12\
-q\x150\x94\xde\xb5\x11\x8a2qD\x02\xb4\xb3\xf2\xa2\
-\xd6\xec\xad)\xd5\x89V\x22)\xdc\x83\xaa\xc9\xcc\xd9\x83\
-\xa8D\xc50\x89\xfd\x8a\x14\x86\xc9\x08\xa9NW]6\
- ie\xd6\x13P\xb5\xa4\xa0f\x9c\x8e\xf5\xd0\xfa\xe8\
-\xf0\xd1D\xe84\x09\xec\xc7\x9e)101}\x02\xc2\
-\xb2_\x0bb\xda\xe7\xecm\x13\xd4\xdf\x1b\xa8\x08\x13}\
-O<\x1d\xd4\xe1\xece8o\x18\xef\xf2\xa3\xccx\xf8\
-\xa6\x94X\xaf\xedY\xb0P\xa8\x85\x81\xa2\xbc\x00(\xfc\
-|m\x8c\x93\xb3\xf8\x0a1\xf1:\xef\xeb\xf5hy3\
-\xea\xc4/m\xcc\x14\x94v(\x5c\x87\xb5\xe6E\x03\x13\
-O\xcd>\xda\x1d\x81\xd2oD\xf4\xab\xb3\xd8\xe0\x1b\xde\
-\xe2\xc8-Np]\x80Z\x9c\xe8)\x89\x8f\xa5\xe7\xb0\
-\x0f\xd6K\x82\x84\x16\x97\x86P\x80\x06+2\xceh\x22\
-\x94'\x95\xaa\xad\x89JJ~\x19\xd6\x17f\xbb,\xbd\
-O\x08I\xbc\x17\xa5\x1f}\x1a\xeb\x84\xbe\x17\xb7\xafg\
-\xcf\xe4\xdb\xdb\x09g\x06\x19\x05-\xad\xa4:\xbe\x87\x07\
-\xca\x94\x04\xe4]\xee\x93\x1f$\xc5\x13c\xee\x8d\x15\xb5\
-\xad\x1a\xae\xdb\x91\xbb\xc53\x18|\xab\xf7\x82O\xdf\xfc\
-\x82\xd6\xaby\xf22\x0a\xb4\xbaW\xa6o/\xa8p\xf9\
-6\x1e\xb5\x03\xfd\xcd\x99\x97Q\x905Ut\xa9\xd1\xa3\
-\x1a\xa6IVk\x99\xb0\x9fw\x18\xfd\xbe\xde\xfb\xfa.\
-\xb4qi\xf9P\xeb\xe8IT]\x96\xc4\x91\xd4\xb5\x0e\
-\xc3\x86\xd2b\x15\xc9\x1fl\x98\xafL\xaa\xf8\xa0\xa8\x0b\
-J\x8a\xb8\xfanLu\xa1\x82\x12@\xed\x90\xe8\x095\
-&@\xednx[\xd1\xdd?J U\xf3\xa1\xf5\x08\
-L\x0a\xae\xde\xd0\xce\xd9\x84\xf8\x89\xb2\x1e\xb3\x9dwb\
-\x96sa\x84\xd4>q\xbe\xc9$\x9b\x8765\xee\xb8\
-\xce\xab\xb7\xf6\x08\x99qZ \xc5\xae^\x95I\xe3Q\
-\xc8\xa9\xed\xc3\xc7a&CMy\xe4\xe5sO\xf2D\
-h\x99`\xcdT\xa7(\x84vh[m\xce\x18jC\
-kZ\x15l\x9c\x84\x118\x01\xd6\x0c\xa3Fx{\x8a\
-\xa6\xbaF\xe9T\x19\x05T\xf6E\xea;\xfdV\x84W\
-\x06[\xf3\x0b\xc3\x22\xf5\x813v\xa1\xde\xdb\xfb\xde<\
-6L\xcdcl\x99\xe1:>\xbd\xa7\x07J\xa4I\x8c\
-\x98\x82\x9a2\x05-l>\x0c>-~_\xef<\x13\
-\xc3\xf5[P!\xa8\x85\xe9s:%\xa4\xd3\xf8{\x17\
-\xe5\x81\xb0N\xef\xbdy2}O0\xa2\x19\x93\x15\xbc\
-w\xa7\x9adZ\xf9\x04\xf3\x91\xd7a\x90\x16.`&\
-\xde'\xe9\xea\xca7\xc6\x8eR\xef\xa0\xc0\xc5\xe0\x04Y\
-1\xe3\xbaLKWD\xf7no\x87\xed\x08@Z\xdb\
-\x04\xc5\x9f\xd7\x01\xe1\x07\xe1\xe4\x98\xc4\xb0\xbf@\xa0\xd7\
-\x86\x09\xe1\xa4\xc5\x9fm\xe8\xc3\xd3\xebj\xa0v\x07%\
-\xa0he\xa5T9\x8f\xc0\x99a\x02i\x89\xc0\xd91\
-^\xd9^\x93}BX\x0a\xa2\xca\xe2r%@\xab|\
-ok}k\x08J\x9c\xc0p\x91\x93\x22-`\x9c|\
-\xea\xb1L@R\x83\x12\x91\x13b\xd1D \xfaZ\x18\
-\xa0\xba\xb6L\x06\xca\x10\xado*y\x16f\x17*\xae\
-\x09>T\xa5\x14\xd9\x92v\x80\x079\xb5\x81\xb3\x8f\x97\
-;=\x13\xcc=\xbfR\xdd\x88\xba\x5cI\x81\x93\x0d\xc6\
-\xd5\x1bQ\x85WrJO\xe0\xd0\xa7\xd1\xd2\xa6\xb9@\
-+\xbb[\x96\xed'\x0c~n\xad(\x07%\x90S\xd4\
-\x99\x12^\x98\xe3<\xbb\xe3\xe6Y\xc1\xa1\xa5\xf8^4\
-}~\x94\x16/\xa7\x80i\xad\xe8\xbc\x13-\x00\x8b0\
-\xaf4\xd1\x93*\x13`z]r\xe2I\xb3W\x0d,\
-\xccT\x812=i12\x8a\x04\xa9\x1b|\x88\x8d\xb0\
-9\x9c\xf0\xf3\xb6X\xef\x8f\xaf\xces\xa1y\x05!\x85\
-\xb7\x87\xbd\xf7\x813\xa6\x09\x9fj\x9a \xab\x97S\x8d\
-\xef\xb1[\x02]\x11\xe1\xe1\xa0\xb5\x09\x9c\x09\xa7\x0fG\
-\x89\x90X\xad)\xb5\xb9\xd1\xd4\xeeC\x15b9gc\
-\x87\xd0I\x00\xfbZ\x837S(\xda\x02\xa7\xe1\x7ff\
-7\xa2\x88C\xc37\x12y\xc0\x89]\xa8\xb8zSl\
-\xe8\x13\xf3\x01\x18:oc\x92\xee>\xfc\xca\xf0=\x15\
-\x8c\x10S\x9f#s\x1b{y\xd5\xb0\xf8\x9a\xd2I\xb0\
-\xf6\x85\xf9\xb6^o0\x9a\xca\x9d\xa7\xa8iv\x84*\
-\xe9#\x0bR\xb9\xcd\x9f\x190\xa0Q\xa9\xcc\xe6\x1e\x15\
-1_\xafO:\x14\xaa3\xf74\xb0(\xf1\x9b\x01\x06\
-T\xd5\xfc\x19J\x9f~\x12_\xefl\xa8`\xb5\xf5z\
-\x07S\xa0\x82\x9c\xd0z+\xa2x)57\x86\xfa\xf8\
-\xaa\x5c\x83{s0\xd4*\xbd\xf8x\xe3\x9cJ\x13;\
-q\xab\x86\xad\xd7\xeb\xb2\xd2\xe2\x0cow\xd2\x16\xa3\x83\
-\xf7\xe9\xc6/\xd3\xc1\x13\xb0\x9fQ\xf2,\xe0\x99\x8c\x88\
-\xaai\xd2\xa9X5\xed\x88\x82\x18\xc2g\xa8\x92w\xf9\
-b\x9e*0\x1f\x8c\x17\xb4[7s9|\xdc\x14R\
-A)\xd3F\xa4\xc6=A\xe5\xe7\xd5\xeb\xbd\xd6\xbb\x1a\
-#|=\xf4\x09\x04U\xaa\x1e\xe5\x12\xeec\xa3f6\
-\x0f\xfe\x93&\x06\xec\xa8,\xf4\xc0\xd8\xbbz\xbd~C\
-\x8f\x90\x18\xf7\xad\xc3\xde\x85\xc2\xd1\xaf\xa2\x8e\xe1\xe5\x09\
-\xf6\xa2NJM\x1c\x0a;*O\x93\xf5}_\xaf\xc7\
-\x00T\xb0\xde6h\xf94\x09\x9ch\x1a;K\xaeZ\
-\x1e)L\x94\xeb\x95\xb0\x96\x9a\xb0\xa3\x8a\xd6\x0c_\xaf\
-\x87J\x81\xef\xfa\xb6Z/E\x11\xbb\x15\x81\xce\xc7^\
-\x83\x83\x13wcAQ\xc0\xe2[\xb43;\xaazT\
-\xfa\xf3\xf5\x88\x9f\x00\xd2\x15\x1a|\xd1\xd6\x88\xa7.\x02\
-u+\xf5\xee<\x96+D(\x94M\x8fZ\x01\x80l\
-\xaa6\x01k\xbb^\xef\x93\x8e\x0c\xd5\xdaR_\x15\x01\
-\xeb\x19\xe9\xef\x92q\xaa,\xebQ_.\x9c\x8c\xf2[\
-\x9f\xba\xfb|=\xcc\x93\x13R\xa0\xf5\x9e\xc9\xe0l{\
-z:=1F\xf3\x8b\xb4\x8eBF}\xcc\xac?}\
-\xe90\x81\xb3\xa2\xf5^I\x81\x9a\xcc8\xf6Lm\xa4\
-\x025\x7fwl\xa3\x9f6\x1bux\xf8D\x1e\x10\x9b\
-\x94\x8e+6\xb5\xc2\xe6\xc4\xd9\xd0\xeeN2[\xb2\x85\
-i\xd2h\xf4\x14\x11R\x82\x08\x9c\x85\xfa(\x0b\x18\xa7\
-\xab\xe3\x8b\xbf\x91&\xd1\x0f\xd4\xeb\x15\xa7\x05\xeb\xec\xa8\
-\xdf3\xf9\xf8\xf9(\x9f\xf3K\xcd)V\xdf\x9e\x93\xb2\
-\xb3GK\x11t\xde\xd7CP\xafW\xbd\x07\xeb\xe7\x1f\
-\xb7\xf4\xca\x84k?\xf2\xadiF]\xad\xe3\x8cqB\
-L9\x90*:z\x9e\x12lFk\x7f\xf3\x0b\xaa\xe0\
-\x1aE\x81\x98M)\xed\xcc8+\xf3S\x03\x97\x99\x9f\
-\xfd_l\xb6\x9f\x10\xc2\xd4\xb0^\xea\xf5^R\xa5\xa3\
-@E\xc0*\xfe\x90\xa6\xb6d:\xd6\x03\x9f\x0fJ\x8c\
-\xb1\x87\x19\x15\xda\xd2\xc9\x8b\x07\xa7P\xa5\xd4h\xbd\xf3\
-\xf5LJ~\x9b\xcev\xc8i\xbf\xa1\xee\x5c\x1d\x01J\
-\xb4<z;\xea\x92\xe30\xa3\xf9\xe5|&\xf2\xf0\x22\
-6vP\xa6\x00\x95$\xc0\xb4\x91A\x04\x5cFG\xcd\
-(2\xb9>j\x06\xeb\x8d\x07\xa5\xed2P\xfa\xfb\x89\
-\x8e\xcaY\x0cu\xf6Px({j#g\x95P\x18\
-Q\xb7\xb7w\xbe\xde'r}\xffh\xd5\xd0\xfa\xd4\x15\
-\x1c\xbe\xaa=\xe2\x834\x85\xc6#_B M\xe0\x0c\
-\x88\xde\xdd\x0fU\x93l\xae\x84\x96\x95NL\xb1 \x1e\
-\xad,\xebaGS9\xcf\xff\xaa\x09\xb4\xbeH)z\
-r\x22\x0a\xadG\xd5\x0e.\x14\x045\xe6\xb3\xef\xe2{\
- \xf5\xc5\x06\xe7BS(\xd3/\xdc\xbc\x97\x0e2\x0d\
-D\xeb\xc94\xa5\x85\xb4\x91Z\xde\x9b\xbd(@\x22$\
-!\xa4\x90P\xef\xebQ\x17i\x83\x85\x8c\x0e\x5c\x86\x8c\
-f\x96m\x14w\xcf\x8c\xe7\x08\xaf\x19\xe5\xa5\xa6\xb1\x00\
-\xed\x83\xbc\xd24F\x94\xe5\x13\xf5z\x97&\x01F\x13\
-8\x07\xde\xd3\xec\xa8.\x0b\xde7PS6\xeb\x92 \
-U\x8d\xc2@\xecl\xfc\xbc\xa3(*L\x88\xa0\xbdB\
-y\xc5\xefY\x80\x88\x98\x91\xc7\xcb\xfe\x84\x8f\xb5\x89\xd6\
-KiY\xf5\x08hk\xa3Q\xdd\xf7=Y_j\x82\
-{s\x08\x83^ns\xd7ASd\xf32q\xf7G\
-\xaaT\x98\xcf\xda\xd4\x11\xdc\xd7\xa8\x812L\x9f\xcb\xe3\
-`\xc4\x86y\xbel\xdb}e\xa2+\x88e\xd4\xa7\xa1\
-\x89\xfc\x0c1)\xc1\x94ZS\xe7&4a\x8a\x92\xeb\
-\x94\xc9\x87\x06\x90\x17#\xa0\x8aT\x13&\x18\xf3O\x8b\
-\xf4\xda}d\xa9\x1c\x0a\xd6\xd6\xac8\x1f\x8d1)\x1b\
-(4\xe7\xf1\xbb\xb0J\xaf1\x09\xa7t\xf4\xe4\x8d\xbd\
-L\x098\x09\xa9\x93N\xabO\xbe\xba\xec\xbbJ\x22U\
-\x09\xea)\x10RQwZ\x0dE}\x17!/5=\
-.\xca\xc7\xdd\x9e?7\x1e\x85\x1d\x95'E-\x14\x11\
->\x01%!]\xff\xa6C$\x9e\xa6t\x8btn\x22\
-\x13E1\xbf\xc1#lf%\xc6\x03\xa1\x8bG=E\
-\xad\x12\xc1\x962R=M\xf9!\xa9\xdc5\xda\x88\x5c\
-\xed\xce\x10\x14\x22j\xb7LH\x96\x00(\xaf.\x1eE\
-\x83Vw\x87\x0eOi~y\xa3\x00\xbdm\x14\x94\xc9\
-\xd2\xb3\x9cS\xb0\xef\xa2(\x94\xcaD$\xa6\x82\x03|\
-\x00i\x1b\xb4\xa0\xf60\xf6\xaaQz\xb0r\xf5\x04\xc5\
-0o\x9e\x92\x048\xf9\xa3-\xa1\x0c\x0a\xde\xc9'\xf0\
-]<:\xaf^\xcfL\xf7\x1d\x10\xff\x16\xcf<\xec\xdb\
-3.\xb4\xd8\x10\xde\x04\xd5S\x15\x22\x0a\x9d\xf7\xea\xa4\
-g\xeb\xbdq\xf2\xf1(n\xd0\xf2\xd9\xbc\xf8\x12\xdd\x17\
-\xb0\xffz\xe2\xbe\xc98+\x1a\x09|\xa3L-]B\
-\xfc\xe4\xa2|\x98\xa7.\xcd\xf7\xf1((\xda\x1d9\xbb\
-\xb6'q\xf5\xf3e\x14\x05F]ivu\x11\xce-\
-\x88\xcd\x8fGs\x9b$Ky\xb5Z\x8fA\x04\x85\x81\
-\xf2\xaad<=o\xef\xc0\xfd!\xd2cP{\x9f'\
-\xf1\xe4\x5c!\x11\xbe\xdf\xd0\xe3.\x1dS\x06g\x8a\xa2\
-^\xef{\x89\xd0U\x227\x0e\x03%\x16\x93\xc9\xe3\xcf\
-\x9f\x1f\x8fV\xad\xb3\x22\xec\xde\x19\xaf\xf8\xfa\xcc\x92\x14\
-bZ\xd2?\xac\xaf\xa7\xc9B\x0a\x82\xf2\x00\xcb\x91#\
-\xa3\xb0\xcf_\xf7\xe4\xc2Q\xc9\x94T\xd6<\x19\xbe\x9b\
-~\x5c\x8a\xf2\x05\xa9\xab\x82\xab\x07\xc5\xa1\x16\x1c\x08\xae\
-Q\xaf\xf7\xbe\xde\xb0\x7f~<\xea{J\xe0\xefm\x0b\
-!j\xf5\xb6^o\xbb \xa0N\xa5?f\xad\x12\x0a\
-\xe6\xfb\x02#\xaeK\xf5\x09\x08\xb7\xfd$\xe9\x0c\xd3u\
-\xe2\xf3R\xb8\xbe<\xc8\xa7FO\xa2\xf5\xf3\xce\xd7\x1b\
-_\xef\xfb\xf0\x01\xd2\x1a|\x0c\xa8\xbcp\xbfh_\x97\
-\x09\x19\xa5\xd5\x94\xc1!\x9d\xb8\xdf\xd1\x07N\xfax\xee\
-\x83\xf7\x18\xae\xc7\x19\x038\xa1\xf5,\x9f\xa6^_\xf2\
-\xe2\x8f6\x98\x0c\xa9s\xf5J\xd5F\x82\x5cA\x02c\
-+\x93\xcb\x05\xb1\xbcMPl\xee\xe4J\x9d\x223\xf7\
-z\x02a\xd1*\xd7\x1bo\xef`\x12\xb3\x91#\x0d\x08\
-i\xb1f\xc9\xd7\x99|u\x19\x9a\xc4\x0bC\xe4)\x8f\
-\xb2^*w\xaeW\xc3\xd5\xeb%\xd2\xc3\xd0>l6\
-N\xf1\xed8\xff\xc1\xd3\xaf\xb0\x06\x0a\xf5z\x0c%$\
-}\xc4/\x08)\x8b\xa8\xd6\x99\x8c\xd6\xab\x12\xb9z}\
-\xc0m\xf8\x8e2\xb87PB\xceO\xd3e'e\xd7\
-5\xf3\xe1\xb1\x15\xb1,k\xb5\x12!\x8d\xabu&_\
-\x0f\xa3\xc5\xd5\xeb\xadt\x9a\xd48(\xab\xb4\xa47]\
-\xb7\xf8\x83\xdc\xd0\xd4\xd6\xeb\x81\x15\xddYz\x9c\xa9\xc8\
-T\xe9qb\xc4\xf6\x95\xf0\x9dTs\xeb\xf5\xc0\x8b\xd4\
-\xb8\xc2\xb4)\xb2+\x22\xd0o\xde\xa5\xfa\xb4\xc2\x9b'\
-\x98Re=\x88\x9a\x05\x94q\xe2F\xf4\xce\xb6\xcc\xba\
-\x95\x22\x87\x84\x22&Q\x8a\x12ho\xf0\xf9:\xbd\x0b\
-\xc6\x1d\xbe\xde:&F\x8a\x03\x8c\xe4\xef55\xaeQ\
-\xb3\xf6\xe1\x03f\x82\xb7\xf8\xfb\xday&\x01\xaaw\xcc\
-\xf3\xe3b\xbd\x15\xbdc\xc7\xf7\x8f\xefr}O\x83\xf9\
-\xfd\x8e\xb8~\x14\xca\xc4$E\x1f\xbe\xad\x82\xf2\xca\xb9\
-q\xa7\xef\xa8\x86\x09\xd2\x8bw}\xbey-\xba\xd6\xc1\
-\x93*\xed\xab1\x85\xd6\x0f\x9a\xea\x9421\xf5\x95\xb5\
-\xc2\xe6\xd4\xeeB\x11\x94\x80\x9ajKk\xb9\xac\x027\
-\x95\x08\xb3Y>w\x07\x90\xf1b\xc5c\xa3\xbeo\xc3\
-\x1fv' \xaa\xbc\xebp\x83\xdc\x9a\x07\x92\x82\xa2\x08\
-\x9e;+\x22\x04Qo\xd6\xf0\x09\x88~\x5c\xae\xdd\xac\
-\xa7\xce\xc7\x96\xf1\xba\x0d\xb9\xf8\xf6\xe7\xafHlO\x89\
-\x17\xd0\x94O\x04\xd3\x84:\xb1\x8c\x0a\xc0\x02j\xef\xa0\
-\xea \x88\xae\xbf\x9d\xd8\xdf\xb8<o\xbf\x9e\x1a\x00!\
-/>\x87/\xb8\x1b\x1b\x17\x8a,.\x86\x22\x05H\x90\
-TnV\x80\xde\xe3\xa0\x90\x9ei\x00\xd2\x12\xc4D\x16\
-?\x08\xe5\xab\x01\xf4x\xde\xb7a\xf3?\xf6t<\x96\
-\xb43%\x95\xcb7f4Z\x91s\x01\x8a:\x98j\
-\xec\x81\x12\xc2Y\x8b\x95G\x7f\xc1\xc5\x04\xe4\x9e\x1e\x09\
-\xa9\xb9vx\xe5\xb9 \xf6u\xb9\xeb\x1aw\x22\xca\x12\
-\x8a\xab\xb1\x0bZ\x94\xa2\xa6\x0f\xdfy{`%mR\
-\xa8\xa0h\x18\xd7~\xe0\xc0\x8e\xa7'\x94\xca^4\xac\
-_\xb9\x04\xa0\x0f\x8e\xda\x145&\x1f\xe7\x99\xb0\x1b\xa1\
-\xa0\xb4h\xe6\xc6\xad\x80\xa6\xba\xa9\xaf\xe5\xd6a\x04\xce\
-\xfe\xa2\x92>=\xf1&\xc2/\xd1\xed\x86\x14\x97 p\
-^\x17\xad\xfd\xea\x0b(\xd3\x89\xebG\xdd\xbe\x1e\x09\x1d\
-\xc6\xcc\x8c'\xa7\x94\x15\x85m\x1b\x86s\xc2\x10\xb8\x12\
-\x94\xbc\xf8\x22EzH\x8e\x0aN\x89\xee\xdeKB\x9a\
-Z\x9d\xff\xad\xb3\xef}|\xb1\xba\x90\x85ta\x06\x15\
-\xcd/f\xe0\xcce&8\xc5\x7fJI\xa4,p\xaa\
-\x0d\x5c\x97l3S\xf4\x9d\xab\x82\x9d\xfc\xfe\xd8\x18\xfd\
-\xbePT\x0d>\xdd\xbc5j\x02\xd5\xe7\xe3T}O\
-\xe7\xc9\xa8\xed~\xd0\x02\x8ep>C\xdc,\xb5&7\
-\x12^\x03\xce\xeb\xf5\x02`D\xf9Re\x8a\x00\x13\xf1\
-\xa0\xebp\xd1<3\x1e\xc9Q\x08\xa9\x95Q\x8b5U\
-\x17\x0a\x19\x15\xa5\xb7\x94\x94\xd480\xd6\xba\x0dyT\
-\x80\xbe/g\x98\x8a\x93@\x92RE\xdf\xf9\xefjI\
-\xa1\xf9\xfc[XxO\x00\xfa\xcc\xd4P\xd4\x85\xf8\x80\
-+\xa9\xf1\x82cgh?\xf6\xf5\xce\xda\xcbf\xf9\x1b\
-\x02t\xf5h\x16\x94\xf41\xd5\xdb\x7f\x1cBj\xfb\x9b\
-\x17\x16N\x87%\xc5vy\x00\x90\xe8(A\x12B)\
-JS\x8c\x13\x81\xe57F\x8d*\xe3K_\x96\xebc\
-&3ez\x89\xb0i\x88G\xbc7B\xaaP\x99\xa2\
-\x1f\x84\x90\xce\xef)\x81\x94B\xeb\xd5\x90\xc6Q2\xe0\
-\x8e\xa3l8$\xb2\xa6\x1a\x7f\x80\xacO\x14\xd2\x7f\xfa\
-\xc63?\x0b\xdfoX\xda\xdd\xd7\xab X\x9b>E\
-\xb7\x1bZeb\x8a\x92\x90>12[\x91\xaaj\xb3\
-\xdd\x1cj\xa1\xa7`\x88\x92y@%\xd4\xed\x96%\x1e\
-\x89\x9ft}\xf2\x8e,\xf9\xab\xc6\x85\x8a\xbf\xa3\xd1(\
-\x9f\x0c\xfc\x12\x0b\xa9o\xd6XX\xf9i\xb6\xa4o\xf9\
-D\x88_6\x0f)p\xf6\xaa\x84\xba\xc8\xcc>!=\
-jN\x89\xb5F\xd3\xd5'}\xaa\xf4\xef\xb4\xf7\x15\x1e\
-\x13\xef\xc4=\xd9lI3\x90\x13\x8d\xae$\xa4_W\
-Q\xaf\x11\xe1\x9b\xaeq47gz\xc5\xbc\xf0\x9e!\
-\x16\x90M\xc0\xd5\xear\xad^42\xf6\x82c=;\
-^^\x0aI\xfbC\x15\xd2\x9dM\xe9\x8cl\x0f`\xdf\
-\x12vN\x18\xd7\x8c{\xa8\x82;k/f\x94pf\
-\xda\xa3\xa3w\xe9\xe8\xde\xbe\x9d\xd2a\xaf\xc4@w\x01\
-\xde\x86\xb5[\x0e\xdfv\x06}\x1e)\x84\xf5\x11\xf0\xa7\
-\xc8\x92\xc2\xd9\xd3\xa5\xae\x1f\xfcR\xeb\xb2\xf2S\xf7\x8c\
-\x18\xa8\xab4\xb5\x94\x09\x96\x09Y<l\xf2\x8c\xbd\xaf\
-\xd3\xf2\xcaU\xbb\x98\xa4\x9fW\x98\xab\x1f[\xae\xb22\
-\xe1\xab\xaf6\x8dY\xfb\x89\xaaFH\xf9:\xdf?\xff\
-\x82Ey\xd55WOF\xc3\xeez=\xc3t\xa9\xf1\
-\xc2\x16C\x8d\xd6'\xfc\xf9N\xbeu~BW\xd1\xad\
-\x11\x9cG\xa6\x03\xb1\xa4\xef\xa6\xfb\x0e#I\xc5\x94\xbe\
-(\x96\x14\xe5\x9bh\xea\x01r\xef\xcd\xfb\x17+W\xaf\
-w\xd6\xd4P\x94}\xbd?-\x80\x91(\xb2\xde\xe7R\
-\x0aH\x99\x83gNs\xf6\xf3r\x01\xfe\xbeQ@(\
-\x82\xba@\x0a\xb63\xec\xf3n\xff\xc6\xe6sWF\x8a\
-^1\x03yx\xffdg:\xa4[=\xb5^?\x98\
-\xd3\x98\xe9\x8b\x0d\xa0f\x13\xf0\x9aG\x9e\x8b\xaf\xa5\xc6\
-_\xbd\x08@EH\xf7\xdc\x8f\xb0\xe4?c'\xcd4\
-\xc1\x1f\xe6\x22+t@d\xf2\xfd\x91\xa2\xdb\x9e!J\
->5\xe1\xbd\xe8\xfc\xde\xbc\x14@\xfd^D;\xc9p\
-\xc1_Q^\xfb\xdb\xc1P\xbe\x90\x07\xa0/*\xd0\xf5\
-\x13\xa2(\xfd\xfb\x8ei\x8a\xd8\xe9\x1c\x8aT\x88\xf7q\
-\x0e\x87F\xb9\xb7\xe4$\x01\x1b\xc7\xe3\x9d\x01\xa4\xbf\x93\
-\x0c\x01T\x96\x81\xf9\x0c\xd5n\xec\x0bE\x89\x1b\xfe\x96\
-^\xc5\xd0\xc6\x01h\x11\x0a\xe67\xed#!\xe5\xdd\x1d\
-y\xd1)\xc2<\xde\xd6=\x95\xf6i\xbcwWK\xbb\
-OVlC\x17\x16\x16:\xb6\xcb\xce:)5\xe9\x87\
-\xe4x!P-\xd2\x8b\xf4\x0a\xdfe.\xe0\x8fG?\
-\xa5{73J\x91\xac\xa3\xbe\x99\x1a\xcd/D\xc0I\
-\x04\xfaK\x86\x96\x91\xf2k\x9f\x9e$\xac\xf9a\xf8#\
-\xc1\xb8\xa0\x86gj\xf4\xa9\xb5\x05e\x98\x87\xce{\xf8\
-\x8d\x17\xdeY\x16\xf1W(5~1\xe3\x10\x8fu}\
-KU\xce\x84\xf4^\xec\x98w\x13\xf1\x97Kq\xf3\x00\
-y\xe6+\xa3L\xaa\xd1\x0f\xc3\xa5\xc6]\x1f\xbe\xad.\
-+\xef\x81v\xeb#\xeb\xe4~\xe1\xed\x11kzk\xa0\
-&\xddz\xfeE\x89Jj*\x98\x8f\xebD-\xe9\x86\
-\x91n\x98x\x9f||\x1cM\x93\x019\x1e\x15b\xf4\
-\xc97\x85\xa5A\xcdm\xb8U\xc3g\xf0\x815\xb3:\
-\x7f\xb4y9\xf7\x1f\x93\x00|rr0\xc2Y\xd4\x90\
-t\xbbXR\x15\xd2\xde\xdeR\x02=\xe6\xf6\xf2 \x9a\
-\xfb%\x92\xdf\xb3^\xf9\xf4\xe2(M\x9a\x95\xf0\x05\xa2\
-(\x80v\xfe\xa5\x16E\x87VW\x18\xa8C\xcfn?\
-\xf5\xe8\xf9V\xaen\xe1\x0d\xc9v\x12\xd2\x22)\xf17\
-0\xeeMi\xaf,w/>\xbb;y\xe9\xf5\xbbX\
-\xed\x0eLk2\xa1\xef\xbd\xee}\x8f\x8f\x03\xc8~\x03\
-%\xc2<s;r\xcb<\xf9\xed\x08(z\xe99\x07\
-\x896zC\xa5\xbe\x1f\xcc#\xd2%\xd6\x1f\xa97\xec\
-fK\x1ac\xbd\xf2\x0f{\xed\xb1wZi\xd7cB\
-\xfe\xa9\xe3|X\x97\xd6\x9b\xba\x9dow\xe3\x94^\xba\
-\xf1\xd4\x1e\xc6\xc1\xb5\x0fL&_\xbcz\x1f\x01x \
-\x02}\x8e\xf5G\xa3\x92\x18\x7f\xbem\x91\x0c\xd4\xb5\xee\
-Z\xf0\xe9N\x89\xf4\x13\x7f\x09%\x8e\xb4\xb8#\x03\xdd\
-'\x1b\x04$<\xd3\xd1\x1e\xc6\xda\xe9bE\x96\xff;\
-\x14\x84WQ\xf7O\xe5K\xfb\x19)\x01\xed-\x07\x98\
-oE\x92I\x18\xb1v:\x22\x9c\x0cO6y\x18\x9d\
-\x17}msI2u\xa0\xfa\x03\xd2\xcb\xaf\x82\xf7\x98\
-V\x85\x8c\xcd\xe4 #I)\xd8\x98\xca\x95D\xec8\
-\xd7.]_+\xbe{d\x03u\xe3\xf28'\x98&\
-\x87\xcf\x13R\x1a\x9e(\xa2\xc0\x89Z\xa8'\xaa\xd8{\
-h\xd2k\xf7\xae\xed\xb1\x9f\xa9R5\xf7gS\xffs\
-\xa5Bz/\x97\x1c\xbe5\x13\x91\xf7\xeb\xd7\xf4\xae\xab\
-\x0f\x1c>\xb1g:*$\x05\x81?\x19K ]\xd9\
-vAJb\xe6\x08F;\xc2G\xb1\xde\xdc\x04PU\
-/\xe3\x90-U\xafT\x5cD\x94\x1b\x15\x22\xa4\x1bv\
-\x96e\x91,5\xd2q\x8f\x12\x1dW\xefXN\x93\xb2\
-\xa8\x93\xa1\xfa'\xa1(\x85z@\xea\xae\xcb\xc402\
-\xea\xcf\xdf\xcc\xcc\xd3Vz\x13\x7fw\x8c\xe0AK\x02\
-\x1a\xedgA\xc2\xb8\xfe\xd9kO\xf9\xfd\x1e\xc6Cw\
--m\xd9\xf1\xd4\xe2(\xabMR\x87\x86\xb4\xe9\xe8\x03\
-\x90\xdd-Z\xdb\xa8U\xa3\xb3\xd4\x94:\x83\xbf\xc4@\
-\xc9\x8f\x12E\xdfL\x7f\xa5a\x1c\x85\xf4\x0fzM\xb3\
-\xb0\x85`\x7ff9]\x134\xad\x91\xcb\xa3\x85\x07q\
-\xde\xd7\x96->kG\xfd1[\x98(\x13>\x1d\x22\
--\x07E\x0b\xf2\xa5\x8f\x8d\xc8\xe6\x93b\xa9\xdb?\xb9\
-.\xb0{q'\xe7\x1c\xeb\xda$\xf3\x84\xaa\x8d{\x7f\
-\xfa\x8e\xf3\xb0M\xa0h\x17\xe7\x81\xd3\x8c\x92\xd3^z\
-\xdftJ\x0e\xf1\xe5\x93\xbc\x8c\xe3\xf2\x7f\x11\x94t\x8d\
-~R\xe5\xd2\x9d\x87\xb6\xb7\xa1\xb9\xd1\x95\x81&]\x7f\
-k\x1d4\xf5\xf5zOT\xa8\x15\x00\xf3~\xe8O\xf9\
-O\x06\xde\xc94<1.e|\x98<\xc0\x1d\x87'\
-\x93L\xfe,\xbc\x1f\x80\xe9\xee}AF\xcf\x1d\x0c]\
-\xe12\xce.\x22\xb1d}V\xac\xe2\xae\xa5\x03\xba\x13\
-~b\x5ca\xcf4\xf8\xe8\xc9\xc5\xc9(\xd3\xb4\xb8i\
-r\x16\xe6\xa3g\x1cP\x9d\xc1\x9f\xd3\x91[\xe5\x08\x9e\
-S\xdb\xada9OBj\xc7m\x93\x11\xce\xac\x9b\x14\
-\xbe\xf0]\xd8\x0e\xa8\xee&\xc2\xc4\xdd\xe0\x0d\xdf\xe4\xef\
-\xd2\xf1\xe6\x1e\x09]\xa8}\xde\xc6y\xcdt\x94\xba\x0c\
-Dx\x11Ps\xe50\x14_\xcf1\xa1)\xd7\x88\xa8\
-\xa7'\xfaGm\xbd^\xa7\xd7\xa54\xdfn\xe3\x8b\xfb\
-\xa6#\x86\x98\xa2\xffA)\xaa\xcdD\xad\x1a\x93\xb0\x1e\
-\xa7\x83\x1c\xebe\xb5H\xfd\x91`\xa7D&r\xe6H\
-\xf3\xe6c\xbd{\xee\xd9\xb0v\xffrU\x94\x85\xbb\xe1\
-\x8dP\xb2\x8cr\xe9\xd6\xdaQ\xd3D\x98\x00\xad?\x19\
-J\x0bN6\x18j\xba\x14\x04\x04\x15\x96\xf4\x92Q:\
-\xa0?\xfcGv\xdf\xe4\xc8x6e\xb4\xf6w\x95\xa0\
-\xe3M\x86~\x18b\xfa\xb3\x22\xf0\xf4\x96\xf7\xc0\x88Q\
-\x90K\x1f\x93\x15\xc5]\xe3\xb6\xb6\xac\x09R\x1c\xb8\x83\
-o\xb2v4\xce>Pj\xe2\x11T\xb5\x8d\xae\x1d\xda\
-\x94BL-\xda\x22Z\xd2\x1b&\x05\x0dE\x9aZ\xa8\
-\x8d\x12ci\x19O\xab\xc2D\xe8d\xd8\xefI\xe9o\
-\x22\xb4\xe7,\x9dk*\xe3\xf20\x05\xf5\xb9\xa0,\xdd\
-\x1d\xde\x5c\xb8S\xb0\xd0z{\x86Q-=\x90z\x17\
-\xea\xa2'\xd0\xd3\xc7O^H\x7f\x8fB\xe7\x91\xa6!\
-\xd0X\x80\xa1vT~\xfe\xcc\x1d\x9ar\xfd1F\x14\
-p\xa0O^\xebS,\xc2~\x7fA\x0d\x0b\xe9\x9d\xa7\
-\xacz\xb3\xb0\x9eP\xda\xcb\x89\x94\xf5e\xe7\xa1\x16m\
-~\xe9\xf2\xf5\xf0\x9d\x9e\xa2\xb6qXW\xa5\xa3\xbc\xd1\
-\xab\x83$\xf2\xd5\x8c\xd4\x8fZ\x86\xf3\xf7M;\xdaw\
-go\x0c^P\xd3\xdc\xde\xee\xf2\xcd\xfc\xe99\x8f\xbc\
-b\xdc\xcb\x05\xa0N\xed\x13u\xa2\xa0d\xd7M\x84\x08\
-C\xbd%u\xd7\xd1\xa1#\x97\xa73\xfa\xce\xd9\xaf1\
-)\xc2IK\xeb\x13\xd03\xac\xe8\x1d\xef\xf0\xa0\xb2\xb2\
-u\x82*\xf9K_\x86\xad0\xafrY\x5c\xd5|\x93\
-xj\xd0s\xdf\xe1\xe5\x9d\x0c\xd4\xf6\xe8\xf8kR\x95\
-\xfdC{\xe4\x92\x1eGQ\x1f5\xc3\xd7WN\xe5\x9b\
-\x09\x08\xf3\xb7\xac\xff\x830R\xc2(Ds^Fq\
-T\xdd]J\xe5n\xee\xa7\xe1]\xa8\xe2\xf4\xd7z\xce\
-/5\xd8\x9bg)\xd3\xfc\xec\x1b\xd6\x9f\xb5cy:\
-\x1e\xa4\xb3D\xee\xff7v6\xad\xb6\x1dE\x18\xbe\xd1\
-\xabk\x7f\xac\xbd\xd6Y\xd7\xbb\xb9\xde\x13P\x07^A\
-I@t 8\x88\xa0\x01\x11'\x89\xa0D\xf1k\x92\
- \x19)\x82\x1fq`\x06\x8e\x1c8\xf0'8S4\
-\x198\x0a\xfe\x80\x8c\xfc\x05\x01A2P\xfc\x15\xe6t\
-\xd7^OW\xbfUk\xdf>{\x9fs\x86EwW\
-u}\xbdo\x09\xa4mp\x16\xa0\x13\xd41\x16\xe8-\
-\x85\x1eY\x89\x00 \xd0B\x9f\x14\xdd\xb0J\xfb\xe0A\
-\x15\x92\xd9\x12\x09Y\x85N\x17\x98a,\xe0\xf4\xe5\xe4\
-[\x1b\xdaM\xb2\xa6\xbd\xddgslG\x91\x92\x9d\xad\
-+\x18\x81Q\x8f\x5c\xb0\xcb\xa3]Q+\xd5\x83\x15\xd1\
-\x14\x99B\xee4\x91\xabE[(\xfe\xa0\xa1;\xb2*\
-\x99\x8eHk\xa2)\xf5,\xc4?\xf6\x90\xf6r*U\
-\x85\xe2\xebc\x92\x1ae\xc9\xeds\xf8^\xcc*\x9a\x9a\
-\xa6^\xe3WL\xd3,*\x05\xdaN\xba\x1d\xb9\xa3D\
-\xf5H\xca\x00\xb9u\xba!b\x0a\x17\x04\xf6\x89{\xca\
-f\xfa\x99\x0dLB\xe8\xb7\x14n\x0d\x01\xb0\xb2\x9c\xa0\
-\xc2\x969V\x08\x86i\x927\xa3\x0eY_>\x8a[\
-\x07\xd1\x14\xb2\xfe\x84,\x00fG\xb1O\xf2\xd6w\xef\
-'\x0d\xe3\x91>y\x81\xb9\xa1J\xe6L\x02B\x19\x13\
-\xf9F\xdc\x8e\x8a\x05\x0f\xcd\x13rr\xf8\xc4v\x81\xcd\
-G\xab\xc8<9\xfe\xeea\x96\xfc\x83(\xbc\x8c=\x92\
-\xc2\x88\xea\x13\xd2\x16}/\xa2\x0a\xda\xb2\x01\x09\xc6~\
-\x09\x18!! \x05\xd5\xa0;\x0a[A\xafM}\x8e\
-\xcc\xda\x85\xa1#\xcb\xfc<0w\xfcv\xfeh\xc3\x94\
-\x99\xf2\x8f\xaa\xd6sI\xdd5E\x5c\xb7VI\x19$\
-\xd5\x8e\xe6\x02\xc2\xca\x93\xaf\x0e)\x89\x07\xf5\xf3\xb2\x85\
-\xa0'T\x1e\x07_\xa9\x9cM\x99\xd8\xd1\x9e\x97\x8a\xa3\
-Wb*\xc0\xe0\x8c9t\xea\xbeI\x94\xaa>\x89\xaf\
-\x84\xea\xcc\x86\x0a\x1c0]*\x92\x0e\x1eg\x8b!\x95\
-g)\x99\x81\x91o\xe9u|\xfd\x8e\xc9\x0d2O\x06\
-\xe4\xb2\xea\xfc\x80\xb8B\x8c\xcd>\x22\xaaR\x92\x09>\
-,\xc7\xd7\x17a/\x9by\x10\xdea\xb0\xa1)\xdf\x93\
-\xba\xa4K\x8b\x15\x22`BJ\xa1D\xbf\x8e\xaf\xb7\xec\
-\xbd\x94l\xab\x944\xe4\x061\x13\xa0\xf0\xee\x8a\x22/\
-\x964\xe1\x1f\xe5\xae.\x80\xacC|=hK\xc9\xe9\
-\x15M2\xc3\x1f<\xf5\xe0\xea\x95\xe8\xcbe\x9c\xc5:\
-!*\x1f\xccS\x8c\xaf'\x00eKWd5X\x11\
-\xe9\x1b\x1f\x1a\xc5O\xa3\x915\x5c\xe2\x9b\xf2\x8fz\xc6\
-\x02\xc4T0cg\x9fz\xac\xc8\x18\xa2\x97\xb1\xa3\x91\
-*\xa1H\xa2\xf7\x19\xffh\x82\xaf\xa7\x810\xec\x800\
-]2\xc8\xe51G\xad#5\x0bm\xf2\xa0p0\x22\
-\xc2?\xba\x85\xaf\xe7\x97\xb3\xa3~\xbe\x80\xe8\x12\xd8E\
-\xec\xa8\xc8\x88}\x8a\x9d<\x9f\xd8\xe9vt\x0b_/\
-l\xd3\x15\xc6\xc6\xfdTmRC\xaaS\xa4p\xf2R\
-\xfeQ\xdd\xd1\xd8<\x91v:\xe8k\x0f\x7f\xbfZ'\
-\xaf\xee\xd0\xbf,(?1\xd36\xff\xa82h\xddd\
-\xf8z5M<O\x0e\xd9\xa0{\x89\xa1R\xbd\x07\x13\
-\x1e\xf3\x8f.\x82\x0b\xbd\x8e\xaf\xc7k\xc6y\xe2]\xb2\
-\xdf\xba\xb3<\xf6\xa2\xf7hQ\xca?\x9a\x95\x18s|\
-=\xaf\x13\xac\xc3 \xc1\x810\xf6\xd6\x89\x0f\x822\x1a\
-:\xcf\x95d\xfc\xa3\xd7\xf1\xf5\x09\xdb\xb82\x16\x0cn\
-G\x11\xd2\xbfM mIC9\x19s\xfe\xd1\xd35\
-|=\x0b\x0a\xd2\x11\x0fJ\xd5\x1d\xa5O\xea\xb6\xc4\xf6\
-:\xf4H\x11\xccx\xf8W\xf0\xf5\xe5\x83\xb0c\xcb:\
-\xdc\xc9)\xa1\x88\xb8y8y\xc2F\x173>Q]\
->e\xf8\xfa\xb0\xcf\xf5h\xc2\xa2L\x89&\x11\xd6\xcb\
-\x02_\x1f\xb3b\x13\xdbk\xda1\xc7\xd7kR\x07Z\
-\x85\xf5+\x03\x8dE\xe7\xf5aj\xe4e\x09m?\x8b\
-Dn\x88\xaf\x07n\x8b\x88\xf6?l\x99naAu\
-\xe4\x15\x0a\xa5\x15{\xf6\x14\x9ay\xc9=m\xe1\xeb\x19\
-\x84P\x17G\x0f[&yq\x0d\xf0\x9a%I\x12\xf4\
-\x091\x91\xb6\x1d\xc2\xb9\x8d\xafO\xde\xfa1e(\xaa\
-\x82!j\x08\x05\xef\x08\x9f\x9e\x8e\x7f\xf4\xf6*\xbe>\
-\x19\x10\x0d\xe7\xb4.\x94I=|\x1d\xc1\xfb\x94\xfc\xa3\
-\xd7\xf1\xf5\x889\xd6\x0f\x14\xc9\x86\x1b\x91\xe5gre\
-D\xbeZoP\xfeQ\x84N\xf1\xf5\x07\x18\xb4\x5c\x80\
-g\xd2\x9a\x88\xfeq\xa2\x1a\xe2B\xd1`cy\x9b\xae\
-\xf1\x8f\xe6P6*\xe0F\xa8\x81\xa4\xe8\xfeQ\xe8\x0a\
-\xe4}\x92\xf8\x0ec\xefr\xce\xd7\xf8G)1&\xf8\
-z&3\xf9\xa8\xde\xe6\xdc1MJ\xa7\xd7c\xa2\xc2\
-\xe5\xa7\xb4\xd8\x7f9\xff(\xc1\x1d\x06\x9f\x00\x84\x1dE\
-\xd4Q \xeb^H\xd8\x1c\xc5\x8brB\xfaQ\xd6)\
-\xffh\xee\xe6\xb1\xe0$\xdb\xa3\xf5XSb&-\x85\
-\xeap\xcbQ\xc3z\xe4\xcc8r#\xfe\xd1\x80\x00\xa2\
-\xdaQ\xdbS\x84\x84{\xd2\xb8J\xdc\x08V-\x88\xe6\
-G\x8fB\xd9R\xbe\xa7\x04\x82q\xea\xb6s\xbf\x87\xfb\
-\xe3\xd0\xe7ur\x98P\xfd\x10\x86(S\x89g\xcf\x0a\
-\x1f\xfb\x96Hi\x03_\x7f\x01\xd8\x83\x13A\xcc\xe6\xd8\
-\xa34\xd9\x80\xb4\x81\x09\xf5\xe2\xf2\x1b\x09\x95\x7fT\xf1\
-\xf5j\xf2\xed\xe8\xfb\xb3\xf7\x13\x9a\xb4pGX/\xe6\
-\xc9\xf4(\xa8\xdf\x0cyc&Q\xa8\x89\x99\xe2\xeb\xf7\
-\xba\x9d\x8c\xba\xd3\x01\xd1\xael\x0b\xc0\x1at=\xd1\x9d\
-\xbb\x00\xd2I\x18\xbcL71\xbe\x1e\xa7D\xf6\x15j\
-Oe+\xc0w\xa2=\xcbg\x9c9\xf8\x84\xe1-\xb9\
-\xa3\xf8yb\xf3\xd9R?n;\x87\xaf2~S\xed\
-\xe8\xdc\xcc\x10\xa3k<\x0dEXO\x8d\xaf\x97\xe7\xc9\
-\xc4\xcc \xc1\xe5\xebX\xbe&G\xde\xbf\xb8\xaeq\xcd\
-8s\xec\xdb\x06\x1f,\xf8z\xf2\x92%s#\x8d\x8f\
-\x9d\xa4EF\xb6\xd2u\xb6\xb7\xf9\xfb\xb9O<\xf1A\
-\x9f2\xa7d\xa7\xf8\xfaN\x9bP\xa6\xf0\x8a2\xb1\x85\
-\xc1|\xed\x1duS\x06\xe2a-\xf6\xc1\xc7\x07x%\
-\x9eS\xd4\xf3\xc4\x8e:\xe6\xbc`\x98\xb1\x9aQt\xa9\
-.,h\xc7DH\x10\x9a\xb0\xb7\xe7\xf8zt\x1e\xfb\
-$\x05\x1c\xa4\x15\xdf\xc4\x98\x08i|r\xbc\xd8\x02\x12\
-B\xcae\x91(\xf4\x14Fvr\xf4\x08\x8b\x98\xa2\xf6\
-\xd8Q\x98TXE\xe3}\x0e\x7fP\xeaQ\xfb/\xc3\
-\x8a\xb0\xc0\xd7\xfbX\x04\xd3\xc4\x0f\x02s\xf8u+\xe1\
-y4\xbdr|\x15NFyE\xa91\x0b\x83\xd6M\
-\x8c\xaf\xc7:\x89\xa7\xc7\xd1\x87s\xee\xca\x9ad\x06\x06\
-~\xbe\xcc\xb5U\xe0U\x0e\xb7D\xa3(\xd6\xb3\xadD\
-v\xeb\x8f\xef\x19w\xf3\x99\xb8\xa0\xee\x09u\x1e\xbe\xef\
-s%\x99\x9b\xf3\xe1g\xf8\xfah+\x19\x1a)\xec\xed\
--o\x9e\xce5uC\x0e\xab\xcc\x01\xf1l\x92\xc3\xdf\
-\xc6\xd7{\x07\x1f\x0b\xda\x19'd\x857\xcf\xcf<\xe3\
-\xf0\xcdi\xae`;\xa5\xc3\xc7\xde\xb36\xf0\xf5\xf6\xe5\
-\xec\xddJ\x95\x1ee\x12\x97d\xb6\xdf\x0b?\xb3(\x93\
-}\xc8\xe2g|\xf8\x8a\xafW\x7ftd_Q\xfb\x89\
-i\xeb\x8d_\xca \x0c.)\xf1\xb2\x9a'\x0dB\xf3\
-\xf9\xf5\xdb\xf8\xfa\x91\xbe\xa7\xc2\x8f\xab\xed\xa3\x13u\x11\
-\xb6\xd5]RW\xb3KN^\xfa\xc9n%\xae\x8f\xf1\
-\xf5\xda\xaa\x01\xf1l<MJ\x03&=zd\xf5\xa2\
-n\xd7\xebs|\xfdn\x0f\xe7,\xe3\x8c\xd5\xc9#\xa5\
-\xe3\xcc\x92o\xc8\xf5l\xf8E\x9f\xd4\x8a\xea$F\x9d\
-_\xaf\xf8\xfa\xbd\xb8z\x8e\xcaUu\xaaj}_\x11\
-%\xe9\xe8^{\xc5\x06\x02\x0a\x8ev4\xc7\xd7\xabK\
-Bho\xdf\xeee\xbaD#8\xa6\xed\xc2\x1f\x9d;\
-\x7f4\x8f\xf0\xd4\xc3W4\x1bbn\x9b'\xb8\xf3\xcc\
-\x86\xc2\xe3\xacar\x5c\xbc!Ef\x9f\xedz}\xab\
-\xf5~68\xde(^\xbe\x8c]\x9eh\xce\xe2\x09\x95\
-Ep\xa7\x0b\x9fd\xd9\xe4\xc3o\xb5^\x0d\xa9{\xeb\
-5\xe5\x8c\x87?\xb4\xc9R\x15\x90p\x19K\x9a\xccl\
-\xb8\xed\xf8\xf0\xc3Q\x08\xbb6\x91{\x84~tT\xb5\
-gI&O\x94\xc9a\xeetT\x8b\x1e<Z\x1f\xe3\
-\xeb\xe3r(o\x932h\x91\xbcg/5;N\xbc\
-\xa4E&\x018\x08\x1f~\x8c\xafO\x1a_\x98y\x84\
-\xdf\x5c\xfd\xbc*\xe2\xe4\xa0\x96bH\x17\x18\x0b6\x07\
-\x1a+\x1f~\x8e\xaf\x97\xc4s\x11\x96\x9fx\xfeIU\
-\xfc\xde:\xe1-\xd3\xde\x8e\xf2\x83j\xc8\xb5\x9e\xe5\xf1\
-\xf5(\x13\x05;R\x10\xb5 &d\xe3\xf8\xf8.\xad\
-\xb7\xaco=\xdeS\x94y\x92\xfd\xbc\xd5z\xbd\xe2\xeb\
-\xf5\x8e\xc2:\x1d(\xfe\xd4\x06\xcczG\x8140*\
-\x18\x95\xf7ah\x7f\xf8\xd4\xebc|}\x18*7\xb9\
-\xa7\xa3\x97r\x98\xf0F\xd0\xa6\xa8\xce\x98\x03X\xb3)\
-\xc1\xdb\xf8z[\xea=Q`t\xc3\xb9\xa4ux\x0c\
-\xcc\x13\x08V\x9f|\x22\x89/J/\xf5z\xe2\xfaH\
-\xce\xa6\xa5$\x9ei;U\x8d\xafZ\xb4bC\xe9(\
-\xd1f\xc7\x00\xd3\x12\xbd\xa22\xbf^\xeb\xf5\x87^J\
-\xbe\x91\xb06\xf8\xaa\xe2\x81\xa7\xbc-\xd3\xa1.c\xd8\
-z>\xbf\x9e\xb0\x8e\xc8IV?l\x9d:8O(\
-\xda\xef\x82\x11\x92\xb83\x9d%\x12\x87jm9\x9f_\
-\xcf\xe9\x87\x992$\x0d\x0aw\xae\xedi\xf21\xe8R\
-#'\xd0\xe0\x9a\xd0c?}[\x89\xcc\xaf7\x01\xa3\
-\x1d\x1d\x11\xf0xdG\xb5\x7f\x94\x87\x14\x8b\x8f\xb0\xbe\
-UCy\x1d\xa9\x8cd|\xf8\xfa\xd8\xdbWc\xbc\xe3\
-1\xf6H\x10Q\x03;\x90WF\xfc\x81\x83/\xea\xf4\
-\xb4\xf5z\x8fa\xf5{j\xed:\x91\x8cHj/\xbe\
-?z\x86\xb2\xb1\xa7\xf3\x90\x95\xc1\x89\x9c\xf2z\xbd\x05\
-w\xa2\xf3H{\xf4\xbd:Zg\xb2+\xca\xd1\x0bX\
-\x04\x84\xd8\x80\x94\x00X\xd1'f\x83\x07\xd3%\x08\x98\
-\xa5\x99\xc8>\xcc\xb9\x0b\xdb\xc9\xc6\x15f-4\xf3\x94\
-\xc3\xb2\xc7\xe9\xea\xd1kML\x22P\x7f\x09\xdcc\x0f\
-\xe6\xc6\x8e\xbd\xc8\xaa;\xca\xe3\x04~\x99R\x18\xe9\x87\
-d\xd8\x19\xf5z\xbc<\x1a\xc7\x15\xdb s\xeeH\x90\
-\x18$\xbc'\xab0\xd3\x04\x9dJlE\xf1\xa1\x94\xfe\
-C\xd1\xb6\x80X=N\x88\xa4S>\x97\xedR\x0b\x99\
-x\x9a\xc0X\xf7uP\x11\x96;*\xe5\x1b\x89\x97p\
-K\xe4\xec\xedWkE\x11\xd5\xde\xf9\x89pi\x05\x85\
-\x03\x0ed\x8e\xd0\x1c\xbe\xf5\x18|\x85\xad7{\x8a\xd2\
-gu&\x9d\x1b\xa8o=\xe6t\xc2>aF\xcb\xd7\
-\xfcf\x9dr\xc7\x9e\xea\xfcz\xa4$X\x0a\x10w\xa3\
-&u\x1a\xcc\xdd\xc0\xae\xe2\xe8M\xbd\x943\xe91\x9d\
-l\xa9\xe0\x0b\xc1\xd7\xfb\x85\xb9/)\x09\xd6\x882\xa5\
-\x13\xee|\xbc<\xf1B1\xdb2\xe6\x80x6h*\
-\xda\xe2\xc3\x17\x0aJ\xcd\xe1s\xf4\xbd\x8f7\xc1:\x8c\
-\xb1\x0f\xa1l\xb6\xb9q\x04\xba(\xbe>\x8c\xeb1\xf7\
-\x87\xd0q\x8e\xb5~j\xae\xa8\x09\x8a:\xa1\xf5\xeb\x0f\
-\x88`\xcd\x8d\xcb\x12\x12J!\xa7A\xf3G7\x05A\
-\x94\xde\xc4,\xa22\x5c\xa2\x88\xeaAw\xe4G\xa3m\
-\x155\xca\xd17\x88\x9b]\x00$\xf5\xe5\xfa\xfa\xb1\x93\
-\x9f,\x1c\xd1\xa2\xedB\xe1N\xd3\xa32\xe02\xe7\xc8\
-E\xf1\x99\xcb&\xba\xe4\x8dS+.\xbb9Q\xb05\
-9\xa9\xd7\x03\xb2WeR1\xf1\x9e\xc2\xa2\x18\xcbg\
-\x1d\xe3z=\x83\x10lC\xcdq\x9e\x92'\x94\x08T\
-#&V\xc6\x87o\x1f\xea\xa1~\x80\x1c\xb2*\xe1\xb4\
-\xb2\xa9\x90|B\xe5\xbdS\xa2K\x04%S\xa2\xe6\x89\
-\x8am\x14\x8c`\xf1\x11\x16@\xc3\x1b\x9f}\xf2\xe4\x1b\
-\xf7\xab\x9c\xb0hE=:\x14\xc5\x00^\xc57\x14\xc0\
-\xc0\xa9\x8fB\x9c\xa8r\xfeH(\xe3\xce\xee\xdf+\xeb\
-/\xc5\x1d-\x1fw\xf4\xdf|\xe9\xcd\x97\x8b&\xcd\x92\
-\x1c\x97\xa8\xbe\xc3\xd7K6\x0fq#\x98\x90?\xf8\xde\
-\xd5\x1b\xc6\xdf\xdf\xab\xeb#\xa3yyET\x9b\x81\xf1\
-|a\x04\xfcw\xa1ML0\xd6\xd8\xd2~\xc5|\xf8\
-v\xe4\xf6M\xeb\xf5\x9a\xd1\xfb\xc5\x85\xdd\xf1QQ%\
-\xbf\xa3\xcfT\x92\xe1\x93\xd9NS\xa8nW\xd3\x82\xd8\
-!c\x9c\x0eq-\xbe^\xbf\x8a\xca%\xfd\xda\xf7\xdf\
-\xfat\x1d\xb03\xc8\xcc\xab\x1f\xdd3f\xf76f\x1a\
-\xe2\xa2\xedv\x92L\x93\x0f\xb6\x0eT\xee\xc883<\
-\xd0\xf9\xf8\x87\x8f\xc2\xe3l\x9ad\x9d/\xff\xaa\xdc\x85\
-g\xd7\xfb\xa0oh$\xe8\xf5\xf9\xf5\xfa\xdc\xfb\x1c>\
-'\x8f\xc1\xff\xdb\x85l|\xe8\x02\xbc\x8f\x17R\xa3B\
-?]X2\x87^F\x9f+a]\x9f_\xdf\xc7\xf5\
-Z\x10CLk)\x18+\xa7\xeb\xeb\xc7\xa2K\xbeW\
-\xe3\xfe\x97\xff\xfcp7\xd3\x03\xa1\xfe}\x9e\x1f\xdd\x9e\
-_\xaf:/\xf5z\xddQ#K\x9elO{\xa3?\
-\xcf\x02i\xd1\x0c\xc4\xd6[\x0fl\xfd\xee\xcblK\x87\
-g\xb2#g(\xe3\xc8\xc6\xae\xa8\xb0\xdf\x14\x82\xad\x22\
-\xa4\xd8\xd2\xc5fI-\xf6\x9aF1\x13\x9fVPj\
-\x8c\xfb\xf2)\x7f\xee\xe4\xdd\xfb>2\xa4\xb5\xe4\xbd\x10\
-\xaa\xac\xec\x1fw\x97\xf4\x1f\xe7n\x86\x18\x84D\x8c\xeb\
-\xd0\xb6\x12\xe2z\x96\x8bB)1\xc2FF\x0d\x5c;\
-\x08\x99n\xa9G?}\xa8\xb0\xeb\xedd\xac)rV\
-\x92\x5cb\x11\xc5\xdf\x5c-\xda\xf24a\xa3\x92D.\
-\x1b\xcb*\xde\xd3{eD\xcb\xa9\xa4\xca\xb1\xa4\xf3\xfa\
-\xb7\xca\xc9\x0c\xce\x84\xa4FG!\xa8a\x0a\xbb\x9e\xf4\
-\xfdd\x1d\x1b\x96\xb7i\xfa_\x99b\xf1\xe4}\x0bF\
-\xeaZ,\x14\x99~\xf7\xb32\x5c\xc2\xec=;J\xa0\
-\x1c+\x13[\xeaa\x8c\xccB\xd0\xc8>\xecr\xc6\xd1\
-{\xc6^\xd2?\xedp\x9d\xcb\x9a?\xfc\xe2\x07\xd4\xba\
-_\xda\x17:J\xf6\xd3a\xc3B`\x0bP\xb6\xc8\xe0\
-\x87x&\xd7]\xd2cX\x87\xea6\x7f\xe2S\xc6\xa0\
-\xfb\xa83\xa4\x7f\xac\xcc\xfd\xfb\x9a\xc5\xcd\xd1\x0dQ\x89\
-1\xe9q\xb6\xedT<\x13G\xaf\x1c\x10\x83Ew\xd3\
-\x1b\x95\xa3\xff\xbb\x8f\x07?\x16\xbe\xcc\xef\xf8\xeby\xb4\
-K\xea]\x12\x0fc\xd3;\x1aa\xeb\x09\xeb8zi\
-\xd4\x22r\x12$\xdb\x1f\x0a\xa7\xfc\xe7\xce7\x93w\xf2\
-_.\x9c\xfe\x0f\xe7\xcb\xd2p$b,@\xeb\x91T\
-\x19]\xb3\x0e|\x5c=\xdfNP\xc2\xd1\xc2Q\xfb\xda\
-\xc3]Q%\xdc\x92\xca\xe3\xff\xea\x83\x8b\x90rI\x1b\
-\xcaD\x0dEX2\x9aIk\xa1\xf4\xe1\xfbl3\xe2\
-\x16\x8b\xf4v\x11\xf4\xd0E\xa1su\x03\xce\x87\x99-\
-\x1d\xb6\xc8_4\xb8\xf3;j\xd4/\x1c\xbd\x80\xaf\x8e\
-a\x9f\xc6\xb0\xde\xd3\xf7\xeaso.>\xeb\xbfwc\
-u\xcf\xf64\x95/B:\x9cH\x8c\xb9\xe3\xe8\xf7\x9e\
-\x9d\xe8py\x9a\xc8\x8b\x96\xdf\x9aqF\xd4:\x81\xb1\
->\xf7\xc0\x05\xa6\x9a\xd0\xf9J\x19\xa5\xd0\xdc\xd09v\
-Kx\x9b\xf0\x9e\xa2T\x89\xdbN\x09\xf0\xa9\xd7\xdb\xff\
-\xca\xe8;\xbdy\xa7Lg\xfcQcx{\xf1\x8e\x9d\
-\xbc\xb9\xa2\xb3\xc4K\xe8|^b\x84\x9e\xc8T\x89\x1e\
-g(J\xbc\xc6{\xa7\x84\x01r\xd3?\xabO\xda\xb7\
-=\xbdo\xf3O\xea\xc1\x9b\xa0,_m\xd0\xe0NZ\
-_\xaa\xab'Xp\x8c\xfeQ\xf3\xa3S[i\x9a\xbe\
-^/iu\x9dy\xeb\x9f\xfb\x80\x10\xf4<\xb6G\xef\
-\x02;\xef\xe0\xe7]:\x18'%\xa6RLS\x92\xc7\
-\xb5\xee,\x0b\x9c::\xd7\xe7\xb8\xa2(SgJ\x13\
-V\x8d8\xe1\x0c\xa8mo\xb2\x82\x07\xf6 \xeb\x84\xf0\
-\xa9\xf8\xa4\xff9\xfb\xdcx\x09D_{\xb0\x8e\xe1d\
-C\x111\x88En]c\x01bbI\xc3w\xc9\x1e\
-#\xcb\xe1S_\x1e\xec\xf0\xad$\xfa\xf7b1w\x1d\
-y\xda\xed/\xdf9\xefm\x0c's%p\xee\xedw\
-\xc6?\x9a\x00\xafv\xa0m%\xe5\xcc~v\x8f\x93\xd9\
-\xa7\xe1\xa5\x8b\xa0\x1dd\xe0tS\xe0B\xb6\xe2\x17\x94\
-\xd3\xef\x94\x09\xf1r|=\xe6\x9e\xc9\x81\x81\xcd\xb7\xce\
-\xac\x17\x8aO\xf2\xd6\xe3c\xc7\xe7Ye4\xad\xc7<\
-!c\x18,\xd3D\x88\xa8\xbcL\xda\xe3<\x12\xd7\xdb\
-\xa0}\xafI@\xee\xc6{\xd5yz\xe8O\x9e\xd9\xbb\
-h}\xca\xe6\xab]\xe3\x91\x12\x01\x10\x91\xfbY\xe4\xc5\
-\xbf\xeb\x14\xca\x10\x0d\x95\xe9\xf9\xf1\x091\xdd\x00\x14\xc6\
-\xad\x0b\x9e\x09\xac\x88\x94oB\x1c#\x95[\xcd\xe4\xea\
-\x9c;\x22&\xb3\xa6\xef\xde\xc9\xf9\xf3\x8f\xb5\xa0\x01;\
-\xfa\x22\xe7\xe2\xcdS\xd8\x98)\xa3\x10\x0e]xG\x8f\
-\x8eC\x83\x8f\x1a\x8bP\x11\xdd\xad\x95\x06\xab.?\xff\
-\xabw^\x7ft\x1aFo\x9c\x96\x15ze\x82r\xf2\
-.T\x0e\xe3z8(\x95\x08\xc06\xd3\x07#\x00\xd9\
-4R\xa6\xddq\xa8&\x8b\xe5\xc0\x0d\xee\x8e\xca\x0a\xac\
-\x93\xd9QL)\x09|\x84\xedr\xf7\xc0Y\xec\x8f\x0a\
-\x0a\xee\x86-\xf5\x09\x1d\xf6\x940Tw\xd5\x1b|\x1d\
-\x17J\x0c\x9a\x06\x22\xf6\xc3;\xca\xd1+n}l\xd1\
-\x22\xeb-]\xea\xd9;\xfaQ\xa9\xd6/\xb1y\x02v\
-\xb7\x07\x0d\x8e\xa4\x0e\xd3@\xcb\x9b\x13uj\xfat\x82\
-+\xca\x80\x1e=\xfag\xb5\x01f\x1bik\xf0zS\
-'\x0f_\x1d1S1&\x18\xb6\xa7\xa0{\x14\xad/\
-;Z\xbe\xea8\xa3\xf2\x89S\xa2\xe9\x92\xbd<\xa1\xf8\
-\xf9us\xa5h;\xd5s\xa6 \xde\xc2\xae0\xf9\xb6\
-\xa7\xbc\xf5\xe26+\xab\x06\xe3\x8c}Xo\x1a\x9f\xb4\
-\xbe\xf8=\xa5\x1d\x9b6-\xf4I\x86\x98\xdb\x9e\xb2\xa5\
-Q~T\xe3\xfa(\xf5D5L\xc0\xb6\x88\xaa\x0cZ\
-\x0e\x22\x16\x15\xeb\xd9\xd0\xbc^\xaf\x95p\x85\xadcH\
-=\xf0\xea\xa0\x05F\xc5[N\xbc\xa0@\x9aZz\xaa\
-u4\xd7V\xbd\x9eN\xa2%\x05\x0c($X\x8b7\
-\x98R\x9c\xbcv\x01\xbd\x91FB\xd4\x09|\xbdlk\
-\x95\x8f\x0b\xa0Cz4K\xe2\xc9\x15Px\xb5O\x8d\
-\xe5t\xddy2F\x0a\xdfi\xc8\xea\xf5KR\x0e\xb5\
-\xb7>\xc5\xd7\xb3\xa91\xbe^\x82&\x85\x8a\xe0\x93\x98\
-\xa86M&dU\x91,.;\xaa\x16\x9f\x17Jc\
-z\xad\xd7\xab\xac\xd0\xd5\xe8So\xea\x04.T\x18J\
-6\xfd\xd1|~\xbd\xc2W;\x88uD\xf9\xd3\x1e\xbc\
-\x1c>\xa8\x9b\xd9\x89\xa9Yg\xbd\xa3X(\xc5\xd7+\
-\xa3J\x06\xbbc+Q%~\xd1\xaa\xe1\xe1\xd5\x82g\
-\xca\xb0\x22\x87x\x11\xd9\x13/k+\xb6\x89\xaa-\xce\
-\xd0=\x89)u\x973\xc63Qc\xee\xb2y's\
-\xa0v\xd1\xfcz\xd4\x9e\x0d\x150\xb8\x13\x11([\xf0\
-2\x0d4\x8dg\xe6\x9e\xb7~\xdb)!IJ\x17a\
-Z\xaf\xf7\x0b)\x95\xe7KG\xca\x00i\xda\x86\x0c\x10\
-.\xc7S\xd9\x0e\x1a\x86j\xbd^z\xdb1P\xad\x94\
-\xd0\xcc\xb7\xf73\xae\xd7\x9b\x90Z\x15\xf1\xf5Z\xc13\
-\xe9V\x86P[\xb8\x1f\xc8\x93\xcb\x0d\xcd@\x18\xca\xec\
-\xa9\x99\x12\x13\xf3\xe6:\xbe\x9e\xcef\x14_-i\xf6\
-~\xfa6|\xeb\xc3\x8f\xf0L\xf4@,\x92\xcdS\xcc\
-:\xa0\x16\x89B\x15\xcd\xc2\xffz\xf4Un|\xbc\x22\
-\x9d\xd6\xeb\xf3\xfc\xa8\x92P\x9e\xbc\xac\xf6\x89\xbc\x12W\
-\xaf\xd7Wi\x90\x93w\x03&\x1c\x07a\xf9r\xeci\
-\x10*\x13\xaf\xd0\x22\xf1\x9e\xd0&\x93P\x8f\x7f2\x0f\
-\xdf>\xf6W\xa7\x9de\xe4\xed\xa8R\xde\x9b\x97\x95\x18\
-\x0fW\xfa\xdd\xd4\x1feO\xd9N?R\xc6\xab\x92\xd0\
-\x7f\xc4\xaddn\xb0)\x87\xce\x0c\x94\x80$\x17\xcb\xe4\
-\xed\x13\xb8P;\xf7\xf6\xfc\x17\x99q\x88\x1d\x8d\xb8\x15\
-\xb2\xc6\x02\xe5\x7f\x00\xc6\xe8)H\xf1\x9eBZ\x8d\x96\
-\xcf\x95=EXH\xd1{;\x0aT@o(d\xbe\
-\x1c\xb9\xbcN8%\xa3\x00\xc4\xec/Bv\xfe\xd3\x06\
-':$\x94\xc2\x9d\x16\xad~\x9c1\x22\xea\xd1c\xee\
-\x13\xb2/\xc7\x8d\x8cN\xc5\xbc\xe8\xc3,\x08\xb1\xedY\
-\x8c\x88\xa9\x96t\xe7aB\xa0\x18\xd9J\x99\xc0\xaa<\
-\xe3\xa3\x03[z\x9e\x12b\x11\xecS8\xa9\xe5\xffG\
-\x8a\xa8\x96\xa8Z\x04\xd8\x00\x00\x00\x00IEND\xae\
-B`\x82\
-\x00\x00\x06S\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00@\x00\x00\x00@\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
-\x00\x00\x02\xebPLTE\x00\x00\x00\xff\x00\x00\xff\xff\
-\xff\xff\xff\xff\xbf\x00\x00\xff\xff\xff\x99\x00\x00\xff\xff\xff\
-\x9f\x00\x00\xaa\x00\x00\xb2\x00\x00\xff\xff\xff\xb9\x00\x00\xff\
-\xff\xff\xaa\x00\x00\xff\xff\xff\xb0\x00\x00\xb6\x12\x12\xff\xff\
-\xff\xaa\x00\x00\xae\x00\x00\xff\xff\xff\xff\xff\xff\xaa\x00\x00\
-\xff\xff\xff\xad\x00\x00\xb3\x00\x00\xff\xff\xff\xad\x00\x00\xff\
-\xff\xff\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-\xff\xac\x00\x00\xb0\x00\x00\xc4GG\xff\xff\xff\xff\xff\xff\
-\xad\x00\x00\xaf\x00\x00\xb1\x00\x00\xff\xff\xff\xff\xff\xff\xae\
-\x00\x00\xff\xff\xff\xae\x00\x00\xff\xff\xff\xae\x00\x00\xf2\xd5\
-\xd5\xff\xff\xff\xff\xff\xff\xbf88\xad\x00\x00\xff\xff\xff\
-\xff\xff\xff\xff\xff\xff\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xaf\
-\x00\x00\xb0\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\
-\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xae\x00\x00\xd1pp\xae\
-\x00\x00\xae\x02\x02\xaf\x00\x00\xff\xff\xff\xb0\x00\x00\xff\xff\
-\xff\xda\x8c\x8c\xae\x00\x00\xff\xff\xff\xaf\x00\x00\xff\xff\xff\
-\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xae\x00\x00\xff\
-\xff\xff\xd3uu\xaf\x00\x00\xc9QQ\xae\x00\x00\xf4\xdc\
-\xdc\xff\xff\xff\xaf\x00\x00\xae\x00\x00\xff\xff\xff\xae\x00\x00\
-\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xe6\xb2\xb2\xff\
-\xff\xff\xae\x00\x00\xff\xff\xff\xaf\x00\x00\xaf\x00\x00\xae\x00\
-\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd2qq\
-\xaf\x00\x00\xff\xff\xff\xba''\xae\x00\x00\xaf\x00\x00\xfa\
-\xf4\xf4\xd9\x87\x87\xff\xff\xff\xff\xff\xff\xba$$\xff\xff\
-\xff\xb8\x1f\x1f\xff\xff\xff\xf3\xd9\xd9\xff\xff\xff\xb7\x1a\x1a\
-\xae\x00\x00\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xae\
-\x00\x00\xaf\x00\x00\xcc\x5c\x5c\xff\xff\xff\xb7\x1b\x1b\xb2\x0a\
-\x0a\xaf\x03\x03\xae\x00\x00\xff\xff\xff\xff\xff\xff\xaf\x02\x02\
-\xff\xff\xff\xb0\x02\x02\xff\xff\xff\xff\xff\xff\xcdcc\xaf\
-\x00\x00\xaf\x01\x01\xff\xff\xff\xaf\x00\x00\xb1\x08\x08\xae\x00\
-\x00\xff\xff\xff\xd1mm\xaf\x00\x00\xb4\x10\x10\xe6\xae\xae\
-\xae\x00\x00\xaf\x00\x00\xff\xff\xff\xff\xff\xff\xea\xbd\xbd\xfb\
-\xf4\xf4\xae\x00\x00\xaf\x00\x00\xba\x22\x22\xeb\xc1\xc1\xff\xff\
-\xff\xcbZZ\xda\x8b\x8b\xff\xff\xff\xaf\x00\x00\xff\xff\xff\
-\xba\x22\x22\xaf\x01\x01\xbf22\xc6HH\xe8\xb7\xb7\xf8\
-\xea\xea\xfa\xf0\xf0\xfb\xf2\xf2\xff\xfe\xfe\xb0\x02\x02\xc7L\
-L\xb7\x1a\x1a\xb0\x04\x04\xbb&&\xbb''\xb1\x05\x05\
-\xbf33\xc055\xc2;;\xc2>>\xc4DD\xb1\
-\x06\x06\xb7\x19\x19\xc8OO\xc9RR\xcaWW\xcbX\
-X\xcbYY\xcdaa\xcebb\xcfff\xd0jj\
-\xd3tt\xd4uu\xd6{{\xd7~~\xd7\x81\x81\xdc\
-\x8f\x8f\xe1\x9e\x9e\xe1\x9f\x9f\xe2\xa2\xa2\xe4\xaa\xaa\xe5\xab\
-\xab\xe6\xb0\xb0\xe7\xb1\xb1\xe7\xb4\xb4\xb2\x09\x09\xeb\xbe\xbe\
-\xec\xc4\xc4\xf0\xd0\xd0\xf2\xd4\xd4\xf2\xd5\xd5\xf4\xdb\xdb\xf5\
-\xde\xde\xf5\xe0\xe0\xf7\xe4\xe4\xb2\x0b\x0b\xf9\xec\xec\xb3\x0e\
-\x0e\xb6\x15\x15\xfc\xf7\xf7\xfe\xfb\xfb\xfe\xfc\xfc\xb6\x16\x16\
-\xb6\x17\x17\xdc\x97<\x09\x00\x00\x00\xb6tRNS\x00\
-\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
-\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
-!$%''*+,-./2669;\
-<=@ADEHKLMNOPTTU\
-Z\x5c]]`acegghkllmp\
-qsx|~\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
-\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
-\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
-\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
-\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
-\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
-\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02aIDA\
-Tx^\xdd\xd7Up\x13Q\x14\xc7\xe1\xd3R(\xda\
-B\xf1\xe2^\xdc[(\x10\xdc\xdd\xdd\xdd\x0aE\x8a\xb4\
-\xb8{p)^$P\xa0\xe8\xd9\xa4*\xb8\xbb\xbb\xbb\
-\xeb#\x93=w\xee\xcb\xe6f\x98\x93\x17\xa6\xbf\xd7\xff\
-\xe6\x9b}\xc8\x9c\x99\x85\x14R\xfaR9]\xfa\xf9\x80\
-(\xc4\x95A&60\x10\xa9\x19\xd9x\x80\xc7N\x14\
-\xed\xaa\xca\x02r\xa3\xec`%\x96\xb0\x1ee\x1b3p\
-\x80\xfa6\x09\xd8F\x00\xa7^\x17\xbe\xa0\xe8h\x19\x96\
-P}\xca\xeeh\x02\xae\xb6\x03^\x9e}\x08\xb0\x8e\x02\
-fE\x098a\xe6\x02y\x05\x10\xf9?\x03n.\x01\
-%G/9\xb0*4\x90\x0d4\x8f\xa2}2\x13\xf0\
-\xb3\xa0h*\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80u\
-<\x0b\xe8-\x81sf\x16`\x92\xc0\xdd\xe9\x0a\xc0\xd7\
-)\xe06\x0b)k|7\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
-,\xcb.\xda\xe7+\x1f\xcd>\xa0h3\x09\x87\x147\
-\xc9\xbb\xdf\xbeG\xb1\x9f\xb4q\x85@\xd5B\x02bZ\
-\xa8\xfe\xb19*7\x0a(\x08\xea\xc2P\xb4\xa2\x95\x17\
-p\xaa\x85\xb2m\xc5X\xc2<\x94\xed\xc8\xc7\x01\xca\xa2\
-,\xb9'\x07\xe8\x81\xb2\x9b!\x0c\xc0o\x8f\x04l\xaf\
-\x870\x80`\x14\xe1\x9f'\xc7\xaa0\x80\xf9\x04\x1c\xbf\
-\xf7.q]\x03`\xb4\x89\x80\x17\xab\xbb\x96p\x07F\
-Y\x91\x8a\xab\xe1\xe2U\xd6r9\x9c\xfd\xbb\x88\x9a2\
-\x8fj(\x8a&4c\x01^\x16\xa4N\xfdl\xcc\x02\
-\x02Q\xf4tQj\x16\xd0\x17\xa9\xe8\xc4:\xc0\x02\x96\
-\x22\x15;\xd7\x9d\x05\x14A\xea\xbc\x16\x00,\xa05R\
-o\xa6\x01\x0f\x98Hc\xb2V\x81\x07\xa4\xddN\x17\xfb\
-m\x08\xf0\x00\x7f\xda\xae\x1f.\x0d\xea\xca\x13\xf0*R\
-yjN\x7f\x18\x0eN\xea@\xc0\xd9\x080\xb6@\x9f\
-n\xed-\xac\x04|\xeb\x05o%\xe0\xf6L\xe3\x9a\x9f\
-\xde\xed\xf3 P\x949\x08e\x8f\xfb\x1b\xf7&\xfar\
-'\x22\x8f\x0a\x18\x8c\xb2\xefq\x0d\x8d\xfb\x18\xfb\xf2\xed\
-kwP\x94\xc6\x82\xb2g\xe1\xc6s\xe0\xa1\xdf\xaa\x07\
-[\xb2\xff\xc3\xf7\xc25\xad\xb6q\xaf\xa8\xbfZBG\
-P\xb6\x16E7\x12F\x82\xb1\xb6\xf6\xe9a\xb8\xb7\x1a\
-0%\xe9\xc0\xef\xe7\xdaPGO\xb5D\xc4\x93?\xda\
-\x80\x93\xda\x1f9\x13s\xffe\xfc\x86\x9a\x0e\xd7\x8c\xcb\
-\xf1\xd2\xfb\xc5\x9e\xe0\xacr\xc3fO\xea\x5c\xcdG\xb1\
-f\x9a\xf3kMqp\xa9\x02\xa9 %\xf7\x17\x09\xba\
-99\xea\xb1au\x00\x00\x00\x00IEND\xaeB\
-`\x82\
\x00\x00\x0fk\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -3721,110 +255,2024 @@ j\x904\xa9\x03\xe9\xd5\x97\x1d\xe2\x9c~\xf9Z\x13[\
L\xbe\xe8\xac\xafp.p\x19\x10\xe9O\x1e\xab\x92\xee\
\x84\xd7\xddR\xff\x00\x0e^\x0cN\xab\x94\x1d2\x00\x00\
\x00\x00IEND\xaeB`\x82\
-\x00\x00\x06S\
+\x00\x00N2\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00@\x00\x00\x00@\x08\x03\x00\x00\x00\x9d\xb7\x81\xec\
-\x00\x00\x02\xebPLTE\x00\x00\x00\x00\x00\x00\xff\xff\
-\xff\xff\xff\xff\x7f\x00\x00\xff\xff\xfff\x00\x00\xff\xff\xff\
-\x7f\x00\x00q\x00\x00\x7f\x00\x00\xff\xff\xffs\x00\x00\xff\
-\xff\xff\x7f\x00\x00\xff\xff\xffu\x00\x00\x7f\x12\x12\xff\xff\
-\xffw\x00\x00x\x00\x00\xff\xff\xff\xff\xff\xffy\x00\x00\
-\xff\xff\xff\x7f\x00\x00z\x00\x00\xff\xff\xff\x7f\x00\x00\xff\
-\xff\xff{\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-\xff|\x00\x00|\x00\x00\xa3GG\xff\xff\xff\xff\xff\xff\
-\x7f\x00\x00|\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\x7f\
-\x00\x00\xff\xff\xff}\x00\x00\xff\xff\xff\x7f\x00\x00\xea\xd5\
-\xd5\xff\xff\xff\xff\xff\xff\x9988}\x00\x00\xff\xff\xff\
-\xff\xff\xff\xff\xff\xff}\x00\x00\xff\xff\xff\xff\xff\xff\x7f\
-\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\
-\x00~\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\
-~\x00\x00~\x00\x00\xff\xff\xff\x7f\x00\x00\xb7pp\x7f\
-\x00\x00\x7f\x02\x02~\x00\x00\xff\xff\xff~\x00\x00\xff\xff\
-\xff\xc5\x8c\x8c\x7f\x00\x00\xff\xff\xff\x7f\x00\x00\xff\xff\xff\
-~\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\x7f\x00\x00\xff\
-\xff\xff\xbauu~\x00\x00\xa8QQ~\x00\x00\xed\xdc\
-\xdc\xff\xff\xff\x7f\x00\x00\x7f\x00\x00\xff\xff\xff\x7f\x00\x00\
-\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xd8\xb2\xb2\xff\
-\xff\xff\x7f\x00\x00\xff\xff\xff~\x00\x00\x7f\x00\x00\x7f\x00\
-\x00~\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xb7qq\
-\x7f\x00\x00\xff\xff\xff\x93''\x7f\x00\x00~\x00\x00\xf9\
-\xf4\xf4\xc3\x87\x87\xff\xff\xff\xff\xff\xff\x91$$\xff\xff\
-\xff\x8f\x1f\x1f\xff\xff\xff\xec\xd9\xd9\xff\xff\xff\x8c\x1a\x1a\
-\x7f\x00\x00\x7f\x00\x00~\x00\x00\xff\xff\xff\xff\xff\xff~\
-\x00\x00\x7f\x00\x00\xad\x5c\x5c\xff\xff\xff\x8d\x1b\x1b\x84\x0a\
-\x0a\x81\x03\x03\x7f\x00\x00\xff\xff\xff\xff\xff\xff\x80\x02\x02\
-\xff\xff\xff\x80\x02\x02\xff\xff\xff\xff\xff\xff\xb1cc\x7f\
-\x00\x00\x7f\x01\x01\xff\xff\xff~\x00\x00\x83\x08\x08~\x00\
-\x00\xff\xff\xff\xb6mm~\x00\x00\x87\x10\x10\xd6\xae\xae\
-\x7f\x00\x00\x7f\x00\x00\xff\xff\xff\xff\xff\xff\xde\xbd\xbd\xf9\
-\xf4\xf4~\x00\x00\x7f\x00\x00\x90\x22\x22\xdf\xc1\xc1\xff\xff\
-\xff\xacZZ\xc4\x8b\x8b\xff\xff\xff\x7f\x00\x00\xff\xff\xff\
-\x90\x22\x22\x80\x01\x01\x9822\xa3HH\xdb\xb7\xb7\xf4\
-\xea\xea\xf7\xf0\xf0\xf8\xf2\xf2\xfe\xfe\xfe\x80\x02\x02\xa5L\
-L\x8c\x1a\x1a\x81\x04\x04\x92&&\x93''\x82\x05\x05\
-\x9933\x9a55\x9d;;\x9e>>\xa1DD\x82\
-\x06\x06\x8c\x19\x19\xa7OO\xa8RR\xabWW\xabX\
-X\xacYY\xb0aa\xb0bb\xb2ff\xb4jj\
-\xb9tt\xbauu\xbd{{\xbe~~\xc0\x81\x81\xc7\
-\x8f\x8f\xce\x9e\x9e\xcf\x9f\x9f\xd0\xa2\xa2\xd4\xaa\xaa\xd5\xab\
-\xab\xd7\xb0\xb0\xd8\xb1\xb1\xd9\xb4\xb4\x84\x09\x09\xde\xbe\xbe\
-\xe1\xc4\xc4\xe7\xd0\xd0\xe9\xd4\xd4\xea\xd5\xd5\xed\xdb\xdb\xee\
-\xde\xde\xef\xe0\xe0\xf1\xe4\xe4\x85\x0b\x0b\xf5\xec\xec\x86\x0e\
-\x0e\x8a\x15\x15\xfb\xf7\xf7\xfd\xfb\xfb\xfd\xfc\xfc\x8a\x16\x16\
-\x8b\x17\x17\xd2g\xa5\xb8\x00\x00\x00\xb6tRNS\x00\
-\x01\x01\x03\x04\x04\x05\x08\x08\x09\x0a\x0a\x0b\x0b\x0c\x0d\x0d\
-\x0e\x0f\x0f\x13\x13\x14\x15\x15\x16\x1b\x1b\x1c\x1c\x1d\x1e\x1f\
-!$%''*+,-./2669;\
-<=@ADEHKLMNOPTTU\
-Z\x5c]]`acegghkllmp\
-qsx|~\x80\x81\x83\x84\x8a\x8b\x8c\x8c\x8d\x91\x93\
-\x95\x95\x95\x96\x98\x99\x9c\x9d\x9e\xa4\xa6\xa7\xa7\xa8\xa8\xa9\
-\xaa\xac\xad\xad\xb0\xb3\xb3\xb4\xb7\xbb\xbc\xbd\xbd\xc0\xc1\xc4\
-\xc6\xca\xcb\xcc\xcd\xcd\xd0\xd2\xd4\xd7\xd8\xd9\xdb\xdc\xdc\xdd\
-\xde\xe0\xe1\xe4\xe5\xe6\xe7\xe8\xe9\xe9\xea\xef\xf0\xf0\xf1\xf3\
-\xf3\xf5\xf6\xf6\xf7\xf7\xf7\xf8\xfa\xfa\xfb\xfb\xfb\xfb\xfc\xfc\
-\xfd\xfd\xfe\xfe\xfe\xa0\xb1\xff\x8a\x00\x00\x02aIDA\
-Tx^\xdd\xd7Up\x13Q\x14\xc7\xe1\xd3R(\xda\
-B\xf1\xe2^\xdc[(\x10\xdc\xdd\xdd\xdd\x0aE\x8a\xb4\
-\xb8{p)^$P\xa0\xe8\xd9\xa4*\xb8\xbb\xbb\xbb\
-\xeb#\x93=w\xee\xcb\xe6f\x98\x93\x17\xa6\xbf\xd7\xff\
-\xe6\x9b}\xc8\x9c\x99\x85\x14R\xfaR9]\xfa\xf9\x80\
-(\xc4\x95A&60\x10\xa9\x19\xd9x\x80\xc7N\x14\
-\xed\xaa\xca\x02r\xa3\xec`%\x96\xb0\x1ee\x1b3p\
-\x80\xfa6\x09\xd8F\x00\xa7^\x17\xbe\xa0\xe8h\x19\x96\
-P}\xca\xeeh\x02\xae\xb6\x03^\x9e}\x08\xb0\x8e\x02\
-fE\x098a\xe6\x02y\x05\x10\xf9?\x03n.\x01\
-%G/9\xb0*4\x90\x0d4\x8f\xa2}2\x13\xf0\
-\xb3\xa0h*\x0f\xe8\x84\x22\xbc\x5c\x97\x05\x8c\x95\x80u\
-<\x0b\xe8-\x81sf\x16`\x92\xc0\xdd\xe9\x0a\xc0\xd7\
-)\xe06\x0b)k|7\x05\x90\x8e\x80\xa4\xfd\x8e\xe7\
-,\xcb.\xda\xe7+\x1f\xcd>\xa0h3\x09\x87\x147\
-\xc9\xbb\xdf\xbeG\xb1\x9f\xb4q\x85@\xd5B\x02bZ\
-\xa8\xfe\xb19*7\x0a(\x08\xea\xc2P\xb4\xa2\x95\x17\
-p\xaa\x85\xb2m\xc5X\xc2<\x94\xed\xc8\xc7\x01\xca\xa2\
-,\xb9'\x07\xe8\x81\xb2\x9b!\x0c\xc0o\x8f\x04l\xaf\
-\x870\x80`\x14\xe1\x9f'\xc7\xaa0\x80\xf9\x04\x1c\xbf\
-\xf7.q]\x03`\xb4\x89\x80\x17\xab\xbb\x96p\x07F\
-Y\x91\x8a\xab\xe1\xe2U\xd6r9\x9c\xfd\xbb\x88\x9a2\
-\x8fj(\x8a&4c\x01^\x16\xa4N\xfdl\xcc\x02\
-\x02Q\xf4tQj\x16\xd0\x17\xa9\xe8\xc4:\xc0\x02\x96\
-\x22\x15;\xd7\x9d\x05\x14A\xea\xbc\x16\x00,\xa05R\
-o\xa6\x01\x0f\x98Hc\xb2V\x81\x07\xa4\xddN\x17\xfb\
-m\x08\xf0\x00\x7f\xda\xae\x1f.\x0d\xea\xca\x13\xf0*R\
-yjN\x7f\x18\x0eN\xea@\xc0\xd9\x080\xb6@\x9f\
-n\xed-\xac\x04|\xeb\x05o%\xe0\xf6L\xe3\x9a\x9f\
-\xde\xed\xf3 P\x949\x08e\x8f\xfb\x1b\xf7&\xfar\
-'\x22\x8f\x0a\x18\x8c\xb2\xefq\x0d\x8d\xfb\x18\xfb\xf2\xed\
-kwP\x94\xc6\x82\xb2g\xe1\xc6s\xe0\xa1\xdf\xaa\x07\
-[\xb2\xff\xc3\xf7\xc25\xad\xb6q\xaf\xa8\xbfZBG\
-P\xb6\x16E7\x12F\x82\xb1\xb6\xf6\xe9a\xb8\xb7\x1a\
-0%\xe9\xc0\xef\xe7\xdaPGO\xb5D\xc4\x93?\xda\
-\x80\x93\xda\x1f9\x13s\xffe\xfc\x86\x9a\x0e\xd7\x8c\xcb\
-\xf1\xd2\xfb\xc5\x9e\xe0\xacr\xc3fO\xea\x5c\xcdG\xb1\
-f\x9a\xf3kMqp\xa9\x02\xa9 %\xf7\x17\x09\xba\
-99\xea\xb1au\x00\x00\x00\x00IEND\xaeB\
-`\x82\
+\x00\x00\xa8\x00\x00\x01w\x08\x06\x00\x00\x001T\x00\xfa\
+\x00\x00\x11QzTXtRaw prof\
+ile type exif\x00\x00x\
+\xda\xed\x9a[\x92$9nE\xff\xb9\x0a-\x81\x04\x1f\
+\x00\x97\xc3\xa7\x99v\xa0\xe5\xeb\x80\x11U]\xd5\xd3#\
+\xcd\xd8\xc8\xe6K\x95]\x19Y\x1e\xe1\xeet\xe0\xe2>\
+\x98\x1d\xce\x7f\xfd\xe7\x0d\xff\xc1\x9f\x92\xb5\x85R\xd5Z\
+o-\xf2\xa7\xf4\xd2e\xf0\x83\xc5\xcf\x9f\xfe\xbe\xa7X\
+\xde\xf7\xf7g\xfcx/\xfd~<\xa8~\x7f\x14^3\
+\xaf\xf9\xf3\x86\x8e\xef\xe7\x07\xc7\xeb\x1f'\xfc\xbc\xce\xfc\
+\xfdx\xb0\xef;b\xdf\x0b}\xdf\xf8q\xc1\xecw\x16\
+~\xd8\xbf.\x92\xe3\xf29\x9e\xca\xf7B\xfd|~h\
+\xdd\xf4\xd7\xa5N\xf9\xbc\xae\xef\x07\xdfR\xbe\x7fg}\
+\x97\xfey\x11\xffw\xf8\xf5@Q\xaa\xb4\xfdSY\xe4\
+\xe4\x94\xe3\xfbn\x9f\x15d\xff\x9b\xf2\xe0\xb5\xbc\xef\x9d\
+\xcf\xa5w\xa4\xe6\x1a\xde\xa1\xf4]\x09\x05\xf9\xed\xf1~\
+\xbc\xc6\xf8k\x81~+\xb2~W\x1e\xfe\x5c\xfd\x9f?\
+\xfd\xa9\xf82\xbe\xc7\xf3\x9fj\xd9~\x5c\xa8\xfd\xf5\x1b\
+\xa9\xfeu\xf1_\x89\x7f\xb9q\xfe\xfe\x148\xfc\xdb\x1b\
+G\xe2\xfd\x9b\xc7\xf9\xfe\xbdw\xdb\xbd\xe7\xf3t\xa34\
+*\xda\xbe\x88\x8a\xe1Gu\xfc\x1c>8)y~\xa7\
+5\xbe\x94\xbf\x95\x9f\xf5}u\xbe,\x8e\xb8h\xce\x8e\
++N\xbeV\xeaI\xe8\xca\x0d\xa9\xa4\x9dF\xba\xe9\xbc\
+\xd7\x95\x16K,r\x84*\x8a\xc8\xa2Q~\xcc\xb2J\
+\x97\xe5\x8d\xa1g|\xa5+\x9a{\xde\xd9\xe8\xe5\x92\x13\
+r\xe6\xb0\xfc\x5cKz\xf7\xed\xef~+\x19w\xde\x89\
+\x8fJ\xe2b\x89S\xfe\xeeW\xf8\x9f\xde\xfcg\xbe\xc2\
+\xbd\xcbK\x94\xa2}\xea\xc4\x13\xb1.qt\xb0\x0c\xef\
+\x9c\x7f\xe7S4$\xddo\xdf\xea+\xf0\x8f\xafo\xfb\
+\xe3/\xf8\xf1\x8b\x14>\xe6e6\x1ep\xc4\xf9\xb9\xc4\
+\xac\xe9\x0fl\xe5\xd7\xe7\xcc\xe7*\xaf\x9f\xa9HA\xf7\
+\xf7\x02\x94\x88{W\x16\x03\xecK\x8a-\xe5\x9aZb\
+\x89\xa2)QG\xa3A\x83\x95K.2\xe9@\xaaU\
+6\x8b\x94\x92s\x93\xa0b\xe2\xf7\xe6\x1cM\xef\xb3R\
+\xa5\x89\x1f\x86\x9bhD\xcd-+\xbd\xe9y\xd0\xacR\
+*\xf8\xd1b`h0b\xa5\xd6\xda\xaaV\x0b\xb5\xd7\
+\xd1r+\xad\xb6\xd6\xb49\xc9\x0d\xcdZ\xb4jSU\
+\xd3\xae\xc3\xb2\x15\xab\xd6L\xcd\xac\xdb\xe8\xd23\x1cX\
+{\xeb\xda\xad\xf7>\x86\x84\xc1\x8d\x06\xd7\x1a|~p\
+d\xca\xcc\xb3\xcc:\xdb\xd4i\xb3\xcf\xb1\x80\xcf*\xab\
+\xae\xb6t\xd9\xeakl\xd9yC\x13\xbbm\xdd\xb6\xfb\
+\x1e'\x85\x03S\x9cr\xeaiG\x8f\x9d~\xc6\x05k\
+7\xdfr\xebmW\xaf\xdd~\xc7\xcf\xae\xa5\xef\xd8\xfe\
+\xf9\xeb\x9f\xe8Z\xfavM^\xa7\xfcs\xfa\xb3k\x1c\
+u\xce\xfe^\x229\x9dT\xef\x19\x1d\x93\x92\xe8\xb8z\
+\x07\x00\xb4x\xcf\xa2\xa5R\xc4;\xe7=\x8b]\x18\x8a\
+*,\xb2zo\xc2N\xde1ZXN\x92z\xd3\xcf\
+\xde\xfd\xd1\xb9\x7f\xa8o\xa1\xda?\xd47\xf9\xdf:\x17\
+\xbcu\xff\x17\x9d\x0b\xb4\xeeo\xfb\xf6\x17]\xdb\xaes\
+\xebu\xec3\x85^\xd3\x98\x99>\xde?6\x82\xd8p\
+Q\x1b\xff\xea\xeb\xff_\xe8\xdfp!\xf0\x96\xe6\x9a\x12\
+di\x1a9\xcf\x09\xc2\xf9\x93\xa5 \x0d\xae\x8f[\x9a\
+\xcd\x13m\x03\xa8\x96\x8e\x96\xb1\xba\xe3\xb5\xcb,U8\
+5-\x80h\x0d\x15:\xa0>\xd4\x95\xdb\x8eL\xc0j\
+\x17S\xd4\x0a(]'GpXf\xbb\xe0D\xaa\xde\
+e\x9d\x81\x19{\xdf[\x99\xb4\xb5S\xe5\xec\x96\x11\xcb\
+2\xd3.\xd2\xc2\xe4\x96\xa3\xda\xe1\x96g*4\xec\xe0\
+-M\x987\xeb\x0d\xc1b\xe5e\xf4[\xd7\x919v\
+\xb9\x91K\xe8(k\xc6\xea\xb7\xd9=\x9d:\xad\x07\xe6\
+k\xcfS.4\x9c\x0dE\xdbs\x96\x83][1\xd9\
+-\xeb\xa6>\xd6\xa9\xcc\x17\xb3\xb8\xc6\x9d\xa3\xea\xe9\xbb\
+\xde\xcd\x83\xde3\xechg4\xe2\x08\x99en-\xd3\
+\xaf\xbe\xe2\xadM\xad\x9f\xd5\xf2]\xa2W\x86\xcc\xd3\xed\
+\xceT\xad\xec;\xa9\xd7\xa6\xc8Eo\xefM\xf6\xd0\x03\
++]\xe68Y8y\xd4\xc4\xbag\xf2G\x19\xf7,\
+\xc8\xe4{\xe1\x0e\x17-8i^\xa6\x90\xb3Q\x0c{\
+\xc7\xfb\xcd\x08H\xe1\xc4\xbd \xfe\xca\x8f\xc1\xdd\x9a\xff\
+\xe0\xf41a!\x98`\xee\xb5`?\xa8x9{\x8d\
+\x99\xad\xad\x96\x8a\x8c\xeb\x1c6\xe0\xcfrG\x8f\x19\xa6\
+(\x1b\xe28\xab\xec\x80;Qz\xb0!\x9e6W\xd2\
+w)\xdb\x1bw7\x16:\x83\xda\xc5\x04\x10\x14s\x91\
+\xee>\xa3W\xa90\xc3\xc9\xadC}y\xcf\xdd\xe68\
+7\xc4s-\xb5uW\xdeG\xfa,}\xdcv:\xdc\
+R\xf0>7Q%\x006\xa7\xe9\x1a\xa5/\x15\xd81\
+\x9d\xbd\xee\x01\x1eg\x0a\xb7\x94\xdd\xca\x1cA\xfb+s\
+>\xd6\xb2\xb0D\xe1\x94r\xcby\xad\xd5MS\xda\x9a\
+\xa3\xed\xb3\xde\xba4\xd7\xb1@R\x5c\x9b\x0e\xec\x0e\xe3\
+\xf7\xa3vw\xe0\xd3\xad\x9f\xa47\x16\xda:\xfa\xb1\xdb\
+*\xeb\xe7\xae\xcb\xd9\x11\x1e\x16\xe9\x17\x0d\x88\x07\x9c\xa3\
++:\xa9\x5c?\x14\xdc\xf1\x9f\xd5\x16-\xc9\xc1\xef\xdc\
+0F,U\xd5\xe5\xa2\xd88=q\xbf\x05\xa6:m\
+A\x9dJ\x04n\xfcH\xaf0\xec \xae\xaeU\xe9\xfa\
+\x95=\xa9\x09s\x94\xc3,{\xb2\xfc#\x0b\x10\xcc(\
+[\x12\xd0\xd3\xcd\x19\xc7>5\xe1\x99Q9\xb7\xfa\x09\
+\xfce\xe0\xc8\x10ia\x22,o\xbdyo\x04 \xb0\
+6\x98\xdeK\xc4\x8c\x0c\xeaW\x12*\xb0\xce\xe9\xba&\
+5\x82\xac!q\x5cG\xc9\xa8\x01\x83e\x8a\x19\x89F\
+_\x8e\xf1\xd0\xa5\xd2\x84SV\x18L\xc1(\xca\x1c1\
+<\xc8[wY\x03A\xf1\xce\xce\x8a\xf4\xb41\xd5\xc6\
+\x5c%7F\xcc\xb5\x86\xaa#5\xab\xa0C2&*\
+\xb4b\x9f\xc1\x11\xc2\x1cS@\xf7\xb1\x87v\x80\xe2\xb9\
+9s\xfb\xc9\x98\xd2\xb6)\x10\x92\xb9\x87\xf4\xb6\xa9s\
+G\x14\x17>u\xc1\x14\x08\xcdf\xb2\x9f\xf6\xd3!\xe2\
+\x8c\xadK\x09\xef\xae\x05l\x0c\x8ay\xef\xa8s#E\
+4\x90\x156\x8dK\xb8\xdda\x00\x1a\x024\xf9\x8e\x88\
+m\xcd\x13\xf4\xce\x13\x04\x1dK\xeax\x87\x04\xb8\xc1n\
+W\xa8\x04!\xb0\xd3\xb6\x0b\x8a(TM\xab\xed\x95d\
+\x1b\xc7c\xd6\xc4\xb2\xc7nq\xe9\xc9e\xeb\xc8\xd3c\
+\x16\x9d\xbc\x98=N\xcc\x07a\xe4\xa27\xf7\xc8\x98\x93\
+\x7f\x5c2)-\x9c\xc6\xd8\xc4\xa1\x18\x862\xa7\x1e\xbc\
+\xc1]\x80\x84\xb3G\x02.\x00\xf2503\xedx\x08\
+\xc0~\x91\xe9\xc4}\xb6\x01\x06Kw!\xa2\x8b\xea\xcc\
+\xc1UA\x92]fZ\xee\xa9P\x84D\xd4\x9e\x85\x8e\
+\xba\xb9\xd0\x021\x13s\xc0b\xb5\xe3V \xf0m4\
+\x11\xe8vd{1\x91\x9c\x99O\xa2\x04[\xa7r\xbb\
+\xea\xf4\x06\xdf\xe1\x0b\xd2c\xc9j\xab\x06\xa3M\xfbd\
+\xa3\x0a\xca\x80\xec\xea\xd4;y\x8a\x9bx\x06Lxf\
+b\x0e\x0a\x91\xeb\x86i8\xef\xdc\x8aVTK\x07j\
+\x84\xdd6%\xb2\x19\xb4\x12F\x9d\xcb\x12m\xe9p`\
+\xcbv6\x0c\x91\x98\xa8\xa8\x06S\xd7\xbbx\x92\xe8+\
+*e\xc7\x03\x00!\xc7N\xb5\xfat\xae\x84\xb5\xa0\xda\
+5b\xcb\x9c\xdb\xed0\x95\x09 \x19\x0c\x9e\x19\xb0\xce\
+B\xbb{\x1b\x88q\xe5\xa1\xd3\xfb\xcc\xaa\x81\xfa5b\
+\x10,?+\x5c\x82\xbf\x82\xdd\x03\xc1\x054H<\x0a\
+\xd9rq@\xd8\xc1\xa2\x15\x1c^\xd6q\xbb\x22@\xba\
+v\xa6\xd8L\xc5\xf3u\xc0\x86g\xd8\x00\xf7\xe2\xbdP\
+\x02(!,>\x01sn\xec\xe3\xa1\xb0\xd0\x9d\x8c\xd1\
+\x98W\xe8\x83\xf53HbL=\x0b]dM\xf1\x17\
+\xedNm{s\xa5\xea\x93\xb7\xf38-\x5c\xf1\xb4<\
+\xf1t\xdc\x89\xac5\xf9<Q\x1dd\xc1*c\x22\x9e\
+\x95h\xd1\x91P\xfe\xa6\xc3\xe4\xc0\xaf\xe9\xda\xc9\xab\xdf\
+\xd8\xe4\xe0$7C\x17\x98A\xd3t[\xefD z\
+&\xfbB\xd4h\xb0c\x19@N\x14\x9c6/{k\
+X0\xe5j\x0e\x09$G)\xce)s\x0d\xcad\xe1\
+\x1eiN\xbd\xc2(*\xa5\x84SF\xa3\xae\xd48\xef\
+\x0b\xd4\x18\x14\x04\xbbR\xbf\xc3\xd8\x15\x80\xab\xe3U\x07\
+,(\xb8\x18\x88\x18n8d\x94\x86:\xd1$&{\
+C\xa6\xa8\xb7Oe\xc4\x14\x9b\x94s\xd0\x80\x12\x11\xa1\
+\x88B\x00\xbeY\xb0\xc6\xe3d`C|\xc5\xad\x8e5\
+\x04\x1a\x0a\xe8:\xaa\x81\xd0\xac\x8b~\x09D\x043f\
+\x8c\xb1\xd3):5a\x83\x22\x94\xf3`Li\x1c$\
+w\xf6D\xe0\xe0+8\xc1*\xd0Y\xf3\x0e\x1e\xad\xd3\
+J\xe20/X\x16\x9a\x84\x0f\x00r\x17?\x8e\x92\x82\
+\x95\xa7\x9f?t\xf4\x97\xd7tp\xf0C\x11\x08&8\
+\x06\xa4\xae2^\xc7&\x96\x19\xc42\xa4\xa5M\xfa_\
+\xda-\x111\xe3\xa9=5&\x88\x81\xd1\x18\xc3i\xe7\
+\xa6\xe2\xff@\x1a\xa0k\xa6\x1c\xba\x0d\xeb\x14V1\x9b\
+\xc2&\xce\xef\xd0H-\xa0\xbcq4\xd2,\xdc\x08^\
+\x03\x0a \xcf\x8fN\x22\xc8\x95\x9e\xe9\x05\xe8\x10)\xcb\
+`\xb8\x04\xc1\x0f</c\xb7\x11\x16\x92\x10.eV\
+\xbf\xe7*\x0a\xcf]\xe6\x02VJV\x11\xc6Y\xdag\
+S\xa10\x0c\x10Sq\xff7\xfd~\x0cs*\xc1\x1f\
+\x98@;\x9e-\xfc\xbcV\x97.\xf7\xf7\xc57\x97\xbc\
+*\x94\xab\x18d\x05\xc2\xe7\xa9\xbeQ\x10;'1Z\
+\xa3\x90\x94\x0eZN\xf0\xcb\x97\x9el]\x0cS\xe4\xe2\
+\xcd@\xd8D~\x95{l\xe1\x1d\x9b\x1c'64@\
+\xbe\xac0\xfe\xc9\x8d\x04,_\x17\x08O\xbb\xfaf]\
+\xeb\xf9\xc07\x82\x1a\x00~\xa8\x87:X\x83\xf8\x98D\
+,\x14\x14R\xb2nl\xd2\xc4\xeb48\x1dw\x84k\
+\xc3\x9c17c\x10\xe9\xb0n-\xed\xa0<\xe6m\x18\
+\x18\xcc-nM\xb40\xe9\xb3\xc2R\xac&\x22\xeb\x08\
+u\x19\x92\xa9/\xee\x96\x227\xdf\xed\xc0a2I\x96\
+\xa43LX\x8aV\xb1~\xe4\xb8\xcb\x021\xa7Rq\
+\xcc0\xb8$7K$\xb5a\x18aX6\xc3\xb58\
+\xc8\xc3\xd0\xc3\xf1\x91\xe4\x88c\x04\xae\x88\xf1|\xbe\xc5\
+\xea3\x11\xa8\x01\xee\xe6\xc8\xa8\x02\xc1;\xa0\xf65\xda\
+\x89S9\x90\x1b\xe2\xe6\x05\xe4\xea\xc7mS>\xd9;\
+#\xdeZ\x0c\xe9\x008<\x10rD2LL\x15\xb7\
+?|\x00S\x82\x01\x8dx\xd53Z7\xa6/\x9f\x96\
+\x917\xf8\xb7\xfbF\x0f'\xc0\xca\xf9x''\xb45\
+\x01)y\x0e\xa5%\xde\xea3[\x16G\x86\xfd\xf1\xf5\
+\x1a'\xe3\xf4\x8c'\xf3\xc2\xbf\xca\xb3\x99\xe3\xe3;\x7f\
+\x8c\x09$\x99\x18Y\xfc:\xa95\xe0\x9b\xb8Ii\x10\
+I\xa3\xa7\xac\x1a\xde\xd8\x06\xfe\x14\x89@\xd9\x9ca2\
+S\xa7\xa8\xc2\xc0bv\x11\xab\x88\x1e%\x1d\x14\x1c\xa7\
+\xc3\xa1\xdd\x02\xfc\x91\xb0\x89q\xba\xb9\xf2]\x12pA\
+\x1c!\x0b{'\xd1BC>\xe9\xfd\xc4#\xd0\x5c\x1a\
+\xcb\xcfL7\x90N\x94>\xa7\x06\xc6\x18\x9a\xc0\xe9\xd8\
+\x22,\x94\xab\x7f\x11\xd6\x9aK\x85\xc5\x09\xd3<\x0c\xf3\
+83\xe9\x1a#\x06\xa2q\x8c\x07\xd8\x93\xc6\xb3k)\
+\x94\xee\x98\x8695\x97\x90=\x14@\xcdc\xe2@\x9d\
+\x16/0\xf4\x9d\x81\xd3vn0\xc0\xed\xcfj\xc1\x11\
+\x83l\x83\x1e\xbb\xff\xe5\xfa\x187\x7f\xb0\x86X\x1aB\
+\x19\x88,(!H\xcb\x85\xb4\x0dK\x10\xb1\xdd\xb5\x12\
+Q\x86\xeb\x9d\xb9\x8bF\xd5\xb6q\x83Y.]8p\
+ \x84\x8d\x8f\xf6\x90\xe4\x9e\x93\xae\x87\x887\xc2\xcb\xa0\
+\x09\x89\x0aS\x16\x03\xc5n\x12\xc0,B\xdd\x98\x87\x8a\
+\xfa\xd30p\xab\x0c\xd8\xc4V\x220\x06\xa0\xd2l\x15\
+s\xfa \x19df\xb9-\xb1\x10F\xc9\xad\x96\xe7\x11\
+F\xb5\xa2\xee\x90\x08\x03\xcdx\xba\xba\xf7\xe8\xd7\xa8Q\
+\xda\x06\xeep\x0a\xd1\x8b\x80\x82K\xeb\x10O\x0d\x84,\
+[\xbe\xa1@\x91r\xbd\x90\x1e+\x9e\xeb\x90\x07O\x19\
+7mH\xe2\x0eO\x0a\xc8\xe8\x5c0\xb0\xab(\x85\xba\
+\x0en7]\xee\xf6\xc6\x0a\xbeK\x090\x22\xe7\x9b9\
+6\x15\x1f\x0em\xe2W\xf1\x93\xf8x\xce\xc0\x98Sf\
+\xaco\xde\x8c)\xa2\x0f\x1e\x1a\xff\x19\xe3\xe2\x0f\xec\xb9\
+\xe4\xcd\x1aZg\xb0\x0a\xfe\xda]\x1aw\xc0\x83W\xdf\
+\xa1\xab\xdc\x02\xa3Z;\xad\xa1\x9b\x10\x0b\xd9\xef\x12A\
+\x01\xa8\xcb\xdb\xad\xce\xbaV\xe9m(\xd8\x1e\x1f\x17J\
+\xa3\x17s\xb6\xcc\xc3)\xa8\xe1\xd9\x8b/um\xac\x0a\
+\x1f\xae\xe2\xec\xb9\x05\x9c\xf6?\x04\x05\xdbKP\xd4\xde\
+\x83\x90\xf7\xca\x83@\xac\xb5&\x97i\x08\x17\xef?\x22\
+g\x13\x10:\xd4\x07\xab\xb4\xb8]\xdd)\xbb\xb3-i\
+\xa9\xb6x0\x86\xdd\xb7%\x89\xaf\xc1\xadK\xc4\x97\xab\
+\x073\x88\x0f8\x13\x80`z\x04\xce%\x1b\x11\xba4\
+\xf1\xe2P0\x12\xf8\x03L?\xd0\x12`\x12A\xd4\x01\
+\x80\x84x\xe9\x01^<>\x82\x11\xa4\xf0p\x9eQ\x05\
+\x97\x17\xd1P\xf8h\x1cw\x14tw^O\xb3\xdb\xf0\
+\xe0\x0c/\xd9\x87\xb4_W\xf7Q!\xdc\xdb\xfb-D\
+\xce\x17g\x02\xa4\x17\x0e\x93\x01\x1d\x10?\x19a\xa5\xcb\
+\xba\x06\xc9\x13n\xf4\xdd\x03\x0c\x1d\xa0\x03\xbc\x82{B\
+\xb9#\x02\xbf\xed]\x0a\xf0a\xb4\xc0\x1e\xc4W\x01>\
+\xe4\xcc\xe4-\xdf8\xf0d\xbc\x96\x5c\x0f\xa4(%\x83\
+o\xdeO\xb7:\x14\x80\x91K\xcc\x8cbh\xd4\xb9\x1a\
+\xe1\x08pb\xb3C\x82\xef\x98X*M@\xc0\x93\x1e\
+:\x04\x1d\xfb\xac\x92\x04/S\x82\x9d\xc1\x87N\x84m\
+e,\xf4\xe1\x19\x15m\xc6\xb8\x0c\xbc\x13\x02\xc9DA\
+$\x0c0#>\x22\xd0J\xe8\x1c\xc5\xf1\x1e\xf0\xd0\xa0\
+\x80\xc1l\xc9\xc3\x10\x96\x80\xb5\xe7N0\x15\xefb\x1c\
+\xc5\x98\x1al%\x03\x83?\x8a\x09\x97m\xbe{\xe6\xbf\
+\x9dY\xea\xbb&\x9eEaR|&\x06\x0dZ\xc6\xe1\
+VB`\xbf\x1d\xf4\xb3\x9c<\xdc\xfc0\xcf\xea\xae\x83\
+\x92()\xbb\x81'\xbc\x00\xf4\x03\xc1\xbb\xfd\xa1\xc5\x93\
+\x82\x0a\x90c\x1e\xb5\xfa&\x0b\xd8\x9d\xe6\xe9\xfb.\x86\
+\xf4\xf8\x86FN\xbe\x89\x81F\xe1\x83\x1e\xf9\xf3/\xc6\
+\xce7\xef\x06\xfcI\x0f\x90<*\x0dy\xc1\xb4n~\
+\x96\x1b'\x1eM0\x94\xf4O\xa6>\xe70>\x86\xa1\
+[t\x1f\x15@\xa3\xd5\xb7\x85\xc8@L\xe7\xf2\xd3\x04\
+\xda\xea\xf4H\xa3\xf8\x029;cj\x88\xdf\xd9\xd9\xc7\
+=\x82=\xa8uE\x8b}\x97\x82t\x12\xf0J\x9b\x84\
+\xdd\xccK\x87\x01a|I\xae\xc0_\xf1\xa2\xbe\xaf\x04\
+=\xb6\xc8\xf5\xe8\xbd\x8d\xce\xc3N\xb8\xc6\x99\x97\xe7\x85\
+C\x91M\xfcK\xea\x01\xb3u=\xf3\xf9,\x83G\x9a\
+\x9e6T\x87(\xe3Pq\x95\x98\xb6\x96l\xa1\xd7\xbe\
+\x95\xc9\x10\x13\xe8\xf1\xbb\xea\xbbX\x03\xab@D\x1f\x9e\
+U\x83!\x10\xe4\x97\xd4\xe1\x0d\xee\x97<\x1a-\x83~\
+H\xc7i\x5c\xd4\xd4{\xe6;\xae\x1b-q%C|\
+J\xf5\xbd\x0f\x14\x0b\x0f\x96\x0c\x9d\xd9\x12\x86E\xc3,\
+\xc1\x1bJ\xe8\xf6`\x03\x9f%\xe4}\xc3\xd8\xe8\x04\x10\
+rS\x85fn\xf0D\xdev\xf1opED8q\
+\x17\xea~\x9e:\x07\xff\xed\x08\xf2<\x9c\xde\xb5x\x00\
+\x22\xc4`$\xa6`\xbb\xf18\x8b\xd0\x8b\xbb\xc8X\x05\
+\xa7r\xfc\xaa\xef\x13\xec\xeeq\x07a\xc3Kb\x08\xa0\
+\x8c\x00z@\xbf\x7f\x06\xf8\x1f\x12\x15\x01\x08\xc2\xa5P\
+\xcc\x99L\x84A\xa9\xb4\x9bt\xd0\xe8\xc2\xda\xd1\x00\x7f\
+g@M\x1e\xfb\xb92\xad\x04\xd9T\x04\x81>\xe3Y\
+\xda\xf5\x0c\xbfO\xcfo{\x8e\xc8\x14\xc3}71l\
+0k|\xba\xc3\x97\xbe\xcd\xe0W-\x85\xb4\x19\xb2\xf5\
+Ig\xeb\x0b\xa3(\x16>\x09\x01\xc5#\x22t\x18\x1c\
+H!\xfb\x96\xd5\x1a8_\x92m\xdcesf\xa5\xf2\
+\x00\xbacrM\xf1\x925\x06<\x96t\x18\x04\xdfQ\
+D\x0fr\x84L\x12e2\xab\xc2\x1c\xb2\x1c\xbc\xac\xef\
+\xbcgy;\x998\xbfl\xbe5\x88]\xa0\x1d\x9e\xa1\
+\x11\xdb\xd3\x03\xf1\xb1\x91\xd1\xb2o\xafU\xe6\xd8\xf7H\
+<\x10\xaf\xd1s*B\xd2S\xdf\x9e\x07\x81\xad\xb8\x01\
+\xa4~<\xc0\xc2\x0bO'\x8b\xec\x0c\x08\x9bC\xfe\x1d\
+b\x12w\xc1t\xe4%,\xdd\x8c\xae\xd32\xa4=\x00\
+(\xcd\xbb\xa0\xcac\xf9\xa1O\xe4\xe7\x1e\xf7\x0b\x80\x17\
+\xba07W\xd0\x10r\xc4\xe7\xb3\x83\x13\x0cN \x89\
+\xb8\xe1[`\xcc\xe9\xbf\xb6\x88\x10`\x1be\x1f0\x0c\
+\xcd\xe3\xdak\xf3\x9d\x84QGR\x8ef\xab\x840\xef\
+\x9a\xf96\x87oo\x22_(7L\xbcXBg\xa0\
+\x12\xeb\x06\xd8{\xc4y\x1a\x09\x93\x15\x1f\x07xn\x00\
+Y!)\xd5I\xa6\xc9\x8c\x00\xc9=\xb8|\x15\xa9\xea\
+\x96\x8d\x1c\x0c\xbc\xf1\xf3o\xf2\xa3\xfb\xbc\x86PC\x01\
+\xc5Y\xa9\xfb\xaf\xf3\x80*W\x82m\xf7\xc4=.<\
+E5\x88\x84(J\xab\xe0\x87\x8c\xf9g\xb6\xd0b\x5c\
+\x16\x93\xe5\x9b\xa3\xf8k\xcf\xc8H 8\xcc\xfd6\xf7\
+\xba>\xf3\xca L\xff]\xc7\x8d\xe4\x82\xc1dm\x0d\
+|Px\xcf\xae\x0b(>\x93\x1b,\xad\xbe\x1b\xc57\
+\xd6\x95\xb7\xff\xeeSy`\x02\x12\x13\xe9y\xb1\xdd\xfe\
+\xb6`-\x13\xaa\x0a\x98\x97yC.\x1e+\x15\x92\xf5\
+\xce\x91:\x9c$\xfc\x17\xa2\xcc\xaak!@B\x87\x8b\
+`\x1f \x1c\xcf\xb6\xe3\x82\xc7\x9c\xd1=_ZI\xa8\
+I\x1a\xe45\xa8{\x12\x15\xee\xa2\xdd\xb6q\xe5\x94\xae\
+8\x85`;\xcd3T\x02\xb7\x80\xca\xbd.\x1f\x22\x94\
+\xe1\x08\x9e\x94\xce\x93x\x82\xbd\xa5\xa4\xa6\xfe;H\xde\
++\x9a\x9cX\xf1\x5cH\xfcZ}\xc1`\x10\x19a\xfc\
+\x93\xac\x99qQ\xb0O\x08\x85\x84\x1a\xa3KP\xa2 \
+\xf8\xdf\x8ek\x95Z\x03)\x9d\x07\xbf\x87\x1c\xefA\xce\
+\x13!p\x00 \xd1\xf7md\xfb\x96\xe3\xdb\xcd\xf6\x9d\
+Z\x8cpS\xdcm9/\xba\x0b\xd8\xb8\x00%\x22*\
+a\xa2\xadDx\xb2\xde\x18\xf5*\x01M\xdc: (\
+\x09\xd3\x07>o\xf2_\x93o\x12L\xc3\xba\x81\xac\xe2\
+\xbc7}\xc0\x93\xff\x9f\x19\xdc\xe1H\xdd\x01C\x09\x80\
+\xd6>\xd8\x1c$\x07\x1e\x81\x96\xa1\xf7T\x91Y\x01\x13\
+\xdbi>3$\xdd-\x8e\x0d,O\xbd\x03r\xfc\xe4\
+\x13(\xe3\x99\xae\xe0\xb5x\x87\xfe\xc5\xd7\x7f\xeb\x85\x08\
+a\xbb\x87\xff\x06\x83t\x00\x9f;Q\x8dx\x00\x00\x01\
+\x85iCCPICC profile\
+\x00\x00x\x9c}\x91=H\xc3@\x18\x86\xdf\xa6\x95\xaa\
+T\x1c\xec \x22\x98\xa1:Y\x10\x95\xe2\xa8U(B\
+\x85P+\xb4\xea`r\xe9\x1f4iHR\x5c\x1c\x05\
+\xd7\x82\x83?\x8bU\x07\x17g]\x1d\x5c\x05A\xf0\x07\
+\xc4\xcd\xcdI\xd1EJ\xfc\xae)\xb4\x88\xf1\x8e\xe3\x1e\
+\xde\xfb\xde\x97\xbb\xef\x00\xa1^f\x9a\x15\x98\x004\xdd\
+6S\x89\xb8\x98\xc9\xae\x8a\xc1W\x04\xd0C3\x86\x11\
+\x99Y\xc6\x9c$%\xe19\xbe\xee\xe1\xe3\xfb]\x94g\
+y\xd7\xfd9\xfa\xd4\x9c\xc5\x00\x9fH<\xcb\x0c\xd3&\
+\xde \x8em\xda\x06\xe7}\xe20+\xca*\xf19\xf1\
+\xb8I\x17$~\xe4\xba\xe2\xf2\x1b\xe7B\x93\x05\x9e\x19\
+6\xd3\xa9y\xe20\xb1X\xe8`\xa5\x83Y\xd1\xd4\x88\
+\xa7\x89#\xaa\xa6S\xbe\x90qY\xe5\xbc\xc5Y+W\
+Y\xeb\x9e\xfc\x85\xa1\x9c\xbe\xb2\xccuZ\xc3H`\x11\
+K\x90 BA\x15%\x94a#J\xbbN\x8a\x85\x14\
+\x9d\xc7=\xfcCM\xbfD.\x85\x5c%0r,\xa0\
+\x02\x0dr\xd3\x0f\xfe\x07\xbf{k\xe5\xa7&\xdd\xa4P\
+\x1c\xe8zq\x9c\x8fQ \xb8\x0b4j\x8e\xf3}\xec\
+8\x8d\x13\xc0\xff\x0c\x5c\xe9m\x7f\xa5\x0e\xcc|\x92^\
+kk\x91#\xa0\x7f\x1b\xb8\xb8nk\xca\x1ep\xb9\x03\
+\x0c>\x19\xb2)7%?-!\x9f\x07\xde\xcf\xe8\x9b\
+\xb2\xc0\xc0-\xd0\xbb\xe6\xf6\xadu\x8e\xd3\x07 M\xbd\
+J\xde\x00\x07\x87\xc0X\x81\xb2\xd7=\xde\xdd\xdd\xd9\xb7\
+\x7fkZ\xfd\xfb\x01w\xcbr\xa9\xa7\xd2\xe8\xda\x00\x00\
+\x00\x09pHYs\x00\x00\x0d\x89\x00\x00\x0d\x89\x01P\
+\x94\x82%\x00\x00\x00\x07tIME\x07\xe5\x04\x09\x09\
+7\x03\x04\x0a\x03\xda\x00\x00\x00\x06bKGD\x00\xff\
+\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00:\xd1IDAT\
+\x18\x19\xed\xc1\x05T\xd5\xe9\x1a/\xe0\xdf\xf7\xdf{\x93\
+J\x1b\xd8b`c\x07\xb6\xa2\xa2\xd8b\xa0\xd8\x01J\
+(b\x80\x82nR\x04\x94\x92.\x09A@@B1\
+@\xc4\x02lT\xecnl)\xc5\x98\xef\xeeY\x8bs\
+\x17\xcb;\xe1\x9c3\xce\xcc]\xf3>\x0f\x08!\x84\x10\
+B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\
+\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08\
+!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\
+\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\
+\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10\
+B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\
+\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08\
+!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\
+\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\
+\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10\
+B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\
+\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08\
+!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\
+\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\
+\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10\
+B\x08!\x84\x10B\xc8\xff\x87V\x05A\x0f\x84\xfc\x93\
+\xd4\xe7\x9cA\xa6\xe6\x0et\xec\x22{\xed\x06!?\xdc\
+\xb5\x8fM\xf0\x1b\x98\x94iA*X .&\x0d\xd9\
+\x05\xa3+\xdf\xcd\xa8\xbf3\x09\x1b\xe6\x84\xcc\xbc\x05B\
+~\x84\x0f\x17\x04\xb9\xc7\xc7E\xd3a\xd3\xf38\xaeV\
+\xafe\xd7>*\xe0\x1b\x9a.\x98&\x92b\x8f\xa2T\
+\xf4\x13\xdc\xba<D\xa4\x9d3\xcb8\xd2\xbe\xecB\xdb\
+&'\xb3\xbbDc\xfb\xf2k \xe4G\xf9p\x01\xcb\
+\xec<T\x8e 5'\x08\xd7>v\x87\xcc\xa7[\x82\
+\xdc\xeet\x0c\x99\xe7\x8f#m\xb7\x0d+\xb0\x08\x84W\
+`\x5c\x9b\xf3r\xeeSKQt\xd5BR\xfcD\xc4\
+9\x84c\x19\xc8\x99\xe2U\xef#\x08\xf9Q>\x5c\xc0\
+\x80\x03I\x8a\xb1\xf0\xb4\xcb\xc1\xb5\x8f3!s\xf7,\
+\xab\x9f\x99\xd6(\xb0]\xd0\xf22\x9c(\x19^p}\
+\x9d\xea\xdb\x9b0]\xe4\xda!O\xbc?\xcf\x19\xcf\x7f\
+j\xca\xb9 \xceI\xc7F\xf7\xb8\x99o@\xc8\x7f%\
+#\xb5+\x9e\xf2\x06\xf8\x15\x82\xb4\xb1\xc6\x98@\x83\xc5\
+\xcei\xf0\x15[k]\xc2\x99'\x9b\xd9\xb5\x8f\x1a\xfc\
+=\xd4\xc2b\x91=%1\xee\x0a\xf6\x97L\x0b\xbcV\
+\xa4Up\x10\xf37\x84\x1b\x15!!f-{\xc5\x15\
+8W`\x17\x0fA\xf7lV\xa3<\x10\xf2\xbd\xf8G\
+\x918)\x13\xa3V\x05\x0d\xba\x89Pi\x01\x9e|\xd5\
+\xc77\x8e\xe7@\xd7\xd8\x17~\xdaN\xa2\xb7z>\xfa\
+\xfbM\xc3\x1a\xe6\x0c\xdf\xda\xe1\x1d\x12\x12v\xe3\xdaG\
+}^\x85\x86\xa9\x99X\xb55v\xc6\x03\x16\xe6x\xb4\
+k\xc4:i?\x8f\xa69\xf0\x9b\x9e\x8c\x82\x1b=\x95\
+/>d\xa8Uq\x1d\xfd@\xc8oaWkTP\
+\x8b\x7f\x14$O\x1e\xa2\x8fk\xb0\xf0\xae\xb9\xf7\xdc\xe3\
+\xb8p\xbb\xb3\xe2\x93/\x0c\xb58\x17D\xc9I\xb0\x9a\
+\xb4\xc3\xe8\xb4|\xcc:o\x93\x84\xc1\xfd220\xe5\
+\xe4^\x85H8-=\x8ak\x1f\x17r\xae\xc4\x1e\xdd\
+\x81\xea\x95<D\x0e\x92\xea\x167\xdc:4@\xdeY\
+q\x98\xa2k+\xc6v\x86\xc8\x0b\xe9\xf9\x12\x96\x10\xa9\
+\x82\xa2\xb2F\xfc\x85 \x01!\xdf\xaa:./<\xcb\
+U\x18\x85\x8d=2q\xb9|=\xbb\xffY\x09\xb5x\
+\x0d\xd4\x22\xe3\xa1\xd3\xc3wE\x17\xa4\xee4B5o\
+\x82Z\x8fOA7=\xa5C\x8e\xf2\x8e\x0dWp\xf1\
+\x5c{\xd4\xfap\x01\x8e\x13\xec\xd4\xce\xe0h\xa9;\xae\
+}l\xc6\xab\x05\xb9\xbd{\xe0\xb2,5\xb9\x00\xfb\xcf\
+\xceG\xcc2m87l\x0c\x17\xdd%p\xd3KS\
+\x0eZQ\x82\xc3W\x1c\x04\xceE \xe4\x97\xbc9\x0a\
+\x07\x07\xff\xa1\xf7\x90\x9d\xe2\x8b\xf7\xbc%d\xfa93\
+\x0dH\xb1\x5c\x22EA\x8f-\x03>!\xc8\xe1\x0a\xaa\
+y/\xd4\xe2\x1f\xa0\xed\x15\x8e\xfb\xbdv\xa7_C\xee\
+\x9dn\xa8\xf5\xe1\x02&\x85\x85\xd4\xcf@x\xc8n\x5c\
+\xfbh\xc0\xab\x99\xf2\xde}0u\x8c\x1c_&\x09\xdb\
+|J\xd1\xa3}2\x93\xe2\xbd\x8a\x13\x0e:D\x8a\xb7\
+\xac\x0e\x92\x7f\xd8eO\xf6i\xe4_\xef\x04\xf2\xef\xd6\
+i\xf7\xde>\xc89\xd7N\x91s\x86:n\x1e\xc4\xc4\
+\xc4D\x83\xeb\x88\xd8rtM\xf9\x0b\xdd\xab\xe70e\
+\xb4\x0b\xbe@\x8a=\x82\x13LOdb\xdf8\xbfe\
+oQ|j!\xab\xe6\xaa\x90\xe1\x15\xe8\xe4\x1b\x8b\xb4\
+\xa1\x91\x11\xa5\xc8{\xbeD\x8ds\x06\x99\xaa3hS\
+\x90\xae\x94\x08\xe7i\xd7q\xed\xa3\x05d\xf8\x07\xa8^\
+<\x80\xc8)>c\xcf+{O\x96\x8a\x9d\xd0\xf2\xf1\
+\x15&\x97u\x00\xe3\xcd\xb7c\x9f$2\xdc\x1f\xc5e\
+: \xffN\xfc5\x1aE$\xc1{L\xe8\xe6\xe7\xd8\
+\x9b\xef\xcd8\x17\xa3\x8es'\xa1v8\x0dw\xbb\xc6\
+\xee\xa8\xc2\xb1S\x9d\xab\x9f\x0do\xbb.\x10M{\xb8\
+B\xc5$\x08\x0a7\x0e`e\xc0\xcei\xb7\x10\x1f\x10\
+\x83j\xde\x162\xbc\x02\x8dN\x9f\xc6\xba\xb9>S\xde\
+\x22\xbd\xe0(n]\xd1@\xb4\x81\xa6O\x8a`<\xc1\
+_|\xb9\x85C\xebk\xaa\xfb\x0b\xb7\xe1\xdaG\x9d\x8f\
+W\xd1\x22&\xaa\xbe\x17B}\xfdq\xfa\xc6\xf0\x81\xaf\
+>\xc9/\x0fP\xea>gG{\xdf\xbe!sSp\
+\xf8\xccH\x05\xce\x19\xc8\xbf\x03\x8b\xde\xa6\xcc\xaa\xb9*\
+j\xf1wL\xe5\xca%\xccX\x1f\xd8\xf3\x03\x12\x93\xcb\
+p\xf7N\xe3\xd77\xe7j\x9az`U\x83\xd4c\xbb\
+\x06\xe6\x9f\x1d\x94\xb0\x1b1+vo{\x89\x8c\xa3\xe6\
+\xfb\xde\x1e\x13%\xefQ`\x90\xe1\x5c\x95\xdd<\x8cn\
+\xc7\xf7\xf6,\x82\xdf\x9a\x07\xa8\xe6\xfdQ\x8bW\xa2c\
+D,\xf2g\xefX\xf8\x08\xe1\xf6\x87\xd5v\xcc\xd8\xd6\
+\xdbg\xd0\x01I\xb4aHs/\xcci\xee\xeb\xd9\x03\
+2\x1f.\xa0\xf5\xe5\x1c\xb5\xe06.\xa3\xce\xe9\xc4l\
+\x8e\x95w\xd5\xc9\x85T\xb8\x057mW\xf8\x8e\xe9\x0c\
+\xf2\xefP]\xc4\x94o\xe7v\xb3\xc4V\x8b\x8b\xa8\xe6\
+}\x95\xaa9C-^\x89\x861\x09\xc2\xa1\xc51\x0e\
+\x95\xc8\xd8\xbd\xf6\xf6-\xa7\xd9a\xd18\xa9\x12`\xff\
+Z5)&B\xba\xaf\xf9\xb2\xf5Q\xe6/p\xf0f\
+\xa8\x02\xe7\x0cup\xce\x84\x1b\x07\x10\xb54pQ\x19\
+\xf2\xf6\xdb\xa0\x9a7\x80\x0c\xff \x88.\x1f\x86AB\
+\xa2\xa2\xb3C\xa8f~[wQ:\xdc:\x9a\x8a\x82\
+\x8c\x15\xf0\x8d\x8f%\xe8\x9d\x90\x0c\x87\xe9>pk\xe2\
+\x02C\x90\x7f\xa7\xaa\x13\x90\xda\x04/\xbc\x89C\x99\xab\
+P\xcd\xb5\xf0\xb3\x805S\xba\xef\x89\x5c\x98\x99\xa3\xbf\
+hg\xc2\xb8\xfb\x08u:\x11x\xe7\xc4\xbc\x03\xc9\xec\
+\xbc\xe0\xd1\xb9T\xd8\xb2\xe0>\xbb6w\xe6\xd2mj\
+\x8f:\x1c\xbc\x93\x84\xe2\xea\x16\xa8\x83s\x09\xbbq\x10\
+\xf3v\xc6O\xb8\x8a(\xcf\x0cT\xf3\x8e\xa8\xc5\xcb\xe5\
+\x84\x877X\xfd\xb8D\xd6\x00\xbf\x81\xbf\x17\x8932\
+Eb\x90\x7f\x81mC\xdb\x22-\xcd\x00\x05g\xb5\xd9\
+\xf92\x05\xd4\xf1\xf6(\xa6\xa4\xed\x9et\x06\x81kN\
+\xc0\x7fv<\xa4x\x89-\x06y\x92]\xd1s\xae\x17\
+w\xab\x7f\xff02\xfb\xbb\x8c+C\xc9\xb1U\xdb\xe2\
+\x86\x9e\x1b\xbd\xb3kF\x03i\xab\x03\xfdw\x8d\xdf\xdd\
+\xd3\x7f\xc8\xd1\xa6\x91q\xf1\xb8\xf9y\x08\xbeq+\x0f\
+-\xceg\xb79\x8em\xd6\xef\xf1\xaaB_\x5c\xcdE\
+ \xe4?\x22v3Ec\x1f\xccn\xe4\x229\xd8l\
+k\xf7\xfb\xc3\x83\x17\x1cA\xb8_\x22\xf2\xaf/\xc6G\
+^\x0f2\x91qh;~\x0b\xb6\xce\xd8*W\x01\x97\
+\xae_\x11n\x11\x0d\x7fc=H!'$\xef\x14A\
+\xa6\xba\x18\xf3}\x03[\xe6H\x22\xa7\xc7\xeaG\x8eJ\
+\xd1\x0b\xd0\xdf=?\xc7\xc8\xdb1\xba\xcb}I\x88\xc1\
+E\xc1nf6^\xf3\xd1\xf8\x06\xe7\x82p\xe3\x00\xe6\
+\xac\x0b\x9dg\x00B\xea\xe2\xaf\x99\xe2\xde}\xc2\xf4y\
+\x81\xbdN6\x0d\x9d\x17\xba,\x1a\xb3<\xe2$\xbe\xee\
+a=\x9f\x22\xc4\xfd\x0d\xeeU\x18\xc6\xbf:[?=\
+\x05\x07\xa7z\x22 y\x17\x92\xd7\x84\xcd}\x82\xf4h\
+W\xbc\xabj\x8a:jnA\xa7\xf0\x08\xa4C\xa4\xea\
+\x97\x11\xda5\x11\xde\xab/\xb7{\x9b\xd96\x7fo\xbd\
+\xb3\xa3\xfd\xda>\x83\xc7\xdc\x97(\xc8\x9b\xcb\xaa\xb92\
+\x08\xf9=\xbc\x5c\x85]9\x83&\x89\x09\x8a\x97\x15\x82\
+7\xde\xc2\x9e\xc0\x81\xbd\x93\x96\x0a\xbc\x02\xf5J\x0f\xc0\
+\xc3q{\x9b\xf3\xf5R\xb2\xe3t\xcfW\x0e\xda\xbf_\
+\x10\x05\xa6A\xeeR\x0e&\xeeI\x1a}\x19\xa1.\xc7\
+Q\xcd\xbb\xe0\x1b\xbc\x02\x037\x06\xe0\xf2\x88\xad\xec\x02\
+\x22\x03\xee\x22\xeb\xc8\xc4\xb2\x82\x16K\x03\xa3Xq;\
+\xdfe\x9f\x90\x18\xed\xc8\xaa\xb8\x02\x08\xf9\x1e\x1fK1\
+\xc8a;\x0a\x14\x92\xf6&\xe2\xfa\x9b\x8e\xa8U]\x82\
+\xde\xfb\xf7\x0a\xa1\x1d\xb6\xd9\x97\xe0D\xa5=j\xdd9\
+\x05\xe5\xd2\x1c\xe4\xf7\xf7\xb3*\xc7\x95+SY5W\
+F-\x85\xdd\x91By\xd5\xbc\x06\xf1Ipw\x0c\x12\
+*\x10(\xbd\x8f\xfc\xa7\xab?\xdf@\xd3\x8bG1\xb9\
+\xef\x16\xfd~ \xe4\x8f\xb8w\x14c\xe2v\x8d\xb8\x84\
+\xc8\xad\x87Q\xcd[\xa0\xd6\xe7\x07\x82\xfc\xa7\xc7Xf\
+\xe0\x88G\xf5\xf3\x1e\xeeDq\xb56d8\x17\xb1\xab\
+9p\xdc\x1a9\xf3\x1e\x92\xc3CP\xc9\xdb\x1b\xa7\xcc\
+\xae\xbf0L\xbf\x0d|V\xf7ZT\xf5^\xeb\xd8a\
+t\xceJ\x12\xdd\x84s\xf7\x9d8\xfeN\x0f\x84\xfc_\
+\x19\xd9\x1dp\xacT\xa3\xfeO\x9c\xe1;\x9c-@\xa3\
+\xcc\x94\x06\xcfZ\xc6\x86|@\xd1\xe9\xf6\x92\xcf\x5c@\
+\xad\x9a\x1b0\xda\x1a\xa8yP9.>\x19\xf7>\xf7\
+\x86\x0c\xe7\xaa\xecQ.\xfa\x1fO\xefv\xb0\xa9\xa7\xc9\
+\x1d\xa4\xc7\xedT\xf770\xed\xec\xd9$\x8e\x05:\x1c\
+\xc1\x8d\xeb\x9dc?\x97\x88\x8f\xa4\x0b\x0a \xe4g}\
+=\xd0\xaf\x9eK}_x\xf6\xbf\xdck\xa7K2\xd2\
+\x0e-f\xaf\xb9\x22\xbe\x03\xe7L.9\x09I+\x12\
+\x5c\xaa\xb1g\xf7ZV\xcd\x95Q\xeb\xf5\x09\xf4\xccM\
+\xe9\x9a\x8f \xd7b\xbc\xfc\xda\x12u|\xbc\x0a\x93\xad\
+!H\x99\xe6\xdf\xefZc\x17\x9cf.\x0d\xd6\xc2g\
+qs\x10\xf2\x1f\x8fN0\xf5]IXa\xe0\xdb\xed\
+R\xab\xed\x03\xa3\x96F\xaa\xad\x5c\x1b=<\x0a\xbb\xd2\
+f\xc8\xbf\xe6\x02\xbe\x03\xe7\x82(+\x1d3B\x12\xa7\
+\xbdB\xe4\xb6b\x94\xf3\xee\x90\xe1\xe5Z\x8c\xbf\x87\xb6\
+g\xb8\xd2\x03\xbd\xa4\xc4<\x14\xdel\x89:8\x17\xc4\
+\xf9\xfb\xd0\xc5=\x02\x1dA\xc8\xb7>]SbON\
+\xa3\xd7\x12\x1f\xe5\x12\xc5H\xbb\xd3Hq\xef\xbd\x22\xb9\
+\x7f}\xce\x05\xc1\xb7\xf0\x8e\x80?\x80s\x88\xaf\xe5 \
+{\x82\xd7\x84\xb2\x869\xc7\x22\x91\x7f\xbd\xabv\x98\x91\
+\xee\xaa(8\x0c\xf3\xd1\x7f\x8e\xc4\xd8\x0d\xec\xca\x07u\
+\x10\xf2G\x94\x1c\x81\xd5\x8a0\xd3\xc7\xc8HY\xcf\xde\
+\xf2\xfa\xf8/q\xae\xc2*\xaebxx,\x22V\x86\
+-\xbe\x00\xef\xa9\xa7:\x04\x8fM\xd6\xf5\xeas\xbc\xf1\
+N\xe7T\xf9\xe2\xc7\xbdbJ\xe7\x8bQ\xca% \xe4\
+{p\xce\xe4\xd2\xf7b\xb5Y\xd8\xca\x878|\xcf\xa5\
+\x1e\xe7\x0c2\x82\xbb\xae\x1c\x82-\xc7\xe0\xc2{=\xe1\
+\xf2\x1by\x85j.\xe0\x1b={\xafS\x83EJ{\
+\xf6\x9e+\xa0\xd6\xe7'\x82\xdc\x85\xa3\xd09\x94!Z\
+\x11\x14\xa3\xeci\x11\x86\xe3\x93=$\xe5\xad\xc2\xec\xef\
+7\x88\xf5\xb1\xd7p\xef\xe5/\xa4\x1d\x8b\xc7\x89\xf2N\
+ \xffN\xc2\x91\xe7r\xf8\x1d\xec\xec\xbbz\x90\xe1\xaf\
+\x98\xe2\x9b\x1bX\xd2o\xad\xe8\xaep\xe6\x95\xcb\x94\xf8\
+\x95\xc3:\xb9#P\xceU\xeb\xcd\xe8\x1d\xe3\xce\x0d\xdb\
+\xe9^\x80\xf4\xa45x\xcf\x1b\xa1\xd6\xe7$\xa6p\xd4\
+\x11\xc3\x87\xb56L\xc0H\xd7$\x9c\xf8j\x88op\
+.\x88\x0fd2M\xfe\x18\xba\x09I\xb0s\x8e\xee\x9e\
+m\xe0\x89\x92.\xaeM\xfd\x10\xbau\x00\xbb\xc7% \
+\xff\x1e\xbcR\x22\xf2\x89\x85\xc1\xd8\x9d\x91Q\xc8}\xb6\
+T\x81s\x86o\xd4w\x12\xb5\x81[\xf3u\xd8\xb1 \
+\xbea\xe6aK\x14_\xea\xce^q\xa5\x8f\x171\xd7\
+u{\xeb<\x84M\x0d\x1d\x193$\xaa\x7f\x88\x89\xbb\
+g\xba\xe1\xa0\xc4=\xb0\x8e\xda5\xfc\x14\xbcW\x1e\xc3\
+\x1bn\x88Z\x9c\xab\xb2\x9bv\xf0\x1a\xd7\x1a\xd5\xf2\x0d\
+\xa7~\xc0\x8ec\x96\xec.W\xc1\xafxy\x86\xa9\x1c\
+;\x80\x96EE\x90\xdb\x95\xac\xa3\xc1|m\x15@\xfe\
+]x%\xb4N\x16\xc1\xca\xc4g\xd6K\xe4>\x8ba\
+\x9c3\xd4:u\x00\x1d\x16\x06\xc2\xbf\x8d\xbb\xe6\xa3\x01\
+\xde\xad\x12\xd6EvL\x9a\x172\xe3v\xe7\xb8\xa8\x04\
+\x9c\xa9\x1eW]\x8c\xbeGS\x1b\xa6\xa8;uz\x82\
+\xc8u9H\x8f\xeff^\x12,\xaa,\x94\x13\xde\x9f\
+D\x80\xa1\xcb\xe8{8wy\x1e+\xe7J\x90\xe1\x5c\
+\x8e\xdd\xdb\x849\xbeS\x91\xd7\xb6\xf5\xac4,\x08\x19\
+\xacp\x97\x0b \xe4\xb7\xf0J\x0c^\xed\x87\xab}\xd2\
+N\x1cG\xde\xb3~\x90\xe1\x5c\x10\x92\x13\xe5\xcc'\x04\
+L\xdc\x87=>\x96+\xb3\xcc[\x1e=\x8e\xaeG\x8f\
+b\xf5\x00\x8fY\xf7q\xf4Mh\xf59\x91\xe4\xc3e\
+l\x18f\x8bS\xea'o\xbb\xe0\xcc\xcb\x16\x90I\xc8\
+QQLK\x82\xe7\xf4H\x87;\xc8<\xb8T\xe0\x5c\
+\x8cZ\xaf\xb63\xd5b;\xa6\x05B~\xc6NW\xa8\
+\xe3w$\x1d\xefj\xb82\xaaM\xa6a\xe4\xf6\x9b\xc8\
+}\xb6f#\x7f\xc6n\x1fC\x9b\x94\xa4^\x07\x10\x93\
+x\x10\xc73\x15 ec E\x88\xaa3^\x09\x9b\
+Y\x1aK;=Q8\xc5%\x9f\x1f\xa1\x8f\x7f\x14B\
+\x17&\x04\x9fEb\x9a\x14Y\xf1C7'7\x1d\xb4\
+$\xac\xefn\xbd(\xe7x<\xe5\x8dA\xc8\xb7r\xf7\
+b\xd4t\xcf\xd6\xc9\xc88\x1e\x81\xe2\x8aN\xf8F|\
+\x0a\xd30\xdc\x06\x0be\x97\x06\xc5-|z\x9e5\x89\
+\xeat\xa8\x8d\x8b~\x05r\x9fe\xe0\xc4\x0b%^\xa5\
+\xa8k\x17\x80\xab]\x02\xed\x1f\xc3\xa5\xddmHq\x08\
+R\xd82)\xba\xc0U\xa9\x01\x8b\x0eQ\xd4,\xe4\x8c\
+\xd70\x85\xb3\x05\xe8S\x98\xad\xb5k\x8ew\xef\xc3\xbd\
+\x03\xa7\x1d\x15oB\x05\xb6\xb4\x09E\x84K\x7f\x10\xf2\
+-\xce\x05Q^&,\xb7\x865|\x80`\x8fS(\
+,\xd7G\x1d\x8f\x0b\x05\xb9\xb3\x87E\xcbF\x05\x8e\xbb\
+\xa1\x16b\xea\xbe(\xa1\xb7\xc1\xce\xfd\xd8\xb0\xca\x1f\xe7\
+\x07'\x1d(F\xde\xb3\xd1\x9f\x1e4\xea\x1b\xbe\x0b\x19\
+\x9d<g<DR\xa2;\xb6\x1bi3)\xab/\x92\
+\x8a\xc4\xee\xf1\xed\xb5\xb1u\xd9$|\xe0\xcd\x14\xaa\xb9\
+\x00\x99\x97W\xa1z4\x1bF\xe6\x81\x98\xd4\xc6\x85\xa9\
+\x80\x90\x9f\xb1\x83\xc7\xeaK8\x17P\x07\xe7r\xc2\xc9\
+\x5c\xb4LOV6\x86\x97y}\x5c\xf9\xd0N(\xad\
+\x91\xa0V\xcd-tq\x0c\x95\x14v\x0b_S\x84C\
+\x99# \xc3+\xd121\x13\x9eS\x837\xddG\xee\
+3\x97\xea{\xbd\x1b\xdd,\xc6\x06c\x8f>\xaf\x90\x92\
+}\x0e\xc7s:!c\x87\xce\xcc=\x13Zl\x88i\
+\xb2\xb6G\xf0\xea \xe4\xec\x1f(\xbc\xe3r \xa4.\
+\x15\x17\xf96\xd8\xd2\xc1\x16AK#\x90\x9cl\x8dG\
+_:\xe0[R\xf4Wu\x82/s\xee\xf2\x0ci\xfb\
+\xe3QZ\xd3\x032\x9ck\xb2K\xb90\x88\x8e\x1ft\
+\x1bQ\xdb\x8f\xe0\x05o\x0c\x19^)\xc8\xbf{\x8e\x89\
+\x0b<P\xd9\xf4\xc0\x9d\x03\xc8\x7f\xae\xfdS\x95j\xc7\
+\x98]H2\x0b\x98v\xadI\xc0\xe2s:\xc1\xa6\xf1\
+\xea\xee-OaK\x87\xeb\x08\x5cf\x81=I\x0dA\
+\xc8\xcf\xee\x9cRfG\xf7\xa3\xcbD_Dj\xba*\
+\xbdl\xe9\xa1\x966?\x5c']W\xda\xeb\x00\x8e\x9e\
+\x19\x22z\xf0E\xc2?\x8aD\xc1\xf1\x98d\xea\x8d\x0b\
+\x90\xe2\xe6\x22_\xc4m\x8fT\xc9\x86\xe7\x86\x03(\xad\
+\x99\x0d\x19^\xa3\xcc\xae\x97\xa0yx\xacBE\x9b\xa4\
+\xa4\xd7\xc8+h\xad\xc49\x83\x0c\x7f\x8f>\xae\xe18\
+\xd4;.\xf9\x02\xf2\x9e\xcd\xb8\xfa9\x5c\xb8Y\x80\xae\
+Y\xa9\x98\x13\x95\x08\x9f\xc1\xde\xf0Ws\x11&\x81\x90\
+oq.\xb0]\x89\xd80*d\xf6\x05\xec\x5c\xb5v\
+h\xa4\xbe\xde\x8ah\xb4\x17\xa4\x82H,\x15\x0b\x90\xe1\
+\x1fY\xbd}\xb9\xd0\xdf\x18\x88\xf1\x90BcO*\x1a\
+\xbe<\x0b7]k\xa5\x0b(~\xe6\xc4Jk4!\
+\xc3\xab\xa0\x11\x1e\x8f\xd4\xa5\xf1n\xef\xb0g\xf7&T\
+\xf1\x86f)\x13U\x83\xd20s\x9e\x1f\xae\x0f\x0a\xb0\
+|\x8a\xdcg\x01\xcd\xf9O\x0c2?\xfd$\x16\x8e\xef\
+\x17\xe4A\xc8\xaf\xa9\xb9\x89.\x91q:\xe9\xba!k\
+\x0a\xf1\xbcR\x1f\xbf\x82s1\x0b\x8e\x13$\xa8\xf5\xe1\
+\x12fm\xf5\x95\xcfF\x5cr4Jk\x06A\x86\x7f\
+`\xf29\x99\x98\xba3q\xe8\xfdF\xbe\xcboc\xb7\
+_D\xbb\xf0i\xb3&\x06\xf7\x8d\xee\x99l\xbb\xc3%\
+\xa2\xe5\xd1\xa1\xfbKL\x85#\xcf\xe5@\xc8\xf7x\x9a\
+\x8fVW\xb2\x9b\x1d\x84\xb3Q\x19\x8a\xee{\x22f\xe3\
+\x00\xecM\x1f\x88\xe2\x0b\x1a\xd8\x9b\xde\x16\xf9\x974\xf1\
+\x0b>\x5cB\x97SY\xe2\x10H\xcd\x8e\xa0\xb4f)\
+jq.'T]\x84\xe5\xa6@dN\x0d\x1cZ\xd2\
+\xc2\x19w\x98G/\x0f\xc4,\xd7\x05!\xdfK\xd7\x1c\
+\xda8\xf3L\xbf\xe9\xf5\x0f\xaa\xaf\x8fc\xb5k\xb0\xca\
+)\xa3\xed\xc3\xcbt}\x0cn\xb4\xf65>\x0e\xcfQ\
+WZ\x86\xd9\x1eBL\xd06\x5c(7\xaa\xc79\xc3\
+7>\x5c\x82\xfd\xf8\xf5\x8aE\xc8\xbf\xee\x81\xd2\x9a\xe6\
+\xa8\xf5\xd3gAt\xfa0\xbaxE\xa3\x1f\x08\xf9\xbf\
+B\xd7\xf6\xc1\xb1\xbb\xddD\x9c3\xfc\x86\x8f\xd7\xa0\xbf\
+\xc5\xaf]\x0a\x12\x92<\xf1\xe8s#\xfe\x1a\xea\xd9\xfb\
+a\x10\x9a(^\xb2)\x02\xfe&\xfe\xcc\xd79B%\
+dq\x90b\xa9\xe1\xd6\xae\x1f\xd5\xd3\xf3\xcf\xe2\xc8\xe9\
+&*\x9c3\xd4\xf1\xe1\x12&\x84\x85\xca\xa7\x22,<\
+\x11\xa55\xa3A\xc8\xffC\xca\xfa\xc3I\xe2\x03\xd7F\
+w\x07\xfb\x8f\xb8\xd0*\xc4\xf10N^X\x86\xcb\x95\
+\xda\xf8\x8f\xb4X]V\xc5U!\xc3\xb9&+\xc9\xc5\
+\xd0])3o\x22%{\xb7P\xc9\xe5 \xc3_j\
+2\xfe\x82\xc9C\x86\xbfd\xf2i\xe9h\xc4\xcb\xd0}\
+k$\x0eM\x8e\x0fz\x8c\xec\x93s\x158g\xa8\xe3\
+\xc3%\xb4.\xcd\x15\xd9\xc3n\xf2BVZ\xa3\x0eB\
+~\xc6\xb9\x0a\xcbL\xc1R\xc3-8\x0f\x97\xd6\x8fT\
+\xdc\x1ay[\x84)\xce\xf2\xda\x05_\xdb\xd0\x9egz\
+D\x86\x9dfyO\x96\x15\xefG\xc7\xddIc\xf2\x9b\
+\x07o*\xc6\xb9Ws!\xc3\xcb\x95\x18\x7f\x87\x8e\xcb\
+=p\xb3U\xde5\x1fv\xb5\x5c\x1d\xbf\xe2\xedkh\
+y'\xa8\xee\x18\x16`U\x8a\x92\xca\x19 \xe4{p\
+\xce\xc4\xd9\xa9p\x97\xc6\xce}\x8f8\xff\x906\xc5\xbb\
+\x1a:&0\xc5/\xcf\xd1\xe8L\x11V\xcd\xf5\x99\xf4\
+\x0697\xd3\x0e\xddb\xe27W\xb1x\xb57.\x0d\
+K\xda}\x16G\x8e\x8ca\x0fkT\xde\x9c\xc3D\xaf\
+\x88\x89\x85H\x8e\x97\xa2\x82\xab@\xe6N\x9a \xc9\xdf\
+\xe7\xd6\x06\x85\xaf: \xca\xa2C\xd3\xd0Q\x9d\xe7D\
+a\x82yD\x87\xd3\x1a\x91~\xe1((U\x05!\xdf\
+\x83s\x89p(\x1b\xfd\xe3\x93\x86\xbdBl\xd8}\x94\
+sM\xd4\xfa\xfa\x06\xc3-\xb7\xe1R\x9b\xd4\xe3\xfbP\
+\xfc\xb6\xe3\xd7\x17P9\x95\x8dU>q\xd3\x8f6\x0b\
+\x0f\xda#*|2\xf7`\x0eF\xefHXt\x0b9\
+\x17\x82\xe48g\x90)\x7f$H2\x13\xe1\xd3\x7f\xdb\
+\xf0\xbb:A\xd3\xb3\x1an\xed\xb8W\xc9U\xad\x0c\xde\
+\xfa\xc9\x88\x0f\x1a,\xce\xbb$\x02!\xdf\x8bsH\xb2\
+\xf6\xe0\xe8\x9c\xb8-\x15\xc8H3a\xe5\x5c\x1e2\xc5\
+\xc70ym\xd8\x80\x12Dy\xa5\xe3\xd1\x97\x96\x90\xf9\
+t\x87i\x95\x9e\xc4\x8c\xb0\x9d\xfa\xd7Y\x5c\xec\xadV\
+\xa7:\x0d6\xb6\xc7a\x14\xde\xb1d\xf7>\xd7\x87\x0c\
+/\x87\xf2\xfe\xbd0\x0e\x8c\xd7Zg\x16\x88\xb0\xf6\x1e\
+X\xa3\xe8\xa2\xd0\x1e\x84\xfc78\x17D\xfb\xd2\xb0\xda\
+3\xd1\xec-\x12\xa2\x13\x9a\x97\xff\xa4r\xeb4\xea;\
+E4v\x9e\x122\xe5*\x0an\xcdC\x1d\x9c3\xc9\
+\x9d\x93\xb0v\xf0PJ\x1c\xbfC\x9c\x84\x00\x9bsH\
+I[/\xbc\xe3r\xa8\xc5\x1f\x8a\xc4E\xf9\xac\x1e\x08\
+\xf9_q\xae\xc8\x8e\x1eB\xdb=\xc9\x9d_\x22\xdc\xb3\
+\x0a\xdeF\x01rN\xe2\xdb\xcc\xb9U\x11|\xa6\x9a\xb1\
+\xb4\xf4z\xf8\xc6\xe7\xfbh\xb0?\x13\xb3\xa3cpN\
+\xb2ea)N\xbd\xd9\x08B~\x14\xce\x99$k\x0f\
+R\xcd\xfd;V\xc3k\xcc\x11\xc1\xbb\xdb$\x04\xbb5\
+f\x19Er\xf8\x15\x1f^H\x84\x17\xa7\xb0m\xcc\xb6\
+\xb9\x0fq\xb2\xd8\x98Up\x05\x10\xf2=&,\x19\xd4\
+\x15!\x0f\x9b\xe3;q.\x12\xedO\xc7\xfc\x80\x84\xc9\
+o\xb0s[>.\x9eh\x8c\xdf\xc1\xb9H8\x98\x02\
+\xb7\xa5;]\xce\x22\xf7\xf2\x1c\x10\xf2[\x1a\xe9+7\
+:\xb1\x8f\x8d\x8f\xf0\xc2yW{\x14\xac\xda\xb0f-\
+\x96oj\xad\xc89\xc3\xef\xe0\x5c\x9d\x95\x9c\x83zf\
+\x0a\x9e\xf5\x88\xddQ\x85c'z\x8a\xca\xb9\x18\xbf\x80\
+\x9fVa\x07\xf72e\x8f$\x0c\xb0\x8fj\x93\xaa\x1e\
+\xe4\x9a\x84\x92g: \xe4[\xeb-\x99\xc6\xee\x10\xcc\
+\x08\xd8\x8a\x83\xebV\x89c|]\x14w\xac\xdfV\x7f\
+~~\x02<3\xfd\xf4\xf20k\xd6D\xc6\xb9\x18\xdf\
+\x81s&\xceJE\xe8\xba]\xf6\xef\x91\xbcK\xca\xca\
+\xb92~\xc1\x97\x22\x89\xf0\xba\x00\x86\x1d\x9c\x91+l\
+\xedq\x0f\x89\xf1\xf3\xd9\xc9b%\x10R\xd7\xa7\x02\x8c\
+<\x12\x82H\xa9c\xe7\xe4\xb8\xa8)\xd23Y\x08\x8a\
+\xd8\xdc\xf7|\x07\x87\x82\xb1w\x0e\xa2\xe3\xa5\x04\xa5\xc7\
+\x18?\xda\x0e\xe7\xce*ip\xce\xf0;8\x17\x0b9\
+\x190\x8aH\x9a\x9c\x8d\xb8\x88\xe9\x8a\xe5\x9c\xe1W\x94\
+\x9f\x80\xa1[ \x0cA\xc8\x7f\xcc_\x81\xee\xcd\x16-\
+\xd5C\xeak\x0d\xe1\x22\x97\xfbT\x80vO\xb3\x91\xb1\
+j\xa5N\xb1\xc1\xbe\xe2A?U6\x1e\x99\xe1\x81\x07\
+\xcb\xdcN,\xdd\x96q\xa6\xc1\xb5\x14d\x86\xba\xf4\x88\
+\xc6\xf2%=E\x9c\x8b\xf0\x1d8\xaf\xc7@\xc8\xf7:\
+\xb3\x1b-\x22\xbc\xb0\xd1e3\xae9:`_\xb8[\
+\xfd4\xb5\x81\xed\xec\xbaD\x9d\xed\xc1\x82\xcf)|*\
+\x10{\xf8\xd8\x22y`T\xfc\xe4{\xef\xbd\x07\xe4G\
+!!\xd8\xcd)\xdc(\xe0a\xb7\x1b\xe9XR\x10\xd1\
+\xfc\x14\x8c'\xcef\x9cK@\xc8\x9fAt\x87\x8b!\
+Sq\x9fI\xae\xa4b\xb3\xaf\xb3\xc2N\xcbu\x92\xf1\
+'R0\xec\x5c:\x5c\xd2\xfd\x91\xb7Uj\x15\x06\xcb\
+\x80\x1e\x1f\x8f\xb5\x9dR\x14\x81\xc4Q+\x179$\xbf\
+=\xd3\xe3\xc61X\xecv\x1dY\xd2\xcc\xe3\xf9\x98'\
+\xa7\xd1\xe0Z2^O0\x1d\xe6\x8c\x90 -%\xce\
+\x19\x08\xf95\x83WX\x8cDrES\xfc\x820/\
+A\xde\xdd\x19\xa6\x13g\xc0\xae\xfd\xee\xc3\xfa\x83\xee|\
+\x92//\xc4\x984?\xb9cf\x16\xbdmT\xdc6\
+k@\xe6\xebCh_\xce\x82\xc5\xe1\xa0v\xa50Y\
+:\xefm\x91I\x93\xf7\x87\xb1k\xdcX\xb5D\xed\xbb\
+o\xf4>T\x8c\x1d\x96\xb5\x0d%\x1b\xdc2m\xd7\xed\
+*mv}\x0f\xa2\x12\xbc\xba$a\xe1\xdcn\x0a\x9c\
+3\x10\xf2k\xe6\xcdmk\x8c;_TP\x87a\xfc\
+l\xcd\xc2\xb4N\x86\xc9\x018\xee\xe5\xa6\x9aj\xb3\x1a\
+S\x5c\x1c,\xd4n\xbc\x0c\x96\xbb\x91\x83\x19\x07\xfc\x9b\
+\x94`\xc1\x96\xe9\xec%\x17A\x86W\xd7c\xbc\x0aM\
+\x0a#\xf1\xc4l\xf5\xbaM\xd8\x98\xd2\xe0S\x81\xdc\x86\
+\xe8\xcd\xd8=\xd4\xdf\x7fN\xe9\xfb\xc8~'v!8\
+\xd2u\xf5\xee\xa1>\x8f\xbb\xde\xcc@\x87\xa2\x9d\x8du\
+@\xc8\xef\xf1Y\x0d\xcd\xd5\xf1;E\x90\xf9Z\x8a6\
+\xb9\xe1\xd8h\xb5\xae\x93\xf3\x8e\xf0v\xee\xc6\x0bt\x96\
+7\xb3\xb3h\xbc)Y\x90l\xb7\xe8\xcex\x95X\xc4\
++0$u\x0b^\xcfu\xc8\xb6\x82c\x89:j}\
+y\x80n\x87#\x90\xbdi\x83\xc5\x16\xec\xbc\xd1\xe4S\
+\x01\x86_\x8eG\xe2\x98\xa5\xd3\xb6\x04\xbe\xbd\xd9\xe5\xd1\
+E\xf4Kq\xd5\xeb\x0fB\xfe\x08\x9b\x0d\x13f\xc2*\
+\xa1\xaf<\xe7\xeck)\x1a\xbf8\x01gWKvv\
+\x93k\xa3\xe8\xf6\xe1\xbb\xda)<\xe0\x0cu\xf0\x0a\xf4\
+\xcd\x8bFv\xa0\xd3\x8a\x04,\x0f\x1c\xc0\x1eqI|\
+\x18\xab_\x94\x82\xd9\xc9>\xb8\xd0x\xc6\x9c\xd9\xec4\
+W\xfcT\xc0\x14?\x15`\xe5\xe2\x19\x18\x00B\xfe[\
+\x0e\x0e\x1aAM\xac\x13\x9b\xa1\xd6\xd7R,H\xf1\xc5\
+5\xeb\xd5K\xbd\xe1w\xa1\x15\xbe\xc1+\xa1q=\x0f\
+\xf3\x8e\x86j\x5cZe\xd19Z\x98\xa17q\xad\x03\
+\xc6{oA\xd4\xc2ep\xd5r\xcfn-\x8e}*\
+\x02!\x7f\x865k\x98d\xce\x9aH\x86Z_K\xd1\
+\xaf8\x11\x91\x0e\xb6\x0bb\x10W\xde\x0d\xbf\x80\xd7@\
+\xe1\xfd\x09Xg\x07!2\xd1W\x9c\xed\xe3\x86\xb3\xf6\
+\x1b\xb1v\xf6r4\x01!?\xd2\xd7R\xa6Ru\x1e\
+\x8e.\xe6870\xfc\x8e!\xdbU\xa1\x80_\xc0\xb9\
+Hx|\x18\xad\x8f\xc7\xa2\x03\x08\xf9\x13\x04.\x1d$\
+4X\xe6\xd5\x0a%\x5c\x0d\xbf\xe5k)\xa6'{c\
+\xaf\xf5\xa6\xed\xf6\xd8U\xd1\x1c\x84\xfc`\x1f\x92\x99\xd2\
+e\xdf\xf6Fj\xc3]\xb6\xe26o\x82\xff+\xea]\
+C|\xe3k)\xba\x5c\xde\x8b\x00\x87\x95S\x92\xb1\xab\
+\xa2'\x08\xf9\xc1>\x1fB\xab\x8d\x83\x91\xd7}ZD\
+\x1a\x82O\xeb4x\xce\x19\x7f'\x16\x01Q\xef\xba\xe0\
+\x1b_K\xc5\xa2\xaf\xa5X\xbc\xcd\x06\xcb\xa6\xfa\x9fT\
+\x01!?\x10\xaf\x90\x08G7b\xfaFC\xab+\xb0\
+\xcc\xb0g/\xb9\x02d\xf83\xa6\x80&\x11\xaf\x0c\x84\
+\xa8w\x12\x10\xf27\xa9\xb9\xc4\x14\x8b\x9c\x9bYN\x18\
+0\xfb2\x8e~\x19\x8d\xbal\x9cB\xd6!\xea\x9d&\
+\x08\xf9\x9bp\xae\xc5.\xacE\xc4\xd4)\xc17\xb1\xee\
+d\x7f%\xce\x19\xfe\xc3\xc5v\x8e*\x08\xf9\x1b\xb0\xb4\
+\x8fJ\x90\xe1\x9c)\xc6\x9a1\xafy3v\x9c\xc5\xb6\
+\xaaY \xe4\xef\xf2\xe9\x08\xab\x17\xb6\xb2\xdd\xfc\xee\xf3\
+\xb7\xef\xc6\x81\x9a\x11\x90\xe1eL\xed\xdc\x1e\x15\xab\x11\
+z\xd3\xef\xe1\xc0'3\x10\xf2W\xdac'\xa7\xd4c\
+\x84s/8U\xf4\xf8\xb0\xbfU\xe3[\xdb[\x07h\
+uZp\x1be\xbc\xbf\xd2K\xce \xf3)\x07\xf3\x96\
+\x0d\xd5\xbf\xde<\xf4\xa8\x07\xce~i\x05B~$\x83\
+\xfe\x96\x0ap}\xdf\xeb\xd3>\x91\xf8M\x22\x1b\xdeU\
+N\x92&ZR\x98\x09\x973-\xef;4\xf537\
+\xdc\xfc\x18k3f\x0a\x95\x5c\x02\x99\x9a\x14\x0c\x8e_\
+\xd5#\xb5\xcb<\xf7#\xc8\xae\x19\x0fB\xfe(5\xce\
+\x19~G\xd6\xdb\x93\x8c_\x17z\xcf\xed.\xba\xd1\xcd\
+\xf2L.\xec\xaf\xea\x95{7Y\xe9d \x5c\x16\x0d\
+p\xbd\xcd\x16El\xd8\xe32w\x83\xa7\xb1\xfd\x03\x98\
+\x15m\x15s.@\xe6S.\xd3x\x98\xa5nm\xd4\
+\xa8\xcfSE\xcfWa\xf0\xbb\xaf\x0aB~O\x8a\x19\
+\xab\xef1\xc1l5f\xa5o\x03\xe7r\xf8\x05\x129\
+\xf5\x9eha\xb8\x1eK\xd3Wb\xe3\xa9A\xc5\xa7\x13\
+\x06\x85.A\xc8\xca\x09\xaeO1?\xdd\xf3\xa0\xf3\xe4\
+\xe9\x11\xe3\x14\xce*\xf4\x1c\x93\xdbt\xe8\xe2\xc2\xc9\xa9\
+a\x16\x9bz\xf7}\x0e\xb7\xf71,\xb0B\x01\xb5\xf8\
+st\x0c1\x16\xf6\x9a\xcd\x08\xbb\x8dU\xd9V8\xfd\
+\xa5)\x08\xf95\x9c\xd7cW\xf3\xd1(v\x1c*\xba\
+M\xdb\xfd\x06\xeeG\xda)p\xce \xf3\xd2_\x90\xf3\
+0\xc2\x98\xa1M\xb0\xbf\x91\x96\xf6\xdd\x89z\x9d\xf7\xcd\
+\xeb3\xf0r\xaf\xd1\xeb\xcf\xf5q8\xee\x96\xba}\xc0\
+\xc0\x8c9\x83oC\xdf\xe5a\x97[AC\xa4\xdd\x1b\
+\xdf\xedb?\xd8\xcb\xa8\xbb\xee\xa5\x81\xb6\xe6\xb1c\xfb\
+\x0e\xbe\xd1\xcde\x7f\x04N|n\x8fZ\xfc\xbd \xb9\
+\xe8\x88\xd1\xb9V=\xf6N\x1baV\x8c\x95\x87\xb6\x83\
+\x90\xdf\xc29\x14\x12f \xcej\xb2\xc7{,\xc8X\
+#p.\x86\xcc=o\xb4r\x1b\xaf\x17\xdb\xb9\x8f\xd9\
+\x89\x1e\xf3\x5c\x0c<\x16@\xef@\x80x\xc6v}\xbc\
+\xed6\xcc\xf7-\xb2O\x8fy\xe09\xce\x7f\xd5\xd0q\
+\xb7\xb5\xd7\x8f\x0f\x1c2n\xd0\xe1\xae6\xb3\xb69\xdb\
+\x0e\xdf!5\xeay\xad\xb1\x9e\xc1-\xf5\xe9\x8eix\
+\xc9\xdb\xa2\x8ew\xbb\x14XM)\xda%\xceB\x8a\xe9\
+`\xb3K \xe4\xb7p.\x88\xbd\xe6\x8e[\xb7\xd9h\
+v9f\xa6\x1f\x07\xe7r_\xf6\x8bE\x9f\xf7a\xf2\
+\xb4\xb6\x83\xdeiIS\x5c\xd8\x15\xae\x0c\x19\xfe\x02J\
+\x85\xcb\xb0Ej0\xf7\x19l\xc3\xfdK\x8e\x87OM\
+\xde\xd0<rd\xe7\xe6\x17\xd0md6\xc6zf\xc5\
+\xed\x9c\xd7\xfd\xe4\x12\xd1)u\xf5\x16\xe5lD\xc8;\
+d^h\xae\xcc9C\x1d\xfc\xb5D\xf8\x92\x09\x9d\xcc\
+\xd5\x98\x0dB~\xc9J=th\xaa(rC=\x9d\
+\x1b\x03\x87\xdb\xe4\x98v\xd7z\xaf9q\xe7[\xac9\
+0`?/\x10\x17\x9ac\xcbZ\x03\xb3\x970O\xda\
+\xc4*\xb9\x042\x9c\xcb\xb3b+\x0c\x8b\x9c8\xe6!\
+&D\x14\xa7V\x15i\xbd(\xc10\x8f>x\xd7Q\
+M\xb8\x85\x99Y\xd7\xe0pA\xb7\xcaO\xdel\x83\x01\
+\x5cT\xf5]\x87\xe07\xbc\x8d\x10\xe4@\xc8\xb7>e\
+A\xc7aX\xf3\xb4\x9e\xdd\x0c\x8f\xb6\xe9?a\x85\xc3\
+$,\xdfd\x80\xcc\x95\xe37\x95c\xee^\x8f\x13\x9f\
+2\x95\xf6\xdaa\x8e\xcb(\xd3J\xccL\xcf\x07\xe7r\
+\xa8\xc5_\xa0\xf5\x86>\x0d\x1fw\xb4\xccIG\xf8\xeb\
+f\xbc\x12\xf5\xf6\xcfC\xd0F}\xf1+ard\x00\
+\xd6\xdek\x0dB\xbe\x97XMW\x1e\x93\xc3G\xc0\xf5\
+\x98.{\xf2U\x8e\xbf`\x0a\xc9\xd6\xb06\xeb1\xfc\
+5L\x02\xfc\x9bL\xde\xd8\x88s\x91({\x13\x86\x06\
+\x8d7\xac\xc2\xf4\xb4k\xf3\x7f*W\xf8\xa9R\xabQ\
+\xa4!\xee\x8d\x1c\xb1\xe5\x1d\x22N\xcdE\xc81\x1d\xb3\
+\xd9&:\x9e\x93\xe1:\xa5\xe7\xe8\x8b0K\xb6d\x89\
+\x15\xf2\x9c+\xb0Bk4\xdf=U\xa4\x01B~\xb6\
+\xb9G;=t\xb5\xdc\x88\xb3|\xb0\xe4\xccO\x22\xfc\
+\x82\xd5\xc3\xd1\xb3\x9b:\xfc\xe4\x94\x9a\xbd\x9c2d\xd1\
+E9\x13\xbf]H\xff4\xb1:\x93i\x948\xabl\
+m\xd8q\xd2K\xa4V,F-\xce\xa1\x1c7\x09g\
+\xa6O\x0d}\x0b\x8b}\x13\xae\x7f\x0aV8\xb5\x1ck\
+\xbd'\x0f;3\xa0\xdf\x82[M\x06\xda&\xe9v\x1d\
+\x1c\xa2\xdb\xac\xe3\x15\xf4\xb3\x88\x86\xe3\xf5N \xe4[\
+\xfc%\x9a\xf8\x1a\xa2`tk\xe3r\xb8e\xbb\xa0\xf0\
+Kc\xd4*\xb6`\x1a\x91sV\xae5\x9e\x19\x92\xea\
+6}H\xc0\xc0\xc9k\x5c\xa3\xed\xc4\x03\x8e\xacS\xda\
+5D\xb9S\x85\xea\xa6\xb2d\x1d\xb7\xe7\x9a\xd7\xd7 \
+lA\x9f\xc5\xaf\x11\xb8\xcf\x1a/\xb9&dx\x0dS\
+HX\x84M\xf6\xe3l+0{o\xc48\xfeAR\
+\x93\xc94K\xfc0~\xe7<m\xf7\xd9\xed\x91\xdfD\
+\x01\x01\x82D}(\x08\xf9\xd9\xfc\x1e\xdd\xe4%[\x8b\
+\xfb#\xb5F\x1b\xb5\xf8k4\x8c\xb3\xc5\xc6\xe5]\x86\
+m\x87\xf1v=Q\x19\x97\xa0V\x89\x17\x1a\x1f_\xd4\
+\xa8\xa4Y\xfb\xf1\xd5\x18d\x9d\x0b\x97\x13=\x83\xb2\x92\
+\xc4\xfc\x01\xf4\x9df#o\xa4I\xda\xf9\x86\x1b\x1eL\
++Z\x0e\xf3\xc0\xf1S\x1e\xb09^Y8\xf9y \
+d|V\xa2\xa9\xcbTl\xef\xa8\xdd\xfd\x03\xa6\xa5\x95\
+!\xf5\xa2\x86\x0a\xe7\x0c2\xcf}\xa1\x05B\xea\xaa\xf2\
+@\xdf]&\xedN\xc8/\xf0\xce\xc3\xd9/\x83Q\x8b\
+\xbf\x96\x08F}\x05\xb9.-\x9b,@K\x9bl\x5c\
+|>F(\xe3\xf2\x90\xe1\x9c\x89\x8a\x96\xc1\xdfn\xc8\
+\xa42\xac\x89\xf5\xc2\x1d\xae\x0d\x19\xfe\x1cM\xf6\xfac\
+\x93\xc9@\x9b'\x92u\x0f\xfd\xaeln\xd9\xe2\x9am\
+\x83\xfd\xdd\x1a\x0e\xacP\xb6\xdc\x95\x81Y\x9e3\xc6\x0f\
+\xedc>m\xd8\xe2\xf4m\xc6\xa3\x8a\x16N\x0fH\xc5\
+\xa2\xcc\x8e \xe4\xd7\xbc\xd8\x0c\x9d\x12\xcbV\xf9\xe8\xbc\
+\xf4%\x9e\xf0\xa1\x92\x17\x5c0\xd5\xc3\xc8f\x0cQ\x00\
+\xaaM\xbb\xe0\xce\xec\x9es^\xc3)~\x0b\xcax3\
+\xc8p.\x11\x8a\xad1>a\xba\xe1-\x18z\x9d\xc2\
++\xae\x03\x19\xfe\x5c,\xe2\xcf1|EG\x94u\xb0\
+\xbc\x98\x8f\x8d\x8f\xdaVg\xd5\x1b\xe15\x0d\xe9\x8b\xfa\
+\x8f:\xd7\xb7U\xd7\x1b\x0a\xca\xcd/\xa1\xdbB\x0b\xdb\
+i6-A\xc8\xcf\x8eD2\xd5\xb1]\xe7Z\xc3\xfc\
+\xccVp.B\x1d\x9c3\xe1\x8c\x19\xe2\x96\x0e^\xf9\
+\x06\xd24\xb3\x97W,\x06\xfbZ \xa0\x8f\x18\x1b\x05\
+\x01\x9d\x8f,\xc6\xd4\xe4Y#J`\xb4\xb9\x10e\xbc\
+;j\xbd\xbe\x0e\xb9\xc2\xc585\xa2\xf7\xc6r\xec.\
+\x1c\xcf^qE\xc8\xf0\xe7\xe8\xbcm\x19\xf6\x18M\x8d\
+.\xc5\xba\x87\x8b\xaa/OP(\xf3E\xd3,\x0b\x18\
+Nj\x85\x01 \xe4[\xfc6&Y\xf7\xc3\xa3\x9e\xc6\
+\xbb\x1fa\xf5\xa1!\x22\xceE\x90im\x1c\xdfH\xdf\
+\xe9V\xa7\x9c\xc5X\xe15\xc9\xfc\x0df\xa5\xc4\xe6?\
+\xd9_\xef\x5c2\x14\xa6\xd6cJ\x83\x07\x8bD\x8f\xe2\
+\xa1pc%\x0e\x0c\xd55\x7f\x8f\x9c\x92\x99\xac\x8c\xd7\
+\x83\x0c\xe7\x82\xa8\xc8\x0cR\xb7\xb1K\x9f\xc0,\xdc\x1f\
+\xafx#\xc8\xf0\xe7\xd0\xca\x8f\x83\xf5\xdc\x1es_`\
+\xedCk\x10\xf2{\xf8K\xb4\x0c_\x86`+\x835\
+U\x98\x13\x1f\x92}\xe5H\xab\xa3RaU\xa7\x9e\xcb\
+^*//N\x09\x8cD\x87 \x83\x8e\x95\xca\x0b\x8f\
+\x97b\xfb5u\xd4\xc1\xb9\x88\xdd\xb0\x81\x9d\x97\xe1\xcc\
+\xbbX\x1d\x1a\x8c2\xde\x1a2\x9c\xcb\xb3\xd3\xab\xa1\x9f\
+1{\xd8u\x0c\xd9r\x1d\xafx{\xd4\xe2\xcf\xd1d\
+\xf5@\xa6\x09B\xbe\x07\x7f/Hr=\xa0\x1f7\xb9\
+\xefK\xf4s+\xeb\xf4\xe2S\xaf\xc7[\xdaE\x8ci\
+\x85\xf7l\xb0\xf7\x0b\xcd`k\x13\xfbi\x1a\xf9\x13\xe6\
+\xed=\x03\xe9\x8b1\xa8\x83\xf3z\xec\xe6:\xf4\xcf]\
+0\xe0\x0c\x06\xdb]C\x19\xef\x83Z\x9cC\x5c\xb8\x04\
+\xd9\xb3\xf4\xd7\x9dC@Nw\xc9+.\x80\x90\x9f\x09\
+;*\xe4\xf0{\x94u\xbaa\x90\xb7\x19\xf6\xdd\xeb\xe4\
+y\xea|\xfd3f\x88\xb5\x1a0\xfb\xb9\xe0\x9f\xec\x9a\
+\xec\xbc*fC\x7f\xc5\xd2\x06\xedG_\xe8l21\
+c\xf4*\xc3\x98\x09\xa3\x1d/#\xf4\x839\xbe\xc19\
+\x84\x1b+\xb1{V\x8f%\xaf\x10\x9bo\xc6\xca\xb8\x06\
+d8\x97cE\xcb\xd1\x1c\x84\xfc,\xdfRN\x08\x1e\
+\xaf5\x11\xc3\xd7\xf8aG\xc5B\xfc\x82f+\xfa*\
+\xcd\xef\x8fI\xbd\xb4\x90\xd3OG\xf3\xc1\xb4\x81\xd3.\
+47\x89;(\xbf\xfe\xba\xe9#\x97\x0e\x932\x17\xf5\
+*\xd0\x9a\xbe\xfc\x94\xc9v\xd7m\x0b\xba5\xbc\xd8~\
+\xf5\x98\x80\xc5\x1d\xda\xbe\x90_\xbex\xef0\xa5\x1e\xef\
+\x1a\xa6=]\xcb.\xfd\xa4\x82:8\x17\xb3\x1b60\
+\x0f\x994\xe5\x06\x96\xfa\xd8\xb22^\x1f\x84|\xebb\
+$4\x0e\xcdc\xe7:\xaa\xea\xbc\x87\xf3\xdd@\xe6S\
+\xae\x86ZU\xbeh\x130}\xb2\x87\xca\x88)AC\
+\x8d\xa6\xed\xe87\xcb\xdd\xfa|p\xc7\xee{l\x98\xeb\
+\xfa\xe1s\xdebvv\xc1\x95#\xfeZo\xa2\x15\x9c\
+\xf5\x95\xdb\x97k\xda\x18\xfb\xebi\x8f\xb8\xa3\x11\xb3\xca\
+\x22pv\xc7\x5c\xb3\xd1\xfd\xee\xb6l>\xfaUc\xc7\
+\x9d~x\xc2[\xe0\x1b\xb76@\xbdpYW\x0d\x10\
+\xf2k8g\x92\xc3\x8ba\xbdF\xbf\xf5\x22\xcc\x8cU\
+e\xc95\xea\xa8U\xe5\x8b\xaeg\xd7\xb7JQ\x97k\
+\xf9\x1e3\xb6\xec\xc5\x9a\x826\x90\xe1\xd5\xd0\x88\x9d\x80\
+[\xe3\xa6F\x96\xc3f\xdf\xd0\x9a\xcb=G8/T\
+\xd87\xa6\xa3\xe6)\x85NK/c^\xa8W\xbe\xd4\
+\xc84}N\xfd\xb3\xf5T\x06\x95\xc3\xd0\xb3\x10\xefx\
+\x13\x10\xf2\xdfh\xda\x14\xdd\xd5\xd4\x9bz`\x90\xd9)\
+$\xd7\x98\xa1\x8e*_\xb8\x9b\xe8uy\xae\xe8s\xda\
+\x17\x87kZ@\x86s&I\x9e\x83\xad\x0e\x937T\
+bN\x9a\xcf\x8b\x17k\xb53\xbc\xb1|C7\xbcD\
+\x9b\xc9\x0f\xb0\xf8\xe4\x81\xabi\x9b\x95+\xa3\xe12\xae\
+\x15\xca\xd4\x06z\x07\xb3\xd0#\xea \xe4{\x15&\x08\
+\xf2\xd2\xeeX\x09\xa0\x08\xc0\x03\x87I81\xa2M\xd7\
+W\xea\xdbJ\xfc\x90\x5c\xd3\x12\xb5\xaa|a\x1c=\xa7\
+\xfb)Us\x9f\xfd(\xfc2\x042\x9c\x8b\x85}\x1b\
+\xd0?|\xd2\xc8*\x18\xef\xb9g\xf8\xd3G\xf9\xaf\x9f\
+\xdb\xab%M\xc1\xd5q\xadT\xaa\xb1\xfal&<+\
+Z|\xce@\x13/S\x05\x01\x84\xfc\x8c=\xe7\xca\xf8\
+\x0dJ\x9e\x8f\x99\xbc\xe7c\x012\xfc%Z\xf8\x8e\x83\
+\xd3\x04m\x18\x03\xd0\xbc\xe3\x8bi;\xe6\xb6\xcbo\xb1\
+`G.\x92k\x0cQ\xab\xca\x17\xadonn\x1e\xaf\
+\xd1y\xfas\x14~Y W\xf8E\x80\x0c\xe7PH\
+\x9c\x8aS\xb3\xa7\x06\x96\xc3<sZ1O\x95;\xb2\
+\x04\x0b\xdc\x87\xd77cS\x02\xb4@\xc8\xcf\xd2\xb6\xa2\
+\x81U;=w\x8c\xb6\xcd\xc7s>\x02\xbf@N\xa4\
+<\x12\xcd\x0c<\xb1(\xc9\x09\xce\xc7\x86\xb3G\x5c\x8d\
+\x7f\x92\xb0\xc4\x95L\xce\xae\x13\x93\x87\xcc\x87X\xb4,\
+\xf5l\x18\xd4\xb6\xf3\xd4gH\xae\xb1A\x1dU\xbe\xd8\
+`=H\xff\xae\xb2\xcfa_\x14~i\x0b\x19\xce\x99\
+$e>\xd6\xbaM^u\x19&i\xd3\xa5\xfc)\x03\
+!?c\x16\x97\xd4\x958g\xfc\x8d\x02\xfbz\x07}\
+-\xba\xe1e#\xa5\xa9\x1f\x84\xac3\xd6x\xce\xb5 \
+\x93\xb4\x94\xa9\xae\xe8\x89Y\xdd4q\xbc\x85\xa6\xea\x85\
+iz\xed\xb2\xe6\xf50z\xa26Vz\x1aY5\x13\
+\xf1\x0b>\xc4\xc2\xd2|H\xe7\xdb\x8d\x9c\x0b\x22\x90\x5c\
+\xd3\x11\xb5\xaa|1&mI\xb7<\xb59N\xc7P\
+\xf8e\x0cd8\xaf\xc7\xf2\xfd\x98\x12\x08\xf9\x8fJg\
+\x0c\x98\xd8N\x92\x22\x98\x1e*\x81\xf3\xa9\xc1\xec-\x97\
+\xaf\x8a\xc7T\xcfi\xaag55\x86\xbe\xd6\x5c\xe3\x1b\
+\x87\xe7\xbc\x1b\x7f \x88\x0b\xb6*\x0cX\xd4\xa3Kt\
+\x8b\x01K\xdc\xfb\x8d5\xe9\x1c\xb0\x00\x9d\xef\xed\xc0\xd6\
+\x11\xadt\xde(\xb9\xdf\x0e\x87_u\x0b|\xe3C,\
+\x86%Z\xe8d\xb7\x9a\xeeV\x88\xe4\x9a\xa9\xa8U\xe5\
+\xcb\xb4\x9e{\xa8Gh*\x8eL\x16\xe5\xbdk\x0fB\
+~I\xa53\x96FL\x11J\x85\xb6\x8b\xabT\xe6\x05\
+\xc6\xb5<Q\xd3\xfb\xc2j\x0c\x89\x99X\xef\xb2X\xa7\
+[\x91j\xaf\x857\xf1\x9c\x8f\x85\xcc\xc7\x04,\x9a\xa4\
+\xd7~\xa5\xe2\x80\x15m\x077c\xaaM\x941kF\
+\x7f\x1c\xe9\xd6R\xfdek\xd3\xd8\x93\xf0\xad\x9a\x82o\
+|\x88eZO\x82T\xbc\xdbi\xe8\x97\x8b\x13*\x1c\
+Xr\x8d2jU\xf92e\x10\xf2[*\x9d\xd1\xb9\
+tu\xbd\x03\xf2\xcd\xbb\xbe\xef\xdfi\xcccy\xef\xa7\
+A\xf7\xefZ\xea\xda\xf5\xd6\xb96mJ\xd3\xbd\x1d;\
+\x8f\xbb\xcdb\x0fm\xc4s\xde\x142/\x02\x99b\xf8\
+\x1c\x0c\x9e\xd8N-B\xa7\xe30\x1f\xd7\xd5cM\x8a\
+\xc2\x15\xdd\xf5{\x98>\x85o\x95+~\xc1\x87X,\
+\xb4\x1f\xd7q\x7f\x93u\x99\xb3Xr\x8d\x12\x08\xf9#\
+*\x9d\xe1g>d\xca\xa3Y\xfdz>3\x98\x11v\
+\xd9\xc3\xd51\xc8b\xfe\xb4\x03\x1bM\xccN\x04\xcf\x19\
+|\x12K\xdd\xb2\xf1\x9c\xf7\x81\xcc\x19\x07A\xcf\xa4w\
+\xbbx\xa5ak3`\x12\xd1CH{%\xf9\x94\x8b\
+\xf9\x93\xbbi>U\xb3;\xb7\x07\xbeU\x9d\xf1\x8d\x0f\
+\xb1L\x05\x84\xfc\xb7*\x9d1s\x8f\xe9\xf8\xd3\x13F\
+\xce\xb8\xb9`\xf9\x94\x0c\x83\xfe\x93\xafM1\x9eu|\
+\x8e\xf9\x81#\x0f76\xdb\x83F\xb3^\xe1^\xf5T\
+\xe19\x97/u\xc4&\x13\x83\xb5\x0f%\xd6\x893\xba\
+\x07$\xa8o3F\x9f\x15\x83\x90\xde\xaf\xa5\xda\xb5\x11\
+\xd3w\x9c\x84o\xd5<\x10\xf2g\xaatF\xf3G\xf6\
+\xed3\xe4[-zm\x94;k\xf6\xa6\x01m\xef\xf4\
+\xd7l\xf6\x1c\xee\xe7\xfc\x1f\xfaX\x06l\x1e1\xee\x06\
+\xfcR<\x8d_T\xb5\xcb\x9c\x87\x0d\x1e\xe3\xe7\xbe\xc4\
+P\xbb\x1c\xedi\x1b-\xfb\xe9v\x0d\xee<\xc08Y\
+\x7fi\xb7\xc9\x8bu\x87/`\xbeU\xaa \xe4\xcfV\
+\xe9\x0cg\x87\xe13\xef\xc2\xcb\xdb)k\xab\x85\xaf\xbf\
+\x91\xc1yX\x06,\x7f\x18\xb4jr\xde\x92~\xf9\x98\
+a\x7fL\xf7\xf9\xd7\xc1\xa76\xa1]\xee\x8a\xc6\x11\x0b\
+:u\xb9\xa2\xad\x80\xab\x82\x82\xb63\xdaOo\x0fB\
+\xbe\x17\x9b6F\x89]\xe7r\xf8\x03*\x9daxh\
+\xf1\xc8\x13\x98\xbe\xf9\xc8\x86Kw\x0d\xeex\x0eUA\
+OW\xa57\xdbG(W\xb8\x08\xbb\xfa4\x9e\xfa\x1a\
+\x85\xf7\x16\xb0\xe7\xbc\xfe\xe7,4\xf5\x18\x8f. \xe4\
+{y\xb8\xb0\x86\xf6\x1b\xb0l\xa1\x15<\x87Oo:\
+\xabo\xe4\x01\x1d\xe14\x97\xc3w\xaatf*\xef\xa4\
+*)\x9d\x9a.|\x8f\xa2\x07\xd3F=\xf9\xa8\x8cZ\
+\x95.\xb0\xf23\x1a\xbd\x03\xce\x91\xfd\xd4\xca8\x03!\
+\xdf\xebE.Z\xa6\x07\xc1\xd9\xd7\x9d\x95\xb9:\x89b\
+b\xfc`\x13\xea\x0aK\x93u\xb6\xdd\x84\x22.\xc6\x1f\
+P\xe9\x0c\xdbmF\xd3\xaecs\xb4/\x9e\xf3\xd6\xa8\
+U\xe9\x22\xc8\x81\x90\xef%rO\x13C\x86\xf3z\xec\
+Z&\xa6\xee\xf6\xd2\xde\xd3}\xae\xc1x\xef\x98\x09j\
+\xa7\xd3\xa1q R\x93\x09\xd1o%\xf8\x83*\x9d\xa1\
+_\xb4b`\x02F\xaf\xb7b\xcf\xb92\x08\xf9^\xf6\
+\x1b\xd0a\xf1J\x98\xf4_<v\x12\xd6\xc7\xb5\x92p\
+\xce\xf8K\xa6\xf2\xf4<\xccc\xa4\x0d\x1e\xc1:l\xd6\
+\x22\xc7\x91}\xe6XK\xa6\xf66\x86\xc1\x925s\x8c\
+F\xad\xf7\x1e\x0a\xef\x13\x0d\x948g \xe4\xcfv-\
+G\x90\xdf\x17\x84\xa9>n8\xb8\xd9\x117\xb7\xba\xc0\
+7a\xbb\xba\x7f\x9b%\xdb\x87\x08\x1e\x09\x22\xc8|y\
+\x0c\x83\x82H\xc4\xc4o\xd79\xef\xb2\x09\x07\xbd]\xb1\
+=r;r\x82\xb6\xe0T\x88\xdb\xe0t\x98.\x9d\xcc\
+8\x17@\xc8\x9f\x89\x97)\x08\x9f\x1f\xa2\xc3no\xec\
+\xde\xe04z\xb5\xb9\xef\xec\x06\xa7S\xd1\xf2@\x18t\
+\x946\xba1\xd4\xe2\x5c\x10\xdf=\x08\xdd\xd3\xbb\xa1w\
+\xfb\x00\xda\xe5\x84\xa3_F\x0c\xda<,\xc6\xe0\xfd\x01\
+J\xef;,u\xb5\x80K\xbc\x02\x08\xf9_\x18.\x80\
+nk\xa7\xf4\xd6\x82W\x91\xbc\xfc#.p.aO\
+\xb2\xe1\x94\xe0\x81\xecnf\x8bg\x8b\x0f\xbdR3\xb1\
+B\xb7\x91\x8b\xbb\xf5\xee\xb2\xc2\xba\x05\xe6\xcfl\xc5\xde\
+q%\xd4\xd1r\x82\xbc\x98\x99\x0eR\x0cL\xd3Q:\
+\xb7\x17\x0b\xc2\xdc\xe4\x12\xe6\xdb\xaf\x1b\xce\xcer9\x10\
+R\x97\xedZ9ML\x1a\xd5\x11\xef\xb8\x12~E\xa2\
+\x1fZ\xf9\xb8\xc3n\x93#\xcel\xb0C\xd6\xe6\xf5C\
+\xb7j\xacZ?\x0egk\xb48\x97\x08\xf7\xb30\xf6\
+\xfc.d\xeepn\xb6\xcfv}\x83sk7 0\
+`+\x8b\xf6r\x12\x95-^\xa0\xedg\x10\x9c?\x82\
+%\x96\xd7\x7f\x9b\x8b\xf6q\x9e0\x1bm\x22\xccw\xda\
+T\x7f\xb9\xb3\x93(}\x9d=n\xcc\xb3\x90_\xc4\xa6\
+O\xd6\x00\xf9\xa1\xb4\xedn4\xc5\xe9\xb7M\x84\x0f\x5c\
+\x82\x7f\xb2\xc7\xfb\xd4\xd8\x16)fI\xa5\xd8\xeb\xe2\x84\
+\x9f\xfa\x8f\xd6tAv^\x0b\xd1;.B\x1d\xfc\x9d\
+ .\xcd@\xdf\xbd\x81\x88\xf0r\x81\xbf\x8f\x17f\x9c\
+H\xc4\x8a\xe3q\xd8k\xb7bp\x1a\xa2\xde\x0e\x82\x0c\
+\xe7*\xecs)\xfa\x1e\x0a\xc7\xc2\x82\x18\x8c\xce\x0a\xc3\
+\xd4]\x01\x18\xff\xf8\x10\x96\xa7\xfa \xcbx\x9d\xbdm\
+\x9b\xe2\xea\xc6\xef\xf2\xa1w%\x0d\x8bsB\x11\x1e\xe2\
+\x85\x88-\xce\x98\xe3\xe0(\xc8\x81\xfcpw\xb5\xa1:\
+a\xddE;\x84?Y\xc2>sy\xfc\x93}:\x0e\
+\xe9\xcemHus\x81U\xc9nD$lQ\x8a\x81\
+\xe5\x8a\x11\xec\x1dWD\x1d_o\xb2zO\x8ea\x81\
+\xad\x19\x02\xd4'\xa3C\xaf\x95L\xc1\xc3\x85\xa9\x1dK\
+A\xa4\xb3\x1dn\xcdrI_\x09\xbfW\x8dP\x8bs\
+e\xf6\xf0\x90 \x11\xcd\xd4\x15\x9fLSQ\xbc\x91\x85\
+\xf1\xfb\x82T\xf6\xf7_\xb4l\x8e\xfc\x95Or\xfc\x91\
+:\xe3\x0f\x99rQ<S\x01\xf9K\x05\xc9wS1\
+\xb6\xcd2\xc1\xce\xd7!\xe0\x5c\xcc\xac\xf2\xea\xc3\xe6\xec\
+4\x14\xd7\x8ce\x97\xb8\x12\xfeI\xbe\x9c\x86jq\x06\
+\xeaEEA\xe9^\x16\xc6^\x88\x13\x1f\xc5\xe8\xfe\xcb\
+\xf0\x8e\xab\xe2\x1b_\xaf\xa0u\x88\x8b\xbc\x90\x17\x85\xb6\
+\xd1\xdb\xb0z\x9b\x1b+\x0a\x0f\xd4\x88\xdb\x13\x8c}\x9e\
+\x1b\xad\xe2\xe1\xf7\xa2;d\xae\x17\x08r)\xae\x18\xdf\
+d\x8ah\xc4B\xebf\xbd\x9c\xa4\xc2j\xc7M84\
+}\x19\xbc\xf4\xd6z\xb4\x13{g\x89@~,\x873\
+\x1d\xb0\xfb\xdd\x08\x81s\x01\xdf\xe0\x5c$\xb4\xab?{\
+\xac\xe0w3\x05k\x8f\x05\xc2*\xf7,V\x15\xba#\
+\xe6ag\xfc\x93q\x0e\xf1\xfd\xbd8e\xbbX\xcd\x03\
+\xe1;u\x85w\x5c\x82oT\x9e\x86fF\x10,\xa4\
+\xf6\x8a\x96\xe3m\xc6\xb5}y\xdf\xb2Q\xd9Y\xd8\x07\
+\xac\xd3\xbd\x01\xbf\x17cE~/\xc4\xbc\x12\x9d\x8e\x86\
+\xc2+\xd1\x07\xfe\xc1\x9e\xb8\xe2\xe1\x82\xb0\x8d\x8e\x18\x09\
+\xf2\xc3]o)'$\x0fX\xd3\x1a&\xd9\xbb\x90\xfc\
+>\x08yU\xf5Q\x87\x81qr\x0b-\xf3\x9cU\x22\
+\xcbC\xc7\xb1\xeeX\x1e\x82.\xaedV\xb9\xf5\xf0O\
+\xa3;Z^\x9e\x85\x9d\xab'\xce\xe5\x22\xd4\xe2\x5c\x10\
+\xdd\xcf\xc0\xa6\xfd~\x0a\xbb\xb1p\xae\x11\xdeq%\xd4\
+QU\xc8\x94\xca\x8e\xc0\xd6c}\xa3\xc2\x8e\xcb\x0d{\
+\xcb\xdb-\x91\x14'\xa3\xc9\x91\x04Dlq\xc4\x03+\
+\xd7p\x07\xf8\xbdh\xce?\x88\x84\xb2\xa3hvr\x17\
+\xba\xee\xdc.\xc8\x81\xfc\xa5\x8e+\xa0Q\x1f\xd3}k\
+\xb0\xe3\xeed\x96Q\xa9\x8cZO\xda0%\xfb\x89\xe1\
+\xc3{\xce\xdd;w\xcd\xec\x94\xc9Xu>\x0eOy\
+\x7f\xfc\x93lq\xc6\x14\xdb\xf5\xd81c\xb1\xe0\xbe\xd4\
+\xdeq\x1c\xc2\x1f6A-\xce\x15\xd8\xc3\xfd\xe8S\xba\
+[(\xc2\x90N+\xf1\x8e\xab\xa1\x0e\xceE\xa2\x9bi\
+\x88\x0dq\xee\x11\xddn\x91\xd1\xa8\x8d>\xa3tRC\
+\xb10p\x1b\xdc#|\xe0\x9d\xe81\xdf\x1b~/\xb4\
+A\xfeVy\x22\x91\x98\xad/\xae\x0f\xff\xfb\xc3Q\xce\
+\x1b\xe1\x17\x1cVo\xd5\xa6\xfd\xe6k\xa9\xc8z1Z\
+\xa8\xe1\x12\xfc\x9d\xf8-A\xee|\x0a\x06\xa7\xf8#g\
+\xab3;\xbc\xd5\x1d\x1b\xb2\xc3a\xbfc\xf3\x08k\x04\
+\xdd\xd5D\x1d\x9cC|\x7f/\xb2\xbdlU|\xe1\xe1\
+\xd5\x9d\xbd\xe7r\x901v\x5c/\x9c\xa9L\x96\xdc\xd9\
+\x8b\xf9\xc7\x22\x90\xbfe\xa3J\x82\xabS\xfd\x13V\xb6\
+\xd8?h\x01\x86\xaf\xdc\xc5T@\xfe~\xa6\xd9\x83`\
+\x9d\xbb\x0d\xd6yW\x99\xf7\xfd\xb38\xf5\xbe\x9d\x22\xe7\
+\x0c\xdfX\xdedD\xebVng\x9d\x10\xf7z\xa5\xc0\
+\xb9\x80?\x88\xc5\x95\xa9\x0f72\xd5\xd21\xdd\xb5\x0a\
+\xff\xab\xb2\xd3h\x5c\x10\x89\xc0\x85\xcbY\x8c\xfc4\xf5\
+n\x0b\x9c\x05\x95S\xa9L\x11\xbf\x80s\x91\xf0 \x13\
+\x16GC\xc4\xe90\x99:}\xc8\x9e\xd8\xe6\xbe>h\
+fb:\xb0}\xf7{_T^\x9fc\x8a\x9fn\xa2\
+\xff\xc1`l\xf0u\xc7(\x90\xbf\x9d\xf8q\x8d\x00\x99\
+\xbb\xdah\xdccF\xfaj5\x8b\x83\xd3\xfa\xf6\xb7\xd5\
+W\xf7\xbd\xe1\x83\xa4\xf2\x89J\x9c3\xd4\xc1\x1f\xa8\xb0\
+\x0d\x8bgibj\xe0R\xa4U\xfb\xa9r\xceTF\
+\xacb\x98v\xa21.\xbd\xd1f\x95\x5c\x1e\xbf\xc4*\
+W\x1bV\xb9s\xe1x:\x0a\xd1/\x1c\xfb{:*\
+\xf4\xee\xbb\xb6\x11\xfeW\x1foa`\x8a7\x8e\x9b\xba\
+x/gY\xefU\xf0\x1b8\xaf\xc7\x9e\x1dF\xabG\
+\x998l\xb6D\x5c`\xb5\xb1\xbf\x9d\xe3&I\xf4\xa8\
+\xa9p\xd3\x8a\xce\xd6\x11\xdf\xe2\xa2\xcf\xb7\x94\x18\xc8\x0f\
+#\x1c\xf9,\xc1\xef\x99\xbf\xb71V\x16,\xc4\x8e{\
+\x1eH{5\x92Up\xd5\xbbM%\x02d\xf8S\xb1\
+`1\xcf\xba=\xac\x0f\xda#\xf7\x93\x19~\x01\xbf\x09\
+\xc5\xee\xbd\xb6/F\xd8\x03?$\xbc4\x84\xef\xa1\xc6\
+XY4\x0b\x91\x0f\xa6\xe1>o\x84Z\x82U\xae<\
+\xacr\xc7\xc3*\xd7\x0fV\xb9G`\x95\xeb\x02\xeb\xbc\
+1\x88x\xd5@\x12[!\xf4\x96\x9b(\xe0\x7f\xc1\xb9\
+\x22+;\x80e9;T\x0e\xf7X0g\x0e{\xca\
+\xe5\xf0;8\x97c\x95\x850:\x1e\x83\xe0\xd8\xed8\
+\xe0\xbc\x19+\x17/g\x0d@~\xa8\xc9\xc3\x9c\x1a\xc2\
+\xea\xf8F\x1c\xf9l+\x1c\xfd,\xc17\xba\xec\xb8\xab\
+\xd08\xe8\xbe\x8ev\x7f\xaf\xae\x98\x9d\xec*Z\x96\xed\
+\xa4h\x99\xe7\x0e\xaf\x9b\xbbP\xce\xf5P\xebC\x8e\x1a\
+\xab\x88\x85F\xe31\xfb\xfdp\xa2|!{\xc6U\xf0\
+\x0d~\x8f\xc9\x99L\xb1\xeb\xad\xb5\x22g#\xd6\x9f\x8a\
+\xc2\xaa\xfccX_\xbc\x0d^w\xfa\xc9\xdf\xe7\xc2#\
+\xdb\x11\xf2\xaaC\xe2gc\xc5\xa1|X\xe5\xfa\xc3:\
+w\x06l\xf2\x9a\xc2&O\x83\xd9\xe4)\xe0\xcf\xc2\xb9\
+D\xb8u\x00}\xce\xc5)<\xc6h\xfd5\xb8\xf3U\
+I\xf1\xd8G\x06\x99\xa3\xbbE\xe2\xac \x8crr\xb2\
+\x9b\x855\xc9\xcdQ\x07\x7f\xc7\x14\xae\x1e`\x1a \x7f\
+\x09\xce\xc5l\x81Z\xdf\x0e\x8d\x96\xe7\x87!\xf6\x89\x03\
+N}\xd1F\x1d\xeb\xd8@\x95\xf1\x8e\xf9\x0b\xc4\xfew\
+\xc3\x95\xac\x8fY!\xea\xfe\xcc^\xb6q\x9a\xb1\xea\x86\
+z\x9a\xd6\x97\x8e\xa0\xb4\xc2@\xa8\xe2\xf2\xa8u{8\
+4\x8d\xcc\x0b7#\xea\xc1:Tp\x0du\xc7\xd3b\
+\x04\xbdTS\xe4\x9cA\x86?Ve!k\xc6\xcaY\
+\xb5\x9a\xd2R\x98\x924\x16\x96\xb9\xcdPG\xa5=\xea\
+M4\x8c\xee\x85\xc5\xfb\xdb\xc3&O\x8b\xd9\xe4)+\
+\xac\xce\x13\xf0#p\x0e\x85\x9b{\xb0/\xc0\xa1A\xda\
+p\xe7\x10\xd3.\x9b|\xbb\x0c\xb3Pk\x96\x11\x83\xfe\
+Q^\xf0\xb6\xb7\x9b>\x0f\x07+TA\xfe6\x9c\xd7\
+c\xc6\xba\xc3\x1btZ\x90\xd6\x93y\x94j\xd4\xe7\x9c\
+\xa1\x8e\xd4\xf8\xa1\xa2\xae\xa2\x19F\x82\xdb\xf9L\x04^\
+_\xc6\x8a*\xebC&\x0a][\xf6\xdaT\xe2\x87\xd8\
+g\xe6\xac\x86\xcb\xa3\xd6\x8e\x9e\xddU'\xaeH3\x85\
+\xf7\x9d\xbd\xeclEo\xad\x05\xb1\xcd\x11\xfdz\x06\x0a\
+\xca\x15\xf1\x1d\xb8\x93\x02\x0b]\xec/\x16\xcd\xc9\x14\xe1\
+G\xe3\x5c\xc2^\x1e\xc6\xd8\xe2]\x88\x88q\xd7\xb8\xb2\
+\xdaF\x08\xda\xe2,\x8a\xdf\xec\x88'f6\xf0\x92\x1b\
+\xa2\xd2Z%\xed\x11\x03\xf9{Y\xe7\xb6\x80\xcd\x113\
+D\xbd\x88F\xde{u\xd4\xc1\xaf3\xc9\x88\xfev\xa3\
+\xe1x&\x04io\x8c%\xb7\xb8\x00\x99\x85\xbd\x8d\x1a\
+\xb5]\x95a\x81\xf87\xfe\x8cs\x01\xb58g\xccR\
+N\xbf\x97\xf6\xca\x93\xe1X_\x10\x06\xdb\xe3E\xd8q\
+\xd7\x9c%\xbd\xd5\xc0?\xd1\xe7G\x82\xa4\xf2&\xda\xdc\
+?\x8c\xc9\x07\xc3\xb1%\xd8\x13\x16nR\xb4\x00\xf9\xdb\
+Y*\xe8k54\xcf\xd9\xa2d\x9d{\xb2\xe1\xd2\x8c\
+\x08\x04\xdf\x0d\xc2\xfe\x8f\x83Q\xc7\xc7TA\xe2:\xd7\
+\xbf/V\x1c\xf3\xc3\x95\x9f&\xa2\x16/\x85\x9cv\x13\
+\x87\x85Hy\xbb\x1d\xb9\x9f\x9a\xa2\x8e3\x86M\x94g\
+\xf4\xdf\xaa\x87\x99\xc9\x83\x98\xf5\x11e\xfc\xff\xe0\xd3\x15\
+A\x1e\xe4\x1f\x83s\x05\xb6\xb2\x95~\x83^\xf3\x93:\
+\xf1G\x82x\xe5\x9c\xed}\xb1\xe6\x84+\xce\x7f\x1d\x8f\
+o<2@3\x9deg\x92q\xf2\xcddV\xc1\x95\
+ \xf3!\x09J\x93G\xc7\xce\x86\xffug\x94\xfe\xd4\
+\x13\x84\xfc(\x15\xdb\xe5\x85k\x16c\x9b\xab,:\x9d\
+\x86\xeb\x95c\x84J.\x8f:\xa2\xe5u\x9b\x0e\xd8x\
+\xde\x1dQO\xd7\xb0O\x5c\x012e+\x98\x82\xf7\x8c\
+]\xc3\xb1\xae$\x14e\xbc\x0d\xfeb\xe9\x9b\xd0\x1f\xe4\
+\xdf#M\xb1m\xb3^\x8e%\xdb\x11\xfbl\x09\xe3\x5c\
+\x1eu\x98\x0d7\xd4\xd0]\x16\xbf\x08q\xaf\xa3\xc0\xb9\
+\x80Z\xf7\xd4\x99\x22\xfeJa\x1f\x9bA\xe6\xd3a\xa6\
+X\x16\x05\x17\x90\x7f\x8fE\x03\x0d\x1bu\xb2\xc9^\x81\
+\xb87\xdbq\xf6\x99\x22\xa6\xf8\xd5\xc7a\xdeF\xe9\xf0\
+W\xc6\x9fAN\xa7\xd5\xda\x99\x88}n\x85\xbdU\xea\
+\xf8\xc1\x1a\x0d7WC\x09W\x83LI\x82X\x94c\
+\x825=\xb5\xda\x5c\xc7\xe6+\xbb\xe0z\xb3m\x1a/\
+\x12\xce\xad\xc0\x16\x90\x7f\x0f\xce!nTo\xe1\x14\xe6\
+{7\x1b\xc1\xd7\xa6\xc1\xee\x84\x15b\x9e\xae\xc2\xc1O\
+-\xf8#\xb1h\xd2\x985\x0a\xf8\x0b|H\x86\xde\xa8\
+\x9e\xb3\x9d\xe4w\x9e\xeb+\xdc\xe7r\x9c3\xf1\x81y\
+\x08\xb0\xeb\xaf\xf0\x16\xc3\xb6<\xc6\xb2=\xce\x1e\xef\x1e\
+\xb4H\xb5\xafg\x06\xf2\xef\xc1\xb9 \x9a\xd4s\xa6n\
+\xa7\xf9{V`A\xe6N\xd8\x1e\xb7\x85\xf7\xb5v\xf8\
+\x0b}>\xc4T\xc3\x17\xc0\xd1p\xe8\xe6\xcb\xb0?<\
+A\xf4\x8c\x8b8\x97\x08\x87\x97cL\xcc\x04\xd1}Q\
+\xd3\x01\xb7;\xf4\xb0\xb8:0\xabj\xd9\x87<,\x03\
+\xf9w\xd9*hJ\xe6\x0d\xdc\xac\x86\xbf\xc9\xe5`\xe8\
+\x86\xce4\xca\xae?q\xe7A\xbc\xe4\xaa\xa8\xc59$\
+\xfbMpz\xc2\xd8)\x0f\xe6\xf7\x1c\x5c6eyv\
+~\x96\xad\xf3~\x90\x1f\xcfz\xadxXK\xd3\x05\x83\
+\x11\x1c^\x0f\xffb\xbcR\x95U\x1dB\xf7u}{\
+^\xd7\x0e\xbe\xb8\x8e\x15|\xa9\x8fZ\x9c\x0b\xa2\x03\xf3\
+!u5^\xf9\xdcf\xea\xc6\xc7!\xf3\xccOO\xec\
+o\xf1\x04\xe4\xc78\x1d\x876\x11\x9epr\x95\xe2\xae\
+\xddF\xa4\x9b\xad\x1ea\x84\xf9\xb6*\xf8\x97\xbb\xef\x86\
+eRc\xdb\x12\xc1\xec\x80\xad\x88s\x11jq.\xcf\
+\x8e\xacF\x9f\xa4\x99\xa3\x9f\xe8O\xdb\xf9\xf2j\xac\xfa\
+\x86q\x0d[=\x06\xf9\xf3\xf17P9\x9d\x08;\x7f\
+\x97\x06\xc9K\xec\xfbL\xf4\xdf\x01\xed\xa4\x90\x8e\x9a\x92\
+\x09+\x04\xfcE\x98U^Cl-\x9d\x89\x98\x97\x93\
+\x05\xceE\xf8\x07\xe0\x5c\x10\xef\xdb\x0cc\x871K\xef\
+\xc2\xf9\x99\x07\xbe\xc19\xc49spp\xeed\xffw\
+\x1b\xbc\xbd-\xa3\xe7 \x12\xe4\xcf\xf7\xe6(\xda\xdeL\
+\x15r'\x98v\xd8!\xde\x13\xab)\x95\x8a[\x0f7\
+\xc2\xc4\x16G\xcfw\x16^p9\xfc \x22\xab\x5c\x09\
+\xacr\xc7\xc2*w;\xacr\x0b`w\xca\x05\xd1\xaf\
+\x06\xe0\xef\xd2}\xc9$,?\xbd\x82q.\x82\x0c\x7f\
+\xa5\xc6\xf8S\x8c4\xed\xd6\xeaV\xab\xc0k\xde\xc8\xfb\
+\xa4\x8d:8\x17D\x07\x17\xc1j\xbb\xf1\xaa\x17r\xb3\
+v\xc5\x85\xc485\x06\xf9\xf3q\x0eqi\x12N\xb8\
+:\xb4\xces\x9469)\x95\xe2\xcdRs\xac\xd7s\
+\xda\xac\x8d\x1faBJ\x17X\xe5:\xc2*\xb7\x00V\
+\xb9;`\x9dk\x02\x9b\xbc\xe6\xb0\xc9\xd3`!\xcf\x14\
+\xf0\x17*vB\xc39\xbaX\xd7\x5c\x09\x8f\xbb6V\
+=\xd2n~\xc1\x02\xb6\xf4\x99\x02j}\xca\xc5\x08\xbf\
+%=\x0f\xe8\xda\x04\xa7\xa2\xe4K_\xd4\xc1\xb92;\
+&\x85N\xc6,\xbdG\x98\xb0\xab\x02\x99\x17\x1a\x80\xfc\
+\xb9N\xc5\xa2\xf7N/\xc4;I\xf1\xd5\xcf]\xa9l\
+\xd9*\x1d\xaf\x91;\xf4\x14\xed\xed\x99d\x98\xa9\x01\xc3\
+\x9fe\xcd\xb9\xf6(\xf9\xda\xa34\xc4\xbb\x91\xee\xb0\xb8\
+\xe50?\xb8\x08+\xf3\xba\xc0&O\x8b\xd9\xe4)\xcb\
+\xad\xce\x13\xf0\x17\xe1\x5c\x89\xa5L\x81\xf9\xb4%\x87\xd2\
+\xbd-\x1c\xa43\x0cL\x13Z\xcc\xdc6?Z\xbaU\
+;\xc8:]E~\xfe\x1b\x01\xb5j\x92\xd1\xea\xc2\xf6\
+v\xbez\xfd\xe6\xdeE\xde\xa7\x85\xf8\x06\xe7L|\xc0\
+\x14\x09\x96S\xbc\xdebq\xca2\x90\xff\x9d(\xf4\xa1\
+\x182\xbc\x92\xa9\x5c\xcb\xc5\xa4L?X\x1f\xde\x89\xa1\
+\x97\x12\xe4\xef\xc3h\xb8\x1d\xce\x14)ir\xce\xf0?\
+bV\xb9\x0d`\x95;\x1bV\xb9\xd1XU\x98\x89\xdd\
+\x8f\x8d\xfcN\xdfTY1;V\x99-\xde_Od\
+\x93'\xc6_D\xf0:!\x11\x9d\xe2b\xc8p\xce\xc4\
+i\xb3\xe1\xe42n\xd2c\xadn\x867\xb5g\x05\xf8\
+ciLC\xfc\x8a\xcf\x0501\x1f\xd6\xaeDo\xc3\
+\xe9]\xd8\xf2\xacW=\xce\x19jq.\x12\x0e-\xc5\
+\xec\xe0\xe9K\x130-\xd1\x00\xe4\xff\xc5+\xc5\xa2\x9c\
+\x00Lv\x91\x06,\x82\xe3\x85V\xf8\x05\xce\x9b\xd0\xd2\
+\xc2\x16s\xf5f\xe9\xcfP\xde\xb4\xaf+\xbb\xce\xebA\
+\x86s1;\x10$\x88^\xbf\x82\xdc\x8d=\xd8\x1b\xe6\
+\xd2#\x0a\xcb\x97\xf6\x14q.\xc2\x7f\xa1\x81Y\x96\x08\
+V\xb9\x86\xb0\xca\xdd\x06\xab\xdc\x02X\xe5\xba\xc3:w\
+\x1clNh\xc3\xebj}\xf3\x8a\xb7\x02\xfeB\x82b\
+\xd3)\xe80\xcf[~^\xe4Zl:5\x82\xbd\xe1\
+\xf2\x9c\xcb\x099\xeb\xd1+f\x82\xca{\xe8\x8c\xafB\
+\xf0\xd3Y\xa2\x83\xafE\xf8\x15\xfc\x19tb\xd7\x88\xdd\
+\xed\xa7H\xefbA\x8e?\xce~i\x8e:.'\xcb\
+\x0b \xbf\x8eWB\xa78\x0d\xfe;\xddLsa\x7f\
+~\x88\x98s\x06\x99\xb2\x225v;\x0bz1>\x88\
+\xf2pB\xd9\x16\x17\x84g\x07!Mj\x8d0\xb3-\
+;\x8d\x11\xf2\xba\x11jq.\x88n\xa5c\xd1\xf1\x88\
+\xe6'`<q6\xe3\x5c\x82?hB\xfbq\x1a\xed\
+gE\xaf\x84\xe5\xe1\x00X\xe7\x9a\xc0&\xaf\x05l\xf2\
+4\x98M\x9e\x22\xfeB\xfb\xec\x99\xbat\x10\xcc\xbb\xa8\
+\xe1v3M\xcd|\xb3a]\x22\xe7v\x19\xf0L\xc9\
+ \xf8\xb6p\xa6r$\xbb\xcc\x158\x87\x5c\xea\x0c\xe4\
+\xcf\x9b\xe0U\x09\xab\xb4\xd9\x02\xe7b\xfc\x0a\xfe^,\
+*\x09\x83\xce\x85\xb5-\xd3{\xab\x1b>h\xe1\x98\xef\
+\x87\xe4\xcbm\xd9\xc1\xbb\x8a\xf2\xaf\xb9\x00\xf2\xdbx%\
+Szs\x0f\xd3\xd3\xb7h\x94\xf7\xb5?5\x0f\xdb\xae\
+(B\x86s&:\x1e\x03;\xcfM\xf5\xb6\xc1\xa4Y\
+\xe7#\xbbE\xcd\xee\x9e\xc4\xc8\x93I\xf0\xd9.]\x92\
+\x05\xe7\xbb\x03Q\x8bsU\xf6\xb8\x10Z7R\xf0b\
+\xfc\x9caN\x08\x0d\xd6R\xe2\x9c\xe1\x0f\xb025\x14\
+\xf7k5_\x9dY\x1e\xd4d6y\xcar\xab\xf3\x04\
+\xfc\xc5\xf8cy\xa1\xd0[a\xe0\xb2^\xfa\xc7\x9a\x1a\
+m\xda\x8a\x89\xabZ\xc5\x99\xab\xb7y\xbc\x0d\xab,\x86\
+\x0c\xba\xa1\xe0\x94\x1e\x8e\x03\x9f\xbas.\x88\xf7.\xc4\
+J\xcf\xa9V\xe5\x98\x91\x92\xc88\x97\xe0w\x94g@\
+/\xc6\x04\xe1\xab\xc7Y\x17\xf7\x1b\xbfm?\xb3>\xb4\
+\x1c\xb7\xb8\x1a\xc8\xef\xbbx\x01\x06\xa9\xbe8\xe9\xe5\xe2\
+\xb6\x03\x1b/\xe8\xc6\xf3\x8b\xecu\x01\x86\xe5\x86w\xc8\
+\x98eie\xce\xb6\xae\x17K\xa50pwC\xa8\x8b\
+3^J7\xa9\xa7w\x90^\xd5\xad\xef\xc3\x19jq\
+\xce\xc47\xf7 2\xd1\xabK\x22\x16\xce\x1d$p.\
+\xc2\x1f\xd4Gi\x12\xc3_D,n\xac\x0e]\xd3Y\
+\xf0\xbe?\x92%<R\x15=\xe1b\xce\x99B\xfa<\
+\x85\x88Y\xd3\x1d\x0b\xe1\x5cl\x04\xa0-\x805\x03Z\
+\xa1D,ny\x01Fkmp\xe4\x8b&\xe7\x8a\xac\
+`;Z&Mk\xf3\xbe\xc1\xe4\xdd\x95\x08>\xdeD\
+\x99s\x86\xdf\xc0_\x8b\xc4\x9f2\xa0}\xc2\x15\xc6\xa1\
+\x0b\x87m\xd1\xeaa\xea\x82\xcb\xbc)\xc8/\xcb\x8fa\
+Z\xa1[a\xb1\xc1\x1e\xd9+7\x22\x22\xd2\x07\x87\xdc\
+6M<\x03\xfb\xf3\xa3^}X%)\xbb\x86!Y\
+\xdejo\xad6\xccJ\xdd,\x95\xbf$\x95\x22O*\
+\xc5:\xa9\x14z\xf6Rh-p\x8b\x95C\x1d\x9c\x8b\
+\x85[\x19\x98T\x1c\xd3\xf8\x1c\xa6\x8c[\x22p.\xc2\
+?\xd0\xe2\x01\x83\x06\xf7n\x88@U9\x85W3z\
+\x0d93i\x88\xedy\x91\xcdNo\xe4\xd4t\xf9\xb4\
+\x0fm3\xed\x1a\xc7\xe8\xf45y\x80\x81s\xcf\x01\xb8\
+\x01\xc0\x1f\x80\x11\x00m(\x8eQ\x15g\xdc\x17 \xc3\
+9\x93\xa4\xceB\x8a\xc5\x14\xcf\x0a\xccO\xb5\x108\x17\
+\xe1;\xbd\x8d@\x93\xf9\x03F\xca\x81\xfc\xb2\x8aB\xa6\
+y)\x0d\x1b\xfd\x9c\xb1w\xad=\x16\x1e\xd8\x05\xa3\xb3\
+\xfb\xe1\x97\xb4\x05o\x168dY\xc2\xa5D\xfd\xeb\x03\
+\xe5\xb1\x19\x81\xb8\xe0\xea0 \xdf|\xe3\x9ci\x9b\xdd\
+:5\x96J\xa1\x22\x95\x8a\xc4\xa9;\xd0@o\xe6h\
+]\xbc\xe5\xca\xa8\x83s&\xbe\x91\x02\x93\xd5V\x03\x95\
+\xf0\x0f\xc2_\x09\xe2\xd0\xe9\x98g6v\xf9\x89\xe1\x06\
+\x96G\x06M\xb0\xdb\x9a\x18\x11\xd0!\x7f\x03\xa6'Z\
+t\xdb\xd7\xb5\xdf\xd2\x87\xf0|\xe7\xf6:pp\xfdW\
+\x0eH\xeb\xa2\xde\xfe\x03,\xa4\xd1\xb0t\xee\x00UU\
+\x0d\xc6\x98\x82\xcbXAn\x9a\xe1\xb6\x81\x98\x9b\xddW\
+\xe0\x5c\xc4\xb9H\x94\xb1\x0cs\xfc\xa7.\xbc\x0e\xe3d\
+3E\xce\x19\x08!\x84\x10B\x08!\x84\x10B\x08!\
+\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\
+\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10\
+B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\
+\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08\
+!\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\
+\x84\x10B\x08!\x84\x10B\x08!\x84\x10B\x08!\x84\
+\x10B\x08!\x84\x10B\x08!\xe4\x1b\xff\x07a\x85Q\
+)4\x8d+\xef\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00/\x9e\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\xa8\x00\x00\x01w\x08\x03\x00\x00\x00\x06\x8a\xf0\xc8\
+\x00\x00\x0c\x15zTXtRaw prof\
+ile type exif\x00\x00x\
+\xda\xad\x98i\xb2$\xa9\x11\x84\xffs\x0a\x1d\x81\x1d\xe2\
+8,\x81\x99n\xa0\xe3\xeb\x0b2\xdf\xd6\xd3\xa3\x19\xc9\
+\xf4\xaa\xab\xa8\xce$!\x88\xc5\xdd\xa3\x9c\xfe\xeb\x9f\xc7\
+\xfd\x83\xbf\x14su\xb9\xb4^\xa5V\xcf_\x96,q\
+\xf0\xa5\xfb\xe7O\xeeg\xf0\xf9~\xde\xbf\xf1q/\xfc\
+\xbc\xeeZ{\xbfF\xc6\xc4\x98\x9e\x1bm\xbc\xf3\x07\xd7\
+\xcb\xd7\x03\x9f\xeb\xcc\x9f\xd7]\x7f\xef\xc4\xfe.\xf4\xde\
+\xf8X0\xd9\xce\x91/\xfb\xbb\x91\x5c\x8f\xcf\xf5\x90\xdf\
+\x85D\x9f/Uz\xfbn\xea\x8c\xcf\xb8\xde\x89\xd7\x94\
+\xf7\x9d\xda]\xfas\x11\xfb\xbf\xfb~!7\xbc\xb4\x0b\
+\xb3R\x8c\x9aB\xf2\xf7\xb3?\x16${\x874\x18\xf3\
+\xfd\x14\xe6\x85{%'q\x0c\xdc~-\xc1!?\x8e\
+\xf71z\xff\xddA?\x9c\xdc^\xcb\xdd\xaf\xde\xff\xfc\
+\xf6\x8b\xf3\xe3x\xaf\xa7_|Y?\x16\xaa\xbf\xbf\x11\
+\xca\xef\x9d\x7f]\xfcm\xe3\xf4~s\x5c\xfeq\xa3u\
+?\xffp\x9c\xf7}\xce\xee\xe7\xe8s\xba\x91+\x1e\xad\
+oFy\xf7\xe1\x1d{\x86\x89,\x92\xd3}\xac\xf2j\
+\xbc\x0b\xdf\xdb}\x09\xaf\xee\x87_\x04g\xfb\xc5\x86\x93\
+\xef\x12\x22Q9.\xe4\xb0\xc3\x08'\xe8\x1dWX\x98\
+\x98\xa3F\xbc\x18c\x5cD\xc2\xae\xf5\xd4\xa2\xc4\x95,\
+N\xd9^\xe1\xc4\x96$\xed\xd4\x09\xd6\x8a\xeaR\xe2r\
+\xfc\xb4%\xdc}\xe5\xee\xb7Bg\xe7\x1d\x98\x1a\x03\x8b\
+\x05\x1e\xf9\xd3\x97\xfbO7\xff\x9b\x97;g\x99\x8b\x82\
+\xef\x8f\x9f8\x11vE\xcb\x0e\xcc\xb0\xc8\xd9'\xb3\x08\
+H8o\xdc\xcau\xf0\xc7\xeb\x0d\xbf\xff\x96?\xb6H\
+f\x9a\xb9\xb9s\xc0\xe1\xe7\xb3\xc4,\xe1+\xb7\xd2\x8d\
+sb^a|\xaa\x22\xb8\xb6\xdf\x05p\x11{\x17\x8c\
+!\xeds\xf05\xa4\x12j\xc0\xc4\xd8B\xc0\x8f\x9d\x00\
+\x0d,\x8f)\xc7I\x04B)qcd\xcc)\xd5\xe8\
+Z\xec\xd1\xf6\xe6\x99\x16\xee\xdcXb\x8dv\x19l\x22\
+\x10%\xd5\xd4\x88\x8d\xa4A\xb0r.\xe4O\xcb\x9d\x1c\
+\x1a%\x95\x5cJ\xa9\xa5\x95\xee\x8a\x94QS\xcd\xb5\xd4\
+Z[5\x90\x1b-\xb5\xdcJ\xab\xad\xb5\xde\xa4\x8d\x9e\
+z\xee\xa5\xd7\xdez\xef\xd2\x87DI``\x91*M\
+\xba\x88\x8c\x11\xdd`\xa3\xc1Z\x83\xf9\x83+3\xce4\
+\xf3,\xb3\xce6\xfb\x949\x16\xe9\xb3\xf2*\xab\xae\xb6\
+\xfa\x925v\xdci\x03\x13\xbb\xee\xb6\xfb\x96=48\
+\x05)4k\xd1\xaaM\xbb\x8a\x8eC\xae\x9dt\xf2)\
+\xa7\x9ev\xfa\x913>\xa3\x16\xde\xb2\xfd\xf5\xf5_D\
+-\xbcQ\x8b7R6\xaf}F\x8d\xab\x86\xd9\xef\x12\
+\xc1\xe0\xa4X\xcc\x88X\xcc\x81\x887\x8b\x00\x09\x1d-\
+f\xbe\x87\x9c\xa3E\xceb\xe6%R\x14%bd\xb1\
+\xd8\xb8\x1d,b\x840k\x88\xe5\x84\xcf\xd8}E\xee\
+o\xc5\xcd\x95\xfe\xb7\xe2\x16\xff*r\xceB\xf7\xff\x88\
+\x9c#t\x7f\x8c\xdbo\xa2\xb6\x8d\xe7\xd6\x8d\xd8S\x85\
+\xe6S\x9f\xa8\xbeSj\xda\x11\x8b\x1a'\xed'\x8f*\
+*E1\xd0W\x8e>\x84\xfd\xea\x189\x86n3\xaa\
+\xac;\xc0\xb4\xd8\x89\xf9A%\x9fz\xc7R\xbbwu\
+\xa70\xc7N*}\xf3 \xfc\x87\xc9Qf\xd6;\x10\
+\x91`7d\xdc\x95v\xc2\xd01\xb3\x8f%d\xfe\xf9\
+@\xa9\xb2\xe2N\x8e\xd9w\xab\x8cM\xeas\xf1k\xd4\
+Y\x12\xae\xda;\xb2n\xbf[\xef\xd1\xb07\xaf\x01\x97\
+\x0c[\xf7Z\xb9\xc7\x1d\x0b\x17\xa7\xcb\xab\xea\xcc\x87\xb8\
+a\xef \xd3lE\xcc\xbc\x87\xdd\xa5\xf7{\x03\x8b\xda\
+;\x8eOs\x96\xd7\xee_\x9fdwO`~\x82v\
+c\xff\xf2\x0e''U\x92\x7f\x96]6\x144\xc3\xb6\
+m\x97=\xa3\xfb\x8e\x03M\xb09\x84c\x9bV\xae\x9b\
+\x0a\x050\x1e\x87\x92\x87\xaa\xb1d\xd8\x86\xccouO\
+\xd5\x84\x0b\xb0|\xc3 \x0d\x8cZvc\xcd\x88\x93\xaa\
+\xe2\x10\x97f\xd0\xb3B\x12%\xe0\x22\xfeH\x98qY\
+\x5c\xc8\x82\xbd\x96)\x00\xaf\x8aK\xe7N\x1cx\x1c\x9c\
+\xe2m\x1e\x0c\xc1\xb3\xd4C\xae\xa4\x88\x8b\x99k\x05\xb6\
+)a7c\x9e\xd3\x86\xd44K\x91S\x17\xb1\x86\x8a\
+\xac\x12\x17\xb9\x8fOr\x1b,iZcn\xc0\xf4l\
+!\x93g\x8d\xc9M\xf2Y\xa9\x90\xc5b\x95\xbcD\xc6\
+i\xc3\x97\xb5\x17\xb0T\xd7\x5c\xbbO\x0bZL\xc3\x7f\
+\xf8\xf3+\xef\x16\xf5\x12X\xb6:\x1c\xae\xf8\xaa\xe5\x9b\
+{w\x16\x93\xa3B\xb4\xd4\xd9\xca;H\xcb\xbc} \
+\x12M\xb1\xd4\xd7\x01iJ\xed\x91\xb2\xabg\xaf3C\
+\x8en\x9a\xce\xc9\xea\x1b\xa4\x19\xb6\xca\xdevT\xa9\xdb\
+R\x06\xcd\xb3\x00:\xf3\xfc\x9a\xa7u%-|\xc3W\
+E\xa85en'\xf7j\xdd\x1d\xa6mqI\xac\xa9\
+\xef\x95:qI\x9b\xfc\xcd\xfb\xd4*g\xedM\xf1\xed\
+Y\xb8w\xb6\xc69\xdb\xa8\x00\x95R~|#e8\
+\xb6\xe6\x89K\xc4\xb5\xa1\x0a\xfc\xd4]c\x1fKC\xd9\
+\xbda~;\xab\x8fQbf\x9fA\xa4\x05\xe9\xe1\xf7\
+\x5c2\x9b\xe2\xa2\xad\x96\x97\x8d;+\x9c\x1dg\xce.\
+\xa73\xb7\x04\x10|\xe3:\xa2\x0cx\xa0\x81)\x1bo\
+\xbb\xe6V'\x0b\xcc\xd4$\x85N\x0e-\xf1\x89\xf0\x80\
+f@\xc9\x0cd\x5c\xeek\x0b%\xc2\x9c\xd0rl~\
+\x81\x93\xcbt\xd6\x89\x85\x10\x02\x11\x12\x96\x1f;\x98\xfd\
+\xd5\xb3\xd0\x01DfKJ\xee>\x058;\x12\xa7\xd5\
+HA@\x90{\xfdZN\xdb\xf8\xf6\x8f\xf5Du\xb6\
+\xb9k_SY\x1b\xb6\x1d\xbd\xb6X\xa6q\x81\xba\x9e\
+\xe6\xa6\xaa\xb6*\x10\x07\xf9\xa6\xc44b\xb6\x06\x14\x90\
+='i\xe7X\x09j3\xfcM\xe0\x03\xa7\x95TN\
+\xd9Y\xaaV*\x89\x12hn-\x1c*\x12\x03Ao\
+>Q\x9e\x07\xd4\x1b:\x08s\x8e\xf9P/\x0dHZ\
+\x11d\x1es\x86\x99\xc4\x97\x8e}\x87\xc04\x04\xd9\xa6\
+.k*.\xc3\x0dq\x22\xd6Q\x13\x10\x05\xa9\x18/\
+\x01\x8d\x99\x8c_:\x9f\xd8\x18\x07\x11U/`\xf6\xc4\
+\xec\xb3\xa0i?)-\xddg\xe9!\xcb\x9c\xd4\xb65\
+\xe0\x04O2h\x1b\xc7`\x84\xa7 \xa0\xc4\xe1 \x0a\
+\x1a\x82q2\xeac\x83\xe4b\x01\xab/\xaa@\x15T\
+;\x08@Z\xba\x0e\xe0Q\x8fy\x92\xb2\x84R\xc8N\
+\xce$iIb\xcd\xf2\x22\x8f\xc1\xef\xcc\xf8u6b\
+\x83\xc7\x0c\x9d/\x8a\xd6\x17E\xdd\x85\xd17\x98\xc1_\
+\xb8\x04\x98\xf5\x19\x89\x02\xe6\x00\xdds\xe7v\x82\xe7\x18\
+\xdd\xd2\x13Wm\xc2\x85hJ\xd4\xacB\xb8\xcbyC\
+6[\xe8\x01{\x96\xc3n\xb2\xed\xd9\xf6\x13\xbcq`\
+}P\xfb;x_Ke\x19V\xba/\xb0,i\xa6\
+npF\x5c\x81}2vG\x8fMK\xb7%\x1b=\
+\x017+\xdd!p\xf6\x00)\xa5`uG:y\xa0\
+v\xc1\xb7\x8b=\xa6B\xd1aO1O\x22\xeb9\xdd\
+ \xa1=\x8c\x09\x8d\x93\x86\x15\x7f\xf7\x85V6\xb1\xe7\
+\xeb\xa9\x0ak\x0f\x8e\xc6\x8a\xb3\xb9)f\xc4\x88\xd4\xa8\
+Q;)\xd1\xc1/\x0e\x0aT\x10\xd6^4\xcc\xda\x84\
+\x95\xc9\x9e%T\xc9`7\x164\x08l\xe4\xf4Y\x11\
+\xd4\xc5\xd9P\x1a5\x1c\x1b\x5cUq\xe9\x1a]\x07+\
+\x12\x1c\x7f\x0cy\x9a\x91\x82\x9f\xb3R\x8b\x98$8`\
+b\x13\xc9\x12\xf2n\x89\xec&\xc7\xd2q\xad\xda\x1d\x01\
+R\x11\x0c\x0d\xf5\x90LU\xe4\xdeC\xef\xa5Q\xf1\x89\
+l\x1dJ\x91\x810D#L\xf2]R\xdd\x08\xa4F\
+\x93c\xa8L\xa2T'VB\xf0`g\xc5!\x16\x04\
+(\xfd\x0et3Z.\x1e\xbfpLVZ\xdd?\x9c\
+\xce\xa5\x85R\x8e\xe4q\x9b\xec\x08\xf77<Fm\x8d\
+0\xa0'\xf6\x9d\x99\xc3-L\xf4h\xa6\xeb\x8e\xc3z\
+\x8b\xf6\x0aqD\xcd\xa3\xc4\x12\x9c%\xd0\xe1(h\x1f\
+\xe8\x81\xd5]@\x8c\x83O\xb9\x873\xc4jj\x96\x83\
+@\xca\xb1\x9aH\x87U{\xd9\x89.\x8e.I\x0c\xfa\
+\x95\xea\x99\x12\xda\xe2\xcb\x8c\xd2\x0b\x15\x82r\xcaN\xac\
+u\x22\xb0b\xdb\xaa\xb1)K\x01\x98\xb9\x05\x92\x0ew\
+\x9c\xa8\xb9\xb6~&\xfeWFSW\xb1n\x85\xe8`\
+\x13(4H<C\xdd\xc0\xed\xc4\x82\x0a\xa4\x0ai\x1b\
+\xc8\xff\x93z\xb1\xf6\xfa\x14\xe4\xd9\x1ax\x93I\x835\
+R\xa4(\x11o!-\xce\xb4*\x0c\xd8p-\xec\xab\
+\xddE8\x18(\x04%}'\xaf\xa1n\x90c\x938\
+a\x00\x1a\xb0E\xa0\x1c\x8a\x81O5]*\xab\xc0\xaf\
+\x8a]y\xacRr\x0a\x94\x1b\x09\x05\xb05\xab\xb9\xc1\
+_\xec :\xd2\x9a,\xf35\xcaS\x06\x13\xf6 6\
+8\xfdKo=\xa3\x95\x9f\x154|v\x88\x96\x8b\xb2\
+1\xb6\xe5l\x8a\x09\xf0\x0e\x88O\xb0,\x83`\xb3\x87\
+8\x96\x05\xa9\x13\x9eE\x06b\x179iD\xe1\xa7\xe9\
+\x5c\x00\x8d\xc4E\xbd$\xefR\xde\xfe\xd1\x99\x0bm\x8a\
+\xec\xf2\x02\x03\xb6\x82:\x88y\xa0\xc9B\x82\x7f\x01\x02\
+\xe4\xbb\xd0\x82/\x044!\x03Qq\x07\xa4{H`\
+\xd8v\xbbf<\xce\x17\xa0\xaf\xa30(\x0e\x92\x0c\x85\
+\x83=\x87\xf5Z/\xf8\x02\xba\x9e\xf0v\x03l\xe3\x86\
+\xec\x87\xa6\x81!\xc5\xe4\x18\xea\x1cG\x1ezZ2\x01\
+(\xe1\x0c\x9c\x90n\x0e \x06?\x0f\xf1\x87\x22\xb3\x22\
+\xfe\x97\xf5}@\x0c\x0d(%\x22\xa9\xebD\x8e_\x89\
+\x88h\xc1\x11\xac]\xdd|thK\xcfH%\xdd\xaa\
+@\xc6\xe5\x92\x92\xae8\x17\xa0\x8d)&\x1e=\x8e$\
+\xdb\xd9x$\x8b\x97\x87\xe6\xc4b\x86bkF5H\
+\x1c\x8c\xd5\x8a{X\x8b\x9a\x03`Es\xa0\xb5'%\
+f7!\x86S\x98\xb6h\x05\x80\x14\xac\xb2m\x01@\
+\x0d\xad*Np\xc84r\x0ch\xe2\xb4\xbb\xc34%\
+\xe0\x1d\x06\xb2$\xda\x8f\x0d\x88\x1fY\x8a\xc2\xa8\x22\x1a\
+\xec\xc7\x89\x92\x97q\xdfD\xcb\xa1\x02\xb4c~\xee\xee\
+Q\xf5\x146k\x93^\x9f\xc5\x9e\x7f\xe8Z8|&\
+\xfb\x81bA\x92bM\x13\xa7\x94a\xc8\x1e-}\x86\
+8\x04:\xb5W\xe3\x8c\xc9\xda=\x1e\xab\xf4 i{\
+\xf5\xbcIgM^A<\x02\x07\xc6)H\xe2\x17P\
+\x5c\xc0\xcc\xd8\xa8vP\xdd\x04\x7fq-\x03g(\xf3\
+`\xbf\x5cP\x07~\xb13~D\x8aj\x02\x83\xa79\
+\x98\xba\xb2\xa2\xb8\x12M\x04\xad\x80\xf3Q\x9ax\xac\x99\
+\xd2\xd7S\xb2\xeb$\xefH\xfb@\x9a[=\x15A\xbe\
+,\x94\x17\x18\x87\xb4\xa28F\x10\xc8\x03\xf1\x0b9(\
+Y\xa7;.t\x049t\xc8\x8ey\xcc\xb7\xe8@G\
+\xe6'L\xe4\x5c\xf4\xbe\xdb\x1e\x033,U\x0f\xd5\x88\
+)\x08u2\x11\x9e\xa5\xe2u\xd1\x03(\xa6\xf2\x1fD\
+Q\x5c\x07\xe0\xa5\xb7E@{\xb7\x10\xa6\x85L^J\
+\xd2\x9af\x87\xf7\x80l%\x8bB\x02\x9a\xd3\x9cd:\
+h\xd2\x22\xfdr\xa2qC\x95\xc9\x06\x0er93e\
+\x04FE.\x0cW\xd2\xa9\x1d\x8a\x10\xe0\xa8\x91\xa2\x10\
+p\xa4\x8cxd\xecJ\xcf\x88&\x8e4\x9bp\x03\x9e\
+\xe8`\x8a\xfd\x80\xbaW\x81\x1b\xa0,\x9a3D$Y\
+\x8b\xce&\xc9\xc9\x8cm<\xe5\xd9\x87B\xda\x96\xa3t\
+\xc8,\x08\xb8f\xa4P\xc2a\xc5\x00j\x18\xdfOd\
+|C\x03\xd3\x05!\xe8\xe8\xb4\x80\x22A\xf9\xa3G\x0a\
+\xb8\x82\xa42\x19\x0c\xf9C\x0f\xf4\x0a7}\xde\xb6\x88\
+&\x86\x8e\xa3D$\x1b\x1d\xc3\xcf\x14\xb3\x9f\x8ar\xc8\
+\xee\xa5\x1e(\xd3Nj\xe9)\xcfH;\x87/\x14\x11\
+4G\xdfTE4x W\x0f\xba\x0cu?:\x8d\
+\xe8P\x84\x06r\x07\x16\xc9z\xefx\x84\xac\x02\xd6\x88\
+\x04\xc3\x1a\x0a\xcd\xd4\xf1\x0e&.p\x0c\xc2\x86\xb45\
+z-\x82\x0b2\xa4B\xc9Q\xaf\xb9,\xc8\x16\xf0t\
+<\x0e\xa9\x06\x8a\xe2\xd5+\xd6\xf4\x04\xd0\xe8W\xa9T\
+\xafT\xea8\xa1\xd3\xa3\xfd\x908\xd6\xc2Z\x89\xd8\x99\
+3\xb4\xf8\xd1\xc4Z[s>\xfb\xd7\xdb(\xd7G\x1f\
+\xb3\xd8\x8f\x0e\xdc\x7fu\x98\xee\x8a\xc1o\x9d\xeb\xd3\x8a\
+\xff\xd2\xb9\xbe\x9eW\xb1\xe6\x80\x1a\x90\xbb\xab\x00;\xb8\
+\xc8X|\x0d\xf7\x19\x99\xdb\xb0>\x8d\xee\x9f\x1b\xf0#\
+\x96?\xf6w\xbf3\xa0~\x09\x89?3\xe0\xb5\xcf\x82\
+=o\xb3\xef\xbe\xa3\xac\xb7\x9eo_\xe5Q>[\xe5\
+\x97\xe1\xa8\xed\xfc\x88YS#\xcfhs\xcc\xfd\x80\x9e\
+w\xd6\xcf\x8c\x0f\xf7\xbe\xbf \xfc\x1d\xef?:\xf8k\
+o\xf7?l\xfe\xdb\xbd\xdd\xb7\xcdI\xfa+\xb3\x1e\xcf\
+_\xb7\xd8\xef(7U\xfe\xf2\xdc\xee/\xf6N?\xd3\
+\xee\x97s\x7f\xdb\xda}\xec\xfd\xfcj2\xef\xf2\x08\xef\
+\xaf\x9fZL\xfd\xff\xd4\xeaT\x96%\x0a61\xe5c\
+g\xf7nMs\xb5\xc5\xfd\x1b\xe0\x90\x8b\xb1\x5cC\xdc\
+\xfd\x00\x00\x01\x85iCCPICC pro\
+file\x00\x00x\x9c}\x91;H\xc3@\x1c\xc6\
+\xbf>\xa4>*\x0ev\x10q\xc8Pu\xb1 *\xe2\
+\xa8U(B\x85P+\xb4\xea`r\xe9\x0b\x9a4$\
+).\x8e\x82k\xc1\xc1\xc7b\xd5\xc1\xc5YW\x07W\
+A\x10|\x80\xb8\xb99)\xbaH\x89\xffK\x0a-b\
+\xbc\xe3\xb8\x1f\xdf\xfd\xbf\x8f\xbb\xff\x01\xfez\x99\xa9f\
+p\x1cP5\xcbH%\xe2B&\xbb*\x84^\x11D\
+\x17\xcdQ\xf4H\xcc\xd4\xe7D1\x09\xcf\xf1u\x0f\x1f\
+\xdf\xefb<\xcb\xbb\xee\xcf\xd1\xab\xe4L\x06\xf8\x04\xe2\
+Y\xa6\x1b\x16\xf1\x06\xf1\xf4\xa6\xa5s\xde'\x8e\xb0\xa2\
+\xa4\x10\x9f\x13\x8f\x19tA\xe2G\xae\xcb.\xbfq.\
+8\xec\xe7\x99\x11#\x9d\x9a'\x8e\x10\x0b\x856\x96\xdb\
+\x98\x15\x0d\x95x\x8a8\xaa\xa8\x1a\xe5\xfb3.+\x9c\
+\xb78\xab\xe5*k\xde\x93\xbf0\x9c\xd3V\x96\xb9N\
+k\x08\x09,b\x09\x22\x04\xc8\xa8\xa2\x842,\xc4h\
+\xd7H1\x91\xa2\xf3\xb8\x87\x7f\xd0\xf1\x8b\xe4\x92\xc9U\
+\x02#\xc7\x02*P!9~\xf0?\xf8\xdd[3?\
+9\xe1&\x85\xe3@\xc7\x8bm\x7f\x0c\x03\xa1]\xa0Q\
+\xb3\xed\xefc\xdbn\x9c\x00\x81g\xe0Jk\xf9+u\
+`\xe6\x93\xf4ZK\x8b\x1e\x01}\xdb\xc0\xc5uK\x93\
+\xf7\x80\xcb\x1d`\xe0I\x97\x0c\xc9\x91\x02\xb4\xfc\xf9<\
+\xf0~F\xdf\x94\x05\xfao\x81\xee5\xb7o\xcds\x9c\
+>\x00i\xeaU\xf2\x0688\x04F\x0a\x94\xbd\xee\xf1\
+\xee\xce\xf6\xbe\xfd[\xd3\xec\xdf\x0f \x96r\x86q\xc1\
+\xd9U\x00\x00\x02\xbbPLTE\x7f\x00\x00\xa3m\x93\
+\xa4u\xa1\xae\x96\xd0\xbb\xb2\xec\xcb\x9d\xa4\xd7\xcd\xed\xbb\
+\xbb\xfe\xcb\xcb\xfe\xd0\xce\xfe\xd2\xd2\xff\xc8\xc6\xfe\xc3\xc3\
+\xfe\xdc\xdb\xfe\xc0\xbe\xfe\xb8\xb6\xfe\xd8\xd7\xff\xb3\xb3\xfe\
+\xe2\xe2\xfe\xeb\xeb\xfe\xf3\xf3\xfe\xfc\xfb\xfe\xb0\xae\xfe\xf0\
+\xef\xfd\xad\x80\xa3\xf9\xf7\xfb\xaa\x9b\xe0\xad\xac\xfe\xa4b\
+{\xbc{{\xbd\xb9\xf5\xbf\x80\x80\x911=\xa7PP\
+\xa9SS\xca\xc4\xf2\x95,,\x96@S\xcc\x9b\x9b\xcf\
+\xcb\xf7\xae\xa6\xf1\x9cSm\xdc\xb9\xb9\xe0\xdf\xff\x9cZ\
+{\xb5\xb0\xf4\xee\xe0\xe1\xb7pp\x9eAB\xf5\xec\xec\
+\xbb\x83\x8f\x8f !\xbe\xb1\xe4\xd5\xac\xac\xce\xa0\xa1\xbe\
+\xa8\xd3\xb2lr\xd7\xb0\xb0\xdd\xc2\xc8\xed\xe3\xeb\xa9v\
+\x99\x8b\x22,\xb6\xa9\xe4\x9dj\x98\x89\x13\x14\xb9ss\
+\xb9vx\xb9\x9f\xcc\x9fh\x90\xa3\x81\xbb\xbc\xa2\xcb\xbc\
+\xaa\xdb\x9c::\xa6q\x94\xc1\xbb\xf3\xa6\x88\xc2\xc4\x91\
+\x98\xc5\xba\xea\xc6\xba\xe5\xc6\xc0\xf4\x95Ji\xa8\x85\xb9\
+\x9601\xcb\xaa\xbd\xb5ll\xaa\x84\xb3\xcd\xa3\xaa\xb5\
+\xa0\xd5\x8b\x1a\x1b\xd0\xa2\xa2\xacZ[\xd1\xac\xb5\xac^\
+b\xac\x84\xad\xaddm\x97V}\x9833\xb6\x99\xc4\
+\xdf\xdb\xf7\x99FY\x9a=D\xe4\xcd\xd1\xe6\xd0\xd2\xe8\
+\xe6\xfb\xea\xd7\xd8\xaf``\xec\xda\xdb\xb3\x92\xbb\xaf\x8a\
+\xb5\x9bJ\x5c\xf1\xe3\xe3\xf3\xed\xf3\xb1cc\xb1\xa3\xe2\
+\xf7\xf0\xf0\xf8\xf3\xf3\x8c&2\xb3\x89\xab\xba\xaf\xe8\x8d\
+,;\xb6\x84\x9a\xac\x8a\xbb\xba\xb4\xf4\x89\x1a\x22\xa1P\
+\x5c\xcb\xc1\xec\xd9\xb3\xb3\x85\x10\x13\x95C\x5c\xc1\x83\x83\
+\xa3Ta\xc2\xb4\xe2\xb0\x9e\xdb\x99CR\xb1\x86\xa9\xc7\
+\xa8\xc0\xb1\x8b\xb3\xa3\x87\xc6\xb2\x9c\xd3\xa5LL\xa5h\
+\x84\xb4s|\xb4\xa1\xdb\xb4\xae\xf3\x9aLb\x94Eb\
+\xa6\x8e\xce\xd5\xb8\xc5\xd6\xc1\xd5\xb6x\x83\xa6\x8f\xd1\xd8\
+\xd3\xf5\xb6\x90\xb2\x9bWx\xd9\xc6\xda\xa7`p\xa7\x90\
+\xd1\x9bd\x91\xdd\xcf\xe2\x8d0D\x8e8R\xe1\xc4\xc4\
+\xb9\x8b\xa3\xe4\xcb\xcb\xa9\x8b\xc3\x8b'9\xe6\xe1\xf4\x9d\
+`\x85\x90.;\xea\xe4\xf2\xbb\x9a\xbe\x905I\x9fE\
+M\x96Id\xa1DD\xad\x90\xc7\xa1MV\xaer\x86\
+\x924C\xa3j\x8d\x91,4\xc0\x86\x8a\x83\x0a\x0b\x9f\
+Rf\xbc\x93\xac\xc4\x8b\x8b\xc3\x9c\xb0\x89\x16\x1a\xcf\xc2\
+\xe5\xe9\xd4\xd4\xb1\xa6\xe9\xb5\xab\xeb\xc9\x94\x94\xa1n\x98\
+\xae\x99\xd4\x9eXs\xd5\xbc\xcc\xbf\xa1\xc3\xae\xa9\xf5\x9b\
+Us\xafx\x92\xc1\xab\xd4\xc1\xb7\xec\x87\x19#\xb6\x9b\
+\xcb\xa4r\x9d\xaal\x83\xb7{\x87\xaar\x8d\xc4\xa9\xc9\
+\x92=S\xaa\x98\xdc\xb1\x92\xc1\xc7\x91\x92\xa4z\xab\xba\
+\x95\xb5\xe8\xda\xe3\xba\x9c\xc3\xca\xb1\xcc\xba\xab\xe2\x94;\
+L\x9a\x5c\x82\xae\x95\xcd\x959F\xa2Ym\xcf\xbb\xd7\
+\xb4\x85\xa1\x9dc\x8c\xbc\xa5\xd1\x99Om\xa6x\xa3\x91\
+$$\x9fo\xa1\x0a\xf45\x22\x00\x00\x00\x09pHY\
+s\x00\x00\x0b\x13\x00\x00\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\
+\x00\x07tIME\x07\xe5\x04\x09\x091\x17H\x8ap\
+!\x00\x00\x1e\xc4IDATx\xda\xc5]\xcdO\x1b\
+Y\xb6\x9f\x00zec\xabJ\xb5)Ye\xe4\x0dz\
+\xa2Z\x8a7-\xa4\xcc\xc2c/H\xc5\x8a\x11\xd8^\
+Xl\x86.\xa17;\xb2)\xe9\xc1\x80\xd5HQ\xdb\
+\x8f\x09(M\x0dH\x1d\x11\xc5\x16\x081\xb2D\xa6\xc5\
+\xe4\xf5\xa2[oa\x0bZq\xc0\x93\xd0$F\x852\
+<\xa3n>\x22\xff\x19\xaf\xaa\x0c\x09\x1fe\xdf{n\
+]\xf2jaX\xfet\xcf=\xdf\xbfs\xee\xef:\xcf\
+>\xf7\x85\xcf\xe5v\xd9}\x9e\x0b\x9f\xd7\xeec\xaf|\
+\xcc\xb5\x8f\xbb\xf2\xf1\x1c\x7f\xf5\x13.|~\xc1\x7f\xfe\
+\xfd\xae\x13\x13\xa9\xe7\xcag\x03\xf3\x0aR\x86\xc1\x00j\
+\x83\xf3\x02T\xbf\x1f\x01\xd4\xeeD=.\x14R/\x8b\
+\x04\xca\xa0\x81^:R\xe4\x89\x22\x04o\xe2\xf4\xa0E\
+\x7f\x0d+\x87\x06\xda\x04\xe7'\xa0n7\xf2H\x81'\
+\xcab\x88\x9eC\x9c(\x02\xa8\x0b\xe3L1t\x09\xa9\
+M\xfcu\xa0W$\x7f]\xf4\xeeN\xe0\x81\xda\xc8\xfe\
+*J;\x9c\x97\xa1\xf2\xd7\xb5\xfe\xb2\xd2\xdb\x00E\x8a\
+\x1e\xad\xf5,R\x9b8\xe4\x89^\xb9\xa2\x02\xea\x8e\xa2\
+\xb5\x9e\xc8\x8c^A\xca_\xbf\xa4\x82\x80R&\x0c\xad\
+G\x22\xf5B\x95\xc9\xee\x92\xc2\xb4\x1em\x9fl\xcc\x13\
+\x0b\xf7L\xf6&\x1f\xdf\xe0\xbb0\x80\xa2\xef(\xfaH\
+yl\xebd\x0f\xd4\x85\xa3\xf54\x0c)\xcf\x81\x81\xba\
+\x81\xae\xc9kk\x9d\xbch_\xcf\xb4F\x8aq\xa2\x9d\
+@\xad\xf7\xc0\xd5\x9e\xe3\xd0Q\x89\x80\x02\xeaFFO\
+h\xa5\xbf\x1a=\xb1\x04w\xb4\x09\xcef\x06\x9f\xc41\
+]\x03\xca\x92\x85y(;\xda\x89PztD\xca^\
+\x05\xca:\x05j+z\x94\xb3\xc7\x88G\xd1'\xcap\
+ \xb5GF\xf8X\x01)\x05\xcf\xe4T\xf48\xe6\xc9\
+\x83LE\xd0A\x89]\xca\xc4\xf3\x0e\x81\xe2H\xde\x0b\
+\xf6\xa0<<zB\xda'\x1a@\xc1\xa2\x17\x1c\x8b\x1e\
+\x0d\x94a\xd0\xa2'1\xf8h\xc7\x84\x91\x8b\xa0\x8e\x14\
+#x\x82\x8a\x9e\xc4\x8eR\xca\x97!\x813\x19P\x8c\
+\xe4\x0ev\xa2\xfe\xeb@\xd1\xb9\x1d\xc6\x1de\x91\x06\x9f\
+\xe3\x80i\xa8\xf3\x13\xf5b\x05%,\x81\xd6\xc3\x80\xba\
+)\xf8z\x9b#\xe5\xc8]\x13v\xf4\x84\x95/#\x81\
+R\xb0\xa3\xe0\xbc\x9e p\x06\xbbP?\x05\xadGg\
+\xa1\x0c\xb2P\x82\xbc\xa3~\x84\xe8q\x0a\xb9\x18\xe6\x89\
+!\xcaE\x9a\x1c)~<\x8a\xc4\xe9E\xa7\xcb\xe8\xb2\
+#\xbaR\xe2v\x9e\xd8cT\x9c\x19\x0c\xa4|\xcb\x9c\
+\x09\xa3R\xe2\x82\x9a\xa7\x9b)\xe4\x82\xcb\x8e$\x05\x08\
+hP\x82\x0e\xf3\x08]\x13\xca\x89r\x1c\x85\x1a~\xa7\
+\x1b\x94\x86z\xa9\xd4\xc6Q\x99\xc8\x0d%w\xe0j\x1e\
+\x0f\x17\xbd\xdb\x8d\xac\x92A\xcb\xa3X\x9d&\xdc\xdc\x0e\
+pG=\x18Z\x8f\x8e\xf0\x19\x94\xe4yH^\xefr\
+\xb9($M,V\xce\xc4\xe1\xa5\xf5\xcd\x94\xc9MA\
+\x99\x88\xdaL\xc80\x0fm\xf1=Pmb0\xc2<\
+\xcea\x8b\xf1\xc6J:\xd7\xc3\xbc\x96\xa2\x17H\xba\xcb\
+\xf0\xe4\x8eaHj\xe3\xc2g8Q\x82~=\x81y\
+r\xdc\xb9\xf3\x82;w\xe8\x13%\x00\xea\xb9\x99\xee2\
+\x87\xa7\xf5R\x91\xb8\xcfD$z\x9c0\xcf\xd6\xe0\xaf\
+\xa6\xf0\xbb\xcb\xf0\xae-\x8e.aV\xc9\xd4o\x00\xa9\
+\x88\x0b\x9a.\xdb\xd6J\x10\xd9]\x93\xfa\x83T\xfb\xac\
+}&\x1c\xf3dwG\xcb\x0b\xcb_\xd8wE\xdc4\
+\x8ayX4\x1d\x0ei\x9e$\xc9_V%\x95<\xaf\
+\xc7\x00\xea\xbc\x19Z^\xc8+\xbaX6\xe0bWJ\
+<W\xf3et\x22\xc2\x90\xd8\xa7K\x82/\xeb\xf5\x85\
+M]\x7fbH\x9f\xb8\x9a\x87Swd\xe0\xf6\xe9\xd3\
+\x81\x8a9\xc9\x9f\xbb\x9b+\xfbW\x7f\xaeS\xae\xe1\xb3\
+p;z\x15\xa8\xaa7PJrb~\xa6\x5c\xde\xab\
+\x8br\x22?#\x01\xdb\xe0.`\x84O\xa0K\xb3\xb7\
+D\x03fQ?\xad\xef\xe4\x8b\x82\xe0\xfb\x87\x22\x8bR\
+\x99\xb6\xafG\xd7t8\x94\x1d\x0d\x0f\xeb\x86\xec\xd7#\
+\x92fA^\xfdV6NS2\x8f\x14\x90\xd7S\x89\
+J\xec\x89\x05\xc2G\xd1O*\xc6\x89\x86\x92\x92\xb0\xb9\
+\x9b3\x8ev\xe2\xb4*\x8ar\x1d\x04\xf4Z}\x94H\
+\xef\xed\xa2\xa7\xa2O\xb6P\x06\x17\x94\xe3\x8dDN(\
+\xafn\xc9\xa2\xae\x97\x0d;\xaa\xde\xff!\xb2\xac\x8b\xcd\
+)oD%\x1d\x96 |2\x01\x16\xbf9\xd6\xac\x0b\
+z_V\xdb}\x86:\x95\xa7k\x91\x85\xb2e\xf1\xcb\
+b\x15\xcc\xd2\xb9\x81\xc8\xb9$\x9bB\x0f\xaa|\xd9\xf8\
+\xa3MG\xca\xbc0R3\xee\xe6\xfa\x82T.\x8b\xb2\
+yA\xc1\xa9\x08A/\x14}\xa2\xafwD\x03\xa1\xa8\
+'t\x13\xef\xb3\x19\xe3`\xb3m\xfd\x82\xd0\xfeB\x96\
+\x95\xf9\xb6_\x9f\x94\x9d\xf3\x9e0\xc2'\xa6U\x91,\
+h\xfe\xcc})\xf3\xeaSE\x0e\x15$\xe3D?\xc8\
+\xc6\xc1J\x0f\xf2\x86\xec}_\xd4\xab\x82\xba1S&\
+)\x92y(X\xfc3\xa8\xe9\xf56\xd5\xfc\xab\xbd\xa8\
+k\x1d\xaa&\x1c\xfe\xb2`\x9c\xe8\xfaq\x95\x17\xc4\xdb\
+\x09Q(O\x9aWt\xddV\xf4n4\xa9\x04\x1d\x90\
+\xe2\xf6\xc1\xd3C\x7f\x5c\xe0\xb8\xac\x1a\x1c\xd6\x8b\x96:\
+\x1dE\x8c\xdf\xd2\xe3z\x7fN\x97gDA\x1a\xcd/\
+\xc8\x09\xe3P\x89J\xe3\x1e\xe7\xb5'\xc3\xde\x1f\xc8\x16\
+\xd2\xfb\xf5b\xe5~\xbd\xda\xbe%Z\x96\xe9Q\xde\x04\
+\x9cM\xdd\x7f%K\xa6\xb6\xab\xc9\xfa\x8ct\xa9\xf8D\
+^q&\x8a\xf38nd\xa3h\x88\xbc4\xf4\x8b\x5c\
+\xd9R\x22\xea\x8f\xc5\x86\xeb\xfc\xd22\xa5\xc1\xe2yT\
+R\xc6k6\xe0\xb8z\xb0\xe8\xd3\x9c\x89tnE^\
+\xc8\x9fn\xa6\x8f\x94\xe2\xc4\x9bH\xb2\xbei\x01\xd5\x8e\
+\x8eq\xaby\xeeN(C\x0b\x044\x9c\xaa\xa5\x0e\x83\
+\xc6\x89\x1e\xfe\xfa\x87\xfa\xa6!\xfc\xa1\x90\xac\xeb\x93;\
+\x11\xbd\x81\xeep\x13\x915\x01\x9a\xb6pF\xee'\xa4\
+\x07[\xfa\xba\xef\xdb6\x8e\xdb\xbau\x7fG4oi\
+\xc7^M\xafk/^\xd5\x8axm\x11\xaa\x0c\x88\xa6\
+\xc6)\xed\xab\x85\xb9\xc0\xe2\x8b\xaca>\xe7&,u\
+\xe2\x0e\xba\x0a\xf5R\xdf\xe3Z\x0e\x8b\xa9A\xeeB\xbd\
+\x90Bn\xc7\xfd\xaaqA\xc7\x1f\xe9F\x22\x9f>\xaa\
+Y\xc6>\xfd\xe0\xebzQk\xcf\xfd?\xd4G\x9b\xdb\
+\xfb\x83\x89\xa4\xf9\xe7\xce\x7f\x18\x1a\xcf\xedm\xe5\x0c\xc7\
+T\xe2J]y\x1e\xbf#v\xc13\x81\xd4\x1e\x8b\xec\
+\xf8\x11i\xfaE\xddT\xf9\x83\x90\xa9F\xe1\x95\x88X\
+\xec7\xe4_\xb2%\xba\xf2\x8e\x1bb\x90;\x1ah\xd7\
+\xd7K\x17\x8e\xd4WW\xcd\x1bp\xd4f\x06\xce}\xf7\
+\xf3\xcf\xf5\x22%\x82\x96\x1b\x99\x85\xb6\x18\x14\x0a\x0c\xfd\
+\xbc\xf1`\x22|\xc1:\x0d}i\xca>\xd0\xb5`\xc1\
+\x0bg\x83\xd0\xca8D\xeb\xf1\x19\xb9\x95Pd<p\
+\xd9\x8eN(j:=[h\x87\xb1t\xc8\xf8\xa3\xe8\
+\x13=GzgW\xbdj\xf0\x0f|z*\xd9&c\
+4\xecy\xba\xa2oi\xf1_\x87L\xa0\xe9s\xa0i\
+\xf3g|t\xf8\x8b?\xb5\x15s*\x19\x01\x02\x14=\
+a\xd7\x1d\xef\x9cr\x81\xc3\xe3\xc8j\xc9\x84ZJ\xae\
+r\x0dc:\xfe`\xe2aDE\xd2\xdby\xa7\x9e\xe9\
+\x8a}\xba\xf4U\xc2\x81\x06\xd49\xc3\xa1\xb3\xd1\xd0\xea\
+tjhoB7\x11\x8e,\xffg\xf1\xech\x03\xe3\
+Z\x90.\xd1\xd5\x85a\xf1/\xe2\x8c\xdf\xcb\x97\x8c?\
+\xb1\x91\xd3c\xdf\xc6!\xd3;\xa6\xe8\x1d,\xbbv;\
+h\xa0{]PT\xd2\xae\x08\x0d\xad\xbfl\xf2\x07\x9e\
+m\x1aG\x1a\xf5m\xa6\x0f\xdeG8\xf6\xfd\xed\xa2q\
+\x03Ft\xf3(\xd3%*\x5c\x0d\x88gja\xf1+\
+>=\xed\x8d\xfd\x94L\xa7\xd7\xbb\x94\x12\xdb;|X\
+Jw<J\xa2\x07\x9a\xc0\xa3l\x04y\xbd\xa72\xaa\
+\xb2\x16\xcc\x03\xbd\xe6{U\xf2\xc6\xba\xf4\x8d\x84>\x97\
+fX\xf6\xe0\xa7[\xa9\xda]\x15\xa3\xcf\xc4\xb5\xd6z\
+\xc1\xb9\x0b\xf5z\xfb\xbaR\x8c\x893\xfa8\x19\x1d\xed\
+\xda\x0cTB\xb5\xf5t\x80a\xc7M\x9b\x7f\xb2\x17\xc6\
+\x9a`\xe5Z\xfaz\xa26\xf85\xa0\x95\x91q\x13g\
+,\xb41\xce\xc6F\xf5`\xfc}m\x93\x0d\x04\x86V\
+\xd3\xe4\xa3\xb6h\xd1\x03H\x84\xd1\xd7\x1d^\x13);\
+\xbb\x915d\xdf;\x914~3\xff\xc8\xb2\x03\xa1\x0d\
+}]W\xd6\x03N\x18\xb9\xb4\xa2\xa7\xf8\xc8\xf7\x05\xdf\
+\xdd\x80\xc7\x93\xf1\xfd\xe1\x87-S\xf6\xb1\xdf\xf7\x1b@\
++[\xed\x01o\xef\xc8\xd8\xad\xd5\x8e\x96\xe3\x96@\xa0\
+\x02\xca\xd77Ez\xa7\xed\xb0\xb77f\xfc\x93y\xdd\
+\x11{\xa9p\x86\x11\xf5\xe9a\xe3\x5cw\xef\x96\x0c\xd7\
+\x14\x00Q\xde\xc8\x02g4\xdb\xd1\x80\x1a\x9fn\x0b|\
+\xb2N\xd1\x90\xa9\xf7w\xbe{34>:\xf9\xac\xe4\
+%*\x8f\xdeLr\x17_)\xa4\xe3\xf1sk_Y\
+\xd4M\xbd\xbf\xf7\xf8\xcd\xe9\x87q\xf6j\xbe\xcc\xb0\x8e\
+I%DC-.\xcb\x1d\xbd\xdc\xd9\xa8\xa5\xf4\xc9\xb9\
+\x86\x05\xbdW0]g\xbc7Z\xc1,\x8f\xc2\x18\x10\
+\xb0\x99\xbb\xb8\xe7\x1c\xe6\xc0X\xd8\x1b\xbf\xb3\xe6\x0b\xf9\
+\xbe\xf9~\xd3\x02\xda\xeb[g\x01\x05R\x8esN\xc6\
+n\x22zO_\xdb\xc6H\xec\xec\x82fVf-\xf1\
+{\x062[z\x87eC\xf7\xf7X'\x93\x0d(\x86\
+\x96\xad\x1d\xb59R\xc3\x04\x85\xdeO\xefN\xc6\xba\xd7\
+R^\x97'\xde\x15>S\xa4\xf8\xda\x1b\x16\xcd\xd2a\
+)u\x97\xaf(\x93\x8d\xda\xaf};\xe2\xe9\xee\xbew\
+<\xe7y\xfbl3f\x9c\xe8\x90\x09\xd2\x1b\x8f\xf5n\
+\xa5X\xb2\x86\x18\x03\x9b\xbe\xc1,;\x0e~\xa7\x9b\xbf\
+]YO\xf7\xcb\x95=6\xb3\xa2\x1a@\xdf\xeb\xc9\x07\
+\x85\xe3\x03\xb2\xe1et/\x14\xad\xf5va\xdeV\xbd\
+b\x00\x9d\xd8\xf3\xb8\xba\xef\xfc\xd2^\xf9!m\x00\xbd\
+\xb7\x1f\x1a\x8ez=d\xc4\x02\x0c\x06\x04\x0f\xe1\x8f\x9e\
+#}\xf9\xe5k\x97\xe7dw\xdc\xfa\xdf7\xac\x1f4\
+\x94\x89\x9c\x97\xc9\x91F%M<\xd39\xd2\xa9\xef\xda\
+NB\x0f\xf7\xe2\x96\x99:\xd9y3\x0ea\xbc\xb1\x04\
+a^S\xce\x9b\xbd\xe8?\xf9\xd0\xa3\x7f\x1c\xbf\x8e\x9f\
+\xdb\xd1\x97\xc7\x1d Z&\xeb\xdc\x85\xb6R\xa6\x9e\x9e\
+\x0bvt\xfb\xbbI\xcfGW\xff2\xd5\xd1\xbaJ\xe6\
+\x85\x93J\x88G\xd9\xa6\x8e\xeeG\xbb?\x01\xed\xfe}\
+=~\xfe\x7fe:\x15\x83\x01e\x91\xf6\x9e\x83g\xa1\
+&\xd2\xc1\xfdG\xfb\xf7\xf6W2\x17\x5c\xe8b\xe8\xe0\
+\xec\xbf\x81\xe1\xa7\x07^\x87+\x0b\xd0\xe4\xbc&J\x7f\
+\x09\xe8\xd4\xda\xca\xda\xfeVf\xea\xbb\xbe\x0b@3_\
+F\xcf$\xbf\xddW\x01\x92\xb1I\xe8\x8e\xa8\x09\xb1\x9e\
+nW\xe7\xd4O;\xf1\xc1g\x95\x9e\x95\xc5\x01\xc2\x1e\
+#t\xb4\x01\x9f>\xda\x00\xea\xde>\xda]<q\xb9\
+\xff\xe2\x1b\xf8\xb7\x95\x97\xdd\xdb\x13\xd1\x1b\xa3\xb7\x83\x87\
+\x82/\x02u\xff\xeb\xe8\xde\xe0\xfe\xc4H\xf7o+'\
+=o\xbf\x8cw\x1b\x1e\x9e\x0a\x95\x8c\xa5\x09t\xbb\xbb\
+sj\xe2ew\xa7\x81\xf0N\xcf\xff\xf8\x5cS;\xbd\
+\xae\x9f\xc6*\xb0\xda\x13i<\xca\xdb\xf0\xb3\x9a\x01\xbd\
+\xd7\xdd\xf9\xdbD\xd4\xbc\xa5_\xf5\xf5\xbc=\xca\xf4,\
+\xaeu\x0f\x0e\x92-|BO\xb0r\x0c1\xbd\xdd\x88\
+C\xa7\xfe\x98qwvv\x1f\xbd\xef\x19\x5c\x19q\x0f\
+n\xc3KO\xf4\x82\x92\x96\x1c\xe7\xa9\x89\xb5\xa9N\xf7\
+\xe0\xd6\x89\xbb\xe7/wZe\xcb.`\xd3\x96 \xb9\
+k\xa2\xf5\xe5\x19\x13h\xcf\xf6\x8b\x91\xc1\xa9\xb5\xc5n\
+DI\x07\xb5\xe7\x0dc\x8f\xd2\xd5\xbc\xde\xe6\x92\xf2\xd7\
+\xf7=I\xfe\xec\xad\x86yz{t\xf4\xcd\xd8 r\
+n\x1d\xc9\x22\xbc$}\x06'_n\x9d3\x99\x11~\
+\xb5~Z\x9f\x11\xd6\x7fw\xe6\x94\x06{\xdc\x9f\x87@\
+\x0a0O&C\xab<\xa3\xe8\xb2\x92\xa8\x1e\x90\xb3\x1d\
+\x89\xc6\x18!y\xbd:c\xf2\x09\x95\xbcXV\xeb\xc7\
+3\xe4\x9c\x122\xe2\x13\x87\x08\x9f.\x90\x5c\xebu\xe3\
+Hs\xca\x8cqI\xc5\x1f\xf3\xa0\xe1@\xe7+\xb4\x00\
+\xe3\xe0b\xe4\x89\xa1M\x9b\x09\x8b\xf2\xb6\xa1\xfc\x8e\x22\
+\xd9\x11NumU\x7fh\xaf\x99w4\x9b\xa8\x9a$\
+\xad\x19\x85|\x94\x8d(*\xe1\xf0\xcb\x8e\xa9\x88d\x00\
+\x157LN\xa6_}\x0eX\x9e\x86\xdcL\x85\xe1\xeb\
+\x01\x9eI\xae\x9b@\xcb\x93\xefL\xd9WO\x89\xf9\xa3\
+\x84\xfb\xe8\xb0\xc6\xd6\xc5\x19C\xea\x87\x8a\xc5\xd0Rk\
+\xf5\xaa_\x92\x9b\xddQ\x9c\xf62Q\xba\x8c.>I\
+Z\xd9\xa2\xe5fOE\x8b@\xba\xd0\xa5\xd4\xf5\xda\x0c\
+\xf1p aP\xc20\x88\xf2C\xb1\xbe\xe0O\x9a\x1c\
+R\xf5\x83\xde\xf0\xa0j=\xb2\xfc\x5c\x06l\xcb\xbc\x99\
+=J\x17\xb1j\xf9\xaa\xd6\x9e\x88\xe4\x0e\xf3\x0b\x86\x1d\
+=L\x88\x8d\xb0\xa4,\xe5\xdaj\x84\x8b\x00\x80,\x9d\
+\x16\xd1\x93X=;\xcb\xaa\xa8u|\xc8\xe7\xe6j\xf9\
+\xbc\x98\xa8\x9aN\xe9\xae.\x9e\xe7\xa1e\x91\xd8\x85b\
+\xad\xd0B\x9e)\xaf\xfd)\x124y\x99\xfaR-\x1f\
+Q\xd5g\x11i^>\x95\x15\x13\xa8P\x0dED\xe7\
+,\x1d:1\x09\xcf\xbf)\x18G\xaa\xa5\xf2Uq\xfd\
+\xbf\x8f\xcb\x8f\x94\xfe\xbc\xac+Jc\xc0\xa1X\xcb\x7f\
+\xe4\xba\x12s\xf3<\x84\xc3\x22W\x81\x1e\x9e\xca<\xaf\
+.\xcd\x08|0u\xba\xd0\xab+\xf5z\xb1\xb0t\xec\
+o \x9d\x91sd]\x11\x87\x01\xfe5\xa8\xb9Hd\
+\xe9X\xe2W\x13&\xf3-\xdbU\xe7\xd4\xe5D\xbd\xbc\
+\x1eY\xf0\x9f\x05\xa4Rk\xea0\x95e\x15\xe8\xa0$\
+\xd8\xa6\xc8r\xa1\x90\xe3\xdb\xcdc\xe5\x83\x0f\xe5`\xb0\
+mY/;e@P\xe08\x7f\x02i\xb2K\xda\x13\
+z\x89\xcf\xfeU\xe7\x83\xffn\x1ck\xd9:\xd7\xa2j\
+_\xces z\x0f\xdc\xd5g\xcf\x8fr\xa1v\xdc\xcf\
+\xa7\xf7\x12E\xe3\x96\xde>.\xf2ICmf\xf2\x91\
+2N\xd9\x91\xc6\x9e\x92\xd6'\x1a8~h\x92\x08\xb9\
+\xecjJo\xbf\xbf,r\xa9D\xd10\xf8\xc9\xa7\xab\
+\xbc\xd6\xfeA\xa9\xcdh-v\xd4Pe\xe4\xb6\xa88\
+\x9b$\xad\xc0dD5.\xa9\xb63\xafh\xdc\xf8\xb1\
+.\x1d\xde\x969^\xe8\x7f^7\xbd\x92d\x97\x86\xfa\
+\x9d3\xc9\xec\x97\xe949\xd2\x8e\x0f\x16\x05\x8a)\xf6\
+\x9b':\x9cX\xe0\xb8\xf4^M,\x85\x1e.\xa8b\
+\xbdP\x97\x88w@\x10*}3\xd1w\x84^qL\
+pUY\x9a7e\x9f\xed\xd2M\xea\xf0\xd2fp\xae\
+\xa0\xd4\x96d\x952\x03\x02N\x1d6\x90\xaa\x0d\xa6\x8e\
+/\xa1V6\xea\x9b\xb3\x8f\xeb&i\xf8\xf1\xbc\xc6q\
+\x1d\x1bz\x91+\xb6?)\x93\x94\xc6\xf1\x81z\xd1\x86\
+\xd4\x9ci\xe9]\xaek\xa6\xba\x1f*I6\x90f\x02\
+\xf7M\x88\x5cR1e\xbf~\xaa\xdad\xa1\xc85J\
+Pm\xf2bewi\xfd\xd5!3\x94\xcf\x96\xfe\xae\
+['\xbbW3\xa9\xae\xeaN\xc1\xb4Q*\xfe\xd8z\
+\xd3\x16#\xb5\xf5\xed\xe1o\x14n\xf4\xcf\xc7\xe1c]\
+\xb3\xe6\x06vM\x88\xdc\xadW\x1a9\xb1\xc0\xf9\x0e\xef\
+\xeb\x03\x03a\x8e\xf9\x90P\xd7^)\xba^\xb7(z\
+\xdc\x87\x84In.\x06\x9b\xb7o\xf8\x1b%\x11^\x80\
+\xdaq\x18l\xe0\x0c\xeb\xcb\x85\xd5\xd2\xd0n\xfdP\xd1\
+\xe7\xf5\xa5\x067\xf3\xb0\xb0\xca\x11\x0d\xae\xd3\x9dl0\
+\xf9D\x8f\x97T#b\x0e\xcc\xae'W\xa3\xa9D2\
+0\xba\xb4\x9a\xd8\xfcA\x99?l\x18\xfe\xf0\x8d\xef{\
+\xf2`F\xf8\x0f\x92&Ck\xdc\xf7p\xa3\x83\x0d\xfc\
+5R\xea\xbd{\x5cX\x1f\xeaZ\xd6\x9b\xb4\xeb9\xb0\
+2\x01G\x1b\x9a\x06%\x9b)S\xf6\xa3\xefL\x0b\x9a\
+*\x1c\x06F\xde\xbdJ\x06\x1e\xfc\xb3\xe1\x9b\x18\xa7\xe4\
+\x170u\xb8IP\xa2\xea\x7fK<7e?\xb4\x9b\
+2\xech\xf8k\x9d\x09\x9c\xfem5\xddQ\xb2\xdf\x9b\
+\x87\xbd*\xb5\x19\x03\x82\xacT\xe2\x8d}\xe8\x1f\x1f\xfa\
+AO\x1b:5\xad\x98GX(\x14\x99\xbdT\x89\xde\
+nG\xf2\xediCg4\x98\xc0\xec\x5c\xda\xb2I\x95\
+G\x8a)\xfb\x91SS\xf6\xab\xaf\xb2\xe4\x9b\x15\xa8\x06\
+\xce\x95\xe7\xcfK\x16)w\xa9P\xd3\x19\xeb\x92\xf6\x9d\
+f\x8d\x7f\xa2[:\xc72\xe9\xb4\xa3\x86\xbd \xd0\xd8\
+:\x1c\x9b\x9c\x0cx\xa3\x8f\x97\xd7Yo\xc7pj\xfc\
+`lY\xb5\x90\x1e\x84L\xd9\x07\x16k\xccg\xe0\xe6\
+\xe1\x8c\x83\xf7\xfd\x9cXe{\xbb\x94\x02\xe3\xbd\x93\x1a\
+\xf7\x8e\xb7-\xa5,.n`\xf4\xa1fM6\x90\xad\
+\x9c\xa6M\x1d\xf6x;B\xcf_\x85\xe3_\xbc9\x0d\
+\x1b\xa6\xbe#\xd9\xb6\xf7H)Y\xb2?\xb9=\x87\xfb\
+\x02\x8aSZ&^\xedi\xf1\xd5;}\xb6\xed\xcd\xae\
+\xa1N\xb1I}\xdc{\xe7a\xd6\x22\xba\x06\x02\xf4\xf7\
+\xccC\xc2\xbck\x97\xf4dW\xf9p\xfc&9\xfd=\
+\xe3\xedS\x86\xbc\x15}Y\xd7\x80\xdb\xe88\x8ew\x16\
+8c-\x00\x89\x1d\x9d\x9e$\xde\xa9/k\xb3\xec\xe8\
+m\xfd`Uo\x9f\x0c\x00\x89\xaep\x1e\xbe\x1b\x5c\x81\
+0\x8etT\x99\xdd\xbf}\x98\xd9\xd2\xd9\x8e\xd0\xd3\xa5\
+\x8d0\x8d\xce\x9d\xbdy*7k\x88\xe1-\xc9\x8dn\
+\xa5\x02\x156>\xfd0\xed\x8dE\x03,\x95\x1d5\xf6\
+\x99H\x19\xb8F\xa9\xf7u4~\xe1Hc\xd3\xcb&\
+\xc7\xb9\xef\xcd\x01v%\x97A6\x1bl\xed\x93\x08\xd9\
+\xe8\x1a?\xd9\xd9\x1d\x1d\xa9\x5c\xf4\xa0#\x85C\xc3\x81\
+\xc6p\xcb\x8e\x1c\x98\x91{\x8e\xb4\x0a\xf1\xf5\x99\xb1\x93\
+x<~\xc9\xd1\xf7nM:\xe1\xbc\xf1H\x0a\xc49\
+\xd0\x22\xa6\x1d\xcdd\xe2\x1e\xd7vW4\xde\xdb\x1b\xab\
+x/`\x8d9\xdd:\x8c\xf9\xee\x91\x8a\xe3\x99\x06\x16\
+\x7f\xf5\xade\x5c\x9e\xc1\xa3\x89\xaeG\xd3]\x8b\xbd\xb8\
+\x8bRY\x92'P\xec\x0d\xa9\x84\xb1\xac\xa2{zm\
+`j\xd0dB\x0dD+\xd1\xcc\xe0WC\xcd'X\
+)/\xf8C\x11]?B\xf5t\x1b?o}QO\
+|\xc0\xb8\x9c\x0d\x03\x95\x09\x1d8x;\xf0\xda\x84\x18\
+\x87\xe0j\xb4\x00\xda}\x8e3:\x1d\xea\xab\x18\xf7s\
+b\xcc7\xb6\xb8;\x1as\xc5\xa3\xd1\xe8\xe8\xe3\xbd\x18\
+\xf6B|\x96\xc4\x8c\xf2Xd\xec\xa9\xb5\xae\xd1\x06\xd1\
+u`\xf1\xe8\xfd\xfb\x89\xe1\xb8\xcb5\xb8vr\xe7\xde\
+\xcb\xa3Y\xcf\xe0=\x03o\x85d\xc0\x1e\xcb\x83\x0aj\
+\x11{\xfa\xe6_;\x8bG\x16]\xc78\xc8G\x19\x8f\
+k\xad\xab\xd7\xd3`\xe8d&\xfa\x0ct1\xd8\x12\x08\
+\xd8\x8b\x1dAQ\xe4\xf92\x1e\xc7\xb9\xbb\xa7'st\
+b\x01\x9d\x8awo\xfb\xb6\xb6L\x22\xf6@%\x9e\x19\
+\x9b\x8e\xa1\xb2;\xbc.\xb8]D\xaa5\x90\x8aU\xb5\
+\x7f\xb5\x8c\xcd\xc3\xffr\xb4\xdb\x92\xbdg\xfb}\xa6\xe7\
+\xed\x8b\x98\xab{ltw\xb7\xaf\xfb\x86^\x97\xe0\xf8\
+r\x7fc\xab\x8a\xda/\x8b\x12\xfa\x85\x81\x8f\xca\xf4r\
+,c\x01\xdd6\xc5\xbe\xf6,\xeaqug\x06\xb0K\
+:\xd0\xcd\xfd\xc6\x89\x96\x17\xac\xbb)\xe6\xc4\x05\xbb\xda\
+\x93T\xbd\xb2\xeak\xea\xde\xfb\x01\x93\xa658\xd1g\
+Y\xfc\xfd\xfdLwfql?N\x93Y`O*\
+9\x13\xbdT\xd5\xae\xda\xd1ruF\xae^\xdc\xf2\xd6\
+9\xb5\xfflq\xed\xa5\xc5'[Y\x9c2\x8ft{\
+kql\xf7N\xdc\x01\xb1\x00\x83;l\xa2\xac\xf6?\
+9\x03*\x16/k}\xb9*?\x11\xcb\x97\xb6\xbc\xb9\
+_N\x0f\xf6\x9c\xb1\x08\xdf\xaeD]=q#\x08Y\
+\xec\x8b\x03;\x8c^h\xdc\xccq\xdaBN\x14\x1b\x85\
+|\xad*]\xa0\xba\x16E\xd1/\x95\xcbW\xeeh\xf7\
+\xd6\xc9G\xaf4\xb5\x12\x8a\x8e\x8c\xc4\x09H\x84\xd0\xb8\
+\xb9X\x0c6D~\xb6\xe6-'\x96\x85\xa2\xb5\x9eH\
+\xaa\xca3\xd5\xb2\x8d2\xfd6\xb1\xfd\xc9\x7f\xfe\xf6\xd3\
+\xb3\xb1\x01x[\x84e\xb1\xde\xe6R\xf9\x8fg\xb9\x9a\
+\xb3\xf4=\xd8\x7f\x06\xb4h\xe8SU2i:\xfdU\
+\xa9\xec\xb73OS\xdf\xdd\xb3\x0es\xc0\x14\x7fO7\
+!\x89\xb0\xe9\xa2\x92\x0b@\x8b\x0b\x8d&CIT\x8b\
+A\xd5Z\xfc\xa2m\x9e\xb7\x9a\xa4j\xd1\xbc\x9ab\xb1\
+\x5cnR{rO\x98wtjm\xbb\xe7F:b\
+\x17\xec\xbdvV\xc0\xcfV\x8d\x7f4\xd1l\xdbjb\
+\x95\x0fJ\x17S\x11\x7fs\x83\xff\xdbO[\xa3k\xbb\
+\xbe\x01\xfc\xfd\x1f$O\x07ZG\xda\xd8\xa5\xa2\x8a%\
+\x8e\x0bf\xad\xb3T\xabb\xbf(\xb4\x5c\xfd\xf2)g\
+\x9az\xbb\xb2\x9fqLtE=z\x15\xcc\xcar\xd5\
+:\xd2R\xbbyW\x1bB\xd7\x8a\xa2\x84;\xc5\x88\xce\
+\x96iP \xb8`Q+nZ\xda\xa4\xad\x9a\x7f\xb2\
+\x22\xf8)\x04\x0a\xcf\x09\xe1\xc5N\xc1\xfe\x06P\xd1\xea\
+8U[F\xf8\x92,_K\x97\x81\x0f\x8b`6m\
+m\x806\x10\x9a\xd7\xd3\xfc\xd5Z\xe6\x22\xeb\xff\xac\x95\
+\xcd\xad\xc3J\xa2Y\x8b\x91Vw\xd9\xc6\xd7\x07\xb3\x0d\
+m\xaa\xda.(\xfa\x18\x93T#\x86\xf5O&\x12O\
+\xfc\xe5\x5c}F\x22\xe7=\x91\x11r\xcdo\xb3\xaa\x15\
+\xa5\xc6\xd2D\xfb\x84I2i\x99\xfa\xf3|NX\x98\
+W\xea~\xbf>#\x95\x9b)\x13\xce.\x1d\x22\xfbd\
+\xde\xcb\xcd\xfe\x9c\xd6\x8a6\xbe\x10\x11\x8d\x13M$\x0a\
+Bv\xfei\xa1h\xc8\xbe\x1ai=\xbb\x0c_\xf8\x84\
+E\xd0\xba\xb8\xa8\xc6&\xb7\xd3t\x8b\xf1v[\x99\xef\
+\xdf\xafGL\xdax\xb5.\x133 \x9aY\xa7t\x07\
+\xec\x09V\x9b4T{%Z\xdc\xe1Zm\xa3\x90\xcf\
+=\x8b\xf8\xfd\x1bu\x09\xb4\xf9\x05\xcd\xd0\x1a\x0a=\x1e\
+\x0a\x806\x01\xd8\xdc\xd1\xf6H\xce\xe2\xb7?\xcb\xef\xbd\
+{'\xdd/\x88Z\xfd\x22#\x97\x06\x89\xf0^\xe8u\
+:\xd0J\xf6A\x0d\xa3\x88_-X'*\xdc-l\
+\xd6k\xe2zM\x0eV\xef\x9e:*\x8d_\xfd\x02c\
+\xc3\x01v\x9ci\x864\x98\xed\x17\xb5\xd6\x05\x08\xc9\x08\
+\xf1\x85b\xa2\x01\xb4?/\x1b\xb1\x9e\xf4s\xc1\xef/\
+\x8a\xe4\xc4\x02\xbb,t\xc27\xfd\xe3p\xda\x16fZ\
+]\xef\xdf,\xa5\xb9V\xdc\xe1\x5c~9gh\x93z\
+Kn\xb8\xa5g\xc7\xa6\xb3o\x93%h\xfb\xc6\xd5Z\
+\xf0\xb1\x91\x1f\xff\xee\x1b\xb7W\xfb\xc0a{\xd8Z\x97\
+\xd9\xb4\x0f.\xe6\xb2\xfa\x8cf\x86P\xd2\x03\xa5a\xf3\
+\xdf\x1c\x9b\x1c\xfc2\xd0\xd7\xa3\x89\x05'\x8f^\x7f\xb7\
+nS|*m&53\x12=\x0b\xf3\x9a\x00M\x16\
+\x14\xb9\x11B\x09\xb3\xaf\xaaV\xdc\x9c\x8bT\xc9\xda\xe0\
+\xae\xabf\xb42~\xb6`\xe1\xe0 f\x99\xd1\xa3G\
+\xe3W|\xa8q1W\xb3A\xaeUAGzR5\
+\x92;\xf5\xbf\x96\xcfKO\x92\x1cY\xc0\xa5\x13a\xd1\
+\x1dc\xfb+\x01K\xe4\xbf\x86\xa6\x1fX\x0bUN&\
+\xe6.\x09>\xad&\xcd\x8b\xd9\xaaRR\xcd\xcfG\x14\
+\x93Fx\x5c\x13\xcfC\x92b\xe8T\xf4\xe3\xd5G\xf1\
+\xa6Z\xa2_uX\x22\x8f\xc6\xa2\x8b\x8b&\xe6\xc0\xb7\
+\xeb\x97\xcdS\xf0\x22J;\xa4ZD\x97\x8a\x93\x8a\x91\
+;\xad>\xed\xff\x18\x94\xa8\xf5\xbc,R\xea\x85Z\xcd\
+\xfa\xdd\xc3\x80\xb72\xf6:\x16\x1b\xd9\xd9\x09\x98\x9ei\
+q:\x8c]r.j\x86\xe4S\x11\xd18\xd4\xbf\xc9\
+\xc6\x0d\xf8\xba\xf0\x89\xf0&-\xe8\xf2\xa5\xd0\x190+\
+r\xedH\x0f\x1e\x0c\xfb&\xd2\xde\xccW\xeb\xbe_\x87\
+\x87\xacK\xcaF\xb7f\xf1\xc8\xd8\xda\x8c\xa2\xd47\xb9\
+`\xaaV7W\xf3\x9b\x15\x88\x8dZ\xf5B8*I\
+M\xcb\x8e\x97\x169#\xd5>~\xb2;z2\xf6u\
+\x98\xcd\xec\xbc0\x8e\x94\xf56\x90\x8e\xa4q\x80f\xe5\
+\x88\x9e=\xfcAQ\x83\xc3\xff\xac\x8b\xe5 _6\x14\
+\xfe\xf0\xe9\x02\x16\x03\x02\xa9\xf5\x97\xa1\xc6w\xf6\x02l\
+\xe5h/0\xb08q\xe0ec\xf7\x86p\xcb\xb8\x86\
+\xc87\x97\xe7\x8d\xf8~\xe8]\xae\xbc\xfeT\x97\x04M\
+\x94\xcd\xc3\x94\xe8\xb0t\xae\x1c\xea\xb6/ln\xf6\xdb\
+2e\xef{=\xf4(4\x17\xc0[O4\x9b\x10\xb9\
+\xf4\xf7u#Y\x1e\x7fS/\x16SJ\xbe_V\x22\
+EDvwQ\xeb;A\xf3L\x99\xad!C\xd6\x99\
+gs\xac7::\xbd\xbbW\xc1HE:\x0e\x0d\xa0\
+\x07\xa79-\xad\xe7\xdb\x8d\x18\x7f\xf8\x15\xcf\x07\x93m\
+J\xbdJH\xcbtat\x97\xe3\xbf\xdf3\x97\x0f\xee\
+$\x8d\xdfX\x0c/\x0f\xfd\x900\x04\xde\xa1G\x8a\xdc\
+\xdc\xbcn(\xd4\xdd\xbc\xf6Q\xe2M\x16N\x0b(\x83\
+\x8f>\xd25\xdf\xeb\xf1\x8e\x91G\xbf\x04\xb0R\x91l\
+\xb2=\xcd\x1c\x16d\x8eI\x0f=\xafr\xe9\xdb\xf9\x5c\
+v\xb5\xb6\xca\xf3\x98\xfd\x1b\x07\xdc\xbc\x81\xfd\x1d\xdf\xaf\
+\x0f*1\x8c\xdaS\xb0\x7f\xfeXO\x16\x99\x8e\x9dy\
+C\x99\xc6k\xb2\x96N\xfe\xb9\x96\x9f\x975\x02\xfe(\
+\xfc\xd5\xc8X\xb4\xaf\x82\x97\xdb\xcd\x1eg\xd3A\x93\xaa\
+\xa5+\x9b\x1cW\xbau\xacr\xe1\xff=[E\xead\
+\xcb\x1b\xa5J\xc9'\xb9\xdf\x9a/\x96\xb2j\xb8\xc4\xcc\
+u\xd5\xb5R2\xb2d\xc8\xfen^\x85\xbc`O\x5c\
+\x80\x00\xcd[N\x1e+\x89z~>\x1f\x0c\xf8\x96\x22\
+\xf5Zv\xd3HC\xd7\x95~\xc8\xce\x02\x087\x8f|\
+YE:\x9c\x0dg\xd5\xd1y\x95\x09O\xd6\xe4F\x85\
+D\xabU\x91\xfde?j;\x11\xe1[\xb1-\xbb\x22\
+\x5cz2\xaf\x1az\x05y}\x17#(A\xfbzP\
+\x13<}\xb8\xbe\xa9\xcf'\xd3\x18\x14R\x84\xafwc\
+D\xf8.r\xa4\xe1T\xa4\xd6\xaf\xe1\xf0\x1d\x91\x15\xe7\
+NpI\x07t\xa4\x1d\x1a\xde\x22\x80\xa6S- \xde\
+\x93\x0bXp&\x22\x16\xf0\x90U_XS-$O\
+\xb0B\xe9\x8e~\x81\x0a\xdb\x11>\xbc\x0c$\x11bp\
+\x9c\x89\x86ZX\x82\xe9e\x82U_\xd0\x99`\xc2\xfd\
+\x1f\x0c\x11\xef\x89\xee\xd3\x5c8\xbc'\x06Bq\x16l\
+\xf9\xa3\xce\x1f\xe2d\xbd`\x22Yk{\x8f\xd1gr\
+\xb9i\x1c)\xce\x1d\xe5\xc0+\x13a\xb2\xc7{:\x90\
+%X\xa8\xc2\x83\x80\x22\xc3\xa7&\xe7\xe9\x05\xd2\x1dy\
+\x02;\xda\x09]T\xe2\xe0%)L\xa4\x18k=\x09\
+\x87\xee\x90\x9c\x12\x06\x18<\xd1\x88G\xbd$\x16\x1f\xba\
+l\x9c\xe4q\x09\xf0\x04+\x16\x19\x9bk\x1d8\x93\xec\
+\xc3\xbf\xa2L\xa4\xaf\xefB.\xa9\x9fP\xeb\xc1\x0bU\
+\x90{\xf3\x90\xfbG\x05\x02\x83\xef\x81owt\xaa\xf5\
+8C\xd6$9\x13\xceF\x15\x8e\xa1k\xf0\x09\x07C\
+\xe1k\xd1\xc1\xa9\x08\x9d\xad?N\xf7M\xd3\x99\x06\x87\
+\x17 \x88\x1em\xa0P{\xc2XW\xe1|\x0b%\x22\
+\x1euSI\xee\xae\x99Q\x824\x14\xd6lp\xd3\xd9\
+=K\xb0\xba\x1f6\x0d\xee\xc2!>y(DO<\
+b\xa0\x09\x9d\x8a\x90\xedyc\xa1H\xed\x0a%<O\
+5p&\xf5Lh]B\xcd\x8a\x80\xcd(F\xdd\x91\
+!\x08\xf3x\xe7\xc9\x9d\x0bh\x9e06\xa5\xf2v\xc9\
+\x1d\xef\xb4\x9a\x87\x0c\x9f0\x82<\xe8\x985\x11\xb1\x00\
+\xbe\x1f\x99\x88\xf7\x84\x0cJP\x8f\xc5\xe2?\x1f\x07p\
+\xa1\x04\x11\xbe\xdb\xdd\x09*\x92yoF\xeb\xa1\x8b\xa9\
+H\xb7\xe4\x82'\x82q_\x97\xb8h\xf0;![5\
+\xbc\x18\x03MD@\x91\xacq\x0a\x9b\xa9X\x0aQ\x1e\
+\xe0q\x09\x07\xb4L\x8c\x8a3\xe9F\x15r\xfe(\x8e\
+\xc5\xc7\xa9\x948\x5cQC\xe5-\x04\x1c\xa0\xfcM\xe4\
+L\xe07\xa2\xc9^\x11\x03\xed\xd2\xc1\xa8\x8f\x12%w\
+\xd0\xc7\xb9PZ\xefB\xbb&/\xd9d\x03\x05e\xba\
+\x01_O\xb4\xb9\x9f\xa7\x5cv\xc4*=\xb1$\xbe\x1e\
+\xd2\xaf'\xf4\xf5\xec\xd5\xcd\xfd\x0e\xdfl \xab=\xb9\
+\xc0\xa5q\xa2;\x8a\xf2\xf58\xa5q\x8c\xd1\x06h\xd3\
+\x167x\xba\xf4\x0cg\xa7\xdbq@\xea\x05\xaeG\xb6\
+\x15=\xeft\xe9\x0f\x9d-\xb9\x8e\xcd\x13r\xfa\x06\xee\
+A\x89\x9a\x0dMj%\x0e\xec(I\xca\x04l\x83\x93\
+\x95\xc6].\x0au\x5cp\x89\xd4qi\x9c\xd0\xd7s\
+\xc0#E\x17r\xdd$\x07J\x108\x83S\x11\x8c\xd5\
+\xd84\xda\xe0\xc4/\x866a\x8d\xd3Y\x8aN\xf4\xb0\
+\x08\xcc\x85\xba\xdcT\x80\xde\x0c\xf9\xc5\xed<\xcc\xc3\x98\
+[\xa7@,\xa0@t\xf5\xa2s;d\xd3\x16\xe3\x8e\
+:\xcf\x98H\x98d\x1c\x98Nt\x19(\x11\xf1\x89\xc2\
+\x967\x01\x9d\xdcuvR\x08\x9c)<$\x051O\
+\xcd\x0e\xd4\x05}\xaf\x83\xdesg\xa0>\x93\x8b\x82\xaf\
+\x07R\xc9\xecN\xd4\xddIe&\x18\xd4\x10\xe3\x09:\
+w\xc8\xf7\xd6=\x1er\x22>(pFP5\x90\xbe\
+\xdeC\x940\xc3K:\x82\xe3\xe4\x0e\xc9\xd2\xc1Z\xa3\
+\x04{\xe3P\xb8\x99\xc9\x06\xac\xd5\x0a0^\xa6\xdf\xf1\
+\x98\x10Z\xed\x99\x9b);^~\xc5\x9c\x8c\x9cG\xe1\
+\x05V\xa1\x09R@<\xea\x81'Md\xe5<\x9e*\
+\x7f\x94\x98\xe8\x0a,>\x09\x8e\xa7\x18\xe9,\xa1$\x88\
+G\xdd4\x88\xf88\xef\xb2\xa1\xb6\x0e;\xee\xdcQy\
+*\x16g!>\x0f\x99\x0b%\xa2\x94\x5cw\xa1\x8e\x89\
+O~\x01\xe5\xeb\xc9H\x84\xf0\xe4\x8ed\x94\x0d8\xc1\
+\x8a\xe1B1*\x10\xa8:\xae@@\x22\xc4\xa0\xe4\xc2\
+\xdb7\x0e\x87\x03\x09\x89\xaepe\xc2\x1d\xb4u\xf0\xf6\
+\x0dF\x1a\x8aA\x1b\xe79\x87\xd1\x13\x11\x81\x94\xc4<\
+\x11\x88\x1e\xecB=$\xca\xc40\x0ei\x99\xf0\xdc\xce\
+\xe1\xfbq8OY79\xd1\xcfQvd\x1c\x0f\x0c\
+\x5c\x0d\xf0\xddD\xaf\xef\x82\x0b\xa4<\xe7\x90\x01Ag\
+\x80\x95\x84\xdfN\xdb<\xd9\xd7\x9eh\xb8P\x01E'\
+\xa2\xf1T\xac\xd7\xeb|`\x00\xd9\xb9\xfb,DW\x0e\
+yI\x9b\x0c/7\xd3zZ\x8f\x9d1\xb4J\xce\xe4\
+C-^\xb4\xe8\xb1x\x99\xce\x94\xc9EH'\xa2\xf0\
+\xba\x04\xba>\x8a\xbe\xa2.\xe7#\x18\xa4\xef\x8a8i\
+\xdf\xd0y\xc0\x9e$pvN,\x80\xe7\x22<\xee\xdc\
+\xba\x93\xf6\xcd\x0d\x19|\xdeq\x91\x8c\xc0>\xa1'\x06\
+H\xc6\xd6\xe9\xbf`OV\x1f\xe5\x1dV\xf3<\x8e\xb6\
+U\x90\xa5\x22\x84; \x5c.\xa7\xf1(N-\x8fw\
+\xac\xf5.\xb0\xab'*\x94\xc0x\xf8\x84\xec\x17/\x9c\
+\x8c\xcd\x81\xb3P\x0a\x1bU\xe0\x99\x08v\xeb\x0e\x90\x8a\
+\x80\xfb\xf5X\x93W\xb8\xb2o\xa6\xf5\x84\x0f\xc3#\xbb\
+\xb6PJ\x89\x9f\x84S\x82\x93\x8aP\xa0\x11\x22\xd9\x8e\
+@\x9cXS-\x18\x15g\x8e~\x98\xe7\xa2\x10=\xe1\
+\xc4\xa3<\x04(Q\xdc\xcc\xb2\xf0^(\xcf9#\x11\
+b\xf9z\x0fA\x8f\x91q\xcev\xa4\xb2P\x85\x06w\
+\xd8\xf9\xb6L\xf4\xfavh\x1a\xca\x13p\xf3p|\xbd\
+\xcbynG\xfa\x04+\xdd\xbc\x1e-z\x0eg\xad\x86\
+S\xad'(\x93\x91\xb0\x1d\x05P\xce\x84\xee.c\x14\
+ (\x00%;Q\x17\x94\x92\xcb\x920 x\xe1\xc6\
+\x0d>\xce48\x0e\x81\x94w\xc8v\x84gwX\x95\
+\x12\xbc\xa7M!T\x0d\x97\x0bJ{b\x9d\xd7t\x9c\
+7\xc4nl\xdf\x13\xf2\xdde\x0a\xc4\x02\x96u^q\
+\x16xP^O\x85\xe3L$z\x01H\x22\xa4\xf3\xfa\
+\x0d\x09\xf9\x05\xe6\xeb\xb1\xcc\x93\x87FC\x8c\x83\x03u\
+\xdc\x07\xc7!\xe42\xb0\x02)\x19\x9d\xc8C\xa3\xf8\x04\
+\x8c\x9e\x04\x92\x8a\xf3g\x1a\xbc\x82\x18|\xac\xad\x1a4\
+^\x8d\xbc\x89\xc0\xd9\xe3\xa1Q\xd3\xc1\xd9\xa8\x02\xc9\xeb\
+\x89^@\xa1\xd2\xb4\x05\xa6\xcbT*\xce8u\x128\
+\xdb\x11\xc3\xd5;\x1f\xb0\xe70\x0a\x10\x020gr\xa3\
+\xad(\x19'\x17\xb4L\xc7/P0\xf8\xa4/\xf2A\
+H\x84\xfe\x9b\xd9D\x08\xee\xde\xa0W\xba\x12\xe5\xf5\xe0\
+f\x83\xd3\xdd\x8e\xe8E\xa9X[(\x09\xcby\xc0=\
+\xf3$<|\xf0::\xd6\xf9(\x1b\xd2\xd7\xdf\x10\x05\
+\x02'\xb7\xe3\xa9\xe7\xf5\x1e\xe7\xbc'\x82\x16\xa3\xbb\x93\
+~^O\xc6\x1a\xe7AZ\x7fS\xa2g\x08\x1bM\x0e\
+\x96\xa7\x11\xf2\xdb\xe9N1R\xda=K\xb4\x1f\x99\xa7\
+>iK\xa1}\x83\xbf\x99\x0a\xd2\x0b\xf5\x80\xb9y8\
+\xefp:\xed\xd7\xd3\xd9\xde\x8e\xa6\xe4\xf2\x98\xab\x00`\
+\xe3\x96\xc0\x89\x01\x06\x87?\x8a\xb9\xe1\x0f\x12\xe1\xbb>\
+\x0bA\x8b\x17\x84\xcf`G\xbd\x8es;\x0c\xcf\x04\xec\
+\xdaz\xbdD\x9d;\xf4\x8e\x5c\xfb\xc8\x19T\x1f\xc5\xf0\
+\xf5\xc0;\xcac/w\xfc?U\x97$z\x0e0%\
+\xb9\x00\x00\x00\x00IEND\xaeB`\x82\
"
qt_resource_name = b"\
@@ -3832,14 +2280,10 @@ qt_resource_name = b"\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
-\x00\x0e\
-\x09\xbco'\
-\x00w\
-\x00a\x00t\x00e\x00r\x00m\x00a\x00r\x00k\x002\x00.\x00p\x00n\x00g\
-\x00\x09\
-\x0e&\xb1\xe7\
-\x00l\
-\x00o\x00g\x00o\x003\x00.\x00p\x00n\x00g\
+\x00\x0a\
+\x04\xc8G\xe7\
+\x00b\
+\x00a\x00n\x00n\x00e\x00r\x00.\x00p\x00n\x00g\
\x00\x0e\
\x07\x04\x9f\x87\
\x00b\
@@ -3848,39 +2292,19 @@ qt_resource_name = b"\
\x09\xbdo'\
\x00w\
\x00a\x00t\x00e\x00r\x00m\x00a\x00r\x00k\x001\x00.\x00p\x00n\x00g\
-\x00\x09\
-\x0e%\xb1\xe7\
-\x00l\
-\x00o\x00g\x00o\x002\x00.\x00p\x00n\x00g\
-\x00\x0a\
-\x04\xc8G\xe7\
-\x00b\
-\x00a\x00n\x00n\x00e\x00r\x00.\x00p\x00n\x00g\
-\x00\x09\
-\x0e$\xb1\xe7\
-\x00l\
-\x00o\x00g\x00o\x001\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x07\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\xa8\x00\x00\x00\x00\x00\x01\x00\x00\xd7\xe0\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00L\x00\x00\x00\x00\x00\x01\x00\x00@\x9b\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00n\x00\x00\x00\x00\x00\x01\x00\x00\x98\xd1\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\xc2\x00\x00\x00\x00\x00\x01\x00\x00\xe7O\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\xd1\x89\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x004\x00\x00\x00\x00\x00\x01\x00\x00:D\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x05\
+\x00\x00\x00,\x00\x00\x00\x00\x00\x01\x00\x00\x0fo\
+\x00\x00\x01z\xe7\xee'\x05\
+\x00\x00\x00N\x00\x00\x00\x00\x00\x01\x00\x00]\xa5\
+\x00\x00\x01z\xe7\xee'\x05\
"
def qInitResources():
diff --git a/examples/widgets/dialogs/classwizard/doc/classwizard.png b/examples/widgets/dialogs/classwizard/doc/classwizard.png
new file mode 100644
index 000000000..2245a89db
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/doc/classwizard.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/doc/classwizard.rst b/examples/widgets/dialogs/classwizard/doc/classwizard.rst
new file mode 100644
index 000000000..e4a46ade8
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/doc/classwizard.rst
@@ -0,0 +1,11 @@
+Classwizard Example
+===================
+
+Demonstrates the use of QDialog in a wizard application
+
+This example demonstrates the use a custom QDialog in a wizard,
+which generates Python class template code.
+
+.. image:: classwizard.png
+ :width: 400
+ :alt: classwizard screenshot
diff --git a/examples/widgets/dialogs/classwizard/images/background.png b/examples/widgets/dialogs/classwizard/images/background.png
index 44c7badb8..14cc8e179 100644
--- a/examples/widgets/dialogs/classwizard/images/background.png
+++ b/examples/widgets/dialogs/classwizard/images/background.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo1.png b/examples/widgets/dialogs/classwizard/images/logo1.png
deleted file mode 100644
index f9b594aaf..000000000
--- a/examples/widgets/dialogs/classwizard/images/logo1.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo2.png b/examples/widgets/dialogs/classwizard/images/logo2.png
deleted file mode 100644
index 5dcbd4669..000000000
--- a/examples/widgets/dialogs/classwizard/images/logo2.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/logo3.png b/examples/widgets/dialogs/classwizard/images/logo3.png
deleted file mode 100644
index 9fd3ea235..000000000
--- a/examples/widgets/dialogs/classwizard/images/logo3.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/watermark1.png b/examples/widgets/dialogs/classwizard/images/watermark1.png
index 0091f5c17..2b4d7e56b 100644
--- a/examples/widgets/dialogs/classwizard/images/watermark1.png
+++ b/examples/widgets/dialogs/classwizard/images/watermark1.png
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/images/watermark2.png b/examples/widgets/dialogs/classwizard/images/watermark2.png
deleted file mode 100644
index 3b88f2e36..000000000
--- a/examples/widgets/dialogs/classwizard/images/watermark2.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/dialogs/classwizard/listchooser.py b/examples/widgets/dialogs/classwizard/listchooser.py
new file mode 100644
index 000000000..6bf47c6d1
--- /dev/null
+++ b/examples/widgets/dialogs/classwizard/listchooser.py
@@ -0,0 +1,173 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import QRegularExpression, Property, Slot
+from PySide6.QtGui import QRegularExpressionValidator
+from PySide6.QtWidgets import (QComboBox, QDialog, QDialogButtonBox,
+ QFormLayout, QGroupBox, QHBoxLayout,
+ QLineEdit, QListWidget,
+ QListWidgetItem, QPushButton, QVBoxLayout,
+ )
+
+
+DEFAULT_TYPES = ['int', 'str', 'PySide6.QtCore.QPoint', 'PySide6.QtCore.QRect',
+ 'PySide6.QtCore.QSize', 'PySide6.QtGui.QColor']
+
+
+FUNCTION_PATTERN = r'^\w+\([\w ,]*\)$'
+
+
+class ValidatingInputDialog(QDialog):
+ """A dialog for text input with a regular expression validation."""
+ def __init__(self, label, pattern, parent=None):
+ super().__init__(parent)
+ layout = QVBoxLayout(self)
+
+ self._form_layout = QFormLayout()
+ self._lineedit = QLineEdit()
+ self._lineedit.setClearButtonEnabled(True)
+ re = QRegularExpression(pattern)
+ assert re.isValid()
+ self._validator = QRegularExpressionValidator(re, self)
+ self._lineedit.setValidator(self._validator)
+ self._form_layout.addRow(label, self._lineedit)
+ layout.addLayout(self._form_layout)
+
+ bb = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+ layout.addWidget(bb)
+ bb.rejected.connect(self.reject)
+ bb.accepted.connect(self.accept)
+
+ @Property(str)
+ def text(self):
+ return self._lineedit.text()
+
+ @text.setter
+ def text(self, t):
+ self._lineedit.setText(t)
+
+ @Property(str)
+ def placeholder_text(self):
+ return self._lineedit.placeholderText()
+
+ @placeholder_text.setter
+ def placeholder_text(self, t):
+ self._lineedit.setPlaceholderText(t)
+
+ @Property(int)
+ def cursor_position(self):
+ return self._lineedit.cursorPosition()
+
+ @cursor_position.setter
+ def cursor_position(self, p):
+ self._lineedit.setCursorPosition(p)
+
+ def is_valid(self):
+ return self.text
+
+ def accept(self):
+ if self.is_valid():
+ super(ValidatingInputDialog, self).accept()
+
+
+class FunctionSignatureDialog(ValidatingInputDialog):
+ """A dialog for input of function signatures."""
+ def __init__(self, name, parent=None):
+ super().__init__(name, FUNCTION_PATTERN, parent)
+ self.text = '()'
+ self.cursor_position = 0
+
+
+class PropertyDialog(ValidatingInputDialog):
+ """A dialog for input of a property name and type."""
+ def __init__(self, parent=None):
+ super().__init__('&Name:', r'^\w+$', parent)
+ self.setWindowTitle('Add a Property')
+ self._type_combo = QComboBox()
+ self._type_combo.addItems(DEFAULT_TYPES)
+ self._form_layout.insertRow(0, '&Type:', self._type_combo)
+
+ def property_type(self):
+ return self._type_combo.currentText()
+
+
+class ListChooser(QGroupBox):
+ """A widget for editing a list of strings with a customization point
+ for creating the strings."""
+ def __init__(self, title, parent=None):
+ super().__init__(title, parent)
+ main_layout = QHBoxLayout(self)
+ self._list = QListWidget(self)
+ self._list.currentItemChanged.connect(self._current_item_changed)
+ main_layout.addWidget(self._list)
+
+ vbox_layout = QVBoxLayout()
+ main_layout.addLayout(vbox_layout)
+ self._addButton = QPushButton("Add...")
+ vbox_layout.addWidget(self._addButton)
+ self._addButton.clicked.connect(self._add)
+ self._removeButton = QPushButton("Remove")
+ self._removeButton.setEnabled(False)
+ self._removeButton.clicked.connect(self._remove_current)
+ vbox_layout.addWidget(self._removeButton)
+ vbox_layout.addStretch()
+
+ @Property(list)
+ def items(self):
+ result = []
+ for i in range(self._list.count()):
+ result.append(self._list.item(i).text())
+ return result
+
+ @items.setter
+ def items(self, item_list):
+ self._list.clear()
+ for i in item_list:
+ self._list.append(i)
+
+ @Slot(QListWidgetItem, QListWidgetItem)
+ def _current_item_changed(self, current, previous):
+ self._removeButton.setEnabled(current is not None)
+
+ @Slot()
+ def _add(self):
+ new_item = self._create_new_item()
+ if new_item:
+ self._list.addItem(new_item)
+
+ def _create_new_item(self):
+ """Overwrite to return a new item."""
+ return 'new_item'
+
+ @Slot()
+ def _remove_current(self):
+ row = self._list.row(self._list.currentItem())
+ if row >= 0:
+ self._list.takeItem(row)
+
+
+class SignalChooser(ListChooser):
+ """A widget for editing a list of signal function signatures."""
+ def __init__(self, parent=None):
+ super().__init__('Signals', parent)
+
+ def _create_new_item(self):
+ dialog = FunctionSignatureDialog('&Signal signature:', self)
+ dialog.setWindowTitle('Enter Signal')
+ if dialog.exec() != QDialog.Accepted:
+ return ''
+ return dialog.text
+
+
+class PropertyChooser(ListChooser):
+ """A widget for editing a list of properties as a string of 'type name'."""
+ def __init__(self, parent=None):
+ super().__init__('Properties', parent)
+
+ def _create_new_item(self):
+ dialog = PropertyDialog(self)
+ if dialog.exec() != QDialog.Accepted:
+ return ''
+ name = dialog.text
+ property_type = dialog.property_type()
+ return f'{property_type} {name}'
diff --git a/examples/widgets/dialogs/dialogs.pyproject b/examples/widgets/dialogs/dialogs.pyproject
deleted file mode 100644
index 001fd141b..000000000
--- a/examples/widgets/dialogs/dialogs.pyproject
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "files": ["findfiles.py", "standarddialogs.py", "extension.py",
- "trivialwizard.py"]
-}
diff --git a/examples/widgets/dialogs/extension.py b/examples/widgets/dialogs/extension.py
deleted file mode 100644
index 6d560c82a..000000000
--- a/examples/widgets/dialogs/extension.py
+++ /dev/null
@@ -1,113 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/dialogs/extension example from Qt v5.x"""
-
-from PySide2 import QtCore, QtWidgets
-
-
-class FindDialog(QtWidgets.QDialog):
- def __init__(self, parent=None):
- super(FindDialog, self).__init__(parent)
-
- label = QtWidgets.QLabel("Find &what:")
- lineEdit = QtWidgets.QLineEdit()
- label.setBuddy(lineEdit)
-
- caseCheckBox = QtWidgets.QCheckBox("Match &case")
- fromStartCheckBox = QtWidgets.QCheckBox("Search from &start")
- fromStartCheckBox.setChecked(True)
-
- findButton = QtWidgets.QPushButton("&Find")
- findButton.setDefault(True)
-
- moreButton = QtWidgets.QPushButton("&More")
- moreButton.setCheckable(True)
- moreButton.setAutoDefault(False)
-
- buttonBox = QtWidgets.QDialogButtonBox(QtCore.Qt.Vertical)
- buttonBox.addButton(findButton, QtWidgets.QDialogButtonBox.ActionRole)
- buttonBox.addButton(moreButton, QtWidgets.QDialogButtonBox.ActionRole)
-
- extension = QtWidgets.QWidget()
-
- wholeWordsCheckBox = QtWidgets.QCheckBox("&Whole words")
- backwardCheckBox = QtWidgets.QCheckBox("Search &backward")
- searchSelectionCheckBox = QtWidgets.QCheckBox("Search se&lection")
-
- moreButton.toggled.connect(extension.setVisible)
-
- extensionLayout = QtWidgets.QVBoxLayout()
- extensionLayout.setContentsMargins(0, 0, 0, 0)
- extensionLayout.addWidget(wholeWordsCheckBox)
- extensionLayout.addWidget(backwardCheckBox)
- extensionLayout.addWidget(searchSelectionCheckBox)
- extension.setLayout(extensionLayout)
-
- topLeftLayout = QtWidgets.QHBoxLayout()
- topLeftLayout.addWidget(label)
- topLeftLayout.addWidget(lineEdit)
-
- leftLayout = QtWidgets.QVBoxLayout()
- leftLayout.addLayout(topLeftLayout)
- leftLayout.addWidget(caseCheckBox)
- leftLayout.addWidget(fromStartCheckBox)
- leftLayout.addStretch(1)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.setSizeConstraint(QtWidgets.QLayout.SetFixedSize)
- mainLayout.addLayout(leftLayout, 0, 0)
- mainLayout.addWidget(buttonBox, 0, 1)
- mainLayout.addWidget(extension, 1, 0, 1, 2)
- self.setLayout(mainLayout)
-
- self.setWindowTitle("Extension")
- extension.hide()
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- dialog = FindDialog()
- sys.exit(dialog.exec_())
diff --git a/examples/widgets/dialogs/extension/extension.py b/examples/widgets/dialogs/extension/extension.py
new file mode 100644
index 000000000..b8919f38e
--- /dev/null
+++ b/examples/widgets/dialogs/extension/extension.py
@@ -0,0 +1,77 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/dialogs/extension example from Qt v5.x"""
+
+import sys
+
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog,
+ QDialogButtonBox, QGridLayout, QHBoxLayout,
+ QLabel, QLayout, QLineEdit, QPushButton,
+ QVBoxLayout, QWidget)
+
+
+class FindDialog(QDialog):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ label = QLabel("Find &what:")
+ line_edit = QLineEdit()
+ label.setBuddy(line_edit)
+
+ case_check_box = QCheckBox("Match &case")
+ from_start_check_box = QCheckBox("Search from &start")
+ from_start_check_box.setChecked(True)
+
+ find_button = QPushButton("&Find")
+ find_button.setDefault(True)
+
+ more_button = QPushButton("&More")
+ more_button.setCheckable(True)
+ more_button.setAutoDefault(False)
+
+ button_box = QDialogButtonBox(Qt.Vertical)
+ button_box.addButton(find_button, QDialogButtonBox.ActionRole)
+ button_box.addButton(more_button, QDialogButtonBox.ActionRole)
+
+ extension = QWidget()
+
+ whole_words_check_box = QCheckBox("&Whole words")
+ backward_check_box = QCheckBox("Search &backward")
+ search_selection_check_box = QCheckBox("Search se&lection")
+
+ more_button.toggled.connect(extension.setVisible)
+
+ extension_layout = QVBoxLayout()
+ extension_layout.setContentsMargins(0, 0, 0, 0)
+ extension_layout.addWidget(whole_words_check_box)
+ extension_layout.addWidget(backward_check_box)
+ extension_layout.addWidget(search_selection_check_box)
+ extension.setLayout(extension_layout)
+
+ top_left_layout = QHBoxLayout()
+ top_left_layout.addWidget(label)
+ top_left_layout.addWidget(line_edit)
+
+ left_layout = QVBoxLayout()
+ left_layout.addLayout(top_left_layout)
+ left_layout.addWidget(case_check_box)
+ left_layout.addWidget(from_start_check_box)
+ left_layout.addStretch(1)
+
+ main_layout = QGridLayout(self)
+ main_layout.setSizeConstraint(QLayout.SetFixedSize)
+ main_layout.addLayout(left_layout, 0, 0)
+ main_layout.addWidget(button_box, 0, 1)
+ main_layout.addWidget(extension, 1, 0, 1, 2)
+
+ self.setWindowTitle("Extension")
+ extension.hide()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ dialog = FindDialog()
+ sys.exit(dialog.exec())
diff --git a/examples/widgets/dialogs/extension/extension.pyproject b/examples/widgets/dialogs/extension/extension.pyproject
new file mode 100644
index 000000000..e0f2ba73b
--- /dev/null
+++ b/examples/widgets/dialogs/extension/extension.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["extension.py"]
+}
diff --git a/examples/widgets/dialogs/findfiles.py b/examples/widgets/dialogs/findfiles.py
deleted file mode 100644
index cf2be86db..000000000
--- a/examples/widgets/dialogs/findfiles.py
+++ /dev/null
@@ -1,210 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/dialogs/findfiles example from Qt v5.x"""
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class Window(QtWidgets.QDialog):
- def __init__(self, parent=None):
- super(Window, self).__init__(parent)
-
- self.browseButton = self.createButton("&Browse...", self.browse)
- self.findButton = self.createButton("&Find", self.find)
-
- self.fileComboBox = self.createComboBox("*")
- self.textComboBox = self.createComboBox()
- self.directoryComboBox = self.createComboBox(QtCore.QDir.currentPath())
-
- fileLabel = QtWidgets.QLabel("Named:")
- textLabel = QtWidgets.QLabel("Containing text:")
- directoryLabel = QtWidgets.QLabel("In directory:")
- self.filesFoundLabel = QtWidgets.QLabel()
-
- self.createFilesTable()
-
- buttonsLayout = QtWidgets.QHBoxLayout()
- buttonsLayout.addStretch()
- buttonsLayout.addWidget(self.findButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(fileLabel, 0, 0)
- mainLayout.addWidget(self.fileComboBox, 0, 1, 1, 2)
- mainLayout.addWidget(textLabel, 1, 0)
- mainLayout.addWidget(self.textComboBox, 1, 1, 1, 2)
- mainLayout.addWidget(directoryLabel, 2, 0)
- mainLayout.addWidget(self.directoryComboBox, 2, 1)
- mainLayout.addWidget(self.browseButton, 2, 2)
- mainLayout.addWidget(self.filesTable, 3, 0, 1, 3)
- mainLayout.addWidget(self.filesFoundLabel, 4, 0)
- mainLayout.addLayout(buttonsLayout, 5, 0, 1, 3)
- self.setLayout(mainLayout)
-
- self.setWindowTitle("Find Files")
- self.resize(500, 300)
-
- def browse(self):
- directory = QtWidgets.QFileDialog.getExistingDirectory(self, "Find Files",
- QtCore.QDir.currentPath())
-
- if directory:
- if self.directoryComboBox.findText(directory) == -1:
- self.directoryComboBox.addItem(directory)
-
- self.directoryComboBox.setCurrentIndex(self.directoryComboBox.findText(directory))
-
- @staticmethod
- def updateComboBox(comboBox):
- if comboBox.findText(comboBox.currentText()) == -1:
- comboBox.addItem(comboBox.currentText())
-
- def find(self):
- self.filesTable.setRowCount(0)
-
- fileName = self.fileComboBox.currentText()
- text = self.textComboBox.currentText()
- path = self.directoryComboBox.currentText()
-
- self.updateComboBox(self.fileComboBox)
- self.updateComboBox(self.textComboBox)
- self.updateComboBox(self.directoryComboBox)
-
- self.currentDir = QtCore.QDir(path)
- if not fileName:
- fileName = "*"
- files = self.currentDir.entryList([fileName],
- QtCore.QDir.Files | QtCore.QDir.NoSymLinks)
-
- if text:
- files = self.findFiles(files, text)
- self.showFiles(files)
-
- def findFiles(self, files, text):
- progressDialog = QtWidgets.QProgressDialog(self)
-
- progressDialog.setCancelButtonText("&Cancel")
- progressDialog.setRange(0, len(files))
- progressDialog.setWindowTitle("Find Files")
-
- foundFiles = []
-
- for i in range(len(files)):
- progressDialog.setValue(i)
- progressDialog.setLabelText("Searching file number %d of %d..." % (i, len(files)))
- QtCore.QCoreApplication.processEvents()
-
- if progressDialog.wasCanceled():
- break
-
- inFile = QtCore.QFile(self.currentDir.absoluteFilePath(files[i]))
-
- if inFile.open(QtCore.QIODevice.ReadOnly):
- stream = QtCore.QTextStream(inFile)
- while not stream.atEnd():
- if progressDialog.wasCanceled():
- break
- line = stream.readLine()
- if text in line:
- foundFiles.append(files[i])
- break
-
- progressDialog.close()
-
- return foundFiles
-
- def showFiles(self, files):
- for fn in files:
- file = QtCore.QFile(self.currentDir.absoluteFilePath(fn))
- size = QtCore.QFileInfo(file).size()
-
- fileNameItem = QtWidgets.QTableWidgetItem(fn)
- fileNameItem.setFlags(fileNameItem.flags() ^ QtCore.Qt.ItemIsEditable)
- sizeItem = QtWidgets.QTableWidgetItem("%d KB" % (int((size + 1023) / 1024)))
- sizeItem.setTextAlignment(QtCore.Qt.AlignVCenter | QtCore.Qt.AlignRight)
- sizeItem.setFlags(sizeItem.flags() ^ QtCore.Qt.ItemIsEditable)
-
- row = self.filesTable.rowCount()
- self.filesTable.insertRow(row)
- self.filesTable.setItem(row, 0, fileNameItem)
- self.filesTable.setItem(row, 1, sizeItem)
-
- self.filesFoundLabel.setText("%d file(s) found (Double click on a file to open it)" % len(files))
-
- def createButton(self, text, member):
- button = QtWidgets.QPushButton(text)
- button.clicked.connect(member)
- return button
-
- def createComboBox(self, text=""):
- comboBox = QtWidgets.QComboBox()
- comboBox.setEditable(True)
- comboBox.addItem(text)
- comboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
- QtWidgets.QSizePolicy.Preferred)
- return comboBox
-
- def createFilesTable(self):
- self.filesTable = QtWidgets.QTableWidget(0, 2)
- self.filesTable.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows)
-
- self.filesTable.setHorizontalHeaderLabels(("File Name", "Size"))
- self.filesTable.horizontalHeader().setSectionResizeMode(0, QtWidgets.QHeaderView.Stretch)
- self.filesTable.verticalHeader().hide()
- self.filesTable.setShowGrid(False)
-
- self.filesTable.cellActivated.connect(self.openFileOfItem)
-
- def openFileOfItem(self, row, column):
- item = self.filesTable.item(row, 0)
-
- QtGui.QDesktopServices.openUrl(QtCore.QUrl(self.currentDir.absoluteFilePath(item.text())))
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = Window()
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/dialogs/licensewizard/doc/licensewizard.png b/examples/widgets/dialogs/licensewizard/doc/licensewizard.png
new file mode 100644
index 000000000..cdba877ca
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/doc/licensewizard.png
Binary files differ
diff --git a/examples/widgets/dialogs/licensewizard/doc/licensewizard.rst b/examples/widgets/dialogs/licensewizard/doc/licensewizard.rst
new file mode 100644
index 000000000..a0569006f
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/doc/licensewizard.rst
@@ -0,0 +1,9 @@
+License Wizard Example
+======================
+
+The License Wizard example shows how to implement complex wizards in Qt.
+`Original example <https://doc.qt.io/qt-6/qtwidgets-dialogs-licensewizard-example.html>`_.
+
+.. image:: licensewizard.png
+ :width: 623
+ :alt: licensewizard screenshot
diff --git a/examples/widgets/dialogs/licensewizard/images/logo.png b/examples/widgets/dialogs/licensewizard/images/logo.png
new file mode 100644
index 000000000..56f17a3e5
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/images/logo.png
Binary files differ
diff --git a/examples/widgets/dialogs/licensewizard/images/watermark.png b/examples/widgets/dialogs/licensewizard/images/watermark.png
new file mode 100644
index 000000000..124a05068
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/images/watermark.png
Binary files differ
diff --git a/examples/widgets/dialogs/licensewizard/licensewizard.py b/examples/widgets/dialogs/licensewizard/licensewizard.py
new file mode 100644
index 000000000..28667d173
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/licensewizard.py
@@ -0,0 +1,298 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from enum import IntEnum
+from pathlib import Path
+
+from PySide6.QtCore import QRegularExpression
+from PySide6.QtGui import QPixmap, QRegularExpressionValidator
+from PySide6.QtPrintSupport import QPrintDialog, QPrinter
+from PySide6.QtWidgets import (QCheckBox, QGridLayout, QLabel, QLineEdit,
+ QMessageBox, QRadioButton, QVBoxLayout, QWizard,
+ QWizardPage)
+
+EMAIL_REGEXP = ".+@.+"
+
+
+class Pages(IntEnum):
+ Page_Intro = 0
+ Page_Evaluate = 1
+ Page_Register = 2
+ Page_Details = 3
+ Page_Conclusion = 4
+
+
+class IntroPage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.setTitle("Introduction")
+
+ path = Path(__file__).resolve().parent
+
+ self.setPixmap(QWizard.WatermarkPixmap, QPixmap(path / "images" / "watermark.png"))
+ self.top_label = QLabel(
+ "This wizard will help you register your copy of "
+ "<i>Super Product One</i>&trade; or start "
+ "evaluating the product"
+ )
+ self.top_label.setWordWrap(True)
+
+ self.register_radio_button = QRadioButton("&Register your copy")
+ self.register_radio_button.setChecked(True)
+
+ self.evaluate_radio_button = QRadioButton("&Evaluate the product for 30 days")
+ layout = QVBoxLayout(self)
+ layout.addWidget(self.top_label)
+ layout.addWidget(self.register_radio_button)
+ layout.addWidget(self.evaluate_radio_button)
+
+ def nextId(self):
+ if self.evaluate_radio_button.isChecked():
+ return Pages.Page_Evaluate
+ else:
+ return Pages.Page_Register
+
+
+class EvaluatePage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setTitle("Evaluate <i>Super Product One</i>&trade")
+ self.setSubTitle(
+ "Please fill both fields. Make sure to provide a valid "
+ "email address (e.g., john.smith@example.com)."
+ )
+
+ self.name_label = QLabel("N&ame:")
+ self.name_line_edit = QLineEdit()
+
+ self.name_label.setBuddy(self.name_line_edit)
+
+ self.email_label = QLabel("&Email address:")
+ self.email_line_edit = QLineEdit()
+ self.email_line_edit.setValidator(
+ QRegularExpressionValidator(QRegularExpression(EMAIL_REGEXP), self)
+ )
+ self.email_label.setBuddy(self.email_line_edit)
+
+ self.registerField("evaluate.name*", self.name_line_edit)
+ self.registerField("evaluate.email*", self.email_line_edit)
+
+ layout = QGridLayout(self)
+ layout.addWidget(self.name_label, 0, 0)
+ layout.addWidget(self.name_line_edit, 0, 1)
+ layout.addWidget(self.email_label, 1, 0)
+ layout.addWidget(self.email_line_edit, 1, 1)
+
+ def nextId(self):
+ return Pages.Page_Conclusion
+
+
+class RegisterPage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setTitle("Register Your Copy of <i>Super Product One</i>&trade")
+ self.setSubTitle("If you have an upgrade key, please fill in " "the appropriate field.")
+
+ self.name_label = QLabel("N&ame:")
+ self.name_line_edit = QLineEdit()
+ self.name_label.setBuddy(self.name_line_edit)
+
+ self.upgrade_key_label = QLabel("&Upgrade key:")
+ self.upgrade_key_line_edit = QLineEdit()
+ self.upgrade_key_label.setBuddy(self.upgrade_key_line_edit)
+
+ self.registerField("register.name*", self.name_line_edit)
+ self.registerField("register.upgradeKey", self.upgrade_key_line_edit)
+
+ layout = QGridLayout(self)
+ layout.addWidget(self.name_label, 0, 0)
+ layout.addWidget(self.name_line_edit, 0, 1)
+ layout.addWidget(self.upgrade_key_label, 1, 0)
+ layout.addWidget(self.upgrade_key_line_edit, 1, 1)
+
+ def nextId(self):
+ if self.upgrade_key_line_edit.text():
+ return Pages.Page_Details
+ else:
+ return Pages.Page_Conclusion
+
+
+class DetailsPage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setTitle("Fill In Your Details")
+ self.setSubTitle(
+ "Please fill all three fields. Make sure to provide a valid "
+ "email address (e.g., tanaka.aya@example.co.jp)."
+ )
+
+ self.company_label = QLabel("&Company name:")
+ self.company_line_edit = QLineEdit()
+ self.company_label.setBuddy(self.company_line_edit)
+
+ self.email_label = QLabel("&Email address:")
+ self.email_line_edit = QLineEdit()
+ self.email_line_edit.setValidator(
+ QRegularExpressionValidator(QRegularExpression(EMAIL_REGEXP), self)
+ )
+ self.email_label.setBuddy(self.email_line_edit)
+
+ self.postal_label = QLabel("&Postal address:")
+ self.postal_line_edit = QLineEdit()
+ self.postal_label.setBuddy(self.postal_line_edit)
+
+ self.registerField("details.company*", self.company_line_edit)
+ self.registerField("details.email*", self.email_line_edit)
+ self.registerField("details.postal*", self.postal_line_edit)
+
+ layout = QGridLayout(self)
+ layout.addWidget(self.company_label, 0, 0)
+ layout.addWidget(self.company_line_edit, 0, 1)
+ layout.addWidget(self.email_label, 1, 0)
+ layout.addWidget(self.email_line_edit, 1, 1)
+ layout.addWidget(self.postal_label, 2, 0)
+ layout.addWidget(self.postal_line_edit, 2, 1)
+
+ def nextId(self):
+ return Pages.Page_Conclusion
+
+
+class ConclusionPage(QWizardPage):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setTitle("Complete Your Registration")
+
+ path = Path(__file__).resolve().parent
+ self.setPixmap(QWizard.WatermarkPixmap, QPixmap(path / "images" / "watermark.png"))
+
+ self.bottom_label = QLabel()
+ self.bottom_label.setWordWrap(True)
+
+ agreeCheckBox = QCheckBox("I agree to the terms of the license")
+
+ self.registerField("conclusion.agree*", agreeCheckBox)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(self.bottom_label)
+ layout.addWidget(agreeCheckBox)
+
+ self.custom_button_clicked_signal_connected = False
+
+ def nextId(self):
+ return -1
+
+ def initializePage(self):
+ if self.wizard().hasVisitedPage(Pages.Page_Evaluate):
+ license_text = "<u>Evaluation License Agreement:</u> "
+ "You can use self software for 30 days and make one "
+ "backup, but you are not allowed to distribute it."
+ elif self.wizard().hasVisitedPage(Pages.Page_Details):
+ license_text = (
+ "<u>First-Time License Agreement:</u> "
+ "You can use self software subject to the license "
+ "you will receive by email."
+ )
+
+ else:
+ license_text = (
+ "<u>Upgrade License Agreement:</u> "
+ "This software is licensed under the terms of your "
+ "current license."
+ )
+ self.bottom_label.setText(license_text)
+
+ def setVisible(self, visible: bool):
+ super().setVisible(visible)
+ if visible:
+ self.wizard().setButtonText(QWizard.CustomButton1, "&Print")
+ self.wizard().setOption(QWizard.HaveCustomButton1, True)
+
+ if not self.custom_button_clicked_signal_connected:
+ self.custom_button_clicked_signal_connected = True
+ self.wizard().customButtonClicked.connect(self.print_button_clicked)
+ else:
+ self.wizard().setOption(QWizard.HaveCustomButton1, False)
+
+ if self.custom_button_clicked_signal_connected:
+ self.custom_button_clicked_signal_connected = False
+ self.wizard().customButtonClicked.disconnect(self.print_button_clicked)
+
+ def print_button_clicked(self):
+ printer = QPrinter()
+
+ dialog = QPrintDialog(printer, self)
+ if dialog.exec():
+ QMessageBox.warning(
+ self,
+ "Print License",
+ "As an environmentally friendly measure, the "
+ "license text will not actually be printed.",
+ )
+
+
+class LicenseWizard(QWizard):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._pages = [
+ IntroPage(),
+ EvaluatePage(),
+ RegisterPage(),
+ DetailsPage(),
+ ConclusionPage()
+ ]
+
+ for page in self._pages:
+ self.addPage(page)
+
+ self.setStartId(Pages.Page_Intro)
+
+ if sys.platform == 'darwin':
+ self.setWizardStyle(QWizard.ModernStyle)
+
+ self.setOption(QWizard.HaveHelpButton, True)
+
+ path = Path(__file__).resolve().parent
+ self.setPixmap(QWizard.LogoPixmap, QPixmap(path / "images" / "logo.png"))
+
+ self.helpRequested.connect(self.show_help)
+ self.setWindowTitle("License Wizard")
+
+ self.last_help_message: str = None
+
+ def show_help(self):
+ if self.currentId() == Pages.Page_Intro:
+ message = "The decision you make here will affect which page you get to see next."
+
+ elif self.currentId() == Pages.Page_Evaluate:
+ message = (
+ "Make sure to provide a valid email address, such as "
+ "toni.buddenbrook@example.de."
+ )
+
+ elif self.currentId() == Pages.Page_Register:
+ message = (
+ "If you don't provide an upgrade key, you will be asked to fill in your details."
+ )
+
+ elif self.currentId() == Pages.Page_Details:
+ message = (
+ "Make sure to provide a valid email address, such as "
+ "thomas.gradgrind@example.co.uk."
+ )
+
+ elif self.currentId() == Pages.Page_Conclusion:
+ message = "You must accept the terms and conditions of the license to proceed."
+ else:
+ message = "This help is likely not to be of any help."
+
+ if self.last_help_message == message:
+ message = (
+ "Sorry, I already gave what help I could. Maybe you should try asking a human?"
+ )
+
+ QMessageBox.information(self, "License Wizard Help", message)
+
+ self.last_help_message = message
diff --git a/examples/widgets/dialogs/licensewizard/licensewizard.pyproject b/examples/widgets/dialogs/licensewizard/licensewizard.pyproject
new file mode 100644
index 000000000..ef8b80173
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/licensewizard.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "licensewizard.py"]
+}
diff --git a/examples/widgets/dialogs/licensewizard/main.py b/examples/widgets/dialogs/licensewizard/main.py
new file mode 100644
index 000000000..26537ddf9
--- /dev/null
+++ b/examples/widgets/dialogs/licensewizard/main.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtWidgets import QApplication
+
+from licensewizard import LicenseWizard
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ wizard = LicenseWizard()
+ wizard.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/dialogs/standarddialogs.py b/examples/widgets/dialogs/standarddialogs.py
deleted file mode 100644
index f61157e75..000000000
--- a/examples/widgets/dialogs/standarddialogs.py
+++ /dev/null
@@ -1,319 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/dialogs/standarddialogs example from Qt v5.x"""
-
-import sys
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class Dialog(QtWidgets.QDialog):
- MESSAGE = "<p>Message boxes have a caption, a text, and up to three " \
- "buttons, each with standard or custom texts.</p>" \
- "<p>Click a button to close the message box. Pressing the Esc " \
- "button will activate the detected escape button (if any).</p>"
-
- def __init__(self, parent=None):
- super(Dialog, self).__init__(parent)
-
- self.openFilesPath = ''
-
- self.errorMessageDialog = QtWidgets.QErrorMessage(self)
-
- frameStyle = QtWidgets.QFrame.Sunken | QtWidgets.QFrame.Panel
-
- self.integerLabel = QtWidgets.QLabel()
- self.integerLabel.setFrameStyle(frameStyle)
- self.integerButton = QtWidgets.QPushButton("QInputDialog.get&Integer()")
-
- self.doubleLabel = QtWidgets.QLabel()
- self.doubleLabel.setFrameStyle(frameStyle)
- self.doubleButton = QtWidgets.QPushButton("QInputDialog.get&Double()")
-
- self.itemLabel = QtWidgets.QLabel()
- self.itemLabel.setFrameStyle(frameStyle)
- self.itemButton = QtWidgets.QPushButton("QInputDialog.getIte&m()")
-
- self.textLabel = QtWidgets.QLabel()
- self.textLabel.setFrameStyle(frameStyle)
- self.textButton = QtWidgets.QPushButton("QInputDialog.get&Text()")
-
- self.colorLabel = QtWidgets.QLabel()
- self.colorLabel.setFrameStyle(frameStyle)
- self.colorButton = QtWidgets.QPushButton("QColorDialog.get&Color()")
-
- self.fontLabel = QtWidgets.QLabel()
- self.fontLabel.setFrameStyle(frameStyle)
- self.fontButton = QtWidgets.QPushButton("QFontDialog.get&Font()")
-
- self.directoryLabel = QtWidgets.QLabel()
- self.directoryLabel.setFrameStyle(frameStyle)
- self.directoryButton = QtWidgets.QPushButton("QFileDialog.getE&xistingDirectory()")
-
- self.openFileNameLabel = QtWidgets.QLabel()
- self.openFileNameLabel.setFrameStyle(frameStyle)
- self.openFileNameButton = QtWidgets.QPushButton("QFileDialog.get&OpenFileName()")
-
- self.openFileNamesLabel = QtWidgets.QLabel()
- self.openFileNamesLabel.setFrameStyle(frameStyle)
- self.openFileNamesButton = QtWidgets.QPushButton("QFileDialog.&getOpenFileNames()")
-
- self.saveFileNameLabel = QtWidgets.QLabel()
- self.saveFileNameLabel.setFrameStyle(frameStyle)
- self.saveFileNameButton = QtWidgets.QPushButton("QFileDialog.get&SaveFileName()")
-
- self.criticalLabel = QtWidgets.QLabel()
- self.criticalLabel.setFrameStyle(frameStyle)
- self.criticalButton = QtWidgets.QPushButton("QMessageBox.critica&l()")
-
- self.informationLabel = QtWidgets.QLabel()
- self.informationLabel.setFrameStyle(frameStyle)
- self.informationButton = QtWidgets.QPushButton("QMessageBox.i&nformation()")
-
- self.questionLabel = QtWidgets.QLabel()
- self.questionLabel.setFrameStyle(frameStyle)
- self.questionButton = QtWidgets.QPushButton("QMessageBox.&question()")
-
- self.warningLabel = QtWidgets.QLabel()
- self.warningLabel.setFrameStyle(frameStyle)
- self.warningButton = QtWidgets.QPushButton("QMessageBox.&warning()")
-
- self.errorLabel = QtWidgets.QLabel()
- self.errorLabel.setFrameStyle(frameStyle)
- self.errorButton = QtWidgets.QPushButton("QErrorMessage.show&M&essage()")
-
- self.integerButton.clicked.connect(self.setInteger)
- self.doubleButton.clicked.connect(self.setDouble)
- self.itemButton.clicked.connect(self.setItem)
- self.textButton.clicked.connect(self.setText)
- self.colorButton.clicked.connect(self.setColor)
- self.fontButton.clicked.connect(self.setFont)
- self.directoryButton.clicked.connect(self.setExistingDirectory)
- self.openFileNameButton.clicked.connect(self.setOpenFileName)
- self.openFileNamesButton.clicked.connect(self.setOpenFileNames)
- self.saveFileNameButton.clicked.connect(self.setSaveFileName)
- self.criticalButton.clicked.connect(self.criticalMessage)
- self.informationButton.clicked.connect(self.informationMessage)
- self.questionButton.clicked.connect(self.questionMessage)
- self.warningButton.clicked.connect(self.warningMessage)
- self.errorButton.clicked.connect(self.errorMessage)
-
- self.native = QtWidgets.QCheckBox()
- self.native.setText("Use native file dialog.")
- self.native.setChecked(True)
- if sys.platform not in ("win32", "darwin"):
- self.native.hide()
-
- layout = QtWidgets.QGridLayout()
- layout.setColumnStretch(1, 1)
- layout.setColumnMinimumWidth(1, 250)
- layout.addWidget(self.integerButton, 0, 0)
- layout.addWidget(self.integerLabel, 0, 1)
- layout.addWidget(self.doubleButton, 1, 0)
- layout.addWidget(self.doubleLabel, 1, 1)
- layout.addWidget(self.itemButton, 2, 0)
- layout.addWidget(self.itemLabel, 2, 1)
- layout.addWidget(self.textButton, 3, 0)
- layout.addWidget(self.textLabel, 3, 1)
- layout.addWidget(self.colorButton, 4, 0)
- layout.addWidget(self.colorLabel, 4, 1)
- layout.addWidget(self.fontButton, 5, 0)
- layout.addWidget(self.fontLabel, 5, 1)
- layout.addWidget(self.directoryButton, 6, 0)
- layout.addWidget(self.directoryLabel, 6, 1)
- layout.addWidget(self.openFileNameButton, 7, 0)
- layout.addWidget(self.openFileNameLabel, 7, 1)
- layout.addWidget(self.openFileNamesButton, 8, 0)
- layout.addWidget(self.openFileNamesLabel, 8, 1)
- layout.addWidget(self.saveFileNameButton, 9, 0)
- layout.addWidget(self.saveFileNameLabel, 9, 1)
- layout.addWidget(self.criticalButton, 10, 0)
- layout.addWidget(self.criticalLabel, 10, 1)
- layout.addWidget(self.informationButton, 11, 0)
- layout.addWidget(self.informationLabel, 11, 1)
- layout.addWidget(self.questionButton, 12, 0)
- layout.addWidget(self.questionLabel, 12, 1)
- layout.addWidget(self.warningButton, 13, 0)
- layout.addWidget(self.warningLabel, 13, 1)
- layout.addWidget(self.errorButton, 14, 0)
- layout.addWidget(self.errorLabel, 14, 1)
- layout.addWidget(self.native, 15, 0)
- self.setLayout(layout)
-
- self.setWindowTitle("Standard Dialogs")
-
- def setInteger(self):
- i, ok = QtWidgets.QInputDialog.getInt(self,
- "QInputDialog.getInteger()", "Percentage:", 25, 0, 100, 1)
- if ok:
- self.integerLabel.setText("%d%%" % i)
-
- def setDouble(self):
- d, ok = QtWidgets.QInputDialog.getDouble(self, "QInputDialog.getDouble()",
- "Amount:", 37.56, -10000, 10000, 2)
- if ok:
- self.doubleLabel.setText("$%g" % d)
-
- def setItem(self):
- items = ("Spring", "Summer", "Fall", "Winter")
-
- item, ok = QtWidgets.QInputDialog.getItem(self, "QInputDialog.getItem()",
- "Season:", items, 0, False)
- if ok and item:
- self.itemLabel.setText(item)
-
- def setText(self):
- text, ok = QtWidgets.QInputDialog.getText(self, "QInputDialog.getText()",
- "User name:", QtWidgets.QLineEdit.Normal,
- QtCore.QDir.home().dirName())
- if ok and text != '':
- self.textLabel.setText(text)
-
- def setColor(self):
- color = QtWidgets.QColorDialog.getColor(QtCore.Qt.green, self)
- if color.isValid():
- self.colorLabel.setText(color.name())
- self.colorLabel.setPalette(QtGui.QPalette(color))
- self.colorLabel.setAutoFillBackground(True)
-
- def setFont(self):
- ok, font = QtWidgets.QFontDialog.getFont(QtGui.QFont(self.fontLabel.text()), self)
- if ok:
- self.fontLabel.setText(font.key())
- self.fontLabel.setFont(font)
-
- def setExistingDirectory(self):
- options = QtWidgets.QFileDialog.DontResolveSymlinks | QtWidgets.QFileDialog.ShowDirsOnly
- directory = QtWidgets.QFileDialog.getExistingDirectory(self,
- "QFileDialog.getExistingDirectory()",
- self.directoryLabel.text(), options)
- if directory:
- self.directoryLabel.setText(directory)
-
- def setOpenFileName(self):
- options = QtWidgets.QFileDialog.Options()
- if not self.native.isChecked():
- options |= QtWidgets.QFileDialog.DontUseNativeDialog
- fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self,
- "QFileDialog.getOpenFileName()",
- self.openFileNameLabel.text(),
- "All Files (*);;Text Files (*.txt)", "", options)
- if fileName:
- self.openFileNameLabel.setText(fileName)
-
- def setOpenFileNames(self):
- options = QtWidgets.QFileDialog.Options()
- if not self.native.isChecked():
- options |= QtWidgets.QFileDialog.DontUseNativeDialog
- files, filtr = QtWidgets.QFileDialog.getOpenFileNames(self,
- "QFileDialog.getOpenFileNames()", self.openFilesPath,
- "All Files (*);;Text Files (*.txt)", "", options)
- if files:
- self.openFilesPath = files[0]
- self.openFileNamesLabel.setText("[%s]" % ', '.join(files))
-
- def setSaveFileName(self):
- options = QtWidgets.QFileDialog.Options()
- if not self.native.isChecked():
- options |= QtWidgets.QFileDialog.DontUseNativeDialog
- fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self,
- "QFileDialog.getSaveFileName()",
- self.saveFileNameLabel.text(),
- "All Files (*);;Text Files (*.txt)", "", options)
- if fileName:
- self.saveFileNameLabel.setText(fileName)
-
- def criticalMessage(self):
- reply = QtWidgets.QMessageBox.critical(self, "QMessageBox.critical()",
- Dialog.MESSAGE,
- QtWidgets.QMessageBox.Abort | QtWidgets.QMessageBox.Retry | QtWidgets.QMessageBox.Ignore)
- if reply == QtWidgets.QMessageBox.Abort:
- self.criticalLabel.setText("Abort")
- elif reply == QtWidgets.QMessageBox.Retry:
- self.criticalLabel.setText("Retry")
- else:
- self.criticalLabel.setText("Ignore")
-
- def informationMessage(self):
- reply = QtWidgets.QMessageBox.information(self,
- "QMessageBox.information()", Dialog.MESSAGE)
- if reply == QtWidgets.QMessageBox.Ok:
- self.informationLabel.setText("OK")
- else:
- self.informationLabel.setText("Escape")
-
- def questionMessage(self):
- reply = QtWidgets.QMessageBox.question(self, "QMessageBox.question()",
- Dialog.MESSAGE,
- QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No | QtWidgets.QMessageBox.Cancel)
- if reply == QtWidgets.QMessageBox.Yes:
- self.questionLabel.setText("Yes")
- elif reply == QtWidgets.QMessageBox.No:
- self.questionLabel.setText("No")
- else:
- self.questionLabel.setText("Cancel")
-
- def warningMessage(self):
- msgBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Warning,
- "QMessageBox.warning()", Dialog.MESSAGE,
- QtWidgets.QMessageBox.NoButton, self)
- msgBox.addButton("Save &Again", QtWidgets.QMessageBox.AcceptRole)
- msgBox.addButton("&Continue", QtWidgets.QMessageBox.RejectRole)
- if msgBox.exec_() == QtWidgets.QMessageBox.AcceptRole:
- self.warningLabel.setText("Save Again")
- else:
- self.warningLabel.setText("Continue")
-
- def errorMessage(self):
- self.errorMessageDialog.showMessage("This dialog shows and remembers "
- "error messages. If the checkbox is checked (as it is by "
- "default), the shown message will be shown again, but if the "
- "user unchecks the box the message will not appear again if "
- "QErrorMessage.showMessage() is called with the same message.")
- self.errorLabel.setText("If the box is unchecked, the message won't "
- "appear again.")
-
-
-if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- dialog = Dialog()
- sys.exit(dialog.exec_())
diff --git a/examples/widgets/dialogs/standarddialogs/standarddialogs.py b/examples/widgets/dialogs/standarddialogs/standarddialogs.py
new file mode 100644
index 000000000..ef677d5a8
--- /dev/null
+++ b/examples/widgets/dialogs/standarddialogs/standarddialogs.py
@@ -0,0 +1,437 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/dialogs/standarddialogs example from Qt v5.x"""
+
+import sys
+from textwrap import dedent
+
+from PySide6.QtCore import QDir, Qt, Slot
+from PySide6.QtGui import QFont, QPalette
+from PySide6.QtWidgets import (QApplication, QColorDialog, QCheckBox, QDialog,
+ QErrorMessage, QFontDialog, QFileDialog, QFrame,
+ QGridLayout, QGroupBox, QInputDialog, QLabel,
+ QLineEdit, QMessageBox, QPushButton,
+ QSizePolicy, QSpacerItem, QToolBox,
+ QVBoxLayout, QWidget)
+
+
+class DialogOptionsWidget(QGroupBox):
+ """Widget displaying a number of check boxes representing the dialog
+ options."""
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._layout = QVBoxLayout(self)
+ self._mapping = {}
+
+ def value(self):
+ result = 0
+ for checkbox, value in self._mapping.items():
+ if checkbox.isChecked():
+ result |= value
+ return result
+
+ def add_checkbox(self, text, value):
+ checkbox = QCheckBox(text)
+ self._layout.addWidget(checkbox)
+ self._mapping[checkbox] = value
+
+
+class Dialog(QDialog):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._open_files_path = ''
+
+ self._error_message_dialog = QErrorMessage(self)
+
+ frame_style = QFrame.Sunken | QFrame.Panel
+
+ self._integer_label = QLabel()
+ self._integer_label.setFrameStyle(frame_style)
+ self._integer_button = QPushButton("QInputDialog.get&Integer()")
+
+ self._double_label = QLabel()
+ self._double_label.setFrameStyle(frame_style)
+ self._double_button = QPushButton("QInputDialog.get&Double()")
+
+ self._item_label = QLabel()
+ self._item_label.setFrameStyle(frame_style)
+ self._item_button = QPushButton("QInputDialog.getIte&m()")
+
+ self._text_label = QLabel()
+ self._text_label.setFrameStyle(frame_style)
+ self._text_button = QPushButton("QInputDialog.get&Text()")
+
+ self._multiline_text_label = QLabel()
+ self._multiline_text_label.setFrameStyle(frame_style)
+ self._multiline_text_button = QPushButton("QInputDialog::get&MultiLineText()")
+
+ self._color_label = QLabel()
+ self._color_label.setFrameStyle(frame_style)
+ self._color_button = QPushButton("QColorDialog.get&Color()")
+ self._color_options = DialogOptionsWidget()
+ self._color_options.add_checkbox("Show alpha channel",
+ QColorDialog.ShowAlphaChannel)
+ self._color_options.add_checkbox("No buttons",
+ QColorDialog.NoButtons)
+
+ self._font_label = QLabel()
+ self._font_label.setFrameStyle(frame_style)
+ self._font_button = QPushButton("QFontDialog.get&Font()")
+ self._font_options = DialogOptionsWidget()
+ self._font_options.add_checkbox("Do not use native dialog",
+ QFontDialog.DontUseNativeDialog)
+ self._font_options.add_checkbox("Show scalable fonts",
+ QFontDialog.ScalableFonts)
+ self._font_options.add_checkbox("Show non-scalable fonts",
+ QFontDialog.NonScalableFonts)
+ self._font_options.add_checkbox("Show monospaced fonts",
+ QFontDialog.MonospacedFonts)
+ self._font_options.add_checkbox("Show proportional fonts",
+ QFontDialog.ProportionalFonts)
+ self._font_options.add_checkbox("No buttons", QFontDialog.NoButtons)
+
+ self._directory_label = QLabel()
+ self._directory_label.setFrameStyle(frame_style)
+ self._directory_button = QPushButton("QFileDialog.getE&xistingDirectory()")
+
+ self._open_file_name_label = QLabel()
+ self._open_file_name_label.setFrameStyle(frame_style)
+ self._open_file_name_button = QPushButton("QFileDialog.get&OpenFileName()")
+
+ self._open_file_names_label = QLabel()
+ self._open_file_names_label.setFrameStyle(frame_style)
+ self._open_file_names_button = QPushButton("QFileDialog.&getOpenFileNames()")
+
+ self._save_file_name_label = QLabel()
+ self._save_file_name_label.setFrameStyle(frame_style)
+ self._save_file_name_button = QPushButton("QFileDialog.get&SaveFileName()")
+
+ self._file_options = DialogOptionsWidget()
+ self._file_options.add_checkbox("Do not use native dialog",
+ QFileDialog.DontUseNativeDialog)
+ self._file_options.add_checkbox("Show directories only",
+ QFileDialog.ShowDirsOnly)
+ self._file_options.add_checkbox("Do not resolve symlinks",
+ QFileDialog.DontResolveSymlinks)
+ self._file_options.add_checkbox("Do not confirm overwrite",
+ QFileDialog.DontConfirmOverwrite)
+ self._file_options.add_checkbox("Readonly", QFileDialog.ReadOnly)
+ self._file_options.add_checkbox("Hide name filter details",
+ QFileDialog.HideNameFilterDetails)
+ self._file_options.add_checkbox("Do not use custom directory icons (Windows)",
+ QFileDialog.DontUseCustomDirectoryIcons)
+
+ self._critical_label = QLabel()
+ self._critical_label.setFrameStyle(frame_style)
+ self._critical_button = QPushButton("QMessageBox.critica&l()")
+
+ self._information_label = QLabel()
+ self._information_label.setFrameStyle(frame_style)
+ self._information_button = QPushButton("QMessageBox.i&nformation()")
+
+ self._question_label = QLabel()
+ self._question_label.setFrameStyle(frame_style)
+ self._question_button = QPushButton("QMessageBox.&question()")
+
+ self._warning_label = QLabel()
+ self._warning_label.setFrameStyle(frame_style)
+ self._warning_button = QPushButton("QMessageBox.&warning()")
+
+ self._error_button = QPushButton("QErrorMessage.showM&essage()")
+
+ self._integer_button.clicked.connect(self.set_integer)
+ self._double_button.clicked.connect(self.set_double)
+ self._item_button.clicked.connect(self.set_item)
+ self._text_button.clicked.connect(self.set_text)
+ self._multiline_text_button.clicked.connect(self.set_multiline_text)
+
+ self._color_button.clicked.connect(self.set_color)
+ self._font_button.clicked.connect(self.set_font)
+ self._directory_button.clicked.connect(self.set_existing_directory)
+ self._open_file_name_button.clicked.connect(self.set_open_file_name)
+ self._open_file_names_button.clicked.connect(self.set_open_file_names)
+ self._save_file_name_button.clicked.connect(self.set_save_file_name)
+ self._critical_button.clicked.connect(self.critical_message)
+ self._information_button.clicked.connect(self.information_message)
+ self._question_button.clicked.connect(self.question_message)
+ self._warning_button.clicked.connect(self.warning_message)
+ self._error_button.clicked.connect(self.error_message)
+
+ vertical_layout = QVBoxLayout(self)
+ toolbox = QToolBox()
+
+ vertical_layout.addWidget(toolbox)
+ page = QWidget()
+ layout = QGridLayout(page)
+ layout.addWidget(self._integer_button, 0, 0)
+ layout.addWidget(self._integer_label, 0, 1)
+ layout.addWidget(self._double_button, 1, 0)
+ layout.addWidget(self._double_label, 1, 1)
+ layout.addWidget(self._item_button, 2, 0)
+ layout.addWidget(self._item_label, 2, 1)
+ layout.addWidget(self._text_button, 3, 0)
+ layout.addWidget(self._text_label, 3, 1)
+ layout.addWidget(self._multiline_text_label, 4, 1)
+ layout.addWidget(self._multiline_text_button, 4, 0)
+ spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)
+ layout.addItem(spacer, 5, 0)
+ toolbox.addItem(page, "Input Dialogs")
+
+ page = QWidget()
+ layout = QGridLayout(page)
+ layout.addWidget(self._color_button, 0, 0)
+ layout.addWidget(self._color_label, 0, 1)
+ spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)
+ layout.addItem(spacer, 1, 0)
+ layout.addWidget(self._color_options, 2, 0, 1, 2)
+ toolbox.addItem(page, "Color Dialog")
+
+ page = QWidget()
+ layout = QGridLayout(page)
+ layout.addWidget(self._font_button, 0, 0)
+ layout.addWidget(self._font_label, 0, 1)
+ spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)
+ layout.addItem(spacer, 1, 0)
+ layout.addWidget(self._font_options, 2, 0, 1, 2)
+ toolbox.addItem(page, "Font Dialog")
+
+ page = QWidget()
+ layout = QGridLayout(page)
+ layout.addWidget(self._directory_button, 0, 0)
+ layout.addWidget(self._directory_label, 0, 1)
+ layout.addWidget(self._open_file_name_button, 1, 0)
+ layout.addWidget(self._open_file_name_label, 1, 1)
+ layout.addWidget(self._open_file_names_button, 2, 0)
+ layout.addWidget(self._open_file_names_label, 2, 1)
+ layout.addWidget(self._save_file_name_button, 3, 0)
+ layout.addWidget(self._save_file_name_label, 3, 1)
+ spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)
+ layout.addItem(spacer, 4, 0)
+ layout.addWidget(self._file_options, 5, 0, 1, 2)
+
+ toolbox.addItem(page, "File Dialogs")
+
+ page = QWidget()
+ layout = QGridLayout(page)
+ layout.addWidget(self._critical_button, 0, 0)
+ layout.addWidget(self._critical_label, 0, 1)
+ layout.addWidget(self._information_button, 1, 0)
+ layout.addWidget(self._information_label, 1, 1)
+ layout.addWidget(self._question_button, 2, 0)
+ layout.addWidget(self._question_label, 2, 1)
+ layout.addWidget(self._warning_button, 3, 0)
+ layout.addWidget(self._warning_label, 3, 1)
+ layout.addWidget(self._error_button, 4, 0)
+ spacer = QSpacerItem(0, 0, QSizePolicy.Ignored, QSizePolicy.MinimumExpanding)
+ layout.addItem(spacer, 5, 0)
+ toolbox.addItem(page, "Message Boxes")
+
+ self.setWindowTitle("Standard Dialogs")
+
+ @Slot()
+ def set_integer(self):
+ i, ok = QInputDialog.getInt(self,
+ "QInputDialog.getInteger()", "Percentage:", 25, 0, 100, 1)
+ if ok:
+ self._integer_label.setText(f"{i}%")
+
+ @Slot()
+ def set_double(self):
+ d, ok = QInputDialog.getDouble(self, "QInputDialog.getDouble()",
+ "Amount:", 37.56, -10000, 10000, 2)
+ if ok:
+ self._double_label.setText(f"${d:g}")
+
+ @Slot()
+ def set_item(self):
+ items = ("Spring", "Summer", "Fall", "Winter")
+
+ item, ok = QInputDialog.getItem(self, "QInputDialog.getItem()", "Season:", items, 0, False)
+ if ok and item:
+ self._item_label.setText(item)
+
+ @Slot()
+ def set_text(self):
+ text, ok = QInputDialog.getText(self, "QInputDialog.getText()",
+ "User name:", QLineEdit.Normal, QDir.home().dirName())
+ if ok and text != '':
+ self._text_label.setText(text)
+
+ @Slot()
+ def set_multiline_text(self):
+ text, ok = QInputDialog.getMultiLineText(self, "QInputDialog::getMultiLineText()",
+ "Address:", "John Doe\nFreedom Street")
+ if ok and text != '':
+ self._multiline_text_label.setText(text)
+
+ @Slot()
+ def set_color(self):
+ options_value = self._color_options.value()
+ options = QColorDialog.ColorDialogOptions(options_value)
+ color = QColorDialog.getColor(Qt.green, self, "Select Color", options)
+
+ if color.isValid():
+ self._color_label.setText(color.name())
+ self._color_label.setPalette(QPalette(color))
+ self._color_label.setAutoFillBackground(True)
+
+ @Slot()
+ def set_font(self):
+ options_value = self._font_options.value()
+ options = QFontDialog.FontDialogOptions(options_value)
+
+ description = self._font_label.text()
+ default_font = QFont()
+ if description:
+ default_font.fromString(description)
+
+ ok, font = QFontDialog.getFont(default_font, self, "Select Font", options)
+ if ok:
+ self._font_label.setText(font.key())
+ self._font_label.setFont(font)
+
+ @Slot()
+ def set_existing_directory(self):
+ options_value = self._file_options.value()
+ options = QFileDialog.Options(options_value) | QFileDialog.ShowDirsOnly
+
+ directory = QFileDialog.getExistingDirectory(self, "QFileDialog.getExistingDirectory()",
+ self._directory_label.text(), options)
+ if directory:
+ self._directory_label.setText(directory)
+
+ @Slot()
+ def set_open_file_name(self):
+ options_value = self._file_options.value()
+ options = QFileDialog.Options(options_value)
+
+ fileName, _ = QFileDialog.getOpenFileName(self, "QFileDialog.getOpenFileName()",
+ self._open_file_name_label.text(),
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if fileName:
+ self._open_file_name_label.setText(fileName)
+
+ @Slot()
+ def set_open_file_names(self):
+ options_value = self._file_options.value()
+ options = QFileDialog.Options(options_value)
+
+ files, _ = QFileDialog.getOpenFileNames(self, "QFileDialog.getOpenFileNames()",
+ self._open_files_path,
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if files:
+ self._open_files_path = files[0]
+ file_list = ', '.join(files)
+ self._open_file_names_label.setText(f"[{file_list}]")
+
+ @Slot()
+ def set_save_file_name(self):
+ options_value = self._file_options.value()
+ options = QFileDialog.Options(options_value)
+
+ fileName, _ = QFileDialog.getSaveFileName(self, "QFileDialog.getSaveFileName()",
+ self._save_file_name_label.text(),
+ "All Files (*);;Text Files (*.txt)", "", options)
+ if fileName:
+ self._save_file_name_label.setText(fileName)
+
+ @Slot()
+ def critical_message(self):
+ m = dedent("""\
+ Activating the liquid oxygen stirring fans caused an
+ explosion in one of the tanks. Liquid oxygen levels
+ are getting low. This may jeopardize the moon landing mission.""")
+ msg_box = QMessageBox(QMessageBox.Critical, "QMessageBox.critical()",
+ "Houston, we have a problem",
+ QMessageBox.Abort | QMessageBox.Retry | QMessageBox.Ignore,
+ self)
+ msg_box.setInformativeText(m)
+ reply = msg_box.exec()
+ if reply == QMessageBox.Abort:
+ self._critical_label.setText("Abort")
+ elif reply == QMessageBox.Retry:
+ self._critical_label.setText("Retry")
+ else:
+ self._critical_label.setText("Ignore")
+
+ @Slot()
+ def information_message(self):
+ m = dedent("""\
+ This phrase was often used by public address announcers at
+ the conclusion of Elvis Presley concerts in order to
+ disperse audiences who lingered in hopes of an encore.
+ It has since become a catchphrase and punchline.""")
+ msg_box = QMessageBox(QMessageBox.Information, "QMessageBox.information()",
+ "Elvis has left the building.",
+ QMessageBox.Ok, self)
+ msg_box.setInformativeText(m)
+ reply = msg_box.exec()
+ if reply == QMessageBox.Ok:
+ self._information_label.setText("OK")
+ else:
+ self._information_label.setText("Escape")
+
+ @Slot()
+ def question_message(self):
+ m = dedent("""\
+ A cheeseburger is a hamburger topped with cheese.
+ Traditionally, the slice of cheese is placed on top of the
+ meat patty. The cheese is usually added to the cooking
+ hamburger patty shortly before serving, which allows the
+ cheese to melt.""")
+ msg_box = QMessageBox(QMessageBox.Question, "QMessageBox.question()",
+ "Would you like cheese with that?",
+ QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
+ msg_box.setInformativeText(m)
+ reply = msg_box.exec()
+ if reply == QMessageBox.Yes:
+ self._question_label.setText("Yes")
+ elif reply == QMessageBox.No:
+ self._question_label.setText("No")
+ else:
+ self._question_label.setText("Cancel")
+
+ @Slot()
+ def warning_message(self):
+ msg_box = QMessageBox(QMessageBox.Warning, "QMessageBox.warning()",
+ "Delete the only copy of your movie manuscript?",
+ QMessageBox.NoButton, self)
+ m = "You've been working on this manuscript for 738 days now. Hang in there!"
+ msg_box.setInformativeText(m)
+ msg_box.setDetailedText('"A long time ago in a galaxy far, far away...."')
+ msg_box.addButton("&Keep", QMessageBox.AcceptRole)
+ msg_box.addButton("Delete", QMessageBox.RejectRole)
+ if msg_box.exec() == QMessageBox.AcceptRole:
+ self._warning_label.setText("Keep")
+ else:
+ self._warning_label.setText("Delete")
+
+ @Slot()
+ def error_message(self):
+ m = dedent("""\
+ This dialog shows and remembers error messages. If the
+ user chooses to not show the dialog again, the dialog
+ will not appear again if QErrorMessage.showMessage()
+ is called with the same message.""")
+ self._error_message_dialog.showMessage(m)
+ m = dedent("""\
+ You can queue up error messages, and they will be
+ shown one after each other. Each message maintains
+ its own state for whether it will be shown again
+ the next time QErrorMessage::showMessage() is called
+ with the same message.""")
+ self._error_message_dialog.showMessage(m)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ availableGeometry = dialog.screen().availableGeometry()
+ dialog.resize(availableGeometry.width() / 3, availableGeometry.height() * 2 / 3)
+ dialog.move((availableGeometry.width() - dialog.width()) / 2,
+ (availableGeometry.height() - dialog.height()) / 2)
+ sys.exit(dialog.exec())
diff --git a/examples/widgets/dialogs/standarddialogs/standarddialogs.pyproject b/examples/widgets/dialogs/standarddialogs/standarddialogs.pyproject
new file mode 100644
index 000000000..766902e3e
--- /dev/null
+++ b/examples/widgets/dialogs/standarddialogs/standarddialogs.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["standarddialogs.py"]
+}
diff --git a/examples/widgets/dialogs/tabdialog/doc/tabdialog.png b/examples/widgets/dialogs/tabdialog/doc/tabdialog.png
new file mode 100644
index 000000000..a92af5f9c
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/doc/tabdialog.png
Binary files differ
diff --git a/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst b/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst
new file mode 100644
index 000000000..162316f54
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/doc/tabdialog.rst
@@ -0,0 +1,13 @@
+Tab Dialog Example
+===================
+
+Shows how to construct a tab dialog using the QTabWidget class.
+
+The Tab Dialog example consists of a single TabDialog class
+that provides three tabs, each containing information about
+a particular file, and two standard push buttons that are
+used to accept or reject the contents of the dialog.
+
+.. image:: tabdialog.png
+ :width: 753
+ :alt: tabdialog screenshot
diff --git a/examples/widgets/dialogs/tabdialog/tabdialog.py b/examples/widgets/dialogs/tabdialog/tabdialog.py
new file mode 100644
index 000000000..6be3d020b
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/tabdialog.py
@@ -0,0 +1,178 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/dialogs/tabdialog example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtCore import QFileInfo
+from PySide6.QtWidgets import (
+ QWidget,
+ QVBoxLayout,
+ QLabel,
+ QCheckBox,
+ QApplication,
+ QDialog,
+ QTabWidget,
+ QLineEdit,
+ QDialogButtonBox,
+ QFrame,
+ QListWidget,
+ QGroupBox,
+)
+
+
+class TabDialog(QDialog):
+ def __init__(self, file_name: str, parent: QWidget = None):
+ super().__init__(parent)
+
+ file_info = QFileInfo(file_name)
+
+ tab_widget = QTabWidget()
+ tab_widget.addTab(GeneralTab(file_info, self), "General")
+ tab_widget.addTab(PermissionsTab(file_info, self), "Permissions")
+ tab_widget.addTab(ApplicationsTab(file_info, self), "Applications")
+
+ button_box = QDialogButtonBox(
+ QDialogButtonBox.Ok | QDialogButtonBox.Cancel
+ )
+
+ button_box.accepted.connect(self.accept)
+ button_box.rejected.connect(self.reject)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(tab_widget)
+ main_layout.addWidget(button_box)
+ self.setLayout(main_layout)
+ self.setWindowTitle("Tab Dialog")
+
+
+class GeneralTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ file_name_label = QLabel("File Name:")
+ file_name_edit = QLineEdit(file_info.fileName())
+
+ path_label = QLabel("Path:")
+ path_value_label = QLabel(file_info.absoluteFilePath())
+ path_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ size_label = QLabel("Size:")
+ size = file_info.size() / 1024
+ size_value_label = QLabel(f"{size} K")
+ size_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ last_read_label = QLabel("Last Read:")
+ last_read_value_label = QLabel(file_info.lastRead().toString())
+ last_read_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ last_mod_label = QLabel("Last Modified:")
+ last_mod_value_label = QLabel(file_info.lastModified().toString())
+ last_mod_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(file_name_label)
+ main_layout.addWidget(file_name_edit)
+ main_layout.addWidget(path_label)
+ main_layout.addWidget(path_value_label)
+ main_layout.addWidget(size_label)
+ main_layout.addWidget(size_value_label)
+ main_layout.addWidget(last_read_label)
+ main_layout.addWidget(last_read_value_label)
+ main_layout.addWidget(last_mod_label)
+ main_layout.addWidget(last_mod_value_label)
+ main_layout.addStretch(1)
+ self.setLayout(main_layout)
+
+
+class PermissionsTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ permissions_group = QGroupBox("Permissions")
+
+ readable = QCheckBox("Readable")
+ if file_info.isReadable():
+ readable.setChecked(True)
+
+ writable = QCheckBox("Writable")
+ if file_info.isWritable():
+ writable.setChecked(True)
+
+ executable = QCheckBox("Executable")
+ if file_info.isExecutable():
+ executable.setChecked(True)
+
+ owner_group = QGroupBox("Ownership")
+
+ owner_label = QLabel("Owner")
+ owner_value_label = QLabel(file_info.owner())
+ owner_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ group_label = QLabel("Group")
+ group_value_label = QLabel(file_info.group())
+ group_value_label.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+
+ permissions_layout = QVBoxLayout()
+ permissions_layout.addWidget(readable)
+ permissions_layout.addWidget(writable)
+ permissions_layout.addWidget(executable)
+ permissions_group.setLayout(permissions_layout)
+
+ owner_layout = QVBoxLayout()
+ owner_layout.addWidget(owner_label)
+ owner_layout.addWidget(owner_value_label)
+ owner_layout.addWidget(group_label)
+ owner_layout.addWidget(group_value_label)
+ owner_group.setLayout(owner_layout)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(permissions_group)
+ main_layout.addWidget(owner_group)
+ main_layout.addStretch(1)
+ self.setLayout(main_layout)
+
+
+class ApplicationsTab(QWidget):
+ def __init__(self, file_info: QFileInfo, parent: QWidget):
+ super().__init__(parent)
+
+ top_label = QLabel("Open with:")
+
+ applications_list_box = QListWidget()
+ applications = []
+
+ for i in range(1, 31):
+ applications.append(f"Application {i}")
+ applications_list_box.insertItems(0, applications)
+
+ if not file_info.suffix():
+ always_check_box = QCheckBox(
+ "Always use this application to open this type of file"
+ )
+ else:
+ always_check_box = QCheckBox(
+ f"Always use this application to open files "
+ f"with the extension {file_info.suffix()}"
+ )
+
+ layout = QVBoxLayout()
+ layout.addWidget(top_label)
+ layout.addWidget(applications_list_box)
+ layout.addWidget(always_check_box)
+ self.setLayout(layout)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ if len(sys.argv) >= 2:
+ file_name = sys.argv[1]
+ else:
+ file_name = "."
+
+ tab_dialog = TabDialog(file_name)
+ tab_dialog.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/dialogs/tabdialog/tabdialog.pyproject b/examples/widgets/dialogs/tabdialog/tabdialog.pyproject
new file mode 100644
index 000000000..f121cd804
--- /dev/null
+++ b/examples/widgets/dialogs/tabdialog/tabdialog.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["tabdialog.py"]
+}
diff --git a/examples/widgets/dialogs/trivialwizard.py b/examples/widgets/dialogs/trivialwizard.py
deleted file mode 100644
index 80a398185..000000000
--- a/examples/widgets/dialogs/trivialwizard.py
+++ /dev/null
@@ -1,112 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/dialogs/trivialwizard example from Qt v5.x"""
-
-from PySide2 import QtWidgets
-
-
-def createIntroPage():
- page = QtWidgets.QWizardPage()
- page.setTitle("Introduction")
-
- label = QtWidgets.QLabel("This wizard will help you register your copy of "
- "Super Product Two.")
- label.setWordWrap(True)
-
- layout = QtWidgets.QVBoxLayout()
- layout.addWidget(label)
- page.setLayout(layout)
-
- return page
-
-
-def createRegistrationPage():
- page = QtWidgets.QWizardPage()
- page.setTitle("Registration")
- page.setSubTitle("Please fill both fields.")
-
- nameLabel = QtWidgets.QLabel("Name:")
- nameLineEdit = QtWidgets.QLineEdit()
-
- emailLabel = QtWidgets.QLabel("Email address:")
- emailLineEdit = QtWidgets.QLineEdit()
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(nameLabel, 0, 0)
- layout.addWidget(nameLineEdit, 0, 1)
- layout.addWidget(emailLabel, 1, 0)
- layout.addWidget(emailLineEdit, 1, 1)
- page.setLayout(layout)
-
- return page
-
-
-def createConclusionPage():
- page = QtWidgets.QWizardPage()
- page.setTitle("Conclusion")
-
- label = QtWidgets.QLabel("You are now successfully registered. Have a nice day!")
- label.setWordWrap(True)
-
- layout = QtWidgets.QVBoxLayout()
- layout.addWidget(label)
- page.setLayout(layout)
-
- return page
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
-
- wizard = QtWidgets.QWizard()
- wizard.addPage(createIntroPage())
- wizard.addPage(createRegistrationPage())
- wizard.addPage(createConclusionPage())
-
- wizard.setWindowTitle("Trivial Wizard")
- wizard.show()
-
- sys.exit(wizard.exec_())
diff --git a/examples/widgets/dialogs/trivialwizard/trivialwizard.py b/examples/widgets/dialogs/trivialwizard/trivialwizard.py
new file mode 100644
index 000000000..2e551ae19
--- /dev/null
+++ b/examples/widgets/dialogs/trivialwizard/trivialwizard.py
@@ -0,0 +1,63 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/dialogs/trivialwizard example from Qt v5.x"""
+
+import sys
+
+from PySide6.QtWidgets import (QApplication, QFormLayout, QLabel, QLineEdit,
+ QVBoxLayout, QWizardPage, QWizard)
+
+
+def create_intro_page():
+ page = QWizardPage()
+ page.setTitle("Introduction")
+
+ label = QLabel("This wizard will help you register your copy of "
+ "Super Product Two.")
+ label.setWordWrap(True)
+
+ layout = QVBoxLayout(page)
+ layout.addWidget(label)
+
+ return page
+
+
+def create_registration_page():
+ page = QWizardPage()
+ page.setTitle("Registration")
+ page.setSubTitle("Please fill both fields.")
+
+ layout = QFormLayout(page)
+ layout.addRow("Name:", QLineEdit())
+ layout.addRow("Email address:", QLineEdit())
+
+ return page
+
+
+def create_conclusion_page():
+ page = QWizardPage()
+ page.setTitle("Conclusion")
+
+ label = QLabel("You are now successfully registered. Have a nice day!")
+ label.setWordWrap(True)
+
+ layout = QVBoxLayout(page)
+ layout.addWidget(label)
+
+ return page
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ wizard = QWizard()
+ wizard.addPage(create_intro_page())
+ wizard.addPage(create_registration_page())
+ wizard.addPage(create_conclusion_page())
+
+ wizard.setWindowTitle("Trivial Wizard")
+ wizard.show()
+
+ sys.exit(wizard.exec())
diff --git a/examples/widgets/dialogs/trivialwizard/trivialwizard.pyproject b/examples/widgets/dialogs/trivialwizard/trivialwizard.pyproject
new file mode 100644
index 000000000..739a43a7a
--- /dev/null
+++ b/examples/widgets/dialogs/trivialwizard/trivialwizard.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["trivialwizard.py"]
+}
diff --git a/examples/widgets/draganddrop/draggableicons/doc/draggableicons.png b/examples/widgets/draganddrop/draggableicons/doc/draggableicons.png
new file mode 100644
index 000000000..640a99e44
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/doc/draggableicons.png
Binary files differ
diff --git a/examples/widgets/draganddrop/draggableicons/doc/draggableicons.rst b/examples/widgets/draganddrop/draggableicons/doc/draggableicons.rst
new file mode 100644
index 000000000..3f67e5809
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/doc/draggableicons.rst
@@ -0,0 +1,9 @@
+Draggable Icons Example
+=======================
+
+The Draggable Icons example shows how to drag and drop image data between
+widgets in the same application,and between different applications.
+
+.. image:: draggableicons.png
+ :width: 536
+ :alt: draggable icons screenshot
diff --git a/examples/widgets/draganddrop/draggableicons/draggableicons.py b/examples/widgets/draganddrop/draggableicons/draggableicons.py
new file mode 100644
index 000000000..b929bd5e3
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/draggableicons.py
@@ -0,0 +1,128 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from pathlib import Path
+import sys
+
+from PySide6.QtCore import QByteArray, QDataStream, QIODevice, QMimeData, QPoint, Qt
+from PySide6.QtGui import QColor, QDrag, QPainter, QPixmap
+from PySide6.QtWidgets import QApplication, QFrame, QHBoxLayout, QLabel, QWidget
+
+
+class DragWidget(QFrame):
+ def __init__(self, parent: QWidget):
+ super().__init__(parent)
+ self.setMinimumSize(200, 200)
+ self.setFrameStyle(QFrame.Sunken | QFrame.StyledPanel)
+ self.setAcceptDrops(True)
+
+ path = Path(__file__).resolve().parent
+
+ boat_icon = QLabel(self)
+ boat_icon.setPixmap(QPixmap(path / "images" / "boat.png"))
+ boat_icon.move(10, 10)
+ boat_icon.show()
+ boat_icon.setAttribute(Qt.WA_DeleteOnClose)
+
+ car_icon = QLabel(self)
+ car_icon.setPixmap(QPixmap(path / "images" / "car.png"))
+ car_icon.move(100, 10)
+ car_icon.show()
+ car_icon.setAttribute(Qt.WA_DeleteOnClose)
+
+ house_icon = QLabel(self)
+ house_icon.setPixmap(QPixmap(path / "images" / "house.png"))
+ house_icon.move(10, 80)
+ house_icon.show()
+ house_icon.setAttribute(Qt.WA_DeleteOnClose)
+
+ def dragEnterEvent(self, event):
+ if event.mimeData().hasFormat("application/x-dnditem_data"):
+ if event.source() == self:
+ event.setDropAction(Qt.MoveAction)
+ event.accept()
+ else:
+ event.acceptProposedAction()
+ else:
+ event.ignore()
+
+ def dragMoveEvent(self, event):
+ if event.mimeData().hasFormat("application/x-dnditem_data"):
+ if event.source() == self:
+ event.setDropAction(Qt.MoveAction)
+ event.accept()
+ else:
+ event.acceptProposedAction()
+ else:
+ event.ignore()
+
+ def dropEvent(self, event):
+ if event.mimeData().hasFormat("application/x-dnditem_data"):
+ item_data: QByteArray = event.mimeData().data("application/x-dnditem_data")
+ data_stream = QDataStream(item_data, QIODevice.ReadOnly)
+
+ pixmap = QPixmap()
+ offset = QPoint()
+
+ data_stream >> pixmap >> offset
+
+ new_icon = QLabel(self)
+ new_icon.setPixmap(pixmap)
+ new_icon.move(event.position().toPoint() - offset)
+ new_icon.show()
+ new_icon.setAttribute(Qt.WA_DeleteOnClose)
+
+ if event.source() == self:
+ event.setDropAction(Qt.MoveAction)
+ event.accept()
+ else:
+ event.acceptProposedAction()
+ else:
+ event.ignore()
+
+ def mousePressEvent(self, event):
+ child: QLabel = self.childAt(event.position().toPoint())
+ if not child:
+ return
+
+ pixmap = child.pixmap()
+
+ item_data = QByteArray()
+ data_stream = QDataStream(item_data, QIODevice.WriteOnly)
+
+ data_stream << pixmap << QPoint(event.position().toPoint() - child.pos())
+
+ mime_data = QMimeData()
+ mime_data.setData("application/x-dnditem_data", item_data)
+
+ drag = QDrag(self)
+ drag.setMimeData(mime_data)
+ drag.setPixmap(pixmap)
+ drag.setHotSpot(event.position().toPoint() - child.pos())
+
+ # .copy() is important: python is different than c++ in this case
+ temp_pixmap = pixmap.copy()
+ with QPainter(temp_pixmap) as painter:
+ painter.fillRect(pixmap.rect(), QColor(127, 127, 127, 127))
+
+ child.setPixmap(temp_pixmap)
+
+ if drag.exec(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) == Qt.MoveAction:
+ child.close()
+ else:
+ child.show()
+ child.setPixmap(pixmap)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ main_widget = QWidget()
+ horizontal_layout = QHBoxLayout(main_widget)
+ horizontal_layout.addWidget(DragWidget(main_widget))
+ horizontal_layout.addWidget(DragWidget(main_widget))
+
+ main_widget.setWindowTitle("Draggable Icons")
+ main_widget.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/draganddrop/draggableicons/draggableicons.qrc b/examples/widgets/draganddrop/draggableicons/draggableicons.qrc
new file mode 100644
index 000000000..63f84ac06
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/draggableicons.qrc
@@ -0,0 +1,7 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="">
+ <file>images/boat.png</file>
+ <file>images/car.png</file>
+ <file>images/house.png</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/draganddrop/draggableicons/images/boat.png b/examples/widgets/draganddrop/draggableicons/images/boat.png
new file mode 100644
index 000000000..46c894f06
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/images/boat.png
Binary files differ
diff --git a/examples/widgets/draganddrop/draggableicons/images/car.png b/examples/widgets/draganddrop/draggableicons/images/car.png
new file mode 100644
index 000000000..3cb35e56c
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/images/car.png
Binary files differ
diff --git a/examples/widgets/draganddrop/draggableicons/images/house.png b/examples/widgets/draganddrop/draggableicons/images/house.png
new file mode 100644
index 000000000..ee9d5b115
--- /dev/null
+++ b/examples/widgets/draganddrop/draggableicons/images/house.png
Binary files differ
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext.py b/examples/widgets/draganddrop/draggabletext/draggabletext.py
index 77a40b1a5..6ffdbd70e 100644
--- a/examples/widgets/draganddrop/draggabletext/draggabletext.py
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext.py
@@ -1,107 +1,71 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/draganddrop/draggabletext example from Qt v5.x, originating from PyQt"""
-
-from PySide2.QtCore import QFile, QIODevice, QMimeData, QPoint, Qt, QTextStream
-from PySide2.QtGui import QDrag, QPalette, QPixmap
-from PySide2.QtWidgets import QApplication, QFrame, QLabel, QWidget
-
-import draggabletext_rc
+"""PySide6 port of the widgets/draganddrop/draggabletext example from Qt v5.x,
+ originating from PyQt"""
+
+from PySide6.QtCore import QFile, QIODevice, QMimeData, QPoint, Qt, QTextStream
+from PySide6.QtGui import QDrag, QPalette, QPixmap
+from PySide6.QtWidgets import QApplication, QFrame, QLabel, QWidget
+
+import draggabletext_rc # noqa: F401
class DragLabel(QLabel):
def __init__(self, text, parent):
- super(DragLabel, self).__init__(text, parent)
+ super().__init__(text, parent)
self.setAutoFillBackground(True)
self.setFrameShape(QFrame.Panel)
self.setFrameShadow(QFrame.Raised)
def mousePressEvent(self, event):
- hotSpot = event.pos()
+ hot_spot = event.position().toPoint()
- mimeData = QMimeData()
- mimeData.setText(self.text())
- mimeData.setData('application/x-hotspot',
- b'%d %d' % (hotSpot.x(), hotSpot.y()))
+ mime_data = QMimeData()
+ mime_data.setText(self.text())
+ hx = hot_spot.x()
+ hy = hot_spot.y()
+ mime_data.setData('application/x-hotspot', f'{hx} {hy}'.encode('utf-8'))
pixmap = QPixmap(self.size())
self.render(pixmap)
drag = QDrag(self)
- drag.setMimeData(mimeData)
+ drag.setMimeData(mime_data)
drag.setPixmap(pixmap)
- drag.setHotSpot(hotSpot)
+ drag.setHotSpot(hot_spot)
- dropAction = drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction)
+ drop_action = drag.exec(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction)
- if dropAction == Qt.MoveAction:
+ if drop_action == Qt.MoveAction:
self.close()
self.update()
class DragWidget(QWidget):
def __init__(self, parent=None):
- super(DragWidget, self).__init__(parent)
+ super().__init__(parent)
- dictionaryFile = QFile(':/dictionary/words.txt')
- dictionaryFile.open(QIODevice.ReadOnly)
+ dictionary_file = QFile(':/dictionary/words.txt')
+ dictionary_file.open(QIODevice.ReadOnly)
x = 5
y = 5
- for word in QTextStream(dictionaryFile).readAll().split():
- wordLabel = DragLabel(word, self)
- wordLabel.move(x, y)
- wordLabel.show()
- x += wordLabel.width() + 2
+ for word in QTextStream(dictionary_file).readAll().split():
+ word_label = DragLabel(word, self)
+ word_label.move(x, y)
+ word_label.show()
+ x += word_label.width() + 2
if x >= 195:
x = 5
- y += wordLabel.height() + 2
+ y += word_label.height() + 2
- newPalette = self.palette()
- newPalette.setColor(QPalette.Window, Qt.white)
- self.setPalette(newPalette)
+ new_palette = self.palette()
+ new_palette.setColor(QPalette.Window, Qt.white)
+ self.setPalette(new_palette)
self.setAcceptDrops(True)
self.setMinimumSize(400, max(200, y))
@@ -121,20 +85,20 @@ class DragWidget(QWidget):
if event.mimeData().hasText():
mime = event.mimeData()
pieces = mime.text().split()
- position = event.pos()
- hotSpot = QPoint()
+ position = event.position().toPoint()
+ hot_spot = QPoint()
- hotSpotPos = mime.data('application/x-hotspot').split(' ')
- if len(hotSpotPos) == 2:
- hotSpot.setX(hotSpotPos[0].toInt()[0])
- hotSpot.setY(hotSpotPos[1].toInt()[0])
+ hot_spot_pos = mime.data('application/x-hotspot').split(' ')
+ if len(hot_spot_pos) == 2:
+ hot_spot.setX(hot_spot_pos[0].toInt()[0])
+ hot_spot.setY(hot_spot_pos[1].toInt()[0])
for piece in pieces:
- newLabel = DragLabel(piece, self)
- newLabel.move(position - hotSpot)
- newLabel.show()
+ new_label = DragLabel(piece, self)
+ new_label.move(position - hot_spot)
+ new_label.show()
- position += QPoint(newLabel.width(), 0)
+ position += QPoint(new_label.width(), 0)
if event.source() in self.children():
event.setDropAction(Qt.MoveAction)
@@ -152,4 +116,4 @@ if __name__ == '__main__':
app = QApplication(sys.argv)
window = DragWidget()
window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext.pyproject b/examples/widgets/draganddrop/draggabletext/draggabletext.pyproject
index 0d422076e..fd97c9096 100644
--- a/examples/widgets/draganddrop/draggabletext/draggabletext.pyproject
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext.pyproject
@@ -1,4 +1,3 @@
{
- "files": ["draggabletext_rc.py", "words.txt", "draggabletext.qrc",
- "draggabletext.py"]
+ "files": ["words.txt", "draggabletext.qrc", "draggabletext.py"]
}
diff --git a/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py b/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py
index c05e317b3..30c01ce64 100644
--- a/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py
+++ b/examples/widgets/draganddrop/draggabletext/draggabletext_rc.py
@@ -1,9 +1,9 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x00\xf7\
@@ -43,7 +43,7 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x05\
"
def qInitResources():
diff --git a/examples/widgets/draganddrop/dropsite/doc/dropsite.rst b/examples/widgets/draganddrop/dropsite/doc/dropsite.rst
new file mode 100644
index 000000000..8d6c42bc8
--- /dev/null
+++ b/examples/widgets/draganddrop/dropsite/doc/dropsite.rst
@@ -0,0 +1,8 @@
+Drop Site Example
+=================
+
+The Drop Site example shows how to distinguish the various MIME formats
+available in a drag and drop operation.
+
+It accepts drops from other applications and displays the MIME formats
+provided by the drag object.
diff --git a/examples/widgets/draganddrop/dropsite/droparea.py b/examples/widgets/draganddrop/dropsite/droparea.py
new file mode 100644
index 000000000..efc4614f0
--- /dev/null
+++ b/examples/widgets/draganddrop/dropsite/droparea.py
@@ -0,0 +1,67 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import QMimeData, Qt, Slot, Signal
+from PySide6.QtGui import QPalette, QPixmap
+from PySide6.QtWidgets import QFrame, QLabel
+
+
+class DropArea(QLabel):
+
+ changed = Signal(QMimeData)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setMinimumSize(200, 200)
+ self.setFrameStyle(QFrame.Sunken | QFrame.StyledPanel)
+ self.setAlignment(Qt.AlignCenter)
+ self.setAcceptDrops(True)
+ self.setAutoFillBackground(True)
+ self.clear()
+
+ def dragEnterEvent(self, event):
+ self.setText("<drop content>")
+ self.setBackgroundRole(QPalette.Highlight)
+
+ event.acceptProposedAction()
+ self.changed.emit(event.mimeData())
+
+ def dragMoveEvent(self, event):
+ event.acceptProposedAction()
+
+ def dropEvent(self, event):
+ mime_data = event.mimeData()
+
+ if mime_data.hasImage():
+ self.setPixmap(QPixmap(mime_data.imageData()))
+ elif mime_data.hasFormat("text/markdown"):
+ self.setText(mime_data.data("text/markdown"))
+ self.setTextFormat(Qt.MarkdownText)
+ elif mime_data.hasHtml():
+ self.setText(mime_data.html())
+ self.setTextFormat(Qt.RichText)
+ elif mime_data.hasText():
+ self.setText(mime_data.text())
+ self.setTextFormat(Qt.PlainText)
+ elif mime_data.hasUrls():
+ url_list = mime_data.urls()
+ text = ""
+ for i in range(0, min(len(url_list), 32)):
+ text += url_list[i].path() + "\n"
+ self.setText(text)
+ else:
+ self.setText("Cannot display data")
+
+ self.setBackgroundRole(QPalette.Dark)
+ event.acceptProposedAction()
+
+ def dragLeaveEvent(self, event):
+ self.clear()
+ event.accept()
+
+ @Slot()
+ def clear(self):
+ self.setText("<drop content>")
+ self.setBackgroundRole(QPalette.Dark)
+
+ self.changed.emit(None)
diff --git a/examples/widgets/draganddrop/dropsite/dropsite.pyproject b/examples/widgets/draganddrop/dropsite/dropsite.pyproject
new file mode 100644
index 000000000..0173d5cb9
--- /dev/null
+++ b/examples/widgets/draganddrop/dropsite/dropsite.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "droparea.py", "dropsitewindow.py"]
+}
diff --git a/examples/widgets/draganddrop/dropsite/dropsitewindow.py b/examples/widgets/draganddrop/dropsite/dropsitewindow.py
new file mode 100644
index 000000000..5427d520d
--- /dev/null
+++ b/examples/widgets/draganddrop/dropsite/dropsitewindow.py
@@ -0,0 +1,115 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import re
+from PySide6.QtCore import QMimeData, Qt, Slot
+from PySide6.QtGui import QGuiApplication
+from PySide6.QtWidgets import (QAbstractItemView, QPushButton,
+ QDialogButtonBox, QLabel,
+ QTableWidget, QTableWidgetItem,
+ QVBoxLayout, QWidget)
+
+from droparea import DropArea
+
+DESCRIPTION = """This example accepts drags from other applications and
+displays the MIME types provided by the drag object."""
+
+
+_WHITESPACE_PATTERN = re.compile(r"\s+")
+
+
+def simplify_whitespace(s):
+ return _WHITESPACE_PATTERN.sub(" ", s).strip()
+
+
+class DropSiteWindow(QWidget):
+
+ def __init__(self):
+ super().__init__()
+ drop_area = DropArea()
+ abstract_label = QLabel()
+ self._formats_table = QTableWidget()
+
+ button_box = QDialogButtonBox()
+ abstract_label = QLabel(DESCRIPTION)
+ abstract_label.setWordWrap(True)
+ abstract_label.adjustSize()
+
+ drop_area = DropArea()
+ drop_area.changed.connect(self.update_formats_table)
+
+ self._formats_table = QTableWidget()
+ self._formats_table.setColumnCount(2)
+ self._formats_table.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self._formats_table.setHorizontalHeaderLabels(["Format", "Content"])
+ self._formats_table.horizontalHeader().setStretchLastSection(True)
+
+ clear_button = QPushButton("Clear")
+ self._copy_button = QPushButton("Copy")
+ quit_button = QPushButton("Quit")
+
+ button_box = QDialogButtonBox()
+ button_box.addButton(clear_button, QDialogButtonBox.ActionRole)
+ button_box.addButton(self._copy_button, QDialogButtonBox.ActionRole)
+ self._copy_button.setVisible(False)
+
+ button_box.addButton(quit_button, QDialogButtonBox.RejectRole)
+
+ quit_button.clicked.connect(self.close)
+ clear_button.clicked.connect(drop_area.clear)
+ self._copy_button.clicked.connect(self.copy)
+
+ main_layout = QVBoxLayout(self)
+ main_layout.addWidget(abstract_label)
+ main_layout.addWidget(drop_area)
+ main_layout.addWidget(self._formats_table)
+ main_layout.addWidget(button_box)
+
+ self.setWindowTitle("Drop Site")
+ self.resize(700, 500)
+
+ @Slot(QMimeData)
+ def update_formats_table(self, mime_data):
+ self._formats_table.setRowCount(0)
+ self._copy_button.setEnabled(False)
+ if not mime_data:
+ return
+
+ for format in mime_data.formats():
+ format_item = QTableWidgetItem(format)
+ format_item.setFlags(Qt.ItemIsEnabled)
+ format_item.setTextAlignment(Qt.AlignTop | Qt.AlignLeft)
+
+ if format == "text/plain":
+ text = simplify_whitespace(mime_data.text())
+ elif format == "text/markdown":
+ text = mime_data.data("text/markdown").data().decode("utf8")
+ elif format == "text/html":
+ text = simplify_whitespace(mime_data.html())
+ elif format == "text/uri-list":
+ url_list = mime_data.urls()
+ text = ""
+ for i in range(0, min(len(url_list), 32)):
+ text += url_list[i].toString() + " "
+ else:
+ data = mime_data.data(format)
+ if data.size() > 32:
+ data.truncate(32)
+ text = data.toHex(" ").data().decode("utf8").upper()
+
+ row = self._formats_table.rowCount()
+ self._formats_table.insertRow(row)
+ self._formats_table.setItem(row, 0, QTableWidgetItem(format))
+ self._formats_table.setItem(row, 1, QTableWidgetItem(text))
+
+ self._formats_table.resizeColumnToContents(0)
+ self._copy_button.setEnabled(self._formats_table.rowCount() > 0)
+
+ @Slot()
+ def copy(self):
+ text = ""
+ for row in range(0, self._formats_table.rowCount()):
+ c1 = self._formats_table.item(row, 0).text()
+ c2 = self._formats_table.item(row, 1).text()
+ text += f"{c1}: {c2}\n"
+ QGuiApplication.clipboard().setText(text)
diff --git a/examples/widgets/draganddrop/dropsite/main.py b/examples/widgets/draganddrop/dropsite/main.py
new file mode 100644
index 000000000..bce476a61
--- /dev/null
+++ b/examples/widgets/draganddrop/dropsite/main.py
@@ -0,0 +1,15 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtWidgets import QApplication
+
+from dropsitewindow import DropSiteWindow
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ window = DropSiteWindow()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/effects/blurpicker/blureffect.py b/examples/widgets/effects/blurpicker/blureffect.py
new file mode 100644
index 000000000..16c14a758
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/blureffect.py
@@ -0,0 +1,33 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+from PySide6.QtCore import QRect
+from PySide6.QtGui import QPainter
+from PySide6.QtWidgets import QGraphicsBlurEffect
+
+
+class BlurEffect(QGraphicsBlurEffect):
+ def __init__(self, item):
+ super().__init__()
+ self._base_line = 200
+ self._item = item
+
+ def adjust_for_item(self):
+ y = self._base_line - self._item.pos().y()
+
+ # radius = qBound(qreal(0.0), y / 32, qreal(16.0)); which is equivalent to
+ radius = max(0, min(y / 32, 16))
+
+ self.setBlurRadius(radius)
+
+ def set_base_line(self, base_line):
+ self._base_line = base_line
+
+ def boundingRect(self) -> QRect:
+ self.adjust_for_item()
+ return super().boundingRect()
+
+ def draw(self, painter: QPainter):
+ self.adjust_for_item()
+ super().draw(painter)
diff --git a/examples/widgets/effects/blurpicker/blurpicker.py b/examples/widgets/effects/blurpicker/blurpicker.py
new file mode 100644
index 000000000..6ff11f217
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/blurpicker.py
@@ -0,0 +1,105 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+from pathlib import Path
+from PySide6.QtCore import (
+ QEasingCurve,
+ QPointF,
+ Qt,
+ QAbstractAnimation,
+ QPropertyAnimation,
+ Property,
+)
+from PySide6.QtGui import QPainter, QTransform, QPixmap
+from PySide6.QtWidgets import QGraphicsView, QFrame, QGraphicsScene, QGraphicsPixmapItem
+from math import pi, sin, cos
+from blureffect import BlurEffect
+
+
+class BlurPicker(QGraphicsView):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._index = 0
+ self._animation = QPropertyAnimation(self, b"index")
+ self._path = Path(__file__).resolve().parent
+
+ self._background = QPixmap(self._path / "images" / "background.jpg")
+ self.setBackgroundBrush(self._background)
+ self.setScene(QGraphicsScene(self))
+
+ self._icons = []
+
+ self.setup_scene()
+ self.index = 0
+
+ self._animation.setDuration(400)
+ self._animation.setEasingCurve(QEasingCurve.InOutSine)
+
+ self.setRenderHint(QPainter.Antialiasing, True)
+ self.setFrameStyle(QFrame.NoFrame)
+
+ @Property(float)
+ def index(self) -> float:
+ return self._index
+
+ @index.setter
+ def index(self, index: float):
+ self._index = index
+
+ base_line = 0.0
+ iconAngle = 2 * pi / len(self._icons)
+
+ for i, icon in enumerate(self._icons):
+ a = (i + self._index) * iconAngle
+ xs = 170 * sin(a)
+ ys = 100 * cos(a)
+ pos = QPointF(xs, ys)
+ pos = QTransform().rotate(-20).map(pos)
+ pos -= QPointF(40, 40)
+ icon.setPos(pos)
+ base_line = max(base_line, ys)
+
+ icon.graphicsEffect().set_base_line(base_line)
+
+ self.scene().update()
+
+ def setup_scene(self):
+ self.scene().setSceneRect(-200, -120, 400, 240)
+
+ names = ["accessories-calculator.png", "accessories-text-editor.png",
+ "help-browser.png", "internet-group-chat.png",
+ "internet-mail.png", "internet-web-browser.png", "office-calendar.png",
+ "system-users.png"]
+
+ for name in names:
+ pixmap = QPixmap(self._path / "images" / name)
+ icon: QGraphicsPixmapItem = self.scene().addPixmap(pixmap)
+ icon.setZValue(1)
+ icon.setGraphicsEffect(BlurEffect(icon))
+ self._icons.append(icon)
+
+ bg: QGraphicsPixmapItem = self.scene().addPixmap(self._background)
+ bg.setZValue(0)
+ bg.setPos(-200, -150)
+
+ def keyPressEvent(self, event):
+ delta = 0
+ if event.key() == Qt.Key_Left:
+ delta = -1
+ elif event.key() == Qt.Key_Right:
+ delta = 1
+
+ if self._animation.state() == QAbstractAnimation.Stopped and delta:
+ self._animation.setEndValue(self._index + delta)
+ self._animation.start()
+ event.accept()
+
+ def mousePressEvent(self, event):
+ right = event.position().x() > (self.width() / 2)
+ delta = 1 if right else -1
+
+ if self._animation.state() == QAbstractAnimation.Stopped:
+ self._animation.setEndValue(self._index + delta)
+ self._animation.start()
+ event.accept()
diff --git a/examples/widgets/effects/blurpicker/blurpicker.pyproject b/examples/widgets/effects/blurpicker/blurpicker.pyproject
new file mode 100644
index 000000000..6ae303265
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/blurpicker.pyproject
@@ -0,0 +1,17 @@
+{
+ "files": [
+ "main.py",
+ "blurpicker.py",
+ "blureffect.py",
+ "images/accessories-calculator.png",
+ "images/accessories-text-editor.png",
+ "images/background.jpg",
+ "images/help-browser.png",
+ "images/internet-group-chat.png",
+ "images/internet-mail.png",
+ "images/internet-web-browser.png",
+ "images/office-calendar.png",
+ "images/README.txt",
+ "images/system-users.png"
+ ]
+}
diff --git a/examples/widgets/effects/blurpicker/doc/blurpicker.png b/examples/widgets/effects/blurpicker/doc/blurpicker.png
new file mode 100644
index 000000000..826eef201
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/doc/blurpicker.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/doc/blurpicker.rst b/examples/widgets/effects/blurpicker/doc/blurpicker.rst
new file mode 100644
index 000000000..70ce04c8d
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/doc/blurpicker.rst
@@ -0,0 +1,9 @@
+Blur Picker Effect Example
+==========================
+
+The blur picker effect example demonstrates how to apply
+graphical effects on items in the view.
+
+.. image:: blurpicker.png
+ :width: 400
+ :alt: Blur Picker Screenshot
diff --git a/examples/widgets/effects/blurpicker/images/README.txt b/examples/widgets/effects/blurpicker/images/README.txt
new file mode 100644
index 000000000..0927e177d
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/README.txt
@@ -0,0 +1,5 @@
+The background is taken from a public domain photo at:
+http://www.photos8.com/view/computer_board2-800x600.html
+
+All other icons are from the Tango Desktop project:
+http://tango.freedesktop.org/Tango_Desktop_Project
diff --git a/examples/widgets/effects/blurpicker/images/accessories-calculator.png b/examples/widgets/effects/blurpicker/images/accessories-calculator.png
new file mode 100644
index 000000000..4e7661f65
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/accessories-calculator.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/accessories-text-editor.png b/examples/widgets/effects/blurpicker/images/accessories-text-editor.png
new file mode 100644
index 000000000..33bef0bc1
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/accessories-text-editor.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/background.jpg b/examples/widgets/effects/blurpicker/images/background.jpg
new file mode 100644
index 000000000..e75b38899
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/background.jpg
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/help-browser.png b/examples/widgets/effects/blurpicker/images/help-browser.png
new file mode 100644
index 000000000..8ef4fae91
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/help-browser.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/internet-group-chat.png b/examples/widgets/effects/blurpicker/images/internet-group-chat.png
new file mode 100644
index 000000000..dd92d9394
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/internet-group-chat.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/internet-mail.png b/examples/widgets/effects/blurpicker/images/internet-mail.png
new file mode 100644
index 000000000..7e6b93be8
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/internet-mail.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/internet-web-browser.png b/examples/widgets/effects/blurpicker/images/internet-web-browser.png
new file mode 100644
index 000000000..a979a92b4
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/internet-web-browser.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/office-calendar.png b/examples/widgets/effects/blurpicker/images/office-calendar.png
new file mode 100644
index 000000000..e09590682
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/office-calendar.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/images/system-users.png b/examples/widgets/effects/blurpicker/images/system-users.png
new file mode 100644
index 000000000..a7f630a5b
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/images/system-users.png
Binary files differ
diff --git a/examples/widgets/effects/blurpicker/main.py b/examples/widgets/effects/blurpicker/main.py
new file mode 100644
index 000000000..053ac60ec
--- /dev/null
+++ b/examples/widgets/effects/blurpicker/main.py
@@ -0,0 +1,20 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/effects/blurpicker example from Qt v6.x"""
+
+import sys
+from PySide6.QtWidgets import QApplication
+from blurpicker import BlurPicker
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ blur_picker = BlurPicker()
+ blur_picker.setWindowTitle("Application Picker")
+
+ blur_picker.setFixedSize(400, 300)
+ blur_picker.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/effects/lighting.py b/examples/widgets/effects/lighting.py
deleted file mode 100644
index 596db4ed9..000000000
--- a/examples/widgets/effects/lighting.py
+++ /dev/null
@@ -1,144 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import math
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class Lighting(QtWidgets.QGraphicsView):
- def __init__(self, parent=None):
- super(Lighting, self).__init__(parent)
-
- self.angle = 0.0
- self.m_scene = QtWidgets.QGraphicsScene()
- self.m_lightSource = None
- self.m_items = []
-
- self.setScene(self.m_scene)
-
- self.setupScene()
-
- timer = QtCore.QTimer(self)
- timer.timeout.connect(self.animate)
- timer.setInterval(30)
- timer.start()
-
- self.setRenderHint(QtGui.QPainter.Antialiasing)
- self.setFrameStyle(QtWidgets.QFrame.NoFrame)
-
- def setupScene(self):
- self.m_scene.setSceneRect(-300, -200, 600, 460)
-
- linearGrad = QtGui.QLinearGradient(QtCore.QPointF(-100, -100),
- QtCore.QPointF(100, 100))
- linearGrad.setColorAt(0, QtGui.QColor(255, 255, 255))
- linearGrad.setColorAt(1, QtGui.QColor(192, 192, 255))
- self.setBackgroundBrush(linearGrad)
-
- radialGrad = QtGui.QRadialGradient(30, 30, 30)
- radialGrad.setColorAt(0, QtCore.Qt.yellow)
- radialGrad.setColorAt(0.2, QtCore.Qt.yellow)
- radialGrad.setColorAt(1, QtCore.Qt.transparent)
-
- pixmap = QtGui.QPixmap(60, 60)
- pixmap.fill(QtCore.Qt.transparent)
-
- painter = QtGui.QPainter(pixmap)
- painter.setPen(QtCore.Qt.NoPen)
- painter.setBrush(radialGrad)
- painter.drawEllipse(0, 0, 60, 60)
- painter.end()
-
- self.m_lightSource = self.m_scene.addPixmap(pixmap)
- self.m_lightSource.setZValue(2)
-
- for i in range(-2, 3):
- for j in range(-2, 3):
- if (i + j) & 1:
- item = QtWidgets.QGraphicsEllipseItem(0, 0, 50, 50)
- else:
- item = QtWidgets.QGraphicsRectItem(0, 0, 50, 50)
-
- item.setPen(QtGui.QPen(QtCore.Qt.black, 1))
- item.setBrush(QtGui.QBrush(QtCore.Qt.white))
-
- effect = QtWidgets.QGraphicsDropShadowEffect(self)
- effect.setBlurRadius(8)
- item.setGraphicsEffect(effect)
- item.setZValue(1)
- item.setPos(i * 80, j * 80)
- self.m_scene.addItem(item)
- self.m_items.append(item)
-
- def animate(self):
- self.angle += (math.pi / 30)
- xs = 200 * math.sin(self.angle) - 40 + 25
- ys = 200 * math.cos(self.angle) - 40 + 25
- self.m_lightSource.setPos(xs, ys)
-
- for item in self.m_items:
- effect = item.graphicsEffect()
-
- delta = QtCore.QPointF(item.x() - xs, item.y() - ys)
- effect.setOffset(QtCore.QPointF(delta.toPoint() / 30))
-
- dd = math.hypot(delta.x(), delta.y())
- color = effect.color()
- color.setAlphaF(max(0.4, min(1 - dd / 200.0, 0.7)))
- effect.setColor(color)
-
- self.m_scene.update()
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
-
- lighting = Lighting()
- lighting.setWindowTitle("Lighting and Shadows")
- lighting.resize(640, 480)
- lighting.show()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/effects/lighting/lighting.py b/examples/widgets/effects/lighting/lighting.py
new file mode 100644
index 000000000..f074813c3
--- /dev/null
+++ b/examples/widgets/effects/lighting/lighting.py
@@ -0,0 +1,107 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import math
+import sys
+
+from PySide6.QtCore import QPointF, QTimer, Qt
+from PySide6.QtGui import (QBrush, QColor, QLinearGradient, QPainter, QPen,
+ QPixmap, QRadialGradient)
+from PySide6.QtWidgets import (QApplication, QFrame, QGraphicsDropShadowEffect,
+ QGraphicsEllipseItem, QGraphicsRectItem,
+ QGraphicsScene, QGraphicsView)
+
+
+class Lighting(QGraphicsView):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.angle = 0.0
+ self.m_scene = QGraphicsScene()
+ self.m_lightSource = None
+ self.m_items = []
+
+ self.setScene(self.m_scene)
+
+ self.setup_scene()
+
+ timer = QTimer(self)
+ timer.timeout.connect(self.animate)
+ timer.setInterval(30)
+ timer.start()
+
+ self.setRenderHint(QPainter.Antialiasing)
+ self.setFrameStyle(QFrame.NoFrame)
+
+ def setup_scene(self):
+ self.m_scene.setSceneRect(-300, -200, 600, 460)
+
+ linear_grad = QLinearGradient(QPointF(-100, -100), QPointF(100, 100))
+ linear_grad.setColorAt(0, QColor(255, 255, 255))
+ linear_grad.setColorAt(1, QColor(192, 192, 255))
+ self.setBackgroundBrush(linear_grad)
+
+ radial_grad = QRadialGradient(30, 30, 30)
+ radial_grad.setColorAt(0, Qt.yellow)
+ radial_grad.setColorAt(0.2, Qt.yellow)
+ radial_grad.setColorAt(1, Qt.transparent)
+
+ pixmap = QPixmap(60, 60)
+ pixmap.fill(Qt.transparent)
+
+ with QPainter(pixmap) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(radial_grad)
+ painter.drawEllipse(0, 0, 60, 60)
+
+ self.m_lightSource = self.m_scene.addPixmap(pixmap)
+ self.m_lightSource.setZValue(2)
+
+ for i in range(-2, 3):
+ for j in range(-2, 3):
+ if (i + j) & 1:
+ item = QGraphicsEllipseItem(0, 0, 50, 50)
+ else:
+ item = QGraphicsRectItem(0, 0, 50, 50)
+
+ item.setPen(QPen(Qt.black, 1))
+ item.setBrush(QBrush(Qt.white))
+
+ effect = QGraphicsDropShadowEffect(self)
+ effect.setBlurRadius(8)
+ item.setGraphicsEffect(effect)
+ item.setZValue(1)
+ item.setPos(i * 80, j * 80)
+ self.m_scene.addItem(item)
+ self.m_items.append(item)
+
+ def animate(self):
+ self.angle += (math.pi / 30)
+ xs = 200 * math.sin(self.angle) - 40 + 25
+ ys = 200 * math.cos(self.angle) - 40 + 25
+ self.m_lightSource.setPos(xs, ys)
+
+ for item in self.m_items:
+ effect = item.graphicsEffect()
+
+ delta = QPointF(item.x() - xs, item.y() - ys)
+ effect.setOffset(QPointF(delta.toPoint() / 30))
+
+ dd = math.hypot(delta.x(), delta.y())
+ color = effect.color()
+ color.setAlphaF(max(0.4, min(1 - dd / 200.0, 0.7)))
+ effect.setColor(color)
+
+ self.m_scene.update()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ lighting = Lighting()
+ lighting.setWindowTitle("Lighting and Shadows")
+ lighting.resize(640, 480)
+ lighting.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/effects/effects.pyproject b/examples/widgets/effects/lighting/lighting.pyproject
index c64fe46d4..c64fe46d4 100644
--- a/examples/widgets/effects/effects.pyproject
+++ b/examples/widgets/effects/lighting/lighting.pyproject
diff --git a/examples/widgets/gallery/main.py b/examples/widgets/gallery/main.py
deleted file mode 100644
index 11f19201b..000000000
--- a/examples/widgets/gallery/main.py
+++ /dev/null
@@ -1,56 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2020 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/gallery example from Qt v5.15"""
-
-import sys
-
-from PySide2.QtCore import QCoreApplication, Qt
-from PySide2.QtWidgets import QApplication
-from widgetgallery import WidgetGallery
-
-
-if __name__ == '__main__':
- QCoreApplication.setAttribute(Qt.AA_EnableHighDpiScaling)
- QCoreApplication.setAttribute(Qt.AA_UseHighDpiPixmaps)
- app = QApplication()
- gallery = WidgetGallery()
- gallery.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/gettext/doc/gettext.rst b/examples/widgets/gettext/doc/gettext.rst
new file mode 100644
index 000000000..ea1127fe7
--- /dev/null
+++ b/examples/widgets/gettext/doc/gettext.rst
@@ -0,0 +1,7 @@
+.. _gettext-example:
+
+GNU gettext Example
+===================
+
+This example demonstrates the use of GNU gettext for translating
+applications as described in :ref:`translations`.
diff --git a/examples/widgets/gettext/gettext.pyproject b/examples/widgets/gettext/gettext.pyproject
new file mode 100644
index 000000000..f304bf8a5
--- /dev/null
+++ b/examples/widgets/gettext/gettext.pyproject
@@ -0,0 +1,4 @@
+{
+ "files": ["main.py", "locales/example.pot",
+ "locales/de_DE/LC_MESSAGES/example.pot"]
+}
diff --git a/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.mo b/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.mo
new file mode 100644
index 000000000..c1862497d
--- /dev/null
+++ b/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.mo
Binary files differ
diff --git a/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.pot b/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.pot
new file mode 100644
index 000000000..80da2134c
--- /dev/null
+++ b/examples/widgets/gettext/locales/de_DE/LC_MESSAGES/example.pot
@@ -0,0 +1,32 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PySide6 gettext example\n"
+"POT-Creation-Date: 2021-07-05 14:16+0200\n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+
+#: main.py:57
+msgid "&File"
+msgstr "&Datei"
+
+#: main.py:58
+msgid "Quit"
+msgstr "Beenden"
+
+#: main.py:59
+msgid "CTRL+Q"
+msgstr "CTRL+B"
+
+#: main.py:73
+#, python-brace-format
+msgid "{0} language selected"
+msgid_plural "{0} languages selected"
+msgstr[0] "{0} Sprache ausgewählt"
+msgstr[1] "{0} Sprachen ausgewählt"
diff --git a/examples/widgets/gettext/locales/example.pot b/examples/widgets/gettext/locales/example.pot
new file mode 100644
index 000000000..a2fdfbbe8
--- /dev/null
+++ b/examples/widgets/gettext/locales/example.pot
@@ -0,0 +1,32 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PySide6 gettext example\n"
+"POT-Creation-Date: 2021-07-05 14:16+0200\n"
+"Language: de_DE\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural==n != 1;\n"
+
+#: main.py:57
+msgid "&File"
+msgstr ""
+
+#: main.py:58
+msgid "Quit"
+msgstr ""
+
+#: main.py:59
+msgid "CTRL+Q"
+msgstr ""
+
+#: main.py:73
+#, python-brace-format
+msgid "{0} language selected"
+msgid_plural "{0} languages selected"
+msgstr[0] ""
+msgstr[1] ""
diff --git a/examples/widgets/gettext/main.py b/examples/widgets/gettext/main.py
new file mode 100644
index 000000000..85695728d
--- /dev/null
+++ b/examples/widgets/gettext/main.py
@@ -0,0 +1,60 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from pathlib import Path
+import gettext
+import sys
+
+from PySide6.QtCore import QItemSelection, Slot
+from PySide6.QtWidgets import (QAbstractItemView, QApplication, QListWidget,
+ QMainWindow)
+
+
+_ = None
+ngettext = None
+
+
+class Window(QMainWindow):
+ def __init__(self):
+ super().__init__()
+ file_menu = self.menuBar().addMenu(_("&File"))
+ quit_action = file_menu.addAction(_("Quit"))
+ quit_action.setShortcut(_("CTRL+Q"))
+ quit_action.triggered.connect(self.close)
+
+ self._list_widget = QListWidget()
+ self._list_widget.setSelectionMode(QAbstractItemView.MultiSelection)
+ self._list_widget.selectionModel().selectionChanged.connect(self.selection_changed)
+ self._list_widget.addItem("C++")
+ self._list_widget.addItem("Java")
+ self._list_widget.addItem("Python")
+ self.setCentralWidget(self._list_widget)
+
+ @Slot(QItemSelection, QItemSelection)
+ def selection_changed(self, selected, deselected):
+ count = len(self._list_widget.selectionModel().selectedRows())
+ message = ngettext("{0} language selected",
+ "{0} languages selected", count).format(count)
+ self.statusBar().showMessage(message)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ src_dir = Path(__file__).resolve().parent
+ try:
+ translation = gettext.translation('example', localedir=src_dir / 'locales')
+ if translation:
+ translation.install()
+ _ = translation.gettext
+ ngettext = translation.ngettext
+ except FileNotFoundError:
+ pass
+ if not _:
+ _ = gettext.gettext
+ ngettext = gettext.ngettext
+ print('No translation found')
+
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/anchorlayout.py b/examples/widgets/graphicsview/anchorlayout.py
deleted file mode 100644
index f7f4edc65..000000000
--- a/examples/widgets/graphicsview/anchorlayout.py
+++ /dev/null
@@ -1,125 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
-
-
-def createItem(minimum, preferred, maximum, name):
- w = QtWidgets.QGraphicsProxyWidget()
-
- w.setWidget(QtWidgets.QPushButton(name))
- w.setMinimumSize(minimum)
- w.setPreferredSize(preferred)
- w.setMaximumSize(maximum)
- w.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
-
- return w
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
-
- scene = QtWidgets.QGraphicsScene()
- scene.setSceneRect(0, 0, 800, 480)
-
- minSize = QtCore.QSizeF(30, 100)
- prefSize = QtCore.QSizeF(210, 100)
- maxSize = QtCore.QSizeF(300, 100)
-
- a = createItem(minSize, prefSize, maxSize, "A")
- b = createItem(minSize, prefSize, maxSize, "B")
- c = createItem(minSize, prefSize, maxSize, "C")
- d = createItem(minSize, prefSize, maxSize, "D")
- e = createItem(minSize, prefSize, maxSize, "E")
- f = createItem(QtCore.QSizeF(30, 50), QtCore.QSizeF(150, 50), maxSize, "F")
- g = createItem(QtCore.QSizeF(30, 50), QtCore.QSizeF(30, 100), maxSize, "G")
-
- l = QtWidgets.QGraphicsAnchorLayout()
- l.setSpacing(0)
-
- w = QtWidgets.QGraphicsWidget(None, QtCore.Qt.Window)
- w.setPos(20, 20)
- w.setLayout(l)
-
- # Vertical.
- l.addAnchor(a, QtCore.Qt.AnchorTop, l, QtCore.Qt.AnchorTop)
- l.addAnchor(b, QtCore.Qt.AnchorTop, l, QtCore.Qt.AnchorTop)
-
- l.addAnchor(c, QtCore.Qt.AnchorTop, a, QtCore.Qt.AnchorBottom)
- l.addAnchor(c, QtCore.Qt.AnchorTop, b, QtCore.Qt.AnchorBottom)
- l.addAnchor(c, QtCore.Qt.AnchorBottom, d, QtCore.Qt.AnchorTop)
- l.addAnchor(c, QtCore.Qt.AnchorBottom, e, QtCore.Qt.AnchorTop)
-
- l.addAnchor(d, QtCore.Qt.AnchorBottom, l, QtCore.Qt.AnchorBottom)
- l.addAnchor(e, QtCore.Qt.AnchorBottom, l, QtCore.Qt.AnchorBottom)
-
- l.addAnchor(c, QtCore.Qt.AnchorTop, f, QtCore.Qt.AnchorTop)
- l.addAnchor(c, QtCore.Qt.AnchorVerticalCenter, f, QtCore.Qt.AnchorBottom)
- l.addAnchor(f, QtCore.Qt.AnchorBottom, g, QtCore.Qt.AnchorTop)
- l.addAnchor(c, QtCore.Qt.AnchorBottom, g, QtCore.Qt.AnchorBottom)
-
- # Horizontal.
- l.addAnchor(l, QtCore.Qt.AnchorLeft, a, QtCore.Qt.AnchorLeft)
- l.addAnchor(l, QtCore.Qt.AnchorLeft, d, QtCore.Qt.AnchorLeft)
- l.addAnchor(a, QtCore.Qt.AnchorRight, b, QtCore.Qt.AnchorLeft)
-
- l.addAnchor(a, QtCore.Qt.AnchorRight, c, QtCore.Qt.AnchorLeft)
- l.addAnchor(c, QtCore.Qt.AnchorRight, e, QtCore.Qt.AnchorLeft)
-
- l.addAnchor(b, QtCore.Qt.AnchorRight, l, QtCore.Qt.AnchorRight)
- l.addAnchor(e, QtCore.Qt.AnchorRight, l, QtCore.Qt.AnchorRight)
- l.addAnchor(d, QtCore.Qt.AnchorRight, e, QtCore.Qt.AnchorLeft)
-
- l.addAnchor(l, QtCore.Qt.AnchorLeft, f, QtCore.Qt.AnchorLeft)
- l.addAnchor(l, QtCore.Qt.AnchorLeft, g, QtCore.Qt.AnchorLeft)
- l.addAnchor(f, QtCore.Qt.AnchorRight, g, QtCore.Qt.AnchorRight)
-
- scene.addItem(w)
- scene.setBackgroundBrush(QtCore.Qt.darkGreen)
-
- view = QtWidgets.QGraphicsView(scene)
- view.show()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/anchorlayout/anchorlayout.py b/examples/widgets/graphicsview/anchorlayout/anchorlayout.py
new file mode 100644
index 000000000..9d9be041f
--- /dev/null
+++ b/examples/widgets/graphicsview/anchorlayout/anchorlayout.py
@@ -0,0 +1,90 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QSizeF, Qt
+from PySide6.QtWidgets import (QApplication, QGraphicsAnchorLayout,
+ QGraphicsProxyWidget, QGraphicsScene,
+ QGraphicsView, QGraphicsWidget,
+ QPushButton, QSizePolicy)
+
+
+def create_item(minimum, preferred, maximum, name):
+ w = QGraphicsProxyWidget()
+
+ w.setWidget(QPushButton(name))
+ w.setMinimumSize(minimum)
+ w.setPreferredSize(preferred)
+ w.setMaximumSize(maximum)
+ w.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
+
+ return w
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ scene = QGraphicsScene()
+ scene.setSceneRect(0, 0, 800, 480)
+
+ min_size = QSizeF(30, 100)
+ pref_size = QSizeF(210, 100)
+ max_size = QSizeF(300, 100)
+
+ a = create_item(min_size, pref_size, max_size, "A")
+ b = create_item(min_size, pref_size, max_size, "B")
+ c = create_item(min_size, pref_size, max_size, "C")
+ d = create_item(min_size, pref_size, max_size, "D")
+ e = create_item(min_size, pref_size, max_size, "E")
+ f = create_item(QSizeF(30, 50), QSizeF(150, 50), max_size, "F")
+ g = create_item(QSizeF(30, 50), QSizeF(30, 100), max_size, "G")
+
+ l = QGraphicsAnchorLayout() # noqa: E741
+ l.setSpacing(0)
+
+ w = QGraphicsWidget(None, Qt.Window)
+ w.setPos(20, 20)
+ w.setLayout(l)
+
+ # Vertical.
+ l.addAnchor(a, Qt.AnchorTop, l, Qt.AnchorTop)
+ l.addAnchor(b, Qt.AnchorTop, l, Qt.AnchorTop)
+
+ l.addAnchor(c, Qt.AnchorTop, a, Qt.AnchorBottom)
+ l.addAnchor(c, Qt.AnchorTop, b, Qt.AnchorBottom)
+ l.addAnchor(c, Qt.AnchorBottom, d, Qt.AnchorTop)
+ l.addAnchor(c, Qt.AnchorBottom, e, Qt.AnchorTop)
+
+ l.addAnchor(d, Qt.AnchorBottom, l, Qt.AnchorBottom)
+ l.addAnchor(e, Qt.AnchorBottom, l, Qt.AnchorBottom)
+
+ l.addAnchor(c, Qt.AnchorTop, f, Qt.AnchorTop)
+ l.addAnchor(c, Qt.AnchorVerticalCenter, f, Qt.AnchorBottom)
+ l.addAnchor(f, Qt.AnchorBottom, g, Qt.AnchorTop)
+ l.addAnchor(c, Qt.AnchorBottom, g, Qt.AnchorBottom)
+
+ # Horizontal.
+ l.addAnchor(l, Qt.AnchorLeft, a, Qt.AnchorLeft)
+ l.addAnchor(l, Qt.AnchorLeft, d, Qt.AnchorLeft)
+ l.addAnchor(a, Qt.AnchorRight, b, Qt.AnchorLeft)
+
+ l.addAnchor(a, Qt.AnchorRight, c, Qt.AnchorLeft)
+ l.addAnchor(c, Qt.AnchorRight, e, Qt.AnchorLeft)
+
+ l.addAnchor(b, Qt.AnchorRight, l, Qt.AnchorRight)
+ l.addAnchor(e, Qt.AnchorRight, l, Qt.AnchorRight)
+ l.addAnchor(d, Qt.AnchorRight, e, Qt.AnchorLeft)
+
+ l.addAnchor(l, Qt.AnchorLeft, f, Qt.AnchorLeft)
+ l.addAnchor(l, Qt.AnchorLeft, g, Qt.AnchorLeft)
+ l.addAnchor(f, Qt.AnchorRight, g, Qt.AnchorRight)
+
+ scene.addItem(w)
+ scene.setBackgroundBrush(Qt.darkGreen)
+
+ view = QGraphicsView(scene)
+ view.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/anchorlayout/anchorlayout.pyproject b/examples/widgets/graphicsview/anchorlayout/anchorlayout.pyproject
new file mode 100644
index 000000000..49ed7b734
--- /dev/null
+++ b/examples/widgets/graphicsview/anchorlayout/anchorlayout.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["anchorlayout.py"]
+}
diff --git a/examples/widgets/graphicsview/collidingmice/collidingmice.py b/examples/widgets/graphicsview/collidingmice/collidingmice.py
index 08a62d0e0..fb24db3ab 100644
--- a/examples/widgets/graphicsview/collidingmice/collidingmice.py
+++ b/examples/widgets/graphicsview/collidingmice/collidingmice.py
@@ -1,93 +1,53 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import math
+import sys
+
+from PySide6.QtCore import (QLineF, QPointF, QRandomGenerator, QRectF, QTimer, Qt)
+from PySide6.QtGui import (QBrush, QColor, QPainter, QPainterPath, QPixmap, QPolygonF, QTransform)
+from PySide6.QtWidgets import (QApplication, QGraphicsItem, QGraphicsScene, QGraphicsView)
-from PySide2 import QtCore, QtGui, QtWidgets
+import mice_rc # noqa: F401
-import mice_rc
+def random(boundary):
+ return QRandomGenerator.global_().bounded(boundary)
-class Mouse(QtWidgets.QGraphicsItem):
- Pi = math.pi
- TwoPi = 2.0 * Pi
+
+class Mouse(QGraphicsItem):
+ PI = math.pi
+ TWO_PI = 2.0 * PI
# Create the bounding rectangle once.
adjust = 0.5
- BoundingRect = QtCore.QRectF(-20 - adjust, -22 - adjust, 40 + adjust,
- 83 + adjust)
+ BOUNDING_RECT = QRectF(-20 - adjust, -22 - adjust, 40 + adjust,
+ 83 + adjust)
def __init__(self):
- super(Mouse, self).__init__()
+ super().__init__()
self.angle = 0.0
self.speed = 0.0
- self.mouseEyeDirection = 0.0
- self.color = QtGui.QColor(QtCore.qrand() % 256, QtCore.qrand() % 256,
- QtCore.qrand() % 256)
-
- self.setTransform(QtGui.QTransform().rotate(QtCore.qrand() % (360 * 16)))
+ self._mouse_eye_direction = 0.0
+ self.color = QColor(random(256), random(256), random(256))
- # In the C++ version of this example, this class is also derived from
- # QObject in order to receive timer events. PySide2 does not support
- # deriving from more than one wrapped class so we just create an
- # explicit timer instead.
- self.timer = QtCore.QTimer()
- self.timer.timeout.connect(self.timerEvent)
- self.timer.start(1000 / 33)
+ self.setTransform(QTransform().rotate(random(360 * 16)))
@staticmethod
- def normalizeAngle(angle):
+ def normalize_angle(angle):
while angle < 0:
- angle += Mouse.TwoPi
- while angle > Mouse.TwoPi:
- angle -= Mouse.TwoPi
+ angle += Mouse.TWO_PI
+ while angle > Mouse.TWO_PI:
+ angle -= Mouse.TWO_PI
return angle
def boundingRect(self):
- return Mouse.BoundingRect
+ return Mouse.BOUNDING_RECT
def shape(self):
- path = QtGui.QPainterPath()
+ path = QPainterPath()
path.addRect(-10, -20, 20, 40)
return path
@@ -97,120 +57,122 @@ class Mouse(QtWidgets.QGraphicsItem):
painter.drawEllipse(-10, -20, 20, 40)
# Eyes.
- painter.setBrush(QtCore.Qt.white)
+ painter.setBrush(Qt.white)
painter.drawEllipse(-10, -17, 8, 8)
painter.drawEllipse(2, -17, 8, 8)
# Nose.
- painter.setBrush(QtCore.Qt.black)
- painter.drawEllipse(QtCore.QRectF(-2, -22, 4, 4))
+ painter.setBrush(Qt.black)
+ painter.drawEllipse(QRectF(-2, -22, 4, 4))
# Pupils.
- painter.drawEllipse(QtCore.QRectF(-8.0 + self.mouseEyeDirection, -17, 4, 4))
- painter.drawEllipse(QtCore.QRectF(4.0 + self.mouseEyeDirection, -17, 4, 4))
+ painter.drawEllipse(QRectF(-8.0 + self._mouse_eye_direction, -17, 4, 4))
+ painter.drawEllipse(QRectF(4.0 + self._mouse_eye_direction, -17, 4, 4))
# Ears.
if self.scene().collidingItems(self):
- painter.setBrush(QtCore.Qt.red)
+ painter.setBrush(Qt.red)
else:
- painter.setBrush(QtCore.Qt.darkYellow)
+ painter.setBrush(Qt.darkYellow)
painter.drawEllipse(-17, -12, 16, 16)
painter.drawEllipse(1, -12, 16, 16)
# Tail.
- path = QtGui.QPainterPath(QtCore.QPointF(0, 20))
+ path = QPainterPath(QPointF(0, 20))
path.cubicTo(-5, 22, -5, 22, 0, 25)
path.cubicTo(5, 27, 5, 32, 0, 30)
path.cubicTo(-5, 32, -5, 42, 0, 35)
- painter.setBrush(QtCore.Qt.NoBrush)
+ painter.setBrush(Qt.NoBrush)
painter.drawPath(path)
- def timerEvent(self):
+ def advance(self, phase):
+ if not phase:
+ return
# Don't move too far away.
- lineToCenter = QtCore.QLineF(QtCore.QPointF(0, 0), self.mapFromScene(0, 0))
- if lineToCenter.length() > 150:
- angleToCenter = math.acos(lineToCenter.dx() / lineToCenter.length())
- if lineToCenter.dy() < 0:
- angleToCenter = Mouse.TwoPi - angleToCenter
- angleToCenter = Mouse.normalizeAngle((Mouse.Pi - angleToCenter) + Mouse.Pi / 2)
-
- if angleToCenter < Mouse.Pi and angleToCenter > Mouse.Pi / 4:
+ line_to_center = QLineF(QPointF(0, 0), self.mapFromScene(0, 0))
+ if line_to_center.length() > 150:
+ angle_to_center = math.acos(line_to_center.dx() / line_to_center.length())
+ if line_to_center.dy() < 0:
+ angle_to_center = Mouse.TWO_PI - angle_to_center
+ angle_to_center = Mouse.normalize_angle((Mouse.PI - angle_to_center) + Mouse.PI / 2)
+
+ if angle_to_center < Mouse.PI and angle_to_center > Mouse.PI / 4:
# Rotate left.
- self.angle += [-0.25, 0.25][self.angle < -Mouse.Pi / 2]
- elif angleToCenter >= Mouse.Pi and angleToCenter < (Mouse.Pi + Mouse.Pi / 2 + Mouse.Pi / 4):
+ self.angle += [-0.25, 0.25][self.angle < -Mouse.PI / 2]
+ elif (angle_to_center >= Mouse.PI
+ and angle_to_center < (Mouse.PI + Mouse.PI / 2 + Mouse.PI / 4)):
# Rotate right.
- self.angle += [-0.25, 0.25][self.angle < Mouse.Pi / 2]
+ self.angle += [-0.25, 0.25][self.angle < Mouse.PI / 2]
elif math.sin(self.angle) < 0:
self.angle += 0.25
elif math.sin(self.angle) > 0:
self.angle -= 0.25
# Try not to crash with any other mice.
- dangerMice = self.scene().items(QtGui.QPolygonF([self.mapToScene(0, 0),
- self.mapToScene(-30, -50),
- self.mapToScene(30, -50)]))
+ danger_mice = self.scene().items(QPolygonF([self.mapToScene(0, 0),
+ self.mapToScene(-30, -50),
+ self.mapToScene(30, -50)]))
- for item in dangerMice:
+ for item in danger_mice:
if item is self:
continue
- lineToMouse = QtCore.QLineF(QtCore.QPointF(0, 0), self.mapFromItem(item, 0, 0))
- angleToMouse = math.acos(lineToMouse.dx() / lineToMouse.length())
- if lineToMouse.dy() < 0:
- angleToMouse = Mouse.TwoPi - angleToMouse
- angleToMouse = Mouse.normalizeAngle((Mouse.Pi - angleToMouse) + Mouse.Pi / 2)
+ line_to_mouse = QLineF(QPointF(0, 0), self.mapFromItem(item, 0, 0))
+ angle_to_mouse = math.acos(line_to_mouse.dx() / line_to_mouse.length())
+ if line_to_mouse.dy() < 0:
+ angle_to_mouse = Mouse.TWO_PI - angle_to_mouse
+ angle_to_mouse = Mouse.normalize_angle((Mouse.PI - angle_to_mouse) + Mouse.PI / 2)
- if angleToMouse >= 0 and angleToMouse < Mouse.Pi / 2:
+ if angle_to_mouse >= 0 and angle_to_mouse < Mouse.PI / 2:
# Rotate right.
self.angle += 0.5
- elif angleToMouse <= Mouse.TwoPi and angleToMouse > (Mouse.TwoPi - Mouse.Pi / 2):
+ elif angle_to_mouse <= Mouse.TWO_PI and angle_to_mouse > (Mouse.TWO_PI - Mouse.PI / 2):
# Rotate left.
self.angle -= 0.5
# Add some random movement.
- if len(dangerMice) > 1 and (QtCore.qrand() % 10) == 0:
- if QtCore.qrand() % 1:
- self.angle += (QtCore.qrand() % 100) / 500.0
+ if len(danger_mice) > 1 and random(10) == 0:
+ if random(2) != 0:
+ self.angle += random(100) / 500.0
else:
- self.angle -= (QtCore.qrand() % 100) / 500.0
+ self.angle -= random(100) / 500.0
- self.speed += (-50 + QtCore.qrand() % 100) / 100.0
+ self.speed += (-50 + random(100)) / 100.0
dx = math.sin(self.angle) * 10
- self.mouseEyeDirection = [dx / 5, 0.0][QtCore.qAbs(dx / 5) < 1]
- self.setTransform(QtGui.QTransform().rotate(dx))
+ self._mouse_eye_direction = [dx / 5, 0.0][abs(dx / 5) < 1]
+
+ self.setRotation(self.rotation() + dx)
self.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3)))
if __name__ == '__main__':
+ MOUSE_COUNT = 7
+ app = QApplication(sys.argv)
- import sys
-
- MouseCount = 7
-
- app = QtWidgets.QApplication(sys.argv)
- QtCore.qsrand(QtCore.QTime(0,0,0).secsTo(QtCore.QTime.currentTime()))
-
- scene = QtWidgets.QGraphicsScene()
+ scene = QGraphicsScene()
scene.setSceneRect(-300, -300, 600, 600)
- scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
+ scene.setItemIndexMethod(QGraphicsScene.NoIndex)
- for i in range(MouseCount):
+ for i in range(MOUSE_COUNT):
mouse = Mouse()
- mouse.setPos(math.sin((i * 6.28) / MouseCount) * 200,
- math.cos((i * 6.28) / MouseCount) * 200)
+ mouse.setPos(math.sin((i * 6.28) / MOUSE_COUNT) * 200,
+ math.cos((i * 6.28) / MOUSE_COUNT) * 200)
scene.addItem(mouse)
- view = QtWidgets.QGraphicsView(scene)
- view.setRenderHint(QtGui.QPainter.Antialiasing)
- view.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/cheese.jpg')))
- view.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
- view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
- view.setDragMode(QtWidgets.QGraphicsView.ScrollHandDrag)
+ view = QGraphicsView(scene)
+ view.setRenderHint(QPainter.Antialiasing)
+ view.setBackgroundBrush(QBrush(QPixmap(':/images/cheese.jpg')))
+ view.setCacheMode(QGraphicsView.CacheBackground)
+ view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
+ view.setDragMode(QGraphicsView.ScrollHandDrag)
view.setWindowTitle("Colliding Mice")
view.resize(400, 300)
view.show()
- sys.exit(app.exec_())
+ timer = QTimer()
+ timer.timeout.connect(scene.advance)
+ timer.start(1000 / 33)
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/collidingmice/collidingmice.pyproject b/examples/widgets/graphicsview/collidingmice/collidingmice.pyproject
index ea5821866..621bfd642 100644
--- a/examples/widgets/graphicsview/collidingmice/collidingmice.pyproject
+++ b/examples/widgets/graphicsview/collidingmice/collidingmice.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["collidingmice.py", "mice_rc.py"]
+ "files": ["collidingmice.py"]
}
diff --git a/examples/widgets/graphicsview/collidingmice/mice_rc.py b/examples/widgets/graphicsview/collidingmice/mice_rc.py
index e9042a0d9..e2a22b2e4 100644
--- a/examples/widgets/graphicsview/collidingmice/mice_rc.py
+++ b/examples/widgets/graphicsview/collidingmice/mice_rc.py
@@ -1,45 +1,6 @@
-# -*- coding: utf-8 -*-
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
# Resource object code
#
@@ -48,7 +9,7 @@
#
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x0b\xd5\
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.py b/examples/widgets/graphicsview/diagramscene/diagramscene.py
index 3890782c4..60e05613c 100644
--- a/examples/widgets/graphicsview/diagramscene/diagramscene.py
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.py
@@ -1,300 +1,276 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import math
+import sys
-from PySide2 import QtCore, QtGui, QtWidgets
+from PySide6.QtCore import (QLineF, QPointF, QRect, QRectF, QSize, QSizeF, Qt,
+ Signal, Slot)
+from PySide6.QtGui import (QAction, QBrush, QColor, QFont, QIcon, QIntValidator,
+ QPainter, QPainterPath, QPen, QPixmap, QPolygonF)
+from PySide6.QtWidgets import (QAbstractButton, QApplication, QButtonGroup,
+ QComboBox, QFontComboBox, QGraphicsItem, QGraphicsLineItem,
+ QGraphicsPolygonItem, QGraphicsTextItem,
+ QGraphicsScene, QGraphicsView, QGridLayout,
+ QHBoxLayout, QLabel, QMainWindow, QMenu,
+ QMessageBox, QSizePolicy, QToolBox, QToolButton,
+ QWidget)
-import diagramscene_rc
+import diagramscene_rc # noqa: F401
-class Arrow(QtWidgets.QGraphicsLineItem):
+class Arrow(QGraphicsLineItem):
def __init__(self, startItem, endItem, parent=None, scene=None):
- super(Arrow, self).__init__(parent, scene)
+ super().__init__(parent, scene)
- self.arrowHead = QtGui.QPolygonF()
+ self._arrow_head = QPolygonF()
- self.myStartItem = startItem
- self.myEndItem = endItem
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
- self.myColor = QtCore.Qt.black
- self.setPen(QtGui.QPen(self.myColor, 2, QtCore.Qt.SolidLine,
- QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
+ self._my_start_item = startItem
+ self._my_end_item = endItem
+ self.setFlag(QGraphicsItem.ItemIsSelectable, True)
+ self._my_color = Qt.black
+ self.setPen(QPen(self._my_color, 2, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
- def setColor(self, color):
- self.myColor = color
+ def set_color(self, color):
+ self._my_color = color
- def startItem(self):
- return self.myStartItem
+ def start_item(self):
+ return self._my_start_item
- def endItem(self):
- return self.myEndItem
+ def end_item(self):
+ return self._my_end_item
def boundingRect(self):
extra = (self.pen().width() + 20) / 2.0
p1 = self.line().p1()
p2 = self.line().p2()
- return QtCore.QRectF(p1, QtCore.QSizeF(p2.x() - p1.x(), p2.y() - p1.y())).normalized().adjusted(-extra, -extra, extra, extra)
+ rect = QRectF(p1, QSizeF(p2.x() - p1.x(), p2.y() - p1.y()))
+ return rect.normalized().adjusted(-extra, -extra, extra, extra)
def shape(self):
path = super(Arrow, self).shape()
- path.addPolygon(self.arrowHead)
+ path.addPolygon(self._arrow_head)
return path
- def updatePosition(self):
- line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0))
- self.setLine(line)
+ def update_position(self):
+ start = self.mapFromItem(self._my_start_item, 0, 0)
+ end = self.mapFromItem(self._my_end_item, 0, 0)
+ self.setLine(QLineF(start, end))
def paint(self, painter, option, widget=None):
- if (self.myStartItem.collidesWithItem(self.myEndItem)):
+ if (self._my_start_item.collidesWithItem(self._my_end_item)):
return
- myStartItem = self.myStartItem
- myEndItem = self.myEndItem
- myColor = self.myColor
- myPen = self.pen()
- myPen.setColor(self.myColor)
- arrowSize = 20.0
- painter.setPen(myPen)
- painter.setBrush(self.myColor)
-
- centerLine = QtCore.QLineF(myStartItem.pos(), myEndItem.pos())
- endPolygon = myEndItem.polygon()
- p1 = endPolygon.at(0) + myEndItem.pos()
-
- intersectPoint = QtCore.QPointF()
- for i in endPolygon:
- p2 = i + myEndItem.pos()
- polyLine = QtCore.QLineF(p1, p2)
- intersectType, intersectPoint = polyLine.intersect(centerLine)
- if intersectType == QtCore.QLineF.BoundedIntersection:
+ my_start_item = self._my_start_item
+ my_end_item = self._my_end_item
+ my_color = self._my_color
+ my_pen = self.pen()
+ my_pen.setColor(self._my_color)
+ arrow_size = 20.0
+ painter.setPen(my_pen)
+ painter.setBrush(self._my_color)
+
+ center_line = QLineF(my_start_item.pos(), my_end_item.pos())
+ end_polygon = my_end_item.polygon()
+ p1 = end_polygon.at(0) + my_end_item.pos()
+
+ intersect_point = QPointF()
+ for i in end_polygon:
+ p2 = i + my_end_item.pos()
+ poly_line = QLineF(p1, p2)
+ intersectType, intersect_point = poly_line.intersects(center_line)
+ if intersectType == QLineF.BoundedIntersection:
break
p1 = p2
- self.setLine(QtCore.QLineF(intersectPoint, myStartItem.pos()))
+ self.setLine(QLineF(intersect_point, my_start_item.pos()))
line = self.line()
angle = math.acos(line.dx() / line.length())
if line.dy() >= 0:
angle = (math.pi * 2.0) - angle
- arrowP1 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi / 3.0) * arrowSize,
- math.cos(angle + math.pi / 3) * arrowSize)
- arrowP2 = line.p1() + QtCore.QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrowSize,
- math.cos(angle + math.pi - math.pi / 3.0) * arrowSize)
+ arrow_head1 = QPointF(math.sin(angle + math.pi / 3.0) * arrow_size,
+ math.cos(angle + math.pi / 3) * arrow_size)
+ arrow_p1 = line.p1() + arrow_head1
+ arrow_head2 = QPointF(math.sin(angle + math.pi - math.pi / 3.0) * arrow_size,
+ math.cos(angle + math.pi - math.pi / 3.0) * arrow_size)
+ arrow_p2 = line.p1() + arrow_head2
- self.arrowHead.clear()
- for point in [line.p1(), arrowP1, arrowP2]:
- self.arrowHead.append(point)
+ self._arrow_head.clear()
+ for point in [line.p1(), arrow_p1, arrow_p2]:
+ self._arrow_head.append(point)
painter.drawLine(line)
- painter.drawPolygon(self.arrowHead)
+ painter.drawPolygon(self._arrow_head)
if self.isSelected():
- painter.setPen(QtGui.QPen(myColor, 1, QtCore.Qt.DashLine))
- myLine = QtCore.QLineF(line)
- myLine.translate(0, 4.0)
- painter.drawLine(myLine)
- myLine.translate(0,-8.0)
- painter.drawLine(myLine)
+ painter.setPen(QPen(my_color, 1, Qt.DashLine))
+ my_line = QLineF(line)
+ my_line.translate(0, 4.0)
+ painter.drawLine(my_line)
+ my_line.translate(0, -8.0)
+ painter.drawLine(my_line)
-class DiagramTextItem(QtWidgets.QGraphicsTextItem):
- lostFocus = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+class DiagramTextItem(QGraphicsTextItem):
+ lost_focus = Signal(QGraphicsTextItem)
- selectedChange = QtCore.Signal(QtWidgets.QGraphicsItem)
+ selected_change = Signal(QGraphicsItem)
def __init__(self, parent=None, scene=None):
- super(DiagramTextItem, self).__init__(parent, scene)
+ super().__init__(parent, scene)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable)
+ self.setFlag(QGraphicsItem.ItemIsMovable)
+ self.setFlag(QGraphicsItem.ItemIsSelectable)
def itemChange(self, change, value):
- if change == QtWidgets.QGraphicsItem.ItemSelectedChange:
- self.selectedChange.emit(self)
+ if change == QGraphicsItem.ItemSelectedChange:
+ self.selected_change.emit(self)
return value
def focusOutEvent(self, event):
- self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction)
- self.lostFocus.emit(self)
+ self.setTextInteractionFlags(Qt.NoTextInteraction)
+ self.lost_focus.emit(self)
super(DiagramTextItem, self).focusOutEvent(event)
def mouseDoubleClickEvent(self, event):
- if self.textInteractionFlags() == QtCore.Qt.NoTextInteraction:
- self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
+ if self.textInteractionFlags() == Qt.NoTextInteraction:
+ self.setTextInteractionFlags(Qt.TextEditorInteraction)
super(DiagramTextItem, self).mouseDoubleClickEvent(event)
-class DiagramItem(QtWidgets.QGraphicsPolygonItem):
+class DiagramItem(QGraphicsPolygonItem):
Step, Conditional, StartEnd, Io = range(4)
- def __init__(self, diagramType, contextMenu, parent=None, scene=None):
- super(DiagramItem, self).__init__(parent, scene)
+ def __init__(self, diagram_type, contextMenu, parent=None, scene=None):
+ super().__init__(parent, scene)
self.arrows = []
- self.diagramType = diagramType
- self.myContextMenu = contextMenu
+ self.diagram_type = diagram_type
+ self._my_context_menu = contextMenu
- path = QtGui.QPainterPath()
- if self.diagramType == self.StartEnd:
+ path = QPainterPath()
+ if self.diagram_type == self.StartEnd:
path.moveTo(200, 50)
path.arcTo(150, 0, 50, 50, 0, 90)
path.arcTo(50, 0, 50, 50, 90, 90)
path.arcTo(50, 50, 50, 50, 180, 90)
path.arcTo(150, 50, 50, 50, 270, 90)
path.lineTo(200, 25)
- self.myPolygon = path.toFillPolygon()
- elif self.diagramType == self.Conditional:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-100, 0), QtCore.QPointF(0, 100),
- QtCore.QPointF(100, 0), QtCore.QPointF(0, -100),
- QtCore.QPointF(-100, 0)])
- elif self.diagramType == self.Step:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-100, -100), QtCore.QPointF(100, -100),
- QtCore.QPointF(100, 100), QtCore.QPointF(-100, 100),
- QtCore.QPointF(-100, -100)])
+ self._my_polygon = path.toFillPolygon()
+ elif self.diagram_type == self.Conditional:
+ self._my_polygon = QPolygonF([
+ QPointF(-100, 0), QPointF(0, 100),
+ QPointF(100, 0), QPointF(0, -100),
+ QPointF(-100, 0)])
+ elif self.diagram_type == self.Step:
+ self._my_polygon = QPolygonF([
+ QPointF(-100, -100), QPointF(100, -100),
+ QPointF(100, 100), QPointF(-100, 100),
+ QPointF(-100, -100)])
else:
- self.myPolygon = QtGui.QPolygonF([
- QtCore.QPointF(-120, -80), QtCore.QPointF(-70, 80),
- QtCore.QPointF(120, 80), QtCore.QPointF(70, -80),
- QtCore.QPointF(-120, -80)])
+ self._my_polygon = QPolygonF([
+ QPointF(-120, -80), QPointF(-70, 80),
+ QPointF(120, 80), QPointF(70, -80),
+ QPointF(-120, -80)])
- self.setPolygon(self.myPolygon)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True)
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True)
+ self.setPolygon(self._my_polygon)
+ self.setFlag(QGraphicsItem.ItemIsMovable, True)
+ self.setFlag(QGraphicsItem.ItemIsSelectable, True)
- def removeArrow(self, arrow):
+ def remove_arrow(self, arrow):
try:
self.arrows.remove(arrow)
except ValueError:
pass
- def removeArrows(self):
+ def remove_arrows(self):
for arrow in self.arrows[:]:
- arrow.startItem().removeArrow(arrow)
- arrow.endItem().removeArrow(arrow)
+ arrow.start_item().remove_arrow(arrow)
+ arrow.end_item().remove_arrow(arrow)
self.scene().removeItem(arrow)
- def addArrow(self, arrow):
+ def add_arrow(self, arrow):
self.arrows.append(arrow)
def image(self):
- pixmap = QtGui.QPixmap(250, 250)
- pixmap.fill(QtCore.Qt.transparent)
- painter = QtGui.QPainter(pixmap)
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 8))
- painter.translate(125, 125)
- painter.drawPolyline(self.myPolygon)
+ pixmap = QPixmap(250, 250)
+ pixmap.fill(Qt.transparent)
+ with QPainter(pixmap) as painter:
+ painter.setPen(QPen(Qt.black, 8))
+ painter.translate(125, 125)
+ painter.drawPolyline(self._my_polygon)
return pixmap
def contextMenuEvent(self, event):
self.scene().clearSelection()
self.setSelected(True)
- self.myContextMenu.exec_(event.screenPos())
+ self._my_context_menu.exec(event.screenPos())
def itemChange(self, change, value):
- if change == QtWidgets.QGraphicsItem.ItemPositionChange:
+ if change == QGraphicsItem.ItemPositionChange:
for arrow in self.arrows:
arrow.updatePosition()
return value
-class DiagramScene(QtWidgets.QGraphicsScene):
- InsertItem, InsertLine, InsertText, MoveItem = range(4)
+class DiagramScene(QGraphicsScene):
+ InsertItem, InsertLine, InsertText, MoveItem = range(4)
- itemInserted = QtCore.Signal(DiagramItem)
+ item_inserted = Signal(DiagramItem)
- textInserted = QtCore.Signal(QtWidgets.QGraphicsTextItem)
+ text_inserted = Signal(QGraphicsTextItem)
- itemSelected = QtCore.Signal(QtWidgets.QGraphicsItem)
+ item_selected = Signal(QGraphicsItem)
def __init__(self, itemMenu, parent=None):
- super(DiagramScene, self).__init__(parent)
+ super().__init__(parent)
- self.myItemMenu = itemMenu
- self.myMode = self.MoveItem
- self.myItemType = DiagramItem.Step
+ self._my_item_menu = itemMenu
+ self._my_mode = self.MoveItem
+ self._my_item_type = DiagramItem.Step
self.line = None
- self.textItem = None
- self.myItemColor = QtCore.Qt.white
- self.myTextColor = QtCore.Qt.black
- self.myLineColor = QtCore.Qt.black
- self.myFont = QtGui.QFont()
-
- def setLineColor(self, color):
- self.myLineColor = color
- if self.isItemChange(Arrow):
+ self._text_item = None
+ self._my_item_color = Qt.white
+ self._my_text_color = Qt.black
+ self._my_line_color = Qt.black
+ self._my_font = QFont()
+
+ def set_line_color(self, color):
+ self._my_line_color = color
+ if self.is_item_change(Arrow):
item = self.selectedItems()[0]
- item.setColor(self.myLineColor)
+ item.set_color(self._my_line_color)
self.update()
- def setTextColor(self, color):
- self.myTextColor = color
- if self.isItemChange(DiagramTextItem):
+ def set_text_color(self, color):
+ self._my_text_color = color
+ if self.is_item_change(DiagramTextItem):
item = self.selectedItems()[0]
- item.setDefaultTextColor(self.myTextColor)
+ item.setDefaultTextColor(self._my_text_color)
- def setItemColor(self, color):
- self.myItemColor = color
- if self.isItemChange(DiagramItem):
+ def set_item_color(self, color):
+ self._my_item_color = color
+ if self.is_item_change(DiagramItem):
item = self.selectedItems()[0]
- item.setBrush(self.myItemColor)
+ item.setBrush(self._my_item_color)
- def setFont(self, font):
- self.myFont = font
- if self.isItemChange(DiagramTextItem):
+ def set_font(self, font):
+ self._my_font = font
+ if self.is_item_change(DiagramTextItem):
item = self.selectedItems()[0]
- item.setFont(self.myFont)
+ item.setFont(self._my_font)
- def setMode(self, mode):
- self.myMode = mode
+ def set_mode(self, mode):
+ self._my_mode = mode
- def setItemType(self, type):
- self.myItemType = type
+ def set_item_type(self, type):
+ self._my_item_type = type
- def editorLostFocus(self, item):
+ def editor_lost_focus(self, item):
cursor = item.textCursor()
cursor.clearSelection()
item.setTextCursor(cursor)
@@ -304,521 +280,523 @@ class DiagramScene(QtWidgets.QGraphicsScene):
item.deleteLater()
def mousePressEvent(self, mouseEvent):
- if (mouseEvent.button() != QtCore.Qt.LeftButton):
+ if (mouseEvent.button() != Qt.LeftButton):
return
- if self.myMode == self.InsertItem:
- item = DiagramItem(self.myItemType, self.myItemMenu)
- item.setBrush(self.myItemColor)
+ if self._my_mode == self.InsertItem:
+ item = DiagramItem(self._my_item_type, self._my_item_menu)
+ item.setBrush(self._my_item_color)
self.addItem(item)
item.setPos(mouseEvent.scenePos())
- self.itemInserted.emit(item)
- elif self.myMode == self.InsertLine:
- self.line = QtWidgets.QGraphicsLineItem(QtCore.QLineF(mouseEvent.scenePos(),
- mouseEvent.scenePos()))
- self.line.setPen(QtGui.QPen(self.myLineColor, 2))
+ self.item_inserted.emit(item)
+ elif self._my_mode == self.InsertLine:
+ self.line = QGraphicsLineItem(QLineF(mouseEvent.scenePos(), mouseEvent.scenePos()))
+ self.line.setPen(QPen(self._my_line_color, 2))
self.addItem(self.line)
- elif self.myMode == self.InsertText:
- textItem = DiagramTextItem()
- textItem.setFont(self.myFont)
- textItem.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction)
- textItem.setZValue(1000.0)
- textItem.lostFocus.connect(self.editorLostFocus)
- textItem.selectedChange.connect(self.itemSelected)
- self.addItem(textItem)
- textItem.setDefaultTextColor(self.myTextColor)
- textItem.setPos(mouseEvent.scenePos())
- self.textInserted.emit(textItem)
+ elif self._my_mode == self.InsertText:
+ text_item = DiagramTextItem()
+ text_item.setFont(self._my_font)
+ text_item.setTextInteractionFlags(Qt.TextEditorInteraction)
+ text_item.setZValue(1000.0)
+ text_item.lost_focus.connect(self.editor_lost_focus)
+ text_item.selected_change.connect(self.item_selected)
+ self.addItem(text_item)
+ text_item.setDefaultTextColor(self._my_text_color)
+ text_item.setPos(mouseEvent.scenePos())
+ self.text_inserted.emit(text_item)
super(DiagramScene, self).mousePressEvent(mouseEvent)
def mouseMoveEvent(self, mouseEvent):
- if self.myMode == self.InsertLine and self.line:
- newLine = QtCore.QLineF(self.line.line().p1(), mouseEvent.scenePos())
- self.line.setLine(newLine)
- elif self.myMode == self.MoveItem:
+ if self._my_mode == self.InsertLine and self.line:
+ new_line = QLineF(self.line.line().p1(), mouseEvent.scenePos())
+ self.line.setLine(new_line)
+ elif self._my_mode == self.MoveItem:
super(DiagramScene, self).mouseMoveEvent(mouseEvent)
def mouseReleaseEvent(self, mouseEvent):
- if self.line and self.myMode == self.InsertLine:
- startItems = self.items(self.line.line().p1())
- if len(startItems) and startItems[0] == self.line:
- startItems.pop(0)
- endItems = self.items(self.line.line().p2())
- if len(endItems) and endItems[0] == self.line:
- endItems.pop(0)
+ if self.line and self._my_mode == self.InsertLine:
+ start_items = self.items(self.line.line().p1())
+ if len(start_items) and start_items[0] == self.line:
+ start_items.pop(0)
+ end_items = self.items(self.line.line().p2())
+ if len(end_items) and end_items[0] == self.line:
+ end_items.pop(0)
self.removeItem(self.line)
self.line = None
- if len(startItems) and len(endItems) and \
- isinstance(startItems[0], DiagramItem) and \
- isinstance(endItems[0], DiagramItem) and \
- startItems[0] != endItems[0]:
- startItem = startItems[0]
- endItem = endItems[0]
- arrow = Arrow(startItem, endItem)
- arrow.setColor(self.myLineColor)
- startItem.addArrow(arrow)
- endItem.addArrow(arrow)
+ if (len(start_items) and len(end_items)
+ and isinstance(start_items[0], DiagramItem)
+ and isinstance(end_items[0], DiagramItem)
+ and start_items[0] != end_items[0]):
+ start_item = start_items[0]
+ end_item = end_items[0]
+ arrow = Arrow(start_item, end_item)
+ arrow.set_color(self._my_line_color)
+ start_item.add_arrow(arrow)
+ end_item.add_arrow(arrow)
arrow.setZValue(-1000.0)
self.addItem(arrow)
- arrow.updatePosition()
+ arrow.update_position()
self.line = None
super(DiagramScene, self).mouseReleaseEvent(mouseEvent)
- def isItemChange(self, type):
+ def is_item_change(self, type):
for item in self.selectedItems():
if isinstance(item, type):
return True
return False
-class MainWindow(QtWidgets.QMainWindow):
- InsertTextButton = 10
+class MainWindow(QMainWindow):
+ insert_text_button = 10
def __init__(self):
- super(MainWindow, self).__init__()
+ super().__init__()
- self.createActions()
- self.createMenus()
- self.createToolBox()
+ self.create_actions()
+ self.create_menus()
+ self.create_tool_box()
- self.scene = DiagramScene(self.itemMenu)
- self.scene.setSceneRect(QtCore.QRectF(0, 0, 5000, 5000))
- self.scene.itemInserted.connect(self.itemInserted)
- self.scene.textInserted.connect(self.textInserted)
- self.scene.itemSelected.connect(self.itemSelected)
+ self.scene = DiagramScene(self._item_menu)
+ self.scene.setSceneRect(QRectF(0, 0, 5000, 5000))
+ self.scene.item_inserted.connect(self.item_inserted)
+ self.scene.text_inserted.connect(self.text_inserted)
+ self.scene.item_selected.connect(self.item_selected)
- self.createToolbars()
+ self.create_toolbars()
- layout = QtWidgets.QHBoxLayout()
- layout.addWidget(self.toolBox)
- self.view = QtWidgets.QGraphicsView(self.scene)
+ layout = QHBoxLayout()
+ layout.addWidget(self._tool_box)
+ self.view = QGraphicsView(self.scene)
layout.addWidget(self.view)
- self.widget = QtWidgets.QWidget()
+ self.widget = QWidget()
self.widget.setLayout(layout)
self.setCentralWidget(self.widget)
self.setWindowTitle("Diagramscene")
- def backgroundButtonGroupClicked(self, button):
- buttons = self.backgroundButtonGroup.buttons()
+ @Slot(QAbstractButton)
+ def background_button_group_clicked(self, button):
+ buttons = self._background_button_group.buttons()
for myButton in buttons:
if myButton != button:
button.setChecked(False)
text = button.text()
if text == "Blue Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background1.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background1.png')))
elif text == "White Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background2.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background2.png')))
elif text == "Gray Grid":
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background3.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background3.png')))
else:
- self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background4.png')))
+ self.scene.setBackgroundBrush(QBrush(QPixmap(':/images/background4.png')))
self.scene.update()
self.view.update()
- def buttonGroupClicked(self, id):
- buttons = self.buttonGroup.buttons()
+ @Slot(int)
+ def button_group_clicked(self, idx):
+ buttons = self._button_group.buttons()
for button in buttons:
- if self.buttonGroup.button(id) != button:
+ if self._button_group.button(idx) != button:
button.setChecked(False)
- if id == self.InsertTextButton:
- self.scene.setMode(DiagramScene.InsertText)
+ if idx == self.insert_text_button:
+ self.scene.set_mode(DiagramScene.InsertText)
else:
- self.scene.setItemType(id)
- self.scene.setMode(DiagramScene.InsertItem)
+ self.scene.set_item_type(idx)
+ self.scene.set_mode(DiagramScene.InsertItem)
- def deleteItem(self):
+ @Slot()
+ def delete_item(self):
for item in self.scene.selectedItems():
if isinstance(item, DiagramItem):
- item.removeArrows()
+ item.remove_arrows()
self.scene.removeItem(item)
- def pointerGroupClicked(self, i):
- self.scene.setMode(self.pointerTypeGroup.checkedId())
+ @Slot(int)
+ def pointer_group_clicked(self, i):
+ self.scene.set_mode(self._pointer_type_group.checkedId())
- def bringToFront(self):
+ @Slot()
+ def bring_to_front(self):
if not self.scene.selectedItems():
return
- selectedItem = self.scene.selectedItems()[0]
- overlapItems = selectedItem.collidingItems()
+ selected_item = self.scene.selectedItems()[0]
+ overlap_items = selected_item.collidingItems()
- zValue = 0
- for item in overlapItems:
- if (item.zValue() >= zValue and isinstance(item, DiagramItem)):
- zValue = item.zValue() + 0.1
- selectedItem.setZValue(zValue)
+ z_value = 0
+ for item in overlap_items:
+ if (item.zValue() >= z_value and isinstance(item, DiagramItem)):
+ z_value = item.zValue() + 0.1
+ selected_item.setZValue(z_value)
- def sendToBack(self):
+ @Slot()
+ def send_to_back(self):
if not self.scene.selectedItems():
return
- selectedItem = self.scene.selectedItems()[0]
- overlapItems = selectedItem.collidingItems()
-
- zValue = 0
- for item in overlapItems:
- if (item.zValue() <= zValue and isinstance(item, DiagramItem)):
- zValue = item.zValue() - 0.1
- selectedItem.setZValue(zValue)
-
- def itemInserted(self, item):
- self.pointerTypeGroup.button(DiagramScene.MoveItem).setChecked(True)
- self.scene.setMode(self.pointerTypeGroup.checkedId())
- self.buttonGroup.button(item.diagramType).setChecked(False)
-
- def textInserted(self, item):
- self.buttonGroup.button(self.InsertTextButton).setChecked(False)
- self.scene.setMode(self.pointerTypeGroup.checkedId())
-
- def currentFontChanged(self, font):
- self.handleFontChange()
-
- def fontSizeChanged(self, font):
- self.handleFontChange()
-
- def sceneScaleChanged(self, scale):
- newScale = int(scale[:-1]) / 100.0
- oldMatrix = self.view.matrix()
- self.view.resetMatrix()
- self.view.translate(oldMatrix.dx(), oldMatrix.dy())
- self.view.scale(newScale, newScale)
-
- def textColorChanged(self):
- self.textAction = self.sender()
- self.fontColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/textpointer.png',
- QtGui.QColor(self.textAction.data())))
- self.textButtonTriggered()
-
- def itemColorChanged(self):
- self.fillAction = self.sender()
- self.fillColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/floodfill.png',
- QtGui.QColor(self.fillAction.data())))
- self.fillButtonTriggered()
-
- def lineColorChanged(self):
- self.lineAction = self.sender()
- self.lineColorToolButton.setIcon(self.createColorToolButtonIcon(
- ':/images/linecolor.png',
- QtGui.QColor(self.lineAction.data())))
- self.lineButtonTriggered()
-
- def textButtonTriggered(self):
- self.scene.setTextColor(QtGui.QColor(self.textAction.data()))
-
- def fillButtonTriggered(self):
- self.scene.setItemColor(QtGui.QColor(self.fillAction.data()))
-
- def lineButtonTriggered(self):
- self.scene.setLineColor(QtGui.QColor(self.lineAction.data()))
-
- def handleFontChange(self):
- font = self.fontCombo.currentFont()
- font.setPointSize(int(self.fontSizeCombo.currentText()))
- if self.boldAction.isChecked():
- font.setWeight(QtGui.QFont.Bold)
+ selected_item = self.scene.selectedItems()[0]
+ overlap_items = selected_item.collidingItems()
+
+ z_value = 0
+ for item in overlap_items:
+ if (item.zValue() <= z_value and isinstance(item, DiagramItem)):
+ z_value = item.zValue() - 0.1
+ selected_item.setZValue(z_value)
+
+ @Slot(QGraphicsPolygonItem)
+ def item_inserted(self, item):
+ self._pointer_type_group.button(DiagramScene.MoveItem).setChecked(True)
+ self.scene.set_mode(self._pointer_type_group.checkedId())
+ self._button_group.button(item.diagram_type).setChecked(False)
+
+ @Slot(QGraphicsTextItem)
+ def text_inserted(self, item):
+ self._button_group.button(self.insert_text_button).setChecked(False)
+ self.scene.set_mode(self._pointer_type_group.checkedId())
+
+ @Slot(QFont)
+ def current_font_changed(self, font):
+ self.handle_font_change()
+
+ @Slot(int)
+ def font_size_changed(self, font):
+ self.handle_font_change()
+
+ @Slot(str)
+ def scene_scale_changed(self, scale):
+ new_scale = int(scale[:-1]) / 100.0
+ old_matrix = self.view.transform()
+ self.view.resetTransform()
+ self.view.translate(old_matrix.dx(), old_matrix.dy())
+ self.view.scale(new_scale, new_scale)
+
+ @Slot()
+ def text_color_changed(self):
+ self._text_action = self.sender()
+ self._font_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/textpointer.png', QColor(self._text_action.data())))
+ self.text_button_triggered()
+
+ @Slot()
+ def item_color_changed(self):
+ self._fill_action = self.sender()
+ self._fill_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/floodfill.png', QColor(self._fill_action.data())))
+ self.fill_button_triggered()
+
+ @Slot()
+ def line_color_changed(self):
+ self._line_action = self.sender()
+ self._line_color_tool_button.setIcon(self.create_color_tool_button_icon(
+ ':/images/linecolor.png', QColor(self._line_action.data())))
+ self.line_button_triggered()
+
+ @Slot()
+ def text_button_triggered(self):
+ self.scene.set_text_color(QColor(self._text_action.data()))
+
+ @Slot()
+ def fill_button_triggered(self):
+ self.scene.set_item_color(QColor(self._fill_action.data()))
+
+ @Slot()
+ def line_button_triggered(self):
+ self.scene.set_line_color(QColor(self._line_action.data()))
+
+ @Slot()
+ def handle_font_change(self):
+ font = self._font_combo.currentFont()
+ font.setPointSize(int(self._font_size_combo.currentText()))
+ if self._bold_action.isChecked():
+ font.setWeight(QFont.Bold)
else:
- font.setWeight(QtGui.QFont.Normal)
- font.setItalic(self.italicAction.isChecked())
- font.setUnderline(self.underlineAction.isChecked())
+ font.setWeight(QFont.Normal)
+ font.setItalic(self._italic_action.isChecked())
+ font.setUnderline(self._underline_action.isChecked())
- self.scene.setFont(font)
+ self.scene.set_font(font)
- def itemSelected(self, item):
+ @Slot(QGraphicsItem)
+ def item_selected(self, item):
font = item.font()
- color = item.defaultTextColor()
- self.fontCombo.setCurrentFont(font)
- self.fontSizeCombo.setEditText(str(font.pointSize()))
- self.boldAction.setChecked(font.weight() == QtGui.QFont.Bold)
- self.italicAction.setChecked(font.italic())
- self.underlineAction.setChecked(font.underline())
+ self._font_combo.setCurrentFont(font)
+ self._font_size_combo.setEditText(str(font.pointSize()))
+ self._bold_action.setChecked(font.weight() == QFont.Bold)
+ self._italic_action.setChecked(font.italic())
+ self._underline_action.setChecked(font.underline())
+ @Slot()
def about(self):
- QtWidgets.QMessageBox.about(self, "About Diagram Scene",
- "The <b>Diagram Scene</b> example shows use of the graphics framework.")
-
- def createToolBox(self):
- self.buttonGroup = QtWidgets.QButtonGroup()
- self.buttonGroup.setExclusive(False)
- self.buttonGroup.buttonClicked[int].connect(self.buttonGroupClicked)
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(self.createCellWidget("Conditional", DiagramItem.Conditional),
- 0, 0)
- layout.addWidget(self.createCellWidget("Process", DiagramItem.Step), 0,
- 1)
- layout.addWidget(self.createCellWidget("Input/Output", DiagramItem.Io),
- 1, 0)
-
- textButton = QtWidgets.QToolButton()
- textButton.setCheckable(True)
- self.buttonGroup.addButton(textButton, self.InsertTextButton)
- textButton.setIcon(QtGui.QIcon(QtGui.QPixmap(':/images/textpointer.png')
+ QMessageBox.about(self, "About Diagram Scene",
+ "The <b>Diagram Scene</b> example shows use of the graphics framework.")
+
+ def create_tool_box(self):
+ self._button_group = QButtonGroup()
+ self._button_group.setExclusive(False)
+ self._button_group.idClicked.connect(self.button_group_clicked)
+
+ layout = QGridLayout()
+ layout.addWidget(self.create_cell_widget("Conditional", DiagramItem.Conditional), 0, 0)
+ layout.addWidget(self.create_cell_widget("Process", DiagramItem.Step), 0, 1)
+ layout.addWidget(self.create_cell_widget("Input/Output", DiagramItem.Io), 1, 0)
+
+ text_button = QToolButton()
+ text_button.setCheckable(True)
+ self._button_group.addButton(text_button, self.insert_text_button)
+ text_button.setIcon(QIcon(QPixmap(':/images/textpointer.png')
.scaled(30, 30)))
- textButton.setIconSize(QtCore.QSize(50, 50))
+ text_button.setIconSize(QSize(50, 50))
- textLayout = QtWidgets.QGridLayout()
- textLayout.addWidget(textButton, 0, 0, QtCore.Qt.AlignHCenter)
- textLayout.addWidget(QtWidgets.QLabel("Text"), 1, 0,
- QtCore.Qt.AlignCenter)
- textWidget = QtWidgets.QWidget()
- textWidget.setLayout(textLayout)
- layout.addWidget(textWidget, 1, 1)
+ text_layout = QGridLayout()
+ text_layout.addWidget(text_button, 0, 0, Qt.AlignHCenter)
+ text_layout.addWidget(QLabel("Text"), 1, 0, Qt.AlignCenter)
+ text_widget = QWidget()
+ text_widget.setLayout(text_layout)
+ layout.addWidget(text_widget, 1, 1)
layout.setRowStretch(3, 10)
layout.setColumnStretch(2, 10)
- itemWidget = QtWidgets.QWidget()
- itemWidget.setLayout(layout)
-
- self.backgroundButtonGroup = QtWidgets.QButtonGroup()
- self.backgroundButtonGroup.buttonClicked.connect(self.backgroundButtonGroupClicked)
-
- backgroundLayout = QtWidgets.QGridLayout()
- backgroundLayout.addWidget(self.createBackgroundCellWidget("Blue Grid",
- ':/images/background1.png'), 0, 0)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("White Grid",
- ':/images/background2.png'), 0, 1)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("Gray Grid",
- ':/images/background3.png'), 1, 0)
- backgroundLayout.addWidget(self.createBackgroundCellWidget("No Grid",
- ':/images/background4.png'), 1, 1)
-
- backgroundLayout.setRowStretch(2, 10)
- backgroundLayout.setColumnStretch(2, 10)
-
- backgroundWidget = QtWidgets.QWidget()
- backgroundWidget.setLayout(backgroundLayout)
-
- self.toolBox = QtWidgets.QToolBox()
- self.toolBox.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Ignored))
- self.toolBox.setMinimumWidth(itemWidget.sizeHint().width())
- self.toolBox.addItem(itemWidget, "Basic Flowchart Shapes")
- self.toolBox.addItem(backgroundWidget, "Backgrounds")
-
- def createActions(self):
- self.toFrontAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/bringtofront.png'), "Bring to &Front",
- self, shortcut="Ctrl+F", statusTip="Bring item to front",
- triggered=self.bringToFront)
-
- self.sendBackAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/sendtoback.png'), "Send to &Back", self,
- shortcut="Ctrl+B", statusTip="Send item to back",
- triggered=self.sendToBack)
-
- self.deleteAction = QtWidgets.QAction(QtGui.QIcon(':/images/delete.png'),
- "&Delete", self, shortcut="Delete",
- statusTip="Delete item from diagram",
- triggered=self.deleteItem)
-
- self.exitAction = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+X",
- statusTip="Quit Scenediagram example", triggered=self.close)
-
- self.boldAction = QtWidgets.QAction(QtGui.QIcon(':/images/bold.png'),
- "Bold", self, checkable=True, shortcut="Ctrl+B",
- triggered=self.handleFontChange)
-
- self.italicAction = QtWidgets.QAction(QtGui.QIcon(':/images/italic.png'),
- "Italic", self, checkable=True, shortcut="Ctrl+I",
- triggered=self.handleFontChange)
-
- self.underlineAction = QtWidgets.QAction(
- QtGui.QIcon(':/images/underline.png'), "Underline", self,
- checkable=True, shortcut="Ctrl+U",
- triggered=self.handleFontChange)
-
- self.aboutAction = QtWidgets.QAction("A&bout", self, shortcut="Ctrl+B",
- triggered=self.about)
-
- def createMenus(self):
- self.fileMenu = self.menuBar().addMenu("&File")
- self.fileMenu.addAction(self.exitAction)
-
- self.itemMenu = self.menuBar().addMenu("&Item")
- self.itemMenu.addAction(self.deleteAction)
- self.itemMenu.addSeparator()
- self.itemMenu.addAction(self.toFrontAction)
- self.itemMenu.addAction(self.sendBackAction)
-
- self.aboutMenu = self.menuBar().addMenu("&Help")
- self.aboutMenu.addAction(self.aboutAction)
-
- def createToolbars(self):
- self.editToolBar = self.addToolBar("Edit")
- self.editToolBar.addAction(self.deleteAction)
- self.editToolBar.addAction(self.toFrontAction)
- self.editToolBar.addAction(self.sendBackAction)
-
- self.fontCombo = QtWidgets.QFontComboBox()
- self.fontCombo.currentFontChanged.connect(self.currentFontChanged)
-
- self.fontSizeCombo = QtWidgets.QComboBox()
- self.fontSizeCombo.setEditable(True)
+ item_widget = QWidget()
+ item_widget.setLayout(layout)
+
+ self._background_button_group = QButtonGroup()
+ self._background_button_group.buttonClicked.connect(self.background_button_group_clicked)
+
+ background_layout = QGridLayout()
+ background_layout.addWidget(
+ self.create_background_cell_widget("Blue Grid", ':/images/background1.png'), 0, 0)
+ background_layout.addWidget(
+ self.create_background_cell_widget("White Grid", ':/images/background2.png'), 0, 1)
+ background_layout.addWidget(
+ self.create_background_cell_widget("Gray Grid", ':/images/background3.png'), 1, 0)
+ background_layout.addWidget(
+ self.create_background_cell_widget("No Grid", ':/images/background4.png'), 1, 1)
+
+ background_layout.setRowStretch(2, 10)
+ background_layout.setColumnStretch(2, 10)
+
+ background_widget = QWidget()
+ background_widget.setLayout(background_layout)
+
+ self._tool_box = QToolBox()
+ self._tool_box.setSizePolicy(QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Ignored))
+ self._tool_box.setMinimumWidth(item_widget.sizeHint().width())
+ self._tool_box.addItem(item_widget, "Basic Flowchart Shapes")
+ self._tool_box.addItem(background_widget, "Backgrounds")
+
+ def create_actions(self):
+ self._to_front_action = QAction(
+ QIcon(':/images/bringtofront.png'), "Bring to &Front",
+ self, shortcut="Ctrl+F", statusTip="Bring item to front",
+ triggered=self.bring_to_front)
+
+ self._send_back_action = QAction(
+ QIcon(':/images/sendtoback.png'), "Send to &Back", self,
+ shortcut="Ctrl+B", statusTip="Send item to back",
+ triggered=self.send_to_back)
+
+ self._delete_action = QAction(QIcon(':/images/delete.png'),
+ "&Delete", self, shortcut="Delete",
+ statusTip="Delete item from diagram",
+ triggered=self.delete_item)
+
+ self._exit_action = QAction("E&xit", self, shortcut="Ctrl+X",
+ statusTip="Quit Scenediagram example", triggered=self.close)
+
+ self._bold_action = QAction(QIcon(':/images/bold.png'),
+ "Bold", self, checkable=True, shortcut="Ctrl+B",
+ triggered=self.handle_font_change)
+
+ self._italic_action = QAction(QIcon(':/images/italic.png'),
+ "Italic", self, checkable=True, shortcut="Ctrl+I",
+ triggered=self.handle_font_change)
+
+ self._underline_action = QAction(
+ QIcon(':/images/underline.png'), "Underline", self,
+ checkable=True, shortcut="Ctrl+U",
+ triggered=self.handle_font_change)
+
+ self._about_action = QAction("A&bout", self, shortcut="Ctrl+B", triggered=self.about)
+
+ def create_menus(self):
+ self._file_menu = self.menuBar().addMenu("&File")
+ self._file_menu.addAction(self._exit_action)
+
+ self._item_menu = self.menuBar().addMenu("&Item")
+ self._item_menu.addAction(self._delete_action)
+ self._item_menu.addSeparator()
+ self._item_menu.addAction(self._to_front_action)
+ self._item_menu.addAction(self._send_back_action)
+
+ self._about_menu = self.menuBar().addMenu("&Help")
+ self._about_menu.addAction(self._about_action)
+
+ def create_toolbars(self):
+ self._edit_tool_bar = self.addToolBar("Edit")
+ self._edit_tool_bar.addAction(self._delete_action)
+ self._edit_tool_bar.addAction(self._to_front_action)
+ self._edit_tool_bar.addAction(self._send_back_action)
+
+ self._font_combo = QFontComboBox()
+ self._font_combo.currentFontChanged.connect(self.current_font_changed)
+
+ self._font_size_combo = QComboBox()
+ self._font_size_combo.setEditable(True)
for i in range(8, 30, 2):
- self.fontSizeCombo.addItem(str(i))
- validator = QtGui.QIntValidator(2, 64, self)
- self.fontSizeCombo.setValidator(validator)
- self.fontSizeCombo.currentIndexChanged.connect(self.fontSizeChanged)
-
- self.fontColorToolButton = QtWidgets.QToolButton()
- self.fontColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.fontColorToolButton.setMenu(
- self.createColorMenu(self.textColorChanged, QtCore.Qt.black))
- self.textAction = self.fontColorToolButton.menu().defaultAction()
- self.fontColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/textpointer.png',
- QtCore.Qt.black))
- self.fontColorToolButton.setAutoFillBackground(True)
- self.fontColorToolButton.clicked.connect(self.textButtonTriggered)
-
- self.fillColorToolButton = QtWidgets.QToolButton()
- self.fillColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.fillColorToolButton.setMenu(
- self.createColorMenu(self.itemColorChanged, QtCore.Qt.white))
- self.fillAction = self.fillColorToolButton.menu().defaultAction()
- self.fillColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/floodfill.png',
- QtCore.Qt.white))
- self.fillColorToolButton.clicked.connect(self.fillButtonTriggered)
-
- self.lineColorToolButton = QtWidgets.QToolButton()
- self.lineColorToolButton.setPopupMode(QtWidgets.QToolButton.MenuButtonPopup)
- self.lineColorToolButton.setMenu(
- self.createColorMenu(self.lineColorChanged, QtCore.Qt.black))
- self.lineAction = self.lineColorToolButton.menu().defaultAction()
- self.lineColorToolButton.setIcon(
- self.createColorToolButtonIcon(':/images/linecolor.png',
- QtCore.Qt.black))
- self.lineColorToolButton.clicked.connect(self.lineButtonTriggered)
-
- self.textToolBar = self.addToolBar("Font")
- self.textToolBar.addWidget(self.fontCombo)
- self.textToolBar.addWidget(self.fontSizeCombo)
- self.textToolBar.addAction(self.boldAction)
- self.textToolBar.addAction(self.italicAction)
- self.textToolBar.addAction(self.underlineAction)
-
- self.colorToolBar = self.addToolBar("Color")
- self.colorToolBar.addWidget(self.fontColorToolButton)
- self.colorToolBar.addWidget(self.fillColorToolButton)
- self.colorToolBar.addWidget(self.lineColorToolButton)
-
- pointerButton = QtWidgets.QToolButton()
- pointerButton.setCheckable(True)
- pointerButton.setChecked(True)
- pointerButton.setIcon(QtGui.QIcon(':/images/pointer.png'))
- linePointerButton = QtWidgets.QToolButton()
- linePointerButton.setCheckable(True)
- linePointerButton.setIcon(QtGui.QIcon(':/images/linepointer.png'))
-
- self.pointerTypeGroup = QtWidgets.QButtonGroup()
- self.pointerTypeGroup.addButton(pointerButton, DiagramScene.MoveItem)
- self.pointerTypeGroup.addButton(linePointerButton,
- DiagramScene.InsertLine)
- self.pointerTypeGroup.buttonClicked[int].connect(self.pointerGroupClicked)
-
- self.sceneScaleCombo = QtWidgets.QComboBox()
- self.sceneScaleCombo.addItems(["50%", "75%", "100%", "125%", "150%"])
- self.sceneScaleCombo.setCurrentIndex(2)
- self.sceneScaleCombo.currentIndexChanged[str].connect(self.sceneScaleChanged)
-
- self.pointerToolbar = self.addToolBar("Pointer type")
- self.pointerToolbar.addWidget(pointerButton)
- self.pointerToolbar.addWidget(linePointerButton)
- self.pointerToolbar.addWidget(self.sceneScaleCombo)
-
- def createBackgroundCellWidget(self, text, image):
- button = QtWidgets.QToolButton()
+ self._font_size_combo.addItem(str(i))
+ validator = QIntValidator(2, 64, self)
+ self._font_size_combo.setValidator(validator)
+ self._font_size_combo.currentIndexChanged.connect(self.font_size_changed)
+
+ self._font_color_tool_button = QToolButton()
+ self._font_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._font_color_tool_button.setMenu(
+ self.create_color_menu(self.text_color_changed, Qt.black))
+ self._text_action = self._font_color_tool_button.menu().defaultAction()
+ self._font_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/textpointer.png', Qt.black))
+ self._font_color_tool_button.setAutoFillBackground(True)
+ self._font_color_tool_button.clicked.connect(self.text_button_triggered)
+
+ self._fill_color_tool_button = QToolButton()
+ self._fill_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._fill_color_tool_button.setMenu(
+ self.create_color_menu(self.item_color_changed, Qt.white))
+ self._fill_action = self._fill_color_tool_button.menu().defaultAction()
+ self._fill_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/floodfill.png', Qt.white))
+ self._fill_color_tool_button.clicked.connect(self.fill_button_triggered)
+
+ self._line_color_tool_button = QToolButton()
+ self._line_color_tool_button.setPopupMode(QToolButton.MenuButtonPopup)
+ self._line_color_tool_button.setMenu(
+ self.create_color_menu(self.line_color_changed, Qt.black))
+ self._line_action = self._line_color_tool_button.menu().defaultAction()
+ self._line_color_tool_button.setIcon(
+ self.create_color_tool_button_icon(':/images/linecolor.png', Qt.black))
+ self._line_color_tool_button.clicked.connect(self.line_button_triggered)
+
+ self._text_tool_bar = self.addToolBar("Font")
+ self._text_tool_bar.addWidget(self._font_combo)
+ self._text_tool_bar.addWidget(self._font_size_combo)
+ self._text_tool_bar.addAction(self._bold_action)
+ self._text_tool_bar.addAction(self._italic_action)
+ self._text_tool_bar.addAction(self._underline_action)
+
+ self._color_tool_bar = self.addToolBar("Color")
+ self._color_tool_bar.addWidget(self._font_color_tool_button)
+ self._color_tool_bar.addWidget(self._fill_color_tool_button)
+ self._color_tool_bar.addWidget(self._line_color_tool_button)
+
+ pointer_button = QToolButton()
+ pointer_button.setCheckable(True)
+ pointer_button.setChecked(True)
+ pointer_button.setIcon(QIcon(':/images/pointer.png'))
+ line_pointer_button = QToolButton()
+ line_pointer_button.setCheckable(True)
+ line_pointer_button.setIcon(QIcon(':/images/linepointer.png'))
+
+ self._pointer_type_group = QButtonGroup()
+ self._pointer_type_group.addButton(pointer_button, DiagramScene.MoveItem)
+ self._pointer_type_group.addButton(line_pointer_button, DiagramScene.InsertLine)
+ self._pointer_type_group.idClicked.connect(self.pointer_group_clicked)
+
+ self._scene_scale_combo = QComboBox()
+ self._scene_scale_combo.addItems(["50%", "75%", "100%", "125%", "150%"])
+ self._scene_scale_combo.setCurrentIndex(2)
+ self._scene_scale_combo.currentTextChanged.connect(self.scene_scale_changed)
+
+ self._pointer_toolbar = self.addToolBar("Pointer type")
+ self._pointer_toolbar.addWidget(pointer_button)
+ self._pointer_toolbar.addWidget(line_pointer_button)
+ self._pointer_toolbar.addWidget(self._scene_scale_combo)
+
+ def create_background_cell_widget(self, text, image):
+ button = QToolButton()
button.setText(text)
- button.setIcon(QtGui.QIcon(image))
- button.setIconSize(QtCore.QSize(50, 50))
+ button.setIcon(QIcon(image))
+ button.setIconSize(QSize(50, 50))
button.setCheckable(True)
- self.backgroundButtonGroup.addButton(button)
+ self._background_button_group.addButton(button)
- layout = QtWidgets.QGridLayout()
- layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
- layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+ layout = QGridLayout()
+ layout.addWidget(button, 0, 0, Qt.AlignHCenter)
+ layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter)
- widget = QtWidgets.QWidget()
+ widget = QWidget()
widget.setLayout(layout)
return widget
- def createCellWidget(self, text, diagramType):
- item = DiagramItem(diagramType, self.itemMenu)
- icon = QtGui.QIcon(item.image())
+ def create_cell_widget(self, text, diagram_type):
+ item = DiagramItem(diagram_type, self._item_menu)
+ icon = QIcon(item.image())
- button = QtWidgets.QToolButton()
+ button = QToolButton()
button.setIcon(icon)
- button.setIconSize(QtCore.QSize(50, 50))
+ button.setIconSize(QSize(50, 50))
button.setCheckable(True)
- self.buttonGroup.addButton(button, diagramType)
+ self._button_group.addButton(button, diagram_type)
- layout = QtWidgets.QGridLayout()
- layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter)
- layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter)
+ layout = QGridLayout()
+ layout.addWidget(button, 0, 0, Qt.AlignHCenter)
+ layout.addWidget(QLabel(text), 1, 0, Qt.AlignCenter)
- widget = QtWidgets.QWidget()
+ widget = QWidget()
widget.setLayout(layout)
return widget
- def createColorMenu(self, slot, defaultColor):
- colors = [QtCore.Qt.black, QtCore.Qt.white, QtCore.Qt.red, QtCore.Qt.blue, QtCore.Qt.yellow]
+ def create_color_menu(self, slot, defaultColor):
+ colors = [Qt.black, Qt.white, Qt.red, Qt.blue, Qt.yellow]
names = ["black", "white", "red", "blue", "yellow"]
- colorMenu = QtWidgets.QMenu(self)
+ color_menu = QMenu(self)
for color, name in zip(colors, names):
- action = QtWidgets.QAction(self.createColorIcon(color), name, self,
- triggered=slot)
- action.setData(QtGui.QColor(color))
- colorMenu.addAction(action)
+ action = QAction(self.create_color_icon(color), name, self, triggered=slot)
+ action.setData(QColor(color))
+ color_menu.addAction(action)
if color == defaultColor:
- colorMenu.setDefaultAction(action)
- return colorMenu
+ color_menu.setDefaultAction(action)
+ return color_menu
- def createColorToolButtonIcon(self, imageFile, color):
- pixmap = QtGui.QPixmap(50, 80)
- pixmap.fill(QtCore.Qt.transparent)
- painter = QtGui.QPainter(pixmap)
- image = QtGui.QPixmap(imageFile)
- target = QtCore.QRect(0, 0, 50, 60)
- source = QtCore.QRect(0, 0, 42, 42)
- painter.fillRect(QtCore.QRect(0, 60, 50, 80), color)
- painter.drawPixmap(target, image, source)
- painter.end()
+ def create_color_tool_button_icon(self, imageFile, color):
+ pixmap = QPixmap(50, 80)
+ pixmap.fill(Qt.transparent)
- return QtGui.QIcon(pixmap)
+ with QPainter(pixmap) as painter:
+ image = QPixmap(imageFile)
+ target = QRect(0, 0, 50, 60)
+ source = QRect(0, 0, 42, 42)
+ painter.fillRect(QRect(0, 60, 50, 80), color)
+ painter.drawPixmap(target, image, source)
- def createColorIcon(self, color):
- pixmap = QtGui.QPixmap(20, 20)
- painter = QtGui.QPainter(pixmap)
- painter.setPen(QtCore.Qt.NoPen)
- painter.fillRect(QtCore.QRect(0, 0, 20, 20), color)
- painter.end()
+ return QIcon(pixmap)
- return QtGui.QIcon(pixmap)
+ def create_color_icon(self, color):
+ pixmap = QPixmap(20, 20)
+ with QPainter(pixmap) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.fillRect(QRect(0, 0, 20, 20), color)
-if __name__ == '__main__':
+ return QIcon(pixmap)
- import sys
- app = QtWidgets.QApplication(sys.argv)
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
- mainWindow = MainWindow()
- mainWindow.setGeometry(100, 100, 800, 500)
- mainWindow.show()
+ main_window = MainWindow()
+ main_window.setGeometry(100, 100, 800, 500)
+ main_window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject b/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject
index 0acabdd78..79b8c8658 100644
--- a/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["diagramscene.qrc", "diagramscene.py", "diagramscene_rc.py"]
+ "files": ["diagramscene.qrc", "diagramscene.py"]
}
diff --git a/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py
index 8fee5a0d6..144d9200f 100644
--- a/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py
+++ b/examples/widgets/graphicsview/diagramscene/diagramscene_rc.py
@@ -1,149 +1,11 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
-\x00\x00\x00\xf7\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\
-\x00\x00\x00\xbeIDAT(S\x85\x911\x0e@@\
-\x10EWM$J7\xa1\xa4\x918\x85^t\xaa=\
-\x8aNT{\x80\xadun\xa0\xd1l\xe7\x12\xc4\x97\x19\
-\xb1!YQ\xfcb\xfe\xbc\xfc\x99\xcc\x08\x00\x82t\x1c\
-\x07\xa6i\x82\x10\xc2)\xcf\xf3.\xf0\xd68\x8e\xa8\xaa\
-\x8aU\x14\x05\x03I\x92X\xef\x05?\xd5u\x1d\xc3Z\
-k\xd0T\xf2\x9c 5\xeb\xbafx]W\xdc\xfeg\
-r\x9a\xa6\x88\xe3\x18O\xcf\x09n\xdb\x06\xdf\xf7Q\x96\
-\xa5]\xc1\x09Ss\x9eg^AJ\xf9\x9f<\x0c\x03\
-\xc3J\xa9\xff\xe4\xb6m\x19^\x96\xe5?9\xcfs\x84\
-a\x88}\xdf\xdf\xc9T\x18c\xec\xe1IA\x10 \x8a\
-\x22[7M\x03\x9b\xdc\xf7\xfd\xf5\xce\x8fWgY\xc6\
-\x13N\xfaWVX\xe8@\xda\xc6\x00\x00\x00\x00IE\
-ND\xaeB`\x82\
-\x00\x00\x01\x1a\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00*\x00\x00\x00+\x02\x03\x00\x00\x00s\xf1\xf2m\
-\x00\x00\x00\x0cPLTE\xff\xff\xff\x80\x80\x80\x00\x00\
-\x00\xff\xff\xffEJK8\x00\x00\x00\x01tRNS\
-\x00@\xe6\xd8f\x00\x00\x00\xbcIDATx^M\
-\xcb\xbd\x89\x041\x0c\x86a\xa1\xd0U8\x1c\xdc\x8f&\
-\xd8\x12\xa6\x0a\xb3\xe1\xe6N.2\x07\x02\xdb\x07[\xc0\
-\x96\xb4U\x9cG?3V\xf4!\xde\x07B\xcd\xe0\x17\
-F\xbd\xf6\xb6\xec\x1a\xef\xa6A\x024\xb2A\x80`$\
-\xcf\x9d\x9a\xee8\x8b~x\x83O~d\xb30hW\
-\x102t\x22\x05\x98\x91\x89\x0c\xe4P\x88\x0c\xd4D\xe4\
- \xce\xdc\xc1\x98\x89\x833q \x89\x02\xe4\x9d\x1d`\
-\xa1.@\xff\xe9\x02\xfd\xf1*\x0e\xd2\xfe{\x81P\xda\
-\x02\x8e\xef\x02>\x0bx\xb3l\x01\x7f]\x1a\x03f\x1d\
-4\x00\x03B\x15\xb0\xe4\x0a$7P$W\xc0\x92+\
-\xe8\x92\x1b\x90\xdc\x80\xe4\x0a$7\xf0so\x1cp_\
-[v<\xc7?\xd6Qh R\x85\xdb_\x00\x00\x00\
-\x00IEND\xaeB`\x82\
-\x00\x00\x00\xfa\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\
-\x00\x00\x00\xc1IDAT(S\xcd\x901\x0a\x840\
-\x10E\xc7\xceV\xb0\xd3F\x10o`\xe5\x01\xbcB@\
-\x0b\x9bt\x22\x11\xbc\x94\x9d'\xd2\x03x\x03\x03\x19\xf7\
-\x0f\xb8\xd9,l\xbf\x81Of\xde\xfc|\xc8P\x1c\xc7\
-LD\xa2(\x8a8\xcfs~\x1d\xc2\xfd\xc9\xd34e\
-\xd2ZsQ\x14\x02\x86a\xe0y\x9e\xc5\x8c\x1b=8\
-\xe6\xe382a\xa0\x94\x12\x88\xfa[\xe0\x98;\xe7B\
-3\xc0/3\xea\x7fJ\xee\xbaN\xcc\xd7u\x05\x0f\xd0\
-\x83\xf7}\xef\x93\xb1&\xc0}\xdf\x03\xf3q\x1c\xc2\x97\
-e\xf1\xc9\xeb\xba\x0a\x9c\xa6)0?!\xdb\xb6\xf9d\
-\xa8\xaek\x19\x94e\xc9m\xdbrUU\xd27M\xc3\
-\xd6Z\x9f\xfc\xc8\x18\xc3Y\x96\x89)I\x12\xc6_\xce\
-\xf3|o\xe9\x063 8\xcd\x08\x1exv\x00\x00\x00\
-\x00IEND\xaeB`\x82\
-\x00\x00\x00r\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
-\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\
-\xd3~\x00\x00\x00'IDATH\xc7c`\x80\x82\
-\x06\x0640*0*0*0*\x80*\xf0\x1f\x15\
-\xfc\x1b\x0d\xa0Q\x81Q\x81Q\x01\x22\x05\x00\xd5;N\
-\xf0s\xe3o\xe9\x00\x00\x00\x00IEND\xaeB`\
-\x82\
-\x00\x00\x02\xf1\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00*\x00\x00\x00,\x08\x03\x00\x00\x00$D\xdat\
-\x00\x00\x012PLTE\xff\xff\xff\xfe\xfe\xfe\x01\x01\
-\x01\xbe\xbe\xbe\xfd\xfd\xfd\x00\x00\x00ddd\xd2\xd2\xd2\
-|||\xfb\xfb\xfb\xe7\xe7\xe7\x84\x84\x84\xd7\xd7\xd7\xe0\
-\xe0\xe0\xe1\xe1\xe1\x0c\x0c\x0c(((\xf5\xf5\xf5\xb3\xb3\
-\xb3\x02\x02\x02\x95\x95\x95...\x11\x11\x11kkk\
-\x03\x03\x03rrrIII\xfc\xfc\xfc\x13\x13\x13\x04\
-\x04\x04\x9f\x9f\x9f\xc4\xc4\xc4\xa9\xa9\xa9\x05\x05\x05WW\
-W\x17\x17\x17\xf6\xf6\xf6\x16\x16\x16\xa6\xa6\xa6\xa0\xa0\xa0\
-```$$$>>>###\xb7\xb7\xb7M\
-MM\xf8\xf8\xf8\xc0\xc0\xc0000\x09\x09\x09\xec\xec\
-\xec \x8a\x8a\x8a\xda\xda\xda\xf1\xf1\xf1\x0d\x0d\x0d\
-\x99\x99\x99\x19\x19\x19\xf9\xf9\xf9\xcd\xcd\xcd\xf4\xf4\xf49\
-99---;;;\x12\x12\x12CCC\xc2\xc2\
-\xc2\xa4\xa4\xa4\xdc\xdc\xdcUUUhhhZZZ\
-PPP\xf0\xf0\xf0\x06\x06\x06\x1f\x1f\x1fttt\xb1\
-\xb1\xb1]]]!!!666\x08\x08\x08\xea\xea\
-\xea\xdb\xdb\xdb\x81\x81\x81\x9c\x9c\x9c\x8b\x8b\x8buuu\
-\xf2\xf2\xf2%%%\xce\xce\xceHHHccc\xba\
-\xba\xbaSSS888\xf7\xf7\xf7\xe4\xe4\xe4\xa2\xa2\
-\xa2JJJ\xf3\xf3\xf3___\xf1i\x00\xec\x00\x00\
-\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x01mI\
-DATx^\xd5\x92\xc5v\xc30\x10E=\x92\x1d\
-f\xe6\x94\x99\x99\x99\x99\x99\xe1\xff\x7f\xa1\x9e\x89\x93S\
-\xa9\xb2Nvm\xdf\xf2\xea\xfa\xbdY\xd8\xf8+\xf10\
-\xeb[X\xcc\x047\x13<\x96\x10\xc6\xb5\xadB\xda\x9a\
-om\x0d@\xb3\xad,\xe8\xda\x1a\xe2\xb5\xf4\xd4\xddq\
-\xbf\xa1\x0d\x14{\x1b\xed\x09\xd0\xbb\x03\x0d\x93\x0d\xeaM\
-\xd8A+3\x82n.\xac5\xc39\xbb\x95\xe5\xbb\xa9\
-\xdb\xa7\xbd\xc0G\xcedG'~1;\xa7q\x87\xda\
-\xd1,\x00\xf8\xe8\xda\x16\xcd~\x17\x19\x09\xc3\x88\x94\xd1\
-]\xd5\xb4\xf6\xe1n\xbf\xdf66\xe9\x92\x90\xab\xeb\xa5\
-\xf7\x09\xdb\x84a\xea\xcf\xbb\xeeg\xd1\x1c\x1dC`\xa6\
-\xd1]\x89\xbb\x98S\xd3\xb8\xef\xa9\x81\x19Z\xa8\x80\xda\
-M\xd1\xeb<\xbd\xc2B\x06\xbf[T\x9b\xe6\x12\x9a\xcb\
-N\x0f\x1c\xd0\xb5w\xca\xfd5z[\xaf\x83\x8d$\xba\
-[\xca\x0b\xb6q_\x0a\x8b\xee*\xdc\xc0\x9e\xa5\x08K\
-)\xf6\x83\x962i\xf3\x87\xe9\xdfgj\xb7\x0a\xb2{\
-\xe8b\xb2#\xd9\x84\x02\xf2c.\xe4\x04\xd9\xe9\x99d\
-\x9eS\xc3\x85H/i\xe9\x0aDzmS\x96\x8c\x08\
-\x14n\xa2Ho\x8b\x02\x8d\x97\xb0\xf5\x1e\xa4\xad\x07\xda\
-z\x14XE\xfd\xd7W\xe9\x82'\xa1\xe1\x19\x97J/\
-r\xab\x19C^~\xads\xce\xf9\x1b}\xfd\xce1\x1f\
-\xe0`\xcc'\xademL\xcc\x12\xc2\xbcN#\x139\
-A\x89y\xc1P5\xfc~\xeb\xff\xca\x17Uq \xbb\
-\xd7\xbb.\xca\x00\x00\x00\x00IEND\xaeB`\x82\
-\
-\x00\x00\x01>\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\
-\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
-\xa7\x93\x00\x00\x00\xf3IDAT8\xcb\xed\x94An\
-\x830\x10E\x9f%\xe0\x0c\xbdC/\xd0\x13\xe5\xfaU\
-b\x9b\xd83\x01w\x81\x0d$\x85\xaa1\xca\xaa\x1d\x89\
-\x8d\x0dO\xef{\x067m\xdb&\x0e\x94\xaa\x9a\xad\xf5\
-\x06@D\xaa\xa0]\xd7\xed\xee5\xbc\xa8\xfe\xc1\x7f\x01\
-l\x8c\xd9\xdbJ\x87\x8dS\xda`\x8c\x03\x0c\x01\xf4\x0a\
-\xd2Ct\x98\xb7\xf7\x83G1*h\x81z\x10\x07\xd1\
-\x1d<\xe3A&\xa0\xf6\x0b48\x88\x97Jp\x1aa\
-\x88Kt\xf5\x93e\xb4\xd3#5\xc6i\x80[\x00)\
-\xd1=\xa8\x83`W`_\x01\x96\x1c}\xb6|0\x95\
-jp\xfep\x06\xba\x15\xd4\xe5\x14v\x01\xfft\xfd\xdd\
-U\xb8\xe4\xce\xdb\x05\x5c&A\xfd\xb2\x064{\x17\xf5\
-\xe6\x8f\x10\xce\xdf\xa1\xc54\xe6\x89\xa8j^\xf8\x9cF\
-j\xb6t\x10\xb3\xa9\xac\x1a\xf84\xf8z\xce\xa6\x16b\
-\x0fj\xef\x1bXRT\x81\xa5\x98nLE\xf4p\xeb\
-\x9f\x07\x9b\x8f\xd3\xaf\xdf\xfd\x02\xd6\xbd\xde\xdfp\xdb\x04\
-\x83\x00\x00\x00\x00IEND\xaeB`\x82\
\x00\x00\x00\xad\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -157,56 +19,47 @@ r\x1f\x17a\x1aW\x9e\x80A\xb9\xf3\x82@\xeb\xc8B\
\xfed\xcc\x8f\xdc\x17\xd9\x83\xf6\x1e\xe4\xd8\xdd\xe3\xd8\x1d\
sa.\xb4\x8e'\xf0\x07\xd5\x18\x11\x1b\xedM#\xf4\
\x00\x00\x00\x00IEND\xaeB`\x82\
-\x00\x00\x00p\
+\x00\x00\x01\x12\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
-\x00\x00\x00\x06PLTE\x00\xff\xff\xff\xff\xff\xb1\xb8\
-^\xa0\x00\x00\x00%IDATx^\xed\xcc!\x12\
-\x00\x00\x04\x00A\xff\x7f4\x82\x11du/n\xb8\xd8\
-j\xca\x0b\x00\x00\xf0\x9d\x01\x00@\x03\x94\x98\xeb\xc0\x19\
-8\xa1\x84\x00\x00\x00\x00IEND\xaeB`\x82\
-\x00\x00\x00\x91\
+\x00\x00\x0b\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x7f\xf5\x94;\
+\x00\x00\x00\xd9IDAT(S}\x901\x0eE@\
+\x10\x86G$$\x1a\x0d\x0d\xd1\x22Qp\x80m\x5c@\
+\xe7<\x0e!\x0aGq\x19\xb5N\xa9\xc1x3\xb2\x8b\
+\xf7\xec\xdb\xe4\xcbfv\xfe\xf9gv\xc00\x0c\x04\x80\
+\x07\xf4fY\x16&I\x82\x9f\x03\xc4\xbe\xef\x94;\x05\
+i\x9a2$\x08\xc3\xf0QX\xd75\x17\x01\x05\x04U\
+\xde]\xe8v\x1c\x87s\xb6m\xe3\xc3Y\x0a\xefDQ\
+\xc4\xe2 \x08\xf4\xce\xeb\xbab\xdb\xb6j\x94\xbe\xefO\
+\xb1|(\x8a\x82\xc9\xf3\x1c}\xdfg\x03!\x04\x0e\xc3\
+\xa0L@\xb7\x0d\xd34Y\xdcu\xdd%\xfe\x9ey\xdb\
+6\x9c\xa6\x89c\xd9!\x8ec\x1c\xc7\x11\xd5\xcco\x1f\
+$d\xbe\xaa\xaa\xff\xdbX\x96E\x8dF]^\xb7A\
+\xcc\xf3\x8cM\xd3\xa0\xccgYv9{\x9e\xa7p]\
+\xf7\xe7\xd3\xdamH\xa8\xa8,K\xd5\xf1\x00\xd0\xc0\x13\
+\xc8\x06\xaf\x16(\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00\x00r\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00*\x00\x00\x00+\x01\x03\x00\x00\x004Q\x88\xbd\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\
-\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\
-\x00\x009IDAT\x18Wc`\xc0\x05\x14 T\
-\x01\x84\xfa\x01&\x19\xff\x80)f\x08\x8f\xfd\x03\x98\xe2\
-\x7f\x00\xa6\xe4\x0f\x80)\xfb\x060U\x0f\xd1\xf6oP\
-k\xe3\x87hc\x83P,\x0c\x84\x00\x00\x91\xca\x1c\x09\
-\xf6#*\xfe\x00\x00\x00\x00IEND\xaeB`\x82\
-\
-\x00\x00\x01%\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\
-\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
-\xa7\x93\x00\x00\x00\xdaIDATH\xc7\xed\x94A\x0e\
-\x820\x10E\x1fF8\x83w\xf0\xfe\x87\xf0\x1a^@\
-\xb1\xa5t\xa6\x1a\x5c\xb4\x04\x8c\xa2\x11\xca\xc2\xc4I\xd8\
-\xd0\xe4\xe5\xf5\xf7g\x8a\xb2,;\x16L\x08\xa1x\xf5\
-\x7f\x0b\xa0\xaa\xb3\xa0UUM\x9emXi\xfe\xe0\x1f\
-\x06o30\xbaU\xc0\xdd\xed\x0a7\x0f\xa1\x05u \
-\x96b\xb7\xcf`\x1c\x5c\x826\xa0\x16\xc4f\x8aB\xed\
-\x00\xf5\x16\xe4\x92\x09,\x97h)&~\x9a\xcb\xd8\xd7\
-\xe0\xcd\x08\xdcd\x02\xbb\xf3`\xaa9\xc1\xed9A\xfb\
-\xac\xcd\x00~\xb7\xfe>g\x5c\xc7\x8cC\x93\xe2H\x19\
-O-\xeaW\x95\xed\x8e\x87!KI\x96\xbe\x8e\xa6\x92\
-\x1a1\xeb\xf1\xfc)V\xaa\xefk\xb0 \xc9TG\x0f\
-\xf85\xb8M\xd7V\x03\xe2 \x98\xc7\xaa\xf5\xb7\x98\x05\
-\xd6\xde\xd4>\xf7W\x1a\xb8:\x00\x8a\xa5\xcbfj\xee\
-\x91a\xa9f\xc0\x0f\xb5]\x00\x00\x00\x00IEND\
-\xaeB`\x82\
-\x00\x00\x00`\
+\xd3~\x00\x00\x00'IDATH\xc7c`\x80\x82\
+\x06\x0640*0*0*0*\x80*\xf0\x1f\x15\
+\xfc\x1b\x0d\xa0Q\x81Q\x81Q\x01\x22\x05\x00\xd5;N\
+\xf0s\xe3o\xe9\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00\x00\x8d\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
-\x00\x00\x00\x03PLTE\xff\xff\xff\xa7\xc4\x1b\xc8\x00\
-\x00\x00\x18IDATx^\xed\xc01\x01\x00\x00\x00\
-\xc2 \xfb\xa76\xc5>X\x0b\x00\xe0\x08o\x00\x01\x01\
->\xc31\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x1b\x00\x00\x00\x1b\x01\x03\x00\x00\x00\xb7\x1af\x16\
+\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\
+\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\
+\x00\x005IDAT\x08\x99c`\xc0\x02\xd8\x1b\x80\
+\x04\xff\x01L\x82\xfd\x01H\xba\x00DX\x80\x08\x19\x10\
+\xc1\x07\xd6\x02\x22\x98A\xfa\x18A\x0a\x19\xc0\x0a\xeb@\
+\x84=\x16B\x0e\xddF\x00\xb5\x00\x09@\xa31\xbf^\
+\x00\x00\x00\x00IEND\xaeB`\x82\
\x00\x00\x03?\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -261,37 +114,6 @@ I\x22\x8f\x8f\xc15\xf7\xdd\x12\xae\xb4\xf4\x04n\xa9\x0c\
\x8a\x88\xa6Y\xd6\xa8Syku\x9eO>\x8e\x1b\xec\
\x0f\xe4\x1a\xda\xa0h\xebM\xed\x7f=\xa9\x97\x96\x02\xf1\
+\x1c\x00\x00\x00\x00IEND\xaeB`\x82\
-\x00\x00\x00\x8d\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x1b\x00\x00\x00\x1b\x01\x03\x00\x00\x00\xb7\x1af\x16\
-\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\
-\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\
-\x00\x005IDAT\x08\x99c`\xc0\x02\xd8\x1b\x80\
-\x04\xff\x01L\x82\xfd\x01H\xba\x00DX\x80\x08\x19\x10\
-\xc1\x07\xd6\x02\x22\x98A\xfa\x18A\x0a\x19\xc0\x0a\xeb@\
-\x84=\x16B\x0e\xddF\x00\xb5\x00\x09@\xa31\xbf^\
-\x00\x00\x00\x00IEND\xaeB`\x82\
-\x00\x00\x01\x12\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00\x0b\x00\x00\x00\x0d\x08\x06\x00\x00\x00\x7f\xf5\x94;\
-\x00\x00\x00\xd9IDAT(S}\x901\x0eE@\
-\x10\x86G$$\x1a\x0d\x0d\xd1\x22Qp\x80m\x5c@\
-\xe7<\x0e!\x0aGq\x19\xb5N\xa9\xc1x3\xb2\x8b\
-\xf7\xec\xdb\xe4\xcbfv\xfe\xf9gv\xc00\x0c\x04\x80\
-\x07\xf4fY\x16&I\x82\x9f\x03\xc4\xbe\xef\x94;\x05\
-i\x9a2$\x08\xc3\xf0QX\xd75\x17\x01\x05\x04U\
-\xde]\xe8v\x1c\x87s\xb6m\xe3\xc3Y\x0a\xefDQ\
-\xc4\xe2 \x08\xf4\xce\xeb\xbab\xdb\xb6j\x94\xbe\xefO\
-\xb1|(\x8a\x82\xc9\xf3\x1c}\xdfg\x03!\x04\x0e\xc3\
-\xa0L@\xb7\x0d\xd34Y\xdcu\xdd%\xfe\x9ey\xdb\
-6\x9c\xa6\x89c\xd9!\x8ec\x1c\xc7\x11\xd5\xcco\x1f\
-$d\xbe\xaa\xaa\xff\xdbX\x96E\x8dF]^\xb7A\
-\xcc\xf3\x8cM\xd3\xa0\xccgYv9{\x9e\xa7p]\
-\xf7\xe7\xd3\xdamH\xa8\xa8,K\xd5\xf1\x00\xd0\xc0\x13\
-\xc8\x06\xaf\x16(\x00\x00\x00\x00IEND\xaeB`\
-\x82\
\x00\x00\x00t\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -302,6 +124,184 @@ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
C\xc4\xff\x8d\x0a\x8c\x0a\x8c\x0a\x8c\x0a`\x17\x00\x00?\
x\xe4\xb7\xe3\x900_\x00\x00\x00\x00IEND\xae\
B`\x82\
+\x00\x00\x00`\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
+\x00\x00\x00\x03PLTE\xff\xff\xff\xa7\xc4\x1b\xc8\x00\
+\x00\x00\x18IDATx^\xed\xc01\x01\x00\x00\x00\
+\xc2 \xfb\xa76\xc5>X\x0b\x00\xe0\x08o\x00\x01\x01\
+>\xc31\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x00p\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\
+\x00\x00\x00\x06PLTE\x00\xff\xff\xff\xff\xff\xb1\xb8\
+^\xa0\x00\x00\x00%IDATx^\xed\xcc!\x12\
+\x00\x00\x04\x00A\xff\x7f4\x82\x11du/n\xb8\xd8\
+j\xca\x0b\x00\x00\xf0\x9d\x01\x00@\x03\x94\x98\xeb\xc0\x19\
+8\xa1\x84\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x01>\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\
+\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\xf3IDAT8\xcb\xed\x94An\
+\x830\x10E\x9f%\xe0\x0c\xbdC/\xd0\x13\xe5\xfaU\
+b\x9b\xd83\x01w\x81\x0d$\x85\xaa1\xca\xaa\x1d\x89\
+\x8d\x0dO\xef{\x067m\xdb&\x0e\x94\xaa\x9a\xad\xf5\
+\x06@D\xaa\xa0]\xd7\xed\xee5\xbc\xa8\xfe\xc1\x7f\x01\
+l\x8c\xd9\xdbJ\x87\x8dS\xda`\x8c\x03\x0c\x01\xf4\x0a\
+\xd2Ct\x98\xb7\xf7\x83G1*h\x81z\x10\x07\xd1\
+\x1d<\xe3A&\xa0\xf6\x0b48\x88\x97Jp\x1aa\
+\x88Kt\xf5\x93e\xb4\xd3#5\xc6i\x80[\x00)\
+\xd1=\xa8\x83`W`_\x01\x96\x1c}\xb6|0\x95\
+jp\xfep\x06\xba\x15\xd4\xe5\x14v\x01\xfft\xfd\xdd\
+U\xb8\xe4\xce\xdb\x05\x5c&A\xfd\xb2\x064{\x17\xf5\
+\xe6\x8f\x10\xce\xdf\xa1\xc54\xe6\x89\xa8j^\xf8\x9cF\
+j\xb6t\x10\xb3\xa9\xac\x1a\xf84\xf8z\xce\xa6\x16b\
+\x0fj\xef\x1bXRT\x81\xa5\x98nLE\xf4p\xeb\
+\x9f\x07\x9b\x8f\xd3\xaf\xdf\xfd\x02\xd6\xbd\xde\xdfp\xdb\x04\
+\x83\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x00\xfa\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\
+\x00\x00\x00\xc1IDAT(S\xcd\x901\x0a\x840\
+\x10E\xc7\xceV\xb0\xd3F\x10o`\xe5\x01\xbcB@\
+\x0b\x9bt\x22\x11\xbc\x94\x9d'\xd2\x03x\x03\x03\x19\xf7\
+\x0f\xb8\xd9,l\xbf\x81Of\xde\xfc|\xc8P\x1c\xc7\
+LD\xa2(\x8a8\xcfs~\x1d\xc2\xfd\xc9\xd34e\
+\xd2ZsQ\x14\x02\x86a\xe0y\x9e\xc5\x8c\x1b=8\
+\xe6\xe382a\xa0\x94\x12\x88\xfa[\xe0\x98;\xe7B\
+3\xc0/3\xea\x7fJ\xee\xbaN\xcc\xd7u\x05\x0f\xd0\
+\x83\xf7}\xef\x93\xb1&\xc0}\xdf\x03\xf3q\x1c\xc2\x97\
+e\xf1\xc9\xeb\xba\x0a\x9c\xa6)0?!\xdb\xb6\xf9d\
+\xa8\xaek\x19\x94e\xc9m\xdbrUU\xd27M\xc3\
+\xd6Z\x9f\xfc\xc8\x18\xc3Y\x96\x89)I\x12\xc6_\xce\
+\xf3|o\xe9\x063 8\xcd\x08\x1exv\x00\x00\x00\
+\x00IEND\xaeB`\x82\
+\x00\x00\x01%\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x16\x00\x00\x00\x16\x08\x06\x00\x00\x00\xc4\xb4l;\
+\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\xdaIDATH\xc7\xed\x94A\x0e\
+\x820\x10E\x1fF8\x83w\xf0\xfe\x87\xf0\x1a^@\
+\xb1\xa5t\xa6\x1a\x5c\xb4\x04\x8c\xa2\x11\xca\xc2\xc4I\xd8\
+\xd0\xe4\xe5\xf5\xf7g\x8a\xb2,;\x16L\x08\xa1x\xf5\
+\x7f\x0b\xa0\xaa\xb3\xa0UUM\x9emXi\xfe\xe0\x1f\
+\x06o30\xbaU\xc0\xdd\xed\x0a7\x0f\xa1\x05u \
+\x96b\xb7\xcf`\x1c\x5c\x826\xa0\x16\xc4f\x8aB\xed\
+\x00\xf5\x16\xe4\x92\x09,\x97h)&~\x9a\xcb\xd8\xd7\
+\xe0\xcd\x08\xdcd\x02\xbb\xf3`\xaa9\xc1\xed9A\xfb\
+\xac\xcd\x00~\xb7\xfe>g\x5c\xc7\x8cC\x93\xe2H\x19\
+O-\xeaW\x95\xed\x8e\x87!KI\x96\xbe\x8e\xa6\x92\
+\x1a1\xeb\xf1\xfc)V\xaa\xefk\xb0 \xc9TG\x0f\
+\xf85\xb8M\xd7V\x03\xe2 \x98\xc7\xaa\xf5\xb7\x98\x05\
+\xd6\xde\xd4>\xf7W\x1a\xb8:\x00\x8a\xa5\xcbfj\xee\
+\x91a\xa9f\xc0\x0f\xb5]\x00\x00\x00\x00IEND\
+\xaeB`\x82\
+\x00\x00\x00\x91\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00*\x00\x00\x00+\x01\x03\x00\x00\x004Q\x88\xbd\
+\x00\x00\x00\x06PLTE\xff\xff\xff\x00\x00\x00U\xc2\
+\xd3~\x00\x00\x00\x01tRNS\x00@\xe6\xd8f\x00\
+\x00\x009IDAT\x18Wc`\xc0\x05\x14 T\
+\x01\x84\xfa\x01&\x19\xff\x80)f\x08\x8f\xfd\x03\x98\xe2\
+\x7f\x00\xa6\xe4\x0f\x80)\xfb\x060U\x0f\xd1\xf6oP\
+k\xe3\x87hc\x83P,\x0c\x84\x00\x00\x91\xca\x1c\x09\
+\xf6#*\xfe\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x02\xf1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00*\x00\x00\x00,\x08\x03\x00\x00\x00$D\xdat\
+\x00\x00\x012PLTE\xff\xff\xff\xfe\xfe\xfe\x01\x01\
+\x01\xbe\xbe\xbe\xfd\xfd\xfd\x00\x00\x00ddd\xd2\xd2\xd2\
+|||\xfb\xfb\xfb\xe7\xe7\xe7\x84\x84\x84\xd7\xd7\xd7\xe0\
+\xe0\xe0\xe1\xe1\xe1\x0c\x0c\x0c(((\xf5\xf5\xf5\xb3\xb3\
+\xb3\x02\x02\x02\x95\x95\x95...\x11\x11\x11kkk\
+\x03\x03\x03rrrIII\xfc\xfc\xfc\x13\x13\x13\x04\
+\x04\x04\x9f\x9f\x9f\xc4\xc4\xc4\xa9\xa9\xa9\x05\x05\x05WW\
+W\x17\x17\x17\xf6\xf6\xf6\x16\x16\x16\xa6\xa6\xa6\xa0\xa0\xa0\
+```$$$>>>###\xb7\xb7\xb7M\
+MM\xf8\xf8\xf8\xc0\xc0\xc0000\x09\x09\x09\xec\xec\
+\xec \x8a\x8a\x8a\xda\xda\xda\xf1\xf1\xf1\x0d\x0d\x0d\
+\x99\x99\x99\x19\x19\x19\xf9\xf9\xf9\xcd\xcd\xcd\xf4\xf4\xf49\
+99---;;;\x12\x12\x12CCC\xc2\xc2\
+\xc2\xa4\xa4\xa4\xdc\xdc\xdcUUUhhhZZZ\
+PPP\xf0\xf0\xf0\x06\x06\x06\x1f\x1f\x1fttt\xb1\
+\xb1\xb1]]]!!!666\x08\x08\x08\xea\xea\
+\xea\xdb\xdb\xdb\x81\x81\x81\x9c\x9c\x9c\x8b\x8b\x8buuu\
+\xf2\xf2\xf2%%%\xce\xce\xceHHHccc\xba\
+\xba\xbaSSS888\xf7\xf7\xf7\xe4\xe4\xe4\xa2\xa2\
+\xa2JJJ\xf3\xf3\xf3___\xf1i\x00\xec\x00\x00\
+\x00\x01tRNS\x00@\xe6\xd8f\x00\x00\x01mI\
+DATx^\xd5\x92\xc5v\xc30\x10E=\x92\x1d\
+f\xe6\x94\x99\x99\x99\x99\x99\xe1\xff\x7f\xa1\x9e\x89\x93S\
+\xa9\xb2Nvm\xdf\xf2\xea\xfa\xbdY\xd8\xf8+\xf10\
+\xeb[X\xcc\x047\x13<\x96\x10\xc6\xb5\xadB\xda\x9a\
+om\x0d@\xb3\xad,\xe8\xda\x1a\xe2\xb5\xf4\xd4\xddq\
+\xbf\xa1\x0d\x14{\x1b\xed\x09\xd0\xbb\x03\x0d\x93\x0d\xeaM\
+\xd8A+3\x82n.\xac5\xc39\xbb\x95\xe5\xbb\xa9\
+\xdb\xa7\xbd\xc0G\xcedG'~1;\xa7q\x87\xda\
+\xd1,\x00\xf8\xe8\xda\x16\xcd~\x17\x19\x09\xc3\x88\x94\xd1\
+]\xd5\xb4\xf6\xe1n\xbf\xdf66\xe9\x92\x90\xab\xeb\xa5\
+\xf7\x09\xdb\x84a\xea\xcf\xbb\xeeg\xd1\x1c\x1dC`\xa6\
+\xd1]\x89\xbb\x98S\xd3\xb8\xef\xa9\x81\x19Z\xa8\x80\xda\
+M\xd1\xeb<\xbd\xc2B\x06\xbf[T\x9b\xe6\x12\x9a\xcb\
+N\x0f\x1c\xd0\xb5w\xca\xfd5z[\xaf\x83\x8d$\xba\
+[\xca\x0b\xb6q_\x0a\x8b\xee*\xdc\xc0\x9e\xa5\x08K\
+)\xf6\x83\x962i\xf3\x87\xe9\xdfgj\xb7\x0a\xb2{\
+\xe8b\xb2#\xd9\x84\x02\xf2c.\xe4\x04\xd9\xe9\x99d\
+\x9eS\xc3\x85H/i\xe9\x0aDzmS\x96\x8c\x08\
+\x14n\xa2Ho\x8b\x02\x8d\x97\xb0\xf5\x1e\xa4\xad\x07\xda\
+z\x14XE\xfd\xd7W\xe9\x82'\xa1\xe1\x19\x97J/\
+r\xab\x19C^~\xads\xce\xf9\x1b}\xfd\xce1\x1f\
+\xe0`\xcc'\xademL\xcc\x12\xc2\xbcN#\x139\
+A\x89y\xc1P5\xfc~\xeb\xff\xca\x17Uq \xbb\
+\xd7\xbb.\xca\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x01\x1a\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00*\x00\x00\x00+\x02\x03\x00\x00\x00s\xf1\xf2m\
+\x00\x00\x00\x0cPLTE\xff\xff\xff\x80\x80\x80\x00\x00\
+\x00\xff\xff\xffEJK8\x00\x00\x00\x01tRNS\
+\x00@\xe6\xd8f\x00\x00\x00\xbcIDATx^M\
+\xcb\xbd\x89\x041\x0c\x86a\xa1\xd0U8\x1c\xdc\x8f&\
+\xd8\x12\xa6\x0a\xb3\xe1\xe6N.2\x07\x02\xdb\x07[\xc0\
+\x96\xb4U\x9cG?3V\xf4!\xde\x07B\xcd\xe0\x17\
+F\xbd\xf6\xb6\xec\x1a\xef\xa6A\x024\xb2A\x80`$\
+\xcf\x9d\x9a\xee8\x8b~x\x83O~d\xb30hW\
+\x102t\x22\x05\x98\x91\x89\x0c\xe4P\x88\x0c\xd4D\xe4\
+ \xce\xdc\xc1\x98\x89\x833q \x89\x02\xe4\x9d\x1d`\
+\xa1.@\xff\xe9\x02\xfd\xf1*\x0e\xd2\xfe{\x81P\xda\
+\x02\x8e\xef\x02>\x0bx\xb3l\x01\x7f]\x1a\x03f\x1d\
+4\x00\x03B\x15\xb0\xe4\x0a$7P$W\xc0\x92+\
+\xe8\x92\x1b\x90\xdc\x80\xe4\x0a$7\xf0so\x1cp_\
+[v<\xc7?\xd6Qh R\x85\xdb_\x00\x00\x00\
+\x00IEND\xaeB`\x82\
+\x00\x00\x00\xf7\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x0b\x00\x00\x00\x0c\x08\x06\x00\x00\x00\xb4\xa9G\x9e\
+\x00\x00\x00\xbeIDAT(S\x85\x911\x0e@@\
+\x10EWM$J7\xa1\xa4\x918\x85^t\xaa=\
+\x8aNT{\x80\xadun\xa0\xd1l\xe7\x12\xc4\x97\x19\
+\xb1!YQ\xfcb\xfe\xbc\xfc\x99\xcc\x08\x00\x82t\x1c\
+\x07\xa6i\x82\x10\xc2)\xcf\xf3.\xf0\xd68\x8e\xa8\xaa\
+\x8aU\x14\x05\x03I\x92X\xef\x05?\xd5u\x1d\xc3Z\
+k\xd0T\xf2\x9c 5\xeb\xbafx]W\xdc\xfeg\
+r\x9a\xa6\x88\xe3\x18O\xcf\x09n\xdb\x06\xdf\xf7Q\x96\
+\xa5]\xc1\x09Ss\x9eg^AJ\xf9\x9f<\x0c\x03\
+\xc3J\xa9\xff\xe4\xb6m\x19^\x96\xe5?9\xcfs\x84\
+a\x88}\xdf\xdf\xc9T\x18c\xec\xe1IA\x10 \x8a\
+\x22[7M\x03\x9b\xdc\xf7\xfd\xf5\xce\x8fWgY\xc6\
+\x13N\xfaWVX\xe8@\xda\xc6\x00\x00\x00\x00IE\
+ND\xaeB`\x82\
"
qt_resource_name = b"\
@@ -309,66 +309,66 @@ qt_resource_name = b"\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
-\x00\x0a\
-\x02\xfcBG\
-\x00i\
-\x00t\x00a\x00l\x00i\x00c\x00.\x00p\x00n\x00g\
-\x00\x0d\
-\x06C\xe3g\
-\x00f\
-\x00l\x00o\x00o\x00d\x00f\x00i\x00l\x00l\x00.\x00p\x00n\x00g\
-\x00\x0d\
-\x08\xd5\xc4\xe7\
-\x00u\
-\x00n\x00d\x00e\x00r\x00l\x00i\x00n\x00e\x00.\x00p\x00n\x00g\
+\x00\x0b\
+\x0a+\x97\xe7\
+\x00p\
+\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
+\x00\x08\
+\x06'Zg\
+\x00b\
+\x00o\x00l\x00d\x00.\x00p\x00n\x00g\
\x00\x0f\
\x00I\xdb\xa7\
\x00b\
\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x002\x00.\x00p\x00n\x00g\
\x00\x0f\
-\x05\xaa\x0c\xc7\
-\x00t\
-\x00e\x00x\x00t\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
-\x00\x0e\
-\x0f\x0d\x22'\
-\x00s\
-\x00e\x00n\x00d\x00t\x00o\x00b\x00a\x00c\x00k\x00.\x00p\x00n\x00g\
-\x00\x0b\
-\x0a+\x97\xe7\
-\x00p\
-\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
+\x03J#\xe7\
+\x00l\
+\x00i\x00n\x00e\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
+\x00\x0a\
+\x0c\xad\x0f\x07\
+\x00d\
+\x00e\x00l\x00e\x00t\x00e\x00.\x00p\x00n\x00g\
+\x00\x0f\
+\x00J\xdb\xa7\
+\x00b\
+\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x003\x00.\x00p\x00n\x00g\
+\x00\x0f\
+\x00K\xdb\xa7\
+\x00b\
+\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x004\x00.\x00p\x00n\x00g\
\x00\x0f\
\x00P\xdb\xa7\
\x00b\
\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x001\x00.\x00p\x00n\x00g\
+\x00\x0e\
+\x0f\x0d\x22'\
+\x00s\
+\x00e\x00n\x00d\x00t\x00o\x00b\x00a\x00c\x00k\x00.\x00p\x00n\x00g\
\x00\x0d\
-\x05l\x22\xc7\
-\x00l\
-\x00i\x00n\x00e\x00c\x00o\x00l\x00o\x00r\x00.\x00p\x00n\x00g\
+\x08\xd5\xc4\xe7\
+\x00u\
+\x00n\x00d\x00e\x00r\x00l\x00i\x00n\x00e\x00.\x00p\x00n\x00g\
\x00\x10\
\x0f\x9b\x88g\
\x00b\
\x00r\x00i\x00n\x00g\x00t\x00o\x00f\x00r\x00o\x00n\x00t\x00.\x00p\x00n\x00g\
-\x00\x0f\
-\x00K\xdb\xa7\
-\x00b\
-\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x004\x00.\x00p\x00n\x00g\
-\x00\x0a\
-\x0c\xad\x0f\x07\
-\x00d\
-\x00e\x00l\x00e\x00t\x00e\x00.\x00p\x00n\x00g\
-\x00\x0f\
-\x03J#\xe7\
+\x00\x0d\
+\x05l\x22\xc7\
\x00l\
-\x00i\x00n\x00e\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
-\x00\x08\
-\x06'Zg\
-\x00b\
-\x00o\x00l\x00d\x00.\x00p\x00n\x00g\
+\x00i\x00n\x00e\x00c\x00o\x00l\x00o\x00r\x00.\x00p\x00n\x00g\
\x00\x0f\
-\x00J\xdb\xa7\
-\x00b\
-\x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x003\x00.\x00p\x00n\x00g\
+\x05\xaa\x0c\xc7\
+\x00t\
+\x00e\x00x\x00t\x00p\x00o\x00i\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x06C\xe3g\
+\x00f\
+\x00l\x00o\x00o\x00d\x00f\x00i\x00l\x00l\x00.\x00p\x00n\x00g\
+\x00\x0a\
+\x02\xfcBG\
+\x00i\
+\x00t\x00a\x00l\x00i\x00c\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -376,36 +376,36 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x0f\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00l\x00\x00\x00\x00\x00\x01\x00\x00\x03\x17\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\xd4\x00\x00\x00\x00\x00\x01\x00\x00\x0f\xf5\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xa7\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\xf2\x00\x00\x00\x00\x00\x01\x00\x00\x08u\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x00D\x00\x00\x00\x00\x00\x01\x00\x00\x01\xc7\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00\xa6\x00\x00\x00\x00\x00\x01\x00\x00\x06\x11\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00\xca\x00\x00\x00\x00\x00\x01\x00\x00\x06\x89\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00\xee\x00\x00\x00\x00\x00\x01\x00\x00\x06\xed\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x0fr\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00h\x00\x00\x00\x00\x00\x01\x00\x00\x02=\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01z\x00\x00\x00\x00\x00\x01\x00\x00\x0a\xca\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x0b_\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00.\x00\x00\x00\x00\x00\x01\x00\x00\x00\xb1\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x0eT\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x014\x00\x00\x00\x00\x00\x01\x00\x00\x08\xa3\
+\x00\x00\x01z\xe7\xee'\x09\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\x9a\x00\x00\x00\x00\x00\x01\x00\x00\x0eN\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\x16\x00\x00\x00\x00\x00\x01\x00\x00\x08\xe9\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\x90\x00\x00\x00\x00\x00\x01\x00\x00\x03\x8d\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x0e\xdf\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00,\x00\x00\x00\x00\x00\x01\x00\x00\x00\xfb\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00L\x00\x00\x00\x00\x00\x01\x00\x00\x02\x19\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\xd6\x00\x00\x00\x00\x00\x01\x00\x00\x07\xc4\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x01\x80\x00\x00\x00\x00\x00\x01\x00\x00\x0b\x0b\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\xb4\x00\x00\x00\x00\x00\x01\x00\x00\x06\x82\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x016\x00\x00\x00\x00\x00\x01\x00\x00\x09~\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00\x8c\x00\x00\x00\x00\x00\x01\x00\x00\x02\xce\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01\x12\x00\x00\x00\x00\x00\x01\x00\x00\x07a\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x01T\x00\x00\x00\x00\x00\x01\x00\x00\x09\xa1\
+\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
index 68a54d552..9ed92b26e 100644
--- a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.py
@@ -1,188 +1,160 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import dragdroprobot_rc
-
-
-class ColorItem(QtWidgets.QGraphicsItem):
+import sys
+import math
+
+from PySide6.QtCore import (QEasingCurve, QLineF, QMimeData, QPoint, QPointF,
+ QRandomGenerator, QRectF, QTimeLine, Qt)
+from PySide6.QtGui import (QBrush, QColor, QDrag, QImage, QPainter, QPixmap,
+ QPen, QTransform)
+from PySide6.QtWidgets import (QApplication, QGraphicsItem,
+ QGraphicsItemAnimation, QGraphicsScene,
+ QGraphicsView)
+
+import dragdroprobot_rc # noqa: F401
+
+
+def random(boundary):
+ return QRandomGenerator.global_().bounded(boundary)
+
+
+class ColorItem(QGraphicsItem):
n = 0
def __init__(self):
- super(ColorItem, self).__init__()
+ super().__init__()
- self.color = QtGui.QColor(QtCore.qrand() % 256, QtCore.qrand() % 256,
- QtCore.qrand() % 256)
+ self.color = QColor(random(256), random(256), random(256))
+ (r, g, b) = (self.color.red(), self.color.green(), self.color.blue())
self.setToolTip(
- "QColor(%d, %d, %d)\nClick and drag this color onto the robot!" %
- (self.color.red(), self.color.green(), self.color.blue())
- )
- self.setCursor(QtCore.Qt.OpenHandCursor)
+ f"QColor({r}, {g}, {b})\nClick and drag this color onto the robot!")
+ self.setCursor(Qt.OpenHandCursor)
+ self._start_drag_distance = QApplication.startDragDistance()
def boundingRect(self):
- return QtCore.QRectF(-15.5, -15.5, 34, 34)
+ return QRectF(-15.5, -15.5, 34, 34)
def paint(self, painter, option, widget):
- painter.setPen(QtCore.Qt.NoPen)
- painter.setBrush(QtCore.Qt.darkGray)
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.darkGray)
painter.drawEllipse(-12, -12, 30, 30)
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 1))
- painter.setBrush(QtGui.QBrush(self.color))
+ painter.setPen(QPen(Qt.black, 1))
+ painter.setBrush(QBrush(self.color))
painter.drawEllipse(-15, -15, 30, 30)
def mousePressEvent(self, event):
- if event.button() != QtCore.Qt.LeftButton:
+ if event.button() != Qt.LeftButton:
event.ignore()
return
- self.setCursor(QtCore.Qt.ClosedHandCursor)
+ self.setCursor(Qt.ClosedHandCursor)
def mouseMoveEvent(self, event):
- if QtCore.QLineF(QtCore.QPointF(event.screenPos()), QtCore.QPointF(event.buttonDownScreenPos(QtCore.Qt.LeftButton))).length() < QtWidgets.QApplication.startDragDistance():
+ start = QPointF(event.buttonDownScreenPos(Qt.LeftButton))
+ if QLineF(event.screenPos(), start).length() < self._start_drag_distance:
return
- drag = QtGui.QDrag(event.widget())
- mime = QtCore.QMimeData()
+ drag = QDrag(event.widget())
+ mime = QMimeData()
drag.setMimeData(mime)
ColorItem.n += 1
- if ColorItem.n > 2 and QtCore.qrand() % 3 == 0:
- image = QtGui.QImage(':/images/head.png')
+ if ColorItem.n > 2 and random(3) == 0:
+ image = QImage(':/images/head.png')
mime.setImageData(image)
- drag.setPixmap(QtGui.QPixmap.fromImage(image).scaled(30,40))
- drag.setHotSpot(QtCore.QPoint(15, 30))
+ drag.setPixmap(QPixmap.fromImage(image).scaled(30, 40))
+ drag.setHotSpot(QPoint(15, 30))
else:
mime.setColorData(self.color)
- mime.setText("#%02x%02x%02x" % (self.color.red(), self.color.green(), self.color.blue()))
+ (r, g, b) = (self.color.red(), self.color.green(), self.color.blue())
+ mime.setText(f"#{r:02x}{g:02x}{b:02x}")
- pixmap = QtGui.QPixmap(34, 34)
- pixmap.fill(QtCore.Qt.white)
+ pixmap = QPixmap(34, 34)
+ pixmap.fill(Qt.white)
- painter = QtGui.QPainter(pixmap)
- painter.translate(15, 15)
- painter.setRenderHint(QtGui.QPainter.Antialiasing)
- self.paint(painter, None, None)
- painter.end()
+ with QPainter(pixmap) as painter:
+ painter.translate(15, 15)
+ painter.setRenderHint(QPainter.Antialiasing)
+ self.paint(painter, None, None)
pixmap.setMask(pixmap.createHeuristicMask())
drag.setPixmap(pixmap)
- drag.setHotSpot(QtCore.QPoint(15, 20))
+ drag.setHotSpot(QPoint(15, 20))
- drag.exec_()
- self.setCursor(QtCore.Qt.OpenHandCursor)
+ drag.exec()
+ self.setCursor(Qt.OpenHandCursor)
def mouseReleaseEvent(self, event):
- self.setCursor(QtCore.Qt.OpenHandCursor)
+ self.setCursor(Qt.OpenHandCursor)
-class RobotPart(QtWidgets.QGraphicsItem):
+class RobotPart(QGraphicsItem):
def __init__(self, parent=None):
- super(RobotPart, self).__init__(parent)
+ super().__init__(parent)
- self.color = QtGui.QColor(QtCore.Qt.lightGray)
+ self.color = QColor(Qt.lightGray)
self.pixmap = None
- self.dragOver = False
+ self._drag_over = False
self.setAcceptDrops(True)
def dragEnterEvent(self, event):
- if event.mimeData().hasColor() or \
- (isinstance(self, RobotHead) and event.mimeData().hasImage()):
+ if (event.mimeData().hasColor()
+ or (isinstance(self, RobotHead) and event.mimeData().hasImage())):
event.setAccepted(True)
- self.dragOver = True
+ self._drag_over = True
self.update()
else:
event.setAccepted(False)
def dragLeaveEvent(self, event):
- self.dragOver = False
+ self._drag_over = False
self.update()
def dropEvent(self, event):
- self.dragOver = False
+ self._drag_over = False
if event.mimeData().hasColor():
- self.color = QtGui.QColor(event.mimeData().colorData())
+ self.color = QColor(event.mimeData().colorData())
elif event.mimeData().hasImage():
- self.pixmap = QtGui.QPixmap(event.mimeData().imageData())
+ self.pixmap = QPixmap(event.mimeData().imageData())
self.update()
class RobotHead(RobotPart):
def boundingRect(self):
- return QtCore.QRectF(-15, -50, 30, 50)
+ return QRectF(-15, -50, 30, 50)
def paint(self, painter, option, widget=None):
if not self.pixmap:
- painter.setBrush(self.dragOver and self.color.lighter(130)
- or self.color)
- painter.drawRoundedRect(-10, -30, 20, 30, 25, 25,
- QtCore.Qt.RelativeSize)
- painter.setBrush(QtCore.Qt.white)
+ painter.setBrush(self._drag_over and self.color.lighter(130) or self.color)
+ painter.drawRoundedRect(-10, -30, 20, 30, 25, 25, Qt.RelativeSize)
+ painter.setBrush(Qt.white)
painter.drawEllipse(-7, -3 - 20, 7, 7)
painter.drawEllipse(0, -3 - 20, 7, 7)
- painter.setBrush(QtCore.Qt.black)
+ painter.setBrush(Qt.black)
painter.drawEllipse(-5, -1 - 20, 2, 2)
painter.drawEllipse(2, -1 - 20, 2, 2)
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 2))
- painter.setBrush(QtCore.Qt.NoBrush)
+ painter.setPen(QPen(Qt.black, 2))
+ painter.setBrush(Qt.NoBrush)
painter.drawArc(-6, -2 - 20, 12, 15, 190 * 16, 160 * 16)
else:
painter.scale(.2272, .2824)
- painter.drawPixmap(QtCore.QPointF(-15*4.4, -50*3.54), self.pixmap)
+ painter.drawPixmap(QPointF(-15 * 4.4, -50 * 3.54), self.pixmap)
class RobotTorso(RobotPart):
def boundingRect(self):
- return QtCore.QRectF(-30, -20, 60, 60)
+ return QRectF(-30, -20, 60, 60)
def paint(self, painter, option, widget=None):
- painter.setBrush(self.dragOver and self.color.lighter(130)
- or self.color)
- painter.drawRoundedRect(-20, -20, 40, 60, 25, 25,
- QtCore.Qt.RelativeSize)
+ painter.setBrush(self._drag_over and self.color.lighter(130)
+ or self.color)
+ painter.drawRoundedRect(-20, -20, 40, 60, 25, 25, Qt.RelativeSize)
painter.drawEllipse(-25, -20, 20, 20)
painter.drawEllipse(5, -20, 20, 20)
painter.drawEllipse(-20, 22, 20, 20)
@@ -191,49 +163,49 @@ class RobotTorso(RobotPart):
class RobotLimb(RobotPart):
def boundingRect(self):
- return QtCore.QRectF(-5, -5, 40, 10)
+ return QRectF(-5, -5, 40, 10)
def paint(self, painter, option, widget=None):
- painter.setBrush(self.dragOver and self.color.lighter(130) or self.color)
+ painter.setBrush(self._drag_over and self.color.lighter(130) or self.color)
painter.drawRoundedRect(self.boundingRect(), 50, 50,
- QtCore.Qt.RelativeSize)
+ Qt.RelativeSize)
painter.drawEllipse(-5, -5, 10, 10)
class Robot(RobotPart):
def __init__(self):
- super(Robot, self).__init__()
-
- self.torsoItem = RobotTorso(self)
- self.headItem = RobotHead(self.torsoItem)
- self.upperLeftArmItem = RobotLimb(self.torsoItem)
- self.lowerLeftArmItem = RobotLimb(self.upperLeftArmItem)
- self.upperRightArmItem = RobotLimb(self.torsoItem)
- self.lowerRightArmItem = RobotLimb(self.upperRightArmItem)
- self.upperRightLegItem = RobotLimb(self.torsoItem)
- self.lowerRightLegItem = RobotLimb(self.upperRightLegItem)
- self.upperLeftLegItem = RobotLimb(self.torsoItem)
- self.lowerLeftLegItem = RobotLimb(self.upperLeftLegItem)
-
- self.timeline = QtCore.QTimeLine()
+ super().__init__()
+
+ self.torsoItem = RobotTorso(self)
+ self.headItem = RobotHead(self.torsoItem)
+ self.upperLeftArmItem = RobotLimb(self.torsoItem)
+ self.lowerLeftArmItem = RobotLimb(self.upperLeftArmItem)
+ self._upper_right_arm_item = RobotLimb(self.torsoItem)
+ self._lower_right_arm_item = RobotLimb(self._upper_right_arm_item)
+ self._upper_right_leg_item = RobotLimb(self.torsoItem)
+ self._lower_right_leg_item = RobotLimb(self._upper_right_leg_item)
+ self.upperLeftLegItem = RobotLimb(self.torsoItem)
+ self.lowerLeftLegItem = RobotLimb(self.upperLeftLegItem)
+
+ self.timeline = QTimeLine()
settings = [
- # item position rotation at
- # x y time 0 / 1
- ( self.headItem, 0, -18, 20, -20 ),
- ( self.upperLeftArmItem, -15, -10, 190, 180 ),
- ( self.lowerLeftArmItem, 30, 0, 50, 10 ),
- ( self.upperRightArmItem, 15, -10, 300, 310 ),
- ( self.lowerRightArmItem, 30, 0, 0, -70 ),
- ( self.upperRightLegItem, 10, 32, 40, 120 ),
- ( self.lowerRightLegItem, 30, 0, 10, 50 ),
- ( self.upperLeftLegItem, -10, 32, 150, 80 ),
- ( self.lowerLeftLegItem, 30, 0, 70, 10 ),
- ( self.torsoItem, 0, 0, 5, -20 )
+ # item position rotation at
+ # x y time 0 / 1
+ (self.headItem, 0, -18, 20, -20), # noqa: E241
+ (self.upperLeftArmItem, -15, -10, 190, 180), # noqa: E241
+ (self.lowerLeftArmItem, 30, 0, 50, 10), # noqa: E241
+ (self._upper_right_arm_item, 15, -10, 300, 310), # noqa: E241
+ (self._lower_right_arm_item, 30, 0, 0, -70), # noqa: E241
+ (self._upper_right_leg_item, 10, 32, 40, 120), # noqa: E241
+ (self._lower_right_leg_item, 30, 0, 10, 50), # noqa: E241
+ (self.upperLeftLegItem, -10, 32, 150, 80), # noqa: E241
+ (self.lowerLeftLegItem, 30, 0, 70, 10), # noqa: E241
+ (self.torsoItem, 0, 0, 5, -20) # noqa: E241
]
self.animations = []
for item, pos_x, pos_y, rotation1, rotation2 in settings:
- item.setPos(pos_x,pos_y)
- animation = QtWidgets.QGraphicsItemAnimation()
+ item.setPos(pos_x, pos_y)
+ animation = QGraphicsItemAnimation()
animation.setItem(item)
animation.setTimeLine(self.timeline)
animation.setRotationAt(0, rotation1)
@@ -242,45 +214,40 @@ class Robot(RobotPart):
self.animations[0].setScaleAt(1, 1.1, 1.1)
self.timeline.setUpdateInterval(1000 / 25)
- self.timeline.setCurveShape(QtCore.QTimeLine.SineCurve)
+ curve = QEasingCurve(QEasingCurve.SineCurve)
+ self.timeline.setEasingCurve(curve)
self.timeline.setLoopCount(0)
self.timeline.setDuration(2000)
self.timeline.start()
def boundingRect(self):
- return QtCore.QRectF()
+ return QRectF()
def paint(self, painter, option, widget=None):
pass
-if __name__== '__main__':
-
- import sys
- import math
-
- app = QtWidgets.QApplication(sys.argv)
-
- QtCore.qsrand(QtCore.QTime(0, 0, 0).secsTo(QtCore.QTime.currentTime()))
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
- scene = QtWidgets.QGraphicsScene(-200, -200, 400, 400)
+ scene = QGraphicsScene(-200, -200, 400, 400)
for i in range(10):
item = ColorItem()
- angle = i*6.28 / 10.0
- item.setPos(math.sin(angle)*150, math.cos(angle)*150)
+ angle = i * 2.0 * math.pi / 10.0
+ item.setPos(math.sin(angle) * 150, math.cos(angle) * 150)
scene.addItem(item)
robot = Robot()
- robot.setTransform(QtGui.QTransform().scale(1.2, 1.2))
+ robot.setTransform(QTransform().scale(1.2, 1.2))
robot.setPos(0, -20)
scene.addItem(robot)
- view = QtWidgets.QGraphicsView(scene)
- view.setRenderHint(QtGui.QPainter.Antialiasing)
- view.setViewportUpdateMode(QtWidgets.QGraphicsView.BoundingRectViewportUpdate)
- view.setBackgroundBrush(QtGui.QColor(230, 200, 167))
+ view = QGraphicsView(scene)
+ view.setRenderHint(QPainter.Antialiasing)
+ view.setViewportUpdateMode(QGraphicsView.BoundingRectViewportUpdate)
+ view.setBackgroundBrush(QColor(230, 200, 167))
view.setWindowTitle("Drag and Drop Robot")
view.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject
index 587484a97..f31851b91 100644
--- a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["dragdroprobot.qrc", "dragdroprobot_rc.py", "dragdroprobot.py"]
+ "files": ["dragdroprobot.qrc", "dragdroprobot.py"]
}
diff --git a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py
index 23d346301..b0e29d413 100644
--- a/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py
+++ b/examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py
@@ -1,9 +1,9 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00:|\
@@ -963,7 +963,7 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
diff --git a/examples/widgets/graphicsview/elasticnodes.py b/examples/widgets/graphicsview/elasticnodes.py
deleted file mode 100644
index 48feffc85..000000000
--- a/examples/widgets/graphicsview/elasticnodes.py
+++ /dev/null
@@ -1,413 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import sys
-import weakref
-import math
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class Edge(QtWidgets.QGraphicsItem):
- Pi = math.pi
- TwoPi = 2.0 * Pi
-
- Type = QtWidgets.QGraphicsItem.UserType + 2
-
- def __init__(self, sourceNode, destNode):
- QtWidgets.QGraphicsItem.__init__(self)
-
- self.arrowSize = 10.0
- self.sourcePoint = QtCore.QPointF()
- self.destPoint = QtCore.QPointF()
- self.setAcceptedMouseButtons(QtCore.Qt.NoButton)
- self.source = weakref.ref(sourceNode)
- self.dest = weakref.ref(destNode)
- self.source().addEdge(self)
- self.dest().addEdge(self)
- self.adjust()
-
- def type(self):
- return Edge.Type
-
- def sourceNode(self):
- return self.source()
-
- def setSourceNode(self, node):
- self.source = weakref.ref(node)
- self.adjust()
-
- def destNode(self):
- return self.dest()
-
- def setDestNode(self, node):
- self.dest = weakref.ref(node)
- self.adjust()
-
- def adjust(self):
- if not self.source() or not self.dest():
- return
-
- line = QtCore.QLineF(self.mapFromItem(self.source(), 0, 0), self.mapFromItem(self.dest(), 0, 0))
- length = line.length()
-
- if length == 0.0:
- return
-
- edgeOffset = QtCore.QPointF((line.dx() * 10) / length, (line.dy() * 10) / length)
-
- self.prepareGeometryChange()
- self.sourcePoint = line.p1() + edgeOffset
- self.destPoint = line.p2() - edgeOffset
-
- def boundingRect(self):
- if not self.source() or not self.dest():
- return QtCore.QRectF()
-
- penWidth = 1
- extra = (penWidth + self.arrowSize) / 2.0
-
- return QtCore.QRectF(self.sourcePoint,
- QtCore.QSizeF(self.destPoint.x() - self.sourcePoint.x(),
- self.destPoint.y() - self.sourcePoint.y())).normalized().adjusted(-extra, -extra, extra, extra)
-
- def paint(self, painter, option, widget):
- if not self.source() or not self.dest():
- return
-
- # Draw the line itself.
- line = QtCore.QLineF(self.sourcePoint, self.destPoint)
-
- if line.length() == 0.0:
- return
-
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 1, QtCore.Qt.SolidLine, QtCore.Qt.RoundCap, QtCore.Qt.RoundJoin))
- painter.drawLine(line)
-
- # Draw the arrows if there's enough room.
- angle = math.acos(line.dx() / line.length())
- if line.dy() >= 0:
- angle = Edge.TwoPi - angle
-
- sourceArrowP1 = self.sourcePoint + QtCore.QPointF(math.sin(angle + Edge.Pi / 3) * self.arrowSize,
- math.cos(angle + Edge.Pi / 3) * self.arrowSize)
- sourceArrowP2 = self.sourcePoint + QtCore.QPointF(math.sin(angle + Edge.Pi - Edge.Pi / 3) * self.arrowSize,
- math.cos(angle + Edge.Pi - Edge.Pi / 3) * self.arrowSize)
- destArrowP1 = self.destPoint + QtCore.QPointF(math.sin(angle - Edge.Pi / 3) * self.arrowSize,
- math.cos(angle - Edge.Pi / 3) * self.arrowSize)
- destArrowP2 = self.destPoint + QtCore.QPointF(math.sin(angle - Edge.Pi + Edge.Pi / 3) * self.arrowSize,
- math.cos(angle - Edge.Pi + Edge.Pi / 3) * self.arrowSize)
-
- painter.setBrush(QtCore.Qt.black)
- painter.drawPolygon(QtGui.QPolygonF([line.p1(), sourceArrowP1, sourceArrowP2]))
- painter.drawPolygon(QtGui.QPolygonF([line.p2(), destArrowP1, destArrowP2]))
-
-
-class Node(QtWidgets.QGraphicsItem):
- Type = QtWidgets.QGraphicsItem.UserType + 1
-
- def __init__(self, graphWidget):
- QtWidgets.QGraphicsItem.__init__(self)
-
- self.graph = weakref.ref(graphWidget)
- self.edgeList = []
- self.newPos = QtCore.QPointF()
- self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable)
- self.setFlag(QtWidgets.QGraphicsItem.ItemSendsGeometryChanges)
- self.setCacheMode(self.DeviceCoordinateCache)
- self.setZValue(-1)
-
- def type(self):
- return Node.Type
-
- def addEdge(self, edge):
- self.edgeList.append(weakref.ref(edge))
- edge.adjust()
-
- def edges(self):
- return self.edgeList
-
- def calculateForces(self):
- if not self.scene() or self.scene().mouseGrabberItem() is self:
- self.newPos = self.pos()
- return
-
- # Sum up all forces pushing this item away.
- xvel = 0.0
- yvel = 0.0
- for item in self.scene().items():
- if not isinstance(item, Node):
- continue
-
- line = QtCore.QLineF(self.mapFromItem(item, 0, 0), QtCore.QPointF(0, 0))
- dx = line.dx()
- dy = line.dy()
- l = 2.0 * (dx * dx + dy * dy)
- if l > 0:
- xvel += (dx * 150.0) / l
- yvel += (dy * 150.0) / l
-
- # Now subtract all forces pulling items together.
- weight = (len(self.edgeList) + 1) * 10.0
- for edge in self.edgeList:
- if edge().sourceNode() is self:
- pos = self.mapFromItem(edge().destNode(), 0, 0)
- else:
- pos = self.mapFromItem(edge().sourceNode(), 0, 0)
- xvel += pos.x() / weight
- yvel += pos.y() / weight
-
- if QtCore.qAbs(xvel) < 0.1 and QtCore.qAbs(yvel) < 0.1:
- xvel = yvel = 0.0
-
- sceneRect = self.scene().sceneRect()
- self.newPos = self.pos() + QtCore.QPointF(xvel, yvel)
- self.newPos.setX(min(max(self.newPos.x(), sceneRect.left() + 10), sceneRect.right() - 10))
- self.newPos.setY(min(max(self.newPos.y(), sceneRect.top() + 10), sceneRect.bottom() - 10))
-
- def advance(self):
- if self.newPos == self.pos():
- return False
-
- self.setPos(self.newPos)
- return True
-
- def boundingRect(self):
- adjust = 2.0
- return QtCore.QRectF(-10 - adjust, -10 - adjust,
- 23 + adjust, 23 + adjust)
-
- def shape(self):
- path = QtGui.QPainterPath()
- path.addEllipse(-10, -10, 20, 20)
- return path
-
- def paint(self, painter, option, widget):
- painter.setPen(QtCore.Qt.NoPen)
- painter.setBrush(QtCore.Qt.darkGray)
- painter.drawEllipse(-7, -7, 20, 20)
-
- gradient = QtGui.QRadialGradient(-3, -3, 10)
- if option.state & QtWidgets.QStyle.State_Sunken:
- gradient.setCenter(3, 3)
- gradient.setFocalPoint(3, 3)
- gradient.setColorAt(1, QtGui.QColor(QtCore.Qt.yellow).lighter(120))
- gradient.setColorAt(0, QtGui.QColor(QtCore.Qt.darkYellow).lighter(120))
- else:
- gradient.setColorAt(0, QtCore.Qt.yellow)
- gradient.setColorAt(1, QtCore.Qt.darkYellow)
-
- painter.setBrush(QtGui.QBrush(gradient))
- painter.setPen(QtGui.QPen(QtCore.Qt.black, 0))
- painter.drawEllipse(-10, -10, 20, 20)
-
- def itemChange(self, change, value):
- if change == QtWidgets.QGraphicsItem.ItemPositionChange:
- for edge in self.edgeList:
- edge().adjust()
- self.graph().itemMoved()
-
- return QtWidgets.QGraphicsItem.itemChange(self, change, value)
-
- def mousePressEvent(self, event):
- self.update()
- QtWidgets.QGraphicsItem.mousePressEvent(self, event)
-
- def mouseReleaseEvent(self, event):
- self.update()
- QtWidgets.QGraphicsItem.mouseReleaseEvent(self, event)
-
-
-class GraphWidget(QtWidgets.QGraphicsView):
- def __init__(self):
- QtWidgets.QGraphicsView.__init__(self)
-
- self.timerId = 0
-
- scene = QtWidgets.QGraphicsScene(self)
- scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex)
- scene.setSceneRect(-200, -200, 400, 400)
- self.setScene(scene)
- self.setCacheMode(QtWidgets.QGraphicsView.CacheBackground)
- self.setRenderHint(QtGui.QPainter.Antialiasing)
- self.setTransformationAnchor(QtWidgets.QGraphicsView.AnchorUnderMouse)
- self.setResizeAnchor(QtWidgets.QGraphicsView.AnchorViewCenter)
-
- node1 = Node(self)
- node2 = Node(self)
- node3 = Node(self)
- node4 = Node(self)
- self.centerNode = Node(self)
- node6 = Node(self)
- node7 = Node(self)
- node8 = Node(self)
- node9 = Node(self)
- scene.addItem(node1)
- scene.addItem(node2)
- scene.addItem(node3)
- scene.addItem(node4)
- scene.addItem(self.centerNode)
- scene.addItem(node6)
- scene.addItem(node7)
- scene.addItem(node8)
- scene.addItem(node9)
- scene.addItem(Edge(node1, node2))
- scene.addItem(Edge(node2, node3))
- scene.addItem(Edge(node2, self.centerNode))
- scene.addItem(Edge(node3, node6))
- scene.addItem(Edge(node4, node1))
- scene.addItem(Edge(node4, self.centerNode))
- scene.addItem(Edge(self.centerNode, node6))
- scene.addItem(Edge(self.centerNode, node8))
- scene.addItem(Edge(node6, node9))
- scene.addItem(Edge(node7, node4))
- scene.addItem(Edge(node8, node7))
- scene.addItem(Edge(node9, node8))
-
- node1.setPos(-50, -50)
- node2.setPos(0, -50)
- node3.setPos(50, -50)
- node4.setPos(-50, 0)
- self.centerNode.setPos(0, 0)
- node6.setPos(50, 0)
- node7.setPos(-50, 50)
- node8.setPos(0, 50)
- node9.setPos(50, 50)
-
- self.scale(0.8, 0.8)
- self.setMinimumSize(400, 400)
- self.setWindowTitle(self.tr("Elastic Nodes"))
-
- def itemMoved(self):
- if not self.timerId:
- self.timerId = self.startTimer(1000 / 25)
-
- def keyPressEvent(self, event):
- key = event.key()
-
- if key == QtCore.Qt.Key_Up:
- self.centerNode.moveBy(0, -20)
- elif key == QtCore.Qt.Key_Down:
- self.centerNode.moveBy(0, 20)
- elif key == QtCore.Qt.Key_Left:
- self.centerNode.moveBy(-20, 0)
- elif key == QtCore.Qt.Key_Right:
- self.centerNode.moveBy(20, 0)
- elif key == QtCore.Qt.Key_Plus:
- self.scaleView(1.2)
- elif key == QtCore.Qt.Key_Minus:
- self.scaleView(1 / 1.2)
- elif key == QtCore.Qt.Key_Space or key == QtCore.Qt.Key_Enter:
- for item in self.scene().items():
- if isinstance(item, Node):
- item.setPos(-150 + QtCore.qrand() % 300, -150 + QtCore.qrand() % 300)
- else:
- QtWidgets.QGraphicsView.keyPressEvent(self, event)
-
-
- def timerEvent(self, event):
- nodes = [item for item in self.scene().items() if isinstance(item, Node)]
-
- for node in nodes:
- node.calculateForces()
-
- itemsMoved = False
- for node in nodes:
- if node.advance():
- itemsMoved = True
-
- if not itemsMoved:
- self.killTimer(self.timerId)
- self.timerId = 0
-
- def wheelEvent(self, event):
- self.scaleView(math.pow(2.0, -event.delta() / 240.0))
-
- def drawBackground(self, painter, rect):
- # Shadow.
- sceneRect = self.sceneRect()
- rightShadow = QtCore.QRectF(sceneRect.right(), sceneRect.top() + 5, 5, sceneRect.height())
- bottomShadow = QtCore.QRectF(sceneRect.left() + 5, sceneRect.bottom(), sceneRect.width(), 5)
- if rightShadow.intersects(rect) or rightShadow.contains(rect):
- painter.fillRect(rightShadow, QtCore.Qt.darkGray)
- if bottomShadow.intersects(rect) or bottomShadow.contains(rect):
- painter.fillRect(bottomShadow, QtCore.Qt.darkGray)
-
- # Fill.
- gradient = QtGui.QLinearGradient(sceneRect.topLeft(), sceneRect.bottomRight())
- gradient.setColorAt(0, QtCore.Qt.white)
- gradient.setColorAt(1, QtCore.Qt.lightGray)
- painter.fillRect(rect.intersected(sceneRect), QtGui.QBrush(gradient))
- painter.setBrush(QtCore.Qt.NoBrush)
- painter.drawRect(sceneRect)
-
- # Text.
- textRect = QtCore.QRectF(sceneRect.left() + 4, sceneRect.top() + 4,
- sceneRect.width() - 4, sceneRect.height() - 4)
- message = self.tr("Click and drag the nodes around, and zoom with the "
- "mouse wheel or the '+' and '-' keys")
-
- font = painter.font()
- font.setBold(True)
- font.setPointSize(14)
- painter.setFont(font)
- painter.setPen(QtCore.Qt.lightGray)
- painter.drawText(textRect.translated(2, 2), message)
- painter.setPen(QtCore.Qt.black)
- painter.drawText(textRect, message)
-
- def scaleView(self, scaleFactor):
- factor = self.matrix().scale(scaleFactor, scaleFactor).mapRect(QtCore.QRectF(0, 0, 1, 1)).width()
-
- if factor < 0.07 or factor > 100:
- return
-
- self.scale(scaleFactor, scaleFactor)
-
-
-if __name__ == "__main__":
- app = QtWidgets.QApplication(sys.argv)
- QtCore.qsrand(QtCore.QTime(0,0,0).secsTo(QtCore.QTime.currentTime()))
-
- widget = GraphWidget()
- widget.show()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/graphicsview/elasticnodes/elasticnodes.py b/examples/widgets/graphicsview/elasticnodes/elasticnodes.py
new file mode 100644
index 000000000..90cb49626
--- /dev/null
+++ b/examples/widgets/graphicsview/elasticnodes/elasticnodes.py
@@ -0,0 +1,391 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+import weakref
+import math
+
+from PySide6.QtCore import (QLineF, QPointF, QRandomGenerator, QRectF, QSizeF,
+ Qt, qAbs)
+from PySide6.QtGui import (QColor, QBrush, QLinearGradient, QPainter, QPainterPath, QPen,
+ QPolygonF, QRadialGradient)
+from PySide6.QtWidgets import (QApplication, QGraphicsItem, QGraphicsScene,
+ QGraphicsView, QStyle)
+
+
+def random(boundary):
+ return QRandomGenerator.global_().bounded(boundary)
+
+
+class Edge(QGraphicsItem):
+
+ def __init__(self, sourceNode, destNode):
+ super().__init__()
+
+ self._arrow_size = 10.0
+ self._source_point = QPointF()
+ self._dest_point = QPointF()
+ self.setAcceptedMouseButtons(Qt.NoButton)
+ self.source = weakref.ref(sourceNode)
+ self.dest = weakref.ref(destNode)
+ self.source().add_edge(self)
+ self.dest().add_edge(self)
+ self.adjust()
+
+ def item_type(self):
+ return QGraphicsItem.UserType + 2
+
+ def source_node(self):
+ return self.source()
+
+ def set_source_node(self, node):
+ self.source = weakref.ref(node)
+ self.adjust()
+
+ def dest_node(self):
+ return self.dest()
+
+ def set_dest_node(self, node):
+ self.dest = weakref.ref(node)
+ self.adjust()
+
+ def adjust(self):
+ if not self.source() or not self.dest():
+ return
+
+ line = QLineF(self.mapFromItem(self.source(), 0, 0),
+ self.mapFromItem(self.dest(), 0, 0))
+ length = line.length()
+
+ if length == 0.0:
+ return
+
+ edge_offset = QPointF((line.dx() * 10) / length, (line.dy() * 10) / length)
+
+ self.prepareGeometryChange()
+ self._source_point = line.p1() + edge_offset
+ self._dest_point = line.p2() - edge_offset
+
+ def boundingRect(self):
+ if not self.source() or not self.dest():
+ return QRectF()
+
+ pen_width = 1
+ extra = (pen_width + self._arrow_size) / 2.0
+
+ width = self._dest_point.x() - self._source_point.x()
+ height = self._dest_point.y() - self._source_point.y()
+ rect = QRectF(self._source_point, QSizeF(width, height))
+ return rect.normalized().adjusted(-extra, -extra, extra, extra)
+
+ def paint(self, painter, option, widget):
+ if not self.source() or not self.dest():
+ return
+
+ # Draw the line itself.
+ line = QLineF(self._source_point, self._dest_point)
+
+ if line.length() == 0.0:
+ return
+
+ painter.setPen(QPen(Qt.black, 1, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
+ painter.drawLine(line)
+
+ # Draw the arrows if there's enough room.
+ angle = math.acos(line.dx() / line.length())
+ if line.dy() >= 0:
+ angle = 2 * math.pi - angle
+
+ arrow_head1 = QPointF(math.sin(angle + math.pi / 3) * self._arrow_size,
+ math.cos(angle + math.pi / 3) * self._arrow_size)
+ source_arrow_p1 = self._source_point + arrow_head1
+ arrow_head2 = QPointF(math.sin(angle + math.pi - math.pi / 3) * self._arrow_size,
+ math.cos(angle + math.pi - math.pi / 3) * self._arrow_size)
+ source_arrow_p2 = self._source_point + arrow_head2
+
+ arrow_head1 = QPointF(math.sin(angle - math.pi / 3) * self._arrow_size,
+ math.cos(angle - math.pi / 3) * self._arrow_size)
+ dest_arrow_p1 = self._dest_point + arrow_head1
+ arrow_head2 = QPointF(math.sin(angle - math.pi + math.pi / 3) * self._arrow_size,
+ math.cos(angle - math.pi + math.pi / 3) * self._arrow_size)
+ dest_arrow_p2 = self._dest_point + arrow_head2
+
+ painter.setBrush(Qt.black)
+ painter.drawPolygon(QPolygonF([line.p1(), source_arrow_p1, source_arrow_p2]))
+ painter.drawPolygon(QPolygonF([line.p2(), dest_arrow_p1, dest_arrow_p2]))
+
+
+class Node(QGraphicsItem):
+
+ def __init__(self, graphWidget):
+ super().__init__()
+
+ self.graph = weakref.ref(graphWidget)
+ self._edge_list = []
+ self._new_pos = QPointF()
+ self.setFlag(QGraphicsItem.ItemIsMovable)
+ self.setFlag(QGraphicsItem.ItemSendsGeometryChanges)
+ self.setCacheMode(QGraphicsItem.DeviceCoordinateCache)
+ self.setZValue(-1)
+
+ def item_type(self):
+ return QGraphicsItem.UserType + 1
+
+ def add_edge(self, edge):
+ self._edge_list.append(weakref.ref(edge))
+ edge.adjust()
+
+ def edges(self):
+ return self._edge_list
+
+ def calculate_forces(self):
+ if not self.scene() or self.scene().mouseGrabberItem() is self:
+ self._new_pos = self.pos()
+ return
+
+ # Sum up all forces pushing this item away.
+ xvel = 0.0
+ yvel = 0.0
+ for item in self.scene().items():
+ if not isinstance(item, Node):
+ continue
+
+ line = QLineF(self.mapFromItem(item, 0, 0), QPointF(0, 0))
+ dx = line.dx()
+ dy = line.dy()
+ l = 2.0 * (dx * dx + dy * dy) # noqa: E741
+ if l > 0:
+ xvel += (dx * 150.0) / l
+ yvel += (dy * 150.0) / l
+
+ # Now subtract all forces pulling items together.
+ weight = (len(self._edge_list) + 1) * 10.0
+ for edge in self._edge_list:
+ if edge().source_node() is self:
+ pos = self.mapFromItem(edge().dest_node(), 0, 0)
+ else:
+ pos = self.mapFromItem(edge().source_node(), 0, 0)
+ xvel += pos.x() / weight
+ yvel += pos.y() / weight
+
+ if qAbs(xvel) < 0.1 and qAbs(yvel) < 0.1:
+ xvel = yvel = 0.0
+
+ scene_rect = self.scene().sceneRect()
+ self._new_pos = self.pos() + QPointF(xvel, yvel)
+ self._new_pos.setX(min(max(self._new_pos.x(), scene_rect.left() + 10),
+ scene_rect.right() - 10))
+ self._new_pos.setY(min(max(self._new_pos.y(), scene_rect.top() + 10),
+ scene_rect.bottom() - 10))
+
+ def advance(self):
+ if self._new_pos == self.pos():
+ return False
+
+ self.setPos(self._new_pos)
+ return True
+
+ def boundingRect(self):
+ adjust = 2.0
+ return QRectF(-10 - adjust, -10 - adjust,
+ 23 + adjust, 23 + adjust)
+
+ def shape(self):
+ path = QPainterPath()
+ path.addEllipse(-10, -10, 20, 20)
+ return path
+
+ def paint(self, painter, option, widget):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.darkGray)
+ painter.drawEllipse(-7, -7, 20, 20)
+
+ gradient = QRadialGradient(-3, -3, 10)
+ if option.state & QStyle.State_Sunken:
+ gradient.setCenter(3, 3)
+ gradient.setFocalPoint(3, 3)
+ gradient.setColorAt(1, QColor(Qt.yellow).lighter(120))
+ gradient.setColorAt(0, QColor(Qt.darkYellow).lighter(120))
+ else:
+ gradient.setColorAt(0, Qt.yellow)
+ gradient.setColorAt(1, Qt.darkYellow)
+
+ painter.setBrush(QBrush(gradient))
+ painter.setPen(QPen(Qt.black, 0))
+ painter.drawEllipse(-10, -10, 20, 20)
+
+ def itemChange(self, change, value):
+ if change == QGraphicsItem.ItemPositionChange:
+ for edge in self._edge_list:
+ edge().adjust()
+ self.graph().item_moved()
+
+ return QGraphicsItem.itemChange(self, change, value)
+
+ def mousePressEvent(self, event):
+ self.update()
+ QGraphicsItem.mousePressEvent(self, event)
+
+ def mouseReleaseEvent(self, event):
+ self.update()
+ QGraphicsItem.mouseReleaseEvent(self, event)
+
+
+class GraphWidget(QGraphicsView):
+ def __init__(self):
+ super().__init__()
+
+ self._timer_id = 0
+
+ scene = QGraphicsScene(self)
+ scene.setItemIndexMethod(QGraphicsScene.NoIndex)
+ scene.setSceneRect(-200, -200, 400, 400)
+ self.setScene(scene)
+ self.setCacheMode(QGraphicsView.CacheBackground)
+ self.setRenderHint(QPainter.Antialiasing)
+ self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
+ self.setResizeAnchor(QGraphicsView.AnchorViewCenter)
+
+ node1 = Node(self)
+ node2 = Node(self)
+ node3 = Node(self)
+ node4 = Node(self)
+ self._center_node = Node(self)
+ node6 = Node(self)
+ node7 = Node(self)
+ node8 = Node(self)
+ node9 = Node(self)
+ scene.addItem(node1)
+ scene.addItem(node2)
+ scene.addItem(node3)
+ scene.addItem(node4)
+ scene.addItem(self._center_node)
+ scene.addItem(node6)
+ scene.addItem(node7)
+ scene.addItem(node8)
+ scene.addItem(node9)
+ scene.addItem(Edge(node1, node2))
+ scene.addItem(Edge(node2, node3))
+ scene.addItem(Edge(node2, self._center_node))
+ scene.addItem(Edge(node3, node6))
+ scene.addItem(Edge(node4, node1))
+ scene.addItem(Edge(node4, self._center_node))
+ scene.addItem(Edge(self._center_node, node6))
+ scene.addItem(Edge(self._center_node, node8))
+ scene.addItem(Edge(node6, node9))
+ scene.addItem(Edge(node7, node4))
+ scene.addItem(Edge(node8, node7))
+ scene.addItem(Edge(node9, node8))
+
+ node1.setPos(-50, -50)
+ node2.setPos(0, -50)
+ node3.setPos(50, -50)
+ node4.setPos(-50, 0)
+ self._center_node.setPos(0, 0)
+ node6.setPos(50, 0)
+ node7.setPos(-50, 50)
+ node8.setPos(0, 50)
+ node9.setPos(50, 50)
+
+ self.scale(0.8, 0.8)
+ self.setMinimumSize(400, 400)
+ self.setWindowTitle(self.tr("Elastic Nodes"))
+
+ def item_moved(self):
+ if not self._timer_id:
+ self._timer_id = self.startTimer(1000 / 25)
+
+ def keyPressEvent(self, event):
+ key = event.key()
+
+ if key == Qt.Key_Up:
+ self._center_node.moveBy(0, -20)
+ elif key == Qt.Key_Down:
+ self._center_node.moveBy(0, 20)
+ elif key == Qt.Key_Left:
+ self._center_node.moveBy(-20, 0)
+ elif key == Qt.Key_Right:
+ self._center_node.moveBy(20, 0)
+ elif key == Qt.Key_Plus:
+ self.scale_view(1.2)
+ elif key == Qt.Key_Minus:
+ self.scale_view(1 / 1.2)
+ elif key == Qt.Key_Space or key == Qt.Key_Enter:
+ for item in self.scene().items():
+ if isinstance(item, Node):
+ item.setPos(-150 + random(300), -150 + random(300))
+ else:
+ QGraphicsView.keyPressEvent(self, event)
+
+ def timerEvent(self, event):
+ nodes = [item for item in self.scene().items() if isinstance(item, Node)]
+
+ for node in nodes:
+ node.calculate_forces()
+
+ items_moved = False
+ for node in nodes:
+ if node.advance():
+ items_moved = True
+
+ if not items_moved:
+ self.killTimer(self._timer_id)
+ self._timer_id = 0
+
+ def wheelEvent(self, event):
+ delta = event.angleDelta().y()
+ self.scale_view(math.pow(2.0, -delta / 240.0))
+
+ def draw_background(self, painter, rect):
+ # Shadow.
+ scene_rect = self.sceneRect()
+ right_shadow = QRectF(scene_rect.right(), scene_rect.top() + 5,
+ 5, scene_rect.height())
+ bottom_shadow = QRectF(scene_rect.left() + 5, scene_rect.bottom(),
+ scene_rect.width(), 5)
+ if right_shadow.intersects(rect) or right_shadow.contains(rect):
+ painter.fillRect(right_shadow, Qt.darkGray)
+ if bottom_shadow.intersects(rect) or bottom_shadow.contains(rect):
+ painter.fillRect(bottom_shadow, Qt.darkGray)
+
+ # Fill.
+ gradient = QLinearGradient(scene_rect.topLeft(), scene_rect.bottomRight())
+ gradient.setColorAt(0, Qt.white)
+ gradient.setColorAt(1, Qt.lightGray)
+ painter.fillRect(rect.intersected(scene_rect), QBrush(gradient))
+ painter.setBrush(Qt.NoBrush)
+ painter.drawRect(scene_rect)
+
+ # Text.
+ text_rect = QRectF(scene_rect.left() + 4, scene_rect.top() + 4,
+ scene_rect.width() - 4, scene_rect.height() - 4)
+ message = self.tr("Click and drag the nodes around, and zoom with the "
+ "mouse wheel or the '+' and '-' keys")
+
+ font = painter.font()
+ font.setBold(True)
+ font.setPointSize(14)
+ painter.setFont(font)
+ painter.setPen(Qt.lightGray)
+ painter.drawText(text_rect.translated(2, 2), message)
+ painter.setPen(Qt.black)
+ painter.drawText(text_rect, message)
+
+ def scale_view(self, scaleFactor):
+ factor = self.transform().scale(scaleFactor, scaleFactor).mapRect(
+ QRectF(0, 0, 1, 1)).width()
+
+ if factor < 0.07 or factor > 100:
+ return
+
+ self.scale(scaleFactor, scaleFactor)
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ widget = GraphWidget()
+ widget.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/graphicsview/elasticnodes/elasticnodes.pyproject b/examples/widgets/graphicsview/elasticnodes/elasticnodes.pyproject
new file mode 100644
index 000000000..f6083e795
--- /dev/null
+++ b/examples/widgets/graphicsview/elasticnodes/elasticnodes.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["elasticnodes.py"]
+}
diff --git a/examples/widgets/graphicsview/graphicsview.pyproject b/examples/widgets/graphicsview/graphicsview.pyproject
deleted file mode 100644
index 007d36bd2..000000000
--- a/examples/widgets/graphicsview/graphicsview.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["elasticnodes.py", "anchorlayout.py"]
-}
diff --git a/examples/widgets/imageviewer/imageviewer.py b/examples/widgets/imageviewer/imageviewer.py
new file mode 100644
index 000000000..93b1e87ba
--- /dev/null
+++ b/examples/widgets/imageviewer/imageviewer.py
@@ -0,0 +1,277 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtPrintSupport import QPrintDialog, QPrinter
+from PySide6.QtWidgets import (QApplication, QDialog, QFileDialog, QLabel,
+ QMainWindow, QMessageBox, QScrollArea,
+ QSizePolicy)
+from PySide6.QtGui import (QColorSpace, QGuiApplication,
+ QImageReader, QImageWriter, QKeySequence,
+ QPalette, QPainter, QPixmap)
+from PySide6.QtCore import QDir, QStandardPaths, Qt, Slot
+
+
+ABOUT = """<p>The <b>Image Viewer</b> example shows how to combine QLabel
+and QScrollArea to display an image. QLabel is typically used
+for displaying a text, but it can also display an image.
+QScrollArea provides a scrolling view around another widget.
+If the child widget exceeds the size of the frame, QScrollArea
+automatically provides scroll bars. </p><p>The example
+demonstrates how QLabel's ability to scale its contents
+(QLabel.scaledContents), and QScrollArea's ability to
+automatically resize its contents
+(QScrollArea.widgetResizable), can be used to implement
+zooming and scaling features. </p><p>In addition the example
+shows how to use QPainter to print an image.</p>
+"""
+
+
+class ImageViewer(QMainWindow):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._scale_factor = 1.0
+ self._first_file_dialog = True
+ self._image_label = QLabel()
+ self._image_label.setBackgroundRole(QPalette.Base)
+ self._image_label.setSizePolicy(QSizePolicy.Ignored,
+ QSizePolicy.Ignored)
+ self._image_label.setScaledContents(True)
+
+ self._scroll_area = QScrollArea()
+ self._scroll_area.setBackgroundRole(QPalette.Dark)
+ self._scroll_area.setWidget(self._image_label)
+ self._scroll_area.setVisible(False)
+ self.setCentralWidget(self._scroll_area)
+
+ self._create_actions()
+
+ self.resize(QGuiApplication.primaryScreen().availableSize() * 3 / 5)
+
+ def load_file(self, fileName):
+ reader = QImageReader(fileName)
+ reader.setAutoTransform(True)
+ new_image = reader.read()
+ native_filename = QDir.toNativeSeparators(fileName)
+ if new_image.isNull():
+ error = reader.errorString()
+ QMessageBox.information(self, QGuiApplication.applicationDisplayName(),
+ f"Cannot load {native_filename}: {error}")
+ return False
+ self._set_image(new_image)
+ self.setWindowFilePath(fileName)
+
+ w = self._image.width()
+ h = self._image.height()
+ d = self._image.depth()
+ color_space = self._image.colorSpace()
+ description = color_space.description() if color_space.isValid() else 'unknown'
+ message = f'Opened "{native_filename}", {w}x{h}, Depth: {d} ({description})'
+ self.statusBar().showMessage(message)
+ return True
+
+ def _set_image(self, new_image):
+ self._image = new_image
+ if self._image.colorSpace().isValid():
+ self._image.convertToColorSpace(QColorSpace.SRgb)
+ self._image_label.setPixmap(QPixmap.fromImage(self._image))
+ self._scale_factor = 1.0
+
+ self._scroll_area.setVisible(True)
+ self._print_act.setEnabled(True)
+ self._fit_to_window_act.setEnabled(True)
+ self._update_actions()
+
+ if not self._fit_to_window_act.isChecked():
+ self._image_label.adjustSize()
+
+ def _save_file(self, fileName):
+ writer = QImageWriter(fileName)
+
+ native_filename = QDir.toNativeSeparators(fileName)
+ if not writer.write(self._image):
+ error = writer.errorString()
+ message = f"Cannot write {native_filename}: {error}"
+ QMessageBox.information(self, QGuiApplication.applicationDisplayName(),
+ message)
+ return False
+ self.statusBar().showMessage(f'Wrote "{native_filename}"')
+ return True
+
+ @Slot()
+ def _open(self):
+ dialog = QFileDialog(self, "Open File")
+ self._initialize_image_filedialog(dialog, QFileDialog.AcceptOpen)
+ while (dialog.exec() == QDialog.Accepted
+ and not self.load_file(dialog.selectedFiles()[0])):
+ pass
+
+ @Slot()
+ def _save_as(self):
+ dialog = QFileDialog(self, "Save File As")
+ self._initialize_image_filedialog(dialog, QFileDialog.AcceptSave)
+ while (dialog.exec() == QDialog.Accepted
+ and not self._save_file(dialog.selectedFiles()[0])):
+ pass
+
+ @Slot()
+ def _print_(self):
+ printer = QPrinter()
+ dialog = QPrintDialog(printer, self)
+ if dialog.exec() == QDialog.Accepted:
+ with QPainter(printer) as painter:
+ pixmap = self._image_label.pixmap()
+ rect = painter.viewport()
+ size = pixmap.size()
+ size.scale(rect.size(), Qt.KeepAspectRatio)
+ painter.setViewport(rect.x(), rect.y(), size.width(), size.height())
+ painter.setWindow(pixmap.rect())
+ painter.drawPixmap(0, 0, pixmap)
+
+ @Slot()
+ def _copy(self):
+ QGuiApplication.clipboard().setImage(self._image)
+
+ @Slot()
+ def _paste(self):
+ new_image = QGuiApplication.clipboard().image()
+ if new_image.isNull():
+ self.statusBar().showMessage("No image in clipboard")
+ else:
+ self._set_image(new_image)
+ self.setWindowFilePath('')
+ w = new_image.width()
+ h = new_image.height()
+ d = new_image.depth()
+ message = f"Obtained image from clipboard, {w}x{h}, Depth: {d}"
+ self.statusBar().showMessage(message)
+
+ @Slot()
+ def _zoom_in(self):
+ self._scale_image(1.25)
+
+ @Slot()
+ def _zoom_out(self):
+ self._scale_image(0.8)
+
+ @Slot()
+ def _normal_size(self):
+ self._image_label.adjustSize()
+ self._scale_factor = 1.0
+
+ @Slot()
+ def _fit_to_window(self):
+ fit_to_window = self._fit_to_window_act.isChecked()
+ self._scroll_area.setWidgetResizable(fit_to_window)
+ if not fit_to_window:
+ self._normal_size()
+ self._update_actions()
+
+ @Slot()
+ def _about(self):
+ QMessageBox.about(self, "About Image Viewer", ABOUT)
+
+ def _create_actions(self):
+ file_menu = self.menuBar().addMenu("&File")
+
+ self._open_act = file_menu.addAction("&Open...")
+ self._open_act.triggered.connect(self._open)
+ self._open_act.setShortcut(QKeySequence.Open)
+
+ self._save_as_act = file_menu.addAction("&Save As...")
+ self._save_as_act.triggered.connect(self._save_as)
+ self._save_as_act.setEnabled(False)
+
+ self._print_act = file_menu.addAction("&Print...")
+ self._print_act.triggered.connect(self._print_)
+ self._print_act.setShortcut(QKeySequence.Print)
+ self._print_act.setEnabled(False)
+
+ file_menu.addSeparator()
+
+ self._exit_act = file_menu.addAction("E&xit")
+ self._exit_act.triggered.connect(self.close)
+ self._exit_act.setShortcut("Ctrl+Q")
+
+ edit_menu = self.menuBar().addMenu("&Edit")
+
+ self._copy_act = edit_menu.addAction("&Copy")
+ self._copy_act.triggered.connect(self._copy)
+ self._copy_act.setShortcut(QKeySequence.Copy)
+ self._copy_act.setEnabled(False)
+
+ self._paste_act = edit_menu.addAction("&Paste")
+ self._paste_act.triggered.connect(self._paste)
+ self._paste_act.setShortcut(QKeySequence.Paste)
+
+ view_menu = self.menuBar().addMenu("&View")
+
+ self._zoom_in_act = view_menu.addAction("Zoom &In (25%)")
+ self._zoom_in_act.setShortcut(QKeySequence.ZoomIn)
+ self._zoom_in_act.triggered.connect(self._zoom_in)
+ self._zoom_in_act.setEnabled(False)
+
+ self._zoom_out_act = view_menu.addAction("Zoom &Out (25%)")
+ self._zoom_out_act.triggered.connect(self._zoom_out)
+ self._zoom_out_act.setShortcut(QKeySequence.ZoomOut)
+ self._zoom_out_act.setEnabled(False)
+
+ self._normal_size_act = view_menu.addAction("&Normal Size")
+ self._normal_size_act.triggered.connect(self._normal_size)
+ self._normal_size_act.setShortcut("Ctrl+S")
+ self._normal_size_act.setEnabled(False)
+
+ view_menu.addSeparator()
+
+ self._fit_to_window_act = view_menu.addAction("&Fit to Window")
+ self._fit_to_window_act.triggered.connect(self._fit_to_window)
+ self._fit_to_window_act.setEnabled(False)
+ self._fit_to_window_act.setCheckable(True)
+ self._fit_to_window_act.setShortcut("Ctrl+F")
+
+ help_menu = self.menuBar().addMenu("&Help")
+
+ about_act = help_menu.addAction("&About")
+ about_act.triggered.connect(self._about)
+ about_qt_act = help_menu.addAction("About &Qt")
+ about_qt_act.triggered.connect(QApplication.aboutQt)
+
+ def _update_actions(self):
+ has_image = not self._image.isNull()
+ self._save_as_act.setEnabled(has_image)
+ self._copy_act.setEnabled(has_image)
+ enable_zoom = not self._fit_to_window_act.isChecked()
+ self._zoom_in_act.setEnabled(enable_zoom)
+ self._zoom_out_act.setEnabled(enable_zoom)
+ self._normal_size_act.setEnabled(enable_zoom)
+
+ def _scale_image(self, factor):
+ self._scale_factor *= factor
+ new_size = self._scale_factor * self._image_label.pixmap().size()
+ self._image_label.resize(new_size)
+
+ self._adjust_scrollbar(self._scroll_area.horizontalScrollBar(), factor)
+ self._adjust_scrollbar(self._scroll_area.verticalScrollBar(), factor)
+
+ self._zoom_in_act.setEnabled(self._scale_factor < 3.0)
+ self._zoom_out_act.setEnabled(self._scale_factor > 0.333)
+
+ def _adjust_scrollbar(self, scrollBar, factor):
+ pos = int(factor * scrollBar.value()
+ + ((factor - 1) * scrollBar.pageStep() / 2))
+ scrollBar.setValue(pos)
+
+ def _initialize_image_filedialog(self, dialog, acceptMode):
+ if self._first_file_dialog:
+ self._first_file_dialog = False
+ locations = QStandardPaths.standardLocations(QStandardPaths.PicturesLocation)
+ directory = locations[-1] if locations else QDir.currentPath()
+ dialog.setDirectory(directory)
+
+ mime_types = [m.data().decode('utf-8') for m in QImageWriter.supportedMimeTypes()]
+ mime_types.sort()
+
+ dialog.setMimeTypeFilters(mime_types)
+ dialog.selectMimeTypeFilter("image/jpeg")
+ dialog.setAcceptMode(acceptMode)
+ if acceptMode == QFileDialog.AcceptSave:
+ dialog.setDefaultSuffix("jpg")
diff --git a/examples/widgets/imageviewer/imageviewer.pyproject b/examples/widgets/imageviewer/imageviewer.pyproject
new file mode 100644
index 000000000..d2db1ffbb
--- /dev/null
+++ b/examples/widgets/imageviewer/imageviewer.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "imageviewer.py"]
+}
diff --git a/examples/widgets/imageviewer/main.py b/examples/widgets/imageviewer/main.py
new file mode 100644
index 000000000..949def62e
--- /dev/null
+++ b/examples/widgets/imageviewer/main.py
@@ -0,0 +1,27 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/imageviewer example from Qt v6.0"""
+
+from argparse import ArgumentParser, RawTextHelpFormatter
+import sys
+
+from PySide6.QtWidgets import (QApplication)
+
+from imageviewer import ImageViewer
+
+
+if __name__ == '__main__':
+ arg_parser = ArgumentParser(description="Image Viewer",
+ formatter_class=RawTextHelpFormatter)
+ arg_parser.add_argument('file', type=str, nargs='?', help='Image file')
+ args = arg_parser.parse_args()
+
+ app = QApplication(sys.argv)
+ image_viewer = ImageViewer()
+
+ if args.file and not image_viewer.load_file(args.file):
+ sys.exit(-1)
+
+ image_viewer.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/address_book/adddialogwidget.py b/examples/widgets/itemviews/address_book/adddialogwidget.py
new file mode 100644
index 000000000..ecb853e80
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/adddialogwidget.py
@@ -0,0 +1,65 @@
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import (QDialog, QLabel, QTextEdit, QLineEdit,
+ QDialogButtonBox, QGridLayout, QVBoxLayout)
+
+
+class AddDialogWidget(QDialog):
+ """ A dialog to add a new address to the addressbook. """
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ name_label = QLabel("Name")
+ address_label = QLabel("Address")
+ button_box = QDialogButtonBox(QDialogButtonBox.Ok
+ | QDialogButtonBox.Cancel)
+
+ self._name_text = QLineEdit()
+ self._address_text = QTextEdit()
+
+ grid = QGridLayout()
+ grid.setColumnStretch(1, 2)
+ grid.addWidget(name_label, 0, 0)
+ grid.addWidget(self._name_text, 0, 1)
+ grid.addWidget(address_label, 1, 0, Qt.AlignLeft | Qt.AlignTop)
+ grid.addWidget(self._address_text, 1, 1, Qt.AlignLeft)
+
+ layout = QVBoxLayout()
+ layout.addLayout(grid)
+ layout.addWidget(button_box)
+
+ self.setLayout(layout)
+
+ self.setWindowTitle("Add a Contact")
+
+ button_box.accepted.connect(self.accept)
+ button_box.rejected.connect(self.reject)
+
+ # These properties make using this dialog a little cleaner. It's much
+ # nicer to type "addDialog.address" to retrieve the address as compared
+ # to "addDialog.addressText.toPlainText()"
+ @property
+ def name(self):
+ return self._name_text.text()
+
+ @property
+ def address(self):
+ return self._address_text.toPlainText()
+
+
+if __name__ == "__main__":
+ import sys
+ from PySide6.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+
+ dialog = AddDialogWidget()
+ if (dialog.exec()):
+ name = dialog.name
+ address = dialog.address
+ print(f"Name: {name}")
+ print(f"Address: {address}")
diff --git a/examples/widgets/itemviews/address_book/address_book.py b/examples/widgets/itemviews/address_book/address_book.py
new file mode 100644
index 000000000..af0cf3dee
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/address_book.py
@@ -0,0 +1,99 @@
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import Slot
+from PySide6.QtGui import QAction
+from PySide6.QtWidgets import (QMainWindow, QFileDialog, QApplication)
+
+from addresswidget import AddressWidget
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._address_widget = AddressWidget()
+ self.setCentralWidget(self._address_widget)
+ self.create_menus()
+ self.setWindowTitle("Address Book")
+
+ def create_menus(self):
+ # Create the main menuBar menu items
+ file_menu = self.menuBar().addMenu("&File")
+ tool_menu = self.menuBar().addMenu("&Tools")
+
+ # Populate the File menu
+ self.open_action = self.create_action("&Open...", file_menu, self.open_file)
+ self.save_action = self.create_action("&Save As...", file_menu, self.save_file)
+ file_menu.addSeparator()
+ self.exit_action = self.create_action("E&xit", file_menu, self.close)
+
+ # Populate the Tools menu
+ self.add_action = self.create_action(
+ "&Add Entry...", tool_menu, self._address_widget.add_entry)
+ self._edit_action = self.create_action(
+ "&Edit Entry...", tool_menu, self._address_widget.edit_entry)
+ tool_menu.addSeparator()
+ self._remove_action = self.create_action(
+ "&Remove Entry", tool_menu, self._address_widget.remove_entry)
+
+ # Disable the edit and remove menu items initially, as there are
+ # no items yet.
+ self._edit_action.setEnabled(False)
+ self._remove_action.setEnabled(False)
+
+ # Wire up the updateActions slot
+ self._address_widget.selection_changed.connect(self.update_actions)
+
+ def create_action(self, text, menu, slot):
+ """ Helper function to save typing when populating menus
+ with action.
+ """
+ action = QAction(text, self)
+ menu.addAction(action)
+ action.triggered.connect(slot)
+ return action
+
+ # Quick gotcha:
+ #
+ # QFiledialog.getOpenFilename and QFileDialog.get.SaveFileName don't
+ # behave in PySide6 as they do in Qt, where they return a QString
+ # containing the filename.
+ #
+ # In PySide6, these functions return a tuple: (filename, filter)
+
+ @Slot()
+ def open_file(self):
+ filename, _ = QFileDialog.getOpenFileName(self)
+ if filename:
+ self._address_widget.read_from_file(filename)
+
+ @Slot()
+ def save_file(self):
+ filename, _ = QFileDialog.getSaveFileName(self)
+ if filename:
+ self._address_widget.write_to_file(filename)
+
+ def update_actions(self, selection):
+ """ Only allow the user to remove or edit an item if an item
+ is actually selected.
+ """
+ indexes = selection.indexes()
+
+ if len(indexes) > 0:
+ self._remove_action.setEnabled(True)
+ self._edit_action.setEnabled(True)
+ else:
+ self._remove_action.setEnabled(False)
+ self._edit_action.setEnabled(False)
+
+
+if __name__ == "__main__":
+ """ Run the application. """
+ import sys
+ app = QApplication(sys.argv)
+ mw = MainWindow()
+ mw.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/address_book/address_book.pyproject b/examples/widgets/itemviews/address_book/address_book.pyproject
new file mode 100644
index 000000000..1b5dd597c
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/address_book.pyproject
@@ -0,0 +1,4 @@
+{
+ "files": ["tablemodel.py", "address_book.py", "adddialogwidget.py",
+ "addresswidget.py", "newaddresstab.py"]
+}
diff --git a/examples/widgets/itemviews/address_book/addresswidget.py b/examples/widgets/itemviews/address_book/addresswidget.py
new file mode 100644
index 000000000..cb2f46ea1
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/addresswidget.py
@@ -0,0 +1,215 @@
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+try:
+ import cpickle as pickle
+except ImportError:
+ import pickle
+
+from PySide6.QtCore import (Qt, Signal, Slot, QRegularExpression, QModelIndex,
+ QItemSelection, QSortFilterProxyModel)
+from PySide6.QtWidgets import QTabWidget, QMessageBox, QTableView, QAbstractItemView
+
+from tablemodel import TableModel
+from newaddresstab import NewAddressTab
+from adddialogwidget import AddDialogWidget
+
+
+class AddressWidget(QTabWidget):
+ """ The central widget of the application. Most of the addressbook's
+ functionality is contained in this class.
+ """
+
+ selection_changed = Signal(QItemSelection)
+
+ def __init__(self, parent=None):
+ """ Initialize the AddressWidget. """
+ super().__init__(parent)
+
+ self._table_model = TableModel()
+ self._new_address_tab = NewAddressTab()
+ self._new_address_tab.send_details.connect(self.add_entry)
+
+ self.addTab(self._new_address_tab, "Address Book")
+
+ self.setup_tabs()
+
+ @Slot()
+ def add_entry(self, name=None, address=None):
+ """ Add an entry to the addressbook. """
+ if name is None and address is None:
+ add_dialog = AddDialogWidget()
+
+ if add_dialog.exec():
+ name = add_dialog.name
+ address = add_dialog.address
+
+ address = {"name": name, "address": address}
+ addresses = self._table_model.addresses[:]
+
+ # The QT docs for this example state that what we're doing here
+ # is checking if the entered name already exists. What they
+ # (and we here) are actually doing is checking if the whole
+ # name/address pair exists already - ok for the purposes of this
+ # example, but obviously not how a real addressbook application
+ # should behave.
+ try:
+ addresses.remove(address)
+ QMessageBox.information(self, "Duplicate Name",
+ f'The name "{name}" already exists.')
+ except ValueError:
+ # The address didn't already exist, so let's add it to the model.
+
+ # Step 1: create the row
+ self._table_model.insertRows(0)
+
+ # Step 2: get the index of the newly created row and use it.
+ # to set the name
+ ix = self._table_model.index(0, 0, QModelIndex())
+ self._table_model.setData(ix, address["name"], Qt.EditRole)
+
+ # Step 3: lather, rinse, repeat for the address.
+ ix = self._table_model.index(0, 1, QModelIndex())
+ self._table_model.setData(ix, address["address"], Qt.EditRole)
+
+ # Remove the newAddressTab, as we now have at least one
+ # address in the model.
+ self.removeTab(self.indexOf(self._new_address_tab))
+
+ # The screenshot for the QT example shows nicely formatted
+ # multiline cells, but the actual application doesn't behave
+ # quite so nicely, at least on Ubuntu. Here we resize the newly
+ # created row so that multiline addresses look reasonable.
+ table_view = self.currentWidget()
+ table_view.resizeRowToContents(ix.row())
+
+ @Slot()
+ def edit_entry(self):
+ """ Edit an entry in the addressbook. """
+ table_view = self.currentWidget()
+ proxy_model = table_view.model()
+ selection_model = table_view.selectionModel()
+
+ # Get the name and address of the currently selected row.
+ indexes = selection_model.selectedRows()
+ if len(indexes) != 1:
+ return
+
+ row = proxy_model.mapToSource(indexes[0]).row()
+ ix = self._table_model.index(row, 0, QModelIndex())
+ name = self._table_model.data(ix, Qt.DisplayRole)
+ ix = self._table_model.index(row, 1, QModelIndex())
+ address = self._table_model.data(ix, Qt.DisplayRole)
+
+ # Open an addDialogWidget, and only allow the user to edit the address.
+ add_dialog = AddDialogWidget()
+ add_dialog.setWindowTitle("Edit a Contact")
+
+ add_dialog._name_text.setReadOnly(True)
+ add_dialog._name_text.setText(name)
+ add_dialog._address_text.setText(address)
+
+ # If the address is different, add it to the model.
+ if add_dialog.exec():
+ new_address = add_dialog.address
+ if new_address != address:
+ ix = self._table_model.index(row, 1, QModelIndex())
+ self._table_model.setData(ix, new_address, Qt.EditRole)
+
+ @Slot()
+ def remove_entry(self):
+ """ Remove an entry from the addressbook. """
+ table_view = self.currentWidget()
+ proxy_model = table_view.model()
+ selection_model = table_view.selectionModel()
+
+ # Just like editEntry, but this time remove the selected row.
+ indexes = selection_model.selectedRows()
+
+ for index in indexes:
+ row = proxy_model.mapToSource(index).row()
+ self._table_model.removeRows(row)
+
+ # If we've removed the last address in the model, display the
+ # newAddressTab
+ if self._table_model.rowCount() == 0:
+ self.insertTab(0, self._new_address_tab, "Address Book")
+
+ def setup_tabs(self):
+ """ Setup the various tabs in the AddressWidget. """
+ groups = ["ABC", "DEF", "GHI", "JKL", "MNO", "PQR", "STU", "VW", "XYZ"]
+
+ for group in groups:
+ proxy_model = QSortFilterProxyModel(self)
+ proxy_model.setSourceModel(self._table_model)
+ proxy_model.setDynamicSortFilter(True)
+
+ table_view = QTableView()
+ table_view.setModel(proxy_model)
+ table_view.setSortingEnabled(True)
+ table_view.setSelectionBehavior(QAbstractItemView.SelectRows)
+ table_view.horizontalHeader().setStretchLastSection(True)
+ table_view.verticalHeader().hide()
+ table_view.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ table_view.setSelectionMode(QAbstractItemView.SingleSelection)
+
+ # This here be the magic: we use the group name (e.g. "ABC") to
+ # build the regex for the QSortFilterProxyModel for the group's
+ # tab. The regex will end up looking like "^[ABC].*", only
+ # allowing this tab to display items where the name starts with
+ # "A", "B", or "C". Notice that we set it to be case-insensitive.
+ re = QRegularExpression(f"^[{group}].*")
+ assert re.isValid()
+ re.setPatternOptions(QRegularExpression.CaseInsensitiveOption)
+ proxy_model.setFilterRegularExpression(re)
+ proxy_model.setFilterKeyColumn(0) # Filter on the "name" column
+ proxy_model.sort(0, Qt.AscendingOrder)
+
+ # This prevents an application crash (see:
+ # https://www.qtcentre.org/threads/58874-QListView-SelectionModel-selectionChanged-Crash) # noqa: E501
+ self.viewselectionmodel = table_view.selectionModel()
+ table_view.selectionModel().selectionChanged.connect(self.selection_changed)
+
+ self.addTab(table_view, group)
+
+ # Note: the QT example uses a QDataStream for the saving and loading.
+ # Here we're using a python dictionary to store the addresses, which
+ # can't be streamed using QDataStream, so we just use cpickle for this
+ # example.
+ def read_from_file(self, filename):
+ """ Read contacts in from a file. """
+ try:
+ f = open(filename, "rb")
+ addresses = pickle.load(f)
+ except IOError:
+ QMessageBox.information(self, f"Unable to open file: {filename}")
+ finally:
+ f.close()
+
+ if len(addresses) == 0:
+ QMessageBox.information(self, f"No contacts in file: {filename}")
+ else:
+ for address in addresses:
+ self.add_entry(address["name"], address["address"])
+
+ def write_to_file(self, filename):
+ """ Save all contacts in the model to a file. """
+ try:
+ f = open(filename, "wb")
+ pickle.dump(self._table_model.addresses, f)
+
+ except IOError:
+ QMessageBox.information(self, f"Unable to open file: {filename}")
+ finally:
+ f.close()
+
+
+if __name__ == "__main__":
+ import sys
+ from PySide6.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+ address_widget = AddressWidget()
+ address_widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/address_book/doc/address_book.png b/examples/widgets/itemviews/address_book/doc/address_book.png
new file mode 100644
index 000000000..40f2d9e63
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/doc/address_book.png
Binary files differ
diff --git a/examples/widgets/itemviews/address_book/doc/address_book.rst b/examples/widgets/itemviews/address_book/doc/address_book.rst
new file mode 100644
index 000000000..04b91054e
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/doc/address_book.rst
@@ -0,0 +1,9 @@
+Address Book Example
+====================
+
+The address book example shows how to use proxy models to display different
+views onto data from a single model.
+
+.. image:: address_book.png
+ :width: 400
+ :alt: Address Book Screenshot
diff --git a/examples/widgets/itemviews/address_book/newaddresstab.py b/examples/widgets/itemviews/address_book/newaddresstab.py
new file mode 100644
index 000000000..d3d037ad4
--- /dev/null
+++ b/examples/widgets/itemviews/address_book/newaddresstab.py
@@ -0,0 +1,56 @@
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import (Qt, Signal)
+from PySide6.QtWidgets import (QWidget, QLabel, QPushButton, QVBoxLayout)
+
+from adddialogwidget import AddDialogWidget
+
+
+class NewAddressTab(QWidget):
+ """ An extra tab that prompts the user to add new contacts.
+ To be displayed only when there are no contacts in the model.
+ """
+
+ send_details = Signal(str, str)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ description_label = QLabel("There are no contacts in your address book."
+ "\nClick Add to add new contacts.")
+
+ add_button = QPushButton("Add")
+
+ layout = QVBoxLayout()
+ layout.addWidget(description_label)
+ layout.addWidget(add_button, 0, Qt.AlignCenter)
+
+ self.setLayout(layout)
+
+ add_button.clicked.connect(self.add_entry)
+
+ def add_entry(self):
+ add_dialog = AddDialogWidget()
+
+ if add_dialog.exec():
+ name = add_dialog.name
+ address = add_dialog.address
+ self.send_details.emit(name, address)
+
+
+if __name__ == "__main__":
+
+ def print_address(name, address):
+ print(f"Name: {name}")
+ print(f"Address: {address}")
+
+ import sys
+ from PySide6.QtWidgets import QApplication
+
+ app = QApplication(sys.argv)
+ new_address_tab = NewAddressTab()
+ new_address_tab.send_details.connect(print_address)
+ new_address_tab.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/addressbook/tablemodel.py b/examples/widgets/itemviews/address_book/tablemodel.py
index 155f09131..3c1dbd4cc 100644
--- a/examples/widgets/itemviews/addressbook/tablemodel.py
+++ b/examples/widgets/itemviews/address_book/tablemodel.py
@@ -1,51 +1,14 @@
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import (Qt, QAbstractTableModel, QModelIndex)
-#############################################################################
-##
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtCore import (Qt, QAbstractTableModel, QModelIndex)
class TableModel(QAbstractTableModel):
def __init__(self, addresses=None, parent=None):
- super(TableModel, self).__init__(parent)
+ super().__init__(parent)
if addresses is None:
self.addresses = []
@@ -100,7 +63,7 @@ class TableModel(QAbstractTableModel):
self.beginInsertRows(QModelIndex(), position, position + rows - 1)
for row in range(rows):
- self.addresses.insert(position + row, {"name":"", "address":""})
+ self.addresses.insert(position + row, {"name": "", "address": ""})
self.endInsertRows()
return True
@@ -109,7 +72,7 @@ class TableModel(QAbstractTableModel):
""" Remove a row from the model. """
self.beginRemoveRows(QModelIndex(), position, position + rows - 1)
- del self.addresses[position:position+rows]
+ del self.addresses[position:position + rows]
self.endRemoveRows()
return True
@@ -142,5 +105,5 @@ class TableModel(QAbstractTableModel):
"""
if not index.isValid():
return Qt.ItemIsEnabled
- return Qt.ItemFlags(QAbstractTableModel.flags(self, index) |
- Qt.ItemIsEditable)
+ return Qt.ItemFlags(QAbstractTableModel.flags(self, index)
+ | Qt.ItemIsEditable)
diff --git a/examples/widgets/itemviews/addressbook/adddialogwidget.py b/examples/widgets/itemviews/addressbook/adddialogwidget.py
deleted file mode 100644
index 7991039ef..000000000
--- a/examples/widgets/itemviews/addressbook/adddialogwidget.py
+++ /dev/null
@@ -1,102 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtCore import Qt
-from PySide2.QtWidgets import (QDialog, QLabel, QTextEdit, QLineEdit,
- QDialogButtonBox, QGridLayout, QVBoxLayout)
-
-class AddDialogWidget(QDialog):
- """ A dialog to add a new address to the addressbook. """
-
- def __init__(self, parent=None):
- super(AddDialogWidget, self).__init__(parent)
-
- nameLabel = QLabel("Name")
- addressLabel = QLabel("Address")
- buttonBox = QDialogButtonBox(QDialogButtonBox.Ok |
- QDialogButtonBox.Cancel)
-
- self.nameText = QLineEdit()
- self.addressText = QTextEdit()
-
- grid = QGridLayout()
- grid.setColumnStretch(1, 2)
- grid.addWidget(nameLabel, 0, 0)
- grid.addWidget(self.nameText, 0, 1)
- grid.addWidget(addressLabel, 1, 0, Qt.AlignLeft | Qt.AlignTop)
- grid.addWidget(self.addressText, 1, 1, Qt.AlignLeft)
-
- layout = QVBoxLayout()
- layout.addLayout(grid)
- layout.addWidget(buttonBox)
-
- self.setLayout(layout)
-
- self.setWindowTitle("Add a Contact")
-
- buttonBox.accepted.connect(self.accept)
- buttonBox.rejected.connect(self.reject)
-
- # These properties make using this dialog a little cleaner. It's much
- # nicer to type "addDialog.address" to retrieve the address as compared
- # to "addDialog.addressText.toPlainText()"
- @property
- def name(self):
- return self.nameText.text()
-
- @property
- def address(self):
- return self.addressText.toPlainText()
-
-
-if __name__ == "__main__":
- import sys
- from PySide2.QtWidgets import QApplication
-
- app = QApplication(sys.argv)
-
- dialog = AddDialogWidget()
- if (dialog.exec_()):
- name = dialog.name
- address = dialog.address
- print("Name:" + name)
- print("Address:" + address)
diff --git a/examples/widgets/itemviews/addressbook/addressbook.py b/examples/widgets/itemviews/addressbook/addressbook.py
deleted file mode 100644
index 262027a64..000000000
--- a/examples/widgets/itemviews/addressbook/addressbook.py
+++ /dev/null
@@ -1,130 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import (QMainWindow, QAction, QFileDialog, QApplication)
-
-from addresswidget import AddressWidget
-
-
-class MainWindow(QMainWindow):
-
- def __init__(self, parent=None):
- super(MainWindow, self).__init__(parent)
-
- self.addressWidget = AddressWidget()
- self.setCentralWidget(self.addressWidget)
- self.createMenus()
- self.setWindowTitle("Address Book")
-
- def createMenus(self):
- # Create the main menuBar menu items
- fileMenu = self.menuBar().addMenu("&File")
- toolMenu = self.menuBar().addMenu("&Tools")
-
- # Populate the File menu
- openAction = self.createAction("&Open...", fileMenu, self.openFile)
- saveAction = self.createAction("&Save As...", fileMenu, self.saveFile)
- fileMenu.addSeparator()
- exitAction = self.createAction("E&xit", fileMenu, self.close)
-
- # Populate the Tools menu
- addAction = self.createAction("&Add Entry...", toolMenu, self.addressWidget.addEntry)
- self.editAction = self.createAction("&Edit Entry...", toolMenu, self.addressWidget.editEntry)
- toolMenu.addSeparator()
- self.removeAction = self.createAction("&Remove Entry", toolMenu, self.addressWidget.removeEntry)
-
- # Disable the edit and remove menu items initially, as there are
- # no items yet.
- self.editAction.setEnabled(False)
- self.removeAction.setEnabled(False)
-
- # Wire up the updateActions slot
- self.addressWidget.selectionChanged.connect(self.updateActions)
-
- def createAction(self, text, menu, slot):
- """ Helper function to save typing when populating menus
- with action.
- """
- action = QAction(text, self)
- menu.addAction(action)
- action.triggered.connect(slot)
- return action
-
- # Quick gotcha:
- #
- # QFiledialog.getOpenFilename and QFileDialog.get.SaveFileName don't
- # behave in PySide2 as they do in Qt, where they return a QString
- # containing the filename.
- #
- # In PySide2, these functions return a tuple: (filename, filter)
-
- def openFile(self):
- filename, _ = QFileDialog.getOpenFileName(self)
- if filename:
- self.addressWidget.readFromFile(filename)
-
- def saveFile(self):
- filename, _ = QFileDialog.getSaveFileName(self)
- if filename:
- self.addressWidget.writeToFile(filename)
-
- def updateActions(self, selection):
- """ Only allow the user to remove or edit an item if an item
- is actually selected.
- """
- indexes = selection.indexes()
-
- if len(indexes) > 0:
- self.removeAction.setEnabled(True)
- self.editAction.setEnabled(True)
- else:
- self.removeAction.setEnabled(False)
- self.editAction.setEnabled(False)
-
-
-if __name__ == "__main__":
- """ Run the application. """
- import sys
- app = QApplication(sys.argv)
- mw = MainWindow()
- mw.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/addressbook.pyproject b/examples/widgets/itemviews/addressbook/addressbook.pyproject
deleted file mode 100644
index 2aa763753..000000000
--- a/examples/widgets/itemviews/addressbook/addressbook.pyproject
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "files": ["tablemodel.py", "addressbook.py", "adddialogwidget.py",
- "addresswidget.py", "newaddresstab.py"]
-}
diff --git a/examples/widgets/itemviews/addressbook/addresswidget.py b/examples/widgets/itemviews/addressbook/addresswidget.py
deleted file mode 100644
index b70b44b0a..000000000
--- a/examples/widgets/itemviews/addressbook/addresswidget.py
+++ /dev/null
@@ -1,247 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-try:
- import cpickle as pickle
-except ImportError:
- import pickle
-
-from PySide2.QtCore import (Qt, Signal, QRegExp, QModelIndex,
- QItemSelection, QSortFilterProxyModel)
-from PySide2.QtWidgets import QTabWidget, QMessageBox, QTableView, QAbstractItemView
-
-from tablemodel import TableModel
-from newaddresstab import NewAddressTab
-from adddialogwidget import AddDialogWidget
-
-
-class AddressWidget(QTabWidget):
- """ The central widget of the application. Most of the addressbook's
- functionality is contained in this class.
- """
-
- selectionChanged = Signal(QItemSelection)
-
- def __init__(self, parent=None):
- """ Initialize the AddressWidget. """
- super(AddressWidget, self).__init__(parent)
-
- self.tableModel = TableModel()
- self.newAddressTab = NewAddressTab()
- self.newAddressTab.sendDetails.connect(self.addEntry)
-
- self.addTab(self.newAddressTab, "Address Book")
-
- self.setupTabs()
-
- def addEntry(self, name=None, address=None):
- """ Add an entry to the addressbook. """
- if name is None and address is None:
- addDialog = AddDialogWidget()
-
- if addDialog.exec_():
- name = addDialog.name
- address = addDialog.address
-
- address = {"name": name, "address": address}
- addresses = self.tableModel.addresses[:]
-
- # The QT docs for this example state that what we're doing here
- # is checking if the entered name already exists. What they
- # (and we here) are actually doing is checking if the whole
- # name/address pair exists already - ok for the purposes of this
- # example, but obviously not how a real addressbook application
- # should behave.
- try:
- addresses.remove(address)
- QMessageBox.information(self, "Duplicate Name",
- "The name \"%s\" already exists." % name)
- except ValueError:
- # The address didn't already exist, so let's add it to the model.
-
- # Step 1: create the row
- self.tableModel.insertRows(0)
-
- # Step 2: get the index of the newly created row and use it.
- # to set the name
- ix = self.tableModel.index(0, 0, QModelIndex())
- self.tableModel.setData(ix, address["name"], Qt.EditRole)
-
- # Step 3: lather, rinse, repeat for the address.
- ix = self.tableModel.index(0, 1, QModelIndex())
- self.tableModel.setData(ix, address["address"], Qt.EditRole)
-
- # Remove the newAddressTab, as we now have at least one
- # address in the model.
- self.removeTab(self.indexOf(self.newAddressTab))
-
- # The screenshot for the QT example shows nicely formatted
- # multiline cells, but the actual application doesn't behave
- # quite so nicely, at least on Ubuntu. Here we resize the newly
- # created row so that multiline addresses look reasonable.
- tableView = self.currentWidget()
- tableView.resizeRowToContents(ix.row())
-
- def editEntry(self):
- """ Edit an entry in the addressbook. """
- tableView = self.currentWidget()
- proxyModel = tableView.model()
- selectionModel = tableView.selectionModel()
-
- # Get the name and address of the currently selected row.
- indexes = selectionModel.selectedRows()
-
- for index in indexes:
- row = proxyModel.mapToSource(index).row()
- ix = self.tableModel.index(row, 0, QModelIndex())
- name = self.tableModel.data(ix, Qt.DisplayRole)
- ix = self.tableModel.index(row, 1, QModelIndex())
- address = self.tableModel.data(ix, Qt.DisplayRole)
-
- # Open an addDialogWidget, and only allow the user to edit the address.
- addDialog = AddDialogWidget()
- addDialog.setWindowTitle("Edit a Contact")
-
- addDialog.nameText.setReadOnly(True)
- addDialog.nameText.setText(name)
- addDialog.addressText.setText(address)
-
- # If the address is different, add it to the model.
- if addDialog.exec_():
- newAddress = addDialog.address
- if newAddress != address:
- ix = self.tableModel.index(row, 1, QModelIndex())
- self.tableModel.setData(ix, newAddress, Qt.EditRole)
-
- def removeEntry(self):
- """ Remove an entry from the addressbook. """
- tableView = self.currentWidget()
- proxyModel = tableView.model()
- selectionModel = tableView.selectionModel()
-
- # Just like editEntry, but this time remove the selected row.
- indexes = selectionModel.selectedRows()
-
- for index in indexes:
- row = proxyModel.mapToSource(index).row()
- self.tableModel.removeRows(row)
-
- # If we've removed the last address in the model, display the
- # newAddressTab
- if self.tableModel.rowCount() == 0:
- self.insertTab(0, self.newAddressTab, "Address Book")
-
- def setupTabs(self):
- """ Setup the various tabs in the AddressWidget. """
- groups = ["ABC", "DEF", "GHI", "JKL", "MNO", "PQR", "STU", "VW", "XYZ"]
-
- for group in groups:
- proxyModel = QSortFilterProxyModel(self)
- proxyModel.setSourceModel(self.tableModel)
- proxyModel.setDynamicSortFilter(True)
-
- tableView = QTableView()
- tableView.setModel(proxyModel)
- tableView.setSortingEnabled(True)
- tableView.setSelectionBehavior(QAbstractItemView.SelectRows)
- tableView.horizontalHeader().setStretchLastSection(True)
- tableView.verticalHeader().hide()
- tableView.setEditTriggers(QAbstractItemView.NoEditTriggers)
- tableView.setSelectionMode(QAbstractItemView.SingleSelection)
-
- # This here be the magic: we use the group name (e.g. "ABC") to
- # build the regex for the QSortFilterProxyModel for the group's
- # tab. The regex will end up looking like "^[ABC].*", only
- # allowing this tab to display items where the name starts with
- # "A", "B", or "C". Notice that we set it to be case-insensitive.
- reFilter = "^[%s].*" % group
-
- proxyModel.setFilterRegExp(QRegExp(reFilter, Qt.CaseInsensitive))
- proxyModel.setFilterKeyColumn(0) # Filter on the "name" column
- proxyModel.sort(0, Qt.AscendingOrder)
-
- # This prevents an application crash (see: http://www.qtcentre.org/threads/58874-QListView-SelectionModel-selectionChanged-Crash)
- viewselectionmodel = tableView.selectionModel()
- tableView.selectionModel().selectionChanged.connect(self.selectionChanged)
-
- self.addTab(tableView, group)
-
- # Note: the QT example uses a QDataStream for the saving and loading.
- # Here we're using a python dictionary to store the addresses, which
- # can't be streamed using QDataStream, so we just use cpickle for this
- # example.
- def readFromFile(self, filename):
- """ Read contacts in from a file. """
- try:
- f = open(filename, "rb")
- addresses = pickle.load(f)
- except IOError:
- QMessageBox.information(self, "Unable to open file: %s" % filename)
- finally:
- f.close()
-
- if len(addresses) == 0:
- QMessageBox.information(self, "No contacts in file: %s" % filename)
- else:
- for address in addresses:
- self.addEntry(address["name"], address["address"])
-
- def writeToFile(self, filename):
- """ Save all contacts in the model to a file. """
- try:
- f = open(filename, "wb")
- pickle.dump(self.tableModel.addresses, f)
-
- except IOError:
- QMessageBox.information(self, "Unable to open file: %s" % filename)
- finally:
- f.close()
-
-
-if __name__ == "__main__":
- import sys
- from PySide2.QtWidgets import QApplication
-
- app = QApplication(sys.argv)
- addressWidget = AddressWidget()
- addressWidget.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/addressbook/newaddresstab.py b/examples/widgets/itemviews/addressbook/newaddresstab.py
deleted file mode 100644
index ab54fb8a7..000000000
--- a/examples/widgets/itemviews/addressbook/newaddresstab.py
+++ /dev/null
@@ -1,93 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtCore import (Qt, Signal)
-from PySide2.QtWidgets import (QWidget, QLabel, QPushButton, QVBoxLayout)
-
-from adddialogwidget import AddDialogWidget
-
-class NewAddressTab(QWidget):
- """ An extra tab that prompts the user to add new contacts.
- To be displayed only when there are no contacts in the model.
- """
-
- sendDetails = Signal(str, str)
-
- def __init__(self, parent=None):
- super(NewAddressTab, self).__init__(parent)
-
- descriptionLabel = QLabel("There are no contacts in your address book."
- "\nClick Add to add new contacts.")
-
- addButton = QPushButton("Add")
-
- layout = QVBoxLayout()
- layout.addWidget(descriptionLabel)
- layout.addWidget(addButton, 0, Qt.AlignCenter)
-
- self.setLayout(layout)
-
- addButton.clicked.connect(self.addEntry)
-
- def addEntry(self):
- addDialog = AddDialogWidget()
-
- if addDialog.exec_():
- name = addDialog.name
- address = addDialog.address
- self.sendDetails.emit(name, address)
-
-
-if __name__ == "__main__":
-
- def printAddress(name, address):
- print("Name:" + name)
- print("Address:" + address)
-
- import sys
- from PySide2.QtWidgets import QApplication
-
- app = QApplication(sys.argv)
- newAddressTab = NewAddressTab()
- newAddressTab.sendDetails.connect(printAddress)
- newAddressTab.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py
new file mode 100644
index 000000000..a30b0abdf
--- /dev/null
+++ b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.py
@@ -0,0 +1,178 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from PySide6.QtCore import (QDate, QDateTime, QRegularExpression,
+ QSortFilterProxyModel, QTime, Qt, Slot)
+from PySide6.QtGui import QStandardItemModel
+from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout,
+ QGroupBox, QHBoxLayout, QLabel, QLineEdit,
+ QTreeView, QVBoxLayout, QWidget)
+
+
+REGULAR_EXPRESSION = 0
+WILDCARD = 1
+FIXED_STRING = 2
+
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ self._proxy_model = QSortFilterProxyModel()
+ self._proxy_model.setDynamicSortFilter(True)
+
+ self._source_group_box = QGroupBox("Original Model")
+ self._proxy_group_box = QGroupBox("Sorted/Filtered Model")
+
+ self._source_view = QTreeView()
+ self._source_view.setRootIsDecorated(False)
+ self._source_view.setAlternatingRowColors(True)
+
+ self._proxy_view = QTreeView()
+ self._proxy_view.setRootIsDecorated(False)
+ self._proxy_view.setAlternatingRowColors(True)
+ self._proxy_view.setModel(self._proxy_model)
+ self._proxy_view.setSortingEnabled(True)
+
+ self._sort_case_sensitivity_check_box = QCheckBox("Case sensitive sorting")
+ self._filter_case_sensitivity_check_box = QCheckBox("Case sensitive filter")
+
+ self._filter_pattern_line_edit = QLineEdit()
+ self._filter_pattern_line_edit.setClearButtonEnabled(True)
+ self._filter_pattern_label = QLabel("&Filter pattern:")
+ self._filter_pattern_label.setBuddy(self._filter_pattern_line_edit)
+
+ self._filter_syntax_combo_box = QComboBox()
+ self._filter_syntax_combo_box.addItem("Regular expression",
+ REGULAR_EXPRESSION)
+ self._filter_syntax_combo_box.addItem("Wildcard",
+ WILDCARD)
+ self._filter_syntax_combo_box.addItem("Fixed string",
+ FIXED_STRING)
+ self._filter_syntax_label = QLabel("Filter &syntax:")
+ self._filter_syntax_label.setBuddy(self._filter_syntax_combo_box)
+
+ self._filter_column_combo_box = QComboBox()
+ self._filter_column_combo_box.addItem("Subject")
+ self._filter_column_combo_box.addItem("Sender")
+ self._filter_column_combo_box.addItem("Date")
+ self._filter_column_label = QLabel("Filter &column:")
+ self._filter_column_label.setBuddy(self._filter_column_combo_box)
+
+ self._filter_pattern_line_edit.textChanged.connect(self.filter_reg_exp_changed)
+ self._filter_syntax_combo_box.currentIndexChanged.connect(self.filter_reg_exp_changed)
+ self._filter_column_combo_box.currentIndexChanged.connect(self.filter_column_changed)
+ self._filter_case_sensitivity_check_box.toggled.connect(self.filter_reg_exp_changed)
+ self._sort_case_sensitivity_check_box.toggled.connect(self.sort_changed)
+
+ source_layout = QHBoxLayout()
+ source_layout.addWidget(self._source_view)
+ self._source_group_box.setLayout(source_layout)
+
+ proxy_layout = QGridLayout()
+ proxy_layout.addWidget(self._proxy_view, 0, 0, 1, 3)
+ proxy_layout.addWidget(self._filter_pattern_label, 1, 0)
+ proxy_layout.addWidget(self._filter_pattern_line_edit, 1, 1, 1, 2)
+ proxy_layout.addWidget(self._filter_syntax_label, 2, 0)
+ proxy_layout.addWidget(self._filter_syntax_combo_box, 2, 1, 1, 2)
+ proxy_layout.addWidget(self._filter_column_label, 3, 0)
+ proxy_layout.addWidget(self._filter_column_combo_box, 3, 1, 1, 2)
+ proxy_layout.addWidget(self._filter_case_sensitivity_check_box, 4, 0, 1, 2)
+ proxy_layout.addWidget(self._sort_case_sensitivity_check_box, 4, 2)
+ self._proxy_group_box.setLayout(proxy_layout)
+
+ main_layout = QVBoxLayout()
+ main_layout.addWidget(self._source_group_box)
+ main_layout.addWidget(self._proxy_group_box)
+ self.setLayout(main_layout)
+
+ self.setWindowTitle("Basic Sort/Filter Model")
+ self.resize(500, 450)
+
+ self._proxy_view.sortByColumn(1, Qt.AscendingOrder)
+ self._filter_column_combo_box.setCurrentIndex(1)
+
+ self._filter_pattern_line_edit.setText("Andy|Grace")
+ self._filter_case_sensitivity_check_box.setChecked(True)
+ self._sort_case_sensitivity_check_box.setChecked(True)
+
+ def set_source_model(self, model):
+ self._proxy_model.setSourceModel(model)
+ self._source_view.setModel(model)
+
+ @Slot()
+ def filter_reg_exp_changed(self):
+ syntax_nr = self._filter_syntax_combo_box.currentData()
+ pattern = self._filter_pattern_line_edit.text()
+ if syntax_nr == WILDCARD:
+ pattern = QRegularExpression.wildcardToRegularExpression(pattern)
+ elif syntax_nr == FIXED_STRING:
+ pattern = QRegularExpression.escape(pattern)
+
+ reg_exp = QRegularExpression(pattern)
+ if not self._filter_case_sensitivity_check_box.isChecked():
+ options = reg_exp.patternOptions()
+ options |= QRegularExpression.CaseInsensitiveOption
+ reg_exp.setPatternOptions(options)
+ self._proxy_model.setFilterRegularExpression(reg_exp)
+
+ @Slot()
+ def filter_column_changed(self):
+ self._proxy_model.setFilterKeyColumn(self._filter_column_combo_box.currentIndex())
+
+ @Slot()
+ def sort_changed(self):
+ if self._sort_case_sensitivity_check_box.isChecked():
+ case_sensitivity = Qt.CaseSensitive
+ else:
+ case_sensitivity = Qt.CaseInsensitive
+
+ self._proxy_model.setSortCaseSensitivity(case_sensitivity)
+
+
+def add_mail(model, subject, sender, date):
+ model.insertRow(0)
+ model.setData(model.index(0, 0), subject)
+ model.setData(model.index(0, 1), sender)
+ model.setData(model.index(0, 2), date)
+
+
+def create_mail_model(parent):
+ model = QStandardItemModel(0, 3, parent)
+
+ model.setHeaderData(0, Qt.Horizontal, "Subject")
+ model.setHeaderData(1, Qt.Horizontal, "Sender")
+ model.setHeaderData(2, Qt.Horizontal, "Date")
+
+ add_mail(model, "Happy New Year!", "Grace K. <grace@software-inc.com>",
+ QDateTime(QDate(2006, 12, 31), QTime(17, 3)))
+ add_mail(model, "Radically new concept", "Grace K. <grace@software-inc.com>",
+ QDateTime(QDate(2006, 12, 22), QTime(9, 44)))
+ add_mail(model, "Accounts", "pascale@nospam.com",
+ QDateTime(QDate(2006, 12, 31), QTime(12, 50)))
+ add_mail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>",
+ QDateTime(QDate(2006, 12, 25), QTime(11, 39)))
+ add_mail(model, "Re: Expenses", "Andy <andy@nospam.com>",
+ QDateTime(QDate(2007, 1, 2), QTime(16, 5)))
+ add_mail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>",
+ QDateTime(QDate(2007, 1, 3), QTime(14, 18)))
+ add_mail(model, "Re: Accounts", "Andy <andy@nospam.com>",
+ QDateTime(QDate(2007, 1, 3), QTime(14, 26)))
+ add_mail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
+ QDateTime(QDate(2007, 1, 5), QTime(11, 33)))
+ add_mail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
+ QDateTime(QDate(2007, 1, 5), QTime(12, 0)))
+ add_mail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
+ QDateTime(QDate(2007, 1, 5), QTime(12, 1)))
+
+ return model
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = Window()
+ window.set_source_model(create_mail_model(window))
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.pyproject b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.pyproject
new file mode 100644
index 000000000..3351bba88
--- /dev/null
+++ b/examples/widgets/itemviews/basicfiltermodel/basicsortfiltermodel.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["basicsortfiltermodel.py"]
+}
diff --git a/examples/widgets/itemviews/basicsortfiltermodel.py b/examples/widgets/itemviews/basicsortfiltermodel.py
deleted file mode 100644
index 4aea218d2..000000000
--- a/examples/widgets/itemviews/basicsortfiltermodel.py
+++ /dev/null
@@ -1,202 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class Window(QtWidgets.QWidget):
- def __init__(self):
- super(Window, self).__init__()
-
- self.proxyModel = QtCore.QSortFilterProxyModel()
- self.proxyModel.setDynamicSortFilter(True)
-
- self.sourceGroupBox = QtWidgets.QGroupBox("Original Model")
- self.proxyGroupBox = QtWidgets.QGroupBox("Sorted/Filtered Model")
-
- self.sourceView = QtWidgets.QTreeView()
- self.sourceView.setRootIsDecorated(False)
- self.sourceView.setAlternatingRowColors(True)
-
- self.proxyView = QtWidgets.QTreeView()
- self.proxyView.setRootIsDecorated(False)
- self.proxyView.setAlternatingRowColors(True)
- self.proxyView.setModel(self.proxyModel)
- self.proxyView.setSortingEnabled(True)
-
- self.sortCaseSensitivityCheckBox = QtWidgets.QCheckBox("Case sensitive sorting")
- self.filterCaseSensitivityCheckBox = QtWidgets.QCheckBox("Case sensitive filter")
-
- self.filterPatternLineEdit = QtWidgets.QLineEdit()
- self.filterPatternLabel = QtWidgets.QLabel("&Filter pattern:")
- self.filterPatternLabel.setBuddy(self.filterPatternLineEdit)
-
- self.filterSyntaxComboBox = QtWidgets.QComboBox()
- self.filterSyntaxComboBox.addItem("Regular expression",
- QtCore.QRegExp.RegExp)
- self.filterSyntaxComboBox.addItem("Wildcard",
- QtCore.QRegExp.Wildcard)
- self.filterSyntaxComboBox.addItem("Fixed string",
- QtCore.QRegExp.FixedString)
- self.filterSyntaxLabel = QtWidgets.QLabel("Filter &syntax:")
- self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox)
-
- self.filterColumnComboBox = QtWidgets.QComboBox()
- self.filterColumnComboBox.addItem("Subject")
- self.filterColumnComboBox.addItem("Sender")
- self.filterColumnComboBox.addItem("Date")
- self.filterColumnLabel = QtWidgets.QLabel("Filter &column:")
- self.filterColumnLabel.setBuddy(self.filterColumnComboBox)
-
- self.filterPatternLineEdit.textChanged.connect(self.filterRegExpChanged)
- self.filterSyntaxComboBox.currentIndexChanged.connect(self.filterRegExpChanged)
- self.filterColumnComboBox.currentIndexChanged.connect(self.filterColumnChanged)
- self.filterCaseSensitivityCheckBox.toggled.connect(self.filterRegExpChanged)
- self.sortCaseSensitivityCheckBox.toggled.connect(self.sortChanged)
-
- sourceLayout = QtWidgets.QHBoxLayout()
- sourceLayout.addWidget(self.sourceView)
- self.sourceGroupBox.setLayout(sourceLayout)
-
- proxyLayout = QtWidgets.QGridLayout()
- proxyLayout.addWidget(self.proxyView, 0, 0, 1, 3)
- proxyLayout.addWidget(self.filterPatternLabel, 1, 0)
- proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 2)
- proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0)
- proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 2)
- proxyLayout.addWidget(self.filterColumnLabel, 3, 0)
- proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 2)
- proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2)
- proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2)
- self.proxyGroupBox.setLayout(proxyLayout)
-
- mainLayout = QtWidgets.QVBoxLayout()
- mainLayout.addWidget(self.sourceGroupBox)
- mainLayout.addWidget(self.proxyGroupBox)
- self.setLayout(mainLayout)
-
- self.setWindowTitle("Basic Sort/Filter Model")
- self.resize(500, 450)
-
- self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder)
- self.filterColumnComboBox.setCurrentIndex(1)
-
- self.filterPatternLineEdit.setText("Andy|Grace")
- self.filterCaseSensitivityCheckBox.setChecked(True)
- self.sortCaseSensitivityCheckBox.setChecked(True)
-
- def setSourceModel(self, model):
- self.proxyModel.setSourceModel(model)
- self.sourceView.setModel(model)
-
- def filterRegExpChanged(self):
- syntax_nr = self.filterSyntaxComboBox.itemData(self.filterSyntaxComboBox.currentIndex())
- syntax = QtCore.QRegExp.PatternSyntax(syntax_nr)
-
- if self.filterCaseSensitivityCheckBox.isChecked():
- caseSensitivity = QtCore.Qt.CaseSensitive
- else:
- caseSensitivity = QtCore.Qt.CaseInsensitive
-
- regExp = QtCore.QRegExp(self.filterPatternLineEdit.text(),
- caseSensitivity, syntax)
- self.proxyModel.setFilterRegExp(regExp)
-
- def filterColumnChanged(self):
- self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex())
-
- def sortChanged(self):
- if self.sortCaseSensitivityCheckBox.isChecked():
- caseSensitivity = QtCore.Qt.CaseSensitive
- else:
- caseSensitivity = QtCore.Qt.CaseInsensitive
-
- self.proxyModel.setSortCaseSensitivity(caseSensitivity)
-
-
-def addMail(model, subject, sender, date):
- model.insertRow(0)
- model.setData(model.index(0, 0), subject)
- model.setData(model.index(0, 1), sender)
- model.setData(model.index(0, 2), date)
-
-
-def createMailModel(parent):
- model = QtGui.QStandardItemModel(0, 3, parent)
-
- model.setHeaderData(0, QtCore.Qt.Horizontal, "Subject")
- model.setHeaderData(1, QtCore.Qt.Horizontal, "Sender")
- model.setHeaderData(2, QtCore.Qt.Horizontal, "Date")
-
- addMail(model, "Happy New Year!", "Grace K. <grace@software-inc.com>",
- QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(17, 3)))
- addMail(model, "Radically new concept", "Grace K. <grace@software-inc.com>",
- QtCore.QDateTime(QtCore.QDate(2006, 12, 22), QtCore.QTime(9, 44)))
- addMail(model, "Accounts", "pascale@nospam.com",
- QtCore.QDateTime(QtCore.QDate(2006, 12, 31), QtCore.QTime(12, 50)))
- addMail(model, "Expenses", "Joe Bloggs <joe@bloggs.com>",
- QtCore.QDateTime(QtCore.QDate(2006, 12, 25), QtCore.QTime(11, 39)))
- addMail(model, "Re: Expenses", "Andy <andy@nospam.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 2), QtCore.QTime(16, 5)))
- addMail(model, "Re: Accounts", "Joe Bloggs <joe@bloggs.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 18)))
- addMail(model, "Re: Accounts", "Andy <andy@nospam.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 3), QtCore.QTime(14, 26)))
- addMail(model, "Sports", "Linda Smith <linda.smith@nospam.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(11, 33)))
- addMail(model, "AW: Sports", "Rolf Newschweinstein <rolfn@nospam.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 0)))
- addMail(model, "RE: Sports", "Petra Schmidt <petras@nospam.com>",
- QtCore.QDateTime(QtCore.QDate(2007, 1, 5), QtCore.QTime(12, 1)))
-
- return model
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = Window()
- window.setSourceModel(createMailModel(window))
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/dirview/dirview.py b/examples/widgets/itemviews/dirview/dirview.py
new file mode 100644
index 000000000..d1be6958e
--- /dev/null
+++ b/examples/widgets/itemviews/dirview/dirview.py
@@ -0,0 +1,59 @@
+# Copyright (C) 2020 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from argparse import ArgumentParser, RawTextHelpFormatter
+
+from PySide6.QtWidgets import (QApplication, QFileSystemModel,
+ QFileIconProvider, QScroller, QTreeView)
+from PySide6.QtCore import QDir
+
+"""PySide6 port of the widgets/itemviews/dirview example from Qt v6.x"""
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ name = "Dir View"
+ argument_parser = ArgumentParser(description=name,
+ formatter_class=RawTextHelpFormatter)
+ argument_parser.add_argument("--no-custom", "-c", action="store_true",
+ help="Set QFileSystemModel.DontUseCustomDirectoryIcons")
+ argument_parser.add_argument("--no-watch", "-w", action="store_true",
+ help="Set QFileSystemModel.DontWatch")
+ argument_parser.add_argument("directory",
+ help="The directory to start in.",
+ nargs='?', type=str)
+ options = argument_parser.parse_args()
+ root_path = options.directory
+
+ model = QFileSystemModel()
+ icon_provider = QFileIconProvider()
+ model.setIconProvider(icon_provider)
+ model.setRootPath("")
+ if options.no_custom:
+ model.setOption(QFileSystemModel.DontUseCustomDirectoryIcons)
+ if options.no_watch:
+ model.setOption(QFileSystemModel.DontWatchForChanges)
+ tree = QTreeView()
+ tree.setModel(model)
+ if root_path:
+ root_index = model.index(QDir.cleanPath(root_path))
+ if root_index.isValid():
+ tree.setRootIndex(root_index)
+
+ # Demonstrating look and feel features
+ tree.setAnimated(False)
+ tree.setIndentation(20)
+ tree.setSortingEnabled(True)
+ availableSize = tree.screen().availableGeometry().size()
+ tree.resize(availableSize / 2)
+ tree.setColumnWidth(0, tree.width() / 3)
+
+ # Make it flickable on touchscreens
+ QScroller.grabGesture(tree, QScroller.ScrollerGestureType.TouchGesture)
+
+ tree.setWindowTitle(name)
+ tree.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/dirview/dirview.pyproject b/examples/widgets/itemviews/dirview/dirview.pyproject
new file mode 100644
index 000000000..9470083c9
--- /dev/null
+++ b/examples/widgets/itemviews/dirview/dirview.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["dirview.py"]
+}
diff --git a/examples/widgets/itemviews/dirview/doc/dirview.rst b/examples/widgets/itemviews/dirview/doc/dirview.rst
new file mode 100644
index 000000000..7044fdf58
--- /dev/null
+++ b/examples/widgets/itemviews/dirview/doc/dirview.rst
@@ -0,0 +1,5 @@
+Dir View Example
+================
+
+The Dir View example shows a tree view of the local file system. It uses the
+QFileSystemModel class to provide file and directory information.
diff --git a/examples/widgets/itemviews/editabletreemodel/default.txt b/examples/widgets/itemviews/editabletreemodel/default.txt
new file mode 100644
index 000000000..98746548b
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/default.txt
@@ -0,0 +1,40 @@
+Getting Started How to familiarize yourself with Qt Designer
+ Launching Designer Running the Qt Designer application
+ The User Interface How to interact with Qt Designer
+
+Designing a Component Creating a GUI for your application
+ Creating a Dialog How to create a dialog
+ Composing the Dialog Putting widgets into the dialog example
+ Creating a Layout Arranging widgets on a form
+ Signal and Slot Connections Making widget communicate with each other
+
+Using a Component in Your Application Generating code from forms
+ The Direct Approach Using a form without any adjustments
+ The Single Inheritance Approach Subclassing a form's base class
+ The Multiple Inheritance Approach Subclassing the form itself
+ Automatic Connections Connecting widgets using a naming scheme
+ A Dialog Without Auto-Connect How to connect widgets without a naming scheme
+ A Dialog With Auto-Connect Using automatic connections
+
+Form Editing Mode How to edit a form in Qt Designer
+ Managing Forms Loading and saving forms
+ Editing a Form Basic editing techniques
+ The Property Editor Changing widget properties
+ The Object Inspector Examining the hierarchy of objects on a form
+ Layouts Objects that arrange widgets on a form
+ Applying and Breaking Layouts Managing widgets in layouts
+ Horizontal and Vertical Layouts Standard row and column layouts
+ The Grid Layout Arranging widgets in a matrix
+ Previewing Forms Checking that the design works
+
+Using Containers How to group widgets together
+ General Features Common container features
+ Frames QFrame
+ Group Boxes QGroupBox
+ Stacked Widgets QStackedWidget
+ Tab Widgets QTabWidget
+ Toolbox Widgets QToolBox
+
+Connection Editing Mode Connecting widgets together with signals and slots
+ Connecting Objects Making connections in Qt Designer
+ Editing Connections Changing existing connections
diff --git a/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.png b/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.png
new file mode 100644
index 000000000..b50c792aa
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.png
Binary files differ
diff --git a/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.rst b/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.rst
new file mode 100644
index 000000000..c936972a0
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/doc/editabletreemodel.rst
@@ -0,0 +1,10 @@
+Editable Tree Model Example
+===========================
+
+A Python application that demonstrates the analogous example in C++
+`Editable Tree Model Example <https://doc.qt.io/qt-6/qtwidgets-itemviews-editabletreemodel-example.html>`_
+
+.. image:: editabletreemodel.png
+ :width: 611
+ :alt: editabletreemodel screenshot
+
diff --git a/examples/widgets/itemviews/editabletreemodel/editabletreemodel.pyproject b/examples/widgets/itemviews/editabletreemodel/editabletreemodel.pyproject
new file mode 100644
index 000000000..1e67c727b
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/editabletreemodel.pyproject
@@ -0,0 +1,7 @@
+{
+ "files": ["main.py",
+ "mainwindow.py",
+ "treeitem.py",
+ "treemodel.py",
+ "default.txt"]
+}
diff --git a/examples/widgets/itemviews/editabletreemodel/main.py b/examples/widgets/itemviews/editabletreemodel/main.py
new file mode 100644
index 000000000..491baa68d
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/main.py
@@ -0,0 +1,14 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+import sys
+from PySide6.QtWidgets import QApplication
+from mainwindow import MainWindow
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = MainWindow()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/editabletreemodel/mainwindow.py b/examples/widgets/itemviews/editabletreemodel/mainwindow.py
new file mode 100644
index 000000000..1489bf28b
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/mainwindow.py
@@ -0,0 +1,163 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from pathlib import Path
+
+from PySide6.QtCore import (QAbstractItemModel, QItemSelectionModel,
+ QModelIndex, Qt, Slot)
+from PySide6.QtWidgets import (QAbstractItemView, QMainWindow, QTreeView,
+ QWidget)
+from PySide6.QtTest import QAbstractItemModelTester
+
+from treemodel import TreeModel
+
+
+class MainWindow(QMainWindow):
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+ self.resize(573, 468)
+
+ self.view = QTreeView()
+ self.view.setAlternatingRowColors(True)
+ self.view.setSelectionBehavior(QAbstractItemView.SelectItems)
+ self.view.setHorizontalScrollMode(QAbstractItemView.ScrollPerPixel)
+ self.view.setAnimated(False)
+ self.view.setAllColumnsShowFocus(True)
+ self.setCentralWidget(self.view)
+
+ menubar = self.menuBar()
+ file_menu = menubar.addMenu("&File")
+ self.exit_action = file_menu.addAction("E&xit")
+ self.exit_action.setShortcut("Ctrl+Q")
+ self.exit_action.triggered.connect(self.close)
+
+ actions_menu = menubar.addMenu("&Actions")
+ actions_menu.triggered.connect(self.update_actions)
+ self.insert_row_action = actions_menu.addAction("Insert Row")
+ self.insert_row_action.setShortcut("Ctrl+I, R")
+ self.insert_row_action.triggered.connect(self.insert_row)
+ self.insert_column_action = actions_menu.addAction("Insert Column")
+ self.insert_column_action.setShortcut("Ctrl+I, C")
+ self.insert_column_action.triggered.connect(self.insert_column)
+ actions_menu.addSeparator()
+ self.remove_row_action = actions_menu.addAction("Remove Row")
+ self.remove_row_action.setShortcut("Ctrl+R, R")
+ self.remove_row_action.triggered.connect(self.remove_row)
+ self.remove_column_action = actions_menu.addAction("Remove Column")
+ self.remove_column_action.setShortcut("Ctrl+R, C")
+ self.remove_column_action.triggered.connect(self.remove_column)
+ actions_menu.addSeparator()
+ self.insert_child_action = actions_menu.addAction("Insert Child")
+ self.insert_child_action.setShortcut("Ctrl+N")
+ self.insert_child_action.triggered.connect(self.insert_child)
+ help_menu = menubar.addMenu("&Help")
+ about_qt_action = help_menu.addAction("About Qt", qApp.aboutQt) # noqa: F821
+ about_qt_action.setShortcut("F1")
+
+ self.setWindowTitle("Editable Tree Model")
+
+ headers = ["Title", "Description"]
+
+ file = Path(__file__).parent / "default.txt"
+ self.model = TreeModel(headers, file.read_text(), self)
+
+ if "-t" in sys.argv:
+ QAbstractItemModelTester(self.model, self)
+ self.view.setModel(self.model)
+ self.view.expandAll()
+
+ for column in range(self.model.columnCount()):
+ self.view.resizeColumnToContents(column)
+
+ selection_model = self.view.selectionModel()
+ selection_model.selectionChanged.connect(self.update_actions)
+
+ self.update_actions()
+
+ @Slot()
+ def insert_child(self) -> None:
+ selection_model = self.view.selectionModel()
+ index: QModelIndex = selection_model.currentIndex()
+ model: QAbstractItemModel = self.view.model()
+
+ if model.columnCount(index) == 0:
+ if not model.insertColumn(0, index):
+ return
+
+ if not model.insertRow(0, index):
+ return
+
+ for column in range(model.columnCount(index)):
+ child: QModelIndex = model.index(0, column, index)
+ model.setData(child, "[No data]", Qt.EditRole)
+ if not model.headerData(column, Qt.Horizontal):
+ model.setHeaderData(column, Qt.Horizontal, "[No header]",
+ Qt.EditRole)
+
+ selection_model.setCurrentIndex(
+ model.index(0, 0, index), QItemSelectionModel.ClearAndSelect
+ )
+ self.update_actions()
+
+ @Slot()
+ def insert_column(self) -> None:
+ model: QAbstractItemModel = self.view.model()
+ column: int = self.view.selectionModel().currentIndex().column()
+
+ changed: bool = model.insertColumn(column + 1)
+ if changed:
+ model.setHeaderData(column + 1, Qt.Horizontal, "[No header]",
+ Qt.EditRole)
+
+ self.update_actions()
+
+ @Slot()
+ def insert_row(self) -> None:
+ index: QModelIndex = self.view.selectionModel().currentIndex()
+ model: QAbstractItemModel = self.view.model()
+ parent: QModelIndex = index.parent()
+
+ if not model.insertRow(index.row() + 1, parent):
+ return
+
+ self.update_actions()
+
+ for column in range(model.columnCount(parent)):
+ child: QModelIndex = model.index(index.row() + 1, column, parent)
+ model.setData(child, "[No data]", Qt.EditRole)
+
+ @Slot()
+ def remove_column(self) -> None:
+ model: QAbstractItemModel = self.view.model()
+ column: int = self.view.selectionModel().currentIndex().column()
+
+ if model.removeColumn(column):
+ self.update_actions()
+
+ @Slot()
+ def remove_row(self) -> None:
+ index: QModelIndex = self.view.selectionModel().currentIndex()
+ model: QAbstractItemModel = self.view.model()
+
+ if model.removeRow(index.row(), index.parent()):
+ self.update_actions()
+
+ @Slot()
+ def update_actions(self) -> None:
+ selection_model = self.view.selectionModel()
+ has_selection: bool = not selection_model.selection().isEmpty()
+ self.remove_row_action.setEnabled(has_selection)
+ self.remove_column_action.setEnabled(has_selection)
+
+ current_index = selection_model.currentIndex()
+ has_current: bool = current_index.isValid()
+ self.insert_row_action.setEnabled(has_current)
+ self.insert_column_action.setEnabled(has_current)
+
+ if has_current:
+ self.view.closePersistentEditor(current_index)
+ msg = f"Position: ({current_index.row()},{current_index.column()})"
+ if not current_index.parent().isValid():
+ msg += " in top level"
+ self.statusBar().showMessage(msg)
diff --git a/examples/widgets/itemviews/editabletreemodel/treeitem.py b/examples/widgets/itemviews/editabletreemodel/treeitem.py
new file mode 100644
index 000000000..1a25b0774
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/treeitem.py
@@ -0,0 +1,94 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+class TreeItem:
+ def __init__(self, data: list, parent: 'TreeItem' = None):
+ self.item_data = data
+ self.parent_item = parent
+ self.child_items = []
+
+ def child(self, number: int) -> 'TreeItem':
+ if number < 0 or number >= len(self.child_items):
+ return None
+ return self.child_items[number]
+
+ def last_child(self):
+ return self.child_items[-1] if self.child_items else None
+
+ def child_count(self) -> int:
+ return len(self.child_items)
+
+ def child_number(self) -> int:
+ if self.parent_item:
+ return self.parent_item.child_items.index(self)
+ return 0
+
+ def column_count(self) -> int:
+ return len(self.item_data)
+
+ def data(self, column: int):
+ if column < 0 or column >= len(self.item_data):
+ return None
+ return self.item_data[column]
+
+ def insert_children(self, position: int, count: int, columns: int) -> bool:
+ if position < 0 or position > len(self.child_items):
+ return False
+
+ for row in range(count):
+ data = [None] * columns
+ item = TreeItem(data.copy(), self)
+ self.child_items.insert(position, item)
+
+ return True
+
+ def insert_columns(self, position: int, columns: int) -> bool:
+ if position < 0 or position > len(self.item_data):
+ return False
+
+ for column in range(columns):
+ self.item_data.insert(position, None)
+
+ for child in self.child_items:
+ child.insert_columns(position, columns)
+
+ return True
+
+ def parent(self):
+ return self.parent_item
+
+ def remove_children(self, position: int, count: int) -> bool:
+ if position < 0 or position + count > len(self.child_items):
+ return False
+
+ for row in range(count):
+ self.child_items.pop(position)
+
+ return True
+
+ def remove_columns(self, position: int, columns: int) -> bool:
+ if position < 0 or position + columns > len(self.item_data):
+ return False
+
+ for column in range(columns):
+ self.item_data.pop(position)
+
+ for child in self.child_items:
+ child.remove_columns(position, columns)
+
+ return True
+
+ def set_data(self, column: int, value):
+ if column < 0 or column >= len(self.item_data):
+ return False
+
+ self.item_data[column] = value
+ return True
+
+ def __repr__(self) -> str:
+ result = f"<treeitem.TreeItem at 0x{id(self):x}"
+ for d in self.item_data:
+ result += f' "{d}"' if d else " <None>"
+ result += f", {len(self.child_items)} children>"
+ return result
diff --git a/examples/widgets/itemviews/editabletreemodel/treemodel.py b/examples/widgets/itemviews/editabletreemodel/treemodel.py
new file mode 100644
index 000000000..a58572fca
--- /dev/null
+++ b/examples/widgets/itemviews/editabletreemodel/treemodel.py
@@ -0,0 +1,199 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+
+from PySide6.QtCore import QModelIndex, Qt, QAbstractItemModel
+from treeitem import TreeItem
+
+
+class TreeModel(QAbstractItemModel):
+
+ def __init__(self, headers: list, data: str, parent=None):
+ super().__init__(parent)
+
+ self.root_data = headers
+ self.root_item = TreeItem(self.root_data.copy())
+ self.setup_model_data(data.split("\n"), self.root_item)
+
+ def columnCount(self, parent: QModelIndex = None) -> int:
+ return self.root_item.column_count()
+
+ def data(self, index: QModelIndex, role: int = None):
+ if not index.isValid():
+ return None
+
+ if role != Qt.DisplayRole and role != Qt.EditRole:
+ return None
+
+ item: TreeItem = self.get_item(index)
+
+ return item.data(index.column())
+
+ def flags(self, index: QModelIndex) -> Qt.ItemFlags:
+ if not index.isValid():
+ return Qt.NoItemFlags
+
+ return Qt.ItemIsEditable | QAbstractItemModel.flags(self, index)
+
+ def get_item(self, index: QModelIndex = QModelIndex()) -> TreeItem:
+ if index.isValid():
+ item: TreeItem = index.internalPointer()
+ if item:
+ return item
+
+ return self.root_item
+
+ def headerData(self, section: int, orientation: Qt.Orientation,
+ role: int = Qt.DisplayRole):
+ if orientation == Qt.Horizontal and role == Qt.DisplayRole:
+ return self.root_item.data(section)
+
+ return None
+
+ def index(self, row: int, column: int, parent: QModelIndex = QModelIndex()) -> QModelIndex:
+ if parent.isValid() and parent.column() != 0:
+ return QModelIndex()
+
+ parent_item: TreeItem = self.get_item(parent)
+ if not parent_item:
+ return QModelIndex()
+
+ child_item: TreeItem = parent_item.child(row)
+ if child_item:
+ return self.createIndex(row, column, child_item)
+ return QModelIndex()
+
+ def insertColumns(self, position: int, columns: int,
+ parent: QModelIndex = QModelIndex()) -> bool:
+ self.beginInsertColumns(parent, position, position + columns - 1)
+ success: bool = self.root_item.insert_columns(position, columns)
+ self.endInsertColumns()
+
+ return success
+
+ def insertRows(self, position: int, rows: int,
+ parent: QModelIndex = QModelIndex()) -> bool:
+ parent_item: TreeItem = self.get_item(parent)
+ if not parent_item:
+ return False
+
+ self.beginInsertRows(parent, position, position + rows - 1)
+ column_count = self.root_item.column_count()
+ success: bool = parent_item.insert_children(position, rows, column_count)
+ self.endInsertRows()
+
+ return success
+
+ def parent(self, index: QModelIndex = QModelIndex()) -> QModelIndex:
+ if not index.isValid():
+ return QModelIndex()
+
+ child_item: TreeItem = self.get_item(index)
+ if child_item:
+ parent_item: TreeItem = child_item.parent()
+ else:
+ parent_item = None
+
+ if parent_item == self.root_item or not parent_item:
+ return QModelIndex()
+
+ return self.createIndex(parent_item.child_number(), 0, parent_item)
+
+ def removeColumns(self, position: int, columns: int,
+ parent: QModelIndex = QModelIndex()) -> bool:
+ self.beginRemoveColumns(parent, position, position + columns - 1)
+ success: bool = self.root_item.remove_columns(position, columns)
+ self.endRemoveColumns()
+
+ if self.root_item.column_count() == 0:
+ self.removeRows(0, self.rowCount())
+
+ return success
+
+ def removeRows(self, position: int, rows: int,
+ parent: QModelIndex = QModelIndex()) -> bool:
+ parent_item: TreeItem = self.get_item(parent)
+ if not parent_item:
+ return False
+
+ self.beginRemoveRows(parent, position, position + rows - 1)
+ success: bool = parent_item.remove_children(position, rows)
+ self.endRemoveRows()
+
+ return success
+
+ def rowCount(self, parent: QModelIndex = QModelIndex()) -> int:
+ if parent.isValid() and parent.column() > 0:
+ return 0
+
+ parent_item: TreeItem = self.get_item(parent)
+ if not parent_item:
+ return 0
+ return parent_item.child_count()
+
+ def setData(self, index: QModelIndex, value, role: int) -> bool:
+ if role != Qt.EditRole:
+ return False
+
+ item: TreeItem = self.get_item(index)
+ result: bool = item.set_data(index.column(), value)
+
+ if result:
+ self.dataChanged.emit(index, index, [Qt.DisplayRole, Qt.EditRole])
+
+ return result
+
+ def setHeaderData(self, section: int, orientation: Qt.Orientation, value,
+ role: int = None) -> bool:
+ if role != Qt.EditRole or orientation != Qt.Horizontal:
+ return False
+
+ result: bool = self.root_item.set_data(section, value)
+
+ if result:
+ self.headerDataChanged.emit(orientation, section, section)
+
+ return result
+
+ def setup_model_data(self, lines: list, parent: TreeItem):
+ parents = [parent]
+ indentations = [0]
+
+ for line in lines:
+ line = line.rstrip()
+ if line and "\t" in line:
+
+ position = 0
+ while position < len(line):
+ if line[position] != " ":
+ break
+ position += 1
+
+ column_data = line[position:].split("\t")
+ column_data = [string for string in column_data if string]
+
+ if position > indentations[-1]:
+ if parents[-1].child_count() > 0:
+ parents.append(parents[-1].last_child())
+ indentations.append(position)
+ else:
+ while position < indentations[-1] and parents:
+ parents.pop()
+ indentations.pop()
+
+ parent: TreeItem = parents[-1]
+ col_count = self.root_item.column_count()
+ parent.insert_children(parent.child_count(), 1, col_count)
+
+ for column in range(len(column_data)):
+ child = parent.last_child()
+ child.set_data(column, column_data[column])
+
+ def _repr_recursion(self, item: TreeItem, indent: int = 0) -> str:
+ result = " " * indent + repr(item) + "\n"
+ for child in item.child_items:
+ result += self._repr_recursion(child, indent + 2)
+ return result
+
+ def __repr__(self) -> str:
+ return self._repr_recursion(self.root_item)
diff --git a/examples/widgets/itemviews/fetchmore.py b/examples/widgets/itemviews/fetchmore.py
deleted file mode 100644
index 2b0d8c104..000000000
--- a/examples/widgets/itemviews/fetchmore.py
+++ /dev/null
@@ -1,147 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2009 Darryl Wallace, 2009 <wallacdj@gmail.com>
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
-
-
-class FileListModel(QtCore.QAbstractListModel):
- numberPopulated = QtCore.Signal(int)
-
- def __init__(self, parent=None):
- super(FileListModel, self).__init__(parent)
-
- self.fileCount = 0
- self.fileList = []
-
- def rowCount(self, parent=QtCore.QModelIndex()):
- return self.fileCount
-
- def data(self, index, role=QtCore.Qt.DisplayRole):
- if not index.isValid():
- return None
-
- if index.row() >= len(self.fileList) or index.row() < 0:
- return None
-
- if role == QtCore.Qt.DisplayRole:
- return self.fileList[index.row()]
-
- if role == QtCore.Qt.BackgroundRole:
- batch = (index.row() // 100) % 2
-# FIXME: QGuiApplication::palette() required
- if batch == 0:
- return qApp.palette().base()
-
- return qApp.palette().alternateBase()
-
- return None
-
- def canFetchMore(self, index):
- return self.fileCount < len(self.fileList)
-
- def fetchMore(self, index):
- remainder = len(self.fileList) - self.fileCount
- itemsToFetch = min(100, remainder)
-
- self.beginInsertRows(QtCore.QModelIndex(), self.fileCount,
- self.fileCount + itemsToFetch)
-
- self.fileCount += itemsToFetch
-
- self.endInsertRows()
-
- self.numberPopulated.emit(itemsToFetch)
-
- def setDirPath(self, path):
- dir = QtCore.QDir(path)
-
- self.beginResetModel()
- self.fileList = list(dir.entryList())
- self.fileCount = 0
- self.endResetModel()
-
-
-class Window(QtWidgets.QWidget):
- def __init__(self, parent=None):
- super(Window, self).__init__(parent)
-
- model = FileListModel(self)
- model.setDirPath(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PrefixPath))
-
- label = QtWidgets.QLabel("Directory")
- lineEdit = QtWidgets.QLineEdit()
- label.setBuddy(lineEdit)
-
- view = QtWidgets.QListView()
- view.setModel(model)
-
- self.logViewer = QtWidgets.QTextBrowser()
- self.logViewer.setSizePolicy(QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred))
-
- lineEdit.textChanged.connect(model.setDirPath)
- lineEdit.textChanged.connect(self.logViewer.clear)
- model.numberPopulated.connect(self.updateLog)
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(label, 0, 0)
- layout.addWidget(lineEdit, 0, 1)
- layout.addWidget(view, 1, 0, 1, 2)
- layout.addWidget(self.logViewer, 2, 0, 1, 2)
-
- self.setLayout(layout)
- self.setWindowTitle("Fetch More Example")
-
- def updateLog(self, number):
- self.logViewer.append("%d items added." % number)
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
-
- window = Window()
- window.show()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/itemviews/fetchmore/fetchmore.py b/examples/widgets/itemviews/fetchmore/fetchmore.py
new file mode 100644
index 000000000..5150250e0
--- /dev/null
+++ b/examples/widgets/itemviews/fetchmore/fetchmore.py
@@ -0,0 +1,137 @@
+# Copyright (C) 2009 Darryl Wallace, 2009 <wallacdj@gmail.com>
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the itemviews/fetchmore/fetchmore example from Qt v6.x
+
+Navigate to a directory with many entries by doubleclicking and scroll
+down the list to see the model being populated on demand.
+"""
+
+import sys
+
+from PySide6.QtCore import (QAbstractListModel, QDir,
+ QModelIndex, Qt, Signal, Slot)
+from PySide6.QtWidgets import (QApplication, QFileIconProvider, QListView,
+ QPlainTextEdit, QSizePolicy, QVBoxLayout,
+ QWidget)
+
+
+BATCH_SIZE = 100
+
+
+class FileListModel(QAbstractListModel):
+
+ number_populated = Signal(str, int, int, int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._path = ''
+ self._file_count = 0
+ self._file_list = []
+ self._icon_provider = QFileIconProvider()
+
+ def rowCount(self, parent=QModelIndex()):
+ return self._file_count
+
+ def data(self, index, role=Qt.DisplayRole):
+ if not index.isValid():
+ return None
+
+ row = index.row()
+ if row >= len(self._file_list) or row < 0:
+ return None
+
+ if role == Qt.DisplayRole:
+ return self._file_list[row].fileName()
+
+ if role == Qt.BackgroundRole:
+ batch = row // BATCH_SIZE
+ palette = qApp.palette() # noqa: F821
+ return palette.base() if batch % 2 == 0 else palette.alternateBase()
+
+ if role == Qt.DecorationRole:
+ return self._icon_provider.icon(self._file_list[row])
+
+ return None
+
+ def canFetchMore(self, index):
+ return self._file_count < len(self._file_list)
+
+ def fetchMore(self, index):
+ start = self._file_count
+ total = len(self._file_list)
+ remainder = total - start
+ items_to_fetch = min(BATCH_SIZE, remainder)
+
+ self.beginInsertRows(QModelIndex(), start, start + items_to_fetch)
+
+ self._file_count += items_to_fetch
+
+ self.endInsertRows()
+
+ self.number_populated.emit(self._path, start, items_to_fetch, total)
+
+ @Slot(str)
+ def set_dir_path(self, path):
+ self._path = path
+ directory = QDir(path)
+
+ self.beginResetModel()
+ directory_filter = QDir.AllEntries | QDir.NoDot
+ self._file_list = directory.entryInfoList(directory_filter, QDir.Name)
+ self._file_count = 0
+ self.endResetModel()
+
+ def fileinfo_at(self, index):
+ return self._file_list[index.row()]
+
+
+class Window(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._model = FileListModel(self)
+ self._model.set_dir_path(QDir.rootPath())
+
+ self._view = QListView()
+ self._view.setModel(self._model)
+
+ self._log_viewer = QPlainTextEdit()
+ self._log_viewer.setSizePolicy(QSizePolicy(QSizePolicy.Preferred,
+ QSizePolicy.Preferred))
+
+ self._model.number_populated.connect(self.update_log)
+ self._view.activated.connect(self.activated)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(self._view)
+ layout.addWidget(self._log_viewer)
+
+ self.setWindowTitle("Fetch More Example")
+
+ @Slot(str, int, int, int)
+ def update_log(self, path, start, number, total):
+ native_path = QDir.toNativeSeparators(path)
+ last = start + number - 1
+ entry = f'{start}..{last}/{total} items from "{native_path}" added.'
+ self._log_viewer.appendPlainText(entry)
+
+ @Slot(QModelIndex)
+ def activated(self, index):
+ fileinfo = self._model.fileinfo_at(index)
+ if fileinfo.isDir():
+ self._log_viewer.clear()
+ self._model.set_dir_path(fileinfo.absoluteFilePath())
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ window = Window()
+ window.resize(400, 500)
+ window.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/fetchmore/fetchmore.pyproject b/examples/widgets/itemviews/fetchmore/fetchmore.pyproject
new file mode 100644
index 000000000..e5c369374
--- /dev/null
+++ b/examples/widgets/itemviews/fetchmore/fetchmore.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["fetchmore.py"]
+}
diff --git a/examples/widgets/itemviews/itemviews.pyproject b/examples/widgets/itemviews/itemviews.pyproject
deleted file mode 100644
index a582259cc..000000000
--- a/examples/widgets/itemviews/itemviews.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["basicsortfiltermodel.py", "fetchmore.py"]
-}
diff --git a/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.png b/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.png
new file mode 100644
index 000000000..8b5c8d0c3
--- /dev/null
+++ b/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.png
Binary files differ
diff --git a/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.rst b/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.rst
new file mode 100644
index 000000000..d5e2831bf
--- /dev/null
+++ b/examples/widgets/itemviews/jsonmodel/doc/jsonmodel.rst
@@ -0,0 +1,8 @@
+JSON Model Example
+==================
+
+Simple example to visualize the values of a JSON file.
+
+.. image:: jsonmodel.png
+ :width: 400
+ :alt: JSON Model Screenshot
diff --git a/examples/widgets/itemviews/jsonmodel/example.json b/examples/widgets/itemviews/jsonmodel/example.json
new file mode 100644
index 000000000..3c3ecfbfd
--- /dev/null
+++ b/examples/widgets/itemviews/jsonmodel/example.json
@@ -0,0 +1,26 @@
+{
+ "id": "0001",
+ "type": "donut",
+ "name": "Cake",
+ "ppu": 0.55,
+ "batters":
+ {
+ "batter":
+ [
+ { "id": "1001", "type": "Regular" },
+ { "id": "1002", "type": "Chocolate" },
+ { "id": "1003", "type": "Blueberry" },
+ { "id": "1004", "type": "Devil's Food" }
+ ]
+ },
+ "topping":
+ [
+ { "id": "5001", "type": "None" },
+ { "id": "5002", "type": "Glazed" },
+ { "id": "5005", "type": "Sugar" },
+ { "id": "5007", "type": "Powdered Sugar" },
+ { "id": "5006", "type": "Chocolate with Sprinkles" },
+ { "id": "5003", "type": "Chocolate" },
+ { "id": "5004", "type": "Maple" }
+ ]
+}
diff --git a/examples/widgets/itemviews/jsonmodel/jsonmodel.py b/examples/widgets/itemviews/jsonmodel/jsonmodel.py
new file mode 100644
index 000000000..6e614c77f
--- /dev/null
+++ b/examples/widgets/itemviews/jsonmodel/jsonmodel.py
@@ -0,0 +1,320 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import json
+import sys
+from typing import Any, List, Dict, Union
+
+from PySide6.QtWidgets import QTreeView, QApplication, QHeaderView
+from PySide6.QtCore import QAbstractItemModel, QModelIndex, QObject, Qt, QFileInfo
+
+
+class TreeItem:
+ """A Json item corresponding to a line in QTreeView"""
+
+ def __init__(self, parent: "TreeItem" = None):
+ self._parent = parent
+ self._key = ""
+ self._value = ""
+ self._value_type = None
+ self._children = []
+
+ def appendChild(self, item: "TreeItem"):
+ """Add item as a child"""
+ self._children.append(item)
+
+ def child(self, row: int) -> "TreeItem":
+ """Return the child of the current item from the given row"""
+ return self._children[row]
+
+ def parent(self) -> "TreeItem":
+ """Return the parent of the current item"""
+ return self._parent
+
+ def childCount(self) -> int:
+ """Return the number of children of the current item"""
+ return len(self._children)
+
+ def row(self) -> int:
+ """Return the row where the current item occupies in the parent"""
+ return self._parent._children.index(self) if self._parent else 0
+
+ @property
+ def key(self) -> str:
+ """Return the key name"""
+ return self._key
+
+ @key.setter
+ def key(self, key: str):
+ """Set key name of the current item"""
+ self._key = key
+
+ @property
+ def value(self) -> str:
+ """Return the value name of the current item"""
+ return self._value
+
+ @value.setter
+ def value(self, value: str):
+ """Set value name of the current item"""
+ self._value = value
+
+ @property
+ def value_type(self):
+ """Return the python type of the item's value."""
+ return self._value_type
+
+ @value_type.setter
+ def value_type(self, value):
+ """Set the python type of the item's value."""
+ self._value_type = value
+
+ @classmethod
+ def load(
+ cls, value: Union[List, Dict], parent: "TreeItem" = None, sort=True
+ ) -> "TreeItem":
+ """Create a 'root' TreeItem from a nested list or a nested dictonary
+
+ Examples:
+ with open("file.json") as file:
+ data = json.dump(file)
+ root = TreeItem.load(data)
+
+ This method is a recursive function that calls itself.
+
+ Returns:
+ TreeItem: TreeItem
+ """
+ rootItem = TreeItem(parent)
+ rootItem.key = "root"
+
+ if isinstance(value, dict):
+ items = sorted(value.items()) if sort else value.items()
+
+ for key, value in items:
+ child = cls.load(value, rootItem)
+ child.key = key
+ child.value_type = type(value)
+ rootItem.appendChild(child)
+
+ elif isinstance(value, list):
+ for index, value in enumerate(value):
+ child = cls.load(value, rootItem)
+ child.key = index
+ child.value_type = type(value)
+ rootItem.appendChild(child)
+
+ else:
+ rootItem.value = value
+ rootItem.value_type = type(value)
+
+ return rootItem
+
+
+class JsonModel(QAbstractItemModel):
+ """ An editable model of Json data """
+
+ def __init__(self, parent: QObject = None):
+ super().__init__(parent)
+
+ self._rootItem = TreeItem()
+ self._headers = ("key", "value")
+
+ def clear(self):
+ """ Clear data from the model """
+ self.load({})
+
+ def load(self, document: dict):
+ """Load model from a nested dictionary returned by json.loads()
+
+ Arguments:
+ document (dict): JSON-compatible dictionary
+ """
+
+ assert isinstance(
+ document, (dict, list, tuple)
+ ), "`document` must be of dict, list or tuple, " f"not {type(document)}"
+
+ self.beginResetModel()
+
+ self._rootItem = TreeItem.load(document)
+ self._rootItem.value_type = type(document)
+
+ self.endResetModel()
+
+ return True
+
+ def data(self, index: QModelIndex, role: Qt.ItemDataRole) -> Any:
+ """Override from QAbstractItemModel
+
+ Return data from a json item according index and role
+
+ """
+ if not index.isValid():
+ return None
+
+ item = index.internalPointer()
+
+ if role == Qt.DisplayRole:
+ if index.column() == 0:
+ return item.key
+
+ if index.column() == 1:
+ return item.value
+
+ elif role == Qt.EditRole:
+ if index.column() == 1:
+ return item.value
+
+ def setData(self, index: QModelIndex, value: Any, role: Qt.ItemDataRole):
+ """Override from QAbstractItemModel
+
+ Set json item according index and role
+
+ Args:
+ index (QModelIndex)
+ value (Any)
+ role (Qt.ItemDataRole)
+
+ """
+ if role == Qt.EditRole:
+ if index.column() == 1:
+ item = index.internalPointer()
+ item.value = str(value)
+
+ self.dataChanged.emit(index, index, [Qt.EditRole])
+
+ return True
+
+ return False
+
+ def headerData(
+ self, section: int, orientation: Qt.Orientation, role: Qt.ItemDataRole
+ ):
+ """Override from QAbstractItemModel
+
+ For the JsonModel, it returns only data for columns (orientation = Horizontal)
+
+ """
+ if role != Qt.DisplayRole:
+ return None
+
+ if orientation == Qt.Horizontal:
+ return self._headers[section]
+
+ def index(self, row: int, column: int, parent=QModelIndex()) -> QModelIndex:
+ """Override from QAbstractItemModel
+
+ Return index according row, column and parent
+
+ """
+ if not self.hasIndex(row, column, parent):
+ return QModelIndex()
+
+ if not parent.isValid():
+ parentItem = self._rootItem
+ else:
+ parentItem = parent.internalPointer()
+
+ childItem = parentItem.child(row)
+ if childItem:
+ return self.createIndex(row, column, childItem)
+ else:
+ return QModelIndex()
+
+ def parent(self, index: QModelIndex) -> QModelIndex:
+ """Override from QAbstractItemModel
+
+ Return parent index of index
+
+ """
+
+ if not index.isValid():
+ return QModelIndex()
+
+ childItem = index.internalPointer()
+ parentItem = childItem.parent()
+
+ if parentItem == self._rootItem:
+ return QModelIndex()
+
+ return self.createIndex(parentItem.row(), 0, parentItem)
+
+ def rowCount(self, parent=QModelIndex()):
+ """Override from QAbstractItemModel
+
+ Return row count from parent index
+ """
+ if parent.column() > 0:
+ return 0
+
+ if not parent.isValid():
+ parentItem = self._rootItem
+ else:
+ parentItem = parent.internalPointer()
+
+ return parentItem.childCount()
+
+ def columnCount(self, parent=QModelIndex()):
+ """Override from QAbstractItemModel
+
+ Return column number. For the model, it always return 2 columns
+ """
+ return 2
+
+ def flags(self, index: QModelIndex) -> Qt.ItemFlags:
+ """Override from QAbstractItemModel
+
+ Return flags of index
+ """
+ flags = super(JsonModel, self).flags(index)
+
+ if index.column() == 1:
+ return Qt.ItemIsEditable | flags
+ else:
+ return flags
+
+ def to_json(self, item=None):
+
+ if item is None:
+ item = self._rootItem
+
+ nchild = item.childCount()
+
+ if item.value_type is dict:
+ document = {}
+ for i in range(nchild):
+ ch = item.child(i)
+ document[ch.key] = self.to_json(ch)
+ return document
+
+ elif item.value_type == list:
+ document = []
+ for i in range(nchild):
+ ch = item.child(i)
+ document.append(self.to_json(ch))
+ return document
+
+ else:
+ return item.value
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+ view = QTreeView()
+ model = JsonModel()
+
+ view.setModel(model)
+
+ json_path = QFileInfo(__file__).absoluteDir().filePath("example.json")
+
+ with open(json_path) as file:
+ document = json.load(file)
+ model.load(document)
+
+ view.show()
+ view.header().setSectionResizeMode(0, QHeaderView.Stretch)
+ view.setAlternatingRowColors(True)
+ view.resize(500, 300)
+ app.exec()
diff --git a/examples/widgets/itemviews/jsonmodel/jsonmodel.pyproject b/examples/widgets/itemviews/jsonmodel/jsonmodel.pyproject
new file mode 100644
index 000000000..7d551b31c
--- /dev/null
+++ b/examples/widgets/itemviews/jsonmodel/jsonmodel.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["jsonmodel.py", "example.json"]
+}
diff --git a/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst b/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst
new file mode 100644
index 000000000..12e505207
--- /dev/null
+++ b/examples/widgets/itemviews/spinboxdelegate/doc/spinboxdelegate.rst
@@ -0,0 +1,5 @@
+SpinBox Delegate Example
+=========================
+
+A simple example that shows how a view can use a custom delegate to edit
+data obtained from a model.
diff --git a/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py
new file mode 100644
index 000000000..577f0faa5
--- /dev/null
+++ b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.py
@@ -0,0 +1,79 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtWidgets import (QApplication, QStyledItemDelegate, QSpinBox,
+ QTableView)
+from PySide6.QtGui import QStandardItemModel, Qt
+from PySide6.QtCore import QModelIndex
+
+"""PySide6 port of the widgets/itemviews/spinboxdelegate from Qt v6.x"""
+
+
+#! [0]
+class SpinBoxDelegate(QStyledItemDelegate):
+ """A delegate that allows the user to change integer values from the model
+ using a spin box widget. """
+
+#! [0]
+ def __init__(self, parent=None):
+ super().__init__(parent)
+#! [0]
+
+#! [1]
+ def createEditor(self, parent, option, index):
+ editor = QSpinBox(parent)
+ editor.setFrame(False)
+ editor.setMinimum(0)
+ editor.setMaximum(100)
+ return editor
+#! [1]
+
+#! [2]
+ def setEditorData(self, editor, index):
+ value = index.model().data(index, Qt.EditRole)
+ editor.setValue(value)
+#! [2]
+
+#! [3]
+ def setModelData(self, editor, model, index):
+ editor.interpretText()
+ value = editor.value()
+ model.setData(index, value, Qt.EditRole)
+#! [3]
+
+#! [4]
+ def updateEditorGeometry(self, editor, option, index):
+ editor.setGeometry(option.rect)
+#! [4]
+
+
+#! [main0]
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ model = QStandardItemModel(4, 2)
+ tableView = QTableView()
+ tableView.setModel(model)
+
+ delegate = SpinBoxDelegate()
+ tableView.setItemDelegate(delegate)
+#! [main0]
+
+ tableView.horizontalHeader().setStretchLastSection(True)
+
+#! [main1]
+ for row in range(4):
+ for column in range(2):
+ index = model.index(row, column, QModelIndex())
+ value = (row + 1) * (column + 1)
+ model.setData(index, value)
+#! [main1] //# [main2]
+#! [main2]
+
+#! [main3]
+ tableView.setWindowTitle("Spin Box Delegate")
+ tableView.show()
+ sys.exit(app.exec())
+#! [main3]
diff --git a/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.pyproject b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.pyproject
new file mode 100644
index 000000000..70616905c
--- /dev/null
+++ b/examples/widgets/itemviews/spinboxdelegate/spinboxdelegate.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["spinboxdelegate.py"]
+}
diff --git a/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.png b/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.png
new file mode 100644
index 000000000..ae7dde24b
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.png
Binary files differ
diff --git a/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.rst b/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.rst
new file mode 100644
index 000000000..c0839b232
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/doc/spreadsheet.rst
@@ -0,0 +1,10 @@
+Spreadsheet example
+===================
+
+The Spreadsheet example shows how a table view can be used to create a simple
+spreadsheet application. Custom delegates are used to render different types of
+data in distinctive colors.
+
+.. image:: spreadsheet.png
+ :width: 400
+ :alt: Spreadsheet screenshot
diff --git a/examples/widgets/itemviews/spreadsheet/main.py b/examples/widgets/itemviews/spreadsheet/main.py
new file mode 100644
index 000000000..0ecc5ec23
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/main.py
@@ -0,0 +1,19 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtGui import QPixmap
+from PySide6.QtWidgets import QApplication, QLayout
+
+from spreadsheet import SpreadSheet
+
+if __name__ == "__main__":
+ app = QApplication()
+
+ sheet = SpreadSheet(10, 6)
+ sheet.setWindowIcon(QPixmap(":/images/interview.png"))
+ sheet.show()
+ sheet.layout().setSizeConstraint(QLayout.SetFixedSize)
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/spreadsheet/spreadsheet.py b/examples/widgets/itemviews/spreadsheet/spreadsheet.py
new file mode 100644
index 000000000..82ebe5ebb
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/spreadsheet.py
@@ -0,0 +1,544 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import QPoint, Qt, QCoreApplication, Slot
+from PySide6.QtGui import QAction, QBrush, QPixmap, QColor, QPainter
+from PySide6.QtWidgets import (QColorDialog, QComboBox, QDialog, QFontDialog,
+ QGroupBox, QHBoxLayout, QMainWindow, QLabel,
+ QLineEdit, QMessageBox, QPushButton, QToolBar,
+ QTableWidgetItem, QTableWidget, QVBoxLayout, QWidget)
+
+from spreadsheetdelegate import SpreadSheetDelegate
+from spreadsheetitem import SpreadSheetItem
+
+from typing import Optional
+from numbers import Number
+
+
+class SpreadSheet(QMainWindow):
+ def __init__(self, rows: Number, cols: Number, parent: Optional[QWidget] = None) -> None:
+ super().__init__(parent)
+
+ self._tool_bar = QToolBar(self)
+ self._color_action = QAction()
+ self._font_action = QAction()
+ self._first_separator = QAction()
+ self._cell_sum_action = QAction()
+ self._cell_add_action = QAction()
+ self._cell_sub_action = QAction()
+ self._cell_mul_action = QAction()
+ self._cell_div_action = QAction()
+ self._second_separator = QAction()
+ self._clear_action = QAction()
+ self._about_spreadsheet = QAction()
+ self._exit_action = QAction()
+
+ # self._print_action = QAction()
+
+ self._cell_label = QLabel(self._tool_bar)
+ self._table = QTableWidget(rows, cols, self)
+ self._formula_input = QLineEdit(self)
+
+ self.addToolBar(self._tool_bar)
+
+ self._cell_label.setMinimumSize(80, 0)
+
+ self._tool_bar.addWidget(self._cell_label)
+ self._tool_bar.addWidget(self._formula_input)
+
+ self._table.setSizeAdjustPolicy(QTableWidget.SizeAdjustPolicy.AdjustToContents)
+ for c in range(cols):
+ character = chr(ord('A') + c)
+ self._table.setHorizontalHeaderItem(c, QTableWidgetItem(character))
+
+ self._table.setItemPrototype(self._table.item(rows - 1, cols - 1))
+ self._table.setItemDelegate(SpreadSheetDelegate())
+
+ self.create_actions()
+ self.update_color(None)
+ self.setup_menu_bar()
+ self.setup_contents()
+ self.setup_context_menu()
+ self.setCentralWidget(self._table)
+
+ self.statusBar()
+ self._table.currentItemChanged.connect(self.update_status)
+ self._table.currentItemChanged.connect(self.update_color)
+ self._table.currentItemChanged.connect(self.update_line_edit)
+ self._table.itemChanged.connect(self.update_status)
+ self._formula_input.returnPressed.connect(self.return_pressed)
+ self._table.itemChanged.connect(self.update_line_edit)
+
+ self.setWindowTitle("Spreadsheet")
+
+ def create_actions(self) -> None:
+ self._cell_sum_action = QAction("Sum", self)
+ self._cell_sum_action.triggered.connect(self.action_sum)
+
+ self._cell_add_action = QAction("&Add", self)
+ self._cell_add_action.setShortcut(Qt.CTRL | Qt.Key_Plus)
+ self._cell_add_action.triggered.connect(self.action_add)
+
+ self._cell_sub_action = QAction("&Subtract", self)
+ self._cell_sub_action.setShortcut(Qt.CTRL | Qt.Key_Minus)
+ self._cell_sub_action.triggered.connect(self.action_subtract)
+
+ self._cell_mul_action = QAction("&Multiply", self)
+ self._cell_mul_action.setShortcut(Qt.CTRL | Qt.Key_multiply)
+ self._cell_mul_action.triggered.connect(self.action_multiply)
+
+ self._cell_div_action = QAction("&Divide", self)
+ self._cell_div_action.setShortcut(Qt.CTRL | Qt.Key_division)
+ self._cell_div_action.triggered.connect(self.action_divide)
+
+ self._font_action = QAction("Font...", self)
+ self._font_action.setShortcut(Qt.CTRL | Qt.Key_F)
+ self._font_action.triggered.connect(self.select_font)
+
+ self._color_action = QAction(QPixmap(16, 16), "Background &Color...", self)
+ self._color_action.triggered.connect(self.select_color)
+
+ self._clear_action = QAction("Clear", self)
+ self._clear_action.setShortcut(Qt.Key_Delete)
+ self._clear_action.triggered.connect(self.clear)
+
+ self._about_spreadsheet = QAction("About Spreadsheet", self)
+ self._about_spreadsheet.triggered.connect(self.show_about)
+
+ self._exit_action = QAction("E&xit", self)
+ self._exit_action.triggered.connect(QCoreApplication.quit)
+
+ self._first_separator = QAction(self)
+ self._first_separator.setSeparator(True)
+
+ self._second_separator = QAction(self)
+ self._second_separator.setSeparator(True)
+
+ def setup_menu_bar(self) -> None:
+ file_menu = self.menuBar().addMenu("&File")
+ # file_menu.addAction(self._print_action)
+ file_menu.addAction(self._exit_action)
+
+ cell_menu = self.menuBar().addMenu("&Cell")
+ cell_menu.addAction(self._cell_add_action)
+ cell_menu.addAction(self._cell_sub_action)
+ cell_menu.addAction(self._cell_mul_action)
+ cell_menu.addAction(self._cell_div_action)
+ cell_menu.addAction(self._cell_sum_action)
+ cell_menu.addSeparator()
+ cell_menu.addAction(self._color_action)
+ cell_menu.addAction(self._font_action)
+
+ self.menuBar().addSeparator()
+
+ about_menu = self.menuBar().addMenu("&Help")
+ about_menu.addAction(self._about_spreadsheet)
+
+ @Slot(QTableWidgetItem)
+ def update_status(self, item: QTableWidgetItem) -> None:
+ if item and item == self._table.currentItem():
+ self.statusBar().showMessage(str(item.data(Qt.StatusTipRole)), 1000)
+ self._cell_label.setText(
+ "Cell: ({})".format(
+ SpreadSheetItem.encode_pos(self._table.row(item), self._table.column(item))
+ )
+ )
+
+ @Slot(QTableWidgetItem)
+ def update_color(self, item: QTableWidgetItem) -> None:
+ pix = QPixmap(16, 16)
+ col = QColor()
+ if item:
+ col = item.background().color()
+ if not col.isValid():
+ col = self.palette().base().color()
+
+ pt = QPainter(pix)
+ pt.fillRect(0, 0, 16, 16, col)
+
+ lighter = col.lighter()
+ pt.setPen(lighter)
+ light_frame = [QPoint(0, 15), QPoint(0, 0), QPoint(15, 0)]
+ pt.drawPolyline(light_frame)
+
+ pt.setPen(col.darker())
+ darkFrame = [QPoint(1, 15), QPoint(15, 15), QPoint(15, 1)]
+ pt.drawPolyline(darkFrame)
+
+ pt.end()
+
+ self._color_action.setIcon(pix)
+
+ @Slot(QTableWidgetItem)
+ def update_line_edit(self, item: QTableWidgetItem) -> None:
+ if item != self._table.currentItem():
+ return
+ if item:
+ self._formula_input.setText(str(item.data(Qt.EditRole)))
+ else:
+ self._formula_input.clear()
+
+ @Slot()
+ def return_pressed(self) -> None:
+ text = self._formula_input.text()
+ row = self._table.currentRow()
+ col = self._table.currentColumn()
+ item = self._table.item(row, col)
+ if not item:
+ self._table.setItem(row, col, SpreadSheetItem(text))
+ else:
+ item.setData(Qt.EditRole, text)
+ self._table.viewport().update()
+
+ @Slot()
+ def select_color(self) -> None:
+ item = self._table.currentItem()
+ col = item.background().color() if item else self._table.palette().base().color()
+ col = QColorDialog.getColor(col, self)
+ if not col.isValid():
+ return
+
+ selected = self._table.selectedItems()
+ if not selected:
+ return
+
+ for i in selected:
+ if i:
+ i.setBackground(col)
+
+ self.update_color(self._table.currentItem())
+
+ @Slot()
+ def select_font(self) -> None:
+ selected = self._table.selectedItems()
+ if not selected:
+ return
+
+ ok = False
+ fnt = QFontDialog.getFont(ok, self.font(), self)
+
+ if not ok:
+ return
+ for i in selected:
+ if i:
+ i.setFont(fnt)
+
+ def run_input_dialog(self, title: str, c1Text: str, c2Text: str, opText: str,
+ outText: str, cell1: str, cell2: str, outCell: str) -> bool:
+ rows, cols = [], []
+ for c in range(self._table.columnCount()):
+ cols.append(chr(ord('A') + c))
+ for r in range(self._table.rowCount()):
+ rows.append(str(1 + r))
+
+ add_dialog = QDialog(self)
+ add_dialog.setWindowTitle(title)
+
+ group = QGroupBox(title, add_dialog)
+ group.setMinimumSize(250, 100)
+
+ cell1_label = QLabel(c1Text, group)
+ cell1_row_input = QComboBox(group)
+ c1_row, c1_col = SpreadSheetItem.decode_pos(cell1)
+ cell1_row_input.addItems(rows)
+ cell1_row_input.setCurrentIndex(c1_row)
+
+ cell1_col_input = QComboBox(group)
+ cell1_col_input.addItems(cols)
+ cell1_col_input.setCurrentIndex(c1_col)
+
+ operator_label = QLabel(opText, group)
+ operator_label.setAlignment(Qt.AlignHCenter)
+
+ cell2_label = QLabel(c2Text, group)
+ cell2_row_input = QComboBox(group)
+ c2_row, c2_col = SpreadSheetItem.decode_pos(cell2)
+ cell2_row_input.addItems(rows)
+ cell2_row_input.setCurrentIndex(c2_row)
+ cell2_col_input = QComboBox(group)
+ cell2_col_input.addItems(cols)
+ cell2_col_input.setCurrentIndex(c2_col)
+
+ equals_label = QLabel("=", group)
+ equals_label.setAlignment(Qt.AlignHCenter)
+
+ out_label = QLabel(outText, group)
+ out_row_input = QComboBox(group)
+ out_row, out_col = SpreadSheetItem.decode_pos(outCell)
+ out_row_input.addItems(rows)
+ out_row_input.setCurrentIndex(out_row)
+ out_col_input = QComboBox(group)
+ out_col_input.addItems(cols)
+ out_col_input.setCurrentIndex(out_col)
+
+ cancel_button = QPushButton("Cancel", add_dialog)
+ cancel_button.clicked.connect(add_dialog.reject)
+
+ ok_button = QPushButton("OK", add_dialog)
+ ok_button.setDefault(True)
+ ok_button.clicked.connect(add_dialog.accept)
+
+ buttons_layout = QHBoxLayout()
+ buttons_layout.addStretch(1)
+ buttons_layout.addWidget(ok_button)
+ buttons_layout.addSpacing(10)
+ buttons_layout.addWidget(cancel_button)
+
+ dialog_layout = QVBoxLayout(add_dialog)
+ dialog_layout.addWidget(group)
+ dialog_layout.addStretch(1)
+ dialog_layout.addItem(buttons_layout)
+
+ cell1_layout = QHBoxLayout()
+ cell1_layout.addWidget(cell1_label)
+ cell1_layout.addSpacing(10)
+ cell1_layout.addWidget(cell1_col_input)
+ cell1_layout.addSpacing(10)
+ cell1_layout.addWidget(cell1_row_input)
+
+ cell2_layout = QHBoxLayout()
+ cell2_layout.addWidget(cell2_label)
+ cell2_layout.addSpacing(10)
+ cell2_layout.addWidget(cell2_col_input)
+ cell2_layout.addSpacing(10)
+ cell2_layout.addWidget(cell2_row_input)
+
+ out_layout = QHBoxLayout()
+ out_layout.addWidget(out_label)
+ out_layout.addSpacing(10)
+ out_layout.addWidget(out_col_input)
+ out_layout.addSpacing(10)
+ out_layout.addWidget(out_row_input)
+
+ v_layout = QVBoxLayout(group)
+ v_layout.addItem(cell1_layout)
+ v_layout.addWidget(operator_label)
+ v_layout.addItem(cell2_layout)
+ v_layout.addWidget(equals_label)
+ v_layout.addStretch(1)
+ v_layout.addItem(out_layout)
+
+ if add_dialog.exec():
+ cell1 = cell1_col_input.currentText() + cell1_row_input.currentText()
+ cell2 = cell2_col_input.currentText() + cell2_row_input.currentText()
+ outCell = out_col_input.currentText() + out_row_input.currentText()
+ return True
+
+ return False
+
+ @Slot()
+ def action_sum(self) -> None:
+ row_first = row_last = row_cur = 0
+ col_first = col_last = col_cur = 0
+
+ selected = self._table.selectedItems()
+
+ if selected is not None:
+ first = selected[0]
+ last = selected[-1]
+ row_first = self._table.row(first)
+ row_last = self._table.row(last)
+ col_first = self._table.column(first)
+ col_last = self._table.column(last)
+
+ current = self._table.currentItem()
+
+ if current:
+ row_cur = self._table.row(current)
+ col_cur = self._table.column(current)
+
+ cell1 = SpreadSheetItem.encode_pos(row_first, col_first)
+ cell2 = SpreadSheetItem.encode_pos(row_last, col_last)
+ out = SpreadSheetItem.encode_pos(row_cur, col_cur)
+
+ if self.run_input_dialog(
+ "Sum cells", "First cell:", "Last cell:",
+ f"{(chr(0x03a3))}", "Output to:",
+ cell1, cell2, out
+ ):
+ row, col = SpreadSheetItem.decode_pos(out)
+ self._table.item(row, col).setText(f"sum {cell1} {cell2}")
+
+ def action_math_helper(self, title: str, op: str) -> None:
+ cell1 = "C1"
+ cell2 = "C2"
+ out = "C3"
+
+ current = self._table.currentItem()
+ if current:
+ out = SpreadSheetItem.encode_pos(self._table.currentRow(), self._table.currentColumn())
+
+ if self.run_input_dialog(title, "Cell 1", "Cell 2", op, "Output to:", cell1, cell2, out):
+ row, col = SpreadSheetItem.decode_pos(out)
+ self._table.item(row, col).setText(f"{op} {cell1} {cell2}")
+
+ @Slot()
+ def action_add(self) -> None:
+ self.action_math_helper("Addition", "+")
+
+ @Slot()
+ def action_subtract(self) -> None:
+ self.action_math_helper("Subtraction", "-")
+
+ @Slot()
+ def action_multiply(self) -> None:
+ self.action_math_helper("Multiplication", "*")
+
+ @Slot()
+ def action_divide(self) -> None:
+ self.action_math_helper("Division", "/")
+
+ @Slot()
+ def clear(self) -> None:
+ selected_items = self._table.selectedItems()
+ for item in selected_items:
+ item.setText("")
+
+ def setup_context_menu(self) -> None:
+ self.addAction(self._cell_add_action)
+ self.addAction(self._cell_sub_action)
+ self.addAction(self._cell_mul_action)
+ self.addAction(self._cell_div_action)
+ self.addAction(self._cell_sum_action)
+ self.addAction(self._first_separator)
+ self.addAction(self._color_action)
+ self.addAction(self._font_action)
+ self.addAction(self._second_separator)
+ self.addAction(self._clear_action)
+ self.setContextMenuPolicy(Qt.ActionsContextMenu)
+
+ def setup_contents(self) -> None:
+ title_background = QBrush(Qt.lightGray)
+ title_font = self._table.font()
+ title_font.setBold(True)
+
+ # column 0
+ self._table.setItem(0, 0, SpreadSheetItem("Item"))
+ self._table.item(0, 0).setBackground(title_background)
+ self._table.item(0, 0).setToolTip(
+ "This column shows the purchased item/service"
+ )
+ self._table.item(0, 0).setFont(title_font)
+
+ self._table.setItem(1, 0, SpreadSheetItem("AirportBus"))
+ self._table.setItem(2, 0, SpreadSheetItem("Flight (Munich)"))
+ self._table.setItem(3, 0, SpreadSheetItem("Lunch"))
+ self._table.setItem(4, 0, SpreadSheetItem("Flight (LA)"))
+ self._table.setItem(5, 0, SpreadSheetItem("Taxi"))
+ self._table.setItem(6, 0, SpreadSheetItem("Dinner"))
+ self._table.setItem(7, 0, SpreadSheetItem("Hotel"))
+ self._table.setItem(8, 0, SpreadSheetItem("Flight (Oslo)"))
+ self._table.setItem(9, 0, SpreadSheetItem("Total:"))
+
+ self._table.item(9, 0).setFont(title_font)
+ self._table.item(9, 0).setBackground(title_background)
+
+ # column 1
+ self._table.setItem(0, 1, SpreadSheetItem("Date"))
+ self._table.item(0, 1).setBackground(title_background)
+ self._table.item(0, 1).setToolTip(
+ "This column shows the purchase date, double click to change"
+ )
+ self._table.item(0, 1).setFont(title_font)
+
+ self._table.setItem(1, 1, SpreadSheetItem("15/6/2006"))
+ self._table.setItem(2, 1, SpreadSheetItem("15/6/2006"))
+ self._table.setItem(3, 1, SpreadSheetItem("15/6/2006"))
+ self._table.setItem(4, 1, SpreadSheetItem("21/5/2006"))
+ self._table.setItem(5, 1, SpreadSheetItem("16/6/2006"))
+ self._table.setItem(6, 1, SpreadSheetItem("16/6/2006"))
+ self._table.setItem(7, 1, SpreadSheetItem("16/6/2006"))
+ self._table.setItem(8, 1, SpreadSheetItem("18/6/2006"))
+
+ self._table.setItem(9, 1, SpreadSheetItem())
+ self._table.item(9, 1).setBackground(title_background)
+
+ # column 2
+ self._table.setItem(0, 2, SpreadSheetItem("Price"))
+ self._table.item(0, 2).setBackground(title_background)
+ self._table.item(0, 2).setToolTip("This column shows the price of the purchase")
+ self._table.item(0, 2).setFont(title_font)
+
+ self._table.setItem(1, 2, SpreadSheetItem("150"))
+ self._table.setItem(2, 2, SpreadSheetItem("2350"))
+ self._table.setItem(3, 2, SpreadSheetItem("-14"))
+ self._table.setItem(4, 2, SpreadSheetItem("980"))
+ self._table.setItem(5, 2, SpreadSheetItem("5"))
+ self._table.setItem(6, 2, SpreadSheetItem("120"))
+ self._table.setItem(7, 2, SpreadSheetItem("300"))
+ self._table.setItem(8, 2, SpreadSheetItem("1240"))
+
+ self._table.setItem(9, 2, SpreadSheetItem())
+ self._table.item(9, 2).setBackground(Qt.lightGray)
+
+ # column 3
+ self._table.setItem(0, 3, SpreadSheetItem("Currency"))
+ self._table.item(0, 3).setBackground(title_background)
+ self._table.item(0, 3).setToolTip("This column shows the currency")
+ self._table.item(0, 3).setFont(title_font)
+
+ self._table.setItem(1, 3, SpreadSheetItem("NOK"))
+ self._table.setItem(2, 3, SpreadSheetItem("NOK"))
+ self._table.setItem(3, 3, SpreadSheetItem("EUR"))
+ self._table.setItem(4, 3, SpreadSheetItem("EUR"))
+ self._table.setItem(5, 3, SpreadSheetItem("USD"))
+ self._table.setItem(6, 3, SpreadSheetItem("USD"))
+ self._table.setItem(7, 3, SpreadSheetItem("USD"))
+ self._table.setItem(8, 3, SpreadSheetItem("USD"))
+
+ self._table.setItem(9, 3, SpreadSheetItem())
+ self._table.item(9, 3).setBackground(Qt.lightGray)
+
+ # column 4
+ self._table.setItem(0, 4, SpreadSheetItem("Ex. Rate"))
+ self._table.item(0, 4).setBackground(title_background)
+ self._table.item(0, 4).setToolTip("This column shows the exchange rate to NOK")
+ self._table.item(0, 4).setFont(title_font)
+
+ self._table.setItem(1, 4, SpreadSheetItem("1"))
+ self._table.setItem(2, 4, SpreadSheetItem("1"))
+ self._table.setItem(3, 4, SpreadSheetItem("8"))
+ self._table.setItem(4, 4, SpreadSheetItem("8"))
+ self._table.setItem(5, 4, SpreadSheetItem("7"))
+ self._table.setItem(6, 4, SpreadSheetItem("7"))
+ self._table.setItem(7, 4, SpreadSheetItem("7"))
+ self._table.setItem(8, 4, SpreadSheetItem("7"))
+
+ self._table.setItem(9, 4, SpreadSheetItem())
+ self._table.item(9, 4).setBackground(title_background)
+
+ # column 5
+ self._table.setItem(0, 5, SpreadSheetItem("NOK"))
+ self._table.item(0, 5).setBackground(title_background)
+ self._table.item(0, 5).setToolTip("This column shows the expenses in NOK")
+ self._table.item(0, 5).setFont(title_font)
+
+ self._table.setItem(1, 5, SpreadSheetItem("* C2 E2"))
+ self._table.setItem(2, 5, SpreadSheetItem("* C3 E3"))
+ self._table.setItem(3, 5, SpreadSheetItem("* C4 E4"))
+ self._table.setItem(4, 5, SpreadSheetItem("* C5 E5"))
+ self._table.setItem(5, 5, SpreadSheetItem("* C6 E6"))
+ self._table.setItem(6, 5, SpreadSheetItem("* C7 E7"))
+ self._table.setItem(7, 5, SpreadSheetItem("* C8 E8"))
+ self._table.setItem(8, 5, SpreadSheetItem("* C9 E9"))
+
+ self._table.setItem(9, 5, SpreadSheetItem("sum F2 F9"))
+ self._table.item(9, 5).setBackground(title_background)
+
+ @Slot()
+ def show_about(self) -> None:
+ html_text = (
+ "<HTML>"
+ "<p><b>This demo shows use of <c>QTableWidget</c> with custom handling for"
+ " individual cells.</b></p>"
+ "<p>Using a customized table item we make it possible to have dynamic"
+ " output in different cells. The content that is implemented for this"
+ " particular demo is:"
+ "<ul>"
+ "<li>Adding two cells.</li>"
+ "<li>Subtracting one cell from another.</li>"
+ "<li>Multiplying two cells.</li>"
+ "<li>Dividing one cell with another.</li>"
+ "<li>Summing the contents of an arbitrary number of cells.</li>"
+ "</HTML>")
+ QMessageBox.about(self, "About Spreadsheet", html_text)
diff --git a/examples/widgets/itemviews/spreadsheet/spreadsheetdelegate.py b/examples/widgets/itemviews/spreadsheet/spreadsheetdelegate.py
new file mode 100644
index 000000000..57aba6f47
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/spreadsheetdelegate.py
@@ -0,0 +1,67 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import (QAbstractItemModel, QDate, QModelIndex, QObject,
+ QStringListModel, Qt, Slot)
+from PySide6.QtWidgets import (QCompleter, QDateTimeEdit, QLineEdit,
+ QStyleOptionViewItem, QStyledItemDelegate, QWidget)
+
+from typing import Optional
+
+
+class SpreadSheetDelegate(QStyledItemDelegate):
+ def __init__(self, parent: Optional[QObject] = None) -> None:
+ super().__init__(parent)
+
+ def create_editor(self, parent: QWidget,
+ option: QStyleOptionViewItem,
+ index: QModelIndex) -> QWidget:
+ if index.column() == 1:
+ editor = QDateTimeEdit(parent)
+ editor.setDisplayFormat("dd/M/yyyy")
+ editor.setCalendarPopup(True)
+ return editor
+
+ editor = QLineEdit(parent)
+
+ # create a completer with the strings in the column as model
+ allStrings = QStringListModel()
+ for i in range(1, index.model().rowCount()):
+ strItem = str(index.model().data(index.sibling(i, index.column()), Qt.EditRole))
+
+ if not allStrings.contains(strItem):
+ allStrings.append(strItem)
+
+ autoComplete = QCompleter(allStrings)
+ editor.setCompleter(autoComplete)
+ editor.editingFinished.connect(SpreadSheetDelegate.commit_and_close_editor)
+ return editor
+
+ @Slot()
+ def commit_and_close_editor(self) -> None:
+ editor = self.sender()
+ self.commitData.emit(editor)
+ self.closeEditor.emit(editor)
+
+ def set_editor_data(self, editor: QWidget, index: QModelIndex) -> None:
+ edit = QLineEdit(editor)
+ if edit:
+ edit.setText(str(index.model().data(index, Qt.EditRole)))
+ return
+
+ dateEditor = QDateTimeEdit(editor)
+ if dateEditor:
+ dateEditor.setDate(
+ QDate.fromString(
+ str(index.model().data(index, Qt.EditRole)), "d/M/yyyy"))
+
+ def set_model_data(self, editor: QWidget,
+ model: QAbstractItemModel, index: QModelIndex) -> None:
+ edit = QLineEdit(editor)
+ if edit:
+ model.setData(index, edit.text())
+ return
+
+ dateEditor = QDateTimeEdit(editor)
+ if dateEditor:
+ model.setData(index, dateEditor.date().toString("dd/M/yyyy"))
diff --git a/examples/widgets/itemviews/spreadsheet/spreadsheetitem.py b/examples/widgets/itemviews/spreadsheet/spreadsheetitem.py
new file mode 100644
index 000000000..dc70da883
--- /dev/null
+++ b/examples/widgets/itemviews/spreadsheet/spreadsheetitem.py
@@ -0,0 +1,122 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from typing import Any, Tuple
+from PySide6.QtCore import QMetaType, Qt
+from PySide6.QtWidgets import QTableWidget, QTableWidgetItem
+
+
+class SpreadSheetItem(QTableWidgetItem):
+ is_resolving = False
+
+ def __init_subclass__(cls) -> None:
+ return super().__init_subclass__()
+
+ def data(self, role: int) -> Any:
+ if role == Qt.EditRole or role == Qt.StatusTipRole:
+ return self.formula()
+
+ if role == Qt.DisplayRole:
+ return self.display()
+
+ t = str(self.display())
+
+ if role == Qt.ForegroundRole:
+ try:
+ number = int(t)
+ color = Qt.red if number < 0 else Qt.blue
+ except ValueError:
+ color = Qt.black
+ return color
+
+ if role == Qt.TextAlignmentRole:
+ if t and (t[0].isdigit() or t[0] == '-'):
+ return int(Qt.AlignRight | Qt.AlignVCenter)
+
+ return super().data(role)
+
+ def setData(self, role: int, value: Any) -> None:
+ super().setData(role, value)
+ if self.tableWidget():
+ self.tableWidget().viewport().update()
+
+ def display(self) -> QMetaType.Type.QVariant:
+ # avoid circular dependencies
+ if self.is_resolving:
+ return QMetaType.Type.QVariant
+
+ self.is_resolving = True
+ result = self.compute_formula(self.formula(), self.tableWidget(), self)
+ self.is_resolving = False
+ return result
+
+ def formula(self) -> None:
+ return str(super().data(Qt.DisplayRole))
+
+ def compute_formula(self, formula: str, widget: QTableWidget, this) -> QMetaType.Type.QVariant:
+ # check if the string is actually a formula or not
+ list_ = formula.split(' ')
+ if not list_ or not widget:
+ return formula # it is a normal string
+
+ op = list_[0].lower() if list_[0] else ""
+
+ first_row = -1
+ first_col = -1
+ second_row = -1
+ second_col = -1
+
+ if len(list_) > 1:
+ SpreadSheetItem.decode_pos(list_[1])
+
+ if len(list_) > 2:
+ SpreadSheetItem.decode_pos(list_[2])
+
+ start = widget.item(first_row, first_col)
+ end = widget.item(second_row, second_col)
+
+ first_val = int(start.text()) if start else 0
+ second_val = int(end.text()) if start else 0
+
+ if op == "sum":
+ sum = 0
+ for r in range(first_row, second_row + 1):
+ for c in range(first_col, second_col + 1):
+ table_item = widget.item(r, c)
+ if table_item and table_item != this:
+ sum += int(table_item.text())
+
+ result = sum
+ elif op == "+":
+ result = first_val + second_val
+ elif op == "-":
+ result = first_val - second_val
+ elif op == "*":
+ result = first_val * second_val
+ elif op == "/":
+ if second_val == 0:
+ result = "nan"
+ else:
+ result = first_val / second_val
+ elif op == "=":
+ if start:
+ result = start.text()
+ else:
+ result = formula
+
+ return result
+
+ def decode_pos(pos: str) -> Tuple[int, int]:
+ if (not pos):
+ col = -1
+ row = -1
+ else:
+ col = ord(pos[0].encode("latin1")) - ord('A')
+ try:
+ row = int(pos[1:]) - 1
+ except ValueError:
+ row = -1
+ return row, col
+
+ def encode_pos(row: int, col: int) -> str:
+ return str(chr(col + ord('A'))) + str(row + 1)
diff --git a/examples/widgets/itemviews/stardelegate/doc/stardelegate.png b/examples/widgets/itemviews/stardelegate/doc/stardelegate.png
new file mode 100644
index 000000000..343416397
--- /dev/null
+++ b/examples/widgets/itemviews/stardelegate/doc/stardelegate.png
Binary files differ
diff --git a/examples/widgets/itemviews/stardelegate/doc/stardelegate.rst b/examples/widgets/itemviews/stardelegate/doc/stardelegate.rst
new file mode 100644
index 000000000..fe8a2732a
--- /dev/null
+++ b/examples/widgets/itemviews/stardelegate/doc/stardelegate.rst
@@ -0,0 +1,10 @@
+Star Delegate Example
+=====================
+
+Demonstrates Qt's itemview architecture
+
+This example demonstrates the Qt model view architecture.
+
+.. image:: stardelegate.png
+ :width: 400
+ :alt: Star Delegate Screenshot
diff --git a/examples/widgets/itemviews/stardelegate/stardelegate.py b/examples/widgets/itemviews/stardelegate/stardelegate.py
index 86fd99ce6..973eb14f6 100644
--- a/examples/widgets/itemviews/stardelegate/stardelegate.py
+++ b/examples/widgets/itemviews/stardelegate/stardelegate.py
@@ -1,58 +1,21 @@
+# Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import QStyledItemDelegate, QStyle
+from PySide6.QtWidgets import QStyledItemDelegate, QStyle
from starrating import StarRating
from stareditor import StarEditor
+
class StarDelegate(QStyledItemDelegate):
""" A subclass of QStyledItemDelegate that allows us to render our
pretty star ratings.
"""
def __init__(self, parent=None):
- super(StarDelegate, self).__init__(parent)
+ super().__init__(parent)
def paint(self, painter, option, index):
""" Paint the items in the table.
@@ -66,7 +29,7 @@ class StarDelegate(QStyledItemDelegate):
it works for the purposes of this example.
"""
if index.column() == 3:
- starRating = StarRating(index.data())
+ star_rating = StarRating(index.data())
# If the row is currently selected, we need to make sure we
# paint the background accordingly.
@@ -85,15 +48,15 @@ class StarDelegate(QStyledItemDelegate):
# Now that we've painted the background, call starRating.paint()
# to paint the stars.
- starRating.paint(painter, option.rect, option.palette)
+ star_rating.paint(painter, option.rect, option.palette)
else:
QStyledItemDelegate.paint(self, painter, option, index)
def sizeHint(self, option, index):
""" Returns the size needed to display the item in a QSize object. """
if index.column() == 3:
- starRating = StarRating(index.data())
- return starRating.sizeHint()
+ star_rating = StarRating(index.data())
+ return star_rating.sizeHint()
else:
return QStyledItemDelegate.sizeHint(self, option, index)
@@ -107,7 +70,7 @@ class StarDelegate(QStyledItemDelegate):
"""
if index.column() == 3:
editor = StarEditor(parent)
- editor.editingFinished.connect(self.commitAndCloseEditor)
+ editor.editing_finished.connect(self.commit_and_close_editor)
return editor
else:
return QStyledItemDelegate.createEditor(self, parent, option, index)
@@ -115,7 +78,7 @@ class StarDelegate(QStyledItemDelegate):
def setEditorData(self, editor, index):
""" Sets the data to be displayed and edited by our custom editor. """
if index.column() == 3:
- editor.starRating = StarRating(index.data())
+ editor.star_rating = StarRating(index.data())
else:
QStyledItemDelegate.setEditorData(self, editor, index)
@@ -123,11 +86,11 @@ class StarDelegate(QStyledItemDelegate):
""" Get the data from our custom editor and stuffs it into the model.
"""
if index.column() == 3:
- model.setData(index, editor.starRating.starCount)
+ model.setData(index, editor.star_rating.star_count)
else:
QStyledItemDelegate.setModelData(self, editor, model, index)
- def commitAndCloseEditor(self):
+ def commit_and_close_editor(self):
""" Erm... commits the data and closes the editor. :) """
editor = self.sender()
@@ -139,35 +102,35 @@ class StarDelegate(QStyledItemDelegate):
if __name__ == "__main__":
""" Run the application. """
- from PySide2.QtWidgets import (QApplication, QTableWidget, QTableWidgetItem,
+ from PySide6.QtWidgets import (QApplication, QTableWidget, QTableWidgetItem,
QAbstractItemView)
import sys
app = QApplication(sys.argv)
# Create and populate the tableWidget
- tableWidget = QTableWidget(4, 4)
- tableWidget.setItemDelegate(StarDelegate())
- tableWidget.setEditTriggers(QAbstractItemView.DoubleClicked |
- QAbstractItemView.SelectedClicked)
- tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
- tableWidget.setHorizontalHeaderLabels(["Title", "Genre", "Artist", "Rating"])
-
- data = [ ["Mass in B-Minor", "Baroque", "J.S. Bach", 5],
- ["Three More Foxes", "Jazz", "Maynard Ferguson", 4],
- ["Sex Bomb", "Pop", "Tom Jones", 3],
- ["Barbie Girl", "Pop", "Aqua", 5] ]
+ table_widget = QTableWidget(4, 4)
+ table_widget.setItemDelegate(StarDelegate())
+ table_widget.setEditTriggers(QAbstractItemView.DoubleClicked
+ | QAbstractItemView.SelectedClicked)
+ table_widget.setSelectionBehavior(QAbstractItemView.SelectRows)
+ table_widget.setHorizontalHeaderLabels(["Title", "Genre", "Artist", "Rating"])
+
+ data = [["Mass in B-Minor", "Baroque", "J.S. Bach", 5],
+ ["Three More Foxes", "Jazz", "Maynard Ferguson", 4],
+ ["Sex Bomb", "Pop", "Tom Jones", 3],
+ ["Barbie Girl", "Pop", "Aqua", 5]]
for r in range(len(data)):
- tableWidget.setItem(r, 0, QTableWidgetItem(data[r][0]))
- tableWidget.setItem(r, 1, QTableWidgetItem(data[r][1]))
- tableWidget.setItem(r, 2, QTableWidgetItem(data[r][2]))
+ table_widget.setItem(r, 0, QTableWidgetItem(data[r][0]))
+ table_widget.setItem(r, 1, QTableWidgetItem(data[r][1]))
+ table_widget.setItem(r, 2, QTableWidgetItem(data[r][2]))
item = QTableWidgetItem()
- item.setData(0, StarRating(data[r][3]).starCount)
- tableWidget.setItem(r, 3, item)
+ item.setData(0, StarRating(data[r][3]).star_count)
+ table_widget.setItem(r, 3, item)
- tableWidget.resizeColumnsToContents()
- tableWidget.resize(500, 300)
- tableWidget.show()
+ table_widget.resizeColumnsToContents()
+ table_widget.resize(500, 300)
+ table_widget.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/itemviews/stardelegate/stareditor.py b/examples/widgets/itemviews/stardelegate/stareditor.py
index 820aba8bf..296afa950 100644
--- a/examples/widgets/itemviews/stardelegate/stareditor.py
+++ b/examples/widgets/itemviews/stardelegate/stareditor.py
@@ -1,100 +1,62 @@
+# Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import (QWidget)
-from PySide2.QtGui import (QPainter)
-from PySide2.QtCore import Signal
+from PySide6.QtWidgets import (QWidget)
+from PySide6.QtGui import (QPainter)
+from PySide6.QtCore import Signal
from starrating import StarRating
+
class StarEditor(QWidget):
""" The custom editor for editing StarRatings. """
# A signal to tell the delegate when we've finished editing.
- editingFinished = Signal()
+ editing_finished = Signal()
def __init__(self, parent=None):
""" Initialize the editor object, making sure we can watch mouse
events.
"""
- super(StarEditor, self).__init__(parent)
+ super().__init__(parent)
self.setMouseTracking(True)
self.setAutoFillBackground(True)
- self.starRating = StarRating()
+ self.star_rating = StarRating()
def sizeHint(self):
""" Tell the caller how big we are. """
- return self.starRating.sizeHint()
+ return self.star_rating.sizeHint()
def paintEvent(self, event):
""" Paint the editor, offloading the work to the StarRating class. """
- painter = QPainter(self)
- self.starRating.paint(painter, self.rect(), self.palette(), isEditable=True)
+ with QPainter(self) as painter:
+ self.star_rating.paint(painter, self.rect(), self.palette(), isEditable=True)
def mouseMoveEvent(self, event):
""" As the mouse moves inside the editor, track the position and
update the editor to display as many stars as necessary.
"""
- star = self.starAtPosition(event.x())
+ star = self.star_at_position(event.x())
- if (star != self.starRating.starCount) and (star != -1):
- self.starRating.starCount = star
+ if (star != self.star_rating.star_count) and (star != -1):
+ self.star_rating.star_count = star
self.update()
def mouseReleaseEvent(self, event):
""" Once the user has clicked his/her chosen star rating, tell the
delegate we're done editing.
"""
- self.editingFinished.emit()
+ self.editing_finished.emit()
- def starAtPosition(self, x):
+ def star_at_position(self, x):
""" Calculate which star the user's mouse cursor is currently
hovering over.
"""
- star = (x / (self.starRating.sizeHint().width() /
- self.starRating.maxStarCount)) + 1
- if (star <= 0) or (star > self.starRating.maxStarCount):
+ star = (x / (self.star_rating.sizeHint().width() / self.star_rating.MAX_STAR_COUNT)) + 1
+ if (star <= 0) or (star > self.star_rating.MAX_STAR_COUNT):
return -1
return star
diff --git a/examples/widgets/itemviews/stardelegate/starrating.py b/examples/widgets/itemviews/stardelegate/starrating.py
index d40b382f4..28dbacd6f 100644
--- a/examples/widgets/itemviews/stardelegate/starrating.py
+++ b/examples/widgets/itemviews/stardelegate/starrating.py
@@ -1,50 +1,12 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
-## Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2010 Hans-Peter Jansen <hpj@urpla.net>
+# Copyright (C) 2011 Arun Srinivasan <rulfzid@gmail.com>
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
from math import (cos, sin, pi)
-from PySide2.QtGui import (QPainter, QPolygonF)
-from PySide2.QtCore import (QPointF, QSize, Qt)
+from PySide6.QtGui import (QPainter, QPolygonF)
+from PySide6.QtCore import (QPointF, QSize, Qt)
PAINTING_SCALE_FACTOR = 20
@@ -53,26 +15,26 @@ class StarRating(object):
""" Handle the actual painting of the stars themselves. """
def __init__(self, starCount=1, maxStarCount=5):
- self.starCount = starCount
- self.maxStarCount = maxStarCount
+ self.star_count = starCount
+ self.MAX_STAR_COUNT = maxStarCount
# Create the star shape we'll be drawing.
- self.starPolygon = QPolygonF()
- self.starPolygon.append(QPointF(1.0, 0.5))
+ self._star_polygon = QPolygonF()
+ self._star_polygon.append(QPointF(1.0, 0.5))
for i in range(1, 5):
- self.starPolygon.append(QPointF(0.5 + 0.5 * cos(0.8 * i * pi),
- 0.5 + 0.5 * sin(0.8 * i * pi)))
+ self._star_polygon.append(QPointF(0.5 + 0.5 * cos(0.8 * i * pi),
+ 0.5 + 0.5 * sin(0.8 * i * pi)))
# Create the diamond shape we'll show in the editor
- self.diamondPolygon = QPolygonF()
- diamondPoints = [QPointF(0.4, 0.5), QPointF(0.5, 0.4),
- QPointF(0.6, 0.5), QPointF(0.5, 0.6),
- QPointF(0.4, 0.5)]
- self.diamondPolygon.append(diamondPoints)
+ self._diamond_polygon = QPolygonF()
+ diamond_points = [QPointF(0.4, 0.5), QPointF(0.5, 0.4),
+ QPointF(0.6, 0.5), QPointF(0.5, 0.6),
+ QPointF(0.4, 0.5)]
+ self._diamond_polygon.append(diamond_points)
def sizeHint(self):
""" Tell the caller how big we are. """
- return PAINTING_SCALE_FACTOR * QSize(self.maxStarCount, 1)
+ return PAINTING_SCALE_FACTOR * QSize(self.MAX_STAR_COUNT, 1)
def paint(self, painter, rect, palette, isEditable=False):
""" Paint the stars (and/or diamonds if we're in editing mode). """
@@ -86,15 +48,15 @@ class StarRating(object):
else:
painter.setBrush(palette.windowText())
- yOffset = (rect.height() - PAINTING_SCALE_FACTOR) / 2
- painter.translate(rect.x(), rect.y() + yOffset)
+ y_offset = (rect.height() - PAINTING_SCALE_FACTOR) / 2
+ painter.translate(rect.x(), rect.y() + y_offset)
painter.scale(PAINTING_SCALE_FACTOR, PAINTING_SCALE_FACTOR)
- for i in range(self.maxStarCount):
- if i < self.starCount:
- painter.drawPolygon(self.starPolygon, Qt.WindingFill)
+ for i in range(self.MAX_STAR_COUNT):
+ if i < self.star_count:
+ painter.drawPolygon(self._star_polygon, Qt.WindingFill)
elif isEditable:
- painter.drawPolygon(self.diamondPolygon, Qt.WindingFill)
+ painter.drawPolygon(self._diamond_polygon, Qt.WindingFill)
painter.translate(1.0, 0.0)
painter.restore()
diff --git a/examples/widgets/layouts/basiclayouts.py b/examples/widgets/layouts/basiclayouts.py
deleted file mode 100644
index 565ce728d..000000000
--- a/examples/widgets/layouts/basiclayouts.py
+++ /dev/null
@@ -1,134 +0,0 @@
-
-############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/layouts/basiclayout example from Qt v5.x"""
-
-from PySide2 import QtWidgets
-
-
-class Dialog(QtWidgets.QDialog):
- NumGridRows = 3
- NumButtons = 4
-
- def __init__(self):
- super(Dialog, self).__init__()
-
- self.createMenu()
- self.createHorizontalGroupBox()
- self.createGridGroupBox()
- self.createFormGroupBox()
-
- bigEditor = QtWidgets.QTextEdit()
- bigEditor.setPlainText("This widget takes up all the remaining space "
- "in the top-level layout.")
-
- buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
-
- buttonBox.accepted.connect(self.accept)
- buttonBox.rejected.connect(self.reject)
-
- mainLayout = QtWidgets.QVBoxLayout()
- mainLayout.setMenuBar(self.menuBar)
- mainLayout.addWidget(self.horizontalGroupBox)
- mainLayout.addWidget(self.gridGroupBox)
- mainLayout.addWidget(self.formGroupBox)
- mainLayout.addWidget(bigEditor)
- mainLayout.addWidget(buttonBox)
- self.setLayout(mainLayout)
-
- self.setWindowTitle("Basic Layouts")
-
- def createMenu(self):
- self.menuBar = QtWidgets.QMenuBar()
-
- self.fileMenu = QtWidgets.QMenu("&File", self)
- self.exitAction = self.fileMenu.addAction("E&xit")
- self.menuBar.addMenu(self.fileMenu)
-
- self.exitAction.triggered.connect(self.accept)
-
- def createHorizontalGroupBox(self):
- self.horizontalGroupBox = QtWidgets.QGroupBox("Horizontal layout")
- layout = QtWidgets.QHBoxLayout()
-
- for i in range(Dialog.NumButtons):
- button = QtWidgets.QPushButton("Button %d" % (i + 1))
- layout.addWidget(button)
-
- self.horizontalGroupBox.setLayout(layout)
-
- def createGridGroupBox(self):
- self.gridGroupBox = QtWidgets.QGroupBox("Grid layout")
- layout = QtWidgets.QGridLayout()
-
- for i in range(Dialog.NumGridRows):
- label = QtWidgets.QLabel("Line %d:" % (i + 1))
- lineEdit = QtWidgets.QLineEdit()
- layout.addWidget(label, i + 1, 0)
- layout.addWidget(lineEdit, i + 1, 1)
-
- self.smallEditor = QtWidgets.QTextEdit()
- self.smallEditor.setPlainText("This widget takes up about two thirds "
- "of the grid layout.")
-
- layout.addWidget(self.smallEditor, 0, 2, 4, 1)
-
- layout.setColumnStretch(1, 10)
- layout.setColumnStretch(2, 20)
- self.gridGroupBox.setLayout(layout)
-
- def createFormGroupBox(self):
- self.formGroupBox = QtWidgets.QGroupBox("Form layout")
- layout = QtWidgets.QFormLayout()
- layout.addRow(QtWidgets.QLabel("Line 1:"), QtWidgets.QLineEdit())
- layout.addRow(QtWidgets.QLabel("Line 2, long text:"), QtWidgets.QComboBox())
- layout.addRow(QtWidgets.QLabel("Line 3:"), QtWidgets.QSpinBox())
- self.formGroupBox.setLayout(layout)
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- dialog = Dialog()
- sys.exit(dialog.exec_())
diff --git a/examples/widgets/layouts/basiclayouts/basiclayouts.py b/examples/widgets/layouts/basiclayouts/basiclayouts.py
new file mode 100644
index 000000000..827cb7850
--- /dev/null
+++ b/examples/widgets/layouts/basiclayouts/basiclayouts.py
@@ -0,0 +1,98 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/layouts/basiclayout example from Qt v5.x"""
+
+import sys
+
+from PySide6.QtWidgets import (QApplication, QComboBox, QDialog,
+ QDialogButtonBox, QGridLayout, QGroupBox,
+ QFormLayout, QHBoxLayout, QLabel, QLineEdit,
+ QMenu, QMenuBar, QPushButton, QSpinBox,
+ QTextEdit, QVBoxLayout)
+
+
+class Dialog(QDialog):
+ num_grid_rows = 3
+ num_buttons = 4
+
+ def __init__(self):
+ super().__init__()
+
+ self.create_menu()
+ self.create_horizontal_group_box()
+ self.create_grid_group_box()
+ self.create_form_group_box()
+
+ big_editor = QTextEdit()
+ big_editor.setPlainText("This widget takes up all the remaining space "
+ "in the top-level layout.")
+
+ button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+
+ button_box.accepted.connect(self.accept)
+ button_box.rejected.connect(self.reject)
+
+ main_layout = QVBoxLayout()
+ main_layout.setMenuBar(self._menu_bar)
+ main_layout.addWidget(self._horizontal_group_box)
+ main_layout.addWidget(self._grid_group_box)
+ main_layout.addWidget(self._form_group_box)
+ main_layout.addWidget(big_editor)
+ main_layout.addWidget(button_box)
+ self.setLayout(main_layout)
+
+ self.setWindowTitle("Basic Layouts")
+
+ def create_menu(self):
+ self._menu_bar = QMenuBar()
+
+ self._file_menu = QMenu("&File", self)
+ self._exit_action = self._file_menu.addAction("E&xit")
+ self._menu_bar.addMenu(self._file_menu)
+
+ self._exit_action.triggered.connect(self.accept)
+
+ def create_horizontal_group_box(self):
+ self._horizontal_group_box = QGroupBox("Horizontal layout")
+ layout = QHBoxLayout()
+
+ for i in range(Dialog.num_buttons):
+ button = QPushButton(f"Button {i + 1}")
+ layout.addWidget(button)
+
+ self._horizontal_group_box.setLayout(layout)
+
+ def create_grid_group_box(self):
+ self._grid_group_box = QGroupBox("Grid layout")
+ layout = QGridLayout()
+
+ for i in range(Dialog.num_grid_rows):
+ label = QLabel(f"Line {i + 1}:")
+ line_edit = QLineEdit()
+ layout.addWidget(label, i + 1, 0)
+ layout.addWidget(line_edit, i + 1, 1)
+
+ self._small_editor = QTextEdit()
+ self._small_editor.setPlainText("This widget takes up about two thirds of the grid layout.")
+
+ layout.addWidget(self._small_editor, 0, 2, 4, 1)
+
+ layout.setColumnStretch(1, 10)
+ layout.setColumnStretch(2, 20)
+ self._grid_group_box.setLayout(layout)
+
+ def create_form_group_box(self):
+ self._form_group_box = QGroupBox("Form layout")
+ layout = QFormLayout()
+ layout.addRow(QLabel("Line 1:"), QLineEdit())
+ layout.addRow(QLabel("Line 2, long text:"), QComboBox())
+ layout.addRow(QLabel("Line 3:"), QSpinBox())
+ self._form_group_box.setLayout(layout)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ sys.exit(dialog.exec())
diff --git a/examples/widgets/layouts/basiclayouts/basiclayouts.pyproject b/examples/widgets/layouts/basiclayouts/basiclayouts.pyproject
new file mode 100644
index 000000000..c573f5688
--- /dev/null
+++ b/examples/widgets/layouts/basiclayouts/basiclayouts.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["basiclayouts.py"]
+}
diff --git a/examples/widgets/layouts/basiclayouts/doc/basiclayouts.png b/examples/widgets/layouts/basiclayouts/doc/basiclayouts.png
new file mode 100644
index 000000000..e3b8537cd
--- /dev/null
+++ b/examples/widgets/layouts/basiclayouts/doc/basiclayouts.png
Binary files differ
diff --git a/examples/widgets/layouts/basiclayouts/doc/basiclayouts.rst b/examples/widgets/layouts/basiclayouts/doc/basiclayouts.rst
new file mode 100644
index 000000000..caf04d428
--- /dev/null
+++ b/examples/widgets/layouts/basiclayouts/doc/basiclayouts.rst
@@ -0,0 +1,9 @@
+Basic Layouts Example
+=====================
+
+Basic Layouts shows how to use the standard layout managers that are available
+in Qt Widgets: QBoxLayout, QGridLayout, and QFormLayout.
+
+.. image:: basiclayouts.png
+ :width: 400
+ :alt: Basic Layouts Screenshot
diff --git a/examples/widgets/layouts/borderlayout/borderlayout.py b/examples/widgets/layouts/borderlayout/borderlayout.py
new file mode 100644
index 000000000..3268d7034
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/borderlayout.py
@@ -0,0 +1,248 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/layouts/borderlayout example from Qt v5.x"""
+
+from dataclasses import dataclass
+from enum import IntEnum, auto
+
+from PySide6.QtCore import QRect, QSize, Qt
+from PySide6.QtWidgets import (
+ QApplication,
+ QFrame,
+ QLabel,
+ QLayout,
+ QLayoutItem,
+ QTextBrowser,
+ QWidget,
+ QWidgetItem,
+)
+import sys
+
+
+class Position(IntEnum):
+ West = auto()
+ North = auto()
+ South = auto()
+ East = auto()
+ Center = auto()
+
+
+class SizeType(IntEnum):
+ MinimumSize = auto()
+ SizeHint = auto()
+
+
+@dataclass
+class ItemWrapper:
+ item: QLayoutItem
+ position: Position
+
+
+class BorderLayout(QLayout):
+ def __init__(self, parent=None, spacing: int = -1):
+ super().__init__(parent)
+
+ self._list: list[ItemWrapper] = []
+
+ self.setSpacing(spacing)
+
+ if parent is not None:
+ self.setParent(parent)
+
+ def __del__(self):
+ item = self.takeAt(0)
+ while item:
+ item = self.takeAt(0)
+
+ def addItem(self, item: QLayoutItem):
+ self.add(item, Position.West)
+
+ def addWidget(self, widget: QWidget, position: Position):
+ self.add(QWidgetItem(widget), position)
+
+ def expandingDirections(self) -> Qt.Orientations:
+ return Qt.Horizontal | Qt.Vertical
+
+ def hasHeightForWidth(self) -> bool:
+ return False
+
+ def count(self) -> int:
+ return len(self._list)
+
+ def itemAt(self, index: int) -> QLayoutItem:
+ if index < len(self._list):
+ wrapper: ItemWrapper = self._list[index]
+ return wrapper.item
+ return None
+
+ def minimumSize(self) -> QSize:
+ return self.calculate_size(SizeType.MinimumSize)
+
+ def setGeometry(self, rect: QRect):
+ center: ItemWrapper = None
+ east_width = 0
+ west_width = 0
+ north_height = 0
+ south_height = 0
+
+ super().setGeometry(rect)
+
+ for wrapper in self._list:
+ item: QLayoutItem = wrapper.item
+ position: Position = wrapper.position
+
+ if position == Position.North:
+ item.setGeometry(
+ QRect(
+ rect.x(), north_height, rect.width(), item.sizeHint().height()
+ )
+ )
+
+ north_height += item.geometry().height() + self.spacing()
+
+ elif position == Position.South:
+ item.setGeometry(
+ QRect(
+ item.geometry().x(),
+ item.geometry().y(),
+ rect.width(),
+ item.sizeHint().height(),
+ )
+ )
+
+ south_height += item.geometry().height() + self.spacing()
+
+ item.setGeometry(
+ QRect(
+ rect.x(),
+ rect.y() + rect.height() - south_height + self.spacing(),
+ item.geometry().width(),
+ item.geometry().height(),
+ )
+ )
+ elif position == Position.Center:
+ center = wrapper
+
+ center_height = rect.height() - north_height - south_height
+
+ for wrapper in self._list:
+ item: QLayoutItem = wrapper.item
+ position: Position = wrapper.position
+
+ if position == Position.West:
+ item.setGeometry(
+ QRect(
+ rect.x() + west_width,
+ north_height,
+ item.sizeHint().width(),
+ center_height,
+ )
+ )
+
+ west_width += item.geometry().width() + self.spacing()
+
+ elif position == Position.East:
+ item.setGeometry(
+ QRect(
+ item.geometry().x(),
+ item.geometry().y(),
+ item.sizeHint().width(),
+ center_height,
+ )
+ )
+
+ east_width += item.geometry().width() + self.spacing()
+
+ item.setGeometry(
+ QRect(
+ rect.x() + rect.width() - east_width + self.spacing(),
+ north_height,
+ item.geometry().width(),
+ item.geometry().height(),
+ )
+ )
+
+ if center:
+ center.item.setGeometry(
+ QRect(
+ west_width,
+ north_height,
+ rect.width() - east_width - west_width,
+ center_height,
+ )
+ )
+
+ def sizeHint(self) -> QSize:
+ return self.calculate_size(SizeType.SizeHint)
+
+ def takeAt(self, index: int):
+ if 0 <= index < len(self._list):
+ layout_struct: ItemWrapper = self._list.pop(index)
+ return layout_struct.item
+ return None
+
+ def add(self, item: QLayoutItem, position: Position):
+ self._list.append(ItemWrapper(item, position))
+
+ def calculate_size(self, size_type: SizeType):
+ total_size = QSize()
+
+ for wrapper in self._list:
+ position = wrapper.position
+
+ item_size: QSize
+ if size_type == SizeType.MinimumSize:
+ item_size = wrapper.item.minimumSize()
+ else:
+ item_size = wrapper.item.sizeHint()
+
+ if position in (Position.North, Position.South, Position.Center):
+ total_size.setHeight(total_size.height() + item_size.height())
+
+ if position in (Position.West, Position.East, Position.Center):
+ total_size.setWidth(total_size.width() + item_size.width())
+
+ return total_size
+
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+ self.central_widget = QTextBrowser()
+ self.central_widget.setPlainText("Central widget")
+
+ border_layout = BorderLayout()
+ border_layout.addWidget(self.central_widget, Position.Center)
+
+ label_north = self.create_label("North")
+ border_layout.addWidget(label_north, Position.North)
+
+ label_west = self.create_label("West")
+ border_layout.addWidget(label_west, Position.West)
+
+ label_east1 = self.create_label("East 1")
+ border_layout.addWidget(label_east1, Position.East)
+
+ label_east2 = self.create_label("East 2")
+ border_layout.addWidget(label_east2, Position.East)
+
+ label_south = self.create_label("South")
+ border_layout.addWidget(label_south, Position.South)
+
+ self.setLayout(border_layout)
+
+ self.setWindowTitle("Border Layout")
+
+ @staticmethod
+ def create_label(text: str):
+ label = QLabel(text)
+ label.setFrameStyle(QFrame.Box | QFrame.Raised)
+ return label
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/layouts/borderlayout/borderlayout.pyproject b/examples/widgets/layouts/borderlayout/borderlayout.pyproject
new file mode 100644
index 000000000..fc0280348
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/borderlayout.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["borderlayout.py"]
+}
diff --git a/examples/widgets/layouts/borderlayout/doc/borderlayout.png b/examples/widgets/layouts/borderlayout/doc/borderlayout.png
new file mode 100644
index 000000000..8599b9d1c
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/doc/borderlayout.png
Binary files differ
diff --git a/examples/widgets/layouts/borderlayout/doc/borderlayout.rst b/examples/widgets/layouts/borderlayout/doc/borderlayout.rst
new file mode 100644
index 000000000..652f84daa
--- /dev/null
+++ b/examples/widgets/layouts/borderlayout/doc/borderlayout.rst
@@ -0,0 +1,10 @@
+Border Layout Example
+=======================
+
+Shows how to arrange child widgets along a border.
+
+Border Layout implements a layout that arranges child widgets to surround the main area.
+
+.. image:: borderlayout.png
+ :width: 473
+ :alt: border layout Screenshot
diff --git a/examples/widgets/layouts/dynamiclayouts.py b/examples/widgets/layouts/dynamiclayouts.py
deleted file mode 100644
index 5ae7113ee..000000000
--- a/examples/widgets/layouts/dynamiclayouts.py
+++ /dev/null
@@ -1,170 +0,0 @@
-
-############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/layouts/dynamiclayouts example from Qt v5.x"""
-
-from PySide2.QtCore import Qt, QSize
-from PySide2.QtWidgets import (QApplication, QDialog, QLayout, QGridLayout,
- QMessageBox, QGroupBox, QSpinBox, QSlider,
- QProgressBar, QDial, QDialogButtonBox,
- QComboBox, QLabel)
-
-class Dialog(QDialog):
- def __init__(self):
- super(Dialog, self).__init__()
-
- self.rotableWidgets = []
-
- self.createRotableGroupBox()
- self.createOptionsGroupBox()
- self.createButtonBox()
-
- mainLayout = QGridLayout()
- mainLayout.addWidget(self.rotableGroupBox, 0, 0)
- mainLayout.addWidget(self.optionsGroupBox, 1, 0)
- mainLayout.addWidget(self.buttonBox, 2, 0)
- mainLayout.setSizeConstraint(QLayout.SetMinimumSize)
-
- self.mainLayout = mainLayout
- self.setLayout(self.mainLayout)
-
- self.setWindowTitle("Dynamic Layouts")
-
- def rotateWidgets(self):
- count = len(self.rotableWidgets)
- if count % 2 == 1:
- raise AssertionError("Number of widgets must be even")
-
- for widget in self.rotableWidgets:
- self.rotableLayout.removeWidget(widget)
-
- self.rotableWidgets.append(self.rotableWidgets.pop(0))
-
- for i in range(count//2):
- self.rotableLayout.addWidget(self.rotableWidgets[count - i - 1], 0, i)
- self.rotableLayout.addWidget(self.rotableWidgets[i], 1, i)
-
-
- def buttonsOrientationChanged(self, index):
- self.mainLayout.setSizeConstraint(QLayout.SetNoConstraint)
- self.setMinimumSize(0, 0)
-
- orientation = Qt.Orientation(int(self.buttonsOrientationComboBox.itemData(index)))
-
- if orientation == self.buttonBox.orientation():
- return
-
- self.mainLayout.removeWidget(self.buttonBox)
-
- spacing = self.mainLayout.spacing()
-
- oldSizeHint = self.buttonBox.sizeHint() + QSize(spacing, spacing)
- self.buttonBox.setOrientation(orientation)
- newSizeHint = self.buttonBox.sizeHint() + QSize(spacing, spacing)
-
- if orientation == Qt.Horizontal:
- self.mainLayout.addWidget(self.buttonBox, 2, 0)
- self.resize(self.size() + QSize(-oldSizeHint.width(), newSizeHint.height()))
- else:
- self.mainLayout.addWidget(self.buttonBox, 0, 3, 2, 1)
- self.resize(self.size() + QSize(newSizeHint.width(), -oldSizeHint.height()))
-
- self.mainLayout.setSizeConstraint(QLayout.SetDefaultConstraint)
-
- def show_help(self):
- QMessageBox.information(self, "Dynamic Layouts Help",
- "This example shows how to change layouts "
- "dynamically.")
-
- def createRotableGroupBox(self):
- self.rotableGroupBox = QGroupBox("Rotable Widgets")
-
- self.rotableWidgets.append(QSpinBox())
- self.rotableWidgets.append(QSlider())
- self.rotableWidgets.append(QDial())
- self.rotableWidgets.append(QProgressBar())
- count = len(self.rotableWidgets)
- for i in range(count):
- self.rotableWidgets[i].valueChanged[int].\
- connect(self.rotableWidgets[(i+1) % count].setValue)
-
- self.rotableLayout = QGridLayout()
- self.rotableGroupBox.setLayout(self.rotableLayout)
-
- self.rotateWidgets()
-
- def createOptionsGroupBox(self):
- self.optionsGroupBox = QGroupBox("Options")
-
- buttonsOrientationLabel = QLabel("Orientation of buttons:")
-
- buttonsOrientationComboBox = QComboBox()
- buttonsOrientationComboBox.addItem("Horizontal", Qt.Horizontal)
- buttonsOrientationComboBox.addItem("Vertical", Qt.Vertical)
- buttonsOrientationComboBox.currentIndexChanged[int].connect(self.buttonsOrientationChanged)
-
- self.buttonsOrientationComboBox = buttonsOrientationComboBox
-
- optionsLayout = QGridLayout()
- optionsLayout.addWidget(buttonsOrientationLabel, 0, 0)
- optionsLayout.addWidget(self.buttonsOrientationComboBox, 0, 1)
- optionsLayout.setColumnStretch(2, 1)
- self.optionsGroupBox.setLayout(optionsLayout)
-
- def createButtonBox(self):
- self.buttonBox = QDialogButtonBox()
-
- closeButton = self.buttonBox.addButton(QDialogButtonBox.Close)
- helpButton = self.buttonBox.addButton(QDialogButtonBox.Help)
- rotateWidgetsButton = self.buttonBox.addButton("Rotate &Widgets", QDialogButtonBox.ActionRole)
-
- rotateWidgetsButton.clicked.connect(self.rotateWidgets)
- closeButton.clicked.connect(self.close)
- helpButton.clicked.connect(self.show_help)
-
-
-if __name__ == '__main__':
- import sys
-
- app = QApplication(sys.argv)
- dialog = Dialog()
- dialog.exec_()
diff --git a/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.png b/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.png
new file mode 100644
index 000000000..505a328b3
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.png
Binary files differ
diff --git a/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.rst b/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.rst
new file mode 100644
index 000000000..67179bf44
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts/doc/dynamiclayouts.rst
@@ -0,0 +1,10 @@
+Dynamic Layouts Example
+=======================
+
+Dynamic Layouts implements dynamically placed widgets within running
+applications. The widget placement depends on whether Horizontal or Vertical is
+chosen.
+
+.. image:: basiclayouts.png
+ :width: 400
+ :alt: Dynamic Layouts Screenshot
diff --git a/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py
new file mode 100644
index 000000000..c9dfcc730
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.py
@@ -0,0 +1,134 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/layouts/dynamiclayouts example from Qt v5.x"""
+
+from PySide6.QtCore import Qt, QSize
+from PySide6.QtWidgets import (QApplication, QDialog, QLayout, QGridLayout,
+ QMessageBox, QGroupBox, QSpinBox, QSlider,
+ QProgressBar, QDial, QDialogButtonBox,
+ QComboBox, QLabel)
+
+
+class Dialog(QDialog):
+ def __init__(self):
+ super().__init__()
+
+ self._rotable_widgets = []
+
+ self.create_rotable_group_box()
+ self.create_options_group_box()
+ self.create_button_box()
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(self._rotable_group_box, 0, 0)
+ main_layout.addWidget(self._options_group_box, 1, 0)
+ main_layout.addWidget(self._button_box, 2, 0)
+ main_layout.setSizeConstraint(QLayout.SetMinimumSize)
+
+ self._main_layout = main_layout
+ self.setLayout(self._main_layout)
+
+ self.setWindowTitle("Dynamic Layouts")
+
+ def rotate_widgets(self):
+ count = len(self._rotable_widgets)
+ if count % 2 == 1:
+ raise AssertionError("Number of widgets must be even")
+
+ for widget in self._rotable_widgets:
+ self._rotable_layout.removeWidget(widget)
+
+ self._rotable_widgets.append(self._rotable_widgets.pop(0))
+
+ for i in range(count // 2):
+ self._rotable_layout.addWidget(self._rotable_widgets[count - i - 1], 0, i)
+ self._rotable_layout.addWidget(self._rotable_widgets[i], 1, i)
+
+ def buttons_orientation_changed(self, index):
+ self._main_layout.setSizeConstraint(QLayout.SetNoConstraint)
+ self.setMinimumSize(0, 0)
+
+ orientation = Qt.Orientation(self._buttons_orientation_combo_box.itemData(index))
+
+ if orientation == self._button_box.orientation():
+ return
+
+ self._main_layout.removeWidget(self._button_box)
+
+ spacing = self._main_layout.spacing()
+
+ old_size_hint = self._button_box.sizeHint() + QSize(spacing, spacing)
+ self._button_box.setOrientation(orientation)
+ new_size_hint = self._button_box.sizeHint() + QSize(spacing, spacing)
+
+ if orientation == Qt.Horizontal:
+ self._main_layout.addWidget(self._button_box, 2, 0)
+ self.resize(self.size() + QSize(-old_size_hint.width(), new_size_hint.height()))
+ else:
+ self._main_layout.addWidget(self._button_box, 0, 3, 2, 1)
+ self.resize(self.size() + QSize(new_size_hint.width(), -old_size_hint.height()))
+
+ self._main_layout.setSizeConstraint(QLayout.SetDefaultConstraint)
+
+ def show_help(self):
+ QMessageBox.information(self, "Dynamic Layouts Help",
+ "This example shows how to change layouts "
+ "dynamically.")
+
+ def create_rotable_group_box(self):
+ self._rotable_group_box = QGroupBox("Rotable Widgets")
+
+ self._rotable_widgets.append(QSpinBox())
+ self._rotable_widgets.append(QSlider())
+ self._rotable_widgets.append(QDial())
+ self._rotable_widgets.append(QProgressBar())
+ count = len(self._rotable_widgets)
+ for i in range(count):
+ element = self._rotable_widgets[(i + 1) % count]
+ self._rotable_widgets[i].valueChanged[int].connect(element.setValue)
+
+ self._rotable_layout = QGridLayout()
+ self._rotable_group_box.setLayout(self._rotable_layout)
+
+ self.rotate_widgets()
+
+ def create_options_group_box(self):
+ self._options_group_box = QGroupBox("Options")
+
+ buttons_orientation_label = QLabel("Orientation of buttons:")
+
+ buttons_orientation_combo_box = QComboBox()
+ buttons_orientation_combo_box.addItem("Horizontal", Qt.Horizontal)
+ buttons_orientation_combo_box.addItem("Vertical", Qt.Vertical)
+ buttons_orientation_combo_box.currentIndexChanged[int].connect(
+ self.buttons_orientation_changed)
+
+ self._buttons_orientation_combo_box = buttons_orientation_combo_box
+
+ options_layout = QGridLayout()
+ options_layout.addWidget(buttons_orientation_label, 0, 0)
+ options_layout.addWidget(self._buttons_orientation_combo_box, 0, 1)
+ options_layout.setColumnStretch(2, 1)
+ self._options_group_box.setLayout(options_layout)
+
+ def create_button_box(self):
+ self._button_box = QDialogButtonBox()
+
+ close_button = self._button_box.addButton(QDialogButtonBox.Close)
+ help_button = self._button_box.addButton(QDialogButtonBox.Help)
+ rotate_widgets_button = self._button_box.addButton(
+ "Rotate &Widgets", QDialogButtonBox.ActionRole)
+
+ rotate_widgets_button.clicked.connect(self.rotate_widgets)
+ close_button.clicked.connect(self.close)
+ help_button.clicked.connect(self.show_help)
+
+
+if __name__ == '__main__':
+ import sys
+
+ app = QApplication(sys.argv)
+ dialog = Dialog()
+ dialog.exec()
diff --git a/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.pyproject b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.pyproject
new file mode 100644
index 000000000..c4276741f
--- /dev/null
+++ b/examples/widgets/layouts/dynamiclayouts/dynamiclayouts.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["dynamiclayouts.py"]
+}
diff --git a/examples/widgets/layouts/flowlayout.py b/examples/widgets/layouts/flowlayout.py
deleted file mode 100644
index f63fd5549..000000000
--- a/examples/widgets/layouts/flowlayout.py
+++ /dev/null
@@ -1,155 +0,0 @@
-
-############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/layouts/flowlayout example from Qt v5.x"""
-
-from PySide2 import QtCore, QtWidgets
-
-
-class Window(QtWidgets.QWidget):
- def __init__(self):
- super(Window, self).__init__()
-
- flowLayout = FlowLayout()
- flowLayout.addWidget(QtWidgets.QPushButton("Short"))
- flowLayout.addWidget(QtWidgets.QPushButton("Longer"))
- flowLayout.addWidget(QtWidgets.QPushButton("Different text"))
- flowLayout.addWidget(QtWidgets.QPushButton("More text"))
- flowLayout.addWidget(QtWidgets.QPushButton("Even longer button text"))
- self.setLayout(flowLayout)
-
- self.setWindowTitle("Flow Layout")
-
-
-class FlowLayout(QtWidgets.QLayout):
- def __init__(self, parent=None, margin=0, spacing=-1):
- super(FlowLayout, self).__init__(parent)
-
- if parent is not None:
- self.setMargin(margin)
-
- self.setSpacing(spacing)
-
- self.itemList = []
-
- def __del__(self):
- item = self.takeAt(0)
- while item:
- item = self.takeAt(0)
-
- def addItem(self, item):
- self.itemList.append(item)
-
- def count(self):
- return len(self.itemList)
-
- def itemAt(self, index):
- if index >= 0 and index < len(self.itemList):
- return self.itemList[index]
-
- return None
-
- def takeAt(self, index):
- if index >= 0 and index < len(self.itemList):
- return self.itemList.pop(index)
-
- return None
-
- def expandingDirections(self):
- return QtCore.Qt.Orientations(QtCore.Qt.Orientation(0))
-
- def hasHeightForWidth(self):
- return True
-
- def heightForWidth(self, width):
- height = self.doLayout(QtCore.QRect(0, 0, width, 0), True)
- return height
-
- def setGeometry(self, rect):
- super(FlowLayout, self).setGeometry(rect)
- self.doLayout(rect, False)
-
- def sizeHint(self):
- return self.minimumSize()
-
- def minimumSize(self):
- size = QtCore.QSize()
-
- for item in self.itemList:
- size = size.expandedTo(item.minimumSize())
-
- size += QtCore.QSize(2 * self.contentsMargins().top(), 2 * self.contentsMargins().top())
- return size
-
- def doLayout(self, rect, testOnly):
- x = rect.x()
- y = rect.y()
- lineHeight = 0
-
- for item in self.itemList:
- wid = item.widget()
- spaceX = self.spacing() + wid.style().layoutSpacing(QtWidgets.QSizePolicy.PushButton, QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Horizontal)
- spaceY = self.spacing() + wid.style().layoutSpacing(QtWidgets.QSizePolicy.PushButton, QtWidgets.QSizePolicy.PushButton, QtCore.Qt.Vertical)
- nextX = x + item.sizeHint().width() + spaceX
- if nextX - spaceX > rect.right() and lineHeight > 0:
- x = rect.x()
- y = y + lineHeight + spaceY
- nextX = x + item.sizeHint().width() + spaceX
- lineHeight = 0
-
- if not testOnly:
- item.setGeometry(QtCore.QRect(QtCore.QPoint(x, y), item.sizeHint()))
-
- x = nextX
- lineHeight = max(lineHeight, item.sizeHint().height())
-
- return y + lineHeight - rect.y()
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- mainWin = Window()
- mainWin.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/layouts/flowlayout/doc/flowlayout.png b/examples/widgets/layouts/flowlayout/doc/flowlayout.png
new file mode 100644
index 000000000..7dece0611
--- /dev/null
+++ b/examples/widgets/layouts/flowlayout/doc/flowlayout.png
Binary files differ
diff --git a/examples/widgets/layouts/flowlayout/doc/flowlayout.rst b/examples/widgets/layouts/flowlayout/doc/flowlayout.rst
new file mode 100644
index 000000000..b138165fe
--- /dev/null
+++ b/examples/widgets/layouts/flowlayout/doc/flowlayout.rst
@@ -0,0 +1,11 @@
+Flow Layout Example
+===================
+
+Flow Layout implements a layout that handles different window sizes
+in a Qt Widgets application.
+The widget placement changes depending on the width of the application
+window.
+
+.. image:: flowlayout.png
+ :width: 400
+ :alt: Flow Layout Screenshot
diff --git a/examples/widgets/layouts/flowlayout/flowlayout.py b/examples/widgets/layouts/flowlayout/flowlayout.py
new file mode 100644
index 000000000..3ab4318fa
--- /dev/null
+++ b/examples/widgets/layouts/flowlayout/flowlayout.py
@@ -0,0 +1,120 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/layouts/flowlayout example from Qt v6.x"""
+
+import sys
+from PySide6.QtCore import Qt, QMargins, QPoint, QRect, QSize
+from PySide6.QtWidgets import QApplication, QLayout, QPushButton, QSizePolicy, QWidget
+
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ flow_layout = FlowLayout(self)
+ flow_layout.addWidget(QPushButton("Short"))
+ flow_layout.addWidget(QPushButton("Longer"))
+ flow_layout.addWidget(QPushButton("Different text"))
+ flow_layout.addWidget(QPushButton("More text"))
+ flow_layout.addWidget(QPushButton("Even longer button text"))
+
+ self.setWindowTitle("Flow Layout")
+
+
+class FlowLayout(QLayout):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ if parent is not None:
+ self.setContentsMargins(QMargins(0, 0, 0, 0))
+
+ self._item_list = []
+
+ def __del__(self):
+ item = self.takeAt(0)
+ while item:
+ item = self.takeAt(0)
+
+ def addItem(self, item):
+ self._item_list.append(item)
+
+ def count(self):
+ return len(self._item_list)
+
+ def itemAt(self, index):
+ if 0 <= index < len(self._item_list):
+ return self._item_list[index]
+
+ return None
+
+ def takeAt(self, index):
+ if 0 <= index < len(self._item_list):
+ return self._item_list.pop(index)
+
+ return None
+
+ def expandingDirections(self):
+ return Qt.Orientation(0)
+
+ def hasHeightForWidth(self):
+ return True
+
+ def heightForWidth(self, width):
+ height = self._do_layout(QRect(0, 0, width, 0), True)
+ return height
+
+ def setGeometry(self, rect):
+ super(FlowLayout, self).setGeometry(rect)
+ self._do_layout(rect, False)
+
+ def sizeHint(self):
+ return self.minimumSize()
+
+ def minimumSize(self):
+ size = QSize()
+
+ for item in self._item_list:
+ size = size.expandedTo(item.minimumSize())
+
+ size += QSize(2 * self.contentsMargins().top(), 2 * self.contentsMargins().top())
+ return size
+
+ def _do_layout(self, rect, test_only):
+ x = rect.x()
+ y = rect.y()
+ line_height = 0
+ spacing = self.spacing()
+
+ for item in self._item_list:
+ style = item.widget().style()
+ layout_spacing_x = style.layoutSpacing(
+ QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Horizontal
+ )
+ layout_spacing_y = style.layoutSpacing(
+ QSizePolicy.PushButton, QSizePolicy.PushButton, Qt.Vertical
+ )
+ space_x = spacing + layout_spacing_x
+ space_y = spacing + layout_spacing_y
+ next_x = x + item.sizeHint().width() + space_x
+ if next_x - space_x > rect.right() and line_height > 0:
+ x = rect.x()
+ y = y + line_height + space_y
+ next_x = x + item.sizeHint().width() + space_x
+ line_height = 0
+
+ if not test_only:
+ item.setGeometry(QRect(QPoint(x, y), item.sizeHint()))
+
+ x = next_x
+ line_height = max(line_height, item.sizeHint().height())
+
+ return y + line_height - rect.y()
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ main_win = Window()
+ main_win.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/layouts/flowlayout/flowlayout.pyproject b/examples/widgets/layouts/flowlayout/flowlayout.pyproject
new file mode 100644
index 000000000..fd7f285de
--- /dev/null
+++ b/examples/widgets/layouts/flowlayout/flowlayout.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["flowlayout.py"]
+}
diff --git a/examples/widgets/layouts/layouts.pyproject b/examples/widgets/layouts/layouts.pyproject
deleted file mode 100644
index 85eb22785..000000000
--- a/examples/widgets/layouts/layouts.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["basiclayouts.py", "dynamiclayouts.py", "flowlayout.py"]
-}
diff --git a/examples/widgets/linguist/doc/linguist.rst b/examples/widgets/linguist/doc/linguist.rst
new file mode 100644
index 000000000..24a49a617
--- /dev/null
+++ b/examples/widgets/linguist/doc/linguist.rst
@@ -0,0 +1,7 @@
+.. _qt-linguist-example:
+
+Qt Linguist Example
+===================
+
+This example demonstrates the use of Qt Linguist and related tools for translating
+applications as described in :ref:`translations`.
diff --git a/examples/widgets/linguist/example_de.ts b/examples/widgets/linguist/example_de.ts
new file mode 100644
index 000000000..447d1ceb5
--- /dev/null
+++ b/examples/widgets/linguist/example_de.ts
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="de_DE" sourcelanguage="de_DE">
+<context>
+ <name>Window</name>
+ <message>
+ <location filename="main.py" line="56"/>
+ <source>&amp;File</source>
+ <translation>&amp;Datei</translation>
+ </message>
+ <message>
+ <location filename="main.py" line="57"/>
+ <source>Quit</source>
+ <translation>Beenden</translation>
+ </message>
+ <message>
+ <location filename="main.py" line="58"/>
+ <source>CTRL+Q</source>
+ <translation>CTRL+B</translation>
+ </message>
+ <message>
+ <location filename="main.py" line="60"/>
+ <source>&amp;Help</source>
+ <translation>Hilfe</translation>
+ </message>
+ <message>
+ <location filename="main.py" line="61"/>
+ <source>About Qt</source>
+ <translation>Ãœber Qt</translation>
+ </message>
+ <message numerus="yes">
+ <location filename="main.py" line="75"/>
+ <source>%n language(s) selected</source>
+ <translation>
+ <numerusform>Eine Sprache ausgewählt</numerusform>
+ <numerusform>%n Sprachen ausgewählt</numerusform>
+ </translation>
+ </message>
+</context>
+</TS>
diff --git a/examples/widgets/linguist/linguist.pyproject b/examples/widgets/linguist/linguist.pyproject
new file mode 100644
index 000000000..43a13b036
--- /dev/null
+++ b/examples/widgets/linguist/linguist.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "linguist.qrc", "example_de.ts"]
+}
diff --git a/examples/widgets/linguist/linguist.qrc b/examples/widgets/linguist/linguist.qrc
new file mode 100644
index 000000000..6ca287c20
--- /dev/null
+++ b/examples/widgets/linguist/linguist.qrc
@@ -0,0 +1,5 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="translations">
+ <file>example_de.qm</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/linguist/linguist_rc.py b/examples/widgets/linguist/linguist_rc.py
new file mode 100644
index 000000000..233952779
--- /dev/null
+++ b/examples/widgets/linguist/linguist_rc.py
@@ -0,0 +1,68 @@
+# Resource object code (Python 3)
+# Created by: object code
+# Created by: The Resource Compiler for Qt version 6.2.2
+# WARNING! All changes made in this file will be lost!
+
+from PySide6 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x01\xcd\
+<\
+\xb8d\x18\xca\xef\x9c\x95\xcd!\x1c\xbf`\xa1\xbd\xdd\xa7\
+\x00\x00\x00\x05de_DEB\x00\x00\x000\x00\x05\
+\x8c\x04\x00\x00\x01E\x00*\xd0%\x00\x00\x00\x91\x00*\
+\xec0\x00\x00\x00\xbd\x04\x89o\x01\x00\x00\x01\x18\x05\xbc\
+\xad\xd4\x00\x00\x00\x00\x09la\xf4\x00\x00\x00\xe7i\x00\
+\x00\x01r\x03\x00\x00\x00.\x00E\x00i\x00n\x00e\
+\x00 \x00S\x00p\x00r\x00a\x00c\x00h\x00e\
+\x00 \x00a\x00u\x00s\x00g\x00e\x00w\x00\xe4\
+\x00h\x00l\x00t\x03\x00\x00\x00,\x00%\x00n\x00\
+ \x00S\x00p\x00r\x00a\x00c\x00h\x00e\x00\
+n\x00 \x00a\x00u\x00s\x00g\x00e\x00w\x00\
+\xe4\x00h\x00l\x00t\x08\x00\x00\x00\x00\x06\x00\x00\x00\
+\x17%n language(s) \
+selected\x07\x00\x00\x00\x06Win\
+dow\x01\x03\x00\x00\x00\x0c\x00&\x00D\x00a\x00\
+t\x00e\x00i\x08\x00\x00\x00\x00\x06\x00\x00\x00\x05&\
+File\x07\x00\x00\x00\x06Window\x01\
+\x03\x00\x00\x00\x0a\x00H\x00i\x00l\x00f\x00e\x08\
+\x00\x00\x00\x00\x06\x00\x00\x00\x05&Help\x07\x00\
+\x00\x00\x06Window\x01\x03\x00\x00\x00\x0e\x00\
+\xdc\x00b\x00e\x00r\x00 \x00Q\x00t\x08\x00\x00\
+\x00\x00\x06\x00\x00\x00\x08About Qt\x07\
+\x00\x00\x00\x06Window\x01\x03\x00\x00\x00\x0c\
+\x00C\x00T\x00R\x00L\x00+\x00B\x08\x00\x00\x00\
+\x00\x06\x00\x00\x00\x06CTRL+Q\x07\x00\x00\x00\
+\x06Window\x01\x03\x00\x00\x00\x0e\x00B\x00\
+e\x00e\x00n\x00d\x00e\x00n\x08\x00\x00\x00\x00\
+\x06\x00\x00\x00\x04Quit\x07\x00\x00\x00\x06Wi\
+ndow\x01\x88\x00\x00\x00\x02\x01\x01\
+"
+
+qt_resource_name = b"\
+\x00\x0c\
+\x0d\xfc\x11\x13\
+\x00t\
+\x00r\x00a\x00n\x00s\x00l\x00a\x00t\x00i\x00o\x00n\x00s\
+\x00\x0d\
+\x02\x8b\x0a\x9d\
+\x00e\
+\x00x\x00a\x00m\x00p\x00l\x00e\x00_\x00d\x00e\x00.\x00q\x00m\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x1e\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01}\xbdR\x0f\xc5\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/examples/widgets/linguist/main.py b/examples/widgets/linguist/main.py
new file mode 100644
index 000000000..e4212e801
--- /dev/null
+++ b/examples/widgets/linguist/main.py
@@ -0,0 +1,55 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import (QItemSelection, QLibraryInfo, QLocale, QTranslator,
+ Slot)
+from PySide6.QtWidgets import (QAbstractItemView, QApplication, QListWidget,
+ QMainWindow)
+
+
+import linguist_rc # noqa: F401
+
+
+class Window(QMainWindow):
+ def __init__(self):
+ super().__init__()
+ file_menu = self.menuBar().addMenu(self.tr("&File"))
+ quit_action = file_menu.addAction(self.tr("Quit"))
+ quit_action.setShortcut(self.tr("CTRL+Q"))
+ quit_action.triggered.connect(self.close)
+ help_menu = self.menuBar().addMenu(self.tr("&Help"))
+ about_qt_action = help_menu.addAction(self.tr("About Qt"))
+ about_qt_action.triggered.connect(qApp.aboutQt) # noqa: F821
+
+ self._list_widget = QListWidget()
+ self._list_widget.setSelectionMode(QAbstractItemView.MultiSelection)
+ self._list_widget.selectionModel().selectionChanged.connect(self.selection_changed)
+ self._list_widget.addItem("C++")
+ self._list_widget.addItem("Java")
+ self._list_widget.addItem("Python")
+ self.setCentralWidget(self._list_widget)
+
+ @Slot(QItemSelection, QItemSelection)
+ def selection_changed(self, selected, deselected):
+ count = len(self._list_widget.selectionModel().selectedRows())
+ message = self.tr("%n language(s) selected", "", count)
+ self.statusBar().showMessage(message)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ path = QLibraryInfo.path(QLibraryInfo.TranslationsPath)
+ translator = QTranslator(app)
+ if translator.load(QLocale.system(), 'qtbase', '_', path):
+ app.installTranslator(translator)
+ translator = QTranslator(app)
+ path = ':/translations'
+ if translator.load(QLocale.system(), 'example', '_', path):
+ app.installTranslator(translator)
+
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/mainwindows/application/application.py b/examples/widgets/mainwindows/application/application.py
index 8c4626f9b..f69eade2e 100644
--- a/examples/widgets/mainwindows/application/application.py
+++ b/examples/widgets/mainwindows/application/application.py
@@ -1,275 +1,260 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-import application_rc
-
-class MainWindow(QtWidgets.QMainWindow):
+from argparse import ArgumentParser, RawTextHelpFormatter
+import sys
+
+from PySide6.QtCore import (QByteArray, QFile, QFileInfo, QSaveFile, QSettings,
+ QTextStream, Qt, Slot)
+from PySide6.QtGui import QAction, QIcon, QKeySequence
+from PySide6.QtWidgets import (QApplication, QFileDialog, QMainWindow,
+ QMessageBox, QTextEdit)
+
+import application_rc # noqa: F401
+
+
+class MainWindow(QMainWindow):
def __init__(self):
- super(MainWindow, self).__init__()
+ super().__init__()
- self.curFile = ''
+ self._cur_file = ''
- self.textEdit = QtWidgets.QTextEdit()
- self.setCentralWidget(self.textEdit)
+ self._text_edit = QTextEdit()
+ self.setCentralWidget(self._text_edit)
- self.createActions()
- self.createMenus()
- self.createToolBars()
- self.createStatusBar()
+ self.create_actions()
+ self.create_menus()
+ self.create_tool_bars()
+ self.create_status_bar()
- self.readSettings()
+ self.read_settings()
- self.textEdit.document().contentsChanged.connect(self.documentWasModified)
+ self._text_edit.document().contentsChanged.connect(self.document_was_modified)
- self.setCurrentFile('')
+ self.set_current_file('')
self.setUnifiedTitleAndToolBarOnMac(True)
def closeEvent(self, event):
- if self.maybeSave():
- self.writeSettings()
+ if self.maybe_save():
+ self.write_settings()
event.accept()
else:
event.ignore()
- def newFile(self):
- if self.maybeSave():
- self.textEdit.clear()
- self.setCurrentFile('')
+ @Slot()
+ def new_file(self):
+ if self.maybe_save():
+ self._text_edit.clear()
+ self.set_current_file('')
+ @Slot()
def open(self):
- if self.maybeSave():
- fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self)
+ if self.maybe_save():
+ fileName, filtr = QFileDialog.getOpenFileName(self)
if fileName:
- self.loadFile(fileName)
+ self.load_file(fileName)
+ @Slot()
def save(self):
- if self.curFile:
- return self.saveFile(self.curFile)
+ if self._cur_file:
+ return self.save_file(self._cur_file)
- return self.saveAs()
+ return self.save_as()
- def saveAs(self):
- fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self)
+ @Slot()
+ def save_as(self):
+ fileName, filtr = QFileDialog.getSaveFileName(self)
if fileName:
- return self.saveFile(fileName)
+ return self.save_file(fileName)
return False
+ @Slot()
def about(self):
- QtWidgets.QMessageBox.about(self, "About Application",
- "The <b>Application</b> example demonstrates how to write "
- "modern GUI applications using Qt, with a menu bar, "
- "toolbars, and a status bar.")
-
- def documentWasModified(self):
- self.setWindowModified(self.textEdit.document().isModified())
-
- def createActions(self):
- self.newAct = QtWidgets.QAction(QtGui.QIcon(':/images/new.png'), "&New",
- self, shortcut=QtGui.QKeySequence.New,
- statusTip="Create a new file", triggered=self.newFile)
-
- self.openAct = QtWidgets.QAction(QtGui.QIcon(':/images/open.png'),
- "&Open...", self, shortcut=QtGui.QKeySequence.Open,
- statusTip="Open an existing file", triggered=self.open)
-
- self.saveAct = QtWidgets.QAction(QtGui.QIcon(':/images/save.png'),
- "&Save", self, shortcut=QtGui.QKeySequence.Save,
- statusTip="Save the document to disk", triggered=self.save)
-
- self.saveAsAct = QtWidgets.QAction("Save &As...", self,
- shortcut=QtGui.QKeySequence.SaveAs,
- statusTip="Save the document under a new name",
- triggered=self.saveAs)
-
- self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q",
- statusTip="Exit the application", triggered=self.close)
-
- self.cutAct = QtWidgets.QAction(QtGui.QIcon(':/images/cut.png'), "Cu&t",
- self, shortcut=QtGui.QKeySequence.Cut,
- statusTip="Cut the current selection's contents to the clipboard",
- triggered=self.textEdit.cut)
-
- self.copyAct = QtWidgets.QAction(QtGui.QIcon(':/images/copy.png'),
- "&Copy", self, shortcut=QtGui.QKeySequence.Copy,
- statusTip="Copy the current selection's contents to the clipboard",
- triggered=self.textEdit.copy)
-
- self.pasteAct = QtWidgets.QAction(QtGui.QIcon(':/images/paste.png'),
- "&Paste", self, shortcut=QtGui.QKeySequence.Paste,
- statusTip="Paste the clipboard's contents into the current selection",
- triggered=self.textEdit.paste)
-
- self.aboutAct = QtWidgets.QAction("&About", self,
- statusTip="Show the application's About box",
- triggered=self.about)
-
- self.aboutQtAct = QtWidgets.QAction("About &Qt", self,
- statusTip="Show the Qt library's About box",
- triggered=qApp.aboutQt)
-
- self.cutAct.setEnabled(False)
- self.copyAct.setEnabled(False)
- self.textEdit.copyAvailable.connect(self.cutAct.setEnabled)
- self.textEdit.copyAvailable.connect(self.copyAct.setEnabled)
-
- def createMenus(self):
- self.fileMenu = self.menuBar().addMenu("&File")
- self.fileMenu.addAction(self.newAct)
- self.fileMenu.addAction(self.openAct)
- self.fileMenu.addAction(self.saveAct)
- self.fileMenu.addAction(self.saveAsAct)
- self.fileMenu.addSeparator()
- self.fileMenu.addAction(self.exitAct)
-
- self.editMenu = self.menuBar().addMenu("&Edit")
- self.editMenu.addAction(self.cutAct)
- self.editMenu.addAction(self.copyAct)
- self.editMenu.addAction(self.pasteAct)
+ QMessageBox.about(self, "About Application",
+ "The <b>Application</b> example demonstrates how to write "
+ "modern GUI applications using Qt, with a menu bar, "
+ "toolbars, and a status bar.")
+
+ @Slot()
+ def document_was_modified(self):
+ self.setWindowModified(self._text_edit.document().isModified())
+
+ def create_actions(self):
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentNew, QIcon(':/images/new.png'))
+ self._new_act = QAction(icon, "&New", self, shortcut=QKeySequence.New,
+ statusTip="Create a new file", triggered=self.new_file)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentOpen, QIcon(':/images/open.png'))
+ self._open_act = QAction(icon, "&Open...", self,
+ shortcut=QKeySequence.Open, statusTip="Open an existing file",
+ triggered=self.open)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentSave, QIcon(':/images/save.png'))
+ self._save_act = QAction(icon, "&Save", self,
+ shortcut=QKeySequence.Save,
+ statusTip="Save the document to disk", triggered=self.save)
+
+ self._save_as_act = QAction("Save &As...", self,
+ shortcut=QKeySequence.SaveAs,
+ statusTip="Save the document under a new name",
+ triggered=self.save_as)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.ApplicationExit)
+ self._exit_act = QAction(icon, "E&xit", self, shortcut="Ctrl+Q",
+ statusTip="Exit the application", triggered=self.close)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCut, QIcon(':/images/cut.png'))
+ self._cut_act = QAction(icon, "Cu&t", self, shortcut=QKeySequence.Cut,
+ statusTip="Cut the current selection's contents to the clipboard",
+ triggered=self._text_edit.cut)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCopy, QIcon(':/images/copy.png'))
+ self._copy_act = QAction(icon, "&Copy",
+ self, shortcut=QKeySequence.Copy,
+ statusTip="Copy the current selection's contents to the clipboard",
+ triggered=self._text_edit.copy)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditPaste, QIcon(':/images/paste.png'))
+ self._paste_act = QAction(icon, "&Paste",
+ self, shortcut=QKeySequence.Paste,
+ statusTip="Paste the clipboard's contents into the current "
+ "selection",
+ triggered=self._text_edit.paste)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.HelpAbout)
+ self._about_act = QAction(icon, "&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self._about_qt_act = QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=qApp.aboutQt) # noqa: F821
+
+ self._cut_act.setEnabled(False)
+ self._copy_act.setEnabled(False)
+ self._text_edit.copyAvailable.connect(self._cut_act.setEnabled)
+ self._text_edit.copyAvailable.connect(self._copy_act.setEnabled)
+
+ def create_menus(self):
+ self._file_menu = self.menuBar().addMenu("&File")
+ self._file_menu.addAction(self._new_act)
+ self._file_menu.addAction(self._open_act)
+ self._file_menu.addAction(self._save_act)
+ self._file_menu.addAction(self._save_as_act)
+ self._file_menu.addSeparator()
+ self._file_menu.addAction(self._exit_act)
+
+ self._edit_menu = self.menuBar().addMenu("&Edit")
+ self._edit_menu.addAction(self._cut_act)
+ self._edit_menu.addAction(self._copy_act)
+ self._edit_menu.addAction(self._paste_act)
self.menuBar().addSeparator()
- self.helpMenu = self.menuBar().addMenu("&Help")
- self.helpMenu.addAction(self.aboutAct)
- self.helpMenu.addAction(self.aboutQtAct)
+ self._help_menu = self.menuBar().addMenu("&Help")
+ self._help_menu.addAction(self._about_act)
+ self._help_menu.addAction(self._about_qt_act)
- def createToolBars(self):
- self.fileToolBar = self.addToolBar("File")
- self.fileToolBar.addAction(self.newAct)
- self.fileToolBar.addAction(self.openAct)
- self.fileToolBar.addAction(self.saveAct)
+ def create_tool_bars(self):
+ self._file_tool_bar = self.addToolBar("File")
+ self._file_tool_bar.addAction(self._new_act)
+ self._file_tool_bar.addAction(self._open_act)
+ self._file_tool_bar.addAction(self._save_act)
- self.editToolBar = self.addToolBar("Edit")
- self.editToolBar.addAction(self.cutAct)
- self.editToolBar.addAction(self.copyAct)
- self.editToolBar.addAction(self.pasteAct)
+ self._edit_tool_bar = self.addToolBar("Edit")
+ self._edit_tool_bar.addAction(self._cut_act)
+ self._edit_tool_bar.addAction(self._copy_act)
+ self._edit_tool_bar.addAction(self._paste_act)
- def createStatusBar(self):
+ def create_status_bar(self):
self.statusBar().showMessage("Ready")
- def readSettings(self):
- settings = QtCore.QSettings("Trolltech", "Application Example")
- pos = settings.value("pos", QtCore.QPoint(200, 200))
- size = settings.value("size", QtCore.QSize(400, 400))
- self.resize(size)
- self.move(pos)
-
- def writeSettings(self):
- settings = QtCore.QSettings("Trolltech", "Application Example")
- settings.setValue("pos", self.pos())
- settings.setValue("size", self.size())
-
- def maybeSave(self):
- if self.textEdit.document().isModified():
- ret = QtWidgets.QMessageBox.warning(self, "Application",
- "The document has been modified.\nDo you want to save "
- "your changes?",
- QtWidgets.QMessageBox.Save | QtWidgets.QMessageBox.Discard |
- QtWidgets.QMessageBox.Cancel)
- if ret == QtWidgets.QMessageBox.Save:
+ def read_settings(self):
+ settings = QSettings('QtProject', 'Application Example')
+ geometry = settings.value('geometry', QByteArray())
+ if geometry.size():
+ self.restoreGeometry(geometry)
+
+ def write_settings(self):
+ settings = QSettings('QtProject', 'Application Example')
+ settings.setValue('geometry', self.saveGeometry())
+
+ def maybe_save(self):
+ if self._text_edit.document().isModified():
+ ret = QMessageBox.warning(self, "Application",
+ "The document has been modified.\nDo you want to save "
+ "your changes?",
+ QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
+ if ret == QMessageBox.Save:
return self.save()
- elif ret == QtWidgets.QMessageBox.Cancel:
+ elif ret == QMessageBox.Cancel:
return False
return True
- def loadFile(self, fileName):
- file = QtCore.QFile(fileName)
- if not file.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
- QtWidgets.QMessageBox.warning(self, "Application",
- "Cannot read file %s:\n%s." % (fileName, file.errorString()))
+ def load_file(self, fileName):
+ file = QFile(fileName)
+ if not file.open(QFile.ReadOnly | QFile.Text):
+ reason = file.errorString()
+ QMessageBox.warning(self, "Application", f"Cannot read file {fileName}:\n{reason}.")
return
- inf = QtCore.QTextStream(file)
- QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
- self.textEdit.setPlainText(inf.readAll())
- QtWidgets.QApplication.restoreOverrideCursor()
+ inf = QTextStream(file)
+ with QApplication.setOverrideCursor(Qt.WaitCursor):
+ self._text_edit.setPlainText(inf.readAll())
- self.setCurrentFile(fileName)
+ self.set_current_file(fileName)
self.statusBar().showMessage("File loaded", 2000)
- def saveFile(self, fileName):
+ def save_file(self, fileName):
error = None
- QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor)
- file = QtCore.QSaveFile(fileName)
- if file.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text):
- outf = QtCore.QTextStream(file)
- outf << self.textEdit.toPlainText()
- if not file.commit():
- error = "Cannot write file %s:\n%s." % (fileName, file.errorString())
- else:
- error = "Cannot open file %s:\n%s." % (fileName, file.errorString())
- QtWidgets.QApplication.restoreOverrideCursor()
+ with QApplication.setOverrideCursor(Qt.WaitCursor):
+ file = QSaveFile(fileName)
+ if file.open(QFile.WriteOnly | QFile.Text):
+ outf = QTextStream(file)
+ outf << self._text_edit.toPlainText()
+ if not file.commit():
+ reason = file.errorString()
+ error = f"Cannot write file {fileName}:\n{reason}."
+ else:
+ reason = file.errorString()
+ error = f"Cannot open file {fileName}:\n{reason}."
if error:
- QtWidgets.QMessageBox.warning(self, "Application", error)
+ QMessageBox.warning(self, "Application", error)
return False
- self.setCurrentFile(fileName)
+ self.set_current_file(fileName)
self.statusBar().showMessage("File saved", 2000)
return True
- def setCurrentFile(self, fileName):
- self.curFile = fileName
- self.textEdit.document().setModified(False)
+ def set_current_file(self, fileName):
+ self._cur_file = fileName
+ self._text_edit.document().setModified(False)
self.setWindowModified(False)
- if self.curFile:
- shownName = self.strippedName(self.curFile)
+ if self._cur_file:
+ shown_name = self.stripped_name(self._cur_file)
else:
- shownName = 'untitled.txt'
+ shown_name = 'untitled.txt'
- self.setWindowTitle("%s[*] - Application" % shownName)
+ self.setWindowTitle(f"{shown_name}[*] - Application")
- def strippedName(self, fullFileName):
- return QtCore.QFileInfo(fullFileName).fileName()
+ def stripped_name(self, fullFileName):
+ return QFileInfo(fullFileName).fileName()
if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- mainWin = MainWindow()
- mainWin.show()
- sys.exit(app.exec_())
+ argument_parser = ArgumentParser(description='Application Example',
+ formatter_class=RawTextHelpFormatter)
+ argument_parser.add_argument("file", help="File",
+ nargs='?', type=str)
+ options = argument_parser.parse_args()
+
+ app = QApplication(sys.argv)
+ main_win = MainWindow()
+ if options.file:
+ main_win.load_file(options.file)
+ main_win.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/mainwindows/application/application.pyproject b/examples/widgets/mainwindows/application/application.pyproject
index 0e0413982..a9365ed1a 100644
--- a/examples/widgets/mainwindows/application/application.pyproject
+++ b/examples/widgets/mainwindows/application/application.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["application.qrc", "application.py", "application_rc.py"]
+ "files": ["application.qrc", "application.py"]
}
diff --git a/examples/widgets/mainwindows/application/application_rc.py b/examples/widgets/mainwindows/application/application_rc.py
index 2a392bea7..bc8336765 100644
--- a/examples/widgets/mainwindows/application/application_rc.py
+++ b/examples/widgets/mainwindows/application/application_rc.py
@@ -1,88 +1,11 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
-\x00\x00\x04\xa3\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x045IDATX\xc3\xe5\
-\x97\xcd\x8fTE\x14\xc5\x7f\xb7\xea\xd6{\xaf\xdbn\xc7\
-\xf9@\x9d\x89FM4\x99D\x8d\x1aH\x98\xc4\x8c\x1f\
-\x1b\xfe\x02L\x5c\xf1\x07\x18\x16.M\x5ckX\xc3\x8e\
-\xc4\x8d\x1b\x17\xce\x82htA\x5c\x18\x0d\xe2\xc4\xc6\x00\
-=`PQ\x19`\x02\xa2\x0e\x0c\x83\xd3\xfd^\xf7\x94\
-\x8b\xaa\xee\xf9`\xe6\x0d\x84Q\x16VR\xa9\xce{\xb7\
-\xeb\x9e:\xf7\xd4\xa9z\xea\xbd\xe7~6\xe5>\xb7>\
-\x80]\xbbv\xbd\x03\xec\xfd\x8f\xf2N5\x1a\x8d\x03\xeb\
-\x19\xd8\xbb\xef\xbd\xa3;\x1f\x1fv\x00\x9c<:\xcf\xcc\
-\x977X\x9c\xef\xdcS\xa6\xda\xa0\xf2\xdck\x03\xbc\xb8\
-g\x10\x80\x8b\x7f\x16|\xf8\xee\x1e\x80\xdb\x00p\xfc\xec\
-\x1c\xdf?0\x04x.\xfd\xb8\xc0\xfe\xb7\xceo\xcbr\
-\x0f\x1dy\x9a\x0b#\x96\xd3\x9f\x1fd\xfc\xd5}\x9bk\
-@E\xb0\x16@xp,#\xcb\xb2m\x0100\x96\
-a\x8dP\x1b|\x14#%\x22\x14+\xd8\x18\x91\xd5\x95\
-s\xe7\xce\x83*\xb8\x04\xd2\x14\xb2\x0c\xd2,\x8cI\x0a\
-I\x12\xdew:\x90\xe7\x90\xb7\xa1\xd5\x82v+\x8em\
-(r\xb2\xfa8\xd6\x0a\xe3\xaf\xbcIk\xf1\xfa\xe6\x00\
-\xac\x15\xac\x15\x04\xb0F\xd8\xbd{\xe7\x16k\xeb\x86\xae\
-\x80Z\xa8V\x81\xeamQ\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
-\x84\x01g\x055\x82\x08\xa8\x0a\x95,\xc3# \x1e\x08\
-\xc0\xf0\x1e/\x02\xde#\x12&\x15|\x88#\xc4!\x1e\
-<!^@MX\x18@\xd7J\x89\x06\xac\xa0\xdac\
-\x00\x9a3\xbf\x05\x8aS\x07i\x02\x95\x04\xb24\xf6\x04\
-\x12\x07N\xa1\xe8@^@+\x8f\xbd\x05K9\xb4s\
-\xc8\x0bT\x87q=\x00*\xe5%p1@\xd509\
-\xf9\xd2\xd6\x0a\xf3>\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8'a\
-a\xbd\x1c%% \x00\xf0\x81\x8d4M\xa3:\xc3\xb3\
-\x98\x11\x89l\x07\xdac\x09V\x98_)F\xfca\xcd\
-r\x7fa\x1d-\xd1\x80:\x09TI\x18O4/\xe0\
-\x9d\x85\xc4!\x89\xc3g\x09\x92i\xd8\x11\x89\xe2\x13\x87\
-X\x8b\xefv\x91\xbc\x80\xbc\x03\xed\x02\xdfj#\xed\x02\
-\xf2\x02\x9fwP\x1dE\xd5 x:\xebTx\x9b\x06\
-\x9c3x\x0f\x03\x8f$\xbc\xfe\xf2\xf3wh\xe86h\
-\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04R^\x82DM_\x84\
-\x8f\x0d\xa58\xe7\xb6\xc5\x88\x9e\x18K\xb9v\xb3\x03\x08\
-\x9dR\x11\xaa\x90\xb8P\xefZ\xc50}\xb1\xcb@\xc5\
-\xb0\x0e\xf4&\xadW\xf9U.\xe1\xe1\xc6\xd22\xf5\xcc\
-p}\xc9\x84-\xe9J\x19\x10\x9c\x1a\xc0s\xe5f\x97\
-+7\xbb\xacQW?\xd7\xaad~\xc5'\xa2)\xac\
-\x05\x15\xc3\x9c\x0b\xb5w\xa6l\x17\xa8\xc1\xa9 \xc8\x1a\
-5\xaf\x9b5\x1a\x8fY1\x9e\xfe{\xe9\xef\x14\x00\xf1\
-\x82\xef\x9bX0+WV\x02U!\xd1\x90\xfc\xe7S\
-\xdf\xf2\xeb\x99\x13,-\xde\xb8\xa7\xfaWj\x03<\xf5\
-\xecN\x9eya\x02\x0f\xa83[1\x10\x03|\x87\xf7\
-\xf7\xbf\xc1\xc2\xc2\x02\xb7n\xdd\xa2(\x0aD\x04k-\
-\xd6ZT\x15U\xc59\x87\xaab\xad\xc5\x98\xf0\xdf\xe5\
-\xe5e\xf2<\xef\xf7#\xcd\xf9\xb8\xf2-\x18pVP\
-\x17\x18\xdc1:\xb6rO8~\x9c\xe9\xe9i\x8c1\
-x\xef\x99\x98\x98`rr\xf2\x8eY\xd81:\xd6\xdf\
-\x86\xae\xd4\x09Up6\xac\xa2V\xaf\xf7k933\
-\xc3\xd0\xd0\x10\xd6Z\xbc\xf74\x9b\xcd\xbb\x02P\xab\xd7\
-p\xd1\x88\xb4\xd4\x88\x14\x9c\x0b'\x5c\xa0*\x00\xa8V\
-\xabdY\xd6\xa7\xb87\xdeis\x1a\xa9\x17AK\xad\
-8\x1e\xc7\xbd#\xb4\xd7\x8c1\x88D\xdf\x8f:\xb8\xab\
-\x9b\xaf5\xa8\x0d\xf3\xf6\x18.=\x8e\x83)m\xe3\xd5\
-\xdb\x12\xa9\xf7\xe5Vl\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
-\xdb\x02\xe0\xa1\x91a\xd4\xc2\xb5+\x97Y\x9c\xbf\xbe\x05\
-\x036\xf8\xc0`\xad\x02\x0b\xdb\xc3\xc0P\xad\xc2\xec\xc5\
-K\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa66\x04`$^\
-J\x05\x12\x0b\xed\x91'\xa9=\x0co\x1f8\xc8f\xc7\
-\x81':\xf1*\xe75\x1e2\x81\x14(\xbap\xf9\xea\
-U\xce4\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1fN\x1d\x02\x0eo\
-\x08\xe0\xb3\x8f>\xe0\xa7\xd3'W\x99\xe9\xda\xa3\x86U\
-\xe6\xbb\x1e\x04\x1b<_\x1do|w\xee\x8f\xd9_\x0e\
-\x01\x87\x1b\x8d\xc6_\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5s\
-l}\xf25\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1?M\xf0\
-K\xb9\xe8F\x89\xaf\x00\x00\x00\x00IEND\xaeB\
-`\x82\
\x00\x00\x08\x19\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -215,91 +138,62 @@ H\x8f\xaa\x1e/\x9a5\xe6\xc7\x7fz\xf3-Wx\xac\
\xff\xdam\x8a\xdda\x99\xd5\x1b\xb6\xd8k\xbb^2\xbe\
/\x89\xff\x01f\xb9_\xfc\x11\x80=\xcf\x00\x00\x00\x00\
IEND\xaeB`\x82\
-\x00\x00\x05+\
+\x00\x00\x03T\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
\x00\x00\x00\x19tEXtSoftware\
\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x04\xbdIDATX\xc3\xed\
-WkL\x93W\x18>#q\xc92\xe9\x16\x97\xa8T\
-e8\x9d\x02\x15\xf6\x03\x872\x93\x01f,[p\xc4\
-0\xff`\xa2.\x1a:\x1dN\x03\xba1\x89[\xb3\x80\
-\xd9\x0c\x84\x02\x19X\x1c\x14\x8b\x85\xb2\x82\x95^\xe4f\
-\x0b\x8e1\xf8\xc3F\xcb-\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
-ji\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0da\xd9\xb2\x93\
-<\xed\x97\xf3}\xfd\xde\xe7\xbc\xef\xf3^J\x00\x80\xfc\
-\x93 \xff\x0a\x02t\x09(D\x14\xd9\x14q\x14\x01+\
-F\x80\xae\xddd\xdd\xc6f\x22L\xf8\x95\xc4\x8bG\xc8\
-\xa1\xd3\xf7\xc8\x8e\x97;82a+A \x85\x9c\xbe\
-0H.\xdd\x80\x19@2\xabyM\xf4\xbe\xfbr\x13\
-hd\x06\x91\x04^\xa3Q\xf4\x06\xee\x85G\xf5\xd0\xbd\
-\x83\xcbM \x9b\x9d\xf6@t/\xbd\x162= \x89\
-?H\xa5,\x1b\x01\x8c1y\xc1\xbb\x9d\x88K\xc6\xd7\
-\xc6&\x0e\xa0\x10\xb9\xfdB\xfe\xc5+6F\x8c\x12\x5c\
-N\x02\x93\xa7\xa7\xa7\x0d\xcc\xd39\xb9\x98c6\x14\x0a\
-\xd2\xe4\xa3+A \x8c)\x9e*\xdf7G\xeb\xdc{\
-\xb5\xcc\x89\x9e@D\x96T\x83+,\x0b6FH\x08\
-\x13\xf5d*{.T\x03\x01\xf8\x037\xbf\xc0\x0e4\
-*T\xdfb\x88R\xd5,X\x03t\x1d\x16\x08\x04z\
-EU\xf5\xc8\xa0mt\xc2\xd4s\xf7!\xbesQ\x95\
-\x90\xae\x8f\xd0\x13\xcf\xe5\x94\x83\x87\xb4\x02\x9e\xcc.\x03\
-\xd4\x06\xdd\xaf\x99\xcb\xb0\xaf\xaf\xaf>\xbf\xd2`\xb5\xdb\
-\xed\x80\xf8y\xe4>\xc4^\xab\xb4\xb9\x88/\x86\x80'\
-\xd3\xc0g\xf9\x8e\x19\xf5`\xd7^3\xbav\xdas\xee\
-h\xd8\xc7\xc7G\x9f\xab\xab\xb0\x0e\x0f\x0d\xc1\x10\x87\xb2\
-\xf6.\xe7\x967\xf7wsa\xd8\xbd\xe8^\x80/f\
-\x9a\xa0\x86\xdf\xa96B\xf7\xf0\x03\xd8\x19\x9f\xd4\xcf\xa5\
-\xe7\x1a\x8a\x98-~\xfem\x97T\x1ak__\x1f\xb8\
-\xd0\xd1s\x07br\x15VN\xc4\x87\x97\xd4\x8c0\x14\
-\xe9\x15\xb7\x1e8\x1c\x0e@\xa4\xd6\x191\x9e\x85\x9b\x05\
-~m\xa9%\x1a[\x97\xd9\x0c\xe6.\x0a\xf3$\x14\xdf\
-6\x8e{\xbd\x1e\xd1\xcdB\xc8\x09o\xa9\x04<\xd1\xbd\
-V\xab\x15\x10w\x7f\x1b\x84\xf3\x92\x5c\xbbR\xa9\x84\xfa\
-\xfaz0\x99L\x0cu\xdf5\xc1Q\xb1d\x18\xc9Q\
-D>\xb6v\xcc\xb4@O\x93_~\xd3\xd6\xdf\xdf\x0f\
-2\x99\x0cD\x22\x11\xa8T*\x90J\xa5\xa0\xd1h \
-K[9\xbe\xe9\x95\xe0\x1f\xb8S\xafy,\xf3\x00\x97\
-\x8e\x22\x9e\xc7\x86\xe6S)\x19\xf6\x82\x82\x02\xe6\xe2\xa0\
-\xa0 \xe0\xf1x`\xb1X@[^\x01\xfb\xcf&\x0c\
--\xa6S\xceg\x94\xcf\x09L\x83\xe2[{\xe6\xc2`\
-\x9a\xb2\x14\x14\x0a\x05\x88\xc5b\xc8\xcc\xcc\x84\xa2\xa2\x22\
-P\xab\xd5\xd0\xd9\xd9\xc9`\xec\xfe\xc9\xb9\xc9\xdb\xa7u\
-.\xb7\xcfK\x80\xae\xb7\xd8)p\x0e\xc0j\x97\xacx\
-\x88\xca\x7f\x82\xe2)\x89\x0e>\x97+![\x96\x0f\x07\
-c\xe3G\x84\x1f&\xd8\x92rd\x8eo\x1a\xbf\x07\xa3\
-\xd1\x08-\xad-\xf0\xcb\xc0 \x1c8\xf1\xbe\x05\xb3b\
-\xc1\x04\x5ci\x84\x85\x85\x84F\xdc&\xe72\xac,\xcf\
-3\xb5\x13\xec;\xe3\xba\xd33\xaf\x82\xe5\xfez\x89\x06\
-\x9e\xde\xfcb\x1b\xf7<\x92\x8d{f\xabO[\xca5\
-\xedXCC=444\x80\xa5\xb7\x172\x14\xc5\xc3\
-\xf3\xe9\xc0e<\x92\xe5(\x9e6]\xe5\x9c*2x\
-}\xf4\x83.Zl\x121\x0c\x1b%\xeaq\xf7/\xcb\
-'\xef\x05\x87_\xfe\xd3\xe4D\x0bLh\xf4\xc9>u\
-\x95\x1e\x0c\x06\x03\xb4\xb7\xb7\xc3\xd7\xc6\x961\xae\x81\x09\
-f\xf16m8h<I::e\xf8b\x81\x83D\
-\xbdWC\xb6\x0a^\x9b*\xc3\x94\x5c\xb0B\x0f\xab$\
-\xb4\x04\x9fJ\xaa\x9bC71(\xd4O\xf2\x0a\xc7t\
-:\x1d\xd4\xd6\xd6\x82\xc9|\xdb\xb9a\x9b\xf7_\xeab\
-\xb2\xe5~\x9cu\x1f\x0d\xf3\xb2\xd4N\xf2\xf6\xb1\xeb.\
-\xb6\xae\x94\xc3\x90l\x97U\xc1KW\xab\x80\x9cMn\
-Z\xd0\x1cI\xbd\xb1\xe7\x88\xb0\xef\xcaW\xc5PZZ\
-\x0a\x1d?\xf6L\x04\x06\x87t<\xaa\x0b\xc2\x84F\x8d\
-\x07\xc8o\x02\xd9\xf9\xaa~\x9a\xf10F\x8e6 \xaf\
-\xbcJxCi\x00\x92(\x1d\x98\xcd\x95\xb3y\xc3}\
-=\xbf\xf9Dj\xa6].\x97CSK+D\x1c{\
-\xf7\xce\xf4\x14%\xae\xf1\x8a\xf5w\x9c\xf5p\x02\xc2\xd9\
-\x0f\x89\xd1\x81\x03O\x8e\xf7\xdc\xd2i\xe7\xf3\xdfu\xfc\
-o\x14.6\xd2\xef\xd8\x17iI\xbe,\x9d\xc8\xd3\x96\
-;\xa7\x0f1\x8c%\xc6\xdf\x9f\xbaw_q5\xa0A\
-l\xb5\x08\x8c\xf9\x94\xf1\xe0\xf03K\x9a|h\x13Z\
-\xbd\xce\xa3\xd9kOH\xf7\x0c\x0f\xb0\x0f\xfe\xf3\x87\xc8\
-\xf9/\xee\xb9In\x00\xf6{>\xed\xf7\x08\x1e*>\
-]\xe5X\xaa\xf1GZ\xf5\xb6Y\x0b\x11\x1d\xb3C\xc9\
-\x918\x099\xf9\xa9\x96!\xfa\x5c\x1a\x0d\xcf\xb3\xff\xff\
-7\xfcO\x13\xf8\x1d\xe7\x87\x19\xb9D\xc3\x01\xcf\x00\x00\
-\x00\x00IEND\xaeB`\x82\
+yq\xc9e<\x00\x00\x02\xe6IDATX\xc3\xd5\
+\x97\xcdN\x13a\x14\x86\xeb5\x94\x95{q\xe1\xd2\xc4\
+\xe0\x05\xb8\xe2\x0e\x5c\xb8\xf4\x02\x5c\xb10\xea\x05\x18\x96\
+&bX\xb8\xb0\x91X \xd1\x9d\xbf\x89\xa4\x14\xb1R\
+\xa4HE\x94\xfe\xd0\x02C\xff\xa6\x9d\x19\xa6e\x80\xe3\
+y{\xfa\x85QJ\x82\xc9!\x86I\xde\x9c3\xa7\xf3\
+\xcd\xfb\x9c\xf3M\x9bN\x84\x88\x22\xffS\x91s\x01\xc0\
+\xc7\xd5\x90n\xff\xa5\xfb\xac\xc7==d\x0d\xa9\x02\xf0\
+12<<\xbcj4::\xba\x19V<\x1e\xaf&\
+\x93\xc9V:\x9dv\x13\x89Dk`` \xcdkn\
+h\x02\xa48\xd2\xe1\xe1q\x99\xba\xef\xb7\xc9\xb2,\xda\
+\xdf\xdf'\x86\xf1x\xcd\x18\xeb\x8a\x1a@?\xf3\xb0\x1c\
+\xc7\xa5Lf\xb9\x0b\x14\x04\x01\xc5b\xb1:\xaf{p\
+\x1a\x88S\x01\x1c\x1c\x10ww\xb2l\xdb\xa1\xf9\xf9\xcf\
+d\x0e\xd7u\xe9\xf9\xc4D\x17B\x05\x00&{\xc1\xc9\
+\xaa7\x1cJ\xce\xcdS\xf8p]\x0f\x8b\x17T\x00\x82\
+\x10@gO\x14\xce\xed\xa6G\x1fgf\xe9\xf5\x9b\xb7\
+\x14\x9f\x9c\xa4\xa9\xa9iz\xf7\xfe\x03E\xa3\xd1e^\
+\x7fA\x05\xc0\xef\x10\xed\xb6%\x86\x85\x9a\xe3\x05\x94]\
+\xcd\xd1\xe4\xf4+z2\xfe\x94\x9e\xc5^\xd0Lb\x0e\
+\x8b\x17U\x00\xda\x81\x18\xf5\x13 <\xff\x90j\xcd6\
+\x157\xab\x94/nS\x89c\x8d\xb7\x85\xd7~Q\x01\
+\xf0y\xcc\xcd]\x1e\xb5\xc7{\xdb\xee\x9f;\xbe\xe4\x88\
+]\xb8\xbd\xee\xe2\x94\xca3\xe0u\xe4\xc6uWb\xd8\
+\x109\xea\xe63D\xd4\x01\xa7\x06\xe0\xf4:\xad9\x22\
+\x98\x98hr\x80\x98kPS\x9d\x00\x00*-\xb91\
+\xe2NS\x8c\x10\x0d\x04\xf2m\xfb(\xb6|E\x00\x9b\
+;\xdbj\xfci\x8e<l\x88\x1a\xae9\x13\x80:\x8f\
+\xb7T#*\xd7\xc5\x04\x06\x06\x005(\x9c\x17\xab\xbc\
+%\xbb\xca\x13\xc0Ma\x0e\x15*rn\xcc~Z\x02\
+hj\xdd\xad\xf1\x94'\x00S\xdc\x1cqm[@`\
+\x9a\xab\x1cu\x9e\xeb\x81A\x15G\x11\xc0j\x891\x0c\
+\xd6w\x04 \x0cd&b\xb6iu\x8b\xa8\xaa\x09P\
+\xb6\xc5\xbc\xd0\x03\xf8\xbe)c\x87)`\x0c\x18\x84\x1c\
+\x00[ME\x00t\x03S\x98\xad\x94\xc5\x1c\xe7F\xe6\
+\x1c\x00\xc8q]\xa9\xa1\x08\x80\xfd\xfcV\x12s3\x01\
+\x085\x18B\xe8\xda|\x8e)\xa8N\x00[\x00\x03\xc8\
+\x98g6\x04\x002\xe6\x85\xde\xf8\x17\x0b\xfc,\xd8\x8a\
+\x00\x18g:O\xb4T\x14#\x98\x02\x00\x02\x0c>\xfb\
+\xc5S(\xf0C\xb8fI\xf7k\xf9R\x87\xd7\xbeT\
+\x01\xc8U\x8f\xbaN\xadK\x0e\x90\xaf\x85\xde\xb7\xc2\x92\
+=O\xa6\xb3\xde\xa3\xb1q\xeb\xda\xd0\xf5\x15\x98\xb3n\
+\xa9\x00l4\xa4k\x18\xff\xe0\x11\x7fZ\x17S\xd4\x13\
+\x0bYo\xe4\xee\xbd\xe2\xa5\xc1\xcbK|m\x8cu\x87\
+5\xa8\xfa\xb7\x1c\xdde\xd9<\x8f\x1f\x19\xfe\x9e\xcf\x1e\
+7\xbd\xc9\xbax&oF\x00h\xf2\xff\x81\x99\x94\x9e\
+\xe9?\xbf\x19\x01B\xd3\xf4\xfc\xbd\x9c\x9e\xa5~\x03Q\
+l%\xa1\x92\x95\x0aw\x00\x00\x00\x00IEND\xae\
+B`\x82\
\x00\x00\x05:\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -386,62 +280,91 @@ gSuV\x00\x8d\x8d\x8dn\x8b\xc5\x82\x81\x81\x81H\
mm\xad377WV\xd3\xdd\x00\xf8\x7fFL\xc2\
A\x99n\xd7\xdfC9V\x18\x85p\xc8\x04\x00\x00\x00\
\x00IEND\xaeB`\x82\
-\x00\x00\x03T\
+\x00\x00\x05+\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
\x00\x00\x00\x19tEXtSoftware\
\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x02\xe6IDATX\xc3\xd5\
-\x97\xcdN\x13a\x14\x86\xeb5\x94\x95{q\xe1\xd2\xc4\
-\xe0\x05\xb8\xe2\x0e\x5c\xb8\xf4\x02\x5c\xb10\xea\x05\x18\x96\
-&bX\xb8\xb0\x91X \xd1\x9d\xbf\x89\xa4\x14\xb1R\
-\xa4HE\x94\xfe\xd0\x02C\xff\xa6\x9d\x19\xa6e\x80\xe3\
-y{\xfa\x85QJ\x82\xc9!\x86I\xde\x9c3\xa7\xf3\
-\xcd\xfb\x9c\xf3M\x9bN\x84\x88\x22\xffS\x91s\x01\xc0\
-\xc7\xd5\x90n\xff\xa5\xfb\xac\xc7==d\x0d\xa9\x02\xf0\
-12<<\xbcj4::\xba\x19V<\x1e\xaf&\
-\x93\xc9V:\x9dv\x13\x89Dk`` \xcdkn\
-h\x02\xa48\xd2\xe1\xe1q\x99\xba\xef\xb7\xc9\xb2,\xda\
-\xdf\xdf'\x86\xf1x\xcd\x18\xeb\x8a\x1a@?\xf3\xb0\x1c\
-\xc7\xa5Lf\xb9\x0b\x14\x04\x01\xc5b\xb1:\xaf{p\
-\x1a\x88S\x01\x1c\x1c\x10ww\xb2l\xdb\xa1\xf9\xf9\xcf\
-d\x0e\xd7u\xe9\xf9\xc4D\x17B\x05\x00&{\xc1\xc9\
-\xaa7\x1cJ\xce\xcdS\xf8p]\x0f\x8b\x17T\x00\x82\
-\x10@gO\x14\xce\xed\xa6G\x1fgf\xe9\xf5\x9b\xb7\
-\x14\x9f\x9c\xa4\xa9\xa9iz\xf7\xfe\x03E\xa3\xd1e^\
-\x7fA\x05\xc0\xef\x10\xed\xb6%\x86\x85\x9a\xe3\x05\x94]\
-\xcd\xd1\xe4\xf4+z2\xfe\x94\x9e\xc5^\xd0Lb\x0e\
-\x8b\x17U\x00\xda\x81\x18\xf5\x13 <\xff\x90j\xcd6\
-\x157\xab\x94/nS\x89c\x8d\xb7\x85\xd7~Q\x01\
-\xf0y\xcc\xcd]\x1e\xb5\xc7{\xdb\xee\x9f;\xbe\xe4\x88\
-]\xb8\xbd\xee\xe2\x94\xca3\xe0u\xe4\xc6uWb\xd8\
-\x109\xea\xe63D\xd4\x01\xa7\x06\xe0\xf4:\xad9\x22\
-\x98\x98hr\x80\x98kPS\x9d\x00\x00*-\xb91\
-\xe2NS\x8c\x10\x0d\x04\xf2m\xfb(\xb6|E\x00\x9b\
-;\xdbj\xfci\x8e<l\x88\x1a\xae9\x13\x80:\x8f\
-\xb7T#*\xd7\xc5\x04\x06\x06\x005(\x9c\x17\xab\xbc\
-%\xbb\xca\x13\xc0Ma\x0e\x15*rn\xcc~Z\x02\
-hj\xdd\xad\xf1\x94'\x00S\xdc\x1cqm[@`\
-\x9a\xab\x1cu\x9e\xeb\x81A\x15G\x11\xc0j\x891\x0c\
-\xd6w\x04 \x0cd&b\xb6iu\x8b\xa8\xaa\x09P\
-\xb6\xc5\xbc\xd0\x03\xf8\xbe)c\x87)`\x0c\x18\x84\x1c\
-\x00[ME\x00t\x03S\x98\xad\x94\xc5\x1c\xe7F\xe6\
-\x1c\x00\xc8q]\xa9\xa1\x08\x80\xfd\xfcV\x12s3\x01\
-\x085\x18B\xe8\xda|\x8e)\xa8N\x00[\x00\x03\xc8\
-\x98g6\x04\x002\xe6\x85\xde\xf8\x17\x0b\xfc,\xd8\x8a\
-\x00\x18g:O\xb4T\x14#\x98\x02\x00\x02\x0c>\xfb\
-\xc5S(\xf0C\xb8fI\xf7k\xf9R\x87\xd7\xbeT\
-\x01\xc8U\x8f\xbaN\xadK\x0e\x90\xaf\x85\xde\xb7\xc2\x92\
-=O\xa6\xb3\xde\xa3\xb1q\xeb\xda\xd0\xf5\x15\x98\xb3n\
-\xa9\x00l4\xa4k\x18\xff\xe0\x11\x7fZ\x17S\xd4\x13\
-\x0bYo\xe4\xee\xbd\xe2\xa5\xc1\xcbK|m\x8cu\x87\
-5\xa8\xfa\xb7\x1c\xdde\xd9<\x8f\x1f\x19\xfe\x9e\xcf\x1e\
-7\xbd\xc9\xbax&oF\x00h\xf2\xff\x81\x99\x94\x9e\
-\xe9?\xbf\x19\x01B\xd3\xf4\xfc\xbd\x9c\x9e\xa5~\x03Q\
-l%\xa1\x92\x95\x0aw\x00\x00\x00\x00IEND\xae\
-B`\x82\
+yq\xc9e<\x00\x00\x04\xbdIDATX\xc3\xed\
+WkL\x93W\x18>#q\xc92\xe9\x16\x97\xa8T\
+e8\x9d\x02\x15\xf6\x03\x872\x93\x01f,[p\xc4\
+0\xff`\xa2.\x1a:\x1dN\x03\xba1\x89[\xb3\x80\
+\xd9\x0c\x84\x02\x19X\x1c\x14\x8b\x85\xb2\x82\x95^\xe4f\
+\x0b\x8e1\xf8\xc3F\xcb-\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
+ji\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0da\xd9\xb2\x93\
+<\xed\x97\xf3}\xfd\xde\xe7\xbc\xef\xf3^J\x00\x80\xfc\
+\x93 \xff\x0a\x02t\x09(D\x14\xd9\x14q\x14\x01+\
+F\x80\xae\xddd\xdd\xc6f\x22L\xf8\x95\xc4\x8bG\xc8\
+\xa1\xd3\xf7\xc8\x8e\x97;82a+A \x85\x9c\xbe\
+0H.\xdd\x80\x19@2\xabyM\xf4\xbe\xfbr\x13\
+hd\x06\x91\x04^\xa3Q\xf4\x06\xee\x85G\xf5\xd0\xbd\
+\x83\xcbM \x9b\x9d\xf6@t/\xbd\x162= \x89\
+?H\xa5,\x1b\x01\x8c1y\xc1\xbb\x9d\x88K\xc6\xd7\
+\xc6&\x0e\xa0\x10\xb9\xfdB\xfe\xc5+6F\x8c\x12\x5c\
+N\x02\x93\xa7\xa7\xa7\x0d\xcc\xd39\xb9\x98c6\x14\x0a\
+\xd2\xe4\xa3+A \x8c)\x9e*\xdf7G\xeb\xdc{\
+\xb5\xcc\x89\x9e@D\x96T\x83+,\x0b6FH\x08\
+\x13\xf5d*{.T\x03\x01\xf8\x037\xbf\xc0\x0e4\
+*T\xdfb\x88R\xd5,X\x03t\x1d\x16\x08\x04z\
+EU\xf5\xc8\xa0mt\xc2\xd4s\xf7!\xbesQ\x95\
+\x90\xae\x8f\xd0\x13\xcf\xe5\x94\x83\x87\xb4\x02\x9e\xcc.\x03\
+\xd4\x06\xdd\xaf\x99\xcb\xb0\xaf\xaf\xaf>\xbf\xd2`\xb5\xdb\
+\xed\x80\xf8y\xe4>\xc4^\xab\xb4\xb9\x88/\x86\x80'\
+\xd3\xc0g\xf9\x8e\x19\xf5`\xd7^3\xbav\xdas\xee\
+h\xd8\xc7\xc7G\x9f\xab\xab\xb0\x0e\x0f\x0d\xc1\x10\x87\xb2\
+\xf6.\xe7\x967\xf7wsa\xd8\xbd\xe8^\x80/f\
+\x9a\xa0\x86\xdf\xa96B\xf7\xf0\x03\xd8\x19\x9f\xd4\xcf\xa5\
+\xe7\x1a\x8a\x98-~\xfem\x97T\x1ak__\x1f\xb8\
+\xd0\xd1s\x07br\x15VN\xc4\x87\x97\xd4\x8c0\x14\
+\xe9\x15\xb7\x1e8\x1c\x0e@\xa4\xd6\x191\x9e\x85\x9b\x05\
+~m\xa9%\x1a[\x97\xd9\x0c\xe6.\x0a\xf3$\x14\xdf\
+6\x8e{\xbd\x1e\xd1\xcdB\xc8\x09o\xa9\x04<\xd1\xbd\
+V\xab\x15\x10w\x7f\x1b\x84\xf3\x92\x5c\xbbR\xa9\x84\xfa\
+\xfaz0\x99L\x0cu\xdf5\xc1Q\xb1d\x18\xc9Q\
+D>\xb6v\xcc\xb4@O\x93_~\xd3\xd6\xdf\xdf\x0f\
+2\x99\x0cD\x22\x11\xa8T*\x90J\xa5\xa0\xd1h \
+K[9\xbe\xe9\x95\xe0\x1f\xb8S\xafy,\xf3\x00\x97\
+\x8e\x22\x9e\xc7\x86\xe6S)\x19\xf6\x82\x82\x02\xe6\xe2\xa0\
+\xa0 \xe0\xf1x`\xb1X@[^\x01\xfb\xcf&\x0c\
+-\xa6S\xceg\x94\xcf\x09L\x83\xe2[{\xe6\xc2`\
+\x9a\xb2\x14\x14\x0a\x05\x88\xc5b\xc8\xcc\xcc\x84\xa2\xa2\x22\
+P\xab\xd5\xd0\xd9\xd9\xc9`\xec\xfe\xc9\xb9\xc9\xdb\xa7u\
+.\xb7\xcfK\x80\xae\xb7\xd8)p\x0e\xc0j\x97\xacx\
+\x88\xca\x7f\x82\xe2)\x89\x0e>\x97+![\x96\x0f\x07\
+c\xe3G\x84\x1f&\xd8\x92rd\x8eo\x1a\xbf\x07\xa3\
+\xd1\x08-\xad-\xf0\xcb\xc0 \x1c8\xf1\xbe\x05\xb3b\
+\xc1\x04\x5ci\x84\x85\x85\x84F\xdc&\xe72\xac,\xcf\
+3\xb5\x13\xec;\xe3\xba\xd33\xaf\x82\xe5\xfez\x89\x06\
+\x9e\xde\xfcb\x1b\xf7<\x92\x8d{f\xabO[\xca5\
+\xedXCC=444\x80\xa5\xb7\x172\x14\xc5\xc3\
+\xf3\xe9\xc0e<\x92\xe5(\x9e6]\xe5\x9c*2x\
+}\xf4\x83.Zl\x121\x0c\x1b%\xeaq\xf7/\xcb\
+'\xef\x05\x87_\xfe\xd3\xe4D\x0bLh\xf4\xc9>u\
+\x95\x1e\x0c\x06\x03\xb4\xb7\xb7\xc3\xd7\xc6\x961\xae\x81\x09\
+f\xf16m8h<I::e\xf8b\x81\x83D\
+\xbdWC\xb6\x0a^\x9b*\xc3\x94\x5c\xb0B\x0f\xab$\
+\xb4\x04\x9fJ\xaa\x9bC71(\xd4O\xf2\x0a\xc7t\
+:\x1d\xd4\xd6\xd6\x82\xc9|\xdb\xb9a\x9b\xf7_\xeab\
+\xb2\xe5~\x9cu\x1f\x0d\xf3\xb2\xd4N\xf2\xf6\xb1\xeb.\
+\xb6\xae\x94\xc3\x90l\x97U\xc1KW\xab\x80\x9cMn\
+Z\xd0\x1cI\xbd\xb1\xe7\x88\xb0\xef\xcaW\xc5PZZ\
+\x0a\x1d?\xf6L\x04\x06\x87t<\xaa\x0b\xc2\x84F\x8d\
+\x07\xc8o\x02\xd9\xf9\xaa~\x9a\xf10F\x8e6 \xaf\
+\xbcJxCi\x00\x92(\x1d\x98\xcd\x95\xb3y\xc3}\
+=\xbf\xf9Dj\xa6].\x97CSK+D\x1c{\
+\xf7\xce\xf4\x14%\xae\xf1\x8a\xf5w\x9c\xf5p\x02\xc2\xd9\
+\x0f\x89\xd1\x81\x03O\x8e\xf7\xdc\xd2i\xe7\xf3\xdfu\xfc\
+o\x14.6\xd2\xef\xd8\x17iI\xbe,\x9d\xc8\xd3\x96\
+;\xa7\x0f1\x8c%\xc6\xdf\x9f\xbaw_q5\xa0A\
+l\xb5\x08\x8c\xf9\x94\xf1\xe0\xf03K\x9a|h\x13Z\
+\xbd\xce\xa3\xd9kOH\xf7\x0c\x0f\xb0\x0f\xfe\xf3\x87\xc8\
+\xf9/\xee\xb9In\x00\xf6{>\xed\xf7\x08\x1e*>\
+]\xe5X\xaa\xf1GZ\xf5\xb6Y\x0b\x11\x1d\xb3C\xc9\
+\x918\x099\xf9\xa9\x96!\xfa\x5c\x1a\x0d\xcf\xb3\xff\xff\
+7\xfcO\x13\xf8\x1d\xe7\x87\x19\xb9D\xc3\x01\xcf\x00\x00\
+\x00\x00IEND\xaeB`\x82\
\x00\x00\x06m\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -547,6 +470,83 @@ n\x11`p\xf0\xfdt___\xfa\xcc\x993\xa6\xc5\
\xa5\xd0\x8fx\x02\x89\xb5\x9ec!D\x18x\x13\xd8O\
is\x06\xb4\xf8\xb1\xfa\x1f\xbd\xfa*_\xf2\xd8\x15\x9d\
\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\xa3\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x045IDATX\xc3\xe5\
+\x97\xcd\x8fTE\x14\xc5\x7f\xb7\xea\xd6{\xaf\xdbn\xc7\
+\xf9@\x9d\x89FM4\x99D\x8d\x1aH\x98\xc4\x8c\x1f\
+\x1b\xfe\x02L\x5c\xf1\x07\x18\x16.M\x5ckX\xc3\x8e\
+\xc4\x8d\x1b\x17\xce\x82htA\x5c\x18\x0d\xe2\xc4\xc6\x00\
+=`PQ\x19`\x02\xa2\x0e\x0c\x83\xd3\xfd^\xf7\x94\
+\x8b\xaa\xee\xf9`\xe6\x0d\x84Q\x16VR\xa9\xce{\xb7\
+\xeb\x9e:\xf7\xd4\xa9z\xea\xbd\xe7~6\xe5>\xb7>\
+\x80]\xbbv\xbd\x03\xec\xfd\x8f\xf2N5\x1a\x8d\x03\xeb\
+\x19\xd8\xbb\xef\xbd\xa3;\x1f\x1fv\x00\x9c<:\xcf\xcc\
+\x977X\x9c\xef\xdcS\xa6\xda\xa0\xf2\xdck\x03\xbc\xb8\
+g\x10\x80\x8b\x7f\x16|\xf8\xee\x1e\x80\xdb\x00p\xfc\xec\
+\x1c\xdf?0\x04x.\xfd\xb8\xc0\xfe\xb7\xceo\xcbr\
+\x0f\x1dy\x9a\x0b#\x96\xd3\x9f\x1fd\xfc\xd5}\x9bk\
+@E\xb0\x16@xp,#\xcb\xb2m\x0100\x96\
+a\x8dP\x1b|\x14#%\x22\x14+\xd8\x18\x91\xd5\x95\
+s\xe7\xce\x83*\xb8\x04\xd2\x14\xb2\x0c\xd2,\x8cI\x0a\
+I\x12\xdew:\x90\xe7\x90\xb7\xa1\xd5\x82v+\x8em\
+(r\xb2\xfa8\xd6\x0a\xe3\xaf\xbcIk\xf1\xfa\xe6\x00\
+\xac\x15\xac\x15\x04\xb0F\xd8\xbd{\xe7\x16k\xeb\x86\xae\
+\x80Z\xa8V\x81\xeamQ\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
+\x84\x01g\x055\x82\x08\xa8\x0a\x95,\xc3# \x1e\x08\
+\xc0\xf0\x1e/\x02\xde#\x12&\x15|\x88#\xc4!\x1e\
+<!^@MX\x18@\xd7J\x89\x06\xac\xa0\xdac\
+\x00\x9a3\xbf\x05\x8aS\x07i\x02\x95\x04\xb24\xf6\x04\
+\x12\x07N\xa1\xe8@^@+\x8f\xbd\x05K9\xb4s\
+\xc8\x0bT\x87q=\x00*\xe5%p1@\xd509\
+\xf9\xd2\xd6\x0a\xf3>\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8'a\
+a\xbd\x1c%% \x00\xf0\x81\x8d4M\xa3:\xc3\xb3\
+\x98\x11\x89l\x07\xdac\x09V\x98_)F\xfca\xcd\
+r\x7fa\x1d-\xd1\x80:\x09TI\x18O4/\xe0\
+\x9d\x85\xc4!\x89\xc3g\x09\x92i\xd8\x11\x89\xe2\x13\x87\
+X\x8b\xefv\x91\xbc\x80\xbc\x03\xed\x02\xdfj#\xed\x02\
+\xf2\x02\x9fwP\x1dE\xd5 x:\xebTx\x9b\x06\
+\x9c3x\x0f\x03\x8f$\xbc\xfe\xf2\xf3wh\xe86h\
+\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04R^\x82DM_\x84\
+\x8f\x0d\xa58\xe7\xb6\xc5\x88\x9e\x18K\xb9v\xb3\x03\x08\
+\x9dR\x11\xaa\x90\xb8P\xefZ\xc50}\xb1\xcb@\xc5\
+\xb0\x0e\xf4&\xadW\xf9U.\xe1\xe1\xc6\xd22\xf5\xcc\
+p}\xc9\x84-\xe9J\x19\x10\x9c\x1a\xc0s\xe5f\x97\
++7\xbb\xacQW?\xd7\xaad~\xc5'\xa2)\xac\
+\x05\x15\xc3\x9c\x0b\xb5w\xa6l\x17\xa8\xc1\xa9 \xc8\x1a\
+5\xaf\x9b5\x1a\x8fY1\x9e\xfe{\xe9\xef\x14\x00\xf1\
+\x82\xef\x9bX0+WV\x02U!\xd1\x90\xfc\xe7S\
+\xdf\xf2\xeb\x99\x13,-\xde\xb8\xa7\xfaWj\x03<\xf5\
+\xecN\x9eya\x02\x0f\xa83[1\x10\x03|\x87\xf7\
+\xf7\xbf\xc1\xc2\xc2\x02\xb7n\xdd\xa2(\x0aD\x04k-\
+\xd6ZT\x15U\xc59\x87\xaab\xad\xc5\x98\xf0\xdf\xe5\
+\xe5e\xf2<\xef\xf7#\xcd\xf9\xb8\xf2-\x18pVP\
+\x17\x18\xdc1:\xb6rO8~\x9c\xe9\xe9i\x8c1\
+x\xef\x99\x98\x98`rr\xf2\x8eY\xd81:\xd6\xdf\
+\x86\xae\xd4\x09Up6\xac\xa2V\xaf\xf7k933\
+\xc3\xd0\xd0\x10\xd6Z\xbc\xf74\x9b\xcd\xbb\x02P\xab\xd7\
+p\xd1\x88\xb4\xd4\x88\x14\x9c\x0b'\x5c\xa0*\x00\xa8V\
+\xabdY\xd6\xa7\xb87\xdeis\x1a\xa9\x17AK\xad\
+8\x1e\xc7\xbd#\xb4\xd7\x8c1\x88D\xdf\x8f:\xb8\xab\
+\x9b\xaf5\xa8\x0d\xf3\xf6\x18.=\x8e\x83)m\xe3\xd5\
+\xdb\x12\xa9\xf7\xe5Vl\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
+\xdb\x02\xe0\xa1\x91a\xd4\xc2\xb5+\x97Y\x9c\xbf\xbe\x05\
+\x036\xf8\xc0`\xad\x02\x0b\xdb\xc3\xc0P\xad\xc2\xec\xc5\
+K\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa66\x04`$^\
+J\x05\x12\x0b\xed\x91'\xa9=\x0co\x1f8\xc8f\xc7\
+\x81':\xf1*\xe75\x1e2\x81\x14(\xbap\xf9\xea\
+U\xce4\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1fN\x1d\x02\x0eo\
+\x08\xe0\xb3\x8f>\xe0\xa7\xd3'W\x99\xe9\xda\xa3\x86U\
+\xe6\xbb\x1e\x04\x1b<_\x1do|w\xee\x8f\xd9_\x0e\
+\x01\x87\x1b\x8d\xc6_\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5s\
+l}\xf25\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1?M\xf0\
+K\xb9\xe8F\x89\xaf\x00\x00\x00\x00IEND\xaeB\
+`\x82\
"
qt_resource_name = b"\
@@ -555,29 +555,29 @@ qt_resource_name = b"\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
\x00\x08\
-\x08\xc8Xg\
-\x00s\
-\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
-\x00\x08\
\x06\xc1Y\x87\
\x00o\
\x00p\x00e\x00n\x00.\x00p\x00n\x00g\
\x00\x07\
-\x0a\xc7W\x87\
-\x00c\
-\x00u\x00t\x00.\x00p\x00n\x00g\
+\x04\xcaW\xa7\
+\x00n\
+\x00e\x00w\x00.\x00p\x00n\x00g\
\x00\x08\
\x06|Z\x07\
\x00c\
\x00o\x00p\x00y\x00.\x00p\x00n\x00g\
\x00\x07\
-\x04\xcaW\xa7\
-\x00n\
-\x00e\x00w\x00.\x00p\x00n\x00g\
+\x0a\xc7W\x87\
+\x00c\
+\x00u\x00t\x00.\x00p\x00n\x00g\
\x00\x09\
\x0a\xa8\xbaG\
\x00p\
\x00a\x00s\x00t\x00e\x00.\x00p\x00n\x00g\
+\x00\x08\
+\x08\xc8Xg\
+\x00s\
+\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -585,18 +585,18 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00h\x00\x00\x00\x00\x00\x01\x00\x00\x171\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x00\x11\xf3\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00(\x00\x00\x00\x00\x00\x01\x00\x00\x04\xa7\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x00(\x00\x00\x00\x00\x00\x01\x00\x00\x08\x1d\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00<\x00\x00\x00\x00\x00\x01\x00\x00\x0bu\
+\x00\x00\x01z\xe7\xee'\x09\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00|\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x89\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00>\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xc4\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00~\x00\x00\x00\x00\x00\x01\x00\x00\x1cS\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00f\x00\x00\x00\x00\x00\x01\x00\x00\x15\xe2\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x00\x10\xb3\
+\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
diff --git a/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.png b/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.png
new file mode 100644
index 000000000..bd7c27cfd
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.png
Binary files differ
diff --git a/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.rst b/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.rst
new file mode 100644
index 000000000..0e3a15c0d
--- /dev/null
+++ b/examples/widgets/mainwindows/dockwidgets/doc/dockwidgets.rst
@@ -0,0 +1,9 @@
+Dock Widget Example
+===================
+
+The Dock Widgets example shows how to add dock windows to an application. It
+also shows how to use Qt's rich text engine.
+
+.. image:: dockwidgets.png
+ :width: 400
+ :alt: Dock Widgets Screenshot
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets.py b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py
index 53f6f7818..83487ee58 100644
--- a/examples/widgets/mainwindows/dockwidgets/dockwidgets.py
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets.py
@@ -1,125 +1,90 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/mainwindows/dockwidgets example from Qt v5.x, originating from PyQt"""
-
-from PySide2.QtCore import QDate, QFile, Qt, QTextStream
-from PySide2.QtGui import (QFont, QIcon, QKeySequence, QTextCharFormat,
- QTextCursor, QTextTableFormat)
-from PySide2.QtPrintSupport import QPrintDialog, QPrinter
-from PySide2.QtWidgets import (QAction, QApplication, QDialog, QDockWidget,
- QFileDialog, QListWidget, QMainWindow, QMessageBox, QTextEdit)
-
-import dockwidgets_rc
+"""PySide6 port of the widgets/mainwindows/dockwidgets example from Qt v5.x,
+ originating from PyQt"""
+
+import sys
+
+from PySide6.QtCore import QDate, QFile, Qt, QTextStream
+from PySide6.QtGui import (QAction, QFont, QIcon, QKeySequence,
+ QTextCharFormat, QTextCursor, QTextTableFormat)
+from PySide6.QtPrintSupport import QPrintDialog, QPrinter
+from PySide6.QtWidgets import (QApplication, QDialog, QDockWidget,
+ QFileDialog, QListWidget, QMainWindow,
+ QMessageBox, QTextEdit)
+
+import dockwidgets_rc # noqa: F401
class MainWindow(QMainWindow):
def __init__(self):
- super(MainWindow, self).__init__()
+ super().__init__()
- self.textEdit = QTextEdit()
- self.setCentralWidget(self.textEdit)
+ self._text_edit = QTextEdit()
+ self.setCentralWidget(self._text_edit)
- self.createActions()
- self.createMenus()
- self.createToolBars()
- self.createStatusBar()
- self.createDockWindows()
+ self.create_actions()
+ self.create_menus()
+ self.create_tool_bars()
+ self.create_status_bar()
+ self.create_dock_windows()
self.setWindowTitle("Dock Widgets")
- self.newLetter()
+ self.new_letter()
- def newLetter(self):
- self.textEdit.clear()
+ def new_letter(self):
+ self._text_edit.clear()
- cursor = self.textEdit.textCursor()
+ cursor = self._text_edit.textCursor()
cursor.movePosition(QTextCursor.Start)
- topFrame = cursor.currentFrame()
- topFrameFormat = topFrame.frameFormat()
- topFrameFormat.setPadding(16)
- topFrame.setFrameFormat(topFrameFormat)
-
- textFormat = QTextCharFormat()
- boldFormat = QTextCharFormat()
- boldFormat.setFontWeight(QFont.Bold)
- italicFormat = QTextCharFormat()
- italicFormat.setFontItalic(True)
-
- tableFormat = QTextTableFormat()
- tableFormat.setBorder(1)
- tableFormat.setCellPadding(16)
- tableFormat.setAlignment(Qt.AlignRight)
- cursor.insertTable(1, 1, tableFormat)
- cursor.insertText("The Firm", boldFormat)
+ top_frame = cursor.currentFrame()
+ top_frame_format = top_frame.frameFormat()
+ top_frame_format.setPadding(16)
+ top_frame.setFrameFormat(top_frame_format)
+
+ text_format = QTextCharFormat()
+ bold_format = QTextCharFormat()
+ bold_format.setFontWeight(QFont.Bold)
+ italic_format = QTextCharFormat()
+ italic_format.setFontItalic(True)
+
+ table_format = QTextTableFormat()
+ table_format.setBorder(1)
+ table_format.setCellPadding(16)
+ table_format.setAlignment(Qt.AlignRight)
+ cursor.insertTable(1, 1, table_format)
+ cursor.insertText("The Firm", bold_format)
cursor.insertBlock()
- cursor.insertText("321 City Street", textFormat)
+ cursor.insertText("321 City Street", text_format)
cursor.insertBlock()
cursor.insertText("Industry Park")
cursor.insertBlock()
cursor.insertText("Some Country")
- cursor.setPosition(topFrame.lastPosition())
- cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"),
- textFormat)
+ cursor.setPosition(top_frame.lastPosition())
+ cursor.insertText(QDate.currentDate().toString("d MMMM yyyy"), text_format)
cursor.insertBlock()
cursor.insertBlock()
- cursor.insertText("Dear ", textFormat)
- cursor.insertText("NAME", italicFormat)
- cursor.insertText(",", textFormat)
+ cursor.insertText("Dear ", text_format)
+ cursor.insertText("NAME", italic_format)
+ cursor.insertText(",", text_format)
for i in range(3):
cursor.insertBlock()
- cursor.insertText("Yours sincerely,", textFormat)
+ cursor.insertText("Yours sincerely,", text_format)
for i in range(3):
cursor.insertBlock()
- cursor.insertText("The Boss", textFormat)
+ cursor.insertText("The Boss", text_format)
cursor.insertBlock()
- cursor.insertText("ADDRESS", italicFormat)
+ cursor.insertText("ADDRESS", italic_format)
def print_(self):
- document = self.textEdit.document()
+ document = self._text_edit.document()
printer = QPrinter()
dlg = QPrintDialog(printer, self)
- if dlg.exec_() != QDialog.Accepted:
+ if dlg.exec() != QDialog.Accepted:
return
document.print_(printer)
@@ -127,57 +92,60 @@ class MainWindow(QMainWindow):
self.statusBar().showMessage("Ready", 2000)
def save(self):
- filename, _ = QFileDialog.getSaveFileName(self,
- "Choose a file name", '.', "HTML (*.html *.htm)")
- if not filename:
+ dialog = QFileDialog(self, "Choose a file name")
+ dialog.setMimeTypeFilters(['text/html'])
+ dialog.setAcceptMode(QFileDialog.AcceptSave)
+ dialog.setDefaultSuffix('html')
+ if dialog.exec() != QDialog.Accepted:
return
+ filename = dialog.selectedFiles()[0]
file = QFile(filename)
if not file.open(QFile.WriteOnly | QFile.Text):
+ reason = file.errorString()
QMessageBox.warning(self, "Dock Widgets",
- "Cannot write file %s:\n%s." % (filename, file.errorString()))
+ f"Cannot write file {filename}:\n{reason}.")
return
out = QTextStream(file)
- QApplication.setOverrideCursor(Qt.WaitCursor)
- out << self.textEdit.toHtml()
- QApplication.restoreOverrideCursor()
+ with QApplication.setOverrideCursor(Qt.WaitCursor):
+ out << self._text_edit.toHtml()
- self.statusBar().showMessage("Saved '%s'" % filename, 2000)
+ self.statusBar().showMessage(f"Saved '{filename}'", 2000)
def undo(self):
- document = self.textEdit.document()
+ document = self._text_edit.document()
document.undo()
- def insertCustomer(self, customer):
+ def insert_customer(self, customer):
if not customer:
return
- customerList = customer.split(', ')
- document = self.textEdit.document()
+ customer_list = customer.split(', ')
+ document = self._text_edit.document()
cursor = document.find('NAME')
if not cursor.isNull():
cursor.beginEditBlock()
- cursor.insertText(customerList[0])
+ cursor.insertText(customer_list[0])
oldcursor = cursor
cursor = document.find('ADDRESS')
if not cursor.isNull():
- for i in customerList[1:]:
+ for i in customer_list[1:]:
cursor.insertBlock()
cursor.insertText(i)
cursor.endEditBlock()
else:
oldcursor.endEditBlock()
- def addParagraph(self, paragraph):
+ def add_paragraph(self, paragraph):
if not paragraph:
return
- document = self.textEdit.document()
+ document = self._text_edit.document()
cursor = document.find("Yours sincerely,")
if cursor.isNull():
return
cursor.beginEditBlock()
- cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor,
- 2)
+ cursor.movePosition(QTextCursor.PreviousBlock,
+ QTextCursor.MoveAnchor, 2)
cursor.insertBlock()
cursor.insertText(paragraph)
cursor.insertBlock()
@@ -185,119 +153,121 @@ class MainWindow(QMainWindow):
def about(self):
QMessageBox.about(self, "About Dock Widgets",
- "The <b>Dock Widgets</b> example demonstrates how to use "
- "Qt's dock widgets. You can enter your own text, click a "
- "customer to add a customer name and address, and click "
- "standard paragraphs to add them.")
-
- def createActions(self):
- self.newLetterAct = QAction(QIcon.fromTheme('document-new', QIcon(':/images/new.png')), "&New Letter",
- self, shortcut=QKeySequence.New,
- statusTip="Create a new form letter", triggered=self.newLetter)
-
- self.saveAct = QAction(QIcon.fromTheme('document-save', QIcon(':/images/save.png')), "&Save...", self,
- shortcut=QKeySequence.Save,
- statusTip="Save the current form letter", triggered=self.save)
-
- self.printAct = QAction(QIcon.fromTheme('document-print', QIcon(':/images/print.png')), "&Print...", self,
- shortcut=QKeySequence.Print,
- statusTip="Print the current form letter",
- triggered=self.print_)
-
- self.undoAct = QAction(QIcon.fromTheme('edit-undo', QIcon(':/images/undo.png')), "&Undo", self,
- shortcut=QKeySequence.Undo,
- statusTip="Undo the last editing action", triggered=self.undo)
-
- self.quitAct = QAction("&Quit", self, shortcut="Ctrl+Q",
- statusTip="Quit the application", triggered=self.close)
-
- self.aboutAct = QAction("&About", self,
- statusTip="Show the application's About box",
- triggered=self.about)
-
- self.aboutQtAct = QAction("About &Qt", self,
- statusTip="Show the Qt library's About box",
- triggered=QApplication.instance().aboutQt)
-
- def createMenus(self):
- self.fileMenu = self.menuBar().addMenu("&File")
- self.fileMenu.addAction(self.newLetterAct)
- self.fileMenu.addAction(self.saveAct)
- self.fileMenu.addAction(self.printAct)
- self.fileMenu.addSeparator()
- self.fileMenu.addAction(self.quitAct)
-
- self.editMenu = self.menuBar().addMenu("&Edit")
- self.editMenu.addAction(self.undoAct)
-
- self.viewMenu = self.menuBar().addMenu("&View")
+ "The <b>Dock Widgets</b> example demonstrates how to use "
+ "Qt's dock widgets. You can enter your own text, click a "
+ "customer to add a customer name and address, and click "
+ "standard paragraphs to add them.")
+
+ def create_actions(self):
+ icon = QIcon.fromTheme('document-new', QIcon(':/images/new.png'))
+ self._new_letter_act = QAction(icon, "&New Letter",
+ self, shortcut=QKeySequence.New,
+ statusTip="Create a new form letter",
+ triggered=self.new_letter)
+
+ icon = QIcon.fromTheme('document-save', QIcon(':/images/save.png'))
+ self._save_act = QAction(icon, "&Save...", self,
+ shortcut=QKeySequence.Save,
+ statusTip="Save the current form letter", triggered=self.save)
+
+ icon = QIcon.fromTheme('document-print', QIcon(':/images/print.png'))
+ self._print_act = QAction(icon, "&Print...", self,
+ shortcut=QKeySequence.Print,
+ statusTip="Print the current form letter",
+ triggered=self.print_)
+
+ icon = QIcon.fromTheme('edit-undo', QIcon(':/images/undo.png'))
+ self._undo_act = QAction(icon, "&Undo", self,
+ shortcut=QKeySequence.Undo,
+ statusTip="Undo the last editing action", triggered=self.undo)
+
+ self._quit_act = QAction("&Quit", self, shortcut="Ctrl+Q",
+ statusTip="Quit the application", triggered=self.close)
+
+ self._about_act = QAction("&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self._about_qt_act = QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=QApplication.instance().aboutQt)
+
+ def create_menus(self):
+ self._file_menu = self.menuBar().addMenu("&File")
+ self._file_menu.addAction(self._new_letter_act)
+ self._file_menu.addAction(self._save_act)
+ self._file_menu.addAction(self._print_act)
+ self._file_menu.addSeparator()
+ self._file_menu.addAction(self._quit_act)
+
+ self._edit_menu = self.menuBar().addMenu("&Edit")
+ self._edit_menu.addAction(self._undo_act)
+
+ self._view_menu = self.menuBar().addMenu("&View")
self.menuBar().addSeparator()
- self.helpMenu = self.menuBar().addMenu("&Help")
- self.helpMenu.addAction(self.aboutAct)
- self.helpMenu.addAction(self.aboutQtAct)
+ self._help_menu = self.menuBar().addMenu("&Help")
+ self._help_menu.addAction(self._about_act)
+ self._help_menu.addAction(self._about_qt_act)
- def createToolBars(self):
- self.fileToolBar = self.addToolBar("File")
- self.fileToolBar.addAction(self.newLetterAct)
- self.fileToolBar.addAction(self.saveAct)
- self.fileToolBar.addAction(self.printAct)
+ def create_tool_bars(self):
+ self._file_tool_bar = self.addToolBar("File")
+ self._file_tool_bar.addAction(self._new_letter_act)
+ self._file_tool_bar.addAction(self._save_act)
+ self._file_tool_bar.addAction(self._print_act)
- self.editToolBar = self.addToolBar("Edit")
- self.editToolBar.addAction(self.undoAct)
+ self._edit_tool_bar = self.addToolBar("Edit")
+ self._edit_tool_bar.addAction(self._undo_act)
- def createStatusBar(self):
+ def create_status_bar(self):
self.statusBar().showMessage("Ready")
- def createDockWindows(self):
+ def create_dock_windows(self):
dock = QDockWidget("Customers", self)
dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea)
- self.customerList = QListWidget(dock)
- self.customerList.addItems((
+ self._customer_list = QListWidget(dock)
+ self._customer_list.addItems((
"John Doe, Harmony Enterprises, 12 Lakeside, Ambleton",
"Jane Doe, Memorabilia, 23 Watersedge, Beaton",
"Tammy Shea, Tiblanka, 38 Sea Views, Carlton",
"Tim Sheen, Caraba Gifts, 48 Ocean Way, Deal",
"Sol Harvey, Chicos Coffee, 53 New Springs, Eccleston",
"Sally Hobart, Tiroli Tea, 67 Long River, Fedula"))
- dock.setWidget(self.customerList)
+ dock.setWidget(self._customer_list)
self.addDockWidget(Qt.RightDockWidgetArea, dock)
- self.viewMenu.addAction(dock.toggleViewAction())
+ self._view_menu.addAction(dock.toggleViewAction())
dock = QDockWidget("Paragraphs", self)
- self.paragraphsList = QListWidget(dock)
- self.paragraphsList.addItems((
+ self._paragraphs_list = QListWidget(dock)
+ self._paragraphs_list.addItems((
"Thank you for your payment which we have received today.",
"Your order has been dispatched and should be with you within "
- "28 days.",
+ "28 days.",
"We have dispatched those items that were in stock. The rest of "
- "your order will be dispatched once all the remaining items "
- "have arrived at our warehouse. No additional shipping "
- "charges will be made.",
+ "your order will be dispatched once all the remaining items "
+ "have arrived at our warehouse. No additional shipping "
+ "charges will be made.",
"You made a small overpayment (less than $5) which we will keep "
- "on account for you, or return at your request.",
+ "on account for you, or return at your request.",
"You made a small underpayment (less than $1), but we have sent "
- "your order anyway. We'll add this underpayment to your next "
- "bill.",
+ "your order anyway. We'll add this underpayment to your next "
+ "bill.",
"Unfortunately you did not send enough money. Please remit an "
- "additional $. Your order will be dispatched as soon as the "
- "complete amount has been received.",
+ "additional $. Your order will be dispatched as soon as the "
+ "complete amount has been received.",
"You made an overpayment (more than $5). Do you wish to buy more "
- "items, or should we return the excess to you?"))
- dock.setWidget(self.paragraphsList)
+ "items, or should we return the excess to you?"))
+ dock.setWidget(self._paragraphs_list)
self.addDockWidget(Qt.RightDockWidgetArea, dock)
- self.viewMenu.addAction(dock.toggleViewAction())
+ self._view_menu.addAction(dock.toggleViewAction())
- self.customerList.currentTextChanged.connect(self.insertCustomer)
- self.paragraphsList.currentTextChanged.connect(self.addParagraph)
+ self._customer_list.currentTextChanged.connect(self.insert_customer)
+ self._paragraphs_list.currentTextChanged.connect(self.add_paragraph)
if __name__ == '__main__':
-
- import sys
-
app = QApplication(sys.argv)
- mainWin = MainWindow()
- mainWin.show()
- sys.exit(app.exec_())
+ main_win = MainWindow()
+ main_win.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject b/examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject
index 2df11468e..9abbf7485 100644
--- a/examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["dockwidgets.qrc", "dockwidgets.py", "dockwidgets_rc.py"]
+ "files": ["dockwidgets.qrc", "dockwidgets.py"]
}
diff --git a/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py b/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py
index 35b13db2b..5d30d0927 100644
--- a/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py
+++ b/examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py
@@ -1,9 +1,9 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
\x00\x00\x06\xc4\
@@ -117,127 +117,6 @@ V\xaf^\xdd@\xf7Y\x84p\xc57\x82\xa1\x22\xa5\x0b\
\x14\x9fe\xdf\x12~T\x1cJ\x97\xa8\xf3\xc5\xfc\x0f\xd1\
\xc2G\xb4c\xf2\xc9\xfc\x00\x00\x00\x00IEND\xae\
B`\x82\
-\x00\x00\x07f\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x07-IDATx^\xb5V]o\x1cW\
-\x19~\xce\xc7|\xec\x97\xd7n\x9c8\xc6\x89\x03I\x9a\
-&M!\xaa\x08\x95\xb8@\xca%\x08\x89\xfb\x8a+\xee\
-\xb8AHH !!\x047\x5c\xf1\x03\xb8\x00\xa9p\
-\x83\xa2\x0aQ\x22\x017 \x15\xd1\xa0\xe6\xb3\xadS+\
-I\x9b\xa4\xb1\xe3\x8f\xb5\xbd;\x9bY\xef\xcc\xce\xce\xcc\
-9\x87\xf3\x1e-+\xd3:\xf5\x02\xe2X\x8f\xde9\xc7\
-\x1a?\xcf\xfb\xbc\xefy\xc7\xcc\x18\x83\xffu]\xbc\xf8\
-m\x0e T\xaa\xa8h]\xd6\x19\xe3\x14\xa7t\xa9\xea\
-Z\x95\x15\xad\xf4\x941hz\x15\xb9\xba\xbc|\xf9M\
-\x00\x99\xe5\xd5\x00 \xf7\x12\x5c\xf8\xc2\xb7\xbe\x94\xa5\x83\
-S@Yc\xe0u?\x0ckBzU\x18V\x07P\
-c\x8c\xd5\x00\xd4\xc1\x10Z\xd0Y\x08\x98\x0a\x98\x0e\xb5\
-1\x81\x86\xf64+=K*\x99'\xc5\xdc\xe9\xe7\xd9\
-\xd9\x17\xcf\xf2\xc6\xcc\x0c\x13\xcd\x19\xf1\x97_\xbd\xf6\x00\
-\xc0\xab\x16\x14\xe3O\x088<\x7f\xf8\x97_\xfc\xca\xcb\
-/e\xdaSyQ\xb0;7\xdfb\x1f\xdc}\x17^\
-\xe0\x81\x0b0\xce\x01!\xb8\x83\xe7\x09\x16\x04\x92\x85\xa1\
-\x8f\x8aE\xb5\x1a\xda\x18\xa2^\xab\xa2V\xab`\xee\xe8\
-\x02N_\xf82\xael\x7f\x16\xed\xf6\x03\xf0\xd62\x94\
-*\xe7\x01\xbcb\xd1\xd9W\xc0\xc9s\xa7\xce\x7f\xe3{\
-\xaf\xf2\xdf\xfdc\xc8?\xba\xf9\x16\xe6\x16$~\xf8\xdd\
-\x1f\xa1T@\x18\x04\xf0=\x89j\xa5\x820\x0c\x10\xf8\
-\x9e\xdd\xfb\x90R@\x08\x01\xce\x18\x98\x05\x18 \xa5\xe7\
-\xce\xb3\x5c\xe1'W;xx{\x09\xcf\x9bw\xe1\xab\
-\x5c\x00 \x11\xa1\x05>!`7\xc9\xb37o\x0fk\
-\xbf\xf9\xeb\x0a:\xd7\x96\xf0\xcdS\x06_\xff\xea\xd7\xb0\
-\xb1\xbe\x8e~\xd2G\x96\x0d\xa1\x94BY\x14\xc8\x87C\
-h\xada\x8cq\xb1,\xcb1\xe8\xcc\x89\x11>N\x1e\
-:\x89\xf5\x13\xaf\xa0\x9a\xe7(W\xaf\x01\x00#\xec+\
-\x80^T\xf4\xc7\x94q/GOc\xdcx\xfb*\xd6\
-6\xb7Q\x14\x85#\xe3\x9c\xec\xa7\x0c%\xc1eO\x8b\
-D\xd0\xa2\xdf\xfb\xbeo\xcbPC\xb5\xd1\x84\xfc@!\
-\xacV!\x94@\xb9\x87k_\x01$Z\x0a\x8e\xc0\x13\
-\x80d\x08\xc3\x0a\x16\x17\x17\xc1\xbd\x902'\x01DH\
-\xd9\x8dA\xcb\xed9\x07\xed8\xf5\x87\xf4\x5c?\x88\xa0\
-\x0a\xc9\x13\x04\x82\xc1\xe3@~\x90\x00\x80Ap\x06_\
-p\x80\x19\xd4m\x16s\x9f9\x8a$+\x9c\xfdE1\
-\x1cYn\xe0~\x94\x866\xe4\x9cv\x0e9\x94\x05T\
-\xa9\xe0\x16\xb7B*/\xc2\xf72'\x1c\x07:`A\
-\xdc\xbe\xc7 }\x89\xa8\x1b\xe1\xf6\xf5\x9b\xd8\xdc\x89\xc8\
-\xe2\xb1\xbdA\x10P\x19\xe8\x99\x1a\x93\x1c\xb0D\x15\xb2\
-\x9f\x88\xdcy\xd5\xda\xeeY\x07~\xfdF\x8c@\x0a\x97\
-\x18\xd8\x81\x0e\x18H\xce\xe0Ia#P\xaf\xd7\xf1\xc2\
-\xf9\xcfc\xb6\x13\x8d\xad\xfe\xb7\x12\xb87\x00\xce\xc8\xb1\
-q\x1c\x97\x85\x1a2\x94\x02\xa1\xa7!\x05;\xd8\x01\x22\
-\x90\x92#\xb0\x90\x8cQ#Y\xd4Q\x14\xa5C\xa9J\
-\xa8Q\x97\x13@\x11\xb0gd}\x89\xe10GY\x94\
-P\xda\xf5\x0b\x0c\x97\xa8\x86\xc7\x10\xf8\x8a\x12\x9b\xac\x04\
-\x94y\xe8\xb9FD\xa7\xbd\x83{\xcbKhw{.\
-s\xcf\xf7\xdd<\xa8\x84\x15\x04\x81\x0f?\x08!=9\
-\xb6\x9e@7\xc3se\xe1\xa0\xf5\xfb\xf5mW\x02\x8f\
-\xcc9H\x00)\xf0\x84s\xc0\x92y\x98=d\xa7\xd9\
-\x99s89\xba~\xd25\xe7~\x99\x18\x17\xb42\xc8\
-J N4\xb2B!\xb7\xfbj@%0\x936!\
-\x83\xeb\x01\x01Tg\xe60\x7f\xa6\x09\xe9yn6d\
-\x85Aw\xa0\x90\xe4\x06i\xae\xd1\xb7\xb1?\xd4\xd8\xcd\
-4zC\xe3blAgin\xa0\x0c\x5c\x89:\x03\
-\x8df5\x04\x04\x0e\x16\xc0\x19)\x05|\xa1\xec\xf5;\
-\x81;\x9a\xe1\xfbWv0[\x15\x18\x94\x06\x89%\x1c\
-\x14\x06y9\x82\x02JcP\x8e\x9e\x15\x18\xc08\x04\
-\x97`\xe4\x96.\x1dosJ\xa0\xa0\xfd$s\x80j\
-\x15p\x86\xe9\xa9\x06J\x0e\xdco\x15\xb8\x8b\x02\xca\xd0\
-\xb0\x11`BB\xba\x9asp\xc9\xc0\x8d\x86`9\xbc\
-\xb2\x0f=\xe8#\xdd\x8d0\xe8E(\x8b\x1cSGO\
-b\xfe\xd8\x09T|\x01#0\xc95\x84\xb3?\xf4\x05\
-\x187\x90\x9e\xef\xb2(\xb3\x14&\xddE\x96\xc6\xc8z\
-\x16I\x17\xc3$\x86\xca\xfa\x10j\x80\x9a\xd4\x98\xaeI\
-\x1cnVq\xee\xb9\x06\xe6N7p\xe4\xd04\x9a3\
-\x1aot|\xd7W\x1eM\xca\xc9F1\x09\x90\x964\
-\xc6\xfa;\x7fB\xda\xfa\x10S\x15\x89C\x8d\x10\x0b\xd3\
-5\xcc\x1fmbv\xba\x8e\x99\xc6\x09\x1c\x9d\x9d\xc6\x9c\
-\xc5sSuT+\x81k\xd4R)\xa4\x83\x0c\xbb\xfd\
-\x04\xbd\xfe\x10\x8b&\xc0@\x0b\xe4\x93\xcc\x01\x0e'\xc0\
-Z\xe6c;j\xe1\xe2\x91\x1c?\xfd\xf1w\xb0\xb1\xb9\
-\x85\xcd\x8du\xb4Z-D\xdd6\x9a\xd08s\xfc8\
-\x820t\x9f\xe1$\xcb\xa9\xeb\xdd\x1c1\xc6\x8cF\xb2\
-\x86a@=\x14\xd0\x05G:\x89\x00\x8c\x1c\xf0\x03\x09\
-fJW\x0e\xc6\x04\xee}\xf8\x08\x97/_\xc6`0\
-p#vjj\x0a\xc7N|\xce\xcd\x81O[D\x19\
-\xd0\xb5\x06\x0d\xb6\xfd\x9b\xf0c\xa7\xcc\x91\x06\xa3A\xc4\
-\x19w\x83e}}\x9d\xc8\xdd\x97\xf1\xb8\xcd\x9c\xbe\x03\
-\x93.\x9f&\xab\xcf\xe0\xfb\xf2`\x01\x9c\x8d&\xa1\xe4\
-\xeeE\xce\x01\x03C\x84\xf4\xb1q\x1f\x19!\x04\xed\xc9\
-\xee\xc9\x04\xf8\x1c\x013(\xd2\x0e\x98\x19\xdb\xc0\x9e\xe1\
-\x80\x13\xe0\xc8}\xc1]}a\xc6\xdf\x89q\x8d\xff\x93\
-\x15H\xa0\xfb\xf0\x06V\x97\xdeG\xb7\xbb\xb2\x0e`h\
-Q>S\x80\x10\x80'\xb9\x05\x95\xc0i\xfd\xaf\x17\xe9\
-g\xfd\x16\xee\xfe\xed\x0f\xb8\x7f\xeb\xc1\xf6\xda\xda\x8d\xeb\
-\x00V,z\xfb\xdf\x02>jB\xc9 \xe5\xbf2\x06\
-\x14]\xad4\xa5> \xfbi\xff\xa9%\x10\x82\xbb\x9a\
-kSb\xe5\xfa\x9fq\xef\xdarou\xe5\xd6\xad\xa2\
-HH\xc0{\x16\xdd}\x05\xc00g\x89 !\x16\x9c\
-3h\xad1;;\x8bK\x97.aaa\x01\xd3\xd3\
-\xd3h4\x1a\xee?c)\x85\x8d\x9e{\xe6\x5c \xcf\
-K<}\x9a\x98v\xbb\xc7\xda\xed\x18\xbd\xdd\x0cw\xaf\
-=\x1a>y|\xe7N\x92l\xbd\x0d\xe0\x9a\xc5G\x16\
-\xf93\x07Q\xa3\x0a\xcc\x1f\x06\xe2\xc3M\x84\xba\x81\xbc\
-\xc8q\xe1\xc2K8\x7f\xfe\x05K\x90C)\xedf\x7f\
-\xb7\x9b\x22Ib\xc4q\x86(J\xcc\xf6vWmm\
-\xed\x0c\xdb\xed\xad~\xaf\x17\xc5i\xda\xe9\xc6\xf1V{\
-u\xf5\xe1\xd6`\xb0\xfb\x00\x00e\x7f\xdf\xa2o\xec\xda\
-W\x80\xe7K\x7f\xd0Oq\xf5\xb7\xafac\xed\x09\xce\
-\xce\x1f1\x0f\x1fm\xe3\xf1J\x8bEQ\xdf\x92&&\
-\x8av\xcbN'\xca\xba\xdd\x9d~\x1c\xb7\xe38\xde\x89\
-\xba\xdd\xcdv\xbb\xbd\xd1N\xd3^D\x04\x16\xb1Eo\
-\x14\x9fZ\xb4,6i?&\xdfO\xc0\xe3Gk\x1b\
-?\xff\xc1/\x16\xef\xbe\xf7~\x91&Y\xb1\x94\xdf\xcb\
-\xae\xbc\xfe\xf7~\xad\x86\xdd~?\xeaF\xd1F{g\
-gm{8\x1c\x10\xc1\xee\x98d\x0c\xb7O,2\x8b\
-\xe1\x9e\x98[\xde\xf2\xc0Ixo\xe9\xf6\xcfz\xbd'\
-/\xa7\x83V}0\x88\x22\xadKR\xdf'\xec!|\
-:zN\x1d\xc1\x98dL\xa4p\xf0\xda_\xc0\xc3G\
-\x7f|\x1d\xc0;\x16\xcdQ&\xbd\xbdY|\x8cHO\
-\xc81\xb9\x80\x11\xe1\xf2h>\x14#\x22\x83\xff\xe3\xfa\
-'\x0a\xd7w\xe2\xf8Nm\x80\x00\x00\x00\x00IEN\
-D\xaeB`\x82\
\x00\x00\x06\xe8\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -415,6 +294,127 @@ D\x83b\xd7\xfd\xfb.\x0c\xa2\xac\xf3\xfd\x94h\x0f\xec\
\xa6\xfd\xd1\xdazi\x87\x02\xcd^\xff\x01\xf9h\x10\x8e\
\x11Wv$\x00\x00\x00\x00IEND\xaeB`\x82\
\
+\x00\x00\x07f\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x07-IDATx^\xb5V]o\x1cW\
+\x19~\xce\xc7|\xec\x97\xd7n\x9c8\xc6\x89\x03I\x9a\
+&M!\xaa\x08\x95\xb8@\xca%\x08\x89\xfb\x8a+\xee\
+\xb8AHH !!\x047\x5c\xf1\x03\xb8\x00\xa9p\
+\x83\xa2\x0aQ\x22\x017 \x15\xd1\xa0\xe6\xb3\xadS+\
+I\x9b\xa4\xb1\xe3\x8f\xb5\xbd;\x9bY\xef\xcc\xce\xce\xcc\
+9\x87\xf3\x1e-+\xd3:\xf5\x02\xe2X\x8f\xde9\xc7\
+\x1a?\xcf\xfb\xbc\xefy\xc7\xcc\x18\x83\xffu]\xbc\xf8\
+m\x0e T\xaa\xa8h]\xd6\x19\xe3\x14\xa7t\xa9\xea\
+Z\x95\x15\xad\xf4\x941hz\x15\xb9\xba\xbc|\xf9M\
+\x00\x99\xe5\xd5\x00 \xf7\x12\x5c\xf8\xc2\xb7\xbe\x94\xa5\x83\
+S@Yc\xe0u?\x0ckBzU\x18V\x07P\
+c\x8c\xd5\x00\xd4\xc1\x10Z\xd0Y\x08\x98\x0a\x98\x0e\xb5\
+1\x81\x86\xf64+=K*\x99'\xc5\xdc\xe9\xe7\xd9\
+\xd9\x17\xcf\xf2\xc6\xcc\x0c\x13\xcd\x19\xf1\x97_\xbd\xf6\x00\
+\xc0\xab\x16\x14\xe3O\x088<\x7f\xf8\x97_\xfc\xca\xcb\
+/e\xdaSyQ\xb0;7\xdfb\x1f\xdc}\x17^\
+\xe0\x81\x0b0\xce\x01!\xb8\x83\xe7\x09\x16\x04\x92\x85\xa1\
+\x8f\x8aE\xb5\x1a\xda\x18\xa2^\xab\xa2V\xab`\xee\xe8\
+\x02N_\xf82\xael\x7f\x16\xed\xf6\x03\xf0\xd62\x94\
+*\xe7\x01\xbcb\xd1\xd9W\xc0\xc9s\xa7\xce\x7f\xe3{\
+\xaf\xf2\xdf\xfdc\xc8?\xba\xf9\x16\xe6\x16$~\xf8\xdd\
+\x1f\xa1T@\x18\x04\xf0=\x89j\xa5\x820\x0c\x10\xf8\
+\x9e\xdd\xfb\x90R@\x08\x01\xce\x18\x98\x05\x18 \xa5\xe7\
+\xce\xb3\x5c\xe1'W;xx{\x09\xcf\x9bw\xe1\xab\
+\x5c\x00 \x11\xa1\x05>!`7\xc9\xb37o\x0fk\
+\xbf\xf9\xeb\x0a:\xd7\x96\xf0\xcdS\x06_\xff\xea\xd7\xb0\
+\xb1\xbe\x8e~\xd2G\x96\x0d\xa1\x94BY\x14\xc8\x87C\
+h\xada\x8cq\xb1,\xcb1\xe8\xcc\x89\x11>N\x1e\
+:\x89\xf5\x13\xaf\xa0\x9a\xe7(W\xaf\x01\x00#\xec+\
+\x80^T\xf4\xc7\x94q/GOc\xdcx\xfb*\xd6\
+6\xb7Q\x14\x85#\xe3\x9c\xec\xa7\x0c%\xc1eO\x8b\
+D\xd0\xa2\xdf\xfb\xbeo\xcbPC\xb5\xd1\x84\xfc@!\
+\xacV!\x94@\xb9\x87k_\x01$Z\x0a\x8e\xc0\x13\
+\x80d\x08\xc3\x0a\x16\x17\x17\xc1\xbd\x902'\x01DH\
+\xd9\x8dA\xcb\xed9\x07\xed8\xf5\x87\xf4\x5c?\x88\xa0\
+\x0a\xc9\x13\x04\x82\xc1\xe3@~\x90\x00\x80Ap\x06_\
+p\x80\x19\xd4m\x16s\x9f9\x8a$+\x9c\xfdE1\
+\x1cYn\xe0~\x94\x866\xe4\x9cv\x0e9\x94\x05T\
+\xa9\xe0\x16\xb7B*/\xc2\xf72'\x1c\x07:`A\
+\xdc\xbe\xc7 }\x89\xa8\x1b\xe1\xf6\xf5\x9b\xd8\xdc\x89\xc8\
+\xe2\xb1\xbdA\x10P\x19\xe8\x99\x1a\x93\x1c\xb0D\x15\xb2\
+\x9f\x88\xdcy\xd5\xda\xeeY\x07~\xfdF\x8c@\x0a\x97\
+\x18\xd8\x81\x0e\x18H\xce\xe0Ia#P\xaf\xd7\xf1\xc2\
+\xf9\xcfc\xb6\x13\x8d\xad\xfe\xb7\x12\xb87\x00\xce\xc8\xb1\
+q\x1c\x97\x85\x1a2\x94\x02\xa1\xa7!\x05;\xd8\x01\x22\
+\x90\x92#\xb0\x90\x8cQ#Y\xd4Q\x14\xa5C\xa9J\
+\xa8Q\x97\x13@\x11\xb0gd}\x89\xe10GY\x94\
+P\xda\xf5\x0b\x0c\x97\xa8\x86\xc7\x10\xf8\x8a\x12\x9b\xac\x04\
+\x94y\xe8\xb9FD\xa7\xbd\x83{\xcbKhw{.\
+s\xcf\xf7\xdd<\xa8\x84\x15\x04\x81\x0f?\x08!=9\
+\xb6\x9e@7\xc3se\xe1\xa0\xf5\xfb\xf5mW\x02\x8f\
+\xcc9H\x00)\xf0\x84s\xc0\x92y\x98=d\xa7\xd9\
+\x99s89\xba~\xd25\xe7~\x99\x18\x17\xb42\xc8\
+J N4\xb2B!\xb7\xfbj@%0\x936!\
+\x83\xeb\x01\x01Tg\xe60\x7f\xa6\x09\xe9yn6d\
+\x85Aw\xa0\x90\xe4\x06i\xae\xd1\xb7\xb1?\xd4\xd8\xcd\
+4zC\xe3blAgin\xa0\x0c\x5c\x89:\x03\
+\x8df5\x04\x04\x0e\x16\xc0\x19)\x05|\xa1\xec\xf5;\
+\x81;\x9a\xe1\xfbWv0[\x15\x18\x94\x06\x89%\x1c\
+\x14\x06y9\x82\x02JcP\x8e\x9e\x15\x18\xc08\x04\
+\x97`\xe4\x96.\x1dosJ\xa0\xa0\xfd$s\x80j\
+\x15p\x86\xe9\xa9\x06J\x0e\xdco\x15\xb8\x8b\x02\xca\xd0\
+\xb0\x11`BB\xba\x9asp\xc9\xc0\x8d\x86`9\xbc\
+\xb2\x0f=\xe8#\xdd\x8d0\xe8E(\x8b\x1cSGO\
+b\xfe\xd8\x09T|\x01#0\xc95\x84\xb3?\xf4\x05\
+\x187\x90\x9e\xef\xb2(\xb3\x14&\xddE\x96\xc6\xc8z\
+\x16I\x17\xc3$\x86\xca\xfa\x10j\x80\x9a\xd4\x98\xaeI\
+\x1cnVq\xee\xb9\x06\xe6N7p\xe4\xd04\x9a3\
+\x1aot|\xd7W\x1eM\xca\xc9F1\x09\x90\x964\
+\xc6\xfa;\x7fB\xda\xfa\x10S\x15\x89C\x8d\x10\x0b\xd3\
+5\xcc\x1fmbv\xba\x8e\x99\xc6\x09\x1c\x9d\x9d\xc6\x9c\
+\xc5sSuT+\x81k\xd4R)\xa4\x83\x0c\xbb\xfd\
+\x04\xbd\xfe\x10\x8b&\xc0@\x0b\xe4\x93\xcc\x01\x0e'\xc0\
+Z\xe6c;j\xe1\xe2\x91\x1c?\xfd\xf1w\xb0\xb1\xb9\
+\x85\xcd\x8du\xb4Z-D\xdd6\x9a\xd08s\xfc8\
+\x820t\x9f\xe1$\xcb\xa9\xeb\xdd\x1c1\xc6\x8cF\xb2\
+\x86a@=\x14\xd0\x05G:\x89\x00\x8c\x1c\xf0\x03\x09\
+fJW\x0e\xc6\x04\xee}\xf8\x08\x97/_\xc6`0\
+p#vjj\x0a\xc7N|\xce\xcd\x81O[D\x19\
+\xd0\xb5\x06\x0d\xb6\xfd\x9b\xf0c\xa7\xcc\x91\x06\xa3A\xc4\
+\x19w\x83e}}\x9d\xc8\xdd\x97\xf1\xb8\xcd\x9c\xbe\x03\
+\x93.\x9f&\xab\xcf\xe0\xfb\xf2`\x01\x9c\x8d&\xa1\xe4\
+\xeeE\xce\x01\x03C\x84\xf4\xb1q\x1f\x19!\x04\xed\xc9\
+\xee\xc9\x04\xf8\x1c\x013(\xd2\x0e\x98\x19\xdb\xc0\x9e\xe1\
+\x80\x13\xe0\xc8}\xc1]}a\xc6\xdf\x89q\x8d\xff\x93\
+\x15H\xa0\xfb\xf0\x06V\x97\xdeG\xb7\xbb\xb2\x0e`h\
+Q>S\x80\x10\x80'\xb9\x05\x95\xc0i\xfd\xaf\x17\xe9\
+g\xfd\x16\xee\xfe\xed\x0f\xb8\x7f\xeb\xc1\xf6\xda\xda\x8d\xeb\
+\x00V,z\xfb\xdf\x02>jB\xc9 \xe5\xbf2\x06\
+\x14]\xad4\xa5> \xfbi\xff\xa9%\x10\x82\xbb\x9a\
+kSb\xe5\xfa\x9fq\xef\xdarou\xe5\xd6\xad\xa2\
+HH\xc0{\x16\xdd}\x05\xc00g\x89 !\x16\x9c\
+3h\xad1;;\x8bK\x97.aaa\x01\xd3\xd3\
+\xd3h4\x1a\xee?c)\x85\x8d\x9e{\xe6\x5c \xcf\
+K<}\x9a\x98v\xbb\xc7\xda\xed\x18\xbd\xdd\x0cw\xaf\
+=\x1a>y|\xe7N\x92l\xbd\x0d\xe0\x9a\xc5G\x16\
+\xf93\x07Q\xa3\x0a\xcc\x1f\x06\xe2\xc3M\x84\xba\x81\xbc\
+\xc8q\xe1\xc2K8\x7f\xfe\x05K\x90C)\xedf\x7f\
+\xb7\x9b\x22Ib\xc4q\x86(J\xcc\xf6vWmm\
+\xed\x0c\xdb\xed\xad~\xaf\x17\xc5i\xda\xe9\xc6\xf1V{\
+u\xf5\xe1\xd6`\xb0\xfb\x00\x00e\x7f\xdf\xa2o\xec\xda\
+W\x80\xe7K\x7f\xd0Oq\xf5\xb7\xafac\xed\x09\xce\
+\xce\x1f1\x0f\x1fm\xe3\xf1J\x8bEQ\xdf\x92&&\
+\x8av\xcbN'\xca\xba\xdd\x9d~\x1c\xb7\xe38\xde\x89\
+\xba\xdd\xcdv\xbb\xbd\xd1N\xd3^D\x04\x16\xb1Eo\
+\x14\x9fZ\xb4,6i?&\xdfO\xc0\xe3Gk\x1b\
+?\xff\xc1/\x16\xef\xbe\xf7~\x91&Y\xb1\x94\xdf\xcb\
+\xae\xbc\xfe\xf7~\xad\x86\xdd~?\xeaF\xd1F{g\
+gm{8\x1c\x10\xc1\xee\x98d\x0c\xb7O,2\x8b\
+\xe1\x9e\x98[\xde\xf2\xc0Ixo\xe9\xf6\xcfz\xbd'\
+/\xa7\x83V}0\x88\x22\xadKR\xdf'\xec!|\
+:zN\x1d\xc1\x98dL\xa4p\xf0\xda_\xc0\xc3G\
+\x7f|\x1d\xc0;\x16\xcdQ&\xbd\xbdY|\x8cHO\
+\xc81\xb9\x80\x11\xe1\xf2h>\x14#\x22\x83\xff\xe3\xfa\
+'\x0a\xd7w\xe2\xf8Nm\x80\x00\x00\x00\x00IEN\
+D\xaeB`\x82\
"
qt_resource_name = b"\
@@ -427,10 +427,6 @@ qt_resource_name = b"\
\x00p\
\x00r\x00i\x00n\x00t\x00.\x00p\x00n\x00g\
\x00\x08\
-\x08\xc8Xg\
-\x00s\
-\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
-\x00\x08\
\x04\xb2X\xc7\
\x00u\
\x00n\x00d\x00o\x00.\x00p\x00n\x00g\
@@ -438,6 +434,10 @@ qt_resource_name = b"\
\x04\xcaW\xa7\
\x00n\
\x00e\x00w\x00.\x00p\x00n\x00g\
+\x00\x08\
+\x08\xc8Xg\
+\x00s\
+\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -446,13 +446,13 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00@\x00\x00\x00\x00\x00\x01\x00\x00\x0e2\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00V\x00\x00\x00\x00\x00\x01\x00\x00\x15\x1e\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x09\
\x00\x00\x00*\x00\x00\x00\x00\x00\x01\x00\x00\x06\xc8\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00@\x00\x00\x00\x00\x00\x01\x00\x00\x0d\xb4\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00T\x00\x00\x00\x00\x00\x01\x00\x00\x11\x89\
+\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
diff --git a/examples/widgets/mainwindows/mdi/images/copy.png b/examples/widgets/mainwindows/mdi/images/copy.png
deleted file mode 100644
index 2aeb28288..000000000
--- a/examples/widgets/mainwindows/mdi/images/copy.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/cut.png b/examples/widgets/mainwindows/mdi/images/cut.png
deleted file mode 100644
index 54638e938..000000000
--- a/examples/widgets/mainwindows/mdi/images/cut.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/new.png b/examples/widgets/mainwindows/mdi/images/new.png
deleted file mode 100644
index 12131b010..000000000
--- a/examples/widgets/mainwindows/mdi/images/new.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/open.png b/examples/widgets/mainwindows/mdi/images/open.png
deleted file mode 100644
index 45fa2883a..000000000
--- a/examples/widgets/mainwindows/mdi/images/open.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/paste.png b/examples/widgets/mainwindows/mdi/images/paste.png
deleted file mode 100644
index c14425cad..000000000
--- a/examples/widgets/mainwindows/mdi/images/paste.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/images/save.png b/examples/widgets/mainwindows/mdi/images/save.png
deleted file mode 100644
index daba865fa..000000000
--- a/examples/widgets/mainwindows/mdi/images/save.png
+++ /dev/null
Binary files differ
diff --git a/examples/widgets/mainwindows/mdi/mdi.py b/examples/widgets/mainwindows/mdi/mdi.py
index 9daca826d..c1fa01b8c 100644
--- a/examples/widgets/mainwindows/mdi/mdi.py
+++ b/examples/widgets/mainwindows/mdi/mdi.py
@@ -1,145 +1,112 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/draganddrop/draggabletext example from Qt v5.x, originating from PyQt"""
-
-from PySide2.QtCore import (QFile, QFileInfo, QPoint, QSettings, QSignalMapper,
- QSaveFile, QSize, QTextStream, Qt)
-from PySide2.QtGui import QIcon, QKeySequence
-from PySide2.QtWidgets import (QAction, QApplication, QFileDialog, QMainWindow,
- QMdiArea, QMessageBox, QTextEdit, QWidget)
-
-import mdi_rc
+"""PySide6 port of the widgets/mainwindows/mdi example from Qt v5.x, originating from PyQt"""
+
+from argparse import ArgumentParser, RawTextHelpFormatter
+from functools import partial
+import sys
+
+from PySide6.QtCore import (QByteArray, QFile, QFileInfo, QSettings,
+ QSaveFile, QTextStream, Qt, Slot)
+from PySide6.QtGui import QAction, QIcon, QKeySequence
+from PySide6.QtWidgets import (QApplication, QFileDialog, QMainWindow,
+ QMdiArea, QMessageBox, QTextEdit)
+
+import PySide6.QtExampleIcons # noqa: F401
class MdiChild(QTextEdit):
- sequenceNumber = 1
+ sequence_number = 1
def __init__(self):
- super(MdiChild, self).__init__()
+ super().__init__()
self.setAttribute(Qt.WA_DeleteOnClose)
- self.isUntitled = True
+ self._is_untitled = True
- def newFile(self):
- self.isUntitled = True
- self.curFile = "document%d.txt" % MdiChild.sequenceNumber
- MdiChild.sequenceNumber += 1
- self.setWindowTitle(self.curFile + '[*]')
+ def new_file(self):
+ self._is_untitled = True
+ self._cur_file = f"document{MdiChild.sequence_number}.txt"
+ MdiChild.sequence_number += 1
+ self.setWindowTitle(f"{self._cur_file}[*]")
- self.document().contentsChanged.connect(self.documentWasModified)
+ self.document().contentsChanged.connect(self.document_was_modified)
- def loadFile(self, fileName):
+ def load_file(self, fileName):
file = QFile(fileName)
if not file.open(QFile.ReadOnly | QFile.Text):
- QMessageBox.warning(self, "MDI",
- "Cannot read file %s:\n%s." % (fileName, file.errorString()))
+ reason = file.errorString()
+ message = f"Cannot read file {fileName}:\n{reason}."
+ QMessageBox.warning(self, "MDI", message)
return False
instr = QTextStream(file)
- QApplication.setOverrideCursor(Qt.WaitCursor)
- self.setPlainText(instr.readAll())
- QApplication.restoreOverrideCursor()
+ with QApplication.setOverrideCursor(Qt.WaitCursor):
+ self.setPlainText(instr.readAll())
- self.setCurrentFile(fileName)
+ self.set_current_file(fileName)
- self.document().contentsChanged.connect(self.documentWasModified)
+ self.document().contentsChanged.connect(self.document_was_modified)
return True
def save(self):
- if self.isUntitled:
- return self.saveAs()
+ if self._is_untitled:
+ return self.save_as()
else:
- return self.saveFile(self.curFile)
+ return self.save_file(self._cur_file)
- def saveAs(self):
- fileName, _ = QFileDialog.getSaveFileName(self, "Save As", self.curFile)
+ def save_as(self):
+ fileName, _ = QFileDialog.getSaveFileName(self, "Save As", self._cur_file)
if not fileName:
return False
- return self.saveFile(fileName)
+ return self.save_file(fileName)
- def saveFile(self, fileName):
+ def save_file(self, fileName):
error = None
- QApplication.setOverrideCursor(Qt.WaitCursor)
- file = QSaveFile(fileName)
- if file.open(QFile.WriteOnly | QFile.Text):
- outstr = QTextStream(file)
- outstr << self.toPlainText()
- if not file.commit():
- error = "Cannot write file %s:\n%s." % (fileName, file.errorString())
- else:
- error = "Cannot open file %s:\n%s." % (fileName, file.errorString())
- QApplication.restoreOverrideCursor()
+ with QApplication.setOverrideCursor(Qt.WaitCursor):
+ file = QSaveFile(fileName)
+ if file.open(QFile.WriteOnly | QFile.Text):
+ outstr = QTextStream(file)
+ outstr << self.toPlainText()
+ if not file.commit():
+ reason = file.errorString()
+ error = f"Cannot write file {fileName}:\n{reason}."
+ else:
+ reason = file.errorString()
+ error = f"Cannot open file {fileName}:\n{reason}."
if error:
QMessageBox.warning(self, "MDI", error)
return False
- self.setCurrentFile(fileName)
+ self.set_current_file(fileName)
return True
- def userFriendlyCurrentFile(self):
- return self.strippedName(self.curFile)
+ def user_friendly_current_file(self):
+ return self.stripped_name(self._cur_file)
- def currentFile(self):
- return self.curFile
+ def current_file(self):
+ return self._cur_file
def closeEvent(self, event):
- if self.maybeSave():
+ if self.maybe_save():
event.accept()
else:
event.ignore()
- def documentWasModified(self):
+ def document_was_modified(self):
self.setWindowModified(self.document().isModified())
- def maybeSave(self):
+ def maybe_save(self):
if self.document().isModified():
- ret = QMessageBox.warning(self, "MDI",
- "'%s' has been modified.\nDo you want to save your "
- "changes?" % self.userFriendlyCurrentFile(),
- QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
+ f = self.user_friendly_current_file()
+ message = f"'{f}' has been modified.\nDo you want to save your changes?"
+ ret = QMessageBox.warning(self, "MDI", message,
+ QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
if ret == QMessageBox.Save:
return self.save()
@@ -149,303 +116,332 @@ class MdiChild(QTextEdit):
return True
- def setCurrentFile(self, fileName):
- self.curFile = QFileInfo(fileName).canonicalFilePath()
- self.isUntitled = False
+ def set_current_file(self, fileName):
+ self._cur_file = QFileInfo(fileName).canonicalFilePath()
+ self._is_untitled = False
self.document().setModified(False)
self.setWindowModified(False)
- self.setWindowTitle(self.userFriendlyCurrentFile() + "[*]")
+ self.setWindowTitle(f"{self.user_friendly_current_file()}[*]")
- def strippedName(self, fullFileName):
+ def stripped_name(self, fullFileName):
return QFileInfo(fullFileName).fileName()
class MainWindow(QMainWindow):
def __init__(self):
- super(MainWindow, self).__init__()
+ super().__init__()
- self.mdiArea = QMdiArea()
- self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
- self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
- self.setCentralWidget(self.mdiArea)
+ self._mdi_area = QMdiArea()
+ self._mdi_area.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
+ self._mdi_area.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
+ self.setCentralWidget(self._mdi_area)
- self.mdiArea.subWindowActivated.connect(self.updateMenus)
- self.windowMapper = QSignalMapper(self)
- self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow)
+ self._mdi_area.subWindowActivated.connect(self.update_menus)
- self.createActions()
- self.createMenus()
- self.createToolBars()
- self.createStatusBar()
- self.updateMenus()
+ self.create_actions()
+ self.create_menus()
+ self.create_tool_bars()
+ self.create_status_bar()
+ self.update_menus()
- self.readSettings()
+ self.read_settings()
self.setWindowTitle("MDI")
def closeEvent(self, event):
- self.mdiArea.closeAllSubWindows()
- if self.mdiArea.currentSubWindow():
+ self._mdi_area.closeAllSubWindows()
+ if self._mdi_area.currentSubWindow():
event.ignore()
else:
- self.writeSettings()
+ self.write_settings()
event.accept()
- def newFile(self):
- child = self.createMdiChild()
- child.newFile()
+ @Slot()
+ def new_file(self):
+ child = self.create_mdi_child()
+ child.new_file()
child.show()
+ @Slot()
def open(self):
- fileName, _ = QFileDialog.getOpenFileName(self)
- if fileName:
- existing = self.findMdiChild(fileName)
+ file_name, _ = QFileDialog.getOpenFileName(self)
+ if file_name:
+ existing = self.find_mdi_child(file_name)
if existing:
- self.mdiArea.setActiveSubWindow(existing)
- return
-
- child = self.createMdiChild()
- if child.loadFile(fileName):
- self.statusBar().showMessage("File loaded", 2000)
- child.show()
+ self._mdi_area.setActiveSubWindow(existing)
else:
- child.close()
+ self.load(file_name)
+ def load(self, file_name):
+ child = self.create_mdi_child()
+ if child.load_file(file_name):
+ self.statusBar().showMessage("File loaded", 2000)
+ child.show()
+ else:
+ child.close()
+
+ @Slot()
def save(self):
- if self.activeMdiChild() and self.activeMdiChild().save():
+ if self.active_mdi_child() and self.active_mdi_child().save():
self.statusBar().showMessage("File saved", 2000)
- def saveAs(self):
- if self.activeMdiChild() and self.activeMdiChild().saveAs():
+ @Slot()
+ def save_as(self):
+ if self.active_mdi_child() and self.active_mdi_child().save_as():
self.statusBar().showMessage("File saved", 2000)
+ @Slot()
def cut(self):
- if self.activeMdiChild():
- self.activeMdiChild().cut()
+ if self.active_mdi_child():
+ self.active_mdi_child().cut()
+ @Slot()
def copy(self):
- if self.activeMdiChild():
- self.activeMdiChild().copy()
+ if self.active_mdi_child():
+ self.active_mdi_child().copy()
+ @Slot()
def paste(self):
- if self.activeMdiChild():
- self.activeMdiChild().paste()
+ if self.active_mdi_child():
+ self.active_mdi_child().paste()
+ @Slot()
def about(self):
QMessageBox.about(self, "About MDI",
- "The <b>MDI</b> example demonstrates how to write multiple "
- "document interface applications using Qt.")
-
- def updateMenus(self):
- hasMdiChild = (self.activeMdiChild() is not None)
- self.saveAct.setEnabled(hasMdiChild)
- self.saveAsAct.setEnabled(hasMdiChild)
- self.pasteAct.setEnabled(hasMdiChild)
- self.closeAct.setEnabled(hasMdiChild)
- self.closeAllAct.setEnabled(hasMdiChild)
- self.tileAct.setEnabled(hasMdiChild)
- self.cascadeAct.setEnabled(hasMdiChild)
- self.nextAct.setEnabled(hasMdiChild)
- self.previousAct.setEnabled(hasMdiChild)
- self.separatorAct.setVisible(hasMdiChild)
-
- hasSelection = (self.activeMdiChild() is not None and
- self.activeMdiChild().textCursor().hasSelection())
- self.cutAct.setEnabled(hasSelection)
- self.copyAct.setEnabled(hasSelection)
-
- def updateWindowMenu(self):
- self.windowMenu.clear()
- self.windowMenu.addAction(self.closeAct)
- self.windowMenu.addAction(self.closeAllAct)
- self.windowMenu.addSeparator()
- self.windowMenu.addAction(self.tileAct)
- self.windowMenu.addAction(self.cascadeAct)
- self.windowMenu.addSeparator()
- self.windowMenu.addAction(self.nextAct)
- self.windowMenu.addAction(self.previousAct)
- self.windowMenu.addAction(self.separatorAct)
-
- windows = self.mdiArea.subWindowList()
- self.separatorAct.setVisible(len(windows) != 0)
+ "The <b>MDI</b> example demonstrates how to write multiple "
+ "document interface applications using Qt.")
+
+ @Slot()
+ def update_menus(self):
+ has_mdi_child = (self.active_mdi_child() is not None)
+ self._save_act.setEnabled(has_mdi_child)
+ self._save_as_act.setEnabled(has_mdi_child)
+ self._paste_act.setEnabled(has_mdi_child)
+ self._close_act.setEnabled(has_mdi_child)
+ self._close_all_act.setEnabled(has_mdi_child)
+ self._tile_act.setEnabled(has_mdi_child)
+ self._cascade_act.setEnabled(has_mdi_child)
+ self._next_act.setEnabled(has_mdi_child)
+ self._previous_act.setEnabled(has_mdi_child)
+ self._separator_act.setVisible(has_mdi_child)
+
+ has_selection = (self.active_mdi_child() is not None
+ and self.active_mdi_child().textCursor().hasSelection())
+ self._cut_act.setEnabled(has_selection)
+ self._copy_act.setEnabled(has_selection)
+
+ @Slot()
+ def update_window_menu(self):
+ self._window_menu.clear()
+ self._window_menu.addAction(self._close_act)
+ self._window_menu.addAction(self._close_all_act)
+ self._window_menu.addSeparator()
+ self._window_menu.addAction(self._tile_act)
+ self._window_menu.addAction(self._cascade_act)
+ self._window_menu.addSeparator()
+ self._window_menu.addAction(self._next_act)
+ self._window_menu.addAction(self._previous_act)
+ self._window_menu.addAction(self._separator_act)
+
+ windows = self._mdi_area.subWindowList()
+ self._separator_act.setVisible(len(windows) != 0)
for i, window in enumerate(windows):
child = window.widget()
- text = "%d %s" % (i + 1, child.userFriendlyCurrentFile())
+ f = child.user_friendly_current_file()
+ text = f'{i + 1} {f}'
if i < 9:
text = '&' + text
- action = self.windowMenu.addAction(text)
+ action = self._window_menu.addAction(text)
action.setCheckable(True)
- action.setChecked(child is self.activeMdiChild())
- action.triggered.connect(self.windowMapper.map)
- self.windowMapper.setMapping(action, window)
+ action.setChecked(child is self.active_mdi_child())
+ slot_func = partial(self.set_active_sub_window, window=window)
+ action.triggered.connect(slot_func)
- def createMdiChild(self):
+ def create_mdi_child(self):
child = MdiChild()
- self.mdiArea.addSubWindow(child)
+ self._mdi_area.addSubWindow(child)
- child.copyAvailable.connect(self.cutAct.setEnabled)
- child.copyAvailable.connect(self.copyAct.setEnabled)
+ child.copyAvailable.connect(self._cut_act.setEnabled)
+ child.copyAvailable.connect(self._copy_act.setEnabled)
return child
- def createActions(self):
-
- self.newAct = QAction(QIcon.fromTheme("document-new", QIcon(':/images/new.png')), "&New", self,
- shortcut=QKeySequence.New, statusTip="Create a new file",
- triggered=self.newFile)
-
- self.openAct = QAction(QIcon.fromTheme("document-open", QIcon(':/images/open.png')), "&Open...", self,
- shortcut=QKeySequence.Open, statusTip="Open an existing file",
- triggered=self.open)
-
- self.saveAct = QAction(QIcon.fromTheme("document-save", QIcon(':/images/save.png')), "&Save", self,
- shortcut=QKeySequence.Save,
- statusTip="Save the document to disk", triggered=self.save)
-
- self.saveAsAct = QAction("Save &As...", self,
- shortcut=QKeySequence.SaveAs,
- statusTip="Save the document under a new name",
- triggered=self.saveAs)
-
- self.exitAct = QAction("E&xit", self, shortcut=QKeySequence.Quit,
- statusTip="Exit the application",
- triggered=QApplication.instance().closeAllWindows)
-
- self.cutAct = QAction(QIcon.fromTheme("edit-cut", QIcon(':/images/cut.png')), "Cu&t", self,
- shortcut=QKeySequence.Cut,
- statusTip="Cut the current selection's contents to the clipboard",
- triggered=self.cut)
-
- self.copyAct = QAction(QIcon.fromTheme("edit-copy", QIcon(':/images/copy.png')), "&Copy", self,
- shortcut=QKeySequence.Copy,
- statusTip="Copy the current selection's contents to the clipboard",
- triggered=self.copy)
-
- self.pasteAct = QAction(QIcon.fromTheme("edit-paste", QIcon(':/images/paste.png')), "&Paste", self,
- shortcut=QKeySequence.Paste,
- statusTip="Paste the clipboard's contents into the current selection",
- triggered=self.paste)
-
- self.closeAct = QAction("Cl&ose", self,
- statusTip="Close the active window",
- triggered=self.mdiArea.closeActiveSubWindow)
-
- self.closeAllAct = QAction("Close &All", self,
- statusTip="Close all the windows",
- triggered=self.mdiArea.closeAllSubWindows)
-
- self.tileAct = QAction("&Tile", self, statusTip="Tile the windows",
- triggered=self.mdiArea.tileSubWindows)
-
- self.cascadeAct = QAction("&Cascade", self,
- statusTip="Cascade the windows",
- triggered=self.mdiArea.cascadeSubWindows)
-
- self.nextAct = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
- statusTip="Move the focus to the next window",
- triggered=self.mdiArea.activateNextSubWindow)
-
- self.previousAct = QAction("Pre&vious", self,
- shortcut=QKeySequence.PreviousChild,
- statusTip="Move the focus to the previous window",
- triggered=self.mdiArea.activatePreviousSubWindow)
-
- self.separatorAct = QAction(self)
- self.separatorAct.setSeparator(True)
-
- self.aboutAct = QAction("&About", self,
- statusTip="Show the application's About box",
- triggered=self.about)
-
- self.aboutQtAct = QAction("About &Qt", self,
- statusTip="Show the Qt library's About box",
- triggered=QApplication.instance().aboutQt)
-
- def createMenus(self):
- self.fileMenu = self.menuBar().addMenu("&File")
- self.fileMenu.addAction(self.newAct)
- self.fileMenu.addAction(self.openAct)
- self.fileMenu.addAction(self.saveAct)
- self.fileMenu.addAction(self.saveAsAct)
- self.fileMenu.addSeparator()
- action = self.fileMenu.addAction("Switch layout direction")
- action.triggered.connect(self.switchLayoutDirection)
- self.fileMenu.addAction(self.exitAct)
-
- self.editMenu = self.menuBar().addMenu("&Edit")
- self.editMenu.addAction(self.cutAct)
- self.editMenu.addAction(self.copyAct)
- self.editMenu.addAction(self.pasteAct)
-
- self.windowMenu = self.menuBar().addMenu("&Window")
- self.updateWindowMenu()
- self.windowMenu.aboutToShow.connect(self.updateWindowMenu)
+ def create_actions(self):
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentNew)
+ self._new_act = QAction(icon, "&New", self,
+ shortcut=QKeySequence.New, statusTip="Create a new file",
+ triggered=self.new_file)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentOpen)
+ self._open_act = QAction(icon, "&Open...", self,
+ shortcut=QKeySequence.Open, statusTip="Open an existing file",
+ triggered=self.open)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentSave)
+ self._save_act = QAction(icon, "&Save", self,
+ shortcut=QKeySequence.Save,
+ statusTip="Save the document to disk", triggered=self.save)
+
+ self._save_as_act = QAction("Save &As...", self,
+ shortcut=QKeySequence.SaveAs,
+ statusTip="Save the document under a new name",
+ triggered=self.save_as)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.ApplicationExit)
+ self._exit_act = QAction(icon, "E&xit", self, shortcut=QKeySequence.Quit,
+ statusTip="Exit the application",
+ triggered=QApplication.instance().closeAllWindows)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCut)
+ self._cut_act = QAction(icon, "Cu&t", self,
+ shortcut=QKeySequence.Cut,
+ statusTip="Cut the current selection's contents to the clipboard",
+ triggered=self.cut)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCopy)
+ self._copy_act = QAction(icon, "&Copy", self,
+ shortcut=QKeySequence.Copy,
+ statusTip="Copy the current selection's contents to the clipboard",
+ triggered=self.copy)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditPaste)
+ self._paste_act = QAction(icon, "&Paste", self,
+ shortcut=QKeySequence.Paste,
+ statusTip="Paste the clipboard's contents into the current "
+ "selection",
+ triggered=self.paste)
+
+ self._close_act = QAction("Cl&ose", self,
+ statusTip="Close the active window",
+ triggered=self._mdi_area.closeActiveSubWindow)
+
+ self._close_all_act = QAction("Close &All", self,
+ statusTip="Close all the windows",
+ triggered=self._mdi_area.closeAllSubWindows)
+
+ self._tile_act = QAction("&Tile", self, statusTip="Tile the windows",
+ triggered=self._mdi_area.tileSubWindows)
+
+ self._cascade_act = QAction("&Cascade", self,
+ statusTip="Cascade the windows",
+ triggered=self._mdi_area.cascadeSubWindows)
+
+ self._next_act = QAction("Ne&xt", self, shortcut=QKeySequence.NextChild,
+ statusTip="Move the focus to the next window",
+ triggered=self._mdi_area.activateNextSubWindow)
+
+ self._previous_act = QAction("Pre&vious", self,
+ shortcut=QKeySequence.PreviousChild,
+ statusTip="Move the focus to the previous window",
+ triggered=self._mdi_area.activatePreviousSubWindow)
+
+ self._separator_act = QAction(self)
+ self._separator_act.setSeparator(True)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.HelpAbout)
+ self._about_act = QAction(icon, "&About", self,
+ statusTip="Show the application's About box",
+ triggered=self.about)
+
+ self._about_qt_act = QAction("About &Qt", self,
+ statusTip="Show the Qt library's About box",
+ triggered=QApplication.instance().aboutQt)
+
+ def create_menus(self):
+ self._file_menu = self.menuBar().addMenu("&File")
+ self._file_menu.addAction(self._new_act)
+ self._file_menu.addAction(self._open_act)
+ self._file_menu.addAction(self._save_act)
+ self._file_menu.addAction(self._save_as_act)
+ self._file_menu.addSeparator()
+ action = self._file_menu.addAction("Switch layout direction")
+ action.triggered.connect(self.switch_layout_direction)
+ self._file_menu.addAction(self._exit_act)
+
+ self._edit_menu = self.menuBar().addMenu("&Edit")
+ self._edit_menu.addAction(self._cut_act)
+ self._edit_menu.addAction(self._copy_act)
+ self._edit_menu.addAction(self._paste_act)
+
+ self._window_menu = self.menuBar().addMenu("&Window")
+ self.update_window_menu()
+ self._window_menu.aboutToShow.connect(self.update_window_menu)
self.menuBar().addSeparator()
- self.helpMenu = self.menuBar().addMenu("&Help")
- self.helpMenu.addAction(self.aboutAct)
- self.helpMenu.addAction(self.aboutQtAct)
+ self._help_menu = self.menuBar().addMenu("&Help")
+ self._help_menu.addAction(self._about_act)
+ self._help_menu.addAction(self._about_qt_act)
- def createToolBars(self):
- self.fileToolBar = self.addToolBar("File")
- self.fileToolBar.addAction(self.newAct)
- self.fileToolBar.addAction(self.openAct)
- self.fileToolBar.addAction(self.saveAct)
+ def create_tool_bars(self):
+ self._file_tool_bar = self.addToolBar("File")
+ self._file_tool_bar.addAction(self._new_act)
+ self._file_tool_bar.addAction(self._open_act)
+ self._file_tool_bar.addAction(self._save_act)
- self.editToolBar = self.addToolBar("Edit")
- self.editToolBar.addAction(self.cutAct)
- self.editToolBar.addAction(self.copyAct)
- self.editToolBar.addAction(self.pasteAct)
+ self._edit_tool_bar = self.addToolBar("Edit")
+ self._edit_tool_bar.addAction(self._cut_act)
+ self._edit_tool_bar.addAction(self._copy_act)
+ self._edit_tool_bar.addAction(self._paste_act)
- def createStatusBar(self):
+ def create_status_bar(self):
self.statusBar().showMessage("Ready")
- def readSettings(self):
- settings = QSettings('Trolltech', 'MDI Example')
- pos = settings.value('pos', QPoint(200, 200))
- size = settings.value('size', QSize(400, 400))
- self.move(pos)
- self.resize(size)
-
- def writeSettings(self):
- settings = QSettings('Trolltech', 'MDI Example')
- settings.setValue('pos', self.pos())
- settings.setValue('size', self.size())
-
- def activeMdiChild(self):
- activeSubWindow = self.mdiArea.activeSubWindow()
- if activeSubWindow:
- return activeSubWindow.widget()
+ def read_settings(self):
+ settings = QSettings('QtProject', 'MDI Example')
+ geometry = settings.value('geometry', QByteArray())
+ if geometry.size():
+ self.restoreGeometry(geometry)
+
+ def write_settings(self):
+ settings = QSettings('QtProject', 'MDI Example')
+ settings.setValue('geometry', self.saveGeometry())
+
+ def active_mdi_child(self):
+ active_sub_window = self._mdi_area.activeSubWindow()
+ if active_sub_window:
+ return active_sub_window.widget()
return None
- def findMdiChild(self, fileName):
- canonicalFilePath = QFileInfo(fileName).canonicalFilePath()
+ def find_mdi_child(self, fileName):
+ canonical_file_path = QFileInfo(fileName).canonicalFilePath()
- for window in self.mdiArea.subWindowList():
- if window.widget().currentFile() == canonicalFilePath:
+ for window in self._mdi_area.subWindowList():
+ if window.widget().current_file() == canonical_file_path:
return window
return None
- def switchLayoutDirection(self):
+ @Slot()
+ def switch_layout_direction(self):
if self.layoutDirection() == Qt.LeftToRight:
QApplication.setLayoutDirection(Qt.RightToLeft)
else:
QApplication.setLayoutDirection(Qt.LeftToRight)
- def setActiveSubWindow(self, window):
+ def set_active_sub_window(self, window):
if window:
- self.mdiArea.setActiveSubWindow(window)
+ self._mdi_area.setActiveSubWindow(window)
if __name__ == '__main__':
-
- import sys
+ argument_parser = ArgumentParser(description='MDI Example',
+ formatter_class=RawTextHelpFormatter)
+ argument_parser.add_argument("files", help="Files",
+ nargs='*', type=str)
+ options = argument_parser.parse_args()
app = QApplication(sys.argv)
- mainWin = MainWindow()
- mainWin.show()
- sys.exit(app.exec_())
+
+ icon_paths = QIcon.themeSearchPaths()
+ QIcon.setThemeSearchPaths(icon_paths + [":/qt-project.org/icons"])
+ QIcon.setFallbackThemeName("example_icons")
+
+ main_win = MainWindow()
+ for f in options.files:
+ main_win.load(f)
+ main_win.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/mainwindows/mdi/mdi.pyproject b/examples/widgets/mainwindows/mdi/mdi.pyproject
index 7df26fd77..0272873a7 100644
--- a/examples/widgets/mainwindows/mdi/mdi.pyproject
+++ b/examples/widgets/mainwindows/mdi/mdi.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["mdi_rc.py", "mdi.py", "mdi.qrc"]
+ "files": ["mdi.py"]
}
diff --git a/examples/widgets/mainwindows/mdi/mdi.qrc b/examples/widgets/mainwindows/mdi/mdi.qrc
deleted file mode 100644
index 0a776fab4..000000000
--- a/examples/widgets/mainwindows/mdi/mdi.qrc
+++ /dev/null
@@ -1,10 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource>
- <file>images/copy.png</file>
- <file>images/cut.png</file>
- <file>images/new.png</file>
- <file>images/open.png</file>
- <file>images/paste.png</file>
- <file>images/save.png</file>
-</qresource>
-</RCC>
diff --git a/examples/widgets/mainwindows/mdi/mdi_rc.py b/examples/widgets/mainwindows/mdi/mdi_rc.py
deleted file mode 100644
index 2a392bea7..000000000
--- a/examples/widgets/mainwindows/mdi/mdi_rc.py
+++ /dev/null
@@ -1,608 +0,0 @@
-# Resource object code (Python 3)
-# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
-# WARNING! All changes made in this file will be lost!
-
-from PySide2 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x04\xa3\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x045IDATX\xc3\xe5\
-\x97\xcd\x8fTE\x14\xc5\x7f\xb7\xea\xd6{\xaf\xdbn\xc7\
-\xf9@\x9d\x89FM4\x99D\x8d\x1aH\x98\xc4\x8c\x1f\
-\x1b\xfe\x02L\x5c\xf1\x07\x18\x16.M\x5ckX\xc3\x8e\
-\xc4\x8d\x1b\x17\xce\x82htA\x5c\x18\x0d\xe2\xc4\xc6\x00\
-=`PQ\x19`\x02\xa2\x0e\x0c\x83\xd3\xfd^\xf7\x94\
-\x8b\xaa\xee\xf9`\xe6\x0d\x84Q\x16VR\xa9\xce{\xb7\
-\xeb\x9e:\xf7\xd4\xa9z\xea\xbd\xe7~6\xe5>\xb7>\
-\x80]\xbbv\xbd\x03\xec\xfd\x8f\xf2N5\x1a\x8d\x03\xeb\
-\x19\xd8\xbb\xef\xbd\xa3;\x1f\x1fv\x00\x9c<:\xcf\xcc\
-\x977X\x9c\xef\xdcS\xa6\xda\xa0\xf2\xdck\x03\xbc\xb8\
-g\x10\x80\x8b\x7f\x16|\xf8\xee\x1e\x80\xdb\x00p\xfc\xec\
-\x1c\xdf?0\x04x.\xfd\xb8\xc0\xfe\xb7\xceo\xcbr\
-\x0f\x1dy\x9a\x0b#\x96\xd3\x9f\x1fd\xfc\xd5}\x9bk\
-@E\xb0\x16@xp,#\xcb\xb2m\x0100\x96\
-a\x8dP\x1b|\x14#%\x22\x14+\xd8\x18\x91\xd5\x95\
-s\xe7\xce\x83*\xb8\x04\xd2\x14\xb2\x0c\xd2,\x8cI\x0a\
-I\x12\xdew:\x90\xe7\x90\xb7\xa1\xd5\x82v+\x8em\
-(r\xb2\xfa8\xd6\x0a\xe3\xaf\xbcIk\xf1\xfa\xe6\x00\
-\xac\x15\xac\x15\x04\xb0F\xd8\xbd{\xe7\x16k\xeb\x86\xae\
-\x80Z\xa8V\x81\xeamQ\x8d\xaf\x04\xb5\x82\xf7\xa0\xa6\
-\x84\x01g\x055\x82\x08\xa8\x0a\x95,\xc3# \x1e\x08\
-\xc0\xf0\x1e/\x02\xde#\x12&\x15|\x88#\xc4!\x1e\
-<!^@MX\x18@\xd7J\x89\x06\xac\xa0\xdac\
-\x00\x9a3\xbf\x05\x8aS\x07i\x02\x95\x04\xb24\xf6\x04\
-\x12\x07N\xa1\xe8@^@+\x8f\xbd\x05K9\xb4s\
-\xc8\x0bT\x87q=\x00*\xe5%p1@\xd509\
-\xf9\xd2\xd6\x0a\xf3>\xd0\xaf\x16\xaa\x1b\x8b\xf6\xd8'a\
-a\xbd\x1c%% \x00\xf0\x81\x8d4M\xa3:\xc3\xb3\
-\x98\x11\x89l\x07\xdac\x09V\x98_)F\xfca\xcd\
-r\x7fa\x1d-\xd1\x80:\x09TI\x18O4/\xe0\
-\x9d\x85\xc4!\x89\xc3g\x09\x92i\xd8\x11\x89\xe2\x13\x87\
-X\x8b\xefv\x91\xbc\x80\xbc\x03\xed\x02\xdfj#\xed\x02\
-\xf2\x02\x9fwP\x1dE\xd5 x:\xebTx\x9b\x06\
-\x9c3x\x0f\x03\x8f$\xbc\xfe\xf2\xf3wh\xe86h\
-\xa4\xbe\xf1\xeb\xc6\xfc\xdf\xb1\x04R^\x82DM_\x84\
-\x8f\x0d\xa58\xe7\xb6\xc5\x88\x9e\x18K\xb9v\xb3\x03\x08\
-\x9dR\x11\xaa\x90\xb8P\xefZ\xc50}\xb1\xcb@\xc5\
-\xb0\x0e\xf4&\xadW\xf9U.\xe1\xe1\xc6\xd22\xf5\xcc\
-p}\xc9\x84-\xe9J\x19\x10\x9c\x1a\xc0s\xe5f\x97\
-+7\xbb\xacQW?\xd7\xaad~\xc5'\xa2)\xac\
-\x05\x15\xc3\x9c\x0b\xb5w\xa6l\x17\xa8\xc1\xa9 \xc8\x1a\
-5\xaf\x9b5\x1a\x8fY1\x9e\xfe{\xe9\xef\x14\x00\xf1\
-\x82\xef\x9bX0+WV\x02U!\xd1\x90\xfc\xe7S\
-\xdf\xf2\xeb\x99\x13,-\xde\xb8\xa7\xfaWj\x03<\xf5\
-\xecN\x9eya\x02\x0f\xa83[1\x10\x03|\x87\xf7\
-\xf7\xbf\xc1\xc2\xc2\x02\xb7n\xdd\xa2(\x0aD\x04k-\
-\xd6ZT\x15U\xc59\x87\xaab\xad\xc5\x98\xf0\xdf\xe5\
-\xe5e\xf2<\xef\xf7#\xcd\xf9\xb8\xf2-\x18pVP\
-\x17\x18\xdc1:\xb6rO8~\x9c\xe9\xe9i\x8c1\
-x\xef\x99\x98\x98`rr\xf2\x8eY\xd81:\xd6\xdf\
-\x86\xae\xd4\x09Up6\xac\xa2V\xaf\xf7k933\
-\xc3\xd0\xd0\x10\xd6Z\xbc\xf74\x9b\xcd\xbb\x02P\xab\xd7\
-p\xd1\x88\xb4\xd4\x88\x14\x9c\x0b'\x5c\xa0*\x00\xa8V\
-\xabdY\xd6\xa7\xb87\xdeis\x1a\xa9\x17AK\xad\
-8\x1e\xc7\xbd#\xb4\xd7\x8c1\x88D\xdf\x8f:\xb8\xab\
-\x9b\xaf5\xa8\x0d\xf3\xf6\x18.=\x8e\x83)m\xe3\xd5\
-\xdb\x12\xa9\xf7\xe5Vl\xad\xf4\x91\x0e\x8e\x0c\xc3\xf2\xef\
-\xdb\x02\xe0\xa1\x91a\xd4\xc2\xb5+\x97Y\x9c\xbf\xbe\x05\
-\x036\xf8\xc0`\xad\x02\x0b\xdb\xc3\xc0P\xad\xc2\xec\xc5\
-K\x9c\xfd\xee\x1b\xce\x9f\x9c\x9e\x03\xa66\x04`$^\
-J\x05\x12\x0b\xed\x91'\xa9=\x0co\x1f8\xc8f\xc7\
-\x81':\xf1*\xe75\x1e2\x81\x14(\xbap\xf9\xea\
-U\xce4\x8e\xd1\xfc\xfa\x8b\xb9\xd9\x1fN\x1d\x02\x0eo\
-\x08\xe0\xb3\x8f>\xe0\xa7\xd3'W\x99\xe9\xda\xa3\x86U\
-\xe6\xbb\x1e\x04\x1b<_\x1do|w\xee\x8f\xd9_\x0e\
-\x01\x87\x1b\x8d\xc6_\x1b\x01\x98\x9a\xfe\xf4\xe3\x7f\xf5s\
-l}\xf25\x00\xe2\xb7\xda\x81\xff\xdd\xd7\xf1?M\xf0\
-K\xb9\xe8F\x89\xaf\x00\x00\x00\x00IEND\xaeB\
-`\x82\
-\x00\x00\x08\x19\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x07\xabIDATX\xc3\xad\
-W[P\x93g\x1a\xf6\xca\xce\xec\xcc\xf6b/\xbc\xd9\
-\xe9\xce\xecn\xbd\xda\xd9\x9b\xb5\xce\xba;{\xb0\xad\xcc\
-z\xb1\xce\xce:\xb3vTpu\xdb\xe2\x81\xd6\xb6T\
-\x04\xbb\xa5 m\xc1\x82\x06\x08\x07QB\x80\x80\x80\x02\
-!\x81\x10\x92@H\x10s$!gr\x80\x04B \
-\x9c\x09G\xb5Tx\xf6\xfb~\x13\x160X\x8b}g\
-\x9e\xf9/\x92\xfc\xcf\xfb>\xcf\xfb\xbe\xdf\x97]\x00v\
-\xfd\x98 \xf1\x0b\x82\x14\x02\x03\xc1u\x82\x03\xcf\xfd\xfe\
-\x8fH\xbc\x9b \xe1W\xaf\xef\xb5*\x8c\xd6e\xdb\x02\
-`\x19\x1e[\x09'\xf13\xfa\x19\x81\x22\xfc\xdc>v\
-H~\x8a\xa0\xb9\xb6Y\x1c2\xcf\xadB9\xfe\x1dD\
-\xf6Q\xd8\xc7\xe6\xe8\x87\x86={\xf6XSR\xae,\
-\xca::\x10N\xe2\xe5I\xc3\xc41\x04\xb7>I\xf9\
-,`\x9b]YSM\x03M\xb6\x114\xeb\xfb 1\
-y`\x19\x9d\xc5\xbb\xef\xbe?\xc5\xab\xbe\x83\xf1\x89)\
-LO\xcf\xae\x92\xef\xd7\xbct\x02\x11\x9f\x0f\xbe\x1d\xe3\
-\xb2\x04CO\xb43@\x8b{\x06\xcd=.4\xeb\xec\
-\xa8W\xf6 \x87S\x852^5C\xbc\xb0\xf4\x90\x81\
-\xc1`\x5c&\xbfK|\xe1\x04H\x1c$8A\xfd\xdd\
-\xeas'\xf1\xb9'\x04H\x87\x97\xc1\xd7\xbb \x22U\
-7\xdc7\xa2\xb8N\x88,V>\xccV\xdb:q\x04\
-,\x16k,\xfc\xce\xe7'\x10\x916\x93\x95?F}\
-\xa5\xfe\x12\xc4o\xf4Y1\xb6\x02~\xef Z{\x9c\
-\xe0?0\xa1L(CF\x0e\x1b\xb2\x0e\xf9&\xd2\xf9\
-\xc5e\xcc-,!4\xbf\x88\xbd{\xf7Z\xc9;~\
-\xbam\x02$~C\x90F=5\x13iu\xb3\x80\xd2\
-?\x0f\xcb\xc4\xe2\x9aP\xa1Z\xb4l\xf1Y\xa0\xb6\xa0\
-\xa6]\x8d/\xb2sq\xb7\x9e\xff\x0c1%\x9d\x09\xcd\
-cbj\x06\x83C\x81'\xe4\xdd\xbc-\xd3\xb0;\x92\
-\x033&\xd4S\xb5\xd3\xfbXO\x88\xc5\x03!\x88,\
-CP\xbaF\xd0\xed\x09B\xe5\x9bB\x9bs\xfc\xa9\xcf\
-Z\x1b\xee*t\xc8\xbc\xc9E\x09\xa7l\x93\xcf\x9b\x88\
-'\xa7\x11\x18\x1d\xc3\x80o\x08\xa2\xd6\xd6%\xc2Q\xdb\
-(\x12\x87\xc6\x1f\xaf\x82/b\x94M\x89$\x90\x22\xea\
-R-\x9aB\xab\xe8\x18y\x04\xa1\xc5\xcf\x10St\xf6\
-\x0d\xa3\xd3\xe1\x87\xd4<\x80\x16\xbd\x03\x0d]\x06\x14\xd5\
-\x0a\x90\x91\x95\x0d/y\xf1\xc6\xaa\xa9\xd4\xb3s\x0bL\
-\xc5\x94\xd8\xdd\xef\x85\xc9b\x05\xb7\xbc\x12\xa5\xe5\x95K\
-\x13\xf3\xcb\xab#\x0f\x017\xd9\x11\xe6\xd9\x15\x84\x97\x15\
-\x13\x06\xcb<\xd0h\xf2\xa3\xdd\xee_'\x96;\x86 \
-\xb3x\xd7}\xe6\x08\xa4\xf8<3\x1b*\x8d6\xaa\xdc\
-S3!\x8c\x8e\x8d3\x15\xd3&\xe47\x09\xf1\xc1\xc5\
-\x8fQs\xaf\x01\xbee`\xfc\x11\xa0#\x13#\xf2\xce\
-\xa1\xbe]\xb9\xb8Q\x01\x83\x81ttM\xa7\x1e\x0ag\
-\x80\xa9\xb8\xdd\xea\x83\xd8\xe8B\x93\xca\xcc\xf8|\xe5\xcb\
-,\x88\xda$Q\x89\xa7g\xe7\x18\x1b\x86\x86G`w\
-8I\x82:$|\xf8!\xae\xb3\x0b\xe1\x99\x5c\x80o\
-\x09\xd0\x90\xde\xe1\x0f,\x81\xab\x1f\xc4}\xef\x04\xdd\x07\
-\x1da\xeb\xff\x9f\xc0\x1d\xb9\x16\x1d\xf6!H\xcc\xfdO\
-}\xee\xd4\x22\x9dU\x84\xaa\x9a\xbaM>G\xe4\x8e\xf8\
-<<\x12\x84\xd3\xdd\x0f\xbd\xc1\x88\xc2\xe2b\x9c~/\
-\x1e=\x03\x01\xf4/\x02\x83\x84\xbc\xc5\xff-\xee:C\
-(Q\x91\xf7\xf6\x05\xf1N\xdc\xbf}\x843i\xe3 \
-\x18\xf43\xab\xe0\xc9Th58\xd1\xd8\xdd\x0b\x9eX\
-\x89\xac\x5c\xf63>G\xaa\x9e\x9c\x9ee\xe4\xee\xf7\x0e\
-\xa2\xd7lAC\x03\x1f'b\xe3 \xe9\xd6\xc0E\xcf\
-\x01R\x90$\xb8\x86\xb2\x9e\x00n\xb4\xdbP\xd1\x1bD\
-\x85\xce\x8bJ~\x0bm\xbe\x9b['\xd1\xa0\x99\xf8\x16\
-e\x22\x05\xee)\xf4(\x13\xc8\x90x5\x0b\x1a\xad>\
-\xaa\xdcc\x13\x93\xf0\x0d\x0d\xc3f\xef\x83\xb4]\x8e\xc4\
-K\x97\x90\xc3\xca\xc3\xd4c\xc0NzI1N\xfa\x89\
-\x94\x7f[;\x84|\x85\x13%j\x1fJ\xd5\x03\xe8\xf2\
-0\xa3(\x22\xf8\xf93\x09t\x8f.\xa1\xa8\xbe\x15\xa5\
-|\x09\xb2J*\xf0\xcf\xe3qQ\xe5\xf6\x07F\xd1\xe7\
-\xf2@\xab7 \xfdj\x06\x92\xbfH\x83\xcd7\x02'\
-\xa9\xda@\x1aL\xe0{\x88R\x9d\x1fE\xdd\xfd\x0cq\
-A\x97\x1b\xc5\xdd\x1e\x88\x9cA\xfc\xf9\xcd\xb7]\x84\xeb\
-l\xb4C\xd0(\xf7N#\xa7\xfc\x1e\xb2K\xab\xf1Q\
-\xeaWH\xfeo\xea\xfaXQ\xb9G\x82\xe3\xf0\x0c\xf8\
-`4\x99Q\xc9\xab\xc2\xfbg\xcfA\xfe@\x03?\xe9\
-n\xb2\x8d\x19\xb9oi\x06\x19\xd2\x9b*/r\xe5\x0e\
-\xe4u\xf6\xa1\xf0\xbe\x1b\x1c\x95\x1b\xf9\x9c\xca)\xc2S\
-\xb8\xdd)\xdc+v\x04\x90Q\xc8\xc5\x95ky8\x11\
-\x9f\x80\x9b\xb7n3c\x15\x91\xdbjs@\x22m\xc7\
-\x85\x84\x0fPt\xbb\x0c\xf3+\x80\x9f4X\xf7$ \
-\x1c|\x84J\xd3\x188\xfaa\x86\x9cV\xfdU\xb3\x1e\
-\xac\x0e;\xb8:\x1f\xd9!\x1ez/\xe0\x13\xbc\xba]\
-\x02&\xbe\xc1\x83\x94o\xd88\x9f\x9c\x8a\x03\x7f=\x04\
-c\xaf\x99\xe9n*\xb7F\xd7\x83\xa4\xcb\xc9H\xff:\
-\x8b\x8c\xd5<S\xb5q\xf6\xa9\xdc5\xf6i\x5c\x97Y\
-\x19\xd9\xbfn!\xa7\xa0\xd4\x82t\xbe\x1aW\x9b4`\
-\xc9\xcc\x10\xbb\x82\xf8\xe5\xaf_\xa7g\xc0;\xe1u\x1f\
-5\xcc5\xddf|\x94\x96\x85\xb8s\x17\xf1\x97C1\
-L\xd5t\x99\xf0\xaa\xaaq\xfa\xf4\x19h\xcc\x0e\x8c\x92\
--6\x14\x1e\xabZ\xc7\x0cx\xe6qp\x0d#L\xa3\
-e\x8a\x0c\x8c\xec\xb4\xfa\x9c\xb6^\x94t9\xd0f\xf7\
-\xaf\x1e=\x11KG.o\xc3y\x135,\x5c\x99\x1a\
-\xf1\x97>\xc7\xd1\xd83\xf881\x09\x86^\x13\x1a\x9b\
-\x04\xf8\xdd\x1b\xfbQO\xd4\xf1\x90\x99\xee\x9a\x00\xaa\xad\
-\x93`+]\x0c9\xf5\xbc\xf0\xbeg\xbd\xea\xcc\x16=\
-JU\x1e\x08m\x01\x94\xd4\xf1C\xe1eS@\xf0\xca\
-\xf7%`+nj\xc7\xa9\x84D\xc4\x1c9\x8a\xdc|\
-6ZZ\xc58\x14\x13\x83/95\xc8\x14j\x98\xe6\
-\xa2\xd5\xd2'\xf5\x9azL\x13\xa1Id\xb7\x99\x90\xdb\
-nF\xb9\xda\x8d\x06\xa5v9,9=\xf9N\x13\xec\
-\xd9r\xd4G\x0d;\xabF\x88c\xff9\x8f\xdf\xee\xfb\
-=\x1a\xf9\x02\x9c\xbf\x90\x80\x93\xf1\x17p\xa3\xad\x07\x19\
-\xc4OJ\x14\xe9n\xbaX\xa8\xef,\xfa\x94\x98P(\
-\xb7@\xe9\x0e<\xf9W\xec)*w-\xc1g\x04\xfb\
-\xb6\xb9\xe4D\x8d\xbe\xcc\xb2Z\xfc\xe3\xe4\x19\x1c<\xf4\
-7\xb0r\xf3\xb0\xef\xc0\x1fP \xd1!\x89'e*\
-\xa6K\x85>\xbf!\xd5F\xe4.\x90[!\xb0\x0c\xae\
-\xe5\xdc\xe2\xd2\x11\x13\x13\xe4\x87o<\xaf<\xe7\x96\x15\
-5\x9ciE\xe5\xf8\xfb\xb1X\x1c?\x19\x877\xf6\xef\
-\xc7\x8d:\x11\x92\xab\xa4\x0c!\xedp\xea5U!\x8b\
-4[\xc9\x037*4n\xd4I:\x17\xc3rs\x08\
-\x8em\x95\xfb\x87$\xe0Jesp\xe4\xf8)\x1c>\
-|\x98\x8cc.2\x05*\x5c\x22\xd5\xd3]~M\xdc\
-\x0b6\xe9tv\xa7\x1dw\x8c\xe4\x88\xb6\xf9\x9e\x84\xb7\
-\x1a\x95\xfb\x22\xbdI\xfd\x80\x0bm\xf4\x042JxL\
-\x0f\x9cKI\xc3\xb5\xa6.|\xc2me6Y\xf1\x83\
-\x01\x5c\x97\x9a\xc1Q{ \xf3\x04\xd7\xce%&\x056\
-\xc8\xfd\xc7\x9d\xc8\x1d\xd5\x82\xdc\x1a\x01\xce^NE\x81\
-X\x85x\xf6]\x5c\xa9U\x90\xaa\xfb\xc0\x96\xdbP\xad\
-u\xe3\xaeTA/\x10\xca\x0dr\xbf\xba\xd3j\xa3\x05\
-\xb7\xa2Q\xf8\x1d\xafC\x8dO\xb9-\x88\xcb\xe6\xe1\x9a\
-H\x8f\xaa\x1e/\x9a5\xe6\xc7\x7fz\xf3-Wx\xac\
-\xa8\xdc\xaf\xbd\xac\xdc\xd1\xe2\x08\xdd\x05\x5cu\x1f\xde\xcb\
-\xafE\xb9v\x002g`\xf5\xc2\xa7\x97\xa9\xdc\xf7\x08\
-\xd2\xa9\xdc;\xf8\x03\xf3\xc2\xf1\x13\x82\xca\x1c\xee\x9dP\
-\x0b9\x94\xb8\x0d\xc2\xc8\x16\xa3\x17\x87\xc3/\x22\xf7\x0e\
-\xff\xdam\x8a\xdda\x99\xd5\x1b\xb6\xd8k\xbb^2\xbe\
-/\x89\xff\x01f\xb9_\xfc\x11\x80=\xcf\x00\x00\x00\x00\
-IEND\xaeB`\x82\
-\x00\x00\x05+\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x04\xbdIDATX\xc3\xed\
-WkL\x93W\x18>#q\xc92\xe9\x16\x97\xa8T\
-e8\x9d\x02\x15\xf6\x03\x872\x93\x01f,[p\xc4\
-0\xff`\xa2.\x1a:\x1dN\x03\xba1\x89[\xb3\x80\
-\xd9\x0c\x84\x02\x19X\x1c\x14\x8b\x85\xb2\x82\x95^\xe4f\
-\x0b\x8e1\xf8\xc3F\xcb-\x81\x15\xdc\xa8\xc2\x1c\x1b\xb7\
-ji\x91\xf2\xee\xbc\x87\xaf\x0c\xdc\xb8\x0da\xd9\xb2\x93\
-<\xed\x97\xf3}\xfd\xde\xe7\xbc\xef\xf3^J\x00\x80\xfc\
-\x93 \xff\x0a\x02t\x09(D\x14\xd9\x14q\x14\x01+\
-F\x80\xae\xddd\xdd\xc6f\x22L\xf8\x95\xc4\x8bG\xc8\
-\xa1\xd3\xf7\xc8\x8e\x97;82a+A \x85\x9c\xbe\
-0H.\xdd\x80\x19@2\xabyM\xf4\xbe\xfbr\x13\
-hd\x06\x91\x04^\xa3Q\xf4\x06\xee\x85G\xf5\xd0\xbd\
-\x83\xcbM \x9b\x9d\xf6@t/\xbd\x162= \x89\
-?H\xa5,\x1b\x01\x8c1y\xc1\xbb\x9d\x88K\xc6\xd7\
-\xc6&\x0e\xa0\x10\xb9\xfdB\xfe\xc5+6F\x8c\x12\x5c\
-N\x02\x93\xa7\xa7\xa7\x0d\xcc\xd39\xb9\x98c6\x14\x0a\
-\xd2\xe4\xa3+A \x8c)\x9e*\xdf7G\xeb\xdc{\
-\xb5\xcc\x89\x9e@D\x96T\x83+,\x0b6FH\x08\
-\x13\xf5d*{.T\x03\x01\xf8\x037\xbf\xc0\x0e4\
-*T\xdfb\x88R\xd5,X\x03t\x1d\x16\x08\x04z\
-EU\xf5\xc8\xa0mt\xc2\xd4s\xf7!\xbesQ\x95\
-\x90\xae\x8f\xd0\x13\xcf\xe5\x94\x83\x87\xb4\x02\x9e\xcc.\x03\
-\xd4\x06\xdd\xaf\x99\xcb\xb0\xaf\xaf\xaf>\xbf\xd2`\xb5\xdb\
-\xed\x80\xf8y\xe4>\xc4^\xab\xb4\xb9\x88/\x86\x80'\
-\xd3\xc0g\xf9\x8e\x19\xf5`\xd7^3\xbav\xdas\xee\
-h\xd8\xc7\xc7G\x9f\xab\xab\xb0\x0e\x0f\x0d\xc1\x10\x87\xb2\
-\xf6.\xe7\x967\xf7wsa\xd8\xbd\xe8^\x80/f\
-\x9a\xa0\x86\xdf\xa96B\xf7\xf0\x03\xd8\x19\x9f\xd4\xcf\xa5\
-\xe7\x1a\x8a\x98-~\xfem\x97T\x1ak__\x1f\xb8\
-\xd0\xd1s\x07br\x15VN\xc4\x87\x97\xd4\x8c0\x14\
-\xe9\x15\xb7\x1e8\x1c\x0e@\xa4\xd6\x191\x9e\x85\x9b\x05\
-~m\xa9%\x1a[\x97\xd9\x0c\xe6.\x0a\xf3$\x14\xdf\
-6\x8e{\xbd\x1e\xd1\xcdB\xc8\x09o\xa9\x04<\xd1\xbd\
-V\xab\x15\x10w\x7f\x1b\x84\xf3\x92\x5c\xbbR\xa9\x84\xfa\
-\xfaz0\x99L\x0cu\xdf5\xc1Q\xb1d\x18\xc9Q\
-D>\xb6v\xcc\xb4@O\x93_~\xd3\xd6\xdf\xdf\x0f\
-2\x99\x0cD\x22\x11\xa8T*\x90J\xa5\xa0\xd1h \
-K[9\xbe\xe9\x95\xe0\x1f\xb8S\xafy,\xf3\x00\x97\
-\x8e\x22\x9e\xc7\x86\xe6S)\x19\xf6\x82\x82\x02\xe6\xe2\xa0\
-\xa0 \xe0\xf1x`\xb1X@[^\x01\xfb\xcf&\x0c\
--\xa6S\xceg\x94\xcf\x09L\x83\xe2[{\xe6\xc2`\
-\x9a\xb2\x14\x14\x0a\x05\x88\xc5b\xc8\xcc\xcc\x84\xa2\xa2\x22\
-P\xab\xd5\xd0\xd9\xd9\xc9`\xec\xfe\xc9\xb9\xc9\xdb\xa7u\
-.\xb7\xcfK\x80\xae\xb7\xd8)p\x0e\xc0j\x97\xacx\
-\x88\xca\x7f\x82\xe2)\x89\x0e>\x97+![\x96\x0f\x07\
-c\xe3G\x84\x1f&\xd8\x92rd\x8eo\x1a\xbf\x07\xa3\
-\xd1\x08-\xad-\xf0\xcb\xc0 \x1c8\xf1\xbe\x05\xb3b\
-\xc1\x04\x5ci\x84\x85\x85\x84F\xdc&\xe72\xac,\xcf\
-3\xb5\x13\xec;\xe3\xba\xd33\xaf\x82\xe5\xfez\x89\x06\
-\x9e\xde\xfcb\x1b\xf7<\x92\x8d{f\xabO[\xca5\
-\xedXCC=444\x80\xa5\xb7\x172\x14\xc5\xc3\
-\xf3\xe9\xc0e<\x92\xe5(\x9e6]\xe5\x9c*2x\
-}\xf4\x83.Zl\x121\x0c\x1b%\xeaq\xf7/\xcb\
-'\xef\x05\x87_\xfe\xd3\xe4D\x0bLh\xf4\xc9>u\
-\x95\x1e\x0c\x06\x03\xb4\xb7\xb7\xc3\xd7\xc6\x961\xae\x81\x09\
-f\xf16m8h<I::e\xf8b\x81\x83D\
-\xbdWC\xb6\x0a^\x9b*\xc3\x94\x5c\xb0B\x0f\xab$\
-\xb4\x04\x9fJ\xaa\x9bC71(\xd4O\xf2\x0a\xc7t\
-:\x1d\xd4\xd6\xd6\x82\xc9|\xdb\xb9a\x9b\xf7_\xeab\
-\xb2\xe5~\x9cu\x1f\x0d\xf3\xb2\xd4N\xf2\xf6\xb1\xeb.\
-\xb6\xae\x94\xc3\x90l\x97U\xc1KW\xab\x80\x9cMn\
-Z\xd0\x1cI\xbd\xb1\xe7\x88\xb0\xef\xcaW\xc5PZZ\
-\x0a\x1d?\xf6L\x04\x06\x87t<\xaa\x0b\xc2\x84F\x8d\
-\x07\xc8o\x02\xd9\xf9\xaa~\x9a\xf10F\x8e6 \xaf\
-\xbcJxCi\x00\x92(\x1d\x98\xcd\x95\xb3y\xc3}\
-=\xbf\xf9Dj\xa6].\x97CSK+D\x1c{\
-\xf7\xce\xf4\x14%\xae\xf1\x8a\xf5w\x9c\xf5p\x02\xc2\xd9\
-\x0f\x89\xd1\x81\x03O\x8e\xf7\xdc\xd2i\xe7\xf3\xdfu\xfc\
-o\x14.6\xd2\xef\xd8\x17iI\xbe,\x9d\xc8\xd3\x96\
-;\xa7\x0f1\x8c%\xc6\xdf\x9f\xbaw_q5\xa0A\
-l\xb5\x08\x8c\xf9\x94\xf1\xe0\xf03K\x9a|h\x13Z\
-\xbd\xce\xa3\xd9kOH\xf7\x0c\x0f\xb0\x0f\xfe\xf3\x87\xc8\
-\xf9/\xee\xb9In\x00\xf6{>\xed\xf7\x08\x1e*>\
-]\xe5X\xaa\xf1GZ\xf5\xb6Y\x0b\x11\x1d\xb3C\xc9\
-\x918\x099\xf9\xa9\x96!\xfa\x5c\x1a\x0d\xcf\xb3\xff\xff\
-7\xfcO\x13\xf8\x1d\xe7\x87\x19\xb9D\xc3\x01\xcf\x00\x00\
-\x00\x00IEND\xaeB`\x82\
-\x00\x00\x05:\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x04\xccIDATX\xc3\xb5\
-\x97]L[e\x1c\xc6wo\xbc\xd9\xe5\x12I q\
-\xd7&\xe3N\x13\xb8p\xd1\x85D\xbdP\xe3\x10\x18\xe5\
-+.&J\x04'\x86\xaa\x8b\x99\xe0\xd0\xa2l\x19\x86\
-9\x17\xdc\x1a\x16\x98\x80@l\xa6C\xca +\x83\x1e\
-(\xcc\xda\xd1\x96\xd2\xd2J{\xfa\x01\xa5\xd0\xef\x16\x1e\
-\xdf\xff\xdb\x1d\xc7\xcc\x04*\x87\x93<9o!\x9c\xe7\
-\xf7<\xefG\x0f\x87\x00\x1c\xcaF\xcf\xbd\xfa\xe9\xbbL\
-Z&a\x0fj`\xca\xd9\xe9y\xd9\x9a?]P\xf2\
-\xa5\xc1\xe9\x8f\xa7W\xc3@0\x02\x84\xa2\x19\xad\xc72\
-\x8a'\x81X\x22s\xbfyk\xdaK\x10r\x02\x1c{\
-\xe7\xac\xda\x1c\xd8\xc8\x98\x12@\x84\x99\x85\xe3\x19\x911\
-)\x1aKa%\x94D8\x9aBs\x87\xc6\xbe\x13\xc4\
-\xff\x02\x90\x12\x93y$\xf1\xc8X\x92\xcf\x1f\x84]\x8c\
-\xc2\xe5\x09\x22\x12K\xa3\xf4\xc3\xefM4uY\x01\xb0\
-\xeb\xd86\xd5\x90\x9e:\xfc\xcc\xb9\xe7_.\x11?V\
-\x9eEEU\x0d*\x99\xde\xaf\xad\xc3\x9d\xb1\x89\xc7\x00\
-\xac\xb6%\xfc\xb9\xe8\x87k\x15X\xf6\x04\x10\x08\xc6\xd2\
-\xaf\x9c\xbep\x9fA\x1c\xd9\x15\x80]\x87\x99\x1a\x8a\x8a\
-\x8a\xcc\x92Z[[\xdd\xa4\xafU\xad\xfe\xafT\xdf\xa6\
-\x06\x06\x06195\x85\xd9\xb99\xe8&&PPP\
-\x80!\xcdo|\xdeI\xa6\xf9\x05\xcc\x98\x5c\x1c\xc0\xe1\
-OA\xf4\x85\xf0C\xaf\xce\xcd\x00j\xf6\x02PCf\
-\xd8\xe5\x8a\xc7\xe3\xf0z\xbdH\xa7\xd3\x98\x9c\x9cDe\
-e5fg\x8d\xbc\x81\x07f\x1bt\xd3\x16\x0e@2\
--x\xf0\xdd\x8dQ\x8f\xac\x00\xe1p\x18F\xa3\x91\x8f\
-S\xa9\x14~\xea\xedE\xe3'\x9fa\x86A8\x96\xdc\
-Pwu\xe3LC#\xce5\x9d\xc7\xed\x91q\x5c\xbc\
->,/\xc0\xc6\xc6\x06\xf4z\xfdc@}}\xfdP\
-2\x88\xd0F\x1cf\x9b\x0b\x82\xc1\x88\xa9\x19\x13\xac\x0e\
-\x11\x97\xbadn\x80\x00\xa6\xd8:\xd8~E\x22\x11\x94\
-+*0\xae\x13@\xe7\x04mW\xda\xaa4\xbe|S\
-\xe65@f:\x9d\x0e\xc3\xc3\xc3\xe8e\xf5\xf7\xf7\xf7\
-C\xab\xd5\xa2\xaa\xba\x06cw\xf5\x90\x0e*w\x90\xed\
-\x04\xb6\x0e\xda\xbbe\x06\xa0y\xb7\xdb\xed\x18\x1a\x1aB\
-gg'zzz8PIi\x19ni\xf5\x10\xd7\
-\x00o\x08\xb0\xf9\x00g\x00\xb8\xd0%3\xc0\xd6\xd6\x16\
-\xdf\x09\x81@\x00\xa2(\xc2\xef\xf7cmm\x0d\xa7\x14\
-\x95\xd0\xfc\xae\xe7\xa9\xc9|\xc1\x0b\x98=@\x9b\xdc\x00\
-\xdbA677\xf9v\xa4V\x14\x15\xd5\xe8\xfbU\xe0\
-\xa9\x1d\x81G\x00\xe7;\x0f\x00\x80\xcc%\x80$3O\
-$\x12(+\xaf\xe2\x00\x7f\xb8\x00\x8b\x98\x01\xa06Z\
-\xd5\x070\x05\xff\x98'\x93<=MI\xc9\xa9J\x0e\
-\xa0\xb7\xb3\x03\x89=\xc5\xf8\x170\xb1\x00|q\xf5\x00\
-\x00\xa4\xea\xc9\x98\x14\x8b\xc5P\xa6\xa8\x82zH\xc0\x98\
-\x19\xb8k\x05\xe6\x9c\x99\xfb\xe7Wd\x04\x90\xd2Sj\
-\x02\x88F\xa3\xdc<\x14\x0a\xa1\xb8\xb4\x02\xd7\x06\x05\xdc\
-f\x87\xe4\xa0\x01\x1cd\xc4\x04(;d\x06H=\x9c\
-s\x12\x99\xd3\xb9@ \xc5eU\xb8\xd8-\xa0\x7f:\
-c\xae}\x90i\xe0\xa3v\x99\x00\xfe]=\xa5&\xad\
-\xae\xaer\x88\xb7J*p\xb9W\xc0=\x1b\xb8~\x9e\
-\x01\xee\xcc\x03g.\xed\x13@\xaa\x9dD\x8b\x8e\x92\xd3\
-qL\xdf\x01+++X__\xe7\x10'Y\x03\xdf\
-t\x09PO\x00\xbf\xcce\x1a\xb82\x064\xec\xa7\x01\
-\xc9X\xda\xebdNi)9\x1dD\x04@\xf5\xd3\xcf\
-\xde|[\x81\x96\xeb\x02O~u\x1c\xb8q\x0f\xf8q\
-,\x9e~\xbdNm\xa67\xaa\xac\x00\x9ed,m7\
-2%\x00\xd1#\xf2\xe4\x12\xcc\x1b'\x15h\xef\x11\xa0\
-\xbcf[\x7fO5\xe2<q\x9a\xbf\x8ei\xf7\xfcJ\
-&\x01\x90\xa9$i\xb5SB2\x0f\x06\x83p\xb9\x5c\
-\xdc\x90^J\xe8\xb3\xc7\xe3\x81\xdb\xed\xc6\xf1\x13\xaf%\
-\x9f}\xa1\x9cL;\x98\x8a\x99\x8e>\xc9xG\x00\x95\
-J\xc5\x01\xa4\x15.\xcd7\x19RR:\xf7)\xb5\xc3\
-\xe1\xe0\x22\xe3\xc5\xc5E\x0e\xf5\xe2\xf1\x97\x5c\xf4\x1e\xb9\
-\x93\xe9\xae\x00---n\xe9`\xa1\xd4\xd2\x97\x0d\x8d\
-\x97\x97\x97\xe1\xf3\xf9`\xb3\xd9\xf8}ii\x89C\x10\
-\x00\x8d\x0b\x0b\x0b\xcd\xb2\x00\xd0\xa2\x92R\x93\x11\x8d\xe9\
-N\xdfxT;5`\xb5Zy\xf5\xd4\x0a\xfd\xce`\
-0$\xf2\xf2\xf2\xee\xb3g\x1c\xd9\x17@SS\x93[\
-\x9agJO\x22\x13\xaa\x9a\xc6\x16\x8b\x997@\x9fG\
-GG#mmm\xde\xfc\xfc|\x13\xfb\xdbA\xa6\xb2\
-\xbd\x9a\xff'@ss3\x9f\x02JG\x10T?U\
-???\xcf\xeb\xd6h4\x91\xba\xba:\xe7\xc3\xb4]\
-L\x1f0\x1d\xcd\xc6xG\x00\xa5R\xe9v:\x9d\xbc\
-bJJo>\x94\xb4\xbe\xbe\xde\x99\x93\x93#\x99\x16\
-gSuV\x00\x8d\x8d\x8dn\x8b\xc5\x82\x81\x81\x81H\
-mm\xad377WV\xd3\xdd\x00\xf8\x7fFL\xc2\
-A\x99n\xd7\xdfC9V\x18\x85p\xc8\x04\x00\x00\x00\
-\x00IEND\xaeB`\x82\
-\x00\x00\x03T\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
-\x00\x00\x00\x19tEXtSoftware\
-\x00Adobe ImageRead\
-yq\xc9e<\x00\x00\x02\xe6IDATX\xc3\xd5\
-\x97\xcdN\x13a\x14\x86\xeb5\x94\x95{q\xe1\xd2\xc4\
-\xe0\x05\xb8\xe2\x0e\x5c\xb8\xf4\x02\x5c\xb10\xea\x05\x18\x96\
-&bX\xb8\xb0\x91X \xd1\x9d\xbf\x89\xa4\x14\xb1R\
-\xa4HE\x94\xfe\xd0\x02C\xff\xa6\x9d\x19\xa6e\x80\xe3\
-y{\xfa\x85QJ\x82\xc9!\x86I\xde\x9c3\xa7\xf3\
-\xcd\xfb\x9c\xf3M\x9bN\x84\x88\x22\xffS\x91s\x01\xc0\
-\xc7\xd5\x90n\xff\xa5\xfb\xac\xc7==d\x0d\xa9\x02\xf0\
-12<<\xbcj4::\xba\x19V<\x1e\xaf&\
-\x93\xc9V:\x9dv\x13\x89Dk`` \xcdkn\
-h\x02\xa48\xd2\xe1\xe1q\x99\xba\xef\xb7\xc9\xb2,\xda\
-\xdf\xdf'\x86\xf1x\xcd\x18\xeb\x8a\x1a@?\xf3\xb0\x1c\
-\xc7\xa5Lf\xb9\x0b\x14\x04\x01\xc5b\xb1:\xaf{p\
-\x1a\x88S\x01\x1c\x1c\x10ww\xb2l\xdb\xa1\xf9\xf9\xcf\
-d\x0e\xd7u\xe9\xf9\xc4D\x17B\x05\x00&{\xc1\xc9\
-\xaa7\x1cJ\xce\xcdS\xf8p]\x0f\x8b\x17T\x00\x82\
-\x10@gO\x14\xce\xed\xa6G\x1fgf\xe9\xf5\x9b\xb7\
-\x14\x9f\x9c\xa4\xa9\xa9iz\xf7\xfe\x03E\xa3\xd1e^\
-\x7fA\x05\xc0\xef\x10\xed\xb6%\x86\x85\x9a\xe3\x05\x94]\
-\xcd\xd1\xe4\xf4+z2\xfe\x94\x9e\xc5^\xd0Lb\x0e\
-\x8b\x17U\x00\xda\x81\x18\xf5\x13 <\xff\x90j\xcd6\
-\x157\xab\x94/nS\x89c\x8d\xb7\x85\xd7~Q\x01\
-\xf0y\xcc\xcd]\x1e\xb5\xc7{\xdb\xee\x9f;\xbe\xe4\x88\
-]\xb8\xbd\xee\xe2\x94\xca3\xe0u\xe4\xc6uWb\xd8\
-\x109\xea\xe63D\xd4\x01\xa7\x06\xe0\xf4:\xad9\x22\
-\x98\x98hr\x80\x98kPS\x9d\x00\x00*-\xb91\
-\xe2NS\x8c\x10\x0d\x04\xf2m\xfb(\xb6|E\x00\x9b\
-;\xdbj\xfci\x8e<l\x88\x1a\xae9\x13\x80:\x8f\
-\xb7T#*\xd7\xc5\x04\x06\x06\x005(\x9c\x17\xab\xbc\
-%\xbb\xca\x13\xc0Ma\x0e\x15*rn\xcc~Z\x02\
-hj\xdd\xad\xf1\x94'\x00S\xdc\x1cqm[@`\
-\x9a\xab\x1cu\x9e\xeb\x81A\x15G\x11\xc0j\x891\x0c\
-\xd6w\x04 \x0cd&b\xb6iu\x8b\xa8\xaa\x09P\
-\xb6\xc5\xbc\xd0\x03\xf8\xbe)c\x87)`\x0c\x18\x84\x1c\
-\x00[ME\x00t\x03S\x98\xad\x94\xc5\x1c\xe7F\xe6\
-\x1c\x00\xc8q]\xa9\xa1\x08\x80\xfd\xfcV\x12s3\x01\
-\x085\x18B\xe8\xda|\x8e)\xa8N\x00[\x00\x03\xc8\
-\x98g6\x04\x002\xe6\x85\xde\xf8\x17\x0b\xfc,\xd8\x8a\
-\x00\x18g:O\xb4T\x14#\x98\x02\x00\x02\x0c>\xfb\
-\xc5S(\xf0C\xb8fI\xf7k\xf9R\x87\xd7\xbeT\
-\x01\xc8U\x8f\xbaN\xadK\x0e\x90\xaf\x85\xde\xb7\xc2\x92\
-=O\xa6\xb3\xde\xa3\xb1q\xeb\xda\xd0\xf5\x15\x98\xb3n\
-\xa9\x00l4\xa4k\x18\xff\xe0\x11\x7fZ\x17S\xd4\x13\
-\x0bYo\xe4\xee\xbd\xe2\xa5\xc1\xcbK|m\x8cu\x87\
-5\xa8\xfa\xb7\x1c\xdde\xd9<\x8f\x1f\x19\xfe\x9e\xcf\x1e\
-7\xbd\xc9\xbax&oF\x00h\xf2\xff\x81\x99\x94\x9e\
-\xe9?\xbf\x19\x01B\xd3\xf4\xfc\xbd\x9c\x9e\xa5~\x03Q\
-l%\xa1\x92\x95\x0aw\x00\x00\x00\x00IEND\xae\
-B`\x82\
-\x00\x00\x06m\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
-\x00\x00\x064IDATx^\xad\x97[lT\xc7\
-\x1d\xc6\x7fs\xce\xd9\x8b\xbd\xf6\xfa\x16\xa0\xbe\x00\x0e\xb2\
-ic$BJ!\x22\xa1-\x95b\xa5/\xeeKh\
-+\x95\xa6U\xa5\xc6`U\xaa\xda\xb4\xaa\xfaV\x09U\
-\xca\x03\x94'\xda\x07\x84\x14)\xad\xc4\x8b\xa5R\x83y\
-\x08\xc5\x189\x0ei\xd3\x84\x9a\x9bcj\xec\xb2\x04\x1b\
-;\xbb\xf6z\x8f\xbd\xbb\xde\xb3g\xa6\xc3h\x85\xe5r\
-l\x88\xc9'}\xfa\x9f\x9d\x87\xfd~\xf3\x9f\x99s\x11\
-J)\x82$\x84x\x05x\x9e\xc7kH)\xf5w\xd6\
-(' \xb8C\xbb\x01h\x97R\xbe\xc6cdY\xd6\
-\x07\x1a\xf6\xbb@\xb7\x069\xff\x14\x00&\xfc\xb7\xed\xf5\
-\xe2`]DDn\xce\x89\x8a+W\xaeP]S\x8d\
-@\x00\xa0P\x08e(A)f\xd3i^\xa9\x17/\
-\xbc\xb4Nl;\xf1\x1f\xb9G\x83|[CL<M\
-\x07\xf6\xff`\x8b\xdd,%\xf8J2<<Lee\
-%+\xc9u]\x1e\xc0n\xa9\xb0\x22\x1b\xa2*r?\
-\xa7\xea\x81\xb5\x03\x08-\x05H\xa1\x0d\xf4]\xbcH.\
-\x97\xc3/\x16QJ\x91\xcf\xe7Y\x5c\x5c\xa4P(P\
-\xd4c\xb5\xb5\xb5\x94\x01X\x80\xf8\x82\xf6\x80\x01\x006\
-D\x05\x1f\x0f\xbcK>;\x8f\x85D\x952\xe2\xb6\xc4\
-\xb6\x04!!p>Sl\x8c;\x80D*\x04\xf0\x9c\
-\x10\x02\xe0\xcb@\x05P\x0f4`\xc4Hi\x9f$\x02\
-\x01N\x9c8!\x00\x81\x05\xd2\x87\x96\x96g\x09em\
-\x14\xe5(\xa5\xb4A\x08XW\x19%\xe2\xd8DB\x16\
-\xc3\x13s\x5c\xbc=A\xf7X\x8e\x5c$\xbe\xa9\xbd}\
-\xf7\xef-\xcbZ\xdc\xb1cGYUU\x95\xd3\xd8\xd8\
-\x18~\xe0\x86\x86\x86\xd0\xa5K\x97\xdc\xae\xae\xae\x08\xf0\
-\xd6\xaa\x1d\x00\x13DU,\xc2s\xd51\xf2\x9eO\xa1\
-(\x91Ja\x09A\xd8\xb1\x88\x86l\xe6r\x05\x12\xa2\
-\x8e?\x9f\xff+\x0dM\x1b\x01\x22\xc0f\x96\x84\xef\xfb\
-x\x9eGuu\xb5\x9ePK\xf4\xea\xd5\xab\x87\x84\x10\
-(\xa5\xdeZ\x11\xc0\xb2A\x00\xb6-\x90\xda\xb6\x148\
-\x08\xa4\x12X\xc2\x8c\x1b\x8fL\xb9\xec{\xf5;\xd47\
-6\x11|/\xc1\x84g2\x19\xca\xcb\xcb\xcdf>v\
-\xec\xd8&\xbd\x7f\x0e.A,\x01\xd0\xd9\xd9\xa9\x0e\x1d\
-:\xa4l!\x08Y\x10\xb6-\x1c\xc7\xc6BP\xb4\xcd\
-\x1a\x1b\x00\xc7\xb2\x888\x96\xae\x02`Yx\x10\xc0\xdc\
-\xdc\x1c555\x06 \x1a\x8dr\xe4\xc8\x91\xcd\xc0\x03\
-\x88\x1b\x1a\xa2\xc7b\xb9\xb0mt0f\x8d\xcb#6\
-\xb1\xa8\xa3\xc7,2\x8b\x1e\x93\x99\x1cc\xa9y\xee\xcc\
-.\xe8\xdfEr\xf9<\xab\xc8,A6\x9b5\xa7f\
-\xe9\xffm\x0e\x1c8\xb0\x1e\xe8\x00X\x06\xa0\xb4t\x16\
-\x8e\x0d\xe1\x90\xc0S\x8a\xb1\xa4\xcb\x8d\x8c\x83\xd3\xb2\x97\
-\xa6}\xaf\xb3\xb5\xe3\x17\xac\xdb\xfb:\x0d/\xb4s\xfb\
-\xce$\xfd\xfd\xfd$\x93I\x94R\xe6\xfa\xf8\xf1\xe3\xe8\
-\xba\xac3\xe7\xce\x9d\xe3\xe8\xd1\xa3\x1c>|\x98\xde\xde\
-^\x12\x89\x84\x04,\xa1\x15\xdc\x01\xed\xff\xce\xe6\xf8\xe7\
-\x94Ok\xc7\xcf\xf8\xe6/\xdf&\xf6\xf57\x99|\xa6\
-\x83k\xfe.\xae\xf1-dk\x17\xad{\x7fN^V\
-s\xfaog\xd1wM\xee\xdc\x9d\xe2\x1b\xafvr\xfd\
-\xfau\x03\xa0gk\xd6?\x16\x8b\x99\xebx<\x8e\xe3\
-8%8\x04\xc0#\x00\x96%\x98\xcaA:\xde\xca\xfe\
-\xdf\xbdM\xd5\xae\xd7(\x84b\x08\xdbBY\x82lA\
-r\x7ff\x91O\xeef\x18\xb8\xear\xfa\x1fad\xd5\
-^\xae\x8f\xdcg2\xd7\xc6\x85\x0f\xee\x9b\x00\xed\x87\xa1\
-\xcd\xcd\xcd\xb4\xb5\xb5\x19755\xa1\xa1\x14 \x83\x1f\
-F\x16\xdcq\x15\xdf\xff\xe9o\xa8l\xd8H\xe2\xec;\
-L\x8f^\xc3\x89\x94\xb1\xb5y\x07\x9b[\xb6\xf3Iy\
-%c\x09\x97\xcff\xf2\xdc\x9d\xce2\xa1\xed\x88\x0dL\
-'\xe7\xd8\xb7+\xca\xfa%\x003{=k\xea\xea\xea\
-\x00\xccu*\x952\x00J+\x10\xa0\xb9Zp\xe1\x9d\
-c(,\xca\xe6\xc6\xd9\x10\x8fR\x94\x92{\xc3}$\
-e\x05\xdb\xda\x7fLM\xdb\xcb|<\x9cf\xd2_\xc0\
-\xcdx,\xcck/x \x00\xb5t:B\xa1\x90\x09\
--\xdd\xea\x1f\x8e\x01*\xf8>`\xc1\xc6\xb8\xa0P\x1c\
-#\x1c\x8bS\xb7\xa5\x96\x92xv}\x05\xe9\xac\xc7h\
-\xff\x9f\x98\xae\xbcL\xcb\xf6\x83\xb8\x0ba\xbc\x82\xa4X\
-\x94x\xda!\xc7B-\xaa\x80\xe3i\xa0\x96\xd5\x15\x01\
-\x00\xd6\xc7C\x84\xca#\xfc\xbfjc!\x9e\xa9\x0cs\
-\xe1\xdf\x83\xec\xd9\xf9\x13\xca\xa3\x0e\xb92G\x03(\x03\
-ak\x00\x16K!\xa5\x1c%0*\x15\xa4\x5c\x05@\
-X\xa5*\xcc\xf5#\xfapl\x86\xf1Y\x8f\xef\xfd\xfa\
-\x8f\xdc\xca\xd4\xe0D\x5c\xa2\x11\x1b\xcf\x93\x14=\x07\xd3\
-\x01\xa5\x90R\xf2PjY\x01V\x05\x10\x08L\x0d\x04\
-\x18\x9dv\xf9\xd5_\x86\x18\xbd\xb7\x80=\x93g\xd3\xba\
-2\xf2y_\xbbh\xea\xce\xaf\xd4p\xf9\xdd\xe0%\x00\
-\x9ex\x09L\xb8\x10<\xa2\xd6/U\xf2\x87\x1f>\xcf\
-\xf5O3D\x1b\xb7\xb1\xf3\xc5\x97Y\x12\x5cN`\x8e\
-\xdbS\x01(\xc0\x12%\x00m\xd4R}\xb1\xb5\x96\xdd\
-[\xe2t\xbf\x97\xa5j\xf7W\xf9\xd1\x1bo\x10\xa0\xb5\
-\x03\x98\xb57\xd5\xd8\x08\x01\xd2\xcbSpSx\xf33\
-\x14\xb3i\x0a\x19\x1f%\xfd\xd5\x82\xd6\x08\xf0\xf0)\xe7\
-\xe3\xe73\x14\xe6u\xa8\x0e\xd6\x00\xcb\xf7\x89\x10\xc13\
-}\xfa\xd7r\x8c\xb2\x137\x03\xc7\x01\xb2\x1e\xfe\xad\x94\
-\xcco\xf7DT\x03\xd8_p\x07\x08\x92\x09\xfd\xd7=\
-?\xfd~B\xa6\xcf\xdf\xf6\xef\x02\xeev;\xfc\x92\x06\
-\xa8\xe3s\xcau]\x1fpW\xed\x00@2\xab\x0a\x1f\
-~*\xd3\xbd\xb7\xfc\xd4\xcdi9\x05\xf4\x03\x97th\
-\xbf\x10\xa2\xd3\xb6\xed\xaf}\x9e%XXX\xf0\x07\x06\
-\x06\xd2'O\x9e\x9c\x06\xba\x83\x00>\x1aI\xca\xad\xe3\
-\xb3*\xd7;\xe2\xa7nL\xcb\xd1R\xe8Y\x1dt\x8b\
-\x00=\x09\xc0\xd0\xd0\x90\xdb\xd3\xd3\x93\xd2N\xcf\xce\xce\
-\x9e.\xbd\x1d\xdf\x08\x02\xe8\xee\xea)\x00\x8c\x04\x84\x06\
-\x85\xaf\x08055U\xd0/\x22\xa9S\xa7N%\xc7\
-\xc7\xc7/\x03g\x81~\x1d\xec\xae\xb8\x09K\xdfv\xda\
-O&\x85\x01@\x08@aZ\xfc\xde\xe0`\xba\xbb\xbb\
-;\xa5\xdf\x8a\xcc$\xd0^\xeds\xcda\xed\x9aw3\
-n\x11`p\xf0\xfdt___\xfa\xcc\x993\xa6\xc5\
-\xa5\xd0\x8fx\x02\x89\xb5\x9ec!D\x18x\x13\xd8O\
-is\x06\xb4\xf8\xb1\xfa\x1f\xbd\xfa*_\xf2\xd8\x15\x9d\
-\x00\x00\x00\x00IEND\xaeB`\x82\
-"
-
-qt_resource_name = b"\
-\x00\x06\
-\x07\x03}\xc3\
-\x00i\
-\x00m\x00a\x00g\x00e\x00s\
-\x00\x08\
-\x08\xc8Xg\
-\x00s\
-\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
-\x00\x08\
-\x06\xc1Y\x87\
-\x00o\
-\x00p\x00e\x00n\x00.\x00p\x00n\x00g\
-\x00\x07\
-\x0a\xc7W\x87\
-\x00c\
-\x00u\x00t\x00.\x00p\x00n\x00g\
-\x00\x08\
-\x06|Z\x07\
-\x00c\
-\x00o\x00p\x00y\x00.\x00p\x00n\x00g\
-\x00\x07\
-\x04\xcaW\xa7\
-\x00n\
-\x00e\x00w\x00.\x00p\x00n\x00g\
-\x00\x09\
-\x0a\xa8\xbaG\
-\x00p\
-\x00a\x00s\x00t\x00e\x00.\x00p\x00n\x00g\
-"
-
-qt_resource_struct = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x02\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00h\x00\x00\x00\x00\x00\x01\x00\x00\x171\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00R\x00\x00\x00\x00\x00\x01\x00\x00\x11\xf3\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00(\x00\x00\x00\x00\x00\x01\x00\x00\x04\xa7\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00|\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x89\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-\x00\x00\x00>\x00\x00\x00\x00\x00\x01\x00\x00\x0c\xc4\
-\x00\x00\x01e\xaf\x16\xd2\x9d\
-"
-
-def qInitResources():
- QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing.py b/examples/widgets/painting/basicdrawing/basicdrawing.py
index f92da1bd7..858a8cd9f 100644
--- a/examples/widgets/painting/basicdrawing/basicdrawing.py
+++ b/examples/widgets/painting/basicdrawing/basicdrawing.py
@@ -1,54 +1,17 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/painting/basicdrawing example from Qt v5.x, originating from PyQt"""
-
-from PySide2.QtCore import QPoint, QRect, QSize, Qt, qVersion
-from PySide2.QtGui import (QBrush, QConicalGradient, QLinearGradient, QPainter,
- QPainterPath, QPalette, QPen, QPixmap, QPolygon, QRadialGradient)
-from PySide2.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout,
- QLabel, QSpinBox, QWidget)
-
-import basicdrawing_rc
+"""PySide6 port of the widgets/painting/basicdrawing example from Qt v5.x, originating from PyQt"""
+
+from PySide6.QtCore import QPoint, QRect, QSize, Qt, qVersion
+from PySide6.QtGui import (QBrush, QConicalGradient, QLinearGradient, QPainter,
+ QPainterPath, QPalette, QPen, QPixmap, QPolygon,
+ QRadialGradient)
+from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QGridLayout,
+ QLabel, QSpinBox, QWidget)
+
+import basicdrawing_rc # noqa: F401
class RenderArea(QWidget):
@@ -59,11 +22,11 @@ class RenderArea(QWidget):
QPoint(90, 70)
])
- Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse, Arc, Chord, \
- Pie, Path, Text, Pixmap = range(13)
+ (Line, Points, Polyline, Polygon, Rect, RoundedRect, Ellipse,
+ Arc, Chord, Pie, Path, Text, Pixmap) = range(13)
def __init__(self, parent=None):
- super(RenderArea, self).__init__(parent)
+ super().__init__(parent)
self.pen = QPen()
self.brush = QBrush()
@@ -83,23 +46,23 @@ class RenderArea(QWidget):
def sizeHint(self):
return QSize(400, 200)
- def setShape(self, shape):
+ def set_shape(self, shape):
self.shape = shape
self.update()
- def setPen(self, pen):
+ def set_pen(self, pen):
self.pen = pen
self.update()
- def setBrush(self, brush):
+ def set_brush(self, brush):
self.brush = brush
self.update()
- def setAntialiased(self, antialiased):
+ def set_antialiased(self, antialiased):
self.antialiased = antialiased
self.update()
- def setTransformed(self, transformed):
+ def set_transformed(self, transformed):
self.transformed = transformed
self.update()
@@ -111,232 +74,230 @@ class RenderArea(QWidget):
path.lineTo(20, 30)
path.cubicTo(80, 0, 50, 50, 80, 80)
- startAngle = 30 * 16
- arcLength = 120 * 16
-
- painter = QPainter(self)
- painter.setPen(self.pen)
- painter.setBrush(self.brush)
- if self.antialiased:
- painter.setRenderHint(QPainter.Antialiasing)
-
- for x in range(0, self.width(), 100):
- for y in range(0, self.height(), 100):
- painter.save()
- painter.translate(x, y)
- if self.transformed:
- painter.translate(50, 50)
- painter.rotate(60.0)
- painter.scale(0.6, 0.9)
- painter.translate(-50, -50)
-
- if self.shape == RenderArea.Line:
- painter.drawLine(rect.bottomLeft(), rect.topRight())
- elif self.shape == RenderArea.Points:
- painter.drawPoints(RenderArea.points)
- elif self.shape == RenderArea.Polyline:
- painter.drawPolyline(RenderArea.points)
- elif self.shape == RenderArea.Polygon:
- painter.drawPolygon(RenderArea.points)
- elif self.shape == RenderArea.Rect:
- painter.drawRect(rect)
- elif self.shape == RenderArea.RoundedRect:
- painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
- elif self.shape == RenderArea.Ellipse:
- painter.drawEllipse(rect)
- elif self.shape == RenderArea.Arc:
- painter.drawArc(rect, startAngle, arcLength)
- elif self.shape == RenderArea.Chord:
- painter.drawChord(rect, startAngle, arcLength)
- elif self.shape == RenderArea.Pie:
- painter.drawPie(rect, startAngle, arcLength)
- elif self.shape == RenderArea.Path:
- painter.drawPath(path)
- elif self.shape == RenderArea.Text:
- painter.drawText(rect, Qt.AlignCenter,
- "PySide 2\nQt %s" % qVersion())
- elif self.shape == RenderArea.Pixmap:
- painter.drawPixmap(10, 10, self.pixmap)
-
- painter.restore()
-
- painter.setPen(self.palette().dark().color())
- painter.setBrush(Qt.NoBrush)
- painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
-
-
-IdRole = Qt.UserRole
+ start_angle = 30 * 16
+ arc_length = 120 * 16
+
+ with QPainter(self) as painter:
+ painter.setPen(self.pen)
+ painter.setBrush(self.brush)
+ if self.antialiased:
+ painter.setRenderHint(QPainter.Antialiasing)
+
+ for x in range(0, self.width(), 100):
+ for y in range(0, self.height(), 100):
+ painter.save()
+ painter.translate(x, y)
+ if self.transformed:
+ painter.translate(50, 50)
+ painter.rotate(60.0)
+ painter.scale(0.6, 0.9)
+ painter.translate(-50, -50)
+
+ if self.shape == RenderArea.Line:
+ painter.drawLine(rect.bottomLeft(), rect.topRight())
+ elif self.shape == RenderArea.Points:
+ painter.drawPoints(RenderArea.points)
+ elif self.shape == RenderArea.Polyline:
+ painter.drawPolyline(RenderArea.points)
+ elif self.shape == RenderArea.Polygon:
+ painter.drawPolygon(RenderArea.points)
+ elif self.shape == RenderArea.Rect:
+ painter.drawRect(rect)
+ elif self.shape == RenderArea.RoundedRect:
+ painter.drawRoundedRect(rect, 25, 25, Qt.RelativeSize)
+ elif self.shape == RenderArea.Ellipse:
+ painter.drawEllipse(rect)
+ elif self.shape == RenderArea.Arc:
+ painter.drawArc(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Chord:
+ painter.drawChord(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Pie:
+ painter.drawPie(rect, start_angle, arc_length)
+ elif self.shape == RenderArea.Path:
+ painter.drawPath(path)
+ elif self.shape == RenderArea.Text:
+ qv = qVersion()
+ painter.drawText(rect, Qt.AlignCenter,
+ f"PySide 6\nQt {qv}")
+ elif self.shape == RenderArea.Pixmap:
+ painter.drawPixmap(10, 10, self.pixmap)
+
+ painter.restore()
+
+ painter.setPen(self.palette().dark().color())
+ painter.setBrush(Qt.NoBrush)
+ painter.drawRect(QRect(0, 0, self.width() - 1, self.height() - 1))
+
+
+id_role = Qt.UserRole
+
class Window(QWidget):
def __init__(self):
- super(Window, self).__init__()
-
- self.renderArea = RenderArea()
-
- self.shapeComboBox = QComboBox()
- self.shapeComboBox.addItem("Polygon", RenderArea.Polygon)
- self.shapeComboBox.addItem("Rectangle", RenderArea.Rect)
- self.shapeComboBox.addItem("Rounded Rectangle", RenderArea.RoundedRect)
- self.shapeComboBox.addItem("Ellipse", RenderArea.Ellipse)
- self.shapeComboBox.addItem("Pie", RenderArea.Pie)
- self.shapeComboBox.addItem("Chord", RenderArea.Chord)
- self.shapeComboBox.addItem("Path", RenderArea.Path)
- self.shapeComboBox.addItem("Line", RenderArea.Line)
- self.shapeComboBox.addItem("Polyline", RenderArea.Polyline)
- self.shapeComboBox.addItem("Arc", RenderArea.Arc)
- self.shapeComboBox.addItem("Points", RenderArea.Points)
- self.shapeComboBox.addItem("Text", RenderArea.Text)
- self.shapeComboBox.addItem("Pixmap", RenderArea.Pixmap)
-
- shapeLabel = QLabel("&Shape:")
- shapeLabel.setBuddy(self.shapeComboBox)
-
- self.penWidthSpinBox = QSpinBox()
- self.penWidthSpinBox.setRange(0, 20)
- self.penWidthSpinBox.setSpecialValueText("0 (cosmetic pen)")
-
- penWidthLabel = QLabel("Pen &Width:")
- penWidthLabel.setBuddy(self.penWidthSpinBox)
-
- self.penStyleComboBox = QComboBox()
- self.penStyleComboBox.addItem("Solid", Qt.SolidLine)
- self.penStyleComboBox.addItem("Dash", Qt.DashLine)
- self.penStyleComboBox.addItem("Dot", Qt.DotLine)
- self.penStyleComboBox.addItem("Dash Dot", Qt.DashDotLine)
- self.penStyleComboBox.addItem("Dash Dot Dot", Qt.DashDotDotLine)
- self.penStyleComboBox.addItem("None", Qt.NoPen)
-
- penStyleLabel = QLabel("&Pen Style:")
- penStyleLabel.setBuddy(self.penStyleComboBox)
-
- self.penCapComboBox = QComboBox()
- self.penCapComboBox.addItem("Flat", Qt.FlatCap)
- self.penCapComboBox.addItem("Square", Qt.SquareCap)
- self.penCapComboBox.addItem("Round", Qt.RoundCap)
-
- penCapLabel = QLabel("Pen &Cap:")
- penCapLabel.setBuddy(self.penCapComboBox)
-
- self.penJoinComboBox = QComboBox()
- self.penJoinComboBox.addItem("Miter", Qt.MiterJoin)
- self.penJoinComboBox.addItem("Bevel", Qt.BevelJoin)
- self.penJoinComboBox.addItem("Round", Qt.RoundJoin)
-
- penJoinLabel = QLabel("Pen &Join:")
- penJoinLabel.setBuddy(self.penJoinComboBox)
-
- self.brushStyleComboBox = QComboBox()
- self.brushStyleComboBox.addItem("Linear Gradient",
- Qt.LinearGradientPattern)
- self.brushStyleComboBox.addItem("Radial Gradient",
- Qt.RadialGradientPattern)
- self.brushStyleComboBox.addItem("Conical Gradient",
- Qt.ConicalGradientPattern)
- self.brushStyleComboBox.addItem("Texture", Qt.TexturePattern)
- self.brushStyleComboBox.addItem("Solid", Qt.SolidPattern)
- self.brushStyleComboBox.addItem("Horizontal", Qt.HorPattern)
- self.brushStyleComboBox.addItem("Vertical", Qt.VerPattern)
- self.brushStyleComboBox.addItem("Cross", Qt.CrossPattern)
- self.brushStyleComboBox.addItem("Backward Diagonal", Qt.BDiagPattern)
- self.brushStyleComboBox.addItem("Forward Diagonal", Qt.FDiagPattern)
- self.brushStyleComboBox.addItem("Diagonal Cross", Qt.DiagCrossPattern)
- self.brushStyleComboBox.addItem("Dense 1", Qt.Dense1Pattern)
- self.brushStyleComboBox.addItem("Dense 2", Qt.Dense2Pattern)
- self.brushStyleComboBox.addItem("Dense 3", Qt.Dense3Pattern)
- self.brushStyleComboBox.addItem("Dense 4", Qt.Dense4Pattern)
- self.brushStyleComboBox.addItem("Dense 5", Qt.Dense5Pattern)
- self.brushStyleComboBox.addItem("Dense 6", Qt.Dense6Pattern)
- self.brushStyleComboBox.addItem("Dense 7", Qt.Dense7Pattern)
- self.brushStyleComboBox.addItem("None", Qt.NoBrush)
-
- brushStyleLabel = QLabel("&Brush Style:")
- brushStyleLabel.setBuddy(self.brushStyleComboBox)
-
- otherOptionsLabel = QLabel("Other Options:")
- self.antialiasingCheckBox = QCheckBox("&Antialiasing")
- self.transformationsCheckBox = QCheckBox("&Transformations")
-
- self.shapeComboBox.activated.connect(self.shapeChanged)
- self.penWidthSpinBox.valueChanged.connect(self.penChanged)
- self.penStyleComboBox.activated.connect(self.penChanged)
- self.penCapComboBox.activated.connect(self.penChanged)
- self.penJoinComboBox.activated.connect(self.penChanged)
- self.brushStyleComboBox.activated.connect(self.brushChanged)
- self.antialiasingCheckBox.toggled.connect(self.renderArea.setAntialiased)
- self.transformationsCheckBox.toggled.connect(self.renderArea.setTransformed)
-
- mainLayout = QGridLayout()
- mainLayout.setColumnStretch(0, 1)
- mainLayout.setColumnStretch(3, 1)
- mainLayout.addWidget(self.renderArea, 0, 0, 1, 4)
- mainLayout.setRowMinimumHeight(1, 6)
- mainLayout.addWidget(shapeLabel, 2, 1, Qt.AlignRight)
- mainLayout.addWidget(self.shapeComboBox, 2, 2)
- mainLayout.addWidget(penWidthLabel, 3, 1, Qt.AlignRight)
- mainLayout.addWidget(self.penWidthSpinBox, 3, 2)
- mainLayout.addWidget(penStyleLabel, 4, 1, Qt.AlignRight)
- mainLayout.addWidget(self.penStyleComboBox, 4, 2)
- mainLayout.addWidget(penCapLabel, 5, 1, Qt.AlignRight)
- mainLayout.addWidget(self.penCapComboBox, 5, 2)
- mainLayout.addWidget(penJoinLabel, 6, 1, Qt.AlignRight)
- mainLayout.addWidget(self.penJoinComboBox, 6, 2)
- mainLayout.addWidget(brushStyleLabel, 7, 1, Qt.AlignRight)
- mainLayout.addWidget(self.brushStyleComboBox, 7, 2)
- mainLayout.setRowMinimumHeight(8, 6)
- mainLayout.addWidget(otherOptionsLabel, 9, 1, Qt.AlignRight)
- mainLayout.addWidget(self.antialiasingCheckBox, 9, 2)
- mainLayout.addWidget(self.transformationsCheckBox, 10, 2)
- self.setLayout(mainLayout)
-
- self.shapeChanged()
- self.penChanged()
- self.brushChanged()
- self.antialiasingCheckBox.setChecked(True)
+ super().__init__()
+
+ self._render_area = RenderArea()
+
+ self._shape_combo_box = QComboBox()
+ self._shape_combo_box.addItem("Polygon", RenderArea.Polygon)
+ self._shape_combo_box.addItem("Rectangle", RenderArea.Rect)
+ self._shape_combo_box.addItem("Rounded Rectangle", RenderArea.RoundedRect)
+ self._shape_combo_box.addItem("Ellipse", RenderArea.Ellipse)
+ self._shape_combo_box.addItem("Pie", RenderArea.Pie)
+ self._shape_combo_box.addItem("Chord", RenderArea.Chord)
+ self._shape_combo_box.addItem("Path", RenderArea.Path)
+ self._shape_combo_box.addItem("Line", RenderArea.Line)
+ self._shape_combo_box.addItem("Polyline", RenderArea.Polyline)
+ self._shape_combo_box.addItem("Arc", RenderArea.Arc)
+ self._shape_combo_box.addItem("Points", RenderArea.Points)
+ self._shape_combo_box.addItem("Text", RenderArea.Text)
+ self._shape_combo_box.addItem("Pixmap", RenderArea.Pixmap)
+
+ shape_label = QLabel("&Shape:")
+ shape_label.setBuddy(self._shape_combo_box)
+
+ self._pen_width_spin_box = QSpinBox()
+ self._pen_width_spin_box.setRange(0, 20)
+ self._pen_width_spin_box.setSpecialValueText("0 (cosmetic pen)")
+
+ pen_width_label = QLabel("Pen &Width:")
+ pen_width_label.setBuddy(self._pen_width_spin_box)
+
+ self._pen_style_combo_box = QComboBox()
+ self._pen_style_combo_box.addItem("Solid", Qt.SolidLine)
+ self._pen_style_combo_box.addItem("Dash", Qt.DashLine)
+ self._pen_style_combo_box.addItem("Dot", Qt.DotLine)
+ self._pen_style_combo_box.addItem("Dash Dot", Qt.DashDotLine)
+ self._pen_style_combo_box.addItem("Dash Dot Dot", Qt.DashDotDotLine)
+ self._pen_style_combo_box.addItem("None", Qt.NoPen)
+
+ pen_style_label = QLabel("&Pen Style:")
+ pen_style_label.setBuddy(self._pen_style_combo_box)
+
+ self._pen_cap_combo_box = QComboBox()
+ self._pen_cap_combo_box.addItem("Flat", Qt.FlatCap)
+ self._pen_cap_combo_box.addItem("Square", Qt.SquareCap)
+ self._pen_cap_combo_box.addItem("Round", Qt.RoundCap)
+
+ pen_cap_label = QLabel("Pen &Cap:")
+ pen_cap_label.setBuddy(self._pen_cap_combo_box)
+
+ self._pen_join_combo_box = QComboBox()
+ self._pen_join_combo_box.addItem("Miter", Qt.MiterJoin)
+ self._pen_join_combo_box.addItem("Bevel", Qt.BevelJoin)
+ self._pen_join_combo_box.addItem("Round", Qt.RoundJoin)
+
+ pen_join_label = QLabel("Pen &Join:")
+ pen_join_label.setBuddy(self._pen_join_combo_box)
+
+ self._brush_style_combo_box = QComboBox()
+ self._brush_style_combo_box.addItem("Linear Gradient", Qt.LinearGradientPattern)
+ self._brush_style_combo_box.addItem("Radial Gradient", Qt.RadialGradientPattern)
+ self._brush_style_combo_box.addItem("Conical Gradient", Qt.ConicalGradientPattern)
+ self._brush_style_combo_box.addItem("Texture", Qt.TexturePattern)
+ self._brush_style_combo_box.addItem("Solid", Qt.SolidPattern)
+ self._brush_style_combo_box.addItem("Horizontal", Qt.HorPattern)
+ self._brush_style_combo_box.addItem("Vertical", Qt.VerPattern)
+ self._brush_style_combo_box.addItem("Cross", Qt.CrossPattern)
+ self._brush_style_combo_box.addItem("Backward Diagonal", Qt.BDiagPattern)
+ self._brush_style_combo_box.addItem("Forward Diagonal", Qt.FDiagPattern)
+ self._brush_style_combo_box.addItem("Diagonal Cross", Qt.DiagCrossPattern)
+ self._brush_style_combo_box.addItem("Dense 1", Qt.Dense1Pattern)
+ self._brush_style_combo_box.addItem("Dense 2", Qt.Dense2Pattern)
+ self._brush_style_combo_box.addItem("Dense 3", Qt.Dense3Pattern)
+ self._brush_style_combo_box.addItem("Dense 4", Qt.Dense4Pattern)
+ self._brush_style_combo_box.addItem("Dense 5", Qt.Dense5Pattern)
+ self._brush_style_combo_box.addItem("Dense 6", Qt.Dense6Pattern)
+ self._brush_style_combo_box.addItem("Dense 7", Qt.Dense7Pattern)
+ self._brush_style_combo_box.addItem("None", Qt.NoBrush)
+
+ brush_style_label = QLabel("&Brush Style:")
+ brush_style_label.setBuddy(self._brush_style_combo_box)
+
+ other_options_label = QLabel("Other Options:")
+ self._antialiasing_check_box = QCheckBox("&Antialiasing")
+ self._transformations_check_box = QCheckBox("&Transformations")
+
+ self._shape_combo_box.activated.connect(self.shape_changed)
+ self._pen_width_spin_box.valueChanged.connect(self.pen_changed)
+ self._pen_style_combo_box.activated.connect(self.pen_changed)
+ self._pen_cap_combo_box.activated.connect(self.pen_changed)
+ self._pen_join_combo_box.activated.connect(self.pen_changed)
+ self._brush_style_combo_box.activated.connect(self.brush_changed)
+ self._antialiasing_check_box.toggled.connect(self._render_area.set_antialiased)
+ self._transformations_check_box.toggled.connect(self._render_area.set_transformed)
+
+ main_layout = QGridLayout()
+ main_layout.setColumnStretch(0, 1)
+ main_layout.setColumnStretch(3, 1)
+ main_layout.addWidget(self._render_area, 0, 0, 1, 4)
+ main_layout.setRowMinimumHeight(1, 6)
+ main_layout.addWidget(shape_label, 2, 1, Qt.AlignRight)
+ main_layout.addWidget(self._shape_combo_box, 2, 2)
+ main_layout.addWidget(pen_width_label, 3, 1, Qt.AlignRight)
+ main_layout.addWidget(self._pen_width_spin_box, 3, 2)
+ main_layout.addWidget(pen_style_label, 4, 1, Qt.AlignRight)
+ main_layout.addWidget(self._pen_style_combo_box, 4, 2)
+ main_layout.addWidget(pen_cap_label, 5, 1, Qt.AlignRight)
+ main_layout.addWidget(self._pen_cap_combo_box, 5, 2)
+ main_layout.addWidget(pen_join_label, 6, 1, Qt.AlignRight)
+ main_layout.addWidget(self._pen_join_combo_box, 6, 2)
+ main_layout.addWidget(brush_style_label, 7, 1, Qt.AlignRight)
+ main_layout.addWidget(self._brush_style_combo_box, 7, 2)
+ main_layout.setRowMinimumHeight(8, 6)
+ main_layout.addWidget(other_options_label, 9, 1, Qt.AlignRight)
+ main_layout.addWidget(self._antialiasing_check_box, 9, 2)
+ main_layout.addWidget(self._transformations_check_box, 10, 2)
+ self.setLayout(main_layout)
+
+ self.shape_changed()
+ self.pen_changed()
+ self.brush_changed()
+ self._antialiasing_check_box.setChecked(True)
self.setWindowTitle("Basic Drawing")
- def shapeChanged(self):
- shape = self.shapeComboBox.itemData(self.shapeComboBox.currentIndex(),
- IdRole)
- self.renderArea.setShape(shape)
+ def shape_changed(self):
+ shape = self._shape_combo_box.itemData(self._shape_combo_box.currentIndex(), id_role)
+ self._render_area.set_shape(shape)
- def penChanged(self):
- width = self.penWidthSpinBox.value()
- style = Qt.PenStyle(self.penStyleComboBox.itemData(
- self.penStyleComboBox.currentIndex(), IdRole))
- cap = Qt.PenCapStyle(self.penCapComboBox.itemData(
- self.penCapComboBox.currentIndex(), IdRole))
- join = Qt.PenJoinStyle(self.penJoinComboBox.itemData(
- self.penJoinComboBox.currentIndex(), IdRole))
+ def pen_changed(self):
+ width = self._pen_width_spin_box.value()
+ style = Qt.PenStyle(self._pen_style_combo_box.itemData(
+ self._pen_style_combo_box.currentIndex(), id_role))
+ cap = Qt.PenCapStyle(self._pen_cap_combo_box.itemData(
+ self._pen_cap_combo_box.currentIndex(), id_role))
+ join = Qt.PenJoinStyle(self._pen_join_combo_box.itemData(
+ self._pen_join_combo_box.currentIndex(), id_role))
- self.renderArea.setPen(QPen(Qt.blue, width, style, cap, join))
+ self._render_area.set_pen(QPen(Qt.blue, width, style, cap, join))
- def brushChanged(self):
- style = Qt.BrushStyle(self.brushStyleComboBox.itemData(
- self.brushStyleComboBox.currentIndex(), IdRole))
+ def brush_changed(self):
+ style = Qt.BrushStyle(self._brush_style_combo_box.itemData(
+ self._brush_style_combo_box.currentIndex(), id_role))
if style == Qt.LinearGradientPattern:
- linearGradient = QLinearGradient(0, 0, 100, 100)
- linearGradient.setColorAt(0.0, Qt.white)
- linearGradient.setColorAt(0.2, Qt.green)
- linearGradient.setColorAt(1.0, Qt.black)
- self.renderArea.setBrush(QBrush(linearGradient))
+ linear_gradient = QLinearGradient(0, 0, 100, 100)
+ linear_gradient.setColorAt(0.0, Qt.white)
+ linear_gradient.setColorAt(0.2, Qt.green)
+ linear_gradient.setColorAt(1.0, Qt.black)
+ self._render_area.set_brush(QBrush(linear_gradient))
elif style == Qt.RadialGradientPattern:
- radialGradient = QRadialGradient(50, 50, 50, 70, 70)
- radialGradient.setColorAt(0.0, Qt.white)
- radialGradient.setColorAt(0.2, Qt.green)
- radialGradient.setColorAt(1.0, Qt.black)
- self.renderArea.setBrush(QBrush(radialGradient))
+ radial_gradient = QRadialGradient(50, 50, 50, 70, 70)
+ radial_gradient.setColorAt(0.0, Qt.white)
+ radial_gradient.setColorAt(0.2, Qt.green)
+ radial_gradient.setColorAt(1.0, Qt.black)
+ self._render_area.set_brush(QBrush(radial_gradient))
elif style == Qt.ConicalGradientPattern:
- conicalGradient = QConicalGradient(50, 50, 150)
- conicalGradient.setColorAt(0.0, Qt.white)
- conicalGradient.setColorAt(0.2, Qt.green)
- conicalGradient.setColorAt(1.0, Qt.black)
- self.renderArea.setBrush(QBrush(conicalGradient))
+ conical_gradient = QConicalGradient(50, 50, 150)
+ conical_gradient.setColorAt(0.0, Qt.white)
+ conical_gradient.setColorAt(0.2, Qt.green)
+ conical_gradient.setColorAt(1.0, Qt.black)
+ self._render_area.set_brush(QBrush(conical_gradient))
elif style == Qt.TexturePattern:
- self.renderArea.setBrush(QBrush(QPixmap(':/images/brick.png')))
+ self._render_area.set_brush(QBrush(QPixmap(':/images/brick.png')))
else:
- self.renderArea.setBrush(QBrush(Qt.green, style))
+ self._render_area.set_brush(QBrush(Qt.green, style))
if __name__ == '__main__':
@@ -346,4 +307,4 @@ if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing.pyproject b/examples/widgets/painting/basicdrawing/basicdrawing.pyproject
index 9ecbfadcf..976bb9e35 100644
--- a/examples/widgets/painting/basicdrawing/basicdrawing.pyproject
+++ b/examples/widgets/painting/basicdrawing/basicdrawing.pyproject
@@ -1,3 +1,3 @@
{
- "files": ["basicdrawing_rc.py", "basicdrawing.qrc", "basicdrawing.py"]
+ "files": ["basicdrawing.qrc", "basicdrawing.py"]
}
diff --git a/examples/widgets/painting/basicdrawing/basicdrawing_rc.py b/examples/widgets/painting/basicdrawing/basicdrawing_rc.py
index 3a5480568..701f1610b 100644
--- a/examples/widgets/painting/basicdrawing/basicdrawing_rc.py
+++ b/examples/widgets/painting/basicdrawing/basicdrawing_rc.py
@@ -1,11 +1,47 @@
# Resource object code (Python 3)
# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
+# Created by: The Resource Compiler for Qt version 6.2.2
# WARNING! All changes made in this file will be lost!
-from PySide2 import QtCore
+from PySide6 import QtCore
qt_resource_data = b"\
+\x00\x00\x02\x15\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00P\x00\x00\x00P\x04\x03\x00\x00\x00|?\xef\x9e\
+\x00\x00\x00\x15PLTE\xa3\xc2\x00\xf4\xf8\xe1\x8a\xa1\
+\x09\x14\x14\x18?G\x16\xd3\xe2\x86p\x82\x0e\xfd\x17\x22\
+9\x00\x00\x00\x09pHYs\x00\x00\x00H\x00\x00\x00\
+H\x00F\xc9k>\x00\x00\x01\xa6IDATH\xc7\
+\xedVKn\x840\x0cEf\xc49\xa2I\xd55\x22\
+\x11k\xd4Hs\x0eT\x10\xf7?B\x0b\xc4L\xfc\x83\
+\xd9u\xd1\xf1\x0a\xa2\x97\x17\xdb\xb1\x9fSUo\xfbk\
+\xbb/\xcb\xfd\x1a\x05s\x0a\xbf\x16\x1f\xee\x1c\xd7l\xb0\
+\x0d:\x9e\xe2Ba\xe3\x8b\xb8\x13$$\x0a\x8c\x96\x9f\
+S`\xd6\xeb\xb8[\x106\xa8\xc0$\x81\xf1EB\x9d\
+\x12\x09\xe3cY\xe6dSbj\xf6+\x81\xd9\xa4\xf4\
+\x19\x87\xff\x1fV\xe0\x89\xaf\xe7d9=\x14'\xd2?\
+\xa8'\x7f\xc9\xbd\x9dz\xf2\x93n\xc45\x167\xb0\xdd\
+~u\xb6VJ\xe3F\xd7`\xfb\x06\xc5\xc9\x9a\x9e\xe2\
+\xf7\xf8\x93tr\x22K\x90\xe9k\x99\xc9D\x0e\xf1\x19\
+\xd0\xc8hR\x99D\xc0\x02\x07\x91r [\xf3m\xb6\
+l\xffQ\x11=%\x5c\x9d\x9cx~\x080\x13v\xf8\
+9\xf04v\x94\xd0a\xd6\x04\xb0\x15\x84\xfb\xba\x01\x84\
+\xb2\xa9u\xe0P\x12\xf6\xd5\x05#\x84k\xc6\xb6 \xcc\
+\x9473j\xa0\xca#\xa2>\xf2\xe8\xa9\x9ex\x15\x18\
+\x09\xa1~3x\xd75\x93(q\xd7\xb8\x02T\x1f\x81\
+6RY\x8f\x9bS\x1d\xe6R\xa9G\xacp(\x98B\
+\x98d\x85\x1f=\xb3wK\x11<\xeb\x99\xa3\x0bas\
+\x1eL\xe5{\xf6\xb5\xef*\x9aO\xa7)\x85\xcb\x1aQ\
+PFU{:\xae\x82R{\x1av\x0e\x98\xe2\xcc\xf5\
+\x11)-\xc5=\x90\xb35\xbeP\xc3{\xaa\xe1\xa66\
+\xb3\xa9\xa0Q\xaas\xe6\x94\x92\xdbx1\x84O\xa6\xd7\
+\xa4\xe2\xe2\x0b\xf3z\xb2\xc6a\x93d\x85\xc7\x8b\xb7\xc7\
+\x1e\x84\xb7F6\x7f\xa5\x80A\xb8\xda\x92\xdf=\xf9b\
+\x87\xb3\x97\xd4\xe7\xf7\xf1\x92\x02\xf7~Y\xfe?\xfb\x01\
+\xbd\xf6\xdd\x91\xa2\xf3\xda\xd4\x00\x00\x00\x00IEND\
+\xaeB`\x82\
\x00\x00\x03X\
\x89\
PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
@@ -62,42 +98,6 @@ m\x84\xd3O\x00\xdb\xe6\xee\xebD+\x94p|\xf0\xc7\
W]\x06\xe4\xfcAY\xbf\xb5\x08Wn\x8a\xce9\x97\
\xe4\xfe\x07\xb6\x84\x15$\x5c\xbcO\xce\x00\x00\x00\x00I\
END\xaeB`\x82\
-\x00\x00\x02\x15\
-\x89\
-PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
-\x00\x00P\x00\x00\x00P\x04\x03\x00\x00\x00|?\xef\x9e\
-\x00\x00\x00\x15PLTE\xa3\xc2\x00\xf4\xf8\xe1\x8a\xa1\
-\x09\x14\x14\x18?G\x16\xd3\xe2\x86p\x82\x0e\xfd\x17\x22\
-9\x00\x00\x00\x09pHYs\x00\x00\x00H\x00\x00\x00\
-H\x00F\xc9k>\x00\x00\x01\xa6IDATH\xc7\
-\xedVKn\x840\x0cEf\xc49\xa2I\xd55\x22\
-\x11k\xd4Hs\x0eT\x10\xf7?B\x0b\xc4L\xfc\x83\
-\xd9u\xd1\xf1\x0a\xa2\x97\x17\xdb\xb1\x9fSUo\xfbk\
-\xbb/\xcb\xfd\x1a\x05s\x0a\xbf\x16\x1f\xee\x1c\xd7l\xb0\
-\x0d:\x9e\xe2Ba\xe3\x8b\xb8\x13$$\x0a\x8c\x96\x9f\
-S`\xd6\xeb\xb8[\x106\xa8\xc0$\x81\xf1EB\x9d\
-\x12\x09\xe3cY\xe6dSbj\xf6+\x81\xd9\xa4\xf4\
-\x19\x87\xff\x1fV\xe0\x89\xaf\xe7d9=\x14'\xd2?\
-\xa8'\x7f\xc9\xbd\x9dz\xf2\x93n\xc45\x167\xb0\xdd\
-~u\xb6VJ\xe3F\xd7`\xfb\x06\xc5\xc9\x9a\x9e\xe2\
-\xf7\xf8\x93tr\x22K\x90\xe9k\x99\xc9D\x0e\xf1\x19\
-\xd0\xc8hR\x99D\xc0\x02\x07\x91r [\xf3m\xb6\
-l\xffQ\x11=%\x5c\x9d\x9cx~\x080\x13v\xf8\
-9\xf04v\x94\xd0a\xd6\x04\xb0\x15\x84\xfb\xba\x01\x84\
-\xb2\xa9u\xe0P\x12\xf6\xd5\x05#\x84k\xc6\xb6 \xcc\
-\x9473j\xa0\xca#\xa2>\xf2\xe8\xa9\x9ex\x15\x18\
-\x09\xa1~3x\xd75\x93(q\xd7\xb8\x02T\x1f\x81\
-6RY\x8f\x9bS\x1d\xe6R\xa9G\xacp(\x98B\
-\x98d\x85\x1f=\xb3wK\x11<\xeb\x99\xa3\x0bas\
-\x1eL\xe5{\xf6\xb5\xef*\x9aO\xa7)\x85\xcb\x1aQ\
-PFU{:\xae\x82R{\x1av\x0e\x98\xe2\xcc\xf5\
-\x11)-\xc5=\x90\xb35\xbeP\xc3{\xaa\xe1\xa66\
-\xb3\xa9\xa0Q\xaas\xe6\x94\x92\xdbx1\x84O\xa6\xd7\
-\xa4\xe2\xe2\x0b\xf3z\xb2\xc6a\x93d\x85\xc7\x8b\xb7\xc7\
-\x1e\x84\xb7F6\x7f\xa5\x80A\xb8\xda\x92\xdf=\xf9b\
-\x87\xb3\x97\xd4\xe7\xf7\xf1\x92\x02\xf7~Y\xfe?\xfb\x01\
-\xbd\xf6\xdd\x91\xa2\xf3\xda\xd4\x00\x00\x00\x00IEND\
-\xaeB`\x82\
"
qt_resource_name = b"\
@@ -105,14 +105,14 @@ qt_resource_name = b"\
\x07\x03}\xc3\
\x00i\
\x00m\x00a\x00g\x00e\x00s\
-\x00\x09\
-\x0f\x9e\x84G\
-\x00b\
-\x00r\x00i\x00c\x00k\x00.\x00p\x00n\x00g\
\x00\x0b\
\x05R\xbf'\
\x00q\
\x00t\x00-\x00l\x00o\x00g\x00o\x00.\x00p\x00n\x00g\
+\x00\x09\
+\x0f\x9e\x84G\
+\x00b\
+\x00r\x00i\x00c\x00k\x00.\x00p\x00n\x00g\
"
qt_resource_struct = b"\
@@ -120,10 +120,10 @@ qt_resource_struct = b"\
\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00*\x00\x00\x00\x00\x00\x01\x00\x00\x03\x5c\
-\x00\x00\x01e\xaf\x16\xd2\xa1\
\x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\xa1\
+\x00\x00\x01z\xe7\xee'\x09\
+\x00\x00\x00.\x00\x00\x00\x00\x00\x01\x00\x00\x02\x19\
+\x00\x00\x01z\xe7\xee'\x09\
"
def qInitResources():
diff --git a/examples/widgets/painting/basicdrawing/doc/basicdrawing.png b/examples/widgets/painting/basicdrawing/doc/basicdrawing.png
new file mode 100644
index 000000000..30be31724
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/doc/basicdrawing.png
Binary files differ
diff --git a/examples/widgets/painting/basicdrawing/doc/basicdrawing.rst b/examples/widgets/painting/basicdrawing/doc/basicdrawing.rst
new file mode 100644
index 000000000..26aa8c997
--- /dev/null
+++ b/examples/widgets/painting/basicdrawing/doc/basicdrawing.rst
@@ -0,0 +1,15 @@
+Basic Drawing Example
+=====================
+
+The Basic Drawing example shows how to display basic graphics primitives in
+a variety of styles using the QPainter class.
+
+QPainter performs low-level painting on widgets and other paint devices. The
+class can draw everything from simple lines to complex shapes like pies and
+chords. It can also draw aligned text and pixmaps. Normally, it draws in
+a "natural" coordinate system, but it can in addition do view and world
+transformation.
+
+.. image:: stardelegate.png
+ :width: 400
+ :alt: Basic Drawing Screenshot
diff --git a/examples/widgets/painting/concentriccircles.py b/examples/widgets/painting/concentriccircles.py
deleted file mode 100644
index ff13292d2..000000000
--- a/examples/widgets/painting/concentriccircles.py
+++ /dev/null
@@ -1,146 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/painting/concentriccircles example from Qt v5.x, originating from PyQt"""
-
-from PySide2.QtCore import QRect, QRectF, QSize, Qt, QTimer
-from PySide2.QtGui import QColor, QPainter, QPalette, QPen
-from PySide2.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
- QSizePolicy, QWidget)
-
-
-class CircleWidget(QWidget):
- def __init__(self, parent=None):
- super(CircleWidget, self).__init__(parent)
-
- self.floatBased = False
- self.antialiased = False
- self.frameNo = 0
-
- self.setBackgroundRole(QPalette.Base)
- self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
-
- def setFloatBased(self, floatBased):
- self.floatBased = floatBased
- self.update()
-
- def setAntialiased(self, antialiased):
- self.antialiased = antialiased
- self.update()
-
- def minimumSizeHint(self):
- return QSize(50, 50)
-
- def sizeHint(self):
- return QSize(180, 180)
-
- def nextAnimationFrame(self):
- self.frameNo += 1
- self.update()
-
- def paintEvent(self, event):
- painter = QPainter(self)
- painter.setRenderHint(QPainter.Antialiasing, self.antialiased)
- painter.translate(self.width() / 2, self.height() / 2)
-
- for diameter in range(0, 256, 9):
- delta = abs((self.frameNo % 128) - diameter / 2)
- alpha = 255 - (delta * delta) / 4 - diameter
- if alpha > 0:
- painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
-
- if self.floatBased:
- painter.drawEllipse(QRectF(-diameter / 2.0,
- -diameter / 2.0, diameter, diameter))
- else:
- painter.drawEllipse(QRect(-diameter / 2,
- -diameter / 2, diameter, diameter))
-
-
-class Window(QWidget):
- def __init__(self):
- super(Window, self).__init__()
-
- aliasedLabel = self.createLabel("Aliased")
- antialiasedLabel = self.createLabel("Antialiased")
- intLabel = self.createLabel("Int")
- floatLabel = self.createLabel("Float")
-
- layout = QGridLayout()
- layout.addWidget(aliasedLabel, 0, 1)
- layout.addWidget(antialiasedLabel, 0, 2)
- layout.addWidget(intLabel, 1, 0)
- layout.addWidget(floatLabel, 2, 0)
-
- timer = QTimer(self)
-
- for i in range(2):
- for j in range(2):
- w = CircleWidget()
- w.setAntialiased(j != 0)
- w.setFloatBased(i != 0)
-
- timer.timeout.connect(w.nextAnimationFrame)
-
- layout.addWidget(w, i + 1, j + 1)
-
- timer.start(100)
- self.setLayout(layout)
-
- self.setWindowTitle("Concentric Circles")
-
- def createLabel(self, text):
- label = QLabel(text)
- label.setAlignment(Qt.AlignCenter)
- label.setMargin(2)
- label.setFrameStyle(QFrame.Box | QFrame.Sunken)
- return label
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QApplication(sys.argv)
- window = Window()
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/painting/concentriccircles/concentriccircles.py b/examples/widgets/painting/concentriccircles/concentriccircles.py
new file mode 100644
index 000000000..d2c60178f
--- /dev/null
+++ b/examples/widgets/painting/concentriccircles/concentriccircles.py
@@ -0,0 +1,109 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/painting/concentriccircles example from Qt v5.x, originating
+ from PyQt"""
+
+from PySide6.QtCore import QRect, QRectF, QSize, Qt, QTimer
+from PySide6.QtGui import QColor, QPainter, QPalette, QPen
+from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
+ QSizePolicy, QWidget)
+
+
+class CircleWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._float_based = False
+ self.antialiased = False
+ self._frame_no = 0
+
+ self.setBackgroundRole(QPalette.Base)
+ self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
+
+ def set_float_based(self, floatBased):
+ self._float_based = floatBased
+ self.update()
+
+ def set_antialiased(self, antialiased):
+ self.antialiased = antialiased
+ self.update()
+
+ def minimumSizeHint(self):
+ return QSize(50, 50)
+
+ def sizeHint(self):
+ return QSize(180, 180)
+
+ def next_animation_frame(self):
+ self._frame_no += 1
+ self.update()
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ painter.setRenderHint(QPainter.Antialiasing, self.antialiased)
+ painter.translate(self.width() / 2, self.height() / 2)
+
+ for diameter in range(0, 256, 9):
+ delta = abs((self._frame_no % 128) - diameter / 2)
+ alpha = 255 - (delta * delta) / 4 - diameter
+ if alpha > 0:
+ painter.setPen(QPen(QColor(0, diameter / 2, 127, alpha), 3))
+
+ if self._float_based:
+ painter.drawEllipse(QRectF(-diameter / 2.0,
+ -diameter / 2.0, diameter, diameter))
+ else:
+ painter.drawEllipse(QRect(-diameter / 2,
+ -diameter / 2, diameter, diameter))
+
+
+class Window(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ aliased_label = self.create_label("Aliased")
+ antialiased_label = self.create_label("Antialiased")
+ int_label = self.create_label("Int")
+ float_label = self.create_label("Float")
+
+ layout = QGridLayout()
+ layout.addWidget(aliased_label, 0, 1)
+ layout.addWidget(antialiased_label, 0, 2)
+ layout.addWidget(int_label, 1, 0)
+ layout.addWidget(float_label, 2, 0)
+
+ timer = QTimer(self)
+
+ for i in range(2):
+ for j in range(2):
+ w = CircleWidget()
+ w.set_antialiased(j != 0)
+ w.set_float_based(i != 0)
+
+ timer.timeout.connect(w.next_animation_frame)
+
+ layout.addWidget(w, i + 1, j + 1)
+
+ timer.start(100)
+ self.setLayout(layout)
+
+ self.setWindowTitle("Concentric Circles")
+
+ def create_label(self, text):
+ label = QLabel(text)
+ label.setAlignment(Qt.AlignCenter)
+ label.setMargin(2)
+ label.setFrameStyle(QFrame.Box | QFrame.Sunken)
+ return label
+
+
+if __name__ == '__main__':
+
+ import sys
+
+ app = QApplication(sys.argv)
+ window = Window()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/painting/painting.pyproject b/examples/widgets/painting/concentriccircles/concentriccircles.pyproject
index ed24e12b0..ed24e12b0 100644
--- a/examples/widgets/painting/painting.pyproject
+++ b/examples/widgets/painting/concentriccircles/concentriccircles.pyproject
diff --git a/examples/widgets/painting/concentriccircles/doc/concentriccircles.png b/examples/widgets/painting/concentriccircles/doc/concentriccircles.png
new file mode 100644
index 000000000..69ea16825
--- /dev/null
+++ b/examples/widgets/painting/concentriccircles/doc/concentriccircles.png
Binary files differ
diff --git a/examples/widgets/painting/concentriccircles/doc/concentriccircles.rst b/examples/widgets/painting/concentriccircles/doc/concentriccircles.rst
new file mode 100644
index 000000000..6c1efe0c5
--- /dev/null
+++ b/examples/widgets/painting/concentriccircles/doc/concentriccircles.rst
@@ -0,0 +1,12 @@
+Concentric Circles Examples
+===========================
+
+Demonstrates the improved quality that antialiasing and floating point
+precision gives.
+
+The application's main window displays several widgets which are drawn using
+the various combinations of precision and anti-aliasing.
+
+.. image:: concentriccircles.png
+ :width: 400
+ :alt: Concentric Circles Screenshot
diff --git a/examples/widgets/painting/painter/doc/painter.png b/examples/widgets/painting/painter/doc/painter.png
new file mode 100644
index 000000000..991d2703d
--- /dev/null
+++ b/examples/widgets/painting/painter/doc/painter.png
Binary files differ
diff --git a/examples/widgets/painting/painter/doc/painter.rst b/examples/widgets/painting/painter/doc/painter.rst
new file mode 100644
index 000000000..69e75a789
--- /dev/null
+++ b/examples/widgets/painting/painter/doc/painter.rst
@@ -0,0 +1,8 @@
+Painter Example
+===============
+
+Simple painter application based on Qt Widgets.
+
+.. image:: painter.png
+ :width: 400
+ :alt: Painter Screenshot
diff --git a/examples/widgets/painting/painter/painter.py b/examples/widgets/painting/painter/painter.py
new file mode 100644
index 000000000..2ca078ad9
--- /dev/null
+++ b/examples/widgets/painting/painter/painter.py
@@ -0,0 +1,204 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtWidgets import (
+ QWidget,
+ QMainWindow,
+ QApplication,
+ QFileDialog,
+ QStyle,
+ QColorDialog,
+)
+from PySide6.QtCore import Qt, Slot, QStandardPaths
+from PySide6.QtGui import (
+ QMouseEvent,
+ QPaintEvent,
+ QPen,
+ QAction,
+ QPainter,
+ QColor,
+ QPixmap,
+ QIcon,
+ QKeySequence,
+)
+import sys
+
+
+class PainterWidget(QWidget):
+ """A widget where user can draw with their mouse
+
+ The user draws on a QPixmap which is itself paint from paintEvent()
+
+ """
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.setFixedSize(680, 480)
+ self.pixmap = QPixmap(self.size())
+ self.pixmap.fill(Qt.white)
+
+ self.previous_pos = None
+ self.painter = QPainter()
+ self.pen = QPen()
+ self.pen.setWidth(10)
+ self.pen.setCapStyle(Qt.RoundCap)
+ self.pen.setJoinStyle(Qt.RoundJoin)
+
+ def paintEvent(self, event: QPaintEvent):
+ """Override method from QWidget
+
+ Paint the Pixmap into the widget
+
+ """
+ with QPainter(self) as painter:
+ painter.drawPixmap(0, 0, self.pixmap)
+
+ def mousePressEvent(self, event: QMouseEvent):
+ """Override from QWidget
+
+ Called when user clicks on the mouse
+
+ """
+ self.previous_pos = event.position().toPoint()
+ QWidget.mousePressEvent(self, event)
+
+ def mouseMoveEvent(self, event: QMouseEvent):
+ """Override method from QWidget
+
+ Called when user moves and clicks on the mouse
+
+ """
+ current_pos = event.position().toPoint()
+ self.painter.begin(self.pixmap)
+ self.painter.setRenderHints(QPainter.Antialiasing, True)
+ self.painter.setPen(self.pen)
+ self.painter.drawLine(self.previous_pos, current_pos)
+ self.painter.end()
+
+ self.previous_pos = current_pos
+ self.update()
+
+ QWidget.mouseMoveEvent(self, event)
+
+ def mouseReleaseEvent(self, event: QMouseEvent):
+ """Override method from QWidget
+
+ Called when user releases the mouse
+
+ """
+ self.previous_pos = None
+ QWidget.mouseReleaseEvent(self, event)
+
+ def save(self, filename: str):
+ """ save pixmap to filename """
+ self.pixmap.save(filename)
+
+ def load(self, filename: str):
+ """ load pixmap from filename """
+ self.pixmap.load(filename)
+ self.pixmap = self.pixmap.scaled(self.size(), Qt.KeepAspectRatio)
+ self.update()
+
+ def clear(self):
+ """ Clear the pixmap """
+ self.pixmap.fill(Qt.white)
+ self.update()
+
+
+class MainWindow(QMainWindow):
+ """An Application example to draw using a pen """
+
+ def __init__(self, parent=None):
+ QMainWindow.__init__(self, parent)
+
+ self.painter_widget = PainterWidget()
+ self.bar = self.addToolBar("Menu")
+ self.bar.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
+ self._save_action = self.bar.addAction(
+ qApp.style().standardIcon(QStyle.SP_DialogSaveButton), # noqa: F821
+ "Save", self.on_save
+ )
+ self._save_action.setShortcut(QKeySequence.Save)
+ self._open_action = self.bar.addAction(
+ qApp.style().standardIcon(QStyle.SP_DialogOpenButton), # noqa: F821
+ "Open", self.on_open
+ )
+ self._open_action.setShortcut(QKeySequence.Open)
+ self.bar.addAction(
+ qApp.style().standardIcon(QStyle.SP_DialogResetButton), # noqa: F821
+ "Clear",
+ self.painter_widget.clear,
+ )
+ self.bar.addSeparator()
+
+ self.color_action = QAction(self)
+ self.color_action.triggered.connect(self.on_color_clicked)
+ self.bar.addAction(self.color_action)
+
+ self.setCentralWidget(self.painter_widget)
+
+ self.color = Qt.black
+ self.set_color(self.color)
+
+ self.mime_type_filters = ["image/png", "image/jpeg"]
+
+ @Slot()
+ def on_save(self):
+
+ dialog = QFileDialog(self, "Save File")
+ dialog.setMimeTypeFilters(self.mime_type_filters)
+ dialog.setFileMode(QFileDialog.AnyFile)
+ dialog.setAcceptMode(QFileDialog.AcceptSave)
+ dialog.setDefaultSuffix("png")
+ dialog.setDirectory(
+ QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
+ )
+
+ if dialog.exec() == QFileDialog.Accepted:
+ if dialog.selectedFiles():
+ self.painter_widget.save(dialog.selectedFiles()[0])
+
+ @Slot()
+ def on_open(self):
+
+ dialog = QFileDialog(self, "Save File")
+ dialog.setMimeTypeFilters(self.mime_type_filters)
+ dialog.setFileMode(QFileDialog.ExistingFile)
+ dialog.setAcceptMode(QFileDialog.AcceptOpen)
+ dialog.setDefaultSuffix("png")
+ dialog.setDirectory(
+ QStandardPaths.writableLocation(QStandardPaths.PicturesLocation)
+ )
+
+ if dialog.exec() == QFileDialog.Accepted:
+ if dialog.selectedFiles():
+ self.painter_widget.load(dialog.selectedFiles()[0])
+
+ @Slot()
+ def on_color_clicked(self):
+
+ color = QColorDialog.getColor(self.color, self)
+
+ if color:
+ self.set_color(color)
+
+ def set_color(self, color: QColor = Qt.black):
+
+ self.color = color
+ # Create color icon
+ pix_icon = QPixmap(32, 32)
+ pix_icon.fill(self.color)
+
+ self.color_action.setIcon(QIcon(pix_icon))
+ self.painter_widget.pen.setColor(self.color)
+ self.color_action.setText(QColor(self.color).name())
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+
+ w = MainWindow()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/painting/painter/painter.pyproject b/examples/widgets/painting/painter/painter.pyproject
new file mode 100644
index 000000000..f47831696
--- /dev/null
+++ b/examples/widgets/painting/painter/painter.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["painter.py"]
+}
diff --git a/examples/widgets/painting/plot/doc/plot.png b/examples/widgets/painting/plot/doc/plot.png
new file mode 100644
index 000000000..e5031e351
--- /dev/null
+++ b/examples/widgets/painting/plot/doc/plot.png
Binary files differ
diff --git a/examples/widgets/painting/plot/doc/plot.rst b/examples/widgets/painting/plot/doc/plot.rst
new file mode 100644
index 000000000..a63eaed87
--- /dev/null
+++ b/examples/widgets/painting/plot/doc/plot.rst
@@ -0,0 +1,36 @@
+Plot Example
+============
+
+The Plot example shows how to display a graph from data using an
+`opaque container <https://doc.qt.io/qtforpython-6/shiboken6/typesystem_containers.html>`_.
+
+It draws an sine graph using ``QPainter.drawPolyline()`` from a list of points.
+The list of points is continuously updated, as is the case for a example for a
+graph of an oscilloscope or medical patient monitor.
+In this case, it makes sense from a performance point of view to avoid the
+conversion of a Python list of data to a C++ list (``QList<QPoint>``)
+for each call to the plot function ``QPainter.drawPolyline()``.
+This is where opaque containers come into play.
+
+Instead of Python list of points, a ``QPointList`` is instantiated to store
+the data. ``QPointList`` is an opaque container wrapping a ``QList<QPoint>``.
+It can be passed to ``QPainter.drawPolyline()`` instead of a Python list of
+points.
+
+The type is declared in the entry for the ``QList`` container type in the
+type system file of the ``QtCore`` library:
+
+.. code-block:: xml
+
+ <container-type name="QList" type="list"
+ opaque-containers="int:QIntList;QPoint:QPointList;QPointF:QPointFList">
+ ...
+ </container-type>
+
+In the ``shift()`` member function, new data are appended to the list while
+old data moving out of the visible window are removed from the front of the
+list.
+
+.. image:: plot.png
+ :width: 400
+ :alt: Plot Screenshot
diff --git a/examples/widgets/painting/plot/plot.py b/examples/widgets/painting/plot/plot.py
new file mode 100644
index 000000000..fd7ff9937
--- /dev/null
+++ b/examples/widgets/painting/plot/plot.py
@@ -0,0 +1,66 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import math
+import sys
+
+from PySide6.QtWidgets import QWidget, QApplication
+from PySide6.QtCore import QPoint, QRect, QTimer, Qt
+from PySide6.QtGui import QPainter, QPointList
+
+
+WIDTH = 680
+HEIGHT = 480
+
+
+class PlotWidget(QWidget):
+ """Illustrates the use of opaque containers. QPointList
+ wraps a C++ QList<QPoint> directly, removing the need to convert
+ a Python list in each call to QPainter.drawPolyline()."""
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._timer = QTimer(self)
+ self._timer.setInterval(20)
+ self._timer.timeout.connect(self.shift)
+
+ self._points = QPointList()
+ self._points.reserve(WIDTH)
+ self._x = 0
+ self._delta_x = 0.05
+ self._half_height = HEIGHT / 2
+ self._factor = 0.8 * self._half_height
+
+ for i in range(WIDTH):
+ self._points.append(QPoint(i, self.next_point()))
+
+ self.setFixedSize(WIDTH, HEIGHT)
+
+ self._timer.start()
+
+ def next_point(self):
+ result = self._half_height - self._factor * math.sin(self._x)
+ self._x += self._delta_x
+ return result
+
+ def shift(self):
+ last_x = self._points[WIDTH - 1].x()
+ self._points.pop_front()
+ self._points.append(QPoint(last_x + 1, self.next_point()))
+ self.update()
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ rect = QRect(QPoint(0, 0), self.size())
+ painter.fillRect(rect, Qt.white)
+ painter.translate(-self._points[0].x(), 0)
+ painter.drawPolyline(self._points)
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+
+ w = PlotWidget()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/painting/plot/plot.pyproject b/examples/widgets/painting/plot/plot.pyproject
new file mode 100644
index 000000000..0ac776c83
--- /dev/null
+++ b/examples/widgets/painting/plot/plot.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["plot.py"]
+}
diff --git a/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.rst b/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.rst
new file mode 100644
index 000000000..c33c6660a
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.rst
@@ -0,0 +1,34 @@
+.. _rhi-widget-example:
+
+Simple RHI Widget Example
+=========================
+
+Shows how to render a triangle using ``QRhi``, Qt's 3D API and shading
+language abstraction layer.
+
+This example is, in many ways, the counterpart of the :ref:`rhi-window-example`
+in the QWidget world. The ``QRhiWidget`` subclass in this applications renders
+a single triangle, using a simple graphics pipeline with basic vertex and
+fragment shaders. Unlike the plain ``QWindow``-based application, this example
+does not need to worry about lower level details, such as setting up the window
+and the ``QRhi``, or dealing with swapchain and window events, as that is taken
+care of by the ``QWidget`` framework here. The instance of the ``QRhiWidget``
+subclass is added to a ``QVBoxLayout``. To keep the example minimal and
+compact, there are no further widgets or 3D content introduced.
+
+Once an instance of ``ExampleRhiWidget``, a ``QRhiWidget`` subclass, is added
+to a top-level widget's child hierarchy, the corresponding window automatically
+becomes a Direct 3D, Vulkan, Metal, or OpenGL-rendered window. The
+``QPainter``-rendered widget content, i.e. everything that is not a
+``QRhiWidget``, ``QOpenGLWidget``, or ``QQuickWidget``, is then uploaded to a
+texture, whereas the mentioned special widgets each render to a texture. The
+resulting set textures is composited together by the top-level widget's
+backingstore.
+
+As opposed to the C++ example, the cleanup is done by reimplementing
+``QRhiWidget.releaseResources()``, which is called from QWidget.closeEvent() of
+the top level widget to ensure a deterministic cleanup sequence.
+
+.. image:: simplerhiwidget.webp
+ :width: 400
+ :alt: Screenshot of the Simple RHI Widget example
diff --git a/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.webp b/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.webp
new file mode 100644
index 000000000..fdb8d20ec
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/doc/simplerhiwidget.webp
Binary files differ
diff --git a/examples/widgets/rhi/simplerhiwidget/examplewidget.py b/examples/widgets/rhi/simplerhiwidget/examplewidget.py
new file mode 100644
index 000000000..5b3e40f50
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/examplewidget.py
@@ -0,0 +1,135 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import numpy
+
+from PySide6.QtCore import (QFile, QIODevice)
+from PySide6.QtGui import (QColor, QMatrix4x4)
+from PySide6.QtGui import (QRhiBuffer,
+ QRhiDepthStencilClearValue,
+ QRhiShaderResourceBinding,
+ QRhiShaderStage,
+ QRhiVertexInputAttribute, QRhiVertexInputBinding,
+ QRhiVertexInputLayout, QRhiViewport,
+ QShader)
+from PySide6.QtWidgets import QRhiWidget
+from PySide6.support import VoidPtr
+
+VERTEX_DATA = numpy.array([ 0.0, 0.5, 1.0, 0.0, 0.0, # noqa E:201
+ -0.5, -0.5, 0.0, 1.0, 0.0, # noqa E:241
+ 0.5, -0.5, 0.0, 0.0, 1.0],
+ dtype=numpy.float32)
+
+
+def getShader(name):
+ f = QFile(name)
+ if f.open(QIODevice.ReadOnly):
+ return QShader.fromSerialized(f.readAll())
+ return QShader()
+
+
+class ExampleRhiWidget(QRhiWidget):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.m_rhi = None
+ self.m_vbuf = None
+ self.m_ubuf = None
+ self.m_srb = None
+ self.m_pipeline = None
+ self.m_viewProjection = QMatrix4x4()
+ self.m_rotation = 0.0
+
+ def releaseResources(self):
+ self.m_pipeline.destroy()
+ del self.m_pipeline
+ self.m_pipeline = None
+ self.m_srb.destroy()
+ del self.m_srb
+ self.m_srb = None
+ self.m_ubuf.destroy()
+ del self.m_ubuf
+ self.m_ubuf = None
+ self.m_vbuf.destroy()
+ del self.m_vbuf
+ self.m_buf = None
+
+ def initialize(self, cb):
+ if self.m_rhi != self.rhi():
+ self.m_pipeline = None
+ self.m_rhi = self.rhi()
+
+ if not self.m_pipeline:
+ vertex_size = 4 * VERTEX_DATA.size
+ self.m_vbuf = self.m_rhi.newBuffer(QRhiBuffer.Immutable,
+ QRhiBuffer.VertexBuffer, vertex_size)
+ self.m_vbuf.create()
+
+ self.m_ubuf = self.m_rhi.newBuffer(QRhiBuffer.Dynamic,
+ QRhiBuffer.UniformBuffer, 64)
+ self.m_ubuf.create()
+
+ self.m_srb = self.m_rhi.newShaderResourceBindings()
+ bindings = [
+ QRhiShaderResourceBinding.uniformBuffer(0, QRhiShaderResourceBinding.VertexStage,
+ self.m_ubuf)
+ ]
+ self.m_srb.setBindings(bindings)
+ self.m_srb.create()
+
+ self.m_pipeline = self.m_rhi.newGraphicsPipeline()
+ stages = [
+ QRhiShaderStage(QRhiShaderStage.Vertex,
+ getShader(":/shader_assets/color.vert.qsb")),
+ QRhiShaderStage(QRhiShaderStage.Fragment,
+ getShader(":/shader_assets/color.frag.qsb"))
+ ]
+ self.m_pipeline.setShaderStages(stages)
+ inputLayout = QRhiVertexInputLayout()
+ input_bindings = [QRhiVertexInputBinding(5 * 4)] # sizeof(float)
+ inputLayout.setBindings(input_bindings)
+ attributes = [ # 4: sizeof(float)
+ QRhiVertexInputAttribute(0, 0, QRhiVertexInputAttribute.Float2, 0),
+ QRhiVertexInputAttribute(0, 1, QRhiVertexInputAttribute.Float3, 2 * 4)
+ ]
+ inputLayout.setAttributes(attributes)
+ self.m_pipeline.setVertexInputLayout(inputLayout)
+ self.m_pipeline.setShaderResourceBindings(self.m_srb)
+ self.m_pipeline.setRenderPassDescriptor(self.renderTarget().renderPassDescriptor())
+ self.m_pipeline.create()
+
+ resourceUpdates = self.m_rhi.nextResourceUpdateBatch()
+ resourceUpdates.uploadStaticBuffer(self.m_vbuf, VoidPtr(VERTEX_DATA.tobytes(),
+ vertex_size))
+ cb.resourceUpdate(resourceUpdates)
+
+ outputSize = self.renderTarget().pixelSize()
+ self.m_viewProjection = self.m_rhi.clipSpaceCorrMatrix()
+ r = float(outputSize.width()) / float(outputSize.height())
+ self.m_viewProjection.perspective(45.0, r, 0.01, 1000.0)
+ self.m_viewProjection.translate(0, 0, -4)
+
+ def render(self, cb):
+ resourceUpdates = self.m_rhi.nextResourceUpdateBatch()
+ self.m_rotation += 1.0
+ modelViewProjection = self.m_viewProjection
+ modelViewProjection.rotate(self.m_rotation, 0, 1, 0)
+ projection = numpy.array(modelViewProjection.data(),
+ dtype=numpy.float32)
+ resourceUpdates.updateDynamicBuffer(self.m_ubuf, 0, 64,
+ projection.tobytes())
+ clearColor = QColor.fromRgbF(0.4, 0.7, 0.0, 1.0)
+ cv = QRhiDepthStencilClearValue(1.0, 0)
+ cb.beginPass(self.renderTarget(), clearColor, cv, resourceUpdates)
+
+ cb.setGraphicsPipeline(self.m_pipeline)
+ outputSize = self.renderTarget().pixelSize()
+ cb.setViewport(QRhiViewport(0, 0, outputSize.width(),
+ outputSize.height()))
+ cb.setShaderResources()
+ vbufBinding = (self.m_vbuf, 0)
+ cb.setVertexInput(0, [vbufBinding])
+ cb.draw(3)
+ cb.endPass()
+
+ self.update()
diff --git a/examples/widgets/rhi/simplerhiwidget/main.py b/examples/widgets/rhi/simplerhiwidget/main.py
new file mode 100644
index 000000000..59be81ddc
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/main.py
@@ -0,0 +1,35 @@
+# Copyright (C) 2024 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the Qt Simple RHI Widget Example example from Qt v6.x"""
+
+import sys
+
+from PySide6.QtWidgets import QApplication, QVBoxLayout, QWidget
+
+from examplewidget import ExampleRhiWidget
+import rc_simplerhiwidget # noqa F:401
+
+
+class Widget(QWidget):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ layout = QVBoxLayout(self)
+ self._rhi_widget = ExampleRhiWidget(self)
+ layout.addWidget(self._rhi_widget)
+
+ def closeEvent(self, e):
+ self._rhi_widget.releaseResources()
+ e.accept()
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ w = Widget()
+ w.resize(1280, 720)
+ w.show()
+ exit_code = app.exec()
+ del w
+ sys.exit(exit_code)
diff --git a/examples/widgets/rhi/simplerhiwidget/rc_simplerhiwidget.py b/examples/widgets/rhi/simplerhiwidget/rc_simplerhiwidget.py
new file mode 100644
index 000000000..ee8b41242
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/rc_simplerhiwidget.py
@@ -0,0 +1,163 @@
+# Resource object code (Python 3)
+# Created by: object code
+# Created by: The Resource Compiler for Qt version 6.7.0
+# WARNING! All changes made in this file will be lost!
+
+from PySide6 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x02\xe2\
+\x00\
+\x00\x07\xc4x\x9c\xb5T]k\xd4@\x14\x9d\xed\xa6]\
+\x9b\xd6\xda\x0f\xd07\x19\xe9\xcb\x16%\xa6\xb5\x15q\xdd\
+\xfa\xb0U)\x14Z\xdbR\x84e\x091\x9bM\x07\xb2\
+\xc9\x92\x8fE)\x05\xdf}\xf7w\xf8'\xfcO\xbe\x88\
+\xde;s\xd3\xcc\xa6[*\x88\x03\xb3\x999s\xef=\
+g\xceM\x9616\xcf\x183`\xd6`.\xb11s\
+\x98\xc7b\x16\xc2L\x00\xa9\xc3d\xbfi\xb0)\x03\xd3\
+V\xd9\x00\x82]\x16\xb0\x8e\x96j\xdc\x96\xfa\xafc\x8e\
+\x9e}M\xcd\xf7\xfa\xccz\x03U\x99\xec\x0e[#t\
+\x85\xcdH\x9d\x0b\x90\x82\xcfw\x07'\x07V\x9a\xf5\xad\
+\xed\x1d\x1b\xcf\x97\xd45\xe5\xd9=\xd6\x90\xcaq\x0e]\
+\x11!\x8e\x16-\xc2\x5c\x868\xc4\x1bX\x03V\x88?\
+$\x0e\xdc/j\xfb5\xe0\x9c\x81\xe7#\xc8\xc1\xea\xb8\
+\xbe\x0f+\x14\xcda>\x80\xf8\x06]\xc2\x90\x98\x01\x8a\
+\x95\xe1\x88\xb7h?O\x18\xc6\x9b\x14_\xa7\xf8\x05\xd2\
+lR\xfc\x02\xe9D\xec1\xec\xe7\xe4\xddp|y\xfd\
+\x9c\xcdJ\x0d\x06\xe9\xc3\x1a?\x01\x99\x85g\x9bj\xdf\
+\xa5\xfc\xf7\x80\xceI/\x14\xc64l\x99\xb0\x9a\x86\xad\
+\x10\x86\xf5\x8f@=\xea_\xa5\xfce:G\x1d\xbb\xc0\
+:Og\xbf\xa0\xc2\x0bY\x85\x19\xe4s\x8dzY#\
+\xca\xaf\xebc?IE\x1c\xf1M\xdb6G\x89\xef\x09\
+\xb9;\x17\xc1\xf9\x88\x0f\xc2\xd8\xcdZ\xd7`\x11\x01h\
+\x8e\xdd\xe4\xb3\x88\x02>\xf6\xbdg|\xecxq\x18'\
+\x08\xc7\xa2\xcf\x91\xad\xb9a^\x98\x1cF\x10:o\x13\
+7\xd8s3\xb7k\xf7x\x1b3\xb6\x9b\x94\xf1\x84o\
+Z\xf6F\xcb\xbc4\xcd\x8a\xccO\xe5+\xc7\x9cR\xe6\
+\x96\xfd\xff\xa9\xbfi\xd4\xa2\xa4\xde\x01\xea8\xcfd\x11\
+>\x80\xba\x1dE,\xa2\xdb\x95\x5c\x85\xff\x95\x08\xec\xf2\
+V\xa9\xa1\xf6#\xcd\xdcLx\xaa!\x13\xdc\xfa\x81\xae\
+ \xcd\x92\xdc\xcb\xf8\xc9\xd1\xfe\xf1\x99\xd3I\xe24u\
+\xf6\xa3Q\x9e\x15r&\xe2\xf9K~\xfa\xe6C\xe7\xf0\
+\xf0x\xcf\x06)\xd3\xd3\x0f\xf3\xac\x92\xaf\x09\x81\x0a'\
+g\xce\xa9\x9b\x04~F%\xa4\x07\x18\xe0\xdch\x84\xaa\
+2a\xc5@yq\x9dX\xd9y\xed>\x1c\x0c\x08|\
+G\xe0\xba\xa0(n\xd5\xd6\x0f\xad+o\x0a\x15\xa4K\
+\x01S\x08Ur,7*HG\xac\x89\x8b\x94\x0d\xc1\
+\xb8\xc4\xcf\xf2$\xaa\x14\xb8\xd4\x1bl\xd0\xdf@\xd1\xe0\
+\xfdu\x11ya\xde\xf7\xf9\xab\xa1\x9f\xb9\xa1\x03\x7f\x9d\
+\xa1\xf8\xb8k\x96x*\x86\xfd\xa7\xf8c\x9d\xef\x9af\
+\x9e\xe2\x07\x10\xb9C?\x1d\xb9\x9e\xcfeV\xd98\xa4\
+\xb1\x91\xfa\xa6~u\xbb\xd2\x8d\xa6\xbd\xd1\xebM\xb4\x5c\
+e\x8ah\xfa\x8b\xd2\xed\xe6\xa9\x9f4\xc3\xd8\x8b\xcaL\
+\xac:\xf4#\x8dU\xad\x9aE-\xf8\xc7\x80\xcc\xa2\x19\
+\xbd^\xd1\xa82\x1eg\x9b_\x5c*\xff\xe2\xaa\xbd\xea\
+=\x11\x91U\xf9j4\xb3c\xe51\x9a<+\xeb\xd2\
+gT\xf9\x94\xe4\xa8\xb8_\xb6\xe1\xa6\xb3?Y\xbd\xa1\
+\xc8\
+\x00\x00\x04C\
+\x00\
+\x00\x0c\xf4x\x9c\xddW[o\x1bE\x14\x1e_\x92\x92\
+-\xb9\xb4i\x93\x16\xda2\xa9%dCe\x9c4A\
+\xa8&\x11\xa8 Z\xa9R\xaa\x06UHV\xb4Z\xaf\
+\xd7\xe9\xc2^\xac\xddY7\xa8\xf2\x8f\xe0\x85\xbf\xc3o\
+\xe0o\xf0\xc8\x13/U9g\xe6\xcc\xee\xec\xda\xa1*\
+\x0f<0\xd2d\xe7\x5c\xe6|\xe7|sf\x920\xc6\
+V\x98\x1au\x98\x16sY\xcc\x02\x98\x09H\x0d\x98\xb5\
+74\xd8\x82\xb1\xc1&\xe0\x9a2\x9f\x09\x981\x8b@\
+\xd7D\xc3?m\xaa\xc1\x5ccSf\xcfa\xbdu\xdb\
+2\x1b\xb2\x8c\x8d\xe5\xcaf{\xec\x00V_\xcd\xf9\x84\
+\x10|\x02\xab\xcb\xa45=6\x16\x85~\x97Q\xa3o\
+\x93\xbe\xcb\xf4\x1d\x15.\x8d\x17\x8dz\xeb\x12\xbaZ\xec\
+=\xd6\x22\xed\x15 \xb8&\xb3Z\x96\xdf\xef\x9e\x9c<\
+\xe9\xa6b\xd4\xdd?\xe8\xa1}MQ m\xebt(\
+\x08\x12:>\xd2*5X\xd1&\xcc;\xb8\x1f\xac+\
+\xb4f$_&\x19c<bK\x80\xa9\x86fB\xeb\
+j\xa43\xfd\xea\xa4k\xc8X\x8d\x5c\xf7\x08\xe2n\xd3\
+\xfe%\xf2\xd7r\xcb\x88\xabuP\xb8d\x19clS\
+\x0c\xcc\xed&|\xef\x1a\xb9\xa2\xbcc\xc8w\x8cZ6\
+aW]\xda\x1b2\x1f\x5co\xc1\x0a\xc9\xe60\xb7\xc1\
+\xff\x12\x91\xdf\x90\xba&0\xad\xd6\xa8\xef\x93\xbcb\xd8\
+-\xaaW\xdb-\x83\x03\x8c\xb7J\xf1\x90\xf3\xeb\xf0s\
+\x8d\xb0p|J\xf2:\xf9\xdf\x02y\x83\xfc\xd7e\xde\
+\x8aC\x1dc\x830\xaf\x12\xfe\x15\xc2\xbcJ\xe7\xd7 \
+\x8ck\x84Q#\x8ckR\xaf\xc6\x0d\x90\xb7(fS\
+b(>\xb7(\xf6\x0d\xe2e\x9bb\xa3|\x93th\
+\xff \xe7M\xc9\xb7\x09g\x95\xfco\xb3\xa2W\xd0\xbe\
+Cy\xa1\xfds\xa8\xa7\xce\x8a&G\xfd_\xa0\xc1\xf3\
+?$\xee\xdf'\xfe\x8e\xc0\xbaB\xf2\xd7\xe0\x81\xb8\x1f\
+R.\xd7\xc9\x7fKr\xa6\xf4\x87\xc4\xf5G\x84\xff\x0b\
+\xecY%\x1en\x91\x1e\xe3\xecP\xbflR\x1c\xc4\xb9\
+K~\xaf!\xeb/\xd4Ul\xd2\xfd@a\xc4\x8a\xfb\
+\xf9{k\xea%\xa9\x1fG|\xb7\xd7\xb3\xacT$\x99\
++\xf80\x1b[\xaf,\x0e#t\xc4>\x0f\xa7\x93\xbe\
+5\xeb[V\x16\xf9\xe38\x09\xd1\xce\xed\xbd\x03\xd0L\
+\x9d\xe4g?:\xe3S\xcf\xbd\xcf\xa7\xb6\x1b\x07q\xd2\
+\xb7\x1c!\x12\x7f\x98\x09O\xe9\x17i\xf7\xf9$N}\
+\x01\xc8\x18%\xf6G\x1c3lw\x08\x97B\xf1C\xbd\
+\x19\x95g\x81\xfd\x946\x81\x01\x12\xe8Bf\xfc\x13#\
+\xd2\xcc\xb2*\xc5\x9e\xb3b\x18\xc5\xee\xfd/\x8b\xfd\xd5\
+(\xf6\xb7\xa2\xd8\x83\x7fSl\x9c\x89J\xa1~T\xaa\
+P\x89\xffEix\xc7\xf6\x8a\xca\xea\x7f\xb8\x90\xe6\xd8\
+Kd\xb6\x0fx\xe2\x9d\xf9\xa9\xf0\x92\xf6\xb0\xa7a\x93\
+\xf8\xa5\x1d:?\x02\xf08\x88\xa1\xd0\xf3}\x84\xb1\x11\
+\xe6\x01\x9f8\xeeO\xf1x\x9cz\xa2\xed\xf6:\xaa~\
+\xe0\xc7\x11\xbeK\xeef\x86\xfd\x92\xc9\xa0\xa3\xac^\xa0\
+,QC\xfc\x9f<}\xfc\xec\xb9\xfd0\x89\xd3\xd4~\
+\x1cM2A\x09W6@\x96\xdf\x7f\xfb\xc3\xc3\xe3\xe3\
+g\xdf\xf4\xfa\x85\x03\xc1\x18\xd6]\x95\xfe\x82\xe8\xc7\x99\
+\xa8\x84\xcfs\xbf z\xa9l\xf09yn\x900\xd3\
+\xc7\x0b]%\xecw=\xe30\x0b\xda\xba\xb6{\xfa(\
+:\xf2\x9c\xe7sV\x1d4\xc7\x14\x07n\xcf<\xdb\xc7\
+\xb5\x86\xd6\xc0\x86\xa9k$1)20=\x8ac\x91\
+\xe9\x17\x05)\xc5\x82\x8c\xd4\xeeX\x0a\xca\xc9\xd4t\xcb\
+\xc5\x96\x9ag\xce\xb7`+\xef$\xd9\xb1\x9e\xc8\x92\xa8\
+\x0243oA\x93~{\xd0\xa8\xfd\xd9\xf2#7\xc8\
+F\x1e\xff2\xf4\x84\x13\xd8\xf0WR\xe0\x0f\x8f\xacB\
+\x9f\xfa\xe1\xe83\xfc\xd1}q\x04w<\xc5\xc7+r\
+B/\x85+\xe0q\xb9\xab\xbf\xe0i\xc8\xefL\xfe<\
+\x90\x0bf\xd2\xc3\xec\x16\xb7\xd5`\x90\xa5p\x0d\x83\xd8\
+\x8dz\x9d\xd3\xd3\x0b[k0\xd0'\x80Ns\xf1\xfd\
+\xe8\x82K1\x18\xe4\xafj\xbb\x02\xa0o\x86\xe9\xb2\xdb\
+\xd1\xe1\xf1\x88\xbd\xf3\x22}\xb5jk8\xeecl\xdd\
+!\xa7\xa7\xf7 X\x04b$I\xf9\x18\xfb\x15\xec\xea\
+\xcd\x91\xc0\x9d\xfc\x0d\xd5\x01q\x1e\xf2W3\x95R\x5c\
+:g?2{2\x9e\xeb\x97\xe2\x01\x04\xcfroR\
+W\xc4\xaa\x19\xb0\x1b\x96$&=\x8a\x95\x871\xff\xad\
+\xce\xe8\xbf\x83J\xcb\xcc\xd9\xb5\xae\xea'\xc7\xdf%\xe1\
+\xb4\xa2\
+"
+
+qt_resource_name = b"\
+\x00\x0d\
+\x06E\xc5\xd3\
+\x00s\
+\x00h\x00a\x00d\x00e\x00r\x00_\x00a\x00s\x00s\x00e\x00t\x00s\
+\x00\x0e\
+\x04\x16\xeb\xb2\
+\x00c\
+\x00o\x00l\x00o\x00r\x00.\x00f\x00r\x00a\x00g\x00.\x00q\x00s\x00b\
+\x00\x0e\
+\x00\xfb\xe9\x92\
+\x00c\
+\x00o\x00l\x00o\x00r\x00.\x00v\x00e\x00r\x00t\x00.\x00q\x00s\x00b\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00B\x00\x00\x00\x00\x00\x01\x00\x00\x02\xe6\
+\x00\x00\x01\x8a!\x0c\xa5\xeb\
+\x00\x00\x00 \x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01\x8a!\x0c\xa5\xeb\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/examples/widgets/rhi/simplerhiwidget/shader_assets/color.frag.qsb b/examples/widgets/rhi/simplerhiwidget/shader_assets/color.frag.qsb
new file mode 100644
index 000000000..32bd2d595
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/shader_assets/color.frag.qsb
Binary files differ
diff --git a/examples/widgets/rhi/simplerhiwidget/shader_assets/color.vert.qsb b/examples/widgets/rhi/simplerhiwidget/shader_assets/color.vert.qsb
new file mode 100644
index 000000000..bf97035d7
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/shader_assets/color.vert.qsb
Binary files differ
diff --git a/examples/widgets/rhi/simplerhiwidget/shaders/color.frag b/examples/widgets/rhi/simplerhiwidget/shaders/color.frag
new file mode 100644
index 000000000..375587662
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/shaders/color.frag
@@ -0,0 +1,10 @@
+#version 440
+
+layout(location = 0) in vec3 v_color;
+
+layout(location = 0) out vec4 fragColor;
+
+void main()
+{
+ fragColor = vec4(v_color, 1.0);
+}
diff --git a/examples/widgets/rhi/simplerhiwidget/shaders/color.vert b/examples/widgets/rhi/simplerhiwidget/shaders/color.vert
new file mode 100644
index 000000000..e876f290e
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/shaders/color.vert
@@ -0,0 +1,16 @@
+#version 440
+
+layout(location = 0) in vec4 position;
+layout(location = 1) in vec3 color;
+
+layout(location = 0) out vec3 v_color;
+
+layout(std140, binding = 0) uniform buf {
+ mat4 mvp;
+};
+
+void main()
+{
+ v_color = color;
+ gl_Position = mvp * position;
+}
diff --git a/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.pyproject b/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.pyproject
new file mode 100644
index 000000000..ff0d62755
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.pyproject
@@ -0,0 +1,4 @@
+{
+ "files": ["main.py","examplewidget.py", "simplerhiwidget.qrc",
+ "shaders/color.frag", "shaders/color.vert"]
+}
diff --git a/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.qrc b/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.qrc
new file mode 100644
index 000000000..ddc6dfbe5
--- /dev/null
+++ b/examples/widgets/rhi/simplerhiwidget/simplerhiwidget.qrc
@@ -0,0 +1,6 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/">
+ <file>shader_assets/color.vert.qsb</file>
+ <file>shader_assets/color.frag.qsb</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/richtext/orderform.py b/examples/widgets/richtext/orderform.py
deleted file mode 100644
index 7c0d273d2..000000000
--- a/examples/widgets/richtext/orderform.py
+++ /dev/null
@@ -1,296 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/richtext/orderform example from Qt v5.x"""
-
-from PySide2 import QtCore, QtGui, QtWidgets, QtPrintSupport
-
-
-class MainWindow(QtWidgets.QMainWindow):
- def __init__(self):
- super(MainWindow, self).__init__()
-
- fileMenu = QtWidgets.QMenu("&File", self)
- newAction = fileMenu.addAction("&New...")
- newAction.setShortcut("Ctrl+N")
- self.printAction = fileMenu.addAction("&Print...", self.printFile)
- self.printAction.setShortcut("Ctrl+P")
- self.printAction.setEnabled(False)
- quitAction = fileMenu.addAction("E&xit")
- quitAction.setShortcut("Ctrl+Q")
- self.menuBar().addMenu(fileMenu)
-
- self.letters = QtWidgets.QTabWidget()
-
- newAction.triggered.connect(self.openDialog)
- quitAction.triggered.connect(self.close)
-
- self.setCentralWidget(self.letters)
- self.setWindowTitle("Order Form")
-
- def createLetter(self, name, address, orderItems, sendOffers):
- editor = QtWidgets.QTextEdit()
- tabIndex = self.letters.addTab(editor, name)
- self.letters.setCurrentIndex(tabIndex)
-
- cursor = editor.textCursor()
- cursor.movePosition(QtGui.QTextCursor.Start)
- topFrame = cursor.currentFrame()
- topFrameFormat = topFrame.frameFormat()
- topFrameFormat.setPadding(16)
- topFrame.setFrameFormat(topFrameFormat)
-
- textFormat = QtGui.QTextCharFormat()
- boldFormat = QtGui.QTextCharFormat()
- boldFormat.setFontWeight(QtGui.QFont.Bold)
-
- referenceFrameFormat = QtGui.QTextFrameFormat()
- referenceFrameFormat.setBorder(1)
- referenceFrameFormat.setPadding(8)
- referenceFrameFormat.setPosition(QtGui.QTextFrameFormat.FloatRight)
- referenceFrameFormat.setWidth(QtGui.QTextLength(QtGui.QTextLength.PercentageLength, 40))
- cursor.insertFrame(referenceFrameFormat)
-
- cursor.insertText("A company", boldFormat)
- cursor.insertBlock()
- cursor.insertText("321 City Street")
- cursor.insertBlock()
- cursor.insertText("Industry Park")
- cursor.insertBlock()
- cursor.insertText("Another country")
-
- cursor.setPosition(topFrame.lastPosition())
-
- cursor.insertText(name, textFormat)
- for line in address.split("\n"):
- cursor.insertBlock()
- cursor.insertText(line)
-
- cursor.insertBlock()
- cursor.insertBlock()
-
- date = QtCore.QDate.currentDate()
- cursor.insertText("Date: %s" % date.toString('d MMMM yyyy'),
- textFormat)
- cursor.insertBlock()
-
- bodyFrameFormat = QtGui.QTextFrameFormat()
- bodyFrameFormat.setWidth(QtGui.QTextLength(QtGui.QTextLength.PercentageLength, 100))
- cursor.insertFrame(bodyFrameFormat)
-
- cursor.insertText("I would like to place an order for the following "
- "items:", textFormat)
- cursor.insertBlock()
- cursor.insertBlock()
-
- orderTableFormat = QtGui.QTextTableFormat()
- orderTableFormat.setAlignment(QtCore.Qt.AlignHCenter)
- orderTable = cursor.insertTable(1, 2, orderTableFormat)
-
- orderFrameFormat = cursor.currentFrame().frameFormat()
- orderFrameFormat.setBorder(1)
- cursor.currentFrame().setFrameFormat(orderFrameFormat)
-
- cursor = orderTable.cellAt(0, 0).firstCursorPosition()
- cursor.insertText("Product", boldFormat)
- cursor = orderTable.cellAt(0, 1).firstCursorPosition()
- cursor.insertText("Quantity", boldFormat)
-
- for text, quantity in orderItems:
- row = orderTable.rows()
-
- orderTable.insertRows(row, 1)
- cursor = orderTable.cellAt(row, 0).firstCursorPosition()
- cursor.insertText(text, textFormat)
- cursor = orderTable.cellAt(row, 1).firstCursorPosition()
- cursor.insertText(str(quantity), textFormat)
-
- cursor.setPosition(topFrame.lastPosition())
-
- cursor.insertBlock()
-
- cursor.insertText("Please update my records to take account of the "
- "following privacy information:")
- cursor.insertBlock()
-
- offersTable = cursor.insertTable(2, 2)
-
- cursor = offersTable.cellAt(0, 1).firstCursorPosition()
- cursor.insertText("I want to receive more information about your "
- "company's products and special offers.", textFormat)
- cursor = offersTable.cellAt(1, 1).firstCursorPosition()
- cursor.insertText("I do not want to receive any promotional "
- "information from your company.", textFormat)
-
- if sendOffers:
- cursor = offersTable.cellAt(0, 0).firstCursorPosition()
- else:
- cursor = offersTable.cellAt(1, 0).firstCursorPosition()
-
- cursor.insertText('X', boldFormat)
-
- cursor.setPosition(topFrame.lastPosition())
- cursor.insertBlock()
- cursor.insertText("Sincerely,", textFormat)
- cursor.insertBlock()
- cursor.insertBlock()
- cursor.insertBlock()
- cursor.insertText(name)
-
- self.printAction.setEnabled(True)
-
- def createSample(self):
- dialog = DetailsDialog('Dialog with default values', self)
- self.createLetter('Mr Smith',
- '12 High Street\nSmall Town\nThis country',
- dialog.orderItems(), True)
-
- def openDialog(self):
- dialog = DetailsDialog("Enter Customer Details", self)
-
- if dialog.exec_() == QtWidgets.QDialog.Accepted:
- self.createLetter(dialog.senderName(), dialog.senderAddress(),
- dialog.orderItems(), dialog.sendOffers())
-
- def printFile(self):
- editor = self.letters.currentWidget()
- printer = QtPrintSupport.QPrinter()
-
- dialog = QtPrintSupport.QPrintDialog(printer, self)
- dialog.setWindowTitle("Print Document")
-
- if editor.textCursor().hasSelection():
- dialog.addEnabledOption(QtPrintSupport.QAbstractPrintDialog.PrintSelection)
-
- if dialog.exec_() != QtWidgets.QDialog.Accepted:
- return
-
- editor.print_(printer)
-
-
-class DetailsDialog(QtWidgets.QDialog):
- def __init__(self, title, parent):
- super(DetailsDialog, self).__init__(parent)
-
- self.items = ("T-shirt", "Badge", "Reference book", "Coffee cup")
-
- nameLabel = QtWidgets.QLabel("Name:")
- addressLabel = QtWidgets.QLabel("Address:")
- addressLabel.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop)
-
- self.nameEdit = QtWidgets.QLineEdit()
- self.addressEdit = QtWidgets.QTextEdit()
- self.offersCheckBox = QtWidgets.QCheckBox("Send information about "
- "products and special offers:")
-
- self.setupItemsTable()
-
- buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel)
-
- buttonBox.accepted.connect(self.verify)
- buttonBox.rejected.connect(self.reject)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameEdit, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0)
- mainLayout.addWidget(self.addressEdit, 1, 1)
- mainLayout.addWidget(self.itemsTable, 0, 2, 2, 1)
- mainLayout.addWidget(self.offersCheckBox, 2, 1, 1, 2)
- mainLayout.addWidget(buttonBox, 3, 0, 1, 3)
- self.setLayout(mainLayout)
-
- self.setWindowTitle(title)
-
- def setupItemsTable(self):
- self.itemsTable = QtWidgets.QTableWidget(len(self.items), 2)
-
- for row, item in enumerate(self.items):
- name = QtWidgets.QTableWidgetItem(item)
- name.setFlags(QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsSelectable)
- self.itemsTable.setItem(row, 0, name)
- quantity = QtWidgets.QTableWidgetItem('1')
- self.itemsTable.setItem(row, 1, quantity)
-
- def orderItems(self):
- orderList = []
-
- for row in range(len(self.items)):
- text = self.itemsTable.item(row, 0).text()
- quantity = int(self.itemsTable.item(row, 1).data(QtCore.Qt.DisplayRole))
- orderList.append((text, max(0, quantity)))
-
- return orderList
-
- def senderName(self):
- return self.nameEdit.text()
-
- def senderAddress(self):
- return self.addressEdit.toPlainText()
-
- def sendOffers(self):
- return self.offersCheckBox.isChecked()
-
- def verify(self):
- if self.nameEdit.text() and self.addressEdit.toPlainText():
- self.accept()
- return
-
- answer = QtWidgets.QMessageBox.warning(self, "Incomplete Form",
- "The form does not contain all the necessary information.\n"
- "Do you want to discard it?",
- QtWidgets.QMessageBox.Yes, QtWidgets.QMessageBox.No)
-
- if answer == QtWidgets.QMessageBox.Yes:
- self.reject()
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = MainWindow()
- window.resize(640, 480)
- window.show()
- window.createSample()
- sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/orderform/orderform.py b/examples/widgets/richtext/orderform/orderform.py
new file mode 100644
index 000000000..9725624c3
--- /dev/null
+++ b/examples/widgets/richtext/orderform/orderform.py
@@ -0,0 +1,265 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/richtext/orderform example from Qt v5.x"""
+
+import sys
+
+from PySide6.QtCore import QDate, Qt, Slot
+from PySide6.QtGui import (QFont, QTextCharFormat, QTextCursor,
+ QTextFrameFormat, QTextLength, QTextTableFormat)
+from PySide6.QtWidgets import (QApplication, QCheckBox, QDialog,
+ QDialogButtonBox, QGridLayout, QLabel,
+ QLineEdit, QMainWindow, QMenu, QMessageBox,
+ QTableWidget, QTableWidgetItem, QTabWidget,
+ QTextEdit)
+from PySide6.QtPrintSupport import QAbstractPrintDialog, QPrintDialog, QPrinter
+
+
+class MainWindow(QMainWindow):
+ def __init__(self):
+ super().__init__()
+
+ file_menu = QMenu("&File", self)
+ new_action = file_menu.addAction("&New...")
+ new_action.setShortcut("Ctrl+N")
+ self._print_action = file_menu.addAction("&Print...", self.print_file)
+ self._print_action.setShortcut("Ctrl+P")
+ self._print_action.setEnabled(False)
+ quit_action = file_menu.addAction("E&xit")
+ quit_action.setShortcut("Ctrl+Q")
+ self.menuBar().addMenu(file_menu)
+
+ self.letters = QTabWidget()
+
+ new_action.triggered.connect(self.open_dialog)
+ quit_action.triggered.connect(self.close)
+
+ self.setCentralWidget(self.letters)
+ self.setWindowTitle("Order Form")
+
+ def create_letter(self, name, address, orderItems, sendOffers):
+ editor = QTextEdit()
+ tab_index = self.letters.addTab(editor, name)
+ self.letters.setCurrentIndex(tab_index)
+
+ cursor = editor.textCursor()
+ cursor.movePosition(QTextCursor.Start)
+ top_frame = cursor.currentFrame()
+ top_frame_format = top_frame.frameFormat()
+ top_frame_format.setPadding(16)
+ top_frame.setFrameFormat(top_frame_format)
+
+ text_format = QTextCharFormat()
+ bold_format = QTextCharFormat()
+ bold_format.setFontWeight(QFont.Bold)
+
+ reference_frame_format = QTextFrameFormat()
+ reference_frame_format.setBorder(1)
+ reference_frame_format.setPadding(8)
+ reference_frame_format.setPosition(QTextFrameFormat.FloatRight)
+ reference_frame_format.setWidth(QTextLength(QTextLength.PercentageLength, 40))
+ cursor.insertFrame(reference_frame_format)
+
+ cursor.insertText("A company", bold_format)
+ cursor.insertBlock()
+ cursor.insertText("321 City Street")
+ cursor.insertBlock()
+ cursor.insertText("Industry Park")
+ cursor.insertBlock()
+ cursor.insertText("Another country")
+
+ cursor.setPosition(top_frame.lastPosition())
+
+ cursor.insertText(name, text_format)
+ for line in address.split("\n"):
+ cursor.insertBlock()
+ cursor.insertText(line)
+
+ cursor.insertBlock()
+ cursor.insertBlock()
+
+ date = QDate.currentDate()
+ date_str = date.toString('d MMMM yyyy')
+ cursor.insertText(f"Date: {date_str}", text_format)
+ cursor.insertBlock()
+
+ body_frame_format = QTextFrameFormat()
+ body_frame_format.setWidth(QTextLength(QTextLength.PercentageLength, 100))
+ cursor.insertFrame(body_frame_format)
+
+ cursor.insertText("I would like to place an order for the following items:", text_format)
+ cursor.insertBlock()
+ cursor.insertBlock()
+
+ order_table_format = QTextTableFormat()
+ order_table_format.setAlignment(Qt.AlignHCenter)
+ order_table = cursor.insertTable(1, 2, order_table_format)
+
+ order_frame_format = cursor.currentFrame().frameFormat()
+ order_frame_format.setBorder(1)
+ cursor.currentFrame().setFrameFormat(order_frame_format)
+
+ cursor = order_table.cellAt(0, 0).firstCursorPosition()
+ cursor.insertText("Product", bold_format)
+ cursor = order_table.cellAt(0, 1).firstCursorPosition()
+ cursor.insertText("Quantity", bold_format)
+
+ for text, quantity in orderItems:
+ row = order_table.rows()
+
+ order_table.insertRows(row, 1)
+ cursor = order_table.cellAt(row, 0).firstCursorPosition()
+ cursor.insertText(text, text_format)
+ cursor = order_table.cellAt(row, 1).firstCursorPosition()
+ cursor.insertText(str(quantity), text_format)
+
+ cursor.setPosition(top_frame.lastPosition())
+
+ cursor.insertBlock()
+
+ cursor.insertText("Please update my records to take account of the "
+ "following privacy information:")
+ cursor.insertBlock()
+
+ offers_table = cursor.insertTable(2, 2)
+
+ cursor = offers_table.cellAt(0, 1).firstCursorPosition()
+ cursor.insertText("I want to receive more information about your "
+ "company's products and special offers.", text_format)
+ cursor = offers_table.cellAt(1, 1).firstCursorPosition()
+ cursor.insertText("I do not want to receive any promotional "
+ "information from your company.", text_format)
+
+ if sendOffers:
+ cursor = offers_table.cellAt(0, 0).firstCursorPosition()
+ else:
+ cursor = offers_table.cellAt(1, 0).firstCursorPosition()
+
+ cursor.insertText('X', bold_format)
+
+ cursor.setPosition(top_frame.lastPosition())
+ cursor.insertBlock()
+ cursor.insertText("Sincerely,", text_format)
+ cursor.insertBlock()
+ cursor.insertBlock()
+ cursor.insertBlock()
+ cursor.insertText(name)
+
+ self._print_action.setEnabled(True)
+
+ def create_sample(self):
+ dialog = DetailsDialog('Dialog with default values', self)
+ self.create_letter('Mr Smith',
+ '12 High Street\nSmall Town\nThis country',
+ dialog.order_items(), True)
+
+ @Slot()
+ def open_dialog(self):
+ dialog = DetailsDialog("Enter Customer Details", self)
+
+ if dialog.exec() == QDialog.Accepted:
+ self.create_letter(dialog.sender_name(), dialog.sender_address(),
+ dialog.order_items(), dialog.send_offers())
+
+ @Slot()
+ def print_file(self):
+ editor = self.letters.currentWidget()
+ printer = QPrinter()
+
+ dialog = QPrintDialog(printer, self)
+ dialog.setWindowTitle("Print Document")
+
+ if editor.textCursor().hasSelection():
+ dialog.addEnabledOption(QAbstractPrintDialog.PrintSelection)
+
+ if dialog.exec() != QDialog.Accepted:
+ return
+
+ editor.print_(printer)
+
+
+class DetailsDialog(QDialog):
+ def __init__(self, title, parent):
+ super().__init__(parent)
+
+ self.items = ("T-shirt", "Badge", "Reference book", "Coffee cup")
+
+ name_label = QLabel("Name:")
+ address_label = QLabel("Address:")
+ address_label.setAlignment(Qt.AlignLeft | Qt.AlignTop)
+
+ self._name_edit = QLineEdit()
+ self._address_edit = QTextEdit()
+ self._offers_check_box = QCheckBox("Send information about products and special offers:")
+
+ self.setup_items_table()
+
+ button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
+
+ button_box.accepted.connect(self.verify)
+ button_box.rejected.connect(self.reject)
+
+ main_layout = QGridLayout(self)
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_edit, 0, 1)
+ main_layout.addWidget(address_label, 1, 0)
+ main_layout.addWidget(self._address_edit, 1, 1)
+ main_layout.addWidget(self._items_table, 0, 2, 2, 1)
+ main_layout.addWidget(self._offers_check_box, 2, 1, 1, 2)
+ main_layout.addWidget(button_box, 3, 0, 1, 3)
+
+ self.setWindowTitle(title)
+
+ def setup_items_table(self):
+ self._items_table = QTableWidget(len(self.items), 2)
+
+ for row, item in enumerate(self.items):
+ name = QTableWidgetItem(item)
+ name.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable)
+ self._items_table.setItem(row, 0, name)
+ quantity = QTableWidgetItem('1')
+ self._items_table.setItem(row, 1, quantity)
+
+ def order_items(self):
+ order_list = []
+
+ for row in range(len(self.items)):
+ text = self._items_table.item(row, 0).text()
+ quantity = int(self._items_table.item(row, 1).data(Qt.DisplayRole))
+ order_list.append((text, max(0, quantity)))
+
+ return order_list
+
+ def sender_name(self):
+ return self._name_edit.text()
+
+ def sender_address(self):
+ return self._address_edit.toPlainText()
+
+ def send_offers(self):
+ return self._offers_check_box.isChecked()
+
+ @Slot()
+ def verify(self):
+ if self._name_edit.text() and self._address_edit.toPlainText():
+ self.accept()
+ return
+
+ answer = QMessageBox.warning(self, "Incomplete Form",
+ "The form does not contain all the necessary information.\n"
+ "Do you want to discard it?",
+ QMessageBox.Yes, QMessageBox.No)
+
+ if answer == QMessageBox.Yes:
+ self.reject()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = MainWindow()
+ window.resize(640, 480)
+ window.show()
+ window.create_sample()
+ sys.exit(app.exec())
diff --git a/examples/widgets/richtext/orderform/orderform.pyproject b/examples/widgets/richtext/orderform/orderform.pyproject
new file mode 100644
index 000000000..47be69fd2
--- /dev/null
+++ b/examples/widgets/richtext/orderform/orderform.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["orderform.py"]
+}
diff --git a/examples/widgets/richtext/richtext.pyproject b/examples/widgets/richtext/richtext.pyproject
deleted file mode 100644
index e91a98961..000000000
--- a/examples/widgets/richtext/richtext.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["syntaxhighlighter.py", "orderform.py"]
-}
diff --git a/examples/widgets/richtext/syntaxhighlighter.py b/examples/widgets/richtext/syntaxhighlighter.py
deleted file mode 100644
index 82e4c79a1..000000000
--- a/examples/widgets/richtext/syntaxhighlighter.py
+++ /dev/null
@@ -1,202 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/richtext/syntaxhighlighter example from Qt v5.x"""
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-class MainWindow(QtWidgets.QMainWindow):
- def __init__(self, parent=None):
- super(MainWindow, self).__init__(parent)
-
- self.setupFileMenu()
- self.setupHelpMenu()
- self.setupEditor()
-
- self.setCentralWidget(self.editor)
- self.setWindowTitle("Syntax Highlighter")
-
- def about(self):
- QtWidgets.QMessageBox.about(self, "About Syntax Highlighter",
- "<p>The <b>Syntax Highlighter</b> example shows how to " \
- "perform simple syntax highlighting by subclassing the " \
- "QSyntaxHighlighter class and describing highlighting " \
- "rules using regular expressions.</p>")
-
- def newFile(self):
- self.editor.clear()
-
- def openFile(self, path=None):
- if not path:
- path = QtWidgets.QFileDialog.getOpenFileName(self, "Open File",
- '', "C++ Files (*.cpp *.h)")
-
- if path:
- inFile = QtCore.QFile(path[0])
- if inFile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text):
- text = inFile.readAll()
-
- try:
- # Python v3.
- text = str(text, encoding='ascii')
- except TypeError:
- # Python v2.
- text = str(text)
-
- self.editor.setPlainText(text)
-
- def setupEditor(self):
- font = QtGui.QFont()
- font.setFamily('Courier')
- font.setFixedPitch(True)
- font.setPointSize(10)
-
- self.editor = QtWidgets.QTextEdit()
- self.editor.setFont(font)
-
- self.highlighter = Highlighter(self.editor.document())
-
- def setupFileMenu(self):
- fileMenu = QtWidgets.QMenu("&File", self)
- self.menuBar().addMenu(fileMenu)
-
- fileMenu.addAction("&New...", self.newFile, "Ctrl+N")
- fileMenu.addAction("&Open...", self.openFile, "Ctrl+O")
- fileMenu.addAction("E&xit", qApp.quit, "Ctrl+Q")
-
- def setupHelpMenu(self):
- helpMenu = QtWidgets.QMenu("&Help", self)
- self.menuBar().addMenu(helpMenu)
-
- helpMenu.addAction("&About", self.about)
- helpMenu.addAction("About &Qt", qApp.aboutQt)
-
-
-class Highlighter(QtGui.QSyntaxHighlighter):
- def __init__(self, parent=None):
- super(Highlighter, self).__init__(parent)
-
- keywordFormat = QtGui.QTextCharFormat()
- keywordFormat.setForeground(QtCore.Qt.darkBlue)
- keywordFormat.setFontWeight(QtGui.QFont.Bold)
-
- keywordPatterns = ["\\bchar\\b", "\\bclass\\b", "\\bconst\\b",
- "\\bdouble\\b", "\\benum\\b", "\\bexplicit\\b", "\\bfriend\\b",
- "\\binline\\b", "\\bint\\b", "\\blong\\b", "\\bnamespace\\b",
- "\\boperator\\b", "\\bprivate\\b", "\\bprotected\\b",
- "\\bpublic\\b", "\\bshort\\b", "\\bsignals\\b", "\\bsigned\\b",
- "\\bslots\\b", "\\bstatic\\b", "\\bstruct\\b",
- "\\btemplate\\b", "\\btypedef\\b", "\\btypename\\b",
- "\\bunion\\b", "\\bunsigned\\b", "\\bvirtual\\b", "\\bvoid\\b",
- "\\bvolatile\\b"]
-
- self.highlightingRules = [(QtCore.QRegExp(pattern), keywordFormat)
- for pattern in keywordPatterns]
-
- classFormat = QtGui.QTextCharFormat()
- classFormat.setFontWeight(QtGui.QFont.Bold)
- classFormat.setForeground(QtCore.Qt.darkMagenta)
- self.highlightingRules.append((QtCore.QRegExp("\\bQ[A-Za-z]+\\b"),
- classFormat))
-
- singleLineCommentFormat = QtGui.QTextCharFormat()
- singleLineCommentFormat.setForeground(QtCore.Qt.red)
- self.highlightingRules.append((QtCore.QRegExp("//[^\n]*"),
- singleLineCommentFormat))
-
- self.multiLineCommentFormat = QtGui.QTextCharFormat()
- self.multiLineCommentFormat.setForeground(QtCore.Qt.red)
-
- quotationFormat = QtGui.QTextCharFormat()
- quotationFormat.setForeground(QtCore.Qt.darkGreen)
- self.highlightingRules.append((QtCore.QRegExp("\".*\""),
- quotationFormat))
-
- functionFormat = QtGui.QTextCharFormat()
- functionFormat.setFontItalic(True)
- functionFormat.setForeground(QtCore.Qt.blue)
- self.highlightingRules.append((QtCore.QRegExp("\\b[A-Za-z0-9_]+(?=\\()"),
- functionFormat))
-
- self.commentStartExpression = QtCore.QRegExp("/\\*")
- self.commentEndExpression = QtCore.QRegExp("\\*/")
-
- def highlightBlock(self, text):
- for pattern, format in self.highlightingRules:
- expression = QtCore.QRegExp(pattern)
- index = expression.indexIn(text)
- while index >= 0:
- length = expression.matchedLength()
- self.setFormat(index, length, format)
- index = expression.indexIn(text, index + length)
-
- self.setCurrentBlockState(0)
-
- startIndex = 0
- if self.previousBlockState() != 1:
- startIndex = self.commentStartExpression.indexIn(text)
-
- while startIndex >= 0:
- endIndex = self.commentEndExpression.indexIn(text, startIndex)
-
- if endIndex == -1:
- self.setCurrentBlockState(1)
- commentLength = len(text) - startIndex
- else:
- commentLength = endIndex - startIndex + self.commentEndExpression.matchedLength()
-
- self.setFormat(startIndex, commentLength,
- self.multiLineCommentFormat)
- startIndex = self.commentStartExpression.indexIn(text,
- startIndex + commentLength)
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = MainWindow()
- window.resize(640, 512)
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.png b/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.png
new file mode 100644
index 000000000..37b13b128
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.png
Binary files differ
diff --git a/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.rst b/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.rst
new file mode 100644
index 000000000..d088ffd13
--- /dev/null
+++ b/examples/widgets/richtext/syntaxhighlighter/doc/syntaxhighlighter.rst
@@ -0,0 +1,8 @@
+Syntax Highlighter Example
+==========================
+
+The Syntax Highlighter example shows how to perform simple syntax highlighting.
+
+.. image:: syntaxhighlighter.png
+ :width: 400
+ :alt: Syntax Highlighter Screenshot
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
index 55805e469..021328977 100644
--- a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
+++ b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py
@@ -1,153 +1,109 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/richtext/syntaxhighlighter example from Qt v5.x"""
+"""PySide6 port of the widgets/richtext/syntaxhighlighter example from Qt v5.x"""
+import os
+from pathlib import Path
import sys
import re
-from PySide2.QtCore import (QFile, Qt, QTextStream)
-from PySide2.QtGui import (QColor, QFont, QKeySequence, QSyntaxHighlighter,
- QTextCharFormat)
-from PySide2.QtWidgets import (QApplication, QFileDialog, QMainWindow,
- QPlainTextEdit)
-
-import syntaxhighlighter_rc
+from PySide6.QtCore import (QFile, Qt, QTextStream)
+from PySide6.QtGui import (QColor, QFont, QFontDatabase, QKeySequence,
+ QSyntaxHighlighter, QTextCharFormat)
+from PySide6.QtWidgets import (QApplication, QFileDialog, QMainWindow,
+ QPlainTextEdit)
class MainWindow(QMainWindow):
def __init__(self, parent=None):
QMainWindow.__init__(self, parent)
- self.highlighter = Highlighter()
+ self._highlighter = Highlighter()
- self.setupFileMenu()
- self.setupEditor()
+ self.setup_file_menu()
+ self.setup_editor()
- self.setCentralWidget(self.editor)
+ self.setCentralWidget(self._editor)
self.setWindowTitle(self.tr("Syntax Highlighter"))
- def newFile(self):
- self.editor.clear()
-
- def openFile(self, path = ""):
- fileName = path
+ def new_file(self):
+ self._editor.clear()
- if not fileName:
- fileName, _ = QFileDialog.getOpenFileName(self, self.tr("Open File"), "",
- "qmake Files (*.pro *.prf *.pri)")
+ def open_file(self, path=""):
+ file_name = path
- if fileName:
- inFile = QFile(fileName)
- if inFile.open(QFile.ReadOnly | QFile.Text):
- stream = QTextStream(inFile)
- self.editor.setPlainText(stream.readAll())
+ if not file_name:
+ file_name, _ = QFileDialog.getOpenFileName(self, self.tr("Open File"), "",
+ "Python Files (*.py)")
- def setupEditor(self):
- variableFormat = QTextCharFormat()
- variableFormat.setFontWeight(QFont.Bold)
- variableFormat.setForeground(Qt.blue)
- self.highlighter.addMapping("\\b[A-Z_]+\\b", variableFormat)
+ if file_name:
+ in_file = QFile(file_name)
+ if in_file.open(QFile.ReadOnly | QFile.Text):
+ stream = QTextStream(in_file)
+ self._editor.setPlainText(stream.readAll())
- singleLineCommentFormat = QTextCharFormat()
- singleLineCommentFormat.setBackground(QColor("#77ff77"))
- self.highlighter.addMapping("#[^\n]*", singleLineCommentFormat)
+ def setup_editor(self):
+ class_format = QTextCharFormat()
+ class_format.setFontWeight(QFont.Bold)
+ class_format.setForeground(Qt.blue)
+ pattern = r'^\s*class\s+\w+\(.*$'
+ self._highlighter.add_mapping(pattern, class_format)
- quotationFormat = QTextCharFormat()
- quotationFormat.setBackground(Qt.cyan)
- quotationFormat.setForeground(Qt.blue)
- self.highlighter.addMapping("\".*\"", quotationFormat)
+ function_format = QTextCharFormat()
+ function_format.setFontItalic(True)
+ function_format.setForeground(Qt.blue)
+ pattern = r'^\s*def\s+\w+\s*\(.*\)\s*:\s*$'
+ self._highlighter.add_mapping(pattern, function_format)
- functionFormat = QTextCharFormat()
- functionFormat.setFontItalic(True)
- functionFormat.setForeground(Qt.blue)
- self.highlighter.addMapping("\\b[a-z0-9_]+\\(.*\\)", functionFormat)
+ comment_format = QTextCharFormat()
+ comment_format.setBackground(QColor("#77ff77"))
+ self._highlighter.add_mapping(r'^\s*#.*$', comment_format)
- font = QFont()
- font.setFamily("Courier")
- font.setFixedPitch(True)
- font.setPointSize(10)
+ font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
+ self._editor = QPlainTextEdit()
+ self._editor.setFont(font)
+ self._highlighter.setDocument(self._editor.document())
- self.editor = QPlainTextEdit()
- self.editor.setFont(font)
- self.highlighter.setDocument(self.editor.document())
+ def setup_file_menu(self):
+ file_menu = self.menuBar().addMenu(self.tr("&File"))
- def setupFileMenu(self):
- fileMenu = self.menuBar().addMenu(self.tr("&File"))
+ new_file_act = file_menu.addAction(self.tr("&New..."))
+ new_file_act.setShortcut(QKeySequence(QKeySequence.New))
+ new_file_act.triggered.connect(self.new_file)
- newFileAct = fileMenu.addAction(self.tr("&New..."))
- newFileAct.setShortcut(QKeySequence(QKeySequence.New))
- newFileAct.triggered.connect(self.newFile)
+ open_file_act = file_menu.addAction(self.tr("&Open..."))
+ open_file_act.setShortcut(QKeySequence(QKeySequence.Open))
+ open_file_act.triggered.connect(self.open_file)
- openFileAct = fileMenu.addAction(self.tr("&Open..."))
- openFileAct.setShortcut(QKeySequence(QKeySequence.Open))
- openFileAct.triggered.connect(self.openFile)
+ quit_act = file_menu.addAction(self.tr("E&xit"))
+ quit_act.setShortcut(QKeySequence(QKeySequence.Quit))
+ quit_act.triggered.connect(self.close)
- quitAct = fileMenu.addAction(self.tr("E&xit"))
- quitAct.setShortcut(QKeySequence(QKeySequence.Quit))
- quitAct.triggered.connect(self.close)
-
- helpMenu = self.menuBar().addMenu("&Help")
- helpMenu.addAction("About &Qt", qApp.aboutQt)
+ help_menu = self.menuBar().addMenu("&Help")
+ help_menu.addAction("About &Qt", qApp.aboutQt) # noqa: F821
class Highlighter(QSyntaxHighlighter):
def __init__(self, parent=None):
QSyntaxHighlighter.__init__(self, parent)
- self.mappings = {}
+ self._mappings = {}
- def addMapping(self, pattern, format):
- self.mappings[pattern] = format
+ def add_mapping(self, pattern, format):
+ self._mappings[pattern] = format
def highlightBlock(self, text):
- for pattern in self.mappings:
- for m in re.finditer(pattern,text):
- s,e = m.span()
- self.setFormat(s, e - s, self.mappings[pattern])
+ for pattern, format in self._mappings.items():
+ for match in re.finditer(pattern, text):
+ start, end = match.span()
+ self.setFormat(start, end - start, format)
+
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.resize(640, 512)
window.show()
- window.openFile(":/examples/example")
- sys.exit(app.exec_())
+ window.open_file(os.fspath(Path(__file__).resolve()))
+ sys.exit(app.exec())
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject
index e42b221a8..de344e5dd 100644
--- a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject
+++ b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject
@@ -1,4 +1,3 @@
{
- "files": ["syntaxhighlighter_rc.py", "syntaxhighlighter.py",
- "syntaxhighlighter.qrc"]
+ "files": ["syntaxhighlighter.py"]
}
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc
deleted file mode 100644
index e5f9abf1e..000000000
--- a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc
+++ /dev/null
@@ -1,5 +0,0 @@
-<!DOCTYPE RCC><RCC version="1.0">
-<qresource prefix="/" >
- <file>examples/example</file>
-</qresource>
-</RCC>
diff --git a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py b/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py
deleted file mode 100644
index 34fa7d49e..000000000
--- a/examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py
+++ /dev/null
@@ -1,143 +0,0 @@
-# Resource object code (Python 3)
-# Created by: object code
-# Created by: The Resource Compiler for Qt version 5.14.0
-# WARNING! All changes made in this file will be lost!
-
-from PySide2 import QtCore
-
-qt_resource_data = b"\
-\x00\x00\x06{\
-T\
-EMPLATE = app\x0aLA\
-NGUAGE = C++\x0aTAR\
-GET = as\
-sistant\x0a\x0aCONFIG \
- += qt war\
-n_on\x0aQT \
- += xml networ\
-k\x0a\x0aPROJECTNAME \
- = Assistan\
-t\x0aDESTDIR \
- = ../../bin\
-\x0a\x0aFORMS += findd\
-ialog.ui \x5c\x0a \
- helpdialog.ui\
- \x5c\x0a mainw\
-indow.ui \x5c\x0a \
- settingsdialo\
-g.ui \x5c\x0a t\
-abbedbrowser.ui \
-\x5c\x0a topicc\
-hooser.ui\x0a\x0aSOURC\
-ES += main.cpp \x5c\
-\x0a helpwin\
-dow.cpp \x5c\x0a \
- topicchooser.c\
-pp \x5c\x0a doc\
-uparser.cpp \x5c\x0a \
- settingsdi\
-alog.cpp \x5c\x0a \
- index.cpp \x5c\x0a \
- profile.c\
-pp \x5c\x0a con\
-fig.cpp \x5c\x0a \
- finddialog.cpp\
- \x5c\x0a helpd\
-ialog.cpp \x5c\x0a \
- mainwindow.c\
-pp \x5c\x0a tab\
-bedbrowser.cpp\x0a\x0a\
-HEADERS +\
-= helpwindow.h \x5c\
-\x0a topicch\
-ooser.h \x5c\x0a \
- docuparser.h \x5c\
-\x0a setting\
-sdialog.h \x5c\x0a \
- index.h \x5c\x0a \
- profile.h \
-\x5c\x0a finddi\
-alog.h \x5c\x0a \
- helpdialog.h \x5c\x0a\
- mainwind\
-ow.h \x5c\x0a t\
-abbedbrowser.h \x5c\
-\x0a config.\
-h\x0a\x0aRESOURCES += \
-assistant.qrc\x0a\x0aD\
-EFINES += QT_KEY\
-WORDS\x0a#DEFINES +\
-= QT_PALMTOPCEN\
-TER_DOCS\x0a!networ\
-k:DEFINES \
- += QT_INTERNAL_\
-NETWORK\x0aelse:QT \
-+= network\x0a!xml:\
- DEFINES \
- += QT_IN\
-TERNAL_XML\x0aelse:\
-QT += xml\x0ainclud\
-e( ../../src/qt_\
-professional.pri\
- )\x0a\x0awin32 {\x0a \
-LIBS += -lshell3\
-2\x0a RC_FILE = \
-assistant.rc\x0a}\x0a\x0a\
-macos {\x0a ICON\
- = assistant.icn\
-s\x0a TARGET = a\
-ssistant\x0a# QM\
-AKE_INFO_PLIST =\
- Info_mac.plist\x0a\
-}\x0a\x0a#target.path \
-= $$[QT_INSTALL_\
-BINS]\x0a#INSTALLS \
-+= target\x0a\x0a#assi\
-stanttranslation\
-s.files = *.qm\x0a#\
-assistanttransla\
-tions.path = $$[\
-QT_INSTALL_TRANS\
-LATIONS]\x0a#INSTAL\
-LS += assistantt\
-ranslations\x0a\x0aTRA\
-NSLATIONS \
- = assistant_de.\
-ts \x5c\x0a \
- assistant\
-_fr.ts\x0a\x0a\x0aunix:!c\
-ontains(QT_CONFI\
-G, zlib):LIBS +=\
- -lz\x0a\x0a\x0atarget.pa\
-th=$$[QT_INSTALL\
-_BINS]\x0aINSTALLS \
-+= target\x0a\
-"
-
-qt_resource_name = b"\
-\x00\x08\
-\x0e\x84\x7fC\
-\x00e\
-\x00x\x00a\x00m\x00p\x00l\x00e\x00s\
-\x00\x07\
-\x0c\xe8G\xe5\
-\x00e\
-\x00x\x00a\x00m\x00p\x00l\x00e\
-"
-
-qt_resource_struct = b"\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\
-\x00\x00\x00\x00\x00\x00\x00\x00\
-\x00\x00\x00\x16\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\
-\x00\x00\x01e\xaf\x16\xd2\xa1\
-"
-
-def qInitResources():
- QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-def qCleanupResources():
- QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
-
-qInitResources()
diff --git a/examples/widgets/richtext/textedit/doc/textedit.png b/examples/widgets/richtext/textedit/doc/textedit.png
new file mode 100644
index 000000000..e0e681f35
--- /dev/null
+++ b/examples/widgets/richtext/textedit/doc/textedit.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/doc/textedit.rst b/examples/widgets/richtext/textedit/doc/textedit.rst
new file mode 100644
index 000000000..2c8bc3232
--- /dev/null
+++ b/examples/widgets/richtext/textedit/doc/textedit.rst
@@ -0,0 +1,8 @@
+TextEdit Example
+================
+
+The Text Edit example shows Qt's rich text editing facilities in action.
+
+.. image:: textedit.png
+ :width: 400
+ :alt: TextEdit Screenshot
diff --git a/examples/widgets/richtext/textedit/example.html b/examples/widgets/richtext/textedit/example.html
new file mode 100644
index 000000000..99090a697
--- /dev/null
+++ b/examples/widgets/richtext/textedit/example.html
@@ -0,0 +1,79 @@
+<html><head><meta name="qrichtext" content="1" /><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>QTextEdit Example</title><style type="text/css">
+p, li { white-space: pre-wrap; }
+</style></head><body style=" font-size:9pt; font-weight:400; font-style:normal; text-decoration:none;">
+<h1 align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:20pt; font-weight:600;">QTextEdit</span></h1>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">The QTextEdit widget is an advanced editor that supports formatted rich text. It can be used to display HTML and other rich document formats. Internally, QTextEdit uses the QTextDocument class to describe both the high-level structure of each document and the low-level formatting of paragraphs.</span></p>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">If you are viewing this document in the <span style=" font-style:italic;">textedit</span> example, you can edit this document to explore Qt's rich text editing features. We have included some comments in each of the following sections to encourage you to experiment. </p>
+<h2 style=" margin-top:16px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:18pt; font-weight:600;"><span style=" font-size:16pt;">Font and Paragraph Styles</span></h2>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">QTextEdit supports </span><span style=" font-size:11pt; font-weight:600;">bold</span><span style=" font-size:11pt;">, </span><span style=" font-size:11pt; font-style:italic;">italic</span><span style=" font-size:11pt;">, and </span><span style=" font-size:11pt; text-decoration: underline;">underlined</span><span style=" font-size:11pt;"> font styles, and can display </span><span style=" font-size:11pt; font-weight:600; color:#00007f;">multicolored</span><span style=" font-size:11pt;"> </span><span style=" font-size:11pt; font-weight:600; color:#aa0000;">text</span><span style=" font-size:11pt;">. Font families such as </span><span style=" font-family:'Times New Roman'; font-size:11pt; font-weight:600;">Times New Roman</span><span style=" font-size:11pt;"> and </span><span style=" font-family:'Courier'; font-size:11pt; font-weight:600;">Courier</span><span style=" font-size:11pt;"> can also be used directly. </span><span style=" font-size:11pt; font-style:italic;">If you place the cursor in a region of styled text, the controls in the tool bars will change to reflect the current style.</span></p>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Paragraphs can be formatted so that the text is left-aligned, right-aligned, centered, or fully justified.</p>
+<p align="center" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-style:italic;">Try changing the alignment of some text and resize the editor to see how the text layout changes.</span> </p>
+<h2 align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:16pt; font-weight:600;">Lists</span></h2>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">Different kinds of lists can be included in rich text documents. Standard bullet lists can be nested, using different symbols for each level of the list: </span></p>
+<ul style="-qt-list-indent: 1;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Disc symbols are typically used for top-level list items. </li></ul>
+<ul type=circle style="-qt-list-indent: 2;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Circle symbols can be used to distinguish between items in lower-level lists.</li></ul>
+<ul type=square style="-qt-list-indent: 3;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Square symbols provide a reasonable alternative to discs and circles. </li></ul>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Ordered lists can be created that can be used for tables of contents. Different characters can be used to enumerate items, and we can use both Roman and Arabic numerals in the same list structure: </p>
+<ol style="-qt-list-indent: 1;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Introduction</li>
+<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Tools </li></ol>
+<ol type=a style="-qt-list-indent: 2;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Assistant</li>
+<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Designer</li>
+<ol type=A style="-qt-list-indent: 3;"><li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Form Editor</li>
+<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Component Architecture</li></ol>
+<li style=" font-size:11pt;" style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Qt Linguist</li></ol>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">The list will automatically be renumbered if you add or remove items. <span style=" font-style:italic;">Try adding new sections to the above list or removing existing item to see the numbers change.</span> </p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
+<h2 style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Images</span></h2>
+<p style=" margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">Inline images are treated like ordinary ranges of characters in the text editor, so they flow with the surrounding text. Images can also be selected in the same way as text, making it easy to cut, copy, and paste them. </span></p>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><img src=":/images/logo32.png" /><span style=" font-style:italic;"> Try to select this image by clicking and dragging over it with the mouse, or use the text cursor to select it by holding down Shift and using the arrow keys. You can then cut or copy it, and paste it into different parts of this document.</span></p>
+<h2 align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Tables</span></h2>
+<p align="justify" style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:16pt; font-weight:600;"><span style=" font-size:11pt; font-weight:400;">QTextEdit can arrange and format tables, supporting features such as row and column spans, text formatting within cells, and size constraints for columns. </span></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
+<table border="1" align="center" width="90%" cellspacing="0" cellpadding="4">
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"> </p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Development Tools </span></p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Programming Techniques </span></p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">Graphical User Interfaces </span></p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">9:00 - 11:00 </span></p></td>
+<td colspan="3">
+<p align="center" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Introduction to <span style=" font-style:italic;">Qt </span></p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">11:00 - 13:00 </span></p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Using <span style=" font-style:italic;">qmake</span> </p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Object-oriented Programming </p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Layouts in <span style=" font-style:italic;">Qt</span> </p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">13:00 - 15:00 </span></p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Qt Designer</span> Tutorial </p></td>
+<td rowspan="2">
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Extreme Programming </p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Writing Custom Styles </p></td></tr>
+<tr>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:600;">15:00 - 17:00 </span></p></td>
+<td>
+<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-style:italic;">Qt Linguist</span> and Internationalization </p></td>
+<td></td></tr></table>
+<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"></p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt; font-style:italic;">Try adding text to the cells in the table and experiment with the alignment of the paragraphs.</p>
+<h2 style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Hyperlinks</span></h2>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-size:11pt;">QTextEdit is designed to support hyperlinks between documents, and this feature is used extensively in </span><span style=" font-size:11pt; font-style:italic;">Qt Assistant</span><span style=" font-size:11pt;">. Hyperlinks are automatically created when an HTML file is imported into an editor. Since the rich text framework supports hyperlinks natively, they can also be created programatically.</span></p>
+<h2 style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-size:16pt; font-weight:600;">Undo and Redo</span></h2>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;">Full support for undo and redo operations is built into QTextEdit and the underlying rich text framework. Operations on a document can be packaged together to make editing a more comfortable experience for the user.</p>
+<p style=" margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-size:11pt;"><span style=" font-style:italic;">Try making changes to this document and press Ctrl+Z to undo them. You can always recover the original contents of the document.</span> </p></body></html>
diff --git a/examples/widgets/richtext/textedit/images/logo32.png b/examples/widgets/richtext/textedit/images/logo32.png
new file mode 100644
index 000000000..5f91e9873
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/logo32.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/checkbox-checked.png b/examples/widgets/richtext/textedit/images/mac/checkbox-checked.png
new file mode 100644
index 000000000..a072d7fb5
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/checkbox-checked.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/checkbox.png b/examples/widgets/richtext/textedit/images/mac/checkbox.png
new file mode 100644
index 000000000..406490971
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/checkbox.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/editcopy.png b/examples/widgets/richtext/textedit/images/mac/editcopy.png
new file mode 100644
index 000000000..f55136446
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/editcopy.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/editcut.png b/examples/widgets/richtext/textedit/images/mac/editcut.png
new file mode 100644
index 000000000..a784fd570
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/editcut.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/editpaste.png b/examples/widgets/richtext/textedit/images/mac/editpaste.png
new file mode 100644
index 000000000..64c0b2d6a
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/editpaste.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/editredo.png b/examples/widgets/richtext/textedit/images/mac/editredo.png
new file mode 100644
index 000000000..8875bf246
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/editredo.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/editundo.png b/examples/widgets/richtext/textedit/images/mac/editundo.png
new file mode 100644
index 000000000..a3bd5e0bf
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/editundo.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/exportpdf.png b/examples/widgets/richtext/textedit/images/mac/exportpdf.png
new file mode 100644
index 000000000..9e199407a
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/exportpdf.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/filenew.png b/examples/widgets/richtext/textedit/images/mac/filenew.png
new file mode 100644
index 000000000..d3882c7b3
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/filenew.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/fileopen.png b/examples/widgets/richtext/textedit/images/mac/fileopen.png
new file mode 100644
index 000000000..fc06c5ec6
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/fileopen.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/fileprint.png b/examples/widgets/richtext/textedit/images/mac/fileprint.png
new file mode 100644
index 000000000..10ca56c82
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/fileprint.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/filesave.png b/examples/widgets/richtext/textedit/images/mac/filesave.png
new file mode 100644
index 000000000..e65a29d5f
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/filesave.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/format-indent-less.png b/examples/widgets/richtext/textedit/images/mac/format-indent-less.png
new file mode 100644
index 000000000..e38074e78
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/format-indent-less.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/format-indent-more.png b/examples/widgets/richtext/textedit/images/mac/format-indent-more.png
new file mode 100644
index 000000000..1bdeabd35
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/format-indent-more.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textbold.png b/examples/widgets/richtext/textedit/images/mac/textbold.png
new file mode 100644
index 000000000..38400bd1f
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textbold.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textcenter.png b/examples/widgets/richtext/textedit/images/mac/textcenter.png
new file mode 100644
index 000000000..2ef5b2ee6
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textcenter.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textitalic.png b/examples/widgets/richtext/textedit/images/mac/textitalic.png
new file mode 100644
index 000000000..0170ee26a
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textitalic.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textjustify.png b/examples/widgets/richtext/textedit/images/mac/textjustify.png
new file mode 100644
index 000000000..39cd6c1a9
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textjustify.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textleft.png b/examples/widgets/richtext/textedit/images/mac/textleft.png
new file mode 100644
index 000000000..83a66d553
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textleft.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textright.png b/examples/widgets/richtext/textedit/images/mac/textright.png
new file mode 100644
index 000000000..e7c04645c
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textright.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textunder.png b/examples/widgets/richtext/textedit/images/mac/textunder.png
new file mode 100644
index 000000000..968bac5e9
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textunder.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/textundercolor.png b/examples/widgets/richtext/textedit/images/mac/textundercolor.png
new file mode 100644
index 000000000..30e24e61c
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/textundercolor.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/zoomin.png b/examples/widgets/richtext/textedit/images/mac/zoomin.png
new file mode 100644
index 000000000..d46f5aff0
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/zoomin.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/mac/zoomout.png b/examples/widgets/richtext/textedit/images/mac/zoomout.png
new file mode 100644
index 000000000..46326566d
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/mac/zoomout.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/checkbox-checked.png b/examples/widgets/richtext/textedit/images/win/checkbox-checked.png
new file mode 100644
index 000000000..a072d7fb5
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/checkbox-checked.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/checkbox.png b/examples/widgets/richtext/textedit/images/win/checkbox.png
new file mode 100644
index 000000000..406490971
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/checkbox.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/editcopy.png b/examples/widgets/richtext/textedit/images/win/editcopy.png
new file mode 100644
index 000000000..1121b47d8
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/editcopy.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/editcut.png b/examples/widgets/richtext/textedit/images/win/editcut.png
new file mode 100644
index 000000000..38e55f742
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/editcut.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/editpaste.png b/examples/widgets/richtext/textedit/images/win/editpaste.png
new file mode 100644
index 000000000..ffab15aaf
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/editpaste.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/editredo.png b/examples/widgets/richtext/textedit/images/win/editredo.png
new file mode 100644
index 000000000..9d679fe6f
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/editredo.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/editundo.png b/examples/widgets/richtext/textedit/images/win/editundo.png
new file mode 100644
index 000000000..eee23d24a
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/editundo.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/exportpdf.png b/examples/widgets/richtext/textedit/images/win/exportpdf.png
new file mode 100644
index 000000000..ebb44e6b8
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/exportpdf.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/filenew.png b/examples/widgets/richtext/textedit/images/win/filenew.png
new file mode 100644
index 000000000..af5d12214
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/filenew.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/fileopen.png b/examples/widgets/richtext/textedit/images/win/fileopen.png
new file mode 100644
index 000000000..fc6f17e97
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/fileopen.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/fileprint.png b/examples/widgets/richtext/textedit/images/win/fileprint.png
new file mode 100644
index 000000000..ba7c02dc1
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/fileprint.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/filesave.png b/examples/widgets/richtext/textedit/images/win/filesave.png
new file mode 100644
index 000000000..8feec99be
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/filesave.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/format-indent-less.png b/examples/widgets/richtext/textedit/images/win/format-indent-less.png
new file mode 100644
index 000000000..e38074e78
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/format-indent-less.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/format-indent-more.png b/examples/widgets/richtext/textedit/images/win/format-indent-more.png
new file mode 100644
index 000000000..1bdeabd35
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/format-indent-more.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textbold.png b/examples/widgets/richtext/textedit/images/win/textbold.png
new file mode 100644
index 000000000..9cbc7138b
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textbold.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textcenter.png b/examples/widgets/richtext/textedit/images/win/textcenter.png
new file mode 100644
index 000000000..11efb4b85
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textcenter.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textitalic.png b/examples/widgets/richtext/textedit/images/win/textitalic.png
new file mode 100644
index 000000000..b30ce14c1
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textitalic.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textjustify.png b/examples/widgets/richtext/textedit/images/win/textjustify.png
new file mode 100644
index 000000000..9de0c8808
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textjustify.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textleft.png b/examples/widgets/richtext/textedit/images/win/textleft.png
new file mode 100644
index 000000000..16f80bc32
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textleft.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textright.png b/examples/widgets/richtext/textedit/images/win/textright.png
new file mode 100644
index 000000000..16872df62
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textright.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textunder.png b/examples/widgets/richtext/textedit/images/win/textunder.png
new file mode 100644
index 000000000..c72eff53f
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textunder.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/textundercolor.png b/examples/widgets/richtext/textedit/images/win/textundercolor.png
new file mode 100644
index 000000000..30e24e61c
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/textundercolor.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/zoomin.png b/examples/widgets/richtext/textedit/images/win/zoomin.png
new file mode 100644
index 000000000..2e586fc7b
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/zoomin.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/images/win/zoomout.png b/examples/widgets/richtext/textedit/images/win/zoomout.png
new file mode 100644
index 000000000..a736d3934
--- /dev/null
+++ b/examples/widgets/richtext/textedit/images/win/zoomout.png
Binary files differ
diff --git a/examples/widgets/richtext/textedit/main.py b/examples/widgets/richtext/textedit/main.py
new file mode 100644
index 000000000..330ea5fc5
--- /dev/null
+++ b/examples/widgets/richtext/textedit/main.py
@@ -0,0 +1,42 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/richtext/textedit example from Qt v6.x"""
+
+import sys
+from argparse import ArgumentParser, RawTextHelpFormatter
+
+from PySide6.QtCore import QCoreApplication, qVersion
+from PySide6.QtWidgets import QApplication
+
+from textedit import TextEdit
+
+import textedit_rc # noqa: F401
+
+
+if __name__ == '__main__':
+ argument_parser = ArgumentParser(description='Rich Text Example',
+ formatter_class=RawTextHelpFormatter)
+ argument_parser.add_argument("file", help="File",
+ nargs='?', type=str)
+ options = argument_parser.parse_args()
+
+ app = QApplication(sys.argv)
+ QCoreApplication.setOrganizationName("QtProject")
+ QCoreApplication.setApplicationName("Rich Text")
+ QCoreApplication.setApplicationVersion(qVersion())
+
+ mw = TextEdit()
+
+ available_geometry = mw.screen().availableGeometry()
+ mw.resize((available_geometry.width() * 2) / 3,
+ (available_geometry.height() * 2) / 3)
+ mw.move((available_geometry.width() - mw.width()) / 2,
+ (available_geometry.height() - mw.height()) / 2)
+
+ file = options.file if options.file else ":/example.html"
+ if not mw.load(file):
+ mw.file_new()
+
+ mw.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/richtext/textedit/textedit.py b/examples/widgets/richtext/textedit/textedit.py
new file mode 100644
index 000000000..8019446f0
--- /dev/null
+++ b/examples/widgets/richtext/textedit/textedit.py
@@ -0,0 +1,721 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from PySide6.QtCore import (QCoreApplication, QDir, QFile, QFileInfo,
+ QMimeDatabase, QUrl, Qt, Slot)
+from PySide6.QtGui import (QAction, QActionGroup, QColor, QGuiApplication,
+ QFont, QFontDatabase, QFontInfo, QIcon,
+ QKeySequence, QPalette, QPixmap, QTextBlockFormat,
+ QTextCharFormat, QTextCursor, QTextDocumentWriter,
+ QTextFormat, QTextListFormat)
+from PySide6.QtWidgets import (QApplication, QMainWindow, QColorDialog, QComboBox,
+ QDialog, QFileDialog, QFontComboBox,
+ QTextEdit, QMessageBox)
+from PySide6.QtPrintSupport import (QAbstractPrintDialog, QPrinter,
+ QPrintDialog, QPrintPreviewDialog)
+
+
+ABOUT = """This example demonstrates Qt's
+ rich text editing facilities in self.action, providing an example
+ document for you to experiment with."""
+
+
+MIME_TYPES = ["text/html", "text/markdown", "text/plain"]
+
+
+RSRC_PATH = ":/images/mac" if sys.platform == 'darwin' else ":/images/win"
+
+
+STYLES = ["Standard", "Bullet List (Disc)", "Bullet List (Circle)",
+ "Bullet List (Square)", "Task List (Unchecked)",
+ "Task List (Checked)", "Ordered List (Decimal)",
+ "Ordered List (Alpha lower)", "Ordered List (Alpha upper)",
+ "Ordered List (Roman lower)", "Ordered List (Roman upper)",
+ "Heading 1", "Heading 2", "Heading 3", "Heading 4", "Heading 5",
+ "Heading 6"]
+
+
+class TextEdit(QMainWindow):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ if sys.platform == 'darwin':
+ self.setUnifiedTitleAndToolBarOnMac(True)
+ self.setWindowTitle(QCoreApplication.applicationName())
+
+ self._text_edit = QTextEdit(self)
+ self._text_edit.currentCharFormatChanged.connect(self.current_char_format_changed)
+ self._text_edit.cursorPositionChanged.connect(self.cursor_position_changed)
+ self.setCentralWidget(self._text_edit)
+
+ self.setToolButtonStyle(Qt.ToolButtonFollowStyle)
+ self.setup_file_actions()
+ self.setup_edit_actions()
+ self.setup_text_actions()
+
+ help_menu = self.menuBar().addMenu("Help")
+ help_menu.addAction("About", self.about)
+ help_menu.addAction("About &Qt", qApp.aboutQt) # noqa: F821
+
+ text_font = QFont("Helvetica")
+ text_font.setStyleHint(QFont.SansSerif)
+ self._text_edit.setFont(text_font)
+ self.font_changed(self._text_edit.font())
+ self.color_changed(self._text_edit.textColor())
+ self.alignment_changed(self._text_edit.alignment())
+
+ document = self._text_edit.document()
+ document.modificationChanged.connect(self._action_save.setEnabled)
+ document.modificationChanged.connect(self.setWindowModified)
+ document.undoAvailable.connect(self._action_undo.setEnabled)
+ document.redoAvailable.connect(self._action_redo.setEnabled)
+ self.setWindowModified(document.isModified())
+ self._action_save.setEnabled(document.isModified())
+ self._action_undo.setEnabled(document.isUndoAvailable())
+ self._action_redo.setEnabled(document.isRedoAvailable())
+
+ self._action_cut.setEnabled(False)
+ self._text_edit.copyAvailable.connect(self._action_cut.setEnabled)
+ self._action_copy.setEnabled(False)
+ self._text_edit.copyAvailable.connect(self._action_copy.setEnabled)
+
+ QGuiApplication.clipboard().dataChanged.connect(self.clipboard_data_changed)
+
+ self._text_edit.setFocus()
+ self.set_current_file_name('')
+
+ # Use dark text on light background on macOS, also in dark mode.
+ if sys.platform == 'darwin':
+ pal = self._text_edit.palette()
+ pal.setColor(QPalette.Base, QColor(Qt.white))
+ pal.setColor(QPalette.Text, QColor(Qt.black))
+ self._text_edit.setPalette(pal)
+
+ def closeEvent(self, e):
+ if self.maybe_save():
+ e.accept()
+ else:
+ e.ignore()
+
+ def setup_file_actions(self):
+ tb = self.addToolBar("File self.actions")
+ menu = self.menuBar().addMenu("&File")
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentNew,
+ QIcon(RSRC_PATH + "/filenew.png"))
+ a = menu.addAction(icon, "&New", self.file_new)
+ tb.addAction(a)
+ a.setPriority(QAction.LowPriority)
+ a.setShortcut(QKeySequence.New)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentOpen,
+ QIcon(RSRC_PATH + "/fileopen.png"))
+ a = menu.addAction(icon, "&Open...", self.file_open)
+ a.setShortcut(QKeySequence.Open)
+ tb.addAction(a)
+
+ menu.addSeparator()
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentSave,
+ QIcon(RSRC_PATH + "/filesave.png"))
+ self._action_save = menu.addAction(icon, "&Save", self.file_save)
+ self._action_save.setShortcut(QKeySequence.Save)
+ self._action_save.setEnabled(False)
+ tb.addAction(self._action_save)
+
+ a = menu.addAction("Save &As...", self.file_save_as)
+ a.setPriority(QAction.LowPriority)
+ menu.addSeparator()
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.DocumentPrint,
+ QIcon(RSRC_PATH + "/fileprint.png"))
+ a = menu.addAction(icon, "&Print...", self.file_print)
+ a.setPriority(QAction.LowPriority)
+ a.setShortcut(QKeySequence.Print)
+ tb.addAction(a)
+
+ icon = QIcon.fromTheme("fileprint", QIcon(RSRC_PATH + "/fileprint.png"))
+ menu.addAction(icon, "Print Preview...", self.file_print_preview)
+
+ icon = QIcon.fromTheme("exportpdf", QIcon(RSRC_PATH + "/exportpdf.png"))
+ a = menu.addAction(icon, "&Export PDF...", self.file_print_pdf)
+ a.setPriority(QAction.LowPriority)
+ a.setShortcut(Qt.CTRL | Qt.Key_D)
+ tb.addAction(a)
+
+ menu.addSeparator()
+
+ a = menu.addAction("&Quit", self.close)
+ a.setShortcut(Qt.CTRL | Qt.Key_Q)
+
+ def setup_edit_actions(self):
+ tb = self.addToolBar("Edit self.actions")
+ menu = self.menuBar().addMenu("&Edit")
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditUndo,
+ QIcon(RSRC_PATH + "/editundo.png"))
+ self._action_undo = menu.addAction(icon, "&Undo", self._text_edit.undo)
+ self._action_undo.setShortcut(QKeySequence.Undo)
+ tb.addAction(self._action_undo)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditRedo,
+ QIcon(RSRC_PATH + "/editredo.png"))
+ self._action_redo = menu.addAction(icon, "&Redo", self._text_edit.redo)
+ self._action_redo.setPriority(QAction.LowPriority)
+ self._action_redo.setShortcut(QKeySequence.Redo)
+ tb.addAction(self._action_redo)
+ menu.addSeparator()
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCut,
+ QIcon(RSRC_PATH + "/editcut.png"))
+ self._action_cut = menu.addAction(icon, "Cu&t", self._text_edit.cut)
+ self._action_cut.setPriority(QAction.LowPriority)
+ self._action_cut.setShortcut(QKeySequence.Cut)
+ tb.addAction(self._action_cut)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditCopy,
+ QIcon(RSRC_PATH + "/editcopy.png"))
+ self._action_copy = menu.addAction(icon, "&Copy", self._text_edit.copy)
+ self._action_copy.setPriority(QAction.LowPriority)
+ self._action_copy.setShortcut(QKeySequence.Copy)
+ tb.addAction(self._action_copy)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.EditPaste,
+ QIcon(RSRC_PATH + "/editpaste.png"))
+ self._action_paste = menu.addAction(icon, "&Paste", self._text_edit.paste)
+ self._action_paste.setPriority(QAction.LowPriority)
+ self._action_paste.setShortcut(QKeySequence.Paste)
+ tb.addAction(self._action_paste)
+
+ md = QGuiApplication.clipboard().mimeData()
+ if md:
+ self._action_paste.setEnabled(md.hasText())
+
+ def setup_text_actions(self):
+ tb = self.addToolBar("Format self.actions")
+ menu = self.menuBar().addMenu("F&ormat")
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatTextBold,
+ QIcon(RSRC_PATH + "/textbold.png"))
+ self._action_text_bold = menu.addAction(icon, "&Bold", self.text_bold)
+ self._action_text_bold.setShortcut(Qt.CTRL | Qt.Key_B)
+ self._action_text_bold.setPriority(QAction.LowPriority)
+ bold = QFont()
+ bold.setBold(True)
+ self._action_text_bold.setFont(bold)
+ tb.addAction(self._action_text_bold)
+ self._action_text_bold.setCheckable(True)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatTextItalic,
+ QIcon(RSRC_PATH + "/textitalic.png"))
+ self._action_text_italic = menu.addAction(icon, "&Italic", self.text_italic)
+ self._action_text_italic.setPriority(QAction.LowPriority)
+ self._action_text_italic.setShortcut(Qt.CTRL | Qt.Key_I)
+ italic = QFont()
+ italic.setItalic(True)
+ self._action_text_italic.setFont(italic)
+ tb.addAction(self._action_text_italic)
+ self._action_text_italic.setCheckable(True)
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatTextUnderline,
+ QIcon(RSRC_PATH + "/textunder.png"))
+ self._action_text_underline = menu.addAction(icon, "&Underline",
+ self.text_underline)
+ self._action_text_underline.setShortcut(Qt.CTRL | Qt.Key_U)
+ self._action_text_underline.setPriority(QAction.LowPriority)
+ underline = QFont()
+ underline.setUnderline(True)
+ self._action_text_underline.setFont(underline)
+ tb.addAction(self._action_text_underline)
+ self._action_text_underline.setCheckable(True)
+
+ menu.addSeparator()
+
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatJustifyLeft,
+ QIcon(RSRC_PATH + "/textleft.png"))
+ self._action_align_left = QAction(icon, "&Left", self)
+ self._action_align_left.setShortcut(Qt.CTRL | Qt.Key_L)
+ self._action_align_left.setCheckable(True)
+ self._action_align_left.setPriority(QAction.LowPriority)
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatJustifyCenter,
+ QIcon(RSRC_PATH + "/textcenter.png"))
+ self._action_align_center = QAction(icon, "C&enter", self)
+ self._action_align_center.setShortcut(Qt.CTRL | Qt.Key_E)
+ self._action_align_center.setCheckable(True)
+ self._action_align_center.setPriority(QAction.LowPriority)
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatJustifyRight,
+ QIcon(RSRC_PATH + "/textright.png"))
+ self._action_align_right = QAction(icon, "&Right", self)
+ self._action_align_right.setShortcut(Qt.CTRL | Qt.Key_R)
+ self._action_align_right.setCheckable(True)
+ self._action_align_right.setPriority(QAction.LowPriority)
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatJustifyFill,
+ QIcon(RSRC_PATH + "/textjustify.png"))
+ self._action_align_justify = QAction(icon, "&Justify", self)
+ self._action_align_justify.setShortcut(Qt.CTRL | Qt.Key_J)
+ self._action_align_justify.setCheckable(True)
+ self._action_align_justify.setPriority(QAction.LowPriority)
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatIndentMore,
+ QIcon(RSRC_PATH + "/format-indent-more.png"))
+ self._action_indent_more = menu.addAction(icon, "&Indent", self.indent)
+ self._action_indent_more.setShortcut(Qt.CTRL | Qt.Key_BracketRight)
+ self._action_indent_more.setPriority(QAction.LowPriority)
+ icon = QIcon.fromTheme(QIcon.ThemeIcon.FormatIndentLess,
+ QIcon(RSRC_PATH + "/format-indent-less.png"))
+ self._action_indent_less = menu.addAction(icon, "&Unindent",
+ self.unindent)
+ self._action_indent_less.setShortcut(Qt.CTRL | Qt.Key_BracketLeft)
+ self._action_indent_less.setPriority(QAction.LowPriority)
+
+ # Make sure the alignLeft is always left of the alignRight
+ align_group = QActionGroup(self)
+ align_group.triggered.connect(self.text_align)
+
+ if QGuiApplication.isLeftToRight():
+ align_group.addAction(self._action_align_left)
+ align_group.addAction(self._action_align_center)
+ align_group.addAction(self._action_align_right)
+ else:
+ align_group.addAction(self._action_align_right)
+ align_group.addAction(self._action_align_center)
+ align_group.addAction(self._action_align_left)
+ align_group.addAction(self._action_align_justify)
+
+ tb.addActions(align_group.actions())
+ menu.addActions(align_group.actions())
+ tb.addAction(self._action_indent_more)
+ tb.addAction(self._action_indent_less)
+ menu.addAction(self._action_indent_more)
+ menu.addAction(self._action_indent_less)
+
+ menu.addSeparator()
+
+ pix = QPixmap(16, 16)
+ pix.fill(Qt.black)
+ self._action_text_color = menu.addAction(pix, "&Color...", self.text_color)
+ tb.addAction(self._action_text_color)
+
+ icon = QIcon(RSRC_PATH + "/textundercolor.png")
+ self._action_underline_color = menu.addAction(icon, "Underline color...",
+ self.underline_color)
+ tb.addAction(self._action_underline_color)
+
+ menu.addSeparator()
+
+ icon = QIcon.fromTheme("status-checkbox-checked",
+ QIcon(RSRC_PATH + "/checkbox-checked.png"))
+ self._action_toggle_check_state = menu.addAction(icon, "Chec&ked")
+ self._action_toggle_check_state.toggled.connect(self.set_checked)
+ self._action_toggle_check_state.setShortcut(Qt.CTRL | Qt.Key_K)
+ self._action_toggle_check_state.setCheckable(True)
+ self._action_toggle_check_state.setPriority(QAction.LowPriority)
+ tb.addAction(self._action_toggle_check_state)
+
+ tb = self.addToolBar("Format self.actions")
+ tb.setAllowedAreas(Qt.TopToolBarArea | Qt.BottomToolBarArea)
+ self.addToolBarBreak(Qt.TopToolBarArea)
+ self.addToolBar(tb)
+
+ self._combo_style = QComboBox(tb)
+ tb.addWidget(self._combo_style)
+ self._combo_style.addItems(STYLES)
+
+ self._combo_style.activated.connect(self.text_style)
+
+ self._combo_font = QFontComboBox(tb)
+ tb.addWidget(self._combo_font)
+ self._combo_font.textActivated.connect(self.text_family)
+
+ self._combo_size = QComboBox(tb)
+ self._combo_size.setObjectName("comboSize")
+ tb.addWidget(self._combo_size)
+ self._combo_size.setEditable(True)
+
+ standard_sizes = QFontDatabase.standardSizes()
+ for size in standard_sizes:
+ self._combo_size.addItem(str(size))
+ index = standard_sizes.index(QApplication.font().pointSize())
+ self._combo_size.setCurrentIndex(index)
+
+ self._combo_size.textActivated.connect(self.text_size)
+
+ def load(self, f):
+ if not QFile.exists(f):
+ return False
+ file = QFile(f)
+ if not file.open(QFile.ReadOnly):
+ return False
+
+ data = file.readAll()
+ db = QMimeDatabase()
+ mime_type_name = db.mimeTypeForFileNameAndData(f, data).name()
+ text = data.data().decode('utf8')
+ if mime_type_name == "text/html":
+ file_url = QUrl(f) if f[0] == ':' else QUrl.fromLocalFile(f)
+ options = QUrl.FormattingOptions(QUrl.RemoveFilename)
+ self._text_edit.document().setBaseUrl(file_url.adjusted(options))
+ self._text_edit.setHtml(text)
+ elif mime_type_name == "text/markdown":
+ self._text_edit.setMarkdown(text)
+ else:
+ self._text_edit.setPlainText(text)
+
+ self.set_current_file_name(f)
+ return True
+
+ def maybe_save(self):
+ if not self._text_edit.document().isModified():
+ return True
+
+ ret = QMessageBox.warning(self, QCoreApplication.applicationName(),
+ "The document has been modified.\n"
+ "Do you want to save your changes?",
+ QMessageBox.Save | QMessageBox.Discard
+ | QMessageBox.Cancel)
+ if ret == QMessageBox.Save:
+ return self.file_save()
+ if ret == QMessageBox.Cancel:
+ return False
+ return True
+
+ def set_current_file_name(self, fileName):
+ self._file_name = fileName
+ self._text_edit.document().setModified(False)
+
+ shown_name = QFileInfo(fileName).fileName() if fileName else "untitled.txt"
+ app_name = QCoreApplication.applicationName()
+ self.setWindowTitle(f"{shown_name}[*] - {app_name}")
+ self.setWindowModified(False)
+
+ @Slot()
+ def file_new(self):
+ if self.maybe_save():
+ self._text_edit.clear()
+ self.set_current_file_name("")
+
+ @Slot()
+ def file_open(self):
+ file_dialog = QFileDialog(self, "Open File...")
+ file_dialog.setAcceptMode(QFileDialog.AcceptOpen)
+ file_dialog.setFileMode(QFileDialog.ExistingFile)
+ file_dialog.setMimeTypeFilters(MIME_TYPES)
+ if file_dialog.exec() != QDialog.Accepted:
+ return
+ fn = file_dialog.selectedFiles()[0]
+ native_fn = QDir.toNativeSeparators(fn)
+ if self.load(fn):
+ self.statusBar().showMessage(f'Opened "{native_fn}"')
+ else:
+ self.statusBar().showMessage(f'Could not open "{native_fn}"')
+
+ @Slot()
+ def file_save(self):
+ if not self._file_name or self._file_name.startswith(":/"):
+ return self.file_save_as()
+
+ writer = QTextDocumentWriter(self._file_name)
+ document = self._text_edit.document()
+ success = writer.write(document)
+ native_fn = QDir.toNativeSeparators(self._file_name)
+ if success:
+ document.setModified(False)
+ self.statusBar().showMessage(f'Wrote "{native_fn}"')
+ else:
+ self.statusBar().showMessage(f'Could not write to file "{native_fn}"')
+ return success
+
+ @Slot()
+ def file_save_as(self):
+ file_dialog = QFileDialog(self, "Save as...")
+ file_dialog.setAcceptMode(QFileDialog.AcceptSave)
+
+ mime_types = MIME_TYPES
+ mime_types.insert(1, "application/vnd.oasis.opendocument.text")
+ file_dialog.setMimeTypeFilters(mime_types)
+ file_dialog.setDefaultSuffix("odt")
+ if file_dialog.exec() != QDialog.Accepted:
+ return False
+ fn = file_dialog.selectedFiles()[0]
+ self.set_current_file_name(fn)
+ return self.file_save()
+
+ @Slot()
+ def file_print(self):
+ printer = QPrinter(QPrinter.HighResolution)
+ dlg = QPrintDialog(printer, self)
+ if self._text_edit.textCursor().hasSelection():
+ dlg.setOption(QAbstractPrintDialog.PrintSelection)
+ dlg.setWindowTitle("Print Document")
+ if dlg.exec() == QDialog.Accepted:
+ self._text_edit.print_(printer)
+
+ @Slot()
+ def file_print_preview(self):
+ printer = QPrinter(QPrinter.HighResolution)
+ preview = QPrintPreviewDialog(printer, self)
+ preview.paintRequested.connect(self._text_edit.print_)
+ preview.exec()
+
+ @Slot()
+ def file_print_pdf(self):
+ file_dialog = QFileDialog(self, "Export PDF")
+ file_dialog.setAcceptMode(QFileDialog.AcceptSave)
+ file_dialog.setMimeTypeFilters(["application/pdf"])
+ file_dialog.setDefaultSuffix("pdf")
+ if file_dialog.exec() != QDialog.Accepted:
+ return
+ pdf_file_name = file_dialog.selectedFiles()[0]
+ printer = QPrinter(QPrinter.HighResolution)
+ printer.setOutputFormat(QPrinter.PdfFormat)
+ printer.setOutputFileName(pdf_file_name)
+ self._text_edit.document().print_(printer)
+ native_fn = QDir.toNativeSeparators(pdf_file_name)
+ self.statusBar().showMessage(f'Exported "{native_fn}"')
+
+ @Slot()
+ def text_bold(self):
+ fmt = QTextCharFormat()
+ weight = QFont.Bold if self._action_text_bold.isChecked() else QFont.Normal
+ fmt.setFontWeight(weight)
+ self.merge_format_on_word_or_selection(fmt)
+
+ @Slot()
+ def text_underline(self):
+ fmt = QTextCharFormat()
+ fmt.setFontUnderline(self._action_text_underline.isChecked())
+ self.merge_format_on_word_or_selection(fmt)
+
+ @Slot()
+ def text_italic(self):
+ fmt = QTextCharFormat()
+ fmt.setFontItalic(self._action_text_italic.isChecked())
+ self.merge_format_on_word_or_selection(fmt)
+
+ @Slot(str)
+ def text_family(self, f):
+ fmt = QTextCharFormat()
+ fmt.setFontFamilies({f})
+ self.merge_format_on_word_or_selection(fmt)
+
+ @Slot(str)
+ def text_size(self, p):
+ point_size = float(p)
+ if point_size > 0:
+ fmt = QTextCharFormat()
+ fmt.setFontPointSize(point_size)
+ self.merge_format_on_word_or_selection(fmt)
+
+ @Slot(int)
+ def text_style(self, styleIndex):
+ cursor = self._text_edit.textCursor()
+ style = QTextListFormat.ListStyleUndefined
+ marker = QTextBlockFormat.MarkerType.NoMarker
+
+ if styleIndex == 1:
+ style = QTextListFormat.ListDisc
+ elif styleIndex == 2:
+ style = QTextListFormat.ListCircle
+ elif styleIndex == 3:
+ style = QTextListFormat.ListSquare
+ elif styleIndex == 4:
+ if cursor.currentList():
+ style = cursor.currentList().format().style()
+ else:
+ style = QTextListFormat.ListDisc
+ marker = QTextBlockFormat.MarkerType.Unchecked
+ elif styleIndex == 5:
+ if cursor.currentList():
+ style = cursor.currentList().format().style()
+ else:
+ style = QTextListFormat.ListDisc
+ marker = QTextBlockFormat.MarkerType.Checked
+ elif styleIndex == 6:
+ style = QTextListFormat.ListDecimal
+ elif styleIndex == 7:
+ style = QTextListFormat.ListLowerAlpha
+ elif styleIndex == 8:
+ style = QTextListFormat.ListUpperAlpha
+ elif styleIndex == 9:
+ style = QTextListFormat.ListLowerRoman
+ elif styleIndex == 10:
+ style = QTextListFormat.ListUpperRoman
+
+ cursor.beginEditBlock()
+
+ block_fmt = cursor.blockFormat()
+
+ if style == QTextListFormat.ListStyleUndefined:
+ block_fmt.setObjectIndex(-1)
+ # H1 to H6, or Standard
+ heading_level = styleIndex - 11 + 1 if styleIndex >= 11 else 0
+ block_fmt.setHeadingLevel(heading_level)
+ cursor.setBlockFormat(block_fmt)
+
+ # H1 to H6: +3 to -2
+ size_adjustment = 4 - heading_level if heading_level != 0 else 0
+ fmt = QTextCharFormat()
+ fmt.setFontWeight(QFont.Bold if heading_level else QFont.Normal)
+ fmt.setProperty(QTextFormat.FontSizeAdjustment, size_adjustment)
+ cursor.select(QTextCursor.LineUnderCursor)
+ cursor.mergeCharFormat(fmt)
+ self._text_edit.mergeCurrentCharFormat(fmt)
+ else:
+ block_fmt.setMarker(marker)
+ cursor.setBlockFormat(block_fmt)
+ list_fmt = QTextListFormat()
+ if cursor.currentList():
+ list_fmt = cursor.currentList().format()
+ else:
+ list_fmt.setIndent(block_fmt.indent() + 1)
+ block_fmt.setIndent(0)
+ cursor.setBlockFormat(block_fmt)
+ list_fmt.setStyle(style)
+ cursor.createList(list_fmt)
+ cursor.endEditBlock()
+
+ @Slot()
+ def text_color(self):
+ col = QColorDialog.getColor(self._text_edit.textColor(), self)
+ if not col.isValid():
+ return
+ fmt = QTextCharFormat()
+ fmt.setForeground(col)
+ self.merge_format_on_word_or_selection(fmt)
+ self.color_changed(col)
+
+ @Slot()
+ def underline_color(self):
+ col = QColorDialog.getColor(Qt.black, self)
+ if not col.isValid():
+ return
+ fmt = QTextCharFormat()
+ fmt.setUnderlineColor(col)
+ self.merge_format_on_word_or_selection(fmt)
+ self.color_changed(col)
+
+ @Slot(QAction)
+ def text_align(self, a):
+ if a == self._action_align_left:
+ self._text_edit.setAlignment(Qt.AlignLeft | Qt.AlignAbsolute)
+ elif a == self._action_align_center:
+ self._text_edit.setAlignment(Qt.AlignHCenter)
+ elif a == self._action_align_right:
+ self._text_edit.setAlignment(Qt.AlignRight | Qt.AlignAbsolute)
+ elif a == self._action_align_justify:
+ self._text_edit.setAlignment(Qt.AlignJustify)
+
+ @Slot(bool)
+ def set_checked(self, checked):
+ self.text_style(5 if checked else 4)
+
+ @Slot()
+ def indent(self):
+ self.modify_indentation(1)
+
+ @Slot()
+ def unindent(self):
+ self.modify_indentation(-1)
+
+ def modify_indentation(self, amount):
+ cursor = self._text_edit.textCursor()
+ cursor.beginEditBlock()
+ if cursor.currentList():
+ list_fmt = cursor.currentList().format()
+ # See whether the line above is the list we want to move self item
+ # into, or whether we need a new list.
+ above = QTextCursor(cursor)
+ above.movePosition(QTextCursor.Up)
+ if (above.currentList()
+ and list_fmt.indent() + amount == above.currentList().format().indent()):
+ above.currentList().add(cursor.block())
+ else:
+ list_fmt.setIndent(list_fmt.indent() + amount)
+ cursor.createList(list_fmt)
+ else:
+ block_fmt = cursor.blockFormat()
+ block_fmt.setIndent(block_fmt.indent() + amount)
+ cursor.setBlockFormat(block_fmt)
+ cursor.endEditBlock()
+
+ @Slot(QTextCharFormat)
+ def current_char_format_changed(self, format):
+ self.font_changed(format.font())
+ self.color_changed(format.foreground().color())
+
+ @Slot()
+ def cursor_position_changed(self):
+ self.alignment_changed(self._text_edit.alignment())
+ list = self._text_edit.textCursor().currentList()
+ if list:
+ style = list.format().style()
+ if style == QTextListFormat.ListDisc:
+ self._combo_style.setCurrentIndex(1)
+ elif style == QTextListFormat.ListCircle:
+ self._combo_style.setCurrentIndex(2)
+ elif style == QTextListFormat.ListSquare:
+ self._combo_style.setCurrentIndex(3)
+ elif style == QTextListFormat.ListDecimal:
+ self._combo_style.setCurrentIndex(6)
+ elif style == QTextListFormat.ListLowerAlpha:
+ self._combo_style.setCurrentIndex(7)
+ elif style == QTextListFormat.ListUpperAlpha:
+ self._combo_style.setCurrentIndex(8)
+ elif style == QTextListFormat.ListLowerRoman:
+ self._combo_style.setCurrentIndex(9)
+ elif style == QTextListFormat.ListUpperRoman:
+ self._combo_style.setCurrentIndex(10)
+ else:
+ self._combo_style.setCurrentIndex(-1)
+ marker = self._text_edit.textCursor().block().blockFormat().marker()
+ if marker == QTextBlockFormat.MarkerType.NoMarker:
+ self._action_toggle_check_state.setChecked(False)
+ elif marker == QTextBlockFormat.MarkerType.Unchecked:
+ self._combo_style.setCurrentIndex(4)
+ self._action_toggle_check_state.setChecked(False)
+ elif marker == QTextBlockFormat.MarkerType.Checked:
+ self._combo_style.setCurrentIndex(5)
+ self._action_toggle_check_state.setChecked(True)
+ else:
+ heading_level = self._text_edit.textCursor().blockFormat().headingLevel()
+ new_level = heading_level + 10 if heading_level != 0 else 0
+ self._combo_style.setCurrentIndex(new_level)
+
+ @Slot()
+ def clipboard_data_changed(self):
+ md = QGuiApplication.clipboard().mimeData()
+ self._action_paste.setEnabled(md and md.hasText())
+
+ @Slot()
+ def about(self):
+ QMessageBox.about(self, "About", ABOUT)
+
+ def merge_format_on_word_or_selection(self, format):
+ cursor = self._text_edit.textCursor()
+ if not cursor.hasSelection():
+ cursor.select(QTextCursor.WordUnderCursor)
+ cursor.mergeCharFormat(format)
+ self._text_edit.mergeCurrentCharFormat(format)
+
+ def font_changed(self, f):
+ index = self._combo_font.findText(QFontInfo(f).family())
+ self._combo_font.setCurrentIndex(index)
+ index = self._combo_size.findText(str(f.pointSize()))
+ self._combo_size.setCurrentIndex(index)
+ self._action_text_bold.setChecked(f.bold())
+ self._action_text_italic.setChecked(f.italic())
+ self._action_text_underline.setChecked(f.underline())
+
+ def color_changed(self, c):
+ pix = QPixmap(16, 16)
+ pix.fill(c)
+ self._action_text_color.setIcon(pix)
+
+ def alignment_changed(self, a):
+ if a & Qt.AlignLeft:
+ self._action_align_left.setChecked(True)
+ elif a & Qt.AlignHCenter:
+ self._action_align_center.setChecked(True)
+ elif a & Qt.AlignRight:
+ self._action_align_right.setChecked(True)
+ elif a & Qt.AlignJustify:
+ self._action_align_justify.setChecked(True)
diff --git a/examples/widgets/richtext/textedit/textedit.pyproject b/examples/widgets/richtext/textedit/textedit.pyproject
new file mode 100644
index 000000000..341d02837
--- /dev/null
+++ b/examples/widgets/richtext/textedit/textedit.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["main.py", "textedit.py", "textedit.qrc", "example.html"]
+}
diff --git a/examples/widgets/richtext/textedit/textedit.qrc b/examples/widgets/richtext/textedit/textedit.qrc
new file mode 100644
index 000000000..a30d50fdb
--- /dev/null
+++ b/examples/widgets/richtext/textedit/textedit.qrc
@@ -0,0 +1,54 @@
+<!DOCTYPE RCC><RCC version="1.0">
+<qresource prefix="/">
+ <file>images/logo32.png</file>
+ <file>images/mac/checkbox.png</file>
+ <file>images/mac/checkbox-checked.png</file>
+ <file>images/mac/editcopy.png</file>
+ <file>images/mac/editcut.png</file>
+ <file>images/mac/editpaste.png</file>
+ <file>images/mac/editredo.png</file>
+ <file>images/mac/editundo.png</file>
+ <file>images/mac/exportpdf.png</file>
+ <file>images/mac/filenew.png</file>
+ <file>images/mac/fileopen.png</file>
+ <file>images/mac/fileprint.png</file>
+ <file>images/mac/filesave.png</file>
+ <file>images/mac/format-indent-less.png</file>
+ <file>images/mac/format-indent-more.png</file>
+ <file>images/mac/textbold.png</file>
+ <file>images/mac/textcenter.png</file>
+ <file>images/mac/textitalic.png</file>
+ <file>images/mac/textjustify.png</file>
+ <file>images/mac/textleft.png</file>
+ <file>images/mac/textright.png</file>
+ <file>images/mac/textunder.png</file>
+ <file>images/mac/textundercolor.png</file>
+ <file>images/mac/zoomin.png</file>
+ <file>images/mac/zoomout.png</file>
+ <file>images/win/checkbox.png</file>
+ <file>images/win/checkbox-checked.png</file>
+ <file>images/win/editcopy.png</file>
+ <file>images/win/editcut.png</file>
+ <file>images/win/editpaste.png</file>
+ <file>images/win/editredo.png</file>
+ <file>images/win/editundo.png</file>
+ <file>images/win/exportpdf.png</file>
+ <file>images/win/filenew.png</file>
+ <file>images/win/fileopen.png</file>
+ <file>images/win/fileprint.png</file>
+ <file>images/win/filesave.png</file>
+ <file>images/win/format-indent-less.png</file>
+ <file>images/win/format-indent-more.png</file>
+ <file>images/win/textbold.png</file>
+ <file>images/win/textcenter.png</file>
+ <file>images/win/textitalic.png</file>
+ <file>images/win/textjustify.png</file>
+ <file>images/win/textleft.png</file>
+ <file>images/win/textright.png</file>
+ <file>images/win/textunder.png</file>
+ <file>images/win/textundercolor.png</file>
+ <file>images/win/zoomin.png</file>
+ <file>images/win/zoomout.png</file>
+ <file>example.html</file>
+</qresource>
+</RCC>
diff --git a/examples/widgets/richtext/textedit/textedit_rc.py b/examples/widgets/richtext/textedit/textedit_rc.py
new file mode 100644
index 000000000..49c024529
--- /dev/null
+++ b/examples/widgets/richtext/textedit/textedit_rc.py
@@ -0,0 +1,6029 @@
+# Resource object code (Python 3)
+# Created by: object code
+# Created by: The Resource Compiler for Qt version 6.2.2
+# WARNING! All changes made in this file will be lost!
+
+from PySide6 import QtCore
+
+qt_resource_data = b"\
+\x00\x00\x0a.\
+\x00\
+\x0082x\x9c\xe5[[s\xdb6\x16~\xcf\xaf\xc0\
+pg'\x0fk\xc9\xb2\x93\xa6\x8d,y&c'\xad\
+g\xb2MS+\xd3\xd9}\x83HHD\x0d\x124\x00\
+Zfw\xfa\xdf\xf7\x9c\x03\x90\xd4\xcd\xb66\xb5cj\
+6\x0f\x8eD\xe1r.\xdf\xb9\x02\x1c\xa5.S\xa7\xa3\
+T\xf0\xe4t\x94\x09\xc7Y\xce31\x8e\xae\x8d\x8cS\
+'n]\xc4b\x9d;\x91\xbbqt\x14\xb1\xc30(\
+u\xae\xe8\x89\xebR\xde\x8c\xa33\xff{oR\x15b\
+i4N>\xc4\xd5OX\x9crc\x85\x1b\x7f\x99|\
+\xe8\xfd@\x8b8\xe9\x948\xfd<\x811\xef\x13\xe9\xd8\
+\xfb[\x9e\x15J\x8c\x0e\xfd\x0f#\xeb*%\x98\x83\x15\
+\xc3B\xb1\xb5\xd1\xe9\x8b\xe2\x80)\xc9\xfe\xc3\x16\xa9t\
+\xa2g\x0b\x1e\x8b!+\x8c\xe8-\x0c/N\xd8\x9f/\
+F\x874\xf3tt\xe89\x9a\xea\xa4b\xf4h\x1c\xb1\
+\x19\x90\xd6\xb3\xf2\x0f1|[\xb8\x13\xffu!\xe4<\
+u\xc3\xd7\x83Ax@\x83\x87\xb96\x19\x07\xcaq\xef\
+^\x22bm\xb8\x93:\x87\xe7\xb98\x01BF\xe9\x11\
+\xe3J\xce\xf3q\x14\x03\xb7\xc2D\xcd.\x197s\x99\
+\xf7\x9c.\x86G\xc7\xc5\xedI\xfd`\xaa\x9d\xd3\xd9\xea\
+3%fn8Xz`\x88\x1az\xd2\xbbv\xbd\xa9\
+\xd2\xf1UO\xe6\x09\xec1\x1c\x04r\xea\xaf0(\x02\
+I\x15<\xdf\xc2\xe1\xf1`\x9d\xc57\xc0b\xd4\x8a\x1c\
+$\x053QPG\xc0NQs\xf3{i\x9d\x9cU\
+]c\xe7\xe8\x08\xd8\x89N'\xa9`-h\x162\x99\
+\x0b\xc7\xa4e0\x87'7<\x8fE\xc2\x04\xfc\xa4\x0d\
+s)w\xcc\x96E\xa1\x8d\xb3\xb0\x12\xe8\xd39\xf8\x19\
+qM\x1b\xf7\xd9\x85c1\xcc\x9c\x0aVZ\xf8\xc5i\
+\x96H[(^\xb1\x9f&\xff\xfc\x08\x8b&L\xbbT\
+\x18?'\xd1q\x99\x01\xa5a-\x0b\xf3Q\xf19W\
+\xaa:X\xa2\x0a\xd6\xb2\xb0{ \xf4\xbc\x9e\x15+n\
+-\xed!ll$l\x0a\x12Li`\x0aR\x02\xd9\
+\xdd\x08\x05\x9c\x9b2v\xa5\x11L\xcf\x98\xe0\xcb\xdb\x22\
+98Z\xe9E\x18\x1c\x98\x92\xf9\x1cG\x17\xdc\xf09\
+\x98Aj\xfb\x8dn\x8b\xce\xa8vS\x97\x173V\xe9\
+\x92q\xe0\xf5F\x8a\x05r\xe1R\xd0e\xc3\xb0\xcc\x89\
+\xdfm\x90 \x1b\x95\x0e\x18\x8ba%\xdcK\xb4\x90f\
+\xc2;\x93\x03Z\x1f5\x8c?\xae-\x0e\x8a\x10\xb7\x85\
+\xd2\xb0\xfbg\xf7\xd2\xb6\xb0\xa0\xc1H\xccLpT\x04\
+\xe8\xf97P\x11\xbf\x11@P\xac\xca\x04\x90bu&\
+\xc0\xd1e\xb8\x92E:IS\xa0\x03\xa4w\xa6\x15\xa8\
+\x08W\xb0\x22F\xa7AZ\x17y\xacKP\x90 \xa2\
+\xfc\xee\xc2H\x5c\xa1\xcf\x98\xd7Tz\xbcU5o\xbe\
+\xa1j~\xd8\xee5\xee4\xcb7\xa4\xca\x0f:\xe0\xf3\
+\x97\x1a\x83\xec\x12\xc7\xda\xd6\xc9\x1cw\x06\x89\x0f:\x99\
+\xd6\x94\x1b\xf7Q\xf3q\xdf\xc4-b\x9bj\x95\xec2\
+5:=\xf8\x1f\xb6XC\xbf\xff\xb0\xeb6\xa8\xa5\x9d\
+\xb6Z\x8f|\xac\x04\x11\x1a%)\xfe5\x9fwd\x8f\
+\x9e\xf8\x9f\xad\xa7\x01\xcd\xb2\xf6\xb6_%]\xb0?\xb0\
+\xde\xe1\xdf\x06\xf0\xef\xfb\x19\xec\x91\x95\xcaIz\xb83\
+U\x7fic\xceq\xeb\xe0~v\xdb\xb0\xcf\xc8Rf\
+<\x93JB\x94\xb0%\xb8\x0d~\x1f\xbchh5|\
+9\x01Oa\xd9\xcfb\xc1~\xd5\x19\xcf_n\xf8\xd3\
+-\xe8[\x9b\xb3\xa3L\xee\x07HM\xcf\x1983)\
+\xccNt\x84\xb1;\xee\x8f\xc0\xe0\xca\xea&,'\xd2\
+\x80\x1fUU\xff\xebM$\x84\x1a\x00[,\xc8G\xc7\
+\xa5\xb1\x90#\x80\xe7\xe6\xcc\x889\xe0\x1b\xbd7\xcdJ\
+\x08\xf9\x07~\x18\xace\xb4\xb2u(rZ+6\x85\
+\x5c\x16R\x0f\xa50\xad\xcd\xe7\xf8\x14\xd6\x98) \xb2\
+^\xdb\x88\x1a\xed\xfb\x11\x8a\x1b\xb7m\xeb\x84\xa8\xcd\x97\
+@\x13\x94J\x11\xff\x18\x1f!\x8a\x22\x05=bE$\
+\x07\x8c\xb6o\xbf\xfa|\x18?\x81\x84g%dG\xcc\
+\xb3+E\xd2_\x93\xc3s\xe6\xce\x9bbx8\xd3\x98\
+\x98\xcak\xddg+\xc2\xf3A\x09\x05\xe2\x07\xd3\x02\x92\
+\x11\x1a\x11\xa4\x0e\xb06\x8d\xaaSR\x0d)\x01\xe4\x12\
+z\xd1J\x13\xfc\x9f.]\x80R\x93\xb9\xb5\x09A\x17\
+\x00\xf3@\xfc\xdfb\xf2\x1f\xa5u\x9d\x0c\xfe;\xd0\xbe\
+{4xM\xe3\xcf\xe5l&\xc8\xe2\xaf`#\x8b@\
+P\xc8~mJM\xd6\x08N\xa4\xcd2\xebD\x14\xd2\
+\xcbK\x07p\xe1&aS0\x16\xa8gVf\xe7\xc2\
+:\xb4\xa5\xd2\x22\xe4\x92f/[eS\xf4L`\xa8\
+>\xfb\xf4%A\xc8Aq\x89![\xf1=\xa5\xaay\
+B9\xe1\x80Z.\xec\x08\xb9\x86\xba\xfa.\xa7\xbcM\
+S\x83'\xc7\xdc\xb9\xb4q\xc3&V\x09\xae*d\x8c\
+\xd5\x96\x8f\x0b3\xb2\xa8\x22\xd4B\xc8\x10\x93Nd\x16\
+\xe3\x84\x92\xc0u\xa9<\xdb\xd4E\x88\xa5\x89\x95\xb8S\
+\x04\xc7\x9d\x14\xc1Y :\x08a\xb3X\xc5B\xa5\x94\
+6\x85\xc7n!D\xee%\x80H\x83\x12D\x98%\xd9\
+\xa0k\xd9\x94\x8a\xbd.Q\xb2wI\xe5U'\xa5r\
+\x19\x88\x0eR)\x8c\xbe\x91\x89\xa0H\xce\xad\xce\xf9T\
+\xa1_\xa6\xd2\xdc\xc9\x1b\x11D\x15[\x9fw\x92H\xd7\
+@R<\xbb/\xf2\x01\xe8\x93I0r\xaez\x80\x18\
+\xd8\xc2@LQx\x19\x02d\x00\xc8-\xf9\x9c\xd0w\
+\x03\xceZ\x87\x84}7\x1e\x83$6\xb0#r\xf0>\
+\x90\xd9\x0b\x8f\x18\x9f\x93/\x04\x0d\x831\xbe7Ai\
+#\xfd\xf2\xce\xf0\xa9\x8c\x99\x9f\xd4\xe6C\x96g\xde\xd7\
+\xb4}\x8ba\x08]\xfa\xc9\xdd\xcd\xe0QAu\x81\x99\
+^RR\xc1N\xd0x\xd1=\xe0\x7fvl\xa2\x11\xf2\
+\x01\xbbZyA\x93)\xf3\xa7\xf6m\x8f+o\xe0\xe5\
+\x9d\xb5@&\xcf\xdd\xa3\xc9\xfb\xd1I<\x87\x1c\x0e\xb2\
+Z\x13(\xace\xfd\xee\xa9=\xe6\xe32\xf2\x01\x92y\
+\xf6\x9er\xd0\x8e\x8a\xfaLg\x85\xce\xd1e\xbd31\
+\xf6\xf6\xc9\x97,\xc3\xbc\x8b\xc6\xf8\xd1G_\xb7Lg\
+\xb1\x0c\x8d\xa6%\xdbC\xd8\x0cEV\xb8\xea\xe4\x1b\x0a\
+vK\x89\x13\xea\xafo\xaf\xe4\xed\xcd|\x0a\x1eTL\
+\xf3\x12v\x84\x80\xed3<\x08U\x06c\xd4\x94\xe2\xa1\
+\x0c\xad\xe2$\xc1\x9a\xd2\x88L\xdf\x88&\xd9\xdb\xa9h\
+\x83\xa9\x98?\xe7b\xb1\xd2\x95\xa5\x12n\x8a\xab\x11!\
+\xf5\xe28T\xdc\xfa\xf4\x8a\xf6\xa9K7\x1c\xef\xa9\xb2\
+\xa1d[\xab\xd8\xf6B\xfd\xdb\xfb\xccOm2\xbb\xd5\
+\xdb\xf7Uf\x17\x19\x9fo\xf6\x94\x9f\x99\x95G\xaa\x22\
+/rl\xa72I,\xfar'\xe4}J^\x09@\
+&\xe0\x97\x03\x90\x0d\xf5\x09(\xe1k\x93\xbb\xba=U\
+\x1f_hs\xe0\xfb6\xa2b3\xa8\x04\xc0\xc2\xc2Q\
+\x93-\x8d\xd1eN\xc6\x10\x0e\xc1\xfc\x8e\xcbm7+\
+\xb0\x99\xe5+\xd6&\xcd[\xf0\x0a[\x95\xbe9\x96\xf1\
++o\x1aP{\xda\x0a\xad#.\xe1q\xac\x8b\xca\xa7\
+\x92\x05\x87\xb2\x15'g}\xb6\x17-\xb0\x91\xcc\xe6\xcc\
+\x9ax\x1c\x0d\x0f\xbd\x12\x0e\x95\x9e\xebW\xc7\xfd\x22\x9f\
+\xd3\x91\xf5\x83~\x86\xa1\xa3!G\x11z\x81\xd2z}\
+\xb2i\xc5b\x18C2C\xe9$\xe0\x17\xa8\x85\x04\x9e\
+\xc70:\xc9\x0c\xfa\xc94d\xdf\xd49\xc3,\xbcQ\
+j\xe8W\xb6\x8b\xc3\x1cX4\xd5\x8a4\x99\xe8E\xce\
+.S9\xf3\x9d'\xdf+ \xdf\x06\xda^\xb0+Q\
+\x81\xa3\xfcW8\x0c\x83\xe79\xaa\x0b7A\x85\xc1Z\
+\xcb:\x93x\xf0F%S]E\x80\x1bs\xd6w\x16\
+\x96N\xd0V;\x9b\x1d\xe9T\xfdu\x1f3\xa1\x82\xea\
+\xff\xa4u\xd5\x9et\x91\xf9\x1br.\x84\x05\xdf\xff\x0d\
+\xe5\xe5A}\x10\xb6|,\xda\x1c^ \xc2\xa8\xb2\xd6\
+\xaa\xcc`w \x01f\x10l\x97\x0e\xa8\x11\xe1\xe0N\
+b\xa1T\xa86\xa9;\x0aU+\x94\x8e\x5c\xe6\xfe\x8c\
+>,b7\x9c\xc6\x1eD\xd5\xbd \x92\x14\x0a\xd5=\
+6\x1a\xe8B\xcfZ#~!\x13\x97\x8e\xa3\xb7\x83\xbf\
+G^W\x05\x8fA}\xe3h\xe0\xbf\x17>\x91\x1aG\
+\xaf\xf1\x12\x8c3\xf8'y\xa6\x8c2\xf2I\xd7\xe8\x90\
+(xF2\xb6\x98\xdd\x8aY\x9ec\x17N\x17tL\
+P\x17\xf0\x0d\xba\xbbO\xfe/F\x03\x94\xb3\x0c\xcdx\
+\x22\xe24\x97\xd7\xa5\xd83\x1e~D[\xc4\xda\x82}\
+\xb1\x10r\xe9\xe6\xce\x8c\xc7[\xd8\x80?\xa6\x03\xd0~\
+\x88\xa1\xb7\xc3\xc1\x80\xf5\xd8\xd1\x11\xfe\xbfM\x15\xe8J\
+\xf1\xe98z\x15\xedx\xe4\xf6M\x9bl\x98\xcc<\x9c\
+SA\x95\xbd\xa7\x0a\xf2\x9a\x01\x0d\xbd\xbaKC\xcfF\
+\xfa\x17\xca\x0f\x1f\x16\xfe5\xa4\xf9b\xb9\xbe}~\xd2\
+?M\x7f\x87\xf4\xb7\xa7\x8dD\x18'l\xd97u\x83\
+\xc2\x8ft\xa0K5\xd9.\xf0\xde\x10\xef\xbe\xc0\xfbU\
+\x80\xf7w\x9d\x83\xf7N^\xa5\xed\xecz\xf9OJ\xa8\
+\x9a%\xc4\x87U'\x0a\xc9\xadw\xa2\xc7\xd1\xb3\xf1\xf3\
+\xfe\xd6\x19\x01\x15x\xf7\xb0\xfe\x9b\xf1W%\xcf\xa0.\
+\xd2Y\xb8\xf3\xb7\x7fP\xfe.@\xf9\xfb\xfd\x84r\xdb\
+\x86\xf6P\xc6\xe2*\x5cM\xc6@\x0b\x03\xff\xa0\x0fk\
+\xa0iU\x04\x7f\xb0,\xd8\x97\x1a\xa6\x1b\xa7\xb5\x0f\xb5\
+\x9a\xa9\x00\x0e-f\xaa\xa4\x9a.\x9d?\xa0\x06%\xb5\
+W\x80\xdb\x06\xd0\xca\x85\x22|\xb0r\xad\xfb\x9e[\xc2\
+\xddo\xad\xfc\x04(\xc2K\xa3W\xbb\xb4p\xbbt\x0d\
+\x18\xbb^>\x5c\xd0\xd9yh\x86\xb0\xb4\xe1\xa7\xb9~\
+\xd1\xdc\xea9\x08\xd7\xf5ajh\x98\xe0*t\xfa\x8e\
+\x97\xd5s+\xa1$\xac(I\xf8\xdaK\x8d\xab'\xa8\
+\xbb]?mU@-\xe6\xd53\x97\xfa\xa2\xc1\x02\x1b\
+\x84\xb0\x0e\xbd\x041\x93\x8aH\x97\x19\xf2L=a\x10\
+A\xb8S\xafM\x9f]\xca<\x5c\xaal/7\xcd \
+L\x89\x856W\xed\x0d\xea%a\xf9k\x19\xf8\xd2\x04\
+5\xa8\x97;\xcf5\x09\x85\x0fu5i\x1b\xbd\xc6\xfd\
+4\x80/y\xa2\x09\x17\xbf\x8aDw\xc1\x066Y\xfa\
+P*\xd5\x00\x1c\x1breM\xb3\x01\x9a\x99.\x84\xbf\
+\x0en\x11\x13\xd3R\xaa\xd0-n\x8d\xa5~M\xc5_\
+\x11\xaf\xd0\x15n\x01F\x9f}j\x97\xd2x\x0d\xb7y\
+3#\xdcT)x|\xc5\xe7dqsAo\xe1\xc0\
+6X\x904/hp\x96\xe1\xeb\x1b\xb1\xce\x80P\xef\
+U\xbdG\x15\x88H\xba\x1d\x93\xd2\x8d\x17\xd3\xefR\xe0\
+\xd8\xf5\x9ei8c\x097C}(Y~\x83\x85Z\
+\xf6FX\xcb\xce\x9cQ\xff\xf87\x8e m\xf9S\x97\
+\xba\xdd\xcf\xd5\x82W\x16\xd4\x17\xd3a\x03\xc9\x042]\
+`\x04\x92\xdd\xfa\xd2P\x1dl\xd6\x9b\xfb!e\xc0\xb7\
+\xe8\x10\xa9\xf8\xaa\xe0\x8b\xff\x02\x92\x95\x83\xb1\
+\x00\x00\x05\x82\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00@\x00\x00\x00 \x08\x03\x00\x00\x00\x95C\x8e\xb6\
+\x00\x00\x00\xc0PLTEq\x8c\x0e\xa5\xa5\xa4\x0c\x0d\
+\x07\x00\x00\x00\x97\x97\x97\xa2\xca\x0c\xec\xec\xec\xfb\xfb\xfc\
+\x8c\x8c\x8b\xca\xca\xcaxxw\xd4\xd4\xd4\xb3\xb3\xb3V\
+j\x09\xba\xba\xba::7VVU\xf2\xf2\xf2\xf5\xf5\
+\xf5\xc5\xc5\xc5higIJH\x05\x06\x04%'\x22\
+\x1c\x1d\x19\x12\x14\x0c@A?\xd8\xd8\xd8451q\
+rp\x9c\xc3\x0c\xf8\xf8\xf8\xcf\xcf\xcf\xef\xef\xef\xe1\xe1\
+\xe1-.*\xde\xde\xde\xe7\xe7\xe8\x01\x01\x01\xff\xff\xff\
+\xe4\xe4\xe49E\x0bd|\x0a\x8d\xb1\x0a\x98\xbe\x0c\x82\
+\x82\x81+5\x08\xdb\xdb\xdb]^YGX\x08\xaa\xd5\
+\x0c\x1f&\x09\x99\xbf\x0c\xbf\xbf\xbf}\x9b\x0eaa`\
+\x92\xb6\x0b\x86\xa6\x0e\x9b\xbf\x14\x95\xb9\x0e\xd8\xda\xd1\xc6\
+\xc8\xbfbcX\xd2\xd4\xcb3\xee\xa2.\x00\x00\x04}\
+IDATx^\x8d\x95\xe5\xb2#7\x14\x84G0\
+\xcc\xcc\x8cf\xf6\x85\x0d\xbc\xff[\xe5H\xb3\xbe\xbb\x9b\
+T%\xe9?\xae\x1a\xbb?\xb5\x0e\x8c\x85\xfb\xbf\xeb\xdb\
+\xd99Pj\x18\x86\x85\x14-K\xd3>\x8bp\x92`\
+\x92\xf6E\xdf\xe3)\x22\xff\x0d(\x15\x85\x22\xc3Pu\
+K+\xec\xb8\xe8q\x92\x85Y\x11c\x02\x9a\xc8\xdf\x00\
+{\xa6_\x01%\xa5\x08\xfc\x8f\x5cZ\x1eV\xe3\x0f\x0f\
+\x84\x86\xb1\xf3i`\x17ID\xa6\xe9g@U\x89\x5c\
+\xd5\xcfH\x05Y~\x93\x8f\xae\xbb\x0c\x83\xe4\xd6\xb5\xec\
+\xb5\x83~j\xac\xd2Q\xb2i\x22?\x00{p\xbf\x0b\
+\xe6\xc5\xdc>\xdfE\xf1\xfe\xca\xf1\x89\x1e\xfa)\xef\xa4\
+\xb1\xcb\x87\xd6u\x99\xdf\xf5Z\xb9n\xad\xb7\xb7\x18\x02\
+|\x01\xf6\xa2\xf8\xdc\xdc\x22\x02\x8an\x97\x0f\xb1\xda\x7f\
+\x07\xfc\xae\x9f\x86\xfc\xb4\xe8\x86\x91\x0f\x16B\xaa\xdf\x0c\
+\xfa8C\x0c\x8aJ\x00\x10\xe1\xe5\xdf_0yiJ\
+\xb7/\xc2\xe7\x9f\xdd2J\xcb\xa2\xab\x16u\x92(J\
+\xe2>s\x0e\x8ab\xf9J\x98M<\xc1\xea\xdf\x1d\xa7\
+\xd5\xfb\xfd\xe3\xf2m%|\xfe6J\x10Z\x1aT-\
+!$\x0eJM\xd3\x82sV\xd8\x09fM\xe0\x00~\
+\xfe\x91\xd9\xf0\xc6\xdcn\xcdc\xc4\xbe\xd9@\x06\x0e\xe8\
+$wQ\xd19!8C\xd2\xcc\xe5\x8e'K\xb1\x09\
+\xf9JP\x89\x17v\xf0\xf1)\x82\xae\xa2pd\x04S\
+\x5c\xaf\xd0<\xe8\xb9\x87\xe2d\x86\x0c^\x99\xc9\xf3\xc6\
+N\x0f\xd2\xe9\x0b \x0a\xacz\x9b\xfb\xb5\x82fT\xd5\
+\xf5\x1b\xcb\x83\x9f\x22\x03\x04a\xccKk\x8f\xf3\x5c\xd7\
+\xe0\x06\xc6\xa8\xd2\xd2I\x00@V@u\xdf0\x7f%\
+\xee\xf7\x10\xc6\xbc=\xaf\xef7\xb0\x5c\x00P\xbds7\
+\xe4\x8b\xa9\xee\xba\xd22z\xb5d\x85\x09\x86'\xd3\x17\
+@\xfc\xc0\x84\xa4;q\xcf\x86a;\x11 l\xc1w\
+{\xaf\xf6\x00\xe0u\x8d\xe24\xb2\x0f\x0fU\x1f\x8c \
+L\xd6:\xaf\x04\x81\x95\xd0\x04\x1e\x14\x8d\xfb1\x01B\
+U\x1d\xc1\xf4\x14\x01\xc0\x9b\x1b\xe18\x8eS\x12\x8c\xf5\
+|\xe0f\xfc\xea\xd6\x0a\xb8\x00o+\xf2\xfc\x98\xfd\xdc\
+\xac\xd8#\x02\x8f\xd6+dJ\x1ae\x94*\xc8\x9bg\
+m\xb23\xc5\x8eH\x11Oi\x91\x12\xc2\x01\x9b\xf58\
+\xf0\xb3\x9f\xe3\xadxg7!&\x07\xb0\xf6yef\
+y\xcb<\xb6\xf3\x5cfC7[\x85c\x04$D\xf6\
+/\x00\xf0\xf3\x5cX\xf8\x190e\xd6\xe2[\xea\xb0\x8c\
+\xb2,\x01 \x08\xa5\xb9S\x0dZ\xa4\x99\x862\xf2\xe3\
+\x0a\xc2\xf5\x0e\xe7\xbf\x08\xa2\xf9\xfd\x0a\xbb\xec4{^\
+\xd7\xb9\xae<\xd7\xc3\x22\xbbN\xf8h\xbd\xe5qp\x0e\
+\xd4\xa2\xfd\xab\x88`\xbc\x5c\x9f\x11\xaf,\x1f\x81+\x0b\
+%@Yv\x87\xa5\xf5\xea\x99\xa9\x96\xd4N\x1e\x0a\x9b\
+\xeam\xed\xb9unX%&k\x1b\x9f\xbc\x8d\xec\x06\
+\x91\xc9\xafq3S\xde\xc6{\xb5\xfbC\x1d%\xd7\x93\
+\xe5Zn\x87f\xacO6\x0e\xf4\xa5\x95eWU\xb4\
+pZ\x01\xd04>7W\x13\xea\xb7\x16\x82Q6\x22\
+\x03\xd8(\xcf\x07@xn\xa77\x8b\xab\xda\x93ct\
+\x924<\x14;\x8c\xc9\x0aXK\x16\x99\xa2\xf8|\xb5\
+\x12\x94\xc2(\x03 V\xfc\xe64\xc2B\xba\x83\xef\xe7\
+\x92\x91\x90\x9e\xaa\x8dA\x83\xd0.\xa2\x17\xa0\xaa6|\
+\x85w\xd7+,\x13\xbb?\x00/\xd7\x8a\x03\x0e\x96\xaf\
+\x03\xa0\xf5\x1a\xcbj$\x94$\x095\x0e\x85\xed\x84=\
+;\xe8\xb5\xce\xbb\x1b\xf3\xa4\x17\xe1)l7)\x7f-\
+\xa4\x02O\x90j\x86\xd5\x0cc\xdb\xb6\xbee\x9c\xe4&\
+KR\x05\xf5\xa9\xed81T`\x05\xf0:\xde\xd6\xd1\
+\x8c\x22\x00q\xf1.T;\xfc\x86\x0c_\x1fFOB\
+\x07E\xaf\xf3\x82\x10\x9b\x16\x8f&(\xf8Fq\xc0\x9a\
+a\x03\xce\x97\xf0\x91-\xd3\x07[&\xec \xe3\xd1\x0c\
+\x8b+k8=\xa376\xabAprU\x1a\xc7\xaf\
+\x1ap\x89\xd5\xf6\x88\xd7\x14\xf8(@/n\xbbu\x9d\
+3\x00\xf8z\xb7H9\x0d\xfa\x94\xa5L4\xcdXr\
+_+{\xf2\xebk\xbdz\x9a\x97\xcd\xe6\xb2\xfd\xb8\x8b\
+be\xc2rp@\xac \x84(P`~5L\xa2\
+\xd4~;\x94\xa5\xae>\x9a\xee\xc0\x01?T\x89\xa0\x0a\
+\xcc\x15O\x04~\x06\xc0\x8e\x128\x8a\xd1,\xdd\xd2 \
+\x87\xfd\xaf\x85\xa1c+\xbe\x95\xcb\xe8\x9f\x7fm\x5c\x9c\
+\x06\xf6\x150\xc5o\x01j[o\x5cdo\x19\x8ds\
+\xd8\xf7q\x9f$\x07E\xd1K\x9e\xe0\xdf\x04\x00\x08]\
+\xd0\x06f\xef\xd4\xca:\x8c\x94\xef\xc4I\x0aJ\x0a[\
+)cB\xfe\x07\x80\xe0\x80\x1a\x14!uh\xd4&W\
+\x92B;OS\x12%\x81\x81\x94\x84\xfc\x05,\x83\xdc\
+\xf4\xf9\xf1\xbe\x01\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00\x06~\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x06EIDATX\xc3\xc5WyP\xd5U\
+\x14\xfe=x\x8b[\x91\xcb\xa4\x19\x0a\xa8!\xe6\x08\x82\
+!\xb2H\xa1R\x9a\xe2@\xb8\xc5&%\x0a\xa5\xe8(\
+(5(\x04bF\xac\xef\xb9\xa0\x82\x90\xca\xa2 \xc3\
+\x08j! \x130\x88\x06!\xbb:\x98\xd8`\x8e\xd3\
+\x1f-\xc8\xa8\x85\xeft\xbe\xdf\x5c\x8c\x99\xca\x1e\x96\xf5\
+f\xbe\xb9\x9cs\xbes\xeew\xd7\xdfE\x22\x22\xe9\xff\
+\xc4\xe3\x83\x92\xa4`Lf\xb81|\x18\x1b\x18\x11\xa2\
+\xf5\x11~\xc4\x15\xff\xaa\x00\xd1\xf1$\xc6\xd2\xe5\xcb\x97\
+\x1fHKK;\xcf\xbf\xce\x8e\x8e\x8e\x9f\xbb\xbb\xbb\xf5\
+ha\xc3\x8f8x\x82\xaf\xf8\xc7\x02\xf8g\xc4\xb0s\
+uu\x8dJOO\xafikk\xeba\xd0\x993g\
+(**\x8aBCC\xe5\x166\xfc\x88\x83\x07>\xf2\
+\x90\xff\xc4\x02D\xe7\xb3<==\xb5\xc5\xc5\xc5W[\
+[[)33\x93V\xf9\x07^\xb7[\xb8\xa2r\xc2\
+\xe2\xf7N\x8e\xf0\x8a>\x8a\x166\xfc\x88\x83\x07>\xf2\
+\x90?\x18\x11\x7fXo''\xa7\x98\xa2\xa2\xa2\xab\x8d\
+\x8d\x8d\x14\x1d\x13{\xc7yYP\x99\x89OB\x96\xe4\
+\x9f\xa1\x95\xd6\xe4$K\xeb\xf2\x13\xe5\x96m\xf8\x11\x07\
+\x0f|\xe4!\x7f0\xfbb\xa0\x00%\xc3[\xab\xd5\xd6\
+677S\xaan\xcf\x1d\x87\xc0\xc8\x02iuf\xaa\
+\xb4\xe1\xf4'R\xc4\x85X)\xba%J\x8a\xbd\xb2C\
+na\xc3\xcfq\xf0\xc0G\x1e\xf2Q\x07\xf5\x0c\x16 \
+Fo\xe5\xe1\xe1q\xb8\xb6\xb6\xf6nII\x09\xbd\xbd\
+e\xe79\xe9\xdd\xecdik\xf5\xce\xb1\xa9]1+\
+\x8b\x7f\xd0E]\xb8wd\x7f\xf3\xaf\x05ha\xc3\x8f\
+8x\xe0#\x0f\xf9\xa8\x83z\x86\xccB\xbf\x00c\xc6\
+\xc2\xb8\xb8\xb8\xea\x86\x86\x06J\xd2\xed\xbf>6\xe4\xf0\
+!\xb9x\xfc\xad\x0f\x03\xca\xee\xebt-\xfa\xbc\xd4\x16\
+\xca\xe9\x07l\xf8\x11\x97E2\x1fy\xc8G\x1d\xd4C\
+]C\x05\xa8\x19krsso\xd4\xd5\xd5\xd1\x96\xf8\
+\xb4\x0aL\xef\xb4\xb4\x9b\xbb\xc3\xaa\xef\xa7\x9f\xbfEU\
+\x95\xb7\xa8\xba\xa2\x9b\xbe\xec\x07l\xf8\x11\x07\x0f|\xe4\
+!\x1fuP\x0fu\x0d\x150\x94\xf1AiiiO\
+UU\x15\xbd\xb9=3\x0fk\xbc\xa9\xfc\xc7\xc3\x92U\
+\x10Y.\xd9E.\x01:\x9a\xe3\x9bB\x0e>)r\
+\x0b\x1b~\xc4e\x1e\xf3\x91\x87|\xd4A=\xd45T\
+\xc00F\x5cyy\xb9\xbe\xa6\xa6\x86&\x87\x9d8\x88\
+\x8d\x96\xd4p\xef\x84\xe4~\x92\xd4+\x9bht`+\
+\x99\xaek\xa3I\xef\xb7\xcb-l\xf8\x11\x97y\xccG\
+\x1e\xf2Q\x07\xf5P\xd7P\x01\xc3\x19\x91<u=\xf5\
+\xf5\xf5\xe4\x93z\xfa\x18v{x\xcd/\x87$\xef\xcb\
+$\xade\xd2\x1a\xc6;\x03\x00\x1b~\x8e\xcb<\xe6#\
+\x0f\xf9\xa8\x83z\xa8;\x98\x19X\x9f\x98\x98x\x13\x9b\
+H\x9b_\xf6\x05F4#\xfbn\xec\xb6::\x18V\
+M\xa7\x83\xca\xa8|]\x05\x9d\x0bf\xa0\x85\x0d?\xe2\
+\xe0\x81\x8f<\xe4\xa3\x0e\xea\x0df\x06\xb0\x07\xbcCB\
+B.\xf01\xa2\xca\x9a\xbak\x93?\xbe\x98$%\x7f\
+\x1f!\xa5\xf5\x85I\x09\x94)#\x912\x1e\xa1\xdf\x87\
+8\xf3\xc0G\x1e\xf2QG\xdc\x05C\x07s\x0a^\xb1\
+\xb7\xb7\xcf\xcd\xc8\xc8\xe8mjj\x22mQ\xcd))\
+\xeez\xa4\xb4\xef^\xb8\x94B\xa9R<\xe5I\x9fR\
+\xce#\xc0\x86\x1fq\xe6\x81\x8f<\xe4\xa3\x0e\xea\x0d\xe6\
+\x14\xe0\x1ex\x8e\xb1\xd6\xd7\xd7\xb7\x81\xefu\xaa\xff\xfa\
+\xf2\xed-y_\xa5\xcb\xe7\x5cw/RJ\xd6'\xf3\
+\x88\xb3\xb8\xe3|\xb9\x85\x0d?\xc7\xc1\x03\x1fy>>\
+>\x8d\xa8#\xea\x19\x0f\xe6&\xc428XXX\xe8\
+x\x0aoTVVRSK\xebw\x19\x15\xcd\x85\x96\
+{\xbf\xd9-/\x87\xaeg\xab\xb4\xef~\xb8\xdc\xb2\x0d\
+?\xe2\x97\x9b[n\x83\x1f\x1c\x1c\xdcknn~\x91\
+\xeb\x040^4\xf8&\x1c\xf0-0a,\xb6\xb2\xb2\
+:\xe6\xe7\xe7w#??\x9f\xda\xdb\xdb\xa9\xb1\xedj\
+\xc7\xf1\x9a\x8eS\xa1\x85W\x0e\xd8\xec\xbf\x16\x8f\x166\
+\xfc\x88\x83\xc7\xfc^///\xf2\xf7\xf7\xff\xc9\xc4\xc4\
+$\xd7z\x9c\xd1Q<X\x06\xfb5\xc4^\x18\xcdX\
+bjj\xba\xcf\xc5\xc5\xa5\x91g\xa3\x97\x8f\x15\xe1C\
+\xd3\xd9\xd9I]]]r\x0b\x1b~\xc4\x99\xd7\xc4\xfc\
+K\xe8\x9cm\xda\xf8\xc6\xd4\x07G\xbc4\x0f\x97MW\
+\x96\xfc\x9d\x88?{\x0fh\x84\x08WF\xa8\x99\x99Y\
+\xa1\xb5\xb5\xf5%GG\xc7o\xdd\xdc\xdc\xee\xba\xbb\xbb\
+\xeb\xd1\xc2\x86\x1fq\xf0\x18A<\xf2\xe3\x81s-\x1f\
+\xc4\xbf\xaa\xa2\x03\x8b\xd4\x94\xcd\x22\xfcl\x949\x8f\x13\
+\xf1W/\x22\xb5X\x0eS\xc6\x02q\xaf\xe3bI`\
+\xece$2\xb6\x8b\xcd\xf6:c\x22c\xca\xb8\xa1\x8a\
+\xec\xd0\x19J\xfd\x8e\xd9*JxME\x07YD\xce\
+[\x9a\xbe\x80\x99J,\xc7\xbc?\xdb\x13\x8f{\x13*\
+\xc5\xc6\xc4n\x1e+:\xc1C\xe3%\x81IB\xe0\xf3\
+\x823\x82\xb1\xc8z\xa4\xe2\xec&k\xa5>\xdaAE\
+In*J_\xac\xa6<oM\x9f\xffL\xe511\
+\x18#Q_a\xe8\xab\xd8X\xcc\x08n\xcbg\x19#\
+\xc5\x12\x8d\x11\xed(\xe1\x1b)\xfe\xf6\xb4\x1b\xa5(\xd8\
+\xcc\x22>\x9a\xa3\xa2\xe4y*\xcaX\xa2\xa6\x13\xcb4\
+}\xabm\x95\xd9\xe23\xad|$\xc4\xa0W\xcb\xef3\
+2\x84\xf1\x8c\xe8\x08#\x7fA\x1c\xb7\x09\x0c3\x86\xb9\
+\x80/\x8b(\x0c\xb3Q\xeac\x1cU\x942_M\x99\
+\x1ej*X\xa1y\xc8\xcb\x81Kj\x11C%\x8b0\
+\xb0sc\xd1\xb9\xc9\x80\xe5\x98\x22^=/3f0\
+l\x183\x07`\xad\xed(Eq\xb8\xadR\xbf\xd3I\
+E\xda\x05j\xcab\x11'Wh\xf4\xfe\xb6\xca<!\
+Bi\x88\x00#1\xfa\xe1b\xd4\x16\xa2S[\xc6l\
+\xc6\x1c\x863c\xae89\xfd\x80\xbd\xd1v\xb4\xe2\xec\
+6\x16\xb1\xcbYE{\xdc\xd5\xf4\xd9R\x0d\x15\xae\xd4\
+\xe8\x1dL\x8d\xf0\x82\x1eg\xa8\x00\x95X\xff\xf1\x8c\xa9\
+\xe2\xfd\xef(:\xc2\x7fG\xf3\x19\xee\xe2D\xf4\xc3]\
+l\xba0\x16Q\x1aa\xc7\x22\x5cT\xb4\x97E\xac\xb7\
+WUa\xaf\xc8\xb3\xfa\x1f\x08\xc0\xf1\xdb\xcc\x22>\x8f\
+\x98\xa5\xd4\xaf\x9aj\x8cW\xb3\xaf8AC\x9e\xf6\x12\
+8\x0b\xa1\x0e\x8c\x90\x09\xc3\x15Y\xe2;1E\x0cH\
+\xfd47\xa1\x8d\xf0OgLcX\x8a\x99\x1b/\x8e\
+\xec0\x836\xe1\x13\x1eCsaO\x14S=^\x08\
+\x1f#\x061\xac\xff\x18\xfe\x06\xa3\xbfk\x5cnq.\
+\x0b\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x05~\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x05\x10IDATX\xc3\xad\
+\x97\xcb\x8f\x14U\x14\x87\xbfsnU\xcf0\x0c#O\
+q\x00\x01I|`\x06\x08\x10\xdd\xb8\x91\x85\xee\x8c\xf1\
+\x91\x18\xd8\x91\xf8\x88\x8f\x85\x09\xa8\xa0\x81\xa6e\xa3\x0b\
+\x13\x17Dc\xc0\x851\x19\xdd\xf8'\x981.|\x22\
+F\xe3\x8b\x18A@\x07\x89\xc0\x00\x19\xa0\xbb\xaa\xee=\
+.\xaa\x06jz\xaa\xbb\x81X\xc9\xc9\xad\xaa\xbe\xdd\xfd\
+\xab\xdf\xf9\xea\x9c{\xc5\xcc\xe8ul\xda\xd2\x10@\x8a\
+K\xe92u\xea\xc7ll\xb4\xde\xfb\x87\x01\x99\x12\xb0\
+isc\x07\xf0x\xa7y]\xee[\x0f1U\xdf\x9a\
+\x18\x1b\xad?\xd0.\xe0\xe0\xde7wo\xfc\xf4\xe7\xc0\
+\x86\xe5\x81\xd9\xb3b\xbe;\x0e#\x8b\x03\xaap\xf0\xb8\
+\xb2nIF\x1c9\xbe>b\xdc\xb3\x0ab\xa7|~\
+8\xe1\xde\x95J\x1c9\xbe\xffK\xb8\xefvH3\xf8\
+\xea\x8f\xc0\xfaeP\xab)\x87N\xc0\xdd\x8b=\x8a0\
+wHy\xf5\xa5\xc6\xf8\xd8h}\xe9\x0c\x01\x8d7v\
+ml&\x8a\xf7\x81\xc8)\xaa\xb9\xe0$\x0d\x84\x10\x88\
+#G\x1c\x0b!\x00\x04|\x10\xd2\xd4S\x8b#\x00Z\
+I\xca\xe0@\xcc\xe5\xa6g`\x96\xe3\xc2d\xca\xd0`\
+L+5\xfakB+\x81\xd9\x03\xf0Z\x07\x01\xe5\x14\
+H\x9b\xcd\xed\x0cH\x07\xcb\xad\xed\xdc*SR\x95\x82\
+6\xd8\xb4\x88\xa8\x141P+\xc6\xa8\xf8|\x8a\x81\x00\
+d@\x0a$\xc5\x98\x95\x22\x14ac\xa3u\xdb\xb4\xa5\
+Q\x1f\x1b\xad7\xa6;p\xf5\xcfs\x01\xc6\x0e\xe0\x91\
+i\xf7\xaa\xdd\xa8z\xeaP\xe1\xc8\xd5\xb1\x12\xc2\xe9O\
+\xef0\xbe\xdc\xbac\xf7\xfa\x95CB08t\xcc\x18\
+\x19\xf68\xa7\xfczJ\x19\x19\xceg\x7f{$c\xfd\
+rAD\xf9\xf5\x94p\xc7\xa2\x8cZ\x14\xf1\xc3\xdf\xb0\
+fi@Q\x0e\x1d7F\x96x\x9c*C\x83\xca\xcb\
+\xdb\xaa\x18\xb8*\xc0\x15\x02\xbex\xeb\xed\xfa\xfa\x0b\x93\
+\x9eZ\xec\xb8\xdc\xf2`F_-\xc2\x80$\xf5DN\
+\xc9\xb2\x80sJ\x1cC\xb3\x15\xe8\x8b\x1df\x86\x0f\xe0\
+\x9c\xe0\xbd\xe1\x9c\xd0le\xcc\x19\x8cp\xcaL\x01m\
+\xf6\xbb\x22\x05\xaftH\x81v\x810T\xa4\xc0f\xa4\
+\xa3=\x05\x15\x02\x5c\x09\xba\xbe\x22\xfa\x8b\xb1V\xc4\x14\
+\xa8S\x80%E\xb4\x80f1\xb6JP\xfa\x22\x0c\xd8\
+=6Z\xdf3S\x80\xb1\x13x\xb4\x0d6\xed\x00\xa1\
+T\xbc\x82\xd6\xc3\x89\x1e\x0e\x18\xdf\xbe\xb8\xa7\xbe\xe1\x96\
+\x81<\xaf?\x1c3F\x96\x0a\xa9\xf7\xfcvRX\xb7\
+B\x09\x1e~\x19\x875\xcb\xa1\xd9\xf4\x1c>\xa5l\xb8\
+Mh\xb6\x02?\xfd\x0dko\x15\xa2H\xf8\xf1\x18\xac\
+\x1e\x0e\xc45\xe5\x97qX5?P\xab)*\x81\xed\
+\xdb\xf7V2\xa0\x18\xdf\xec\xdbW\xdf0y\xd1\xb0`\
+\xa8ST\x0d\x9fA\x92e\xa8*\x91SB0\xe2Z\
+^&/]J\x98;T\xe3r\xd3\xc0\xc0E\x05x\
+\x91\x80A\x9a\xe6\x22\xb2$\x000wHy\xf6\x85\x12\
+\x84\xf7o\xde3e\xe5\xd4\xbb\xff\xd8\x95\xeb\xe9i\xb8\
+\xde\x14\x84\xb6\xebr\x1d8\x0b<86Z\xb7\xe9\x0e\
+L\xaf~S\xb0\xf5\xb7A\xd8W\x00\xeaJ\x85\xc8\x17\
+\xa0\xb5\xda l\x96\xe0,W\xc5]U\x10v\x13\xd0\
+\x8f\xf1,\xf0@\xc9\x91\xf6#\x5c\x03\x84W\x1c\xa8\x82\
+\xb0\x97\x80O\xf6\xbfS_=y9\xf0\xe7i\xe1\xce\
+%B\x92\x04\x8e\x9e\x16V,0T\x84\xbf\xce\x0b+\
+\xe6C\xe6\x03\xbf\x9f2\xee\x1av\xb4Z)\xc7&\x1c\
++\xe6{\xe2(bV\xbf\xf0\xcc\x0b\x8d\x0e\x10\xf6\x10\
+\xf0\xfe\xbb\xf5\xd5i\x06\xa9\x07\x15C\x04\xd2\xd4\x88\xa2\
+\xdc\x90,\x0b\xf8\x10\x18\x9c\x1d\x91\xa6\x06H>'\x0b\
+8U\x0c\xe8\xab\xc1\xd3\xcf\xdf\x98\x80r\x0an\xb4\x0e\
+\x5cs\x0a\x5c\x07\x08\xfbK-\xb9\x0a\xc2\xa4\x00\xaf\x0a\
+B\x7f-\x10\xca4\x07\x8cm\xc0C]\xaa!]Z\
+q\xd7\xd7\xb0S/\x98\xee\x80\xf1\xd9\x87\xfb\xebk[\
+-81\x01\xb7-\x82Vb\xfcsAX:\x17\xbc\
+\x0f\x9c\x980\x96/P\xcc\x8c\xf1s\xc2\xf0P \x8a\
+\x1c\xe3\xe7\xe1\xd6\xf9`\x06G\xff\x0d,\x9b'8\x15\
+\x9c3\xb6>\xf7z\xc7n\xa8\xa5fT\xc3\xf8\xec\x83\
+\xf7v\xafK\x12CDP\x15\xd2,\x10;\xbd\x02\x97\
+\xaa`\x06N\xc1\x07\x90\xc2\x17\xa7\x82\x0f\xb9\x01\x91S\
+\x924\x9f;\xd0/ly\xaaw;\xce\x97`y\x0a\
+\x1e\xfe\x1fR\xd0\xbd\x19\x15\x0b\x12\xadh\xc7q\xa9\x05\
+\xdfh;\xce*\xda\xf1\xae\x99k\xc2\xcd\x8d\x9d\x15\xab\
+b\xa9\xe8\x09\xd7\xea@\xf9\x9c\xde\x0eln\x1c\xfc\xf8\
+@}\xe3\x893\xc6\x92yy\xae\xcf\x5cT\x16\xce6\
+D\xe1\xe4\x84\xb1l\x81\x92f\x81\xb3\x97\x94\x85\x83`\
+\xc18}QX4\xc7\x10\x84\x7f\xce\x1b7\xcf\x01Q\
+8=),\x1a\xcc\xd99y\xceX|\x93\xe0\x14\x22\
+\x07O<\xd9ac\xf2\xd1\x81\xfaF\xef\x0d3\xc9\x1f\
+Or\x8aUs\xfd>\x04@J\x80\x81j>W\x1d\
+\x84\x90W\xbf\x10\x0c\x15H\xb3\x5c\x80\x08\xf9\x08\xc4q\
+g\x01;:\xa4\xa0St\xda\x98t^\x0b^\xc7\xc6\
+\xa4\xaa2\xc6\xa5\x22\xe5*6&\xbe\xd4r\xd3\xb6\xca\
+w\x85\x8b\xf6]\xb3\xb4o\xcf;\x88p\x15!%\x01\
+V\xa2\xbc\x1c]\xff\x1c\xe0?\xb4>3\xeeYJ\xce\
+\x0f\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x06\xa0\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x06gIDATX\xc3\xc5W\x09P\x95U\
+\x14\xfe\x1f\xfc\xef\xe1V\x84Xn(\xa0\xa8\x94\xcaf\
+\x88 b\xa8\xb8\x01\x06\x83K\xb2\xa8\xa5\x0c\xa8\xe1\x14\
+hZ*\xc6\x96\x92(\x8b\x0a\x18\xc8\x22\x04\xc8\x22\x02\
+\xa9\x91\x0b3\xc0\x10 \x88 \x888\xb8\x0e\xe50\xd3\
+\xd4\xb8\xa0\xa3\xa3\xeft>\xba\x143\x99=,\xeb\xcd\
+|s8\xe7|\xe7\xdcs\xcf]\xfe\x8bDD\xd2\xff\
+\x89\xe7;%I\xc1\x18\xcbpdx2>dl\x16\
+\xd2S\xd8\xe1W\xfc\xab\x05\x88\x81\xc70\x16-Y\xb2\
+$1!!\xe1,\xff\xda[[[\xefvtt\xa8\
+!\xa1\xc3\x0e?x\x82\xaf\xf8\xc7\x05\xf0O\x8ba\xe5\
+\xe0\xe0\x10\x9c\x94\x94T\xd9\xd2\xd2r\x8fA\xc7\x8f\x1f\
+\xa7\xe0\xe0`\x0a\x08\x08\xe8\x96\xd0a\x87\x1f<\xf0\x11\
+\x87\xf8\x17.@\x0c>\xc5\xcd\xcd-\xb6\xb8\xb8\xb8\xad\
+\xb9\xb9\x99RRR\xe8=\x9fUW\xad\xe6/-\x1b\
+\xe5\xbc6\x7f\x90\xfb\x8e\xc3\x90\xd0a\x87\x1f<\xf0\x11\
+\x87\xf8\xbe\x14\xf1\xa7\xf5\xb6\xb3\xb3\x0b),,lk\
+hh\xa0\x1d!\xa1\x9d\xd3\x17\xaf9\xa5\xef\x1d\x95\xa6\
+\xe7\x97\x1e?\xee\x93\xfc\xaf&n-J\x82\x84\x0e;\
+\xfc\xe0\x81\x8f8\xc4\xf7e_\xf4.@fx\xc4\xc6\
+\xc6V555QL\xdc\xbeN\x9bU[\xf3\xa4\x95\
+)1C6\x9d\xdc;\xf3@C\xfc\xc6\x92k9\xe1\
+g:\x8eBB\x87\x1d~\xf0\xc0G\x1c\xe2\x91\x07\xf9\
+4.@\xcc\xde\xd4\xd5\xd5\xf5PUU\xd5\xfd\x92\x92\
+\x12Z\x1e\x18\xf6\x9d\xf4A\xe6^iSE\xd8\xac\x8c\
+[\xd1\xa9\x8dwO\xbc\xbb.\x8e|wd\x13$t\
+\xd8\xe1\x07\x0f|\xc4!\x1ey\x90O\x93.\xf4\x14\xa0\
+\xcd\x98\x1f\x1e\x1e^Q__O{\xe2\xe2\xaf\x8e\x5c\
+\x97\x92\xfc\xfa\x8e\xaaH\xab\xb4\xce\x9d\xc9-\x8f\x8f]\
+\xfeE}\xd9'\xb2\x96|\xe2n\x12$t\xd8\xe1\x07\
+\x0f|\xc4!\x1ey\x90\x0fy5-@\xc5X\x9d\x95\
+\x95u\xbd\xba\xba\x9a\x02#\x13\xce\xa0\xbds3;b\
+Bk\x1e\xa57\xffL\xcd\x9d\x0f\xe8\xb6\xcb\x17\xd7\xc8\
+e?\x11$t\xd8\xe1\x07\x0f|\xc4!\x1ey\x90\x0f\
+y5-\xa0?cKii\xe9\xbd\xf2\xf2rZ\xb8\
+-%{RT]\xf4\xf6\x8a;\x19\x92\xe9\x1a\x1a\xef\
+\x12A\xf6k\x0bh\xda\xf6\x0e\xb2\xd9I\xdd\x12:\xec\
+\xf0\x83\x07>\xe2\x10\x8f<\xc8\x87\xbc\x9a\x160\x80\x11\
+~\xfa\xf4iuee%\x8d\x0d:r\xd0:\xbe5\
+:\xfa\xfc\xc3\x5c\xc9)\x9fT\xcb\x1aI\x7f\xcdu2\
+\x08\xea\xa21\x9fQ\xb7\x84\x0e;\xfc\xe0\x81\x8f8\xc4\
+#\x0f\xf2!\xaf\xa6\x05\x0cdl\xe5\xd6\xdd\xab\xab\xab\
+#\xcf\x98o2,\x12\xda\xbf\x0c\xad}\x9c.y\x5c\
+ \xc9\x97I\xab\x19\xef\xf7\x02t\xd8\xd9\x0f\x1e\xf8\x88\
+C<\xf2 \x1f\xf2\xf6\xa5\x03\xeb\xa3\xa2\xa2nb\x13\
+\xc5\xe6\x9e\xfav\xe8\xae\xe6\x08\xe7\xa2\x07\xbb#\xceS\
+Z\xe2E\xaa\xc9l\xa3\x0ei\xf9}\x92|8\x80%\
+t\xd8\xe1\x07\x0f|\xc4!\x1ey\x90\xaf/\x1d\xc0\x1e\
+\xf0\xf0\xf7\xf7\xff\x9e\x8f\x11\x95UV_\x99\xb0\xab&\
+zx\xe2O\xc16G\xd5!\xb3\xf3\xa8tc\x055\
+K\x8b\xdaI\xf2\xe4\x00\x96\xd0a\x87\x1f<\xf0\x11\x87\
+x\xe4\x11wA\xff\xbe\x9c\x82\xb7\xad\xad\xad\xb3\x92\x93\
+\x93\xbb\x1a\x1b\x1b)\xb6\xb0\xb2H\x0a\xbf\xbaU:\xf0\
+p\xa3I*%\xcf\xc9\xa3Ji\x1e/\xc72\x0e`\
+\x09\x1dv\xf8\xc1\x03\x1fq\x88G\x1e\xe4\xeb\xcb)\xc0\
+=\xf0\x1a\xc3\xd7\xcb\xcb\xab\x9e\xefu\xaa;\x7f\xe1v\
+`\xf6\xb9$)\xf2\x87O\x87'?\x0c\xb5\xceR\xa7\
+\xbb\x1e\xa3\xb3\x0b\x8f\xd29H\xe8\xb0\xc3\x0f\x1e\xf8\x88\
+\xf3\xf4\xf4l@\x1e\x91O\xbb/7!\x96\xc1\xc6\xd8\
+\xd88\x8e[x\xbd\xac\xac\x8c\x1a/6\xff\x98|\xa6\
+\xa9`R\xe2\xb5H\xb4\xd9\xfa\xc8\x830\x87\xc2\xc7\x11\
+\x90\xd0a\x87\xffB\xd3\xc5\xdb\xe0\xfb\xf9\xf9u\x19\x19\
+\x19\xd5p\x9e\x15\x8c\x91\x1a\xdf\x84\xbd\xbe\x05\xba\x0cg\
+SS\xd3\x0coo\xef\xeb\xb9\xb9\xb9t\xe9\xd2%j\
+hik\xcd\xa9l-\x0a(\xb8\x9ch\x1e\x7f%\x12\
+\x12:\xec\xf0\x83\xc7\xfc.www\xf2\xf1\xf1\xb9\xa3\
+\xab\xab\x9be6L\xeb0\x1e,}\xfd\x1ab/\xe8\
+3\x5c\x0c\x0c\x0c\x0e\xd8\xdb\xdb7p7\xba\xf8X\x11\
+>4\xed\xed\xedt\xe3\xc6\x8dn\x09\x1dv\xf8\x99\xd7\
+\xc8\xfcZ\x0c\xce:m\x987\xe1Q\xba\x9b\xce\xd3\xc5\
+\x13\xe5\x92\xbf+\xe2Y\xef\x01\x1dQ\x84\x03#\xc0\xd0\
+\xd0\xb0\xc0\xcc\xcc\xac\xd6\xd6\xd6\xf6\x96\xa3\xa3\xe3}'\
+''5$t\xd8\xe1\x07\x8f\xb1\x86g\x9e\xb3j\xc6\
+\xf8G\x913\x95\x94\xb0@E\x99\xee:O\xbd\xcd\xe5\
+\xaf\x9fW\xc4_\xbd\x88Tb9\x0c\x18s\xc4\xbd\x8e\
+\x8be7c?#\x8a\xb1Ml\xb6\xb9\x8c\xd1\x0c\x93\
+a\xfd\x15\x99\x01\x93e\xf5\xb6\xa9J\xda\xfd\x8e\x92\x0e\
+.TQ\x96\x87\xce\x93\x15\x162\x96c\xd6\xb3\xf6\xc4\
+\xf3\xde\x84\xb2\xd8\x98\xd8\xcdC\xc5 xh\x8c\x13\x18\
+#\x0a|Cp\x061\x16\x98\xe9)N|\xc4E\x04\
+\xdb(i\x8f\xa3\x92\x92\x9cU\x94\xcdE\xf8X\xc8\x19\
+b2Z\x22\xbfB\xd3W\xb1\xb6\xe8\x08n\xcbW\x19\
+zb\x89\x86\x089X\xd8\xf4\xc4\xdfnV\xfa\x8a\xbc\
+@3Y\xfd\xf94%\xed\x9d\xa5\xea.\x22g\xb1\xce\
+\x93\x95\x96r\xa6\xf8L\xcb\xbf\x17\xa2\xd1\xab\xe5\x8f\x8e\
+\xf4c\xbc\x22\x06\xc2\xcc\x87\x8b\xe36\x8aa\xc80\x12\
+\xf0\xb2\x1a\xac(\x082\x97\xd5!\xb6J\x8a\x9e\xad\xa2\
+C.*\xca]\xaa\xf3\x94\x97\x03\x97\xd4\x02\x86\xb2\xbb\
+\x08\x0d\x07\xd7\x16\x83\xeb\xf6Z\x0e\x13\xf1\xeay\x8b1\
+\x99a\xce\xb0\xe8\x05_\x8b\xc1\x8a\xe2 \x0bY\x1df\
+\xa7\xa4\xd89*JuUQ\xfe2\x1d\xf5\x0aK9\
+[\x14!kR\x80\x96\x98\xfd@1kc1\xa8%\
+c*c\x1ac:c\x8689=\x80\xbe\xc1R_\
+qb\x93\xa5\xac\x0e\x9f\xae\xa4}N*J[\xa4C\
+G\xb9\x08\x1b\x03-\xbc\xa0\x87iZ\x80R\xac\xff\x08\
+\xc6\x04\xf1\xfe\xb7\x15\x03\xe1\xbf\xa3\xd9\x0c'q\x22z\
+\xe0$6]\x10\x17Q\xba\xd9JVG\xd8\xffV\xc4\
+zke9\xf6JwW\xff\x83\x02p\xfc>\xe6\x22\
+Nn\x99\x22\xab\x97\x99j\xe3\xd5\xec%NP\xbf\x97\
+\xbd\x04\xd3E\xa16\x0c\xffQ\x03\x15\xa9\xe2;a\x22\
+&\xa4z\x99\x9b\xd0\x5c\xd8'2\xded\x8c\x17\x9d\x1b\
+!\x8e\xec\x00\x8d6\xe1\x0b\x1eC#\xa1\x8f\x16\xad\x1e\
+!\x0a\x1f\x22&1\xa0\xe7\x18\xfe\x0a\xd1\xfb\x82\xfeA\
+\x1a\xc9n\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x07r\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x079IDATx^\xa5\x97kl\x14\xd7\
+\x19\x86\x9f33{\xf1\xda\xbb^\xdb\xf1\x05\x1a\xb0!\
+\xb8\x01C\x02\x85\xa6Q)\x14+\xa2I\x14\x89_m\
+AU\xc9E(B\x02\xa7(M\xaa\xfe\xeaE\xe2G\
+\xfe\x94DQJ\x93\x8a\xaaEM\xa3F\x8aZ\x95H\
+\x16ihC!\xad\x02\x82\x16b.66\xc6W\xf0\
+\x8d\xb5\xbd\x17\xef\xee\xec\xce\xe5t8Ze\xd5\xf5b\
+\x0b\xfaJ\xaf\xceh\xce\x1c}\xcf\xf9\xbeo\xce\xce\x0a\
+)%\xe5$\x84\xd8\x0e\xacgquI)\xff\xce}\
+J\x01\x94\x04^\xabiZ\xd4\x03\xfb\x9e\xe38\x1d,\
+\x22\xef\xd9?\x00\x9d\x05\x90^\xeeQZ\xe9\xae\x0f<\
+\xbd\xe9\xa7\xaf\xef\xdb\xf9\xf3'6\xaey\xf2\xe2\xc5\x8b\
+\x0c\x0e\x0d14\xe8y\xa8\xe0\xc1A5z\xf7\xf1\xe6\
+\xd9\xfd\xe4\xe6g>xu\xe7kk\x9b\xc2\xcfy\xf0\
+\x11\xeeQF\x09\xc0\x86\xf6hvWUe\x8e\xab!\
+IOO\x0f\xe1p\x98\xbb)\x95JaL\x0d\xd49\
+\xdd\x03uK\xb4t\xcdU\xa8\x06\x92\xff\x0f\x80\xb89\
+\xd8G\xc5H\x1f\xb3\xb7\x5c\xfeq\xf2$\x193\x8bc\
+\xd9H\xc04Mr\xb9\x1c\xf9|\x1e\xdb\xb6\xa9\xad\xad\
+\xa5\x22>E\xa2B\xc3v\xb9/\x19%\xf5\x14Hp\
+\x81\xc6\xa0\xe0\xc2\xbf\xfe\x86\x99\x99C\xc3E\x02\x02\x88\
+\xe8.\xba&\xf0\x09\x81q[\xb2,b p\xc1\xa8\
+\x08<\xf5\xc2\xcf\xbe\xfe\xd2/\xbb\x1e\x026\x00Q\xa0\
+\x19hA\x89\xcf\x81w\x0e\xff`}_Y\x80#G\
+\x8e\x08]\xd75\xa99\x0a`\xd5\xaa\x15\xf82:\x92\
+\x10RJ\xcf \x04\xd4\x87\x83\x04\x0c\x9d\x80Oc<\
++\xb8>1\xc9\xbf'\xc7\x08n\xda\xb9g\xeb\xb6m\
+{*\xc2!\x96\xd6\x06\x08\x05t\xaa+u\xea\xc2~\
+\xa2U~zF\x92\xed\xc7>\x9b\x0a\x00\xfbK\x00\xe6\
+w\xa5\x10x\x8b\x03\xac\x89V\x92\xb5\x1c,\xdb\xc5\x95\
+\x12M\x08\xfc\x86F\xd0\xa7\x93u\x04\x89h\x0bo\xbc\
+\xf9>\x8dK\x1f\x04P\xa0\x85Q\xd9+\x93*Wu\
+\xb5\x9f\xc6\xda\x06F&\xe7\xf6\xbd\xf4\xd6\xe7\x1c>\xb0\
+a\xff]\x01\xd0Ah\xa0\xeb\x02\xd7\xb3\xe1\x0a$\x02\
+W\x0a4\xa1\xee+\xdfJ9|\xf5\xe9\xcdD\xeb\xea\
+Uo\x94\x91\xea\x97d2I0\x18T\xcd\xfc\xfd\xed\
+\xcd\xd8\xf6\x8d\x22D\x11\x00\xf6\xee\xdd+;::\x5c\
+C\x08|\x1a\xf8u\x0d\xc3\xd0\xd1\x10\xd8\xba\x8b+Q\
+\x00\x86\xa6\x1104\xf5\x8c\x99\xcd\xaa >\x9f\x8fr\
+\xb2,\x8bD\x22AMM\x8d\x02\x08\x04\x02\xecj\xff\
+\x12\xee\xa9\x9b\xfb:\xde\xbcp\xfeW/o<jP\
+\x14\xae\xebJ\xa1\xeb\x18\x06\xaa\xc6\x04\xee\x5ck\xcc\xe5\
+l\xe2\xe9\x1c\xd9\xbc\x8d\xe5HB~\x9d\xd9,\xd4\x9a\
+&\x0b\xc9q\x1c2\x99\x8c*\x03\xc5FgcK\x80\
+K\x03\xd9\xe7\x81\xa3\x1aE!=\xe9\x1a\x18:\xf8}\
+\x02[J\x06b)\xae&\x0d\x8cU[x\xb0\xfdY\
+\xbe\xbc\xe3e\xea\xb7<K\xcd\xc3[\xb9\xd6?\xc2\xe9\
+\xd3\xa7\x89\xc5b\xaa\xe6\xa7N\x9d\xe2\xf0\xe1\xc3j,\
+\x9e\xb0p\xfc\xf8q\x0e\x1d:\xc4\xc1\x83\x07\xe9\xec\xec\
+\xa4\xff\xc6 \xb6\x9d\xd7\x84\xa7\xf9\x00\xba\x02`h6\
+\xcb\xb9I\x87\xd6\x1d\x1dl\xfb\xe1Q*\xb7\xbe\xc2\xf8\
+\x03;\xb8\xec<\xc6e\xf9\x04\x99\xe5{hy|?\
+\x96\xa8\xe3\xd8\x87\x9d\xeaT\x1c\x1e\x9d\xe4\x9bO\xed\xe5\
+\xca\x95+\x0a@\xd7uB\xa1\x10\x95\x95\x95\xea:\x12\
+\x89`\x18\x06\xaejR\xf7.o\x81\x10Lf%\xf1\
+\xa5\xad|\xe7\xc0/H\xe9\xf5$R9\x84n\x81&\
+H\xe7\x5cbq\x93T*Ow\xde\xe5rU\x80\x8d\
+\xad[\xb8\xd2\xdb\xc7X\xb6\x8d\x99\xb3\x13\x18*\x80\xfc\
+\x22hKK\x8b:\xb4\x84\x10TUU1\x91\x04o\
+N\x96\x05\x10\x1a\x0c\xa7$\xbb^\xfc1\xe1%\xcb\x18\
+\xe9|\x97\xa9\xfe\xcb\x18\x81\x0aZ[6\xb0|\xd5\xa3\
+\xf4N\x84\xb91\x9c\x226c2:\x95a\xcc\xb3!\
+\x1a\x99\x8a%h\x7f,HC\x11@\xed\xde\xdb5u\
+uu\x00\x0a*\xe5\xa4\xbd\xd1\x96w4?\x03\x1a\xb4\
+D\x05\x9f\xbc\xfb\x06\x12\x8d\x8a\xc4 \x0d\x91 \x8e\xeb\
+r\xb3\xe7$1\xb7\x8au\xdfz\x9eh\xdb7\xb8\xd8\
+\x13g\xcc\xce\x90J\xe6I\xa7-\xcf6\x08@\x16\xcf\
+\x04\xef\x0dQ\x00\x85\xa3^\x81\xf9\x8c<B\x97w\xcf\
+\xc0\xb2\x88 o\x0f\xe0\xaf\x8cP\xb7\xb2\x96\x82X\xd1\
+PE<c\xd1\x7f\xeam\x92\xf5\xff\xe1\xa1\x87_ \
+\x99\xf6aY\x0e\xb6\xe3*\x1b>\x0di\xaa\x0cP\x22\
+\x05\xa5Lq\xae\x5c\x06\x94\x1b\x22>|\xa1\x00\xa5\xaa\
+\xad\xf4\xf1@\xd8\xcf\xd9+gY\xff\xc8nBA\x83\
+\xacg\xdb\x96\x9e]\x0c]\x03P\x8d&(\x0a\x09\x08\
+\x89,f\x87\xbbf@Y\xa8q\x9e\xce\x0f\xcc08\
+k\xb1\xa3\xe3-zf\xa3\xe8\x81\x14\xc1\xa0\xae\x82\xdb\
+\x96\x81\xcf\xd0P\xbbt]$%\x92\x14\xe6\x16\x01\xd0\
+4\x81Pf\x9e\xfa\xa7R\xbc\xfa^\x17\xfd\xb7\xd2\x88\
+j\x93\xe6\xfa\x0a\xb2\xa6C\xce\xb41\xbdq\xd3\xea\x1a\
+\xce\x9c(_\x02`\xf1\x12\x08\xf1\xbfY(UkS\
+\x98\xd7w\xafg(a\xa37\xacf\xcd\xba\xaf\xa8\xce\
+.\x883#\xd0\xd6\xd6\xb60\x80\x5c\xac\x07\x16(\xc1\
+\xe3\xad\xb5|me\x84O{'\xf1?\xb2\x8e\x1d\xbb\
+^T]^\xa2E\x00X0\x03\xca\x9a\x00AQ\xae\
+e\x92OMc\xcd\xcd`g\xe2\xe4f$\x86\x95)\
+\xd9\xd1\xe2R`\x0b7\xa1P\x96\xd2\xc11\x93\xe4\xe7\
+\xbc\xa0\xa9i\x05\xa0@$\xc4s08+Y:\xe7\
+\xde\x17\x80D\x02b\xe1\x0cd\xc6\xba\x01\x8aAM\xc9\
+hBr-\xe62\x96\x92\xe6`\xbe.\xf1\xed\xaa\x15\
+\x8d\xf7\x0a\xe08\x8e2\x18\x0b\xbf\x86\x96\x033YI\
+\xff\x8c\xe7i\x97\x899iN\xa5e\xfflV\xf6\x0f\
+\xc7e\xcf\xba-\xed\xeb\xab\x9bZ\x9f)\x02,\x1ex\
+zz\x9a\xd1\xd1Q&\xd2A`Y\xbc,\xc0\xe4\x9c\
+\xe4\xe2\xb8\x8b\x17\x84\x9bI\x19\xbf='\xfb\xc6\xe7d\
+\xcf\xed\xb4\x9c\x00\xc6\x0a\x1eoX\xde\xd6\xa4\x1b~\x16\
+\x03H\xa7\xd3\xea\x7fDWW\x177\x06G\xd1\xaaW\
+\x12i\xde\x0c\x1a\xef\x94\x03\x18\xfdt\xd8\xb9\xd1=%\
+\xc7\xc7S\xb2\xcb\x83\x19\x02&\x81q \x0d\xf8\x00\x1d\
+\x08Zy\xd3p\x1d\xa7\x1c\x80\xfa\x00\x99\x98\x98P?\
+\xcb\xdd\xdd\xdd\xc4\xd2:\x81\x86\xb5T\xad\xde\x86\xe6\x0f\
+\xfd\xde\xd2\x8c\xb7\xbd\xaf\xe3s\xe5\x00\xba\xfe\xd8\xe5\xfc\
+\x04\x88\x01\x03\x80\x09\x84\x81J \xc0<I\x0a\x00*\
+\xc5333\x5c\xbf~\x9dK\x97.1:>M\xde\
+\xd7DE\xc3f\xfcu\x91\xb3\xaet\xde\x1b\xbev\xee\
+O\x7f\xfd\xdd\x8fn{\xc0n\xd9\xb7\xc0\x9b\xe8\x15B\
+\x5c\x074 P\x08\x9c\x07t@\x02NaN\xf7\xf9\
+\x83\xb6D03;\xcb\xc4\xf8\xb8\x0a:04J\xca\
+\xaeB\xafnA4=:f\xa5\x13\x1f\x0e\x9c\xfb\xe8\
+\x83K\xa7\xdf\xef\x03\xe6\x00\x93\x12\x19\xcc\x97,\x06#\
+\x07\x08\xc0)\x80\x18_\x00\x04B\xb1\x91[S\x5c\xfd\
+\xec/Lg\x03\xf8\xa3\xcd\x18\x8d\xdb\x11f\xf6\xd8\xd4\
+\xad\xdec\xff\xfc\xf3+g\x00\x0b\xc8\x01Y\xc0\x06\x5c\
+@.\x08 =\x09!\xdc\xc2\x02\x0a\x8b\xac\x02\xac^\
+\x00\xd0\xce\x7f\xf4\xeb\xdfD\x9f{mI\xa0\xf9\xbb\xbb\
++s\x99\x13\x99\xe4\xf4\x89\x0b\x1f\xff\xf6\xe3\x81\xaeO\
+\xe2\x855N\xc1V\xd1\xb8\xb2\xa4a\xfe\x0b\xaa\xd3\xe9\
+\xafp50#\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00\x0a\x8b\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\
+\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\x08d\x88\
+\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x0a-IDATx\x9c\xed\
+\x9d]L\x1c\xd7\x15\xc7\xff\xf7\xee\x87\x17\x02KH\x00\
+\xd7\xe04\xf5\x8215`bLT\xbb\xb1\xb5Rq\
+\x0bU,\x1b\x13\x91\xf6\xa5\x8a\xa3\xc6\x0fU\xa5>\xd8\
+\xfdL\x94\x08\xcbj\xf3\x92>4o\x95\x9f\xda>T\
+\xb2\xe3Z\x08\xc7XN@\x228\x89\xedJ)\xc2n\
+\xdd\xc4\xd88\xaa\x9b\x18c(\xb0\x0b\xce\xc2ro\x1f\
+`\x17\xd8\xdd\x99\x9d\xd9\x9d\xef\xb9?i\xc503;\
+\xf7\xec\xbd\xff9\xe7\xdc{\xe7\x03\x10\x08\x04\x02\x81@\
+ \x10\x08\x04\xee\x82\xa8\xdd\x7f\xff\xfe\xfdu\x8c\xb1\x1a\
+\x00%j\x0b\xa3\x9co\x8es\xfe\xb4\xda\xef\xb9\x09J\
+\xe9]\x00\xff\xcd\xb4\x8ds\xbe\xc4\x18\xeb\x1b\x1c\x1c\x9c\
+\xd6\xaa<E\x02\xe8\xea\xea\xf2LNN\x1e!\xc0\xaf\
+\x01\xd4hU\xb8 7|\x0b\x0b\x15\x17/_\x9e\xd0\
+\xe2XY\x05\x10\x0e\x87\x1f\xf7\x12r\x1a\x94~W\x8b\
+\x02\x05\xf9\xc3\x81\x1b\xfe\x85\x85\xefh!\x02Y\x01t\
+uu\xf9\xa7&&\xde\x07\xa5\xfb\x00 Z\x1c\xc2\x17\
+\x9b\xbf\x8fh\xb0\x1aK\x9e\x80\xaa\x82\xfc_M\xa2\xe9\
+\x93\xd7\x01\x00\xad\xad\xad\xe8\xec\xec\xcc\xd5f\xcd\xe0\x00\
+\xc0\xf9\xea\xff\x9c'\xd7\xf1\x95\xf5\x89\xbf\x7fx\xfbm\
+\x8c\xdd\xb9\x93w\x99\xc7\x8e\x1dCYyy\xda\xfa\xde\
+\xde^|\xfc\xd1G\x00\x80\xe1]\xbf\xc5\xe2\x86\xd2u\
+\xdb)[\xc0\xcek\xbf\x00e\x8b\x09\xdb5\x11\x81W\
+n\xe3\xe4\xe4\xe4o\xc8J\xe3\x7f\x1e\xfa\x01n\xd7\x1d\
+\x05W\x9d6,\x13\x98\xbf\x9f\x5c\xdeZ[\x8b\xdam\
+\xdbr:\x8e\x96\xf0\x94\x86N6~\xe2\xef\x9a\xe5@\
+@\x9d\xe0\xa5\xd8\xfc\xd4S\xa8\xac\xaaJ[\x1f\xaa\xae\
+N\x0a ZR\x8dX ]$\x83\xdf\xebE\xe3'\
+\xdd({p\x05\x04hX\xf0\xfb\x07\xda\xf7\xee\xcdK\
+\x04TjC{{{\x903\xf6K\x00\x98,\x7f\x16\
+\xa3\xdbro|+\x92l\x5c\xac\x9e\xe5R\x8d\xcf3\
+\x1e\xc1x\x18\xf5\xe1zs7\x1eV\xec\x06\x00\x10\xa0\
+!\xe6\xf3\xf5\xb7\xef\xdd\x9b\xae\x16\x85H\x0a \x16\x8b\
+=O)-\x04\x96\xcf~\x10g5\xfe\xcaBf\x0f\
+\x90A\x10V!U\x04\x94\x90\xc6|D )\x00B\
+Hcby\xe6\x89\xfa\xe5l!\xdf\x8f\x05X\xd7\xe0\
+)q\x1e)^\xc14\x0f\x90\xa5\x1e\x99\xc7\x87\xeb\xbb\
+\xb4\x11\x81\xb4\x008/\x07\x00\xe6\xd9\x00F\xfd\xea\x7f\
+\x84\x05I;\xdb3\xad\x93\xf0\x00\xd6\xf1\x01\xcb0\x9a\
+Y\x04\xe1p\xb8L\xcdq$\x05\x80\x95s\xd6)q\
+?\xe3\xd9.\x95\x00fZg\xa10\x90 \x93\x08(\
+\xa5\x03jD '\x00\xc7\x90\xda\xf8\xaa\x13@\x0b6\
+~\x82\x84\x08&+\xbe\x05@\xbd\x08\x94\x09@\x8b\xf8\
+o\xb2#\x91s\xf5\x19\xe3\xbd\xd9\xee_E\xbd2\x8f\
+\x0f#-'\xd6\x89\xc0K\x88\xa2p\xe0x\x0f\xa0:\
+\xd9\xb3\x99\x07H\xc0\xe8z\x11\x80\xd2\x1dJD\xe0h\
+\x01\xe4\x9a\xec\xa5\x09\xc2P\xabsgY\x04\xddi\x22\
+hmm}R\xea;\x8e\x15@^\xc9^\xaa l\
+\xe0\x01\x120\xeaO\x13\x01\xe7\xfcWR\xfb;2\x07\
+\xc8'\xd9\xcb\xe4\x01\x0c'\xcfzf\x1e?F\x9e\xed\
+^=\x1c\xe7A\xa9\xa2\x1c\xe7\x01\xf2M\xf6\xb8\xcd=\
+@\x02F\xfd`\xd4\x97u?G\x09@\xabd/S\
+\xe3\xdbO\x02\xca\x90\x9d\x0dL\xa2\x85\xfb6(\x04\xe4\
+\x9b\xec\xa5z\x80\xb5\xc74\x0c\x03C\xa6c<@.\
+\xdd=)W\x9f\xd1\xfd\xdb0\x0c(\xc1\x11\x02P\xd2\
+\xddS\x9a\xec\xad\xf5\x00i\x82r \xb6\x17\x80\xd2\xee\
+^Z\xbf^\x81\x07Xw|\x87b\xeb\x1c \xaf\xee\
+\x9eT\xe3[\xc1\x03\x88\x1c ;yw\xf7R\xd6%\
+\x8fiv\x02h0\xb6\x14\x80\xaa\xa9]\xa9\xee\x9e\x8a\
+\x04\xd0\xc9\x22\xb0]\x08\x90L\xf6\x90\x22\x88\xc4_\x8d\
+\x12@C% B\x80\x0cRg\xbb\x1a\xf7\xaf2\x01\
+t\xb2\x07\xb0\x95\x00\xb4\x9c\xdaU\x9b\x00z\xa86U\
+\xe5\xf1*s\xbaFa-kd\xd0rjW.\xd9\
+\x93\x8a\xfd\x1d\x87\x0fc!\x16C<\x1e\xcf\xf97l\
+\xaf\xafGEEE\xce\xdf\xd7\x03[\xe4\x00zL\xed\
+\xcay\x80ue\xae\xd0\xd4\xd4\x84\xa6\xa6\xa6\xdc\x7f\x84\
+\x1aD\x0e\xb0\x8a\x19\xc9\x9e\x93c~*\x96\x16\x80\xaa\
+\xee\xde\xda\xe5<\x92=75>`a\x01\xa4\x9d\x99\
+9x\x00@}\xb2\xe76\x8c\xcb\x01r@\xeb\xee\xde\
+\xbac\x22\xb3\xc8Lcm\xd9N\xcc\x01\x96|\x85\xc9\
+\xe5h4*\xbb\xafQ\xdd=\xa4\xae3\x91h$\x92\
+\x5c^\xf2=fX\xb9\x86\x09`\xd1\x1fD\xe4\xf1\xe5\
+\x87\x8b\xbcw\xe9\x12fgg3\xeegvw\xcf\x0c\
+\x22\xb3\xb3\x18\x1a\x1a\x02\x00\xcc\x96\xd6!\xee-\xcc\xf2\
+\x0d\xed04\x04\xdc\xa9\x7f\x19M\x1f\xbe\x86\xf1\xf1q\
+\x1c}\xe5\x15\xec\xdb\xb7\x0fEEE\xc9\xedk\x1bb\
+\xdd\xf2\xf2\x8a\xac\xdb\xd2\x96\xe5\xb6\xa5\xeeg\x12\xf3s\
+s\xb8r\xe5\x0afff\x00\x00\xb7\xeb_64\xe4\
+\x1a:\x10\xf4\xf0k\xbb1\xdap\x1457Naj\
+j\x0a===F\x16oyn\xed\xf8\x09\xa66\xb6\
+\x18Z\xa6\xe1#\x81\x9fo\xfb!\x22\xa5\xb5\xd8r\xf3\
+\xcf(\x99\xfc'\x08gF\x9b`)8\xa1\x98.k\
+\xc4X\xdd\x8f\xf0\xbf\x8a\x9d\x86\x97o\xcaP\xf0TE\
+3\xa6*\x9aAX<\xf9\xcc\x1b\xb7\xc2<~p\xe2\
+1\xad|S\xbb\x81\xdc\xe3\xc5\x92\xc76\xd3\x11\x8e\xc4\
+\xb2\x03A\x02c\x10\x02p9B\x00.'{\x00\xb6\
+\xc0\xc3\x1d\x04\xfa!<\x80\xcb\x11\x02p9\x96\x9e\x0d\
+\x14\xe8\x8f\xf0\x00.G\x08\xc0\xe5\x08\x01\xb8\x1c\x91\x03\
+\xb8\x1c\xe1\x01\x5c\x8e\x10\x80\xcb\x11\x02p9\x22\x07p\
+9\xbaM\xc6\x17F\xee\xa1`\xeeK\xbd\x0e\xef*\x1e\
+\x15Ub\xbe(\xfd=CZ\xa0\x8b\x00\x0a\xa2_`\
+w\xdf\x8fAX\xee7R\x0aVa\xd4\x8b\x8f\x0f\xfc\
+\x05_\x15j\x7fc\xa9.\x8f\x8a\x0d<\x9a\x10\x8d\xaf\
+!\x94\xc5Q\xf2\xf0\x86.\x8f\xe6\xd5\xfdz\xacC\x87\
+\x0e\xe1\xdb\xcf=\xa7w1\x8ed\xe8\x83\x0fp\xfe\xfc\
+y\x00@\xec1}n+\xd7]\x00;\x9b\x9b\xd1\xdc\
+\xdc\xacw1\x8e$\x1a\x8d&\x05\xa0\x17\xa2\x1b\xe8r\
+\xf4\xe9\x06\x8an\xa3>\xe8P\xaf\xc2\x03\xb8\x1c!\x00\
+\x97cH\x080\xfb\xee[G\xa0\xd3\xc5\xb9\xc2\x03\xb8\
+\x1c\xdd\xbb\x81\xd9\x9e\xbbs\xf3\xe6M\xdc\xbe}[o\
+3,IMM\x0d\xea\xea\xea$\xb7\x1b\xe19M\xbd\
+1\xef\xf2\xd0\x10N\x9e<i\xa6\x09\xa6\xd3}\xe2\x04\
+\xf6\xec\xd9cZ\xf9\xfa\xbc5L!W\xaf^Uc\
+\xab#Q\x5c\x07:\xbd\xa5M\xf7\x1c \x11\x022}\
+v\xb5\x18\xfb0\x04+\xd2\xd2\xd2\x22[Gzcj\
+\x08\x08\x87\xc3x\xa2\xb4\x14\xa3.\xcd\x01jkkQ\
+__o\xaa\x0d\x86\x08@N\xc9\x0d\x8d\x8dhhl\
+4\xc2\x0cKbv\x17Y\x0c\x05\xdb\x05\x9d\xc6\x01\xf4\
+\xef\x06\xc2\xfc'q\xd9\x15#\xeaM\xff\x10\xb0\xe6\xa1\
+\x8c\x02\x95X&\x09\x14!\xc0\x1a\xd82\x04d\xe9\xce\
+\xcc\xcf\xcfc\xe2\xc1\x03\xbd\xcd\xb0$\x15\x1b7\xa2\xa0\
+\xa0@r\xbb\xe3\xbb\x81\xb7n\xdd\xc2k\xaf\xbe\x8a\xb9\
+\xb993\xcd0\x8d\xe2\xe2b\xfc\xee\xcd7\x11\x0a\x85\
+L\xb3\xc1\x90\xc9 .\xf1\xe9\xbbp\xc1\xb5\x8d\x0f\x00\
+\x91H\x04}}}\x92\xf5c\x04\xc6\xe4\x00\x12\xael\
+Se\xa5\xca\x03;\x8f\xaa\xaa*e\xc9\x9e]\xbb\x81\
+rttt\x801\x86\xd1\xd1Q3\xcd0\x8d\xda\xad\
+[q\xe0\xc0\x01Sm0u\x1c\xc0\xe3\xf5\xa2\xeb\xc5\
+\x17\xf56\xc1\xf2H\xd5\x8f\x18\x07p;\x96\xe9\x05\xe4\
+\xf3\xca7\x88\x91\xc0\x5cYWo\xb6\xcd\x01\x84\x07\xc8\
+\x1d\xcbx\x80<\x10\x1e\xc0\xda\x88\xa1`\xbb\xe0\xc4\x10\
+0==\x8d\xdf\xbf\xf5\x16\xc6\xc6\xc6t7\xc3\x8aT\
+WW\xe3\xf8\xf1\xe3\x08\x96\x94\x98f\x831\x17\x84H\
+\xac?{\xf6,FFF\x8c0\xc1\x92\x0c\x0f\x0f\xe3\
+o\xe7\xce\xe1\xa5#G2nwF7\x10\x90\xf4\x00\
+\x22R\x00\x84\x10\xe9d\xcf2I`\x1e9\x80\x5c\x12\
+\xd8\xf9\xc2\x0b\xf8\xcf\xbd{\xb8\xe3\xd2k\x02\xabkj\
+\xd0q\xf8\xb0\xf2\x81 \x1dr1S\x87\x82\x83%%\
+x\xfd\x8d7\xcc4\xc1\xf5\x98~=\x80@\x06\x03\xea\
+M\xdc\x1b\xe8r\xf4\x1f\x07\x10#\x81\xda`\xdbq\x00\
+\x88\x91\xc0\x5c1\xa2\xdeD\x08p9\xc6\xcc\x06J\x84\
+\x80x<\x8e\xb3\xef\xbc\x83\xbbw\xef\xe6^\x80\x8d\x09\
+\x85B8\xdc\xd9\x09\xaf7s3\xac\xab7;\x87\x00\
+)z{zp\xe6\xf4i3M0\x95\xbf_\xbb\x86\
+\x0d\x81\x00\x0e\x1e<h\x9a\x0d\xa6\xce\x05\x8c\xbb\xf4r\
+\xf0\xb5\x8c\xdf\xbfo\xeaH\xa0\xfe\xb7\x87\xcb|\xda\xda\
+\xdaPTT\xa4\xb7\x09\x96%\x18\x0c\xa2\xad\xad\xcd\x05\
+W\x05K\xf0\x8d-[\xf0\xc7S\xa7\xf0pbBe\
+\x01\xce\xa0\xac\xbc\x1c~\xbf_\xd9\xce\xb6\xcd\x01\xb2\x8c\
+\x04\xfa|>W_\x1e.W7\xa2\x1b(\xd0\x1dc\
+f\x03\xc5H`N\xa4\xd5\x9bxN\xa0@k\x84\x00\
+\x5c\x8e\x5c\x08\x88\x03X~\xf3\x07\xe7\x00\xc9\xcd\xff\x88\
+\xe9\xe0<\xc8\xa3\xde\x088\xc8R<q\x9cE\xa9\xfd\
+$=\x00'd\x0cX~]I`n\x5c\xb7g\x05\
+\x0a\x14\xa2\xb2\xfe\x0bf\xee\x81\xac\xf4#8\xa5\x92\x97\
+\x5c\xc9\x85\x80\xbe\xc4\xc2\xa6\xcf\xde\xcb\xd3z\x81\xd1l\
+\xfa\xecRr\xd9\xbb\xb4tQj?I\x01\x0c\x0c\x0c\
+\x8cp\xa0\x1f\x00\x9e\x1e\xfe+\x8a\x1f\xba\xf3\x0e^;\
+\x12\x9c\xf8\x14_\x1f9\x93\xf8\xf7\xc2\xa5\xc1\xc1\x7fK\
+\xed+\x9b\x04r\xce\x7f\xca\x18\x9b\xf3\xc4ch\xee=\
+\x86M\x9f^\x04\x15o\x03\xb3,\x94\xc5Qu\xf3]\
+4\x9f\xff9\xe8\xd2\x22\x00D\x18\xe7?\x93\xfbN\xd6\
+h\xdd\xda\xda\xda\x0e\xce\xcf\x01\x08\x00@\xdcW\x88\xe8\
+\x93!0_\x00\x5c\xe2\xeb\xbeX\x04\xc1\x07\xab\xa2\xdb\
+\xf1\xcc3*~\x86 \xc1\xc8\xf0pryv\xe37\
+\xb1\xe8\xcf<oB\xc0\xe1Y|\x84\xa2\xa91x\x16\
+\xe6\x13\xab\x1f\x81\x90\x83\xfd\xfd\xfd\xef\xcb\x95\xa1(]\
+\xdb\x1f\x0e\xb7pB\xfe\x04J\xb7+3]`&\x8c\
+\xf3\xeb\x94\xd2\x97\xfa\xfb\xfb\xff\x91m_\xc5\xf9z8\
+\x1c\xf6z<\x9e\x0e\xcey\x07\x80\xed\x94\x90BI\x03\
+\x18#\x94\xd2J\xce\xb9\xc2\x99\x0e\x81\x1c\x84\x90\x18c\
+\xecKJ\xa9t\xbf\x90\xb19\x10\xf2/\x02\x9c+-\
++\xeb9s\xe6\xcc\x92\x81&\x0a\x04\x02\x81@ \x10\
+\x08\x04\x02\xdb\xf0\x7f\x9b\xdd\xc9#y\x9dh\xbc\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x001]\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x80\x00\x00\x00\x80\x08\x06\x00\x00\x00\xc3>a\xcb\
+\x00\x00#\xa2zTXtRaw prof\
+ile type exif\x00\x00x\
+\xda\xed\x9ck\x92$\xa9\xb2\xa4\xff\xb3\x8a\xbb\x04\x07\x9c\
+\xd7rx\x8a\xdc\x1d\xcc\xf2\xe7S\xf0\xc8\x8c\xcc\xca\xea\
+s\xaa\xbb\xff\x8c\xc8tv\xe5#\xdc\x03p\xccLM\
+\x15\x8c0\xf3\xff\xfc\xef2\xff\xf3?\xffc\xad\xbdo\
+s\x87\x94c\x89\xf1\xe2\xbf\xbb\xdc\xc5U~\xc9\xd7\xf9\
+\xef\xfc\xb4\xd7\xbd\xbf\xbf\xbd\xb4\xff\xfe\xf2\xba\xf9\xb8\xe0\
+x\xc9\xf3\xd3\x9f?\xe3|\xee\xaf\xbc\x1e>\xdf\x90\xee\
+\xe7\xf5\xf6\xf5u\x93\xfa\xd3N~\x1az.\xbc\x1a\xf4\
+\xea\xd9\xf1\xcbs_~\x1a\xf2\xee\xbcn\x9f\xbfMy\
+\xdeW\xef\xb7\xc7y\xfe\xf9\xb4\x9b\xf8\xb8\xf9\xfb\xdfw\
+b2F\xe0E\xef\x8c\x9b\xde\xfa\x8b\xefQ\xbdxF\
+\xe0\xb3\xafz\x8d\xef\x97\xcfN\xaf8~w\xfe\xde\xdf\
+\x7f3w\xe6\xe3\xd7o\x93\xf7\xf1\xdb\xb7\xb9\xbb\xea\xf3\
+\xba\xff:\x15\xe6\x8a\xcf\x0d\xf1\xdb\x1c=\xaf\xdb\xf0\xf3\
+\xdc\xed\x19z\x1f\x91\xfd\xec\xf9\xcb\x85\xe4\xb6#|\xfe\
+\xf76wk\x8d\xbc\xd6<OW\xef\xc8LE\xf3<\
+\xd4\xebQ\xf6o\xdc\xd8\x98J\xbf\xdf\x16\xf9J\xfc\x0b\
+\xfc\x9e\xf6W\xe1+\xf3\x88\x9dI\x1fX\xb3\xf1\xd5\x8d\
+-\xd61\xb3\xcb\xdev\xd8j\x97\x9d\xfbg\xb7\x9d!\
+\xden\xba\xc4O\xe7\xba\xf3\xfb\xb5\xec\x93+\xaeo\xa3\
+\xdc\xfa\xb2\xcb%_\xfc0\xd8\xc8\xf9\x8e\xd5</\xbb\
+\x8f\xb1\xd8\xddo\xd9\xfdu\x9b\xe9yX\xeet\x96\xc6\
+d\xc5_\xbe\xccO/\xfe\x9d\xaf\x8f\x86\xd6\x92\xebZ\
+{\xe5\x8f\xb9b\x5cN\x0e\xc80d9}\xe7.\x0c\
+b\xd73\xa7a\xcf\xef\xfe2o~s\xbd\x19\xd6c\
+\xc1\xb0\xa79\xf3\x80\xf5j\xa7\x89\x16\xec\xa7o\xf9m\
+g\xcf}\xe1\xba\xcdu\xdc\xdd\xa6\xf14\xc0\x14\xd1w\
+`0\xd6c\x81+Z\x1fl\xb4\xf2\x87\x04^x\x97\
+\xb1Oe\xe4\xb8\xbakX\xc0\x86\xe0\x865\x0b\xdbx\
+\x1f1\x0e\xd1@\xdf\xbc'\xd9}\xaf\x0b\xee\xbc\x0c\xb4\
+`\x88\xe0\xa3O\x98\xa6\xf8\x8a\xb1\xee;\xe0?\xe9\xce\
+\xf8P\x0d>\xdc&\x84\x10C\x0a9\x94P\xa3\x8fw\
+\x0c1\xc6\x14\x85Q5\xf9t\xa7\x90bJ)\xa7\x92\
+j\xf6\xf9\xce!\xc7\x9cr\xce%\xd7\xe2\x8a\x07\xc2B\
+\x89%\x99\x92K)\xb5\xd2i\xa5\xe9\xca\xbb+w\xd4\
+\xda\x5c\xf3\xedn\xa1\xc5\x96Zn\xa5\xd5\x8e\xfb\xf4\xbb\
+\x87\x1e{\xea\xb9\x97^\x87\x1b~\x10\xfe#\x8edF\
+\x1ee\xd4i'\xae4\xef\x19f\x9ci\xe6Yf]\
+\xf8\xda\xf2\xeb^a\xc5\x95V^e\xd5\x0f\xab=V\
+\xfdj5\xfb\xcdr\x7fm5\xfbXM\x16\xbb\xf7}\
+\xe9\xd3j\xbc\x9c\xd2\xab\x09+8\x09\xb2\x19\x16s\xb7\
+\xc5\xe2I\x16\xc0\xa1\x9dlve\xb0\xde\xc9r\xb2\xd9\
+U\x1cA\x11\x1cV\xb3A\xc6\x19V\x16\xc3\x82\xf7\xb4\
+.,\xfba\xbbO\xcb\xfd\xa5\xddL\xb8\xff\xc8n\xee\
+w\x9632\xdd\xbfa9#\xd3=\x96\xfb\xd5n?\
+Xm\xd4\x9dQ\xfc6\x90\xa2Psz\xf9\x05\xb0q\
+\xc3\xcc\xd5\xe5\xaa\x9cT\xdb\xb8f!`\x92\x8d\xb3\xf8\
+\x8e\xe5f.\xcb3,\x86\xd9\xe75\xaf\x95\xea\xf0k\
+\xe5;,\x82wrQ?\x8d\xb3i\xad0\xf3\xe5\x19\
+\x82k@\xdb\xf7[^w\xe8\xf7}\xe9\x5c\xd8/_\
+\xd7\xeb\xad\xe6\xbc\xf7\xe7[\x8a_\x13\xf3\xed\xe6<O\
+\xb7\x0a(\xcc\xefu\xdd\x97\xedk\xd80\xae\xb4\xbas\
+3-\xc3|\xac\xd3\xaf\xbe\xbf\xf5\xdc\xf5\x93\xbbi\xfe\
+\xdeMM\x9e\xfa\xa2U\xd8\xc2\xad\x9b\x99}\x9a^m\
+\xdf\x97\x0d\xfd\x8cT?\xba\xde\x1d_\x97\xba\xa6\xd9\x9f\
+\xba\xde=sM=\x9fG\xdb\x93a\xe8xwK\x8f\
+\xea\xf8{\xb7\xd7\xe9\x98\xa6\xd5u\xcf\xbb\x9b\xf7\x9e_\
+\x0fm~\xff\xd4\x7f\xf6\xd0\xe6\xf7O\xfdg\x0fm~\
+\xff\xd4\x7f\xf6\xd0\xe6\xf7O\xfd\x07\x0f]d~{\xbc\
+\xa6&\x8d \x87\xa7Y\x86\xa1\x80\x9b\xf4\xf3\x9b;\x08\
+3b\x1f_\xbbW\xc9\xae\x19;z\x1e+\xd9\x95m\
+k5\xa6\xdc\x97\x1d1_\xae\x0c{\x07Q\xaa\xf0\xfa\
+\x09\x1c\xe4\x16\x9d#\x04o[\xa2]\xde\x0d\x82\x85\xbb\
+\xc7\xc8f\xd6k\xfa\xb1j\x9e#\x94\xc6\xf8\xd7\xe9\x93\
+\xe0m\x10\x8e=\xf8\xe6!\x8b\x09\x8c\x07\xb9F\xbao\
+\x85\x1e\xe8\xe2\x09\xf7\xd8\x88\xc6\x12b\xc7j\x8e9\xeb\
+\xf76-\xed\x83\x1a\x97(\x83\x1f\x9d\xd9\x00]Z!\
+\xfamI3\xb4\x9c\xc2\x0dH\x96\x0e\xc4\x8d\x00*x\
+\xe0\xc2[\xee\x0a\xc9\xa40\x83\xcdw\xed\xc5\xb7X\xe6\
+\x1d\xae5{maM\xa6\xb42\xbd1\x7f\x7f\xa1\xee\
+\xa9o+\x5c]\x99~q-Y\xd3\xd5\xb2\x06\xd4W\
+O+\x15A\x08y\xf5\xb6\x11\xcc\xc2F6G\xcf\x90\
+\x03o\x9d\x09T[\x97W\xd3\x0e\xf2\x13*\x9055\
+U\xf7\xf4\x86\x9f-\x03w}\xfa\x06M\x02\xeb{\x9c\
+\x15\xcf\x80(\xb9\xc4m\xbd\x87\xc4\xdf\xd0%\x5c\xc2F\
+}_\xd3\x17\xd7f\xf4\xbe\xd4p\xd5\x90s\xb0\x06`\
+\xc5\x90\xc0e(\xeb\x1eE?G\xe8\x0c\xe2\x1e\xfc\x87\
+\x07W\xe7\xf0\xca\xeej^\x17c\xee\xb4Ch\x84\xb2\
+]\x22\xb7\xed\x7fL\xbda\xe48X?\x0e\xe6\xfa\x09\
+\x8f0R\xf2\xb8pq\xf8K\xba\xe4\xde\xb5\xfa\xee\xb7\
+\x0d\xfdL{l\xc2/\xb7\xa3 \x04;\x8d\xcd\xc7\xcd\
+\xbd\x9c\xad\xb9\xdd\xa0Mat\xdc\x08\x97\xf6\xe9\xdb`\
+\x140{8\x9f\x83\xd9c1\xa9\x9f8\xdb\x83y\x0d\
+\x05\xaf\xd9\xc3\xb8>\x06\xb2\x87A\x87{ 4\xe6\x1e\
+,\xd0`4\x96b\x0e.\x9f\xc1\xd0\xe0\x19\x8c\xbf\x8b\
+\x82\x84\x06\xd4\xe5\xfa\xcd\xe3\x13\x1c\x8c\xf6\x19\xacy\xa6\
+\xce?S7\xe7U*\xdc\x8a\xc7\x9a\xce\x93p\xb9\xd7\
+V\xa4\x18\xb9\xd8\xf5y\x0fO\x1aq\xa3\x86\xb1Z\x9b\
+)\xfa\x02I\xee)DC\xacL\x1ff\xb2a\xf6\xb2\
+\xf0`l\xdb\xc9\xdb;4\x22f\x9f\x1e^\xd2N\xae\
+:9\xab\x0d\xec\xccX\xcb\xca)\xde\x19\x0f#?\x19\
+\x12.O\x18e\x9f\x05\xb0\x84iq\xd4`\x07\xaf\xf6\
+Tk\x9a\x9e\xb6\xc88\xf4\xd2S\x9bW\x1f\x0e<\x1a\
+\x8e\xb4\x17;\x81\x8bo\x14|\xb9\x03l\x1e\xd7\xccs\
+\xf6D\xe6M\x96\xd1\xca\xb1W$\xab\xfb:C\x9eI\
+\x8e\xed'}\xe0\x9764M\xc5\x08\x07\xb7:\x01;\
+#n\xb9\x0c\xfd\xe4[\x09Y\x17x\xc6\x16\xefqW\
+\x1b\x92\x05\x15\x14\x18\xa1\xe1\x94\xd8\xae\xf4\xe9j\x9f\xc0\
+\x07\xd7\xaf\xd9\xe7\xc2\x8b\xe1+\xbd\xd4\xbb#!\xf2\xed\
+\xa0\x03\x00\x0aR`U\xc2\x8c\x07\xcb\x19\xc0`\x82\xca\
+\xddk\xe9\xf0\x13\x1e\xfb\xf6\xa3b\x0b\xf8\xc8\xac#\xf0\
+\x8d\xbfG\xb7z\x10&\xadt\x93\x22\xa85\xa1\x19\x02\
+c\xd7K\x1a\x1dh#4K\x1b\xe2=-\xc0ir\
+[m\xa4\x15\xd4\x9d\xfb\x02\x8c\x1f\xb8h\xbe\x00c-\
+`\xe8\x19\x13\x0e\x02\x07\xb9\x80\x1a\x9f!0\xcaF\xa9\
+\xf1\xc0\xbeB\x9c\x96\xe3\x1fL]\xc0`\xdb\xc4 \x97\
+\xf1)\xdd4R\xb0\xf2H\x1d\xf2\xc5\xcc\xdfz\x9eJ\
+\x90\xac\xd0,Z\x0c\xdfpY\xfd\x05/\x0fpH4\
+\xfb\x05K\xf1E\xf3\x01\xa6\x89\xc0\xffv\xf1\x1dh\xe1\
+\x80\x05\x97\x00LxN\xbbf\x04\xafF\xc0\xbdqz\
+)4\xb3\x1d\xa5o\xdb\xe0}\xbc\xb35\xb1\x1f\xd2P\
+\xcf+_=\xa6\xd5:a\xb2\xac\xee\xbb\xab#\x03\x90\
+\x5c\xf0h\xf8]\xdd\xc1\x82\xd9\xcbR^\xf3xu=\
+)O\xcd\x07}\xc7!\xe6\x0de\x03\x9c\xb6\xaf;\xe2\
+\xca3\xbdu\x85H\xf6\xa4C\x82N\xc1\x8c\xfb\xb8\xc0\
+\x9c\x98\x98\xf0\xb0\x85\x05m\xc2Uq\x00\xe2w\x0d\x1c\
+[\xa8X,tM\xc9\x88`\xab\xa9\xdd;1\x05\x09\
+\x7f~\xe6{(G\xfa{\xb8\x98\x9d\xc1-\xf5\xc2E\
+8\x12\xae\xe8\x98\xb2o\x80\xa0\xe2\xb6'\xb7\xackx\
+z\x1b{\xd4>\xcf\xc6 \xda\xc8m\x1e\xa0\xebZ\x5c\
+\x19F\xbfFf\xa5\x10\xc2\xc0\xf6{B$f \xc6\
+B\xefZ\xe4\xfaDo\xa1\x09|\xb1\x89C.f\x0e\
+\x04)\xea\xd6\x22\xb3~\x17=\xe9{\xf0\x00\x0c?\xde\
+\xdb\xf6\xbd\xe6\xeb\xcd#B%\x9922\x17\x16\xce\xe0\
+\x9c\xdfH\x89\xff+d]\x0c\xfd\xd8\x8d\xc9$9\xf2\
+\x13(\xaa%\x91Ex/P\x15\xfd,\x81\xc4\xb3\x06\
+B?l~\xfeK\x9c)tk%?\x8e\xe8\xe6\xbc\
+\xc9`\xe41\xbbj\xc1\xe8~\x9a\xd82\xc8\x1bk\x9c\
+\x0d\x0c$\xdc\x09\xa9;\xd32\xa1\x9e@\xa2\x81\xe4\x00\
+\x13,\x89\x18\xea\x13\x13\x8eN{\xe9n\x90\x93N\x12\
+\xa4\xc9\xb8Z^\xa6_\xa4/\xefq<\xcc\x11\xee)\
+\xb6ly\xda\xde\x94\x9e\x0fG\x8a\xe4T\x92\xe4\xbc\xc5\
+\xd4.q\x9d~\x10\xde\x1d\x16\xa7\xb5\x0b\x98\xff\x10Q\
+\x98?_\xdeW\xc1G\xbc\xecn\x22_\x899|\xcd\
+hr\xb5\xc6\x93(\xdde\xe6[\xe8\xa4\xb1\x94\x92\xc7\
+\x80\xb8\x13tI\x13q\x91\x98\x81u\x84\xceBJ\xcc\
+x|2\x11\xd7\x1d@\x96\x15\x8f\xdb\x9b\xaf~\xbf\xd3\
+\x8d}\x8c+\xdf\x87\xfa\xd4q\xfa\x5c\xa4\x1a\xa8J\xc4\
+\x19\xe9\xc3\x8a\x08\xe6\xa6\xefx\x1a!\x12\x96CJ\xec\
+(\xef\xd8'\xac\xd2\xfcl\x0d^\xb6\xf0\xc6\x13\x83\xee\
+&\xf8\xb7\x9fb\x1f;\xc7\xf6Y\x05\x07\xc1\xf2DH\
+4'B>B\xe6\xe7\x88q\x1e\xd8\xa4\x8d\xed\xa4\xc4\
+\xc3Z\x9f\xc10\xc8c\xd8G\xd1\xbf\x13\xd9\x9ef\xa8\
+\xd6\x93\xc8V\xbd\xe2G\x88\xbe\xf2\x93\xe2\xea\x95\xa1\xda\
+\xc47\xc5\x18w\xca\x87\x1f\x8d\xe05\xd9I\x8c\x81\xb9\
+e\xb2`\x1a)\xecG\xd7*$\xd3T%\x936\xa4\
+\xadc\x97\x06\xdeO\xd7\xf6$\xe1\xef\xc2\x9c\x81\xcc\xea\
+\xa3\xdde\x9b\xb6\xffQ\xb0\x8c\x0d\xbbm6\xd2\x80\xbd\
+\x0cC\xadr\xbd\xec\xc9r\x07\xbb\xa0\x9f\xb7B{\x0b\
+\x06\xf9\xcf\x01\xbf>\xf2\x1eeJ\x80\xc1d\xbe\x8a\x1d\
+hn\x8cR\xaa\x08;\xda\xbc\x94\xc9\xb4\xb9\xc3\x94\x12\
+-d\xf1\x90\xdeP\x11x\x8c\xff\xdd\x95\x0e\xad\xc2\x0f\
+\x0e\xd2\x9b\x1f\xa0\xfe?\xa5\x01\xbf\xdd\xd9]\x9f\xbe<\
+C0~\xb8u\xf2\xc0+\x0d`\x8c6\xbf\xa7\x813\
+\xf5<\xd2\xf2XG,\xd8_g\x8eH\xdf\x11\xee`\
+\xfe;\xbf\x85\x8c\x87\xba\xcd\x04\x0a}\xa4\x81\xf0\x96\x06\
+\xccg\x1e\xf8\x9e\x06\xb6^\xfc%\x0dX\x9c\x0c\x94\xc9\
+N\x9e\xea\xc8\xdc\x1d?f$\x0f\xf8\xdf\x0f\xdb\xbb\xdd\
+\x97\xbf\xef7\x0fo\xf2\xb4\x94:Xr\xe1\xcd)\xe7\
+\x05)\xb4\xb1\xe7(\x8ab\xe0\xd2.]\x1e\xea\x05l\
+\xba;\xfaJ\x9f~\x93^`\xd3\x85w\xcek_\x9c\
+w\xae\xed\xf2I\xc6\xef0\x89e\x9d9\xfa\xf40\xc9\
+\xbc\xdeI8\x89VD\xf0\x93\x84\xa6\x17\x07'\xf5\x8a\
+;s\x8f}0\x8c,\xe2!\x81\xf1nq\x90\x01k\
+\x03M\xba\xb8\xc5\x80} vn4\xd1}[\xa4\x02\
+\x0fU\xd3\xa1\xde\xd7\xfa)\x90L!P\x7f\x89\xa4\xf4\
+=\x92\x14H\xeb\x87@\x82\xe7>\x81d\xfe\xbbH\xda\
+\x81\xa4y\xf2\xf1k \x9d9\xbc\x10~\x1f\x91\xb4\xfe\
+*\x92^\x81\xf4\xdbp\xb9\xcd_FRU\xe2&\xd8\
+\xa4\x8eK\xda\x8c?\xe3\xa4S\xfe\xbf\xbe^1\x1f\x97\
+d\x86\xbcv\xfa\xe5\x01\xdcN\xeb\xca/\xb9\xd6\xf2z\
+\xd5~\xbc\x8ahl{\xbcI\xe3\x05\xfaLA\x92\xae\
+o\x99\xc2\x11<]\x0b\xb0\xd2\xfa\xde^\xc8\x13\xbbp\
+Ir\x1f\x9c\xd4\x0a\x1f\x95_\x86\xa0uZo}(\
+\xc1\xa0y\xc1\xfb\xabMnF_\xa4\x18}\x82\xf4V\
+\xf2\x0d\xfe\x1aH\x22W\x99\xc3]mO@\xa8\xa5\x11\
+\xf2\x0e+VR6\xb4\x1f\xae\x5c\x13F2\xf0{H\
+h\xf3\x8c\xa9V\x04\x04(\x92\x1b\x90\xa0\x01'\x1b\xf7\
+\xdb\x97?\xceh\xa5\xb5\xa6s\x05W\x82\xb7oh!\
+V\x96P\x7f{6\xb0\x004c=X\x7f\x91\x93\xbd\
+\x08\x14\xd3\xcf\xed\x08\xd4\xa3\xd2v{\x16\x87\x95\x0c\xda\
+\x08\x1amtI\xf4\xf3\x10\xad\x22\x02\x0f\xadF\xd0\xb4\
+\x1b\xda\x8c\x8fAB\xc8(\xb0\x8dz?-\xf7\xb4\xf3\
+\xc8\xca\xb9\xca\xbe\xa1\x8d\x8fK\xeaTzMF\x05^\
+Dt{9\x02\x10\xda-NfO\x00\xf8\xd5\x5c\xec\
+r\xf2\xf3\x18\xaf\xd5\x00\x07\xc0%\xd9\x8f\xc80\xf6\xd7\
+\xa1\x04\xbbD\xcf\xdf\xfb\xfb\xe8\xee\xb0\xca\xd0\xca\xf9\xed\
+s\xac\xe6\x0cv\xf9\xf8\x1a\xce\x1e\x8c((\xb7|\x1b\
+\x8c\x12\xe1O\xc3\xd9l\x04\xb6J\xf0\xa4(5\x03\x12\
+\xf6u\xa7=\x03\xa9\xee\xd5\x89_FD:\x8d'\x0f\
+\xbe:\xf4\xfb\x9a\xb1\x10\x03\xb4\xdfO\x96\xb9\xbf\x98\xb1\
+\x9f1m3\xe6\x90\xcb$kC\xa4\xc8\x1bk\x10\xb0\
+&\xe2m\xab\x15y\xbe\xd2\x8b\x08V\x8b\xfe>\x8b^\
+L\xda\xcaG\x87\xa3\x935in\xe4\xedc\xe9\x88\xdf\
+O\xe71\xe3O\xbcGc\xfc\xf0\x9c'\x13o[\xa5\
+f>\x8d\xa5%\x9c_:T\xd3$\x8f\xbf\x1c)s\
+C\xd0>\x1d\x7f\x04\xc1\xaf\x93\xf3>\xca\x1f&'\x9c\
+\xb91\x9f\x93\xf3t\xb8\xbb\xfb\xb4\xc6o\xa6\xe6\x8c4\
+\x95\x8f\x991\xbfX\xe47#|\x9b\x9a\xcf\x89y\x9b\
+\x97\x93\x8e~c\x0b\xfb\x17\xe3\xdc\x13\xf3f\x10\xf3\xf7\
+\xbc&|:\x0d\xd8\x03q\xb4\x06\xa8\xb7$\x0a\xa8J\
+d\xc8%]\x88\x89\x0e\xdd\xdc\xff#\xf6j\xee\xf1\xd2\
+N\xc2\xbe>\x00\xb9\x02\xe3\x9dSK\x82\x03\xf6\xc0\xab\
+@\xe3\xaa\x86LO\x0f\x05\xb2\x12R\x1d%\x0a1C\
+h}F\xd2\x15\xd2\xc3b\x0bD[ \xaa\xddUI\
+\x91\x9f8\x8c\x8cCU\x08\xd4\xc9Ug\x8e\xc0\xf5\xf8\
+JW\x08\x92\xa6tE\xb2\xba\xcfb\x94\xddlGK\
+9\x8cd\x89\x1em\xa8qh\x9bK\xe9Q\x94\xb8\xe3\
+\x90\x00\x11i\xbakj\xdd\xdc\x0ew\xf9\xa3B\xe2K\
+\xa3\xfc\xee\xda\xca\xce\xaf\xdbJ\xe7\x98\xcd\x02\xd4\xfeQ\
+2(\x91/\x1a\xe7\xdb\x15\xe9\x1b\xe7o\xed7XL\
+\x9d^\xd4/:#\x81\x13\x94\xfb\xdf^F\xcd\xa2^\
+\xfcQ7\x84\xce\xa6~\xe9+\xf1\xd3\xbeb<\x8b\x00\
+\xc5C\xba\x0c\xc3\xce5Tm\xf7\x7f\x5c\x82p\xfd\xf1\
+\xcb\xe6\xef\xb6\x22\x06\x11\xdfLb\x8eM\xea\x1cXt\
+khD\xa7\xa4#\xf3r\xbb\x17K\xff\xca,\xb6\xcd\
+\xde\xb9\x05\xf1\xe2\x8c\xd6\x10\xd3\x81\xf4\x93\xf0\xbe\xf2\xf4\
+\x1f\xafu\xa6\xab\xdaO~!\x0a\x02\xadY?\x10\x0c\
+]\xfa\xbc\x22~Q\xfc/LB\x1e\x07\xf3\xdc\x8f\xe7\
+\xb7Cb\xe1m\xad\xf1\xb3\xb5\xda/4\x1d\xde\xeaS\
+\xbbF\x8d\x83+\x8d \xa9&]\xb1\x852\xee\xcc\xc3\
+\xe3\xa3\xf0j\xcb\xaf5\xf9Z\xdc\x0c\xd9!&\x99d\
+\xee X}l\x90\x96\x85\xbc l\xed\xd7\x17\xc4\x8f\
+\x82\xb2H\x12\x03\x95\x9e[\xb4\xb2\x1aYG\xa8D\xae\
+\x1a\xa4\xb1\xf1kKz\xdf{[\xe6i]\xcc0i\
+\x19\xa5\x11r\x7f\xde\xcc\x85\x84\xf8W\x9a!\xaf\xfd;\
+\xcd\xe0\xd9\xffN3\x0b\xe1\xf7\xaf4\xa3\x95\x88\x7f\xa5\
+\x19\x9f\xcc\xbf\xd3\xcc\xf2\xe6\xdfi\xa6.\xf3s3\xd2\
+\xfd$ET\xed\x98\xc1K\xcb\x85\x89\xdc\xd3Rf\x0e\
+D\xc1\xad(\xb0cXB\xd4\x95>\x0bZ\xa4\x10e\
+\xbd;\xd2\x8d\xe4\xad\xbb\xe0m\xa8\xea\x8d\xccD\xf8\x93\
+\x0c\xe2\xd7d \xd4\xd6:X\xf8\xd4/\xe6lK8\
+\x1f\xbb\xd5b\xaat\xb5ubn\x90\xc1\xdf\xacl\xfd\
+\xb8\xe6e\xce\xa2\x9769\xaf\xbcw\x91w\xb1\xc1a\
+?]\x03\x13,\x9cw\xffp\x85\x9cp\xd7\x9d\xed\x0d\
+\x88x\x9dKM\x98H\x9a\x8c\xe4\xbd\xb3\xbd\xe1\xf6\xde\
+\xe8$y\x81cVO\x09V\xe6\xfbH\x19Q\x18\x92\
+\x91\xef=n\xa8\xe5i6\x06>\x8b\xc3\x08\x12\x10m\
+\xc4\xbe\x97\xd2\xe8mU\xd4\xcb\xd9\xf0|^\x04\xbd\xeb\
+\xbc\xfb\x1e\xd9\x18\x80\xadfb\x9a\xde\xa1\x02c\xb7-\
+ \x0bZ\x02\x9c\x16\x1d\x94\xaa\xc8\x01h_\xe25:\
+)_\x8c\xc0]J\xfa\x03\x89\xaal\x89\xc2\x91\xf1\xf7\
+\xc6\x94\x19\x22q\xbd\x9c}\xa3P\xaa\x90?\xbbx<\
+\x87\xf9\x9f\xf9\xd6\x16_\x12E\x8e3]\xdf\x1bx\xbd\
+\xdf\xa8\x01\xfb\x9b\x8bgS*\x9dM\xa9\x93\xb0_\xb7\
+\xed\x9b\xc4\x97\xfaY\xe9\x0a\xe6\x88\xa5\xdf\xdf\xf0\xb5\xa5\
+\xdfu\xa7\xb5\x91\x7f<\x963\x14\xf3\xcf\xc7r\xae\x99\
+\x7f>\x96s\xdd\xfc\xf3\xb1\x9ck\xe6\x9f\x8f\xe5\x5c7\
+\x7fg,\xc1\xf3\xff\xf1\xda9\xda=\x0b0`*\x89\
+wj\xa9\x1c\xb7\xb5s\x92\xec\xd3l\xc3N0*\xec\
+\xbc~\xdf\xeb+x\xd0M\xd7F~\x06\xe0:1W\
+\x88\xa8\x96Lm*\xba\xdc\x9a\x1e\xfd8\xed~\x95\x84\
+\xdb\xfdY\xeaH\xf7^\xa9#n\x9c\xf7{\x098\x11\
+ThDg7\x86\x9d\x15\xf0\xab\x99o06\xb4\xff\
+\xbe\xeb\x0fB\xff\x06cZ\xaa<\x81:\xab\x0a\x16z\
+\x86\xc2~\x80\x18\xb9\xff\xc1\xb1\xf0\x15\xad\xe8\xe778\
+\xf6ye\xda\x0b\x18\xeb\x1b\xc6\xccuv]\x85W\xfd\
+\x8c\xec+\x92\xfdrMX\xd66\x96\x1d(\xeb\xe7.\
+\xf3\x89e\xe2\xd2W{!\x99\x1e\xf5\x1d\xcb62\x7f\
+\xa0Y\x13\x9a\x1d({\x80\xcc\xfc\x08[\x80\xee\xc5\xb3\
+\x1e\x13\xec%\xd3\x01\xf5\xf7\xc7\x15\xd2\xbd'\xdb\xfb\x96\
+\x9c\xd0\xf2\xac\x9b\x1a\x01?\xc8:\xec&\xa2Ak\xa1\
+\x0f\xe8\xde\x8b\x0e\x83V\x22\xb5\xdf\x18\x97\x0b\xb6`B\
+\xcb\xd0\x83\xbb\x12\x8f\x1ejnw<\xda\xd6\x84]\xd5\
+\xa2BH4U\x80\xf3\xdb<\xe1\x7f\x10\xe2\x10\xb4Q\
+9\xb4s\x88\x02A\x8c\xa5\xc1e\xc7\xf4\xf4\x18\xc6]\
+\x80\xcc\xbbA\xff\x1b\xda\xac\x0f\x13\xb4x\xd9\x93+\x8f\
+T\xcf\xaf\x95l\xde\x8b\x85\xf3.`\x0b\x11/\xae\xb1\
+\xa3;\xd6\xc1Nzc\xceo\x1e\x84\x14)M\xa4U\
+\xbfq\xcfV\xe8]\x85\x08z\x7f\xa8\xd0\xd6\x16c&\
+ \xee\xe3G\xbdt0<\x95\xe8&\x1a\x8b\x06\xa4?\
+\x9b\xbf\xdb^\xe9\xc3\xa9\xb3!\xfb\x06\xdf*&oA\
+;\x01\xdc \x87|\x0dm\x0fLB\xec,.|J\
+\xf7\xef#7g\xe8\xc9\x91\xfdG\x84\xd4\xbb+\x14O\
+|\xb9\xb15\x02\x09;\xab\xcc%\xc4IPE\x18@\
+j\xbdX\xad\x02c\xae\xe8G\x8bd\x18B\xca\x14\x92\
+\x97\xf3Pg\xefF\xbdoh{n\x0cV\x1b\x99\xf5\
+^3\xa0\x1e\xa5\x80\xcf\xd2a\xe8g\x83@uh\xf3\
+\xdeU]\xce\xed\x05b\xc4\xf1\xc7\x15U;<\xf5b\
+\x0e\xaf/\x99\x10\xf03c\xfc\xe8 4\x8c\xc9\xfb\
+\xfd\x02\x1c\xcd\x7fI\x13\xc4@:[\xf0\x88p\x19Q\
+{^iT\x8f\xbd\xcbju\xf0\x1c\xad%\x8f\x9an\
+\x8d\xd8T\xcc\xe8\xe1\x18|C\xc4\x90\xe3\x0a(t\xcf\
+\x1a\xeep\xd7\xab!\x18\x0cBe\x84\x99\xb5\x01\xaa\xea\
+Z\xed\xb7\xe00\xda\x1cp\xee}\x95\xe6\xfd\x92\x16\xa5\
+\xddK\xff\x03I\xd0\xaf\xdb\xd0@=;i\xf3\xe6\xe6\
+\xbb\x00\x13 \xdf@?7l\xdd&\xf0\x96\xde&}\
+\xab\x04'\xab'y\xc0\xb5rRm/*\x9b!\xad\
+]\xb0Q\x86\xff\xbb\xa3\xc2\xb3\xcc\xa4\xd1K+\xd3\xb9\
+\xd9\x0e\xbe\x96k\x8eqE\x18\x83v\xf8\xbbDM^\
+\x1f\xb3\xaeU\xcc\xef\x93>\xc0\xf6\xab\x18u\x84\xcb\x96\
+\x5c\xba\x0a<.\xbc\x22\xa8\xb6\x09\x14TM\xcd\x7f\xed\
+\x98\xe6kL\xc1G\x94=\x08jU/n\xee\xfa\xd4\
+\x93\x04\xdf#\xfe\x90\x86\xf5\xda|A\xfe\x11>*=\
+\x1a\xb5\xf5\x03#\x85`\xb4<\x0f\xf6V\x15\x94o\x0d\
+\x1fM\xbe\xf4h\xed\x8c\x5c\xbd\xa7E\xe4\xa9\xfa \x84\
+`\xab\xc3WS\xd3:uU4>\x832\xff}4\
+\xbd\x82\x89H\xe9\x8ck\xa9\x9ad_\x07?\xeed\xe4\
+\x03\xdf\x5c\xe0\xdd\xc2\x97\x84\xee\x02\xa8\x94*\xb6\xbd\xe6\
+\xad4Kjj;4^\x91a\xbe\x85FYh\xdf\
+\x8d[\x81T\x03n\x91-\xa1k\x03t<\xabm\xb8\
+\xb6}a\x0c\xb0\xbc+\xad\x851f\x12\x176(1\
+\x92\xf9BH\x85I]\x159\x7f5\x1c\x01<n\xb7\
+o\x11\xef\x88\xc8d\xfej!`t\xd1}\xa8\xbe[\
+\xd2\xfdy\xeeB\xef\xae\xc0+\xd0\xcb\x10\xcb \x96\xd2\
+\x88~U\xefGMZZ\xba\x81\x13q\xd29\x9d\xcd\
+7\x09\x00\xa8\xbf\x18\xd4p\xd5\x91\x94\x05\xf4V\x8el\
+\xae\xed\xa5Zt\x88uW\x88\x11\xd3\xd1\x11\xd7\xb1\xee\
+\x02\xba.\xcap\xde\xe0\xf5\x86\xcf\xfby\x84\x02~C\
+\xa0y\xad\x1a\xad\xaa]\x0bxl\xc2\xde\xf9\x94\x01\xfe\
+@\x03\x1e\x12\xa0\x1d\x1a\x95\x9cU%\xa27\x12\x80\xcc\
+:\x1c\xbf\xbdH\xc0'\x058\xfb%\x0f\x09\xb0;\xcf\
+<\x04\xe0\x87\xf4o>E\xcc\xfdG\x22\xe63\xf9\xdb\
+K\xc9\xdf\xfc\xb9\x88\xe9\xc3\xed\xea\x95\xf4E\xc3\x98\x90\
+\x92\xd6\x82\xee|\xa8\x8c\x7f\xd6J\x0e\x95\x19\xe4\xc8\x90\
+@\xd0\xb3`b_\xa9\xbf\x1e!\xf3\xaec\x8cJ\x92\
+\xe3\x95r\xf6oR\x06\xcc\xd0\xb6\xd4\xfa\xf6\xeaV2\
+\x9f:ftD\xd4Xq\xcb\x18\x93\x97\x8a\xadO\x89\
+'\xd3\xffEV\x8dRU\xe4\xb9\x0e+x\x7f\x90;\
+\x92jH\xe7$\x1e\xd5\x1b\x15\xdb\x0d\x91@\xdc\x03\x82\
+0B[T\xa5B\xbf\xa4,\xbb\x12\xe3\x8c\xc4iq\
+\xe4e<\xa5h9K\xfb\x05\xa2<\xaa\xfc\x06\x11\x8b\
+\x14r\x02\x1f\x04\xfe\xfeT\x81\x92Z\xbad\xb2\xea\xbb\
+\xd6\x06\x95\xa4\xb2\xc41\xe4Ne\x95\xa9\x05W_\x0a\
+I\xa3\xa8\xba\xd0\xd13I\xd0#k\xb5\xb4iT\xde\
+\x8e\x16\x03\xe0kw0U\x08o\x8f\xa9`\xa5B\x12\
+(\x84\xc5\xce_\xb6D\xa83\xc3Z$\x0d j\xdc\
+\x1d\xf1\x9d\xaeJx\xf3|\x98\xffjB\x866`\x1a\
+\x00;4\xcd[\xa0P\x15\x19\xae\x9c\x91\x0e\xd5\xd38\
+]\xe3\xa6\x9c\xca\x80\x85\x94\x99nG\xffw\xc9W\x9b\
+\xe0\xbb#\x1d\x05\x1fT)\x94\x87f\xba\x9f:_0\
+[\xf5\x177\xaf\xd3\x10\xa3\xb9Z\xeb\x82\x83\xbc2y\
+An\x89K\xb6\xba\xb4\xbbok\x9c\xc1\x10\xac13\
+\x03\xbd6@\xd0\xb6\xe0\xf14HV%2T\xbe\x12\
+\xbb\x8aa\x98\xb7\x09J\x10\xd1\xa0\xf7\xf0)\xb8{\xb8\
+\x99\x80\xcazC\x89Z\xbf\x80Z\x7fm\xbb\x01O\x85\
+q\x841\xb1T\x22S\xc7@\x84\xc5\x1a3\xfdD\x0f\
+\x9d\xb8\x8e@\x053\xa1\x18(\x82>\xd5t\x1d~\xe0\
+\xee\xa6a\x1eB\xa787\x9a\xad<g\xc3\xf2\xb4\x07\
+1\x80\xa1\x94p\x15\xfc\x11\x00\xad\xb8M\x19\xf1\x9aZ\
+\x0e\x1f\x89dP-\xd7{!\x8f\x84\x9b\xe8\x87\x9e*\
+\xec\x09\xf6M\x90\xaf\xaarR\x944\xd6\x07^\x1a|\
+zA\xbdf\xa4\x0b\x92$F\x0d\x98R\xcb\x93g\x16\
+\xa5\xc1k\xee\x0e\xcc\xf6\xc9\xd7\x0dg\xc9;<\xeb\x02\
+Fu8@)\xbf\x89\xb1\x0cX\xc8^'%\x8aC\
+\x80\xc4\xe0\x818\xae\x83\xbc\xb8\x81\x9fM\xcd\x8d\x8f\x86\
+4\xe7\xf3\xe8\xdbx\xb1ur3\xbd\xa0\xaeZ\xba\x9b\
+J\xeb\xb4\xd3\x195\x1bY\x875@\xff\x86S\x83\xec\
+\xaah\x8a\xc5\xd6\x5c=3\x93\xbd\xe1\xa1\x96\x0a(\xb1\
+5nw5\x10\x15\xee\xdc\xfdEB\xc43G\xad\x0d\
+\x0a\xa1\x19#k\xde\xda\x09U\x15.\xf9\x13\x8f\xc3'\
+\xbdux*\x96$\xf7\x97\x0ac\x17\xc8GP\xe3\xe6\
+\xf9\x9avP\xc6\xae\xcd\x0f\xdc\x02E\xe7aU\x96\xcd\
+\xb4c\x92\x14}\xd7\x9e\x87\x80G\xd5\x1dQ\xfb#\xcb\
+\xe8\xd8Dn\xae{X9\x09;\xd9!|\xf7>X\
+\x82?t\x9d\xb3\xc0\x9f\x015H\x5cWA\x9d\xca\x16\
+5J\xbfb\xc91\xb9\xb9\xa2\x00V\xd5\xd0Lz\xeb\
+{\xeb\x0299\x16o\xdf\xde\x8dMc\x8er]\x84\
+\xcaRm\xc5P\x84j\x07\x03\x93\xce\x05K\x9f\xf0\x83\
+\x9b\xd9$\xfd\x19\xf0j\x9eB\xdb\xfb$\x1aF\xb6\xfa\
+Y\xf6\x99\x1dX\x11o\x0d\x10\x1f&\xd3ro\x8ab\
+J\xb9\xe2\x1d\xd1\xc7\xfa\xd4\xfe>\x9b\x99\x87\xd3f\x92\
+\xfe\x04c\x16$\xf3\xb6\xad82ES\xe5Ni\xd3\
+3\xf9\xb9hY\x19[\xb8d\xc9Q\xb8@\x02d\xec\
+\xb3Oh\xf0@\xa7$t\xed\x9d\xa1\xb3i\x89\x07\x8e\
+;e=\xb0\xb6ZUm\xc6\x00\xf6v\x11Z\x86\x04\
+Nj\xb4@d\xbe\x90\x12*\xe2\xc1OM\x09Z\xb8\
+\xff9\xf6\x17\x84K\xa7Jf\xb8\x1a\xf1\x08\x8e\x91\xbd\
+\xb5\xa5&\xa0\x896\x13\xd9WQ\x89q\x04\xd8z\x8f\
+\xbb\xce<M\xfc\x0b\x1f?%\xa2C\xe1%\xeaMl\
+W\x82\xea,\x18\xe4r\x9f-\xb3W\xba$\xdazJ\
+\x81\x00\x0c\xe6\xda\xf5\x17~\x97\x8e\xec\xed\xb9$\x82\x8e\
+\x17x\xdc\xb0\xee\x82|\x17O-\xf6aP\xf9V=\
+\x8d\xaa1p\x85\xfe\x1ca@fi\xef\xa9\x0emH\
+\xa0>\xfb>ap\xea'\xeaH\xb7\xcdu\x010U\
+Y\xed,\x9e\x09#;F\x22\x0b\xed\xa4\x94oq\x1c\
+\x08\x8c\xd9\xa9\xe6}'\x04K=\x89\x9f\x84y\xff\xa2\
+\xfd\xe3o\xb4\xbf\x19OF\xdb\xe9\xdf\xff\x1d\xed\x7f\xef\
+\xf4o~\xab\xef\xff\x93\xf6\x1fO\x05\xc2!\x01\xfdY\
+@\xd8\xea_\xdb\x83\xf9Y\xeb\xa8\xdf\xf4\xff@\xff\x87\
+\x97\xfe\xcf\xe9\xd94\x99\xedc\xd3\xc4\x9c3\x07\xa0\x01\
+\x0az\xc1R\x98\xe4S1U\xc2\xb0\xaa\xb2\x9a\xe7\x0c\
+\xc6_\xe9\x7f\xef\xc4\xb3\xd3x\x98\x18\xfa?\x939\xce\
+\xf9\x94\xbb\xee\x83C\x1f\x0b\x91<\x0f\x01<\xf7\xbeS\
+\xf8\x5c\xc8\xd0\x93 d\xc2\xbcM\x88:I\x80TR\
+\xc1\x0f\xce\x03\xfdv\xa9\xe2\x22Q\x0e\xf0\xe2\x00w\xda\
+*F\xa8\xcec\xac\x16?\x18@^\xd7\xae\x5c6:\
+\x0eb\xbd\x96=Td\xd2\x88\xa6StGR\xa4#\
+q\x00%Id<\xd3]\xb7\xfeG\x09\x14\xd8\x9d\xa8\
+\x90\xa4\xf9\x0d;^N\x05\xbaC\xd5V\xbc\xc1\xea\x5c\
+\xc6\x0aX\x17\xdeU\xbb\xc2\xf2\xba[\xdb\x15\x0a^\x15\
+%\x89\x94\x9cE5\xc8z\x1eA\x80\xffw\x92\xb1\xcb\
+56k\xf0\x0b\x95\xa3b\x14\x92-\xe2\xbbi'\xf3\
+,\xd5\xb5\xd2\x8f#\x1eJ\xecD\xa2\x1a\xb9\x0a=\x11\
+T\x83\xdb\xc0[\xcf#\x83\x05X-B\x81m\x11\xae\
+\x80E\xf4?\xc1\x192\x80\xedUi\xb2\xd7\xb9\x8fQ\
+<\xab~\xb3\xa0@\x98\x05\xc2\xf8\xd6\x0a\x1c\xa1>\x0b\
+\x22g\xacd$\x11\xba\xd8tV\x0a(\xda\xaa\x13\x00\
+U7\xc9}Z\x9eF\x17\x81\x0f\x19\xf9\x1a0\x18\xe9\
+\xa7u.Dm'\x97\x99UC\xaa\x92\x19o\x1ax\
+\x89>\x07\x03\xc8A\x16\xda\x01\x8c\x94\xe9a\x1c\x15\xfc\
+\xc2b\xbc\x157^\xb9h\x11\xcb\x81e8\xde\x14\xcd\
+W\xa9\xac\x0e\xbd\x91\x8dTZUGAOkc{\
+\xd7\xd6\xc4\x862\x18\xed\xc2;\x8b\x1e\x13\xc2\x80\xe5\x13\
+\x931\x98\x0eDj\xe8\x08~\xaf\x85\x0a\xd8D\xd3Q\
+\x95u\x0e\xe7\x8c\xdam\xab\x11A[DE\xa0\xa3:\
+\xd0\xe9nFY\x04m9\x91\xf4\x95PH\x89\x83\xc4\
+:\xe0\x1b\xe5\x0e*p\x8b<x\xb6\xaa\x00\xc6EM\
+WE\x17X\xb9\x1d-\xa3T\xf0\x13'\xcd:\xd3\x0e\
+\x8d[\x1b\xd0#\x07\x9d\xcf!\xef\xae\xa2\x835L\x05\
+F\xba\xeb\x09b\xa1=\x8f&(@\xf6\xaa~%\xab\
+F\xd5O\xf8a\x92\x86\xa4\x01P2\x1cR\x8e\x18\xaf\
+[i\xda-\x22O\x92@4\xc3\xda!\xc9\x0d\xab\xc5\
+I\x0b\x91\xc7\xc2?\xd1;\xb0\x9c\x88Q!\xa7\xca~\
+o\x1e:HI X\xbb\x11\xd5L\xf1.\x8a\xaf:\
+\x5c8<3\x1f\xcc\xc6\xf8\x0aW&\x93\x8dQ=\x04\
+\xca9\x15\xd4\xd1l$\xa8R\xef\x95o\x82\xedB\x14\
+.r\xbf\x8e\x1e\xa6 \xd4\xc5\x10qXB\xd1\x0d\xa3\
+\xa9\x80\x8a\x91\xc8\xa3\xc8`Q\x06\xd0\xb9\xca\xb2\xd5\xc6\
+)>O\x12\xf0Yktp\x9e\x00}\x001\x14\xe3\
+k\x93\xf3&\x97\x82\xfaE\x1d!IQE\xb77T\
+q\xca\xa1O\xf9r\xd7\xd8\xe1\x1bX=i\x22T\xf3\
+3\x8b\x0ej\xa3\x5c\x99;\x1ds\x5c\xfb\x9c\x02\x8d\x99\
+\xa0\xfa\xee2\xb6\x08\x8e\x1e\xca\x0e\x98\xeb\x98\xbc\x8b\xe7\
+(c\x80\xa1\xee\xb5\x0d\x1da\xdd\x94\xfc(rZN\
+\xd2\xbd\x1d]\x80\xdd\x86\xb1\xbd%\x11-\xfc\x9b\xe7\x9e\
+\xca6\xdd\x15H-*\xb8\xe4\xe4t\xd6Ek-B\
+\x98D\x0e\xd7J\xa0\x93_\x87{\x83\x12\xc1\xd8=\xee\
+G\x16\xc9\x8c\xb1W\xadG\xc1\xb6a\x9d\xb0\x9e0\xb2\
+\xce5\xf9\xdcD\xb7\x9d\xa4-\xa4\x1ef\xbd\xda\xe1)\
+\xdd\xe9\xdcLT\xbe\xd5\xf2\x9b\x0b\xd5\xa8\x86\x95;\x01\
+w2[\x85\x93\xc5\x06\xf6t0k\x91\xd8\xc1w,\
+\xe0\x8b\xca%\x1b)\xbf\xfbz>\xbe\x00\x82\x91\xd3\xfb\
+\x18\xcd\xfb \xb3\x9e?WI\x82\x8cr)1E\xc4\
+\x10\xcc#N\xe9}\xf99\x1e\xdd\xb5\xd6\xcb$\x02\xc8\
+>\x10e$J8\xb7\xf1P)ig\xd2|A\x11\
+,\xaf\xe5(\x8b\x85\xd1\x8bn\x08L\x02\xd3\xd9I\xbf\
+*3\xf1\xa0\xae\x0f\xb7\xdf\xe7\x8b\xac\xd3y\x8dg}\
+\xdeH\x9dkn\x96S\x15e\x80}dt\xc1\xcdT\
+u\x1d\xde\x1ep\x9c\xa6e\x87\xa6\xed\x84-\xec\xcb9\
+X\xf5\x92\xf6sx\x81\x9f\x81\xee0\xeb\xa2\x0e\xf1\x83\
+:\x9c#\x93\xf9\xec\xd8}T\xb3\xe8\xdc\xdeH\xe2\xc2\
+\xfc1w\xd5\x22\xae\x08P\x8b\x84-\xd3\x9c\x02\xfa\x06\
+\xfc\xac\x16E~\xa1\x14\x93|\xf6\x1aK\xfd6\x16\xb0\
+{\x17\x16\xdfZ?\x22W\xf5\xa4\xc2\x8b/e\x17\x7f\
+^\x1b\xad\x92\x18\xd5?\xe4\xff\xb6\xa4\xf3KE'*\
+t\x97\xee:\xadD|\xd9\x22\xdc\x07\xe3\x7f\x90\xe7:\
+\x9d7\xf7\xc6!\xc1x\xed\xe2{\xe6\xa8Of\xe1\xa9\
+\xec4\xbb\xb4\xf3\x0bY\xb8\xd6!\x0b\xd5Am\x88\xd6\
+ K\xd8W\x87\xe0=\xce\xaeC.\xf1\xcb:\x82y\
+\x16\x12\xe0\xda.\xdd\xe9\xb5>\xf3\xb6\x0f\x80\xf3\xa9\x18\
+j\x88\xfbk\xc7\xa9\xb5\xea\x93\x8em\x90\xab3\x03@\
+\x1b\x03-\xb7I\xbfY\x13\x01\x9da\xf4\xf3P\xce{\
+U\x8f&\xb5{}zx\x22\xd9\xf7~k\xa9\xdf6\
+y=2\xc8\xa0i\xfaY\xe8\x87\x8f\x03\xe4\x99\xf9\xe8\
+H\x22\xa4\x12\x11\xb8\x9a\x87\x1b4\x89\x93\xa2\xd5q\x00\
+x\x88\xa4_\xcf\xca\x02\xa2\xfb\xa1f\x86^\xab\xe4\xe6\
+#d\xc83\x09\x87\xbbP\x13\xeb\xf1\x9f\xa8\xe1F\x9d\
+\xaa[\xf7\xde\xeb\x07!\x94s\xee\xdc\xb5F\xda\x91O\
+\xc4\xb3\xb1\x07\x0d\x1f\xb8\xca\xa4\x80M\xc6\xe3\xe9\xe7\xd8\
+n\xd9\xb4W\x8f\xcb.\xf5\xcc\x22lE\xeb\x94:y\
+\xb8t\xcc\xaa\x91 \xbdD\xad\x96\x8d\xa1\xa7ZKY\
+\xe8\x99\xb3\x81q\xce\x13k}8\xe8\x01\x10\xa3\x95t\
+\xd9\xa4w\xd0\xd5Z\x94O%\xab\xb2\x931B\xb4Z\
+b\xaa\xf0l\x1d\x05\x1d\xe7,\xdaT\x0ax=\xbb\xb3\
+\xf1\xfd\xd1y\xc4\xa8\x9a2\x0d\xfd\x86&L\x1d\x94Z\
+C!\xd2U\x03\x0c\xab\xb9$\xd8\xa1,\xd6J\xe3\xf5\
+\xaes\x8c{\xff\xdb\xee\x13\x98d\xb3Z\xef\x1c\xa5K\
+\xcb\xe5n\x11\xa9\xbc\xd7\x175y9\x1a\xad: \xbf\
+\x8aN\xf2U\xfa\xd0\xc7\x00t\x9e\xcb-\x0f\xf5\xc3P\
+w\x93\xd8\x04\xc2`GrO\xa6@\xdbG\x9e\xbe\xf7\
+\xaau\x0b\x1b,\x8c\x98#\xd1\xb4O\xe8\xa0.\xef\xac\
+\x0f\xf1\x90\xa2\xc4e+\x0c\x83\x04\x01\x0f\x8e$\xe4\xa2\
+\x04\xa6us\x18j\xe9p\x11\xd5$\x86\x16\x14 \xae\
+\x19\xfc\x1d'\x0dz 8,!\xa5\x8f\x0d\xd0\x89\x12\
+X\xe5\xd8D\x1d\xf57/\x12\xe2\xba&O\x85\xb8Q\
+\x15d\x04\xdfu4/\xabZ\x04h\xc6\x8f\xa4\xc6F\
+'\xae\x5c\x8dZ\xea(\x0c\x99yC\x1e\xd2.\xb3\xcd\
+\xb4\x22\xee\x86\xceK\xed\x19\x88:\x078\xd3Y\x07\xbb\
+j\xbaH\xc2:\xbe\xa8\xe4xk\x19\x84\xf4\xab\x05]\
+\xb8\x8b\x16\x9e<n\x0eK\xcc H\x0f\x8c\x06rK\
+\x829u\xc5A\xe0\xae\xec\xbc\x97\x10\xb5\xd0\x07\xbe\x18\
+\x9d\x13\x80x\x92L\xb3\xf6\x85\xfd\xd1\x1f\xed8\xa4b\
+\xb4\x92\x95\xf9\xea\xbe\xe5\xba\xc3}i\x0b\xcd\xe9\x12\xe8\
+\x0cj\x02\xad0\x0b\xe3\xe2#.#\x22\x92\x846\xb4\
+2\x86\xec\x86)\x93)!e\xf7M\xef \x00\x9a:\
+\xfa\xab\x06\xe8\x1d\xf4\x05\xae\x956\xce\xa9\xae\xf2d\x91\
+k\x9f\x8a\x7fyK\xc1\x8b\x93\xb6V\x00(m\x02\xc6\
+\xb3\x99r\xeb\x106\x8f\x17\xd39\xf9\xc4\x9bt\xd4\xb1\
+\xc7'\xc0\xa25\xbb\x92\xbd\xb4/Q\xa2e\x04\xad\xd3\
+\xee(\xd1\xc1Y:\xcd\xf0,\x8c\xe4V\xed:6\x8a\
+\x0c\x8f\xc1\xf9]|=`\xbeZc\xd31\xe9R0\
+\x7f\xa8Z~\x89\xa86PmJ\xe2\xc05\xcb\x968\
+K\xc7?CbD'\xcf\x1c\x18~e\x1a\x94\xd34\
+\xcd\xbeR\xcd\xdbz\xb6>\xf3A%\xf3O\xbe[\xf9\
+\xac\xf2eUS\xe2N\x9b\xe4\x8c\xe7\x0d\xe4am\x95\
+\x98\xbaz\xd5\xf9\x92\xf8EDk\x12^2Z\xe7\xdf\
+\xfa\xae&\xa9\xf1\xabl\xc7$Z\x80\xd9\xa34\xdf\x86\
+9\xb4&\xb9 \xff\xebhh\xb75\xf4\x08\xef\x12\xfa\
+G\xa1l\xfe\x93\x86f.\xedg\x19\xd0\xef%\xb4\xf9\
+\x8d\x86^\xdf\xf7\xa4\x1f\x01M\x06\x87\xf2h\xfb\xbc\xe8\
+\x00\xe7\xa7|6[?\xfb_\xf5\xb3\xdf\xfa9<E\
+\x87\xfa\xdc\x94\xcf,W\xdf\xb3\x9c\x0e|\x8ceUU\
+\x7f>\xa0\x80\xc6\x8f\x84fF\xc1\x99\x8f\x0d\xf4=\xce\
+GAK?\xa3W$\x8ei\xc2\xbegi\x035s\
+\xb8=d\xadj\xbf\x93\xa8\x98W\xd4\x22\xa8\x17@\xe0\
+\xcf\xe0\x99\x0e\xfe\xb8\xebQ\xdf\xf3]}O\xa9\x8f\xfb\
+V}6,\x09\x09\xa0\x8aH4\xb7\x0e0B\xcb\xb3\
+\xb6\x84\xec\xce\x1b\x05\x96\x0f\xb6\xed\x87\x1b'\xa3\xf4\x07\
+@\x16\xb0S\x07\xf4\x22: \xd5\xe0\xb9:c\x0e\x83\
+\xd7\xa2!\x90\x10\xfc\xadc? \x01\xact\xa9\xc2\xff\
+Y\x9c\xc2/\xa6\x8c\xab\xbc\xa95\xab$)\xba\xbb\x03\
+\xa72R\xd4\xa9T\xba\x93\x09\xe0!@-\x8f\x84\x13\
+\x95\xed\xdd\x9bX\xbd\xb5\xf7ck\xda,\xb3\xca\x22\xbb\
+\xc1\xff\xd4\xde\x7f\x1c\x9dy\x1f\xde?\x19\x9dy\x1f\xde\
+?\x19\x9d\xf9\xdd\xe4\xfd\xe9\xe8\xcc\xef&\xefOGg\
+\xde\x87G\xc2\xd9\x0e\xe5\xeekX\xf4/|\xf7~\x1c\
+J\xbc\xec\xbdQ\xc9\x13\xde\x11\xaf^Io~t3\
+\x84\xab\xf5\xbeqJG\xda\xd2\xde=\x0c\xa4+3\x88\
+\x15\x0c:A<\xc1\xc6\x02\xd2\xe7:\xebG/\x22~\
+\xb6\x10\x139\x0e\x12\xa1S\xd8K\x9b\x7f_\xaa~\x90\
+~8\xe5\xb48sh\xcf\xfb$\x0a\xc2\x91t\xe9%\
+\x09\x8e \xa0\xb1\xa1\xd3\xf4\xc0\xc1l\x1f\x8a\x80DA\
+\xd8?\x82\xc0n\x01s(\xea\xb7U\xd1\xb0\xb4dz\
+\xd6\xbft\xe84\x1dD>\x0b\x9eK\xc18\xf5\x81>\
+*\xc5\xeeA\xcc~o\x0d\xbf\x14\x81\xfd;\x87\xbc\x80\
+T4\xe4_(\x02-\x9b+\xa0#*\xd0\x1aP`\
+\x94\x9d=\x98\x14\xed\xa9_^\xbb\x1f\x90a\xc2={\
+L\xa8%\xdd\xaf\xcbsU\x95\x10\xbc\xcaX\x87>\x04\
+I\x95HF\x8b\xef\xe4\xcc\x81\xb5`4)\x84\xe6`\
+e\xd6\xa7\xad\xa5^\x801ud\xd8\xe5^\x01!7\
+\xef\xe2\xef*&.\xb0.\xf0f2\xa6\xb1y\x97\xed\
+\xa8^\xa6\xed\x03\xe2\xc8\xfd\x82mt<\x91\x1c\xfa\xd4\
+\x02\xd1=\xe6@\x9dkE\x02\xb6\xbfs\xca8g\x0a\
+I\x13\xa3\xdf&$\xeb:\xdd\xc4A\xa7\xf0[\x8b\xe6\
+AnG\x06^z\xbb6\x0d+m\xe8\xdcz\xa9L\
+\x03\xd9\x8c\xd9\xc3K]\xd6\x875M|\xdf.\xa6\xd1\
+\x94\xe3d\xe9\xeb,\xa4\xe6CW\xe9\xa8\xd6\xd9\xafE\
+\xf6v\xcf\xd28\xf0\xae\x13\x9cA$hh\xdb\x81\x89\
+W\xb1\x9c\xc1\xdb\xfb9Lr\x8b\xbb\xf7\xec\xdd9\xbb\
+\x02%sLf%\x9b\x94\x8a\x22\xde\x85\xf5ET[\
+\xce\xa2v\xcb^:A\xec\xe7\xbfn\x08e\xf7\xde\xc6\
+\xf5jE\xe9\xfa\x8c\xaf<\x8b0j\xeb\x08\xbf\xa75\
+e\xc6#)\x9e\xf6~i\xed\xff\x8f\xe8\xff\xa5\x11\x89\
+\xb4)\xe7\x97_68\x90Z q,\xe6)\xa7\xa8\
+W>\xf5\x84\xe2\xa9\xfb\x8dM\xa7P\xb5\xf2\xa1u\x97\
+\xe3\xf3s\x1e6\xa5\xbbTi>v\x0e@\x03]\x93\
+\xbc\xf6\x85U\xfa\x0a\xa7\x00\xe2r\x86\x1e\xdc\xfa\xe0\x12\
+\xd8?\x14^\xeb\xf7\xaa\xd9\xf0\x1f+\xf0$\x0e\xed\xb1\
+\xd6\x93\x19j\xd3G\x84\x8d\x1b\x84\x8f\xb9\xea3=S\
+=\x1fk\x84\x5c+\xc0\x8e\x96\xf3\xf5\xd1!6\x8eX\
+\x94\x8f\x1c\xb45\xcdv\x93g\x1cb}\xb6\xf6$\x01\
+x\xb6\xd3Bt\xd4\x07\x8d\xc0\x8d\xb4Kt\xd0\xc1\xd6\
+\xaa\xa5\xf68\x9cu\xde\xe6\x8c\xdc\xd1\xc7J\xcd\xa1J\
+'8\xb0>\x88\x84\xc1\xa3S\x1c\x08\x14Ld\x9e\xb5\
+i\xca\xbf\xb9\xd7\xdeU\x06\x04\xebr\xc3G\xf4ZT\
+\xb2|\x0e\xc5\x84_\x0e\xc5\x00\xb6\xcd\x0alG3\xa8\
+\x1eZ\x04\xbc\x92\x0er\x97d\xb3\x04\xa2\xc0\xd6\xe93\
+\x0c6\x1d\xab\xe7t9\xe0\x0by\xd2V\xf2\xddl\xbe\
+\xbbroi\xaa\xdc\xc1\xc6p\xc8\xb8\x82c\xe6\xfc\x80\
+\xc9\x9d\xa5\xc1S\xcat\x9f\x8f':\x1f}\xb5\xd1^\
+\x87\xa0\xcf\xe1\x81_\xef1\xbai\xaf\x0e\xe8\xca\xfd\xfa\
+L\xa1\xa4\xad\x9f\xf7\xf7\xfet\xfd\xe3mj\xd0\xfcI\
+\xaf\x7f\xd5\xa9\xf9\x93^\xff\xaaS\xf3'\xbd\xfeU\xa7\
+\xe6Oz\xfd\xabN\xcd?\x99\xe0\xf7\x06\xcd?\x99\xe0\
+\xf7N\xcd?\x99\xe0\xf7{\xcc?\x99\xe0\xf7N\xcd\xdf\
+\x99`\xc8_pC\x05\xc0SENwnh\x11n\
+\xd1\xe2\x82\x16(T\x926Z\xee\xf0\x1d\x17\xf3\xdb\xc7\
+K\xe9\x9c\xa0\xf9\xbf1\x9e\xf3.%v\xe1Z\x00\x00\
+\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\
+\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe2\x0a\
+\x08\x13\x18\x16p\xf3\x10F\x00\x00\x0d<IDAT\
+x\xda\xed]mpSU\x1a~\xee\xbdI\x9a\x96\x92\
+\xb6\xd0\x16\xa1\xe0G\xa8\xa5\xd0\x96B)j\x85\x1a\xa4\
+e\xdbu\x19(\xb8\xb8;:+\xe8\x8a\xcc\x22\x83\x03\
+\xb2\xc8\xc7\xa0(\xab\xce*\xee(3\x8e2\xac?\x5c\
+\x7f8#\x22\x83\xadV+\xe5\xc3*\xa0;\xe3v\x8b\
+.\xab\xe5C\x16DJ?\xa0M\xfa\x91&9g\x7f\
+\x94\x944\xb9Innn\x92{\x93\xf3\xccd\x08\xe7\
+6\xe7\x9e\x9c\xf7=\xcf\xfb\xbc\xef\xbd9\x17```\
+````````H,p\xa1\xfe}ee\
+e>!$\x17@Z\xa8'\xe3)\x9d\xe8\xa4\xf4\x16\
+6\xed\x01\xe6\x88\xe7\x7f\x02\xf0\xb3\xd81J\xa9\x8b\x10\
+R\x7f\xf4\xe8\xd1kQu\x80e\xcb\x96\x09\x9d\x9d\x9d\
++8`\x13\x80\x5cf\xa6\xd8B?8\x98\xfd\xe9\x97\
+_\xb6G\xc5\x01,\x16K\xba\x8e\xe3\xde\x07\xcf/`\
+S\xaf\x0eP\xe0;\xc3\xe0\xe0|%\x9c\x80\x0b\xb2\xf2\
+\x0d]\xed\xed\x07\xc1\xf3\xe5\x00`\x1bm\xc6\xa5\x89\xbf\
+\x86\xcd4\x19.\xc1\x18\xd2\x89\x0c\x03\x9d(\xfev\x1b\
+\x00\xa0\xa2\xa2\x02K\x97.U\xc3D\x02\x94zR\xec\
+p\x1b\xbd\xde\xee\xfe\xf7\xf5]\xbbp\xee\xec\xd9\xb0\xcf\
+\xb9~\xfdzdfe\xf9\xb4\xd7\xd6\xd6\xe2\xf8\xb1c\
+\x00\x80\xe6Y/\xc0\x91\x94124\x90A\xcc\xfc\xe6\
+\xcf\xe0\x89CQ'\xd0\x05:\xd8\xd9\xd9\xb9\x99\xbbn\
+\xfc\xf3\xe6\xdf\xe1L\xfeJ\xd0\x90e\xc3\x10\x8c}\x97\
+\x87\xdf\xdf\x9e\x97\x87\xbc)Sb\xef\x00^\x86\x1e6\
+\xbe\x87\x13\xb8\xdf\x1b\x8dFE\xce9q\xd2$L\xc8\
+\xc9\xf1i7O\x9e<\xec\x00\xb6\xb4\xc9\xb0\x1b}\x9d\
+\xe4\xe8\xafjQ\xf4\xedvd^9\x01\x0e(\x1c4\
+\x18\x0eU\xcf\x9d\x1b\x96\x13\xf0\xfe\x0eTWW\x9b(\
+!\x1b\x01\xa03k6NO\x91o|U\xd2\xa8\xdb\
+\xb8\x1e\xab\xdc\x9f\xf1\xa9J\xc6Lx=N\x96lG\
+G\xf6]n\xfa.\xb4\xeb\xf5\x8d\xd5s\xe7f)\xee\
+\x00v\xbb\xfd7<\xcf\xa7\xb8W?\xb8\xf82>D\
+\xa8\xde\x9b\xfe=\x1d\x02*u\x02\x9e\xe3\x8a\xc2q\x02\
+\xbf\x0e\xc0q\x5c\x91\xfb}\xf7\x98\x82!\xb5\x10\xeeK\
+E\xc6\xa7\x22q\x1e^\xac\x103\x06\x082\x8fD\xd0\
+\xe3\xe4,e\x9c\xc0\xbf\x03P\x9a\x05\x00DH\x02\xe1\
+\x0dq\xb5\xf2\xc5\xe8?\x18\x03P\x95}\x17\xc2\x8b;\
+\x81\xc5b\xc9T\xc4\x01\xdck6^\xe2\xbe\xe8j\xf7\
+'\x00\xfd\x88Bh\xc0\x09x\x9e?\x14\x8a\x13\xf0\x09\
+\x917{\x19?d\x01\xa8B\xe3{;Ag\xf6\x9d\
+\xb2\x9c@\x9a\x03p\xd0\xbc\x06\x08D\xf5\xa2\xf1>\xd6\
+\xf4\x1f\xc2\xbc\x12A\x8f\x96\xd2\xe7F8\x81\x8e\xe3$\
+\x85\x03>\x11V\x7fHbOc\x0c\xe0\xc9\x04\x9eN\
+\x00\x9e\x9f.\xc5\x09\xf8\xb87\xbe\x0c\xb1GU.\x00\
+\x03;\xc1v\x1f'\xa8\xa8\xa8\x18\x9bp\x0e\x10\x96\xd8\
+\xf3v\x08J5\xf3\xbd\x09o\xf0q\x02J\xe9\xd3\x09\
+\xa5\x01\xc2\x11{b\x0c\xa0\xe6\xf8/\xae\x09\x0ch\x99\
+\xbd\xdd3\xa57%\x0c\x03\x84+\xf6\xa8\xc6\x19\xc0\x93\
+\x09\x08\xafO\xac4P)\xb1'f|\x8a\xf8\x84N\
+2%)Ak1f\x00)b\xcf\x9b\x01\x10\x0b\x06\
+\x88b\xc8\xe4\xe3i\xf5\x87\xca\x00\xfe\xa8^\x94\xfei\
+|r\x00\x1f7\xc6\x0f\xc2\x00R\xc5\x9e'\x03\xd0X\
+1\x00s\x00\xe5\xd3=\xc8`\x80x7\xbe\xe65@\
+X\xe9\x9e?\xe3\xab\x81\x01\x98\x06\x88B\xba\x17\x84\xfe\
+\x13\x85\x01x\xad\x1b?(\xfd\xfbK\xf7B\x10\x80\xf1\
+\xec\x04\x9a\x0b\x01T\x09\xfa\x97!\x00\xa3\xea\x02,\x04\
+\x04\x5c\xfe\x11\xad\xf6\x89\xd1?\xcb\x024\x9c\xeb\x87T\
+\xed\x0b\xc0\x00\x02\xaf\xccT\x09:\x9d\xaa\xe6T\xa7)\
+\xe3K\x10\x80\xe1V\xfb\xfc\xc5\xfe\x9a%K0h\xb7\
+\xc3\xe9t\xca\xfe\x0e\xd3\x0a\x0a\x90\x9d\x9d\xcd4@\xa4\
+r}E\xc4\x9e\x1f\xda/..Fqq1\xd3\x00\
+1O\xf7\xa2 \xf6\xe2=\xf5\xd3\x8c\x03\x84z'\xaf\
+\x12b/\x91\x8c\xafj\x07P\xeaN^\xd5V\xfb\x12\
+N\x03(A\xffa2@0\xb1\x17S'\xf0<w\
+<j\x00\x97>e\xf8\xbd\xcdfSE\xba\xa7\xa6\x5c\
+\xdff\xb5z\xcc\xd5\xa8\xf8\x0b\x01\x0e\x83\x09\xd6\xf4\xa1\
+\xcdE>oh@OO\x8f*\xd3\xbdX\xc0\xda\xd3\
+\x83\xa6\xa6&\x00@OF>\x9c\xba\x94\xf8\x0c\x01g\
+\x0b\x1eA\xf1W[\xd1\xd6\xd6\x86\x95\x8f=\x86\xf2\xf2\
+r\xa4\xa6\xa6\xfa\xa6{\xde\xef\xbd(\xd2\xdf1\x9f\xf7\
+\x81\x8e\xa9\xe4V\xaf\xbe\xde^\x9c8q\x02\xdd\xdd\xdd\
+\x00\x803\x05\x8fD5\xe4F\xb5\x10\xd4q\xd3]8\
+]\xb8\x12\xb9\xdf\xedAWW\x17\x0e\x1c8\x00\x86\x1b\
+h\x9d\xfe't\x8d+U\xa1\x08T\x10\xe7\xa7\xfc\x1e\
+\xd6\x8c<\xdcv\xea\x1fH\xeb\xfc\x1e\x1c%\x09mt\
+\xca\xf1\xb8\x96Y\x84s\xf9\x7f\xc0\xd5\xec\x99*\xcd\x02\
+\x14FWv\x09\xba\xb2K\xc0\x11\xe7\xf0\x9e7\x89\x0a\
+\x22\x18@9!1\xd3@*\xe8\xe0\x12t``\x85\
+ \x06\xe6\x00\x0c\xcc\x01\x18T\xa8\x01T\xb4\xc1\x13\x03\
+c\x00\x06\xe6\x00\x0cq\x93\x0620\x06``\x0e\xc0\
+\xc0\x1c\x80\x81i\x00\x06\xc6\x00\x0c\xcc\x01\x18\x98\x030\
+0\x0d\xc0\xa06\x07\x90\x81\x14\xebE$\xf7\xfe\xc2f\
+X\x01\xf4\xa7N@_j\x8ev\x1c \xd9v\x09w\
+\xd5\xff\x11\x1cq2\xeb)\x00\xc2\xebp|\xe1\xbb\x18\
+HQ\xfe\x87\xa5\x11\xd9*\xd6\xd8\xdf\xce\x8c\xaf\xa4\x91\
+\x88\x13i\x1d\xdfEdk\xde\x88\xdf\x8f\xb5x\xf1b\
+\xdc=g\x0e\xb3\xa2\x0c4}\xf1\x05\xea\xea\xea\x00\x00\
+\xf6Q\x91\xf9Yy\xc4\x1d`fI\x09JJJ\x98\
+5e\xc0f\xb3\x0d;\x00K\x03\x194\x94\x06\xb2\xb4\
+12\xe0\x18\x0300\x07`\xd0\x5c\x08H\xd4\xcd\x17\
+\x14\xa7\x7f\x16\x02\x184\x97\x06\x06\xdbw\xe7\xd4\xa9S\
+8s\xe6LBN~nn.\xf2\xf3\xf3\x03\xce\x9d\
+\xe6\x1d \x10\xbelj\xc2\x8e\x1d;\x12z\x05n\x7f\
+\xee9\x94\x95\x95\xa9\x5c\x04F\xe8\xe9`_\x7f\xfdu\
+\xc2S\xb0\xe49\x88\xd0S\xda\x22\xae\x01\xdc!@\xec\
+5\xab\xb44\xe1\x1d\xa0\xb4\xb44\xe0\x1c\xc5u\x08\xb0\
+X,\x18\x93\x91\x81\xd3\x09\xaa\x01\xf2\xf2\xf2PPP\
+\x10\xdf\x220\x98\x98),*\xc2\xccY\xb3\xa4ut\
+\xef\xbd\xa0f3hI\x09hQ\x11\xc8\xcc\x99@R\
+\x92\xdf?\xd7\x1b\x0c\xfe\xfbJM\x05,\x16\xd0\xdc\x5c\
+\xd0\x82\x02\xd0Y\xb3@\xf2\xf2\x02\xf6'\xb9o\x09 \
+\xf5\xf5pM\x9b\x16\xf3\x14Y[\xa5\xe0\xc3\x87\xc1\x1d\
+>\x0c\xee\xed\xb7\x01\x00BY\x19\x5c\xcf?\x0fr\xcf\
+=\x00\x17\xe2Im6\xe0\xe3\x8fG\x84K\xa1\xaa\x0a\
+\xae\xcd\x9bA\xee\xbc\x13\x10\x04u\xd1\x85V\xeb\x00T\
+\xc2K6\x8e\x1f\x87\xb0`\x01\x84\xdd\xbbA\x09\x09\xbf\
+\xdf\xcf>\x830o\x1et;w\x82\xda\xed\x91\x19s\
+\x08\xf3\x12\x0dn\x88|!\xc8\xbd)c\xa0W\xb8_\
+b\xedZ\x08\x1f}\xa4X\xbf\xdc\xb6m\xd0o\xdd\x0a\
+\x0c\x0cDl\xcc\xd1\x9a\x1b\xcd\x86\x00\xe7\xf7\xdf\x83\x1a\
+\x8d#\xbb\x1d\x18\x00w\xfe<\x847\xdf\x04jkG\
+\x1c\x13\x9ex\x02\xa4\xac\x0c4\xc8~\xfc\x9e\xfdr}\
+}\xe0\xda\xda\xc074\x80{\xf9\xe5\x91\xe7\xda\xb5\x0b\
+\xba\xbc<8W\xae\x0ck\xcc~\x91\x96&/\x0ch\
+M\x04\x06Kg\xfa\xfa\xfa &\xa7\xce;\x1cpy\
+\xc7aA\x00\xccf\xe8\x9f}\x167\xf7\xf6B8t\
+\xe8\xc6\xb1\xf6v\xf4\xef\xdd\x8b\xcb\xf7\xddwCe\x07\
+\xebW\xaf\x07&N\x04\x1e}\x14\x19\xa5\xa5\xc8z\xfc\
+q\xe0\xda\xb5\x1b\xcc\xb2f\x0d\xae\xe6\xe4\xa0{\xeaT\
+_\x05/u\xcc\xfe\xd0\xd1\x81lA@rr\xb2,\
+\xf1\x1c\x17i`kk+\xb6n\xd9\x02\xb1\xed\x22\xff\
+\xfa\xe4\x938\x1b`2\xd7_\xbd\x8a\xfb\xbc\x17\xc8\x0b\
+/`\xb5\xc7\x1d4\x07C\xec\xf7\xe9[o\xc5\x82\xe6\
+\xe6\x11mI\xabVama!\xbc\xefp<(c\
+\xcc\xde\x18=z4^|\xe9%\x98\xcd\xe6\x98\xd9 \
+*\x17\x83\xfc\x09\x9c\xfaO>Aoo\xaf\xac>\xbf\
+\xf0\xd8bv8\xb3\xeb\xeaB8\xc9\xd9\xeb\x19\x19\xe8\
+\xc9\xcc\x1c\xd1\x96~\xe5\x0a~+s\x8c\xc1`\xb5Z\
+Q__\x1f3\x01(\xdd\x01\xc2-C\xfa\x118\xe3\
+'L\x90=\xf0\xff\x89\xac4\x8eR\xa4\x13\xf9;\x8f\
+\x0ep\x1c\xfe=~\xbcO\xfb\xf4 \xbb\x9b\x87\x83\x9c\
+\x9c\x1ci\x020B\xa5\xe0\x98\x86\x80\x9a\x9a\x1a\x10B\
+\x00\xcfX~\x1d\xf9ee\xb8I\xaf\xf7\xfb\xd9)V\
++p\xe4\xc8\x886\xd7\xd8\xb1\xc8-/G\xae\xbbA\
+F\xbf\x9d]]\xc0\xc9\x93#\xdarG\x8f\xf6\xbd\xb3\
+YF\xdf>:\xe2\xf6\xdb\xb1p\xe1\xc2\xf8\xae\x04\x06\
+\xa23A\xa7\xc3\xb2\x07\x1e\x00\x96/\xf79\xb6z\xe3\
+F\xd0\x00\x02\xc9\xf0\xd6[\xbe\x0c\xb0z56o\xd9\
+r\xa3A\xe4Jc\xb0~9\xab\x15x\xe3\x8d\x11m\
+\x19&\xd3\xc8~e\xf6\x1dh\x8eBi\xd7\x96\x08\x94\
+\x9b\xcf\x8a}\xce\xe1\x00\xdf\xde\x0e]C\x03\x84u\xeb\
+|>\xe2\x9a7/\xf8\xb9\x82\x8c\x87\x8a\x94\x82\xb9c\
+\xc7\x00B\x82V\x1b\x8dc\xc6HK\x17\xeb\xea\xe0\x98\
+?_\xda\x1ch\xb2\x0e \x91\x01\x02N\xe6\xd8\xb1\xa1\
+\x9d\xe7\xa1\x87\xe0\x98=;\xfc\xf1\x88Q\xb8\xcd\x06\xd8\
+\xed\xd2s|\x85\xe6\x84\x8ai\x80\x84a\x80PP^\
+\x0e\xfb\x8e\x1dCu\x820\x19 j\xdfCJ_Q\
+`\x00m_\x0b\x00@\xd6\xadC\xff\xbb\xef\xc25n\
+\x9c\xa4~\x83\x8eep\xd0\xf7C\xa9\xa9 IIQ\
+\xbf\x16\xa0\x1e\x11\xa8\xb2\x1f\x86\xd0\xcaJ\x90\xeaj8\
+\xe7\xcd\x83s\xca\x14\x80W\xd0\x8f\x07\x06|\xcfw\xf7\
+\xdd\x92\xae6\x0e\xb4\xb4\x00\x12\xc2\x041\x99B\x1fW\
+<\x86\x80k\xd7\xae\xe1\xd5\x9d;\xf17\x91c\xef\xcc\
+\x9f\x0f\x9bG\xaeO\x01\xf4\xf1<\xba\x04\x01\xadz=\
+HS\x13p\xfdAK\xfe\xb0_\xa4m\xd3\x8a\x15\xb8\
+\x10\xa0Z\xb7\xc4j\xc5\xc3^m\x1d\xad\xadx\xfc\xc1\
+\x07\x83\xf6\xbdq\xcb\x96\x80}{c\xf2\xe4\xc9x\xea\
+\xa9\xa7`\x92s]@3\x0e\x10\x80\xce\xf6\xed\xdb\x87\
+\x96\x96\x16\xd1c_\xb9\x5c8\xeb#\xf3]\x80\xc3!\
+\xbaJ%/p\xab\x15\xd6\x00F\x9a\xda\xd6\xe6\xd3v\
+.%\x05V\x8f\xc7\xba\xc9\xed\xdb\x1b\xcd\xcd\xcd\xf8p\
+\xff~,_\xb1\x22\x8e\xd3\xc0\x00bFm?!\xcc\
+\xa2\x14\x85\x17.\xf8\xb4\x9f\x14);+\x05\x8e\xe3\xfc\
+\x8b\xbdx\xb8\x1c\x1cH\xd0,\xbd\xff~\x5c\xb8xQ\
+\xb4\xaa\x96\x92\x9e\x8e\xf4\x08\xdc\x95\x13\xa8\xdf\x0d\x17/\
+\x22\xd9\xeby\x86\xdd\x93&\xa1!'\x07\xe9a\xf6-\
+\x1a\x02rsQ\xb3d\x89\xf4BP\x04\xb4XLK\
+\xc1\xa6\xb44l{\xe6\x19\xe0\x95W|\x8e\xfde\xcf\
+\x1eYU\xb5\x11\xf8\xf0Ci\xfd\x12\x82\xa4#G`\
+X\xbc\xd8\xe7\xef\x93\xde{\x0f\x7f\x17{l\xbc\xd4\xbe\
+U\x8e\x98\xdf\x0f\xa0\xf4\xe7\x82\xe6\xbd?\xff<T\xd0\
+\xa1\x14|\x7f?\xf8K\x97\xa0\xaf\xab\x03\xbf{\xb7\xcf\
+\xdf:_}\x15\x83\xd3\xa7K\xa6b\xc5\xc7\x1c\xef\xf7\
+\x03\xc4\x02)3\xa5=\x9b\x8f\xacZ\x85\xfe\x87\x1f\x8e\
+\xfb\xf9\x88|\x1d@-\x95\xb7\x10\xe0\xda\xb6\x0d}k\
+\xd6\x80\x1a\x0c\xa1\x8d!\x92c\xd6l\x1d@f:\x13\
+\xcdj\xd8\xf09++a\xdf\xb0\x01\xf6;\xee\x90u\
+[\xb8\xd2c\x8e\x9f4P\x8d\x185\x0at\xce\x1cP\
+\xb3\x19\xae\xa2\x228g\xcc\x80#/oh\xd5'\x10\
+\xa2s5\xd0\x0f-:\x9dN\xec\xfb\xe0\x03\xfc\xb4i\
+\x93\xef\xc1\xd7^\x0b\xff\xdb\x89\xf5+\x86\x0b\x17\x86^\
+\xe1\xf6\x1d\xe2\x98\xcdf3\x96,]\x0a\x9dN\xe7W\
+T\xc6E\x08\xf0\x87\xda\x03\x07\xb0\xf7\xfd\xf7\x13\x96\x84\
+\xfe\xf9\xcd7H2\x1a\xb1h\xd1\xa2\xf8M\x03\x03\x09\
+\xa3\xb6+W\x90\xe8h\xbb|9\xa6\x95\xc0\x98^\x0e\
+\xae\xaa\xaaBj\x04\xcb\xacj\x87\xc9dBUUU\
+\xe2^\x0e\xbe\xf5\xb6\xdb\xb0{\xcf\x1et\xb4\xb7'\xa4\
+\x03dfe\xc1 Utj\xf9rp\xa0\xea\x98^\
+\xaf\x0f\xeb\xf6p\xad#\xd0\xdc\xc4\xc7\x8fC\x19\x120\
+\x0d\xe4\xa4\xa5\x81\x0c!\xb2\x03\xdb'\x90\x819\x00C\
+\xd4B\x80\x13\xc0\xd0\x93?(\x0d}\x0b\x16\x0f\x1ac\
+!@\xbe\x80\x96\x0b\x0e\x14\x9c\xcb\xe9\xee\xc7\x112\x03\
+P\x8e;\x07\x0c=\xae\xc4\xd8\xdb\x16\xb1\xbd\x02\x19B\
+\xd0U!\xbc\x92\xbb/\x82\xbb\x9eGP\x9e?#'\
+\x04\xd4\xbb\xdf\x8c\xff\xf1sf\x00\x8da\xfc\x8f\x0d7\
+h\xde\xe5\xfa4d\x078t\xe8P\x0b\x05\x1a\x01\xe0\
+\x96\xe6\xf70\xba\xe34\x9bU\x8d\xc0\xd4\xfe\x03nn\
+\xd9\xeb\xfe\xef'\x0dG\x8f\xfeW\x96\x08\xa4\x94>A\
+\x08\xe9\x15\x9cv\x94\xd4\xae\xc7\xf8\x1f>\x05\xcf\x9e\x06\
+\xa6^EO\x9c\xc89\xf51J\xea6\x80w9\x00\
+\xc0J(]\x1bV\x86_QQQ\x0dJ\xf7\x030\
+\x02\x80S\x9f\x02\xdbX3\x88\xde\x08\xea\xe7\xe3z\xbb\
+\x15\xa6+7\x9cn\xfa\x8c\x19\xcc:2\xd0\xe2\xb1]\
+M\xcf\xb8\xa9p\x18R\xfd\x0a>\xc1\xd1\x8f\xd4\xaes\
+\x10\x06\xfb\xdc\xcd\xfd\xe0\xb8E\x8d\x8d\x8d\x07\xc3r\x00\
+\x00\xa8\xb4XJ)\xc7\xbd\x03\x9e\x9f\xc6\xcc\xa2~\x10\
+JO\xf2<\xbf\xbc\xb1\xb1\xf1_R\xb4\xa5$X,\
+\x16\x9d \x085\x94\xd2\x1a\x00\xd3x\x8eK\xf1;\x00\
+B8\x9e\xe7'PJ\x0d\xcc\x1c\x0a$\x00\x1cg'\
+\x84\xfc\xc2\xf3\xbc\xff\xbc\x90\x90^p\xdc\x7f8`\x7f\
+Ff\xe6\x81\xbd{\xf7\xba\xd8\xcc100000\
+00000\xf8\xe2\xff2\xa9\xd3\x14\x00:\xf0\xed\
+\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x05|\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x05\x0eIDATX\xc3\xb5\
+W\xddo\x15U\x10\xa7\xb4Z\xa8BH%\x144\x90\
+\xc2\x036\xbeT\x1e\x0c\x0f\x045\x10\xfd\x1b\xca\x9f\xe0\
+\x93\x89O\x05\x0d\xb9\x8d\x18\x13\xa2\x0d\x81\x04\x131\x9a\
+\xf2Fb\x80hSm)\x94~r\xa5\xbd\xb7\xbd\xbd\
+\xdb\xfb\xd5\xf6~\xb5\xb7\xb4@k\x8b\xf8\xd2\xdb=\xe3\
+o\xce\xce\xd2u\xdd\xdd\x16\xc5\x87_\xe6\xec\x9c\x999\
+\xbf=gv\xe6\xec\x16\x22\xda\xb2\x11\xde?\x15\xaa\x00\
+\xb6\x0a*\x03`\xdbTl&.c}\x91\xa6P3\
+0\xe2\x83\x88\x0f\xb2\x01s~\xb1\x9a\xfd\x08\x8c\x0c\xcd\
+\x12u$LjO\xac\xd1\xf9\x1e\xa2\xee)\xeb\xf9\x8b\
+.\x93nO\x13\xf5\x15\x88\xbe\xec&\xfa5\xa5\xe8g\
+\xa3L\x1f]\x8e\xd1\xadI\xd8\xa4Lj\xe90\x9f\xe9\
+\xcfu\xb1\x8d\xa9}9\x0e\xfb\xfed\xac\xd2\xe5\xfb&\
+\xf1:\xbe\x04\x06A\xa0+C\xd4\x9b'\xea\xcc(\xba\
+\x9b\x83c|U\xcb\x0e\x90\xea\xc9\x12\x16X\xd56\x8c\
+\xd6\x1f\xc7\xb5]\xf7\x94\xa9\xc9\xde\xc1|gZQ\xfb\
+D\x99:\x92\x96\x8e\xc1\xb6\xfc\xcc\xf1\x83\x084\xfbl\
+y\x14\x18\x05\xc6\x041`\x5cPp\x8cc\x0e\x9bQ\
+\xf1\xf3:\x12\xef#p%[\x15\xf02P\x03\xec\x04\
+j\x81:`?p\x088\x0c4\x00\x1f\x8b<,\xfa\
+\xfdbW+~5\x12\xa7\xca/9\xbd\x16\xaf\x04\xcb\
+O\xe5\x0d\x9co\xcfo\x19\x07\x0c`B0\xeb\x18\x1b\
+2?\xee\xda\x85\xa8\x8e\xb7\xfe\x95TlD\xa0\x8a\xb7\
+\xacm\x8c\xa8\x07\xe7w\x1b\xe7{\xa1\xd7\x1aw\xa6\xca\
+t\xa9\x1f\xe7\x8as\xbf\x95^\xa3O\xae\x8cS\xcf\xb4\
+5wQ\xebM\xeaL\x96\xe9\xab;J\xeb{\x91\x13\
+mc\x8a\xf4\x11\xf8\xec\x82\x17\x81\x97\x98ud\x9e\x03\
++\xea\xcb\x89\xcc*\xea\xcf\xf1\x22k4PPZw\
+\xe9F\x9c\xeeN+\xadc;=\x9f.\xeb\xe7\xc1\x02\
+\xfb\xad\x11\xc7\xd1\xbb\xc0q\xfd\x08\xfcm\xfb\xf9\xcc\x9a\
+B\x9f9\xb6\xdeN:{\xeb\x93@JPr\x8c\x93\
+\x8e\xa3p&\xe5\xa8\x8eg\x11\xf8\xc71x\x138\x15\
+\xda.I\xb4\x1bxC\x12\xec-\xe0\x08p\x148\x0e\
+\xbc\x07\x84D\x1e\x17\xfd\x11\xb1;$~\xbb%\xcev\
+\x89\x1b@\xa0)t\xda\xe7\xd3\xb3\x93\x8f\xdf.\xe1\xd8\
+\x8140'\xd2\xde\x81\x84\xd8y%\xa3\x1d\xfb\xb4\x1f\
+\x81\x91\x91\x92I\xf7Q,\x06\xb2&]\x8d\x10\x8d\xcc\
+\x11\xdd\xcb\x9b\xf4\xfd=k\x1c.*\xfav\xd0\xd4\xba\
+\xe8\x03\xa2\xb3W\x0d\xea\xcf\xae\xd1p\x89\xb4M\xb8H\
+\xda\xff\x0alX\x1fF\x1e|7\xa4\xf4|\xb8h\xd2\
+\xcd\x94U\x88\xfc\x08D\x92\x8bX0gj\xb0\xd3\x10\
+K\x04\xd4\x01\x90x<\x0e\xe7\x95\x1e\xc7\x16\x88\xbe\xb9\
+\x19\xd3s\xb6-\xeb\x07\xb0p\xdf\xd4\xaa\xb6\x1b\x9eU\
+\xf4[\xd1\x8a\xc9s\xc6c\xb2\xbf\x88u\x02r\xfeL\
+\xe0\x8cc\xfb\xa3\x1e\x09\xe8\xde\xfe\x8c\x1cA\xc6\xe3\x18\
+\xdc\x89\x18u\x1c\xc3\x19{Mw\x12VJ\xa6r\xc2\
+\xec\x00^\x03\xf6\x01\x07\xa5\xda\xbd-\x89\xf6.p\x12\
+\xf8\x108'\xf2\xa4\xe8\x8f\x8a]\x83\xf8\xed\x938;\
+$\xae\xfd%x~\x05\xfe\x04\x9aB\xad\xae\x1d\xc8\xb8\
+v \xe3\xda\x81\xd6\x17M\xc0H=V\x14GQi\
+O\x10\x8d\x95\x14E\x91\xb0\xe7\xaf\x19\x18\x9b\x94xD\
+t#\xa6h\x14\xe3\xc9%}\xce\xc6\x0b'PxB\
+\x14\x9d)S\x0c\x8bL \x01\x19m\xbf\x18\x94x\xa8\
+0\xb6\xc8%Ad\xfa\xf7\xff\x87@\xebs&\xe1\xd7\
+\xff\x95\xc0\xab\xd2R\xf7\x02\xf5\xc0\x9b@\xa3\xa3\x0a\x9e\
+\x00>\x00>\x17y\xc2Q\x0d\x1b\xc5\xbe^\xfck%\
+\xde\xa6\x08p\xc7\xda\xa6\x1d\x9aB-\x01} h\x07\
+\xdc\xfd\xa0E\x08l\x93\xf8\x95A\xbd\xc0&\xf0\x0a\x97\
+\xd0\x99?\x88r8\xd3>\xb4\xd6)\x14\x91\xd4<\xae\
+eh\xc5\xe9\x87&e\x1e\xa1\x1b^\x8fSz\xc1\xd4\
+s\xbdh\xc9i\xe4C~\x19]p\xd2\xb2g\x7f]\
+\x8a9\xde:\x81\xad\x1b\x11\xa8\xd67\x198\x16W\x14\
+\x02)\xca-\x91\x96\x8cI,\x9c]\xb4\xe4\xb5n\x83\
+2 \xc3\xf3\xd9E\xd2\xc4XZv&\x15V\x94M\
+\xa0F\xe2Vm\xb6\x1b2\x81\x90\xa3\x1a\xc6}\xaa\xe1\
+\x9cO\x15\x8c;\xaa`\xc8q5\xf3\xee\x86B\xc2\xab\
+\x1ds\x06\xbf.\x09\xd5 \x09\xf6\x0epL\x92\xee\xac\
+\xc8c\xa2o\x14\xbbz\xf9\x02j\xbd\xda\xb1\xdf\xad\xd8\
+\xdd\x8e\xed\x96\x1c\x0bh\xc9\xa5\x80V\x1cs\xdd\x0b\x9f\
+\xb5c\xdf\xff\x82\x85?\x89J(8E$\xde0\xba\
+\xd7\xec\x0a\x12i\x19U\x0f]\xb0\x08YXRZ?\
+\xb3l=\xff\xd01\xa1uE<\xb3M~\xc9\xd4\xfe\
+at?\xdb>2\xb3\xae7\x16\x82\xff\x0b4\x01k\
+Q&\x81\xc0\x08\x90_\x84\xf3\x8a\xd2D8H\xe9\x89\
+\xa2\x07O!aw\xbdg\xc2\xb2\x03\xf8\xd9\x1a\x9bz\
+\xcc\xb6\x1c\x87\xe3\xcd.[\xe3\xf9\xa7\xcf\xffc\x12\xf5\
+\xb8\x1b\xda\x09\xc9(:\xc6q\x8f\xbb`\xf4\xdf\xfe\x98\
+\xd8U\xb1Z\xbea;!\xeb\xe4\xaew@\x12\xed\xa0\
+\xc8\x03\xa2\xaf\x13\xbb\x9d\xe2W\xedw\x19\xf5$\x10@\
+\xa2F\xea\xf9.Y`\x8f,\xb6W\xe4\x1e\xd1\xef\x12\
+\xbb\x9a\xcd,\xce\xf8\x0b\x15\x86\xe3\xed\xf2\xf3H\xec\x00\
+\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x08'\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x07\xeeIDATX\xc3\xa5W\xdbo\x1cg\
+\x15?\xdf73;\xbb\xf6\xde\xf1\xae\xd7ML\xec\xc4\
+\xbd\xd8\xc6M/i\xac\x06\xa9\xa1ie\x1aU \xa1\
+\x08\x81\x84\x90Z\xfe\x86>\xf5\x91\x8a\x17\xf2\xc8\x1bT\
+\x15/Q*\x11\xc2%\xbc$\xa0*B}\x08\x22\x02\
+)P\xb5j\x9c\xaeo*\x8e\xd7\x97\xb5\xd7{\x9d\xcb\
+\xd7\xdf93\xeb&$\xb5p\x98\xf5\xfa\x9b\xf9v\xe6\
+;\xe7\xfc\xce\xef\xfc\xce7\x8a\xf69\xe6\xe6\xe6f\xdf\
+y\xe7\xa7?\xaf\xd5\xd6\x15\x0e\xa3\x14\xcf\xca?\xd2\xf8\
+\xf0\x1f_\xaax\xce\xec\xfd\x8ascT\xa5R\xd1\x17\
+.\x5cx\xf7\xfc\xf9\xf3\xbf\xfe*\x1b\xf6~\x0e\xb8\xae\
+[\x9a\x99y\xfa\xa5 \x08(\x0cC\xd2Z\x13\x1c\x89\
+F\xa3\xc8hCZi\x18\xe39\x18\x8f\x1d\xe4{\xe0\
+\x00Y\x96E\xd9l\xf6\xaf\xfb\xd9\xd8\xd7\x01,\xd2\xee\
+v\xbb\xb4\xb1\xb1!\x0b\xf6\x1d`\x83*6\xae0o\
+0\xafy\xc4\xb5\xd6\x91q\xad\x0c}m\xa8L\xedv\
+\xbb\xb9\x9f\x0d\xbd\x1f\x00/\x9c\x98}\xd3\xb2-\xb2m\
+\x1b\x0b[\x12\xa5FT\x96\xa5\xc8\xd2\x98\xe3h\xf9\x9a\
+\x1d\xc3\x88[1*\x89\xdc\xe0w\x1b\x13\xcf<\xf3\xec\
+\xf7*\x95\xb1\xb1\x03;066\x96\xaa\x8c\x8c|\xdb\
+\x84\x8cD\x18\xc1\x1b\xe2\xf6\xd0\xc8\xef!>\xca\x8ao\
+\x8e\xb0\xa7\x80,\xfe\x17M!e\xdd\xaeG\x13\x13O\
+<?>>r\xe4\xc0\x0e\xec\xec\xec\x84\xadV\xbb\x19\
+\xe5\xde\x12X\xe5n\xbdG3\xfc\xc5\x8f\x07\x91U\x8b\
+\xad\xf7\x9d\x12\x94\x88vww\x03\xcf3\xfe\xa3\xa4\x00\
+\x068\x9f\xc1}Qrd{U\xd0?,+v\xc9\
+bhb\xa74\x85x&\xba\xdd\x7f\x14\x0e\x14\xc9G\
+d\x129\x1b\xe7(1\x06\xf7\xdc\x11\xf4\xaf\x8c\xf9\x12\
+\x95\xfe\xc2V \xe9\x0aC\x9f\x94\xaf\xcc\x81\x1d\xd8\xdc\
+\x9co`\xc1^\x88E$\xfd\x80\xd4\xc0\x099\x17$\
+\xe8\xcbh\xef/\x9dh\x08\xac>ha\xcf\xf4\xb6\xf7\
+-\xc3\x81\x81\x81\xc7\x86\x86\x86\xa6\xfbK\xa2\xd4\xc2\x91\
+\x91\x91t\x22a\x0f\x16\x0a\x05\xc2o\xf4\xa8G6\x9b\
+\xd3\x85\xc2\xd0\xb7\x8e\x1d;VFu\xe8(c\x96F\
+y./,,|\x22>\x9e<y\xf2gG\x8f\x1e\
+}\x1b\x82\x13\xa0t\x8cm;\x1c\x88\xbe~\xfd\xba~\
+j\xf2ID\xab\xc8g2Z&\xe6E\xac\x01\xd0\x02\
+\xf6X3\x19\xd5\xbd D8%\x12\x09\xaaV\x97\xe9\
+\xc9\xa7&L\xb9T\xf2q(FQ\xa3\xae\xb7\xb7\xb7\
+\xff|\xe9\xd2\xa5\xd7\x04\x81\xd1C\xa3O\xa7\xd3i\xea\
+\xf5zd'\x5cU\xc8eEJWV\x96\x89\xbf\xff\
+\xef1>>\xaa\x86\x87\x87\xf5\xca\xd2\x12\xf5\xc0\x09\xdd\
+\x0b)\x9f\xcfOe2\x99\xa2\x0dx3/\xbd|z\
+\xf2\xf5\xb3g)\xe1\xba\x1a\xd2I\xb9\x5c\x8e\x96\x97\x97\
+Y\xc5\xe8\xf8\xf1\x19J&\x078M\x94J\xa5X\x9e\
+\xc9\xc5\xe8XV,\xcb\xcct#R\x8d\x08%\x08~\
+\xae\xdd\xee@\x07:t\xeb\xd6\xbf\xe8\xec\xd9\xd7\xcc\x99\
+3g\x94\xe7yT\xaf\xd7\xc1\xafM\x9a\x9f\x9f/\x7f\
+\xf8\xe1\xdf\x1e\xb7\xf1`~\xbd\xb66\xf4\x9bK\xbf\xa5\
+\xd4@Je\x06\x07izj\x8a>\xfa\xf4S\xfa\xe0\
+\x83\xbf\x00\xc2\x05@\xe9\x90\x035\xb4\x00i\x82\x15\xd0\
+\xd6{\xb2\xacD\x0fC\x0a\x90\x16\xdfgG<\x8c\x01\
+y^G\x9c\xbau\xeb\xdft\xe8\xd0cjvvV\
+U\xabU\xeatz(\xa8\x0e\xa5\x06\x07\x1d\xa5\xfc\x8a\
+\x0dB\xb8\xff\xf9|\xd5v\x12\x96\xe4\xccv\x5c\xda\xaa\
+o\xd2\xc7\x1f\x7fB\xb5\xbb\x9b L\x15\xc6l1f\
+\xb3A\x9b\xcf\xb50\x9c\xb9\xa0X\x98L?\xf7\x81\xd4\
+\xbd\xef{\x18\xa3\x06\xc5\x11_\xbbv\x8d\xa6\xa7\xa7\xe9\
+\xc6\x8d\x1b4:z\x98VW\xef\x12\x93\x1b\xcf\xa7l\
+\xf0\xcem\xb5[Vo\xbbG\xc9D\x92\x12\xc9\x04\xb5\
+\x9aM*\x95*\xf4\xa3\x1f\xff\x10\x91\x84\xa2\xe9qs\
+\x12Ut\x1c-\xba\xc7\xfa\xa3\x94%\xda\xcf_%j\
+\x19!#\xd5\x04\xe7\xbc\x8eG\x83\xd9A\xbax\xf1\x22\
+\xab+\xdd\xb93OM\xa4\xe7\x9b/\xbe\xc8(&\x19\
+\x01gkkK\xe3\x0b\x0e\x00b;A\x0e\x90(\x14\
+\xb6i}}\x83\x9a\xad\x06\x9a\x8c\x135\x98\xb8#r\
+\xcem\x8e\x1c\xe7\x96b.\xa0\x13\xb2\xf4\xca9\xa7\xc7\
+\x08\x12\xdc\xc6\xf9\xfe\xb1\xaf\x8fQ\xbb\xd3\xa6,\xc8\x0d\
+W\xa9\x98O\xd2\xc6\xe6:\x07\xe7\xd8\x80\xc2\x01\xe9\xf8\
+\x19\xb2\xe1\x00\xe7\xd7E\x19\xb2\x91\x84c\x93[,\x89\
+\xb106Nl\x00\x0ah\xa8\x1f\xa9\xa1(p-\x8e\
+\xb0a\x15\xb7e\x9ec'\xba^\x97JC\xa5X\xd1\
+\x91J\x09\x82\xe8\xc8\x91\xc3\x09)C\x07Q[)\x10\
+-\x8e\x94\x11\xe0\xf1\xf3\xd5&4\xc0H\x83\x91Z\xa7\
+\xa8\xeeYb\xf9#hP_\xbe\x1e\x94\xc5~e\xa4\
+\x06S\x84\x1a\xc2c\xdc\xaa\x81\x1a\x02L\xb9I\xe9\xa8\
+\xe2@\xa7\xdb\x22\x03\x06k'\xea\xeb\x5c\x8aL\x98\xdb\
+\xb7oS:\x9d\x894^\x7f\x85\xf4\xc6}\x8aI\xf7\
+\xdf7p\xb4\xe8\xa8\xb4P\xfd\x8c\xdex\xf3'R\x9e\
+\xbc\xb7\xb0\x11\xb7tY|\x98\x84\xa1\xe7\xf9fg\xa7\
+\x81\x12\xe9\xc4\xdb-CP\xaa\x18B.\x1b\xc4\xcb\x98\
+\xe1\xda\xc4\xdd\x90\x11bx-\xeex}\xf5\x93mb\
+\x18+a\xb4=\xe3\xdc6[\x1dY\x8fu\x80+\xcd\
+\xf1\x1cQRhFhC\x14<\xb8\x1a\xa6\xd3)a\
+\xb6\x83\xbc3!_\x9d\x9b\xa3\x7f\xde\xfc\x07=\x7f\xe2\
+9j4\x1a\x911\xc7\x11\xe7\xa4A\xa9(^\x01\x06\
+\xe7]D\xca$\xe5/\x0b\x16\x8f\x0e\xee_\x82\xfaM\
+NN#\xb8\x16A\xf9\xe2\xbd\xa2#\x82\xb6\xba\xba\xda\
+\xe3*\xe8\x16\x0b\xc5\x80\x17\x14\x82\x00\xa2\xc6n\x83&\
+\xc6\x8f\xd1\xd2B\x95\xa0`\x92\x0aF\x83\xf3\x99H\xb8\
+\x226&\xee\x09\xd1\xce\xc0P\xbeX\x10'y\x0d\xbe\
+\x8f\xa3M\x0f\xa6EA'&&hy\xb1JY\xd4\
+\xbe\x8a\xd1sAx\xce>\xa7\xa0\x9dL\xba^2\x99\
+$\xdf\xc3\xc6\x01$q\xa1V\xdb;u:q\xe2\x05\
+:w\xee\x9c \xc0\x9bS\x96Y\x8e\x8a\x9d\xe1\xf3$\
+\x88\xc4{\x02\xde\x1dj\x10\xab\xd9\xde\x15\x227\x00w\
+\x11\x1d\x94%\xfd\xef7o\xd2\x95?\x5c\xa1\x16\xd6\xd4\
+\x8dm\x04\x98\x90re'\x11@\x93\x1d\xd8E\xd4-\
+\x5c\xe4\xba~\x17\xcd;\x14\xad\x1e\x1e.\xd3\xf1g\x9f\
+\x8b\xd8\xec\x83\xaf\xd8\x17\xa2E\xd3\x0e\x94\x8d\x89\xca\xcd\
+\x8b\xa3t\x8cM\x1d\x8c\x0a\x5c\xc9\x0cdD\x05\xf3\xc5\
+\xa2\x18\xe7\xe3\x1b33t\xe5\x8f\x7fB*\xee\x08z\
+J\xd9\xb2\xc7,\x97\xcb\x0c\xdf\xba\x0du\xda\x86\x03\xd5\
+S\xa7N\x8dl\xd5\xb7@\x0e\x9bv\x1au\x0a\xe0a\
+.\x97\x91E:\xbd\x8e0\xb8fj(!\x9b\x02\x90\
+\x95\x11`T8e\xec\x08\xc3\xaa\x81j\x13s\xdc\xa8\
+\xf8w&\x1co\xd7\x0b\x85\x22\x9d>}F\xd0c\xf6\
+\xbb\xaeC\x8b\x8b\xcb\xcd\x95\x95\x95\x05.\xc3\xe0\xf2\xe5\
+\xcb\xbf\xb8z\xf5\xeaGA\xb4\xb94^\xe0\x85\xaf\xbc\
+\xfc\xea+\xdfy\xfd\xbb\x8f\xf3\x04GS*\x95a\xb0\
+\x05\x07\xb0h\xfc\xe2\xc1\x0b\x1a\x13uB+\xde\x17\x0e\
+\xc09\x17\xe9\xdc\xdb.\xc2\xc1d2\xb1\xf5\xde{\xbf\
+\xfa]\xab\xd5\xf2\x94\x1c\x96\xee\xf5Z\xb7\x11TMt\
+\x00;\x93\xf71\xbc\x7fo\x0d\x7f\xff\xdc\x0f~\x8f\x8e\
+%\x0e,..Q\xb1\x98\xa3\xf5\xb5M\xc9\x7f\x06\xc8\
+\x14\x01s\xe0\x05T\x07W\x98\xd1L6\x18\x10\xa6\xd7\
+7\xebHC^\xd6i4w\x01w\xa5\x0e\xa4\xdfB\
+El\xfd\xafoFN\xad\xb6\x96\xabT\xca\xf1\xae\xdb\
+\x17\xd2\xb0a\x8e\x96\x91ZDy\xd9\x0c;\x1cb\xce\
+d\xf3yp\xc5\xa7\xb5\xb55Q\xc9\xbe\x03\xf9l\x0e\
+M\xa81\x80h\xdd\x83\xbc\x9a\xd9;\x8d]\x8f!\xe6\
+cjj\x92\xee\xdbs\x1d\xe0\x88\xd4\xb0\xd9\xa9\xd5j\
+\xe6 \x0et\xd6kw\xdf]\xa8.<\x11\x84AJ\
+G\xdb\x9e\xfb\x84V\xdd\xfb\xaa\xfc\xe0;\xa5\x8a4\x82\
+B\xa4\xa7W\xad\xce\xff\x12\xe7\xb5\x87:\xb8\x8f\xf3\x16\
+\xf6m\x87\xc1\xe6\xe2\xc3\x1c\x85\x01\xcd\x9b\xcc\x07\x22\xb2\
+mE{/\xee\xe4\xa3\x12j\x90a\xdeX\xf6\x1ef\
+\xe4\x0b\x0e\xbc\xe6\xb9\xc1\xb6lc\x00\x00\x00\x00IE\
+ND\xaeB`\x82\
+\x00\x00\x06\xd8\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x06jIDATX\xc3\xed\
+UiL\x94W\x14U\xd4V[c\xb4\xd5h\x13\xb5\
+Z\xb5Zq\xa9%uP\x91\xd2\x0aTe\x13\x10\x14\
+d\x19\xd1j+\x8bS48,e\x117\x16Q`\
+@\xa8\xe2RYD\xa4T-\x8e\xe0\x826.5.\
+\xa3\x18\xc6\x9aj'\x85\xa9\x86\x881\x19\xa5\xc9$$\
+\xa7\xe7\x8doZKE\xb1\xb5\xb1?:\xc9\xc9\x97o\
+y\xf7\x9e{\xee\xb9w\xba\x00\xe8\xf2\x22\xd1\xe5\x7f\x02\
+\xff)\x02\x1f\x06\xa6x\x10ID\xa1D&\xb1\x84\xb0\
+\xfbW\x090\x81\x0fQ\xaaZ\xad5$d\xea[\x12\
+3\x8d\xa6\xc4,\xa3)5\xe7\xe6\xbd\xf8\xcc\xb3\xb7\x16\
+\xabK\xaf\xf3}\x9d$g\xfb\x5c\x090\xe0P\xb7\xb0\
+\x0c\xdd\x9a\x9c;\xad\xa1\xd1\xc0\xacP`F0\xe0\xaa\
+\x04<>\x05\x16\xac\x04\x22S\x815\xf9\xe6\xb6u[\
+\xf4-\xc1\xd1Ez\xa9\x8e\xcb\xf3\x22\x10\x1d\x9f\xa1k\
+\xf6_\x06L\x98\x0d\x8cr%\xdc\x80\xb1\xde\xc0x\x7f\
+\xc0.\x08p\x08#\xb1p 8\x16\x88\xdd\x04dn\
+5\x9a>\x89\xb5\xa8\xf2\x8f\x89\x08\x02u\xb1i\xe6\xb6\
+\xa9~\xc0\x9b\x0c5\xdc\x1d\x18\x13\x00L\x5c\x08(H\
+J\x11\x01Lfr{\xaa1\x8dp\x89\x04\x02\xe3H\
+d3\x90\xb5\xc3h\x0a^aQD-\x94\xfc[\x04\
+\x84\xfc\xcb)\xf1\xfb\xf3\x80\x91^\xc0\xb8\x10V\xac\x02\
+<W3\x11\xabU\xe6\x02A\xbczo`[\x12\x00\
+\xc7\x15\xc4r*\xf29\xdf%\x01\xa9\x85\xc0\xda|]\
+\xb3\xdb\xa2\x0c\x1dI\x84?3\x01!\xa5j=0\x85\
+\xbd\xb7e\xef\xa71\xb0\x7f\x06\xb0\xaa\x14\xc8;\x02\xec\
+<\x05l=\x09\xa4}\x0b\xac(&\x19\x12\x9a\xbd\x06\
+\xf8h\x15\xbdB2s\xd4@\x04\xc9\xe5\x94\x98\xdb\xa2\
+VW\xddxV5D\x0b.$\xe4\x00\xce\x94\xd6\x9e\
+\xfc=\xd7\x02\xea2`\xef\x05`s\xe9\xd9[\x91\xa9\
+\xa5\xd7\xd3w\xd65V\x9e2\x9a\xf6_e\xa2\xe3\xc0\
+\xca=4g\x1e\x89\xf0[g\xfab\x16\xc9\x04\xa5\xd0\
+\xa8_\x02\xeb\x0b~W\xc3\xa7\xd3\x1e\xc8*6\xb7\xf9\
+%\xb2\xbf\xec\xad2\x1f\xc8?\xc6\xca\x0f\xe9[\xe4\xd8\
+\xd9\x11\x81\xc2p\xf3U\x9a\xfa\xaa\xb3FS\xe5\x15 \
+\xbd\x16\x08\xa7\x22\xfe\xd9$@E>f{D\x8c\x15\
+\xf4\x86\xa6\xe4N\xab_\xb8\xa6\xbe3-\x11\x04\x926\
+\xee\xd4\xb7\xa84\x0c\x96\x0eD}\x05\x94\x9f\xa7\x0aY\
+\x169\x9d\xda-*\x17AD\xbd\xa9\xeaF\xf5\x15\x93\
+y\xfb\xf7@\xc2A`\xe1vzd#0\x93\xbe\xf1\
+&\x89\xcf\x18GSfn[\x12o\x99\x14u\xfb\xa4\
+b\x97Xw\x8a\xe5\xc6/BS\xaf\xd9\xcf\x8a(\xa1\
+z/P\xa9#\x915\x96\xc3\x8f\xdd\x80|\x1e\xe2\xb1\
+$CW\xf1\xdd\xcd{U\x0d\x1c\xcb:\xee\x8ar \
+`\x0b\xe0F?x\xb1\x1da\xbcf\x95\x001iZ\
+\xc3\xa3\xbe\xb0&/(~\xa8\xb05\xa0:s\x97\xae\
+9\xfd\x1b \x85D\xca\xd9\xff\x8c]u\x8dB\xfa\x8e\
+\xa4\xe3;{\xb1\xaaS\x0b\xb5\x86\x9ak\xe6\xb6\x82s\
+$O\xa3*wP\x85M\x0f\xbd\xa4$\x89u;i\
+\xe0\xad\xbafk\xc5\xe2\x9aK\xc5O\x9e\x01\x84\xff\xac\
+\xc1\x86\xba/\xce\xd0\x95\xd6\x99\xcc\xb9t~1\x83\xed\
+=q\xf3\x9eH\xf0\xb4\x1e\x8a>/N(\xd2\xd7\xea\
+M\xe6\xddT.\x99\xdeX\xca\x09\xf2gK\xbd\xd3\xb8\
+\xbc\x888\x8ejB\xb6\xa5\xe2\x03\xaaT}K&\x95\
+\xd6\xd6=B\xc0*\xabrU\x91\xbe\xf2\x9c\xb9m\x0f\
+=p\xda\x00\x08\xd3uf\xf7[[Rs\xf5Nk\
+\x05[\x92v\x02XV\xc1Iab\xdf,`\x1e\x95\
+\x08^GRj\x93\xd9\x87;dY2\xdb\xacmG\
+\xc0ZMb\xae\xd6p\xec\x1ap\xf2G\xa0\xec\xc8\xc3\
+>uf\x9c\xc4\xd8y\x92D\xf1Q}K\xd5u\xfa\
+\x82\xfbcy\x15\x10B\x83\xfap2f\xd3\xa0N\xfc\
+\xafq\xe4v\x0dc\xc4}5\x8f!`\xf5C\xb2F\
+k\xb8\xf43\xd0p\x1bX\x14gY\xb5>\x9d$a\
+\xe9q\x09I|M\x12i\xa7\x01\x15=\x15\xb2\x8b$\
+8\xae\xce\xc9\x0f\x17\xd8RNI\xd5qI\xe0q?\
+\x0b\x89<\xad\xa1\xe1\x16p\x82\xb2\x8a\xbfj{\x8f\xa8\
+\x01|\xd5M\xa2{\x07\xe8\xe6\xe8\x1f7\xde) )\
+%\xb3\xfc\xec\xad\xa2zz\x82\xed\x88 \x09%w\x86\
+/}\xe1\xc5\xe4*\xb6\xe6\xe0\xe9\xc7\x13\xe8J\xd8\x88\
+@N\x01\x89\xf1a\xb1\xdb\xf4\x17\x0d\xe66M\xf9\x99\
+\xdb\xd3\xfd\xe3\xc3\xf9\xbc\x17\xf1\x0a\xf1j\x07\x10\xefz\
+\xd9{\xaa\xde\xfb`~\xe2\xb6\xec\xe3FS\x1a\x0d\x9d\
+\xc0j\x97sB\x16s\xc3\x86\x16\xf1\x9e#{\xf8\xe2\
+_\x09\xd8\xc8*^\x22z\x12\xbd\x1d\xe6\xaaW\xfaG\
+\xe54\x1c\xbf|\xe7\xd7\xe4\xbc\xeaF\x85{\xc4\x02>\
+\x1fH\x0c\x92xC\xc2z?p\x8c\xfd\x9cI\x0e\xbe\
+\xab\xd2\x8bj\x1b\xeeV\xdc\x04\x0a\xb8\xbe7q\xac\xd7\
+\xd3\x13_pB\xe2\xb8\xb8r\xb9iO]\xfb3\x01\
+\x91\xbc\x87\xac\xb0\x0f\xf1\xba\x0c8\xc4n\xe6\x92\xa5\xd3\
+\xe7\xaa\x0fd\x97\x9ejV\xc6\x14\xdexk\xa2\xf3,\
+>\x1fK\xd8\x12\xe3$l\xe5\xb3w&\xbbEl\xd8\
+U}\xa1\xa5\xfe.P\xf7\x0bp\x88^:\xf0\x13{\
+NS\x97sB\xca\xb9\xc6\x8f\xfe\x00\xd47\xfeA\xa0\
+\xab\xac\x5c$\xef++\x1a.\x82\x11\x13\x08\xbb~\x03\
+\x87\xbb\xbc;C\x996x\xb4\x22\x90\xf7\x8e\x84\x93\xb0\
+J;8\x0d~[\xb1@\x19\xb3\xc5pD\xd7\xd8z\
+\xf4rck-\xaf\xb5\x97\x9b\x1e\xd4\xea\x9a\x1e\xd4\x5c\
+jzp\xf8R\xd3}\xed\x85\xa6\xfb\x87\xcf\x1b\xef\x1f\
+:g4\x89\xb5n\xad\xfeeY\xb9\xa8z$1\x91\
+\x98\x22\x13\xb9\x12\xb3\x09w\xc2\x8b\xf0&|\x89\xb9\xed\
+ \x9ey\x8f\x98\xe4\x9a\xa8p\x8b\xd0Z\xe0\x1eY\xad\
+\xf0\x88:8\xc5SU5uN\xf4>\x07\x9f\x98\xb2\
+\xe9~q\xbb\x1d\xe7%\xec\xa0\xc7\xb6\xd1\xac\x22\xb6\xc5\
+\xd5\xa2\xe7\xfd\x84\xe4RJ{b\x06\xe1&\x13\xfa\x11\
+\xf3\x09\xa1@\x10\x11B\x84\xb6C\x88|\x17(\xbf\xf5\
+\x93g\xddd,{\x19{\x88\xcc\xd5S\xe6~\xf1\x04\
+\x9ek\x0b\xe47\xee\xf2\x8c\xab\x8c1E\xc6\x1c)s\
+\xf4\x919m:eBBAL%\x1c\x9edB\xf9\
+\xceA~\xab\x90g'\xc8X\xc3e\xec\xbe2Ww\
+\x99\xfb\xc9cH\x0c#F\x10\xa3\x88\xd12X\x87c\
+(\xbf\x19%\xcf\x0c\x931\x06\xc9\x98}d\x8e\x1e\xd6\
+\xea\x9f\xb8\x88\xe4\x01\xd1\xaf\xd7\x88\xfe\xc4\x80\xa7-\x22\
+\xf9M\x7fy\xa6\x9f\x8c\xd1[\xc6|I\xe6\xb0\xb1\xfe\
+\x7f\xfc\x06\xb3\xa4\x19\x9ek\xe34\xfa\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x1b\x04\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x03\x00\x00\x00\xd7\xa9\xcd\xca\
+\x00\x00\x08\x9ezTXtRaw prof\
+ile type exif\x00\x00x\
+\xda\xedY[\x96#)\x0e\xfdg\x15\xb3\x04\x10\x08\xc1\
+r\x00\xc19\xbd\x83Y\xfe\x5cA\x84\xd3\xcetVU\
+w\xf5\xd7\x9cr\xa4\x1da\x88\xb8\x08]=\x9dn\xfe\
+\xf7\xaf\xe5\xfe\x83W\xcc5\xb9\xc4Rr\xcd\xd9\xe3\x95\
+j\xaa\xd4pQ\xfcy\xb5\xfd\x19|\xda\x9f\xe7\xcb=\
+\x17^\xc7\xddc\x820\x14q\x8e\xe7k\xc9\xd7\xfd\xf7\
+xx\x00\x9cS\xc3\x15?\x01\x95qM\xf4\xd7\x89\x9a\
+.\xfc\xf2\x09\xe8Z(\x9aD\x84\x0b\xbd\x80\xea\x05\x14\
+\xe9L\x84\x0b\xa0\x9dm\xf9\x5c\x8b<o\xa1\xcfs\xbe\
+\x9e?j\xc0\xdb\xd9G\x94\x8d\xfd\x00\xf9\xfc=\x09\xb4\
+\xa7\x8c\xc1H4c\x88\x1e\x9f\x14\xd3\x11 \xda;\xb8\
+\xd8p\xc1\xfb3\xd3\x1e\xc2u\x8ae\x8f\xc8%\x09\x14\
+\xf2NO\xfeI*\xf7\x99\x95\xc7U\xf8f\xfc\x13)\
+1\x9fq\x87\x81We\xe6\xc7\xf9\xedx\xe0\xf7\xcaw\
+[\xc5O+\xc7\xf1X\xf9e\x9c\xfa\x87~\x9f\x95l\
+\xef\xb5\xb4\xb8\xb5\xe6\xd9]K\x19*\xcd\xd7\xa6\xee\xad\
+\xec+\xdc\xd8\xa1\xf2\xb8\x1f\xcb8\x04o\xc6\xb5\xec\xa3\
+\xe2(\x0e\xd6;\xc0\x8e\xfa\xe1;\x8e\x11j \xd0\xb2\
+B\x0a\x1aZXa\xee\xf3\x08\x03\x22&\x9a$8\x13\
+\x0d\xb0bc%\x0aU\x1a\xd1;\xb0\x94\xec\x08\x8b$\
+\xd6\xa8\xe0\x8b\xe2\x00\xbd\x11\xa3\xf4\x90%\xecu\xeb^\
+n\xc0\x1b\xd4k\xc0\x9d\x14\x00\x16\xf0\x049\xfb\xf87\
+\x8eo\x81\xd62\x93\x0f\xc1\x97\x87\xae \x17\x99\xa1B\
+\x0cc\xce>q\x17\x08\x09\xeb\xb6#\xde\x0a\xbe\x8f\xcf\
+/\xe35\x82A\xdej.\xd8`\xf3\xfd@t\x0e\x97\
+m\x99\x1d\xc5Mt\xc4\x8d\x8c\xf3q\x8b z\x01@\
+EX\x9b!L\x88`\xc0\xe7\x109\xe4\xe0\x85HB\
+\x80\x1e\x0b\xf8i\x00*p\x1a\xea\xa0 0\x93BJ\
+J\x11\xde\x22T\xc8\xd6\xc63\x12\xf6\xbd\xc4t\x86\x11\
+\xb3@\x04\xc7\x1c\x05\xd4\xd4\xd8\xc0\x95\x056\xd8\x8f\xa4\
+\x02\x1bj\x1c91sf\xe1\xc2\x95[\x8e9e\xce\
+9K\xb6\xe0\xd7$J\x12\x96,\x22E\xaa\xb4\x12K\
+*\x5cr\x91R\x5c\xa9\xa5U\xaa\x11\xc1\x91k\xaeR\
+K\xad\xb55,\xda\x80\xdc\xf0t\xc3\x0d\xadu\xea\xb1\
+\xa7\xce=w\xe9\xa5\xd7\xde\x06\xccg\xa4\xc1#\x0f\x19\
+\xc5\x8d:\x9a\x92FE\x9c\xd0\xac\xa2E\xab\xb6\x19&\
+Li\xa6\xc93O\x99e\xd6\xd9\x16Lm\xc5\x95\x16\
+\xaf\xbcd\x95UW{\xb0\x16\xdc\xa1\xf5\xcb\xf1\xeb\xac\
+\x85\x9b5\xdaL\xd9\x8d\xf2`\x0d\x8f\x8a\xdc\x10\xc1\xc2\
+\x09\x1bg`\x8cR\x00\xe3b\x0c\xc0\xa0\xc98\xf3%\
+\xa4D\xce\xa83\xce|%x\x05\x13\xa4d#G\x83\
+1\x06\x06\xd3\x0c\xc4+<\xb8\xfb`\xee\x857\x97\xd2\
+o\xf1F7s\xce\xa8\xfb7\x98sF\xdd7\xcc}\
+\xe5\xed\x0dkj\xd9f\xf8\xe86C\xe6\x86\xa6T\x1f\
+\xe1~\xb8a\x96F\xa5YR\xfb\xe5\xb3\xfb\xbb\x0f\xfc\
+\x01\xfa\x03\xf4\x07\xe8\x0f\xd0\x1f\xa0\xff\x03 $!\xdf\
+\xd3,\xc2\xb1O\xb4n\xc8\x85\xc8\x90et\xe4>d\
+\xf2:J\xd0\x11\x167\xdc\xb2f\x08A#*j\xe9\
+<\x162\x8e\xae\xd4\xed<\x92\xd3\xdcCc\xa4\xe0\xde\
+\x888\xa6\xaa\xb5\x0e\xd6\xc0ZQ' \xbbg\x14\x8a\
+\x11Y\x0e0\xab1@(\x97\xb5JJm\xc4\x1b\x11\
+xn\x97\x15X\xa5\xf51x*2{\xa8\xc9\x922\
+\x16*\x95!\xc6X\xb9\x03\xb4\xcf\x8a\xb1R[4\xc1\
+\xd0\x08\x98$u\xaa@BQr\xf6u\xa1\xd6\x16E\
+J\x0dOHl3\xafX\xd6\xad\x01mPMR\xde\
+K\x14\xe6\xa0\x17\x1890E\xbf\xc0,C\x7f\x12\xeb\
+\x12\x0a\x85\x16\xe4Z6\xfdN\xac\x9fl0|l\xd0\
+\x9d\x1d~\xbb\xc1_\x96\xcc\xdd\xa2\xfd\xaed\xeeU\xf7\
+\xff\x5c2\xf7Yi\xffT2\xc7h\xc8 \x19\xc5\xa5\
+\xf2\xd9Z\xd1\x070\xca7P\x5c.#\xf5\xb3\xf7\x16\
+`\xe6U2J\xbc\x81\xe2t\x8c\xa1(h\x1d\x85\x81\
+&\x22\x14\x92\xee\xc3\xac\xc0\xe2\x8cj\x13\x95]\x8f\xd6\
+\x943\xb1\xa4\x90\x18\x7f\xa9\x8co\x9d\xad;x\x85\xaa\
+o\xb3s\xea\x92\xebDu\x8b\xa6\x84\x81\x95b%?\
+Q%/\x94\xd7\xf0$\x824\x09;\xc3\xb6\x0a\x99\xbd\
+\xb6\x09\xbfY\xa8\x97Q7V\xebE\x1a\xca\xd6\x94f\
+R\xf8[d\x19\x9e\xa7\x0f\x8a\xc26(\xb4Rr\x80\
+x\x91s\xc8\xd8D\x15\xc9\xa8\x12;l\x1bX\xd2V\
+J[\xdd\x0c\x1d\xb5\xb95\xb2tV\xdd\xcaF\xaf\xb0\
+'\x0b|\xb4\xf0&\x00\x1d\xd4v\x05\xa9\xe6\xfb\xa8\x94\
+y\x0e\xa8,\xca\xca2'\xea\xda\xe0\xfa\xcc\xcauF\
+\xc3h\x10\x08\xe7\xba\xba\xc6\x0eg\x9f\xf1\x98C0\xaf\
+\xf6Mx/\xf42m\xec\x06\xa0\x8aK\x9agO\xd2\
+\x13:\x8c!e\x99O\xb6\xaa\x82\xa8!s\xa5-m\
+G-|x\xe4\xb0\xed\xa9}\x05uO\xa8\xc6\xcdT\
+\xb26\xf0g\x12\xb68C\x82\xf2\xed{\x84\xaaD\x1c\
+B\xc0\x10\x0bW\xd4\x15A\xb1!\x86\xa5\x229\x8em\
+\xb33\xf0\xb9\xff\xdc}\xdd\x8cq\xa2r\x94\xcc\xf1\xe8\
+\xd8\xbdU2\x08\x87}\xacl\xa6P\xd6\xde\xce\xba\x9f\
+\xb9\x1f\x90{\xbcl\x7fs\xdf\xae\xf8$ \x99\xf2\xec\
+\xa1\xcf\xea\xdb\xca\xb3\xf1\xc4.l]\xc8{]<)\
+.\x9c\xdd>\xf6z\xeb\xe6V\x8d\xdb\x9b\xfd\x81\xd8\x1f\
+\xbb\xf4\xc6\xc1\xfa)kI~$8\x1c\x11\xde\xb6\x8d\
+\x04J#\x7f\x14\x9d\xd6\x871\xbb\xaf\xd6\x8cV\xd7h\
+\x87\xe8h\xb3\xbeZ\x120\xf5\xc2\x9c\x03\xbd\x96\xf6!\
+}y\xa7\x8b\x0b\xec6\xa1\xbdD\xd37\xf3\xe0\x9at\
+4\xf4\xd9H\x8cu \x16!\xc0\xe8\xcam\xc5\xb6\x97\
+J)\xf2\x1d\xa9\xb3\xa9\xc1\x1ce\x05\x17y\xa5\xb6\x06\
+\xc3\x9b+\x94\xab\xd8pG\x14\x82W{\xb1\x0e\x1d\xfd\
+c\x1d\xe8!\xbbRh\xb5\x97Y\xb0\xb5f\xc1\x83z\
+I\xb3\xf9}Y\xbc\xbb/>\xceS\xe3\xa0\xadl\xf2\
+\x15\xf1\x0f$\xed\xc0\xaa\x9e3\xe2@C\x9f\x19\xa1k\
+\x5c\xd0T4\x90\x08g\xe8\x7f\x1d\xd7\xd1+!\x0c!\
+\xcd#x`\xbdd\xe1\xc5~%ChEt!E\
+/\x1bUe\x86\x1d\x8aF\xb7\x88\x8c\x10\x8cm5d\
+{i\x03\xa1g\xc0\xfb=\x9aq\x9d\xad\xe6\xd8\x14Q\
+s\xb0\xe7\x8a/\x88>}E\xe4~h|'\x85\x8e\
+\x8d\xf3,\xdb\xc6|\x8f\x8b\xfb1\x00\xdee\x05|\xad\
+\x1f\x03\x80\xb4\xa5\xae8[\x99\xd077A]\x82\xc5\
+\x22\xd4\x840\xb4\xc3\x17z\xea\xa5y[\xbe\xa8\xa4u\
+\xf8\xcc\xeb\xf8\x1aC\x8bH\x03\xda4\x009\xcc\xde\xe4\
+\xa4\x80~9\xcb\xac\xadt\xa2\x81h\xce\xd0\xf0hV\
+\xded\x04\x9f]\x1d\xc4\xd9\xad^\x117\xf5\xd8p\xdf\
+\xaew\xcd_\xb3\xb0/\x9b6\xd2;\xba~/\xe8\xfb\
+\x95\x1b\xcc\x9d\xea1I\xb4\xfej\xa9\xa9\xa9+\xe6-\
+}\x07\x92\xb9\x9d\xe5c\xee1u\xe4\xe2\xb2\xa5\xca\xef\
+\xa52\xa7\x95_\x96\x8aF\x18\xed=\x98\xbb\xf7\xf8\xbb\
+`\xeeYa\xbf\x0c\x86\x944\x91G[g8\xc3\xc9\
+3\x0e\x16!\xdc.\x8b\xb0\x1a`\xf3i>\x8f\x1c\x8d\
+\x8bk\xfa\x9a\xfc\xa0\xdb\xa6\x9f\xe1\x1c\xf3e`\xf1\xc7\
+p\x91\xab\xc1\xe5\xef\xe0\x5c\xd3-^\xb8\xe0\xfa\x03n\
+\xdb\xeb\x87\xb9\xeexe\xc1\x00^}\xac\x11\xcb<-\
+\xe7\xd2BQ\x83\x05\xa1\x96rb\x13\x91\xda\xe3p.\
+\xb2\xac\xea\x97\xad\xc3\x82H\x0b_\xc2\xb7\xdcU\x03\x85\
+2Q,t\xf2\x9eG\xeb2\x5c\xdbQP\xcd\xf2q\
+\xc7\xec\x03\xcb\xcc@K\x93\xd5\xacE\xbb\x19\x13a\x05\
+D\x9a\xd4[\x0f%\x97\x81 e\xb5B.\xf0\xdf]\
+\xa8\x88wA\xf3)Z\xec\x9f\x0e\xef\xcf\xa8Q\x0a\xec\
+y\xc4\x86\xba!\x0e\x8d\xd4;uD\x07o\xbf\xec!\
+\xf8\xa50\xa7K\x82H\x90\x8cA\xd4N\xdb\xf0qo\
+\xdeu~\xddu~\xb3\x18D\xa8\xb5\xd4|\x99+\x0a\
+<T5\xa8\x1c\xe68)\x14\xe5\x8e\xdf\xe51*\x88\
+]A\x8ev\x92\x10o\xbd\xf2e=\xcf\xa8\xe6*\xc0\
+\x1d\x0d\xae\x86r0\xd3\xca\x1cb?vTR\xcf\xe3\
+\xa8\xe3*\xfc\xe8\x14~|1Y\xf3)@\xc3]\x80\
+\xf2)@\x11\xd6\xa3e\xd0\xd9\xed\x97\xfd\xec.\xc8W\
+\xbc\x83va\xbd \x1d\x9c\x07\x0aR\xc8\x88Z\x11H\
+\x91\xfb\x8d$=um\xbc\xeaZ\xdb\xa5Y\xcf\xf3.\
+\xbfhn\xec\xc4\xb9L\x1cH\xe3\xce\x0e\x7f{\x83\xea\
+\x1e\xb2\xdd\x1c\xe8\xdd_\xfc=\x0a\xdc'\x09\x7f\xa6/\
+\xe1o\xf4\xe5\x1ej\x7f\x10\x09\x9c\xf6\xcd6\xe9\xa4\x00\
+\xd6\x13\xd7\x9f\x01\xddFD\x94}\x01L\x17\xe0:\x99\
+\xe2\x9bm\xaeg8\xf7$\xe0'\xb8\x862\xdb2*\
++#\xd9\x91e\xd4j?\x0a'\x0fwEJ\xce\xd1\
+\xa3\xd8&\xab\xe5\xeb\xdc\xed\xfa\x98LB\xa8\xc4yd\
+j\xd4F9\x9dA\x0d\x85\xb7\xbf\xd9?R\xb4\xc2z\
+\xff\x07K\xb7\xa5\xac\xd2\x80\x1e\x10\x00\x00\x01\x84iC\
+CPICC profile\x00\x00x\
+\x9c}\x91=H\xc3@\x1c\xc5_[kE\xaa\x0ev\
+\x10q\xc8P\x9d,\x8a\x8a8j\x15\x8aP!\xd4\x0a\
+\xad:\x98\x5c\xfa\x05M\x1a\x92\x14\x17G\xc1\xb5\xe0\xe0\
+\xc7b\xd5\xc1\xc5YW\x07WA\x10\xfc\x00qss\
+Rt\x91\x12\xff\x97\x14Z\xc4xp\xdc\x8fw\xf7\x1e\
+w\xef\x00\x7f\xbd\xccT\xb3c\x1cP5\xcbH%\xe2\
+B&\xbb*\x84^\x11D'\xfa1\x86^\x89\x99\xfa\
+\x9c(&\xe19\xbe\xee\xe1\xe3\xeb]\x8cgy\x9f\xfb\
+s\xf4(9\x93\x01>\x81x\x96\xe9\x86E\xbcA<\
+\xbdi\xe9\x9c\xf7\x89#\xac()\xc4\xe7\xc4\xa3\x06]\
+\x90\xf8\x91\xeb\xb2\xcbo\x9c\x0b\x0e\xfbyf\xc4H\xa7\
+\xe6\x89#\xc4B\xa1\x8d\xe56fEC%\x9e\x22\x8e\
+*\xaaF\xf9\xfe\x8c\xcb\x0a\xe7-\xcej\xb9\xca\x9a\xf7\
+\xe4/\x0c\xe7\xb4\x95e\xae\xd3\x1cB\x02\x8bX\x82\x08\
+\x012\xaa(\xa1\x0c\x0b1Z5RL\xa4h?\xee\
+\xe1\x1ft\xfc\x22\xb9dr\x95\xc0\xc8\xb1\x80\x0aTH\
+\x8e\x1f\xfc\x0f~wk\xe6''\xdc\xa4p\x1c\x08\xbe\
+\xd8\xf6\xc70\x10\xda\x05\x1a5\xdb\xfe>\xb6\xed\xc6\x09\
+\x10x\x06\xae\xb4\x96\xbfR\x07f>I\xaf\xb5\xb4\xe8\
+\x11\xd0\xb7\x0d\x5c\x5c\xb74y\x0f\xb8\xdc\x01\x06\x9et\
+\xc9\x90\x1c)@\xd3\x9f\xcf\x03\xefg\xf4MY\xa0\xff\
+\x16\xe8^s{k\xee\xe3\xf4\x01HSW\xc9\x1b\xe0\
+\xe0\x10\x18)P\xf6\xba\xc7\xbb\xbb\xda{\xfb\xf7L\xb3\
+\xbf\x1fP\x0br\x99\xb2\x0b\xf7\xf1\x00\x00\x0f\xc3iT\
+XtXML:com.adobe.\
+xmp\x00\x00\x00\x00\x00<?xpacke\
+t begin=\x22\xef\xbb\xbf\x22 id\
+=\x22W5M0MpCehiHzre\
+SzNTczkc9d\x22?>\x0a<x\
+:xmpmeta xmlns:x\
+=\x22adobe:ns:meta/\
+\x22 x:xmptk=\x22XMP C\
+ore 4.4.0-Exiv2\x22\
+>\x0a <rdf:RDF xmln\
+s:rdf=\x22http://ww\
+w.w3.org/1999/02\
+/22-rdf-syntax-n\
+s#\x22>\x0a <rdf:Desc\
+ription rdf:abou\
+t=\x22\x22\x0a xmlns:x\
+mpMM=\x22http://ns.\
+adobe.com/xap/1.\
+0/mm/\x22\x0a xmlns\
+:stEvt=\x22http://n\
+s.adobe.com/xap/\
+1.0/sType/Resour\
+ceEvent#\x22\x0a xm\
+lns:GIMP=\x22http:/\
+/www.gimp.org/xm\
+p/\x22\x0a xmlns:dc\
+=\x22http://purl.or\
+g/dc/elements/1.\
+1/\x22\x0a xmlns:ti\
+ff=\x22http://ns.ad\
+obe.com/tiff/1.0\
+/\x22\x0a xmlns:xmp\
+=\x22http://ns.adob\
+e.com/xap/1.0/\x22\x0a\
+ xmpMM:Documen\
+tID=\x22gimp:docid:\
+gimp:b0042b82-ba\
+7d-4bb4-8899-352\
+fef962624\x22\x0a xm\
+pMM:InstanceID=\x22\
+xmp.iid:441fa1f5\
+-6c47-47c1-8900-\
+f58cf45668f0\x22\x0a \
+ xmpMM:OriginalD\
+ocumentID=\x22xmp.d\
+id:102cf193-c4ec\
+-4e2f-b75a-ee0ac\
+03c106f\x22\x0a GIMP\
+:API=\x222.0\x22\x0a GI\
+MP:Platform=\x22Lin\
+ux\x22\x0a GIMP:Time\
+Stamp=\x22162033048\
+7756471\x22\x0a GIMP\
+:Version=\x222.10.2\
+4\x22\x0a dc:Format=\
+\x22image/png\x22\x0a t\
+iff:Orientation=\
+\x221\x22\x0a xmp:Creat\
+orTool=\x22GIMP 2.1\
+0\x22>\x0a <xmpMM:Hi\
+story>\x0a <rdf:\
+Seq>\x0a <rdf:l\
+i\x0a stEvt:ac\
+tion=\x22saved\x22\x0a \
+ stEvt:changed\
+=\x22/\x22\x0a stEvt\
+:instanceID=\x22xmp\
+.iid:035b69a2-44\
+29-4b83-80bc-10a\
+79f5d3529\x22\x0a \
+ stEvt:softwareA\
+gent=\x22Gimp 2.10 \
+(Linux)\x22\x0a s\
+tEvt:when=\x222021-\
+05-06T21:24:18+0\
+2:00\x22/>\x0a <rd\
+f:li\x0a stEvt\
+:action=\x22saved\x22\x0a\
+ stEvt:chan\
+ged=\x22/\x22\x0a st\
+Evt:instanceID=\x22\
+xmp.iid:21232bcd\
+-6beb-4a6b-91df-\
+d1326e1b5562\x22\x0a \
+ stEvt:softwa\
+reAgent=\x22Gimp 2.\
+10 (Linux)\x22\x0a \
+ stEvt:when=\x2220\
+21-05-06T21:24:4\
+7+02:00\x22/>\x0a \
+<rdf:li\x0a st\
+Evt:action=\x22save\
+d\x22\x0a stEvt:c\
+hanged=\x22/\x22\x0a \
+ stEvt:instanceI\
+D=\x22xmp.iid:59e56\
+d83-caa6-4126-91\
+39-cb5b589ce2e8\x22\
+\x0a stEvt:sof\
+twareAgent=\x22Gimp\
+ 2.10 (Linux)\x22\x0a \
+ stEvt:when=\
+\x222021-05-06T21:2\
+5:42+02:00\x22/>\x0a \
+ <rdf:li\x0a \
+ stEvt:action=\x22s\
+aved\x22\x0a stEv\
+t:changed=\x22/\x22\x0a \
+ stEvt:instan\
+ceID=\x22xmp.iid:7c\
+b5ff55-b0f8-4913\
+-ab11-b5b397521c\
+9c\x22\x0a stEvt:\
+softwareAgent=\x22G\
+imp 2.10 (Linux)\
+\x22\x0a stEvt:wh\
+en=\x222021-05-06T2\
+1:48:07+02:00\x22/>\
+\x0a </rdf:Seq>\x0a\
+ </xmpMM:Histo\
+ry>\x0a </rdf:Desc\
+ription>\x0a </rdf:\
+RDF>\x0a</x:xmpmeta\
+>\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a\
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \x0a<?xpacket end=\
+\x22w\x22?>%0\xca\xff\x00\x00\x003PLT\
+E\x00\xc2\xe9\x00\x00\x00<Rw=Ty=Tz\
+=U{>U|>V}?V}?W\x7f@\
+X\x80\xbf\xe2\xff\xc0\xe2\xff\xc6\xe8\xff\xc7\xe8\xff\xda\xf0\
+\xff\xde\xf3\xffD\x0cb\xad\x00\x00\x00\x01tRNS\
+\x00@\xe6\xd8f\x00\x00\x00\x01bKGD\x00\x88\x05\
+\x1dH\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\
+\xe5\x05\x06\x130\x078\x94ND\x00\x00\x00AID\
+AT(\xcfc`\xa02`D\x05\xa3\x12\xf4\x91\xc0\
+\x09\xd8YYX\x98\x80\x18\x828\xe1\xe2\x1c\x02\x02\xfc\
+\x08 \xc0\x05\x97\xe0\xe3\xe5\xe6\xe6\xe1\xe1\x86\x00^\
+^.\x14\xa3\x98A\x00h\x14\x1b\x07'^k\x01\xd6\
+\x10\x03(qA%M\x00\x00\x00\x00IEND\xae\
+B`\x82\
+\x00\x00\x03\x0b\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\
+\x00\x00\x09pHYs\x00\x00 \xc7\x00\x00 \xc7\x01\
+\x95\xc3\x06]\x00\x00\x00\x19tEXtSoft\
+ware\x00www.inkscap\
+e.org\x9b\xee<\x1a\x00\x00\x00\x1ftEX\
+tTitle\x00Gnome Sym\
+bolic Icon Theme\
+\x8e\xa4)\xab\x00\x00\x01)PLTE\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\xca\xdf\xf4\x00\x00\x00\xbd\xd0\xe3\xbf\xd1\
+\xe4\xe3\xf1\xf8\xff\xff\xff\xff\xff\xff\xe7\xf3\xf9l{\x84\
+RV[\x00\x00\x00\xff\xff\xff\x97\x9a\x9d\x16\x18\x18\x11\
+\x13\x13\xf4\xf6\xf7\xf4\xf6\xf7\xb3\xc8\xd4\xb4\xca\xd6\xb3\xc9\
+\xd5\xb5\xca\xd6\xb5\xca\xd6\xb7\xcc\xd8hrx\xb9\xcf\xda\
+\xbc\xd2\xdd\xbd\xd2\xdd\xb8\xc2\xc7\xbd\xd2\xdeNW\x5c\xc1\
+\xd6\xe0\xc3\xd7\xe2\xc3\xd7\xe2\x99\xa2\xa7\xb6\xcd\xd9\xc5\xd9\
+\xe4PZ`T^du~\x83\xc6\xda\xe4\xc3\xd9\xe4\
+\xcc\xd5\xda\xc9\xdd\xe7\xc7\xdc\xe7\xbe\xd3\xde\xa7\xba\xc4L\
+U[MV\x5c\xaa\xbd\xc7\xab\xbe\xc7\xc7\xdc\xe7\xaa\xbd\
+\xc8\xc3\xd8\xe3\xd5\xe8\xf2\xa8\xbc\xc7DMR\xe7\xef\xf3\
+\xb2\xc7\xd2\xba\xce\xd9\xe8\xf0\xf5\xb2\xc7\xd2\xbe\xd2\xde\xd9\
+\xe5\xeckx\x7fq}\x85\xde\xeb\xf2\xee\xf5\xf9\xee\xf5\
+\xf9\xc7\xe0\xeehu|iv}\xcb\xe3\xf1\xcd\xe4\xf2\
+\xcd\xe5\xf3\xe1\xef\xf6\xe5\xf1\xf8q\x7f\x87s\x81\x88t\
+\x82\x89\xb9\xd0\xdd\xbb\xd2\xdf\xbf\xd6\xe2\xc8\xe0\xed\xc9\xe0\
+\xec\xca\xe2\xef\xca\xe3\xf1\xcb\xe3\xf0\xcb\xe4\xf2\xcc\xe3\xef\
+\xcc\xe4\xf2\xcf\xe6\xf2\xd1\xe7\xf3\xe3\xf0\xf7\xe3\xf1\xf8\xe4\
+\xf1\xf8\xe5\xf1\xf87\xc7\xc9(\x00\x00\x00OtRN\
+S\x00\x03\x0a\x18\x1a\x1b\x1c$%'*4;>M\
+Vi\x96\xa4\xa7\xbf\xbf\xc0\xc0\xc1\xc2\xc4\xc9\xcb\xcd\xce\
+\xce\xcf\xd1\xd4\xd5\xd6\xd6\xd7\xd8\xd8\xda\xda\xdd\xdd\xde\xe3\
+\xe7\xe8\xe9\xe9\xea\xea\xea\xeb\xeb\xf0\xf2\xf3\xf3\xf4\xf4\xf4\
+\xf5\xf5\xf6\xf9\xfa\xfa\xfa\xfb\xfc\xfd\xfd\xfe\xfe\xfe\xfe\xfe\
+\x07\xeb\x93\xb9\x00\x00\x00\xceIDAT8\xcb\xdd\xd3\
+\xd9VAa\x00\xc5\xf1m\x0a\xc9T\x92:\xa6\x83\x92\
+\x13\xd2\x8c2\x0f\x0d\xe2\x90\x8e\xb2C\xe5\xfd\x1f\xa2\x07\
+8\xbe+\x8be\xf5\xbf\xdd\xbf\xdb\x0d\xc0\xbeW\x9e\xff\
+\xe8\xeb\xd6\xc2;\x00\x00W{FA_GF\xc0\xd6\
+\x9aP\xab\xe4\xf4]W\xc7d\xd4\x80\xdd\x19\x0b\x0e,\
+\xccr\xcew\x0f\xee\xa9\x09v\xc0\xf4\xc8$z|\x80\
+\xb0c\xd6\xf1\xcb+1\xf0Q\xfd\x07`\x7f\xf5\xc0\xbf\
+48\xd8\x00\x10X\x0f\xf8\xe6\xad\x18\x1cRE\x93%\
+18\xe33\xd2\xfc\xd8\x12\xed\xd6\x0e/\xe0\x9e\xf2\xce\
+\xb4x\xdf\xce\xf3\xcd\x0b$\xc8\x97\x9bLFQ\x94\x93\
+x<&\xcbr$\x14\x0aJ\x92$e_\xf9Y4\
+\x03\xc6\xd4Ht\xdea\xd1\x09\x00\x06\xcfic\xa0\xaf\
+\xfft\xe95\x03\x7f\x0e\xd7[\x9dz\xfc\xb1W\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\x9f\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x041IDATX\xc3\xc5\
+\x97mLSW\x18\xc7+\xea\xe2f\xc62c\xb6l\
+\xdd\xa6\xcb&Q7\xa3!\x99\x9aM\x0aS\x96l:\
+'C\x04\x8d\x1f\x8csY6@^\x12MF\x150\
+\xbeG\x97\xbd2\xac\xca\x00\x87QQ7@\x93\x81\x18\
+\xa1-`G\xa1/XyG\x81\x16\x07\x14\x8dT\xd3\
+\x84%$\x8f\xff\x07\xee5\xb5\x96\xd2\xde\xfb\xc1\x0f\xbf\
+\xdc{\xcf9\xcf9\xbf\xf3\x9cs{O\x15D\xa4x\
+\x96<\xf1\x10\xb5q\xcfL\xf0=h\x14(\x02\xb9^\
+\x88u|\xbf\xd2+>\x0c\xa8\x85\xfa2\xaf\xb82\xa1\
+\x9c\xeb\xc3&\x12\xd8\xf2[\xb1\xbe\xaf\xfb!\x11S\xdb\
+\xeetWZ\x1c\xae\x0a\xb3\xc3u\x05\x5c\xb5:\x5cb\
+\x1d\xdfs\xc7^\xf1\xeas\xd7lC\x5co\xb6\xbbF\
+\xb8\x8d\x08?s9\xd7s;\xbf\x19\xd8\x94\x9ec;\
+\x9c_\xd9\xa3kq\xba\x9b\x06\x88L\x0e\x22\xcb\x1d\x22\
+\xeb\x9d\x91\xd1_!\xf8Mf~\x8b\xbf\x0c\x88\xf15\
+mNw\xc7}\xa2\x1aL\x84\x9f\xb9\xdco\x06<:\
+R\x82X\x0eh\xec#\xaa\xbbET\xdfKt0\xaf\
+\xb2\x07\xe5\x89`\x81\xbfu\x15\xe3Y\xb4\xeb\x01\x910\
+p,\x97\xfb\xdd\x03>:j4a\xe65]\xe3\x02\
+\xe9\x87\xcfu\xa0li\xa0\x1b\x8c\xe3;]D|\x0d\
+h\x13\xfa\xea\xa0\x11\x02:\x08\x18 \x90&A\xa0}\
+X\xa6\x80\x11KP\xd5\x81e\xe8!J\x95 \xd0*\
+W\xc0\x80\x0dx\xb5\x8dH\x7f\x1b\x02\x87\x82\x17h\xbe\
+/S\xa0\x163/o&\xaa\xee$J\x91 `\xbb\
+'S@\x87\x99_\xb6!\x0bX\x86\xed\x07\x83\x17\xb0\
+\xde\x95)p\x0d\x1b\xb0\xd4JT\xd1*M\xc0<$\
+S\xe0\x0af~\xc1\x84,`\x19\x92%\x0848e\
+\x0a\xfc\xd3Nt\xb6\x81\xa8\x04\xcb\x90t x\x81\xfa\
+A\x99\x02\x97[\x88\x8a\xfe%\xba\x88eH\x94 p\
+}@\xa6@)R_p\x1d\x1f\x113\xd1w\x12\x04\
+j\xfbe\x0a\xfcu\x93\xe8D-\xd1it\xf1\xad\x04\
+\x01\xdd\x7f2\x05\xfe\xc6\x12h\xf4\xc8\x82\x01\xdf\x82\x1f\
+\xcbn\xa1,:\xc0\xc1\x95q\xa99\xb6\xf2\xae\x91Q\
+\xdcWI\x15\xc8=^\xe5pij\x90\x85:\xa2\xec\
+\x02}\x1f\x9f\x19\x02\x14\x88N\x83pa\xdd\xd3\xe7\x86\
+`\x04\xb6\xec)\xd4\xf7\xe5a\xf69ZHh\x9dn\
+>%\x05(\xa0\xfe\xe9\x92m\x88\xe3\xfdIO\xd6I\
+\xe8\xeamG,\x7f\x9aFF\x7f\xc72\xe4\x1b\x89\xd6\
+\xa7\x8c}\xdb\xd7M\x12\xb7\x8e\xdbU\xd8\x1f\xb7WJ\
+\x12\x10:K\xccB\xeaO\xe1-\xd0\xe0m8\x86,\
+@\xca\xaa\x8a\xdf\x1d\xabP(\xa6z\x10\xc2D&d\
+\xc5\x8cI\x1b\x9d\xee\x03\xc5\x0d\xfd|\xc2\x0a\xf8P\xfa\
+D\x85B1\x85;\x0c\xff\xe4\xeb\xd0\xc8\x84\xcc]\xfb\
+\xcf\x1a\x07N\xdf :e!:Y7\xe8N\xfe\xa1\
+\xf4vdB\xb6Y\x15\x9fu\x9c\xc1\xc0\x9a\xa8\x8d\xd9\
+\xa6\xed(/\xac\x1ft3\xbc\x5c\x11\x1bv\xbd\xce}\
+\x05% \x0c>\x0d<\x07\x9e_\xa4\xda\xfcND\x5c\
+Fv\xd2\xd1\x92\xee\x22\xcb\xf0\xff\x17\xf1\xebX\x82c\
+\xda\xa5ndE\xdb\xfb@\xa3\xb5\x8f\xc1\xcf\xcc\xde3\
+\xc6\x81O\xbf:\xd2\x84\x988\xa1\x9f\x90\x89$\xfc\x0d\
+>\x03\xbc\x08f\x81W\xc0k\x1f\xacNN\x89\x88S\
+Wn\xday\xa23#\xaf\xba\xff\xe7\xf2\xf6\xe1\xdc\xea\
+\xde\x87\x0c\xdfsYL\xd2/\xad\x1f\xc6\xec\xdc?/\
+\xfc\xb3\xf7\x10\xf3\x12x\x01Lg\x89I\x05\x84\xc1\xa7\
+\x0a\x83s\xf0\xab\xe0-\xf0.\x98\x0f\x16\x82Es\xdf\
+\xff\xf8\xcb%\xab\xb6f-[\x93R\xb0\xfc\x8b\xf4\xf3\
+\xcb\xd7\xa6\x15/\xfb<\xf5\x8f\xf0\xe8mj\xe5\xbc\xa5\
+Qh\x13\x06\xde\x06\x9c\xfe\x97\x05\x89i\xbe\xb2\xe0-\
+\x10\x224\x9c\xf9Q\xcc\x8e}\xaa\x0d\xbbmX\xc3\x9b\
+\x98u\x0b\xd2\xd9\xca\xacX\x9f\xd16\x11b\x9b\xf1\xf6\
+\xeaf\x8eW\xc5g6a\x7fXx\x1f\xf9\xca\x82/\
+\x01NW(\x07\x8a\x7fB:\x87\xa5#\xf6\xc1\x1b6\
+h\x01\x03\xbed\x8c\x0e\xe7B\xad\x80\xce>\xfe\xac\x13\
+\xef\xed\x1eu|\xf5(\xe3\xabap\x9c`\x04\x9e\xe9\
+\x12\x04\xb4\x09\xc1b\xb0\xc4\x83\xc5B9\xef\xfc\x05\x92\
+7\xe1d\xaf!P\x827\xc1\x1c0\xd7\x839\x82\xe8\
+\x1b\xc2\xa0,>;\x90\xd7\xf0\x11\x90\xc3\x06MU\x03\
+T\xc0\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\xe9\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x04\xb0IDATx^\xb5\x97A\x8b]5\
+\x14\xc7\x7f'\xc9}\xefM\xebF\xf0\x93L\xbf\x80~\
+\x05\xdb\x85\xedB\x10\x8a\xd2\x85\x8a\xa0\xa8\x0by\xbe\xba\
+\xb1\x0ajw\x0a\xbapc\x17\xd6\xcfP\x10\x17]X\
+A\xabP\xb4j\xa7:c\xdb\xa9\x9d\xe9L\xdb\x99w\
+\xefM\x8e!Y\x04\xc2\xf5N\xa9\x18\xf8sro\xce\
+#\xb99\xbfwN\x22\xaa\xcaA\xed\xa9\x13\x0b\x01\x04\
+\xa0\xd8A)d{\xe1\x8b\xb9rpCT5Or\
+|\xf1\x06p\x8c\xe1&#\xefut1\xc3:\x7f\xe1\
+\xdc\xfc]\x00Gi\xc7\xce|0?\xb2s\x1fB\x00\
+\xef\x03\x01\xc5\xf7\x81\xc3\x87\x1c\xde+\xce\x19D\xa2\xb5\
+B\xdb\x81*t]\x00`21\xb4}\x80\x10b\xdf\
+a\x0cq\x8cdU\xb3\x8cQf3x\xeb\xb5\xd3\x00\
+i\x01\x86\xd2\x92\xb3\xb3\x80\xc0\xa5\xebphf\xe3\xe4\
+\x96Kk\x82\x88\xb0l\x03\xdf\xfc\xaci\xf2\x10\x94o\
+\xd7\xb2o\xe3L\xf4\x81\xe0}Z\xec\xd7W:z\x1f\
+\xf0!$\x9f\xb6\xebX\x99\xc2\xc5_\x95\x89\x95\xf1\x10\
+\x0c\xc4Y\x8a\xca\xf3p\xfc\xd1\xaa\xaf\xd5x\x15\x82\xc2\
+@\x0d\x9b\xc9\xc2\x15\xd1\x00\x93lq\x80)\x0c\x10\x80\
+\x1e\xe8\x806[\xfa\x22BR\x81s\x14\xc2\x9a\xf6\xb2\
+\xa8\xa1\xdd\x18\xfe\xeaP\xed@\xb1c\x10~xv~\
+dkW\xe9z\xcfc+\x8ee\xe7\x01\x93\xa0\xeb\xbc\
+\x22\xe4\xd87\x8e\xe8\x03b$\xc5}:q\xa8\xc2\xfe\
+\xb2g6u\xc9\xc7\x87\xfc[k\xa2\x1c\xf8\x1e&\x0d\
+\xd1\x17^}e1\x08a\x82\xcc\x19\x892\x5c\xbc\xea\
+\x996\x96\x95\x99py\x1d\x1a+\xf4\xbd\xe7\xc7\x0d\xa1\
+\xeb\x15k\x84\xef\xaey\x04\x01\x85\x1f\xfe\x04g\x0d\xb3\
+i\xec\xaf\x0b\x8ds\x11<\xc3O\x7f\x81\x91\x90\x00\xff\
+>\xfaX\xa3\xd4\x10\xe6\xd8+5\x84\xb5Le\x87 \
+\x0c\x95\xad\x05\xa0\xc3!\x10\xce\x00\xef\x016\xa9@7\
+\xcdb\x96-\x93\xa4\x02j\xc8\xa2\xcdb\x09\xecg\x1b\
+U\xa0\xf4DUl\x14\x06P^\xafv`\xf0\xcb+\
+Q\x038\xbe\x13e\x07\x80\x1aB\x8e~tv\xbe\xba\
+\xbf\x0fH\xce\x84McP\x05\xd0\x08\x8f\xb0\xbd\xd3\xe1\
+\xacM\xef!g\xc1\xc9D\x92\x8f\x06\xc15\x19\xd2\xe0\
+\x85e\xdb1\x9dZ\xfa>gI\x11\xd8\xdd]\xf2\xc4\
+\xe3S^zy\x18B\xb1\x02\xa8\xd2\xb6\x1dWn\xc0\
+\xde^\x8b\x00\x97\xaf\x07\xf6\x1e\x04\x0e\xaf4\xfcq\xd7\
+\xa0>\xa7\xe8\xab\x9bB\xe8\x95\x89\x93\xe8\xaft\xcb\x80\
+ \xfc\xb2\xa9\x09H\xdf+k\xdb\x06g\xc1\x1a\xf8\xed\
+\x8e\x03*\x08\x9f<\xfe\xb6\x00\xa0\xbc\x09\x1c\x05\x04\xa0\
+\xdar\xf3\x08!\x08\xd53ev\xbeD8\x13\x93\x92\
+\x96\x7fA\x9d\xfd\x0al\xb3\x0a\xc2(\x1a\xc0\x96D\x84\
+\x07\xba\x02\x1e\xfb\xc5f8\xeb\xac\x982b\x0da\xd9\
+\x81\x11\x08K\xbfn\xe1`\x08\xcb\x0e\x0cB\xf8\xd9\xc7\
+\xf3\xd5\x9d\xfb\x01\x80\xc6\xe6\xf2\xda8\x83\x00>(\xc6\
+\x08\xde+\x22$(w\xefu\xccf\x0d\x02\xb4>`\
+ER\x15\xcc\xd9\xd2b-\x04\x15B\x08\x18\x11\x8c\x81\
+\x95\xa9p\xf2\xd4B\x87 \xa4\xed\x02\xd3\xc6`\x80\xeb\
+[phjP\x0d\xfc~\x9b\xf8^\x10\x94k\xb7\x15\
+\x91(`c\xc7\xe1\xbd\xc7\x18X\xdf2X#q\x02\
+\xcbz\x04\x15\x02 \x5c\xdbTf\x8d\xc1\x1ae\xedo\
+\x08Ji\xd5\x0e|u\xea\xc5w\x00\xe4\xff\xcb\x03\xa5\
+\x18\x01\x0ce\xc2\xf7\xf3;\xec \x84Y\x93\x11\x08\xdb\
+\x04\xde0\x84\xbe*\xcd\x8cAH\x0d\xddHIf\xf4\
+\xebK\x9f\x83 |\xfa\xf3O\xe6\xab!\xc0r\xe9q\
+\xce\x12T\x13<!\x01\x08\x88\xa4\x0c\xe9\x9cD\x0b\x1a\
+\x14c\xf3\xb85\x06\x84T1E$\xc1\x1b\x81\xc4\x88\
+!h\x06W\x034\x0d<w\xea\xf40\x84\x02x\x9f\
+i\xdf\xd8\xce\x93\x83r\xf3^\xc6!\xf8\xc0\xed\xfb\x06\
+\x0d\x80*\x1bwI>\xd6\x18n\xee\xe4\x05\x89\x087\
+v\x04URY_\xdf\xd6T\xcaQ\xb8u\x0f\xac\x19\
+\x81\xf0\xd9\x17\x16\xd5)\xe8\xbf\x87`\xa4\x18UG\xb2\
+\x13\x0b\x03HU\x8e\x9bR\x82\x1f\xb9\x1c\xf7u9\x8e\
+Y0<L9\xa6\x06\xef\xe1!\xac\xfb\x00\xc5\xc6\xf3\
+\xe7\xe0\x99\xf0\xe8\xb9O\xe7\xab]\x9f\xe3\xe4\x13XB\
+\xdb\x86TN\xfb^\xb1NR\x09\xb69\x909\xc3\x19\
+A\x00\x10DH@&\xe8\x904\x06\xa0\x90\xf9H\xc7\
+=\xe5\xc4\xf3\xa7\xf9W\x08QMet\xebA\x06\xc7\
+Z\x89\x80i\x22\xdf\x08l\xef\x1b\x04EC`s'\
+\x83\xaa\x0a\xb7b_5\xebN\x04\xd5\x18r\xffA\x06\
+OQn\xddUd\x04\xc2\xf3\xcf\x9c\x5cP\x87`D\
+u\xd3\x11Ql\xc9\x84#\x17\x93\xearR\xa0t\xe5\
+\xb9\xba\x98\x94LW\xa0\xab.%\xf5\xc5\xa4\x0e\x01y\
+\xb0>T\xd0g\x15\xc2\xb3\xd8+*\xe9\xb7\xaa\xfd\xa3\
+\x93\x03\xfc\x03\x22\xbc\xed,w)\xd6^\x00\x00\x00\x00\
+IEND\xaeB`\x82\
+\x00\x00\x08x\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x08?IDATX\xc3\xadW\x0dP\x93\xf7\
+\x1d\xae\xdam\xb6\xb7\xebm]\xb7\xdb\xe7y\xfb\xba\xb5\
+\xdb\xda\xab\xb6\xda\xdev\xe7z7\xbb\x8f\xb3n\xd3\xde\
+\xa9\xd4\x8f\xad\xdb\xea\xb4\xee\xe6g\xd5\xda\x22\x88B,\
+\x08\xd1\xc8\x97\x08\xd1\x02\x22\x8a\x84@\x02$\x81@\x04\
+\x02\xf9\x00\x92\x90\x90\x90@B\xc2W\xc27(\x88\xa5\
+g\x9e\xfd\xfe\xaf\x7f\x1c(\xdav\xe7{\xf7\x5cr\xc7\
+\xcb\xff\xf9\xfd\x9e\xe7\xf9\xfd\xde7\x8f\x01x\xecQ\x82\
+\xaeo\x10V\x13\xa2\x09\x1b\x09?~\xe8\xfd\x8f\x90\xf8\
+q\xc2o\x97-_!6{:\xfb\xec\xd7\x01Wh\
+\xe4:/\xe2\xab\xeco\x84C\xfc\xf3\x91_\xbf&\xec\
+\xd6\xd4\x9b\x5c\xd6\xb1pX\x17\xfa\x14JG/\x1c\xc1\
+1VY\xf4\x92%K\xc411\xc7\xfd\x9a\xca\xca0\
+/\xe2\x91]\xbf \xfc\xeddr\x9a\xca1\xf6\xe9m\
+\xfd\x10Pd\xefA\x89\xc9\x09\x95\xc5\x03[\xef\x08\xf6\
+\xec\xd9\xd7\x9c\x9d{1\x1c\xea\x1f\xc4\xe8\xe8\xd84\xdd\
+\xbf\xfdQ\x10\x0b>o\xdc\xb2U\xda:xc\xca0\
+\x0c(\xdc\xc3(1\xb7\xa1\xc4\xe8@\x81\xce\x8c\x84\xcc\
+\x1cde\xe7\x82\x11_\x9f\xb8)\xc0\xed\xf6\xf4\xd1\xff\
+\xfd\xe1\x8b\x10=Kx\x95\xfb;\xc7g\x13\xf9l\x1e\
+\x05\xd4]\x93\x90\x99\xda\xa0\xa4\xae\xaf\xd64!5\xbf\
+\x18\xa2\xa4\xd3\xb0\xb6\xd8\xef\x12\xcf ??\xbf\x96\x9f\
+\xf9\xf9\xa4\x95\xe6\x17\xd42_\x99\xbf\x84\xd7f\xfb\x5c\
+\x1d\x9c\x86\xac\xb9\x13\xa5f\x17du\x16d\x15k\x10\
+\x93 \x81\xa6R;\x87t\xfc\xc6$\xc6\xaeO`t\
+\xfc\x06V\xacX!\xa63\x16?\x8c\xf8{\x84\xbf0\
+O\xed$\xadq\x04\xd0\x05\xc6\xd120q[gu\
+\xfa\xed\xa3s}\x96\xd7\xdb\x90WQ\x8f#\xf1b\x5c\
+.\x90\xddG\xccH\x87G\xc7\xd1?8\x8c\xee\xde\xbe\
+):{\xc7=\xd30\xa3\xec\x9d1a\x9eZ\x02\xc1\
+a\x13\x11\x97u\x8cBi\xf3C\xd7\xd6\x83ZO\x1f\
+\xf4\xbeA\x94\xbbBw|6\xd8q\xb9\xda\x88\xb84\
+)\xd23\xb3\xe6\xf8<\x87x`\x88\x88\x83\xe8\xf0\xf9\
+Q\xab\xd7w\xb1\x02t\x06\x93+t+\x1c\xbef\x10\
+\x94]=S\xc0\xea:\x9b\xd3o\x19\x0d\x87+{\xa6\
+Pl\x0b\x08\xc4\x0cU\xce.T\xb5\x06\xa0\xb6v@\
+aj\xc5\xd5k\x8dH\xb9$G\x8c(\x1e^:x\
+v\xd7L\xea\x91\xb1\xeb\xbc\xe3 \xdc\xed^Xl-\
+(\x92\x97\xa0\xb8L\xe5\x1f\x9a\xb85\xdds\x13p\xd3\
+\x8e\xb0\x8eL\x83/+\xe1\x8a\xb6\x8d\x03\x85\x96\x00*\
+\x1c\x81\xbb\xc4\xdaV?46\xef]\x9f3\xe5j|\
+\x18\x17\x0f}\x83a^\xb9\x07\x87G\xd1\x1b\x0c\x09\x1d\
+\xb3\x10\x96\xab4H:}\x06Z]\x0d|\x93@h\
+\x0a0\xd2\xc4(\xbdcP\x9b\xad\xfe\xd9\x0aD7R\
+\xa2\xf3\xaaL\xa8vu\x0b\x1dW\xb4\xf8P\xd6\xd4\x86\
+\x22\xbdU\xf0\xf9\xfdc\x22(\xcbU\xf3\x12\x0f\x8d\x8c\
+\x096\xf8\xbbz\xe0huQ\x81F$$&\x22\xaf\
+\xb0\x08\xde\xe1I\xf8&\x80\x06\x96\x1d\xef$\xa4\xa6N\
+\xd4\xf9\x87\xd8>8\xc2\xad\xff_\x01\x17\xb5\x06T:\
+\xfcPY\xdb\xef\xf8\x5ce@tR\x0ar\xf2\xf2\xe7\
+\xf8<#\xf7\x8c\xcf]=}p\xb9\xdbajlB\
+n\xde%\xc4\xc6\x9f\x84\xad\xab\x1f\xed7\x80N\x22W\
+\x04>\xc1e\xd7(\xd2\xf5t\xae\xb3/\xbc\xf7pd\
+\x01q\xae\x9f\x9d\xfeh\xd3\xf0mdk\xf4(mt\
+\xa1\xb0\xb6\x19\xd9e:\x88\xc4\x92\xfb|\x9e\xe9z`\
+hD\x90\xbb\xdd\xdb\x89f\xab\x0d\xa5\xa5\xe58v<\
+\x16\xf5V\x07\xda\xc8c\x0b\x05Y\x1d\x04\xa4\x8d=H\
+\xac\xb0\xe3Bs\x1f.\x18\xbdP\xd44\xb0\xf0\xed\xba\
+w\xfc\xa2\x1b\xfa?A\x96\xb2\x1aW\xaaM\xc8\x92k\
+\xb0\xf7\xa8\x08\x0d\x06\xd3\xbcr\x07\xfb\x07\xe0\xf3w\xc1\
+\xeep\xa2\x8a\xfc\x15\x9f\x96 \xefJ\x01\x06o\x01\x0e\
+\xca\x926Dy\xa2\xf63\x0c~\x9c\xaev!\xbd\xde\
+\x87\x0c\xea\xbe\xce\x17b\xa3\xf8\x01\xe1;\xf7\x16p\xb4\
+\xb6w\x02)\x05\xa58'SA\x94~\x01k#\xb6\
+\xcc+w\xa0\xbb\x17\xce6\x0f\x0c\xa6F\xa4g\x9cC\
+j\x96\x14\xee\x9e~\xb8\xa8\xebF\x0a\x98\xdcw\x13\xe7\
+\x8c\x01\xa4\xd4\xb6#M\xef\xc5\x99kn\xa4\xd6z\xa0\
+ \xe9\xdf|k\xb3\x94\xb8\xd6\xcc\xb7\x80\x8ei\xbdC\
+H8\x7f\x05\xf1\xe7r\xb1+\xf28\x0e~\x10yw\
+\xac\x98\xdc=}!x:|h\xb2XQ(\x93#\
+>!\x11&\x9b\x03\x01J7mc\xa8\xfa\xc28\xdb\
+\xd0)t\xcb\x88\xc5\xdaV\x9c\xaar\x22\xb9\xc6\x8d\xac\
+z7.*T\xcd\xc4\xf3\xef\x07m\xc0\xd8\xb2\xd6n\
+\xc4$K\xf1\xfe\x89Sxk\xdbN\xa4\x9d\xcd\x10\xc6\
+jF\xee\x16{+\xb4U:\x81\xb8PQ\x8a\xf1i\
+ @\x01\xab\x1d\x00\x8a;\xa7\x04\x8f3M]w\xbb\
+\x8eU\x98\x05\xef\xa5F\x1f\x8d\xb4\x9f\xbd\x17\x1c&<\
+\xf5\xa0\x02D\xb2F\x0f\x0e}$\xc1\x8e\x83\x91x\xf5\
+7\xab\xd0\xd4l\x15\xd2\xcd\xe4n0\x9a!9\x93\x0c\
+i\xceE\x1a\xab\x09\xa1\xeb\xa6\x91;r_j\x1d\xc6\
+IM\x8b ;#MP\xdbp\xb4\xa8A@\x92\xc6\
+\x8a\xb2\xb6\xbe\xf0\xd2\x97\x97\x8b\xf9\xea]\xf0\xa0\x02\xe2\
+\xf3j\xad\xd8\x15%\xc2\x96\xed\xff\xc1\xcaU\xaf\x0b]\
+\xb3e\x22+\xa2\xa7\x9b\xe8\x04l\x1e\x1fzi\x8b\xf9\
+\xf9X\xe59\x86\xf0\xb1%(\xa4\x9c\x05-N\xd9(\
+\xc8\xce\xbaO(o\xc6\xd9\x1a'4\xae\xee\xe9\x9d\xfb\
+\x0f]\xa5\xf3w\xf2\xbd\xbf\xe8AE$J5\xf5\xd8\
+\xb6\xffC\xac\xdb\xfc6v\xef}\x0f\x8d\xcd\x16\x14+\
+\x94\xf8\xc7;\xdbhCz\xe1\xa1\x99\xbe\xd6\x0f\xe4\xb6\
+\x0c@\xa2kC\xb65$x.\x10R\xd7\xd1\xb2z\
+\xc4\x96\x18qN\xef\x81\xdc\xde\x1d\xce\xd7\xe8\xda\xe8\xdc\
+\x18\x9e\xfaoq\xf9\x9f\xe0\x85\xdcW\xc4\xa9\xd4\xa2\x0a\
+l\xdd\xb9\x17\xaf\xafY'\x8c\x95\xa2\xb4\x0c;\xde}\
+\x17\xe2|\x05\xe2\x8a\x1b\x84p\xb1n\xd9'\xf3\xfax\
+\x89I(\x84\x15\x11_n\x11\xe4>Oa+3\xdb\
+\x83/,]\x96\xc2\x82\xcd\xe7\xfd%\xc2\x0f\xf9\x93\xf6\
+\xeb\x84\xaf\x10\x16\xde[@rR^1\xd6\xff}\x07\
+\x9e\x7f\xe9\x15!\xe5G\x8eD\xe1\xbd\xe8X$\x96\x9b\
+\x11C~2\xa2\xd4\xba\x0eAf\x16.\xe6{\x12\xfb\
+TY\x90\xac\xb5\xa1\xae#8\xb5s\xffA9\xcb\x13\
+'g\x9b\xeee\xc2+\x84e\x84\x9f\x12\x9e\xe1\xef\x03\
+\xf7\x15\x90\x1e\x97u\x09\x7f\xde\xf46^[\xf5{\xa4\
+\xa4\xa6a\xfd\xa6\xcd8\xa36\xe1@\x8eF\x08\x18[\
+*\xac\xf3\x8f\xa8\xdb\xa8B=\xe2\x14\xa4@\xa5\x0d\xc5\
+-\xfe\xdbYWK\xact\xc6\x09\x96%\xc2;<p\
+\xbf\xe3\xaf_\xec\xfbr\xc2\x8f\xb8\x02_\x9e\xcf\x82\xcc\
+\xa8\x94\xf3xc\xfdfDl\xda\x82\x0d\x1b#\x90L\
+\x96\x1c\xccQ\x0b\x84\xac\x80\xe4\x1a\x8f\xa0\x82\x88\xc2\x96\
+^\xe7&\xb9\xdbP\xda\xd0\x14x\xfe\xc5\xa5i\x9c\xf8\
+\x00{\x99\xe1O\xb8\xb5\xfc;+\xe0W\x84\x9f\xf1\x1c\
+<\xc1\x83x\xdf%\x8d\x94dbM\xc4Vl\xd8\xb0\
+\x11\xc7\x923\x10'\xd7c\x7f\xb6Z\xe8\xfaDY3\
+$\x94tI\x95\x03\x17\x9b\xfc\xd0\xba\xba\xa6\xd6n\x88\
+\xf8\x98\xcb\x1dE\xd8\xc4\xc9\x18\xf1\x9b\x84?\x11V\xf1\
+\xce\x7fB\xf8&\xe1\xc9\x87M\x814&=[\xc8\xc0\
+\xf6CQ\x10\xc9t\xd8#-\x156\x19\xf3\xfd\xa4\xda\
+\x8aL\xbd\x1b\x15\xed\xc1\xdbQ\x09b5[\xdd\xdc\xe7\
+\x08\xfe\xae\xf8GN\xfa\x06'f/\xb2?'|\x9f\
+\xf05\xee\xfb\xa2\x87\xed\x81\x0cq\x9e\x1c\xff:\x10\x89\
+3ezl\x93\x5c\xc6\xe1|\x1du\xed\x84DkG\
+\xae\xd1\x13.7Z\xfc\xbc[6V\x7f\xe5\x04/\x12\
+Vr\x9fW\xf2\x8e\x9f\xe5\xc4O\xf3\xae\xbf4_\xe8\
+\xee\xbd\xf6\xe5\x16\x97NfW\xd6c\xdfy%\xb6\xc4\
+g\xe3\x84\xd2\x84\x1c\xb3\x17\x1a\xabgx]\xc4&)\
+_\xa5;\xf8H=\xc5I\x9e#\xbc@\xf8%\x97\xfa\
+\xbb<h\xb3\x89\x17|\x9e\xd7p\x16\x14\x89T\xef\xc4\
+?O_\xc2yC\x07\xb4\xee\xbe\xe9cI\x12\x15\xef\
+x7\xbfg\x01_$O\xf2\x1f'\xdf\xe6xf\xd6\
+\xa2\xf9B\xc43\x17;\xf0`\x86\xac\xdc\xadl\xed\x0e\
+\x17U\xeb]\xfc\x95\xe9\x10\x0f\xd7\xec\x87\xc8BN\xb2\
+\x98\x13.\xe6\xa3\xb5\xe8\xff!\x9e}=\xcee\x8e\xe2\
+\x9f[\x09?x\xc0\xbd\x0b8\xd9\xc2\xcf\x22\xfd\xac_\
+\xd5\xff\x05BZ\xb5\xfcJ9\x80\xc8\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x04\xd3\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x04\x9aIDATx^\xad\x97Mo\x1cE\
+\x10\x86\xdf\xea\xee\x19\xaf\x0d\x17\x8e\xf8\x1f\x84\xbf\x00\x97\
+\xfc\x0b\xc8\x81\x13\x1f\x02\xc9\x9c@\xe2\x12\xad6A\x0a\
+\xe1\x002'\x90\xe0\xc0\x85\x5c\x80\xdc\x90\x10\x87H(\
+H\x11\x90K\x82B@A\x0a\x06\x7f`G\x89\xbd\x8e\
+c\xef\xcct\x15\xbd5-\xb5\xd4\x9a\x99U\x14Jz\
+\xdd\xed\x9e\x9a\xee\xda\xadg\xabfHD\xb0\xc8N\x9f\
+\x99\x10\x80 5B\xbf\x09\xe2x\xe5\xcb\xb1`\xb1A\
+\x03\x88\x87|\x0f\xc13}~\x03\xeb2\x14L\x8f\xbe\
+\xbari\xfc>\x008${\xee\xe2\x87\xe3\xd5\xe9\x11\
+\xc0\x0cx\xcf`\x08|\xc3xj\xc5\xc1{\x81s\x06\
+Da\xb4\x84\xaa\x06D\x80\xbaf\xbd\xb9,\x0d\xaa\x86\
+\xf5\xe6\xb2t0f~\x0d:\x8a\xb42F0\x1a\x01\
+g\xdf9\x07\x00\x1a\x80A2uv\x16\x00\x01\xd77\
+\x80\x95\x91\x0d\x87[\x5c\xff\x8b@D\x98U\x8c\xab\x7f\
+\x88\x1e\xce,a\xbd\xf5-\x9c\xd19{\x8f\xa7C\xb0\
+?\xdc\xae\xd14\x0c\xcf\x8c_\xc2zU\xd7\x18-\x01\
+\xd7\xfe\x14\x14\x96\x16\xa6 \xcf3%\xa5\xff{\xf2/\
+\xd9\x5c\xb2\xeb\x83)\xb8\x0a\xc2\xb9\xb8\xb9\x89rI(\
+\x82\xca8:\xf5I\x0cpP\x13T\x07Uql\x92\
+\xc0\xaa\x0c\xce<\x80\x17 \xf8\xb9\x83v\x8a2]\xdf\
+F\xcf\xa7\xe64\xc7e\x90\xe6\x9b\x22\xecHAd\x10\
+~\xb4>^\xbd\x7f(h\x9a\x90\xcbe\x87Y\xed\xf5\
+\x5c\xe7(\xacI\xbb#\x0b\x0a\x07\xd4\x0d`\x0c\xc1{\
+\x8f\xa5\xd2)d'\xb3&\xe4\xda)\x1f\x9e\xe7<X\
+\xbc\xfb\xb6\x02\xf7AGJ\x90C\xa8\x90\x15\x86\xe0\x8c\
+\xc1\xb5;a\xe3\xc2byD\xb8\xf9\x0f\x94|\xdfx\
+\xfc\xbaE\xa8\x1b\x815\x84\xebw=\x08\xa4\xdb\xdeP\
+\x1f\xa3\xb0\xdd\xd8$\x94\xce\x85\xfb\x09\x03\xdc$\x08c\
+\xa1\xc9!\xcce\xd2\xd8\x0b!\xf7\xa4\xe0\x22\x00\x9f\xd6\
+\x13\x0b9\x84\xe7\x01XU\x82n)j\x14\xc72\xca\
+DqT\x155\x0b:\xd1\xb1U\x95q\x83!\x08\x7f\
+\xd2\xd9\xf0'OJ&\x99\xbe\x05a\xbd\xe7>\xe9\x0b\
+\xe0\xd4z\x80\xf0\xf8D\xdd\xb4\x12\x16\x85\x81\xa8\xbbh\
+>\x0f\x0ekXku\x1dh\xab`Y\x92\xfa\x08\x13\
+\x5c\x81\xe0\x07\xac\xadM\x18\xc0\xc7]\xc1\x0eAHF\
+\xe3\x13TU\x8d\xdfw\x80\xe3\xe3J\xef\xbc\xb9\xc1a\
+\xceXY.\xf0\xf7\x81\x81\xf8\xb6D\xdf\xd9#p#\
+(\x1d\xe1\xf6\x8e\xa0\x9e\xb1\xfa\x0f}cy0N\x01\
+l\xed\xd6\xda[\x93\xed\xe8\x80l\x03\xf3\x98)\xf8.\
+\xf3\xc9\x9b\x97\x82?\x07\xd1\xcd\xff\xc4 ~\x04\xe1\xbd\
+T\xf9PF\x8d2\x08\x83\x14P\x9b6T\xc2\xeb\x04\
+\x1eb\x22s%\xeb\xfa\x15<\x0f\xc1\xb5\x85?\xbf4\
+\xcf\x8d;*\xa1\x8e\x99\xbe\x06\xe1Bg%\xfc\xfc\x93\
+\xf1\xb3\xd3#\xd6\x85\xc2j{\xd5N\xa7\xbb\xb3\xc4\xca\
+' \x02\x96J\xc2\xe1\xc3\x1a\xcb\xa3\x02\x00\xd4\xd7\x1a\
+\xd2.\xc8\x22(\x9c\x85\xb5\x00\x0b\x81\x99a\x88\xb02\
+\x22\xbc\xfa\xe6\x04\x00.tA\x88\xaa\xe6@\xb1\xd1\xc5\
+\x8d\x07\xc0\xca\x92\x81\x08\xe3\xee=hU#H\x98\x0b\
+\x88\x82\x00lM\x1d\x1a\xef\xb5\x8do\xee\x1b\x0d`y\
+d\xb1y\x10\xcb\x03\x08w\xf7\x04\xa3b~M\x82\xff\
+p\x1d\xb8\xf5\xc6\xday\x85\xf0\xc9\xeb\xc0p\x0a:\x03\
+\xc8 \xb4\xdd\x10\xaa\xca\x01\x08\xab\xa0\x13U\x82\xb1\x8a\
+\xf2\xa95G\xeb\x87P\xcd,\xae\x86\xd1\x16\x7f\xfao\
+@\xb1#\x0e\xa4\xe0\xd4\x17\x9f\x8eW\x99\x81\xd9\xcc\xc3\
+9\xab0\x19\xa2\x08 \x00\x22\xad\x90\xce\xcdG\xe8\xba\
+\xb5\xd4\x8es\x07\x82\xb6r\x22Rx\x1b\xcf\x18\x95\x06\
+/\xbf>\xe1\xd8\x92\x91\x07a\xf2*\xe1}K\xfb\xd6\
+\xbe\x1e\xae\xfe\xbb\x0f[\x1c\xd83\xee\x1d\x19\x88fV\
+\xb0}\x80\xb9\x8f\x1e\xfe\xef\x14\x10\x16=|gJ\x10\
+i\xdb\xf3\xee\x91$N0\x0c\xe1o!\xd2\x9d\xac\x19\
+\xfd_)\xb8\xacc_\x0ab5\xech\xc7*m\xc1\
+O\xd0\x8e\x9b\xa0:\xaf\x82\x8b\xdbq\xdeT\x1e\x1f\xc2\
+4WK\xe3\xe9\x97&\x9dO\xc5\xa7.}6^\xad\
+\x1b\xc0\x1a\xc0+X\x84\xaab}\xe9\xa8\x1bA\xe1H\
+\x8b\x95\xb5\xb1:2+/\x14c%R0\x15^\x02\
+\xe9\xb5\xf6\xe4\xc8\x87>\xee\x09\xce\xbc\xd6\xf3b\xa2\xee\
+\x22\xfa\x00\xfa\xe0\x11\xe9\x9d\xd6R\x00L\x0f\xd7\x03\xf6\
+O\x8cn)\xcc\xd8;TP\x15\xb8\xddi{\xb0\x04\
+\xdd\x0f\xa0\x1a\x83v\xfeH?P\x0b\xf3\x81\x80\xcc@\
+%|\xf1\x95\xc9v\x9e\x82\x01\xe5&}\xeaz1\xc9\
+\xde\x8c\xb2\xb7\xe0\xfc\xe5$A\xe9\xa2l\xfeb\x92*\
+\x9d\xaa\xce*_\xf60\x9a\xccdt\xe60q\xda4\
+\x11\x1eu\x9c\x94\xcao\xf4k\x86\x0fO\xf6\x1f\xaaz\
+\xaf\xba\x88#\x101\x00\x00\x00\x00IEND\xaeB\
+`\x82\
+\x00\x00\x06\xd2\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x06dIDATX\xc3\xed\
+V\x0bL\x95e\x18F\xb4\x92r.Sgn\xea2\
+MR\xccKNAB\xa4\x0448 w\xe1\x98\x5c\
+\x04\x01\x15\x111\xe0\x80\x5c\xbd\x00\x02\xdeAD@I\
+\x11o\x04\x89\x01y\x03\x0b\x02/(jq\x92\x05#\
+\xe1Dc\xd0\xdc\x8e\xd2v6\xb6\xa7\xe7?|xA\
+Er6\xb7\xd6\xd9\x9eq\xce\xff\xff\xef\xf7>\xef\xf3\
+>\xef\xfb\xa3\x03@\xe7UB\xe7\x7f\x02\xffY\x02\x9f\
+\xca\xe3f\x11\xbeD\x0a\x91!\x10C\xd8\xfck\x04x\
+\xb8\x81HR\xee\x15\x9aW\x1f\x9aX\xdd\x1a\xb5\xad\xf1\
+nt\x8aJ\xbdq\xa7J\x1d\x9f\xa6\xec\x08M(m\
+\xe2\xfd<\xc2\xe1\xa5\x11\xe0a\x16R\x85\xf2\xb5\xd9J\
+E\x92\xb2c}\x82\xa6\xcbS\x018\x04\x00\x8b|\x00\
+sw`\xa1'\xe0\xb2\x1a\x88J\x01r\x0b\xda;\xad\
+\xbd\x93k\x193\xee\xa5$\xf6\x0c\xc9\xab\x0fKR\xa9\
+}\xa2\x00\x1b&\x9d\xef\x0d\xcc^\x06Lw\x03\xa6:\
+\x03\x93\xed\x81I\xd6\xfc.\x03,=\x80-{\x80\x1d\
+\xd9\xb5m\x8c\x0d~\xd1\xc4\xe3\x08\x85Tq\x18\xe5\xf5\
+\x8a\x04\xac\xd6\x00\x9f\xac`b&\x9f\xe3G\xac\x22H\
+f\xb6?0\x8d\xd5\xeb\xbb\x02\x13m\x81\x19\x8e\x807\
+\xd5\xc9/\xd1tI\xadz\x91\xe4\xab\xad\x96'\xd7\x06\
+\xc7\xd7\xb6\xf9o\x04dk\x01\xd3\x95\x801\xe55]\
+O\x221\x94\x9a2{\xec\x02\xdcw\x03N\xc9\x94\x9f\
+\xca\x18\x91\xe0T\xb6b\x06\x89\xc8C\x80c\xdf\x02R\
+\x1b\xfeq\xd5\xbe\x11\x85\x0d\xeb\x935]N<\xe43\
+\x1ej\x12\xc8\xbf\xac\xc8.\x11\xf0\xcb\x04b\xbf\x06\xd2\
+\xce\x03_U\x02\x99\xdf\x03\xf1E\x80/\xaf[\x91\xac\
+!\x9f\x9fC\x95\x96F\x90@\x09\xe0\x1f\x99W\xdf\xdf\
+\xe4\x0e\xd6R\xd5\x09\xb5m+\xe2h\xacu\xecsP\
+w\xe2\xc5L\xec\x9b\x05lf\xa2#\x97\x81\x1f\x1a\x80\
+\xd3\x97T\xea\xe4\x9c\xf2\xe6\x80My\xf5\xf19\xd5\xad\
+\xc9g\x81\xe5\xfb\x80\x05\xd1\x8c\x09f\xe2\xad\xc0\xa9r\
+\x80\xe7\xd6\xf4Kr\x87\x95\xa9\xb7\xc2\xb6\xb5w\xba\x92\
+\xb99\x0f0\x0bcE[(s:\x10\xce\x8a\x0fT\
+\x01\x15\x8d@\xe9U\x95\xda-(\xf5\x96\x98y\xb9\xd8\
+\x051\xc9'8~\xc7\x01\xc7m\x80\xfd&N\x02\x09\
+\x9f\xf9Qx\xe0\x91\xd95xJr\x85\x07\x1d\x1e\x94\
+\xa4\xe9\xb2\x0ber\xcan\x11\x0b8\xef\x00\x02\x8e\x00\
+\xdb/\x00\xc5u@e\xbdZ\x13\xbe\xb3\xb0A$\xb6\
+\xe8u\x86YPRa\xc3\x16J\xee\x99\xc1\xea\xf7\x92\
+0\xbfg\xe6+;\xa4\xbc\xd2\x031\xfbr\xbb\x7f\xf4\
+\x90\xe8\xe9\xf7\xca\xe8\xd2\xa6U\x94X\xc6\x8a\xcd\xc3i\
+\x9a\x04V\xcd~n8\x05\xe4\x5c\x01\xaa\xee\x00EU\
+\x8dwm|\xb53\xed\xfe\xac\x8d\xe8\x1f\x97W\x9fr\
+\x0eX\x97\xc7\x11\xcc\x07\xcaji\xd45Z\xa5\x0c\xa4\
+\x07j\xcah\x98=9\x0fIH\x7fC\x92\xd9\xefx\
+&gb\x0b:\xdb\x9eU\xfb\xe5\x02\x894X\x01\xab\
+\xbezG\xd3\xb5y\xbfv\xabI\xab\xd6\xa8\x8f\x16\xca\
+c3\xcb\x9bw\x96\x01\x09t~\xc1%`\xef1\xed\
+\x0ePh7\xa1D \xfd\x10\xb0\x91c\x13\x9a\xa8%\
+Q\x14\x18\xaf\xec\xf0d\x8f\xad\xa5\xf9\xde\x0c\xb8\xa6\x01\
+kO\x02\xbb*\xd8\xbb_\x81K\x8dj\x8dOd\xb6\
+R\xf2G?<\x94\x92^\xdcx7\x83\xb1\xc7\x98\xfc\
+\xfc5\xb5F\xe6\xd3\xbd\x05\x1f\x10\x88\x92\xcc\xc1\xa3\x16\
+sL\x5c\x14j\x8d#+\x96\xd1\xed\xb6I\xc02J\
+\x1eB\xc9\xf7K\x0e\xa7\xe4\x95\xb7\xdb;\xfb\x92\xbc\xf7\
+\xbba\x09My\xeagVN\xd9+\x94\x9a.\xaf0\
+-\xf1\x07\xb1Z\x02!\x5c\x16f>\xdd[\xcc\x8c.\
+_\x18\xdb-\xb9W\x0e\x10A\xc3\x1c\xbc\x06T\xab\x80\
+\x93\xe5\xca\x0e\xdb\xee\xe4\x0e\xfd\x1c\xdf\x98\x83\xa5\xca\x8e\
+\x0b\xb7\xd9\xb2\xdf\x80\x98Tm\xcb\x1eSMK@\xc1\
+\xddl\xce\xb96\x22\xcc\x99\xdc\x81\xed\xf0:\xcc\xe4\xa5\
+@\xd6uJ\xfe;W\xe7\xc5\xc7\x8d\xda\x9f\xdd\xe1\x1d\
+\x91\xad\xbc\xc9\xd8\x9b$\x1f\x9b\xa6M\xaex\xe2\xff\x01\
+\x89@\xec\x01n2Jn\xc9~;\xa629\xcd\xb6\
+\x8e\x86\xd9^\xcd1\xe3|\xef+\xa8n5s\x8b\x89\
+3u\x89\xf8HGGg 1\xe8\x19\x90\xee\x0d4\
+\xb2\x09\x1c)\xbdr/\xfe\xd4\xdeY\xd7\xfa0\xb9\xce\
+\xd3>\x12\x81D\x1al\x19\xe7\xd3\x85\x8b\xc5\xe7(\x0d\
+\xc7\xe4\xb1\x5c\xa3\xe9\xec[n\x95J=\xdf5:\xcb\
+\xc86\xe8c>\xaeG\xbcI\xbc\xf5\x0cH\xf7\xf4\xe6\
+\xb9lX\x9dz\xbc\xea\x8fkM\x9a\xae\xe5\xe1YJ\
+3\xb7\xe8\x0d\x82\x9c.1\xe0\x09\x02\xd9\x17\xba7Z\
+p!\xb7\x14\xd7f\x02\xc7r7\xa5?\xf4\x0bg\x96\
+\xf2\x9d(\xaf\xfb\xd3\xc41,\xe9C#\xbb\x99\x0c\x19\
+E\xbc+0Z\xa0\xe7\xf7(CY\xc0\xd2\xd8\xb4\xe2\
+\xe6\xb2\x1b\xed\x7f\xb9\x04\xee\xae3qR|\xc9\xebC\
+\x88\xc1\xc4\xebB)\xdd\xc7\x08T\xd4sDj\x98\x90\
+I\x8fs\xc6\xbf\xe1\xa8\x9dn\x02\xce\xb5\x00W\xda\x80\
+&5_.\xc55\x1ds\xac\x03\x12\x192\x99\x98B\
+\x18\x10S\x05\xa4\xefS\xde\x9fn\xfe\xb9ghF\xc3\
+\xae\xbc\xca\xb6yN\x8a\xa2Y\x8b|\xfdx}\xac \
+7\x9c\x18*T|\xed\x01\x09i}\x96\x5cV\xa9\x89\
+{%W[\xee}w\xbd\xe5\xde\x99\xeb-\xf7\xcf\xd6\
+\x127Z\xee\x9f\xbf\xd1\xdc)\xe1\x5cms\xa7gh\
+z\xd3\x98I\x86K\x19f&\x85\xf6\x82t\xcdt\x8c\
+\xbe\xa1|\xc6\x02\xcf\xad\xc3F\x8d\xb7\xe0\xefY\xc44\
+Az\xbcP\xebmAb\x90\xb6\x1d4\x97%{\x94\
+e\xba$\xf2\xe0<\xe7\x88\xc3&\x0e\xa1G\x8d\xed\x82\
+\xf3\xe7\xda\x06\x15\x1a\xda\x04\x9e6\x94\xad)6\xb4\x0e\
+(\x950a\xa6e4\x83\xec\x09G\xc2\xa9\x17\x1c\xc5\
+\xbd\xc5\x84\x8c\xb0\x22,\x05\xb1\xb9\xc4tb\xa2PC\
+R\xe2\x8d\x1e\x15\x06\x8a\xfe\x0c\x13rI\xf2\x1a\x11\x0b\
+\x08kq\xa83\xe1J\xc8\x89/\x08w\xc2\xa3\x17\xdc\
+\xc5=\xb9x\xd6Y\xc4Z\x8b\xb3\x8c\xc4\xd9cE\xae\
+\xc1\x22\xf7\xab'\xa0+\xe4\x18*\xe4\x99(\xe4\x9a+\
+\xe4\xb3\x14r\xca\x84\xbc/\xbd\x05\x03\x84!\xf4\x84A\
+F\x0b\xc3L\x16\x06\x92\x8cdH\x18\x13&\x92\xd1\xfa\
+2\xa1x\xc6X\xc4<\xdf\x84\xe2\xa3+FCO\xb0\
+\x1b.\x98Jr\xbdGL > \xf4\xfb\x1aCq\
+O_<;A\xc4\xf6=\x86\x8f|t\x05\xab\xd7E\
+\x7f\x86\x88\x00\xa9_\xef\x10#\x88\x91\xcf[D\xe2\x99\
+\x11\x22f\x988\xe3\x89E\xd4\xf3.\xf8\x1b\x95\x0d\x18\
+[&\xd07\x16\x00\x00\x00\x00IEND\xaeB`\
+\x82\
+\x00\x00\x06K\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x06\x12IDATX\xc3\xc5Wkl\x14U\
+\x14\x9e\xc7\x0e\xd3\xdd\xa5\xd3.\xeeBa\xb7\xa5\xd1\x02\
+\x05Z|\xd4\x14\x81\xb4@%\xc6\x07\xa1Jx\x04\xf9\
+\xa1\x09\xf2\x03H\x08\x89\xc1\xa8\x18\x88\xd1\x80\xf1\x8f\x1a\
+\x81\xd8\xa01>\x80\xc4\x90b\x09\x914\xbc\xc4\x86\xca\
++<\x22PR\x08\xb4\xdb-\xad\xb4t\xedvgv\
+gg\xef\x8c\xe7\xec\xdc\x85q\xbb\xbbl\xcb\x0for\
+2;w\xee\xbd\xe7\xbb\xe7|\xe7\xb1\xaca\x18\xcc\xff\
+9l\xa9\x13\x0bW}\x5c\x07\x8fe)\xd3m !\
+\xcb\xbb\x042=\xcdy!\xba\xf6\xdc\xc9\xfd\xdb\xdaF\
+\x05\x00\x95oy\x7f\xcdj\xeb\x84\xbf\xabWQ\x94\x08\
+I\xbe;\x1dv\xbe\xb8\xb8\xc8\x91\xbaQQ\xa2\xc4\xdf\
+\xd5\xa3\xfcu\xf5V\x08.\xf2;L\x1d\x00 'F\
+\x0a 1&M\xf28m\x82\xc8\xc74\x86\xf1x|\
+R\x5c7\xe7Y\x166\xf1\x0c#\xc0N\x1b\x08\x07\xef\
+\xe8\xc5x\x9ca4\x90\xd2\xd22\xd7\x82\x055\xde\xee\
+\xee\x80\xb7\xf1\xe0\xd1\x05\x00d'\x80\xd8\x9dI\x0f\x9b\
+\xca\x01\x8b\x0b\xca\xa7N))Z\xbel\xf1\xe4\xfc\x02\
+\x8fC\x8d\x99\x8aP\xa9]d\x98\x96\x96\x96\xee_\x9b\
+N\xf4\xe2\x1eX\xe7\x989\xa3L\x9a\x0f\x8a\xa3*\xc3\
+\x10\x9d\x02\xe4T\xf2M\xc3\xbe\xf6\xf6\x9b\xfe\x1d\x00\xe2\
+\xa7\x9c\x00\xa4\x80\xa9\x9f8\xd1\xfd\xe9\xa6M\x1b*\xc2\
+\x0a\xdc\x12\x9c\x90\x07\xca\x83\xfd\x81\xd0\x97_}\xb7\x17\
+\x96l\x86\x83eX\x87|\xa8\x9f7\xf7\xd9\xb5\xf5\xaf\
+/yR\x8e\x98`\xedy0KB\xea\x07[\xbeh\
+\x86u\xf5\xe9tp\xd9\xfc\x03\x9b\x9azz\xfaU\x0e\
+L\x8e0u\x8a\x95\xe5\x1e|\x97\xe9\xb3\x0d\xe4\xb3\xd3\
+\xad\x97Z\x07\xee\xf7)\xe8\xa6\x18\xb8C\x89\x82%\xf2\
+$\x11\x80U\x00\xc8E#\x06`\x1dhVBL\x10\
+\xa8 \xc38v\xad\xedF\x10\xbf#g\x90?\xe8:\
+\x8f\xc7\x05vc\xbc#\x22\xa1u\xa0R]7\x0fE\
+ z\x96\xd4\xc1&\xd7\x83\x05\x18\xde\x5c\x9f-\xd3\xe4\
+d\x81\xb8\xf1Py\xd2\x0a\x19\x86Wr\xb9D4\x7f\
+\x9c\x02Ew\x85\x95(\xc2\x19\x1a5\x00\x83*\xc7P\
+C\x22\xa6\xe3-\xf8\xd8\x09\x8f\xd9\x93\xbc%\xf9hz\
+\x8cZ\x8c\x18\xc6P\xc9\xd9?/\x07\xd1=\xa3v\x01\
+*\xd7\xd0\xa7\x84J|\x98\xf2jx,z\xf9\xb5\xba\
+*N\x90\xc4(\x90o\x8c\x00\x09\x0b \x1d>\xd4\xdc\
+\x19\x0e+{\x80\xa4\xa1Q\x03H\x98\x9f\xde>\x06\xa4\
+\xc2X\x87Q\x0d\x8a/\xe0\x8f\xcaY\xe5\xd2\x8c\xca\x99\
+\xae\xc9OU\xb8\x87d\x93\xa4,\xaf\x92\xdf\x9a\x9a;\
+\xcf\x9e\xb9\xb4'[\x22\xca\x99\x84\x08\x023\x9d\x0a\xc4\
+*p\xfb\xa4\xad\xdb\xb7U\xd9\xedf&D@\xb2\x82\
+\xbe6\xd7\x0c@\x9e8rp\xffmEV\xf6\xc0\xf6\
+\x9f\x99\xc7%!I\x02 \xa6\x15\xa2Q\x95\x04\xba\x02\
+\xa1\xae\xce@\xc8\x0fr\xb7;\x10\x12\xc6@\xcc\x83\xd9\
+1g\xb8'\xf8\xa45\x1b6V\xbe\xf4j\xdd\x87\xce\
+\xb1\x8eS\x98\xd0\x1e\xcb\x02\xa8\x1c\x15#\x170\xce\x86\
+\x06\xfb\xe4\xfd\xdf'2\xa1uT\xd7,\x9c\xeb~n\
+N\xad/\xa6\x89|4.\xf2\xd3\x9e\xae\xf1\x96\x95\x97\
+\xbb\x8e4\x1d\xde\x01 \xbc\xe9\x5c\x913\x09\xe34\xb4\
+0\x00l\xc2\x83L\xb8>\x85\x8c\xeb/\x9e\xbf\xbc\xf6\
+\xed\xf5\x1b+\xd5\x98\xc8\x87\x81\x0f\x0e\x87\xc7\xb1t\xf5\
+\x9bS\x7fl\xf8v\x1d|\xbf\x91Z\x1d\xb9\x91D\x01\
+\x12Q\xb7\xa4\xe24\xa9{\xb7\x0c\x8c\xbf|\xfe\x8f\x00\
+\xba#\x02\x84\xed\x87\x00\x0c\x0e\x89\xfc\x92\x15\xf5%i\
+\xfa\x8c\xdc\x00 \x09\x89\x85\x03\xd92!\x828}\xb2\
+\xb5_\xcc3\xdd\x85\xf5`0\xcc0c]>\x09\xf8\
+0\x07\xac \x8d<\x13R\x0ehI7<\xba\x8b;\
+\xd7\xd7\x1b\x08\xa1\xbfpO\x04@(P!\x8bKK\
+0Y\x95\x8f\xca\x05\x08 N-Arh#\x0d\x9a\
+\xc2\xd1jI1F\x9d\x8a\x0dK$$\x5c`@\x1f\
+\xa1\xb30x\x8bpI\xc1[:\x0b<NLZ\xb8\
+\x87\xa15\x01\xf2\xc2\xb0\x9a\x90\x11\x00k\x0e\xf8n\xb0\
+I\xdf'\xda.\xfdA=\xc0\xbdB\xaa\xcc[\xfa^\
+\xb5\xaf\xb4x\x22\x86!\x92\x10I\xcb\xd9\x90\x0e*\xe9\
+\xba\xe3\xefMmVm\x99\x94\x9b\xc5\x94\xe1@\x11\x8b\
+\xc5E\xb3\xa4b\xec\x09\x0d\xa2\xa1B\x87\xc5\xe2\x09\xe1\
+8\xdb\xcaY/\xd4\x14\x0d\xc2=U\x0d\xdb2\x0cE\
+\x86\xe9\xeb\xbe\x99\xb6 qY\x94\xdb\xe6\xd4\xbf\xbb\x14\
+n\xe3\x0cG\xcc\x02\x84\xb7\xc7[\xf1\xf6\xf1\x0e\x87\x94\
+?\xfb\x99\xba\xb7^\xa1-\xbaTQ\xbb\xaav\xee\x1b\
+\x9b\xb7?_[\xbbL,\x9cR\x98\xa8\x09\xf0!\x1f\
+\xbe\x16\x8cUI\xeb\xf1S\xd8?\x1e\xc8\xda\x13\xa2\xf2\
+\xda\x15\x1f\xbd\x08\xb8\x96\x03\x8c\xe9\xde\xc9%EUu\
+\x8b}\x91\xf8\x04;\xde\x08\xad\x80=a!\x1c\xcaj\
+\x9dr\xc7\xb5\x0b\xff\x5c\xbdp\x11\xab\x9cQ6\xa3\xdc\
+9\xbd\xaa\xda\xe5\x187M\x0a\x0e\xc2Z\x0d\xdbwH\
+\xcb\x85*9\xde\xb8\xf7V\xf7\x9d\x8e]\xa7~\xf9d\
+\xa7\x91\xd2\x84\xa6\x02\xe0\xe6\xaf\xdc\xbak\xd5\xbawV\
+\xbb'\x8cw\xc4\x88\xc8\xa3b,4\xe8\x7f\x5c\xca\xf3\
+f\xa9E\xb3:\xa1\x18\x89\xa2\xb9\x17[/E1C\
+\x0e\xbb\xa7<\xc8\x03Z\xc8\x1fn=v\xb4\xc7\x7f\xab\
+\xbd\xe1t\xe3\xe7_'\x02\xc30\xf4Gr\x00!\xdd\
+\xeb\xfd;\x02\x1aY\x0c;5\x18\xd4B\xc1\x01\x0d\xdf\
+\x13v\x85\x05\x85O\x8c\x13\xb4q.\xe1a\xb6\x82\x08\
+\x81\x87\x16\x8d\x92{w\xefF;\xda\xdbe\x7f\xfb\xcd\
+3J\xf8\xfe\xa1+'~h\xceD\xf8a\x00t\x12\
+o\xdc\xb7\xabA\xd0\x09\xb1\xe9z\x5c0t\x22\xc4U\
+y@\x8d\xc8\x03\x06\xa3s\x09\x10\x10\x01B\x9e\xd3-\
+\x08ynj:\x836\x84\x86\xae\x139\xa6\x84o\x0f\
+\xf6u\x5c\xe9\xbc\xder\x1df\xc3\xd9B|\x98\x0b(\
+R4\xac\x93\x8a\x9d\xbe\x0b\xf4\x1bO\x9fl\x8a\xd1t\
+\x8b`\xbc\x83S\x18p\x08#S\x10\xd1\x5c\x5c\x90\x0c\
+'\xb4\xa6J\x95\x10z\x98m\x04\x00\x12\xde\xa0gD\
+( \x9dI\x93\x0cm\xff\xcdx`_\x96M\xde\x80\
+z6q\x90\xcd\xa2\x98\xcb\x00\xc0H\x01\x90\x04\x91\x14\
+\xddH\xf37\xec_5\x1d,e\x8c\x04\xaa\xe9\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\x94\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x04&IDATX\x85\xc5\
+\x96mLSW\x18\xc7;\xc5\xa9sN!\xc6Ee\
+\xbe\xc4\xf8\xc2\xc8\xc4\x84-C\x08t3j\xf4\x83s\
+\xcb\x14L\x8c\x89\xc9\x8c\xc9\xa2&f\x89\x19YP\xdc\
+\xa7\xc5\x84}3\xc6\x97\xf8a[\xf4\x83\x13\xfc`\x8c\
+A7\xd4\x11\xa7 \x82\x88\xa0\x85\xad\xa5\xb5@[J\
+i{[Z(\xf2\xec\xf9\xf7\x9c\xb3{!\x8aU\xae\
+\x91\xe4\x97s\xee\xe9\xbd\xe7\xff{\x9e{{\x8b\x85\x88\
+,o\x927\x1a\x9e\xb2\xc0g\xdb\x8f\xe4\x1a\xd83\x86\
+r\xe6\xa4\xa4\x82\xc93U\x807,-=z\xd6\xa6\
+8\x7f\xf9v\xb7\x91\x9bum\xfe\xd6vW\xb8\xdd\xee\
+\x8e4\xb79\xc2_\xec>\xda\xc4\xd7\xac7S\xa0\x81\
+G\x1a\x19!R\xa3\x9a\xab\xbfX,N\x1e\x8f\x97\x86\
+\x87\x87\xa9\xb9\xb5#j->|\x8a\xaf\xcb6M@\
+\x85>\x0fM\x8bPK\xcb\xc3\xa4L\x22\x91\xa0\xea\x1b\
+\x0d\x01k\xc9\xe1#\xa9H\xa4$\xf0\xf4)qu:\
+c\x8f\x83A\x8d\xea\xeb\xef\xfe\xdf\x91H$B\xd7j\
+\x1b\x93\x12\xa6\x09\x0c%\x9eO\xa0_\xa3\xdbw\xeaG\
+\xdd\x96H4J\x85[\x7fh4E 1<:p\
+ph4\xc1P\x94n\xfe\xf57]\xbd\xfa\x07]\xa8\
+\xac\xa4\xaa\xaa\x8b\xf4g\xcdu\xda\xb8\xa3\xec\xa1\xc5b\
+yk\xc2\x02\x08\x1d\x88\x0bb\x83\x02\x04c\xc4\x9a\x16\
+M\xd0#\x9b\x83*/^\xa2\xd3g~\xa1\xb3\xe7~\
+\xa7\xda[w(\xff\xcb\x83\xf7M\x11\x88K\x81H\x5c\
+\x171\x12\x8d\x8dP_(N\xaen?u\xba<\xe4\
+\xe6\xb1\x8fo\x0b?\x03\xf7L\x11\x88q\xb5\xa1\x01n\
+uTH\x18\xe7\x18\x81\x16\x13\xeb\x18\x93b|\x8d\xfc\
+\x0aO\xfc\x19\x88\x0e\x8a\x8dU\x901\x10\xf3@D_\
+\xc3\x1c\xeb\x903M@\x93U\xf7i\x22\x00\x8c\x9d\xab\
+N\xa8uH\x9b&\x10\xe6\xcaz\xc3bc\x8c\xbe\x90\
+\x08\xf2\x04\xf5@\xac\xe1X\x8d\xb8\xc64\x81 W\xdf\
+\xd3\xaf\x87c\x04\xc6@\x88\xe0\x9c\xd7\x22\x10\xe0\xd6\xba\
+\xfb\x88\xba\x02\x22\x04\x01J\x06k\x00kj\xee\xf2\xf3\
+\xed\x180Y\x00\x9b\x22\x1c8{\xc51\xa40\xfe\xe3\
+\xd5\xe7\x10\x80\x18\xae1U\x00\xa1\xd8\x1cc\x87G\x88\
+ \xd0\xd1\xabw\x07s%\xe7\xd7L\x14\xf0\x86\xc5\xc6\
+\x08@\xb5\x100\x0a\x19;\x825[\x8f\xc9\x02]A\
+\xbd:\xbb\x8f\xe8q\xb7\x10A(d\x94\x18>\xc3\x1c\
+\x02=!!\x807\xe1xo\xc3\x94\x04P\x0dB\x11\
+\xd6\xd6%\xc2p\xacP\xc7\x10P\x1dr\xf7C\xa0\x1c\
+\xaf\xe2)L\x1a3\xe9Y2)\x09\xf4\xb2@\xab[\
+`\x0cW2\x00U\xe3Xu\x01\x1d\xe0\xdf\x82&\x0e\
+|\x97y\x87\x99j\x14II\x00'\xa2\x0a\xdc\x02\x04\
+\x22D\x85\xb7<\x11B\x08U\xe1N\xd9\xfe\xfbN~\
+\x16\xf8\x9a\xa2\xe2C\xcd\xbc\xc7\xfb\xcc\x1cf\x96\x14A\
+G&\xbdP@\xb6k\xb2\xb5\xa4\xbc\x11\xedl\xea$\
+z\xe0\x12A\x08\x86\x00\xc01>\xfb\x97\xbb\xe0\xe4\x87\
+\xb0\xc3+\xaawz\x82C\x05_\x97\xd6\xf0\x1e\xcb\x99\
+%\xcc|&]J\xa4\xa9.\x8c'\x80V\xa5A\xc0\
+\xe1\xd7\xabn\xb0\xeb\xedov\x8a\x96#4)\xd9\xee\
+\x8d\x9f\xbfR\x17\xf8\xe6\xfb\xe3\x8e\x82\xaf\x0e\xd6\xe6|\
+\xbe\xf3G\xde#\x97\xf9\x88Y&%\xdec\xdeV]\
+x\x91\xc0\x14\xdc\xc7'\xfdz\xbb\xdb\xb9\xc5uv\x11\
+\x8a\xf5{6o\xfc\xd8\xaf\xd5\xbe\x92\xbd\x15\x8e\xbc\xcd\
+\x07jV\xaf\xddub\xfe\xd2\xdc]|\xedZ\xc6\xca\
+\x140\x9f0\xd9\xcc\x22&\x83\x99\xf6R\x02\xa8\xee\x11\
+W\xdd\xc9\x9dp\xf1\xf7\xbc\x11\xa1\xbfU\xfb\x8a\xf7V\
+\xd8\x11\x9a\x9d\xbf\xed\xa7\x8cy\xcb\xb6\xf3\xf9\x1b\x98\xf5\
+\xcc:\xb3\x04\x92\xb7 \xc4?\xad\x0d6_\xec\xf8\xb9\
+k=%\xfb~\xee\xc8\xdf\xf2]\xf5*\xeb\x8eCs\
+2\xb3\xb6\xf09\x85L\x91\x81B\x19\xba\x86\xf9t\x22\
+\xb7 \xf9\x10\x16m++C\x17\xf8?\xdc\xaa\x8f7\
+}\xbb?sE\x1e6^\xc9|(7\xceaV\x1b\
+\xc8\x91\xeb\xa88\xeb\x95\x1fB\x83D\x9al\xd9L\xd9\
+\xbe\xb9\xcc<f\x01\xf3\x81l\xebb\x038^\xc8d\
+\xca\xd0W\xfb\x1a>C\x02m\x9b\xce\xcc\x902\xd8p\
+\xb6\xac*\xc3@\xba\x5c\x9f%\xdb=\xee\x8b\xe8?a\
+>\xe0aoN\x8f0\x00\x00\x00\x00IEND\xae\
+B`\x82\
+\x00\x00\x04\x8f\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\
+\x00\x00\x09pHYs\x00\x00 \xc7\x00\x00 \xc7\x01\
+\x95\xc3\x06]\x00\x00\x00\x19tEXtSoft\
+ware\x00www.inkscap\
+e.org\x9b\xee<\x1a\x00\x00\x00\x1ftEX\
+tTitle\x00Gnome Sym\
+bolic Icon Theme\
+\x8e\xa4)\xab\x00\x00\x01\xc2PLTE\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\xca\xdf\xf4\x00\x00\x00\xbd\xd0\xe3\xbf\xd1\xe4\
+\xe3\xf1\xf8\xff\xff\xff\xff\xff\xff\x00\x00\x00\xe7\xf3\xf9\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00l{\x84\x00\x00\x00\x00\x00\x00RV[\x00\x00\x00\
+\x04\x04\x04\x00\x00\x00\x04\x04\x04\xff\xff\xff\x97\x9a\x9d\x16\
+\x18\x18\x11\x13\x13\xf4\xf6\xf7\xf4\xf6\xf7\xb3\xc8\xd4\xb4\xca\
+\xd6\xb3\xc9\xd5\xb5\xca\xd6\xb5\xca\xd6\xb7\xcc\xd86<?\
+;AEhrx\xb9\xcf\xda\xbc\xd2\xdd;BF=\
+DI\xbd\xd2\xdd\xb8\xc2\xc7\xbd\xd2\xdeNW\x5c\xc1\xd6\
+\xe0<CH?FK\xc3\xd7\xe2AINBJN\
+\xc3\xd7\xe2\x99\xa2\xa7\xb6\xcd\xd9\xc5\xd9\xe4PZ`T\
+^du~\x83\xc6\xda\xe4\xc3\xd9\xe4\xcc\xd5\xda\xc9\xdd\
+\xe7\xc7\xdc\xe7\xbe\xd3\xde\xa7\xba\xc4LU[MV\x5c\
+\xaa\xbd\xc7\xab\xbe\xc7\xc7\xdc\xe7\xaa\xbd\xc8\xc3\xd8\xe3\xd5\
+\xe8\xf2\xa8\xbc\xc7DMR\xe7\xef\xf3\xb2\xc7\xd2\xba\xce\
+\xd9\xe8\xf0\xf5cnvdpxiw~\xb2\xc7\xd2\
+\xbe\xd2\xdedpwiv}kx\x80ly\x81\xd9\
+\xe5\xecbmuhv}n}\x84jw~kx\
+\x80n|\x84r\x80\x88r\x81\x89kx\x7fn{\x82\
+o}\x84n|\x84q}\x85q\x80\x88t\x83\x8bu\
+\x84\x8c\xde\xeb\xf2\xee\xf5\xf9t\x82\x8a\xee\xf5\xf9\xc7\xe0\
+\xeehu|iv}\xcb\xe3\xf1\xcd\xe4\xf2\xcd\xe5\xf3\
+\xe1\xef\xf6\xe5\xf1\xf8q\x7f\x87s\x81\x88t\x82\x89\xb9\
+\xd0\xdd\xbb\xd2\xdf\xbd\xd5\xe2\xbf\xd6\xe2\xc1\xd8\xe6\xc3\xdb\
+\xe9\xc4\xdc\xe9\xc8\xe0\xed\xc9\xe0\xec\xca\xe2\xef\xca\xe3\xf1\
+\xcb\xe3\xf0\xcb\xe4\xf2\xcc\xe3\xef\xcc\xe4\xf2\xcf\xe6\xf2\xd1\
+\xe7\xf3\xe3\xf0\xf7\xe3\xf1\xf8\xe4\xf1\xf8\xe5\xf1\xf8\xcfT\
+\xfd[\x00\x00\x00~tRNS\x00\x03\x07\x08\x0a\x0b\
+\x0c\x0e\x18\x1a\x1b\x1c$%'**+-012\
+3478;>>@AMVi\x96\xa4\xa7\xbf\
+\xbf\xc0\xc0\xc1\xc2\xc3\xc4\xc4\xc9\xcb\xcc\xcd\xcd\xce\xce\xcf\
+\xd1\xd2\xd2\xd4\xd5\xd5\xd5\xd6\xd6\xd7\xd8\xd8\xda\xda\xdd\xdd\
+\xde\xe3\xe7\xe8\xe9\xe9\xea\xea\xea\xeb\xeb\xf0\xf2\xf3\xf3\xf4\
+\xf4\xf4\xf5\xf5\xf5\xf5\xf5\xf6\xf6\xf6\xf6\xf6\xf7\xf7\xf7\xf8\
+\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfb\xfb\
+\xfc\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xc4:6\xbb\x00\x00\x01\x8a\
+IDAT8\xcbu\xd3\xe5_\xc2`\x10\x07\xf0S\
+'`\xc7D\xc4@\xc1nE\xc5\xc2\xc4\xee\xeeF\xc5\
+\xc0\xee\xee\xf6T\x8c\xff\xd7g\x0e\xb6g\x9b\xdc\xbb=\
+\xbf\xef\xddg\xbbm\x00\x10\x9a2\xfc\xf3\xa5\xac\xd3\xd9\
+\xa2X\xe0*q\xcf\x85^\xea-\x97\x01\x08\xd9y\xc7\
+\xc7\xf1VeuN\xbc\x22\x96\xf8@\xb2\x0b\xfbt~\
+\x91\xa0\xa80\xff\xc0\x16\xbc5\xc2\x00>\xea|s\xec\
+zy\xce\x8e\x96\xaa4\xfbX\x0bg8\xe8\x9b}\x83\
+\xcb2\xc1\x8e\xe0}\x99\xaa\x1aW\xe0\x1b;\x22\xed\xe4\
+\x86\x1c1t\x1e5E\x8e\x9c\xd1\xa9x\xce\x01\xd0\xce\
+\x90Kz\x06\xe9G\xdc4\x80\x07\xc8\x85'\x17\x81T\
+\x089\x05x\xb1\xa4\x97\xe64\x10\x05\x95K\x80G\xf0\
+y\x02\x7f\x96F\x03\xd0\xce\x93h\xd5.\xf6\xcb\x01?\
+\x83\xeaW\x00\xd0.r\xf9\xae\x90C\xba\x0c\xb0s\x1c\
+\xd8\xd0{\x03\x7f\xf7'\xd9X\x86\x04\xb0c\xdc|'\
+\xf7^\xf4\xff\x01\xf7\xf3IvJ\x03\xe1\xf9iA\x01\
+j?\x94\xc8\x14\x80d\x7f\xa2\x10\x00\xbd\x7fZx\x80\
+,\x17\x05\x07>\xb1;b\x92\x5cn\xc5\xd3\x9f\x5c\x8c\
+\x83\x1c-\xb0Y\x04l\xe3\x10Sp'\xe9w\xcfx\
+\xa8P7\xe0!4\xe2s\x10S\xb8f\x90\x7f\xf6\xda\
+\xe9Ju\xf01\xb6A\xd2\x07\xf6h\xfc\xa3\x95?\x0e\
+\xab\x0e\xef\xc5+\x13@\x15\xe2QWS\x93\xcdf\xab\
+\xb1Z\xcb-\x16K\xb1\xd9\x9c\x9fG\xaa\xf9\x04_\xfa\
+\x03\x00\x98\xfa'o?\xefu\x7f\x1c7\xcb\xc7X\xb7\
+~\xa9\xac\x8b\x83v\x13\xe9\xff\x05\xce\x89\xfc}\x83\x9f\
+8E\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x03\xe1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe3\x05\
+\x04\x06\x03\x19PM\x5c\x1a\x00\x00\x01\xdaPLTE\
+\xff\xff\xff\x80\x80\x00\xff\x80\x00\x9f@\x00\xc6U\x00\xaa\
+G\x00\xc6U\x00\xadR\x00\xbfR\x00\xb1N\x00\xbbS\
+\x00\xd0Z\x00\xa5J\x00\xa6J\x00\xcbY\x00\xa5K\x00\
+\xcd]\x00\xce[\x00\xa6J\x00\xa6J\x00\xce[\x00\xa6\
+J\x00\xcd\x5c\x00\xa6I\x00\xcd\x5c\x000?X0@\
+Y1@ZRbzSczSc{Sc|\
+1@Z2A[3C\x5cSd|Td|U\
+e}\xce]\x03\xa6J\x00\xcf\x5c\x00\xa6J\x00\xca[\
+\x00\xa6J\x00\xce\x5c\x00\xb0N\x00\xbdT\x00\xa6J\x00\
+\xcd\x5c\x00\xb1Q\x02\xbdU\x00\xacQ\x08\xcc]\x03=\
+U{BY\x7f\xb0Y\x0f\xd1c\x096Jj7J\
+j=Pp=Qp=QqCWvCWw\
+DWwJ^}6Jj7Jk7Kk7\
+Kl8Lm8Ln8Mo>U|>V\
+|AX\x7fG\x5c~H]~I]}J^}\
+^u\x99\xb0U\x07\xb0\xd2\xfd\xb1\xd2\xfe\xb3\xd4\xff\xb4\
+[\x0b\xb4\xd5\xfe\xbbc\x0f\xc1\xdc\xfe\xc2\xdc\xfe\xc3m\
+\x15\xc4\xde\xfe\xcb\xe1\xfb\xcd\xe3\xfc\xce\xe5\xfd\xcf\xe5\xfd\
+\xd0\xe5\xfc\xd0\xe5\xfe\xd1\xe6\xfe\xd1\xe7\xff\xd3\xe8\xfe\xd3\
+\xe8\xff\xd4\xe8\xfd\xd4\xe8\xff\xd6x(\xd6\xea\xff\xd7\xea\
+\xff\xd8\xe8\xfc\xda\xea\xfd\xda\xea\xfe\xda\xeb\xfd\xda\xeb\xfe\
+\xda\xee\xff\xdb\x84:\xdb\x94J\xdb\xeb\xfe\xdb\xec\xfe\xdc\
+\xec\xfe\xdc\xec\xff\xdc\xef\xff\xde\xed\xff\xdf\xee\xff\xdf\xef\
+\xfe\xdf\xef\xff\xe0\x8d3\xe1\x92M\xe1\xf1\xff\xe2\xf1\xfe\
+\xe2\xf1\xff\xe4\xa0`\xe4\xa8i\xe9\xac`\xe9\xb8\x7f\xeb\
+\x9d7\xec\xa2N\xef\xc4\x91\xf1\xb5o\xf2\xa48\xf2\xc1\
+\x88\xf3\xcc\x9c\xf3\xcf\xab\xf4\xce\x9f\xf7\xaa=\xf9\xe7\xd3\
+\xfa\xafC\xfc\xb5M\xfc\xc3o\xfd\xc6t\xfd\xcf\x8b\xfd\
+\xd1\x90\xfd\xd4\x97\xfd\xed\xd6\xfd\xed\xda\xfe\xd8\xa1\xfe\xdd\
+\xaf\xfe\xe5\xc1\xfe\xe9\xca\xfe\xea\xcd\xb2\x9f&\x09\x00\x00\
+\x00BtRNS\x00\x02\x02\x08\x09\x12\x12\x1c\x1c1\
+16>EEGMTVxx\x95\x95\xae\xaf\xbc\
+\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xc0\xc1\xc3\xc5\
+\xc5\xc8\xca\xd5\xd5\xd8\xd8\xe7\xe7\xf2\xf2\xf6\xf6\xfa\xfa\xfe\
+\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xd7\xd7\xd8M\x00\x00\x00\x01\
+bKGD\x00\x88\x05\x1dH\x00\x00\x01?IDA\
+T8\xcbc`\xa0\x18\xa8:\xfa\xfb{{{\xfb\xf8\
+\xfa\xfa\xfa\xf9\xf9\xf9\x03\x81\xa3<\x8a\x02\x87\xba\xea\xec\
+\xb2\xfc\xb2\xf4\xb8\xa4\xd8\x98\xc4\x94\xe4\xf8\xa4\x94r\x07\
+\x14\x05\xb6\x0d\xa59\x91e\xa5\x99!\xe9\x99A\x09\xa9\
+\xc1Yia\x056(\x0a\x94\xac\x9c\x9c<=\xbd<\
+<\xdc\xdd\xdd\x5c]\x9c\x9d\x9d\x9c\xac\xa4\x19h\x07T\
+0}$C\xc8Gv\x0c\xdc:j\x820\x056\x98\
+>\xb2f\xd0\xe8\xe9\xcf\x10\x81*P\xc4\xf0\x91\xa5$\
+\x83A\xd7\x9c\x19\x85bL\xb8\x1d&`\xd11kz\
+\xad\x04\x0bn\x15|&mS\xe76j\xb1A}\x01\
+\xf4\x06\xc4\xfd\xb2p\x15\x5cF5\x93f7\xe9q\xc0\
+}\x91W\x96_\x92[e\x0fW\xc0i\xd82yb\
+\x91.;\xdc\x17\x15\x11\x95\xc5\xd1\xf5\xd60y^\xe3\
+\xf6\x99\x13\xa24Y\xa1\xbep\xf6\xf4\x049\xdf\xc9R\
+\x0a*\xcfo\xde;\xad/\x5c\x9c\x19\xa7\x1b5\xbb\xa7\
+t\x86\x8a2\xe2\xf6\x84vsk\xa00\x94\xad\xec\x0d\
+\x06\xa8\x11\xc1\xa3\xae/\x84\x16\x17H\x11\x81\x06`q\
+\x81\x88\x084\xa0\xe0\xe5\x09\x02H\x11A\x15`\x06q\
+9\xcc\xe1r\x18\x0a\x02 .\xc7\x9e'\xc0\x0a .\
+\xc7\x9e'@\xc0\x14\xe2r\x1a\xe6\x09\x00(V\x8a\xc7\
+\x1d?\x1e\x98\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x05\xbc\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x05\x83IDATx^\xb5WKlT\xd5\
+\x1f\xfe\xee\x9d;\x8f[h\xe9P\x86:\xd8H\xb5\x04\
+Jx\x88\x0a!\xd4G\x5c(DC\x02\xc4\x05\x89\x1b\
+\x16\xba\x91\x90\xb8q\xe5#>\x127$\xae\xdc\xb8\xd2\
+\xb0\xd0\x95\x09\xff\xe4\xbf \x04+*h\x95J\xa0\xb4\
+L\xe9\x93\x96N;\xd3\xce\xab\xf3\xb8\xcfs\xef\x1d\xe7\
+wrO2\xc9d\x8a\x93\x8c\xbf\xe4\xcbyL\xe6|\
+\xdf\xefq~gF\xaaV\xabh\xc5\x9e;\xfd\xe9K\
+\x00\x0e\x01\x08\xe3\xf16\x06\xe0\xf6\x9d\xff}^@\x13\
+SZ$\x0f\xc7\xb7G_\xfd\xfe\xab\x0b\x1f\xaa\x11E\
+\x05\x00I\x027\x7f@@\x06\x84O\xa3\xe3\xf37\xce\
+\x7fv\xe9\x0b\x00?\xa1\x89\xc9h\xcd\xb6\x1f98\xb0\
+\xc3E@\xb5\x1d\xc0d\x80\xeb\x01\x8e\x0b\xb0\x1a<\x0f\
+`N\x0d\xccAIc84\xf8\xd4\xcb\x1f\xbc\xf3\xe6\
+\xbb5\xe1\xaf\xb5K\x00\x1c\xc6\xc0L\x8d{\x1eR|\
+\xaf%\x0ea\xa8T*(\x19\x0e\xf2\xc5\x0a\xde:~\
+\xf8\xec\xeb/\xee\x7f\x83R\xd7R\x0a\xde\xfe\xe8\xf2\xa1\
+\xba%\x9f\xf7\xf5\xf5G\x97R\xeb\x83\xd7\xfe\x9c\x05\xf3\
+\xb8vDB\x0a\x9e\x1f\x8c\xe3\xe9'\xa3\x10V,\x95\
+`K\x1d\xe8\xea\xde\x86\xc2z\x0e\x9f\x9c?\xfd^&\
+_6k\x22\xee\xd5\xea\xa1\xd4L\x80 \xa6\x93\xce\xbd\
+\xb07~N\xec\xed\x1f\x88u\xd3\xc8l\xa6\xe8\xba\xb6\
+e`\xe7vD\xbbT\x04\xe4*l\xe6\xe1\xc7\x9f\x13\
+81\xb4\x1b\xfb\x9e\x89\x81\x8c1\x06\xcb3Af\x07\
+\xb6@\xd7u\xf5\xec\xc9\xa1\xc3w'\x17\xf7\x03\xf8\xe3\
+q\x118u\xee\xe4\xc1\xf7O\x1c\x1b\xe8\xc7\x06fY\
+\x16\x8a\xc5\x22\xfaz{p\xe6\x95~\x8c\xdc_FO\
+W\x04\xbd=\x9d\x90$\x09\xa6a\x80,\x10P\x90\xcd\
+V\x90\xc9d\xe4\x7f]\x03\x9a\xa6q/62\xc7q\
+\xe8\xd0\x1aA\x00\xbbv\xf6bO\xdff\xdcJ\xac \
+\x95-C\x8d\xa8\x98\x9f\xba\x83\xaf/~\x8cK\xdf\x5c\
+Drq\x9ajG\xda\xa0\x06Z\x07\xf5\x0f\xc3\xf7R\
+Q\x14<\xbb'\x8e\xc0\xdc\x1anO\xae\xe0\xf8\xd1~\
+\x1c9:\x84\xc1\xbd\xfb\xe0Uetvvb\xb5\xb2\
+Pm\xab\x00!B\xd8\xa6M\x9bp`W/\xeeL\
+M`9g\xe2\x89\xde>\xc4j\xa0\xdbb\xdb\x0c\xa1\
+P\xcak\xab\x00Y\x96y\x1a\x86\x87\x87\xa9\x16\xf8\xba\
+\xa3\xa3\x03\xa6\xae\x08a\x9c\xdc\xb0\xa9^\xa8W\xb4\xa9\
+\x0f\x08\x84B!\xc4\xe3q\x9e\x86r\xb9L5\xc3S\
+\xe1T%\xe8&`;\x1c0\x18@z\x98\x0b\xb45\
+\x02T|$\x80\xf2K\x91\xa0\xb5m\xdb\x98H'\xe1\
+Vy\x87\x84\xe9pr\x98\x5cD\x9b#@W-\x1c\
+\x0ec\xeb\xd6\xad\x88\xc5b\x88F\xa3<\x05\x90\x020\
+\x98\xc4\x05\x04\xeaN7\xec\xb6\x0ah,B\xaf\xea\xc1\
+\xf3<0b\x06P4x\x0a\xb8m\x0eS\xdbn\xb3\
+\x00\x22\x17\xa3\xeb\xba\x90 \xf1\xb9\xc7\xf9)\xfc~\x1a\
+\x18\xf0\xa8\x00h6\xf0\x9f\x5cC\x02y.\xd6\xb2,\
+A\xb3\x80\x80\xcd#\xc0\xbd\xf7xM\xb41\x02\xc2{\
+\x22\x16#\xed\xf17\xc0\xf68\xa1\xc5\x80\xbc\xc6S\xc1\
+\xe7&ks\x04(\xecD,\x0a\x92\xe6t\x0d]W\
+FA\x03\x5c\x05\xe8\xd9\xcc=G8\xd8\xc6k(\xc2\
+N\xa44\xd2\xa3$\x04\xf1tT]D\x82@\xbc\x1b\
+\xdc\xd2E\xa03DQ\xaa\xd2\x17\x1a\x05\xb4\x1avA\
+&BN\xf7\x9fD\x04\x83Az\xc4\xf85\xacX\xc0\
+\xec\x1a\x10\xed r\x17wgs`\x96&y\x1e\x0b\
+\xd4\x84\xcbt\x9c\x7ffUi5\xe7\x22\x02\xd4|h\
+M\x22(\x1a\x14~\xea\x8e$\x8e:c9\xb7\x88_\
+\xc6\xc7\x90y\x94\x00$\xd9\xb4\xe4\xee\x05\xa3\xb4\x96\x06\
+\x10$\x1f\xe88\xfe\xbdV\x88i\xa4\x9eOs\xd34\
+\x89\x94\x04PC\xa2\x91\xef\xcd\x8e]\xc3\xc8\x95\x87\xc8\
+\x96\xf4E%\xa4N1D\x16Y5\xb8\xc8\xcc\xd4\xf8\
+\xcc\x8d\xef\x0a\x00\x22\x00\x98\x0fW\xd9\xa8\xc8\x88\x8cL\
+\xe4\x5c\xb4\x5c\xea\xff\xba\xaeCUU\x12\xc4?3t\
+\x9d\xb7b\xe68\xc5\xe5\x8a\xfa\x7f\xdb\xb2\xc7\xad|z\
+A\xcb/\xa5\x0a\xc9\x89\xac\xefu'\x00\x0b\x80!|\
+T\x9ay.D\x08\xaf\xe9p\x91k\x12B\xcfo\xa9\
+T\x12b\xc9{\x1a\xa95\xaf\x9b\xb7~\xbb\xfe\xf0\xde\
+\xf5\x19\x00\x9e\x8f.\x00\x0e\x00[\xd4\x9d/\xc8\x91\xd1\
+hD*r\xccQ(\x14\x88\x80<\xa6_\xbc$\x90\
+\xf6\xa8\xf7\x93\xf7$\x8e\xa3\x5c.\x811\xd3u\x99\x15\
+\xf2C\xad\xfa\x88\xd4\x81>\x0b\xfaBd\xa1\xa6\xa9\x08\
+\xf2\x9a\x22\x10\x89D\xa8\xca\xc9s\xda\xe3\x8fO2\x99\
+\xe4{sss\x18\x1b\x1b\x83')\xf6jF\xb2+\
+\x85\xd5\x02\x1a\xac\x85> \x88-\xd3D0\x14\xaa\x17\
+\xc4\x09\x13\xf7\x13\x98|0\x89\xf9\xf9y\xa42E\xc3\
+\xf2Be+\x10\xcd\x9b\x0eV\xca\xf9\x95\x9b\xf9\xf4\x5c\
+\xca\xbfj\x9e\x80H\x81\x0f\xe6\xaf\xbd&\x11\x90(\xdc\
+<\xa7\x8c1\x1e\xf2D\x22\x81\xd1\xd1QN\x9a\xce\x95\
+57\x18\xcb\xba\xe1\xf8:\x0b\xef\x985\xb4\xc2Tj\
+\xf6\xee\xc8\xfc\xd8p\x12\xc2\x1a\x05\xb8D,\x8apC\
+\x01\xba\xaeaii\x09\x0b\x0b\x0b\x9cxzz\x1a\xf9\
+2\xabxj|\x15\x1d\x07\xf2\x88\x87\x1fX\xe5\xdc\xaf\
+\xcbS\x7f\xfd\x9d\x18\xb9\x9c\x05 \xfb\x90\xea\x05\x10\xea\
+\x05\xf8`\x02M\x05\xcc\xcc\xcc\xe0\xf7+\x97\xb0\x96\xd7\
++\x91m\xbb\xd3\xc1\xeec\xd9\xe0\xb6\xae\x09\x87\xd9\xd7\
+J\xb9\xe5\x91\xab\xdf^\x10\xa4\x02\x92@\x83\x80\xe6B\
+h^\x15\x7f\xcf\x1b\xfe\x19\x018\x05`\x16\xc0U\x00\
+7\x7f\xf8\xf2LZ\xaa\x99 \xf2\x89\xd1\x84\xbc^\x04\
+\x1a\x84\xd4\xb5\xe2\x7f\x00\x12\xab\x82\xc2Rd\x01\xcd\x00\
+\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\xb1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\
+\xe3\x05\x04\x06\x08\x1c\xc3\xd3q^\x00\x00\x04>ID\
+ATX\xc3\xed\x97mh\x95e\x18\xc7\x7f\xd7}\x9e\
+\xf3\xb6\x89\xf8\x92\x1f\x1c\xe9\x07\x8fT\x1a\xfa)0F\
+I\x8cEm\xe2\x10\x16\xcb\xcc\xad\x02\x85\xd4J\x0b!\
+\x05q[/hT(\xfa\xcd\x14*J\x05\x97`b\
+\x10\xa3\x93\xbd\x91In\xfam\x83\xb3\xd0\x8cR\x93\xed\
+\xcc\xbd\x9c\xf3\xbc\xddW\x1f\xcei\x8em\xe6\x8eb}\
+\xc8\x1b\x9e\xe7\xc3\xf3\xdc\xcfs_\xf7\xf5\xff\xff\xaf\xff\
+}\x89\xaa\xf2_\x0e\xc3\x7f<\x9cR?\xa8mj\xce\
+\xb8\x81\xa4F?\xd3\xe2-\x19\xb3\xe3\xe6\xcb\x0d\xfe\xa3\
+\xa0\x09'L\x97\x1c@\xce#\xf5\xce\xae\x16\xae\x0d\x81\
+\xb5\x10\x86\x16\x8bb\x8aK\xc5b\x06/\xb0`-\xb1\
+\x98\x831\xe0\xfb`\x0c\xa8\x16.c\x94D\x02i\xd9\
+\xbc\xa5\xaad\x08T\x15c\xc0\x89\x14\xb6w\xe6W(\
+KD@ \xea\x18\xce\x5c\x00\x1b\x86\x94\x979|\xdb\
+\xe5\x13\x84\x96\xd0Z~\xbe\x00\x9e\xef\x93\x8c\xc3\xa9\x1e\
+%\x16\x11<\xd7CJ%ae\xdd\xa6L41%\
+\xc5\x04\xc9v\x87\xb3\xc5\xe4\x8eN\xb5\x8e\xddAq\xba\
+\xa87\xd4\x9b\x96\xff\xbd\x0a\xa4\xa6q{\xc6\x0d$\xa5\
+\xe3h]:\xab\x93Q\x9bn\xdb\xffVuI2\xcc\
+y\xa4v\xedi\xa1o@\xf1\x83\x90)I\x07\xd7\x0f\
+\xc9{\xa5\xb3\xbau\xf3\xd6\xaa\x92!PU\x5c\xcf\xe2\
+\x18\xc11\x86S\x99\x90x\xf4\xd6X\xedz\xeeM\x17\
+\xech\x94\x86\xb3M\x91\xae\xceF\xf9\xa6\xf3YY*\
+\x95u\x1b3N|4\xab\xaf'\xb9TV\xfb\xc3\xd9\
+t\xc7\xd7\x9f\xde\x10\x82\xce\xd5\xb2%1\xe7\x81\x1d\xf3\
+_=J\xd0\x7f\x89\xee7\xaa~r~8\xb6{\xfe\
+\x1dgZ\xab\x98\x8e\x0c{\xa7.\xa8\x5c?o\xdd\x87\
+H\x90\xc5\xbd|\x0e\x85\xf0\x8e\xcb\xf0\xc7\x06I\xc6\xe3\
+\x1c\x9c\xb9\xa4n\xc5\x9cU;\x91l7\x03]'9\
+\x7ft\x9f\x1fx\xb9\xe5R\xd3\xb8=\x93\x1fS\xdb\xff\
+\xcez\xd9\x04*\x00\xb4,\xa6\xe9#\x1f\xbcY=\x89\
+\xc5g81\x8eW<\xfe|eE\xed\xcb\xe8\x1f\xdf\
+\xd1w.\xcd\xf9\xf6\x13\x03\x1a\x84\xf5\x0f\x1d\xd4v'\
+\xe7\x91\xda\xbd\xa7\x85|\xbe\x00\x7f\x18Z\xa2QSd\
+\xb8%\x08\x0aJ\x10\x81\x81\x01\x97{\xa6\xc7\xe5\xb5W\
+\xb6\xdc\x94\xed'\xeb\xe5^k\xf8\xf2\xfe\xe5\xeb\x16V\
+<\xba\x12\xdb\xfd1\xbf\x9d\xfe\x9e\x9eSg.YK\
+mu\x9bv\x8e\xa8 \x22\x052y\x9eO\xd7%\xc8\
+\xe5<\x04\x08\x03\xe5B\xd6\xe0D b\xe0\x97^\x07\
+\xd0I\xb1\xbd\x17\x18\xf0 w\xf5<\xf6\xec{H$\
+Nr\xe12\x06\x03\xc3\xb0?\x8a\xf2\x95u\x1b{\x9c\
+\xf8\x94ycU &B~\xf0j\x11\x0e\x1d\xfdV\
+\xbd\x5c\x7f\xba#\xfd\xc9M!8\xf2\xa4\xcc\x08\x22\x1c\
+\x9f\x93\x9aU\xb9\xa4j1\xce\x82&\xfa\xaff\xf9\xea\
+\xfd\xd7\x07<7_\xff\xcc\x09m\xbf\xe3$<\xd2 \
+\xc9`\x88\x83\xb3fO[\xf1\xc8\x13\x8b\x88-\x5cE\
+\xceK\xd0\xfe\xee&?\x97\xed\xaf\xffW\xcc\xa8\xb5U\
+\xcc}\xa7\xd9;uz\xf9\xfa\xa55\x8b(\x7f\xb0\x9e\
+\x9cN\xe7\xf3mk\xba\x9d\x9a\xa6\xe6\x1e7\x90yL\
+\xe0\x05\x89\xa8-B\xa2\xc5Z3^\x11\xc9\xa8\xa6\xdb\
+\xf6\xff\xb3\x22\x9a\x9b\xd5\x02\x1b\x0e-\x93\x8b\xe9c\x9d\
+;\x1e\x1e\x0a\x89/~\x0e\x84?\xe5\xb1\xa7\xb7\xebG\
+\xfbZ\xb1\x16\x5c7\xc4q\x22XU\x8c\x08\xd6\x16\x0e\
+\x1f\xc6\x08Ah1b\xb0\xaa\x88\x80Z\x88Fa\xed\
+\x8b[\xb5\xfd\xf0\xceI\xbb\xea\xe1ZyJa\x83\x0a\
+\xe5\x18^rT\xb5\xc0\xf8P1F\xf8=\xabTL\
++\xec\xfa\xf2\xa00{j\xa1\xda:\xc6p\xb1O\x99\
+;C\x08B\xe5\xca \xcc\x9d\xc9\xa4\x141z\xac\xfc\
+B\xdb\x80\xb6\x117\xf4r\xd7zV\xaf\xd9vC/\
+\x10\x11T\xed\x08,c\xbc@\xfd\xe1l\xfa\xb6\xce\x03\
+w\xfb\x82R?\xa8il\xce\xb8\xe1x\xef\xb8\xae\x9a\
+\x09\xd5\x02\xc5>\xe0\xb3\x03oW\xdfV\x00y\x9f\xd4\
+\xa1\x03-\xf8A\xa1<\x87V\x89\x18!\x0c\xb5\xa0\x10\
+\x04cd$.\xb5\x8a\x18\xc11*\x8dk\xc7{\xc8\
+-\xf4\x05\xb6@SU\xc2@\xe9\x1b\x96B\xb9V\xa5\
+w\xc8\x14\x8fjJ\xefp!@E\xb9\xd2\xaf\x88\x01\
+\xcf\xf5n\x1f\x02/w\xad\xa7\xe1\x85m\x13\xf7\x05C\
+}\xe3\x952\xa6\x0f\xb8\xab\x82\xb1\xe3/\xba\x91@\xc5\
+\x971z\x01\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x04\x8c\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x04SIDATx^\xc5\x96]h\x1cU\
+\x14\xc7\xcf\xcc\xec\xcedf?\x92\x98\xe6c?f\xcd\
+\xd6E\xb3V$bI\xaa5H\x84Dl\xadQ\x8c\
+\x85\x22\xea\x9b\x8fB\xdfJ\xfb >\x144\xe0\x8b\x0f\
+\xbe\xe5E\x10A\x82\x0f\xd2>\xd8\x94J}\xa8(E\
+!Z\x9bT\x1b\x93\xcd&\xbbkC[\xb2\xbb\xb3\xb3\
+3{w<\x979\xb0\x83\x84M\x9bv\xe2\x81\x1f\x97\
+\xbb\xec=\xf7?\xe7\xe3\xde+8\x8e\x03\xff\xa7\x05\xe0\
+>l\xfc\xc4G1\x1c\xa6\x91,\xb4l\x0b\xb9\xee\x99\
+'\x90\xa4g>\xf7\xfdW\x1f^z`\x01\xc4\xf4\xbb\
+o\x1f=\xad\xeb\x03\x1a\x9f\xf0\xe0\x19\x86\xc9rk\x05\
+C\x10\xdc\x05\xbd\xfb\xba\x95\x9e\x9e.\x19\xc8\xce~<\
+\xcb\x87\x87$\x80\x88\xc7{CAI\x91L\x1b\xa0\xd1\
+\x00\xd0\xf5L7\x88\x00\x22\x8a\x90\xd0c\x10\xe9@\x09\
+\xf9\x8d[\x06\x00D\x1eJ\x0a\x88\xb9/\xbe<\x0f\xc8\
+\x1b\xcf\x0c\x0f%\xa7\xa6^I\xc9JT\xb1P\x08\x8f\
+@0\x88\x0e\xed:;\x7f\xe9\x87\xfcw\x17\xaelR\
+j\xe6\xa0\x8d\xed\xaa\x08\xa9\x1e\xde;v\xec\xa5\xb3\xa3\
+\x87\xc6\x125\x13@\x92\x004\x15c}q~\xf5\xc2\
+\xfc\x95\x19\xcc\xfb\xe7p\x0f&\xc2\xee-\xab'c\x1a\
+\xd7\xcf\x01\x01@\x0e\x00\xe0\xe6\x9b\xad\xcd\xfd\x150\x92\
+J\xe9Q\x9b\x010\x14 \xa1\xa7|>\xcf;\xe2g\
+\x04|\x13@\xe1\xcff2\xa9\x01\xc0B\xe4\xf9o\xa2\
+\x00\x01=\x15\x8aE\x83\xf2\xee\xcb9\xe0%\x9bN'\
+5\x8b\xba\xc0\x11\xdc\x0eX]\xddh\x09\xf09\x05C\
+\xb1D,T\xb7\x00lF\x8e$\x80\x85\x85%\xffS\
+@\x8c&\xf5T\xc4\xe4\x02\x1a\xae\x97Je\xab^\xa9\
+\x189,\xc0-\xdfR@\xf9O\xf4\x0f\xec\xdb/\xab\
+Q\xa5|\x87\xe7\xdf\x0d\x7f.\x97+\x03\xc0O\xbe\xde\
+\x05Dv0\xadk\xf5:\x80e\xf1\xa9\xdb\x01\x1b\xf9\
+B\x15'\x8b{\x22 \x91\x8ck<\xfc\x16s\x8f]\
+\x11\xb9v\xedF+\x02>\xd7\xc0H\x5c\x7f4j\xd6\
+\x01l\xdb]\xc0X\x9d\x95\x8a\x9b\xb70\xff\xeb\xbe\x09\
+\xa0\xfcGCa\xed\xa9pW\xafV\xb3\xdc\x03H\x0c\
+\xf0\xf0\xaf\xb5\xaa\xdf\xe7\x08\x0c\x0d\xa6S\xa1Z\xcd\xcd\
+\xbfC\x05\xf8O\xb1@\xfd\xef\xbf\x80l\x22\x15\xd7j\
+\xd4~\xdc\x02\x01\x80\xa5\xeb\x7f\xedY\x04F\xe3z:\
+\xc2o?\x8b\xfa?(\x03\xac,\xe7\x0c\xcc\xff\x9eD\
+`\xa4\xab7\xc9\x0b\x10\x18\xe3\xed\xc7\xc3O\x17\x90_\
+oB\x01\x8d\x8fc\xd3\xa7\x9f\xdc\xffxF3L\x00\
+\xde\x82\x0c\xdc\xd7\xcf\xfa\xcd\xbf\xcbN\x93]\xc5\xbfy\
+\xa3\xe9 \xe0\xa0\xedZ\x00mL\x80\x88\xd3C\x8f=\
+\x91\x89r\x01\x96EO\xaf @~u\xbdf\x99\xc6\
+\x9f\x80\xd3\xd6\xe6.\xb8\xa6\xb9\x93\x18\xb1\xcd\xe6\x12\x09\
+\x949\xb8\xfa@g\xcf\x80\xdb\x01\xfc\x06\xa4\x0bh\xf1\
+\xb7?\xaa?~\xfb\xe9\xef8U\x91\x0eB\xa1uA\
+\xf2#p\xdb^@\xfb\xcd\x15D}v\xf2\xfd\x97C\
+\xe1\xf0d\xa8;\x151j\xee\x15\xcc\x18\xcf\x7f\xa9\xc6\
+\x98\xbd\xfcH,3\x00\x00Qz\x80\x86\x91\x10\xa2\x91\
+\x18\x99\xfc\xed,\x80T\x8aH`\xf4\xd5\x0f&^x\
+\xf3\xd4gco\x9d974|p\xe6\xe8\xf1\x13\x83\
+uK\x91\x98\xe3\xbe\xff\xb8\xa9\xe1~ulb\xf2\xf0\
+\x81\xc3\xc7\xe7\x9e{\xed\xe4\x0c\x8e\x13\x00\xd0IDH\
+\x88B\x91\x10\xc9\x7f\xdb\x1a\x108O\xbf\xf8\x8e\x9eL\
+g>92=\xa5\xf7\xc5\xfa\xd5&(R\xb5\x0a\xc0\
+\xbf\xbe\x0b\xe55\x99\xfb\x02\x0a\xa0\xdb\xe1\xe7\xc7\xfb\xc6\
+\x8f\x8c\xf7\xe5\x96W\x06\xcf}\xfd\xcd\xc1\xcd\xf5\xc5\x93\
+\xa5\x95\x85\x0d\x00\xb0<\xfe\x19\xd2@\xa8&\xda\x17\xa1\
+\x10\x90\xe5\xce\x0eM\x0b8\xe0\x08\xa5B\xd1\xe4kL\
+\xc3l\x16\xf2\xebu*3PTU\xea\x8f\xc7\x95-\
+\xfc\xa5|\xdb]hT\x0c\xa8\xde-5(\xf4\x22\xd2\
+\xf4\x08\x11\xef\xb9\x0b~\x99\x9f\xbd\xe18pfyi\
+\xf1ul\xb1 8M\xa9\xd1\xb0M\xb3zg\x0d\x1c\
+G@\x01\xa2\x14\x905E\x8d\xa4(w\x0e\x1fn\x17\
+o^\xae\xdc-\x19\x0fz\x0e8\x08\xfb\xf5\xe2\xece\
+\x1c\xaf\x22\xaa7\x8f\x88D\xa3\xf0\x9f5M\x0f\x0d\xc4\
+\x22\xecV\xf8w\xee\x02\x87`H\x1d1\x90\x0aRF\
+\xb6\xee\x832\xad\xab\x225o\xfe\xdbF\xc0A\xa3\xc3\
+\xa3\x81\x00-\xb2\xe9\x7f\xf4\xe5\xc8\xf6\x11\xf0F\x81\x11\
+\xb6\x87\xe6v\x87\xd1\xbf\xd9\xa8\xcd@\xb9\x85\xa0\x1e\x00\
+\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x05\xe8\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x05zIDATX\xc3\xc5\
+\x96\x0dL\xd4u\x18\xc7\x1f.\x01\xb1\xc08\x1co\x81\
+a\x9a$\x18W !\xa9\xbc\x1b\xd4(\x96-\x936\
+'E\xb9\xca\x88J\xd9`3)PG\x80\xbc\xb8\xb0\
+@@N\x8eW\x89\xe0p\x8a2r\x91\x81\xd39`\
+\x97 \x06,%\x85\x89\x16/\xcd\xdd\xb9\xe0\xe9y\xce\
+\xdf\x7f\xfb\xebL\x8e\x08\xba\xed3\x8e\xdf\xff\x7f\xff\xe7\
+\xfb\xbc\xff\x01\x11\xe1\xff\xc4\xb4\x9b\x00\x1c\x89\x08b#\
+\x11D\xb8\xce\x99\x00\xfa\xb8=\x09\xb0'\x09\xe0\xec\x1e\
+\x80\xdeO\x00Z\x82\x01\x0e\x081\xees! *\x19\
+@\x97O\xb7\xcaa1\x8b\x00v\xd2u\xcb\xd9\x16\xb0\
+\x9d\x0d\xb2\x08\xfe\xceF9\x1a|\xf6\x16@\x1d\x9d\xf9\
+\xcc\xb6\x80\x8d\xec\xed\x07\x00'\xe8\xfb\xf3\x5c\x0f,B\
+&*j\xd6\x04p\x8eW\x01\xec\xcb\x03\xb8\x95\xea\xe4\
+\xd4\xce\x85(\xce7\x7f\xe5\xe22\xc4\xc2X\xe0l\x0a\
+0z\xcf\xdej\xfc\xfc\xf4\x22\xe7\xdc\x0d\x9b\x0b\xbc\xbc\
+\xae\xcf\x85\x00w\xaex\xae|\xb5\xa7\xa7\xbe\x224\xd4\
+\xc0\x91`j7l@)-&\x1b\x03X\xc6)\x13\
+\xadlkj\x0d\xb8\xf2\x0fB\x15\x8a\xaf\xd9\xa8v\xeb\
+V#\xdfEG\x9b\x5c\x03\xf4\xf1\x0d\x0b\x0bK<\xdf\
+\xd8\xf8\x8b~t\xf4\xaf\xa1\xee\xee?\xf9\x99&\x0f\x22\
+\xf1\x900\x8eD\xb1\x9d\x1d\x1err\xc2\x83\x16\x16\xc8\
+\xb5A\xe7\x1f>\xc8pHHH\xe29\xad\xb6_\xaf\
+\xd7#364\x84'\x93\x92\xaeI\xc2\xa7#\xc0\x96\
+k \x07\xe0\xa6|\x1e\xbc\x0cp\x88C+\xbb\xcf\x92\
+\x0d\x07\x05\x05%\xfeTS\xd3?22\x82\xcc(\xd1\
+\xd3\xd8x\xfb\x1d\x95\xaaT\xa4\xc1mZ\x02$\x8f\xb8\
+&\xd8\xf0\xa9\x98\x18\x1c\xed\xef\xc7\xac\x80\x80V\xd1\x9e\
+\x0b\x88\xb5a\xbe\xbe\x99\xa7\xca\xcb\xfb\x07\x07\x07Q\xe2\
+JO\x0f~\x9b\x90\xd0'\x8a\xd8w\xda\xbb\xe0\xdeT\
+\xb4\x16\x16\xfef0\x18\x909\x97\x9b\xcb\xf9\xdc\x1c\xe2\
+\xe3\x9dy\x22?\xffj_o/\xf6\xca8[U\xa5\
+\x8fY\xb9\x92\xbd\x0e\x93\x0ao\xa6\x02l\x83\x83\x83\x13\
+\xc7\xc7\xc7\x91\xb9y\xf5*\x96\xa4\xa6\xde\xa8\xae\xae\xc6\
+\xd6\xd6V\xec\xec\xec4r\xfe\xf4i,\x89\x8b\xbb\xc8\
+\xe2\x08\xaf\x19m\xc3{\x05\xb07\xa7kj\xae\x0d\x0f\
+\x0f\xa3Z\xad\xc6\xe4\xe4d\xac\xad\xad\xc5\xe2\xe2b\xd4\
+j\xb5x\xbc \xff\xd6k\x1e\x1e\x07\x85\xd7\x0bf\xbc\
+\x8ee\xed\x18\xb1\xc2\xc1a\xf7\x81\x84\x84\xebeee\
+\xc6\x10\xfb\xfb\xfb\xa3\x8d\x8d\x0d\x0e\x0c\x0c\xe0\xf1\x86\x06\
+L\x89\x8e\xee\x9e\xce\xa6\x9c\xca\xa8\x8d(\xb0w\xb9\xf8\
+v;;\xff|$7w\xb2\xa2\xa2\x02\xb3\xb3\xb31\
+//\x0f+++\xb1\xbe\xbe\x1e/]\xbad\xe4\xb2\
+Ng\x08P\xa9\xd2\x1f\x14\xf6)\x05\xd0\xc7\x93\xbd\xe0\
+\xf7\x00\x9ev\xfb\x01\xc6\x8cmgf\x86\x05VV\xa8\
+IK\xc3\xc3\xf9\xf9\x93\xbbbc{\x93\xe3\xe2\x86J\
+\xd3\xd3\x7f\xa7\x9cOvtt\xa0N\xa7\xc3?\x86\x87\
+'\xd3\xb6m\xab\xe7\xae0Y\x80\xd4F<X6\x01\
+T\xee\x05\xe8g\xa3\xdf\x00L\xf0_z\x031\x94,\
+^l\xec\xfd\x02GG\xf4Q*3\xc5\xfd,6h\
+\xb5\x83\xc3\xbe\x86\x9c\x9c\xd1\xb6\xd66lkk\xc3k\
+W\x06\xb0I\xa3\xb98U\x1dH\xc6\xbd\xb8G\xd9[\
+2\xa4\x97\x86\x0c\x7fO\x00h\xa2a\xb3\x85\xd3P\xe4\
+\xeaj(\xb4\xb66^{\x1d`\x07\x9d=$\xe3\x09\
+\xe2\xd5\x9dQQ\xdf7i\xb5\x93\xcd\xcd\xcd\xd8\xd5\xd5\
+\x85\xddg\xce\x8c\x89\x05\xe6\xf8\x0f\xd1\x06w6\x9e\x05\
+p]2\x9c\x0b0\xf2\x11@\xa1/\x09\xa3\xebf\xc4\
+\xfa\xf7\x01NV\x05\x06b\x81\xb99\xee\x02\xa8\x15\x13\
+o\xfe}\x08Yno\x9fV\x96\x922v\xf4\xe8Q\
+lii\xc1_/\x5c0\xac\xf1\xf0\xc8\xa0k\xaa\xfb\
+\x09\xd8\xf8%\xc0\x801\xb466\xb7\xdf\xa3\xfd/\xa9\
+\xa5\x8f\x92\x08\xa7\x92\xae.uw\xc72\x95\x0a\xbf\x00\
+h\xa6\xb3\x85\xc4\xa3\xa2%\x952l\xc5\xf9\xd3\xc4\xa6\
+O\xc3\xc3\x7f\xa8>\xac\x9e\xac\xab\xab\xc3\xcb==\x13\
+\xd1\x91\x91d\x06\xd6\xdd%\x80\x0b\x8d\x8d\x97\xfb\xf8\xe0\
+\x8b\x00{e\xc6\x9f\x22\xa2?\x06\xf8Q\xed\xe6\x86G\
+\x22\x22\x90\x92>\xc0^\x10\x8f\x89\xb6|\x9cg\xba\x0c\
+\xfe\x7f1\xe1B8\x13\xaf,\xb5\xb3\xcb\xca\x8b\x8f\xbf\
+\xa1\xd1hP\xd7\xde\x8e\xc9\xb1\xb1\x0d\xf2\x16\x05\xe9\xf5\
+\x8aW-\xbf\xeb\xad\xba\x13\x81\x1d$l\xefn\x80>\
+\xf6\x9c\xaf\xe5)\x14zo\x80\xb7\x850\x0f\xe1%\x8b\
+yF\x86J\x9csa\xae \x96\x13\xcf\x11on\xf1\
+\xf3;V\x98\x911qL\xad6\xd0\xffo\xc8S\xb0\
+\x96\xf3\xaf\xf1\xf2\xc2\x9a\xc8Hd\x83\xbcj\x19\xce\xb9\
+d\x9c\xe6\x00mcxV<p5\xb1\x86\xc3I\x04\
+\xc8X'\xce\xfd\x09?~a\x15\x82\xc8\x1fxi\xa9\
+R\x99\x11\xe5\xe9Y\xc6N\xdc\xd5\x05$u\x0d\xd5A\
+W\x81B\x81\xbc\xefK\x9c\x9d\x8d\x14\xd1\x84\xe3\x9d\x1f\
+\x02\x10O?\xf2\x16\x0ffC\xa4\x07B\xb98\x89\x17\
+d\xac\x17mG?\x81@!\xc6WD\x84\xd3\xe3$\
+\xd2\xa3\xb8\xef \x8a!\xc5\xdb\x01>\xff\x0c\xa0\x88\xf6\
+f1\xb9\x9c\xb2\xeeN\xc8\xdd\xff#\x01J\xd1)\x8a\
+\xa9&\xa1\x82\x98G<L\xd8\x13KD\xdeg\x92\x02\
+g1\xda-L\x11`&\x86\xcb|\xd1r\x0e\xa2\xba\
+\x97\xfd\x8b\x22\x5c\x22\x8c\xdb\x8ai\xcb\x8e\x99M\xb9\x8c\
+\x84\x88yB\x84\xb5\x08\x9f\xbd\xc8\xa3\xa9m\xc8\xc2\x17\
+\x09'\xd8\xb8\xb9\xdc{S\xb6\xa1$\x82\xc3f%R\
+bm\xc2 Z(\xc2\xfd\x880l)\x9e\xa3\x90{\
+\xcf\xfc\x0d\xe3X\x91\xad\x93x\x02-\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x04\xca\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x04\x5cIDATH\xc7\xc5\
+V\x0bL[\x05\x14\xadMf\x98\x06\xe2\xe6g1\x96\
+\xb1\xd2\x82\x9b\x08\x1dJem\xdc\x849J\xc9\x02Y\
+@\xa8\xa93[\xda\xe10\x8e\xb1\x8d5\x08\xc6\x91\x82\
+C\x9c\x13\xdcO\xc5\xecGE\xa0\x152\xa9\x02)C\
+\x03\xa3\xed\xa0\xa5o\xb4\xae+\xa5\x19l\xb2\xa8,\xc2\
+\x8a%\xc6\xd8\x8d\xeb\xbd\xe6-\xa2\xae\x90\x98\xa9MN\
+^\xfa\xfa\xee=\xef\x9e{\xce{\xe5\x00\x00\xe7\xdf\x04\
+\xe7\x7f#\xc0\xcfR\x848--m\x8fX,~\x87\
+\xcb\xe5\xbe\x81\xdfw \xf2\x10\x12\xc42\x04\xf7\x1f\x11\
+\xe0gu\x5c\x5c\x5c\xa1V\xabm\xed\xec\xec\x1cw:\
+\x9d7}>\xdf\xac\xcdf\xbba0\x18\xdc%%%\
+\xc6\xd8\xd8X\x0dKt\xef|Dwj.U\xa9T\
+\x1f\x9bL&\x8f\xd7\xeb\x85\x81\x81\x01\xa8\xab\xab\x83\x9a\
+\x9a\x1a\xd0\xe9t088\x08.\x97\x0b\x9a\x9a\x9a|\
+999\x0dx}:bq(\x92\xbf\xdd95\xb7\
+X\xad\xdf1\x0c\x03%o\x96\xff\x9a\xb9C3\x9d]\
+y8\xa8\xf8P\x0fY\xda\xf7\x03\xaf\xec\xaf\x99l\xd0\
+\x7f\x16\xc4i@o0\x5c\x97\xcb\xe5MX\x97\x12\x8a\
+\xe4O\x9a\x93,t\xe7\xd4|\xcb\xde\xb2\x1b\xcf\x14\xbf\
+5\x9ct\xb0\xc1\xb7\xa9\xde\xf4\xcb\xe6V3([-\
+\xb3\x09\x07\x9bF_8\xda8R\xdfq\xd6\xefp8\
+\xa0\xa2\xa2b\x94\xc7\xe3i\xb1^Hr\xcdG &\
+\xcdI\x16\xbasj.:\xf0\xc9\x80\xecx\x87Sc\
+rLT\x9e\xbb8S\xd8\xe9\x98N9\xdd=\xba\xb2\
+\xae\xeb|~\xf3Y\xb7\xd96\x18lii\x81\x8c\x8c\
+\x8cn\xac\xcfD\x84\xffu\x8a\xb9\x04\xd9F\xa3\xd1E\
+\x9a\xcb\x0bv\xff \xa8<i\xcdk0]\xd0\xf4\xb8\
+]o3\xe3\x9e*\xe6\xdb\xcbU\x8e\xabWvZF\
+/\x89\xda<_\xc5\xeb\x99\xae\xe3=\xb6\xefI*\xa5\
+R\xe9\xc3\xfa\x22\xc4\xc3\x88E\xa1\x08^Ei\xa6h\
+\xa1\x92=\x15#1\xef6\xf7\xad~N\x05\xcf\xe7\x96\
+\xc2\x86\x17\xf7Ajn\x19\xa4+\xcba]\xf6\xeb\xc0\
+y,\x0b\x12MW:\xf6v1.\xb7\xdb\x0d\x05\x05\
+\x05\xd3X_\x85\xe0!\xc2B\x11\x94\xa0\x15o\x91[\
+D\xe5\xc7\x98\xc7\x0f\xb7\xf5.^\x91\x09K\x13U\xb0\
+\x22u7\x086\x14\xc3\xf2\x94]\x10\x9e\x98\x0f\x9c\xd8\
+\x97\xe1\xe9\xde\x89/\xb2\xda\xbf\xe9\x1b\x1e\x1e&\x82[\
+X\x7f\x04\xc1G\xdc\x17\x8a\xe05\xbb\xdd>EVL\
+\xdbW3\xb2\xf2\xd8\x97=\x9cG\xe5\xc0\x11n\x06\xce\
+*\xf5\x1fx\x02\x11\xa7\x86$\xf3\xa4\xb1\xcc\xe2\x1b\xf2\
+x<\xa0P(h\x82\x03\x88h\xc4\xfd\xa1\x08\xf2(\
+D\xe4\xf3\x82\xeaC\x134\x01\xff\xc4\xc5~\xbe\xe1\xc7\
+~\xc1\x99\x80U\xd0\x16\xb0D\x9f\x09\x9c\x17\x1a\x03f\
+q\xffOm4\x81\xdey\xf9\x1a9\x09\xd3N;(\
+]h\x02\x09%\x94BD>\xcf\xfb@\x7f)\xea\xa8\
+\xdd\x1ey\xea\x9a\x83\xf7\xa9\x7f\x88\xd7<\xc3 .\x08\
+>\x0fX\x93,SFM\xff\x18\xe3\x1c\xf6\x06kk\
+k!!!\xa1\x17\xeb\xb7.\xb4\x83e\x14\x7fJ(\
+9\xa3\xbe\xa3\xdb\xafn\xfc\xda\x13S?t.J7\
+n\x8bl\x98t\x08Z\xa7\xac\xf1\xa6\x09\x135og\
+\xdc?\x9b\xcdf\x90\xc9d\xfe\x88\x88\x88\xd3X\xbfv\
+!\x17qi\x0a\x8a?%\x94F'\x9f\x93\x15\xc9-\
+\xb4P\xd2\x9cdqz\xbcAj\xae\xde\xb6mV*\
+\x95\xce`];\x82\xc2&\x0a\x99\x03\x96\x84\x1e\x5c\xe9\
+\x14\x7fJ(\x85\x88\xa6!+\x92[h\xa1DL\xb2\
+\xe05~\x89D\x12HNN\x86\xcc5\xfc\x99]\x9b\
+V]\xc7\xda\x9d\x94\xe8\xf9\x08\xb8\xec3%\x85\xe2O\
+\x09\xa5\x10\x91\xcf\xc9\x8a\xe4\x16Z(i\x8e\xb2\x9c\x0a\
+\x0b\x0b\x1bH}2\xeaf\xd9\xc6\x18\xf8h{\x12\x94\
+\xbf\x940Nn\x9cKr\xa7\xa7\xe9m\x12!\x1b\xff\
+\x226DGX+\x96\xb2\x0b]w\x0f\x87c]\x1b\
+\xb9$P\xf8\xecr\xa8\xce\x8d\x03]\xd1\x1a\xd8\xbf5\
+ql.I\xa8\xf7\x01\x97\x95+\x9c]\x1c\x8f\xb5`\
+4{\xe4\xb1\xe7EH\xd2\xb7>\xfa\xa1\x80f=\x1f\
+\xdeS\xc6Cc\xb1\x14\xaa\xd5O\xfdN\xb2\xe0+\x93\
+%ZD\xd6#\x7fS\x88\xd8c\x18{\x9e~\x17\x22\
+Ig\x1a\x7f\xc9\xd5R\x99\x00\x0em\x11\xc1v\xb9\xd0\
+\x8d\xe7\x15w\xed\x9d\xcc\x92\xb4\xc8\x85\x0f\x8em\x8c\x7f\
+\x84\x9a\xe7#\x1e\xb8\xab/}vg\xa4\xbd\xe2v\xf3\
+\xff\xe4_\xc5o&M\xee\x1d\xf0\xc3\x08u\x00\x00\x00\
+\x00IEND\xaeB`\x82\
+\x00\x00\x02\xa5\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x027IDATH\xc7\xdd\
+T]o\x12A\x14\xedO\xf3g\xf8S\xf6\xb1&\x1a\
+\x13\x9f\x9a\x18\xfd\x01V_\xfah\x0d\xb5\x88Phi\
+\x90]\x0a\xc6\x16X\xa0\xb0,l\xf9\xb0\x14\xac\x8d\x0f\
+\xb03\xc7sg\xd5\xfa\x01\x8d&\xf0P\x1f&\xf7\xce\
+\xb9w\xce\xd9\xbdw\xee\xac\xdd\xb9\xbbnq9+Z\
+\xd6\x9a8\xfbm\x8d\xf5X\x88\x97\xc7S\xbc=\x05\x1e\
+\xa5\x80XY\xe1uU\xe1~\x1c\xd8>\x9e\xd1\xd7\xb8\
+\x17S\x88\x11{S\x07\x1e&\x80L\x1b&\xffA\x5c\
+\x99\xfcD\xe3\xfa\xeca\x17\x10n#\x90\xf6\x14\xe25\
+`\xa7\x12\x1d\x96D9(\xfbW'3\xec\xba\x1a\xc9\
+f\x84'\x1a\x92\xab):E\xaa%d!\xf6h\xb7\
+?L\x8d\xddeL8\xb2?\x09\xac\xb6D\x00V\xba\
+\xfe\x00\x96\xfcG\xd6<\x01g\xb3\xa4\x91a=3\xac\
+\xfbF\x8a5\xad\xce\x90\xac+<9\x00\xd2\xcd\x08\x7f\
+\x9ae?\xdc\xd0\xec\x1f\xef\x03)\xf6F\xfc\x8d=m\
+|\xa7\xf7\xad\x07\xf3\x04\x8a\x03!\x09\x91\xf3\xe5`\x88\
+dm\x86,oL\xd6\x8b\xf6\x99\x966V\xb0\x03\xfa\
+\xe9Smb\x99fd\xdf\x05@\xe1\x06\x01\xeb\xf65\
+y\x85W\xd5\xfaQ\xf7\x18\x87\xc3\x09\x14J\xac\xdds\
+[\xc3\xe6\xa0\xe4\xbc\x10\x9b\xb6\xc2\xd1\x99\xc4\x80\x17\x0e\
+Pd<\xd7\x0a\xf1,\xcfF\x06\x1a\xa5~\x84\xdb\x1d\
+\x85\xf7\xf4\xb7J0\xf9\xc5\x9e\xba\xee\x818\xee\x05\x03\
+<\xe00\xf1\x88d\xa5\x9eF\xa1\xabI6C\xbe\x1d\
+\x9a\x98\xed\x93\x84\x02\xb2$&\x1f#\xb8\xec\xc5\xff\x1e\
+\x17\x8e\xfa\x18\xbf\x08X\xff\xcf$/\xf9\xdaZ\x7f#\
+\xe0x\x9f\x80r\x9f\xaf(\x9f\xec\x06{U\x19(\x0e\
+\x1a\xe0~\x8c\xf0\x9d\x93\x10\xee\x90\xbd\x09\xf8\xf2\xf2\xa9\
+\xae\x0c4\x9a\x93\x05\x836O\xc0\xbf\x04\x9a$\xae\x91\
+\xb0qN\x91\x91F\x95\x22\xe5^\x08\x8fDu\xc1\xce\
+\x19\x1bQt\xa8M\x9e\xf7\x0f\x02\xd6\xedk\xf2\x12\xaf\
+\xad\xb5\xb0\xee\xfd+\xc0g\x1dm\xbe\x98g\x9fY\xd3\
+\x0b\x0eZ'\xc2Z#E\x5c\x1b+\xfb\x02\xa7>`\
+\x9f\xba\xbc\x0c\xf9V\x84\x05\x97zq\x0f$\xd0\xbb\xd2\
+\xf0\xc7\x0a\x9d\x89Fw\x22\x02\xcaX!i\xd3\xf7\xc7\
+\x8cO\xa2%\xe4\xbf\xfb\xc3/\xb8Q`i%\xfa\x0a\
++\x855~\xfc~J\xed\x00\x00\x00\x00IEND\
+\xaeB`\x82\
+\x00\x00\x04\xb8\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x04JIDATH\xc7\xc5\
+VaL[e\x14\xfdl2\xd3i \x0ee$K\
+7VZ\x8a\xb3\xd2N\xa5BqC\xc0\xb5\x94\x10\xe6\
+\x02B\x13\xaac\xa3cc\xd9\x18Y\xb7\xa6\x01\xa3\x08\
+\x88a\x0b)\xb2\xcd)f\xba\x81\x84\xda\x8a\x89\xd4\x00\
+)C3\x1c \xa5P\xd7jWJ#\xc4lQY\
+\x941\xbb\xf8\xc3n\xbb\xde\xbb\xbcE\xd4\x15\x123\xb5\
+\xc9\xc9K_\xdf\xbd\xe7\xfb\xce=\xe7}e\x00\xc0\xfe\
+M\xb0\xff\x8d\x00?1\x08\x85J\xa52(\x14\x8a#\
+<\x1e\xefe\xfc\xbe\x1fQ\x8cP\x22\xe2\x10\xbc\x7fD\
+\x80\x9f\x8dR\xa9\xb4\xb2\xae\xae\xee\xe3\xfe\xfe\xfeK\x1e\
+\x8f\xe7F0\x18\xbc5>>~\xd5f\xb3\xf9L&\
+\x93]\x22\x91\x189\xa2\xfb\x97\x22\xba[\xf3\xf4\xb2\xb2\
+\xb2w\x1d\x0e\x87?\x10\x08\x80\xd3\xe9\x84\xb6\xb660\
+\x9b\xcd\xd0\xd1\xd1\x01\x13\x13\x13\xe0\xf5z\xc1b\xb1\x04\
+\x0b\x0b\x0b;\xf1\xf9\x1c\xc4\xcaH$\x7f[95\x1f\
+\x19\x1d\xfd\xde\xedv\x83\xe9\x95\xda\xdf\xf2\xf7\x1b\xaf\x15\
+4\x1c\x0bk\xdf\xb6\xc2\xd6\xba7C\xbb\x1b\xcd?w\
+Z?\x0a\xe3n\xc0j\xb3]\xd1h4\x16\xac\xcb\x8c\
+D\xf2'\xcdI\x16Z95/=\x5cs\xf5\xe9C\
+\xafO\xa54w\x06YL\x1a\xb0\xd8\xcd\xc0Vg\x82\
+\xac\xd92\xf3\xc2\x89\xae\xe9\xf6\xbe\xb3\x0b\x93\x93\x93P\
+__?#\x10\x08\xea\xb0^Lr-E\xa0 \xcd\
+I\x16Z95\x97\x1f\xfd\xc0\xa9>\xd5\xe7yv[\
+%<_V\x0b\xcf\x14\x18 \xf3\xcc\xe0\xcc\xa3m\x03\
+_\x96\x7fx\xd67<>\x11\xee\xee\xee\x86\xdc\xdc\xdc\
+A\xac\xcfGD\xfdu\x17\x8b\x09\x0a\xecv\xbb\x974\
+\xd7T\x1c\xfcQ\xd4\xf0\xfehq\xa7\xe3+\xe39\x9f\
+\xf7\xc5}G`\xbb\xa1\x15JM'\xe1\xc0\xc8\xccE\
+y\x8f\xff\xb3d\xab{\xe0\xd4\xb9\xf1\x1fH\xaa\x92\x92\
+\x92 \xd6W!b\x11+\x22\x11\xecEi\xe6i\xa0\
+JC\xfd4\x8bQ\xc2\xc6\xacrx\xae\xa8\x1a\xb6\xe8\
+^\x83\xac\x97\x1a!\xa7\xbc\x192t\x0d\xc0\xe2\x0b\x81\
+\xad\xc9\x83\xc3\x03n\xaf\xcf\xe7\x83\x8a\x8a\x8akX\xff\
+\x06B\x80\xe0G\x220\xa1\x15o\x92[\xe4\xb5o\xb9\
+Yl\x06\xacL*\x86\x98\x94\xdd\xb0>\xdb\x00\xa2\x1c\
+\x13\xac\xdbb\x84(\xc5^`I\xdb\x81%\xea`k\
+\xef\xd7\xe7\xa7\xa6\xa6\x88\xe0&\xd6\x1fG\x08\x11\x0fD\
+\x22\xd8\xe7r\xb9\xe6\xc9\x8a\xaaW\xcd\xd34P\x96P\
+\x04l\xc3N\x84\xfe\x0f<\x86\x90\xd2u'\xd4\x8c\x04\
+/\xf8\xfd~\xd0j\xb5\xb4\x83\xa3\x88\x04\xc4\x83\x91\x08\
+\x8a)D\xe4\xf3\x8a\xa6\xd6\xb9\xa4c=C\xc2\xf7\xbe\
+\x19\x13\xda~\x1ac\x22\x5c\xb1\x04\x89$z\x10\xdbC\
+\xc3\x8a\xb1_z\x9e\x1a\x9a\xfb\xd4\xea\xf9\xf629\x09\
+\xd3N3\xa8^n\x07JJ(\x85\x88|^|\xd2\
+z1\xfe\x84\xcb\xb5\xf6\xf4\xe5I\xb6\x065\x17\x92,\
+z\x10}\x12\x1aM\x19\x99\xb7\x1b\xc7f\xdd\x9e\xa9@\
+\xb8\xa5\xa5\x05d2\xd9\x10\xd6\xefXn\x06q\x14\x7f\
+J(9\xa3\xbdopA\xdf\xf5\xb9?\xb1\xfd\xc2\x17\
+,.\x0f\xd8z\xdd\xed]$;\xe6\x1c\xd4\xbc\xd7\xed\
+\xfbuxx\x18\xd4j\xf5Btt\xf4\x19\xac\xdf\xbc\
+\x9c\x8bx\xb4\x0b\x8a?%\x94\xb6N>'+\x92[\
+h\xa0\xa49\xc9\xe2\xf1\x07\xc2\xd4\x5c\xbfk\xd7\xad\xf4\
+\xf4\xf4\xebX\xd7\x8b\xa0\xb0\xc9#\xe6\x80#\xa1\x17W\
+\x0e\xc5\x9f\x12J!\xa2\xdd\x90\x15\xc9-4P\x22&\
+Y\xf0\x99\x05\xa5R\x19JMM\x85\xfc4\xe1\xf5\x83\
+\xdb6\x5c\xc1\xda\x03\x94\xe8\xa5\x08x\xdc;%\x93\xe2\
+O\x09\xa5\x10\x91\xcf\xc9\x8a\xe4\x16\x1a(i\x8e\xb2\x9c\
+\xe6\xf3\xf9\xce\xac\xc7\xe3o\xd4\xe4%\xc2;{R\xa0\
+V'\xbbDn\x5cLr\xb7\xb7\xe9\x1d\x121\x17\xff\
+*.D\xc79+Vs\x03\xcd\xb8\x8f\xb1\xd1Mk\
+W\x85*7\xad\x83\xa6\x22)tT\xa5A\xe3\x8e'\
+f\x17\x93D:\x0fx\x9c\x5cQ\xdc\xe0\x04\x9c\x05\x13\
+\xb8\xab\x80\xbb/G\x92\xf3\xd9\xa2GB\xc6l!\x98\
+K\x92\xa1\xebP:4\xe9\x9f\xbcM\xb2\xec\x91\xc9\x11\
+\xad \xeb\x91\xbf)D\xdc\x95\xcf\xdd\xa7\xdf\xc5H\xd2\
+\xaf\x12\xae\xfa\xaeZ-\x82\xd6R9\xec\xd1\x88}x\
+_{\xcf\xced\x8e\xa4[#~x6/y55\
+/G<tO\x0f}nf\xa4\xbd\xf6N\xf3\xff\xe4\
+_\xc5\xefIW\xd6\xb7\x03y\xba\xe9\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x05\xca\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x05\x91IDATx^\x8d\x95\x0blT\xc7\
+\x15\x86\xbf\x99\xfb\xd8\xf5\x9a\xf5\xda\x06\xf30\x8e\x1d\x13\
+H\xf3\xb0\xdc\xd0\x84\xf4!J\xd4\x9a\x10H\x1c\xea\xa4\
+i\xe2\x84 (\x88GS\x09\x0aiR)\xa9*H\
+H\xabJ\x81TQ\xc5+\x85\xd0\x16\xb7)\xb8Q\x12\
+\x90\x5c+4\xcd\x8bPJ\x95\xb5\xe5&\xc6P\x82\xed\
+\xae\xb76\xf5\xf3\x81\xbd\x8f\xbbs\xba\x8aV\xb8\x1bZ\
+\xe8/\xfdstf\xa4\xf3\xcf?G\xa3\xa3D\x84\x0c\
+\xd8\xb7N-\xfdC\x98ym\x11f\x8e\xc7\xf1#(\
+@P\x08\xa0\xf2r)\xbc\xa9\x94\xf8\xd7nf'\x9a\
+\xe6U\xbb\xa4\x9b\xabAD>\xe5\xee\xd5<\xd2Rw\
+\xdb\xd0\xa6\x07''\xe4\x7f \xe6\x89<\xfd\xedB\xf9\
+\xdb\x1e\xf5\xaf#O\x13\xdd\xfa\x00e\x22\xc2\x95h\x93\
+\x81\xf1XYq\xfb\xbc\xbc\xe2\x93\xedtuu`;\
+\x01</\x89\xa0\xd0\xca\x22\x85\xe2\xa7[6S\x22\xfd\
+\x9c\xe9 wt\x90\x84_\xb3e\xe7\x0a\xd5\xa5\xe1Z\
+\x81\x5c\xdbf\xff\x9a}r\x84\x09\xa0\xc9@\x0cS\xb1\
+\x87\xc0\xeb\xa5\xb3\xa3\x9d\xa6p3\xe1p\x13\xcdi~\
+\x18\x0e\xf3\xde\xe1-\xcc\xcd\x0fS>\xebVB\xe5\xdf\
+\xf2\xcd\xbecc\xa8\xfa\xb1\xdd\x0f\xdd\xfbd\xc3\xa6e\
+\xcf\x9f\xad]\xbb?Qss\xd5\xda\x03;\x96\xa9\xef\
+\xfe\xd7'\xfa\xf9#4\xc9\xe9o\xcas\x1b\x02\xf2\xe2\
+\x8b/\xc8\xea\xd5\xdf\x91\xda\x87\x97\xc9=\xd55\xb2p\
+\xd1\xbd\xf2T\x8d\x92\xc4\xd8\x90\x5c\x8e\xb8$\x92c\x97\
+\xb2\x86\x9f-\x8a\xeex\x94\x8d\x99\xba\x13\x0e\x8cB\xa5\
+\x8caNe%\xc7\x8e\xd5\xf3Q\xcb1\x22\x1d'\x19\
+\xe8m!\xe0o\xc3\xe7\x0a\x82\x07$A\x06\xc0\xf4\x83\
+\xe9%>6@\xff\x85N\xbc\x94\x07\xc0\xe2\x8d\x8d3\
+\x5c\x8b\xe5J)\x07\x98\xe8\x812\x08(\xe6U\xe41\
+\x9a\xd0\x8c\x8c\xd8\xd8\xb6\x85BQ^\x1e\xe2\xc2\xf1\x0e\
+\x14I`\x0cR\x17A\x04\x94\x22\x11\x1bf\xa0\xaf\x1b\
+t\x80\xbc\xfc\xa98\x8e\x8fP\xf1uEpn\x1a\x10\
+\xb9$ \x1a,[1\xa5\xc8\xc7\xdd\x8bK\x89]L\
+\x90\xf0Rh\xad\xc8\xc9\xb19\xd1\xecd\xec\xa6\x80\x18\
+h\x0b\xc4C)C\xd2\x8b\xd3\xdc\xf4^:Z\x14N\
+.!\xdaq.\x09\xe4e;P\x08\x8e\xc6\xefj\xb4\
+\xed\x10\xf0k@\xb0-\x85\xdfg\xa5s\x0b\xcb\xd1\x80\
+\x02\xdb\x01I\x81\xd1\xd8\x96\xa4\xcf@R\xe3\xc4c\x1e\
+)\xaf\x88\xd88\x06\xb0\xb2\x04\x04@+l[a\x05\
+\x1c\x94\xd2\x1cy\xe3\x0c\xaf\x1dmel,FW\xeb\
+\x10\xbf\x09\xaf@iCaA\x90\xfbk\xeed\xc1\xc2\
+\xaf`\xeb\x04\xf9\xa1\x00\xe5\xa5\x93\x89{>\x82\xa1\xe9\
+\x04\x5c<\xc0|\xd6\x01h\xf5)\x95\xa3\x89\xb4\x0fp\
+\xf0\xe88\x0fo\xfe\x0b\xa7:\x83\xcc\x1c\x18\xc62.\
+\xae\x11\xe6\x96^\xe0\xd5\xd7\x7f\xc0\x82E_\xc4v\x85\
+\xe0$\x07\x9f[\x80QA|9\xd3\xf0\xbb\x18 \x99\
+%`[\x08\xd6\xc4\xcf\xc8\x0d8x\xf1Q\xfaG\x87\
+i\xe8*\xe4\xa3\xd6\xc9$\xfa\xc0\x17\x87MK\x82t\
+v\x9e\x07FA<\x5c;\x85c\x81J/\xb8\xb9\xe9\
+\x1c\x03\x98\xac\x8f\xe6\xda\x80#`\x03\x16\x14\x5c\x13\xe4\
+\x89u3x\xfd\x99[\xb8-\xe7\x14:\x07\xd0\x10W\
+\xe0yC\x04ss\xc0\x18\x90L\x10\x00\x05\x80\x12\x00\
+\xc8r\xb0\xb5\x9e\xca\xfe\xa20\x0f\xdcW\xcc\xb4\xb2\x11\
+\xa2\xd1!\xce\xb6\xf50\xbbb\x01=n\x11\xe2\x07r\
+@\x01\x96\x0d\x22\x99\xcai\x8a\x08\x00d\x22d\x0b\xa0\
+\x94zp\xeb\x81\xdd\xd6\x94\xd9\x9f\xe3\xb9\xfd?a\xb8\
+\xe78E%\xb3(\xbb}-\xd1\xfbV\xf2\xe6\x19\xf0\
+\x5c\xc8\x9b\x0a\xf6\x18\xe0h\x8c\x11\x10\xc1\xa4\x0c\xc6\x98\
+\xcc\xcd\x0d\x1a\xb9\x5c\x00\xe8\xeem\xff;\xd7W\xd7R\
+\xb2\xbd\x91\x9e\x9e$\xed\x9eCc/D\xbb\xc1\xe7\x87\
+\xbb>\x0f7\xfc\xf3Ox\xbeY\xcc)/\xa3\xf5b\
+\x02\x8c`\xc4 i\x02\x99\x98\x0d\x0d \x22\xef\xc6\xde\
+|\xbe\xf3w\xcb+\x09\x1e\xd9\x85R1\x86\x05\xf2|\
+\xf0\xd5\xc28\x8f\x15\x9f\xe1\xa6w\x96\xf3\xf1o\x1fg\
+\xe0\xed'\x88E\x1a\x99\xff\xe5J\xc4KaR)D\
+$\xe3H\x01\xf6\xa5Vd5\xf9K7\xd0wx\xcf\
+\x17x\xeb\xc0\x8fq_\xdaL\xcd\x89\xed\xack\xdfG\
+\xd5\xc7\xcf\xd2sh%G\xeb\x0e\xd2\xd0p\x88mO\
+\xad\xe0\xb5_=\xc3\xd2\xea\xf9$\x93\x1e\x06\x0d\xcaE\
+\xd9A,w\x0a\xe0`i4\xa0\xb2\x9a\x1c\xf7P\xf6\
+\x94 G\xf7F\xf8\xf3\x07\xbf\xe0\x83\x0f\xa1%\x02\x17\
+\xc7A\x83\xb7\xe6NH\xe1\xd8\xa5\xe5%\xd4\xa5/P\
+P\x90\x8f\x88\x83\xe5LB\xdbyXn\x88\xe4h\xdc\
+t\xb7\xbd<z\xea<\x9f\x00^\x96\x03\x01\x0b\xaf\x8d\
+7\x1a\xe1\x9d&\xe8\x1f$13H\xdf\xad3\xe8\x9c\
+?\x9dV\xe31`\x8c\x831.\x05\x85%hg:\
+np\x0e\xda.&z\xbai\xe8\xc4\xc1\xc7\xff\xf1\xfb\
+\x1f\x95\x9f\xdd\xb2y\xd5[\x0d\xcd\xd4\x03\x83\xd9#s\
+\x15\x07\xce\xfd\x11\xd9\xba\x8a\xc1\x9d\xeb\xf9\xa4n\x03\xa7\
+\xd7WQ\x7f\xf7-l\xcb\xf7\xb3d{-\xefK*\
+.\x22\xa3\x22\xa6O\x06#'\xc7\xffZ\xbf!\xf2\xea\
+\x0fK\xda~\xbd\x9e\xd6\xaa\x1b\xd9\x9ek\xf3\x0d\xe0F\
+\xa0\x00\xd0\x222!\xb0o\x1d_\xdf\xbb\x86C\xdf\xbf\
+\x87]\xf3f\xf1dQ\x90%\xc0l _Dxy\
+-\xbfL\x8ctI\xdf\xf9\xe3\xb1\xb7\xf7,\xedx\xe5\
+{V\xdb\xe2\x0a^*+`%0\x17\x98\x0e\xe4|\
+v&s\xd9\x06\x84\x80|\xc0\xf9\xcf\xfdW6\xb0p\
+\xefj\xea\x9f\xbd\x9f\xc3\xf3\xe7\xb0-\xe0P\x0d\x5c\x07\
+L\xba\xd2\xd0W\x99\xa2\xff7\x94R!\xc0\x01FD\
+$\xceU\xf0o\x03\xe2\xf6\xe2\xccie\x93\x00\x00\x00\
+\x00IEND\xaeB`\x82\
+\x00\x00\x04\xb5\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x04|IDATx^\xb5\x94\xddk\x1c\xd5\
+\x1f\xc6?\xe7efg_\xf2n\xd2\xb4i\xc17\xea\
+\x0b\xe2M\xf4\xceK\xa1\x88\x82HA\xe8\x95z!\xbd\
+\xf4\xc7\xef\x0f\xf0F\xf4R\xf0\xd2K\x11[\x14-\x8a\
+\x8aB\xac(\xc1hm\xda\x9b\x94&m\x9a\xb6I7\
+M\x9a\xeenvgwgwfg\xe68=\x84\xb0\
+\xa1\x90\x80\xe0\x03\xcf\xce~\x99\x99\xe7\xf3=\xdf93\
+\xc2\x18\xc3\x7f)\xcd\x8e\xa6\xa7O\xbf\x02\xe6\x0d0G\
+\x8dA\xf2\xef$\x8dIV\xe2\xb8\xfb\xcb\x95+g\x7f\
+\x04\x22\xcd\xae\xcc\x9b\xef}\xf4\xbf\x93z\xf8\x91\xfc\xc5\
+\xb9Y\xb9\xf0\xd7\x8c\xe8v\x9aB\x22\x11\x02\x84\xfd\x01\
+)D\xdf\x7f\x89v]\xa6\x9ex\x96'_<\xc1\xf8\
+\xe4a\xe6g\xe7^\x9a\xfb\xec\x8b\xe3\xc0%\xe0^\x1f\
+\x80\xe3\xce\xf0\x98\xf7kY\xe9\xaf\xbf<\xc7\x07\xef\xbe\
+\xca\xe3G'\x91Rb\x00#R$\xc2\xd6\x02\x01\x18\
+\xa4R\xd8\xda)p\xe6\xd2&\xdf.k\xf4\x1f?h\
+\xe0\x080\x054v\x01\xc6\x98f\xa5\xea\xa776\xf3\
+\xd4\xb7}\x06=E\xc1\x15\xf4\xe2\x08\x00\x89Dk\x9d\
+Y\xd9\x15\xf4z\x11i\x9a R\x81\xe7*\xa2\xc5\x9f\
+\xf1\x07^c \x8c\x93$\xe9E@\x01P\x9a>I\
+\x09EG\xda\x80\xd2\xe0\x10\x85b\x918\x8e\xc9\xee\xb0\
+\xa1J\xd9p\xeb\x9d\xee\xf1<\x8fRi\x80\xe9\x97O\
+r\xfdZ\x1e)\x15 \x00\x0c@?\xc0\x86hG\xa2\
+\xa4`(\x03\x0c\x0f\x0f\x13\x86!\xbd^o\x17\xb2#\
+[g\xa6\xddn\x13\x85!\xc5\xe1I\xf2\xf9\x88h\xf7\
+\x9a\x87\x01h!\xc8i\x89V\x92z\xbd\xce`\xc1\xf2\
+m\xe7\xae\xeb\xda\x11)\xdb\xb9]\xa5\xad\x9d\xcc\xf9B\
+\x9e\xdb\xab\x0a\xcf\xa9\xd3\x13\x86~\xed\x1d\x91\x10\xb8\x8e\
+D\x1a\xc3\xc4\xe4\x04G\xa6\x0e\x13\xf7zvL;\xb2\
+\xe1\x80]U\xa7\xd3!0\x86z}\x9b8\x1c\xa3\xe0\
+(\xdaB\xec\x03\x90\x90\xd7\x12\xc7s\x09;\x1d:A\
+`;\xf4\xbc\x1c\x8e\xe3\xe2h\x85\xd2\x1a!\xec\x18\x11\
+RaW\xe7hZ\xb7#\xf2+\x15\x84\xdc\x07\xa0\xa5\
+$\xa7\x05\x03\x87\x9f\xe6\xa9g\x9e\xe3\xd8\xc4\x10\x080\
+iJj\xc8lHR\xe8%\x86N\x02a\x04Q\x22\
+A\xc0v\xd7\x90w%\x12\xf6\x01\x08p\x94\xe1\xd1\x17\
+N0sK\xf0X`\xb2Z\xd2\x89\x15\x9d(\xa5\x19\
+&\x04\x9d\x88z\xab\x8b\xdflSo6i6|\x8c\
+r\xd0\x03\x87\xc8\xe5s(y\xc0\x88r\x0a&\x8eL\
+\xf1\xe9\xf7\xf3\xe4\x13\x1f\x11\xb5\xe9v\x03\xa2N@\x1a\
+wQ&\xc6s\x04C\xc5\x1c#%\x8f\xb1\x91\x12\x13\
+\x13\x87\xa8\xb9c$\xba\x80\x14\xfb\xac@\x09A!\xe7\
+\xd2\xb85\xcf\xf3N\x8dcS\xc3\x94\xbc|\x166B\
+1'\x19\x1d,2\x92\xb9T,\xe0\xe5\x5c\x94\x94D\
+qL\xd0jr\xd9w\xb9\x19h\x84\xdcoDJ\x90\
+s5~\xf9\x1a\xa7\xff\xff:\xbf\xcd\xfc\xc4\xd6Z\x85\
+\xbbq\xc2\xa9S\xa70\xc6\x90\xcb9(%1@b\
+\xc0\xa4\x86\x14A\xc9S\x14\x13\xbd\xff3\x10\x02<G\
+\xe2:\x8e\xdd-\x8bKK\xf6e\x1b\x1f\x1f'MS\
+\x80\xechv-\xa5\xc1`ewX\xde\xd3dp\x91\
+i\x97\xb3\x07\xa8\xa4\xc8\x00\x1a/\xe7\xd0\x09{\x94J\
+%\xc6\xc6\xc6\x18\x1d\x1d\xb5\x80\xfd\x94s\x14=\x7f\x83\
+4\x0a0&\x8d\x01\xf1\x10@K\x81\xa3\x1eX\xee|\
+\x96\xad9PB\xa2\xe26\xcb\xb3\xdf\x98\xcazT\xad\
+\xd7o\xfd\x0et\x81d\x0f@\x0ap\x1d\x81\x94\x801\
+\x1c \x0b\xd7Z\xd9\xe7\x12l]c\xe5\xf2\xed\xee\x8d\
+\xeb\x17>__\xff\xfb<\xb0\x05t\xf7\xee\x22\xad\x18\
+*\x91\x8de\x147\xe7\xda\x0f]\x16b\xdfd\xa5\x04\
+\xae\xab\xb30;g\x82 4\xf5z\xc0\xfd\xfb\x0dj\
+\xb5\x16\xeb\xeb\x95\xf6\xca\xd2\xc2\xb9ju\xe9\x22p\x13\
+\xd8\x00\xc2~\x80t]!\xb7\xca\xcb$\xfe\x1aZM\
+\xf3\xf6;o\xd1jvM\xbb\xdd\xe3\xea\xd5M\x1a\x8d\
+\xae\xa9V[a\xa5R\xf3k\xb5\xda\xa6\xef\xd7\xd6}\
+\xff\xdej\xb5Z^]\x5c\xbc|\xc7\x98\xb4\x01\xdc\x01\
+\xca@\xcbd\xea\x03\x98\xd6\xfc\x85+\xcd\xb9\xf33\xc5\
+\xf2\xea\xa6\xf9\xb0|6*\x16\xf2a\x1c\x87\xd5V\xab\
+\xb1\xe1\xfb\x95r\xa5\xb2\xbeV.__\xabV\xef\xd6\
+\x80.\xd0\x01\x82>\xb7\x80&\x10\x98L{\xb6i\x1c\
+w\xbe\xfa\xe4\xfd\x8f7!t\xc3\xdeve\xf9\xea\xec\
+\xc6\xf6\xf6\xea]c\xd2\x10\xe8\xf49\xb0\xb5\x05\xd0\xeb\
+sLf\x1b\xbc\xab>\xc0\xc2\xc2\x99\xef\x80?\x81\x11\
+@\x006x\xe7\x18\x01q\x7f\x98\xc9\xc8\x1c,\xfe\x01\
+\xd1O\x0f\x88\x96x\xffQ\x00\x00\x00\x00IEND\
+\xaeB`\x82\
+\x00\x00\x04\xbf\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x04\x86IDATx^\xed\x97Kh\x5cU\
+\x1c\xc6\x7f\xe7>\xe6\xce\x9dL\xdbt\xa6Qb\x1f1\
+\xb5>\xaaV\x14mK\xc5\xa0E\x5c\x88B\xd7ED\
+]\x98MW\xd2\xba\x13D\x5c\x88\xa5\xd2EI\x17Q\
+Z\xdc\xb9\x11\x8ab\x17\x15t@%bl\xa8$\xe9\
+\xcb<lL[\xd3G\xd2\xc9d:\xaf{\xef\xf1\xe4\
+\xdc\x99\x0c2\x99kK\x07]\xe8\x07?\xce\xdc3\x7f\
+\xbe\xf3\xdds\xce}\xf1\x9f\x97\xa0\xaa\xde\xde\xde\x97\x80\
+\xad\xfc3\x1a\xec\xef\xef\xff\x0a\xc0\xa2\xae\xad\x9dk7\
+\xbc\xbbqc7\xa6ir\xfa\xa72g\x06\x0b,d\
+}\xeeD\xc9U&\x9b\xb7\xba<\xbc-\x86\xef\xfbL\
+LLr\xf9\xe2\xd4{@C\x00\xbe\xf96\xc3\xf0\xe8\
+\x19R\xa95\x5c\xb9`\xf1\xc6\xbegh\x85\x8e\xf6\x7f\
+\xcf\x95\xa2\xc7\xc0\x0f\x19R\xe9\x0e6?\xb0\x11\x80\x86\
+\x00\xb6e\xd3\xde\x9e\x22\xbd\xa6\x03\xd7t\x89\xc7\xe3\xb4\
+B]\xf7\xddCbUA\x9f\x98\x1a\x03`\xf9\x001\
+'\x8e\xeb&H$\x928f\x1b\xe7\xce\x8d\x83e\x81\
+\x1d\x03\xc7A%\x02U\xa3\xdb\x98\xa3\x88\x85\xff{\x1e\
+\x94\xcb\x8a\x12\x14\x8bPR\xe8\xb6\x04\x952\xab\xd3+\
+1\x1d\x93\xc7\x1e\x7f\x8a\xf1\xb1\xf3\xcd\x03\x18\xa6\xa1\xb0\
+\x14&\xea\x80\xed\xdb\x9f\xc4\xda\xb5\x0b\xb9v-H\x89\
+\xc8\xe5\x08v\xec \xd8\xb3\xa7\xde\xef\xfb:\x9c\xbfw\
+/tu\xa9\xfe\xdda?\x84\xfd\x07\x0fr\xe2\xc4\x19\
+\xed\x19z\x8b\xe6\x01\x02?P\xf8\xf8\x9e\x22\xf0\xf4\x12\
+\xf8\xed\xedXG\x8e\x22\x90\xc8\xb9Y\xfc7{q\xf6\
+\xed\xc3S\xfd\xf6\xd1#H@\x9e\x1c\xc2\xfc\xe8\x00\xc6\
+\xc7\x9f\xe8z[\xd5K\x01\x02\x00\x89\xa7\xbcL\xe5\x1b\
+hdD\x00)\xf1\x03?\xc4\xf3\x19\x19\xf9\x8dM\xd7\
+f\xc9\xbf\xf2*\xc2\x10\x04*\xd0\xf5\xb7\xde\xe6f`\
+\xd0-\x04\x93\xc9\x95`[\xf0\xecst\xef\xdf\xcf\xa4\
+4\xd8t#K\xfe\xb5\xd7!\x08\xc8m\xdb\xc1\xdc\x0b\
+/k/\xac\xd07\x90\x11\x01d \x094\x01\x81\x0c\
+\xe8\xe9y\x82\xb9\xbb;\xe8<\xfe%5\xddK\xa89\
+\xc3\xa0\xc72AJ*C')tw\xd3\xb3z%\
+s\xe9\x14\x9d_\x1c\xa3.\x18\x1d\x9eB\x04\x81\xf6\x96\
+AD\x00\x90!2\xc4q\x1c\x84\x10a\x0bH\x04\x08\
+\x89@@6\xcb\xfc\xee\xdd\xba\xceH\xa7I}\xb8\x1f\
+\xb3Z\x1fw\xe2H!A\xa2kk~\xa0\x89\x0a \
+BD\xc8\xc9\x91)d\xdf\xa7LO\xfc\x011\x1b\xe5\
+\x0c\x8e\xad\x88\xc1\xd0)\xb0m\x85\x09\x9e\x8f\xacx\x88\
+b\x19\x8e\x1dg\xfaZ\x0e\xd4oY\xae \xca\xde\x92\
+\x1fh\x9a\x07\x10\xa2\x86 \xd9n\xb3\xf3\xe9G\xb9%\
+\x99f\x18*\x99`9\x9d\x1a\x1c\xa2X\x145\xff\xe6\
+\x01\x10\x02\xa11X\xbf\xbe\x03\xdb\xb6i\x81\xb4\xd7\xd8\
+XN\xfb\x22\x22g@`\x18\xa6B\x90p]~>\
+u\x9aU+\x92\xfa\xfep\xfb\x0a/\xeblnA{\
+\x19\x86\xa1\x11Q\x01\x0c!\x10\x86\xd0\x85\x17/\xcdp\
+\xf5z\xb6\x1a\x0c\x90 \xa1\xe1X\x84{LK\xd0(\
+\x09\x94JEL\xc3\x08\xbd\xa3\x02\x84\x05:\xa9\xc2\xd4\
+O\xc5V\xc8T^B\xa1\xbcU\xfb\xb7K`\xe8\x81\
+/L\x8e1==E\xa1\x90\xe7N\xe4\xbam\xac[\
+\xb7\x81t\xc7]\xb7\xb2\x04F\x18@\x11H\xc9\x07\xef\
+\xbf\xc3\xfc\xfc<\xf9|\x9eJ\xa5\xb2\x14\xd0\xb2\xac%\
+l\xdb\xd6\xad\x0a\xad\xc3\x03\xfaFV.\x97\x97\xf8\xec\
+\xf3\xe3\xdaS\xa1\xc7\xa8\x0b\x8c\xc6\x19\x10\x08U\xb8:\
+\x95\xa6\xa6\x81\x81\x01\xfa\xfa\xfa8|\xf80\x87\x0e\x1d\
+\xd2\xc7\xb7!\xed\xa5<\x15\xfa*\x8b\x0aP\xdf\x84\xae\
+\xebR\xd3\xc8\xc8\x08\xa9T\x8at:\xad\x19\x1e\x1e&\
+JRJ\xeaB{\xd5NLD_\x86\xb5e\x10H\
+Y/L$\x12\xfa\xc9X\x9db\xddF\xa8a\x90\xb0\
+^R\xed\x8d\x98\x01\xaa\x09\x17C\xd4M\xea\x9b'4\
+\xbf\xfd\xabC\x82D\x11>\xe4\xa2\xee\x84 \xaa\x80\xa0\
+U\xf2\x03O\xbf\x0b\x94\xcb%M\xd3\x19\xf0\xbc2\xa5\
+R\x89R\xb1\xa8wv\xcb$!\xb7\x90cf\xe62\
+7\xe6f\x9b\xcf\xc0\xcd\x85\x9b\xccg\xb38N\x9c\x15\
+\xc9\xb6\x16\x06\xf0\xb90>\xc6\xd8\xf9\xb3\xb4%\xdc\x0c\
+0\xb8l\x80B\xa9\xc0\xd5\xab3x\xbe\xa7\x03d\xbe\
+\xfb\x91d2\xc9\xce\xe7_lx\x8eOM\xcf\xd0\x5c\
+\x02\x89\xc4W>\xb3\xb37P\xdf\x01\x8c\x8e\xfeB<\
+fg\x1ez\xf0\xfe\x03@f\xd9\x00\x97\xa6\x7f\xe7\xd7\
+\xb3\xa7\xf5\xa6\xfb\xda\xb2\xf4\x86\xbb\x13I\x19\xbe]\xf9\
+\x9eGWWWf\xcb\x96G\xf4\xe0\xea\xab(\xffo\
+|\x9a\x0d\xd6\x07\xaf\xeb\x7f\xfd\x09\x8d\xfd\xd4\x8a\xd6\x19\
+H?\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x02s\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x02\x05IDATH\xc7\xdd\
+T\xddN\x13Q\x10\xe6\xd1|\x0c\x1fe/5\xd1\x98\
+xeb\xc2\x03X\xbd\xe1R\xb4j\xa9](\xa9\x12\
+\xf6\x08\xc5`i\xbb\xfd\xd9-\xdbn\x89P\x10\xb9r\
+w\xce\xe7\xcc\x9c\x10\xa3\x12\xac)\xeb\x85\x17\x933\xff\
+\xdf\xd9ov\xce\xd2\xad\xdbw<\x16S\x90xK\xa2\
+\xbcK\x80r\x8b\xf0\xa2\x95\xe3\xa1\x0fT{\xce\xbe_\
+!\xbc\xed\x03\xf5\x18xP\x05\xd6B\xf6\xb7\x09w\xcb\
+\x84\xd7m\x8b\xd5\xfd\x0c\xf7*`\x9d4_j%\xff\
+\xf9\xfe7,o\x13\xa4\xb7\x024\x12W\x5c\x8f\x807\
+]\x8b\xf5\xa1K\x92\xb3\xcc\xa0>\x9f\xablK\xac\xda\
+#\xbd@m\xc0\xb9\x1d\x8b\x97\x9f2\xbc:p\x17\x11\
+\xbf^\x82m\xe9y\x09P,E\x00\x0a\x95\x9f\x8c\x1b\
+\xfa\x1a\xef:\x00\xf3\xf4#\xb0\xc1\xfc\xfa\xcc\xf5\xe3M\
+\xa7W;9\x96\x1b<\xa3\x81\xb3E\xaf\x85\x84\xb5v\
+\x86G\xbeU\x7f\x9d\xe7TjZ\xe5\xfdZ\x80\xdd#\
+id\xd1\xe0\x81o\xf4-6\x87\xac\xc7\x02\x98\xab\xdf\
+\x0fs\x8d\x89\xaf\xd6\xcd\xd4~?\x92\x9a\x1cR\xfb'\
+\x80b)*d\xc8\xffd\x93wS\xc2\xce\x04\xd8\x8a\
+\x08+M`o\x0a\x04\x87\x84g\xc6\xe9fl\xf1\x84\
+7s+b\x9eS\xa8\xdf\x8c\xa15%\xf1\x0fs\x04\
+\xbcX\xa5\xc0\xa2\x99J\x8c7;\xfc\xb1h&<e\
+'7\x14\xd9\xe3\x84`D\x9a(\xfa\xce\xd8\x15}H\
+\xac\xda\x97q\xf1o\xc797\xcf4\xd6L-\xfb\x5c\
+\x1f\x89uf\xff\xe5&\xff*s~\x9d\xb7\x08\x80\xe9\
+\xcf\x98\xcf\xcf\xb2h\xc0\xc1\x11\xa1\xc7\xdcV\xf8\xa9n\
+M\x09\xd1\x97\xdf\x17\xeb\xaf\x01&\x17@+\xcd\xd1\x96\
+\xe6'\x16\xbdc\x8b.\x03\x0e\x18ht\xbe8@\xb1\
+\x14\x152\xe4\x05\x7f[o\x1e\x003e\xde\xc7\xe7\xb2\
+\x5c\xcc\xf3\x190<!\x04\xb1\xd5Sl\xc3\xafg\xc4\
+\xc3\x9f|\xe5\xa5\x8b]\x8e\xd4\x5c5\x8f+\x01\xd2\x0b\
+\xcbEVA\xe4T9\xb5\x88g\x84\x84\xff\x9c\xe4L\
+\x00H\xcfC\x8d\x11\xa4f^\x80\x1b\xa5\xe8;\x80m\
+<\xea-*\x08\xd7\x00\x00\x00\x00IEND\xaeB\
+`\x82\
+\x00\x00\x05\xb0\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x05wIDATH\xc7\x95U{LSw\
+\x14\xfe\x0a-}\xf0\x1c\x94gy\xad\x16a \x0c!\
+\x19\xf11\xdc&\x81\xe1$N\xc4-\x19\x8b\xd1\x18G\
+2\x97\x98-f\xce\x18\x97\x91h\xd8\xf6\xc7\xfeqL\
+\xb7\xb8d\x13\x1d\x99dfY\x8c\xc9\x04\x8c\x03\xff\x90\
+\x81\x0aL\x10\xf7\xc0)\xe3\xfd\xa8\xb4\xb4\xbdmo{\
+w\xce\x0f\x0a:us'=\xf9\xdd{{\xef\xf7\x9d\
+\xf3\x9d\xefw\xafJQ\x14\x94\x96\xed\x85_\xf6i\xb2\
+s\x0a>\x8ezB\x1d\x91\x9f\x9b|W\xf2\xf8\x8bd\
+\xd9'[\xcc\x89\x06\xaf\xec[\xa1\x09\xd1\xea\xbdn\xd5\
+\xd4\xd6\xaa\x97\x0b&g\xfa\x86\xf0\xb8\xc1\x04\x1b6\xec\
+GY\xd9\xbb\xd8R\xb5\xff\xa4\xf2\x1f\xf1\xd5\x89\x16\x85\
+\x1eK\xfd_\x04\x80\x9aR\xc5\xa7\xaa\xfac\x97\x05\x90\
+\x83r\xda\xb5\x94V\xf7<\x81\x97\xd2dZ\xf9\xcd\xe3\
+\xe2\x07\xcd/L\xa0\x11|\x0d_\x7fQwk\x06p\
+\xd3\x89MZ\xca\xbbN`L\x9a\xbfsS\xd5\xeb\x95\
+\xb4\xa4?6Ar\xc2S0%d#\xde\xb8\x02}\
+\xd7Z\xbf\xff\xfd\xd79\xb8|\x80\xcb\x0b8<Ki\
+\x9d\x03\xe8\x87\xc2U\xeb\xb4\xb4\x14\xff\x13,))\x09\
+\xd1\xd1\xd1\x0f\x12xe/d\xaf\x17>\x1f\xa1\xaaT\
+?w\xb4_\xb6\xce\xd1\xa1\x83\xd4sx\x97r\x8eH\
+&\xfc@VA!=\xa5}N\xaf\x8b\x81^\x1f\x8b\
+\xca\xcaJ\x1c>|\x18\xb2,/H\xbe\x14\xdc1\x9e\
+Y\xbbQ\xfc\xe1'\x02\x99\xc8\x9a\xcf~\xdb\xb1\xf1\xad\
+\x92\x17]2 \xfb\x02\xe3an:\x9f\x05$\xaa?\
+<\xfc\xc9\x820\xfd8\xd2\xcc\x19\xf0Rq\x0c\xee\xf7\
+\xfb\x1f \x10\x1d\x84\xea\x06\xa1V\xf5c\xeb\x16\x8bH\
+\xaf\xa44\xdd\xf8\x8dt\xa7j'\xed\xc0\xf0\x14pk\
+\x0c\x18\xf8\x13\x18\x1a\x99/\xeb\xfd\xda\x0f\x9e\x96$i\
+\xb7\xc7\xe3y$\xf8b\x07|\xdd\xefW\x81\x15\x92e\
+\x7f\xf9\xae\x9a\xf5_\xaaF%X\x87u\x880\x00\xe6\
+D\xc0@U\xeb\x82\x9cT\x91\x0bj\xba\xf1\x85\xb7_\
+\x85,\xfd\xf1\xe9\x89\x86\x931D\xf2\x19\xc9;\xc5\x04\
+\x0f\x95(p\xad\xa5\xe5\x22\x91x\x93N\x9ff\x17\x86\
+\xc05gC\xcf\xb5.H#^\xd8e7\x82x&\
+\x92\x84\xa0 -n\xdd\x8e\x80\xc5\x92\x81\xe3\xc7\x8f\xd7\
+NOO\xd7\xb6\xb5\xb5\xdd$\xa2\xd5\xf4\xe0\xccC\x08\
+\x14\x1e0\x15\xe6;\x90\x90\x90T\xd9\xdc\xfc\x13\x22\xc3\
+CA\x12\xa0\xb3\xb3\x13\x92\xdb\x0dcl<\x22\xc2\xc2\
+\xa0\xd1j`0h\xe0q\xfb\xb1j\xf5j\xe1\x9c\xf1\
+\xf1qddddFDDL\x1f:t\xa8\x80 \
+\xaf\xddG@\xc0E\xd9\xd9\xd9_\xed\xda\xf5F\x96\xcb\
+\xe5\x84\xc3\xe1\x80\xe4\xf1\xa2\xbb\xf7:,\x99Y($\
+\xd7\xb0\xce\xa1\xa1\xa1\x88\x89\x89\xa1\x0e\xe6\xb7\x8f\xcdf\
+\x07UO\xc3Wadd\x04\xdb\xb6mc\xb2\xce\xfa\
+\xfa\xfa\xb8@'\x82\xc0`0|X]]\x9d\x95\x91\
+a\xc1\xf0\xf004\x1a\x0dt:\x1drrr\xd0\xdf\
+\xdf\x8f\xf8\xf8xq\x8dcrr\x12V\xabUt7\
+;;\x0b\xa7\xd3I\x8e\x0a\x87\xd9lFZZ\x1a\xca\
+\xcb\xcb\x83\x9b\x9a\x9a>\x9f\x98\x98\xd8\xbaH@\x0e0\
+\x04\x00\xb8\x1a>f\x10\xde\x17\x99\x99\x99hmm\x85\
+\xd1h\x14vT\xab\xd5\xc21T\x14\xcb\x22\x8e\x9dN\
+\x17$\xa7\x1b\xd7{\xae\xe3\xce\xed;\xfc|>A\x19\
+\xb9\x0bA066\xa6\xd0\xb0@] 55\x15Q\
+QQ\x08\x09\x09\x11\xed\xeb\xf5z\x14\x16\x16\x92\x1c6\
+AL:\x83\xad9::\x8a\xde\xde^\xd8\xedv:\
+\x1e\xc3\xf0\xd0\x10\xa6\xac3\x88\x8b\x89C0\xd4\xb4\x83\
+\xa0\xe3z\x05\x01\x81\xfc\x95\x97\x97W\xc4r\x9c9s\
+F\x00fee!%%E\x000\x19w\xc3:\x0f\
+\x11\x10\x13\xb34\x81\xd5\x9cfA\xee\xca\x5c\x5c\x8c<\
+\x06{\xb7\x0f>\xb7\x10\x83\xb7\xa8_\x10\xb8\xdd\xee\x1b\
+\xc9\xc9\xc9())\x11\x1a3\x09\xbb\x875-..\
+FWW\x17\x06\x06\x06\xc4\xf0Y&\xadV\x8b0r\
+Tnn.\x96/_\x8e\xe8\xc8h8=\x0e\xa8\x9c\
+\xaf\xc1\x99\xacB\x93r\xee~\x9b\x06\x07\x07G\xb2\x14\
+\x1c\xb1\xb1\xb1\xa8\xa9\xa9\xc1\xe0\xe0 \xba\xbb\xbb\xd1\xd0\
+\xd0 *\x8f\x8b\x8b\x13i2\x99\xc0\xc50\x01\xeb\xcf\
+]\xf4\xf4\xfc\x82S\x0d\xa7\xf0RI\x05\xe2\x92\x8d\xb0\
+K6\xffB\x07\x8a \x19&\xce\x9f?\x8f5k\
+\xd6,2\xa7\xa7\xa7\x0b \xbe\xd6\xdc\xdcB2i\x10\
+\x19\x19)\xe60==\x89\xabW\xaf\x0a\xb9\xdc\xbcG\
+\xc8\x00U\xafT\x2211Q\xb8o\xd92\x8b\x91\xe6\
+\x13\x22L\xc3\x9b\x8c}M\xeb:\xd2\xbc\xb1\xae\xae.\
+\x91\x87\x1d\xd8\x80l\xc7\x0b\x17.\x08it\xba\x10\x1c\
+9\xf2\x09\x0d\xdc%\x86\x9d\x92\x92\x8a\x84\x84D\xe4\xe7\
+\xe7\xa3\xa2\xa2\x82\x95\x80_\xf1#/7\xcf\xde\xd7\xd7\
+\xf7<A\xdc\x14 <\xc4{$\xab-**RZ\
+ZZ\x16?\x934\x0f\xa5\xbd\xfd\xa2\xd2\xd6vE\xd9\
+\xb3\xe7\x88\xb2s\xe7ne\xdf\xbe\xbd\xca\xb9sg\x17\
+\xef\xb9t\xe9\x92RZZ\xca\xe3\xed\xa2\xfc\x88?\x0f\
+\x02\x8f\x09\xb8-\xf6\xff=\x91@\xf9\xc3\xe6\xcd\x9b\x15\
+\xb2\xa3\xd2\xd1\xd1\xa1\x1c<x@Y\xbb\xf6Ye\xc7\
+\x8eZ\xe5\xe8\xd1+\x8a\xcd6\x0f\xdc\xd8\xd8\xa8\x90\x19\
+\xe8{\x87\x1f)\xdf\xa14\xdf\xf7\xb6\x0b\x10\x04\xb6\x7f\
+ \xd8)\x14\xeb\xe9\xd5p\x836\x1b\xbf\x0e\xad\x94\xdf\
+Q\xbeg2\xa5\xb7o\xdf\xfe\xa6B;\x98_\x07\x8d\
+\x94\xd5\x0b\x15?\x18\x8f\x22`\x97\xdc\x13\x9b(K\xb0\
+\xf0\xe1^\x88\xb2\x85\xd4\xe2_\xe2o\x80&\xfe\x87\xb0\
+9>\x91\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x06\xfb\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x06\x8dIDATX\xc3\xed\
+WyT\x8di\x1c\xbeF\xe6\x18c\x16c;\x0d3\
+\xd9\xc2\xd1b\x89D\x1bR\x88[B\x8b\xf6\xb2\x84\xb4\
+X\xba*W\x8b\xa5\xba\x15\xe9\xa6({\x22\xd7pB\
+\xf6\x90\xce\xb1K$\x0dG\x0d1\xb2\x9e(\xe4J\xcb\
+3\xcf\xc7\xe5\xccA\xca1sf\xfe\xf0\x9d\xf3\x9c{\
+\xce\xfd\xbe\xf7\xf7>\xdf\xf3<\xbf\xdf{\xaf\x08\x80\xe8\
+\xbf\x84\xe8\x0b\x81\xff\x15\x01S\x87\x10k\x13\xdb\xe0\x08\
+c\xdb\xe0T\xe3\x09\x81i\x86\xe3$\xc9\x83\xac\xfc\x03\
+\xf4FL\x19*\x12\x89\xbe!\xbe\xfa\xe4\x0d\x1as\x99\
+\xdaKmM\x1d\x16\xfc\xe6\x13\x9ay;Xv\xa9B\
+*+QJcJ\x94aqW+%\x91\xd9\x8f\xdd\
+f\xaf+5\x1a?/\x8fd\xe4\xbaC\x9c\x8c\xb9\xa4\
+\x05\xd1D\xf4O\x5c\xa6\xf6\x0b4,\xdd\xa3\x0a\x16\xc5\
+\xdfW\xba\xcd\x06F\xb9\x01f.\x80\x85; \x9e\x06\
+8\xcd\x05|\x16\x01\x8b\x12\x95u\xe1\xf2\xbcJ{\xef\
+\x84\xdb$\xb2\xb3\xaf\x99\x873\x97\x7fG4\xfdL\x02\
+RI\x90,\xb7\xccn\x06\xa0k\x09hZ\x10\xa3\x81\
+^6\x80\x8e\x1d\xa0\xe7\x0c\x18y\x92\x987\xe0\x12\x04\
+\x04\xc5\x01Q+\xafW\xb9\xcdZs\xcf@\xec\x9b\xd9\
+g\x98\x9b\xebg\x11\xa1\xf4\xc7\x83\xa2^\xd4\x0e\xb6\x05\
+4\xcc\x81\xcec\x80\x9e\x13\x81\xde\x1e\xc0@\x92\x1a8\
+\x13\xd0\xe7\xe6\x06T\xc3\x900\xf7\x01\x1c\x83Id9\
+\x10\xbd\xfaz\x95\xdd\x8c\xf8\xbbz\x16SR\xba\xf6\xb5\
+\x18\xc8r\xcd?\xd9\x9aQn\x91\x85~\x94x\x80=\
+\xd0\xcd\x1a\xd0v\xe5\x1b\xfb\x03V\x0b\xb9\x11\xdf\xd6=\
+\x01p\xe6\xa7M\x14m\x91\x02&s\x08?*2\x8b\
+\xf7BiM2\x10\x1aw\xa2\xd2\xdc9\xbc\x84Dd\
+,\xd9\x8ePk4\x01O\xc9\xc6\x1b\xfe\x91\xc0 z\
+\xafE\xef\x0dY\xd8.\x06\x98\xb7\x05H\xcc\x026\x1c\
+\x07V\xe7\x00\xb2=\xc0\x9c4\x92!!\xcb\xc5\xc0\xb0\
+y\xcc\x0a\xc9\x8c\x0d\x04f\x92\x5c|\x9a\xb2nj\xd0\
+\xa6\xb2>f\xee\xa9\x9du\x87\x196Z\x0d\x13;\xe9\
+e\xa9\x1c\x18Ni\x0d(\xb5\xd5\x12 0\x1d\xd8\x96\
+\x0b,I9P\xe517\xa12D\x9e\xa1L?R\
+\x5c\xbd\xab\x00\x90\x1f\x05\xe6ne8\x13I\x84\xcf\x0e\
+g.F\x91\x8cs8\xb08\x05\x08\x8f\xa7\x1aNa\
+7uM\x9d\x02X\xbeu\x83j\xb0\xef\xcf,\xdd\xf4\
+\xa2\xd66\x84\xfe\xd2[\xf7$ \xe9\x08\xb0r\xfb\xd9\
+\x97\xdd\x07\x8c\xbe\xd6\xfag\xcd\xccN\xda\xa6\x07z\x0f\
+u)\x14{.|\xac8V\x5c\xbd#\x9f\xfe\x1f\x02\
+\xbc\xa9\x88]<\x09P\x91\x11\xb4G\xa81\x87\xd9\x88\
+\xdfXZ-\xf6\x88\xbc\xcb5\x89\xdc\xa2\xc3\xdfIp\
+\xd6h\xf3\xa5\x17\xf73\x9fd\xf0\xaa\x9d\x07Y\xcf^\
+.[}\xe1\x99\xff\x0a\x16\x8b\x06|S\x01\xc59\x16\
+\x0f]\xf3\xbc\x9d\x86\xceA>\xe4KX\x12V\x1aZ\
+\xc6r\xa6\xfe\xa2\xcf\xc2\xf5Ow\xe7=\xaa]w\x1a\
+\x90f\x02\x1e\xeb\x98\x91\xa5\xc0H\xe6\xc6\x86$\xa6\xb3\
+\x8e|\xb3\xb2\xce\xc5oU\x19\x9f\xdf\xc4\xb5\x1aD\xb3\
+W\x9bs\xd0%\xa5\x16<\xd6\x1b1u\x03\xbf\xd3\x12\
+\x09\x83\xc5zr\xf4\xad\x15\xbb\xb8)%\x0c\xdc\x06\xec\
+\xb8\xc0\xa2\x01\x09\x95m:\xf6H\x17rJ\xb4'~\
+\x22\xba\x10C\xbb\x0f\x18\xb3a\xb8\xe3\xfc\x07i\x87\x0a\
+^f\x14\x02\xb1\xd9\x9c\x15\x0a`\xe2J`4\xf3`\
+M;<\xf9\x19\xbd\x915\x17(*\xf4-\xbd\x8f\xf5\
+\x1e\xe6\xea\xc5\xc9\x1a\x13\xbf\xb6\xa0<\xe7$0x\xec\
+\xec;\xace/\xa8\xd2\xa2\xffH\xaf\xa4\x88\x94\x93\xcf\
+\xa2w\xd2C\x12Q\xd0\xff\xd0\x84\x0ce'\xed!\xfb\
+\x84\x0d\x89\x96*\x05\x9b\xaaz\xbe\x1b\xd5\x90\xe8\x0eq\
+>\x11\x18\xbb\xf5\xe9\x81Be\xdd\xaa3$\xcf\xa0\xba\
+\xaf\xa7\x0a\xec\x1a1mq\x89`\x98\x99\x95\x85\x89\x7f\
+\xbe4\xb0\xf2\xbf\xe2\x1d\x9a\xff$\x96/\xb9\x9f\x84\x0d\
+\xc4~\x8fXg\x8eP\xb4\x89\xa6\xde\xa8\x01\x16.\xe1\
+%\x9b\x0e?\xaaM`\xf2\xd3X,u\x7fA\xb5\xb6\
+\xb1\xfdE\xde\x17\x13\xad\xde\x89\x8e\x9aJ\x95\xc1\xbd\x06\
+\x8f\xdf\xe2\xe8\xbf\xacl\x7f\xc1\xa3\xdaT*\x17\xc6l\
+L\xddL;i\xa9\x15\xbbk<\x89L$&H\x9e\
+\xd6\x8d\xf5\x05f\x84Q\xe1\xfd\x9c/b\xdfr\xae\x97\
+\xbe)\xd8\x9c\xed\x13\xe2\xe0\x13\xf7`\xfb)e\xddV\
+f\xe0\xc4\x0d\xbe\x05C\xd7\xeeW\xedP\x95\x87\xef\xb6\
+\xd4W\xc4\xb7\x82\x1a$!7w\x92\xde\xcf<_Z\
+\xa3\xa0%\x11\xec\x94i\xb4\xd2i\xf5k5F\xd2\x12\
+c\xb6\xb7\xd1tZ\xcb\xd9\xb1\xfd\xe0\xfb\x04\x84\xe2m\
+)\xe9\xca\x00\xd9\xb6\xf2#W\x80\x9c\x22`\xdd\xaes\
+UZ\x86\xb69\xbc7Hu\x00}\xe8\x12\xd4\xe8\xd8\
+s\xa0u\x84\x85\x93\xf4^2\xd7\xa4\x93\xc4\x12\xce\x0e\
+_Z\xea\xca\x1c\xd8\xb0S\xcc\xc2^\xcf\x0e/\x064\
+\xe3\xe8\xfb\x04\xde\x16\x12R+\x91)*\xf2n\x02\x85\
+w\x01\x07\x9f\xd8\xf2n\xfdF\xcaU*\xa8}\x84\x84\
+z\x07M}/\xe6)_q\xa6\xb4:\xf9\x22\x10B\
+\xafg2S\xeel\xd7\xf1\xb4\xc4\x9a\x9b\xfbsrf\
+\x9e\xf80\x817\x854\xd8\xbf[$\xd1\x8a\x8a\xc2;\
+@\x16e\xedg1\xf9\xf7\xef\xdbt\x1c\xc7{?~\
+d\xba\x09k\xdbj\x19\xd9\xcd'\x89\x0b\xf1\xd9\xa5\xd5\
+Ql\xd3\xf9|[?\x86s2\x87\x9b\xdbZ\xb6-\
+\xbb\xe5\xc0\xf9\xfa\x09\x08W3\xa2\x93@\xc2\xc1gY\
+\xd9\xb9?\x94u1\xeb\x0f=\xef\xa1o\xa5x\xd5\xb7\
+\x22\xd1\xd7\xf5\x0d5\xc3q\x01\x9d\x0dm\xe6.M\xde\
+\x97\xffDQ\x0c\xac\xe2\xe4\x8ccGEr\x9c/`\
+8\x8393\x128\xe4\x8e_\xf98\x81\xb7$tL\
+&\xae\xb1\x9a\xb4\xf8\xe1\xa1\xb3\xa55\x81K\x15\x15\xec\
+\x96(\xc1\xa6\xfa\x8e^\xe1h\xdf\xb07\xb7\xecR\x19\
+\x90]\x0a\xec\xa3\x8d\xbb\xaf\xd3s\xe6I\x08\xa7\x82\x13\
+\xf4\xf0U\xe0\xd2\xad\x86\x09\xbc!\xa1\xd1C_,\xe3\
+O\xb2\xcb\xd1k\xb3*\x1d\xfd\xe2\x1e\xaaw\xe9;\x99\
+\xdf\xb7y\xd7\x0a\x1e\xeb=<\x83S\xaee\xe5\x95<\
+?\x98{\xbdj\xef\xd9\xe2\xea=g\x8aj\xf6\x9c.\
+\xaa\xc9<UT\xb3\x9b\xd8u\x9c\x9fDFNQ\x8d\
+\xb6\xb1C\x09\x97I\x1a:\xab\x04_;\xfc\xd0\xe6\x97\
+\xb1Lyz\xab\xf6\x9d\x850:\x09\xea|@\x85\xa6\
+\xbd\x87\xba\xbaq\xc4\xe6\x08\xe7\x86\x8e\xa9c\x91\x8e\x89\
+cq}P\xef\xdao\x0f\xd7\xb87\xe6\xc4VS\x85\
+O\xf0\x7f\x08\xd1\xb7\x9e06Q\x9d~F\x84\x0b\xe1\
+\xd5\x00\x1c\x89\xfe\x8d\xfd\xd9\xd0D\x15\xbe\x96\x0d\x9c\xf3\
+oF\xb5\xba*+\x1f\x83\xba\xea\xd9\x7f\xf7\xfa\xf2\xcf\
+\xe8\x0b\x81\x86\xf0\x17\xce\x95N=\xa5NbX\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x00\x1b\x04\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x03\x00\x00\x00\xd7\xa9\xcd\xca\
+\x00\x00\x08\x9ezTXtRaw prof\
+ile type exif\x00\x00x\
+\xda\xedY[\x96#)\x0e\xfdg\x15\xb3\x04\x10\x08\xc1\
+r\x00\xc19\xbd\x83Y\xfe\x5cA\x84\xd3\xcetVU\
+w\xf5\xd7\x9cr\xa4\x1da\x88\xb8\x08]=\x9dn\xfe\
+\xf7\xaf\xe5\xfe\x83W\xcc5\xb9\xc4Rr\xcd\xd9\xe3\x95\
+j\xaa\xd4pQ\xfcy\xb5\xfd\x19|\xda\x9f\xe7\xcb=\
+\x17^\xc7\xddc\x820\x14q\x8e\xe7k\xc9\xd7\xfd\xf7\
+xx\x00\x9cS\xc3\x15?\x01\x95qM\xf4\xd7\x89\x9a\
+.\xfc\xf2\x09\xe8Z(\x9aD\x84\x0b\xbd\x80\xea\x05\x14\
+\xe9L\x84\x0b\xa0\x9dm\xf9\x5c\x8b<o\xa1\xcfs\xbe\
+\x9e?j\xc0\xdb\xd9G\x94\x8d\xfd\x00\xf9\xfc=\x09\xb4\
+\xa7\x8c\xc1H4c\x88\x1e\x9f\x14\xd3\x11 \xda;\xb8\
+\xd8p\xc1\xfb3\xd3\x1e\xc2u\x8ae\x8f\xc8%\x09\x14\
+\xf2NO\xfeI*\xf7\x99\x95\xc7U\xf8f\xfc\x13)\
+1\x9fq\x87\x81We\xe6\xc7\xf9\xedx\xe0\xf7\xcaw\
+[\xc5O+\xc7\xf1X\xf9e\x9c\xfa\x87~\x9f\x95l\
+\xef\xb5\xb4\xb8\xb5\xe6\xd9]K\x19*\xcd\xd7\xa6\xee\xad\
+\xec+\xdc\xd8\xa1\xf2\xb8\x1f\xcb8\x04o\xc6\xb5\xec\xa3\
+\xe2(\x0e\xd6;\xc0\x8e\xfa\xe1;\x8e\x11j \xd0\xb2\
+B\x0a\x1aZXa\xee\xf3\x08\x03\x22&\x9a$8\x13\
+\x0d\xb0bc%\x0aU\x1a\xd1;\xb0\x94\xec\x08\x8b$\
+\xd6\xa8\xe0\x8b\xe2\x00\xbd\x11\xa3\xf4\x90%\xecu\xeb^\
+n\xc0\x1b\xd4k\xc0\x9d\x14\x00\x16\xf0\x049\xfb\xf87\
+\x8eo\x81\xd62\x93\x0f\xc1\x97\x87\xae \x17\x99\xa1B\
+\x0cc\xce>q\x17\x08\x09\xeb\xb6#\xde\x0a\xbe\x8f\xcf\
+/\xe35\x82A\xdej.\xd8`\xf3\xfd@t\x0e\x97\
+m\x99\x1d\xc5Mt\xc4\x8d\x8c\xf3q\x8b z\x01@\
+EX\x9b!L\x88`\xc0\xe7\x109\xe4\xe0\x85HB\
+\x80\x1e\x0b\xf8i\x00*p\x1a\xea\xa0 0\x93BJ\
+J\x11\xde\x22T\xc8\xd6\xc63\x12\xf6\xbd\xc4t\x86\x11\
+\xb3@\x04\xc7\x1c\x05\xd4\xd4\xd8\xc0\x95\x056\xd8\x8f\xa4\
+\x02\x1bj\x1c91sf\xe1\xc2\x95[\x8e9e\xce\
+9K\xb6\xe0\xd7$J\x12\x96,\x22E\xaa\xb4\x12K\
+*\x5cr\x91R\x5c\xa9\xa5U\xaa\x11\xc1\x91k\xaeR\
+K\xad\xb55,\xda\x80\xdc\xf0t\xc3\x0d\xadu\xea\xb1\
+\xa7\xce=w\xe9\xa5\xd7\xde\x06\xccg\xa4\xc1#\x0f\x19\
+\xc5\x8d:\x9a\x92FE\x9c\xd0\xac\xa2E\xab\xb6\x19&\
+Li\xa6\xc93O\x99e\xd6\xd9\x16Lm\xc5\x95\x16\
+\xaf\xbcd\x95UW{\xb0\x16\xdc\xa1\xf5\xcb\xf1\xeb\xac\
+\x85\x9b5\xdaL\xd9\x8d\xf2`\x0d\x8f\x8a\xdc\x10\xc1\xc2\
+\x09\x1bg`\x8cR\x00\xe3b\x0c\xc0\xa0\xc98\xf3%\
+\xa4D\xce\xa83\xce|%x\x05\x13\xa4d#G\x83\
+1\x06\x06\xd3\x0c\xc4+<\xb8\xfb`\xee\x857\x97\xd2\
+o\xf1F7s\xce\xa8\xfb7\x98sF\xdd7\xcc}\
+\xe5\xed\x0dkj\xd9f\xf8\xe86C\xe6\x86\xa6T\x1f\
+\xe1~\xb8a\x96F\xa5YR\xfb\xe5\xb3\xfb\xbb\x0f\xfc\
+\x01\xfa\x03\xf4\x07\xe8\x0f\xd0\x1f\xa0\xff\x03 $!\xdf\
+\xd3,\xc2\xb1O\xb4n\xc8\x85\xc8\x90et\xe4>d\
+\xf2:J\xd0\x11\x167\xdc\xb2f\x08A#*j\xe9\
+<\x162\x8e\xae\xd4\xed<\x92\xd3\xdcCc\xa4\xe0\xde\
+\x888\xa6\xaa\xb5\x0e\xd6\xc0ZQ' \xbbg\x14\x8a\
+\x11Y\x0e0\xab1@(\x97\xb5JJm\xc4\x1b\x11\
+xn\x97\x15X\xa5\xf51x*2{\xa8\xc9\x922\
+\x16*\x95!\xc6X\xb9\x03\xb4\xcf\x8a\xb1R[4\xc1\
+\xd0\x08\x98$u\xaa@BQr\xf6u\xa1\xd6\x16E\
+J\x0dOHl3\xafX\xd6\xad\x01mPMR\xde\
+K\x14\xe6\xa0\x17\x1890E\xbf\xc0,C\x7f\x12\xeb\
+\x12\x0a\x85\x16\xe4Z6\xfdN\xac\x9fl0|l\xd0\
+\x9d\x1d~\xbb\xc1_\x96\xcc\xdd\xa2\xfd\xaed\xeeU\xf7\
+\xff\x5c2\xf7Yi\xffT2\xc7h\xc8 \x19\xc5\xa5\
+\xf2\xd9Z\xd1\x070\xca7P\x5c.#\xf5\xb3\xf7\x16\
+`\xe6U2J\xbc\x81\xe2t\x8c\xa1(h\x1d\x85\x81\
+&\x22\x14\x92\xee\xc3\xac\xc0\xe2\x8cj\x13\x95]\x8f\xd6\
+\x943\xb1\xa4\x90\x18\x7f\xa9\x8co\x9d\xad;x\x85\xaa\
+o\xb3s\xea\x92\xebDu\x8b\xa6\x84\x81\x95b%?\
+Q%/\x94\xd7\xf0$\x824\x09;\xc3\xb6\x0a\x99\xbd\
+\xb6\x09\xbfY\xa8\x97Q7V\xebE\x1a\xca\xd6\x94f\
+R\xf8[d\x19\x9e\xa7\x0f\x8a\xc26(\xb4Rr\x80\
+x\x91s\xc8\xd8D\x15\xc9\xa8\x12;l\x1bX\xd2V\
+J[\xdd\x0c\x1d\xb5\xb95\xb2tV\xdd\xcaF\xaf\xb0\
+'\x0b|\xb4\xf0&\x00\x1d\xd4v\x05\xa9\xe6\xfb\xa8\x94\
+y\x0e\xa8,\xca\xca2'\xea\xda\xe0\xfa\xcc\xcauF\
+\xc3h\x10\x08\xe7\xba\xba\xc6\x0eg\x9f\xf1\x98C0\xaf\
+\xf6Mx/\xf42m\xec\x06\xa0\x8aK\x9agO\xd2\
+\x13:\x8c!e\x99O\xb6\xaa\x82\xa8!s\xa5-m\
+G-|x\xe4\xb0\xed\xa9}\x05uO\xa8\xc6\xcdT\
+\xb26\xf0g\x12\xb68C\x82\xf2\xed{\x84\xaaD\x1c\
+B\xc0\x10\x0bW\xd4\x15A\xb1!\x86\xa5\x229\x8em\
+\xb33\xf0\xb9\xff\xdc}\xdd\x8cq\xa2r\x94\xcc\xf1\xe8\
+\xd8\xbdU2\x08\x87}\xacl\xa6P\xd6\xde\xce\xba\x9f\
+\xb9\x1f\x90{\xbcl\x7fs\xdf\xae\xf8$ \x99\xf2\xec\
+\xa1\xcf\xea\xdb\xca\xb3\xf1\xc4.l]\xc8{]<)\
+.\x9c\xdd>\xf6z\xeb\xe6V\x8d\xdb\x9b\xfd\x81\xd8\x1f\
+\xbb\xf4\xc6\xc1\xfa)kI~$8\x1c\x11\xde\xb6\x8d\
+\x04J#\x7f\x14\x9d\xd6\x871\xbb\xaf\xd6\x8cV\xd7h\
+\x87\xe8h\xb3\xbeZ\x120\xf5\xc2\x9c\x03\xbd\x96\xf6!\
+}y\xa7\x8b\x0b\xec6\xa1\xbdD\xd37\xf3\xe0\x9at\
+4\xf4\xd9H\x8cu \x16!\xc0\xe8\xcam\xc5\xb6\x97\
+J)\xf2\x1d\xa9\xb3\xa9\xc1\x1ce\x05\x17y\xa5\xb6\x06\
+\xc3\x9b+\x94\xab\xd8pG\x14\x82W{\xb1\x0e\x1d\xfd\
+c\x1d\xe8!\xbbRh\xb5\x97Y\xb0\xb5f\xc1\x83z\
+I\xb3\xf9}Y\xbc\xbb/>\xceS\xe3\xa0\xadl\xf2\
+\x15\xf1\x0f$\xed\xc0\xaa\x9e3\xe2@C\x9f\x19\xa1k\
+\x5c\xd0T4\x90\x08g\xe8\x7f\x1d\xd7\xd1+!\x0c!\
+\xcd#x`\xbdd\xe1\xc5~%ChEt!E\
+/\x1bUe\x86\x1d\x8aF\xb7\x88\x8c\x10\x8cm5d\
+{i\x03\xa1g\xc0\xfb=\x9aq\x9d\xad\xe6\xd8\x14Q\
+s\xb0\xe7\x8a/\x88>}E\xe4~h|'\x85\x8e\
+\x8d\xf3,\xdb\xc6|\x8f\x8b\xfb1\x00\xdee\x05|\xad\
+\x1f\x03\x80\xb4\xa5\xae8[\x99\xd077A]\x82\xc5\
+\x22\xd4\x840\xb4\xc3\x17z\xea\xa5y[\xbe\xa8\xa4u\
+\xf8\xcc\xeb\xf8\x1aC\x8bH\x03\xda4\x009\xcc\xde\xe4\
+\xa4\x80~9\xcb\xac\xadt\xa2\x81h\xce\xd0\xf0hV\
+\xded\x04\x9f]\x1d\xc4\xd9\xad^\x117\xf5\xd8p\xdf\
+\xaew\xcd_\xb3\xb0/\x9b6\xd2;\xba~/\xe8\xfb\
+\x95\x1b\xcc\x9d\xea1I\xb4\xfej\xa9\xa9\xa9+\xe6-\
+}\x07\x92\xb9\x9d\xe5c\xee1u\xe4\xe2\xb2\xa5\xca\xef\
+\xa52\xa7\x95_\x96\x8aF\x18\xed=\x98\xbb\xf7\xf8\xbb\
+`\xeeYa\xbf\x0c\x86\x944\x91G[g8\xc3\xc9\
+3\x0e\x16!\xdc.\x8b\xb0\x1a`\xf3i>\x8f\x1c\x8d\
+\x8bk\xfa\x9a\xfc\xa0\xdb\xa6\x9f\xe1\x1c\xf3e`\xf1\xc7\
+p\x91\xab\xc1\xe5\xef\xe0\x5c\xd3-^\xb8\xe0\xfa\x03n\
+\xdb\xeb\x87\xb9\xeexe\xc1\x00^}\xac\x11\xcb<-\
+\xe7\xd2BQ\x83\x05\xa1\x96rb\x13\x91\xda\xe3p.\
+\xb2\xac\xea\x97\xad\xc3\x82H\x0b_\xc2\xb7\xdcU\x03\x85\
+2Q,t\xf2\x9eG\xeb2\x5c\xdbQP\xcd\xf2q\
+\xc7\xec\x03\xcb\xcc@K\x93\xd5\xacE\xbb\x19\x13a\x05\
+D\x9a\xd4[\x0f%\x97\x81 e\xb5B.\xf0\xdf]\
+\xa8\x88wA\xf3)Z\xec\x9f\x0e\xef\xcf\xa8Q\x0a\xec\
+y\xc4\x86\xba!\x0e\x8d\xd4;uD\x07o\xbf\xec!\
+\xf8\xa50\xa7K\x82H\x90\x8cA\xd4N\xdb\xf0qo\
+\xdeu~\xddu~\xb3\x18D\xa8\xb5\xd4|\x99+\x0a\
+<T5\xa8\x1c\xe68)\x14\xe5\x8e\xdf\xe51*\x88\
+]A\x8ev\x92\x10o\xbd\xf2e=\xcf\xa8\xe6*\xc0\
+\x1d\x0d\xae\x86r0\xd3\xca\x1cb?vTR\xcf\xe3\
+\xa8\xe3*\xfc\xe8\x14~|1Y\xf3)@\xc3]\x80\
+\xf2)@\x11\xd6\xa3e\xd0\xd9\xed\x97\xfd\xec.\xc8W\
+\xbc\x83va\xbd \x1d\x9c\x07\x0aR\xc8\x88Z\x11H\
+\x91\xfb\x8d$=um\xbc\xeaZ\xdb\xa5Y\xcf\xf3.\
+\xbfhn\xec\xc4\xb9L\x1cH\xe3\xce\x0e\x7f{\x83\xea\
+\x1e\xb2\xdd\x1c\xe8\xdd_\xfc=\x0a\xdc'\x09\x7f\xa6/\
+\xe1o\xf4\xe5\x1ej\x7f\x10\x09\x9c\xf6\xcd6\xe9\xa4\x00\
+\xd6\x13\xd7\x9f\x01\xddFD\x94}\x01L\x17\xe0:\x99\
+\xe2\x9bm\xaeg8\xf7$\xe0'\xb8\x862\xdb2*\
++#\xd9\x91e\xd4j?\x0a'\x0fwEJ\xce\xd1\
+\xa3\xd8&\xab\xe5\xeb\xdc\xed\xfa\x98LB\xa8\xc4yd\
+j\xd4F9\x9dA\x0d\x85\xb7\xbf\xd9?R\xb4\xc2z\
+\xff\x07K\xb7\xa5\xac\xd2\x80\x1e\x10\x00\x00\x01\x84iC\
+CPICC profile\x00\x00x\
+\x9c}\x91=H\xc3@\x1c\xc5_[kE\xaa\x0ev\
+\x10q\xc8P\x9d,\x8a\x8a8j\x15\x8aP!\xd4\x0a\
+\xad:\x98\x5c\xfa\x05M\x1a\x92\x14\x17G\xc1\xb5\xe0\xe0\
+\xc7b\xd5\xc1\xc5YW\x07WA\x10\xfc\x00qss\
+Rt\x91\x12\xff\x97\x14Z\xc4xp\xdc\x8fw\xf7\x1e\
+w\xef\x00\x7f\xbd\xccT\xb3c\x1cP5\xcbH%\xe2\
+B&\xbb*\x84^\x11D'\xfa1\x86^\x89\x99\xfa\
+\x9c(&\xe19\xbe\xee\xe1\xe3\xeb]\x8cgy\x9f\xfb\
+s\xf4(9\x93\x01>\x81x\x96\xe9\x86E\xbcA<\
+\xbdi\xe9\x9c\xf7\x89#\xac()\xc4\xe7\xc4\xa3\x06]\
+\x90\xf8\x91\xeb\xb2\xcbo\x9c\x0b\x0e\xfbyf\xc4H\xa7\
+\xe6\x89#\xc4B\xa1\x8d\xe56fEC%\x9e\x22\x8e\
+*\xaaF\xf9\xfe\x8c\xcb\x0a\xe7-\xcej\xb9\xca\x9a\xf7\
+\xe4/\x0c\xe7\xb4\x95e\xae\xd3\x1cB\x02\x8bX\x82\x08\
+\x012\xaa(\xa1\x0c\x0b1Z5RL\xa4h?\xee\
+\xe1\x1ft\xfc\x22\xb9dr\x95\xc0\xc8\xb1\x80\x0aTH\
+\x8e\x1f\xfc\x0f~wk\xe6''\xdc\xa4p\x1c\x08\xbe\
+\xd8\xf6\xc70\x10\xda\x05\x1a5\xdb\xfe>\xb6\xed\xc6\x09\
+\x10x\x06\xae\xb4\x96\xbfR\x07f>I\xaf\xb5\xb4\xe8\
+\x11\xd0\xb7\x0d\x5c\x5c\xb74y\x0f\xb8\xdc\x01\x06\x9et\
+\xc9\x90\x1c)@\xd3\x9f\xcf\x03\xefg\xf4MY\xa0\xff\
+\x16\xe8^s{k\xee\xe3\xf4\x01HSW\xc9\x1b\xe0\
+\xe0\x10\x18)P\xf6\xba\xc7\xbb\xbb\xda{\xfb\xf7L\xb3\
+\xbf\x1fP\x0br\x99\xb2\x0b\xf7\xf1\x00\x00\x0f\xc3iT\
+XtXML:com.adobe.\
+xmp\x00\x00\x00\x00\x00<?xpacke\
+t begin=\x22\xef\xbb\xbf\x22 id\
+=\x22W5M0MpCehiHzre\
+SzNTczkc9d\x22?>\x0a<x\
+:xmpmeta xmlns:x\
+=\x22adobe:ns:meta/\
+\x22 x:xmptk=\x22XMP C\
+ore 4.4.0-Exiv2\x22\
+>\x0a <rdf:RDF xmln\
+s:rdf=\x22http://ww\
+w.w3.org/1999/02\
+/22-rdf-syntax-n\
+s#\x22>\x0a <rdf:Desc\
+ription rdf:abou\
+t=\x22\x22\x0a xmlns:x\
+mpMM=\x22http://ns.\
+adobe.com/xap/1.\
+0/mm/\x22\x0a xmlns\
+:stEvt=\x22http://n\
+s.adobe.com/xap/\
+1.0/sType/Resour\
+ceEvent#\x22\x0a xm\
+lns:GIMP=\x22http:/\
+/www.gimp.org/xm\
+p/\x22\x0a xmlns:dc\
+=\x22http://purl.or\
+g/dc/elements/1.\
+1/\x22\x0a xmlns:ti\
+ff=\x22http://ns.ad\
+obe.com/tiff/1.0\
+/\x22\x0a xmlns:xmp\
+=\x22http://ns.adob\
+e.com/xap/1.0/\x22\x0a\
+ xmpMM:Documen\
+tID=\x22gimp:docid:\
+gimp:b0042b82-ba\
+7d-4bb4-8899-352\
+fef962624\x22\x0a xm\
+pMM:InstanceID=\x22\
+xmp.iid:441fa1f5\
+-6c47-47c1-8900-\
+f58cf45668f0\x22\x0a \
+ xmpMM:OriginalD\
+ocumentID=\x22xmp.d\
+id:102cf193-c4ec\
+-4e2f-b75a-ee0ac\
+03c106f\x22\x0a GIMP\
+:API=\x222.0\x22\x0a GI\
+MP:Platform=\x22Lin\
+ux\x22\x0a GIMP:Time\
+Stamp=\x22162033048\
+7756471\x22\x0a GIMP\
+:Version=\x222.10.2\
+4\x22\x0a dc:Format=\
+\x22image/png\x22\x0a t\
+iff:Orientation=\
+\x221\x22\x0a xmp:Creat\
+orTool=\x22GIMP 2.1\
+0\x22>\x0a <xmpMM:Hi\
+story>\x0a <rdf:\
+Seq>\x0a <rdf:l\
+i\x0a stEvt:ac\
+tion=\x22saved\x22\x0a \
+ stEvt:changed\
+=\x22/\x22\x0a stEvt\
+:instanceID=\x22xmp\
+.iid:035b69a2-44\
+29-4b83-80bc-10a\
+79f5d3529\x22\x0a \
+ stEvt:softwareA\
+gent=\x22Gimp 2.10 \
+(Linux)\x22\x0a s\
+tEvt:when=\x222021-\
+05-06T21:24:18+0\
+2:00\x22/>\x0a <rd\
+f:li\x0a stEvt\
+:action=\x22saved\x22\x0a\
+ stEvt:chan\
+ged=\x22/\x22\x0a st\
+Evt:instanceID=\x22\
+xmp.iid:21232bcd\
+-6beb-4a6b-91df-\
+d1326e1b5562\x22\x0a \
+ stEvt:softwa\
+reAgent=\x22Gimp 2.\
+10 (Linux)\x22\x0a \
+ stEvt:when=\x2220\
+21-05-06T21:24:4\
+7+02:00\x22/>\x0a \
+<rdf:li\x0a st\
+Evt:action=\x22save\
+d\x22\x0a stEvt:c\
+hanged=\x22/\x22\x0a \
+ stEvt:instanceI\
+D=\x22xmp.iid:59e56\
+d83-caa6-4126-91\
+39-cb5b589ce2e8\x22\
+\x0a stEvt:sof\
+twareAgent=\x22Gimp\
+ 2.10 (Linux)\x22\x0a \
+ stEvt:when=\
+\x222021-05-06T21:2\
+5:42+02:00\x22/>\x0a \
+ <rdf:li\x0a \
+ stEvt:action=\x22s\
+aved\x22\x0a stEv\
+t:changed=\x22/\x22\x0a \
+ stEvt:instan\
+ceID=\x22xmp.iid:7c\
+b5ff55-b0f8-4913\
+-ab11-b5b397521c\
+9c\x22\x0a stEvt:\
+softwareAgent=\x22G\
+imp 2.10 (Linux)\
+\x22\x0a stEvt:wh\
+en=\x222021-05-06T2\
+1:48:07+02:00\x22/>\
+\x0a </rdf:Seq>\x0a\
+ </xmpMM:Histo\
+ry>\x0a </rdf:Desc\
+ription>\x0a </rdf:\
+RDF>\x0a</x:xmpmeta\
+>\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a\
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \
+ \
+ \
+ \
+ \
+\x0a \
+ \
+ \
+ \
+ \
+ \
+ \x0a \
+ \
+ \x0a<?xpacket end=\
+\x22w\x22?>%0\xca\xff\x00\x00\x003PLT\
+E\x00\xc2\xe9\x00\x00\x00<Rw=Ty=Tz\
+=U{>U|>V}?V}?W\x7f@\
+X\x80\xbf\xe2\xff\xc0\xe2\xff\xc6\xe8\xff\xc7\xe8\xff\xda\xf0\
+\xff\xde\xf3\xffD\x0cb\xad\x00\x00\x00\x01tRNS\
+\x00@\xe6\xd8f\x00\x00\x00\x01bKGD\x00\x88\x05\
+\x1dH\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\
+\xe5\x05\x06\x130\x078\x94ND\x00\x00\x00AID\
+AT(\xcfc`\xa02`D\x05\xa3\x12\xf4\x91\xc0\
+\x09\xd8YYX\x98\x80\x18\x828\xe1\xe2\x1c\x02\x02\xfc\
+\x08 \xc0\x05\x97\xe0\xe3\xe5\xe6\xe6\xe1\xe1\x86\x00^\
+^.\x14\xa3\x98A\x00h\x14\x1b\x07'^k\x01\xd6\
+\x10\x03(qA%M\x00\x00\x00\x00IEND\xae\
+B`\x82\
+\x00\x00\x03\x0b\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\
+\x00\x00\x09pHYs\x00\x00 \xc7\x00\x00 \xc7\x01\
+\x95\xc3\x06]\x00\x00\x00\x19tEXtSoft\
+ware\x00www.inkscap\
+e.org\x9b\xee<\x1a\x00\x00\x00\x1ftEX\
+tTitle\x00Gnome Sym\
+bolic Icon Theme\
+\x8e\xa4)\xab\x00\x00\x01)PLTE\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\xca\xdf\xf4\x00\x00\x00\xbd\xd0\xe3\xbf\xd1\
+\xe4\xe3\xf1\xf8\xff\xff\xff\xff\xff\xff\xe7\xf3\xf9l{\x84\
+RV[\x00\x00\x00\xff\xff\xff\x97\x9a\x9d\x16\x18\x18\x11\
+\x13\x13\xf4\xf6\xf7\xf4\xf6\xf7\xb3\xc8\xd4\xb4\xca\xd6\xb3\xc9\
+\xd5\xb5\xca\xd6\xb5\xca\xd6\xb7\xcc\xd8hrx\xb9\xcf\xda\
+\xbc\xd2\xdd\xbd\xd2\xdd\xb8\xc2\xc7\xbd\xd2\xdeNW\x5c\xc1\
+\xd6\xe0\xc3\xd7\xe2\xc3\xd7\xe2\x99\xa2\xa7\xb6\xcd\xd9\xc5\xd9\
+\xe4PZ`T^du~\x83\xc6\xda\xe4\xc3\xd9\xe4\
+\xcc\xd5\xda\xc9\xdd\xe7\xc7\xdc\xe7\xbe\xd3\xde\xa7\xba\xc4L\
+U[MV\x5c\xaa\xbd\xc7\xab\xbe\xc7\xc7\xdc\xe7\xaa\xbd\
+\xc8\xc3\xd8\xe3\xd5\xe8\xf2\xa8\xbc\xc7DMR\xe7\xef\xf3\
+\xb2\xc7\xd2\xba\xce\xd9\xe8\xf0\xf5\xb2\xc7\xd2\xbe\xd2\xde\xd9\
+\xe5\xeckx\x7fq}\x85\xde\xeb\xf2\xee\xf5\xf9\xee\xf5\
+\xf9\xc7\xe0\xeehu|iv}\xcb\xe3\xf1\xcd\xe4\xf2\
+\xcd\xe5\xf3\xe1\xef\xf6\xe5\xf1\xf8q\x7f\x87s\x81\x88t\
+\x82\x89\xb9\xd0\xdd\xbb\xd2\xdf\xbf\xd6\xe2\xc8\xe0\xed\xc9\xe0\
+\xec\xca\xe2\xef\xca\xe3\xf1\xcb\xe3\xf0\xcb\xe4\xf2\xcc\xe3\xef\
+\xcc\xe4\xf2\xcf\xe6\xf2\xd1\xe7\xf3\xe3\xf0\xf7\xe3\xf1\xf8\xe4\
+\xf1\xf8\xe5\xf1\xf87\xc7\xc9(\x00\x00\x00OtRN\
+S\x00\x03\x0a\x18\x1a\x1b\x1c$%'*4;>M\
+Vi\x96\xa4\xa7\xbf\xbf\xc0\xc0\xc1\xc2\xc4\xc9\xcb\xcd\xce\
+\xce\xcf\xd1\xd4\xd5\xd6\xd6\xd7\xd8\xd8\xda\xda\xdd\xdd\xde\xe3\
+\xe7\xe8\xe9\xe9\xea\xea\xea\xeb\xeb\xf0\xf2\xf3\xf3\xf4\xf4\xf4\
+\xf5\xf5\xf6\xf9\xfa\xfa\xfa\xfb\xfc\xfd\xfd\xfe\xfe\xfe\xfe\xfe\
+\x07\xeb\x93\xb9\x00\x00\x00\xceIDAT8\xcb\xdd\xd3\
+\xd9VAa\x00\xc5\xf1m\x0a\xc9T\x92:\xa6\x83\x92\
+\x13\xd2\x8c2\x0f\x0d\xe2\x90\x8e\xb2C\xe5\xfd\x1f\xa2\x07\
+8\xbe+\x8be\xf5\xbf\xdd\xbf\xdb\x0d\xc0\xbeW\x9e\xff\
+\xe8\xeb\xd6\xc2;\x00\x00W{FA_GF\xc0\xd6\
+\x9aP\xab\xe4\xf4]W\xc7d\xd4\x80\xdd\x19\x0b\x0e,\
+\xccr\xcew\x0f\xee\xa9\x09v\xc0\xf4\xc8$z|\x80\
+\xb0c\xd6\xf1\xcb+1\xf0Q\xfd\x07`\x7f\xf5\xc0\xbf\
+48\xd8\x00\x10X\x0f\xf8\xe6\xad\x18\x1cRE\x93%\
+18\xe33\xd2\xfc\xd8\x12\xed\xd6\x0e/\xe0\x9e\xf2\xce\
+\xb4x\xdf\xce\xf3\xcd\x0b$\xc8\x97\x9bLFQ\x94\x93\
+x<&\xcbr$\x14\x0aJ\x92$e_\xf9Y4\
+\x03\xc6\xd4Ht\xdea\xd1\x09\x00\x06\xcfic\xa0\xaf\
+\xfft\xe95\x03\x7f\x0e\xd7[\x9dz\xfc\xb1W\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x00\x03\xcb\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x03]IDATH\xc7\xb5\
+\x95]H\x93Q\x18\xc7W\x94\x96R\x16\x9a\xa8)\x99\
+\x92\x90\xe5W\x99\x9a\xdf\xa1\x94\xda\x07\xf9\xb1YYM\
+]\x12\x8c\x94\xa4\x22\xe74%\x02\xc3\xc8\x9bD\xbbq\
+X\x17\x8a7\xa1\x99\x8aR~\x85Sg\xeat\xb6t\
+:5\xa7M\x0d\xca\x19\xc2{\xf1\xc2\xe9y\xf4\x9d\xe9\
+\xdc\xdcv\xd1\xe0\x07\xef\xce\xf9\x9f\xf3?\xcfs\xcey\
+\x0e\x8b\x10\xc2\xfa\x9f\xac\x7fD^+t\x04r\x80/\
+\x06h\x05\xf8\x1b\xf4|\xa6M\x9f\x16\xe7q\xd45\xc8\
+\x14\xd5\xf7\xa9\xa7\xfe\x10\x82\x8c/\x11\xa2\xf8M\xc8\xe4\
+\xf2\xda\x7f\xf9\x22EG$?ig\xb1XV\x8c\xbe\
+\x15\xdb\xb4z\xad\x0e\xc1y\x82\xaf>\xcc\x01\xad\xc5\xa6\
+\x08\xc2\xd8\xc2|\x5cA\x05\x08\x86\x17\x08\x91\xaa\x09i\
+\xeaWi\xaeg\x97\xca\xc2\xd9\xc2.\xbf\xa8\xb4\x170\
+\xc8\xfe_\x04\x05m\xd8\xd7\x22Ui\xc6`1U\x1f\
+e?q\xbc_Tz\x85\x83\xabO4h\xf7m\xce\
+\x178\xba\xfb\x9e\xf7\x8e\xe0\xe4w\xf6LS\xf4\xc0\x0f\
+B2\xf2Drg\x8f\xa0r\xe8\x8b\x05\x8ei#`\
+\xf4V\xde\x91\xb7R2\xf2E\xf2\xe1\x05\x8a\x0eK\x12\
+\xf4\xd8:y\x14B{\x10\xe0\xb0)\x82\x8d`\xf8}\
+*\x8a\x96.\xac\x198\xba\x9d\xe2\x83\xd8\x16\xd8\xa1\xab\
+\x0d\xe7\xe4{\xa2fh\x1e\x0c\xd8B1hB\x00\xcb\
+-\x9b\xack\xd0\x0b\x06\x83\xf3\x84\xdcY\x8d \x90\x0b\
+\x83\xf6\x1a\xd0\x1eG\xcd\x80\x9a\xa21\x8d\xa0;\xa9\xf7\
+\x14\xe9\x1a\x88!E}\x90\x22\x9e\x09\x06\xa8\x91\xcc\x99\
+i\xd01E\xd1b\x15!\xe9B\xe3\x06\xa8\xe9\x9e5\
+\xd3\xa0UI\xd1\x9d3\x84\xa4\x99`\x80\x9a\xcf3f\
+\x1a4+(\xbau\x1a\x0crM3h\xffn\xa6A\
+\xd3\x18E\xb7L\x12\x92j\x82\x01j>M\x99i\xd0\
+\x00\x114*\x09\xe1\x9a`\x80\x9af\xa5y\x06e\x95\
+]*\xcd\x87\x09B\xee\x97\xd4)=\xfc/=\xd8x\
+\xc1t\xb4\x099\xaf[\xa6\xdf\x80>\xe0bf-\xe8\
+<M1\xe0\x16Tv\xce6L\x11RT\xd3\xa7\xf6\
+9\xc7}\x05\x03\x0f\x18\xd0>/k\x19\xff\x85\xfa\x13\
+!\x9c\x12\xd0\xb9\x99b`\x0d7\xb4\xfa\xaddq\xa5\
+\x16\xf6\x221\xabTv\xf6J\xb6\x10n\xaa\x93N\xf5\
+\xcd\xcc|Y\xa7\xac\x19\xd6Pq\xbc\xe2Ak\x1b\xfb\
+x0\xb03j\x80%!,)7\x11&\x1e\xa9\xec\
+]Xy\x07&\xcf\xaa%\xf3P\xdc\xfa\xb5\xc4\xf2\x8a\
+\xa5\xd8\x86}7\x05\x22\xb9gp\x12\xae\xdekc\x99\
+\xd0k\x00\xbf\x9d\xc0n`O@\xdc\xbd\xdb\xc1\xf1\x8f\
+\xea\x85\xa2\x8e\xb9\xf2\xf6\x99\xe5:H\xd9{\x06\xfc~\
+Z%\x99\x8fI/\x1e\xf2\x0a\xbf\x81\xc50\x148\xa8\
+[\xaf\xf4Mn\x09\xec\x07\x0e\x01\x87m\xec\x5cN\xc3\
+\x04Egb\xf8\x8d\xe1\xec<\xd9:\x9c\xbca\xaf\x88\
+\x94\x1a\xe8\xe73\x93;a\xf54\xf8\xa2\xa13\xb0+\
+41\xa7\x10\xf2?\x04\xf9\x1e\x814}\x05\xe4\xa1\x09\
+\x8fG\x03/g)\xfc/\xdc\x9d\xf0\x8dN\x9b\xf4\x8d\
+J]\xc5/\x9a\xa7\x84\x933\x1a\x9a(\x18\x81\x12/\
+\x8dH.\x18\x00\x04\xdb\x19X\xa0p\x12_(@\xb1\
+d:\xda1\xf8\xe0\x185\xe8\x862-\x06\xdaf\xd6\
+hgh\xdb\x0613\xc6\x98\x81\xde\x14\xc1K\xf5m\
++\xd8\x0e\x80\x0e\xf7\xc4h\x8a\x0cl2n\x9c\x0b\xe0\
+\x8a\x17\x08pg8\x0a\x1c\x01\x9c\x99\xa7\x11O\x8f\x15\
+.Pw\x93\xff\x02n\x028\xfc\xe3 I\xdb\x00\x00\
+\x00\x00IEND\xaeB`\x82\
+\x00\x00\x02\xb7\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x02IIDATH\xc7\xed\
+U\xdbnRQ\x10\xe5\xd3\xfc\x0c?\xa5O\xc6D\x1f\
+\xf4\xd5\xa8\xb1\x1f\xa0\xc6\x07\x8d&H\xbc\x00Z.\xa5\
+\x94\x03\xf4B\xb9s\xe0p\xbf\xb4T\x9a\xc6D8{\
+/\xd7\xecMi_y\xa0O<Lf\xce\x9a\x995\
+'\xb3`N\xe0\xc1\xc3\xc7;4gC\xb6\x13\x90 \
+\xd5\x03\xbeW\x80PQ!X\xf4\xf1\xe5d\x8ep]\
+\x13S\x884\x80\xa8\xab\x11\xf3@\xccZ\xa8\xacX\xbb\
+0q\xd4\xb5\xbd?k\xc0\x8f\xeaM\xac\x11\xefh\x08\
+\xb7\x19p8\xb4\xc9\xa7\xdf\x94i\x08\xd7\x15\x9eGm\
+a\xa8\xa4\xf0\x84\xb8\x90\xc9\xb3\xe0_\xcf\xe6\x88\xb5\x80\
+G\xc191ej\x9e\x85\x81\xe0\x12\x17\x9et\x1f\xab\
+\x01\x9b]\x11\x80\x8dZ\xe0^D>\xe4\xbe\xc2\x15\x1f\
+\xfb\x1d\xe0W\xdd\xa7i$=\x18/\x16\xe5\x9ecM\
+\xb5\xf4\xd4\xa2\xbc0~\xcf\x95\x9co\xf0=j\x97\xf0\
+`\xbc\xf0d\x87\xb7\x1a8\xb9\xa1\x90)\xbc\xf8\xed#\
+\xd5\x06\xd2\xfcU\xed\xee\x03I\x0a\x16\xae.\xf02\xc6\
+A$\x8a\x91\xf0u\xc2\xd6f\xf8R\xaf\xe2@\x9c\x83\
+\xa4\xe7M\x92\xc4\x9eB\x82\xcf\xbb)\xe0x\xac\xb7\x22\
+\xaf!ra\x028\xdc{\x9a;\xccq\xb7\xd9\x9e\x98\
+FaL\x1d\xdc\x05\x0e\x88[\x0c\xc8t\xb9_j\x96\
+\xebk\x13K\xde\xe9)S#\xbd\xf9\x01u\xa9\xff\x83\
+p\xaeD.N4\x0e\x9as\xbcw\x14R\xee\x1cy\
+\x16\xbe\xcd\xf8p:\x0aGl\xf8\x5c y\x97\x84m\
+\x85\x0f9\xbd\xc2?\x1e\x13\xf3|c\x9fN\x80\xd3\x91\
+\xb5w\x8e\x8f\xd2\xf9V\xe4uDnL5\x8aC\x85\
+\xea9\x8c\xafP \x89\xcb\xfc\xb3H\x5c\x1ai\x13\xbb\
+\x976_b|6\xf0q\xda_\x98\x5ce\x22y\x9b\
+\x93\xba*\xf7\xef\xcd\xee\x88\xdc\xbe\x22\xd9\x88g\x80\xb7\
+\xdf\x9d\x02\x951\xcfB\xd5\xc65\x16\x87y\xff\x05k\
+r\x80\xe05\x0e\xaf_\x00\x11~/\xca\xf2b|\x89\
+HU\xa3a\xea\x959/\xad?\xdbs\xbd\x8e\xc8\xa3\
+\xbf@\xf3B\xa1\xcd\xbdy\x97\xda\xfa\xa9x\x8d\x0e\xe3\
+\xd6T\xa13\xd3\xab\x9c`R\xdf$\xde\x9dI\xad\xba\
+\xeda\x8d\xf8\xfe\xd5\x9do\xf2\xe0Z\x9b\xa2l\xc7\x12\
+\x0aq\xaek\x89\x04?\xe2\x89\xb8i\xcc/c\x19\x9a\
+m\xdb\xfa.M\xe2\xde\xcc\xe6r\xfc\xd7\x0f\xae\xefI\
+\xe4\xff\xfb\x02'\xea\xf7\xb1\x15D\x00\x00\x00\x00IE\
+ND\xaeB`\x82\
+\x00\x00\x06~\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x06EIDATH\x89\x9d\x95{l\x95w\
+\x19\xc7?\xbfs\xdes\xeb\xe5\x9c^\xe0@i\xbb\xb2\
+^(\xe5\x0eE\x1cc\x83\x11\xc9\x14\xc7`[48\
+cf\x22S\x11cD75&\xc6\x7ffH4&\
+j6]0dq\x19\xc8(\x0e\xc4\xae`iY\xa1\
+\xe1:*\xd4\xf5\xc2\xb5\xd0\xd3;\xbd\x9d\x9e\xeb{\xf9\
+\xbd\xef\xfb\xf3\x1f4\xa8\x98\xcc=\xc9\xf3\xef\xe7\xf3\xe4\
+\xfb\xc7\xf3\x15J)>\xc9\xbc\xfdCQ\x5cQ\x1a\xda\
+>\xbbl\xc9\xf7\x95\xeb\xe8#\xb1\xceW\x8f\xb6\xbbm\
+_\xdd\xc4\xd2\xb4\xc5\xe0\xa6W\xd58\x80\xf6\xff\x82\xff\
+\xf0#\x11*)`\xeb\xb2\xfa\xb5\xdf\xa9\xa8{n]\
+Qq-\xae'Hv\xf2\xd9\x9foy\xb2\xb8/S\
+\xf0\xe4\x0b\xc1d\xe3~!\xc4\xd7\x94R\xf2c\x0b\x84\
+\x10\xe2\xf8\x1e\xd6\xd5VE_\x99\xbfb\xc73\xd1y\
+k|\x22y\x8d\xcc\xdd\xc3\xa8\xbc\xc5\x8c\xfb\xbf\xb8<\
+\xbf\xfe\xc5\xe5\x95\xb5\x9f\xe6\xc6\xe1\x13\xf3@\x86\x80\x87\
+\x0b:\xde\x14\x1a\x8a\xc0\xea]*\x03\xd0\xf8\x9a\xa8<\
+\xf3F\xf17\xcb\x17n\xfaV\xd9\x82\x17\xf3\xbd\xd9>\
+\xec\xe1&F\xc6\xa7\xe9\x9f\x09#\x8b\xcaY\xf5\xec.\
+\xc2\x91\x08r\xea\x12w\x86\xad.\xc0\xfb_\x11\xfd\xe4\
++\xc2\xf7\xc4\x22\x9e\x88\xce_\xbeS\xf3\x87\x0b\x9a~\
+&\xf6\xf9|bV\xcd\xaa\xad\xaf\x94\xd5l\xa9\xca\xf5\
+\xf9\xb1\xee\xb5\x12\x9f\x99\xe4\xc6\x10\xa4s\xd62o\xc5\
+\xe7\xa8^\xb0\x08\x5c\x89\x02\xe2w\x0e\xd9\xad\x97\x9c\x0f\
+\x00\x09 \x94R\x08!\xc4\xb1\xd7X8+:{w\
+\xc5\xb2\x1d/\xcd\x9e\xb7:(\xac\x19\xe2\x89a\xdd\x17\
+\x88h\x91H\x89OM_ef\xa2\x8f\xc1)A_\
+\xba\x8a\xea\x95/PZ\xb5\x84p\xae\x1f]\xd7Q\xca\
+\x8b+\xbct\xbf\xbbf|\xf8\xef\x9dW\xfd\xc2\x17\xd0\
+\xa2\xf2\x07\xa2\xf5\x97b\xa5\xc7\x17^[Q\xf7\xf4\x9e\
+\x92\x05\xdb#Ak\x18\x95\xba\x89G\xd3 \x10E\xd9\
+:\xfa\xcc\x00wFR\x0cfJ\x09\x94mfy\xfd\
+\x06B\xb9!\x5c\xdbBJ\x89\xebzI&'\x18\xe9\
+\xda\x8f\xd1{P.\x5c\xbfC\xcb\x8fV\x88\x0b\xef\xec\
+\x8ai\x91\xa2\x92\xd7\xa3\x8fn\xae\x7fd\xc1\xb6\xa0\x1a\
+oE9:\x1eo\x00)%\xb6\x11cb2\xc9\xb5\
+\xd1 \x9e9\xdb\xa8{l3%%Q\xa4e`\x19\
+Y\xa4\xed`\x18\x16w{\x9a\xe9\xee8Fm\xc5\x1c\
+\xd6\xef\xd8\xeb\xf3\x05\xe3\xa4\xa7S(\x22\xb34\x8f\xd7\
+W\xe5\xf7y\x82\xe9\xa1vB\x9e\x14\xc2\x9b\x8baZ\
+$\xd2:\xd7\x06\x1d\xd29\x8fQ\xbd\xfe\x19\xca\xca+\
+\xf1\x0a\x07#\x9b\xc6Q\x02\xcb\xb4\x18\x1d\xe8\xa2\xe3\xf4\
+\xef@\xf9\xf8\xcc\xd3[\xa9\xae\x8a \x93\xedL\x8f\x19\
+\xdc\xbc\xf0\x11\xbd\x037\x0fi\xcau=B\xd98.\
+X\xca\x83--\xee\x8c\x18\xf4\xa7\xca\xa9X\xf1\x05V\
+\xd6,!\xe0\xf7\x22-\x13CJlW#>\xd5\xcf\
+\xd5\xd3\xfb\x18\x1f\xe9a\xe9\x8a\xc7\xd9\xb0\xbe\x1e\xd7\x9a\
+\x22\x11k$\x9e\x01=\x91\xc3\xb5\xcb-\x83\xef_\xe1\
+=\x0d\xc0U`I\x85aY\x0c\x8c&\xb9\xeb>\xc5\
+\xc6\xe7v\x92\x17\xd2\x90\xb6\xc4\xd0M,\xdb\xc14,\
+\xaew\xbc\xc3\x8d\x8fZ)-\xab\xe1\xa5\x97\xbfM$\
+4\xc4\xcc\xd0qFF\x06\x11\xde\x10\xc1\xf0b\xae\xb4\
+\x1dL\xefk\xcb\xfc\xea\xf2-\xba5W\x81m;\x18\
+R\x92\x8cgh\xbb<\xca\x86/\x7f\x8a\x82p\x90l\
+&\x83\xe3\x80aZ\x0c\xf5]\xe0\xea\xd9\x03\xf8}A\
+>\xbby\x0b\xd5\xb5\xc5\xe8c\xe7\xe8\xbf\x13\xc3\xb4l\
+\x14^\xfcy\x95Lu\x7f\xc8\xdfzn\xb4]\xbe\xc5\
+I`R\xb3m\x17K\xda$\x93&}\xfdSd\xc4\
+\x5c\xf2\x0b\xa2\x98\xa6\xc4\xb2=L\x0cu\xd1y\xb1\x81\
+\xf8\xf8]V?\xbe\x995\xf5\x95\x08\xd9\xc7Hw\x03\
+\x99\xac\xc4\xb4$\x8e#\x09\x86\xcbH\xdeK\xd0\xf0\x97\
+\xb6\x9e\xbd-\xfc\x02\x18\x05tM:\x0a\xc3\xb4\x89\xa7\
+Lzo\xdfC\x9b\xb3\x84pd\x16\x89\xf8\x04\x9d\xe7\
+\xffH\xec\xfa9\x1e\xa9x\x84\xcf\x7f}7\x05\xc1a\
+\x12\x03\x87\x89\xc7\x13du\x13\xdb\x96d2)\xfc\xa1\
+B\x84\x98\xcb\xd0\x95\xb7\xf5\xbd'\xf5\xdf\x98\x92\xbb@\
+R)\xa54i)\x0cC\x12O\x1a\xc4\xee\x19,]\
+T\x81P\x16\xef\x1f\xf81\x01\x9f`\xdb\xf6\x97)-\
+\xcfA\x1fnb,6B:c\x91H&@\xb9h\
+\xbe \xbe\xdcrrrK\xe9?w\x823WcG\
+\x93:\xed\xc0\x94R\xca\x06\xd0L\xe9\x92\xd1%\x93\xd3\
+\x12o\xa0\x909\xa55\x9cj\xda\xc7\x9d\xbe^v\x7f\
+\xf7\x1b\x94\xe4\xf50\xd4\xd9M6\x9bA\x08\x0d\xdb\x96\
+X\x86\x817'J~\xfe\xa3\x88\x891\x9a\xdf\xfb}\
+\xe6P\xfb\xf4\xc9\x8b\xb7\xf95p\x0f0\xff\xf9~4\
+\xddR\x08]25ca\x11\xc66\xa6\xe9\xb8\xf4\x01\
+\x9b\x9eZ\xc5\xe8\xad#d\xc3\xf9H\xdb\xc14M\x5c\
+W\xc7\xa3\xe5\x90\x17]\x8e\x13\xcf\xd2\xd3\xd6\xe8\xec?\
+\xd6\xdb\xfb\xd7\x1e\x0eeMZ\x80~ \xa5\x1e(\x19\
+\xcd0\x5cTV\x92\xd2]$~\xae\x9co`Au\
+1\xb3\x82#D\xc2a\x10\x1e\x92\xc98\xae\xf2\x10\x0c\
+\x97\xe3\x15\x05\x8cv~\xa8\xda\xda/\x8d\xbe\xd9l\x1d\
+\x9d\xc9\xd2\x0c\xdc\x06\xc6\xee\xc3\x9d\x07\x1f\xa8fX\x0a\
+\xd7\x908\xcaO*\x99\xa0\xb6j.\x0b+\x04yA\
+\x17\xc7\xb1q\x1cE0R\x8e\x10\x85\x98\xa3\x03\x9ci\
+iH\xfd\xb69u\xea\xd6\x18\x7f\x02z\xef\x83g\x00\
+C=\xa4\x1e5G\x81\xab\x04\xcaLSVh\xb1\xac\
+\xae\x80\x90\x88\xe1\x0f\x14\x926 \xaf\xa8\x0est\x94\
+\xc1\xaeF\xf7\x8d\xc3\xb7:N\xdf\xa4\xc1\x92\x5c\x04\x86\
+\x80)@\xff\xcf\xab\xffM\x10\xf0{\xc9\xc9\xd1(\x0c\
+\x1a,]Y\x8d\x9b\xee!/Z\x8e\xed\x99G \x10\
+\x22v\xb6\x85#\xcdW\x06\x0e\x9cu\x8e\xa6L\x8e\x03\
+1`\x1cH+\xa5\xe4\xff\x02\xffK\x10\x9f\x9c\xec\x96\
+\xd9\xee\x95u\xab\x9f/4\xac\xebD\x8aJ\x08\xe6\xd4\
+\x92\x88\xf5\xd2r\xe2\xd4\xf4\xbb\xe7\xb3\xad\xdd\x03\x1c\x05\
+\xae\xdd\x8f#\x01\x98\x0f\x8b\xe3\xa1\x82\xb7\x9a\xdc?W\
+\x17\x8f\x8b\x9d\x8b\xed\x8ds+7\x10N\x0f\xd2\xd1t\
+\xd0z\xfd\xc8\xc0\xb9\xce\x01\x9aL\xc9Y`\x04\x98\xbe\
+\x1f\x87\xfbq\xc0\x0f\xce\xfc\xb9E<\xff\xd6\xf7\xf2\xae\
+7\xfet\x91\xfa\xd2\xba`W\xae\x9f=\xc0F\xa0\x06\
+(\x004\xa5\x14\x9fd\xff\x018\xa4n_UI\x82\
+\xf9\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x02\xa1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x023IDATH\xc7\xd5\
+U\xcbn\x13A\x10\xcc\xa7\xf1\x19|\x8aO\x08!\x0e\
+\x88\x13Bp\xe0\x03\x10\xe2\x06Rx\x84l\x0c\xd8$\
+\xf1cm\x92\xe0\xf8\xed]{\xfd\xb6\x13;F\x11\x07\
+\xef\xce\x14\xd53\x10\x88d\x03\x07\xf6\xe0Ckz\xaa\
+k\xbav\xbb5=[7n\xdeN\xd0\xdc\x98,\xb1\
+%\xcea\x1f\xd8\xa9\x01\xaf\xcb\x0a\xdb\xe5\x08/O\x96\
+p\x9a\x9a\x98\xc2^\x0bHz\x1a\xa9\x0e\x88\x01\xbb\x0d\
+\xf2\xaa\x8a\xdc\xd0\xec\x93\x9e=+\xf8\xbb\xfaO_#\
+\xdd\xd5\x90\xdcF 7\xb2\xc1\xbbo\x959\xe04\x15\
+\xee'-\xf1ME\xe1\x0eq\x9b\x5c\xe3\x9e\x03\xbc:\
+]\x22\xd5\x06nm/\x89Q\x8c\x9c\xdfq\xc9\x93\x1d\
+\xe0J \xde\x12\x01\x88\xd5\xfe\xe7\x1f$\xd6\x09\xb89\
+\xd6\xcb\xa9E8\xe8\x02\xef\x9b\x11M\xe3S\x07f\x15\
+K\xb2\xce)_\x99U\xf6\xbb\xd5\x90{\xe0\xa3'\xb1\
+\x08\xd9\xbem\xe8Z\x81\xe2H\x92)<\xfc\x10!\x13\
+\x80\x07\x80'\x07\xc0>\x1b\xe6\xd4C<JQ\x88\x89\
+RL\xf8 \x19\x1an\x9e\x1f\xf58\x0d\xa4)t2\
+\xc1\x1f\x05\xe2-\xd1&49\xf17\x01\xb74\x05\x5c\
+\xd6=\xdbQ(\xb2\xb6\x85\xbe\x98F\x89\xb5\xdd\xf7B\
+d\xda\xea\x07\x06d\xc89f\xcf\x8a\x03\xc6\xa7\xebk\
+\x7fM\xa0<\xd5\xc8\xf8K<s\x15\x0e\xbd%>S\
+\xe4i>\x82\xdbU8\x1a\x02/JL\xde\xd3\xc8\x07\
+\x0a\xcf\x8b\xfa\x0a\xdfi\xfc\x9b@\xbc%\xda\xa4\x9b\xbc\
+\xf2\xcfL\x0fZ3\x8d\xf2H\xa1~\x06\xb3\xd6\xd8<\
+\xf1\xab\x13m\xfc\xcaX\x1b\xdf\x9b\x03\xc7\xfd\x10\x15\xfa\
+\xa5a\x84/\x83\xd0\xc4jS\x89\xdb\xb3\xc2\xeb,~\
+\xf5\xc6\x08\x04_\x99l\xccq\xc0Q\xed\xcd\x80\xda\x84\
+c\xa1n\xfd\xc6\x99\x86\xc3\xf9/\x98O\x81\xbd\xba&\
+\x064\xcf\xe9\xf3\xbd\xa8\xca\x87M-\xde2|\x85\xdc\
+\xe0\xba@\xbc%\xda\xb4&'V^\xb4\xf17\xc0?\
+W\x08.\x80\xce\x5c\xdbu&\xab\xf5\xdb3\x85\xeeB\
+\x9b\x98\xf0\xba\x17\x96\xef\x13\xef-\x84\xab0\xbc\x5c}\
+\xe9\x8c\xc0\xf0R\x1bR\x81\x0f\xb5\x1c\x96\xc4\xc5\x1e\x8c\
+/\xf8\x11GD0\xd7F4\xcfQ!\xbe\x88\x16\x02\
+\x8d\x1e9b\xa7\x93\xf5\x02\xb1\x96\xe8;1\xcd6\x1d\
+\xe5-\x08\xd3\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x06\xe8\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x06zIDATX\xc3\xed\
+W\x09LTW\x14\x1dj\xed\xa6Mii\xb5.\x15\
+\xf7\x1d\xb1 \x8a\x0a(*\xb2\xa9\x88\xc0 (\x22\xae\
+\xe00\x08nl#B\x01\xc5qAvq\xa1\x0a(\
+\xe2Z\xc0\x0aZ\x91`\xc0\x15\xad\x88h\xcd\x18\xd4\xaa\
+\xd4Z\xb1.\xe8\x8c\x0a\x9e\x9e\x0f?\x8dR)\x9a\x9a\
+6i\x9c\xe4d23\xff\xdds\xef9\xf7\xde\xffG\
+\x02@\xf2_B\xf26\x81\xffe\x02fR\x85\x91\x99\
+4Xf\xea\x14\x14o\xea\x18\x98f\xea\x18\x90>\xd4\
+~\xc1\xaa\x81\xb6\xde\x93%\x12\xc9\xc7D3\xc9\x9b~\
+\x0d\x9b\x18\xd2\x97\xc4\x11\xc3\x9c\x17\x17{,\xdc|9\
+`\xf9\xe1\xdb\xa1\xd1\x17\xab\x15+\xae\xa8\x15\xcb\xaf\xa8\
+\x03\xa3\xce<\x90)v\xdf\x1al\xe7\x97o`1]\
+\xc6#\x9f\x10\xef\xbe\x01\xe2\xc5\x96$M\x9947Y\
+\x15\x91Pv7<AS+\x0f\x07&-\x00\xc6z\
+\x02\xa3\xa7\x02#\xdd\x00kw\xc0}\x1e\x10\x16]\xf9\
+\xc4\xc2u\xc9\xb5\xd6\xbazR\x1e\xd7\xf9\xc7\xc4\xd3\x17\
+\xa5V(\x93\xaf>\x0c\x8c\x06\xdc\x02I$\x03L\xa6\
+\x01\x86\x93\x01=)\xd0\xdb\x1e\xe8fK\x8c\x06\xfa\xd9\
+\x00\xd29\xc0\x82\xf0\x22u\xaf\xc1\x13r\x18\xc6\xe0\xf5\
+\x89\x9d\x17\xeb\x12\x8aI\xbe\xc9\xaa\x95\x1bI\xbc\x06p\
+\x0d\x02,\xe4\xc0PVlL\x0cd\x12\x83\xbc\x09\x92\
+\xe9{\x00=]\x80Nc\x00]\x0b`\x88\x13\x10\x10\
+\xa5~6\xd0VV\xc9pN\xafE>|b\x88\xdc\
+\xc6#\xaa,<\xbe\xa4*<\x19\x98\xba\x84\x15\xfb\x01\
+fs\x89\xf9\x94[\x01\xd8G\x01\x93\xa9\xc6\xd48&\
+\xc6\xf7q\xdfP\x11_\xa0\xef\x14\xa0\xab\x1d`\xe4\x0c\
+\xcc\xa5E\xe6N\x01w\x19\xd2\xf7\xb5\xaa\x96-\xd9q\
+5&]S\xebM\x92\xf1\x01\xf4\x96\xa4#\xfc\x01\x9b\
+\x08\x92\x92p~:\xb0|/\xb0\xbe\x10\xd8T\x04$\
+\xfc\x00\xf8o\xa5\xec+\xa8\x0e\x13\xed\xc3^\x18\xcc^\
+\xf0]\xc6\xe4\xbc\xe3\xab\x19Z\xf1\x0a\xe4\x0a'\xa1\xea\
+\xc8\xc4\x92\xaa\x88u$\x0ac\xd5$\x1dE\xbfm\x22\
+\xd9l\x09\xf4t\x1b\x10{\x08\xc8*\x03\xb6\x1eT\xd5\
+\x84\xc4\xeeQ{,\x88{\x18\xb9.O\xb3\xbd\x84\x92\
+gP\x09^kLkF\xd1*E,\xed\x19#\xbf\
+\xc7\xf0K\xfe\x1c\x1f\x8e\x861\xbf\xf8\x88\xd0z^r\
+\x07\xcf\x98\x0b\xb1i75\xf3\xe9\xb5S\x08`I\x99\
+\xadY\xb14\x06\x90\xb1b\xe5\x01`W)\xb0\xad@\
+U3\xc6#\xf4A_\xd3\x89W;\xf4\x1aZ\xac\xd3\
+\xae\xfbN6\xda\xb1\xb5\xbbJ4\x89\xf9\xb4$\x91}\
+\x12T\x1fcU\x9a\xfa\x99\x91\xb5\xe7\xed:\x05\x04\xf2\
+\xc4\xd4\xb2\xdf\x0d-gm\xea\xd2\xdfb\xbc\xb8(\xb4\
+\x98X\xf0\x0c\xff\xd4\x8a\xd8-\x9aZ/%\xbd\xe5A\
++\xfai\xbf\x0a\xf0Ha\x159@\xca1 \xfb\xf4\
+\x9dZY\xe8\x86G\x02\xf1\x97\x9d\xf4\xf3yv9\xe1\
+E\x8cc<\x7f\xdf\xc8\xf4\xdf2O\x02>\xa9L\x9a\
+q|\xe3\x81\xc8\xa4\x13O\xba\x1b\x8d9\xcfk\xfc\x04\
+\x05J\x0b\x8f0\xabu\xa7\x1f\xe9\x9b\xbbe\xe9\x99\xb9\
+\xc8\xb9\xc1\xb6\xf9E\xe4\x5cWn\x06\xa6\xd1o;\xca\
+n\xcbw\x97$@\x9e\x09\xac,\x00\xf6\x94\x03i\xfb\
+\xcb\x9e\x8ep\xf6\xbf\xdf\xa1\xb7I\x09\x83\xad!<\x09\
+s\xa23\xf1Y\xff\x11\xee\x16^!)\xd7w\xfdH\
+\x1b\xb6S1Z\x18\x9fE\x05\xddB\x1fh\xb7\xea\xb8\
+\x9b\xd7\xb8\x08\x0dV\x96\xcb\x80+\xf9\xa3\x97\xe2\x94\xda\
+x\x9c\xef\x85\xf0\xa4\xeb\x1a\x7fz\xeb\xb6\x94\xcb\x84r\
+\xdb\x0b]\xfd-\x83\xb0\xc1\xd6\x1e\x07\xf2\xca\xd5\xcf\x16\
+)\xb7p\x96\xed+>o\xdfc_\x9d\x97\x12\x89\x1d\
+\xd1\xf5\xf9Uk\xe2\xb0h\xda\xb2\x0d\xfb\x7f\xcdd\x1f\
+\x84\x91X\xf9\x1d\x10\x9et\xf8qW\x03+\xa1\xfa0\
+\xc2X\xb0\xe0\xdc\xae\x5c`N(;\xdb\x07p\x5cT\
+]\xebBR\x07b\x1c\xbbUJ\xc9fm\x01B\xe9\
+u*+\xc9-\xbbS;Q\xae\xac\xee\xd4oD)\
+\x03\xc4\x103\x89!D\xeb\x86\xabU\xb8\x17d\x1c\xbc\
+X\x9d\xce\xa4\xe38\x11i\x07\xef\xd4\x9a;\xf9\xdfo\
+\xa1\xdd:\x93?\xbb\x12m\xeb\x12\xd8\xb9\x9f\xber\xa6\
+M\xbc\x00S\x8e\x8bUX}\xd5\x93\xd6\x03\x9e\x94n\
+);<\x93\x92\xe7\x9c\xbaQ#J~\x92\x87\x95\x84\
+\x83Xu\x0b\xe2\x9d\x86\xf7\x06\xa9<\xe6B\xf1e6\
+({`\xe7Q\xf53G/e\xb5x6\x980$\
+>\xa8K`\x0f\x09f+\xebgz$\x95\xb0g\x87\
+O\xa1\xff>\x94,\x923\x9dA\xf2\xb5Y'\x9e\x8c\
+$y\xbbn\x03\x8f\xf0`$1\x96h\xdf\xd8\x0dE\
+h\xee\xf4\xbc\xb2\xbb\x85* \xff\x020/r\x8bZ\
+TMH\xdc\x96\xf8\xa2n\xe2\x84\x04r\x8a\xd9\x9d\xdc\
+lvL\xc2\x81\x92O\xe5xy\xd3\xb3\x10\xf6F\xf2\
+\x19Vp\xecF\x0d\x1b\xb4R\xbb\x95n\x8e\xb8<\xac\
+\x886\x8d\x91\x0b\xbb\xc3\xc3?YU\xfe\x0bp\xfa*\
+\xf7\xc4\xd2\xad\x8fD\xdfW\x13\x13^H\x5cH \xef\
+\x14\xc7\x8a\xdd\xed\xbe\x11\x98\xc1\xa51\x97\xcd\x16LU\
+\xa28fk\x0a\xea\xc9\xdbw\x1fT\xc8\xcb\x17\x0a\xd6\
+\x8a\xd9\xbf\xbcr\xa7 \x1d&\xb0\xf3P\xe9MMy\
+%\xc9\xa3\xb6>\x14\xc9\x85~\x11\xee\x80\xba/\x9c\x15\
+\x12(\xa2Dq\x5c\x16A\x9c\xed\xc5l\xb6e\x5c\xa3\
+\xd1\xec\xdc\xb5\xdcl\x99\x97\xb8R\xb3N>\xee=d\
+\xc2Q\x9d\xb6\xdd<\xc5\xec\x1b}\xa0`\xbc9q\x19\
+E\xb7J*4\xb5\xce\xb2\x15\xf7\xba\x19Z\x97\x8b#\
+\xeaLt$\x9a7<p\xee\xec\xcf\xc0\xc1\x9fHV\
+Z\xdfl{\xe8[v\x05\xb0\x8f\xf2\x15\xdc\x00\xceV\
+\x01\xebv\x17\xa9\xfb\x98Hw\xf0H\x1f\xe2\xfdF\x1e\
+J\xecB\x13\xf7^\xcb?}S3vz\xc4\xed\xce\
+\xfa\xa3\x84\xfd\xb0R\xbc\xeb\xfd\x95\x5c\x9c\xd5\x8c\xec\xa2\
+\xcb\x9a\xec\xe2KO\xb3\x8aT5\xd9GU59\xc4\
+\xdec\xc4qU\xcd\xf7D\xee\x09\x01\x97\x9e\xba\xfa\xae\
+\xaej\xa5\xab\xe7#\xfa\xaf\xd5\xe0\xf9\xa0\x87G\xc0\xfa\
+\x8b\xab\xd3\x0a\xab\x0c-g\x9e\xfb\xaa\xe7\xe0\x03\xfc:\
+\x82\xb0\x17eo\xfeR\xc9\x0cF\xcfp\x19`5\xbb\
+\xa0\xdf\xf0\xc9\xe7\xf5\xcc\x5c/5\x8aa\xae\xaa6]\
+\x0cr\xc4\xb9\xef\xf2\x12\x1b\x9au7\xb25\xef=\xd4\
+q\xe3\x87-?\x8d\xe2g91\x92h\xd7\xd4\xa3\x97\
+\xb0\xb9\x06\x88\x8bav\x13p\x13D\x13\x1f\xa5\xb4\x1a\
+\xc4\x11>k\x13_\x0b\xf71\xd1*\xedWy\xeek\
+&&\xd1Fl\xb0\xbfC\x9b&\x9ej\xb5\xea\x96\x8b\
+D\xd2\x92x\xef%I\xfe\xfb\xaf\xb7\xff\x8c\xde&\xd0\
+\x14\xfe\x00\xc6\x8fm_Q\xaa\x96$\x00\x00\x00\x00I\
+END\xaeB`\x82\
+\x00\x00\x04n\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x045IDATH\xc7\xb5\x95\x7fL\x94u\
+\x1c\xc7\xafZ\xad\xe5\x8a-g\x9a\xfeQ6\xc4\xc4\xa4\
+,\xa0\x00EK\xd7\x0f\xac.\x10\xc5\xcaj+\x95\x14\
+Q\xd4(\x08D\x0b\x04e\x9c\xfc\x88@e\x1c\xd2\x89\
+\x9c`\xca\x93pH\xfc~\xe0P~(\xe4\xe1\x91G\
+\x876\xae\xa8\xa3\xd1\xaev\xdb\xfd\xe1\xf6\xee\xfd\xddu\
+\x0b\xc2\x83s\xab?\xde{\xf6\xec\xfby>\xaf\xcf\xcf\
+\xe7\xab\x00\xa0\xf8?5\xe1e\xe5\x86\xfd\x09T\xcfm\
+HC\xbdG\xcd\x98\x16@\xa3\xc0\xdd\x87\xb4\xa6\xeb\x7f\
+\x02B\xd7\xc6\x00\xe3(p\x95\x1a\xf8\x0d0\xfd\x0e\x0c\
+\xfd\xe1<\x1b\xa2~\xb0\x01m\x03V\xfb\x17\xa7dK\
+\xe8\xfa\xbd\xe5\xa1\xeb\x92\x22\xa6\x03\xcc{sW\xbe!\
+O+[\xc4\x87W~\x01:\x7f\x04.\x0c\x01]|\
+\x1a~\x05\xc4\x99PU\xc7\xe0\x98\x80\xf7\x8d\x00\xc2N\
+\xa6\xfdk\x9b3{\x03^\xd9\xe6\xa7P(\xeep[\
+\xa2\xc0\xb0\xed\x8f\x06\x84\xc5\xec\x0e~\xe3\xa3jU\x99\
+li\xa7\xf3\xe6\xef\x19)\x9f\x05g\xbaG|\x83\xd6\
+\x9e_\x18\xa8<\xe6\xffR\xb46)O2\xf7\x0c\x03\
+\x1d<\xeb\xf9\x098\xd9`\x18}\xf6\xd5\x9d*\x02\xee\
+u\x0b\x10ta\xb0t\xf5\x07/\xc6\x1d\xd4\x9a:n\
+\x00M\x04\xb4\x9b\x81\xec\x93\xb2ea\xe0\xebE<\x17\
+Q\xceY\x1e\xf9ie\xede\xab\xbd\xc5\xc4\x0c\x06\x99\
+\x093\x14}\xe1\xd9<\xb7\x80\xf1\xfd\x10\x00=\x01\xdf\
+\x1a\x81V\x01(\x97-\xbe\xc1\x91\xb9t\xf0\x90\xb0Y\
+\x11\x95\x92\xac\xd6\x19F\x1b\xaf\x01\xf5\x0c\xe2\xd2\xcf\xc0\
+\x86\xb8|\xc3\x5co\xffU\xe3\xcb\xe4\x16\xb03Ck\
+je\xfa\xb5\xfd\xcc\x82Q\x1ev\x02r\x5c\x00\xda\x14\
+T\xea\x87muF'@\x7f\xc3qsyd\xe2E\
+\x9e\x07PwM\x0b\xd8A@\x13S\x97\xfa\x08\xb9\x0a\
+d\x9e\xf8\x07\xc0se\x14\xa3m1;\xcf\xc4\xb3\xa0\
+\xaa{dQPD\x05\xcf\x17{\x94Al\xba\xd6T\
+\xc7\xf4+{\x80\xb3\xbd@Z\x89lq\xcd\xff'\xb9\
+\x92\xf9t\xa7\xd5^\xcd\xecj\x088\xde08\xe6\xb7\
+bc\xa3\xd7\xacG\xb6\xd2\xf9l\x8fz\xb0\x9d\x80\x1a\
+\xa6_v\x81\x13\xd2\x09\xe8\x06X\x06NK\x17\x9b\xd9\
+\xce\xe9\xd1\xb1,g\xbe\xe3\xe8J\x83c\xcb\xd6&v\
+.\x0eY_L\xe7\x8fS\xf7x\x04\x889\xa05U\
+\x19\x80\x92v\xa0\xb4\x03(\xaa\x1f\xb6\xa5kdK\xc6\
+\x09\xa7\xce\xf6\xd9\x1cR\xbf\x13\xf2M\xbf\xe3f|\x8e\
+d\x0e\x09\x8fO}\xf2\xf9w\xbd<\x02l#\xe04\
+\xeb_\xd4J\x00\xb3\xd8_,[\xbc\x97\xbe\x5c\xb1\xe8\
+\xb9\xf0\x02\xd1\x8b\x90\xf0\x8f\x9bSK\x09b\x10\xa7.\
+\xb1T\xccH\x04\x10\xac\xdcs\x80Y\xdc=-`+\
+\x01\xe5\xfc\xb0\xb0\x895\xbe\x08\x08g\xc29?\xf6\x15\
+\x8d\x9e9\xd7g\x01!\x9a\xa3\x0d\xc3\xb6b=3e\
+\x96:N\xdb\x9aM\x99\xbd\x0f?\xf6\xb4\xb7\xab\xd1n\
+\x01\x1f\xa6iM\x9an\xd6\xb8\x01\x10\x0eR\xbf\x9a8\
+\xa6B\xa1\xeb\x92\xdf\xdf\xa7\x96-Ge\xa7]\xf9e\
+`\xd7a\xc9L\xbbhW\x16n\x01\xd1\x04\xa8\x19\xb9\
+\xaa\x0e8\xd2\x06|V:\x19 \xfe\xa4)\x04|\xd9\
+\x0cd\xd52\xd3. \x8e\x80\x05\xcf\x84\xc5\xd3\xee\xfe\
+)\x01[R\xb5\xa6B:N\xafft,\xd3\xbe\x92\
+[\x02\x0efq\x8a\xb2\xcesOt\x80\x86%}'\
+Qm\xe46o\xa1\xdd\x03S\x01\x941\x99\x929\xab\
+\x1eH\xf9\x1a8\xc4\xe8\x12\x8eMX\xb4\x19\xe2\xee\x10\
+\xce\x8e\xb0|\xe95@N\xa3\x00\xd8\x1cA\xca=z\
+\xda\xact\xfd\xf4ny\xe1\xc4\xaa$sv\x9d\xd5\x9e\
+\xce\xa8\x92\x09H\x13Y4\xda\x1c\x9b\x99\x95k\xd9\xf6\
+2\xa3R\xd6<\x9b\xe5\xc9\xa1\xca\xae\x00\x1b\x09\xf4\xf1\
+_\xa3\xfe{\x1f\xee\x9ct\xe1l\xfa\x5ck:\xc7\x1f\
+\x9c\xc4\xd5Ws\x83\xf38\xa2*6/\xb7\x85\x8d\xe6\
+{%7\xfb\xdcu\xa7*\xb8x\xc7\x09(\xa1\x8a\xda\
+\xacv\xe1\xfc\x89eQUt\xbc\x9a\xf2\x9a4\xa6\xe2\
+\xc2\x89\xd8\x91oHb\xd3nGo'\xa8\x8d\xbcG\
+Z\xe7\xfb\xad*\xa4c\xf1'\x9d\xe5\x8a\xde\xed\x85\xb3\
+$\xf4\xad\x0cQoO4g\xfeS\xb1t\xf8\x02\xe5\
+#\x1a;\xde\xb9\xdb\x0b\x87zP4\xd3C\xcd\xa4\xee\
+\xfb\xb7\xe3)7\xf9\xbf\xd4_d\xf9\x94yo\xb3\xd8\
+\x06\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x03\x00\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x02\x92IDATH\xc7\xb5\
+\x96MKTQ\x1c\xc6\x7f\xe7\xde\x99;\xbe\x0c\x86\x12\
+\x96\xa64D\x8a\x94B\x90\xd9b\x10\xfb\x0eml\x97\
+P\xabV-\xdc\xf6-\xa2EP\x14\xb8\xa8\x90\x127\
+Q\x1b\xb50+*\xad\xc14LW\xa1\xf9\x92\xa2\xce\
+x\xe7\xde{\xeei1g^\x1a\xbd\xea8t\xe0p\
+\x0f3\xdc\xe7w\xfe\xcf\xffeF(\xa5\xf8\x9f+\x14\
+\xf4\xc5\xdd>amn\x12O\xed\xe0\xd4\xd4\xd1\xe9\xd8\
+\x18J!\xab\x22\xc4\x22\x95FS\xb5%\xe4\xab\x8f\xf2\
+\xde\xf0g\xc6| \xa5\xefY|\xe1@\x800\xe9o\
+\xe9\xec\xbe\xb1\xb3\xb5\xb6\xde\xd4\xd6s\xca\xf3\x95\x81t\
+\xbd\xda\x93\xad\xb5\xc7\xea\xcfD,S\xb2\xb8\xd6\xdb<\
+\xf8\x89\xab\x02~\x07\x86\xa0\x94\xdas?\xb9s^\x05\
+\xad\xb4~.\xcd\xbeT\xbd\xed<\x07\xaa\x82\xf4\x02\x01\
+\x8f\xfac\xa9 @b:\xa1\x1c\x999\x7f\x7f\xfbP\
+\xdd\xea\xe1A\x10\xc0\x08\x8a\xcc\xf7=/s\xf2P\xa4\
+\x80$`\x03.\xd2\xdd\xc6\xd9I\x01\xd0\x16\xbfN\xbc\
+\xfb\x5c\x1f\x10\x87\xddz\xa1\x83\xeb \x8d\xc0\x03\x14\xe0\
+\x01\x16\xd1h\x05CCOYY\xd9\xe6\xc2\xe5+\xac\
+'}\x80v`\x8e\xa2|\x18\x07\x03\x5c\x14.\xe4\xb6\
+M\xf3\xe9\x13\xb4\x9cm\xa0\xb5\xb5\x8e\x8e\x8e\x18!\xec\
+\xece\xcd\x12\x22P\x05\x11H@\xa1\x10\x08\x14a3\
+\xc4\xa5\xae\x8b\x80\x05D9\x16\xb5\xd0ty$\x8b\x14\
+>\xe2\x1f\xa8\x0b\x08 \x0d\xd4\x90\xcdVI\x8d\x96_\
+6\x02\x85\xd2\x92\x99(\xd0\xd0\xac\xc3\xf2(\x80\xbcE\
+\x00B#D\xb6\x11\xcb\x1d\x15\xf9\xfc\xdbE\xd2Y\xbc\
+*\xf8D\x94cQZ[\x91\x95\xcc\x98\x94\x91\xf4\xcb\
+\x01\x88\x82$\x0b\x04F\xce&\x95\xcb\x84,\xc7\x22\x00\
+Gw\xaf\x99\xcbB~I\x9d'\xb7 _%'\xd9\
+\xd5\x10\xb3(*\x89\xc2\xd0\x1d\xee\x80q$\x8b\x8c\x1c\
+@\x10\xce\x95\xa5B\xeaX\x0c \x0cTS\x11\xae\xc8\
+\xbe`\x94\x18\x81\xa3\xabH\x22\xf0\x01\x1fA\x15\x10\x03\
+\x8e\xeb\x018\xc7\xea\xeaF\xe9\x00!0\xd0\x16\x08L\
+-\xd8\x06xl-\x8c1\xfba\x82\xd1\x91\xf7\xfe\xb3\
+\xc1\xaf\xf3?7\x99\xd1\x83.yh@\xc4\xaa\x8c@\
+\xa3\x1e\x92\x0d\xa4\x96\x12\x8c\xbf\xb8\xcd\x9b\xd1q\x7f\xe8\
+\xf5\xf2\xb7\xa95&\x81\x19\xe0\x0b\xf0\x03X\xd4\x15q\
+8@c\x9dP\xb0\xc4\xc8\xc0c\x86\x07\xee;\xe3\x93\
+rab\x91wZ0\x01L\x03\xcb\x05\xcd\xb0\xb7\x13\
+A\xff*\xba\x9a\xc5\xb5\xe4\x067\xe7\xb7\xf9c\xc3(\
+0\x05\xcc\x03\xbf\xf6\xab\xcb]zA?\x99=-\x00\
+D\x81\xfa\xbd\xe6\xfc~\x80\xc2\xfd\x17\xfb\xc6\x93\x822\
+,\x7f\xcc\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\x8f\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x03sBIT\x08\x08\x08\xdb\xe1O\xe0\x00\
+\x00\x00\x09pHYs\x00\x00 \xc7\x00\x00 \xc7\x01\
+\x95\xc3\x06]\x00\x00\x00\x19tEXtSoft\
+ware\x00www.inkscap\
+e.org\x9b\xee<\x1a\x00\x00\x00\x1ftEX\
+tTitle\x00Gnome Sym\
+bolic Icon Theme\
+\x8e\xa4)\xab\x00\x00\x01\xc2PLTE\x00\x00\x00\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x00\xca\xdf\xf4\x00\x00\x00\xbd\xd0\xe3\xbf\xd1\xe4\
+\xe3\xf1\xf8\xff\xff\xff\xff\xff\xff\x00\x00\x00\xe7\xf3\xf9\x00\
+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00l{\x84\x00\x00\x00\x00\x00\x00RV[\x00\x00\x00\
+\x04\x04\x04\x00\x00\x00\x04\x04\x04\xff\xff\xff\x97\x9a\x9d\x16\
+\x18\x18\x11\x13\x13\xf4\xf6\xf7\xf4\xf6\xf7\xb3\xc8\xd4\xb4\xca\
+\xd6\xb3\xc9\xd5\xb5\xca\xd6\xb5\xca\xd6\xb7\xcc\xd86<?\
+;AEhrx\xb9\xcf\xda\xbc\xd2\xdd;BF=\
+DI\xbd\xd2\xdd\xb8\xc2\xc7\xbd\xd2\xdeNW\x5c\xc1\xd6\
+\xe0<CH?FK\xc3\xd7\xe2AINBJN\
+\xc3\xd7\xe2\x99\xa2\xa7\xb6\xcd\xd9\xc5\xd9\xe4PZ`T\
+^du~\x83\xc6\xda\xe4\xc3\xd9\xe4\xcc\xd5\xda\xc9\xdd\
+\xe7\xc7\xdc\xe7\xbe\xd3\xde\xa7\xba\xc4LU[MV\x5c\
+\xaa\xbd\xc7\xab\xbe\xc7\xc7\xdc\xe7\xaa\xbd\xc8\xc3\xd8\xe3\xd5\
+\xe8\xf2\xa8\xbc\xc7DMR\xe7\xef\xf3\xb2\xc7\xd2\xba\xce\
+\xd9\xe8\xf0\xf5cnvdpxiw~\xb2\xc7\xd2\
+\xbe\xd2\xdedpwiv}kx\x80ly\x81\xd9\
+\xe5\xecbmuhv}n}\x84jw~kx\
+\x80n|\x84r\x80\x88r\x81\x89kx\x7fn{\x82\
+o}\x84n|\x84q}\x85q\x80\x88t\x83\x8bu\
+\x84\x8c\xde\xeb\xf2\xee\xf5\xf9t\x82\x8a\xee\xf5\xf9\xc7\xe0\
+\xeehu|iv}\xcb\xe3\xf1\xcd\xe4\xf2\xcd\xe5\xf3\
+\xe1\xef\xf6\xe5\xf1\xf8q\x7f\x87s\x81\x88t\x82\x89\xb9\
+\xd0\xdd\xbb\xd2\xdf\xbd\xd5\xe2\xbf\xd6\xe2\xc1\xd8\xe6\xc3\xdb\
+\xe9\xc4\xdc\xe9\xc8\xe0\xed\xc9\xe0\xec\xca\xe2\xef\xca\xe3\xf1\
+\xcb\xe3\xf0\xcb\xe4\xf2\xcc\xe3\xef\xcc\xe4\xf2\xcf\xe6\xf2\xd1\
+\xe7\xf3\xe3\xf0\xf7\xe3\xf1\xf8\xe4\xf1\xf8\xe5\xf1\xf8\xcfT\
+\xfd[\x00\x00\x00~tRNS\x00\x03\x07\x08\x0a\x0b\
+\x0c\x0e\x18\x1a\x1b\x1c$%'**+-012\
+3478;>>@AMVi\x96\xa4\xa7\xbf\
+\xbf\xc0\xc0\xc1\xc2\xc3\xc4\xc4\xc9\xcb\xcc\xcd\xcd\xce\xce\xcf\
+\xd1\xd2\xd2\xd4\xd5\xd5\xd5\xd6\xd6\xd7\xd8\xd8\xda\xda\xdd\xdd\
+\xde\xe3\xe7\xe8\xe9\xe9\xea\xea\xea\xeb\xeb\xf0\xf2\xf3\xf3\xf4\
+\xf4\xf4\xf5\xf5\xf5\xf5\xf5\xf6\xf6\xf6\xf6\xf6\xf7\xf7\xf7\xf8\
+\xf8\xf8\xf8\xf8\xf9\xf9\xf9\xfa\xfa\xfa\xfa\xfa\xfa\xfa\xfb\xfb\
+\xfc\xfd\xfd\xfe\xfe\xfe\xfe\xfe\xc4:6\xbb\x00\x00\x01\x8a\
+IDAT8\xcbu\xd3\xe5_\xc2`\x10\x07\xf0S\
+'`\xc7D\xc4@\xc1nE\xc5\xc2\xc4\xee\xeeF\xc5\
+\xc0\xee\xee\xf6T\x8c\xff\xd7g\x0e\xb6g\x9b\xdc\xbb=\
+\xbf\xef\xddg\xbbm\x00\x10\x9a2\xfc\xf3\xa5\xac\xd3\xd9\
+\xa2X\xe0*q\xcf\x85^\xea-\x97\x01\x08\xd9y\xc7\
+\xc7\xf1VeuN\xbc\x22\x96\xf8@\xb2\x0b\xfbt~\
+\x91\xa0\xa80\xff\xc0\x16\xbc5\xc2\x00>\xea|s\xec\
+zy\xce\x8e\x96\xaa4\xfbX\x0bg8\xe8\x9b}\x83\
+\xcb2\xc1\x8e\xe0}\x99\xaa\x1aW\xe0\x1b;\x22\xed\xe4\
+\x86\x1c1t\x1e5E\x8e\x9c\xd1\xa9x\xce\x01\xd0\xce\
+\x90Kz\x06\xe9G\xdc4\x80\x07\xc8\x85'\x17\x81T\
+\x089\x05x\xb1\xa4\x97\xe64\x10\x05\x95K\x80G\xf0\
+y\x02\x7f\x96F\x03\xd0\xce\x93h\xd5.\xf6\xcb\x01?\
+\x83\xeaW\x00\xd0.r\xf9\xae\x90C\xba\x0c\xb0s\x1c\
+\xd8\xd0{\x03\x7f\xf7'\xd9X\x86\x04\xb0c\xdc|'\
+\xf7^\xf4\xff\x01\xf7\xf3IvJ\x03\xe1\xf9iA\x01\
+j?\x94\xc8\x14\x80d\x7f\xa2\x10\x00\xbd\x7fZx\x80\
+,\x17\x05\x07>\xb1;b\x92\x5cn\xc5\xd3\x9f\x5c\x8c\
+\x83\x1c-\xb0Y\x04l\xe3\x10Sp'\xe9w\xcfx\
+\xa8P7\xe0!4\xe2s\x10S\xb8f\x90\x7f\xf6\xda\
+\xe9Ju\xf01\xb6A\xd2\x07\xf6h\xfc\xa3\x95?\x0e\
+\xab\x0e\xef\xc5+\x13@\x15\xe2QWS\x93\xcdf\xab\
+\xb1Z\xcb-\x16K\xb1\xd9\x9c\x9fG\xaa\xf9\x04_\xfa\
+\x03\x00\x98\xfa'o?\xefu\x7f\x1c7\xcb\xc7X\xb7\
+~\xa9\xac\x8b\x83v\x13\xe9\xff\x05\xce\x89\xfc}\x83\x9f\
+8E\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x03\xe1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x03\x00\x00\x00D\xa4\x8a\xc6\
+\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\
+\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xe3\x05\
+\x04\x06\x03\x19PM\x5c\x1a\x00\x00\x01\xdaPLTE\
+\xff\xff\xff\x80\x80\x00\xff\x80\x00\x9f@\x00\xc6U\x00\xaa\
+G\x00\xc6U\x00\xadR\x00\xbfR\x00\xb1N\x00\xbbS\
+\x00\xd0Z\x00\xa5J\x00\xa6J\x00\xcbY\x00\xa5K\x00\
+\xcd]\x00\xce[\x00\xa6J\x00\xa6J\x00\xce[\x00\xa6\
+J\x00\xcd\x5c\x00\xa6I\x00\xcd\x5c\x000?X0@\
+Y1@ZRbzSczSc{Sc|\
+1@Z2A[3C\x5cSd|Td|U\
+e}\xce]\x03\xa6J\x00\xcf\x5c\x00\xa6J\x00\xca[\
+\x00\xa6J\x00\xce\x5c\x00\xb0N\x00\xbdT\x00\xa6J\x00\
+\xcd\x5c\x00\xb1Q\x02\xbdU\x00\xacQ\x08\xcc]\x03=\
+U{BY\x7f\xb0Y\x0f\xd1c\x096Jj7J\
+j=Pp=Qp=QqCWvCWw\
+DWwJ^}6Jj7Jk7Kk7\
+Kl8Lm8Ln8Mo>U|>V\
+|AX\x7fG\x5c~H]~I]}J^}\
+^u\x99\xb0U\x07\xb0\xd2\xfd\xb1\xd2\xfe\xb3\xd4\xff\xb4\
+[\x0b\xb4\xd5\xfe\xbbc\x0f\xc1\xdc\xfe\xc2\xdc\xfe\xc3m\
+\x15\xc4\xde\xfe\xcb\xe1\xfb\xcd\xe3\xfc\xce\xe5\xfd\xcf\xe5\xfd\
+\xd0\xe5\xfc\xd0\xe5\xfe\xd1\xe6\xfe\xd1\xe7\xff\xd3\xe8\xfe\xd3\
+\xe8\xff\xd4\xe8\xfd\xd4\xe8\xff\xd6x(\xd6\xea\xff\xd7\xea\
+\xff\xd8\xe8\xfc\xda\xea\xfd\xda\xea\xfe\xda\xeb\xfd\xda\xeb\xfe\
+\xda\xee\xff\xdb\x84:\xdb\x94J\xdb\xeb\xfe\xdb\xec\xfe\xdc\
+\xec\xfe\xdc\xec\xff\xdc\xef\xff\xde\xed\xff\xdf\xee\xff\xdf\xef\
+\xfe\xdf\xef\xff\xe0\x8d3\xe1\x92M\xe1\xf1\xff\xe2\xf1\xfe\
+\xe2\xf1\xff\xe4\xa0`\xe4\xa8i\xe9\xac`\xe9\xb8\x7f\xeb\
+\x9d7\xec\xa2N\xef\xc4\x91\xf1\xb5o\xf2\xa48\xf2\xc1\
+\x88\xf3\xcc\x9c\xf3\xcf\xab\xf4\xce\x9f\xf7\xaa=\xf9\xe7\xd3\
+\xfa\xafC\xfc\xb5M\xfc\xc3o\xfd\xc6t\xfd\xcf\x8b\xfd\
+\xd1\x90\xfd\xd4\x97\xfd\xed\xd6\xfd\xed\xda\xfe\xd8\xa1\xfe\xdd\
+\xaf\xfe\xe5\xc1\xfe\xe9\xca\xfe\xea\xcd\xb2\x9f&\x09\x00\x00\
+\x00BtRNS\x00\x02\x02\x08\x09\x12\x12\x1c\x1c1\
+16>EEGMTVxx\x95\x95\xae\xaf\xbc\
+\xbc\xbc\xbc\xbc\xbc\xbc\xbd\xbd\xbd\xbd\xbd\xbd\xc0\xc1\xc3\xc5\
+\xc5\xc8\xca\xd5\xd5\xd8\xd8\xe7\xe7\xf2\xf2\xf6\xf6\xfa\xfa\xfe\
+\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xfe\xd7\xd7\xd8M\x00\x00\x00\x01\
+bKGD\x00\x88\x05\x1dH\x00\x00\x01?IDA\
+T8\xcbc`\xa0\x18\xa8:\xfa\xfb{{{\xfb\xf8\
+\xfa\xfa\xfa\xf9\xf9\xf9\x03\x81\xa3<\x8a\x02\x87\xba\xea\xec\
+\xb2\xfc\xb2\xf4\xb8\xa4\xd8\x98\xc4\x94\xe4\xf8\xa4\x94r\x07\
+\x14\x05\xb6\x0d\xa59\x91e\xa5\x99!\xe9\x99A\x09\xa9\
+\xc1Yia\x056(\x0a\x94\xac\x9c\x9c<=\xbd<\
+<\xdc\xdd\xdd\x5c]\x9c\x9d\x9d\x9c\xac\xa4\x19h\x07T\
+0}$C\xc8Gv\x0c\xdc:j\x820\x056\x98\
+>\xb2f\xd0\xe8\xe9\xcf\x10\x81*P\xc4\xf0\x91\xa5$\
+\x83A\xd7\x9c\x19\x85bL\xb8\x1d&`\xd11kz\
+\xad\x04\x0bn\x15|&mS\xe76j\xb1A}\x01\
+\xf4\x06\xc4\xfd\xb2p\x15\x5cF5\x93f7\xe9q\xc0\
+}\x91W\x96_\x92[e\x0fW\xc0i\xd82yb\
+\x91.;\xdc\x17\x15\x11\x95\xc5\xd1\xf5\xd60y^\xe3\
+\xf6\x99\x13\xa24Y\xa1\xbep\xf6\xf4\x049\xdf\xc9R\
+\x0a*\xcfo\xde;\xad/\x5c\x9c\x19\xa7\x1b5\xbb\xa7\
+t\x86\x8a2\xe2\xf6\x84vsk\xa00\x94\xad\xec\x0d\
+\x06\xa8\x11\xc1\xa3\xae/\x84\x16\x17H\x11\x81\x06`q\
+\x81\x88\x084\xa0\xe0\xe5\x09\x02H\x11A\x15`\x06q\
+9\xcc\xe1r\x18\x0a\x02 .\xc7\x9e'\xc0\x0a .\
+\xc7\x9e'@\xc0\x14\xe2r\x1a\xe6\x09\x00(V\x8a\xc7\
+\x1d?\x1e\x98\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x05-\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x04\xf4IDATx^\xa5\x96Kl\x5cW\
+\x1d\xc6\x7f\xe7\xdc\xc7xf\xfc\x9a\xc4\xaf<Z\x16\xa1\
+ \x12\xa8\xda\x80\x84(\xdb.J\xbb\x0e,P\x14`\
+\xd7\x05HH%\x8b\xb2A\x95\x80EZ\x09Q\xd4v\
+UDS\x15\xd5U\x9b\x84*\x02\x16U\xa8hK\xb1\
+#S\x5c\xda\x18\xbf\x82\xe3W\xec\xf1\x8c=\x1e\xcf\xcc\
+}\x9cs\xfe\x8d\xee\x5c\x09[B\x10\x95\xdf\xe6\x7fu\
+u\xf5\xff\xf4}\xdf\xb9\xbaW\x89\x08w\xc3\xa5\x9f\x9e\
+~\xd8\x99\xf4\xbcs\xe6~\x11i#\xe2\xf87\xea\x0e\
+\xbd\x9e\xef\xbf^*\x86O?\xf2\xa3\xa9Er|r\
+^\xf8\x9ez\xd49\xfa\x10\x12\x81/ \x00\x08\xc21\
+\x11\x06\x0b%\xbe\xf1\xf5o\xff\xfc\xd0\xe7\x1f:C\xda\
+\xde\xc1:K\x86s\xa05A\xa1\x8f\xcd\xc5\xc9\xc7\xa7\
+\xdf\xbc\xf08\xa0\x0e\x08<\xff]u\xee\x81G\x7f\xf8\
+l\xa1Tq6\x8d\xd2\xa1{O\x17Q(@J\x83\
+\xf7\x04\xa5\xca\xbd~\x1a\xb5\xf4\x9f_>Gj\x22\xee\
+\xfb\xf2\xc3(LfB\x10l*h\x7f\x80\xd2\xe1\xa3\
+\x04\xe5C\xfc\xf2\xfb\x9f=\xfb\x83g\xe7/\x02 \x22\
+\xfc\xea,\xd7\xacM\xe4?\x11'V66\xb7\xc4\x8a\
+HucU^\xf9\xf1\x09\xb9v\xf1[\xb26\xfb\x92\
+\xd4V\xdf\x90\xea\xd2k27\xfd\xa2\xb4[\xdbR\xbd\
+\xfd\x91\xac\xddxU\xde{\xe9\x8c\xbc\xf1\xd4\x17\x9f\x10\
+\x114\x808\x8cK;\x80\x80D \x060\xd9u\xdc\
+\xaa\xb2\xb6\xb2H\x1c%\x0c\x8d\x1c\xe5\xa1\xef\x5c\xa22\
+\xfc \xffx\xe7w\xb4\xdbq\xe6b{\xbb\xc1\xd6\xd6\
+\x16C\xa3'\x91\xde\x13<\xf0\xd8\x13(\xe4I\x00\x0d\
+\xe4F\x0c\x10\x83\x8d\xc0\xc5`\x9a\xe0\xa2lA\xa7\xbd\
+Guc\x1d\x118\xf2\x99S\x8c\xdd\xffMV?z\
+\x9b\xadZ\x83\xd4\x18\xb4\xd6\x5c\x1e\xbf\xc0\xcf~r\x8e\
+\xd9\x8f\xffB\x9cFXk\x07\x94R\x15M\x0e\x08`\
+\xbb\x0e\x5c\xa3;\xb1\x04\xbeA+\xc3\x07\x7f\xbf\xce\xd5\
+\xabo\xf2\xde\xbb\x7f\xa2^\xdf \x8a\xcd\x9d\xb9\x8b\xb3\
+\x8e\x81\xfe2_9\xfd9\xbe\xf6\xd5\x93\x8c\x8e\x0c\x22\
+b\xb0N\x00\x0a>9H\x0c\xa8<\x1eG\x863\x04\
+\x9eat\xb8L\xadz\x8b\xcd\xf5:\xde\x91\xa3\x14\x8e\
+\xde\x87\xb3B\x14\xc5$i\x82\xd602<\x909\x09\
+{\x8a\x94\xfa\x0e\xd3W\xf45\xe0\xed\x13\xb0`[`\
+wA\x97@\x12pm|\xe0\xd8\xd8\x00\x95\xbeS\xa4\
+VQ(\xf4\xa2}\x0d\x1a\xacuXk3\x17\xce9\
+@\x10U\xc8\xee\x81pP@Y\x90\x0e\xb8\x0e]\x14\
+\xa8\x02\x88!\xf0-\x03}\x09\xe8^\x08\x0b\x98\xc8\x22\
+\xd6\x92$1\xc6\x18\xac\xb1Xk\x10\x11<\xdf`]\
+\x0a\xa8\x83/Z\xb6\xd8\xc6\x80\xceER \x00\x0cH\
+\x00\x84 \x0a\xcc\x1e\x22>\xa2\xc8\x0a\x8e\xa3\x984M\
+\xbb\xcb=\x0f\xb4&\xde\xab\xd3\xecX\x01\xd0\xe4\xa0}\
+\xd0\x01\xd8-p\xbb@\x01p\xdd\xc8\xb0]Q\xb3\x05\
+(\xc49\xc4H\xb68\x8a\x22\x80,\xa2$IH\x93\
+\x04q\xa0\xc8\xb0\xfb:0`\xb6\xbb\xb1(\x1f\xcc:\
+\xd86\x19\xfe\xa1\xac\x0fL\x13\x82\x10\xa4\x17AP\x0a\
+L\x16U\x929\xe8)\x16\xb1\x22\x88\x22W\xc0\x1d<\
+EJ\x83k\x81.\xe6\x91\xd5\xc0\xab@4\x0f\xde \
+x}\xf9s>\x22\x8a8N\xf1\xfd\x00\xfc\x1e\xd0\x8a\
+b\xb9\x9f\xca\xd0\x11z\xfb\x07\xf0\xb4Vy.9\x08\
+\x90\x80\xb9\x05\xce\x81?\x02^?`\xc9H\x97\xbb\xe2\
+\xe1)\x04\x85\xf64\x85b\x99\xde\xc1\x11\x8aw\xa6\xe7\
+\x07H\xd4\xc0\xd6\x16Y\x9a_fr\xa6y\x0d\x10\x1f\
+r;\xb2\x07\xc9,\xe0\xe7.z\xba\x91\xc4s\xa0\xca\
+\xe0\x95\xbaQ\x89A\xab\x90 \xecat\xe48e\x95\
+\xd0\xbc\xf9!\x8d\xd5\x7f\x92\xb6\xebL~\xb86S\xdb\
+\xb53\x17\xc6W~\x014}\x0eP\x02\xb7\x03\xe1\x18\
+\xb4&A\x85y7K \x15\x08\x8f\x81\x12\xb46H\
+\xdcd\xe5\xfd\xdf\xe2\x1d6\xbc~m\xf9\xf2\x8d\xa5\xf6\
+\xbb\xb76\xa2\xe9\x85\xf5x\x1eh\x02-\x11i\xef\xeb\
+\xa0\x03\xd2\xcaO\x8a\x0f\xa4\xe0\x0f\x01}`\x02\x08J\
+\xa0w\xa18\x84\x17\xa7\xec\xd4;\xcd\xe7/]\x7f\xa6\
+\xd5\xb1\xbf\xaf\xef\xd9\x15\xa0\x01t\xe4\xe0\x87\x88\x83\x02\
+f\x07\x821\x88\x17!\x1c\x05\xb5\x07\xc5\x13\x10~\x09\
+<\x8fvu'Y\x9b\xba\xd2\xd9\xab\xad\xf0\xc1\x12o\
+-W\x93q\x11\xb9\xc1\x7f\xc1'\x07\xd5\x03\xe10\xa4\
+\x0d(\xdf\x03\x85a\x08\xfb\xe9T7\xd3\xb9\x89+\xb5\
+\xb5\x99\xa9Vcc\xce\xfcq\x22\x99n\xa7\xac\x8fO\
+2\x0e\xac\x00\xfcO\x01\xa5\x08|\xcfAx\x18\xda\xbd\
+\xec5\xe3x\xf9\xfa\xdb\x8d\xd9w\xae\xee4n/\x9b\
+\xcb\x93L.l\xf2\xb7\xb5m>\xdejq3\x8f\xa3\
+\x05t\xeeJ@{\xac\xc7\xad\x1a=\xc1q\xe6\xa7\xae\
+\xd4\xe7\xff\xfa\x87\xc6\xee\xedYs\xfe\xa2{n\xa9\xc6\
+\x04\xb0\x0e\xd4\xf3\xe2,wM.\x10\x86\xfc\xe6\xd7\xe7\
+\xcf\xf6 \x1c\x9fX`a\xea_L\xdc\xdc\xe4\xfdf\
+\xc2\x1cP\xcf\x8a\xfb\x94\x1c\xf8mQJU\x80\x12\xd0\
+\x06\x1a\xd9\xe2\xff\x93O\x00\xc20\xec$\xf5r\x95%\
+\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x04\xb1\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x00\x06bKGD\x00\xff\x00\xff\x00\xff\xa0\xbd\
+\xa7\x93\x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\
+\x0b\x13\x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\
+\xe3\x05\x04\x06\x08\x1c\xc3\xd3q^\x00\x00\x04>ID\
+ATX\xc3\xed\x97mh\x95e\x18\xc7\x7f\xd7}\x9e\
+\xf3\xb6\x89\xf8\x92\x1f\x1c\xe9\x07\x8fT\x1a\xfa)0F\
+I\x8cEm\xe2\x10\x16\xcb\xcc\xad\x02\x85\xd4J\x0b!\
+\x05q[/hT(\xfa\xcd\x14*J\x05\x97`b\
+\x10\xa3\x93\xbd\x91In\xfam\x83\xb3\xd0\x8cR\x93\xed\
+\xcc\xbd\x9c\xf3\xbc\xddW\x1f\xcei\x8em\xe6\x8eb}\
+\xc8\x1b\x9e\xe7\xc3\xf3\xdc\xcfs_\xf7\xf5\xff\xff\xaf\xff\
+}\x89\xaa\xf2_\x0e\xc3\x7f<\x9cR?\xa8mj\xce\
+\xb8\x81\xa4F?\xd3\xe2-\x19\xb3\xe3\xe6\xcb\x0d\xfe\xa3\
+\xa0\x09'L\x97\x1c@\xce#\xf5\xce\xae\x16\xae\x0d\x81\
+\xb5\x10\x86\x16\x8bb\x8aK\xc5b\x06/\xb0`-\xb1\
+\x98\x831\xe0\xfb`\x0c\xa8\x16.c\x94D\x02i\xd9\
+\xbc\xa5\xaad\x08T\x15c\xc0\x89\x14\xb6w\xe6W(\
+KD@ \xea\x18\xce\x5c\x00\x1b\x86\x94\x979|\xdb\
+\xe5\x13\x84\x96\xd0Z~\xbe\x00\x9e\xef\x93\x8c\xc3\xa9\x1e\
+%\x16\x11<\xd7CJ%ae\xdd\xa6L41%\
+\xc5\x04\xc9v\x87\xb3\xc5\xe4\x8eN\xb5\x8e\xddAq\xba\
+\xa87\xd4\x9b\x96\xff\xbd\x0a\xa4\xa6q{\xc6\x0d$\xa5\
+\xe3h]:\xab\x93Q\x9bn\xdb\xffVuI2\xcc\
+y\xa4v\xedi\xa1o@\xf1\x83\x90)I\x07\xd7\x0f\
+\xc9{\xa5\xb3\xbau\xf3\xd6\xaa\x92!PU\x5c\xcf\xe2\
+\x18\xc11\x86S\x99\x90x\xf4\xd6X\xedz\xeeM\x17\
+\xech\x94\x86\xb3M\x91\xae\xceF\xf9\xa6\xf3YY*\
+\x95u\x1b3N|4\xab\xaf'\xb9TV\xfb\xc3\xd9\
+t\xc7\xd7\x9f\xde\x10\x82\xce\xd5\xb2%1\xe7\x81\x1d\xf3\
+_=J\xd0\x7f\x89\xee7\xaa~r~8\xb6{\xfe\
+\x1dgZ\xab\x98\x8e\x0c{\xa7.\xa8\x5c?o\xdd\x87\
+H\x90\xc5\xbd|\x0e\x85\xf0\x8e\xcb\xf0\xc7\x06I\xc6\xe3\
+\x1c\x9c\xb9\xa4n\xc5\x9cU;\x91l7\x03]'9\
+\x7ft\x9f\x1fx\xb9\xe5R\xd3\xb8=\x93\x1fS\xdb\xff\
+\xcez\xd9\x04*\x00\xb4,\xa6\xe9#\x1f\xbcY=\x89\
+\xc5g81\x8eW<\xfe|eE\xed\xcb\xe8\x1f\xdf\
+\xd1w.\xcd\xf9\xf6\x13\x03\x1a\x84\xf5\x0f\x1d\xd4v'\
+\xe7\x91\xda\xbd\xa7\x85|\xbe\x00\x7f\x18Z\xa2QSd\
+\xb8%\x08\x0aJ\x10\x81\x81\x01\x97{\xa6\xc7\xe5\xb5W\
+\xb6\xdc\x94\xed'\xeb\xe5^k\xf8\xf2\xfe\xe5\xeb\x16V\
+<\xba\x12\xdb\xfd1\xbf\x9d\xfe\x9e\x9eSg.YK\
+mu\x9bv\x8e\xa8 \x22\x052y\x9eO\xd7%\xc8\
+\xe5<\x04\x08\x03\xe5B\xd6\xe0D b\xe0\x97^\x07\
+\xd0I\xb1\xbd\x17\x18\xf0 w\xf5<\xf6\xec{H$\
+Nr\xe12\x06\x03\xc3\xb0?\x8a\xf2\x95u\x1b{\x9c\
+\xf8\x94ycU &B~\xf0j\x11\x0e\x1d\xfdV\
+\xbd\x5c\x7f\xba#\xfd\xc9M!8\xf2\xa4\xcc\x08\x22\x1c\
+\x9f\x93\x9aU\xb9\xa4j1\xce\x82&\xfa\xaff\xf9\xea\
+\xfd\xd7\x07<7_\xff\xcc\x09m\xbf\xe3$<\xd2 \
+\xc9`\x88\x83\xb3fO[\xf1\xc8\x13\x8b\x88-\x5cE\
+\xceK\xd0\xfe\xee&?\x97\xed\xaf\xffW\xcc\xa8\xb5U\
+\xcc}\xa7\xd9;uz\xf9\xfa\xa55\x8b(\x7f\xb0\x9e\
+\x9cN\xe7\xf3mk\xba\x9d\x9a\xa6\xe6\x1e7\x90yL\
+\xe0\x05\x89\xa8-B\xa2\xc5Z3^\x11\xc9\xa8\xa6\xdb\
+\xf6\xff\xb3\x22\x9a\x9b\xd5\x02\x1b\x0e-\x93\x8b\xe9c\x9d\
+;\x1e\x1e\x0a\x89/~\x0e\x84?\xe5\xb1\xa7\xb7\xebG\
+\xfbZ\xb1\x16\x5c7\xc4q\x22XU\x8c\x08\xd6\x16\x0e\
+\x1f\xc6\x08Ah1b\xb0\xaa\x88\x80Z\x88Fa\xed\
+\x8b[\xb5\xfd\xf0\xceI\xbb\xea\xe1ZyJa\x83\x0a\
+\xe5\x18^rT\xb5\xc0\xf8P1F\xf8=\xabTL\
++\xec\xfa\xf2\xa00{j\xa1\xda:\xc6p\xb1O\x99\
+;C\x08B\xe5\xca \xcc\x9d\xc9\xa4\x141z\xac\xfc\
+B\xdb\x80\xb6\x117\xf4r\xd7zV\xaf\xd9vC/\
+\x10\x11T\xed\x08,c\xbc@\xfd\xe1l\xfa\xb6\xce\x03\
+w\xfb\x82R?\xa8il\xce\xb8\xe1x\xef\xb8\xae\x9a\
+\x09\xd5\x02\xc5>\xe0\xb3\x03oW\xdfV\x00y\x9f\xd4\
+\xa1\x03-\xf8A\xa1<\x87V\x89\x18!\x0c\xb5\xa0\x10\
+\x04cd$.\xb5\x8a\x18\xc11*\x8dk\xc7{\xc8\
+-\xf4\x05\xb6@SU\xc2@\xe9\x1b\x96B\xb9V\xa5\
+w\xc8\x14\x8fjJ\xefp!@E\xb9\xd2\xaf\x88\x01\
+\xcf\xf5n\x1f\x02/w\xad\xa7\xe1\x85m\x13\xf7\x05C\
+}\xe3\x952\xa6\x0f\xb8\xab\x82\xb1\xe3/\xba\x91@\xc5\
+\x971z\x01\x00\x00\x00\x00IEND\xaeB`\x82\
+\
+\x00\x00\x03=\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00\x18\x00\x00\x00\x18\x08\x06\x00\x00\x00\xe0w=\xf8\
+\x00\x00\x00\x04gAMA\x00\x00\xd6\xd8\xd4OX2\
+\x00\x00\x00\x19tEXtSoftware\
+\x00Adobe ImageRead\
+yq\xc9e<\x00\x00\x02\xcfIDATH\xc7\xb5\
+\x95kHSq\x18\xc6W\x14\x91\x96\x86\x99\x05!\x18\
+]f\x86\xcd 5\xad\xd4P\x222\xc5\xc4\xb2(\x19\
+]!\xaclP\xe1DS\xba\x9a ^\x90\xca\xc4i\
+^\x98\x95%\xc7&\xa12\x1d\xc7\xebr5l8\xcb\
+9\x8dZ\x08\xae\x16\x15\xc2>\x08O\xef\x9f\xe9\x970\
+\xdd\x996x\x18;\xff\xb3\xe7\xb7\xf3\xbc\x97\x89\x00\x88\
+\xfe\xa7\xe6\xbc!\xeaXN:I\xe7\x84\xd2\x05\x03\xe8\
+K1Y%\x9cy\xf470\xf2\x0b\xf8\xf0\x1d\x18\xb0\
+:4\xf8\x0d\x18\xfa\x01\xb03&\x06\x11\x89D\xeeB\
+\x01[\xcfg)\x8c\xc5u\xbcE;\xf2\xd3\xae\xff\x0a\
+\xf4\x8c:\xf4\xf6\x8b\x03\xc4u\x9bl\xec|G\xf4\xe9\
+r\x02\xf8\x0a\x8ehW\x5c\x9ad\xe7\x81\x0bW\xf7$\
+\xa6\xabU\xba\xf1\x09\x8d\x09`\xd2Y\x80\xe3\xb2\x12\x83\
+$*\xa5E\x1c\x1cW\xbe|\x85W\x02\x01|\x04\x03\
+\xe8\xb5\x98\xe4\x16\x99|C\xd35l\x9f\xd4\x0c\x01\xfc\
+0\xf0Tc\xb21s:K$m\x22\xad&-\x15\
+\x0c\x98\x8e\xea\x5c\xa6\xc2\xa8\xfd\x0c\xa8?\x02\x1df\xa0\
+\x94\xeb\x1b\x0b\x08?RC\xa6\x9bI\x8b\x5c\xee\xa2)\
+\x80\xb4@\xc9[x2n\x1e\x00:G\x80\x8cb\xce\
+\xbc!p\xdf\x1d2_7\xaf6\x9d\x02\xe4*)\x92\
+\xd6A\xa0\xc9@\x80O\xc0\xa1\xb3yz7\x8f5\xc9\
+\x04\xf0\x5c\x08@5G\x05V\xbd\x07^\x91\xdaM\xf6\
+\xc9\xbdI\xf2^2\x0f\x9f)w\xa1\x83\xe6\xc1~m\
+;\xc5\xf3\xf2\x1d\xd0\xd8\x0fT\xb5\x99lA\xd1\xa7T\
+d\xbem\xb6\xfc\x9d\x05\xc4\x5c/\xe4\xccMF\xa0\xee\
+\x0d\x01\xe8\x09\xf2jy\x8b8$\xbe\x8c\xcc\xfd\x16b\
+U\x5c*z\xd17V\xaf\x07j{(\x22*r\xea\
+\xdd\xba!_q\x98|\xa6\xbew\x05\x90[\xd6b\xb2\
+\xd5\xf6\x02O\xba\xa8\xc8T\xe8X\x8a\xcc\xdd\xd3\x87\xf5\
+\xff\xca\x85\x00\xb45\xf4\xdb'\xcby\xa0\xa2\x13\xa8\xe9\
+\x1e\x9f\x08\x89\xbd\xa8!\xf3P\xd2\x92y\x01\xd8\x80I\
+3\x14\xc6g\x14\xcfC\xb5\x03P\xcc\x19\xac\x81\x11'\
+\xea\xc9\xdc\x7f\xae\x02;\x03\x90\xde\xaa\xe2-\x0a\x8a\xa6\
+\xa8\x19`\xef\xec\xb3\x7fh\xc2\xa3\x99\x16\x9b \x00\x99\
+\xafg\xf9\x17p\xb4-[\x81\xfb*Z\x0f\x14S\x8a\
+\x5ca\x5c\xeb'\xb9B\x00o\x97\x00\xd3\x7f0I\x97\
+K\x0c\xf7\x94}c\x15T\xdc\xfc\xd7@.\x01\x1eh\
+\xa8E\x9f\x1b\xac\x07\xcf\xe4\xe9i\xbb\xde\x8c8\x9a)\
+v\x05\xa0k\xa5\xa5\xc6\xd4@\x1dS\xa5\x03\x1eS\xf6\
+\xa5\x1d@\xa5\xd6q\x8d\x9d\x156\x1a\xac\xbb\x0f_c\
+\xbbh\x99\xe0'\xc8\xae\xe4-\xd3\xca\x99R\xf6_J\
+\xcb\xe7\xcc[\x82\xe3d\x04\xf0\x12\x0ap\x0f\x8b\x97\xa5\
+n\x8f<y; <\xa9\xf0_\xda\x18\xb4?\x93\xcc\
+\x83]Zvl\x81\x91V\xb1I\x9dE\xdel\xd0\xe6\
+\x9a\x05\xa7\xb6\xe9|\xf4\x0717\xf2\xb9(\x8c\xc6\xad\
+\x00\x00\x00\x00IEND\xaeB`\x82\
+\x00\x00\x07h\
+\x89\
+PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\
+\x00\x00 \x00\x00\x00 \x08\x06\x00\x00\x00szz\xf4\
+\x00\x00\x07/IDATX\xc3\xcd\x97\x09TTe\
+\x14\xc7\x9f\x80\x88 \x04\x0d(\x9bl\x02\xb2\x0c3,\
+n\xa0\xc0\x11\xe8\xc4\xa8\x84l\xb9\xa0df\xb9\xe6\x12\
+Z\x96)\x89ZJ\x08\xa7R:\x99Q\x83\x10\x03\xea\
+\x00\x03\x1a\x10 \x8c\xc0@\x12\x01\xa3C\xc0`%!\
+\xab\x021\x0c\xdb\xcc\xbb\xdd7=;\xed\x82\xc9\xa9w\
+\xce\xef\x0c\xe7\xfb\xee{\xf7~\xf7\xfb\xbe\xff\xbd\x10\x00\
+@\xfc\x97L\xc8\xc8\xdd\xdd\x9d\xe9\xe6\xe6v\xdc\xd5\xd5\
+\x95\xeb\xe2\xe2\xf2\xd6\xfc\xf9\xf3\xfd\x09\x82\xd0F\xd4\x1e\
+\xea\xe0\xdf>\xe8\xd8+$$\xe4VaA~\x7f}\
+]\xad\xfcbf\xe6\xc0\xf6\xed\xdb\xda\x99Lf\xb6\xbd\
+\xbd\xfd\x064\xd1E\xd4\x89\xa9z0\x80\xf7D\xa5\xe9\
+2h\xdd\x08\xd0\xe8\x03\xf0\xfd.\x80\xfe\x02\xa8\xad\x11\
+\x8dz{{\xdf\xd1\xd6\xd6\x0e@3\x83)\x0b\x00\xd3\
+_\x0f\xcd+\xa1\x86K\xc0\x86\x15\x04\xbc\x14J\x80\xf0\
+\x1cf\xb7q\x19$\xc4\x1d\x1e277\xbf\x80f\xce\
+\xc8\xf4)\x09\x80\xcdf\x7f.\xe1\x11\xc0K`*L\
+LL\xc4\x16\xa6:\x85k8\x86\xa3PE@E\xce\
+f\x85\x8d\x8d\xcd7h\xc6A\x9e\x98\x8a\xd5?\x1d\xb5\
+a\x8dt\xe8\xc6\x22\xb2\x98\x17\xa9\xb0\xb4\xb4\x14\xe3\xf0\
+\xab\xae,\xfb\xda\xd6\x5cS\x10\x0b\x96\x90\xb6\xb6\xb6\xcd\
+8\x16\x85\x18O\xc5\xfe'7\x5cO\x18\x86j]\xe8\
+\xaa\xdd\x0d^\x9eK\xee\xa3\xc3+x\x00\xcbZ\x0a\x9f\
+\x22o\xf2\x9d\xc9y\xf3\xe6\xb5\xa2\xe9V\xc4\xfc\xb1\x07\
+\xe0\xe4\xe4\x14~d\x9b\xd1H~\x02\x01\xf7\x84\x1e\xd0\
+q\xbb\x98\xcc\xcf\xf9h\xa4@pN\xde\xfd\xf5v\xc8\
+\x88\xb3T\x9a\x9a\x9a\xde@\xd3\x17\x10\xd3\x09,\xc8\x8f\
+:\xd4,\x16\xeb\x88\xb5\xb55\x0b\x87f<\xec\x1d\xdd\
+\xdd\xeb\xf5\x12\xa2\xa3t\xee\x1c\xdb>\x83\xec\xaeZ\x0f\
+w\xeb\xe2TtU\xae\x83\xca\x0c\x8e\x12?$A\xbb\
+\x8d\xc8\x9c\x7fp\xfc|XXXi\xdd7U\xb2\xf1\
+\xb1\x11\xb2\xef~\x97\xc2\xce\xce\xee\x13\x9c\xb2\x7fX\x00\
+\xd4\xfd6CVr|\xe6\xdc\xc8\x8f'`\xac\x8c\x01\
+#e&\xa0,\xd5\x04Y\xc5b\xc0,u\xe1\xfc\x96\
+\xbf\xca\x00\xe5844\xb4\xb4\xae\xb6bhdd\x04\
+T\x0c\xcb\xa0I\xfc\xa5\x02\xb7\xae\x06M\x82&\xb2\x13\
+\x1a\xc8\x93FFF+\x22\x02g\x0fvg\xe1\x15,\
+\xa1)\xd3\x81};#d8\xf7\x11\xda8P\x01{\
+xx\xe8R\x8eQ\xbc\xcanT\x97\x0c\xf5\xf7\xf7\xc3\
+/\x0c\xc0\xbdn)\xf9\xda+\x91r\x9f\xc5s\xee\xea\
+\xeb\xebg\xa1}\xc4d\x8e\x84\xf6B7\xab\xb8\xb7^\
+\x9a\xa9\x84\x22t~k\x13\x90\xf2\xdb \xf8l\xdb8\
+jA\xe1\xacY\xb3\x82\xf0\xca\x1eX\xbf6\xac\xa9B\
+\x98?\xd4\xd1\xd1\x01\x0f\xe8\xea\xb8\x03\xd7\x8b.(|\
+\x97\xba\xc8\xd8N\x86\xd4M:\x8bl\xa3.\xdad\x02\
+\x98F\xeds\xb0\xbfI\x91T\x14\x0f\xa3\xa3\xa3*z\
+o\xe7\x92(\xc9\xad\xe1a\xab\xdaE\xd7\x05#R\xa9\
+\x14(Z\xa5\xad\xaa\xdf\x16I\x05\xb9\x7fw\xf80\xcb\
+\xc9D:\xd7XK\x80\xdf\x88E\xc2\x91\xf9\xb4\x8cO\
+\xea\xd1066\xf6\xe5p8\x8d\x83\x83\x83\xa0b\xa0\
+\x1b.\xf3\x92\x94\x99\x99\x99PYY\x09\xf5\xf5\xf5*\
+n6\xd4@\xee\xa5\xc4qgG\x9bNW\xa7'k\
+\xf1\xddD\xfa\xacx\x22&\x8f\xac\x9c\xb8Z\x07GG\
+\xc7\x0f\xbf\xaa\xbc:\xde\xd3\xd3\x03\x5c.\x17bbb\
+\x80\xcf\xe7Crr2\x08r\x04 \x12\xf2\xc9\x177\
+\x05\xca\xed\xe7\x996kjjRR\xfd*u\x90\x11\
+\x1b\xba\x8aN{\x14QZH\x95\xe4\x15\x81\xbe\x8d\xe9\
+\xdc\xb8\xb1\xb4\xb44U\x8a===AOO\x0f\xda\
+\xda\xda\xa0\xa0\xe0*\xbc\x1f\xbfo\x1c\xe5\xb9\xcd\xda\xc2\
+\xa0\x1c_{\x17\xa1*&\x1ba\xd0\x07zRN\xcd\
+\x90\x1dH\xfe\xae->\xb7\x0bR\x9f\x1d\xcc\xbb\x9c\x04\
+\xe9\xe9\xe9\x90\x98\x98\x08g\xcf\x9e\x05\x1e\x8f\x079\xd9\
+9\xd0\xdc\xdc\xac\xa2\xb3\xbd\x89\x0cZ\xe9\xf7\x13nU\
+\x0e}\xcamh\xc1\x99\xf8\xaa\xb1\x06\x04\xa3\xd3OW\
+\xaf\x5c\xdc\x98\x92\x10\xd0\xd3ym\x99\x02\x84\x960\x96\
+\xa3\x09\x82\xd3\xda\x90\xce=\x09\xbc\xcf\x93\xe1\x9d\xd8\x97\
+\x15'\x8e\xeeWfe\x9cQ6\xd4W\xe1\xde\xd7\x81\
+\xf8\xa6\x18~\x1a\xb8\x07'\x8f\xed\x1d\xc4\xbb\x9e\x8c\x9f\
+\xb3\x9c\xd0\xca\xb1\xdba\xa0\xe3\xddH\xf9\xc9\x83K\x7f\
+l\xc8\xf5\x91\x83\xc8\x01:\xd3f\x02\xffM\x02N\xef\
+P'\xfb.Y\xc0\xdd\x14\x02r\x12\xcc\xc0\xdf\xd7M\
+\x862\xdc\x80\x1apm\xee\xdc\xb9\xd5!\xab\xbc\xfa+\
+\x8a>!E\x22\x11Ptu\xfe\x08_^\xbd0\x8a\
+\x8a\x97\xc6`0\xdc\xfe1\x0b\xb8\xda\x08?_\x0fq\
+J\xfc\xa2\x1eY9\x93\x84\xe2\xd9P\x83\xfa\x1f\xbbY\
+\x9d\x0c}J\x7f\xc8\xcb\x9d\xd1\x84m\xd8\xdd\xb6<w\
+R\x91\xa5\x0b\xe7\xf6\x10\xe0\xb7\xc4\xf0\x0e\xbe\xfa\x01}\
+\xb2C\x9c\xec\x18\xf1X\xa8\xaaN\x1d\x8d\x1a.+\xb9\
+\x02\xc5\xc5\xc5 \x91H\xa0\xa5\xb1Z\x89A\xf01\xc8\
+Uh\xa7\xf3\xa7 \xa8\x92\xeb\xe7\xeb.n\xcds\x18\
+\x85\xab\xb3@\xf8\x0e\x01;\xc3\xa7+#\x02\x0dz-\
+\xcc\xf4\xae\xa3\xc99++\xab\x92\xf3o\xb3\x06\xfbJ\
+V\xc0\xc7{\xa7\xc3\xce\xb5:}8\x9e\x82lF\xec\
+\xe8\x8e\xc8\x02\xf1\xc1\xda\x90\x1e\xb0|Qo~\xd6\xbb\
+\xca\xbc\xbc<\x10\x0a\x85\xd0\xfe\x83\x84\x5c\x1d\xe4\xdf\x8e\
+[r\x10m\x8c~\xb7%\xaa\x92\x9ba3\x0c\x97\xd5\
+\xe0\xfc\x01\x032$\xc0\xa0\x13U\xad\x10\xa7\xce\xe0\xef\
+q*\x85'\xa2\x99]\xf2J/(Ob\xc3\xde\x0d\
+\xda\x038\x97\x81\xecC\x98\xbf\xa9h\xea\xb4\xb0\xd8\xe1\
+\x01<\x88\xd9\x10\x1d?\x14&\xcf\xbe|\x01\xb2\xb3\xb3\
+\xa1\xbd\xad\x19\x9e\x8b\x0a\xef\xc5\xf1$\xbat\xff\x12\xc4\
+j\x0e\xbb\x11\xb2\xa7CK\xaa\x07,[h\xd6\x8bN\
+\xaf\xe0\xf0\xeb\x98\xb27\xb0\x03\xe6\xf3\xdf\xb7\xbd?\x5c\
+\xce\x86\xa6\x8c@\xd8\xb5v\xc6\x18\xce\x17\xe1\xfc\x1b\xc8\
+\x02d\xe6\xdf\xd4\x0eJh\x96Q\xd9\xf0\xf7]\xd0\x9b\
+\xf9\xe9~ejj*Hn\xd5A\xec\xe1-\x83(\
+\xdd1t\x91S'\x96{\xb3%C\xd8\xefu\x17F\
+@\xee\x19\xf3\xb15A\x0e\xf7Q\xd3\xbf{\xe6if\
+k\xfd%3\xb9\xbc\x84\x0d\xdf^\x0c\x85\x17\x835H\
+\x96\xa3\x81\x98\xbe\xdb~\x0f\x91Q5z\xbfm\x0d\x0d\
+\x0d\xf7\xa0.\x94F\xef\x08\x18J\xe3\x9e\x06aQ\x0a\
+%\xddT\x1b\xb7\x5c\xf5\x0dgg\xe7\x98\xfd\xebf\x8c\
+\xb7pY\xd0\xfbE\x10\xc8\x85.\xa0\xfcJ\x1f\x94\xd5\
+\x06\xd0\x97\xbf\xfcW\xe7^\xeeO4\xe2\x0bI\xf4\xdd\
+6\x99\xe0\xbd\xd6\xa0\xfb\x84%\xd8\xce\x9d\xc7\xb3\xd6\xb3\
+9r\xa9\x0co\xc5\x178\xf6,bH\x191\xdc\x98\
+f\x89[#f\xca\x0fE\xaa\x01\xef\x10\x03\x04\xb1\xa6\
+*\x92\xa3\xf5\xe0@\x94\x9a\x92v\xfe!\x12\x89XM\
+R\xd1\xa6\xd1\xf2k\xad\xa5\xa5\x15\x81\xaa\x19\x87\x7fG\
+#\xde\x0f\xb2\xa8A\x9f\xe0\xe0\xc5,\x9d\xcf\x9e\x0b\xd6\
+\x95\xecZ\xa7\xd3\x8etl\x0a\xd6\x91\x1a3\x88\x8b8\
+w\x8a\x8e\xd8\x9ax\xf4\xf6[\x83\x96c\xaaop\xa2\
+W\xaf\xfe\xc7I\xeaTs\xe8\x1eo/\xb2\x87\xd6r\
+O:\x95\x8f\xa3\xf7W\xa7\xfdM\xfb\xbbI]z\x8f\
+\xadh\x19\x9d\x8dh=R\x05\xfb?<\x8f\xe5\xbf\xe3\
+\xa9\xe4g/ysp\x22v\x00\x17\x00\x00\x00\x00I\
+END\xaeB`\x82\
+"
+
+qt_resource_name = b"\
+\x00\x06\
+\x07\x03}\xc3\
+\x00i\
+\x00m\x00a\x00g\x00e\x00s\
+\x00\x0c\
+\x00\x19\xf2<\
+\x00e\
+\x00x\x00a\x00m\x00p\x00l\x00e\x00.\x00h\x00t\x00m\x00l\
+\x00\x03\
+\x00\x00}\xfe\
+\x00w\
+\x00i\x00n\
+\x00\x0a\
+\x02k<\x87\
+\x00l\
+\x00o\x00g\x00o\x003\x002\x00.\x00p\x00n\x00g\
+\x00\x03\
+\x00\x00ss\
+\x00m\
+\x00a\x00c\
+\x00\x0b\
+\x07\xc5\x9b\xc7\
+\x00z\
+\x00o\x00o\x00m\x00o\x00u\x00t\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x08h'G\
+\x00t\
+\x00e\x00x\x00t\x00r\x00i\x00g\x00h\x00t\x00.\x00p\x00n\x00g\
+\x00\x0a\
+\x04\x11{\x87\
+\x00z\
+\x00o\x00o\x00m\x00i\x00n\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x0d\xc9;\xe7\
+\x00e\
+\x00d\x00i\x00t\x00p\x00a\x00s\x00t\x00e\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x05h\x0eg\
+\x00f\
+\x00i\x00l\x00e\x00s\x00a\x00v\x00e\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x0fG\x85\x87\
+\x00e\
+\x00x\x00p\x00o\x00r\x00t\x00p\x00d\x00f\x00.\x00p\x00n\x00g\
+\x00\x0e\
+\x030yG\
+\x00t\
+\x00e\x00x\x00t\x00c\x00e\x00n\x00t\x00e\x00r\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x06R\xd9\xe7\
+\x00f\
+\x00i\x00l\x00e\x00p\x00r\x00i\x00n\x00t\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x06\xc8@G\
+\x00e\
+\x00d\x00i\x00t\x00r\x00e\x00d\x00o\x00.\x00p\x00n\x00g\
+\x00\x12\
+\x04\x8eT\xa7\
+\x00t\
+\x00e\x00x\x00t\x00u\x00n\x00d\x00e\x00r\x00c\x00o\x00l\x00o\x00r\x00.\x00p\x00n\
+\x00g\
+\x00\x0c\
+\x04V#g\
+\x00c\
+\x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00.\x00p\x00n\x00g\
+\x00\x0d\
+\x0fZ.'\
+\x00t\
+\x00e\x00x\x00t\x00u\x00n\x00d\x00e\x00r\x00.\x00p\x00n\x00g\
+\x00\x0f\
+\x00\xba)'\
+\x00t\
+\x00e\x00x\x00t\x00j\x00u\x00s\x00t\x00i\x00f\x00y\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x0b!\x0f\x87\
+\x00f\
+\x00i\x00l\x00e\x00o\x00p\x00e\x00n\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x04\x8e\xa1\x07\
+\x00t\
+\x00e\x00x\x00t\x00l\x00e\x00f\x00t\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x09\xc8@\xc7\
+\x00e\
+\x00d\x00i\x00t\x00u\x00n\x00d\x00o\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x0d~\xa2g\
+\x00t\
+\x00e\x00x\x00t\x00b\x00o\x00l\x00d\x00.\x00p\x00n\x00g\
+\x00\x0b\
+\x04\x14R\xc7\
+\x00f\
+\x00i\x00l\x00e\x00n\x00e\x00w\x00.\x00p\x00n\x00g\
+\x00\x14\
+\x0d,\xd1\xc7\
+\x00c\
+\x00h\x00e\x00c\x00k\x00b\x00o\x00x\x00-\x00c\x00h\x00e\x00c\x00k\x00e\x00d\x00.\
+\x00p\x00n\x00g\
+\x00\x16\
+\x0d(\xe1g\
+\x00f\
+\x00o\x00r\x00m\x00a\x00t\x00-\x00i\x00n\x00d\x00e\x00n\x00t\x00-\x00m\x00o\x00r\
+\x00e\x00.\x00p\x00n\x00g\
+\x00\x0c\
+\x0b\x0eB\x07\
+\x00e\
+\x00d\x00i\x00t\x00c\x00o\x00p\x00y\x00.\x00p\x00n\x00g\
+\x00\x16\
+\x07\x06\xe2\xa7\
+\x00f\
+\x00o\x00r\x00m\x00a\x00t\x00-\x00i\x00n\x00d\x00e\x00n\x00t\x00-\x00l\x00e\x00s\
+\x00s\x00.\x00p\x00n\x00g\
+\x00\x0e\
+\x0b\x04]\xe7\
+\x00t\
+\x00e\x00x\x00t\x00i\x00t\x00a\x00l\x00i\x00c\x00.\x00p\x00n\x00g\
+\x00\x0b\
+\x0a\x106\x07\
+\x00e\
+\x00d\x00i\x00t\x00c\x00u\x00t\x00.\x00p\x00n\x00g\
+"
+
+qt_resource_struct = b"\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x01\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00\x12\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00\x03\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00V\x00\x02\x00\x00\x00\x18\x00\x00\x00\x1e\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x000\x00\x02\x00\x00\x00\x18\x00\x00\x00\x06\
+\x00\x00\x00\x00\x00\x00\x00\x00\
+\x00\x00\x00<\x00\x00\x00\x00\x00\x01\x00\x00\x0a2\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x01*\xfa\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\x16\x00\x00\x00\x00\x00\x01\x00\x00\xf9\xea\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\xe5\xe4\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02z\x00\x00\x00\x00\x00\x01\x00\x01B:\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xa0\x00\x00\x00\x00\x00\x01\x00\x01$\x1c\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01v\x00\x00\x00\x00\x00\x01\x00\x01\x09\x14\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02 \x00\x00\x00\x00\x00\x01\x00\x0147\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x01\x00\x00\xf0n\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x018\x00\x00\x00\x00\x00\x01\x00\x00\xfca\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01X\x00\x00\x00\x00\x00\x01\x00\x01\x02\x15\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03\x14\x00\x00\x00\x00\x00\x01\x00\x01R\xe7\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00b\x00\x00\x00\x00\x00\x01\x00\x00\xdem\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00~\x00\x00\x00\x00\x00\x01\x00\x00\xe3;\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02>\x00\x00\x00\x00\x00\x01\x00\x016\xdc\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03h\x00\x00\x00\x00\x00\x01\x00\x01Z\xdd\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03F\x00\x00\x00\x00\x00\x01\x00\x01W\x9c\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\xf6\x00\x00\x00\x00\x00\x01\x00\x01M\xb6\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x01-\xb5\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\xc4\x00\x00\x00\x00\x00\x01\x00\x01I\xd1\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x01E>\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x5c\x00\x00\x00\x00\x00\x01\x00\x01=\xc8\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x00\xea\xa0\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x00\xf5'\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x01'+\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xde\x00\x00\x00\x00\x00\x01\x00\x00\x9d\x07\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\x16\x00\x00\x00\x00\x00\x01\x00\x00e\xc6\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\x9e\x00\x00\x00\x00\x00\x01\x00\x00\x1b\xbc\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02z\x00\x00\x00\x00\x00\x01\x00\x00\xbcl\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xa0\x00\x00\x00\x00\x00\x01\x00\x00\x95U\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01v\x00\x00\x00\x00\x00\x01\x00\x00zM\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02 \x00\x00\x00\x00\x00\x01\x00\x00\xaap\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xd8\x00\x00\x00\x00\x00\x01\x00\x00)\xd6\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x018\x00\x00\x00\x00\x00\x01\x00\x00kF\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01X\x00\x00\x00\x00\x00\x01\x00\x00sq\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03\x14\x00\x00\x00\x00\x00\x01\x00\x00\xcf<\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00b\x00\x00\x00\x00\x00\x01\x00\x00\x0f\xb8\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00~\x00\x00\x00\x00\x00\x01\x00\x00\x16:\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02>\x00\x00\x00\x00\x00\x01\x00\x00\xafG\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03h\x00\x00\x00\x00\x00\x01\x00\x00\xd8\x81\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x03F\x00\x00\x00\x00\x00\x01\x00\x00\xd3\xf1\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\xf6\x00\x00\x00\x00\x00\x01\x00\x00\xc9|\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x02\x00\x00\x00\x00\x00\x01\x00\x00\xa1\xf4\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\xc4\x00\x00\x00\x00\x00\x01\x00\x00\xc5\x97\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x96\x00\x00\x00\x00\x00\x01\x00\x00\xc1\x04\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x02\x5c\x00\x00\x00\x00\x00\x01\x00\x00\xb6\x1d\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xb8\x00\x00\x00\x00\x00\x01\x00\x00\x22`\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x00\xf6\x00\x00\x00\x00\x00\x01\x00\x004e\
+\x00\x00\x01z\xe7\xee'\x0d\
+\x00\x00\x01\xbe\x00\x00\x00\x00\x00\x01\x00\x00\x98d\
+\x00\x00\x01z\xe7\xee'\x0d\
+"
+
+def qInitResources():
+ QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+def qCleanupResources():
+ QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data)
+
+qInitResources()
diff --git a/examples/widgets/richtext/textobject/doc/textobject.png b/examples/widgets/richtext/textobject/doc/textobject.png
new file mode 100644
index 000000000..ebd2e6f7b
--- /dev/null
+++ b/examples/widgets/richtext/textobject/doc/textobject.png
Binary files differ
diff --git a/examples/widgets/richtext/textobject/doc/textobject.rst b/examples/widgets/richtext/textobject/doc/textobject.rst
new file mode 100644
index 000000000..d5a1e253a
--- /dev/null
+++ b/examples/widgets/richtext/textobject/doc/textobject.rst
@@ -0,0 +1,31 @@
+TextObject Example
+==================
+
+A QTextDocument consists of a hierarchy of elements, such as text blocks and
+frames. A text object describes the structure or format of one or more of these
+elements. For instance, images imported from HTML are implemented using text
+objects. Text objects are used by the document's layout to lay out and render
+(paint) the document. Each object knows how to paint the elements they govern,
+and calculates their size.
+
+To be able to insert an SVG image into a text document, we create a text
+object, and implement painting for that object. This object can then be set on
+a QTextCharFormat. We also register the text object with the layout of the
+document, enabling it to draw QTextCharFormats governed by our text object. We
+can summarize the procedure with the following steps:
+
+ * Implement the text object.
+ * Register the text object with the layout of the text document.
+ * Set the text object on a QTextCharFormat.
+ * Insert a QChar::ObjectReplacementCharacter with that text char format into
+ the document.
+
+The example consists of the following classes:
+
+ * SvgTextObject implements the text object.
+ * Window shows a QTextEdit into which SVG images can be inserted.
+
+
+.. image:: textobject.png
+ :width: 400
+ :alt: TextObject Screenshot
diff --git a/examples/widgets/richtext/textobject/textobject.py b/examples/widgets/richtext/textobject/textobject.py
index b828ea3d0..9ab7bf8ae 100644
--- a/examples/widgets/richtext/textobject/textobject.py
+++ b/examples/widgets/richtext/textobject/textobject.py
@@ -1,129 +1,104 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/richtext/textobject example from Qt v5.x"""
-
-from PySide2 import QtCore, QtGui, QtWidgets, QtSvg
-
-
-class SvgTextObject(QtCore.QObject, QtGui.QTextObjectInterface):
+"""PySide6 port of the widgets/richtext/textobject example from Qt v5.x"""
+
+import os
+from pathlib import Path
+import sys
+
+from PySide6.QtCore import QFile, QIODevice, QSizeF, Slot
+from PySide6.QtGui import (QTextCharFormat, QTextFormat, QPyTextObject)
+from PySide6.QtWidgets import (QApplication, QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
+from PySide6.QtSvg import QSvgRenderer
+
+
+SVG_TEXT_FORMAT = QTextFormat.UserObject + 1
+
+
+SVG_DATA = 1
+
+
+class SvgTextObject(QPyTextObject):
+ def __init__(self, parent=None):
+ super().__init__(parent)
def intrinsicSize(self, doc, posInDocument, format):
- renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray())
+ renderer = QSvgRenderer(format.property(SVG_DATA))
size = renderer.defaultSize()
if size.height() > 25:
size *= 25.0 / size.height()
- return QtCore.QSizeF(size)
+ return QSizeF(size)
def drawObject(self, painter, rect, doc, posInDocument, format):
- renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray())
+ renderer = QSvgRenderer(format.property(SVG_DATA))
renderer.render(painter, rect)
-class Window(QtWidgets.QWidget):
-
- SvgTextFormat = QtGui.QTextFormat.UserObject + 1
-
- SvgData = 1
+class Window(QWidget):
def __init__(self):
- super(Window, self).__init__()
+ super().__init__()
- self.setupGui()
- self.setupTextObject()
+ self.setup_gui()
+ self.setup_text_object()
self.setWindowTitle(self.tr("Text Object Example"))
- def insertTextObject(self):
- fileName = self.fileNameLineEdit.text()
- file = QtCore.QFile(fileName)
+ @Slot()
+ def insert_text_object(self):
+ file_name = self._file_name_line_edit.text()
+ file = QFile(file_name)
- if not file.open(QtCore.QIODevice.ReadOnly):
- QtWidgets.QMessageBox.warning(self, self.tr("Error Opening File"),
- self.tr("Could not open '%1'").arg(fileName))
+ if not file.open(QIODevice.ReadOnly):
+ reason = file.errorString()
+ message = f"Could not open '{file_name}': {reason}"
+ QMessageBox.warning(self, "Error Opening File", message)
- svgData = file.readAll()
+ svg_data = file.readAll()
- svgCharFormat = QtGui.QTextCharFormat()
- svgCharFormat.setObjectType(Window.SvgTextFormat)
- svgCharFormat.setProperty(Window.SvgData, svgData)
+ svg_char_format = QTextCharFormat()
+ svg_char_format.setObjectType(SVG_TEXT_FORMAT)
+ svg_char_format.setProperty(SVG_DATA, svg_data)
- cursor = self.textEdit.textCursor()
- cursor.insertText(u"\uFFFD", svgCharFormat)
- self.textEdit.setTextCursor(cursor)
+ cursor = self._text_edit.textCursor()
+ cursor.insertText(chr(0xfffc), svg_char_format)
+ self._text_edit.setTextCursor(cursor)
- def setupTextObject(self):
- svgInterface = SvgTextObject(self)
- self.textEdit.document().documentLayout().registerHandler(Window.SvgTextFormat, svgInterface)
+ def setup_text_object(self):
+ svg_interface = SvgTextObject(self)
+ doc_layout = self._text_edit.document().documentLayout()
+ doc_layout.registerHandler(SVG_TEXT_FORMAT, svg_interface)
- def setupGui(self):
- fileNameLabel = QtWidgets.QLabel(self.tr("Svg File Name:"))
- self.fileNameLineEdit = QtWidgets.QLineEdit()
- insertTextObjectButton = QtWidgets.QPushButton(self.tr("Insert Image"))
+ def setup_gui(self):
+ file_name_label = QLabel(self.tr("Svg File Name:"))
+ self._file_name_line_edit = QLineEdit()
+ self._file_name_line_edit.setClearButtonEnabled(True)
+ insert_text_object_button = QPushButton(self.tr("Insert Image"))
- self.fileNameLineEdit.setText('./files/heart.svg')
- QtCore.QObject.connect(insertTextObjectButton, QtCore.SIGNAL('clicked()'), self.insertTextObject)
+ file = os.fspath(Path(__file__).resolve().parent / 'files' / 'heart.svg')
+ self._file_name_line_edit.setText(file)
+ insert_text_object_button.clicked.connect(self.insert_text_object)
- bottomLayout = QtWidgets.QHBoxLayout()
- bottomLayout.addWidget(fileNameLabel)
- bottomLayout.addWidget(self.fileNameLineEdit)
- bottomLayout.addWidget(insertTextObjectButton)
+ bottom_layout = QHBoxLayout()
+ bottom_layout.addWidget(file_name_label)
+ bottom_layout.addWidget(self._file_name_line_edit)
+ bottom_layout.addWidget(insert_text_object_button)
- self.textEdit = QtWidgets.QTextEdit()
+ self._text_edit = QTextEdit()
- mainLayout = QtWidgets.QVBoxLayout()
- mainLayout.addWidget(self.textEdit)
- mainLayout.addLayout(bottomLayout)
-
- self.setLayout(mainLayout)
+ main_layout = QVBoxLayout(self)
+ main_layout.addWidget(self._text_edit)
+ main_layout.addLayout(bottom_layout)
if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
window = Window()
window.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/state-machine/eventtrans.py b/examples/widgets/state-machine/eventtrans.py
deleted file mode 100644
index 183f1178e..000000000
--- a/examples/widgets/state-machine/eventtrans.py
+++ /dev/null
@@ -1,92 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtCore import *
-
-class MainWindow(QMainWindow):
- def __init__(self):
- super(MainWindow, self).__init__()
- button = QPushButton(self)
- button.setGeometry(QRect(100, 100, 100, 100))
-
- machine = QStateMachine(self)
- s1 = QState()
- s1.assignProperty(button, 'text', 'Outside')
- s2 = QState()
- s2.assignProperty(button, 'text', 'Inside')
-
- enterTransition = QEventTransition(button, QEvent.Enter)
- enterTransition.setTargetState(s2)
- s1.addTransition(enterTransition)
-
- leaveTransition = QEventTransition(button, QEvent.Leave)
- leaveTransition.setTargetState(s1)
- s2.addTransition(leaveTransition)
-
- s3 = QState()
- s3.assignProperty(button, 'text', 'Pressing...')
-
- pressTransition = QEventTransition(button, QEvent.MouseButtonPress)
- pressTransition.setTargetState(s3)
- s2.addTransition(pressTransition)
-
- releaseTransition = QEventTransition(button, QEvent.MouseButtonRelease)
- releaseTransition.setTargetState(s2)
- s3.addTransition(releaseTransition)
-
- machine.addState(s1)
- machine.addState(s2)
- machine.addState(s3)
-
- machine.setInitialState(s1)
- machine.start()
-
- self.setCentralWidget(button)
- self.show()
-
-if __name__ == '__main__':
- import sys
-
- app = QApplication(sys.argv)
- mainWin = MainWindow()
- sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/factstates.py b/examples/widgets/state-machine/factstates.py
deleted file mode 100644
index bd71b204d..000000000
--- a/examples/widgets/state-machine/factstates.py
+++ /dev/null
@@ -1,111 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtCore import *
-
-class Factorial(QObject):
- xChanged = Signal(int)
- def __init__(self):
- super(Factorial, self).__init__()
- self.xval = -1
- self.facval = 1
- def getX(self):
- return self.xval
- def setX(self, x):
- if self.xval == x:
- return
- self.xval = x
- self.xChanged.emit(x)
- x = Property(int, getX, setX)
- def getFact(self):
- return self.facval
- def setFact(self, fac):
- self.facval = fac
- fac = Property(int, getFact, setFact)
-
-class FactorialLoopTransition(QSignalTransition):
- def __init__(self, fact):
- super(FactorialLoopTransition, self).__init__(fact, SIGNAL('xChanged(int)'))
- self.fact = fact
- def eventTest(self, e):
- if not super(FactorialLoopTransition, self).eventTest(e):
- return False
- return e.arguments()[0] > 1
- def onTransition(self, e):
- x = e.arguments()[0]
- fac = self.fact.fac
- self.fact.fac = x * fac
- self.fact.x = x - 1
-
-class FactorialDoneTransition(QSignalTransition):
- def __init__(self, fact):
- super(FactorialDoneTransition, self).__init__(fact, SIGNAL('xChanged(int)'))
- self.fact = fact
- def eventTest(self, e):
- if not super(FactorialDoneTransition, self).eventTest(e):
- return False
- return e.arguments()[0] <= 1
- def onTransition(self, e):
- print(self.fact.fac)
-
-if __name__ == '__main__':
- import sys
- app = QCoreApplication(sys.argv)
- factorial = Factorial()
- machine = QStateMachine()
-
- compute = QState(machine)
- compute.assignProperty(factorial, 'fac', 1)
- compute.assignProperty(factorial, 'x', 6)
- compute.addTransition(FactorialLoopTransition(factorial))
-
- done = QFinalState(machine)
- doneTransition = FactorialDoneTransition(factorial)
- doneTransition.setTargetState(done)
- compute.addTransition(doneTransition)
-
- machine.setInitialState(compute)
- machine.finished.connect(app.quit)
- machine.start()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/pingpong.py b/examples/widgets/state-machine/pingpong.py
deleted file mode 100644
index 84c5cab2a..000000000
--- a/examples/widgets/state-machine/pingpong.py
+++ /dev/null
@@ -1,96 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtCore import *
-
-class PingEvent(QEvent):
- def __init__(self):
- super(PingEvent, self).__init__(QEvent.Type(QEvent.User+2))
-class PongEvent(QEvent):
- def __init__(self):
- super(PongEvent, self).__init__(QEvent.Type(QEvent.User+3))
-
-class Pinger(QState):
- def __init__(self, parent):
- super(Pinger, self).__init__(parent)
- def onEntry(self, e):
- self.p = PingEvent()
- self.machine().postEvent(self.p)
- print('ping?')
-
-class PongTransition(QAbstractTransition):
- def eventTest(self, e):
- return e.type() == QEvent.User+3
- def onTransition(self, e):
- self.p = PingEvent()
- machine.postDelayedEvent(self.p, 500)
- print('ping?')
-class PingTransition(QAbstractTransition):
- def eventTest(self, e):
- return e.type() == QEvent.User+2
- def onTransition(self, e):
- self.p = PongEvent()
- machine.postDelayedEvent(self.p, 500)
- print('pong!')
-
-if __name__ == '__main__':
- import sys
- app = QCoreApplication(sys.argv)
-
- machine = QStateMachine()
- group = QState(QState.ParallelStates)
- group.setObjectName('group')
-
- pinger = Pinger(group)
- pinger.setObjectName('pinger')
- pinger.addTransition(PongTransition())
-
- ponger = QState(group)
- ponger.setObjectName('ponger')
- ponger.addTransition(PingTransition())
-
- machine.addState(group)
- machine.setInitialState(group)
- machine.start()
-
- sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/rogue.py b/examples/widgets/state-machine/rogue.py
deleted file mode 100644
index 755b847ac..000000000
--- a/examples/widgets/state-machine/rogue.py
+++ /dev/null
@@ -1,202 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtGui import *
-from PySide2.QtCore import *
-
-class MovementTransition(QEventTransition):
- def __init__(self, window):
- super(MovementTransition, self).__init__(window, QEvent.KeyPress)
- self.window = window
- def eventTest(self, event):
- if event.type() == QEvent.StateMachineWrapped and \
- event.event().type() == QEvent.KeyPress:
- key = event.event().key()
- return key == Qt.Key_2 or key == Qt.Key_8 or \
- key == Qt.Key_6 or key == Qt.Key_4
- return False
- def onTransition(self, event):
- key = event.event().key()
- if key == Qt.Key_4:
- self.window.movePlayer(self.window.Left)
- if key == Qt.Key_8:
- self.window.movePlayer(self.window.Up)
- if key == Qt.Key_6:
- self.window.movePlayer(self.window.Right)
- if key == Qt.Key_2:
- self.window.movePlayer(self.window.Down)
-
-class Custom(QState):
- def __init__(self, parent, mw):
- super(Custom, self).__init__(parent)
- self.mw = mw
-
- def onEntry(self, e):
- print(self.mw.status)
-
-class MainWindow(QMainWindow):
- def __init__(self):
- super(MainWindow, self).__init__()
- self.pX = 5
- self.pY = 5
- self.width = 35
- self.height = 20
- self.statusStr = ''
-
- database = QFontDatabase()
- font = QFont()
- if 'Monospace' in database.families():
- font = QFont('Monospace', 12)
- else:
- for family in database.families():
- if database.isFixedPitch(family):
- font = QFont(family, 12)
- self.setFont(font)
-
- self.setupMap()
- self.buildMachine()
- self.show()
- def setupMap(self):
- self.map = []
- qsrand(QTime(0, 0, 0).secsTo(QTime.currentTime()))
- for x in range(self.width):
- column = []
- for y in range(self.height):
- if x == 0 or x == self.width - 1 or y == 0 or \
- y == self.height - 1 or qrand() % 40 == 0:
- column.append('#')
- else:
- column.append('.')
- self.map.append(column)
-
- def buildMachine(self):
- machine = QStateMachine(self)
-
- inputState = Custom(machine, self)
- # this line sets the status
- self.status = 'hello!'
- # however this line does not
- inputState.assignProperty(self, 'status', 'Move the rogue with 2, 4, 6, and 8')
-
- machine.setInitialState(inputState)
- machine.start()
-
- transition = MovementTransition(self)
- inputState.addTransition(transition)
-
- quitState = QState(machine)
- quitState.assignProperty(self, 'status', 'Really quit(y/n)?')
-
- yesTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_Y)
- self.finalState = QFinalState(machine)
- yesTransition.setTargetState(self.finalState)
- quitState.addTransition(yesTransition)
-
- noTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_N)
- noTransition.setTargetState(inputState)
- quitState.addTransition(noTransition)
-
- quitTransition = QKeyEventTransition(self, QEvent.KeyPress, Qt.Key_Q)
- quitTransition.setTargetState(quitState)
- inputState.addTransition(quitTransition)
-
- machine.setInitialState(inputState)
- machine.finished.connect(qApp.quit)
- machine.start()
-
- def sizeHint(self):
- metrics = QFontMetrics(self.font())
- return QSize(metrics.width('X') * self.width, metrics.height() * (self.height + 1))
- def paintEvent(self, event):
- metrics = QFontMetrics(self.font())
- painter = QPainter(self)
- fontHeight = metrics.height()
- fontWidth = metrics.width('X')
-
- painter.fillRect(self.rect(), Qt.black)
- painter.setPen(Qt.white)
-
- yPos = fontHeight
- painter.drawText(QPoint(0, yPos), self.status)
- for y in range(self.height):
- yPos += fontHeight
- xPos = 0
- for x in range(self.width):
- if y == self.pY and x == self.pX:
- xPos += fontWidth
- continue
- painter.drawText(QPoint(xPos, yPos), self.map[x][y])
- xPos += fontWidth
- painter.drawText(QPoint(self.pX * fontWidth, (self.pY + 2) * fontHeight), '@')
- def movePlayer(self, direction):
- if direction == self.Left:
- if self.map[self.pX - 1][self.pY] != '#':
- self.pX -= 1
- elif direction == self.Right:
- if self.map[self.pX + 1][self.pY] != '#':
- self.pX += 1
- elif direction == self.Up:
- if self.map[self.pX][self.pY - 1] != '#':
- self.pY -= 1
- elif direction == self.Down:
- if self.map[self.pX][self.pY + 1] != '#':
- self.pY += 1
- self.repaint()
- def getStatus(self):
- return self.statusStr
- def setStatus(self, status):
- self.statusStr = status
- self.repaint()
- status = Property(str, getStatus, setStatus)
- Up = 0
- Down = 1
- Left = 2
- Right = 3
- Width = 35
- Height = 20
-
-if __name__ == '__main__':
- import sys
- app = QApplication(sys.argv)
- mainWin = MainWindow()
- sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/state-machine.pyproject b/examples/widgets/state-machine/state-machine.pyproject
deleted file mode 100644
index dafb204c8..000000000
--- a/examples/widgets/state-machine/state-machine.pyproject
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "files": ["pingpong.py", "trafficlight.py", "twowaybutton.py",
- "eventtrans.py", "rogue.py", "factstates.py"]
-}
diff --git a/examples/widgets/state-machine/trafficlight.py b/examples/widgets/state-machine/trafficlight.py
deleted file mode 100644
index 3be9b457f..000000000
--- a/examples/widgets/state-machine/trafficlight.py
+++ /dev/null
@@ -1,139 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtGui import *
-from PySide2.QtCore import *
-
-class LightWidget(QWidget):
- def __init__(self, color):
- super(LightWidget, self).__init__()
- self.color = color
- self.onVal = False
- def isOn(self):
- return self.onVal
- def setOn(self, on):
- if self.onVal == on:
- return
- self.onVal = on
- self.update()
- @Slot()
- def turnOff(self):
- self.setOn(False)
- @Slot()
- def turnOn(self):
- self.setOn(True)
- def paintEvent(self, e):
- if not self.onVal:
- return
- painter = QPainter(self)
- painter.setRenderHint(QPainter.Antialiasing)
- painter.setBrush(self.color)
- painter.drawEllipse(0, 0, self.width(), self.height())
-
- on = Property(bool, isOn, setOn)
-
-class TrafficLightWidget(QWidget):
- def __init__(self):
- super(TrafficLightWidget, self).__init__()
- vbox = QVBoxLayout(self)
- self.redLight = LightWidget(Qt.red)
- vbox.addWidget(self.redLight)
- self.yellowLight = LightWidget(Qt.yellow)
- vbox.addWidget(self.yellowLight)
- self.greenLight = LightWidget(Qt.green)
- vbox.addWidget(self.greenLight)
- pal = QPalette()
- pal.setColor(QPalette.Background, Qt.black)
- self.setPalette(pal)
- self.setAutoFillBackground(True)
-
-def createLightState(light, duration, parent=None):
- lightState = QState(parent)
- timer = QTimer(lightState)
- timer.setInterval(duration)
- timer.setSingleShot(True)
- timing = QState(lightState)
- timing.entered.connect(light.turnOn)
- timing.entered.connect(timer.start)
- timing.exited.connect(light.turnOff)
- done = QFinalState(lightState)
- timing.addTransition(timer, SIGNAL('timeout()'), done)
- lightState.setInitialState(timing)
- return lightState
-
-class TrafficLight(QWidget):
- def __init__(self):
- super(TrafficLight, self).__init__()
- vbox = QVBoxLayout(self)
- widget = TrafficLightWidget()
- vbox.addWidget(widget)
- vbox.setContentsMargins(0, 0, 0, 0)
-
- machine = QStateMachine(self)
- redGoingYellow = createLightState(widget.redLight, 1000)
- redGoingYellow.setObjectName('redGoingYellow')
- yellowGoingGreen = createLightState(widget.redLight, 1000)
- yellowGoingGreen.setObjectName('redGoingYellow')
- redGoingYellow.addTransition(redGoingYellow, SIGNAL('finished()'), yellowGoingGreen)
- greenGoingYellow = createLightState(widget.yellowLight, 3000)
- greenGoingYellow.setObjectName('redGoingYellow')
- yellowGoingGreen.addTransition(yellowGoingGreen, SIGNAL('finished()'), greenGoingYellow)
- yellowGoingRed = createLightState(widget.greenLight, 1000)
- yellowGoingRed.setObjectName('redGoingYellow')
- greenGoingYellow.addTransition(greenGoingYellow, SIGNAL('finished()'), yellowGoingRed)
- yellowGoingRed.addTransition(yellowGoingRed, SIGNAL('finished()'), redGoingYellow)
-
- machine.addState(redGoingYellow)
- machine.addState(yellowGoingGreen)
- machine.addState(greenGoingYellow)
- machine.addState(yellowGoingRed)
- machine.setInitialState(redGoingYellow)
- machine.start()
-
-if __name__ == '__main__':
- import sys
- app = QApplication(sys.argv)
- widget = TrafficLight()
- widget.resize(110, 300)
- widget.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/state-machine/twowaybutton.py b/examples/widgets/state-machine/twowaybutton.py
deleted file mode 100644
index 27ed58e4d..000000000
--- a/examples/widgets/state-machine/twowaybutton.py
+++ /dev/null
@@ -1,70 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2010 velociraptor Genjix <aphidia@hotmail.com>
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtWidgets import *
-from PySide2.QtCore import *
-
-if __name__ == '__main__':
- import sys
- app = QApplication(sys.argv)
- button = QPushButton()
- machine = QStateMachine()
-
- off = QState()
- off.assignProperty(button, 'text', 'Off')
- off.setObjectName('off')
-
- on = QState()
- on.setObjectName('on')
- on.assignProperty(button, 'text', 'On')
-
- off.addTransition(button, SIGNAL('clicked()'), on)
- # Let's use the new style signals just for the kicks.
- on.addTransition(button.clicked, off)
-
- machine.addState(off)
- machine.addState(on)
- machine.setInitialState(off)
- machine.start()
- button.resize(100, 50)
- button.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/systray/main.py b/examples/widgets/systray/main.py
deleted file mode 100644
index 4fad002a6..000000000
--- a/examples/widgets/systray/main.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2020 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import sys
-
-from PySide2.QtWidgets import QApplication, QMessageBox, QSystemTrayIcon
-
-from window import Window
-
-if __name__ == "__main__":
- app = QApplication()
-
- if not QSystemTrayIcon.isSystemTrayAvailable():
- QMessageBox.critical(None, "Systray", "I couldn't detect any system tray on this system.")
- sys.exit(1)
-
- QApplication.setQuitOnLastWindowClosed(False)
-
- window = Window()
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/systray/window.py b/examples/widgets/systray/window.py
deleted file mode 100644
index ca65f04e1..000000000
--- a/examples/widgets/systray/window.py
+++ /dev/null
@@ -1,273 +0,0 @@
-#############################################################################
-##
-## Copyright (C) 2020 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2.QtCore import Slot
-from PySide2.QtGui import QIcon
-from PySide2.QtWidgets import (QAction, QCheckBox, QComboBox, QDialog,
- QGridLayout, QGroupBox, QHBoxLayout, QLabel,
- QLineEdit, QMenu, QMessageBox, QPushButton,
- QSpinBox, QStyle, QSystemTrayIcon, QTextEdit,
- QVBoxLayout)
-
-import rc_systray
-
-
-class Window(QDialog):
- def __init__(self, parent=None):
- super(Window, self).__init__(parent)
-
- self.iconGroupBox = QGroupBox()
- self.iconLabel = QLabel()
- self.iconComboBox = QComboBox()
- self.showIconCheckBox = QCheckBox()
-
- self.messageGroupBox = QGroupBox()
- self.typeLabel = QLabel()
- self.durationLabel = QLabel()
- self.durationWarningLabel = QLabel()
- self.titleLabel = QLabel()
- self.bodyLabel = QLabel()
-
- self.typeComboBox = QComboBox()
- self.durationSpinBox = QSpinBox()
- self.titleEdit = QLineEdit()
- self.bodyEdit = QTextEdit()
- self.showMessageButton = QPushButton()
-
- self.minimizeAction = QAction()
- self.maximizeAction = QAction()
- self.restoreAction = QAction()
- self.quitAction = QAction()
-
- self.trayIcon = QSystemTrayIcon()
- self.trayIconMenu = QMenu()
-
- self.createIconGroupBox()
- self.createMessageGroupBox()
-
- self.iconLabel.setMinimumWidth(self.durationLabel.sizeHint().width())
-
- self.createActions()
- self.createTrayIcon()
-
- self.showMessageButton.clicked.connect(self.showMessage)
- self.showIconCheckBox.toggled.connect(self.trayIcon.setVisible)
- self.iconComboBox.currentIndexChanged.connect(self.setIcon)
- self.trayIcon.messageClicked.connect(self.messageClicked)
- self.trayIcon.activated.connect(self.iconActivated)
-
- self.mainLayout = QVBoxLayout()
- self.mainLayout.addWidget(self.iconGroupBox)
- self.mainLayout.addWidget(self.messageGroupBox)
- self.setLayout(self.mainLayout)
-
- self.iconComboBox.setCurrentIndex(1)
- self.trayIcon.show()
-
- self.setWindowTitle("Systray")
- self.resize(400, 300)
-
- def setVisible(self, visible):
- self.minimizeAction.setEnabled(visible)
- self.maximizeAction.setEnabled(not self.isMaximized())
- self.restoreAction.setEnabled(self.isMaximized() or not visible)
- super().setVisible(visible)
-
- def closeEvent(self, event):
- if not event.spontaneous() or not self.isVisible():
- return
- if self.trayIcon.isVisible():
- QMessageBox.information(self, "Systray",
- "The program will keep running in the system tray. "
- "To terminate the program, choose <b>Quit</b> in the context "
- "menu of the system tray entry.")
- self.hide()
- event.ignore()
-
- @Slot(int)
- def setIcon(self, index):
- icon = self.iconComboBox.itemIcon(index)
- self.trayIcon.setIcon(icon)
- self.setWindowIcon(icon)
- self.trayIcon.setToolTip(self.iconComboBox.itemText(index))
-
- @Slot(str)
- def iconActivated(self, reason):
- if reason == QSystemTrayIcon.Trigger:
- pass
- if reason == QSystemTrayIcon.DoubleClick:
- self.iconComboBox.setCurrentIndex(
- (self.iconComboBox.currentIndex() + 1) % self.iconComboBox.count()
- )
- if reason == QSystemTrayIcon.MiddleClick:
- self.showMessage()
-
- @Slot()
- def showMessage(self):
- self.showIconCheckBox.setChecked(True)
- selectedIcon = self.typeComboBox.itemData(self.typeComboBox.currentIndex())
- msgIcon = QSystemTrayIcon.MessageIcon(selectedIcon)
-
- if selectedIcon == -1: # custom icon
- icon = QIcon(self.iconComboBox.itemIcon(self.iconComboBox.currentIndex()))
- self.trayIcon.showMessage(
- self.titleEdit.text(),
- self.bodyEdit.toPlainText(),
- icon,
- self.durationSpinBox.value() * 1000,
- )
- else:
- self.trayIcon.showMessage(
- self.titleEdit.text(),
- self.bodyEdit.toPlainText(),
- msgIcon,
- self.durationSpinBox.value() * 1000,
- )
-
- @Slot()
- def messageClicked(self):
- QMessageBox.information(None, "Systray",
- "Sorry, I already gave what help I could.\n"
- "Maybe you should try asking a human?")
-
- def createIconGroupBox(self):
- self.iconGroupBox = QGroupBox("Tray Icon")
-
- self.iconLabel = QLabel("Icon:")
-
- self.iconComboBox = QComboBox()
- self.iconComboBox.addItem(QIcon(":/images/bad.png"), "Bad")
- self.iconComboBox.addItem(QIcon(":/images/heart.png"), "Heart")
- self.iconComboBox.addItem(QIcon(":/images/trash.png"), "Trash")
-
- self.showIconCheckBox = QCheckBox("Show icon")
- self.showIconCheckBox.setChecked(True)
-
- iconLayout = QHBoxLayout()
- iconLayout.addWidget(self.iconLabel)
- iconLayout.addWidget(self.iconComboBox)
- iconLayout.addStretch()
- iconLayout.addWidget(self.showIconCheckBox)
- self.iconGroupBox.setLayout(iconLayout)
-
- def createMessageGroupBox(self):
- self.messageGroupBox = QGroupBox("Balloon Message")
-
- self.typeLabel = QLabel("Type:")
-
- self.typeComboBox = QComboBox()
- self.typeComboBox.addItem("None", QSystemTrayIcon.NoIcon)
- self.typeComboBox.addItem(
- self.style().standardIcon(QStyle.SP_MessageBoxInformation),
- "Information",
- QSystemTrayIcon.Information,
- )
- self.typeComboBox.addItem(
- self.style().standardIcon(QStyle.SP_MessageBoxWarning),
- "Warning",
- QSystemTrayIcon.Warning,
- )
- self.typeComboBox.addItem(
- self.style().standardIcon(QStyle.SP_MessageBoxCritical),
- "Critical",
- QSystemTrayIcon.Critical,
- )
- self.typeComboBox.addItem(QIcon(), "Custom icon", -1)
- self.typeComboBox.setCurrentIndex(1)
-
- self.durationLabel = QLabel("Duration:")
-
- self.durationSpinBox = QSpinBox()
- self.durationSpinBox.setRange(5, 60)
- self.durationSpinBox.setSuffix(" s")
- self.durationSpinBox.setValue(15)
-
- self.durationWarningLabel = QLabel("(some systems might ignore this hint)")
- self.durationWarningLabel.setIndent(10)
-
- self.titleLabel = QLabel("Title:")
- self.titleEdit = QLineEdit("Cannot connect to network")
- self.bodyLabel = QLabel("Body:")
-
- self.bodyEdit = QTextEdit()
- self.bodyEdit.setPlainText("Don't believe me. Honestly, I don't have a clue."
- "\nClick this balloon for details.")
-
- self.showMessageButton = QPushButton("Show Message")
- self.showMessageButton.setDefault(True)
-
- messageLayout = QGridLayout()
- messageLayout.addWidget(self.typeLabel, 0, 0)
- messageLayout.addWidget(self.typeComboBox, 0, 1, 1, 2)
- messageLayout.addWidget(self.durationLabel, 1, 0)
- messageLayout.addWidget(self.durationSpinBox, 1, 1)
- messageLayout.addWidget(self.durationWarningLabel, 1, 2, 1, 3)
- messageLayout.addWidget(self.titleLabel, 2, 0)
- messageLayout.addWidget(self.titleEdit, 2, 1, 1, 4)
- messageLayout.addWidget(self.bodyLabel, 3, 0)
- messageLayout.addWidget(self.bodyEdit, 3, 1, 2, 4)
- messageLayout.addWidget(self.showMessageButton, 5, 4)
- messageLayout.setColumnStretch(3, 1)
- messageLayout.setRowStretch(4, 1)
- self.messageGroupBox.setLayout(messageLayout)
-
- def createActions(self):
- self.minimizeAction = QAction("Minimize", self)
- self.minimizeAction.triggered.connect(self.hide)
-
- self.maximizeAction = QAction("Maximize", self)
- self.maximizeAction.triggered.connect(self.showMaximized)
-
- self.restoreAction = QAction("Restore", self)
- self.restoreAction.triggered.connect(self.showNormal)
-
- self.quitAction = QAction("Quit", self)
- self.quitAction.triggered.connect(qApp.quit)
-
- def createTrayIcon(self):
- self.trayIconMenu = QMenu(self)
- self.trayIconMenu.addAction(self.minimizeAction)
- self.trayIconMenu.addAction(self.maximizeAction)
- self.trayIconMenu.addAction(self.restoreAction)
- self.trayIconMenu.addSeparator()
- self.trayIconMenu.addAction(self.quitAction)
-
- self.trayIcon = QSystemTrayIcon(self)
- self.trayIcon.setContextMenu(self.trayIconMenu)
diff --git a/examples/widgets/thread_signals/thread_signals.py b/examples/widgets/thread_signals/thread_signals.py
new file mode 100644
index 000000000..ae8e1ba72
--- /dev/null
+++ b/examples/widgets/thread_signals/thread_signals.py
@@ -0,0 +1,62 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from PySide6.QtCore import QObject, QThread, Signal, Slot
+from PySide6.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
+
+
+# Create a basic window with a layout and a button
+class MainForm(QWidget):
+ def __init__(self):
+ super().__init__()
+ self.setWindowTitle("My Form")
+ self.layout = QVBoxLayout()
+ self.button = QPushButton("Click me!")
+ self.button.clicked.connect(self.start_thread)
+ self.layout.addWidget(self.button)
+ self.setLayout(self.layout)
+
+ # Instantiate and start a new thread
+ def start_thread(self):
+ instanced_thread = WorkerThread(self)
+ instanced_thread.start()
+
+ # Create the Slots that will receive signals
+ @Slot(str)
+ def update_str_field(self, message):
+ print(message)
+
+ @Slot(int)
+ def update_int_field(self, value):
+ print(value)
+
+
+# Signals must inherit QObject
+class MySignals(QObject):
+ signal_str = Signal(str)
+ signal_int = Signal(int)
+
+
+# Create the Worker Thread
+class WorkerThread(QThread):
+ def __init__(self, parent=None):
+ QThread.__init__(self, parent)
+ # Instantiate signals and connect signals to the slots
+ self.signals = MySignals()
+ self.signals.signal_str.connect(parent.update_str_field)
+ self.signals.signal_int.connect(parent.update_int_field)
+
+ def run(self):
+ # Do something on the worker thread
+ a = 1 + 1
+ # Emit signals whenever you want
+ self.signals.signal_int.emit(a)
+ self.signals.signal_str.emit("This text comes to Main thread from our Worker thread.")
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ window = MainForm()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/thread_signals/thread_signals.pyproject b/examples/widgets/thread_signals/thread_signals.pyproject
new file mode 100644
index 000000000..e36f7633c
--- /dev/null
+++ b/examples/widgets/thread_signals/thread_signals.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["thread_signals.py"]
+}
diff --git a/examples/widgets/threads/thread_signals.py b/examples/widgets/threads/thread_signals.py
deleted file mode 100644
index d63040491..000000000
--- a/examples/widgets/threads/thread_signals.py
+++ /dev/null
@@ -1,100 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2020 The Qt Company Ltd.
-## Contact: https://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-import sys
-from PySide2.QtCore import QObject, QThread, Signal, Slot
-from PySide2.QtWidgets import QApplication, QPushButton, QVBoxLayout, QWidget
-
-
-# Create a basic window with a layout and a button
-class MainForm(QWidget):
- def __init__(self):
- QWidget.__init__(self)
- self.setWindowTitle("My Form")
- self.layout = QVBoxLayout()
- self.button = QPushButton("Click me!")
- self.button.clicked.connect(self.start_thread)
- self.layout.addWidget(self.button)
- self.setLayout(self.layout)
-
- # Instantiate and start a new thread
- def start_thread(self):
- instanced_thread = WorkerThread(self)
- instanced_thread.start()
-
- # Create the Slots that will receive signals
- @Slot(str)
- def update_str_field(self, message):
- print(message)
-
- @Slot(int)
- def update_int_field(self, value):
- print(value)
-
-
-# Signals must inherit QObject
-class MySignals(QObject):
- signal_str = Signal(str)
- signal_int = Signal(int)
-
-
-# Create the Worker Thread
-class WorkerThread(QThread):
- def __init__(self, parent=None):
- QThread.__init__(self, parent)
- # Instantiate signals and connect signals to the slots
- self.signals = MySignals()
- self.signals.signal_str.connect(parent.update_str_field)
- self.signals.signal_int.connect(parent.update_int_field)
-
- def run(self):
- # Do something on the worker thread
- a = 1 + 1
- # Emit signals whenever you want
- self.signals.signal_int.emit(a)
- self.signals.signal_str.emit("This text comes to Main thread from our Worker thread.")
-
-
-if __name__ == "__main__":
- app = QApplication(sys.argv)
- window = MainForm()
- window.show()
- sys.exit(app.exec_())
diff --git a/examples/widgets/tools/regularexpression/doc/regularexpression.png b/examples/widgets/tools/regularexpression/doc/regularexpression.png
new file mode 100644
index 000000000..11e70f4a8
--- /dev/null
+++ b/examples/widgets/tools/regularexpression/doc/regularexpression.png
Binary files differ
diff --git a/examples/widgets/tools/regularexpression/doc/regularexpression.rst b/examples/widgets/tools/regularexpression/doc/regularexpression.rst
new file mode 100644
index 000000000..59a66acba
--- /dev/null
+++ b/examples/widgets/tools/regularexpression/doc/regularexpression.rst
@@ -0,0 +1,10 @@
+QRegularExpression Example
+==========================
+
+A Python application that demonstrates the analogous example in C++
+`QRegularExpression Example <https://doc.qt.io/qt-6/qtwidgets-tools-regularexpression-example.html>`_
+
+
+.. image:: regularexpression.png
+ :width: 400
+ :alt: regularexpression example
diff --git a/examples/widgets/tools/regularexpression/regularexpression.py b/examples/widgets/tools/regularexpression/regularexpression.py
new file mode 100644
index 000000000..261e26196
--- /dev/null
+++ b/examples/widgets/tools/regularexpression/regularexpression.py
@@ -0,0 +1,21 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""
+PySide6 port of Qt6 example qtbase/examples/widgets/tools/regularexpression
+
+More Information: https://doc.qt.io/qt-6/qtwidgets-tools-regularexpression-example.html
+"""
+import sys
+
+from regularexpressiondialog import RegularExpressionDialog
+
+from PySide6.QtWidgets import QApplication
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+
+ dialog = RegularExpressionDialog()
+ dialog.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/tools/regularexpression/regularexpression.pyproject b/examples/widgets/tools/regularexpression/regularexpression.pyproject
new file mode 100644
index 000000000..0896bfb7e
--- /dev/null
+++ b/examples/widgets/tools/regularexpression/regularexpression.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["regularexpression.py", "regularexpressiondialog.py"]
+}
diff --git a/examples/widgets/tools/regularexpression/regularexpressiondialog.py b/examples/widgets/tools/regularexpression/regularexpressiondialog.py
new file mode 100644
index 000000000..2d2bb2bb7
--- /dev/null
+++ b/examples/widgets/tools/regularexpression/regularexpressiondialog.py
@@ -0,0 +1,456 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import re
+import logging
+
+from PySide6.QtCore import (QMargins, QRegularExpression, QRegularExpressionMatch,
+ QRegularExpressionMatchIterator, Qt, Slot,)
+from PySide6.QtGui import (QAction, QColor, QContextMenuEvent, QFontDatabase,
+ QGuiApplication, QIcon, QPalette,)
+from PySide6.QtWidgets import (QCheckBox, QComboBox, QDialog, QFormLayout,
+ QFrame, QGridLayout, QHBoxLayout, QLabel,
+ QLineEdit, QPlainTextEdit, QSpinBox,
+ QTreeWidget, QTreeWidgetItem, QVBoxLayout,
+ QWidget)
+
+
+def rawStringLiteral(pattern: str) -> str:
+ pattern = 'r"' + pattern
+ pattern = pattern + '"'
+ return pattern
+
+
+def patternToCode(pattern: str) -> str:
+ pattern = pattern.replace("\\", "\\\\")
+ pattern = pattern.replace('"', '\\"')
+ pattern = '"' + pattern
+ pattern = pattern + '"'
+ return pattern
+
+
+def codeToPattern(code: str) -> str:
+
+ try:
+ _ = code[0]
+ except IndexError:
+ logging.warning("code is empty")
+ return code
+
+ code_characters = [c for c in code]
+ index = 0
+ code_characters_size = len(code_characters)
+ while index < code_characters_size:
+ if code_characters[index] == '\\':
+ del code_characters[index]
+ code_characters_size -= 1
+ index += 1
+ code = "".join(code_characters)
+
+ if code.startswith('"') and code.endswith('"'):
+ code = code[1:-1] # remove quotes
+
+ return code
+
+
+def createHorizontalSeparator() -> QFrame:
+ result = QFrame()
+ result.setFrameStyle(QFrame.HLine | QFrame.Sunken)
+ return result
+
+
+def createVerticalSeparator() -> QFrame:
+ result = QFrame()
+ result.setFrameStyle(QFrame.VLine | QFrame.Sunken)
+ return result
+
+
+class PatternLineEdit(QLineEdit):
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+ self.escapeSelectionAction = QAction("Escape Selection", self)
+ self.copyToCodeAction = QAction("Copy to Code", self)
+ self.pasteFromCodeAction = QAction("Paste from Code", self)
+
+ self.setClearButtonEnabled(True)
+ self.escapeSelectionAction.triggered.connect(self.escapeSelection)
+ self.copyToCodeAction.triggered.connect(self.copyToCode)
+ self.pasteFromCodeAction.triggered.connect(self.pasteFromCode)
+
+ @Slot()
+ def escapeSelection(self):
+ selection = self.selectedText()
+ selection_start = self.selectionStart()
+ escapedSelection = QRegularExpression.escape(selection)
+ if escapedSelection != selection:
+ t = self.text()
+ t = (
+ t[: selection_start]
+ + escapedSelection
+ + t[selection_start + len(selection):]
+ )
+ self.setText(t)
+
+ @Slot()
+ def copyToCode(self):
+ QGuiApplication.clipboard().setText(patternToCode(self.text()))
+
+ @Slot()
+ def pasteFromCode(self):
+ self.setText(codeToPattern(QGuiApplication.clipboard().text()))
+
+ def contextMenuEvent(self, event: QContextMenuEvent) -> None:
+ menu = self.createStandardContextMenu()
+ menu.setAttribute(Qt.WA_DeleteOnClose)
+ menu.addSeparator()
+ self.escapeSelectionAction.setEnabled(self.hasSelectedText())
+ menu.addAction(self.escapeSelectionAction)
+ menu.addSeparator()
+ menu.addAction(self.copyToCodeAction)
+ menu.addAction(self.pasteFromCodeAction)
+ menu.popup(event.globalPos())
+
+
+class DisplayLineEdit(QLineEdit):
+ def __init__(self, parent: QWidget = None):
+ super().__init__(parent)
+ self.setReadOnly(True)
+ self.disablePalette: QPalette = self.palette()
+ self.disablePalette.setBrush(
+ QPalette.Base,
+ self.disablePalette.brush(QPalette.Disabled, QPalette.Base),
+ )
+ self.setPalette(self.disablePalette)
+
+ self.copyAction = QAction(self)
+ self.copyAction.setText("Copy to clipboard")
+ self.copyAction.setIcon(QIcon(":/images/copy.png"))
+ self.copyAction.triggered.connect(
+ lambda: QGuiApplication.clipboard().setText(self.text())
+ )
+ self.addAction(self.copyAction, QLineEdit.TrailingPosition)
+
+
+class RegularExpressionDialog(QDialog):
+ def __init__(self, parent: QWidget = None) -> None:
+ super().__init__(parent)
+ self.setupUi()
+ self.setWindowTitle("QRegularExpression Example")
+ self.regularExpression = QRegularExpression()
+ self.patternLineEdit.textChanged.connect(self.refresh)
+ self.subjectTextEdit.textChanged.connect(self.refresh)
+ self.caseInsensitiveOptionCheckBox.toggled.connect(self.refresh)
+ self.dotMatchesEverythingOptionCheckBox.toggled.connect(self.refresh)
+ self.multilineOptionCheckBox.toggled.connect(self.refresh)
+ self.extendedPatternSyntaxOptionCheckBox.toggled.connect(self.refresh)
+ self.invertedGreedinessOptionCheckBox.toggled.connect(self.refresh)
+ self.dontCaptureOptionCheckBox.toggled.connect(self.refresh)
+ self.useUnicodePropertiesOptionCheckBox.toggled.connect(self.refresh)
+ self.offsetSpinBox.valueChanged.connect(self.refresh)
+ self.matchTypeComboBox.currentIndexChanged.connect(self.refresh)
+ self.anchoredMatchOptionCheckBox.toggled.connect(self.refresh)
+ self.dontCheckSubjectStringMatchOptionCheckBox.toggled.connect(self.refresh)
+
+ self.patternLineEdit.setText("(\\+?\\d+)-(?P<prefix>\\d+)-(?P<number>\\w+)")
+ self.subjectTextEdit.setPlainText(
+ "My office number is +43-152-0123456, my mobile is 001-41-255512"
+ " instead."
+ )
+
+ self.refresh()
+
+ def setResultUiEnabled(self, enabled: bool):
+ self.matchDetailsTreeWidget.setEnabled(enabled)
+ self.namedGroupsTreeWidget.setEnabled(enabled)
+ self.replacementTextEdit.setEnabled(enabled)
+
+ def setTextColor(self, widget: QWidget, color: QColor):
+ self.palette: QPalette = widget.palette()
+ self.palette.setColor(QPalette.Text, color)
+ widget.setPalette(self.palette)
+
+ @Slot()
+ def refresh(self):
+ self.setUpdatesEnabled(False)
+ self.pattern = self.patternLineEdit.text()
+ self.text = self.subjectTextEdit.toPlainText()
+
+ self.offsetSpinBox.setMaximum(max(0, len(self.text) - 1))
+
+ self.escapedPatternLineEdit.setText(patternToCode(self.pattern))
+ self.rawStringLiteralLineEdit.setText(rawStringLiteral(self.pattern))
+
+ self.setTextColor(
+ self.patternLineEdit,
+ self.subjectTextEdit.palette().color(QPalette.Text),
+ )
+ self.matchDetailsTreeWidget.clear()
+ self.namedGroupsTreeWidget.clear()
+ self.regexpStatusLabel.setText("")
+ self.replacementTextEdit.clear()
+
+ if not self.pattern:
+ self.setResultUiEnabled(False)
+ self.setUpdatesEnabled(True)
+ return
+
+ self.regularExpression.setPattern(self.pattern)
+
+ if not self.regularExpression.isValid():
+ self.setTextColor(self.patternLineEdit, Qt.red)
+ pattern_error_offset = self.regularExpression.patternErrorOffset()
+ error_string = self.regularExpression.errorString()
+ self.regexpStatusLabel.setText(
+ "Invalid: syntax error at position"
+ f" {pattern_error_offset}"
+ f" ({error_string})"
+ )
+ self.setResultUiEnabled(False)
+ self.setUpdatesEnabled(True)
+ return
+
+ self.setResultUiEnabled(True)
+ matchType: QRegularExpression.MatchType = QRegularExpression.MatchType(
+ self.matchTypeComboBox.currentData()
+ )
+ patternOptions = QRegularExpression.NoPatternOption
+ matchOptions = QRegularExpression.NoMatchOption
+
+ if self.anchoredMatchOptionCheckBox.isChecked():
+ matchOptions |= QRegularExpression.AnchorAtOffsetMatchOption
+ if self.dontCheckSubjectStringMatchOptionCheckBox.isChecked():
+ matchOptions |= QRegularExpression.DontCheckSubjectStringMatchOption
+
+ if self.caseInsensitiveOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.CaseInsensitiveOption
+ if self.dotMatchesEverythingOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.DotMatchesEverythingOption
+ if self.multilineOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.MultilineOption
+ if self.extendedPatternSyntaxOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.ExtendedPatternSyntaxOption
+ if self.invertedGreedinessOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.InvertedGreedinessOption
+ if self.dontCaptureOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.DontCaptureOption
+ if self.useUnicodePropertiesOptionCheckBox.isChecked():
+ patternOptions |= QRegularExpression.UseUnicodePropertiesOption
+
+ self.regularExpression.setPatternOptions(patternOptions)
+
+ capturingGroupsCount = self.regularExpression.captureCount() + 1
+
+ offset = self.offsetSpinBox.value()
+ iterator: QRegularExpressionMatchIterator = self.regularExpression.globalMatch(
+ self.text, offset, matchType, matchOptions
+ )
+ i = 0
+
+ while iterator.hasNext():
+ match: QRegularExpressionMatch = iterator.next()
+ matchDetailTopItem = QTreeWidgetItem(self.matchDetailsTreeWidget)
+ matchDetailTopItem.setText(0, str(i))
+
+ for captureGroupIndex in range(capturingGroupsCount):
+ matchDetailItem = QTreeWidgetItem(matchDetailTopItem)
+ matchDetailItem.setText(1, str(captureGroupIndex))
+ matchDetailItem.setText(2, match.captured(captureGroupIndex))
+
+ i = i + 1
+
+ self.matchDetailsTreeWidget.expandAll()
+
+ self.regexpStatusLabel.setText("Valid")
+
+ namedCaptureGroups = self.regularExpression.namedCaptureGroups()
+ for i in range(len(namedCaptureGroups)):
+ currentNamedCaptureGroup = namedCaptureGroups[i]
+ namedGroupItem = QTreeWidgetItem(self.namedGroupsTreeWidget)
+ namedGroupItem.setText(0, str(i))
+ namedGroupItem.setText(
+ 1,
+ "<no name>"
+ if not currentNamedCaptureGroup
+ else currentNamedCaptureGroup,
+ )
+
+ self.updateReplacement()
+ self.setUpdatesEnabled(True)
+
+ @Slot()
+ def updateReplacement(self):
+ self.replacementTextEdit.clear()
+ replacement = self.replacementLineEdit.text()
+ if not self.regularExpression.isValid() or not replacement:
+ return
+
+ current_text = self.subjectTextEdit.toPlainText()
+ regular_expression_pattern = self.regularExpression.pattern()
+
+ new_text = re.sub(regular_expression_pattern, replacement, current_text)
+ self.replacementTextEdit.setPlainText(new_text)
+
+ def setupUi(self):
+ self.mainLayout = QVBoxLayout(self)
+ self.mainLayout.addWidget(self.setupTextUi())
+ self.mainLayout.addWidget(createHorizontalSeparator())
+
+ self.horizontalLayout = QHBoxLayout()
+ self.mainLayout.addLayout(self.horizontalLayout)
+ self.horizontalLayout.addWidget(self.setupOptionsUi())
+ self.horizontalLayout.addWidget(createVerticalSeparator())
+ self.horizontalLayout.addWidget(self.setupInfoUi())
+
+ self._font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
+ self.patternLineEdit.setFont(self._font)
+ self.rawStringLiteralLineEdit.setFont(self._font)
+ self.escapedPatternLineEdit.setFont(self._font)
+ self.replacementLineEdit.setFont(self._font)
+ self.subjectTextEdit.setFont(self._font)
+ self.replacementTextEdit.setFont(self._font)
+
+ def setupOptionsUi(self):
+ container = QWidget()
+
+ form_layout = QFormLayout(container)
+ form_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
+ form_layout.setContentsMargins(QMargins())
+
+ form_layout.addRow(QLabel("<h3>Options</h3>"))
+
+ self.caseInsensitiveOptionCheckBox = QCheckBox("Case insensitive (/i)")
+ self.dotMatchesEverythingOptionCheckBox = QCheckBox("Dot matches everything (/s)")
+ self.multilineOptionCheckBox = QCheckBox("Multiline (/m)")
+ self.extendedPatternSyntaxOptionCheckBox = QCheckBox("Extended pattern (/x)")
+ self.invertedGreedinessOptionCheckBox = QCheckBox("Inverted greediness")
+ self.dontCaptureOptionCheckBox = QCheckBox("Don't capture")
+ self.useUnicodePropertiesOptionCheckBox = QCheckBox("Use unicode properties (/u)")
+
+ self.patternOptionsCheckBoxLayout = QGridLayout()
+ gridRow = 0
+
+ self.patternOptionsCheckBoxLayout.addWidget(self.caseInsensitiveOptionCheckBox, gridRow, 1)
+ self.patternOptionsCheckBoxLayout.addWidget(
+ self.dotMatchesEverythingOptionCheckBox, gridRow, 2)
+ gridRow = gridRow + 1
+ self.patternOptionsCheckBoxLayout.addWidget(self.multilineOptionCheckBox, gridRow, 1)
+ self.patternOptionsCheckBoxLayout.addWidget(
+ self.extendedPatternSyntaxOptionCheckBox, gridRow, 2)
+ gridRow = gridRow + 1
+ self.patternOptionsCheckBoxLayout.addWidget(
+ self.invertedGreedinessOptionCheckBox, gridRow, 1)
+ self.patternOptionsCheckBoxLayout.addWidget(self.dontCaptureOptionCheckBox, gridRow, 2)
+ gridRow = gridRow + 1
+ self.patternOptionsCheckBoxLayout.addWidget(
+ self.useUnicodePropertiesOptionCheckBox, gridRow, 1)
+
+ form_layout.addRow("Pattern options:", self.patternOptionsCheckBoxLayout)
+
+ self.offsetSpinBox = QSpinBox()
+ form_layout.addRow("Match &offset:", self.offsetSpinBox)
+
+ self.matchTypeComboBox = QComboBox()
+ self.matchTypeComboBox.addItem("Normal", QRegularExpression.NormalMatch)
+ self.matchTypeComboBox.addItem(
+ "Partial prefer complete",
+ QRegularExpression.PartialPreferCompleteMatch,
+ )
+ self.matchTypeComboBox.addItem(
+ "Partial prefer first", QRegularExpression.PartialPreferFirstMatch
+ )
+ self.matchTypeComboBox.addItem("No match", QRegularExpression.NoMatch)
+ form_layout.addRow("Match &type:", self.matchTypeComboBox)
+
+ self.dontCheckSubjectStringMatchOptionCheckBox = QCheckBox(
+ "Don't check subject string"
+ )
+ self.anchoredMatchOptionCheckBox = QCheckBox("Anchored match")
+
+ self.matchOptionsCheckBoxLayout = QGridLayout()
+ self.matchOptionsCheckBoxLayout.addWidget(
+ self.dontCheckSubjectStringMatchOptionCheckBox, 0, 0
+ )
+ self.matchOptionsCheckBoxLayout.addWidget(
+ self.anchoredMatchOptionCheckBox, 0, 1
+ )
+ form_layout.addRow("Match options:", self.matchOptionsCheckBoxLayout)
+
+ return container
+
+ def setupInfoUi(self):
+ container = QWidget()
+
+ form_layout = QFormLayout(container)
+ form_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
+ form_layout.setContentsMargins(QMargins())
+
+ self.matchInfoLabel = QLabel("<h3>Match information</h3>")
+ form_layout.addRow(self.matchInfoLabel)
+
+ self.matchDetailsTreeWidget = QTreeWidget()
+
+ self.matchDetailsTreeWidget.setHeaderLabels(
+ ["Match index", "Group index", "Captured string"]
+ )
+ self.matchDetailsTreeWidget.setSizeAdjustPolicy(QTreeWidget.AdjustToContents)
+ form_layout.addRow("Match details:", self.matchDetailsTreeWidget)
+
+ form_layout.addRow(createHorizontalSeparator())
+
+ self.regexpInfoLabel = QLabel("<h3>Regular expression information</h3>")
+ form_layout.addRow(self.regexpInfoLabel)
+
+ self.regexpStatusLabel = QLabel("Valid")
+ self.regexpStatusLabel.setWordWrap(True)
+ form_layout.addRow("Pattern status:", self.regexpStatusLabel)
+
+ self.namedGroupsTreeWidget = QTreeWidget()
+ self.namedGroupsTreeWidget.setHeaderLabels(["Index", "Named group"])
+ self.namedGroupsTreeWidget.setSizeAdjustPolicy(QTreeWidget.AdjustToContents)
+ self.namedGroupsTreeWidget.setRootIsDecorated(False)
+ form_layout.addRow("Named groups:", self.namedGroupsTreeWidget)
+
+ return container
+
+ def setupTextUi(self):
+ container = QWidget()
+ form_layout = QFormLayout(container)
+ form_layout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow)
+ form_layout.setContentsMargins(QMargins())
+
+ self.regexpAndSubjectLabel = QLabel(
+ "<h3>Regular expression and text input</h3>"
+ )
+ form_layout.addRow(self.regexpAndSubjectLabel)
+
+ self.patternLineEdit = PatternLineEdit()
+ self.patternLineEdit.setClearButtonEnabled(True)
+ form_layout.addRow("&Pattern:", self.patternLineEdit)
+
+ self.rawStringLiteralLineEdit = DisplayLineEdit()
+ form_layout.addRow("&Raw string literal:", self.rawStringLiteralLineEdit)
+
+ self.escapedPatternLineEdit = DisplayLineEdit()
+ form_layout.addRow("&Escaped pattern:", self.escapedPatternLineEdit)
+
+ self.subjectTextEdit = QPlainTextEdit()
+ form_layout.addRow("&Subject text:", self.subjectTextEdit)
+
+ form_layout.addRow(createHorizontalSeparator())
+
+ self.replaceLabel = QLabel("<h3>Replacement")
+ form_layout.addRow(self.replaceLabel)
+
+ self.replacementLineEdit = QLineEdit()
+ self.replacementLineEdit.setClearButtonEnabled(True)
+ self.replacementLineEdit.textChanged.connect(self.updateReplacement)
+ form_layout.addRow("&Replace by:", self.replacementLineEdit)
+ self.replacementLineEdit.setToolTip(
+ "Use \\1, \\2... as placeholders for the captured groups."
+ )
+
+ self.replacementTextEdit = QPlainTextEdit()
+ self.replacementTextEdit.setReadOnly(True)
+ form_layout.addRow("Result:", self.replacementTextEdit)
+
+ return container
diff --git a/examples/widgets/tutorials/addressbook/doc/addressbook.png b/examples/widgets/tutorials/addressbook/doc/addressbook.png
new file mode 100644
index 000000000..7d563c17c
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/doc/addressbook.png
Binary files differ
diff --git a/examples/widgets/tutorials/addressbook/doc/addressbook.rst b/examples/widgets/tutorials/addressbook/doc/addressbook.rst
new file mode 100644
index 000000000..646d949d2
--- /dev/null
+++ b/examples/widgets/tutorials/addressbook/doc/addressbook.rst
@@ -0,0 +1,9 @@
+Address Book Example
+====================
+
+The address book example shows how to use proxy models to display different
+views onto data from a single model.
+
+.. image:: addressbook.png
+ :width: 400
+ :alt: Address Book Screenshot
diff --git a/examples/widgets/tutorials/addressbook/part1.py b/examples/widgets/tutorials/addressbook/part1.py
index 895873036..648ddea46 100644
--- a/examples/widgets/tutorials/addressbook/part1.py
+++ b/examples/widgets/tutorials/addressbook/part1.py
@@ -1,74 +1,38 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+import sys
-from PySide2 import QtCore, QtWidgets
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLabel, QLineEdit,
+ QTextEdit, QWidget)
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
- self.setLayout(mainLayout)
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
if __name__ == '__main__':
- import sys
+ app = QApplication(sys.argv)
- app = QtWidgets.QApplication(sys.argv)
+ address_book = AddressBook()
+ address_book.show()
- addressBook = AddressBook()
- addressBook.show()
-
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part2.py b/examples/widgets/tutorials/addressbook/part2.py
index 6eac33bfc..3c0eb451d 100644
--- a/examples/widgets/tutorials/addressbook/part2.py
+++ b/examples/widgets/tutorials/addressbook/part2.py
@@ -1,46 +1,14 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
+import sys
+
+from PySide6.QtCore import Qt
+from PySide6.QtWidgets import (QApplication, QGridLayout,
+ QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -72,109 +40,106 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
-
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.cancelButton.clicked.connect(self.cancel)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton, QtCore.Qt.AlignTop)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addStretch()
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
-
- self.setLayout(mainLayout)
+ self._old_name = ''
+ self._old_address = ''
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button, Qt.AlignTop)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addStretch()
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._add_button.setEnabled(False)
+ self._submit_button.show()
+ self._cancel_button.show()
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
+ self._submit_button.hide()
+ self._cancel_button.hide()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.nameLine.setReadOnly(True)
+ self._name_line.setText(self._old_name)
+ self._name_line.setReadOnly(True)
- self.addressText.setText(self.oldAddress)
- self.addressText.setReadOnly(True)
+ self._address_text.setText(self._old_address)
+ self._address_text.setReadOnly(True)
- self.addButton.setEnabled(True)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._add_button.setEnabled(True)
+ self._submit_button.hide()
+ self._cancel_button.hide()
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part3.py b/examples/widgets/tutorials/addressbook/part3.py
index d425c11d9..611796f5e 100644
--- a/examples/widgets/tutorials/addressbook/part3.py
+++ b/examples/widgets/tutorials/addressbook/part3.py
@@ -1,46 +1,14 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
+import sys
+
+from PySide6.QtCore import Qt, Slot
+from PySide6.QtWidgets import (QApplication, QGridLayout,
+ QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -72,130 +40,132 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
- self.nextButton = QtWidgets.QPushButton("&Next")
- self.nextButton.setEnabled(False)
- self.previousButton = QtWidgets.QPushButton("&Previous")
- self.previousButton.setEnabled(False)
-
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.cancelButton.clicked.connect(self.cancel)
- self.nextButton.clicked.connect(self.next)
- self.previousButton.clicked.connect(self.previous)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton, QtCore.Qt.AlignTop)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addStretch()
-
- buttonLayout2 = QtWidgets.QHBoxLayout()
- buttonLayout2.addWidget(self.previousButton)
- buttonLayout2.addWidget(self.nextButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
- mainLayout.addLayout(buttonLayout2, 3, 1)
-
- self.setLayout(mainLayout)
+ self._old_name = ''
+ self._old_address = ''
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+ self._next_button = QPushButton("&Next")
+ self._next_button.setEnabled(False)
+ self._previous_button = QPushButton("&Previous")
+ self._previous_button.setEnabled(False)
+
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+ self._next_button.clicked.connect(self.next)
+ self._previous_button.clicked.connect(self.previous)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button, Qt.AlignTop)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addStretch()
+
+ button_layout_2 = QHBoxLayout()
+ button_layout_2.addWidget(self._previous_button)
+ button_layout_2.addWidget(self._next_button)
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+ main_layout.addLayout(button_layout_2, 3, 1)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.nextButton.setEnabled(False)
- self.previousButton.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._add_button.setEnabled(False)
+ self._next_button.setEnabled(False)
+ self._previous_button.setEnabled(False)
+ self._submit_button.show()
+ self._cancel_button.show()
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number > 1)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
+ @Slot()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.addressText.setText(self.oldAddress)
+ self._name_line.setText(self._old_name)
+ self._address_text.setText(self._old_address)
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number > 1)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
+ @Slot()
def next(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
it = iter(self.contacts)
try:
@@ -208,11 +178,12 @@ class AddressBook(QtWidgets.QWidget):
except StopIteration:
next_name, next_address = iter(self.contacts).next()
- self.nameLine.setText(next_name)
- self.addressText.setText(next_address)
+ self._name_line.setText(next_name)
+ self._address_text.setText(next_address)
+ @Slot()
def previous(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
prev_name = prev_address = None
for this_name, this_address in self.contacts:
@@ -222,24 +193,22 @@ class AddressBook(QtWidgets.QWidget):
prev_name = this_name
prev_address = this_address
else:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
return
if prev_name is None:
for prev_name, prev_address in self.contacts:
pass
- self.nameLine.setText(prev_name)
- self.addressText.setText(prev_address)
+ self._name_line.setText(prev_name)
+ self._address_text.setText(prev_address)
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part4.py b/examples/widgets/tutorials/addressbook/part4.py
index e4b1d1630..95f31d46c 100644
--- a/examples/widgets/tutorials/addressbook/part4.py
+++ b/examples/widgets/tutorials/addressbook/part4.py
@@ -1,46 +1,14 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
+import sys
+
+from PySide6.QtCore import Qt, Slot
+from PySide6.QtWidgets import (QApplication, QGridLayout,
+ QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -72,148 +40,153 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
NavigationMode, AddingMode, EditingMode = range(3)
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
- self.currentMode = self.NavigationMode
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.editButton = QtWidgets.QPushButton("&Edit")
- self.editButton.setEnabled(False)
- self.removeButton = QtWidgets.QPushButton("&Remove")
- self.removeButton.setEnabled(False)
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
-
- self.nextButton = QtWidgets.QPushButton("&Next")
- self.nextButton.setEnabled(False)
- self.previousButton = QtWidgets.QPushButton("&Previous")
- self.previousButton.setEnabled(False)
-
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.editButton.clicked.connect(self.editContact)
- self.removeButton.clicked.connect(self.removeContact)
- self.cancelButton.clicked.connect(self.cancel)
- self.nextButton.clicked.connect(self.next)
- self.previousButton.clicked.connect(self.previous)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton)
- buttonLayout1.addWidget(self.editButton)
- buttonLayout1.addWidget(self.removeButton)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addStretch()
-
- buttonLayout2 = QtWidgets.QHBoxLayout()
- buttonLayout2.addWidget(self.previousButton)
- buttonLayout2.addWidget(self.nextButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
- mainLayout.addLayout(buttonLayout2, 3, 1)
-
- self.setLayout(mainLayout)
+ self._old_name = ''
+ self._old_address = ''
+ self._current_mode = self.NavigationMode
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._edit_button = QPushButton("&Edit")
+ self._edit_button.setEnabled(False)
+ self._remove_button = QPushButton("&Remove")
+ self._remove_button.setEnabled(False)
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+
+ self._next_button = QPushButton("&Next")
+ self._next_button.setEnabled(False)
+ self._previous_button = QPushButton("&Previous")
+ self._previous_button.setEnabled(False)
+
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._edit_button.clicked.connect(self.edit_contact)
+ self._remove_button.clicked.connect(self.remove_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+ self._next_button.clicked.connect(self.next)
+ self._previous_button.clicked.connect(self.previous)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button)
+ button_layout_1.addWidget(self._edit_button)
+ button_layout_1.addWidget(self._remove_button)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addStretch()
+
+ button_layout_2 = QHBoxLayout()
+ button_layout_2.addWidget(self._previous_button)
+ button_layout_2.addWidget(self._next_button)
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+ main_layout.addLayout(button_layout_2, 3, 1)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.updateInterface(self.AddingMode)
+ self.update_interface(self.AddingMode)
- def editContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def edit_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.updateInterface(self.EditingMode)
+ self.update_interface(self.EditingMode)
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
- if self.currentMode == self.AddingMode:
+ if self._current_mode == self.AddingMode:
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.currentMode == self.EditingMode:
- if self.oldName != name:
+ elif self._current_mode == self.EditingMode:
+ if self._old_name != name:
if name not in self.contacts:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % self.oldName)
- del self.contacts[self.oldName]
+ QMessageBox.information(self, "Edit Successful",
+ f'"{self.oldName}" has been edited in your '
+ 'address book.')
+ del self.contacts[self._old_name]
self.contacts[name] = address
else:
- QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Edit Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.oldAddress != address:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % name)
+ elif self._old_address != address:
+ QMessageBox.information(self, "Edit Successful",
+ f'"{name}" has been edited in your address book.')
self.contacts[name] = address
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.addressText.setText(self.oldAddress)
- self.updateInterface(self.NavigationMode)
+ self._name_line.setText(self._old_name)
+ self._address_text.setText(self._old_address)
+ self.update_interface(self.NavigationMode)
- def removeContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def remove_contact(self):
+ name = self._name_line.text()
if name in self.contacts:
- button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
- "Are you sure you want to remove \"%s\"?" % name,
- QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+ button = QMessageBox.question(self, "Confirm Remove",
+ f'Are you sure you want to remove "{name}"?',
+ QMessageBox.Yes | QMessageBox.No)
- if button == QtWidgets.QMessageBox.Yes:
+ if button == QMessageBox.Yes:
self.previous()
del self.contacts[name]
- QtWidgets.QMessageBox.information(self, "Remove Successful",
- "\"%s\" has been removed from your address book." % name)
+ QMessageBox.information(self, "Remove Successful",
+ f'"{name}" has been removed from your address book.')
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def next(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
it = iter(self.contacts)
try:
@@ -226,11 +199,12 @@ class AddressBook(QtWidgets.QWidget):
except StopIteration:
next_name, next_address = iter(self.contacts).next()
- self.nameLine.setText(next_name)
- self.addressText.setText(next_address)
+ self._name_line.setText(next_name)
+ self._address_text.setText(next_address)
+ @Slot()
def previous(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
prev_name = prev_address = None
for this_name, this_address in self.contacts:
@@ -240,60 +214,58 @@ class AddressBook(QtWidgets.QWidget):
prev_name = this_name
prev_address = this_address
else:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
return
if prev_name is None:
for prev_name, prev_address in self.contacts:
pass
- self.nameLine.setText(prev_name)
- self.addressText.setText(prev_address)
+ self._name_line.setText(prev_name)
+ self._address_text.setText(prev_address)
- def updateInterface(self, mode):
- self.currentMode = mode
+ def update_interface(self, mode):
+ self._current_mode = mode
- if self.currentMode in (self.AddingMode, self.EditingMode):
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ if self._current_mode in (self.AddingMode, self.EditingMode):
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.editButton.setEnabled(False)
- self.removeButton.setEnabled(False)
+ self._add_button.setEnabled(False)
+ self._edit_button.setEnabled(False)
+ self._remove_button.setEnabled(False)
- self.nextButton.setEnabled(False)
- self.previousButton.setEnabled(False)
+ self._next_button.setEnabled(False)
+ self._previous_button.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._submit_button.show()
+ self._cancel_button.show()
- elif self.currentMode == self.NavigationMode:
+ elif self._current_mode == self.NavigationMode:
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.editButton.setEnabled(number >= 1)
- self.removeButton.setEnabled(number >= 1)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number >1 )
+ self._edit_button.setEnabled(number >= 1)
+ self._remove_button.setEnabled(number >= 1)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part5.py b/examples/widgets/tutorials/addressbook/part5.py
index cb666ff9f..1e9c05862 100644
--- a/examples/widgets/tutorials/addressbook/part5.py
+++ b/examples/widgets/tutorials/addressbook/part5.py
@@ -1,46 +1,14 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-from PySide2 import QtCore, QtWidgets
+import sys
+
+from PySide6.QtCore import Qt, Slot
+from PySide6.QtWidgets import (QApplication, QDialog, QGridLayout,
+ QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -72,154 +40,159 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
NavigationMode, AddingMode, EditingMode = range(3)
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
- self.currentMode = self.NavigationMode
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.editButton = QtWidgets.QPushButton("&Edit")
- self.editButton.setEnabled(False)
- self.removeButton = QtWidgets.QPushButton("&Remove")
- self.removeButton.setEnabled(False)
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findButton.setEnabled(False)
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
-
- self.nextButton = QtWidgets.QPushButton("&Next")
- self.nextButton.setEnabled(False)
- self.previousButton = QtWidgets.QPushButton("&Previous")
- self.previousButton.setEnabled(False)
+ self._old_name = ''
+ self._old_address = ''
+ self._current_mode = self.NavigationMode
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._edit_button = QPushButton("&Edit")
+ self._edit_button.setEnabled(False)
+ self._remove_button = QPushButton("&Remove")
+ self._remove_button.setEnabled(False)
+ self._find_button = QPushButton("&Find")
+ self._find_button.setEnabled(False)
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+
+ self._next_button = QPushButton("&Next")
+ self._next_button.setEnabled(False)
+ self._previous_button = QPushButton("&Previous")
+ self._previous_button.setEnabled(False)
self.dialog = FindDialog()
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.editButton.clicked.connect(self.editContact)
- self.removeButton.clicked.connect(self.removeContact)
- self.findButton.clicked.connect(self.findContact)
- self.cancelButton.clicked.connect(self.cancel)
- self.nextButton.clicked.connect(self.next)
- self.previousButton.clicked.connect(self.previous)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton)
- buttonLayout1.addWidget(self.editButton)
- buttonLayout1.addWidget(self.removeButton)
- buttonLayout1.addWidget(self.findButton)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addStretch()
-
- buttonLayout2 = QtWidgets.QHBoxLayout()
- buttonLayout2.addWidget(self.previousButton)
- buttonLayout2.addWidget(self.nextButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
- mainLayout.addLayout(buttonLayout2, 2, 1)
-
- self.setLayout(mainLayout)
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._edit_button.clicked.connect(self.edit_contact)
+ self._remove_button.clicked.connect(self.remove_contact)
+ self._find_button.clicked.connect(self.find_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+ self._next_button.clicked.connect(self.next)
+ self._previous_button.clicked.connect(self.previous)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button)
+ button_layout_1.addWidget(self._edit_button)
+ button_layout_1.addWidget(self._remove_button)
+ button_layout_1.addWidget(self._find_button)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addStretch()
+
+ button_layout_2 = QHBoxLayout()
+ button_layout_2.addWidget(self._previous_button)
+ button_layout_2.addWidget(self._next_button)
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+ main_layout.addLayout(button_layout_2, 2, 1)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.updateInterface(self.AddingMode)
+ self.update_interface(self.AddingMode)
- def editContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def edit_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.updateInterface(self.EditingMode)
+ self.update_interface(self.EditingMode)
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
- if self.currentMode == self.AddingMode:
+ if self._current_mode == self.AddingMode:
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.currentMode == self.EditingMode:
- if self.oldName != name:
+ elif self._current_mode == self.EditingMode:
+ if self._old_name != name:
if name not in self.contacts:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % self.oldName)
- del self.contacts[self.oldName]
+ QMessageBox.information(self, "Edit Successful",
+ f'"{self.oldName}" has been edited in your '
+ 'address book.')
+ del self.contacts[self._old_name]
self.contacts[name] = address
else:
- QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Edit Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.oldAddress != address:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % name)
+ elif self._old_address != address:
+ QMessageBox.information(self, "Edit Successful",
+ f'"{name}" has been edited in your address book.')
self.contacts[name] = address
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.addressText.setText(self.oldAddress)
- self.updateInterface(self.NavigationMode)
+ self._name_line.setText(self._old_name)
+ self._address_text.setText(self._old_address)
+ self.update_interface(self.NavigationMode)
- def removeContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def remove_contact(self):
+ name = self._name_line.text()
if name in self.contacts:
- button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
- "Are you sure you want to remove \"%s\"?" % name,
- QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+ button = QMessageBox.question(self, "Confirm Remove",
+ f'Are you sure you want to remove "{name}"?',
+ QMessageBox.Yes | QMessageBox.No)
- if button == QtWidgets.QMessageBox.Yes:
+ if button == QMessageBox.Yes:
self.previous()
del self.contacts[name]
- QtWidgets.QMessageBox.information(self, "Remove Successful",
- "\"%s\" has been removed from your address book." % name)
+ QMessageBox.information(self, "Remove Successful",
+ f'"{name}" has been removed from your address book.')
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def next(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
it = iter(self.contacts)
try:
@@ -232,11 +205,12 @@ class AddressBook(QtWidgets.QWidget):
except StopIteration:
next_name, next_address = iter(self.contacts).next()
- self.nameLine.setText(next_name)
- self.addressText.setText(next_address)
+ self._name_line.setText(next_name)
+ self._address_text.setText(next_address)
+ @Slot()
def previous(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
prev_name = prev_address = None
for this_name, this_address in self.contacts:
@@ -246,114 +220,111 @@ class AddressBook(QtWidgets.QWidget):
prev_name = this_name
prev_address = this_address
else:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
return
if prev_name is None:
for prev_name, prev_address in self.contacts:
pass
- self.nameLine.setText(prev_name)
- self.addressText.setText(prev_address)
+ self._name_line.setText(prev_name)
+ self._address_text.setText(prev_address)
- def findContact(self):
+ def find_contact(self):
self.dialog.show()
- if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
- contactName = self.dialog.getFindText()
+ if self.dialog.exec() == QDialog.Accepted:
+ contact_name = self.dialog.get_find_text()
- if contactName in self.contacts:
- self.nameLine.setText(contactName)
- self.addressText.setText(self.contacts[contactName])
+ if contact_name in self.contacts:
+ self._name_line.setText(contact_name)
+ self._address_text.setText(self.contacts[contact_name])
else:
- QtWidgets.QMessageBox.information(self, "Contact Not Found",
- "Sorry, \"%s\" is not in your address book." % contactName)
+ QMessageBox.information(self, "Contact Not Found",
+ f'Sorry, "{contact_name}" is not in your address book.')
return
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
- def updateInterface(self, mode):
- self.currentMode = mode
+ def update_interface(self, mode):
+ self._current_mode = mode
- if self.currentMode in (self.AddingMode, self.EditingMode):
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ if self._current_mode in (self.AddingMode, self.EditingMode):
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.editButton.setEnabled(False)
- self.removeButton.setEnabled(False)
+ self._add_button.setEnabled(False)
+ self._edit_button.setEnabled(False)
+ self._remove_button.setEnabled(False)
- self.nextButton.setEnabled(False)
- self.previousButton.setEnabled(False)
+ self._next_button.setEnabled(False)
+ self._previous_button.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._submit_button.show()
+ self._cancel_button.show()
- elif self.currentMode == self.NavigationMode:
+ elif self._current_mode == self.NavigationMode:
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.editButton.setEnabled(number >= 1)
- self.removeButton.setEnabled(number >= 1)
- self.findButton.setEnabled(number > 2)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number >1 )
+ self._edit_button.setEnabled(number >= 1)
+ self._remove_button.setEnabled(number >= 1)
+ self._find_button.setEnabled(number > 2)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
-class FindDialog(QtWidgets.QDialog):
+class FindDialog(QDialog):
def __init__(self, parent=None):
- super(FindDialog, self).__init__(parent)
+ super().__init__(parent)
- findLabel = QtWidgets.QLabel("Enter the name of a contact:")
- self.lineEdit = QtWidgets.QLineEdit()
+ find_label = QLabel("Enter the name of a contact:")
+ self._line_edit = QLineEdit()
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findText = ''
+ self._find_button = QPushButton("&Find")
+ self._find_text = ''
- layout = QtWidgets.QHBoxLayout()
- layout.addWidget(findLabel)
- layout.addWidget(self.lineEdit)
- layout.addWidget(self.findButton)
+ layout = QHBoxLayout()
+ layout.addWidget(find_label)
+ layout.addWidget(self._line_edit)
+ layout.addWidget(self._find_button)
self.setLayout(layout)
self.setWindowTitle("Find a Contact")
- self.findButton.clicked.connect(self.findClicked)
- self.findButton.clicked.connect(self.accept)
+ self._find_button.clicked.connect(self.find_clicked)
+ self._find_button.clicked.connect(self.accept)
- def findClicked(self):
- text = self.lineEdit.text()
+ def find_clicked(self):
+ text = self._line_edit.text()
if not text:
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name.")
return
else:
- self.findText = text
- self.lineEdit.clear()
+ self._find_text = text
+ self._line_edit.clear()
self.hide()
- def getFindText(self):
- return self.findText
+ def get_find_text(self):
+ return self._find_text
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part6.py b/examples/widgets/tutorials/addressbook/part6.py
index 559cc355f..d11298fb9 100644
--- a/examples/widgets/tutorials/addressbook/part6.py
+++ b/examples/widgets/tutorials/addressbook/part6.py
@@ -1,48 +1,15 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import pickle
+import sys
-from PySide2 import QtCore, QtWidgets
+from PySide6.QtCore import Qt, Slot
+from PySide6.QtWidgets import (QApplication, QDialog, QFileDialog,
+ QGridLayout, QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -74,164 +41,169 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
NavigationMode, AddingMode, EditingMode = range(3)
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
- self.currentMode = self.NavigationMode
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.editButton = QtWidgets.QPushButton("&Edit")
- self.editButton.setEnabled(False)
- self.removeButton = QtWidgets.QPushButton("&Remove")
- self.removeButton.setEnabled(False)
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findButton.setEnabled(False)
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
-
- self.nextButton = QtWidgets.QPushButton("&Next")
- self.nextButton.setEnabled(False)
- self.previousButton = QtWidgets.QPushButton("&Previous")
- self.previousButton.setEnabled(False)
-
- self.loadButton = QtWidgets.QPushButton("&Load...")
- self.loadButton.setToolTip("Load contacts from a file")
- self.saveButton = QtWidgets.QPushButton("Sa&ve...")
- self.saveButton.setToolTip("Save contacts to a file")
- self.saveButton.setEnabled(False)
+ self._old_name = ''
+ self._old_address = ''
+ self._current_mode = self.NavigationMode
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._edit_button = QPushButton("&Edit")
+ self._edit_button.setEnabled(False)
+ self._remove_button = QPushButton("&Remove")
+ self._remove_button.setEnabled(False)
+ self._find_button = QPushButton("&Find")
+ self._find_button.setEnabled(False)
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+
+ self._next_button = QPushButton("&Next")
+ self._next_button.setEnabled(False)
+ self._previous_button = QPushButton("&Previous")
+ self._previous_button.setEnabled(False)
+
+ self._load_button = QPushButton("&Load...")
+ self._load_button.setToolTip("Load contacts from a file")
+ self._save_button = QPushButton("Sa&ve...")
+ self._save_button.setToolTip("Save contacts to a file")
+ self._save_button.setEnabled(False)
self.dialog = FindDialog()
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.editButton.clicked.connect(self.editContact)
- self.removeButton.clicked.connect(self.removeContact)
- self.findButton.clicked.connect(self.findContact)
- self.cancelButton.clicked.connect(self.cancel)
- self.nextButton.clicked.connect(self.next)
- self.previousButton.clicked.connect(self.previous)
- self.loadButton.clicked.connect(self.loadFromFile)
- self.saveButton.clicked.connect(self.saveToFile)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton)
- buttonLayout1.addWidget(self.editButton)
- buttonLayout1.addWidget(self.removeButton)
- buttonLayout1.addWidget(self.findButton)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addWidget(self.loadButton)
- buttonLayout1.addWidget(self.saveButton)
- buttonLayout1.addStretch()
-
- buttonLayout2 = QtWidgets.QHBoxLayout()
- buttonLayout2.addWidget(self.previousButton)
- buttonLayout2.addWidget(self.nextButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
- mainLayout.addLayout(buttonLayout2, 2, 1)
-
- self.setLayout(mainLayout)
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._edit_button.clicked.connect(self.edit_contact)
+ self._remove_button.clicked.connect(self.remove_contact)
+ self._find_button.clicked.connect(self.find_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+ self._next_button.clicked.connect(self.next)
+ self._previous_button.clicked.connect(self.previous)
+ self._load_button.clicked.connect(self.load_from_file)
+ self._save_button.clicked.connect(self.save_to_file)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button)
+ button_layout_1.addWidget(self._edit_button)
+ button_layout_1.addWidget(self._remove_button)
+ button_layout_1.addWidget(self._find_button)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addWidget(self._load_button)
+ button_layout_1.addWidget(self._save_button)
+ button_layout_1.addStretch()
+
+ button_layout_2 = QHBoxLayout()
+ button_layout_2.addWidget(self._previous_button)
+ button_layout_2.addWidget(self._next_button)
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+ main_layout.addLayout(button_layout_2, 2, 1)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.updateInterface(self.AddingMode)
+ self.update_interface(self.AddingMode)
- def editContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def edit_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.updateInterface(self.EditingMode)
+ self.update_interface(self.EditingMode)
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
- if self.currentMode == self.AddingMode:
+ if self._current_mode == self.AddingMode:
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.currentMode == self.EditingMode:
- if self.oldName != name:
+ elif self._current_mode == self.EditingMode:
+ if self._old_name != name:
if name not in self.contacts:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % self.oldName)
- del self.contacts[self.oldName]
+ QMessageBox.information(self, "Edit Successful",
+ f'"{self.oldName}" has been edited in your '
+ 'address book.')
+ del self.contacts[self._old_name]
self.contacts[name] = address
else:
- QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Edit Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.oldAddress != address:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % name)
+ elif self._old_address != address:
+ QMessageBox.information(self, "Edit Successful",
+ f'"{name}" has been edited in your address book.')
self.contacts[name] = address
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.addressText.setText(self.oldAddress)
- self.updateInterface(self.NavigationMode)
+ self._name_line.setText(self._old_name)
+ self._address_text.setText(self._old_address)
+ self.update_interface(self.NavigationMode)
- def removeContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def remove_contact(self):
+ name = self._name_line.text()
if name in self.contacts:
- button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
- "Are you sure you want to remove \"%s\"?" % name,
- QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+ button = QMessageBox.question(self, "Confirm Remove",
+ f'Are you sure you want to remove "{name}"?',
+ QMessageBox.Yes | QMessageBox.No)
- if button == QtWidgets.QMessageBox.Yes:
+ if button == QMessageBox.Yes:
self.previous()
del self.contacts[name]
- QtWidgets.QMessageBox.information(self, "Remove Successful",
- "\"%s\" has been removed from your address book." % name)
+ QMessageBox.information(self, "Remove Successful",
+ f'"{name}" has been removed from your address book.')
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def next(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
it = iter(self.contacts)
try:
@@ -244,11 +216,12 @@ class AddressBook(QtWidgets.QWidget):
except StopIteration:
next_name, next_address = iter(self.contacts).next()
- self.nameLine.setText(next_name)
- self.addressText.setText(next_address)
+ self._name_line.setText(next_name)
+ self._address_text.setText(next_address)
+ @Slot()
def previous(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
prev_name = prev_address = None
for this_name, this_address in self.contacts:
@@ -258,80 +231,80 @@ class AddressBook(QtWidgets.QWidget):
prev_name = this_name
prev_address = this_address
else:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
return
if prev_name is None:
for prev_name, prev_address in self.contacts:
pass
- self.nameLine.setText(prev_name)
- self.addressText.setText(prev_address)
+ self._name_line.setText(prev_name)
+ self._address_text.setText(prev_address)
- def findContact(self):
+ def find_contact(self):
self.dialog.show()
- if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
- contactName = self.dialog.getFindText()
+ if self.dialog.exec() == QDialog.Accepted:
+ contact_name = self.dialog.get_find_text()
- if contactName in self.contacts:
- self.nameLine.setText(contactName)
- self.addressText.setText(self.contacts[contactName])
+ if contact_name in self.contacts:
+ self._name_line.setText(contact_name)
+ self._address_text.setText(self.contacts[contact_name])
else:
- QtWidgets.QMessageBox.information(self, "Contact Not Found",
- "Sorry, \"%s\" is not in your address book." % contactName)
+ QMessageBox.information(self, "Contact Not Found",
+ f'Sorry, "{contact_name}" is not in your address book.')
return
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
- def updateInterface(self, mode):
- self.currentMode = mode
+ def update_interface(self, mode):
+ self._current_mode = mode
- if self.currentMode in (self.AddingMode, self.EditingMode):
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ if self._current_mode in (self.AddingMode, self.EditingMode):
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.editButton.setEnabled(False)
- self.removeButton.setEnabled(False)
+ self._add_button.setEnabled(False)
+ self._edit_button.setEnabled(False)
+ self._remove_button.setEnabled(False)
- self.nextButton.setEnabled(False)
- self.previousButton.setEnabled(False)
+ self._next_button.setEnabled(False)
+ self._previous_button.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._submit_button.show()
+ self._cancel_button.show()
- self.loadButton.setEnabled(False)
- self.saveButton.setEnabled(False)
+ self._load_button.setEnabled(False)
+ self._save_button.setEnabled(False)
- elif self.currentMode == self.NavigationMode:
+ elif self._current_mode == self.NavigationMode:
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.editButton.setEnabled(number >= 1)
- self.removeButton.setEnabled(number >= 1)
- self.findButton.setEnabled(number > 2)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number >1 )
+ self._edit_button.setEnabled(number >= 1)
+ self._remove_button.setEnabled(number >= 1)
+ self._find_button.setEnabled(number > 2)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
- self.loadButton.setEnabled(True)
- self.saveButton.setEnabled(number >= 1)
+ self._load_button.setEnabled(True)
+ self._save_button.setEnabled(number >= 1)
- def saveToFile(self):
- fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self,
- "Save Address Book", '',
- "Address Book (*.abk);;All Files (*)")
+ def save_to_file(self):
+ fileName, _ = QFileDialog.getSaveFileName(self,
+ "Save Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
if not fileName:
return
@@ -339,17 +312,17 @@ class AddressBook(QtWidgets.QWidget):
try:
out_file = open(str(fileName), 'wb')
except IOError:
- QtWidgets.QMessageBox.information(self, "Unable to open file",
- "There was an error opening \"%s\"" % fileName)
+ QMessageBox.information(self, "Unable to open file",
+ f'There was an error opening "{fileName}"')
return
pickle.dump(self.contacts, out_file)
out_file.close()
- def loadFromFile(self):
- fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self,
- "Open Address Book", '',
- "Address Book (*.abk);;All Files (*)")
+ def load_from_file(self):
+ fileName, _ = QFileDialog.getOpenFileName(self,
+ "Open Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
if not fileName:
return
@@ -357,68 +330,64 @@ class AddressBook(QtWidgets.QWidget):
try:
in_file = open(str(fileName), 'rb')
except IOError:
- QtWidgets.QMessageBox.information(self, "Unable to open file",
- "There was an error opening \"%s\"" % fileName)
+ QMessageBox.information(self, "Unable to open file",
+ f'There was an error opening "{fileName}"')
return
self.contacts = pickle.load(in_file)
in_file.close()
if len(self.contacts) == 0:
- QtWidgets.QMessageBox.information(self, "No contacts in file",
- "The file you are attempting to open contains no "
- "contacts.")
+ QMessageBox.information(self, "No contacts in file",
+ "The file you are attempting to open contains no contacts.")
else:
for name, address in self.contacts:
- self.nameLine.setText(name)
- self.addressText.setText(address)
+ self._name_line.setText(name)
+ self._address_text.setText(address)
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
-class FindDialog(QtWidgets.QDialog):
+class FindDialog(QDialog):
def __init__(self, parent=None):
- super(FindDialog, self).__init__(parent)
+ super().__init__(parent)
- findLabel = QtWidgets.QLabel("Enter the name of a contact:")
- self.lineEdit = QtWidgets.QLineEdit()
+ find_label = QLabel("Enter the name of a contact:")
+ self._line_edit = QLineEdit()
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findText = ''
+ self._find_button = QPushButton("&Find")
+ self._find_text = ''
- layout = QtWidgets.QHBoxLayout()
- layout.addWidget(findLabel)
- layout.addWidget(self.lineEdit)
- layout.addWidget(self.findButton)
+ layout = QHBoxLayout()
+ layout.addWidget(find_label)
+ layout.addWidget(self._line_edit)
+ layout.addWidget(self._find_button)
self.setLayout(layout)
self.setWindowTitle("Find a Contact")
- self.findButton.clicked.connect(self.findClicked)
- self.findButton.clicked.connect(self.accept)
+ self._find_button.clicked.connect(self.find_clicked)
+ self._find_button.clicked.connect(self.accept)
- def findClicked(self):
- text = self.lineEdit.text()
+ def find_clicked(self):
+ text = self._line_edit.text()
if not text:
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name.")
return
- self.findText = text
- self.lineEdit.clear()
+ self._find_text = text
+ self._line_edit.clear()
self.hide()
- def getFindText(self):
- return self.findText
+ def get_find_text(self):
+ return self._find_text
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/addressbook/part7.py b/examples/widgets/tutorials/addressbook/part7.py
index f32a2a6a8..3829c003d 100644
--- a/examples/widgets/tutorials/addressbook/part7.py
+++ b/examples/widgets/tutorials/addressbook/part7.py
@@ -1,48 +1,15 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import pickle
+import sys
-from PySide2 import QtCore, QtWidgets
+from PySide6.QtCore import QFile, QIODevice, QTextStream, Qt, Slot
+from PySide6.QtWidgets import (QApplication, QDialog, QFileDialog,
+ QGridLayout, QHBoxLayout, QLabel, QLineEdit,
+ QMessageBox, QPushButton, QTextEdit,
+ QVBoxLayout, QWidget)
class SortedDict(dict):
@@ -74,170 +41,175 @@ class SortedDict(dict):
iterkeys = __iter__
-class AddressBook(QtWidgets.QWidget):
+class AddressBook(QWidget):
NavigationMode, AddingMode, EditingMode = range(3)
def __init__(self, parent=None):
- super(AddressBook, self).__init__(parent)
+ super().__init__(parent)
self.contacts = SortedDict()
- self.oldName = ''
- self.oldAddress = ''
- self.currentMode = self.NavigationMode
-
- nameLabel = QtWidgets.QLabel("Name:")
- self.nameLine = QtWidgets.QLineEdit()
- self.nameLine.setReadOnly(True)
-
- addressLabel = QtWidgets.QLabel("Address:")
- self.addressText = QtWidgets.QTextEdit()
- self.addressText.setReadOnly(True)
-
- self.addButton = QtWidgets.QPushButton("&Add")
- self.editButton = QtWidgets.QPushButton("&Edit")
- self.editButton.setEnabled(False)
- self.removeButton = QtWidgets.QPushButton("&Remove")
- self.removeButton.setEnabled(False)
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findButton.setEnabled(False)
- self.submitButton = QtWidgets.QPushButton("&Submit")
- self.submitButton.hide()
- self.cancelButton = QtWidgets.QPushButton("&Cancel")
- self.cancelButton.hide()
-
- self.nextButton = QtWidgets.QPushButton("&Next")
- self.nextButton.setEnabled(False)
- self.previousButton = QtWidgets.QPushButton("&Previous")
- self.previousButton.setEnabled(False)
-
- self.loadButton = QtWidgets.QPushButton("&Load...")
- self.loadButton.setToolTip("Load contacts from a file")
- self.saveButton = QtWidgets.QPushButton("Sa&ve...")
- self.saveButton.setToolTip("Save contacts to a file")
- self.saveButton.setEnabled(False)
-
- self.exportButton = QtWidgets.QPushButton("Ex&port")
- self.exportButton.setToolTip("Export as vCard")
- self.exportButton.setEnabled(False)
+ self._old_name = ''
+ self._old_address = ''
+ self._current_mode = self.NavigationMode
+
+ name_label = QLabel("Name:")
+ self._name_line = QLineEdit()
+ self._name_line.setReadOnly(True)
+
+ address_label = QLabel("Address:")
+ self._address_text = QTextEdit()
+ self._address_text.setReadOnly(True)
+
+ self._add_button = QPushButton("&Add")
+ self._edit_button = QPushButton("&Edit")
+ self._edit_button.setEnabled(False)
+ self._remove_button = QPushButton("&Remove")
+ self._remove_button.setEnabled(False)
+ self._find_button = QPushButton("&Find")
+ self._find_button.setEnabled(False)
+ self._submit_button = QPushButton("&Submit")
+ self._submit_button.hide()
+ self._cancel_button = QPushButton("&Cancel")
+ self._cancel_button.hide()
+
+ self._next_button = QPushButton("&Next")
+ self._next_button.setEnabled(False)
+ self._previous_button = QPushButton("&Previous")
+ self._previous_button.setEnabled(False)
+
+ self._load_button = QPushButton("&Load...")
+ self._load_button.setToolTip("Load contacts from a file")
+ self._save_button = QPushButton("Sa&ve...")
+ self._save_button.setToolTip("Save contacts to a file")
+ self._save_button.setEnabled(False)
+
+ self._export_button = QPushButton("Ex&port")
+ self._export_button.setToolTip("Export as vCard")
+ self._export_button.setEnabled(False)
self.dialog = FindDialog()
- self.addButton.clicked.connect(self.addContact)
- self.submitButton.clicked.connect(self.submitContact)
- self.editButton.clicked.connect(self.editContact)
- self.removeButton.clicked.connect(self.removeContact)
- self.findButton.clicked.connect(self.findContact)
- self.cancelButton.clicked.connect(self.cancel)
- self.nextButton.clicked.connect(self.next)
- self.previousButton.clicked.connect(self.previous)
- self.loadButton.clicked.connect(self.loadFromFile)
- self.saveButton.clicked.connect(self.saveToFile)
- self.exportButton.clicked.connect(self.exportAsVCard)
-
- buttonLayout1 = QtWidgets.QVBoxLayout()
- buttonLayout1.addWidget(self.addButton)
- buttonLayout1.addWidget(self.editButton)
- buttonLayout1.addWidget(self.removeButton)
- buttonLayout1.addWidget(self.findButton)
- buttonLayout1.addWidget(self.submitButton)
- buttonLayout1.addWidget(self.cancelButton)
- buttonLayout1.addWidget(self.loadButton)
- buttonLayout1.addWidget(self.saveButton)
- buttonLayout1.addWidget(self.exportButton)
- buttonLayout1.addStretch()
-
- buttonLayout2 = QtWidgets.QHBoxLayout()
- buttonLayout2.addWidget(self.previousButton)
- buttonLayout2.addWidget(self.nextButton)
-
- mainLayout = QtWidgets.QGridLayout()
- mainLayout.addWidget(nameLabel, 0, 0)
- mainLayout.addWidget(self.nameLine, 0, 1)
- mainLayout.addWidget(addressLabel, 1, 0, QtCore.Qt.AlignTop)
- mainLayout.addWidget(self.addressText, 1, 1)
- mainLayout.addLayout(buttonLayout1, 1, 2)
- mainLayout.addLayout(buttonLayout2, 2, 1)
-
- self.setLayout(mainLayout)
+ self._add_button.clicked.connect(self.add_contact)
+ self._submit_button.clicked.connect(self.submit_contact)
+ self._edit_button.clicked.connect(self.edit_contact)
+ self._remove_button.clicked.connect(self.remove_contact)
+ self._find_button.clicked.connect(self.find_contact)
+ self._cancel_button.clicked.connect(self.cancel)
+ self._next_button.clicked.connect(self.next)
+ self._previous_button.clicked.connect(self.previous)
+ self._load_button.clicked.connect(self.load_from_file)
+ self._save_button.clicked.connect(self.save_to_file)
+ self._export_button.clicked.connect(self.export_as_vcard)
+
+ button_layout_1 = QVBoxLayout()
+ button_layout_1.addWidget(self._add_button)
+ button_layout_1.addWidget(self._edit_button)
+ button_layout_1.addWidget(self._remove_button)
+ button_layout_1.addWidget(self._find_button)
+ button_layout_1.addWidget(self._submit_button)
+ button_layout_1.addWidget(self._cancel_button)
+ button_layout_1.addWidget(self._load_button)
+ button_layout_1.addWidget(self._save_button)
+ button_layout_1.addWidget(self._export_button)
+ button_layout_1.addStretch()
+
+ button_layout_2 = QHBoxLayout()
+ button_layout_2.addWidget(self._previous_button)
+ button_layout_2.addWidget(self._next_button)
+
+ main_layout = QGridLayout()
+ main_layout.addWidget(name_label, 0, 0)
+ main_layout.addWidget(self._name_line, 0, 1)
+ main_layout.addWidget(address_label, 1, 0, Qt.AlignTop)
+ main_layout.addWidget(self._address_text, 1, 1)
+ main_layout.addLayout(button_layout_1, 1, 2)
+ main_layout.addLayout(button_layout_2, 2, 1)
+
+ self.setLayout(main_layout)
self.setWindowTitle("Simple Address Book")
- def addContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def add_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.updateInterface(self.AddingMode)
+ self.update_interface(self.AddingMode)
- def editContact(self):
- self.oldName = self.nameLine.text()
- self.oldAddress = self.addressText.toPlainText()
+ @Slot()
+ def edit_contact(self):
+ self._old_name = self._name_line.text()
+ self._old_address = self._address_text.toPlainText()
- self.updateInterface(self.EditingMode)
+ self.update_interface(self.EditingMode)
- def submitContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def submit_contact(self):
+ name = self._name_line.text()
+ address = self._address_text.toPlainText()
if name == "" or address == "":
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name and address.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name and address.")
return
- if self.currentMode == self.AddingMode:
+ if self._current_mode == self.AddingMode:
if name not in self.contacts:
self.contacts[name] = address
- QtWidgets.QMessageBox.information(self, "Add Successful",
- "\"%s\" has been added to your address book." % name)
+ QMessageBox.information(self, "Add Successful",
+ f'"{name}" has been added to your address book.')
else:
- QtWidgets.QMessageBox.information(self, "Add Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Add Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.currentMode == self.EditingMode:
- if self.oldName != name:
+ elif self._current_mode == self.EditingMode:
+ if self._old_name != name:
if name not in self.contacts:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % self.oldName)
- del self.contacts[self.oldName]
+ QMessageBox.information(self, "Edit Successful",
+ f'"{self.oldName}" has been edited in your '
+ 'address book.')
+ del self.contacts[self._old_name]
self.contacts[name] = address
else:
- QtWidgets.QMessageBox.information(self, "Edit Unsuccessful",
- "Sorry, \"%s\" is already in your address book." % name)
+ QMessageBox.information(self, "Edit Unsuccessful",
+ f'Sorry, "{name}" is already in your address book.')
return
- elif self.oldAddress != address:
- QtWidgets.QMessageBox.information(self, "Edit Successful",
- "\"%s\" has been edited in your address book." % name)
+ elif self._old_address != address:
+ QMessageBox.information(self, "Edit Successful",
+ f'"{name}" has been edited in your address book.')
self.contacts[name] = address
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def cancel(self):
- self.nameLine.setText(self.oldName)
- self.addressText.setText(self.oldAddress)
- self.updateInterface(self.NavigationMode)
+ self._name_line.setText(self._old_name)
+ self._address_text.setText(self._old_address)
+ self.update_interface(self.NavigationMode)
- def removeContact(self):
- name = self.nameLine.text()
- address = self.addressText.toPlainText()
+ @Slot()
+ def remove_contact(self):
+ name = self._name_line.text()
if name in self.contacts:
- button = QtWidgets.QMessageBox.question(self, "Confirm Remove",
- "Are you sure you want to remove \"%s\"?" % name,
- QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
+ button = QMessageBox.question(self, "Confirm Remove",
+ f'Are you sure you want to remove "{name}"?',
+ QMessageBox.Yes | QMessageBox.No)
- if button == QtWidgets.QMessageBox.Yes:
+ if button == QMessageBox.Yes:
self.previous()
del self.contacts[name]
- QtWidgets.QMessageBox.information(self, "Remove Successful",
- "\"%s\" has been removed from your address book." % name)
+ QMessageBox.information(self, "Remove Successful",
+ f'"{name}" has been removed from your address book.')
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
+ @Slot()
def next(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
it = iter(self.contacts)
try:
@@ -250,11 +222,12 @@ class AddressBook(QtWidgets.QWidget):
except StopIteration:
next_name, next_address = iter(self.contacts).next()
- self.nameLine.setText(next_name)
- self.addressText.setText(next_address)
+ self._name_line.setText(next_name)
+ self._address_text.setText(next_address)
+ @Slot()
def previous(self):
- name = self.nameLine.text()
+ name = self._name_line.text()
prev_name = prev_address = None
for this_name, this_address in self.contacts:
@@ -264,83 +237,83 @@ class AddressBook(QtWidgets.QWidget):
prev_name = this_name
prev_address = this_address
else:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
return
if prev_name is None:
for prev_name, prev_address in self.contacts:
pass
- self.nameLine.setText(prev_name)
- self.addressText.setText(prev_address)
+ self._name_line.setText(prev_name)
+ self._address_text.setText(prev_address)
- def findContact(self):
+ def find_contact(self):
self.dialog.show()
- if self.dialog.exec_() == QtWidgets.QDialog.Accepted:
- contactName = self.dialog.getFindText()
+ if self.dialog.exec() == QDialog.Accepted:
+ contact_name = self.dialog.get_find_text()
- if contactName in self.contacts:
- self.nameLine.setText(contactName)
- self.addressText.setText(self.contacts[contactName])
+ if contact_name in self.contacts:
+ self._name_line.setText(contact_name)
+ self._address_text.setText(self.contacts[contact_name])
else:
- QtWidgets.QMessageBox.information(self, "Contact Not Found",
- "Sorry, \"%s\" is not in your address book." % contactName)
+ QMessageBox.information(self, "Contact Not Found",
+ f'Sorry, "{contact_name}" is not in your address book.')
return
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
- def updateInterface(self, mode):
- self.currentMode = mode
+ def update_interface(self, mode):
+ self._current_mode = mode
- if self.currentMode in (self.AddingMode, self.EditingMode):
- self.nameLine.setReadOnly(False)
- self.nameLine.setFocus(QtCore.Qt.OtherFocusReason)
- self.addressText.setReadOnly(False)
+ if self._current_mode in (self.AddingMode, self.EditingMode):
+ self._name_line.setReadOnly(False)
+ self._name_line.setFocus(Qt.OtherFocusReason)
+ self._address_text.setReadOnly(False)
- self.addButton.setEnabled(False)
- self.editButton.setEnabled(False)
- self.removeButton.setEnabled(False)
+ self._add_button.setEnabled(False)
+ self._edit_button.setEnabled(False)
+ self._remove_button.setEnabled(False)
- self.nextButton.setEnabled(False)
- self.previousButton.setEnabled(False)
+ self._next_button.setEnabled(False)
+ self._previous_button.setEnabled(False)
- self.submitButton.show()
- self.cancelButton.show()
+ self._submit_button.show()
+ self._cancel_button.show()
- self.loadButton.setEnabled(False)
- self.saveButton.setEnabled(False)
- self.exportButton.setEnabled(False)
+ self._load_button.setEnabled(False)
+ self._save_button.setEnabled(False)
+ self._export_button.setEnabled(False)
- elif self.currentMode == self.NavigationMode:
+ elif self._current_mode == self.NavigationMode:
if not self.contacts:
- self.nameLine.clear()
- self.addressText.clear()
+ self._name_line.clear()
+ self._address_text.clear()
- self.nameLine.setReadOnly(True)
- self.addressText.setReadOnly(True)
- self.addButton.setEnabled(True)
+ self._name_line.setReadOnly(True)
+ self._address_text.setReadOnly(True)
+ self._add_button.setEnabled(True)
number = len(self.contacts)
- self.editButton.setEnabled(number >= 1)
- self.removeButton.setEnabled(number >= 1)
- self.findButton.setEnabled(number > 2)
- self.nextButton.setEnabled(number > 1)
- self.previousButton.setEnabled(number >1 )
+ self._edit_button.setEnabled(number >= 1)
+ self._remove_button.setEnabled(number >= 1)
+ self._find_button.setEnabled(number > 2)
+ self._next_button.setEnabled(number > 1)
+ self._previous_button.setEnabled(number > 1)
- self.submitButton.hide()
- self.cancelButton.hide()
+ self._submit_button.hide()
+ self._cancel_button.hide()
- self.exportButton.setEnabled(number >= 1)
+ self._export_button.setEnabled(number >= 1)
- self.loadButton.setEnabled(True)
- self.saveButton.setEnabled(number >= 1)
+ self._load_button.setEnabled(True)
+ self._save_button.setEnabled(number >= 1)
- def saveToFile(self):
- fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self,
- "Save Address Book", '',
- "Address Book (*.abk);;All Files (*)")
+ def save_to_file(self):
+ fileName, _ = QFileDialog.getSaveFileName(self,
+ "Save Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
if not fileName:
return
@@ -348,17 +321,17 @@ class AddressBook(QtWidgets.QWidget):
try:
out_file = open(str(fileName), 'wb')
except IOError:
- QtWidgets.QMessageBox.information(self, "Unable to open file",
- "There was an error opening \"%s\"" % fileName)
+ QMessageBox.information(self, "Unable to open file",
+ f'There was an error opening "{fileName}"')
return
pickle.dump(self.contacts, out_file)
out_file.close()
- def loadFromFile(self):
- fileName,_ = QtWidgets.QFileDialog.getOpenFileName(self,
- "Open Address Book", '',
- "Address Book (*.abk);;All Files (*)")
+ def load_from_file(self):
+ fileName, _ = QFileDialog.getOpenFileName(self,
+ "Open Address Book", '',
+ "Address Book (*.abk);;All Files (*)")
if not fileName:
return
@@ -366,56 +339,54 @@ class AddressBook(QtWidgets.QWidget):
try:
in_file = open(str(fileName), 'rb')
except IOError:
- QtWidgets.QMessageBox.information(self, "Unable to open file",
- "There was an error opening \"%s\"" % fileName)
+ QMessageBox.information(self, "Unable to open file",
+ f'There was an error opening "{fileName}"')
return
self.contacts = pickle.load(in_file)
in_file.close()
if len(self.contacts) == 0:
- QtWidgets.QMessageBox.information(self, "No contacts in file",
- "The file you are attempting to open contains no "
- "contacts.")
+ QMessageBox.information(self, "No contacts in file",
+ "The file you are attempting to open contains no contacts.")
else:
for name, address in self.contacts:
- self.nameLine.setText(name)
- self.addressText.setText(address)
+ self._name_line.setText(name)
+ self._address_text.setText(address)
- self.updateInterface(self.NavigationMode)
+ self.update_interface(self.NavigationMode)
- def exportAsVCard(self):
- name = str(self.nameLine.text())
- address = self.addressText.toPlainText()
+ def export_as_vcard(self):
+ name = str(self._name_line.text())
+ address = self._address_text.toPlainText()
- nameList = name.split()
+ name_list = name.split()
- if len(nameList) > 1:
- firstName = nameList[0]
- lastName = nameList[-1]
+ if len(name_list) > 1:
+ first_name = name_list[0]
+ last_name = name_list[-1]
else:
- firstName = name
- lastName = ''
+ first_name = name
+ last_name = ''
- fileName = QtWidgets.QFileDialog.getSaveFileName(self, "Export Contact",
- '', "vCard Files (*.vcf);;All Files (*)")[0]
+ file_name = QFileDialog.getSaveFileName(self, "Export Contact",
+ '', "vCard Files (*.vcf);;All Files (*)")[0]
- if not fileName:
+ if not file_name:
return
- out_file = QtCore.QFile(fileName)
+ out_file = QFile(file_name)
- if not out_file.open(QtCore.QIODevice.WriteOnly):
- QtWidgets.QMessageBox.information(self, "Unable to open file",
- out_file.errorString())
+ if not out_file.open(QIODevice.WriteOnly):
+ QMessageBox.information(self, "Unable to open file", out_file.errorString())
return
- out_s = QtCore.QTextStream(out_file)
+ out_s = QTextStream(out_file)
out_s << 'BEGIN:VCARD' << '\n'
out_s << 'VERSION:2.1' << '\n'
- out_s << 'N:' << lastName << ';' << firstName << '\n'
- out_s << 'FN:' << ' '.join(nameList) << '\n'
+ out_s << 'N:' << last_name << ';' << first_name << '\n'
+ out_s << 'FN:' << ' '.join(name_list) << '\n'
address.replace(';', '\\;')
address.replace('\n', ';')
@@ -424,53 +395,50 @@ class AddressBook(QtWidgets.QWidget):
out_s << 'ADR;HOME:;' << address << '\n'
out_s << 'END:VCARD' << '\n'
- QtWidgets.QMessageBox.information(self, "Export Successful",
- "\"%s\" has been exported as a vCard." % name)
+ QMessageBox.information(self, "Export Successful",
+ f'"{name}" has been exported as a vCard.')
-class FindDialog(QtWidgets.QDialog):
+class FindDialog(QDialog):
def __init__(self, parent=None):
- super(FindDialog, self).__init__(parent)
+ super().__init__(parent)
- findLabel = QtWidgets.QLabel("Enter the name of a contact:")
- self.lineEdit = QtWidgets.QLineEdit()
+ find_label = QLabel("Enter the name of a contact:")
+ self._line_edit = QLineEdit()
- self.findButton = QtWidgets.QPushButton("&Find")
- self.findText = ''
+ self._find_button = QPushButton("&Find")
+ self._find_text = ''
- layout = QtWidgets.QHBoxLayout()
- layout.addWidget(findLabel)
- layout.addWidget(self.lineEdit)
- layout.addWidget(self.findButton)
+ layout = QHBoxLayout()
+ layout.addWidget(find_label)
+ layout.addWidget(self._line_edit)
+ layout.addWidget(self._find_button)
self.setLayout(layout)
self.setWindowTitle("Find a Contact")
- self.findButton.clicked.connect(self.findClicked)
- self.findButton.clicked.connect(self.accept)
+ self._find_button.clicked.connect(self.find_clicked)
+ self._find_button.clicked.connect(self.accept)
- def findClicked(self):
- text = self.lineEdit.text()
+ def find_clicked(self):
+ text = self._line_edit.text()
if not text:
- QtWidgets.QMessageBox.information(self, "Empty Field",
- "Please enter a name.")
+ QMessageBox.information(self, "Empty Field", "Please enter a name.")
return
- self.findText = text
- self.lineEdit.clear()
+ self._find_text = text
+ self._line_edit.clear()
self.hide()
- def getFindText(self):
- return self.findText
+ def get_find_text(self):
+ return self._find_text
if __name__ == '__main__':
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
+ app = QApplication(sys.argv)
- addressBook = AddressBook()
- addressBook.show()
+ address_book = AddressBook()
+ address_book.show()
- sys.exit(app.exec_())
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/cannon.pyproject b/examples/widgets/tutorials/cannon/cannon.pyproject
new file mode 100644
index 000000000..09478e108
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/cannon.pyproject
@@ -0,0 +1,5 @@
+{
+ "files": ["t6.py", "t9.py", "t8.py", "t13.py", "t10.py", "t7.py",
+ "t3.py", "t4.py", "t1.py", "t12.py", "t2.py", "t5.py",
+ "t11.py", "t14.py"]
+}
diff --git a/examples/widgets/tutorials/cannon/doc/cannon.png b/examples/widgets/tutorials/cannon/doc/cannon.png
new file mode 100644
index 000000000..1bdc9db88
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/doc/cannon.png
Binary files differ
diff --git a/examples/widgets/tutorials/cannon/doc/cannon.rst b/examples/widgets/tutorials/cannon/doc/cannon.rst
new file mode 100644
index 000000000..da7cc556b
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/doc/cannon.rst
@@ -0,0 +1,8 @@
+Cannon Example
+==============
+
+Simple Cannon example.
+
+.. image:: cannon.png
+ :width: 400
+ :alt: Cannon Screenshot
diff --git a/examples/widgets/tutorials/cannon/t1.py b/examples/widgets/tutorials/cannon/t1.py
new file mode 100644
index 000000000..62411ace2
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t1.py
@@ -0,0 +1,20 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 1
+
+
+import sys
+
+from PySide6.QtWidgets import QApplication, QPushButton
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ hello = QPushButton("Hello world!")
+ hello.resize(100, 30)
+
+ hello.show()
+
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t10.py b/examples/widgets/tutorials/cannon/t10.py
new file mode 100644
index 000000000..8649bb562
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t10.py
@@ -0,0 +1,152 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 10
+
+
+import sys
+
+from PySide6.QtCore import QRect, Qt, Signal, Slot, qWarning
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLCDNumber,
+ QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+ force_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self._current_force = 0
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def force(self):
+ return self._current_force
+
+ @Slot(int)
+ def set_force(self, force):
+ if force < 0:
+ force = 0
+ if self._current_force == force:
+ return
+ self._current_force = force
+ self.force_changed.emit(self._current_force)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(QRect(33, -4, 15, 8))
+
+ def cannon_rect(self):
+ result = QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("&Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange()
+ angle.set_range(5, 70)
+
+ force = LCDRange()
+ force.set_range(10, 50)
+
+ cannon_field = CannonField()
+
+ angle.value_changed.connect(cannon_field.set_angle)
+ cannon_field.angle_changed.connect(angle.set_value)
+
+ force.value_changed.connect(cannon_field.set_force)
+ cannon_field.force_changed.connect(force.set_value)
+
+ left_layout = QVBoxLayout()
+ left_layout.addWidget(angle)
+ left_layout.addWidget(force)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addLayout(left_layout, 1, 0)
+ grid_layout.addWidget(cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ force.set_value(25)
+ angle.setFocus()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.setGeometry(100, 100, 500, 355)
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t11.py b/examples/widgets/tutorials/cannon/t11.py
new file mode 100644
index 000000000..fbfd2481d
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t11.py
@@ -0,0 +1,224 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 11
+
+
+import sys
+import math
+
+from PySide6.QtCore import QPoint, QRect, QTimer, Qt, Signal, Slot, qWarning
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette, QRegion
+from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout,
+ QLCDNumber, QPushButton, QSlider,
+ QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+ force_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self._current_force = 0
+ self._timer_count = 0
+ self._auto_shoot_timer = QTimer(self)
+ self._auto_shoot_timer.timeout.connect(self.move_shot)
+ self._shoot_angle = 0
+ self._shoot_force = 0
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def force(self):
+ return self._current_force
+
+ @Slot(int)
+ def set_force(self, force):
+ if force < 0:
+ force = 0
+ if self._current_force == force:
+ return
+ self._current_force = force
+ self.force_changed.emit(self._current_force)
+
+ @Slot()
+ def shoot(self):
+ if self._auto_shoot_timer.isActive():
+ return
+ self._timer_count = 0
+ self._shoot_angle = self._current_angle
+ self._shoot_force = self._current_force
+ self._auto_shoot_timer.start(5)
+
+ @Slot()
+ def move_shot(self):
+ region = QRegion(self.shot_rect())
+ self._timer_count += 1
+
+ shot_r = self.shot_rect()
+
+ if shot_r.x() > self.width() or shot_r.y() > self.height():
+ self._auto_shoot_timer.stop()
+ else:
+ region = region.united(QRegion(shot_r))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ self.paint_cannon(painter)
+ if self._auto_shoot_timer.isActive():
+ self.paint_shot(painter)
+
+ def paint_shot(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.black)
+ painter.drawRect(self.shot_rect())
+
+ barrel_rect = QRect(33, -4, 15, 8)
+
+ def paint_cannon(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(CannonField.barrel_rect)
+ painter.restore()
+
+ def cannon_rect(self):
+ result = QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shot_rect(self):
+ gravity = 4.0
+
+ time = self._timer_count / 40.0
+ velocity = self._shoot_force
+ radians = self._shoot_angle * math.pi / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrel_rect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrel_rect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QRect(0, 0, 6, 6)
+ result.moveCenter(QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("&Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange()
+ angle.set_range(5, 70)
+
+ force = LCDRange()
+ force.set_range(10, 50)
+
+ cannon_field = CannonField()
+
+ angle.value_changed.connect(cannon_field.set_angle)
+ cannon_field.angle_changed.connect(angle.set_value)
+
+ force.value_changed.connect(cannon_field.set_force)
+ cannon_field.force_changed.connect(force.set_value)
+
+ shoot = QPushButton("&Shoot")
+ shoot.setFont(QFont("Times", 18, QFont.Bold))
+
+ shoot.clicked.connect(cannon_field.shoot)
+
+ top_layout = QHBoxLayout()
+ top_layout.addWidget(shoot)
+ top_layout.addStretch(1)
+
+ left_layout = QVBoxLayout()
+ left_layout.addWidget(angle)
+ left_layout.addWidget(force)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addLayout(top_layout, 0, 1)
+ grid_layout.addLayout(left_layout, 1, 0)
+ grid_layout.addWidget(cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ force.set_value(25)
+ angle.setFocus()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.setGeometry(100, 100, 500, 355)
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t12.py b/examples/widgets/tutorials/cannon/t12.py
new file mode 100644
index 000000000..749c24684
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t12.py
@@ -0,0 +1,275 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 12
+
+
+import sys
+import math
+import random
+
+from PySide6.QtCore import QPoint, QRect, QTime, QTimer, Qt, Signal, Slot, qWarning
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette, QRegion
+from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout,
+ QLabel, QLCDNumber, QPushButton, QSlider,
+ QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QWidget):
+ parent = text
+ text = None
+
+ super().__init__(parent)
+
+ self.init()
+
+ if text:
+ self.set_text(text)
+
+ def init(self):
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QLabel()
+ self.label.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def set_text(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+ force_changed = Signal(int)
+ hit = Signal()
+ missed = Signal()
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self._current_force = 0
+ self._timer_count = 0
+ self._auto_shoot_timer = QTimer(self)
+ self._auto_shoot_timer.timeout.connect(self.move_shot)
+ self._shoot_angle = 0
+ self._shoot_force = 0
+ self.target = QPoint(0, 0)
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.new_target()
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def force(self):
+ return self._current_force
+
+ @Slot(int)
+ def set_force(self, force):
+ if force < 0:
+ force = 0
+ if self._current_force == force:
+ return
+ self._current_force = force
+ self.force_changed.emit(self._current_force)
+
+ @Slot()
+ def shoot(self):
+ if self._auto_shoot_timer.isActive():
+ return
+ self._timer_count = 0
+ self._shoot_angle = self._current_angle
+ self._shoot_force = self._current_force
+ self._auto_shoot_timer.start(5)
+
+ first_time = True
+
+ def new_target(self):
+ if CannonField.first_time:
+ CannonField.first_time = False
+ midnight = QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QTime.currentTime()))
+
+ self.target = QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ @Slot()
+ def move_shot(self):
+ region = QRegion(self.shot_rect())
+ self._timer_count += 1
+
+ shot_r = self.shot_rect()
+
+ if shot_r.intersects(self.target_rect()):
+ self._auto_shoot_timer.stop()
+ self.hit.emit()
+ elif shot_r.x() > self.width() or shot_r.y() > self.height():
+ self._auto_shoot_timer.stop()
+ self.missed.emit()
+ else:
+ region = region.united(QRegion(shot_r))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ self.paint_cannon(painter)
+ if self._auto_shoot_timer.isActive():
+ self.paint_shot(painter)
+
+ self.paint_target(painter)
+
+ def paint_shot(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.black)
+ painter.drawRect(self.shot_rect())
+
+ def paint_target(self, painter):
+ painter.setPen(Qt.black)
+ painter.setBrush(Qt.red)
+ painter.drawRect(self.target_rect())
+
+ barrel_rect = QRect(33, -4, 15, 8)
+
+ def paint_cannon(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(CannonField.barrel_rect)
+ painter.restore()
+
+ def cannon_rect(self):
+ result = QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shot_rect(self):
+ gravity = 4.0
+
+ time = self._timer_count / 40.0
+ velocity = self._shoot_force
+ radians = self._shoot_angle * math.pi / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrel_rect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrel_rect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QRect(0, 0, 6, 6)
+ result.moveCenter(QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def target_rect(self):
+ result = QRect(0, 0, 20, 10)
+ result.moveCenter(QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("&Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange("ANGLE")
+ angle.set_range(5, 70)
+
+ force = LCDRange("FORCE")
+ force.set_range(10, 50)
+
+ cannon_field = CannonField()
+
+ angle.value_changed.connect(cannon_field.set_angle)
+ cannon_field.angle_changed.connect(angle.set_value)
+
+ force.value_changed.connect(cannon_field.set_force)
+ cannon_field.force_changed.connect(force.set_value)
+
+ shoot = QPushButton("&Shoot")
+ shoot.setFont(QFont("Times", 18, QFont.Bold))
+
+ shoot.clicked.connect(cannon_field.shoot)
+
+ top_layout = QHBoxLayout()
+ top_layout.addWidget(shoot)
+ top_layout.addStretch(1)
+
+ left_layout = QVBoxLayout()
+ left_layout.addWidget(angle)
+ left_layout.addWidget(force)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addLayout(top_layout, 0, 1)
+ grid_layout.addLayout(left_layout, 1, 0)
+ grid_layout.addWidget(cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ force.set_value(25)
+ angle.setFocus()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.setGeometry(100, 100, 500, 355)
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t13.py b/examples/widgets/tutorials/cannon/t13.py
new file mode 100644
index 000000000..f9a771d15
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t13.py
@@ -0,0 +1,356 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 13
+
+
+import sys
+import math
+import random
+
+from PySide6.QtCore import (QPoint, QRect, QTime, QTimer, Qt,
+ Signal, Slot, qWarning)
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette, QRegion
+from PySide6.QtWidgets import (QApplication, QGridLayout, QHBoxLayout, QLabel,
+ QLCDNumber, QPushButton, QSizePolicy, QSlider,
+ QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QWidget):
+ parent = text
+ text = None
+
+ super().__init__(parent)
+
+ self.init()
+
+ if text:
+ self.set_text(text)
+
+ def init(self):
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QLabel()
+ self.label.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
+ self.label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def set_text(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+ force_changed = Signal(int)
+ hit = Signal()
+ missed = Signal()
+ can_shoot = Signal(bool)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self._current_force = 0
+ self._timer_count = 0
+ self._auto_shoot_timer = QTimer(self)
+ self._auto_shoot_timer.timeout.connect(self.move_shot)
+ self._shoot_angle = 0
+ self._shoot_force = 0
+ self.target = QPoint(0, 0)
+ self._game_ended = False
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.new_target()
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def force(self):
+ return self._current_force
+
+ @Slot(int)
+ def set_force(self, force):
+ if force < 0:
+ force = 0
+ if self._current_force == force:
+ return
+ self._current_force = force
+ self.force_changed.emit(self._current_force)
+
+ @Slot()
+ def shoot(self):
+ if self.is_shooting():
+ return
+ self._timer_count = 0
+ self._shoot_angle = self._current_angle
+ self._shoot_force = self._current_force
+ self._auto_shoot_timer.start(5)
+ self.can_shoot.emit(False)
+
+ first_time = True
+
+ def new_target(self):
+ if CannonField.first_time:
+ CannonField.first_time = False
+ midnight = QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QTime.currentTime()))
+
+ self.target = QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ def set_game_over(self):
+ if self._game_ended:
+ return
+ if self.is_shooting():
+ self._auto_shoot_timer.stop()
+ self._game_ended = True
+ self.update()
+
+ def restart_game(self):
+ if self.is_shooting():
+ self._auto_shoot_timer.stop()
+ self._game_ended = False
+ self.update()
+ self.can_shoot.emit(True)
+
+ @Slot()
+ def move_shot(self):
+ region = QRegion(self.shot_rect())
+ self._timer_count += 1
+
+ shot_r = self.shot_rect()
+
+ if shot_r.intersects(self.target_rect()):
+ self._auto_shoot_timer.stop()
+ self.hit.emit()
+ self.can_shoot.emit(True)
+ elif shot_r.x() > self.width() or shot_r.y() > self.height():
+ self._auto_shoot_timer.stop()
+ self.missed.emit()
+ self.can_shoot.emit(True)
+ else:
+ region = region.united(QRegion(shot_r))
+
+ self.update(region)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ if self._game_ended:
+ painter.setPen(Qt.black)
+ painter.setFont(QFont("Courier", 48, QFont.Bold))
+ painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
+
+ self.paint_cannon(painter)
+ if self.is_shooting():
+ self.paint_shot(painter)
+ if not self._game_ended:
+ self.paint_target(painter)
+
+ def paint_shot(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.black)
+ painter.drawRect(self.shot_rect())
+
+ def paint_target(self, painter):
+ painter.setPen(Qt.black)
+ painter.setBrush(Qt.red)
+ painter.drawRect(self.target_rect())
+
+ barrel_rect = QRect(33, -4, 15, 8)
+
+ def paint_cannon(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(CannonField.barrel_rect)
+ painter.restore()
+
+ def cannon_rect(self):
+ result = QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shot_rect(self):
+ gravity = 4.0
+
+ time = self._timer_count / 40.0
+ velocity = self._shoot_force
+ radians = self._shoot_angle * math.pi / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrel_rect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrel_rect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QRect(0, 0, 6, 6)
+ result.moveCenter(QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def target_rect(self):
+ result = QRect(0, 0, 20, 10)
+ result.moveCenter(QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+ def game_over(self):
+ return self._game_ended
+
+ def is_shooting(self):
+ return self._auto_shoot_timer.isActive()
+
+
+class GameBoard(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("&Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange("ANGLE")
+ angle.set_range(5, 70)
+
+ force = LCDRange("FORCE")
+ force.set_range(10, 50)
+
+ self._cannon_field = CannonField()
+
+ angle.value_changed.connect(self._cannon_field.set_angle)
+ self._cannon_field.angle_changed.connect(angle.set_value)
+
+ force.value_changed.connect(self._cannon_field.set_force)
+ self._cannon_field.force_changed.connect(force.set_value)
+
+ self._cannon_field.hit.connect(self.hit)
+ self._cannon_field.missed.connect(self.missed)
+
+ shoot = QPushButton("&Shoot")
+ shoot.setFont(QFont("Times", 18, QFont.Bold))
+
+ shoot.clicked.connect(self.fire)
+ self._cannon_field.can_shoot.connect(shoot.setEnabled)
+
+ restart = QPushButton("&New Game")
+ restart.setFont(QFont("Times", 18, QFont.Bold))
+
+ restart.clicked.connect(self.new_game)
+
+ self.hits = QLCDNumber(2)
+ self._shots_left = QLCDNumber(2)
+ hits_label = QLabel("HITS")
+ shots_left_label = QLabel("SHOTS LEFT")
+
+ top_layout = QHBoxLayout()
+ top_layout.addWidget(shoot)
+ top_layout.addWidget(self.hits)
+ top_layout.addWidget(hits_label)
+ top_layout.addWidget(self._shots_left)
+ top_layout.addWidget(shots_left_label)
+ top_layout.addStretch(1)
+ top_layout.addWidget(restart)
+
+ left_layout = QVBoxLayout()
+ left_layout.addWidget(angle)
+ left_layout.addWidget(force)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addLayout(top_layout, 0, 1)
+ grid_layout.addLayout(left_layout, 1, 0)
+ grid_layout.addWidget(self._cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ force.set_value(25)
+ angle.setFocus()
+
+ self.new_game()
+
+ @Slot()
+ def fire(self):
+ if self._cannon_field.game_over() or self._cannon_field.is_shooting():
+ return
+ self._shots_left.display(self._shots_left.intValue() - 1)
+ self._cannon_field.shoot()
+
+ @Slot()
+ def hit(self):
+ self.hits.display(self.hits.intValue() + 1)
+ if self._shots_left.intValue() == 0:
+ self._cannon_field.set_game_over()
+ else:
+ self._cannon_field.new_target()
+
+ @Slot()
+ def missed(self):
+ if self._shots_left.intValue() == 0:
+ self._cannon_field.set_game_over()
+
+ @Slot()
+ def new_game(self):
+ self._shots_left.display(15)
+ self.hits.display(0)
+ self._cannon_field.restart_game()
+ self._cannon_field.new_target()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ board = GameBoard()
+ board.setGeometry(100, 100, 500, 355)
+ board.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t14.py b/examples/widgets/tutorials/cannon/t14.py
new file mode 100644
index 000000000..3c94408f3
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t14.py
@@ -0,0 +1,410 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 14
+
+
+import sys
+import math
+import random
+
+from PySide6.QtCore import (QPoint, QRect, QTime, QTimer, QSize, Qt,
+ Signal, Slot, qWarning)
+from PySide6.QtGui import (QColor, QFont, QKeySequence, QPainter, QPalette,
+ QShortcut, QRegion, QTransform)
+from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QHBoxLayout,
+ QLabel, QLCDNumber, QPushButton, QSizePolicy,
+ QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, text=None, parent=None):
+ if isinstance(text, QWidget):
+ parent = text
+ text = None
+
+ super().__init__(parent)
+
+ self.init()
+
+ if text:
+ self.set_text(text)
+
+ def init(self):
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+ self.label = QLabel()
+ self.label.setAlignment(Qt.AlignHCenter | Qt.AlignTop)
+ self.label.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+ layout.addWidget(self.label)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def text(self):
+ return self.label.text()
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+ def set_text(self, text):
+ self.label.setText(text)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+ force_changed = Signal(int)
+ hit = Signal()
+ missed = Signal()
+ can_shoot = Signal(bool)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self._current_force = 0
+ self._timer_count = 0
+ self._auto_shoot_timer = QTimer(self)
+ self._auto_shoot_timer.timeout.connect(self.move_shot)
+ self._shoot_angle = 0
+ self._shoot_force = 0
+ self.target = QPoint(0, 0)
+ self._game_ended = False
+ self._barrel_pressed = False
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+ self.new_target()
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def force(self):
+ return self._current_force
+
+ @Slot(int)
+ def set_force(self, force):
+ if force < 0:
+ force = 0
+ if self._current_force == force:
+ return
+ self._current_force = force
+ self.force_changed.emit(self._current_force)
+
+ @Slot()
+ def shoot(self):
+ if self.is_shooting():
+ return
+ self._timer_count = 0
+ self._shoot_angle = self._current_angle
+ self._shoot_force = self._current_force
+ self._auto_shoot_timer.start(5)
+ self.can_shoot.emit(False)
+
+ first_time = True
+
+ def new_target(self):
+ if CannonField.first_time:
+ CannonField.first_time = False
+ midnight = QTime(0, 0, 0)
+ random.seed(midnight.secsTo(QTime.currentTime()))
+
+ self.target = QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1))
+ self.update()
+
+ def set_game_over(self):
+ if self._game_ended:
+ return
+ if self.is_shooting():
+ self._auto_shoot_timer.stop()
+ self._game_ended = True
+ self.update()
+
+ def restart_game(self):
+ if self.is_shooting():
+ self._auto_shoot_timer.stop()
+ self._game_ended = False
+ self.update()
+ self.can_shoot.emit(True)
+
+ @Slot()
+ def move_shot(self):
+ region = QRegion(self.shot_rect())
+ self._timer_count += 1
+
+ shot_r = self.shot_rect()
+
+ if shot_r.intersects(self.target_rect()):
+ self._auto_shoot_timer.stop()
+ self.hit.emit()
+ self.can_shoot.emit(True)
+ elif (shot_r.x() > self.width() or shot_r.y() > self.height()
+ or shot_r.intersects(self.barrier_rect())):
+ self._auto_shoot_timer.stop()
+ self.missed.emit()
+ self.can_shoot.emit(True)
+ else:
+ region = region.united(QRegion(shot_r))
+
+ self.update(region)
+
+ def mousePressEvent(self, event):
+ if event.button() != Qt.LeftButton:
+ return
+ if self.barrel_hit(event.position().toPoint()):
+ self._barrel_pressed = True
+
+ def mouseMoveEvent(self, event):
+ if not self._barrel_pressed:
+ return
+ pos = event.position().toPoint()
+ if pos.x() <= 0:
+ pos.setX(1)
+ if pos.y() >= self.height():
+ pos.setY(self.height() - 1)
+ rad = math.atan((float(self.rect().bottom()) - pos.y()) / pos.x())
+ self.set_angle(round(rad * 180 / math.pi))
+
+ def mouseReleaseEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ self._barrel_pressed = False
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ if self._game_ended:
+ painter.setPen(Qt.black)
+ painter.setFont(QFont("Courier", 48, QFont.Bold))
+ painter.drawText(self.rect(), Qt.AlignCenter, "Game Over")
+
+ self.paint_cannon(painter)
+ self.paint_barrier(painter)
+ if self.is_shooting():
+ self.paint_shot(painter)
+ if not self._game_ended:
+ self.paint_target(painter)
+
+ def paint_shot(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.black)
+ painter.drawRect(self.shot_rect())
+
+ def paint_target(self, painter):
+ painter.setPen(Qt.black)
+ painter.setBrush(Qt.red)
+ painter.drawRect(self.target_rect())
+
+ def paint_barrier(self, painter):
+ painter.setPen(Qt.black)
+ painter.setBrush(Qt.yellow)
+ painter.drawRect(self.barrier_rect())
+
+ barrel_rect = QRect(33, -4, 15, 8)
+
+ def paint_cannon(self, painter):
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.save()
+ painter.translate(0, self.height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(CannonField.barrel_rect)
+ painter.restore()
+
+ def cannon_rect(self):
+ result = QRect(0, 0, 50, 50)
+ result.moveBottomLeft(self.rect().bottomLect())
+ return result
+
+ def shot_rect(self):
+ gravity = 4.0
+
+ time = self._timer_count / 40.0
+ velocity = self._shoot_force
+ radians = self._shoot_angle * math.pi / 180
+
+ velx = velocity * math.cos(radians)
+ vely = velocity * math.sin(radians)
+ x0 = (CannonField.barrel_rect.right() + 5) * math.cos(radians)
+ y0 = (CannonField.barrel_rect.right() + 5) * math.sin(radians)
+ x = x0 + velx * time
+ y = y0 + vely * time - 0.5 * gravity * time * time
+
+ result = QRect(0, 0, 6, 6)
+ result.moveCenter(QPoint(round(x), self.height() - 1 - round(y)))
+ return result
+
+ def target_rect(self):
+ result = QRect(0, 0, 20, 10)
+ result.moveCenter(QPoint(self.target.x(), self.height() - 1 - self.target.y()))
+ return result
+
+ def barrier_rect(self):
+ return QRect(145, self.height() - 100, 15, 99)
+
+ def barrel_hit(self, pos):
+ matrix = QTransform()
+ matrix.translate(0, self.height())
+ matrix.rotate(-self._current_angle)
+ matrix, invertible = matrix.inverted()
+ return self.barrel_rect.contains(matrix.map(pos))
+
+ def game_over(self):
+ return self._game_ended
+
+ def is_shooting(self):
+ return self._auto_shoot_timer.isActive()
+
+ def sizeHint(self):
+ return QSize(400, 300)
+
+
+class GameBoard(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("&Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange("ANGLE")
+ angle.set_range(5, 70)
+
+ force = LCDRange("FORCE")
+ force.set_range(10, 50)
+
+ cannon_box = QFrame()
+ cannon_box.setFrameStyle(QFrame.WinPanel | QFrame.Sunken)
+
+ self._cannon_field = CannonField()
+
+ angle.value_changed.connect(self._cannon_field.set_angle)
+ self._cannon_field.angle_changed.connect(angle.set_value)
+
+ force.value_changed.connect(self._cannon_field.set_force)
+ self._cannon_field.force_changed.connect(force.set_value)
+
+ self._cannon_field.hit.connect(self.hit)
+ self._cannon_field.missed.connect(self.missed)
+
+ shoot = QPushButton("&Shoot")
+ shoot.setFont(QFont("Times", 18, QFont.Bold))
+
+ shoot.clicked.connect(self.fire)
+ self._cannon_field.can_shoot.connect(shoot.setEnabled)
+
+ restart = QPushButton("&New Game")
+ restart.setFont(QFont("Times", 18, QFont.Bold))
+
+ restart.clicked.connect(self.new_game)
+
+ self.hits = QLCDNumber(2)
+ self._shots_left = QLCDNumber(2)
+ hits_label = QLabel("HITS")
+ shots_left_label = QLabel("SHOTS LEFT")
+
+ QShortcut(QKeySequence(Qt.Key_Enter), self, self.fire)
+ QShortcut(QKeySequence(Qt.Key_Return), self, self.fire)
+ QShortcut(QKeySequence(Qt.CTRL | Qt.Key_Q), self, self.close)
+
+ top_layout = QHBoxLayout()
+ top_layout.addWidget(shoot)
+ top_layout.addWidget(self.hits)
+ top_layout.addWidget(hits_label)
+ top_layout.addWidget(self._shots_left)
+ top_layout.addWidget(shots_left_label)
+ top_layout.addStretch(1)
+ top_layout.addWidget(restart)
+
+ left_layout = QVBoxLayout()
+ left_layout.addWidget(angle)
+ left_layout.addWidget(force)
+
+ cannon_layout = QVBoxLayout()
+ cannon_layout.addWidget(self._cannon_field)
+ cannon_box.setLayout(cannon_layout)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addLayout(top_layout, 0, 1)
+ grid_layout.addLayout(left_layout, 1, 0)
+ grid_layout.addWidget(cannon_box, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ force.set_value(25)
+ angle.setFocus()
+
+ self.new_game()
+
+ @Slot()
+ def fire(self):
+ if self._cannon_field.game_over() or self._cannon_field.is_shooting():
+ return
+ self._shots_left.display(self._shots_left.intValue() - 1)
+ self._cannon_field.shoot()
+
+ @Slot()
+ def hit(self):
+ self.hits.display(self.hits.intValue() + 1)
+ if self._shots_left.intValue() == 0:
+ self._cannon_field.set_game_over()
+ else:
+ self._cannon_field.new_target()
+
+ @Slot()
+ def missed(self):
+ if self._shots_left.intValue() == 0:
+ self._cannon_field.set_game_over()
+
+ @Slot()
+ def new_game(self):
+ self._shots_left.display(15)
+ self.hits.display(0)
+ self._cannon_field.restart_game()
+ self._cannon_field.new_target()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ board = GameBoard()
+ board.setGeometry(100, 100, 500, 355)
+ board.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t2.py b/examples/widgets/tutorials/cannon/t2.py
new file mode 100644
index 000000000..d3adba396
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t2.py
@@ -0,0 +1,23 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 2
+
+
+import sys
+
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import QApplication, QPushButton
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ quit = QPushButton("Quit")
+ quit.resize(75, 30)
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(app.quit)
+
+ quit.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t3.py b/examples/widgets/tutorials/cannon/t3.py
new file mode 100644
index 000000000..13bd8f736
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t3.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 3
+
+
+import sys
+
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import (QApplication, QPushButton, QWidget)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+
+ window = QWidget()
+ window.resize(200, 120)
+
+ quit = QPushButton("Quit", window)
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+ quit.setGeometry(10, 40, 180, 40)
+ quit.clicked.connect(app.quit)
+
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t4.py b/examples/widgets/tutorials/cannon/t4.py
new file mode 100644
index 000000000..37a2dc9dd
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t4.py
@@ -0,0 +1,30 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 4
+
+
+import sys
+
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import (QApplication, QPushButton, QWidget)
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.setFixedSize(200, 120)
+
+ self.quit = QPushButton("Quit", self)
+ self.quit.setGeometry(62, 40, 75, 30)
+ self.quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ self.quit.clicked.connect(qApp.quit) # noqa: F821
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t5.py b/examples/widgets/tutorials/cannon/t5.py
new file mode 100644
index 000000000..ed5d085f8
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t5.py
@@ -0,0 +1,41 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 5
+
+
+import sys
+
+from PySide6.QtCore import Qt
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import (QApplication, QLCDNumber, QPushButton,
+ QSlider, QVBoxLayout, QWidget)
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ lcd = QLCDNumber(2)
+
+ slider = QSlider(Qt.Horizontal)
+ slider.setRange(0, 99)
+ slider.setValue(0)
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+ slider.valueChanged.connect(lcd.display)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(quit)
+ layout.addWidget(lcd)
+ layout.addWidget(slider)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t6.py b/examples/widgets/tutorials/cannon/t6.py
new file mode 100644
index 000000000..ea2e044e6
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t6.py
@@ -0,0 +1,51 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 6
+
+
+import sys
+
+from PySide6.QtCore import Qt
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLCDNumber,
+ QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+ slider = QSlider(Qt.Horizontal)
+ slider.setRange(0, 99)
+ slider.setValue(0)
+ slider.valueChanged.connect(lcd.display)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(slider)
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(quit)
+ grid = QGridLayout()
+ layout.addLayout(grid)
+ for row in range(3):
+ for column in range(3):
+ grid.addWidget(LCDRange(), row, column)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t7.py b/examples/widgets/tutorials/cannon/t7.py
new file mode 100644
index 000000000..1175107b8
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t7.py
@@ -0,0 +1,73 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 7
+
+
+import sys
+
+from PySide6.QtCore import Signal, Slot, Qt
+from PySide6.QtGui import QFont
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLCDNumber,
+ QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ previous_range = None
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(quit)
+ grid = QGridLayout()
+ layout.addLayout(grid)
+
+ for row in range(3):
+ for column in range(3):
+ lcd_range = LCDRange()
+ grid.addWidget(lcd_range, row, column)
+
+ if previous_range:
+ lcd_range.value_changed.connect(previous_range.set_value)
+
+ previous_range = lcd_range
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t8.py b/examples/widgets/tutorials/cannon/t8.py
new file mode 100644
index 000000000..9bb5516b8
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t8.py
@@ -0,0 +1,116 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 8
+
+
+import sys
+
+from PySide6.QtCore import Signal, Slot, Qt, qWarning
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLCDNumber,
+ QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning("LCDRange.setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ painter.drawText(200, 200, f"Angle = {self._current_angle}")
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange()
+ angle.set_range(5, 70)
+
+ cannon_field = CannonField()
+
+ angle.value_changed.connect(cannon_field.set_angle)
+ cannon_field.angle_changed.connect(angle.set_value)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addWidget(angle, 1, 0)
+ grid_layout.addWidget(cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ angle.setFocus()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.setGeometry(100, 100, 500, 355)
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/cannon/t9.py b/examples/widgets/tutorials/cannon/t9.py
new file mode 100644
index 000000000..7cdda4e7b
--- /dev/null
+++ b/examples/widgets/tutorials/cannon/t9.py
@@ -0,0 +1,122 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+# PySide6 tutorial 9
+
+
+import sys
+
+from PySide6.QtCore import QRect, Qt, Signal, Slot, qWarning
+from PySide6.QtGui import QColor, QFont, QPainter, QPalette
+from PySide6.QtWidgets import (QApplication, QGridLayout, QLCDNumber,
+ QPushButton, QSlider, QVBoxLayout, QWidget)
+
+
+class LCDRange(QWidget):
+
+ value_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ lcd = QLCDNumber(2)
+ self.slider = QSlider(Qt.Horizontal)
+ self.slider.setRange(0, 99)
+ self.slider.setValue(0)
+
+ self.slider.valueChanged.connect(lcd.display)
+ self.slider.valueChanged.connect(self.value_changed)
+
+ layout = QVBoxLayout(self)
+ layout.addWidget(lcd)
+ layout.addWidget(self.slider)
+
+ self.setFocusProxy(self.slider)
+
+ def value(self):
+ return self.slider.value()
+
+ @Slot(int)
+ def set_value(self, value):
+ self.slider.setValue(value)
+
+ def set_range(self, minValue, maxValue):
+ if minValue < 0 or maxValue > 99 or minValue > maxValue:
+ qWarning(f"LCDRange::setRange({minValue}, {maxValue})\n"
+ "\tRange must be 0..99\n"
+ "\tand minValue must not be greater than maxValue")
+ return
+
+ self.slider.setRange(minValue, maxValue)
+
+
+class CannonField(QWidget):
+
+ angle_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._current_angle = 45
+ self.setPalette(QPalette(QColor(250, 250, 200)))
+ self.setAutoFillBackground(True)
+
+ def angle(self):
+ return self._current_angle
+
+ @Slot(int)
+ def set_angle(self, angle):
+ if angle < 5:
+ angle = 5
+ if angle > 70:
+ angle = 70
+ if self._current_angle == angle:
+ return
+ self._current_angle = angle
+ self.update()
+ self.angle_changed.emit(self._current_angle)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ painter.setPen(Qt.NoPen)
+ painter.setBrush(Qt.blue)
+
+ painter.translate(0, self.rect().height())
+ painter.drawPie(QRect(-35, -35, 70, 70), 0, 90 * 16)
+ painter.rotate(-self._current_angle)
+ painter.drawRect(QRect(33, -4, 15, 8))
+
+
+class MyWidget(QWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ quit = QPushButton("Quit")
+ quit.setFont(QFont("Times", 18, QFont.Bold))
+
+ quit.clicked.connect(qApp.quit) # noqa: F821
+
+ angle = LCDRange()
+ angle.set_range(5, 70)
+
+ cannon_field = CannonField()
+
+ angle.value_changed.connect(cannon_field.set_angle)
+ cannon_field.angle_changed.connect(angle.set_value)
+
+ grid_layout = QGridLayout(self)
+ grid_layout.addWidget(quit, 0, 0)
+ grid_layout.addWidget(angle, 1, 0)
+ grid_layout.addWidget(cannon_field, 1, 1, 2, 1)
+ grid_layout.setColumnStretch(1, 10)
+
+ angle.set_value(60)
+ angle.setFocus()
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ widget = MyWidget()
+ widget.setGeometry(100, 100, 500, 355)
+ widget.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/1_readonly.py b/examples/widgets/tutorials/modelview/1_readonly.py
new file mode 100644
index 000000000..9dc923260
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/1_readonly.py
@@ -0,0 +1,38 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QAbstractTableModel, Qt
+from PySide6.QtWidgets import QApplication, QTableView
+
+"""PySide6 port of the widgets/tutorials/modelview/1_readonly example from Qt v6.x"""
+
+
+#! [1]
+class MyModel(QAbstractTableModel):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ def rowCount(self, parent=None):
+ return 2
+
+ def columnCount(self, parent=None):
+ return 3
+
+ def data(self, index, role=Qt.DisplayRole):
+ if role == Qt.DisplayRole:
+ row = index.row() + 1
+ column = index.column() + 1
+ return f"Row{row}, Column{column}"
+ return None
+#! [1]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ table_view = QTableView()
+ my_model = MyModel()
+ table_view.setModel(my_model)
+ table_view.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/2_formatting.py b/examples/widgets/tutorials/modelview/2_formatting.py
new file mode 100644
index 000000000..f39ec462c
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/2_formatting.py
@@ -0,0 +1,65 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QAbstractTableModel, Qt
+from PySide6.QtGui import QBrush, QFont
+from PySide6.QtWidgets import QApplication, QTableView
+
+"""PySide6 port of the widgets/tutorials/modelview/2_formatting example from Qt v6.x"""
+
+
+class MyModel(QAbstractTableModel):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ def rowCount(self, parent=None):
+ return 2
+
+ def columnCount(self, parent=None):
+ return 3
+
+#! [1]
+ def data(self, index, role=Qt.DisplayRole):
+ row = index.row()
+ col = index.column()
+ # generate a log message when this method gets called
+ print(f"row {row}, col{col}, role {role}")
+
+ if role == Qt.DisplayRole:
+ if row == 0 and col == 1:
+ return "<--left"
+ if row == 1 and col == 1:
+ return "right-->"
+ return f"Row{row}, Column{col + 1}"
+
+ elif role == Qt.FontRole:
+ if row == 0 and col == 0: # change font only for cell(0,0)
+ bold_font = QFont()
+ bold_font.setBold(True)
+ return bold_font
+
+ elif role == Qt.BackgroundRole:
+ if row == 1 and col == 2: # change background only for cell(1,2)
+ return QBrush(Qt.red)
+
+ elif role == Qt.TextAlignmentRole:
+ if row == 1 and col == 1: # change text alignment only for cell(1,1)
+ return Qt.AlignRight | Qt.AlignVCenter
+
+ elif role == Qt.CheckStateRole:
+ if row == 1 and col == 0: # add a checkbox to cell(1,0)
+ return Qt.Checked
+
+ return None
+#! [1]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ table_view = QTableView()
+ my_model = MyModel()
+ table_view.setModel(my_model)
+ table_view.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/3_changingmodel.py b/examples/widgets/tutorials/modelview/3_changingmodel.py
new file mode 100644
index 000000000..2148ec5d3
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/3_changingmodel.py
@@ -0,0 +1,53 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QAbstractTableModel, QTime, QTimer, Qt, Slot
+from PySide6.QtWidgets import QApplication, QTableView
+
+"""PySide6 port of the widgets/tutorials/modelview/3_changingmodel example from Qt v6.x"""
+
+
+class MyModel(QAbstractTableModel):
+#! [1]
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._timer = QTimer(self)
+ self._timer.setInterval(1000)
+ self._timer.timeout.connect(self.timer_hit)
+ self._timer.start()
+#! [1]
+
+ def rowCount(self, parent=None):
+ return 2
+
+ def columnCount(self, parent=None):
+ return 3
+
+#! [2]
+ def data(self, index, role=Qt.DisplayRole):
+ row = index.row()
+ col = index.column()
+ if role == Qt.DisplayRole and row == 0 and col == 0:
+ return QTime.currentTime().toString()
+ return None
+#! [2]
+
+#! [3]
+ @Slot()
+ def timer_hit(self):
+ # we identify the top left cell
+ top_left = self.createIndex(0, 0)
+ # emit a signal to make the view reread identified data
+ self.dataChanged.emit(top_left, top_left, [Qt.DisplayRole])
+#! [3]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ table_view = QTableView()
+ my_model = MyModel()
+ table_view.setModel(my_model)
+ table_view.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/4_headers.py b/examples/widgets/tutorials/modelview/4_headers.py
new file mode 100644
index 000000000..3feef17bf
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/4_headers.py
@@ -0,0 +1,43 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QAbstractTableModel, Qt
+from PySide6.QtWidgets import QApplication, QTableView
+
+"""PySide6 port of the widgets/tutorials/modelview/4_headers example from Qt v6.x"""
+
+
+class MyModel(QAbstractTableModel):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ def rowCount(self, parent=None):
+ return 2
+
+ def columnCount(self, parent=None):
+ return 3
+
+ def data(self, index, role=Qt.DisplayRole):
+ if role == Qt.DisplayRole:
+ row = index.row() + 1
+ column = index.column() + 1
+ return f"Row{row}, Column{column}"
+ return None
+
+#! [1]
+ def headerData(self, section, orientation, role):
+ if role == Qt.DisplayRole and orientation == Qt.Horizontal:
+ return ["first", "second", "third"][section]
+ return None
+#! [1]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ table_view = QTableView()
+ my_model = MyModel()
+ table_view.setModel(my_model)
+ table_view.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/5_edit.py b/examples/widgets/tutorials/modelview/5_edit.py
new file mode 100644
index 000000000..1a4481fc9
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/5_edit.py
@@ -0,0 +1,73 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+from itertools import chain
+
+from PySide6.QtCore import QAbstractTableModel, Qt, Signal, Slot
+from PySide6.QtWidgets import QApplication, QMainWindow, QTableView
+
+"""PySide6 port of the widgets/tutorials/modelview/5_edit example from Qt v6.x"""
+
+
+COLS = 3
+ROWS = 2
+
+
+class MyModel(QAbstractTableModel):
+
+ editCompleted = Signal(str)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._grid_data = [["" for y in range(COLS)] for x in range(ROWS)]
+
+ def rowCount(self, parent=None):
+ return ROWS
+
+ def columnCount(self, parent=None):
+ return COLS
+
+ def data(self, index, role=Qt.DisplayRole):
+ if role == Qt.DisplayRole and self.checkIndex(index):
+ return self._grid_data[index.row()][index.column()]
+ return None
+
+#! [1]
+ def setData(self, index, value, role):
+ if role != Qt.EditRole or not self.checkIndex(index):
+ return False
+ # save value from editor to member m_gridData
+ self._grid_data[index.row()][index.column()] = value
+ # for presentation purposes only: build and emit a joined string
+ result = " ".join(chain(*self._grid_data))
+ self.editCompleted.emit(result)
+ return True
+#! [1]
+
+#! [2]
+ def flags(self, index):
+ return Qt.ItemIsEditable | super().flags(index)
+#! [2]
+
+
+class MainWindow(QMainWindow):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._table_view = QTableView(self)
+ self.setCentralWidget(self._table_view)
+ my_model = MyModel(self)
+ self._table_view.setModel(my_model)
+ # transfer changes to the model to the window title
+ my_model.editCompleted.connect(self.show_window_title)
+
+ @Slot(str)
+ def show_window_title(self, title):
+ self.setWindowTitle(title)
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ w = MainWindow()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/6_treeview.py b/examples/widgets/tutorials/modelview/6_treeview.py
new file mode 100644
index 000000000..cac3c6d53
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/6_treeview.py
@@ -0,0 +1,42 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtGui import QStandardItem, QStandardItemModel
+from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView
+
+"""PySide6 port of the widgets/tutorials/modelview/6_treeview example from Qt v6.x"""
+
+
+#! [1]
+class MainWindow(QMainWindow):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._standard_model = QStandardItemModel(self)
+ self._tree_view = QTreeView(self)
+ self.setCentralWidget(self._tree_view)
+
+ prepared_row = self.prepare_row("first", "second", "third")
+ item = self._standard_model.invisibleRootItem()
+ # adding a row to the invisible root item produces a root element
+ item.appendRow(prepared_row)
+
+ second_row = self.prepare_row("111", "222", "333")
+ # adding a row to an item starts a subtree
+ prepared_row[0].appendRow(second_row)
+
+ self._tree_view.setModel(self._standard_model)
+ self._tree_view.expandAll()
+
+ def prepare_row(self, first, second, third):
+ return [QStandardItem(first), QStandardItem(second),
+ QStandardItem(third)]
+#! [1]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ w = MainWindow()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/7_selections.py b/examples/widgets/tutorials/modelview/7_selections.py
new file mode 100644
index 000000000..c879d8f67
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/7_selections.py
@@ -0,0 +1,71 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtCore import QItemSelection, Qt, Slot
+from PySide6.QtGui import QStandardItem, QStandardItemModel
+from PySide6.QtWidgets import QApplication, QMainWindow, QTreeView
+
+"""PySide6 port of the widgets/tutorials/modelview/7_selections example from Qt v6.x"""
+
+
+#! [1]
+class MainWindow(QMainWindow):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self._standard_model = QStandardItemModel(self)
+ self._tree_view = QTreeView(self)
+ self.setCentralWidget(self._tree_view)
+
+ # defining a couple of items
+ root_node = self._standard_model.invisibleRootItem()
+
+ america_item = QStandardItem("America")
+ mexico_item = QStandardItem("Canada")
+ usa_item = QStandardItem("USA")
+ boston_item = QStandardItem("Boston")
+ europe_item = QStandardItem("Europe")
+ italy_item = QStandardItem("Italy")
+ rome_item = QStandardItem("Rome")
+ verona_item = QStandardItem("Verona")
+
+ # building up the hierarchy
+ root_node.appendRow(america_item)
+ root_node.appendRow(europe_item)
+ america_item.appendRow(mexico_item)
+ america_item.appendRow(usa_item)
+ usa_item.appendRow(boston_item)
+ europe_item.appendRow(italy_item)
+ italy_item.appendRow(rome_item)
+ italy_item.appendRow(verona_item)
+
+ self._tree_view.setModel(self._standard_model)
+ self._tree_view.expandAll()
+
+ # selection changes shall trigger a slot
+ selection_model = self._tree_view.selectionModel()
+ selection_model.selectionChanged.connect(self.selection_changed_slot)
+#! [1]
+
+#! [2]
+ @Slot(QItemSelection, QItemSelection)
+ def selection_changed_slot(self, new_selection, old_selection):
+ # get the text of the selected item
+ index = self._tree_view.selectionModel().currentIndex()
+ selected_text = index.data(Qt.DisplayRole)
+ # find out the hierarchy level of the selected item
+ hierarchy_level = 1
+ seek_root = index
+ while seek_root.parent().isValid():
+ seek_root = seek_root.parent()
+ hierarchy_level += 1
+ self.setWindowTitle(f"{selected_text}, Level {hierarchy_level}")
+#! [2]
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ w = MainWindow()
+ w.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/tutorials/modelview/doc/modelview.rst b/examples/widgets/tutorials/modelview/doc/modelview.rst
new file mode 100644
index 000000000..017f78de1
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/doc/modelview.rst
@@ -0,0 +1,4 @@
+Model View Tutorial Examples
+============================
+
+Example code for the Model View Tutorial.
diff --git a/examples/widgets/tutorials/modelview/modelview.pyproject b/examples/widgets/tutorials/modelview/modelview.pyproject
new file mode 100644
index 000000000..3bbe9d47a
--- /dev/null
+++ b/examples/widgets/tutorials/modelview/modelview.pyproject
@@ -0,0 +1,9 @@
+{
+ "files": ["1_readonly.py",
+ "2_formatting.py",
+ "3_changingmodel.py",
+ "4_headers.py",
+ "5_edit.py",
+ "6_treeview.py",
+ "7_selections.py"]
+}
diff --git a/examples/widgets/widgets/charactermap/charactermap.pyproject b/examples/widgets/widgets/charactermap/charactermap.pyproject
new file mode 100644
index 000000000..c2b2c2068
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/charactermap.pyproject
@@ -0,0 +1,4 @@
+{
+ "files": ["main.py", "characterwidget.py", "fontinfodialog.py",
+ "mainwindow.py"]
+}
diff --git a/examples/widgets/widgets/charactermap/characterwidget.py b/examples/widgets/widgets/charactermap/characterwidget.py
new file mode 100644
index 000000000..0f01f9684
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/characterwidget.py
@@ -0,0 +1,133 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from textwrap import dedent
+
+from PySide6.QtCore import QSize, Qt, Slot, Signal
+from PySide6.QtGui import (QBrush, QFont, QFontDatabase, QFontMetrics,
+ QPainter, QPen)
+from PySide6.QtWidgets import QToolTip, QWidget
+
+COLUMNS = 16
+
+
+class CharacterWidget(QWidget):
+
+ character_selected = Signal(str)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._display_font = QFont()
+ self._last_key = -1
+ self._square_size = int(0)
+
+ self.calculate_square_size()
+ self.setMouseTracking(True)
+
+ @Slot(QFont)
+ def update_font(self, font):
+ self._display_font.setFamily(font.family())
+ self.calculate_square_size()
+ self.adjustSize()
+ self.update()
+
+ @Slot(str)
+ def update_size(self, fontSize):
+ self._display_font.setPointSize(int(fontSize))
+ self.calculate_square_size()
+ self.adjustSize()
+ self.update()
+
+ @Slot(str)
+ def update_style(self, fontStyle):
+ old_strategy = self._display_font.styleStrategy()
+ self._display_font = QFontDatabase.font(self._display_font.family(),
+ fontStyle,
+ self._display_font.pointSize())
+ self._display_font.setStyleStrategy(old_strategy)
+ self.calculate_square_size()
+ self.adjustSize()
+ self.update()
+
+ @Slot(bool)
+ def update_font_merging(self, enable):
+ if enable:
+ self._display_font.setStyleStrategy(QFont.PreferDefault)
+ else:
+ self._display_font.setStyleStrategy(QFont.NoFontMerging)
+ self.adjustSize()
+ self.update()
+
+ def calculate_square_size(self):
+ h = QFontMetrics(self._display_font, self).height()
+ self._square_size = max(16, 4 + h)
+
+ def sizeHint(self):
+ return QSize(COLUMNS * self._square_size,
+ (65536 / COLUMNS) * self._square_size)
+
+ def _unicode_from_pos(self, point):
+ row = int(point.y() / self._square_size)
+ return row * COLUMNS + int(point.x() / self._square_size)
+
+ def mouseMoveEvent(self, event):
+ widget_position = self.mapFromGlobal(event.globalPosition().toPoint())
+ key = self._unicode_from_pos(widget_position)
+ c = chr(key)
+ family = self._display_font.family()
+ text = dedent(f'''
+ <p>Character: <span style="font-size: 24pt; font-family: {family}">
+ {c}</span><p>Value: 0x{key:x}
+ ''')
+ QToolTip.showText(event.globalPosition().toPoint(), text, self)
+
+ def mousePressEvent(self, event):
+ if event.button() == Qt.LeftButton:
+ self._last_key = self._unicode_from_pos(event.position().toPoint())
+ if self._last_key != -1:
+ c = chr(self._last_key)
+ self.character_selected.emit(f"{c}")
+ self.update()
+ else:
+ super().mousePressEvent(event)
+
+ def paintEvent(self, event):
+ with QPainter(self) as painter:
+ self.render(event, painter)
+
+ def render(self, event, painter):
+ painter = QPainter(self)
+ painter.fillRect(event.rect(), QBrush(Qt.white))
+ painter.setFont(self._display_font)
+ redraw_rect = event.rect()
+ begin_row = int(redraw_rect.top() / self._square_size)
+ end_row = int(redraw_rect.bottom() / self._square_size)
+ begin_column = int(redraw_rect.left() / self._square_size)
+ end_column = int(redraw_rect.right() / self._square_size)
+ painter.setPen(QPen(Qt.gray))
+ for row in range(begin_row, end_row + 1):
+ for column in range(begin_column, end_column + 1):
+ x = int(column * self._square_size)
+ y = int(row * self._square_size)
+ painter.drawRect(x, y, self._square_size, self._square_size)
+
+ font_metrics = QFontMetrics(self._display_font)
+ painter.setPen(QPen(Qt.black))
+ for row in range(begin_row, end_row + 1):
+ for column in range(begin_column, end_column + 1):
+ key = int(row * COLUMNS + column)
+ painter.setClipRect(column * self._square_size,
+ row * self._square_size,
+ self._square_size, self._square_size)
+
+ if key == self._last_key:
+ painter.fillRect(column * self._square_size + 1,
+ row * self._square_size + 1,
+ self._square_size, self._square_size, QBrush(Qt.red))
+
+ text = chr(key)
+ painter.drawText(column * self._square_size + (self._square_size / 2)
+ - font_metrics.horizontalAdvance(text) / 2,
+ row * self._square_size + 4 + font_metrics.ascent(),
+ text)
diff --git a/examples/widgets/widgets/charactermap/doc/charactermap.rst b/examples/widgets/widgets/charactermap/doc/charactermap.rst
new file mode 100644
index 000000000..1a38615c4
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/doc/charactermap.rst
@@ -0,0 +1,8 @@
+Character Map Example
+=====================
+
+The example displays an array of characters which the user can click on
+to enter text in a line edit. The contents of the line edit can then be
+copied into the clipboard, and pasted into other applications. The
+purpose behind this sort of tool is to allow users to enter characters
+that may be unavailable or difficult to locate on their keyboards.
diff --git a/examples/widgets/widgets/charactermap/fontinfodialog.py b/examples/widgets/widgets/charactermap/fontinfodialog.py
new file mode 100644
index 000000000..aa874884f
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/fontinfodialog.py
@@ -0,0 +1,47 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import Qt, qVersion, qFuzzyCompare
+from PySide6.QtGui import QGuiApplication, QFontDatabase
+from PySide6.QtWidgets import (QDialog, QDialogButtonBox,
+ QPlainTextEdit, QVBoxLayout)
+
+
+def _format_font(font):
+ family = font.family()
+ size = font.pointSizeF()
+ return f"{family}, {size}pt"
+
+
+class FontInfoDialog(QDialog):
+
+ def __init__(self, parent):
+ super().__init__(parent)
+ self.setWindowFlags(self.windowFlags() & ~Qt.WindowContextHelpButtonHint)
+ main_layout = QVBoxLayout(self)
+ text_edit = QPlainTextEdit(self.text(), self)
+ text_edit.setReadOnly(True)
+ text_edit.setFont(QFontDatabase.systemFont(QFontDatabase.FixedFont))
+ main_layout.addWidget(text_edit)
+ button_box = QDialogButtonBox(QDialogButtonBox.Close, self)
+ button_box.rejected.connect(self.reject)
+ main_layout.addWidget(button_box)
+
+ def text(self):
+ default_font = QFontDatabase.systemFont(QFontDatabase.GeneralFont)
+ fixed_font = QFontDatabase.systemFont(QFontDatabase.FixedFont)
+ title_font = QFontDatabase.systemFont(QFontDatabase.TitleFont)
+ smallest_readable_font = QFontDatabase.systemFont(QFontDatabase.SmallestReadableFont)
+
+ v = qVersion()
+ platform = QGuiApplication.platformName()
+ dpi = self.logicalDpiX()
+ dpr = self.devicePixelRatio()
+ text = f"Qt {v} on {platform}, {dpi}DPI"
+ if not qFuzzyCompare(dpr, float(1)):
+ text += f", device pixel ratio: {dpr}"
+ text += ("\n\nDefault font : " + _format_font(default_font)
+ + "\nFixed font : " + _format_font(fixed_font)
+ + "\nTitle font : " + _format_font(title_font)
+ + "\nSmallest font: " + _format_font(smallest_readable_font))
+ return text
diff --git a/examples/widgets/widgets/charactermap/main.py b/examples/widgets/widgets/charactermap/main.py
new file mode 100644
index 000000000..e84a1d8af
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/main.py
@@ -0,0 +1,17 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+import sys
+
+from PySide6.QtWidgets import QApplication
+
+from mainwindow import MainWindow
+
+"""PySide6 port of the widgets/widgets/ charactermap example from Qt6"""
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ window = MainWindow()
+ window.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/widgets/charactermap/mainwindow.py b/examples/widgets/widgets/charactermap/mainwindow.py
new file mode 100644
index 000000000..d79285def
--- /dev/null
+++ b/examples/widgets/widgets/charactermap/mainwindow.py
@@ -0,0 +1,167 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+from PySide6.QtCore import Qt, QSignalBlocker, Slot
+from PySide6.QtGui import QGuiApplication, QClipboard, QFont, QFontDatabase
+from PySide6.QtWidgets import (QCheckBox, QComboBox, QFontComboBox,
+ QHBoxLayout, QLabel, QLineEdit, QMainWindow,
+ QPushButton, QScrollArea,
+ QVBoxLayout, QWidget)
+
+from characterwidget import CharacterWidget
+from fontinfodialog import FontInfoDialog
+
+
+class MainWindow(QMainWindow):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self._character_widget = CharacterWidget()
+ self._filter_combo = QComboBox()
+ self._style_combo = QComboBox()
+ self._size_combo = QComboBox()
+ self._font_combo = QFontComboBox()
+ self._line_edit = QLineEdit()
+ self._scroll_area = QScrollArea()
+ self._font_merging = QCheckBox()
+
+ file_menu = self.menuBar().addMenu("File")
+ file_menu.addAction("Quit", self.close)
+ help_menu = self.menuBar().addMenu("Help")
+ help_menu.addAction("Show Font Info", self.show_info)
+ help_menu.addAction("About &Qt", qApp.aboutQt) # noqa: F821
+
+ central_widget = QWidget()
+
+ self._filter_label = QLabel("Filter:")
+ self._filter_combo = QComboBox()
+ self._filter_combo.addItem("All", int(QFontComboBox.AllFonts.value))
+ self._filter_combo.addItem("Scalable", int(QFontComboBox.ScalableFonts.value))
+ self._filter_combo.addItem("Monospaced", int(QFontComboBox.MonospacedFonts.value))
+ self._filter_combo.addItem("Proportional", int(QFontComboBox.ProportionalFonts.value))
+ self._filter_combo.setCurrentIndex(0)
+ self._filter_combo.currentIndexChanged.connect(self.filter_changed)
+
+ self._font_label = QLabel("Font:")
+ self._font_combo = QFontComboBox()
+ self._size_label = QLabel("Size:")
+ self._size_combo = QComboBox()
+ self._style_label = QLabel("Style:")
+ self._style_combo = QComboBox()
+ self._font_merging_label = QLabel("Automatic Font Merging:")
+ self._font_merging = QCheckBox()
+ self._font_merging.setChecked(True)
+
+ self._scroll_area = QScrollArea()
+ self._character_widget = CharacterWidget()
+ self._scroll_area.setWidget(self._character_widget)
+ self.find_styles(self._font_combo.currentFont())
+ self.find_sizes(self._font_combo.currentFont())
+
+ self._line_edit = QLineEdit()
+ self._line_edit.setClearButtonEnabled(True)
+ self._clipboard_button = QPushButton("To clipboard")
+ self._font_combo.currentFontChanged.connect(self.find_styles)
+ self._font_combo.currentFontChanged.connect(self.find_sizes)
+ self._font_combo.currentFontChanged.connect(self._character_widget.update_font)
+ self._size_combo.currentTextChanged.connect(self._character_widget.update_size)
+ self._style_combo.currentTextChanged.connect(self._character_widget.update_style)
+ self._character_widget.character_selected.connect(self.insert_character)
+
+ self._clipboard_button.clicked.connect(self.update_clipboard)
+ self._font_merging.toggled.connect(self._character_widget.update_font_merging)
+
+ controls_layout = QHBoxLayout()
+ controls_layout.addWidget(self._filter_label)
+ controls_layout.addWidget(self._filter_combo, 1)
+ controls_layout.addWidget(self._font_label)
+ controls_layout.addWidget(self._font_combo, 1)
+ controls_layout.addWidget(self._size_label)
+ controls_layout.addWidget(self._size_combo, 1)
+ controls_layout.addWidget(self._style_label)
+ controls_layout.addWidget(self._style_combo, 1)
+ controls_layout.addWidget(self._font_merging_label)
+ controls_layout.addWidget(self._font_merging, 1)
+ controls_layout.addStretch(1)
+
+ line_layout = QHBoxLayout()
+ line_layout.addWidget(self._line_edit, 1)
+ line_layout.addSpacing(12)
+ line_layout.addWidget(self._clipboard_button)
+
+ central_layout = QVBoxLayout(central_widget)
+ central_layout.addLayout(controls_layout)
+ central_layout.addWidget(self._scroll_area, 1)
+ central_layout.addSpacing(4)
+ central_layout.addLayout(line_layout)
+
+ self.setCentralWidget(central_widget)
+ self.setWindowTitle("Character Map")
+
+ @Slot(QFont)
+ def find_styles(self, font):
+ current_item = self._style_combo.currentText()
+ self._style_combo.clear()
+ styles = QFontDatabase.styles(font.family())
+ for style in styles:
+ self._style_combo.addItem(style)
+
+ style_index = self._style_combo.findText(current_item)
+
+ if style_index == -1:
+ self._style_combo.setCurrentIndex(0)
+ else:
+ self._style_combo.setCurrentIndex(style_index)
+
+ @Slot(int)
+ def filter_changed(self, f):
+ filter = QFontComboBox.FontFilter(self._filter_combo.itemData(f))
+ self._font_combo.setFontFilters(filter)
+ count = self._font_combo.count()
+ self.statusBar().showMessage(f"{count} font(s) found")
+
+ @Slot(QFont)
+ def find_sizes(self, font):
+ current_size = self._size_combo.currentText()
+ with QSignalBlocker(self._size_combo):
+ # sizeCombo signals are now blocked until end of scope
+ self._size_combo.clear()
+
+ style = QFontDatabase.styleString(font)
+ if QFontDatabase.isSmoothlyScalable(font.family(), style):
+ sizes = QFontDatabase.standardSizes()
+ for size in sizes:
+ self._size_combo.addItem(f"{size}")
+ self._size_combo.setEditable(True)
+ else:
+ sizes = QFontDatabase.smoothSizes(font.family(), style)
+ for size in sizes:
+ self._size_combo.addItem(f"{size}")
+ self._size_combo.setEditable(False)
+
+ size_index = self._size_combo.findText(current_size)
+
+ if size_index == -1:
+ self._size_combo.setCurrentIndex(max(0, self._size_combo.count() / 3))
+ else:
+ self._size_combo.setCurrentIndex(size_index)
+
+ @Slot(str)
+ def insert_character(self, character):
+ self._line_edit.insert(character)
+
+ @Slot()
+ def update_clipboard(self):
+ clipboard = QGuiApplication.clipboard()
+ clipboard.setText(self._line_edit.text(), QClipboard.Clipboard)
+ clipboard.setText(self._line_edit.text(), QClipboard.Selection)
+
+ @Slot()
+ def show_info(self):
+ screen_geometry = self.screen().geometry()
+ dialog = FontInfoDialog(self)
+ dialog.setWindowTitle("Fonts")
+ dialog.setAttribute(Qt.WA_DeleteOnClose)
+ dialog.resize(screen_geometry.width() / 4, screen_geometry.height() / 4)
+ dialog.show()
diff --git a/examples/widgets/widgets/digitalclock/digitalclock.py b/examples/widgets/widgets/digitalclock/digitalclock.py
new file mode 100644
index 000000000..f0030b356
--- /dev/null
+++ b/examples/widgets/widgets/digitalclock/digitalclock.py
@@ -0,0 +1,41 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+import sys
+
+from PySide6.QtCore import QTime, QTimer, Slot
+from PySide6.QtWidgets import QApplication, QLCDNumber
+
+
+class DigitalClock(QLCDNumber):
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.setSegmentStyle(QLCDNumber.Filled)
+ self.setDigitCount(8)
+
+ self.timer = QTimer(self)
+ self.timer.timeout.connect(self.show_time)
+ self.timer.start(1000)
+
+ self.show_time()
+
+ self.setWindowTitle("Digital Clock")
+ self.resize(250, 60)
+
+ @Slot()
+ def show_time(self):
+ time = QTime.currentTime()
+ text = time.toString("hh:mm:ss")
+
+ # Blinking effect
+ if (time.second() % 2) == 0:
+ text = text.replace(":", " ")
+
+ self.display(text)
+
+
+if __name__ == "__main__":
+
+ app = QApplication(sys.argv)
+ clock = DigitalClock()
+ clock.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/widgets/digitalclock/digitalclock.pyproject b/examples/widgets/widgets/digitalclock/digitalclock.pyproject
new file mode 100644
index 000000000..03c3b6bb7
--- /dev/null
+++ b/examples/widgets/widgets/digitalclock/digitalclock.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["digitalclock.py"]
+}
diff --git a/examples/widgets/widgets/digitalclock/doc/digitalclock-screenshot.png b/examples/widgets/widgets/digitalclock/doc/digitalclock-screenshot.png
new file mode 100644
index 000000000..2234d7665
--- /dev/null
+++ b/examples/widgets/widgets/digitalclock/doc/digitalclock-screenshot.png
Binary files differ
diff --git a/examples/widgets/widgets/digitalclock/doc/digitalclock.rst b/examples/widgets/widgets/digitalclock/doc/digitalclock.rst
new file mode 100644
index 000000000..d13275d24
--- /dev/null
+++ b/examples/widgets/widgets/digitalclock/doc/digitalclock.rst
@@ -0,0 +1,14 @@
+Digital Clock Example
+=====================
+
+.. tags:: Android
+
+The Digital Clock example shows how to use QLCDNumber to display a number with
+LCD-like digits.
+
+.. image:: digitalclock-screenshot.png
+ :width: 400
+ :alt: Digital Clock Screenshot
+
+This example also demonstrates how QTimer can be used to update a widget at
+regular intervals.
diff --git a/examples/widgets/widgets/hellogl_openglwidget_legacy.py b/examples/widgets/widgets/hellogl_openglwidget_legacy.py
deleted file mode 100644
index 8745b4e8d..000000000
--- a/examples/widgets/widgets/hellogl_openglwidget_legacy.py
+++ /dev/null
@@ -1,288 +0,0 @@
-
-############################################################################
-##
-## Copyright (C) 2017 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-############################################################################
-
-"""PySide2 port of the opengl/legacy/hellogl example from Qt v5.x modified to use a QOpenGLWidget to demonstrate porting from QGLWidget to QOpenGLWidget"""
-
-import sys
-import math
-from PySide2 import QtCore, QtGui, QtWidgets
-
-try:
- from OpenGL import GL
-except ImportError:
- app = QtWidgets.QApplication(sys.argv)
- messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL hellogl",
- "PyOpenGL must be installed to run this example.",
- QtWidgets.QMessageBox.Close)
- messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate")
- messageBox.exec_()
- sys.exit(1)
-
-
-class Window(QtWidgets.QWidget):
- def __init__(self, parent=None):
- QtWidgets.QWidget.__init__(self, parent)
-
- self.glWidget = GLWidget()
-
- self.xSlider = self.createSlider(QtCore.SIGNAL("xRotationChanged(int)"),
- self.glWidget.setXRotation)
- self.ySlider = self.createSlider(QtCore.SIGNAL("yRotationChanged(int)"),
- self.glWidget.setYRotation)
- self.zSlider = self.createSlider(QtCore.SIGNAL("zRotationChanged(int)"),
- self.glWidget.setZRotation)
-
- mainLayout = QtWidgets.QHBoxLayout()
- mainLayout.addWidget(self.glWidget)
- mainLayout.addWidget(self.xSlider)
- mainLayout.addWidget(self.ySlider)
- mainLayout.addWidget(self.zSlider)
- self.setLayout(mainLayout)
-
- self.xSlider.setValue(170 * 16)
- self.ySlider.setValue(160 * 16)
- self.zSlider.setValue(90 * 16)
-
- self.setWindowTitle(self.tr("QOpenGLWidget"))
-
- def createSlider(self, changedSignal, setterSlot):
- slider = QtWidgets.QSlider(QtCore.Qt.Vertical)
-
- slider.setRange(0, 360 * 16)
- slider.setSingleStep(16)
- slider.setPageStep(15 * 16)
- slider.setTickInterval(15 * 16)
- slider.setTickPosition(QtWidgets.QSlider.TicksRight)
-
- self.glWidget.connect(slider, QtCore.SIGNAL("valueChanged(int)"), setterSlot)
- self.connect(self.glWidget, changedSignal, slider, QtCore.SLOT("setValue(int)"))
-
- return slider
-
-
-class GLWidget(QtWidgets.QOpenGLWidget):
- xRotationChanged = QtCore.Signal(int)
- yRotationChanged = QtCore.Signal(int)
- zRotationChanged = QtCore.Signal(int)
-
- def __init__(self, parent=None):
- QtWidgets.QOpenGLWidget.__init__(self, parent)
-
- self.object = 0
- self.xRot = 0
- self.yRot = 0
- self.zRot = 0
-
- self.lastPos = QtCore.QPoint()
-
- self.trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0)
- self.trolltechPurple = QtGui.QColor.fromCmykF(0.39, 0.39, 0.0, 0.0)
-
- def xRotation(self):
- return self.xRot
-
- def yRotation(self):
- return self.yRot
-
- def zRotation(self):
- return self.zRot
-
- def minimumSizeHint(self):
- return QtCore.QSize(50, 50)
-
- def sizeHint(self):
- return QtCore.QSize(400, 400)
-
- def setXRotation(self, angle):
- angle = self.normalizeAngle(angle)
- if angle != self.xRot:
- self.xRot = angle
- self.emit(QtCore.SIGNAL("xRotationChanged(int)"), angle)
- self.update()
-
- def setYRotation(self, angle):
- angle = self.normalizeAngle(angle)
- if angle != self.yRot:
- self.yRot = angle
- self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle)
- self.update()
-
- def setZRotation(self, angle):
- angle = self.normalizeAngle(angle)
- if angle != self.zRot:
- self.zRot = angle
- self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle)
- self.update()
-
- def initializeGL(self):
- darkTrolltechPurple = self.trolltechPurple.darker()
- GL.glClearColor(darkTrolltechPurple.redF(), darkTrolltechPurple.greenF(), darkTrolltechPurple.blueF(), darkTrolltechPurple.alphaF())
- self.object = self.makeObject()
- GL.glShadeModel(GL.GL_FLAT)
- GL.glEnable(GL.GL_DEPTH_TEST)
- GL.glEnable(GL.GL_CULL_FACE)
-
- def paintGL(self):
- GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT)
- GL.glLoadIdentity()
- GL.glTranslated(0.0, 0.0, -10.0)
- GL.glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0)
- GL.glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0)
- GL.glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0)
- GL.glCallList(self.object)
-
- def resizeGL(self, width, height):
- side = min(width, height)
- GL.glViewport(int((width - side) / 2),int((height - side) / 2), side, side)
-
- GL.glMatrixMode(GL.GL_PROJECTION)
- GL.glLoadIdentity()
- GL.glOrtho(-0.5, +0.5, -0.5, +0.5, 4.0, 15.0)
- GL.glMatrixMode(GL.GL_MODELVIEW)
-
- def mousePressEvent(self, event):
- self.lastPos = QtCore.QPoint(event.pos())
-
- def mouseMoveEvent(self, event):
- dx = event.x() - self.lastPos.x()
- dy = event.y() - self.lastPos.y()
-
- if event.buttons() & QtCore.Qt.LeftButton:
- self.setXRotation(self.xRot + 8 * dy)
- self.setYRotation(self.yRot + 8 * dx)
- elif event.buttons() & QtCore.Qt.RightButton:
- self.setXRotation(self.xRot + 8 * dy)
- self.setZRotation(self.zRot + 8 * dx)
-
- self.lastPos = QtCore.QPoint(event.pos())
-
- def makeObject(self):
- genList = GL.glGenLists(1)
- GL.glNewList(genList, GL.GL_COMPILE)
-
- GL.glBegin(GL.GL_QUADS)
-
- x1 = +0.06
- y1 = -0.14
- x2 = +0.14
- y2 = -0.06
- x3 = +0.08
- y3 = +0.00
- x4 = +0.30
- y4 = +0.22
-
- self.quad(x1, y1, x2, y2, y2, x2, y1, x1)
- self.quad(x3, y3, x4, y4, y4, x4, y3, x3)
-
- self.extrude(x1, y1, x2, y2)
- self.extrude(x2, y2, y2, x2)
- self.extrude(y2, x2, y1, x1)
- self.extrude(y1, x1, x1, y1)
- self.extrude(x3, y3, x4, y4)
- self.extrude(x4, y4, y4, x4)
- self.extrude(y4, x4, y3, x3)
-
- Pi = 3.14159265358979323846
- NumSectors = 200
-
- for i in range(NumSectors):
- angle1 = (i * 2 * Pi) / NumSectors
- x5 = 0.30 * math.sin(angle1)
- y5 = 0.30 * math.cos(angle1)
- x6 = 0.20 * math.sin(angle1)
- y6 = 0.20 * math.cos(angle1)
-
- angle2 = ((i + 1) * 2 * Pi) / NumSectors
- x7 = 0.20 * math.sin(angle2)
- y7 = 0.20 * math.cos(angle2)
- x8 = 0.30 * math.sin(angle2)
- y8 = 0.30 * math.cos(angle2)
-
- self.quad(x5, y5, x6, y6, x7, y7, x8, y8)
-
- self.extrude(x6, y6, x7, y7)
- self.extrude(x8, y8, x5, y5)
-
- GL.glEnd()
- GL.glEndList()
-
- return genList
-
- def quad(self, x1, y1, x2, y2, x3, y3, x4, y4):
- GL.glColor(self.trolltechGreen.redF(), self.trolltechGreen.greenF(), self.trolltechGreen.blueF(), self.trolltechGreen.alphaF())
-
- GL.glVertex3d(x1, y1, +0.05)
- GL.glVertex3d(x2, y2, +0.05)
- GL.glVertex3d(x3, y3, +0.05)
- GL.glVertex3d(x4, y4, +0.05)
-
- GL.glVertex3d(x4, y4, -0.05)
- GL.glVertex3d(x3, y3, -0.05)
- GL.glVertex3d(x2, y2, -0.05)
- GL.glVertex3d(x1, y1, -0.05)
-
- def extrude(self, x1, y1, x2, y2):
- darkTrolltechGreen = self.trolltechGreen.darker(250 + int(100 * x1))
- GL.glColor(darkTrolltechGreen.redF(), darkTrolltechGreen.greenF(), darkTrolltechGreen.blueF(), darkTrolltechGreen.alphaF())
-
- GL.glVertex3d(x1, y1, -0.05)
- GL.glVertex3d(x2, y2, -0.05)
- GL.glVertex3d(x2, y2, +0.05)
- GL.glVertex3d(x1, y1, +0.05)
-
- def normalizeAngle(self, angle):
- while angle < 0:
- angle += 360 * 16
- while angle > 360 * 16:
- angle -= 360 * 16
- return angle
-
- def freeResources(self):
- self.makeCurrent()
- GL.glDeleteLists(self.object, 1)
-
-if __name__ == '__main__':
- app = QtWidgets.QApplication(sys.argv)
- window = Window()
- window.show()
- res = app.exec_()
- window.glWidget.freeResources()
- sys.exit(res)
diff --git a/examples/widgets/widgets/tetrix.py b/examples/widgets/widgets/tetrix.py
deleted file mode 100644
index 134eec4e4..000000000
--- a/examples/widgets/widgets/tetrix.py
+++ /dev/null
@@ -1,498 +0,0 @@
-
-#############################################################################
-##
-## Copyright (C) 2013 Riverbank Computing Limited.
-## Copyright (C) 2016 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
-
-"""PySide2 port of the widgets/widgets/tetrix example from Qt v5.x"""
-
-import random
-
-from PySide2 import QtCore, QtGui, QtWidgets
-
-
-NoShape, ZShape, SShape, LineShape, TShape, SquareShape, LShape, MirroredLShape = range(8)
-
-
-class TetrixWindow(QtWidgets.QWidget):
- def __init__(self):
- super(TetrixWindow, self).__init__()
-
- self.board = TetrixBoard()
-
- nextPieceLabel = QtWidgets.QLabel()
- nextPieceLabel.setFrameStyle(QtWidgets.QFrame.Box | QtWidgets.QFrame.Raised)
- nextPieceLabel.setAlignment(QtCore.Qt.AlignCenter)
- self.board.setNextPieceLabel(nextPieceLabel)
-
- scoreLcd = QtWidgets.QLCDNumber(5)
- scoreLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
- levelLcd = QtWidgets.QLCDNumber(2)
- levelLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
- linesLcd = QtWidgets.QLCDNumber(5)
- linesLcd.setSegmentStyle(QtWidgets.QLCDNumber.Filled)
-
- startButton = QtWidgets.QPushButton("&Start")
- startButton.setFocusPolicy(QtCore.Qt.NoFocus)
- quitButton = QtWidgets.QPushButton("&Quit")
- quitButton.setFocusPolicy(QtCore.Qt.NoFocus)
- pauseButton = QtWidgets.QPushButton("&Pause")
- pauseButton.setFocusPolicy(QtCore.Qt.NoFocus)
-
- startButton.clicked.connect(self.board.start)
- pauseButton.clicked.connect(self.board.pause)
- quitButton.clicked.connect(qApp.quit)
- self.board.scoreChanged.connect(scoreLcd.display)
- self.board.levelChanged.connect(levelLcd.display)
- self.board.linesRemovedChanged.connect(linesLcd.display)
-
- layout = QtWidgets.QGridLayout()
- layout.addWidget(self.createLabel("NEXT"), 0, 0)
- layout.addWidget(nextPieceLabel, 1, 0)
- layout.addWidget(self.createLabel("LEVEL"), 2, 0)
- layout.addWidget(levelLcd, 3, 0)
- layout.addWidget(startButton, 4, 0)
- layout.addWidget(self.board, 0, 1, 6, 1)
- layout.addWidget(self.createLabel("SCORE"), 0, 2)
- layout.addWidget(scoreLcd, 1, 2)
- layout.addWidget(self.createLabel("LINES REMOVED"), 2, 2)
- layout.addWidget(linesLcd, 3, 2)
- layout.addWidget(quitButton, 4, 2)
- layout.addWidget(pauseButton, 5, 2)
- self.setLayout(layout)
-
- self.setWindowTitle("Tetrix")
- self.resize(550, 370)
-
- def createLabel(self, text):
- lbl = QtWidgets.QLabel(text)
- lbl.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignBottom)
- return lbl
-
-
-class TetrixBoard(QtWidgets.QFrame):
- BoardWidth = 10
- BoardHeight = 22
-
- scoreChanged = QtCore.Signal(int)
-
- levelChanged = QtCore.Signal(int)
-
- linesRemovedChanged = QtCore.Signal(int)
-
- def __init__(self, parent=None):
- super(TetrixBoard, self).__init__(parent)
-
- self.timer = QtCore.QBasicTimer()
- self.nextPieceLabel = None
- self.isWaitingAfterLine = False
- self.curPiece = TetrixPiece()
- self.nextPiece = TetrixPiece()
- self.curX = 0
- self.curY = 0
- self.numLinesRemoved = 0
- self.numPiecesDropped = 0
- self.score = 0
- self.level = 0
- self.board = None
-
- self.setFrameStyle(QtWidgets.QFrame.Panel | QtWidgets.QFrame.Sunken)
- self.setFocusPolicy(QtCore.Qt.StrongFocus)
- self.isStarted = False
- self.isPaused = False
- self.clearBoard()
-
- self.nextPiece.setRandomShape()
-
- def shapeAt(self, x, y):
- return self.board[(y * TetrixBoard.BoardWidth) + x]
-
- def setShapeAt(self, x, y, shape):
- self.board[(y * TetrixBoard.BoardWidth) + x] = shape
-
- def timeoutTime(self):
- return 1000 / (1 + self.level)
-
- def squareWidth(self):
- return self.contentsRect().width() / TetrixBoard.BoardWidth
-
- def squareHeight(self):
- return self.contentsRect().height() / TetrixBoard.BoardHeight
-
- def setNextPieceLabel(self, label):
- self.nextPieceLabel = label
-
- def sizeHint(self):
- return QtCore.QSize(TetrixBoard.BoardWidth * 15 + self.frameWidth() * 2,
- TetrixBoard.BoardHeight * 15 + self.frameWidth() * 2)
-
- def minimumSizeHint(self):
- return QtCore.QSize(TetrixBoard.BoardWidth * 5 + self.frameWidth() * 2,
- TetrixBoard.BoardHeight * 5 + self.frameWidth() * 2)
-
- def start(self):
- if self.isPaused:
- return
-
- self.isStarted = True
- self.isWaitingAfterLine = False
- self.numLinesRemoved = 0
- self.numPiecesDropped = 0
- self.score = 0
- self.level = 1
- self.clearBoard()
-
- self.linesRemovedChanged.emit(self.numLinesRemoved)
- self.scoreChanged.emit(self.score)
- self.levelChanged.emit(self.level)
-
- self.newPiece()
- self.timer.start(self.timeoutTime(), self)
-
- def pause(self):
- if not self.isStarted:
- return
-
- self.isPaused = not self.isPaused
- if self.isPaused:
- self.timer.stop()
- else:
- self.timer.start(self.timeoutTime(), self)
-
- self.update()
-
- def paintEvent(self, event):
- super(TetrixBoard, self).paintEvent(event)
-
- painter = QtGui.QPainter(self)
- rect = self.contentsRect()
-
- if self.isPaused:
- painter.drawText(rect, QtCore.Qt.AlignCenter, "Pause")
- return
-
- boardTop = rect.bottom() - TetrixBoard.BoardHeight * self.squareHeight()
-
- for i in range(TetrixBoard.BoardHeight):
- for j in range(TetrixBoard.BoardWidth):
- shape = self.shapeAt(j, TetrixBoard.BoardHeight - i - 1)
- if shape != NoShape:
- self.drawSquare(painter,
- rect.left() + j * self.squareWidth(),
- boardTop + i * self.squareHeight(), shape)
-
- if self.curPiece.shape() != NoShape:
- for i in range(4):
- x = self.curX + self.curPiece.x(i)
- y = self.curY - self.curPiece.y(i)
- self.drawSquare(painter, rect.left() + x * self.squareWidth(),
- boardTop + (TetrixBoard.BoardHeight - y - 1) * self.squareHeight(),
- self.curPiece.shape())
-
- def keyPressEvent(self, event):
- if not self.isStarted or self.isPaused or self.curPiece.shape() == NoShape:
- super(TetrixBoard, self).keyPressEvent(event)
- return
-
- key = event.key()
- if key == QtCore.Qt.Key_Left:
- self.tryMove(self.curPiece, self.curX - 1, self.curY)
- elif key == QtCore.Qt.Key_Right:
- self.tryMove(self.curPiece, self.curX + 1, self.curY)
- elif key == QtCore.Qt.Key_Down:
- self.tryMove(self.curPiece.rotatedRight(), self.curX, self.curY)
- elif key == QtCore.Qt.Key_Up:
- self.tryMove(self.curPiece.rotatedLeft(), self.curX, self.curY)
- elif key == QtCore.Qt.Key_Space:
- self.dropDown()
- elif key == QtCore.Qt.Key_D:
- self.oneLineDown()
- else:
- super(TetrixBoard, self).keyPressEvent(event)
-
- def timerEvent(self, event):
- if event.timerId() == self.timer.timerId():
- if self.isWaitingAfterLine:
- self.isWaitingAfterLine = False
- self.newPiece()
- self.timer.start(self.timeoutTime(), self)
- else:
- self.oneLineDown()
- else:
- super(TetrixBoard, self).timerEvent(event)
-
- def clearBoard(self):
- self.board = [NoShape for i in range(TetrixBoard.BoardHeight * TetrixBoard.BoardWidth)]
-
- def dropDown(self):
- dropHeight = 0
- newY = self.curY
- while newY > 0:
- if not self.tryMove(self.curPiece, self.curX, newY - 1):
- break
- newY -= 1
- dropHeight += 1
-
- self.pieceDropped(dropHeight)
-
- def oneLineDown(self):
- if not self.tryMove(self.curPiece, self.curX, self.curY - 1):
- self.pieceDropped(0)
-
- def pieceDropped(self, dropHeight):
- for i in range(4):
- x = self.curX + self.curPiece.x(i)
- y = self.curY - self.curPiece.y(i)
- self.setShapeAt(x, y, self.curPiece.shape())
-
- self.numPiecesDropped += 1
- if self.numPiecesDropped % 25 == 0:
- self.level += 1
- self.timer.start(self.timeoutTime(), self)
- self.levelChanged.emit(self.level)
-
- self.score += dropHeight + 7
- self.scoreChanged.emit(self.score)
- self.removeFullLines()
-
- if not self.isWaitingAfterLine:
- self.newPiece()
-
- def removeFullLines(self):
- numFullLines = 0
-
- for i in range(TetrixBoard.BoardHeight - 1, -1, -1):
- lineIsFull = True
-
- for j in range(TetrixBoard.BoardWidth):
- if self.shapeAt(j, i) == NoShape:
- lineIsFull = False
- break
-
- if lineIsFull:
- numFullLines += 1
- for k in range(TetrixBoard.BoardHeight - 1):
- for j in range(TetrixBoard.BoardWidth):
- self.setShapeAt(j, k, self.shapeAt(j, k + 1))
-
- for j in range(TetrixBoard.BoardWidth):
- self.setShapeAt(j, TetrixBoard.BoardHeight - 1, NoShape)
-
- if numFullLines > 0:
- self.numLinesRemoved += numFullLines
- self.score += 10 * numFullLines
- self.linesRemovedChanged.emit(self.numLinesRemoved)
- self.scoreChanged.emit(self.score)
-
- self.timer.start(500, self)
- self.isWaitingAfterLine = True
- self.curPiece.setShape(NoShape)
- self.update()
-
- def newPiece(self):
- self.curPiece = self.nextPiece
- self.nextPiece.setRandomShape()
- self.showNextPiece()
- self.curX = TetrixBoard.BoardWidth // 2 + 1
- self.curY = TetrixBoard.BoardHeight - 1 + self.curPiece.minY()
-
- if not self.tryMove(self.curPiece, self.curX, self.curY):
- self.curPiece.setShape(NoShape)
- self.timer.stop()
- self.isStarted = False
-
- def showNextPiece(self):
- if self.nextPieceLabel is not None:
- return
-
- dx = self.nextPiece.maxX() - self.nextPiece.minX() + 1
- dy = self.nextPiece.maxY() - self.nextPiece.minY() + 1
-
- pixmap = QtGui.QPixmap(dx * self.squareWidth(), dy * self.squareHeight())
- painter = QtGui.QPainter(pixmap)
- painter.fillRect(pixmap.rect(), self.nextPieceLabel.palette().background())
-
- for int in range(4):
- x = self.nextPiece.x(i) - self.nextPiece.minX()
- y = self.nextPiece.y(i) - self.nextPiece.minY()
- self.drawSquare(painter, x * self.squareWidth(),
- y * self.squareHeight(), self.nextPiece.shape())
-
- self.nextPieceLabel.setPixmap(pixmap)
-
- def tryMove(self, newPiece, newX, newY):
- for i in range(4):
- x = newX + newPiece.x(i)
- y = newY - newPiece.y(i)
- if x < 0 or x >= TetrixBoard.BoardWidth or y < 0 or y >= TetrixBoard.BoardHeight:
- return False
- if self.shapeAt(x, y) != NoShape:
- return False
-
- self.curPiece = newPiece
- self.curX = newX
- self.curY = newY
- self.update()
- return True
-
- def drawSquare(self, painter, x, y, shape):
- colorTable = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
- 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
-
- color = QtGui.QColor(colorTable[shape])
- painter.fillRect(x + 1, y + 1, self.squareWidth() - 2,
- self.squareHeight() - 2, color)
-
- painter.setPen(color.lighter())
- painter.drawLine(x, y + self.squareHeight() - 1, x, y)
- painter.drawLine(x, y, x + self.squareWidth() - 1, y)
-
- painter.setPen(color.darker())
- painter.drawLine(x + 1, y + self.squareHeight() - 1,
- x + self.squareWidth() - 1, y + self.squareHeight() - 1)
- painter.drawLine(x + self.squareWidth() - 1,
- y + self.squareHeight() - 1, x + self.squareWidth() - 1, y + 1)
-
-
-class TetrixPiece(object):
- coordsTable = (
- ((0, 0), (0, 0), (0, 0), (0, 0)),
- ((0, -1), (0, 0), (-1, 0), (-1, 1)),
- ((0, -1), (0, 0), (1, 0), (1, 1)),
- ((0, -1), (0, 0), (0, 1), (0, 2)),
- ((-1, 0), (0, 0), (1, 0), (0, 1)),
- ((0, 0), (1, 0), (0, 1), (1, 1)),
- ((-1, -1), (0, -1), (0, 0), (0, 1)),
- ((1, -1), (0, -1), (0, 0), (0, 1))
- )
-
- def __init__(self):
- self.coords = [[0,0] for _ in range(4)]
- self.pieceShape = NoShape
-
- self.setShape(NoShape)
-
- def shape(self):
- return self.pieceShape
-
- def setShape(self, shape):
- table = TetrixPiece.coordsTable[shape]
- for i in range(4):
- for j in range(2):
- self.coords[i][j] = table[i][j]
-
- self.pieceShape = shape
-
- def setRandomShape(self):
- self.setShape(random.randint(1, 7))
-
- def x(self, index):
- return self.coords[index][0]
-
- def y(self, index):
- return self.coords[index][1]
-
- def setX(self, index, x):
- self.coords[index][0] = x
-
- def setY(self, index, y):
- self.coords[index][1] = y
-
- def minX(self):
- m = self.coords[0][0]
- for i in range(4):
- m = min(m, self.coords[i][0])
-
- return m
-
- def maxX(self):
- m = self.coords[0][0]
- for i in range(4):
- m = max(m, self.coords[i][0])
-
- return m
-
- def minY(self):
- m = self.coords[0][1]
- for i in range(4):
- m = min(m, self.coords[i][1])
-
- return m
-
- def maxY(self):
- m = self.coords[0][1]
- for i in range(4):
- m = max(m, self.coords[i][1])
-
- return m
-
- def rotatedLeft(self):
- if self.pieceShape == SquareShape:
- return self
-
- result = TetrixPiece()
- result.pieceShape = self.pieceShape
- for i in range(4):
- result.setX(i, self.y(i))
- result.setY(i, -self.x(i))
-
- return result
-
- def rotatedRight(self):
- if self.pieceShape == SquareShape:
- return self
-
- result = TetrixPiece()
- result.pieceShape = self.pieceShape
- for i in range(4):
- result.setX(i, -self.y(i))
- result.setY(i, self.x(i))
-
- return result
-
-
-if __name__ == '__main__':
-
- import sys
-
- app = QtWidgets.QApplication(sys.argv)
- window = TetrixWindow()
- window.show()
- random.seed(None)
- sys.exit(app.exec_())
diff --git a/examples/widgets/widgets/tetrix/doc/tetrix-screenshot.png b/examples/widgets/widgets/tetrix/doc/tetrix-screenshot.png
new file mode 100644
index 000000000..2c3dade39
--- /dev/null
+++ b/examples/widgets/widgets/tetrix/doc/tetrix-screenshot.png
Binary files differ
diff --git a/examples/widgets/widgets/tetrix/doc/tetrix.rst b/examples/widgets/widgets/tetrix/doc/tetrix.rst
new file mode 100644
index 000000000..0749de9de
--- /dev/null
+++ b/examples/widgets/widgets/tetrix/doc/tetrix.rst
@@ -0,0 +1,38 @@
+Tetrix
+======
+
+The Tetrix example is a Qt version of the classic Tetrix game.
+
+.. image:: tetrix-screenshot.png
+ :width: 400
+ :alt: Tetrix main window
+
+The object of the game is to stack pieces dropped from the top of the playing
+area so that they fill entire rows at the bottom of the playing area.
+
+When a row is filled, all the blocks on that row are removed, the player earns
+a number of points, and the pieces above are moved down to occupy that row. If
+more than one row is filled, the blocks on each row are removed, and the player
+earns extra points.
+
+The **Left** cursor key moves the current piece one space to the left, the
+**Right** cursor key moves it one space to the right, the **Up** cursor key
+rotates the piece counter-clockwise by 90 degrees, and the **Down** cursor key
+rotates the piece clockwise by 90 degrees.
+
+To avoid waiting for a piece to fall to the bottom of the board, press **D** to
+immediately move the piece down by one row, or press the **Space** key to drop
+it as close to the bottom of the board as possible.
+
+This example shows how a simple game can be created using only three classes:
+
+* The ``TetrixWindow`` class is used to display the player's score, number of
+ lives, and information about the next piece to appear.
+* The ``TetrixBoard`` class contains the game logic, handles keyboard input, and
+ displays the pieces on the playing area.
+* The ``TetrixPiece`` class contains information about each piece.
+
+In this approach, the ``TetrixBoard`` class is the most complex class, since it
+handles the game logic and rendering. One benefit of this is that the
+``TetrixWindow`` and ``TetrixPiece`` classes are very simple and contain only a
+minimum of code.
diff --git a/examples/widgets/widgets/tetrix/tetrix.py b/examples/widgets/widgets/tetrix/tetrix.py
new file mode 100644
index 000000000..b5df2aa35
--- /dev/null
+++ b/examples/widgets/widgets/tetrix/tetrix.py
@@ -0,0 +1,472 @@
+# Copyright (C) 2013 Riverbank Computing Limited.
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/widgets/tetrix example from Qt v5.x"""
+
+from enum import IntEnum
+import random
+import sys
+
+from PySide6.QtCore import QBasicTimer, QSize, Qt, Signal, Slot
+from PySide6.QtGui import QColor, QPainter, QPixmap
+from PySide6.QtWidgets import (QApplication, QFrame, QGridLayout, QLabel,
+ QLCDNumber, QPushButton, QWidget)
+
+
+class Piece(IntEnum):
+ NoShape = 0
+ ZShape = 1
+ SShape = 2
+ LineShape = 3
+ TShape = 4
+ SquareShape = 5
+ LShape = 6
+ MirroredLShape = 7
+
+
+class TetrixWindow(QWidget):
+ def __init__(self):
+ super().__init__()
+
+ self.board = TetrixBoard()
+
+ next_piece_label = QLabel()
+ next_piece_label.setFrameStyle(QFrame.Box | QFrame.Raised)
+ next_piece_label.setAlignment(Qt.AlignCenter)
+ self.board.set_next_piece_label(next_piece_label)
+
+ score_lcd = QLCDNumber(5)
+ score_lcd.setSegmentStyle(QLCDNumber.Filled)
+ level_lcd = QLCDNumber(2)
+ level_lcd.setSegmentStyle(QLCDNumber.Filled)
+ lines_lcd = QLCDNumber(5)
+ lines_lcd.setSegmentStyle(QLCDNumber.Filled)
+
+ start_button = QPushButton("&Start")
+ start_button.setFocusPolicy(Qt.NoFocus)
+ quit_button = QPushButton("&Quit")
+ quit_button.setFocusPolicy(Qt.NoFocus)
+ pause_button = QPushButton("&Pause")
+ pause_button.setFocusPolicy(Qt.NoFocus)
+
+ start_button.clicked.connect(self.board.start)
+ pause_button.clicked.connect(self.board.pause)
+ quit_button.clicked.connect(qApp.quit) # noqa: F821
+ self.board.score_changed.connect(score_lcd.display)
+ self.board.level_changed.connect(level_lcd.display)
+ self.board.lines_removed_changed.connect(lines_lcd.display)
+
+ layout = QGridLayout(self)
+ layout.addWidget(self.create_label("NEXT"), 0, 0)
+ layout.addWidget(next_piece_label, 1, 0)
+ layout.addWidget(self.create_label("LEVEL"), 2, 0)
+ layout.addWidget(level_lcd, 3, 0)
+ layout.addWidget(start_button, 4, 0)
+ layout.addWidget(self.board, 0, 1, 6, 1)
+ layout.addWidget(self.create_label("SCORE"), 0, 2)
+ layout.addWidget(score_lcd, 1, 2)
+ layout.addWidget(self.create_label("LINES REMOVED"), 2, 2)
+ layout.addWidget(lines_lcd, 3, 2)
+ layout.addWidget(quit_button, 4, 2)
+ layout.addWidget(pause_button, 5, 2)
+
+ self.setWindowTitle("Tetrix")
+ self.resize(550, 370)
+
+ def create_label(self, text):
+ lbl = QLabel(text)
+ lbl.setAlignment(Qt.AlignHCenter | Qt.AlignBottom)
+ return lbl
+
+
+class TetrixBoard(QFrame):
+ board_width = 10
+ board_height = 22
+
+ score_changed = Signal(int)
+
+ level_changed = Signal(int)
+
+ lines_removed_changed = Signal(int)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+
+ self.timer = QBasicTimer()
+ self.nextPieceLabel = None
+ self._is_waiting_after_line = False
+ self._cur_piece = TetrixPiece()
+ self._next_piece = TetrixPiece()
+ self._cur_x = 0
+ self._cur_y = 0
+ self._num_lines_removed = 0
+ self._num_pieces_dropped = 0
+ self.score = 0
+ self.level = 0
+ self.board = None
+
+ self.setFrameStyle(QFrame.Panel | QFrame.Sunken)
+ self.setFocusPolicy(Qt.StrongFocus)
+ self._is_started = False
+ self._is_paused = False
+ self.clear_board()
+
+ self._next_piece.set_random_shape()
+
+ def shape_at(self, x, y):
+ return self.board[(y * TetrixBoard.board_width) + x]
+
+ def set_shape_at(self, x, y, shape):
+ self.board[(y * TetrixBoard.board_width) + x] = shape
+
+ def timeout_time(self):
+ return 1000 / (1 + self.level)
+
+ def square_width(self):
+ return self.contentsRect().width() / TetrixBoard.board_width
+
+ def square_height(self):
+ return self.contentsRect().height() / TetrixBoard.board_height
+
+ def set_next_piece_label(self, label):
+ self.nextPieceLabel = label
+
+ def sizeHint(self):
+ return QSize(TetrixBoard.board_width * 15 + self.frameWidth() * 2,
+ TetrixBoard.board_height * 15 + self.frameWidth() * 2)
+
+ def minimum_size_hint(self):
+ return QSize(TetrixBoard.board_width * 5 + self.frameWidth() * 2,
+ TetrixBoard.board_height * 5 + self.frameWidth() * 2)
+
+ @Slot()
+ def start(self):
+ if self._is_paused:
+ return
+
+ self._is_started = True
+ self._is_waiting_after_line = False
+ self._num_lines_removed = 0
+ self._num_pieces_dropped = 0
+ self.score = 0
+ self.level = 1
+ self.clear_board()
+
+ self.lines_removed_changed.emit(self._num_lines_removed)
+ self.score_changed.emit(self.score)
+ self.level_changed.emit(self.level)
+
+ self.new_piece()
+ self.timer.start(self.timeout_time(), self)
+
+ @Slot()
+ def pause(self):
+ if not self._is_started:
+ return
+
+ self._is_paused = not self._is_paused
+ if self._is_paused:
+ self.timer.stop()
+ else:
+ self.timer.start(self.timeout_time(), self)
+
+ self.update()
+
+ def paintEvent(self, event):
+ super(TetrixBoard, self).paintEvent(event)
+
+ with QPainter(self) as painter:
+ rect = self.contentsRect()
+
+ if self._is_paused:
+ painter.drawText(rect, Qt.AlignCenter, "Pause")
+ return
+
+ board_top = rect.bottom() - TetrixBoard.board_height * self.square_height()
+
+ for i in range(TetrixBoard.board_height):
+ for j in range(TetrixBoard.board_width):
+ shape = self.shape_at(j, TetrixBoard.board_height - i - 1)
+ if shape != Piece.NoShape:
+ self.draw_square(painter,
+ rect.left() + j * self.square_width(),
+ board_top + i * self.square_height(), shape)
+
+ if self._cur_piece.shape() != Piece.NoShape:
+ for i in range(4):
+ x = self._cur_x + self._cur_piece.x(i)
+ y = self._cur_y - self._cur_piece.y(i)
+ self.draw_square(painter, rect.left() + x * self.square_width(),
+ board_top
+ + (TetrixBoard.board_height - y - 1) * self.square_height(),
+ self._cur_piece.shape())
+
+ def keyPressEvent(self, event):
+ if not self._is_started or self._is_paused or self._cur_piece.shape() == Piece.NoShape:
+ super(TetrixBoard, self).keyPressEvent(event)
+ return
+
+ key = event.key()
+ if key == Qt.Key_Left:
+ self.try_move(self._cur_piece, self._cur_x - 1, self._cur_y)
+ elif key == Qt.Key_Right:
+ self.try_move(self._cur_piece, self._cur_x + 1, self._cur_y)
+ elif key == Qt.Key_Down:
+ self.try_move(self._cur_piece.rotated_right(), self._cur_x, self._cur_y)
+ elif key == Qt.Key_Up:
+ self.try_move(self._cur_piece.rotated_left(), self._cur_x, self._cur_y)
+ elif key == Qt.Key_Space:
+ self.drop_down()
+ elif key == Qt.Key_D:
+ self.one_line_down()
+ else:
+ super(TetrixBoard, self).keyPressEvent(event)
+
+ def timerEvent(self, event):
+ if event.timerId() == self.timer.timerId():
+ if self._is_waiting_after_line:
+ self._is_waiting_after_line = False
+ self.new_piece()
+ self.timer.start(self.timeout_time(), self)
+ else:
+ self.one_line_down()
+ else:
+ super(TetrixBoard, self).timerEvent(event)
+
+ def clear_board(self):
+ self.board = [
+ Piece.NoShape for _ in range(TetrixBoard.board_height * TetrixBoard.board_width)]
+
+ def drop_down(self):
+ drop_height = 0
+ new_y = self._cur_y
+ while new_y > 0:
+ if not self.try_move(self._cur_piece, self._cur_x, new_y - 1):
+ break
+ new_y -= 1
+ drop_height += 1
+
+ self.piece_dropped(drop_height)
+
+ def one_line_down(self):
+ if not self.try_move(self._cur_piece, self._cur_x, self._cur_y - 1):
+ self.piece_dropped(0)
+
+ def piece_dropped(self, dropHeight):
+ for i in range(4):
+ x = self._cur_x + self._cur_piece.x(i)
+ y = self._cur_y - self._cur_piece.y(i)
+ self.set_shape_at(x, y, self._cur_piece.shape())
+
+ self._num_pieces_dropped += 1
+ if self._num_pieces_dropped % 25 == 0:
+ self.level += 1
+ self.timer.start(self.timeout_time(), self)
+ self.level_changed.emit(self.level)
+
+ self.score += dropHeight + 7
+ self.score_changed.emit(self.score)
+ self.remove_full_lines()
+
+ if not self._is_waiting_after_line:
+ self.new_piece()
+
+ def remove_full_lines(self):
+ num_full_lines = 0
+
+ for i in range(TetrixBoard.board_height - 1, -1, -1):
+ line_is_full = True
+
+ for j in range(TetrixBoard.board_width):
+ if self.shape_at(j, i) == Piece.NoShape:
+ line_is_full = False
+ break
+
+ if line_is_full:
+ num_full_lines += 1
+ for k in range(i, TetrixBoard.board_height - 1):
+ for j in range(TetrixBoard.board_width):
+ self.set_shape_at(j, k, self.shape_at(j, k + 1))
+
+ for j in range(TetrixBoard.board_width):
+ self.set_shape_at(j, TetrixBoard.board_height - 1, Piece.NoShape)
+
+ if num_full_lines > 0:
+ self._num_lines_removed += num_full_lines
+ self.score += 10 * num_full_lines
+ self.lines_removed_changed.emit(self._num_lines_removed)
+ self.score_changed.emit(self.score)
+
+ self.timer.start(500, self)
+ self._is_waiting_after_line = True
+ self._cur_piece.set_shape(Piece.NoShape)
+ self.update()
+
+ def new_piece(self):
+ self._cur_piece = self._next_piece
+ self._next_piece.set_random_shape()
+ self.show_next_piece()
+ self._cur_x = TetrixBoard.board_width // 2 + 1
+ self._cur_y = TetrixBoard.board_height - 1 + self._cur_piece.min_y()
+
+ if not self.try_move(self._cur_piece, self._cur_x, self._cur_y):
+ self._cur_piece.set_shape(Piece.NoShape)
+ self.timer.stop()
+ self._is_started = False
+
+ def show_next_piece(self):
+ if self.nextPieceLabel is not None:
+ return
+
+ dx = self._next_piece.max_x() - self._next_piece.min_x() + 1
+ dy = self._next_piece.max_y() - self._next_piece.min_y() + 1
+
+ pixmap = QPixmap(dx * self.square_width(), dy * self.square_height())
+ with QPainter(pixmap) as painter:
+ painter.fillRect(pixmap.rect(), self.nextPieceLabel.palette().background())
+
+ for i in range(4):
+ x = self._next_piece.x(i) - self._next_piece.min_x()
+ y = self._next_piece.y(i) - self._next_piece.min_y()
+ self.draw_square(painter, x * self.square_width(),
+ y * self.square_height(), self._next_piece.shape())
+
+ self.nextPieceLabel.setPixmap(pixmap)
+
+ def try_move(self, newPiece, newX, newY):
+ for i in range(4):
+ x = newX + newPiece.x(i)
+ y = newY - newPiece.y(i)
+ if x < 0 or x >= TetrixBoard.board_width or y < 0 or y >= TetrixBoard.board_height:
+ return False
+ if self.shape_at(x, y) != Piece.NoShape:
+ return False
+
+ self._cur_piece = newPiece
+ self._cur_x = newX
+ self._cur_y = newY
+ self.update()
+ return True
+
+ def draw_square(self, painter, x, y, shape):
+ color_table = [0x000000, 0xCC6666, 0x66CC66, 0x6666CC,
+ 0xCCCC66, 0xCC66CC, 0x66CCCC, 0xDAAA00]
+
+ color = QColor(color_table[shape])
+ painter.fillRect(x + 1, y + 1, self.square_width() - 2, self.square_height() - 2, color)
+
+ painter.setPen(color.lighter())
+ painter.drawLine(x, y + self.square_height() - 1, x, y)
+ painter.drawLine(x, y, x + self.square_width() - 1, y)
+
+ painter.setPen(color.darker())
+ painter.drawLine(x + 1, y + self.square_height() - 1,
+ x + self.square_width() - 1, y + self.square_height() - 1)
+ painter.drawLine(x + self.square_width() - 1,
+ y + self.square_height() - 1, x + self.square_width() - 1, y + 1)
+
+
+class TetrixPiece(object):
+ coords_table = (
+ ((0, 0), (0, 0), (0, 0), (0, 0)),
+ ((0, -1), (0, 0), (-1, 0), (-1, 1)),
+ ((0, -1), (0, 0), (1, 0), (1, 1)),
+ ((0, -1), (0, 0), (0, 1), (0, 2)),
+ ((-1, 0), (0, 0), (1, 0), (0, 1)),
+ ((0, 0), (1, 0), (0, 1), (1, 1)),
+ ((-1, -1), (0, -1), (0, 0), (0, 1)),
+ ((1, -1), (0, -1), (0, 0), (0, 1))
+ )
+
+ def __init__(self):
+ self.coords = [[0, 0] for _ in range(4)]
+ self._piece_shape = Piece.NoShape
+
+ self.set_shape(Piece.NoShape)
+
+ def shape(self):
+ return self._piece_shape
+
+ def set_shape(self, shape):
+ table = TetrixPiece.coords_table[shape]
+ for i in range(4):
+ for j in range(2):
+ self.coords[i][j] = table[i][j]
+
+ self._piece_shape = shape
+
+ def set_random_shape(self):
+ self.set_shape(random.randint(1, 7))
+
+ def x(self, index):
+ return self.coords[index][0]
+
+ def y(self, index):
+ return self.coords[index][1]
+
+ def set_x(self, index, x):
+ self.coords[index][0] = x
+
+ def set_y(self, index, y):
+ self.coords[index][1] = y
+
+ def min_x(self):
+ m = self.coords[0][0]
+ for i in range(4):
+ m = min(m, self.coords[i][0])
+
+ return m
+
+ def max_x(self):
+ m = self.coords[0][0]
+ for i in range(4):
+ m = max(m, self.coords[i][0])
+
+ return m
+
+ def min_y(self):
+ m = self.coords[0][1]
+ for i in range(4):
+ m = min(m, self.coords[i][1])
+
+ return m
+
+ def max_y(self):
+ m = self.coords[0][1]
+ for i in range(4):
+ m = max(m, self.coords[i][1])
+
+ return m
+
+ def rotated_left(self):
+ if self._piece_shape == Piece.SquareShape:
+ return self
+
+ result = TetrixPiece()
+ result._piece_shape = self._piece_shape
+ for i in range(4):
+ result.set_x(i, self.y(i))
+ result.set_y(i, -self.x(i))
+
+ return result
+
+ def rotated_right(self):
+ if self._piece_shape == Piece.SquareShape:
+ return self
+
+ result = TetrixPiece()
+ result._piece_shape = self._piece_shape
+ for i in range(4):
+ result.set_x(i, -self.y(i))
+ result.set_y(i, self.x(i))
+
+ return result
+
+
+if __name__ == '__main__':
+ app = QApplication(sys.argv)
+ window = TetrixWindow()
+ window.show()
+ random.seed(None)
+ sys.exit(app.exec())
diff --git a/examples/widgets/widgets/tetrix/tetrix.pyproject b/examples/widgets/widgets/tetrix/tetrix.pyproject
new file mode 100644
index 000000000..75121ea64
--- /dev/null
+++ b/examples/widgets/widgets/tetrix/tetrix.pyproject
@@ -0,0 +1,3 @@
+{
+ "files": ["tetrix.py"]
+}
diff --git a/examples/widgets/widgets/widgets.pyproject b/examples/widgets/widgets/widgets.pyproject
deleted file mode 100644
index b4e3ef67e..000000000
--- a/examples/widgets/widgets/widgets.pyproject
+++ /dev/null
@@ -1,3 +0,0 @@
-{
- "files": ["tetrix.py", "hellogl_openglwidget_legacy.py"]
-}
diff --git a/examples/widgets/widgetsgallery/doc/widgetsgallery.png b/examples/widgets/widgetsgallery/doc/widgetsgallery.png
new file mode 100644
index 000000000..236296681
--- /dev/null
+++ b/examples/widgets/widgetsgallery/doc/widgetsgallery.png
Binary files differ
diff --git a/examples/widgets/widgetsgallery/doc/widgetsgallery.rst b/examples/widgets/widgetsgallery/doc/widgetsgallery.rst
new file mode 100644
index 000000000..336eb7e46
--- /dev/null
+++ b/examples/widgets/widgetsgallery/doc/widgetsgallery.rst
@@ -0,0 +1,16 @@
+Widgets Gallery Example
+=======================
+
+Qt's support for widget styles and themes enables your application to fit in
+with the native desktop environment.
+
+The widgets examples show how some of the widgets available in Qt might appear
+when configured to use the a particular style. Each style is only available on
+the respective platfom, and provides native look and feel by integrating to the
+platform theme. Thus, the final appearance varies depending on the active
+theme.
+
+
+.. image:: widgetsgallery.png
+ :width: 400
+ :alt: Widgets Gallery Screenshot
diff --git a/examples/widgets/widgetsgallery/main.py b/examples/widgets/widgetsgallery/main.py
new file mode 100644
index 000000000..e40077a38
--- /dev/null
+++ b/examples/widgets/widgetsgallery/main.py
@@ -0,0 +1,16 @@
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
+
+"""PySide6 port of the widgets/gallery example from Qt v5.15"""
+
+import sys
+
+from PySide6.QtWidgets import QApplication
+from widgetgallery import WidgetGallery
+
+
+if __name__ == '__main__':
+ app = QApplication()
+ gallery = WidgetGallery()
+ gallery.show()
+ sys.exit(app.exec())
diff --git a/examples/widgets/gallery/widgetgallery.py b/examples/widgets/widgetsgallery/widgetgallery.py
index a06ac2e20..d43ab26a5 100644
--- a/examples/widgets/gallery/widgetgallery.py
+++ b/examples/widgets/widgetsgallery/widgetgallery.py
@@ -1,52 +1,23 @@
-#############################################################################
-##
-## Copyright (C) 2020 The Qt Company Ltd.
-## Contact: http://www.qt.io/licensing/
-##
-## This file is part of the Qt for Python examples of the Qt Toolkit.
-##
-## $QT_BEGIN_LICENSE:BSD$
-## You may use this file under the terms of the BSD license as follows:
-##
-## "Redistribution and use in source and binary forms, with or without
-## modification, are permitted provided that the following conditions are
-## met:
-## * Redistributions of source code must retain the above copyright
-## notice, this list of conditions and the following disclaimer.
-## * Redistributions in binary form must reproduce the above copyright
-## notice, this list of conditions and the following disclaimer in
-## the documentation and/or other materials provided with the
-## distribution.
-## * Neither the name of The Qt Company Ltd nor the names of its
-## contributors may be used to endorse or promote products derived
-## from this software without specific prior written permission.
-##
-##
-## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
-##
-## $QT_END_LICENSE$
-##
-#############################################################################
+# Copyright (C) 2022 The Qt Company Ltd.
+# SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
import sys
-from PySide2.QtWidgets import *
-from PySide2.QtGui import (QCursor, QDesktopServices, QGuiApplication, QIcon,
- QKeySequence, QStandardItem, QStandardItemModel,
- QScreen, QWindow)
-from PySide2.QtCore import (QDateTime, QDir, QLibraryInfo, QMetaObject,
- QSysInfo, QTextStream, QTimer, Qt, qVersion)
-
+from PySide6.QtCore import (QDateTime, QDir, QLibraryInfo, QSysInfo, Qt,
+ QTimer, Slot, qVersion)
+from PySide6.QtGui import (QCursor, QDesktopServices, QGuiApplication, QIcon,
+ QKeySequence, QShortcut, QStandardItem,
+ QStandardItemModel)
+from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox,
+ QCommandLinkButton, QDateTimeEdit, QDial,
+ QDialog, QDialogButtonBox, QFileSystemModel,
+ QGridLayout, QGroupBox, QHBoxLayout, QLabel,
+ QLineEdit, QListView, QMenu, QPlainTextEdit,
+ QProgressBar, QPushButton, QRadioButton,
+ QScrollBar, QSizePolicy, QSlider, QSpinBox,
+ QStyleFactory, QTableWidget, QTabWidget,
+ QTextBrowser, QTextEdit, QToolBox, QToolButton,
+ QTreeView, QVBoxLayout, QWidget)
POEM = """Twinkle, twinkle, little star,
How I wonder what you are.
@@ -75,7 +46,7 @@ def class_name(o):
def help_url(page):
"""Build a Qt help URL from the page name"""
major_version = qVersion().split('.')[0]
- return "https://doc.qt.io/qt-{}/{}.html".format(major_version, page)
+ return f"https://doc.qt.io/qt-{major_version}/{page}.html"
def launch_help(widget):
@@ -118,24 +89,28 @@ def embed_into_hbox_layout(w, margin=5):
def format_geometry(rect):
"""Format a geometry as a X11 geometry specification"""
- return "{}x{}{:+d}{:+d}".format(rect.width(), rect.height(),
- rect.x(), rect.y())
+ w = rect.width()
+ h = rect.height()
+ x = rect.x()
+ y = rect.y()
+ return f"{w}x{h}{x:+d}{y:+d}"
def screen_info(widget):
"""Format information on the screens"""
policy = QGuiApplication.highDpiScaleFactorRoundingPolicy()
policy_string = str(policy).split('.')[-1]
- result = "<p>High DPI scale factor rounding policy: {}</p><ol>".format(policy_string)
+ result = f"<p>High DPI scale factor rounding policy: {policy_string}</p><ol>"
for screen in QGuiApplication.screens():
current = screen == widget.screen()
result += "<li>"
if current:
result += "<i>"
- result += '"{}" {} {}DPI, DPR={}'.format(screen.name(),
- format_geometry(screen.geometry()),
- int(screen.logicalDotsPerInchX()),
- screen.devicePixelRatio())
+ name = screen.name()
+ geometry = format_geometry(screen.geometry())
+ dpi = int(screen.logicalDotsPerInchX())
+ dpr = screen.devicePixelRatio()
+ result += f'"{name}" {geometry} {dpi}DPI, DPR={dpr}'
if current:
result += "</i>"
result += "</li>"
@@ -147,8 +122,9 @@ class WidgetGallery(QDialog):
"""Dialog displaying a gallery of Qt Widgets"""
def __init__(self):
- super(WidgetGallery, self).__init__()
+ super().__init__()
+ self.setWindowIcon(QIcon(':/qt-project.org/logos/pysidelogo.png'))
self._progress_bar = self.create_progress_bar()
self._style_combobox = QComboBox()
@@ -188,8 +164,8 @@ class WidgetGallery(QDialog):
top_layout.addStretch(1)
top_layout.addWidget(disable_widgets_checkbox)
- dialog_buttonbox = QDialogButtonBox(QDialogButtonBox.Help |
- QDialogButtonBox.Close)
+ dialog_buttonbox = QDialogButtonBox(QDialogButtonBox.Help
+ | QDialogButtonBox.Close)
init_widget(dialog_buttonbox, "dialogButtonBox")
dialog_buttonbox.helpRequested.connect(launch_module_help)
dialog_buttonbox.rejected.connect(self.reject)
@@ -203,7 +179,8 @@ class WidgetGallery(QDialog):
main_layout.addWidget(self._progress_bar, 3, 0, 1, 2)
main_layout.addWidget(dialog_buttonbox, 4, 0, 1, 2)
- self.setWindowTitle("Widget Gallery Qt {}".format(qVersion()))
+ qv = qVersion()
+ self.setWindowTitle(f"Widget Gallery Qt {qv}")
def setVisible(self, visible):
super(WidgetGallery, self).setVisible(visible)
@@ -211,9 +188,11 @@ class WidgetGallery(QDialog):
self.windowHandle().screenChanged.connect(self.update_systeminfo)
self.update_systeminfo()
+ @Slot(str)
def change_style(self, style_name):
QApplication.setStyle(QStyleFactory.create(style_name))
+ @Slot()
def advance_progressbar(self):
cur_val = self._progress_bar.value()
max_val = self._progress_bar.maximum()
@@ -279,16 +258,16 @@ class WidgetGallery(QDialog):
checkbox.setTristate(True)
checkbox.setCheckState(Qt.PartiallyChecked)
- checkableLayout = QVBoxLayout()
- checkableLayout.addWidget(radiobutton_1)
- checkableLayout.addWidget(radiobutton_2)
- checkableLayout.addWidget(radiobutton_3)
- checkableLayout.addWidget(checkbox)
- checkableLayout.addStretch(1)
+ checkable_layout = QVBoxLayout()
+ checkable_layout.addWidget(radiobutton_1)
+ checkable_layout.addWidget(radiobutton_2)
+ checkable_layout.addWidget(radiobutton_3)
+ checkable_layout.addWidget(checkbox)
+ checkable_layout.addStretch(1)
main_layout = QHBoxLayout(result)
main_layout.addLayout(button_layout)
- main_layout.addLayout(checkableLayout)
+ main_layout.addLayout(checkable_layout)
main_layout.addStretch()
return result
@@ -299,7 +278,7 @@ class WidgetGallery(QDialog):
# Create centered/italic HTML rich text
rich_text = "<html><head/><body><i>"
for line in POEM.split('\n'):
- rich_text += "<center>" + line + "</center>"
+ rich_text += f"<center>{line}</center>"
rich_text += "</i></body></html>"
text_edit = QTextEdit(rich_text)
@@ -410,6 +389,7 @@ class WidgetGallery(QDialog):
timer.start(1000)
return result
+ @Slot()
def update_systeminfo(self):
"""Display system information"""
system_info = SYSTEMINFO.format(sys.version,
@@ -418,6 +398,7 @@ class WidgetGallery(QDialog):
screen_info(self))
self._systeminfo_textbrowser.setHtml(system_info)
+ @Slot()
def help_on_current_widget(self):
"""Display help on widget under mouse"""
w = QApplication.widgetAt(QCursor.pos(self.screen()))
diff --git a/examples/widgets/gallery/gallery.pyproject b/examples/widgets/widgetsgallery/widgetsgallery.pyproject
index 635e123b0..635e123b0 100644
--- a/examples/widgets/gallery/gallery.pyproject
+++ b/examples/widgets/widgetsgallery/widgetsgallery.pyproject