pax_global_header00006660000000000000000000000064137661701310014517gustar00rootroot0000000000000052 comment=2b1d8a96882276884e9e641b75b1e6b6edea0a35 .gitattributes000066400000000000000000000006401376617013100137560ustar00rootroot00000000000000# Set the default behavior, in case people don't have core.autocrlf set. * text=auto # Explicitly declare text files you want to always be normalized and converted # to native line endings on checkout. *.c text *.h text *.py text # Declare files that will always have CRLF line endings on checkout. *.sln text eol=crlf # Denote all files that are truly binary and should not be modified. *.png binary *.jpg binary.gitignore000066400000000000000000000035101376617013100130520ustar00rootroot00000000000000## PySide2 /pyside*_build /pyside*_install /PySide /PySide-*.*.* /SciTE.* /pysideuic distribute-*.egg distribute-*.tar.gz explore2 build_history/2* *.qdocconf *.qdocconf.in *.egg-info *.pyc ## C++ # Prerequisites *.d # Compiled Object files *.slo *.lo *.o *.obj # Precompiled Headers *.gch *.pch # Compiled Dynamic libraries *.so *.dylib *.dll # Fortran module files *.mod *.smod # Compiled Static libraries *.lai *.la *.a *.lib # Executables *.exe *.out *.app ## Python # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ #dist/ # we place the changelogs here downloads/ eggs/ .eggs/ /lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Translations *.mo *.pot # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don’t work, or not # install all needed dependencies. #Pipfile.lock # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json ## CMake CMakeLists.txt.user CMakeCache.txt CMakeFiles CMakeScripts #Testing Conflicts with the testing directory Makefile cmake_install.cmake install_manifest.txt compile_commands.json CTestTestfile.cmake _deps .gitmodules000066400000000000000000000001351376617013100132370ustar00rootroot00000000000000[submodule "sources/pyside2-tools"] path = sources/pyside2-tools url = ../pyside-tools.git .travis.yml000066400000000000000000000006411376617013100131750ustar00rootroot00000000000000language: python dist: trusty python: - "2.7" - "3.5" before_install: - sudo add-apt-repository ppa:beineri/opt-qt551-trusty -y - sudo apt-get update install: - sudo apt-get install qt55-meta-full -y script: - source /opt/qt55/bin/qt55-env.sh - python setup.py install --jobs=2 --build-tests # --openssl=/path/to/openssl/bin # how do we separate the build step and the tests, to see both as a result? CMakeLists.txt000066400000000000000000000014031376617013100136210ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) cmake_policy(VERSION 3.1) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build Type") project(pyside2_super_project) if (CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR) message(FATAL_ERROR "In-source builds are not allowed.") endif() # Used to prevent overriding message function in both shiboken2 and pyside2. set(is_pyside2_superproject_build 1) add_subdirectory(sources/shiboken2) # Semi-hack to include exported shiboken variables. list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_BINARY_DIR}/sources/shiboken2/data") add_subdirectory(sources/pyside2) # Semi-hack to include exported pyside2 variables. list(APPEND CMAKE_PREFIX_PATH "${CMAKE_CURRENT_BINARY_DIR}/sources/pyside2/libpyside") add_subdirectory(sources/pyside2-tools) LICENSE.COMMERCIAL000066400000000000000000001343041376617013100135070ustar00rootroot00000000000000QT LICENSE AGREEMENT Agreement version 4.0 This License Agreement (“Agreement”) is a legal agreement between The Qt Company (as defined below) and the Licensee (as defined below) for the license of Licensed Software (as defined below). Capitalized terms used herein are defined in Section 1. WHEREAS: (A). Licensee wishes to use the Licensed Software for the purpose of developing and distributing Applications and/or Devices; and (B). The Qt Company is willing to grant the Licensee a right to use Licensed Software for such purpose pursuant to term and conditions of this Agreement. NOW, THEREFORE, THE PARTIES HEREBY AGREE AS FOLLOWS: 1. DEFINITIONS “Affiliate” of a Party shall mean an entity (i) which is directly or indirectly controlling such Party; (ii) which is under the same direct or indirect ownership or control as such Party; or (iii) which is directly or indirectly owned or controlled by such Party. For these purposes, an entity shall be treated as being controlled by another if that other entity has fifty percent (50 %) or more of the votes in such entity, is able to direct its affairs and/or to control the composition of its board of directors or equivalent body. “Applications” shall mean Licensee's software products created using the Licensed Software, which may include the Redistributables, or part thereof. “Contractor(s)” shall mean third party consultants, distributors and contractors performing services to a Party under applicable contractual arrangement. “Customer(s)” shall mean Licensee’s end users to whom Licensee, directly or indirectly, distributes copies of the Redistributables. “Deployment Platforms” shall mean operating systems specified in the License Certificate, in which the Redistributables can be distributed pursuant to the terms and conditions of this Agreement. “Designated User(s)” shall mean the employee(s) of Licensee or Licensee’s Affiliates acting within the scope of their employment or Licensee's Contractors acting within the scope of their services for Licensee and on behalf of Licensee. Designated Users shall be named in the License Certificate. “Development License” shall mean the license needed by the Licensee for each Designated User to use the Licensed Software under the license grant described in Section 3.1 of this Agreement. “Development Platforms” shall mean those operating systems specified in the License Certificate, in which the Licensed Software can be used under the Development License, but not distributed in any form or used for any other purpose. “Devices” shall mean hardware devices or products that 1) are manufactured and/or distributed by the Licensee or its Affiliates or Contractors, and (2)(i) incorporate or integrate the Redistributables or parts thereof; or (ii) do not incorporate or integrate the Redistributables at the time of distribution, but where, when used by a Customer, the main user interface or substantial functionality of such device is provided by Application(s) or otherwise depends on the Licensed Software. “Distribution License(s)” shall mean the license required for distribution of Redistributables in connection with Devices pursuant to license grant described in Section 3.3 of this Agreement. “Distribution License Packs” shall mean set of prepaid Distribution Licenses for distribution of Redistributables, as defined in The Qt Company’s standard price list, quote, Purchase Order confirmation or in an appendix hereto, as the case may be. “Intellectual Property Rights” shall mean patents (including utility models), design patents, and designs (whether or not capable of registration), chip topography rights and other like protection, copyrights, trademarks, service marks, trade names, logos or other words or symbols and any other form of statutory protection of any kind and applications for any of the foregoing as well as any trade secrets. “License Certificate” shall mean a certificate generated by The Qt Company for each Designated User respectively upon them downloading the licensed Software. License Certificate will be available under respective Designated User’s Qt Account at account.qt.io and it will specify the Designated User, the Development Platforms, Deployment Platforms and the License Term. The terms of the License Certificate are considered part of this Agreement and shall be updated from time to time to reflect any agreed changes to the foregoing terms relating to Designated User’s rights to the Licensed Software. “License Fee” shall mean the fee charged to the Licensee for rights granted under the terms of this Agreement. “License Term” shall mean the agreed validity period of the Development License of the respective Designated User, during which time the Designated User is entitled to use the Licensed Software, as set forth in the respective License Certificate. “Licensed Software” shall mean all versions of the (i) Qt Toolkit (including Qt Essentials, Qt Add-Ons and Value-Add modules) as described in http://doc.qt.io/qt-5/qtmodules.html, (ii). Qt Creator (including Creator IDE tool) as described in http://doc.qt.io/qtcreator/index.html, (iii). Qt 3D Studio as described in http://doc.qt.io/qt3dstudio/index.html, and as well as corresponding online or electronic documentation, associated media and printed materials, including the source code, example programs and the documentation, licensed to the Licensee under this Agreement. Licensed Software does not include Third Party Software (as defined in Section 4), Open Source Qt, or other software products of The Qt Company (for example Qt Safe Renderer and Qt for Automation), unless such other software products of The Qt Company are separately agreed in writing to be included in scope of the Licensed Software. “Licensee” shall mean the individual or legal entity that is party to this Agreement, as identified on the signature page hereof. “Licensee’s Records” shall mean books and records that are likely to contain information bearing on Licensee’s compliance with this Agreement or the payments due to The Qt Company under this Agreement, including, but not limited to: assembly logs, sales records and distribution records. “Modified Software” shall have the meaning as set forth in Section 2.3. “Online Services” shall mean any services or access to systems made available by The Qt Company to the Licensee over the Internet relating to the Licensed Software or for the purpose of use by the Licensee of the Licensed Software or Support. Use of any such Online Services is discretionary for the Licensee and some of them may be subject to additional fees. “Open Source Qt” shall mean the non-commercial Qt computer software products, licensed under the terms of the GNU Lesser General Public License, version 2.1 or later (“LGPL”) or the GNU General Public License, version 2.0 or later (“GPL”). For clarity, Open Source Qt shall not be provided nor governed under this Agreement. ”Party” or “Parties” shall mean Licensee and/or The Qt Company. "Redistributables" shall mean the portions of the Licensed Software set forth in Appendix 1, Section 1 that may be distributed pursuant to the terms of this Agreement in object code form only, including any relevant documentation. Where relevant, any reference to Licensed Software in this Agreement shall include and refer also to Redistributables. “Renewal Term” shall mean an extension of previous License Term as agreed between the Parties. “Submitted Modified Software” shall have the meaning as set forth in Section 2.3. “Support” shall mean standard developer support that is provided by The Qt Company to assist Designated Users in using the Licensed Software in accordance with The Qt Company’s standard support terms and as further defined in Section 8 hereunder. “Taxes” shall have the meaning set forth in Section 10.5. “Term” shall have the meaning set forth in Section 12. “The Qt Company” shall mean: (i) in the event Licensee is an individual residing in the United States or a legal entity incorporated in the United States or having its headquarters in the United States, The Qt Company Inc., a Delaware corporation with its office at 2350 Mission College Blvd., Suite 1020, Santa Clara, CA 95054, USA.; or (ii) in the event the Licensee is an individual residing outside of the United States or a legal entity incorporated outside of the United States or having its registered office outside of the United States, The Qt Company Ltd., a Finnish company with its registered office at Bertel Jungin aukio D3A, 02600 Espoo, Finland. "Third Party Software " shall have the meaning set forth in Section 4. “Updates” shall mean a release or version of the Licensed Software containing bug fixes, error corrections and other changes that are generally made available to users of the Licensed Software that have contracted for Support. Updates are generally depicted as a change to the digits following the decimal in the Licensed Software version number. The Qt Company shall make Updates available to the Licensee under the Support. Updates shall be considered as part of the Licensed Software hereunder. “Upgrades” shall mean a release or version of the Licensed Software containing enhancements and new features and are generally depicted as a change to the first digit of the Licensed Software version number. In the event Upgrades are provided to the Licensee under this Agreement, they shall be considered as part of the Licensed Software hereunder. 2. OWNERSHIP 2.1 Ownership of The Qt Company The Licensed Software is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The Licensed Software is licensed, not sold. All The Qt Company's Intellectual Property Rights are and shall remain the exclusive property of The Qt Company or its licensors respectively. 2.2 Ownership of Licensee All the Licensee's Intellectual Property Rights are and shall remain the exclusive property of the Licensee or its licensors respectively. All Intellectual Property Rights to the Modified Software, Applications and Devices shall remain with the Licensee and no rights thereto shall be granted by the Licensee to The Qt Company under this Agreement (except as set forth in Section 2.3 below). 2.3 Modified Software Licensee may create bug-fixes, error corrections, patches or modifications to the Licensed Software (“Modified Software”). Such Modified Software may break the source or binary compatibility with the Licensed Software (including without limitation through changing the application programming interfaces ("API") or by adding, changing or deleting any variable, method, or class signature in the Licensed Software and/or any inter-process protocols, services or standards in the Licensed Software libraries). To the extent that Licensee’s Modified Software so breaks source or binary compatibility with the Licensed Software, Licensee acknowledges that The Qt Company's ability to provide Support may be prevented or limited and Licensee's ability to make use of Updates may be restricted. Licensee may, at its sole and absolute discretion, choose to submit Modified Software to The Qt Company (“Submitted Modified Software”) in connection with Licensee’s Support request, service request or otherwise. In the event Licensee does so, then, Licensee hereby grants The Qt Company a sublicensable, assignable, irrevocable, perpetual, worldwide, non-exclusive, royalty-free and fully paid-up license, under all of Licensee’s Intellectual Property Rights, to reproduce, adapt, translate, modify, and prepare derivative works of, publicly display, publicly perform, sublicense, make available and distribute such Submitted Modified Software as The Qt Company sees fit at its free and absolute discretion. 3. LICENSES GRANTED 3.1 Development with Licensed Software Subject to the terms of this Agreement, The Qt Company grants to Licensee a personal, worldwide, non-exclusive, non-transferable license, valid for the License Term, to use, modify and copy the Licensed Software by Designated Users on the Development Platforms for the sole purposes of designing, developing, demonstrating and testing Application(s) and/or Devices, and to provide thereto related support and other related services to end-user Customers. Licensee may install copies of the Licensed Software on an unlimited number of computers provided that (i) only the Designated Users may use the Licensed Software, and (ii) all Designated Users must have a valid Development License to use Licensed Software. Licensee may at any time designate another Designated User to replace a then- current Designated User by notifying The Qt Company in writing, provided that any Designated User may be replaced only once during any six-month period. Upon expiry of the initially agreed License Term, the respective License Terms shall be automatically extended to one or more Renewal Term(s), unless and until either Party notifies the other Party in writing that it does not wish to continue the License Term, such notification to be provided to the other Party no less than ninety (90) days before expiry of the respective License Term. Unless otherwise agreed between the Parties, Renewal Term shall be of equal length with the initial Term. Any such Renewal Term shall be subject to License Fees agreed between the Parties or, if no advance agreement exists, subject to The Qt Company’s standard pricing applicable at the commencement date of any such Renewal Term. 3.2 Distribution of Applications Subject to the terms of this Agreement, The Qt Company grants to Licensee a personal, worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to this Agreement) right and license, valid for the Term, to (i) distribute, by itself or through its Contractors, Redistributables as installed, incorporated or integrated into Applications for execution on the Deployment Platforms, and (ii) grant sublicenses to Redistributables, as distributed hereunder, for Customers solely for Customer’s internal use and to the extent necessary in order for the Customers to use the Applications for their respective intended purposes. Right to distribute the Redistributables as part of an Application as provided herein is not royalty-bearing but is conditional upon the Licensee having paid the agreed Development Licenses from The Qt Company before distributing any Redistributables to Customers. 3.3 Distribution of Devices Subject to the terms of this Agreement, The Qt Company grants to Licensee a personal, worldwide, non-exclusive, non-transferable, revocable (for cause pursuant to this Agreement) right and license, valid for the Term, to (i) distribute, by itself or through one or more tiers of Contractors, Redistributables as installed, incorporated or integrated, or intended to be installed, incorporated or integrated into Devices for execution on the Deployment Platforms, and (ii) grant sublicenses to Redistributables, as distributed hereunder, for Customers solely for Customer’s internal use and to the extent necessary in order for the Customers to use the Devices for their respective intended purposes. Right to distribute the Redistributables with Devices as provided herein is conditional upon the Licensee having purchased and paid the appropriate amount of Development and Distribution Licenses from The Qt Company before distributing any Redistributables to Customers. 3.4 Further Requirements The licenses granted above in this Section 3 by The Qt Company to Licensee are conditional and subject to Licensee's compliance with the following terms: (i) Licensee shall not remove or alter any copyright, trademark or other proprietary rights notice contained in any portion of the Licensed Software; (ii) Applications must add primary and substantial functionality to the Licensed Software; (iii) Applications may not pass on functionality which in any way makes it possible for others to create software with the Licensed Software; provided however that Licensee may use the Licensed Software's scripting and QML ("Qt Quick") functionality solely in order to enable scripting, themes and styles that augment the functionality and appearance of the Application(s) without adding primary and substantial functionality to the Application(s); (iv) Applications must not compete with the Licensed Software; (v) Licensee shall not use The Qt Company's or any of its suppliers' names, logos, or trademarks to market Applications, except that Licensee may use “Built with Qt” logo to indicate that Application(s) was developed using the Licensed Software; (vi) Licensee shall not distribute, sublicense or disclose source code of Licensed Software to any third party (provided however that Licensee may appoint employee(s) of Contractors as Designated Users to use Licensed Software pursuant to this Agreement). Such right may be available for the Licensee subject to a separate software development kit (“SDK”) license agreement to be concluded with The Qt Company; (vii) Licensee shall not grant the Customers a right to (i) make copies of the Redistributables except when and to the extent required to use the Applications and/or Devices for their intended purpose, (ii) modify the Redistributables or create derivative works thereof, (iii) decompile, disassemble or otherwise reverse engineer Redistributables, or (iv) redistribute any copy or portion of the Redistributables to any third party, except as part of the onward sale of the Device on which the Redistributables are installed; (viii) Licensee shall not and shall cause that its Affiliates or Contractors shall not a) in any way combine, incorporate or integrate Licensed Software with, or use Licensed Software for creation of, any software created with or incorporating Open Source Qt, or b) incorporate or integrate Applications into a hardware device or product other than a Device, unless Licensee has received an advance written permission from The Qt Company to do so. Absent such written permission, any and all distribution by the Licensee during the Term of a hardware device or product a) which incorporate or integrate any part of Licensed Software or Open Source Qt; or b) where the main user interface or substantial functionality is provided by software build with Licensed Software or Open Source Qt or otherwise depends on the Licensed Software or Open Source Qt, shall be considered as a Device distribution under this Agreement and dependent on compliance thereof (including but not limited to obligation to pay applicable License Fees for such distribution); (ix) Licensee shall cause all of its Affiliates and Contractors entitled to make use of the licenses granted under this Agreement, to be contractually bound to comply with the relevant terms of this Agreement and not to use the Licensed Software beyond the terms hereof and for any purposes other than operating within the scope of their services for Licensee. Licensee shall be responsible for any and all actions and omissions of its Affiliates and Contractors relating to the Licensed Software and use thereof (including but not limited to payment of all applicable License Fees); (x) Except when and to the extent explicitly provided in this Section 3, Licensee shall not transfer, publish, disclose, display or otherwise make available the Licensed Software; ; and (xi) Licensee shall not attempt or enlist a third party to conduct or attempt to conduct any of the above. Above terms shall not be applicable if and to the extent they conflict with any mandatory provisions of any applicable laws. Any use of Licensed Software beyond the provisions of this Agreement is strictly prohibited and requires an additional license from The Qt Company. 4. THIRD PARTY SOFTWARE The Licensed Software may provide links to third party libraries or code (collectively "Third Party Software") to implement various functions. Third Party Software does not comprise part of the Licensed Software. In some cases, access to Third Party Software may be included in the Licensed Software. Such Third Party Software will be listed in the ".../src/3rdparty" source tree delivered with the Licensed Software or documented in the Licensed Software, as such may be amended from time to time. Licensee acknowledges that use or distribution of Third Party Software is in all respects subject to applicable license terms of applicable third party right holders. 5. PRE-RELEASE CODE The Licensed Software may contain pre-release code and functionality marked or otherwise stated as “Technology Preview”, “Alpha”, “Beta” or similar designation. Such pre-release code may be present in order to provide experimental support for new platforms or preliminary versions of one or more new functionalities. The pre-release code may not be at the level of performance and compatibility of a final, generally available, product offering of the Licensed Software. The pre-release parts of the Licensed Software may not operate correctly, may contain errors and may be substantially modified by The Qt Company prior to the first commercial product release, if any. The Qt Company is under no obligation to make pre-release code commercially available, or provide any Support or Updates relating thereto. The Qt Company assumes no liability whatsoever regarding any pre-release code, but any use thereof is exclusively at Licensee’s own risk and expense. 6. LIMITED WARRANTY AND WARRANTY DISCLAIMER The Qt Company hereby represents and warrants that it has the power and authority to grant the rights and licenses granted to Licensee under this Agreement. Except as set forth above, the Licensed Software is licensed to Licensee "as is" and Licensee’s exclusive remedy and The Qt Company’s entire liability for errors in the Licensed Software shall be limited, at The Qt Company’s option, to correction of the error, replacement of the Licensed Software or return of the applicable fees paid for the defective Licensed Software for the time period during which the License is not able to utilize the Licensed Software under the terms of this Agreement. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE QT COMPANY ON BEHALF OF ITSELF AND ITS LICENSORS, SUPPLIERS AND AFFILIATES, DISCLAIMS ALL OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON- INFRINGEMENT WITH REGARD TO THE LICENSED SOFTWARE. THE QT COMPANY DOES NOT WARRANT THAT THE LICENSED SOFTWARE WILL SATISFY LICENSEE’S REQUIREMENTS OR THAT IT WILL OPERATE WITHOUT DEFECT OR ERROR OR THAT THE OPERATION THEREOF WILL BE UNINTERRUPTED. ALL USE OF AND RELIANCE ON THE LICENSED SOFTWARE IS AT THE SOLE RISK OF AND RESPONSIBILITY OF LICENSEE. 7. INDEMNIFICATION AND LIMITATION OF LIABILITY 7.1 Limitation of Liability EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY BE LIABLE TO THE OTHER PARTY FOR ANY LOSS OF PROFIT, LOSS OF DATA, LOSS OF BUSINESS OR GOODWILL OR ANY OTHER INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE COST, DAMAGES OR EXPENSE OF ANY KIND, HOWSOEVER ARISING UNDER OR IN CONNECTION WITH THIS AGREEMENT. PARTIES SPECIFICALLY AGREE THAT LICENSEE’S OBLIGATION TO PAY LICENSE AND OTHER FEES CORRESPONDING TO ACTUAL USAGE OF LICENSED SOFTWARE HEREUNDER SHALL BE CONSIDERED AS A DIRECT DAMAGE. EXCEPT FOR (I) CASES OF GROSS NEGLIGENCE OR INTENTIONAL MISCONDUCT, AND (II) BREACH OF CONFIDENTIALITY, AND TO THE EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL EITHER PARTY’S TOTAL AGGREGATE LIABILITY UNDER THIS AGREEMENT EXCEED THE AGGREGATE LICENSE FEES PAID OR PAYABLE TO THE QT COMPANY FROM LICENSEE DURING THE PERIOD OF TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT RESULTING IN SUCH LIABILITY. THE PROVISIONS OF THIS SECTION 7 ALLOCATE THE RISKS UNDER THIS AGREEMENT BETWEEN THE QT COMPANY AND LICENSEE AND THE PARTIES HAVE RELIED UPON THE LIMITATIONS SET FORTH HEREIN IN DETERMINING WHETHER TO ENTER INTO THIS AGREEMENT. 7.2 Licensee´s Indemnification Licensee shall indemnify and hold harmless The Qt Company from and against any claim, injury, judgment, settlement, loss or expense, including attorneys' fees related to: (a) Licensee’s misrepresentation in connection with The Qt Company or the Licensed Software or breach of this Agreement, (b) the Application or Device (except where such cause of liability is solely attributable to the Licensed Software). 8. SUPPORT, UPDATES AND ONLINE SERVICES Upon due payment of the agreed License Fees the Licensee will be eligible to receive Support and Updates and to use the Online Services during the License Term, provided, however, that in the event the License Term is longer than 36 months, Support is provided only for the first 12 months, unless the Parties specifically otherwise agree. Unless otherwise decided by The Company at its free and absolute discretion, Upgrades will not be included in the Support but may be available subject to additional fees. From time to time The Qt Company may change the Support terms, provided that during the respective ongoing License Term the level of Support provided by The Qt Company may not be reduced without the consent of the Licensee. Unless otherwise agreed, The Qt Company shall not be responsible for providing any service or support to Customers. 9. CONFIDENTIALITY Each Party acknowledges that during the Term of this Agreement each Party may receive information about the other Party's business, business methods, business plans, customers, business relations, technology, and other information, including the terms of this Agreement, that is confidential and of great value to the other Party, and the value of which would be significantly reduced if disclosed to third parties (“Confidential Information”). Accordingly, when a Party (the “Receiving Party”) receives Confidential Information from the other Party (the “Disclosing Party”), the Receiving Party shall only disclose such information to employees and Contractors on a need to know basis, and shall cause its employees and employees of its Affiliates to: (i) maintain any and all Confidential Information in confidence; (ii) not disclose the Confidential Information to a third party without the Disclosing Party's prior written approval; and (iii) not, directly or indirectly, use the Confidential Information for any purpose other than for exercising its rights and fulfilling its responsibilities pursuant to this Agreement. Each Party shall take reasonable measures to protect the Confidential Information of the other Party, which measures shall not be less than the measures taken by such Party to protect its own confidential and proprietary information. Obligation of confidentiality shall not apply to information that (i) is or becomes generally known to the public through no act or omission of the Receiving Party; (ii) was in the Receiving Party's lawful possession prior to the disclosure hereunder and was not subject to limitations on disclosure or use; (iii) is developed independently by employees or Contractors of the Receiving Party or other persons working for the Receiving Party who have not had access to the Confidential Information of the Disclosing Party, as proven by the written records of the Receiving Party; (iv) is lawfully disclosed to the Receiving Party without restrictions, by a third party not under an obligation of confidentiality; or (v) the Receiving Party is legally compelled to disclose, in which case the Receiving Party shall notify the Disclosing Party of such compelled disclosure and assert the privileged and confidential nature of the information and cooperate fully with the Disclosing Party to limit the scope of disclosure and the dissemination of disclosed Confidential Information to the minimum extent necessary. The obligations under this Section 9 shall continue to remain in force for a period of five (5) years after the last disclosure, and, with respect to trade secrets, for so long as such trade secrets are protected under applicable trade secret laws. 10. FEES, DELIVERY AND PAYMENT 10.1 License Fees License Fees are described in The Qt Company’s standard price list, quote or Purchase Order confirmation or in an appendix hereto, as the case may be. The License Fees shall not be refunded or claimed as a credit in any event or for any reason whatsoever. 10.2 Ordering Licenses Licensee may purchase Development Licenses and Distribution Licenses pursuant to agreed pricing terms or, if no specific pricing terms have been agreed upon, at The Qt Company's standard pricing terms applicable at the time of purchase. Licensee shall submit all purchase orders for Development Licenses and Distribution Licenses to The Qt Company by email or any other method acceptable to The Qt Company (each such order is referred to herein as a “Purchase Order”) for confirmation, whereupon the Purchase Order shall become binding between the Parties. 10.3 Distribution License Packs Unless otherwise agreed, Distribution Licenses shall be purchased by way of Distribution License Packs. Upon due payment of the ordered Distribution License Pack(s), the Licensee will have an account of Distribution Licenses available for installing, bundling or integrating (all jointly “installing”) the Redistributables with the Devices or for otherwise distributing the Redistributables in accordance with this Agreement. Each time Licensee “installs” or distributes a copy of Redistributables, then one Distribution License is used, and Licensee’s account of available Distribution Licenses is decreased accordingly. Licensee may “install” copies of the Redistributables so long as Licensee has Distribution Licenses remaining on its account. Redistributables will be deemed to have been “installed” into a Device when one of the following circumstances shall have occurred: a) the Redistributables have been loaded onto the Device and used outside of the Licensee’s premises or b) the Device has been fully tested and placed into Licensee's inventory (or sold) for the first time (i.e., Licensee will not be required to use (or pay for) more than one Distribution License for each individual Device, e.g. in a situation where a Device is returned to Licensee's inventory after delivery to a distributor or sale to a Customer). In addition, if Licensee includes a back-up copy of the Redistributables on a CD-ROM or other storage medium along with the product, that backup copy of the Redistributables will not be deemed to have been “installed” and will not require an additional Distribution License. 10.4 Payment Terms License Fees and any other charges under this Agreement shall be paid by Licensee no later than thirty (30) days from the date of the applicable invoice from The Qt Company. The Qt Company will submit an invoice to Licensee after the date of this Agreement and/or after The Qt Company receives a Purchase Order from Licensee. A late payment charge of the lower of (a) one percent per month; or (b) the interest rate stipulated by applicable law, shall be charged on any unpaid balances that remain past due. The Qt Company shall have the right to suspend, terminate or withhold grants of all rights to the Licensed Software hereunder, including but not limited to the Developer License, Distribution License, and Support, should Licensee fail to make payment in timely fashion. 10.5 Taxes All License Fees and other charges payable hereunder are gross amounts but exclusive of any value added tax, use tax, sales tax and other taxes, duties or tariffs (“Taxes”). Such applicable Taxes shall be paid by Licensee, or, where applicable, in lieu of payment of such Taxes, Licensee shall provide an exemption certificate to The Qt Company and any applicable authority. 11 RECORD-KEEPING AND REPORTING OBLIGATIONS; AUDIT RIGHTS 11.1 Licensee’s Record-keeping Licensee shall at all times maintain accurate and up-to-date written records of Licensee’s activities related to the use of Licensed Software and distribution of Redistributables. The records shall be adequate to determine Licensee’s compliance with the provisions of this Agreement and to demonstrate the number of Designated Users and Redistributables distributed by Licensee. The records shall conform to good accounting practices reasonably acceptable to The Qt Company. Licensee shall, within thirty (30) days from receiving The Qt Company’s request to that effect, deliver to The Qt Company a report on Licensee’s usage of Licensed Software, such report to copies of Redistributables distributed by Licensee during that calendar quarter, and also detailing the number of undistributed copies of Redistributables made by Licensee and remaining in its account contain information, in sufficient detail, on (i) amount of users working with Licensed Software, (ii) copies of Redistributables distributed by Licensee during that calendar quarter, (iii) number of undistributed copies of Redistributables and corresponding number of unused Distribution Licenses remaining on Licensee’s account, and (iv) any other information as The Qt Company may reasonably require from time to time. 11.2. The Qt Company’s Audit Rights The Qt Company or an independent auditor acting on behalf of The Qt Company’s, may, upon at least five (5) business days’ prior written notice and at its expense, audit Licensee with respect to the use of the Redistributables, but not more frequently than once during each 6-month period. Such audit may be conducted by mail, electronic means or through an in-person visit to Licensee’s place of business. Any such in-person audit shall be conducted during regular business hours at Licensee's facilities and shall not unreasonably interfere with Licensee's business activities. The Qt Company or the independent auditor acting on behalf of The Qt Company shall be entitled to inspect Licensee’s Records. All such Licensee’s Records and use thereof shall be subject to an obligation of confidentiality under this Agreement. If an audit reveals that Licensee is using the Licensed Software beyond scope of the licenses Licensee has paid for, Licensee agrees to immediately pay The Qt Company any amounts owed for such unauthorized use. In addition, in the event the audit reveals a material violation of the terms of this Agreement (underpayment of more than 5% of License Fees shall always be deemed a material violation for purposes of this section), then the Licensee shall pay The Qt Company's reasonable cost of conducting such audit. 12 TERM AND TERMINATION 12.1 Term This Agreement shall enter into force upon due acceptance by both Parties and remain in force for as long as there is any Development License(s) in force (“Term”), unless and until terminated pursuant to the terms of this Section 12. 12.2 Termination by The Qt Company The Qt Company shall have the right to terminate this Agreement upon thirty (30) days prior written notice if the Licensee is in material breach of any obligation of this Agreement and fails to remedy such breach within such notice period. 12.3 Mutual Right to Terminate Either Party shall have the right to terminate this Agreement immediately upon written notice in the event that the other Party becomes insolvent, files for any form of bankruptcy, makes any assignment for the benefit of creditors, has a receiver, administrative receiver or officer appointed over the whole or a substantial part of its assets, ceases to conduct business, or an act equivalent to any of the above occurs under the laws of the jurisdiction of the other Party. 12.4 Parties´ Rights and Duties upon Termination Upon expiry or termination of the Agreement Licensee shall cease and shall cause all Designated Users (including those of its Affiliates’ and Contractors’) to cease using the Licensed Software and distribution of the Redistributables under this Agreement. Notwithstanding the above, in the event the Agreement expires or is terminated: (i) as a result of The Qt Company choosing not to renew the Development License(s) as set forth in Section 3.1, then all valid licenses possessed by the Licensee at such date shall be extended to be valid in perpetuity under the terms of this Agreement and Licensee is entitled to purchase additional licenses as set forth in Section 10.2; or (ii) for reason other than by The Qt Company pursuant to item (i) above or pursuant to Section 12.2, then the Licensee is entitled, for a period of six (6) months after the effective date of termination, to continue distribution of Devices under the Distribution Licenses paid but unused at such effective date of termination. Upon any such termination the Licensee shall destroy or return to The Qt Company all copies of the Licensed Software and all related materials and will certify the same to The Qt Company upon its request, provided however that Licensee may retain and exploit such copies of the Licensed Software as it may reasonably require in providing continued support to Customers. Expiry or termination of this Agreement for any reason whatsoever shall not relieve Licensee of its obligation to pay any License Fees accrued or payable to The Qt Company prior to the effective date of termination, and Licensee shall immediately pay to The Qt Company all such fees upon the effective date of termination. Termination of this Agreement shall not affect any rights of Customers to continue use of Applications and Devices (and therein incorporated Redistributables). 12.5 Extension in case of bankruptcy In the event The Qt Company is declared bankrupt under a final, non-cancellable decision by relevant court of law, and this Agreement is not, at the date of expiry of the Development License(s) pursuant to Section 3.1, assigned to party, who has assumed The Qt Company’s position as a legitimate licensor of Licensed Software under this Agreement, then all valid licenses possessed by the Licensee at such date of expiry, and which the Licensee has not notified for expiry, shall be extended to be valid in perpetuity under the terms of this Agreement. 13. GOVERNING LAW AND LEGAL VENUE In the event this Agreement is in the name of The Qt Company Inc., a Delaware Corporation, then: (i) this Agreement shall be construed and interpreted in accordance with the laws of the State of California, USA, excluding its choice of law provisions; (ii) the United Nations Convention on Contracts for the International Sale of Goods will not apply to this Agreement; and (iii) any dispute, claim or controversy arising out of or relating to this Agreement or the breach, termination, enforcement, interpretation or validity thereof, including the determination of the scope or applicability of this Agreement to arbitrate, shall be determined by arbitration in San Francisco, USA, before one arbitrator. The arbitration shall be administered by JAMS pursuant to JAMS' Streamlined Arbitration Rules and Procedures. Judgment on the Award may be entered in any court having jurisdiction. This Section shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. In the event this Agreement is in the name of The Qt Company Ltd., a Finnish Company, then: (i) this Agreement shall be construed and interpreted in accordance with the laws of Finland, excluding its choice of law provisions; (ii) the United Nations Convention on Contracts for the International Sale of Goods will not apply to this Agreement; and (iii) any disputes, controversy or claim arising out of or relating to this Agreement, or the breach, termination or validity thereof shall be shall be finally settled by arbitration in accordance with the Arbitration Rules of Finland Chamber of Commerce. The arbitration tribunal shall consist of one (1), or if either Party so requires, of three (3), arbitrators. The award shall be final and binding and enforceable in any court of competent jurisdiction. The arbitration shall be held in Helsinki, Finland and the process shall be conducted in the English language. This Section shall not preclude parties from seeking provisional remedies in aid of arbitration from a court of appropriate jurisdiction. 14. GENERAL PROVISIONS 14.1 No Assignment Except in the case of a merger or sale of substantially all of its corporate assets, Licensee shall not be entitled to assign or transfer all or any of its rights, benefits and obligations under this Agreement without the prior written consent of The Qt Company, which shall not be unreasonably withheld or delayed. The Qt Company shall be entitled to freely assign or transfer any of its rights, benefits or obligations under this Agreement. 14.2 No Third Party Representations Licensee shall make no representations or warranties concerning the Licensed Software on behalf of The Qt Company. Any representation or warranty Licensee makes or purports to make on The Qt Company’s behalf shall be void as to The Qt Company. 14.3 Surviving Sections Any terms and conditions that by their nature or otherwise reasonably should survive termination of this Agreement shall so be deemed to survive. 14.4 Entire Agreement This Agreement, the exhibits hereto, the License Certificate and any applicable Purchase Order constitute the complete agreement between the Parties and supersedes all prior or contemporaneous discussions, representations, and proposals, written or oral, with respect to the subject matters discussed herein. In the event of any conflict or inconsistency between this Agreement and any Purchase Order, the terms of this Agreement will prevail over the terms of the Purchase Order with respect to such conflict or inconsistency. Parties specifically acknowledge and agree that this Agreement prevails over any click-to-accept or similar agreements the Designated Users may need to accept online upon download of the Licensed Software, as may be required by The Qt Company’s applicable processes relating to Licensed Software. 14.5 Modifications No modification of this Agreement shall be effective unless contained in a writing executed by an authorized representative of each Party. No term or condition contained in Licensee's Purchase Order shall apply unless expressly accepted by The Qt Company in writing. 14.6 Force Majeure Except for the payment obligations hereunder, neither Party shall be liable to the other for any delay or non-performance of its obligations hereunder in the event and to the extent that such delay or non-performance is due to an event of act of God, terrorist attack or other similar unforeseeable catastrophic event that prevents either Party for fulfilling its obligations under this Agreement and which such Party cannot avoid or circumvent (“Force Majeure Event”). If the Force Majeure Event results in a delay or non-performance of a Party for a period of three (3) months or longer, then either Party shall have the right to terminate this Agreement with immediate effect without any liability (except for the obligations of payment arising prior to the event of Force Majeure) towards the other Party. 14.7 Notices Any notice given by one Party to the other shall be deemed properly given and deemed received if specifically acknowledged by the receiving Party in writing or when successfully delivered to the recipient by hand, fax, or special courier during normal business hours on a business day to the addresses specified for each Party on the signature page. Each communication and document made or delivered by one Party to the other Party pursuant to this Agreement shall be in the English language. 14.8 Export Control Licensee acknowledges that the Redistributables may be subject to export control restrictions under the applicable laws of respective countries. Licensee shall fully comply with all applicable export license restrictions and requirements as well as with all laws and regulations relating to the Redistributables and exercise of licenses hereunder and shall procure all necessary governmental authorizations, including without limitation, all necessary licenses, approvals, permissions or consents, where necessary for the re-exportation of the Redistributables, Applications and/or Devices. 14.9 No Implied License There are no implied licenses or other implied rights granted under this Agreement, and all rights, save for those expressly granted hereunder, shall remain with The Qt Company and its licensors. In addition, no licenses or immunities are granted to the combination of the Licensed Software with any other software or hardware not delivered by The Qt Company under this Agreement. 14.10 Attorney Fees The prevailing Party in any action to enforce this Agreement shall be entitled to recover its attorney’s fees and costs in connection with such action. 14.11 Severability If any provision of this Agreement shall be adjudged by any court of competent jurisdiction to be unenforceable or invalid, that provision shall be limited or eliminated to the minimum extent necessary so that this Agreement shall otherwise remain in full force and effect and enforceable. IN WITNESS WHEREOF, the Parties hereto, intending to be legally bound hereby, have caused this Agreement to be executed by Licensee's authorized representative installing the Licensed Software and accepting the terms hereof in connection therewith. Appendix 1 1. Parts of the Licensed Software that are permitted for distribution in object code form only (“Redistributables”) under this Agreement: - The Licensed Software's Qt Essentials and Qt Add-on libraries - The Licensed Software's configuration tool (“qtconfig”) - The Licensed Software's help tool (“Qt Assistant”) - The Licensed Software's internationalization tools (“Qt Linguist”, “lupdate”, “lrelease”) - The Licensed Software's QML (“Qt Quick”) launcher tool (“qmlscene” or “qmlviewer”) - The Licensed Software's installer framework - Qt for Python (PySide2) 2. Parts of the Licensed Software that are not permitted for distribution include, but are not limited to: - The Licensed Software's source code and header files - The Licensed Software's documentation - The Licensed Software’s documentation generation tool (“qdoc”) - The Licensed Software's tool for writing makefiles (“qmake”) - The Licensed Software's Meta Object Compiler (“moc”) - The Licensed Software's User Interface Compiler (“uic”) - The Licensed Software's Resource Compiler (“rcc”) - The Licensed Software's parts of the IDE tool (“Qt Creator”) - The Licensed Software’s parts of the Design tools (“Qt 3D Studio” or “Qt Quick Designer”) - The Licensed Software's Emulator LICENSE.FDL000066400000000000000000000546611376617013100125100ustar00rootroot00000000000000 GNU Free Documentation License Version 1.3, 3 November 2008 Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. 0. PREAMBLE The purpose of this License is to make a manual, textbook, or other functional and useful document "free" in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others. This License is a kind of "copyleft", which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software. We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference. 1. APPLICABILITY AND DEFINITIONS This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law. A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language. A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document's overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them. The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none. The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words. A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent" is called "Opaque". Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only. The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page" means the text near the most prominent appearance of the work's title, preceding the beginning of the body of the text. The "publisher" means any person or entity that distributes copies of the Document to the public. A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ" according to this definition. The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License. 2. VERBATIM COPYING You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3. You may also lend copies, under the same conditions stated above, and you may publicly display copies. 3. COPYING IN QUANTITY If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document's license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects. If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages. If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public. It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document. 4. MODIFICATIONS You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version: A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission. B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement. C. State on the Title page the name of the publisher of the Modified Version, as the publisher. D. Preserve all the copyright notices of the Document. E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices. F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below. G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document's license notice. H. Include an unaltered copy of this License. I. Preserve the section Entitled "History", Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History" in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence. J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History" section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission. K. For any section Entitled "Acknowledgements" or "Dedications", Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein. L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles. M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version. N. Do not retitle any existing section to be Entitled "Endorsements" or to conflict in title with any Invariant Section. O. Preserve any Warranty Disclaimers. If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version's license notice. These titles must be distinct from any other section titles. You may add a section Entitled "Endorsements", provided it contains nothing but endorsements of your Modified Version by various parties--for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard. You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one. The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version. 5. COMBINING DOCUMENTS You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers. The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work. In the combination, you must combine any sections Entitled "History" in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements", and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements". 6. COLLECTIONS OF DOCUMENTS You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects. You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document. 7. AGGREGATION WITH INDEPENDENT WORKS A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate" if the copyright resulting from the compilation is not used to limit the legal rights of the compilation's users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document. If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document's Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate. 8. TRANSLATION Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail. If a section in the Document is Entitled "Acknowledgements", "Dedications", or "History", the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title. 9. TERMINATION You may not copy, modify, sublicense, or distribute the Document except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, or distribute it is void, and will automatically terminate your rights under this License. However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, receipt of a copy of some or all of the same material does not give you any rights to use it. 10. FUTURE REVISIONS OF THIS LICENSE The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/. Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version" applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation. If the Document specifies that a proxy can decide which future versions of this License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Document. 11. RELICENSING "Massive Multiauthor Collaboration Site" (or "MMC Site") means any World Wide Web server that publishes copyrightable works and also provides prominent facilities for anybody to edit those works. A public wiki that anybody can edit is an example of such a server. A "Massive Multiauthor Collaboration" (or "MMC") contained in the site means any set of copyrightable works thus published on the MMC site. "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 license published by Creative Commons Corporation, a not-for-profit corporation with a principal place of business in San Francisco, California, as well as future copyleft versions of that license published by that same organization. "Incorporate" means to publish or republish a Document, in whole or in part, as part of another Document. An MMC is "eligible for relicensing" if it is licensed under this License, and if all works that were first published under this License somewhere other than this MMC, and subsequently incorporated in whole or in part into the MMC, (1) had no cover texts or invariant sections, and (2) were thus incorporated prior to November 1, 2008. The operator of an MMC Site may republish an MMC contained in the site under CC-BY-SA on the same site at any time before August 1, 2009, provided the MMC is eligible for relicensing. ADDENDUM: How to use this License for your documents To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page: Copyright (c) YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License". If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts." line with this: with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST. If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation. If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software. LICENSE.GPL2000066400000000000000000000432541376617013100126030ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Lesser General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. LICENSE.GPLv3000066400000000000000000001054711376617013100127720ustar00rootroot00000000000000 GNU GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt Toolkit under the terms of GNU Lesser General Public License version 3. That license references the General Public License version 3, that is displayed below. Other portions of the Qt Toolkit may be licensed directly under this license. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . LICENSE.GPLv3-EXCEPT000066400000000000000000001070131376617013100137520ustar00rootroot00000000000000This is the GNU General Public License version 3, annotated with The Qt Company GPL Exception 1.0: ------------------------------------------------------------------------- The Qt Company GPL Exception 1.0 Exception 1: As a special exception you may create a larger work which contains the output of this application and distribute that work under terms of your choice, so long as the work is not otherwise derived from or based on this application and so long as the work does not in itself generate output that contains the output from this application in its original or modified form. Exception 2: As a special exception, you have permission to combine this application with Plugins licensed under the terms of your choice, to produce an executable, and to copy and distribute the resulting executable under the terms of your choice. However, the executable must be accompanied by a prominent notice offering all users of the executable the entire source code to this application, excluding the source code of the independent modules, but including any changes you have made to this application, under the terms of this license. ------------------------------------------------------------------------- GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . LICENSE.LGPLv3000066400000000000000000000177141376617013100131100ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd. Contact: http://www.qt.io/licensing/ You may use, distribute and copy the Qt Toolkit under the terms of GNU Lesser General Public License version 3, which is displayed below. This license makes reference to the version 3 of the GNU General Public License, which you can find in the LICENSE.GPLv3 file. ------------------------------------------------------------------------- GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. "The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. b) Accompany the Combined Work with a copy of the GNU GPL and this license document. c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. d) Do one of the following: 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. README.cmake.md000066400000000000000000000033151376617013100134230ustar00rootroot00000000000000# CMake super project For development convenience, a CMake super project is included in the root of the repository. The super project can be built using standalone CMake, or using an IDE's CMake integration (Qt Creator for example). Nevertheless the default build process is done via setup.py, in which case each of the sub-projects are built and installed separately, as mentioned, the super project is just for development convenience. ## IDE (Qt Creator) case When using an IDE, just open the root CMakeLists.txt file as a new project, and make sure to specify the following things: * LLVM_INSTALL_DIR - the environment variable should point to your libclang library location * Qt - either select a Qt Kit when configuring the project, or make sure that the qmake binary is present in the PATH environment variable. * Python - the PATH environment variable should also point to the Python interpreter which you wish to use for building the projects (can either be a system interpreter, or a virtualenv one for example) Once that is done, just re-run CMake, so that it picks up the new environment values. If needed, all other cache variables defined by the project files can be re-adjusted (for example FORCE_LIMITED_API). ## Command line CMake case When building using the command line CMake binary, make sure to invoke it in a separate build directory, and not in the root source directory. Make sure you have the correct environment variables set up, as described in the previous section. The invocation would then look like: ```bash mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. # make or nmake or msbuild or jom ``` README.md000066400000000000000000000005321376617013100123420ustar00rootroot00000000000000# Qt For Python Qt For Python is the [Python Qt bindings project](http://wiki.qt.io/PySide2), providing access to the complete Qt 5.x framework as well as to generator tools for rapidly generating bindings for any C++ libraries. shiboken2 is the generator used to build the bindings. See README.pyside2.md and README.shiboken2.md for details. README.pyside2.md000066400000000000000000000055521376617013100137270ustar00rootroot00000000000000# PySide2 ### Introduction PySide2 is the official Python module from the [Qt for Python project](http://wiki.qt.io/Qt_for_Python), which provides access to the complete Qt 5.12+ framework. The Qt for Python project is developed in the open, with all facilities you'd expect from any modern OSS project such as all code in a git repository and an open design process. We welcome any contribution conforming to the [Qt Contribution Agreement](https://www.qt.io/contributionagreement/). ### Installation Since the release of the [Technical Preview](https://blog.qt.io/blog/2018/06/13/qt-python-5-11-released/) it is possible to install via `pip`, both from Qt's servers and [PyPi](https://pypi.org/project/PySide2/): pip install PySide2 #### Dependencies PySide2 versions following 5.12 use a C++ parser based on [Clang](http://clang.org/). The Clang library (C-bindings), version 6.0 or higher is required for building. Prebuilt versions of it can be downloaded from [download.qt.io](http://download.qt.io/development_releases/prebuilt/libclang/). After unpacking the archive, set the environment variable *LLVM_INSTALL_DIR* to point to the folder containing the *include* and *lib* directories of Clang: 7z x .../libclang-release_60-linux-Rhel7.2-gcc5.3-x86_64-clazy.7z export LLVM_INSTALL_DIR=$PWD/libclang On Windows: 7z x .../libclang-release_60-windows-vs2015_64-clazy.7z SET LLVM_INSTALL_DIR=%CD%\libclang ### Building from source For building PySide2 from scratch, please read about [getting started](https://wiki.qt.io/Qt_for_Python/GettingStarted). This process will include getting the code: git clone https://code.qt.io/pyside/pyside-setup cd pyside-setup git branch --track 5.12 origin/5.12 git checkout 5.12 then install the dependencies, and following the instructions per platform. A common build command will look like: python setup.py install --qmake= --parallel=8 --build-tests You can obtain more information about the options to build PySide and Shiboken in [our wiki](https://wiki.qt.io/Qt_for_Python/). ### Documentation and Bugs You can find more information about the PySide2 module API in the [official Qt for Python documentation](https://doc.qt.io/qtforpython/). If you come across any issue, please file a bug report at our [JIRA tracker](https://bugreports.qt.io/projects/PYSIDE) following our [guidelines](https://wiki.qt.io/Qt_for_Python/Reporting_Bugs). ### Community Check *#qt-pyside*, our official IRC channel on FreeNode, or contact us via our [mailing list](http://lists.qt-project.org/mailman/listinfo/pyside). ### Licensing PySide2 is available under both Open Source (LGPLv3/GPLv2) and commercial license. Using PyPi is the recommended installation source, because the content of the wheels is valid for both cases. For more information, refer to the [Qt Licensing page](https://www.qt.io/licensing/). README.shiboken2-generator.md000066400000000000000000000026431376617013100162160ustar00rootroot00000000000000# Shiboken2-generator Shiboken is the generator used by the Qt for Python project. It outputs C++ code for CPython extensions, which can be compiled and transformed into a Python module. C++ projects based on Qt can be wrapped, but also projects which are not related to Qt. ## How does it work? Shiboken uses an API Extractor that does most of the job, but it requires a typesystem (XML file) to customize how the C++ classes/methods will be exposed to Python. The typesystem allows you to remove arguments from signatures, modify return types, inject code and add conversion rules from the C++ data types to Python data types, manipulate the ownership of the objects, etc. # Examples An example related to wrap a C++ library not depending on Qt can be found in our [repository](https://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples/samplebinding). Additionally, you can find a couple of tests inside the [git repository](https://code.qt.io/cgit/pyside/pyside-setup.git/tree/sources/shiboken2/tests). For a more advanced case regarding extending a Qt/C++ application with Python bindings based on the idea of the PySide module, you can check the [scriptableapplication](https://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples/scriptableapplication) example in our repository. # Documentation You can find more information about Shiboken in our [official documentation page](https://doc.qt.io/qtforpython/shiboken2/). README.shiboken2.md000066400000000000000000000011561376617013100142300ustar00rootroot00000000000000# Shiboken2 module The purpose of the [shiboken2 Python module](https://wiki.qt.io/Qt_for_Python/Shiboken) is to access information related to the binding generation that could be used to integrate C++ programs to Python, or even to get useful information to debug an application. Mostly the idea is to interact with Shiboken objects, where one can check if it is valid, or if the generated Python wrapper is invalid after the underlying C++ object has been destroyed. More information on the available functions can be found in our [official documentation](https://doc.qt.io/qtforpython/shiboken2/shibokenmodule.html) build_history/000077500000000000000000000000001376617013100137435ustar00rootroot00000000000000build_history/blacklist.txt000066400000000000000000000035211376617013100164550ustar00rootroot00000000000000[pysidetest::delegatecreateseditor_test] qt5.6 [pysidetest::modelview_test] darwin py3 [pysidetest::qvariant_test] darwin py3 [pysidetest::utils_test] win32 [signals::signal_signature_test] linux darwin win32 [Qt3DExtras::qt3dextras_test] linux darwin [QtCore::qfile_test] win32 darwin py3 [QtCore::qfileread_test] darwin # Nested exception in Python 3 [QtCore::qflags_test] py3 [QtCore::qobject_connect_notify_test] linux darwin win32 [QtGui::qmatrix_test] win32 [QtWidgets::bug_576] linux win32 darwin py3 [QtWidgets::returnquadruplesofnumbers_test] linux darwin win32 [QtWidgets::qstandarditemmodel_test] py2 py3 [QtTest::touchevent_test] linux darwin win32 [QtMultimedia::audio_test] linux darwin win32 [QtQml::bug_951] py3 [QtQml::javascript_exceptions] py3 [QtScript::qscriptvalue_test] linux darwin win32 [QtScriptTools::debugger_test] linux darwin win32 # AttributeError: 'PySide2.QtQuick.QQuickItem' object has no attribute 'simpleFunction' [QtQml::bug_451] py2 py3 # Crashes with Python 2 on Windows [QtQml::qqmlnetwork_test] py2 win32 [QtQml::qquickitem_grabToImage] darwin [smart::smart_pointer] py2 # PYSIDE-474 [QtWebEngineWidgets::pyside-474-qtwebengineview] py2 py3 [QtCore::thread_signals_test] win32 linux darwin [QtCore::qthread_prod_cons_test] win32 linux darwin # PYSIDE-754 [QtWebEngineCore::web_engine_custom_scheme] win32 linux darwin # In addition to a pre-existing windows failure, # qtlocation/ac899dcc40bb3ad09307583fb7e6befd45a77b33 / QTBUG-66304 introduced # a failure in 5.14 [QtPositioning::positioning] win32 linux darwin # Open GL functions failures on macOS (2/2020) [registry::existence_test] darwin build_scripts/000077500000000000000000000000001376617013100137315ustar00rootroot00000000000000build_scripts/__init__.py000066400000000000000000000035521376617013100160470ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# build_scripts/build_scripts.pyproject000066400000000000000000000006701376617013100205430ustar00rootroot00000000000000{ "files": ["main.py", "__init__.py", "config.py", "options.py", "qtinfo.py", "setup_runner.py", "utils.py", "wheel_override.py", "wheel_utils.py", "platforms/__init__.py", "platforms/linux.py", "platforms/macos.py", "platforms/unix.py", "platforms/windows_desktop.py", "../setup.py", "../coin_build_instructions.py", "../coin_test_instructions.py"] } build_scripts/config.py000066400000000000000000000406161376617013100155570ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import os import distutils.log as log class Config(object): def __init__(self): # Constants self._build_type_all = "all" self._invocation_type_top_level = "top-level" self._invocation_type_internal = "internal" # The keyword arguments which will be given to setuptools.setup self.setup_kwargs = {} # The setup.py invocation type. # top-level # internal self.invocation_type = None # The type of the top-level build. # all - build shiboken2 module, shiboken2-generator and PySide2 # modules # shiboken2 - build only shiboken2 module # shiboken2-generator - build only the shiboken2-generator # pyside2 - build only PySide2 modules self.build_type = None # The internal build type, used for internal invocations of # setup.py to build a specific module only. self.internal_build_type = None # Options that can be given to --build-type and # --internal-build-type self.shiboken_module_option_name = "shiboken2" self.shiboken_generator_option_name = "shiboken2-generator" self.pyside_option_name = "pyside2" # Names to be passed to setuptools.setup() name key, # so not package name, but rather project name as it appears # in the wheel name and on PyPi. self.shiboken_module_st_name = "shiboken2" self.shiboken_generator_st_name = "shiboken2-generator" self.pyside_st_name = "PySide2" # Used by check_allowed_python_version to validate the # interpreter version. self.python_version_classifiers = [ 'Programming Language :: Python', 'Programming Language :: Python :: 2', 'Programming Language :: Python :: 2.7', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', 'Programming Language :: Python :: 3.9', ] self.setup_script_dir = None def init_config(self, build_type=None, internal_build_type=None, cmd_class_dict=None, package_version=None, ext_modules=None, setup_script_dir=None, quiet=False): """ Sets up the global singleton config which is used in many parts of the setup process. """ # if --internal-build-type was passed, it means that this is a # sub-invocation to build a specific package. if internal_build_type: self.set_is_internal_invocation() self.set_internal_build_type(internal_build_type) else: self.set_is_top_level_invocation() # --build-type was specified explicitly, so set it. Otherwise # default to all. if build_type: self.build_type = build_type else: self.build_type = self._build_type_all self.setup_script_dir = setup_script_dir setup_kwargs = {} setup_kwargs['long_description'] = self.get_long_description() setup_kwargs['long_description_content_type'] = 'text/markdown' setup_kwargs['keywords'] = 'Qt' setup_kwargs['author'] = 'Qt for Python Team' setup_kwargs['author_email'] = 'pyside@qt-project.org' setup_kwargs['url'] = 'https://www.pyside.org' setup_kwargs['download_url'] = 'https://download.qt.io/official_releases/QtForPython' setup_kwargs['license'] = 'LGPL' setup_kwargs['zip_safe'] = False setup_kwargs['cmdclass'] = cmd_class_dict setup_kwargs['version'] = package_version setup_kwargs['python_requires'] = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <3.10" if quiet: # Tells distutils / setuptools to be quiet, and only print warnings or errors. # Makes way less noise in the terminal when building. setup_kwargs['verbose'] = 0 # Setting these two keys is still a bit of a discussion point. # In general not setting them will allow using "build" and # "bdist_wheel" just fine. What they do, is they specify to the # setuptools.command.build_py command that certain pure python # modules (.py files) exist in the specified package location, # and that they should be copied over to the setuptools build # dir. # But it doesn't really make sense for us, because we copy all # the necessary files to the build dir via prepare_packages() # function anyway. # If we don't set them, the build_py sub-command will be # skipped, but the build command will still be executed, which # is where we run cmake / make. # The only plausible usage of it, is if we will implement a # correctly functioning setup.py develop command (or bdist_egg). # But currently that doesn't seem to work. setup_kwargs['packages'] = self.get_setup_tools_packages_for_current_build() setup_kwargs['package_dir'] = self.get_package_name_to_dir_path_mapping() # Add a bogus extension module (will never be built here since # we are overriding the build command to do it using cmake) so # things like bdist_egg will know that there are extension # modules and will name the dist with the full platform info. setup_kwargs['ext_modules'] = ext_modules common_classifiers = [ 'Development Status :: 5 - Production/Stable', 'Environment :: Console', 'Environment :: MacOS X', 'Environment :: X11 Applications :: Qt', 'Environment :: Win32 (MS Windows)', 'Intended Audience :: Developers', 'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)', 'License :: Other/Proprietary License', 'Operating System :: MacOS :: MacOS X', 'Operating System :: POSIX', 'Operating System :: POSIX :: Linux', 'Operating System :: Microsoft', 'Operating System :: Microsoft :: Windows', 'Programming Language :: C++'] common_classifiers.extend(self.python_version_classifiers) common_classifiers.extend([ 'Topic :: Database', 'Topic :: Software Development', 'Topic :: Software Development :: Code Generators', 'Topic :: Software Development :: Libraries :: Application Frameworks', 'Topic :: Software Development :: User Interfaces', 'Topic :: Software Development :: Widget Sets']) setup_kwargs['classifiers'] = common_classifiers if self.internal_build_type == self.shiboken_module_option_name: setup_kwargs['name'] = self.shiboken_module_st_name setup_kwargs['description'] = "Python / C++ bindings helper module" setup_kwargs['entry_points'] = {} elif self.internal_build_type == self.shiboken_generator_option_name: setup_kwargs['name'] = self.shiboken_generator_st_name setup_kwargs['description'] = "Python / C++ bindings generator" setup_kwargs['install_requires'] = ["{}=={}".format(self.shiboken_module_st_name, package_version)] setup_kwargs['entry_points'] = { 'console_scripts': [ 'shiboken2 = {}.scripts.shiboken_tool:main'.format(self.package_name()), ] } elif self.internal_build_type == self.pyside_option_name: setup_kwargs['name'] = self.pyside_st_name setup_kwargs['description'] = "Python bindings for the Qt cross-platform application and UI framework" setup_kwargs['install_requires'] = ["{}=={}".format(self.shiboken_module_st_name, package_version)] setup_kwargs['entry_points'] = { 'console_scripts': [ 'pyside2-uic = {}.scripts.pyside_tool:uic'.format(self.package_name()), 'pyside2-rcc = {}.scripts.pyside_tool:rcc'.format(self.package_name()), 'pyside2-designer= {}.scripts.pyside_tool:designer'.format(self.package_name()), 'pyside2-lupdate = {}.scripts.pyside_tool:main'.format(self.package_name()), ] } self.setup_kwargs = setup_kwargs def get_long_description(self): readme_filename = 'README.md' changes_filename = 'CHANGES.rst' if self.is_internal_shiboken_module_build(): readme_filename = 'README.shiboken2.md' elif self.is_internal_shiboken_generator_build(): readme_filename = 'README.shiboken2-generator.md' elif self.is_internal_pyside_build(): readme_filename = 'README.pyside2.md' content = '' changes = '' try: with open(os.path.join(self.setup_script_dir, readme_filename)) as f: readme = f.read() except Exception as e: log.error("Couldn't read contents of {}.".format(readme_filename)) raise # Don't include CHANGES.rst for now, because we have not decided # how to handle change files yet. include_changes = False if include_changes: try: with open(os.path.join(self.setup_script_dir, changes_filename)) as f: changes = f.read() except Exception as e: log.error("Couldn't read contents of {}".format(changes_filename)) raise content += readme if changes: content += "\n\n" + changes return content def package_name(self): """ Returns package name as it appears in Python's site-packages directory. Package names can only be delimited by underscores, and not by dashes. """ if self.is_internal_shiboken_module_build(): return "shiboken2" elif self.is_internal_shiboken_generator_build(): return "shiboken2_generator" elif self.is_internal_pyside_build(): return "PySide2" else: return None def get_setup_tools_packages_for_current_build(self): """ Returns a list of packages for setup tools to consider in the build_py command, so that it can copy the pure python files. Not really necessary because it's done in prepare_packages() anyway. This is really just to satisfy some checks in setuptools build_py command, and if we ever properly implement the develop command. """ if self.internal_build_type == self.pyside_option_name: return [ config.package_name(), ] elif self.internal_build_type == self.shiboken_module_option_name: return [self.package_name()] else: return [] def get_package_name_to_dir_path_mapping(self): """ Used in setuptools.setup 'package_dir' argument to specify where the actual module packages are located. For example when building the shiboken module, setuptools will expect to find the "shiboken2" module sources under "sources/shiboken2/shibokenmodule". This is really just to satisfy some checks in setuptools build_py command, and if we ever properly implement the develop command. """ if self.is_internal_shiboken_module_build(): return { self.package_name(): "sources/shiboken2/shibokenmodule" } elif self.is_internal_shiboken_generator_build(): # This is left empty on purpose, because the shiboken # generator doesn't have a python module for now. return {} elif self.is_internal_pyside_build(): return { self.package_name(): "sources/pyside2/PySide2", } else: return {} def get_buildable_extensions(self): """ Used by PysideBuild.run to build the CMake projects. :return: A list of directory names under the sources directory. """ if self.is_internal_shiboken_module_build() or self.is_internal_shiboken_generator_build(): return ['shiboken2'] elif self.is_internal_pyside_build(): return ['pyside2', 'pyside2-tools'] return None def set_is_top_level_invocation(self): self.invocation_type = self._invocation_type_top_level def set_is_internal_invocation(self): self.invocation_type = self._invocation_type_internal def is_top_level_invocation(self): return self.invocation_type == self._invocation_type_top_level def is_internal_invocation(self): return self.invocation_type == self._invocation_type_internal def is_top_level_build_all(self): return self.build_type == self._build_type_all def is_top_level_build_shiboken_module(self): return self.build_type == self.shiboken_module_option_name def is_top_level_build_shiboken_generator(self): return self.build_type == self.shiboken_generator_option_name def is_top_level_build_pyside(self): return self.build_type == self.pyside_option_name def set_internal_build_type(self, internal_build_type): self.internal_build_type = internal_build_type def is_internal_shiboken_module_build(self): return self.internal_build_type == self.shiboken_module_option_name def is_internal_shiboken_generator_build(self): return self.internal_build_type == self.shiboken_generator_option_name def is_internal_pyside_build(self): return self.internal_build_type == self.pyside_option_name def is_internal_shiboken_generator_build_and_part_of_top_level_all(self): """ Used to skip certain build rules and output, when we know that the CMake build of shiboken was already done as part of the top-level "all" build when shiboken2-module was built. """ return self.is_internal_shiboken_generator_build() and self.is_top_level_build_all() def get_allowed_top_level_build_values(self): return [ self._build_type_all, self.shiboken_module_option_name, self.shiboken_generator_option_name, self.pyside_option_name ] def get_allowed_internal_build_values(self): return [ self.shiboken_module_option_name, self.shiboken_generator_option_name, self.pyside_option_name ] config = Config() build_scripts/main.py000066400000000000000000001510171376617013100152340ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from __future__ import print_function from distutils.version import LooseVersion import os import platform import re import sys from textwrap import dedent import time from .config import config from .utils import get_python_dict from .options import DistUtilsCommandMixin, OPTION from .wheel_utils import (get_package_version, get_qt_version, get_package_timestamp, macos_plat_name, macos_pyside_min_deployment_target) setup_script_dir = os.getcwd() build_scripts_dir = os.path.join(setup_script_dir, 'build_scripts') setup_py_path = os.path.join(setup_script_dir, "setup.py") start_time = int(time.time()) def elapsed(): return int(time.time()) - start_time def get_setuptools_extension_modules(): # Setting py_limited_api on the extension is the "correct" thing # to do, but it doesn't actually do anything, because we # override build_ext. So this is just foolproofing for the # future. extension_args = ('QtCore', []) extension_kwargs = {} if OPTION["LIMITED_API"] == 'yes': extension_kwargs['py_limited_api'] = True extension_modules = [Extension(*extension_args, **extension_kwargs)] return extension_modules def _get_make(platform_arch, build_type): """Helper for retrieving the make command and CMake generator name""" makespec = OPTION["MAKESPEC"] if makespec == "make": return ("make", "Unix Makefiles") if makespec == "msvc": nmake_path = find_executable("nmake") if nmake_path is None or not os.path.exists(nmake_path): log.info("nmake not found. Trying to initialize the MSVC env...") init_msvc_env(platform_arch, build_type) nmake_path = find_executable("nmake") if not nmake_path or not os.path.exists(nmake_path): raise DistutilsSetupError('"nmake" could not be found.') if not OPTION["NO_JOM"]: jom_path = find_executable("jom") if jom_path: log.info("jom was found in {}".format(jom_path)) return (jom_path, "NMake Makefiles JOM") log.info("nmake was found in {}".format(nmake_path)) if OPTION["JOBS"]: msg = "Option --jobs can only be used with 'jom' on Windows." raise DistutilsSetupError(msg) return (nmake_path, "NMake Makefiles") if makespec == "mingw": return ("mingw32-make", "mingw32-make") if makespec == "ninja": return ("ninja", "Ninja") m = 'Invalid option --make-spec "{}".'.format(makespec) raise DistutilsSetupError(m) def get_make(platform_arch, build_type): """Retrieve the make command and CMake generator name""" (make_path, make_generator) = _get_make(platform_arch, build_type) if not os.path.isabs(make_path): make_path = find_executable(make_path) if not make_path or not os.path.exists(make_path): raise DistutilsSetupError("You need the program '{}' on your system path to " "compile PySide2.".format(make_path)) return (make_path, make_generator) def _get_py_library_win(build_type, py_version, py_prefix, py_libdir, py_include_dir): """Helper for finding the Python library on Windows""" if py_include_dir is None or not os.path.exists(py_include_dir): py_include_dir = os.path.join(py_prefix, "include") if py_libdir is None or not os.path.exists(py_libdir): # For virtual environments on Windows, the py_prefix will contain a # path pointing to it, instead of the system Python installation path. # Since INCLUDEPY contains a path to the system location, we use the # same base directory to define the py_libdir variable. py_libdir = os.path.join(os.path.dirname(py_include_dir), "libs") if not os.path.isdir(py_libdir): raise DistutilsSetupError("Failed to locate the 'libs' directory") dbg_postfix = "_d" if build_type == "Debug" else "" if OPTION["MAKESPEC"] == "mingw": static_lib_name = "libpython{}{}.a".format( py_version.replace(".", ""), dbg_postfix) return os.path.join(py_libdir, static_lib_name) v = py_version.replace(".", "") python_lib_name = "python{}{}.lib".format(v, dbg_postfix) return os.path.join(py_libdir, python_lib_name) def _get_py_library_unix(build_type, py_version, py_prefix, py_libdir, py_include_dir): """Helper for finding the Python library on UNIX""" if py_libdir is None or not os.path.exists(py_libdir): py_libdir = os.path.join(py_prefix, "lib") if py_include_dir is None or not os.path.exists(py_include_dir): dir = "include/python{}".format(py_version) py_include_dir = os.path.join(py_prefix, dir) dbg_postfix = "_d" if build_type == "Debug" else "" lib_exts = ['.so'] if sys.platform == 'darwin': lib_exts.append('.dylib') if sys.version_info[0] > 2: lib_suff = getattr(sys, 'abiflags', None) else: # Python 2 lib_suff = '' lib_exts.append('.so.1') # Suffix for OpenSuSE 13.01 lib_exts.append('.so.1.0') # static library as last gasp lib_exts.append('.a') if sys.version_info[0] == 2 and dbg_postfix: # For Python2 add a duplicate set of extensions combined with the # dbg_postfix, so we test for both the debug version of the lib # and the normal one. This allows a debug PySide2 to be built with a # non-debug Python. lib_exts = [dbg_postfix + e for e in lib_exts] + lib_exts libs_tried = [] for lib_ext in lib_exts: lib_name = "libpython{}{}{}".format(py_version, lib_suff, lib_ext) py_library = os.path.join(py_libdir, lib_name) if os.path.exists(py_library): return py_library libs_tried.append(py_library) # At least on macOS 10.11, the system Python 2.6 does not include a # symlink to the framework file disguised as a .dylib file, thus finding # the library would fail. Manually check if a framework file "Python" # exists in the Python framework bundle. if sys.platform == 'darwin' and sys.version_info[:2] == (2, 6): # These manipulations essentially transform # /System/Library/Frameworks/Python.framework/Versions/2.6/lib # to # /System/Library/Frameworks/Python.framework/Versions/2.6/Python possible_framework_path = os.path.realpath(os.path.join(py_libdir, '..')) possible_framework_version = os.path.basename(possible_framework_path) possible_framework_library = os.path.join(possible_framework_path, 'Python') if (possible_framework_version == '2.6' and os.path.exists(possible_framework_library)): return possible_framework_library libs_tried.append(possible_framework_library) # Try to find shared libraries which have a multi arch # suffix. py_multiarch = get_config_var("MULTIARCH") if py_multiarch: try_py_libdir = os.path.join(py_libdir, py_multiarch) libs_tried = [] for lib_ext in lib_exts: lib_name = "libpython{}{}{}".format(py_version, lib_suff, lib_ext) py_library = os.path.join(try_py_libdir, lib_name) if os.path.exists(py_library): return py_library libs_tried.append(py_library) m = "Failed to locate the Python library with {}".format(", ".join(libs_tried)) raise DistutilsSetupError(m) def get_py_library(build_type, py_version, py_prefix, py_libdir, py_include_dir): """Find the Python library""" if sys.platform == "win32": py_library = _get_py_library_win(build_type, py_version, py_prefix, py_libdir, py_include_dir) else: py_library = _get_py_library_unix(build_type, py_version, py_prefix, py_libdir, py_include_dir) if py_library.endswith('.a'): # Python was compiled as a static library log.error("Failed to locate a dynamic Python library, using {}".format(py_library)) return py_library # Git submodules: ["submodule_name", "location_relative_to_sources_folder"] submodules = [["pyside2-tools"]] try: import setuptools except ImportError: from ez_setup import use_setuptools use_setuptools() from setuptools import Extension from setuptools.command.install import install as _install from setuptools.command.install_lib import install_lib as _install_lib from setuptools.command.bdist_egg import bdist_egg as _bdist_egg from setuptools.command.develop import develop as _develop from setuptools.command.build_py import build_py as _build_py import distutils.log as log from distutils.errors import DistutilsSetupError from distutils.sysconfig import get_config_var from distutils.sysconfig import get_python_lib from distutils.spawn import find_executable from distutils.command.build import build as _build from distutils.command.build_ext import build_ext as _build_ext from distutils.util import get_platform from distutils.cmd import Command from .qtinfo import QtInfo from .utils import rmtree, detect_clang, copyfile, copydir, run_process_output, run_process from .utils import update_env_path, init_msvc_env, filter_match from .utils import macos_fix_rpaths_for_library from .utils import linux_fix_rpaths_for_library from .platforms.unix import prepare_packages_posix from .platforms.windows_desktop import prepare_packages_win32 from .wheel_override import wheel_module_exists, get_bdist_wheel_override def check_allowed_python_version(): """ Make sure that setup.py is run with an allowed python version. """ import re pattern = r'Programming Language :: Python :: (\d+)\.(\d+)' supported = [] for line in config.python_version_classifiers: found = re.search(pattern, line) if found: major = int(found.group(1)) minor = int(found.group(2)) supported.append((major, minor)) this_py = sys.version_info[:2] if this_py not in supported: print("Unsupported python version detected. Only these python versions are supported: {}" .format(supported)) sys.exit(1) qt_src_dir = '' def is_debug_python(): return getattr(sys, "gettotalrefcount", None) is not None # Return a prefix suitable for the _install/_build directory def prefix(): virtual_env_name = os.environ.get('VIRTUAL_ENV', None) if virtual_env_name is not None: name = os.path.basename(virtual_env_name) else: name = "pyside" name += str(sys.version_info[0]) if OPTION["DEBUG"]: name += "d" if is_debug_python(): name += "p" if OPTION["LIMITED_API"] == "yes" and sys.version_info[0] == 3: name += "a" return name # Initialize, pull and checkout submodules def prepare_sub_modules(): print("Initializing submodules for PySide2 version: {}".format( get_package_version())) submodules_dir = os.path.join(setup_script_dir, "sources") # Create list of [name, desired branch, absolute path, desired # branch] and determine whether all submodules are present need_init_sub_modules = False for m in submodules: module_name = m[0] module_dir = m[1] if len(m) > 1 else '' module_dir = os.path.join(submodules_dir, module_dir, module_name) # Check for non-empty directory (repository checked out) if not os.listdir(module_dir): need_init_sub_modules = True break if need_init_sub_modules: git_update_cmd = ["git", "submodule", "update", "--init"] if run_process(git_update_cmd) != 0: m = "Failed to initialize the git submodules: update --init failed" raise DistutilsSetupError(m) git_pull_cmd = ["git", "submodule", "foreach", "git", "fetch", "--all"] if run_process(git_pull_cmd) != 0: m = "Failed to initialize the git submodules: git fetch --all failed" raise DistutilsSetupError(m) else: print("All submodules present.") git_update_cmd = ["git", "submodule", "update"] if run_process(git_update_cmd) != 0: m = "Failed to checkout the correct git submodules SHA1s." raise DistutilsSetupError(m) def prepare_build(): if (os.path.isdir(".git") and not OPTION["IGNOREGIT"] and not OPTION["ONLYPACKAGE"] and not OPTION["REUSE_BUILD"]): prepare_sub_modules() # Clean up temp build folder. for n in ["build"]: d = os.path.join(setup_script_dir, n) if os.path.isdir(d): log.info("Removing {}".format(d)) try: rmtree(d) except Exception as e: print('***** problem removing "{}"'.format(d)) print('ignored error: {}'.format(e)) # locate Qt sources for the documentation if OPTION["QT_SRC"] is None: install_prefix = QtInfo().prefix_dir if install_prefix: global qt_src_dir # In-source, developer build if install_prefix.endswith("qtbase"): qt_src_dir = install_prefix else: # SDK: Use 'Src' directory qt_src_dir = os.path.join(os.path.dirname(install_prefix), 'Src', 'qtbase') class PysideInstall(_install, DistUtilsCommandMixin): user_options = _install.user_options + DistUtilsCommandMixin.mixin_user_options def __init__(self, *args, **kwargs): _install.__init__(self, *args, **kwargs) DistUtilsCommandMixin.__init__(self) def initialize_options(self): _install.initialize_options(self) if sys.platform == 'darwin': # Because we change the plat_name to include a correct # deployment target on macOS distutils thinks we are # cross-compiling, and throws an exception when trying to # execute setup.py install. The check looks like this # if self.warn_dir and build_plat != get_platform(): # raise DistutilsPlatformError("Can't install when " # "cross-compiling") # Obviously get_platform will return the old deployment # target. The fix is to disable the warn_dir flag, which # was created for bdist_* derived classes to override, for # similar cases. self.warn_dir = False def finalize_options(self): DistUtilsCommandMixin.mixin_finalize_options(self) _install.finalize_options(self) def run(self): _install.run(self) print('--- Install completed ({}s)'.format(elapsed())) class PysideDevelop(_develop): def __init__(self, *args, **kwargs): _develop.__init__(self, *args, **kwargs) def run(self): self.run_command("build") _develop.run(self) class PysideBdistEgg(_bdist_egg): def __init__(self, *args, **kwargs): _bdist_egg.__init__(self, *args, **kwargs) def run(self): self.run_command("build") _bdist_egg.run(self) class PysideBuildExt(_build_ext): def __init__(self, *args, **kwargs): _build_ext.__init__(self, *args, **kwargs) def run(self): pass class PysideBuildPy(_build_py): def __init__(self, *args, **kwargs): _build_py.__init__(self, *args, **kwargs) # _install_lib is reimplemented to preserve # symlinks when distutils / setuptools copy files to various # directories from the setup tools build dir to the install dir. class PysideInstallLib(_install_lib): def __init__(self, *args, **kwargs): _install_lib.__init__(self, *args, **kwargs) def install(self): """ Installs files from build/xxx directory into final site-packages/PySide2 directory. """ if os.path.isdir(self.build_dir): # Using our own copydir makes sure to preserve symlinks. outfiles = copydir(os.path.abspath(self.build_dir), os.path.abspath(self.install_dir)) else: self.warn("'{}' does not exist -- no Python modules to install".format(self.build_dir)) return return outfiles class PysideBuild(_build, DistUtilsCommandMixin): user_options = _build.user_options + DistUtilsCommandMixin.mixin_user_options def __init__(self, *args, **kwargs): _build.__init__(self, *args, **kwargs) DistUtilsCommandMixin.__init__(self) def finalize_options(self): os_name_backup = os.name DistUtilsCommandMixin.mixin_finalize_options(self) if sys.platform == 'darwin': self.plat_name = macos_plat_name() # This is a hack to circumvent the dubious check in # distutils.commands.build -> finalize_options, which only # allows setting the plat_name for windows NT. # That is not the case for the wheel module though (which # does allow setting plat_name), so we circumvent by faking # the os name when finalizing the options, and then # restoring the original os name. os.name = "nt" _build.finalize_options(self) if sys.platform == 'darwin': os.name = os_name_backup def initialize_options(self): _build.initialize_options(self) self.make_path = None self.make_generator = None self.script_dir = None self.sources_dir = None self.build_dir = None self.install_dir = None self.py_executable = None self.py_include_dir = None self.py_library = None self.py_version = None self.py_arch = None self.build_type = "Release" self.qtinfo = None self.build_tests = False def run(self): prepare_build() platform_arch = platform.architecture()[0] log.info("Python architecture is {}".format(platform_arch)) self.py_arch = platform_arch[:-3] build_type = "Debug" if OPTION["DEBUG"] else "Release" if OPTION["RELWITHDEBINFO"]: build_type = 'RelWithDebInfo' # Check env make_path = None make_generator = None if not OPTION["ONLYPACKAGE"]: (make_path, make_generator) = get_make(platform_arch, build_type) # Prepare parameters py_executable = sys.executable py_version = "{}.{}".format(sys.version_info[0], sys.version_info[1]) py_include_dir = get_config_var("INCLUDEPY") py_libdir = get_config_var("LIBDIR") py_prefix = get_config_var("prefix") if not py_prefix or not os.path.exists(py_prefix): py_prefix = sys.prefix self.py_prefix = py_prefix if sys.platform == "win32": py_scripts_dir = os.path.join(py_prefix, "Scripts") else: py_scripts_dir = os.path.join(py_prefix, "bin") self.py_scripts_dir = py_scripts_dir self.qtinfo = QtInfo() qt_dir = os.path.dirname(OPTION["QMAKE"]) qt_version = get_qt_version() # Update the PATH environment variable additional_paths = [self.py_scripts_dir, qt_dir] # Add Clang to path for Windows. # Revisit once Clang is bundled with Qt. if (sys.platform == "win32" and LooseVersion(self.qtinfo.version) >= LooseVersion("5.7.0")): clang_dir = detect_clang() if clang_dir[0]: clangBinDir = os.path.join(clang_dir[0], 'bin') if clangBinDir not in os.environ.get('PATH'): log.info("Adding {} as detected by {} to PATH".format(clangBinDir, clang_dir[1])) additional_paths.append(clangBinDir) else: raise DistutilsSetupError("Failed to detect Clang when checking " "LLVM_INSTALL_DIR, CLANG_INSTALL_DIR, llvm-config") update_env_path(additional_paths) # Used for test blacklists and registry test. self.build_classifiers = "py{}-qt{}-{}-{}".format(py_version, qt_version, platform.architecture()[0], build_type.lower()) if OPTION["SHORTER_PATHS"]: build_name = "p{}".format(py_version) else: build_name = self.build_classifiers script_dir = setup_script_dir sources_dir = os.path.join(script_dir, "sources") build_dir = os.path.join(script_dir, prefix() + "_build", "{}".format(build_name)) install_dir = os.path.join(script_dir, prefix() + "_install", "{}".format(build_name)) self.make_path = make_path self.make_generator = make_generator self.script_dir = script_dir self.st_build_dir = os.path.join(self.script_dir, self.build_lib) self.sources_dir = sources_dir self.build_dir = build_dir self.install_dir = install_dir self.py_executable = py_executable self.py_include_dir = py_include_dir self.py_library = get_py_library(build_type, py_version, py_prefix, py_libdir, py_include_dir) self.py_version = py_version self.build_type = build_type self.site_packages_dir = get_python_lib(1, 0, prefix=install_dir) self.build_tests = OPTION["BUILDTESTS"] # Save the shiboken build dir path for clang deployment # purposes. self.shiboken_build_dir = os.path.join(self.build_dir, "shiboken2") self.log_pre_build_info() # Prepare folders if not os.path.exists(self.sources_dir): log.info("Creating sources folder {}...".format(self.sources_dir)) os.makedirs(self.sources_dir) if not os.path.exists(self.build_dir): log.info("Creating build folder {}...".format(self.build_dir)) os.makedirs(self.build_dir) if not os.path.exists(self.install_dir): log.info("Creating install folder {}...".format(self.install_dir)) os.makedirs(self.install_dir) if (not OPTION["ONLYPACKAGE"] and not config.is_internal_shiboken_generator_build_and_part_of_top_level_all()): # Build extensions for ext in config.get_buildable_extensions(): self.build_extension(ext) if OPTION["BUILDTESTS"]: # we record the latest successful build and note the # build directory for supporting the tests. timestamp = time.strftime('%Y-%m-%d_%H%M%S') build_history = os.path.join(setup_script_dir, 'build_history') unique_dir = os.path.join(build_history, timestamp) os.makedirs(unique_dir) fpath = os.path.join(unique_dir, 'build_dir.txt') with open(fpath, 'w') as f: print(build_dir, file=f) print(self.build_classifiers, file=f) log.info("Created {}".format(build_history)) if not OPTION["SKIP_PACKAGING"]: # Build patchelf if needed self.build_patchelf() # Prepare packages self.prepare_packages() # Build packages _build.run(self) else: log.info("Skipped preparing and building packages.") print('--- Build completed ({}s)'.format(elapsed())) def log_pre_build_info(self): if config.is_internal_shiboken_generator_build_and_part_of_top_level_all(): return setuptools_install_prefix = get_python_lib(1) if OPTION["FINAL_INSTALL_PREFIX"]: setuptools_install_prefix = OPTION["FINAL_INSTALL_PREFIX"] log.info("=" * 30) log.info("Package version: {}".format(get_package_version())) log.info("Build type: {}".format(self.build_type)) log.info("Build tests: {}".format(self.build_tests)) log.info("-" * 3) log.info("Make path: {}".format(self.make_path)) log.info("Make generator: {}".format(self.make_generator)) log.info("Make jobs: {}".format(OPTION["JOBS"])) log.info("-" * 3) log.info("setup.py directory: {}".format(self.script_dir)) log.info("Build scripts directory: {}".format(build_scripts_dir)) log.info("Sources directory: {}".format(self.sources_dir)) log.info(dedent(""" Building {st_package_name} will create and touch directories in the following order: make build directory (py*_build/*/*) -> make install directory (py*_install/*/*) -> setuptools build directory (build/*/*) -> setuptools install directory (usually path-installed-python/lib/python*/site-packages/*) """).format(st_package_name=config.package_name())) log.info("make build directory: {}".format(self.build_dir)) log.info("make install directory: {}".format(self.install_dir)) log.info("setuptools build directory: {}".format(self.st_build_dir)) log.info("setuptools install directory: {}".format(setuptools_install_prefix)) log.info(dedent(""" make-installed site-packages directory: {} (only relevant for copying files from 'make install directory' to 'setuptools build directory' """).format( self.site_packages_dir)) log.info("-" * 3) log.info("Python executable: {}".format(self.py_executable)) log.info("Python includes: {}".format(self.py_include_dir)) log.info("Python library: {}".format(self.py_library)) log.info("Python prefix: {}".format(self.py_prefix)) log.info("Python scripts: {}".format(self.py_scripts_dir)) log.info("-" * 3) log.info("Qt qmake: {}".format(self.qtinfo.qmake_command)) log.info("Qt version: {}".format(self.qtinfo.version)) log.info("Qt bins: {}".format(self.qtinfo.bins_dir)) log.info("Qt docs: {}".format(self.qtinfo.docs_dir)) log.info("Qt plugins: {}".format(self.qtinfo.plugins_dir)) log.info("-" * 3) if sys.platform == 'win32': log.info("OpenSSL dll directory: {}".format(OPTION["OPENSSL"])) if sys.platform == 'darwin': pyside_macos_deployment_target = ( macos_pyside_min_deployment_target() ) log.info("MACOSX_DEPLOYMENT_TARGET set to: {}".format( pyside_macos_deployment_target)) log.info("=" * 30) def build_patchelf(self): if not sys.platform.startswith('linux'): return self._patchelf_path = find_executable('patchelf') if self._patchelf_path: if not os.path.isabs(self._patchelf_path): self._patchelf_path = os.path.join(os.getcwd(), self._patchelf_path) log.info("Using {} ...".format(self._patchelf_path)) return log.info("Building patchelf...") module_src_dir = os.path.join(self.sources_dir, "patchelf") build_cmd = ["g++", "{}/patchelf.cc".format(module_src_dir), "-o", "patchelf"] if run_process(build_cmd) != 0: raise DistutilsSetupError("Error building patchelf") self._patchelf_path = os.path.join(self.script_dir, "patchelf") def build_extension(self, extension): # calculate the subrepos folder name log.info("Building module {}...".format(extension)) # Prepare folders os.chdir(self.build_dir) module_build_dir = os.path.join(self.build_dir, extension) skipflag_file = "{} -skip".format(module_build_dir) if os.path.exists(skipflag_file): log.info("Skipping {} because {} exists".format(extension, skipflag_file)) return module_build_exists = os.path.exists(module_build_dir) if module_build_exists: if not OPTION["REUSE_BUILD"]: log.info("Deleting module build folder {}...".format(module_build_dir)) try: rmtree(module_build_dir) except Exception as e: print('***** problem removing "{}"'.format(module_build_dir)) print('ignored error: {}'.format(e)) else: log.info("Reusing module build folder {}...".format(module_build_dir)) if not os.path.exists(module_build_dir): log.info("Creating module build folder {}...".format(module_build_dir)) os.makedirs(module_build_dir) os.chdir(module_build_dir) module_src_dir = os.path.join(self.sources_dir, extension) # Build module cmake_cmd = [OPTION["CMAKE"]] if OPTION["QUIET"]: # Pass a special custom option, to allow printing a lot less information when doing # a quiet build. cmake_cmd.append('-DQUIET_BUILD=1') if self.make_generator == "Unix Makefiles": # Hide progress messages for each built source file. # Doesn't seem to work if set within the cmake files themselves. cmake_cmd.append('-DCMAKE_RULE_MESSAGES=0') cmake_cmd += [ "-G", self.make_generator, "-DBUILD_TESTS={}".format(self.build_tests), "-DQt5Help_DIR={}".format(self.qtinfo.docs_dir), "-DCMAKE_BUILD_TYPE={}".format(self.build_type), "-DCMAKE_INSTALL_PREFIX={}".format(self.install_dir), module_src_dir ] cmake_cmd.append("-DPYTHON_EXECUTABLE={}".format(self.py_executable)) cmake_cmd.append("-DPYTHON_INCLUDE_DIR={}".format(self.py_include_dir)) cmake_cmd.append("-DPYTHON_LIBRARY={}".format(self.py_library)) # If a custom shiboken cmake config directory path was provided, pass it to CMake. if OPTION["SHIBOKEN_CONFIG_DIR"] and config.is_internal_pyside_build(): if os.path.exists(OPTION["SHIBOKEN_CONFIG_DIR"]): log.info("Using custom provided shiboken2 installation: {}" .format(OPTION["SHIBOKEN_CONFIG_DIR"])) cmake_cmd.append("-DShiboken2_DIR={}".format(OPTION["SHIBOKEN_CONFIG_DIR"])) else: log.info("Custom provided shiboken2 installation not found. Path given: {}" .format(OPTION["SHIBOKEN_CONFIG_DIR"])) if OPTION["MODULE_SUBSET"]: module_sub_set = '' for m in OPTION["MODULE_SUBSET"].split(','): if m.startswith('Qt'): m = m[2:] if module_sub_set: module_sub_set += ';' module_sub_set += m cmake_cmd.append("-DMODULES={}".format(module_sub_set)) if OPTION["SKIP_MODULES"]: skip_modules = '' for m in OPTION["SKIP_MODULES"].split(','): if m.startswith('Qt'): m = m[2:] if skip_modules: skip_modules += ';' skip_modules += m cmake_cmd.append("-DSKIP_MODULES={}".format(skip_modules)) # Add source location for generating documentation cmake_src_dir = OPTION["QT_SRC"] if OPTION["QT_SRC"] else qt_src_dir cmake_cmd.append("-DQT_SRC_DIR={}".format(cmake_src_dir)) log.info("Qt Source dir: {}".format(cmake_src_dir)) if self.build_type.lower() == 'debug': cmake_cmd.append("-DPYTHON_DEBUG_LIBRARY={}".format( self.py_library)) if OPTION["LIMITED_API"] == "yes": cmake_cmd.append("-DFORCE_LIMITED_API=yes") elif OPTION["LIMITED_API"] == "no": cmake_cmd.append("-DFORCE_LIMITED_API=no") elif not OPTION["LIMITED_API"]: pass else: raise DistutilsSetupError("option limited-api must be 'yes' or 'no' " "(default yes if applicable, i.e. python version >= 3.5)") if OPTION["VERBOSE_BUILD"]: cmake_cmd.append("-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON") if OPTION["SANITIZE_ADDRESS"]: # Some simple sanity checking. Only use at your own risk. if (sys.platform.startswith('linux') or sys.platform.startswith('darwin')): cmake_cmd.append("-DSANITIZE_ADDRESS=ON") else: raise DistutilsSetupError("Address sanitizer can only be used on Linux and macOS.") if extension.lower() == "pyside2": pyside_qt_conf_prefix = '' if OPTION["QT_CONF_PREFIX"]: pyside_qt_conf_prefix = OPTION["QT_CONF_PREFIX"] else: if OPTION["STANDALONE"]: pyside_qt_conf_prefix = '"Qt"' if sys.platform == 'win32': pyside_qt_conf_prefix = '"."' cmake_cmd.append("-DPYSIDE_QT_CONF_PREFIX={}".format( pyside_qt_conf_prefix)) # Pass package version to CMake, so this string can be # embedded into _config.py file. package_version = get_package_version() cmake_cmd.append("-DPACKAGE_SETUP_PY_PACKAGE_VERSION={}".format(package_version)) # In case if this is a snapshot build, also pass the # timestamp as a separate value, because it is the only # version component that is actually generated by setup.py. timestamp = '' if OPTION["SNAPSHOT_BUILD"]: timestamp = get_package_timestamp() cmake_cmd.append("-DPACKAGE_SETUP_PY_PACKAGE_TIMESTAMP={}".format(timestamp)) if extension.lower() in ["shiboken2", "pyside2-tools"]: cmake_cmd.append("-DCMAKE_INSTALL_RPATH_USE_LINK_PATH=yes") if sys.version_info[0] > 2: cmake_cmd.append("-DUSE_PYTHON_VERSION=3.3") if sys.platform == 'darwin': if OPTION["MACOS_ARCH"]: # also tell cmake which architecture to use cmake_cmd.append("-DCMAKE_OSX_ARCHITECTURES:STRING={}".format(OPTION["MACOS_ARCH"])) if OPTION["MACOS_USE_LIBCPP"]: # Explicitly link the libc++ standard library (useful # for macOS deployment targets lower than 10.9). # This is not on by default, because most libraries and # executables on macOS <= 10.8 are linked to libstdc++, # and mixing standard libraries can lead to crashes. # On macOS >= 10.9 with a similar minimum deployment # target, libc++ is linked in implicitly, thus the # option is a no-op in those cases. cmake_cmd.append("-DOSX_USE_LIBCPP=ON") if OPTION["MACOS_SYSROOT"]: cmake_cmd.append("-DCMAKE_OSX_SYSROOT={}".format( OPTION["MACOS_SYSROOT"])) else: latest_sdk_path = run_process_output(['xcrun', '--sdk', 'macosx', '--show-sdk-path']) if latest_sdk_path: latest_sdk_path = latest_sdk_path[0] cmake_cmd.append("-DCMAKE_OSX_SYSROOT={}".format( latest_sdk_path)) # Set macOS minimum deployment target (version). # This is required so that calling # run_process -> distutils.spawn() # does not set its own minimum deployment target # environment variable which is based on the python # interpreter sysconfig value. # Doing so could break the detected clang include paths # for example. deployment_target = macos_pyside_min_deployment_target() cmake_cmd.append("-DCMAKE_OSX_DEPLOYMENT_TARGET={}".format(deployment_target)) os.environ['MACOSX_DEPLOYMENT_TARGET'] = deployment_target if OPTION["DOC_BUILD_ONLINE"]: log.info("Output format will be HTML") cmake_cmd.append("-DDOC_OUTPUT_FORMAT=html") else: log.info("Output format will be qthelp") cmake_cmd.append("-DDOC_OUTPUT_FORMAT=qthelp") # Build the whole documentation (rst + API) by default cmake_cmd.append("-DFULLDOCSBUILD=1") if not OPTION["SKIP_CMAKE"]: log.info("Configuring module {} ({})...".format(extension, module_src_dir)) if run_process(cmake_cmd) != 0: raise DistutilsSetupError("Error configuring {}".format(extension)) else: log.info("Reusing old configuration for module {} ({})...".format( extension, module_src_dir)) log.info("-- Compiling module {}...".format(extension)) cmd_make = [self.make_path] if OPTION["JOBS"]: cmd_make.append(OPTION["JOBS"]) if run_process(cmd_make) != 0: raise DistutilsSetupError("Error compiling {}".format(extension)) if not OPTION["SKIP_DOCS"]: if extension.lower() == "shiboken2": try: # Check if sphinx is installed to proceed. import sphinx log.info("Generating Shiboken documentation") if run_process([self.make_path, "doc"]) != 0: raise DistutilsSetupError("Error generating documentation " "for {}".format(extension)) except ImportError: log.info("Sphinx not found, skipping documentation build") else: log.info("Skipped documentation generation") if not OPTION["SKIP_MAKE_INSTALL"]: log.info("Installing module {}...".format(extension)) # Need to wait a second, so installed file timestamps are # older than build file timestamps. # See https://gitlab.kitware.com/cmake/cmake/issues/16155 # for issue details. if sys.platform == 'darwin': log.info("Waiting 1 second, to ensure installation is successful...") time.sleep(1) # ninja: error: unknown target 'install/fast' target = 'install/fast' if self.make_generator != 'Ninja' else 'install' if run_process([self.make_path, target]) != 0: raise DistutilsSetupError("Error pseudo installing {}".format( extension)) else: log.info("Skipped installing module {}".format(extension)) os.chdir(self.script_dir) def prepare_packages(self): """ This will copy all relevant files from the various locations in the "cmake install dir", to the setup tools build dir (which is read from self.build_lib provided by distutils). After that setuptools.command.build_py is smart enough to copy everything from the build dir to the install dir (the virtualenv site-packages for example). """ try: log.info("\nPreparing setup tools build directory.\n") vars = { "site_packages_dir": self.site_packages_dir, "sources_dir": self.sources_dir, "install_dir": self.install_dir, "build_dir": self.build_dir, "script_dir": self.script_dir, "st_build_dir": self.st_build_dir, "cmake_package_name": config.package_name(), "st_package_name": config.package_name(), "ssl_libs_dir": OPTION["OPENSSL"], "py_version": self.py_version, "qt_version": self.qtinfo.version, "qt_bin_dir": self.qtinfo.bins_dir, "qt_doc_dir": self.qtinfo.docs_dir, "qt_lib_dir": self.qtinfo.libs_dir, "qt_lib_execs_dir": self.qtinfo.lib_execs_dir, "qt_plugins_dir": self.qtinfo.plugins_dir, "qt_prefix_dir": self.qtinfo.prefix_dir, "qt_translations_dir": self.qtinfo.translations_dir, "qt_qml_dir": self.qtinfo.qml_dir, "target_arch": self.py_arch, } # Needed for correct file installation in generator build # case. if config.is_internal_shiboken_generator_build(): vars['cmake_package_name'] = config.shiboken_module_option_name os.chdir(self.script_dir) if sys.platform == "win32": vars['dbg_postfix'] = OPTION["DEBUG"] and "_d" or "" return prepare_packages_win32(self, vars) else: return prepare_packages_posix(self, vars) except IOError as e: print('setup.py/prepare_packages: ', e) raise def qt_is_framework_build(self): if os.path.isdir(self.qtinfo.headers_dir + "/../lib/QtCore.framework"): return True return False def get_built_pyside_config(self, vars): # Get config that contains list of built modules, and # SOVERSIONs of the built libraries. st_build_dir = vars['st_build_dir'] config_path = os.path.join(st_build_dir, config.package_name(), "_config.py") temp_config = get_python_dict(config_path) if 'built_modules' not in temp_config: temp_config['built_modules'] = [] return temp_config def is_webengine_built(self, built_modules): return ('WebEngineWidgets' in built_modules or 'WebEngineCore' in built_modules or 'WebEngine' in built_modules) def prepare_standalone_clang(self, is_win=False): """ Copies the libclang library to the shiboken2-generator package so that the shiboken executable works. """ log.info('Finding path to the libclang shared library.') cmake_cmd = [ OPTION["CMAKE"], "-L", # Lists variables "-N", # Just inspects the cache (faster) "--build", # Specifies the build dir self.shiboken_build_dir ] out = run_process_output(cmake_cmd) lines = [s.strip() for s in out] pattern = re.compile(r"CLANG_LIBRARY:FILEPATH=(.+)$") clang_lib_path = None for line in lines: match = pattern.search(line) if match: clang_lib_path = match.group(1) break if not clang_lib_path: raise RuntimeError("Could not find the location of the libclang " "library inside the CMake cache file.") if is_win: # clang_lib_path points to the static import library # (lib/libclang.lib), whereas we want to copy the shared # library (bin/libclang.dll). clang_lib_path = re.sub(r'lib/libclang.lib$', 'bin/libclang.dll', clang_lib_path) else: # shiboken2 links against libclang.so.6 or a similarly # named library. # If the linked against library is a symlink, resolve # the symlink once (but not all the way to the real # file) on Linux and macOS, # so that we get the path to the "SO version" symlink # (the one used as the install name in the shared library # dependency section). # E.g. On Linux libclang.so -> libclang.so.6 -> # libclang.so.6.0. # "libclang.so.6" is the name we want for the copied file. if os.path.islink(clang_lib_path): link_target = os.readlink(clang_lib_path) if os.path.isabs(link_target): clang_lib_path = link_target else: # link_target is relative, transform to absolute. clang_lib_path = os.path.join(os.path.dirname(clang_lib_path), link_target) clang_lib_path = os.path.abspath(clang_lib_path) # The destination will be the shiboken package folder. vars = {} vars['st_build_dir'] = self.st_build_dir vars['st_package_name'] = config.package_name() destination_dir = "{st_build_dir}/{st_package_name}".format(**vars) if os.path.exists(clang_lib_path): basename = os.path.basename(clang_lib_path) log.info('Copying libclang shared library {} to the package folder as {}.'.format( clang_lib_path, basename)) destination_path = os.path.join(destination_dir, basename) # Need to modify permissions in case file is not writable # (a reinstall would cause a permission denied error). copyfile(clang_lib_path, destination_path, force_copy_symlink=True, make_writable_by_owner=True) else: raise RuntimeError("Error copying libclang library " "from {} to {}. ".format(clang_lib_path, destination_dir)) def update_rpath(self, package_path, executables): if sys.platform.startswith('linux'): pyside_libs = [lib for lib in os.listdir( package_path) if filter_match(lib, ["*.so", "*.so.*"])] def rpath_cmd(srcpath): final_rpath = '' # Command line rpath option takes precedence over # automatically added one. if OPTION["RPATH_VALUES"]: final_rpath = OPTION["RPATH_VALUES"] else: # Add rpath values pointing to $ORIGIN and the # installed qt lib directory. final_rpath = self.qtinfo.libs_dir if OPTION["STANDALONE"]: final_rpath = "$ORIGIN/Qt/lib" override = OPTION["STANDALONE"] linux_fix_rpaths_for_library(self._patchelf_path, srcpath, final_rpath, override=override) elif sys.platform == 'darwin': pyside_libs = [lib for lib in os.listdir( package_path) if filter_match(lib, ["*.so", "*.dylib"])] def rpath_cmd(srcpath): final_rpath = '' # Command line rpath option takes precedence over # automatically added one. if OPTION["RPATH_VALUES"]: final_rpath = OPTION["RPATH_VALUES"] else: if OPTION["STANDALONE"]: final_rpath = "@loader_path/Qt/lib" else: final_rpath = self.qtinfo.libs_dir macos_fix_rpaths_for_library(srcpath, final_rpath) else: raise RuntimeError('Not configured for platform {}'.format(sys.platform)) pyside_libs.extend(executables) # Update rpath in PySide2 libs for srcname in pyside_libs: srcpath = os.path.join(package_path, srcname) if os.path.isdir(srcpath) or os.path.islink(srcpath): continue if not os.path.exists(srcpath): continue rpath_cmd(srcpath) log.info("Patched rpath to '$ORIGIN/' (Linux) or " "updated rpath (OS/X) in {}.".format(srcpath)) class PysideRstDocs(Command, DistUtilsCommandMixin): description = "Build .rst documentation only" user_options = DistUtilsCommandMixin.mixin_user_options def initialize_options(self): DistUtilsCommandMixin.__init__(self) log.info("-- This build process will not include the API documentation." "API documentation requires a full build of pyside/shiboken.") self.skip = False if config.is_internal_shiboken_generator_build(): self.skip = True if not self.skip: self.name = config.package_name().lower() self.doc_dir = os.path.join(config.setup_script_dir, "sources") self.doc_dir = os.path.join(self.doc_dir, self.name) self.doc_dir = os.path.join(self.doc_dir, "doc") try: # Check if sphinx is installed to proceed. import sphinx if self.name == "shiboken2": log.info("-- Generating Shiboken documentation") log.info("-- Documentation directory: 'html/pyside2/shiboken2/'") elif self.name == "pyside2": log.info("-- Generating PySide documentation") log.info("-- Documentation directory: 'html/pyside2/'") except ImportError: raise DistutilsSetupError("Sphinx not found - aborting") self.html_dir = "html" # creating directories html/pyside2/shiboken2 try: if not os.path.isdir(self.html_dir): os.mkdir(self.html_dir) if self.name == "shiboken2": out_pyside = os.path.join(self.html_dir, "pyside2") if not os.path.isdir(out_pyside): os.mkdir(out_pyside) out_shiboken = os.path.join(out_pyside, "shiboken2") if not os.path.isdir(out_shiboken): os.mkdir(out_shiboken) self.out_dir = out_shiboken # We know that on the shiboken step, we already created the # 'pyside2' directory elif self.name == "pyside2": self.out_dir = os.path.join(self.html_dir, "pyside2") except: raise DistutilsSetupError("Error while creating directories for {}".format(self.doc_dir)) def run(self): if not self.skip: cmake_cmd = [OPTION["CMAKE"]] cmake_cmd += [ "-S", self.doc_dir, "-B", self.out_dir, "-DDOC_OUTPUT_FORMAT=html", "-DFULLDOCSBUILD=0", ] if run_process(cmake_cmd) != 0: raise DistutilsSetupError("Error running CMake for {}".format(self.doc_dir)) if self.name == "pyside2": self.sphinx_src = os.path.join(self.out_dir, "rst") elif self.name == "shiboken2": self.sphinx_src = self.out_dir sphinx_cmd = ["sphinx-build", "-b", "html", "-c", self.sphinx_src, self.doc_dir, self.out_dir] if run_process(sphinx_cmd) != 0: raise DistutilsSetupError("Error running CMake for {}".format(self.doc_dir)) # Last message if not self.skip and self.name == "pyside2": log.info("-- The documentation was built. Check html/pyside2/index.html") def finalize_options(self): DistUtilsCommandMixin.mixin_finalize_options(self) cmd_class_dict = { 'build': PysideBuild, 'build_py': PysideBuildPy, 'build_ext': PysideBuildExt, 'bdist_egg': PysideBdistEgg, 'develop': PysideDevelop, 'install': PysideInstall, 'install_lib': PysideInstallLib, 'build_rst_docs': PysideRstDocs, } if wheel_module_exists: pyside_bdist_wheel = get_bdist_wheel_override() if pyside_bdist_wheel: cmd_class_dict['bdist_wheel'] = pyside_bdist_wheel build_scripts/options.py000066400000000000000000000316371376617013100160100ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from __future__ import print_function import distutils.log as log from distutils.spawn import find_executable import sys import os import warnings from .qtinfo import QtInfo _AVAILABLE_MKSPECS = ["msvc", "mingw", "ninja"] if sys.platform == "win32" else ["make", "ninja"] # Global options not which are not part of the commands ADDITIONAL_OPTIONS = """ Additional options: --limited-api Use Limited API [yes/no] ---macos-use-libc++ Use libc++ on macOS --snapshot-build Snapshot build --package-timestamp Package Timestamp """ def _warn_multiple_option(option): warnings.warn('Option "{}" occurs multiple times on the command line.'.format(option)) def _warn_deprecated_option(option, replacement=None): w = 'Option "{}" is deprecated and may be removed in a future release.'.format(option) if replacement: w = '{}\nUse "{}" instead.'.format(w, replacement) warnings.warn(w) class Options(object): def __init__(self): # Dictionary containing values of all the possible options. self.dict = {} def has_option(self, name, remove=True): """ Returns True if argument '--name' was passed on the command line. """ option = '--{}'.format(name) count = sys.argv.count(option) remove_count = count if not remove and count > 0: remove_count -= 1 for i in range(remove_count): sys.argv.remove(option) if count > 1: _warn_multiple_option(option) return count > 0 def option_value(self, name, short_option_name=None, remove=True): """ Returns the value of a command line option or environment variable. :param name: The name of the command line option or environment variable. :param remove: Whether the option and its value should be removed from sys.argv. Useful when there's a need to query for the value and also pass it along to setuptools for example. :return: Either the option value or None. """ option = '--' + name short_option = '-' + short_option_name if short_option_name else None single_option_prefix = option + '=' value = None for index in reversed(range(len(sys.argv))): arg = sys.argv[index] if arg == option or short_option and arg == short_option: if value: _warn_multiple_option(option) else: if index + 1 >= len(sys.argv): raise RuntimeError("The option {} requires a value".format(option)) value = sys.argv[index + 1] if remove: sys.argv[index:index + 2] = [] elif arg.startswith(single_option_prefix): if value: _warn_multiple_option(option) else: value = arg[len(single_option_prefix):] if remove: sys.argv[index:index + 1] = [] if value is None: value = os.getenv(name.upper().replace('-', '_')) self.dict[name] = value return value options = Options() def has_option(*args, **kwargs): return options.has_option(*args, **kwargs) def option_value(*args, **kwargs): return options.option_value(*args, **kwargs) def _jobs_option_value(): """Option value for parallel builds.""" value = option_value('parallel', short_option_name='j') if value: return '-j' + value if not value.startswith('-j') else value return '' # Declare options which need to be known when instantiating the DistUtils # commands. OPTION = { "BUILD_TYPE": option_value("build-type"), "INTERNAL_BUILD_TYPE": option_value("internal-build-type"), # number of parallel build jobs "JOBS": _jobs_option_value(), # Legacy, not used any more. "JOM": has_option('jom'), "MACOS_USE_LIBCPP": has_option("macos-use-libc++"), "QUIET": has_option('quiet', remove=False), "SNAPSHOT_BUILD": has_option("snapshot-build"), "LIMITED_API": option_value("limited-api"), "PACKAGE_TIMESTAMP": option_value("package-timestamp"), # This is used automatically by distutils.command.install object, to # specify the final installation location. "FINAL_INSTALL_PREFIX": option_value("prefix", remove=False) # This is used to identify the template for doc builds } _deprecated_option_jobs = option_value('jobs') if _deprecated_option_jobs: _warn_deprecated_option('jobs', 'parallel') OPTION["JOBS"] = _deprecated_option_jobs class DistUtilsCommandMixin(object): """Mixin for the DistUtils build/install commands handling the options.""" _finalized = False mixin_user_options = [ ('debug', None, 'Build with debug information'), ('relwithdebinfo', None, 'Build in release mode with debug information'), ('only-package', None, 'Package only'), ('standalone', None, 'Standalone build'), ('ignore-git', None, 'Do update subrepositories'), ('skip-docs', None, 'Skip documentation build'), ('no-examples', None, 'Do not build examples'), ('no-jom', None, 'Do not use jom (MSVC)'), ('build-tests', None, 'Build tests'), ('use-xvfb', None, 'Use Xvfb for testing'), ('reuse-build', None, 'Reuse existing build'), ('skip-cmake', None, 'Skip CMake step'), ('skip-make-install', None, 'Skip install step'), ('skip-packaging', None, 'Skip packaging step'), ('verbose-build', None, 'Verbose build'), ('sanitize-address', None, 'Build with address sanitizer'), ('shorter-paths', None, 'Use shorter paths'), ('doc-build-online', None, 'Build online documentation'), ('qmake=', None, 'Path to qmake'), ('qt=', None, 'Qt version'), ('cmake=', None, 'Path to CMake'), ('openssl=', None, 'Path to OpenSSL libraries'), ('shiboken-config-dir=', None, 'shiboken configuration directory'), ('make-spec=', None, 'Qt make-spec'), ('macos-arch=', None, 'macOS architecture'), ('macos-sysroot=', None, 'macOS sysroot'), ('macos-deployment-target=', None, 'macOS deployment target'), ('skip-modules=', None, 'Qt modules to be skipped'), ('module-subset=', None, 'Qt modules to be built'), ('rpath=', None, 'RPATH'), ('qt-conf-prefix=', None, 'Qt configuration prefix'), ('qt-src-dir=', None, 'Qt source directory')] def __init__(self): self.debug = False self.relwithdebinfo = False self.only_package = False self.standalone = False self.ignore_git = False self.skip_docs = False self.no_examples = False self.no_jom = False self.build_tests = False self.use_xvfb = False self.reuse_build = False self.skip_cmake = False self.skip_make_install = False self.skip_packaging = False self.verbose_build = False self.sanitize_address = False self.snapshot_build = False self.shorter_paths = False self.doc_build_online = False self.qmake = None self.qt = '5' self.cmake = None self.openssl = None self.shiboken_config_dir = None self.make_spec = None self.macos_arch = None self.macos_sysroot = None self.macos_deployment_target = None self.skip_modules = None self.module_subset = None self.rpath = None self.qt_conf_prefix = None self.qt_src_dir = None def mixin_finalize_options(self): # Bail out on 2nd call to mixin_finalize_options() since that is the # build command following the install command when invoking # setup.py install if not DistUtilsCommandMixin._finalized: DistUtilsCommandMixin._finalized = True self._do_finalize() def _do_finalize(self): if not self._determine_defaults_and_check(): sys.exit(-1) OPTION['DEBUG'] = self.debug OPTION['RELWITHDEBINFO'] = self.relwithdebinfo OPTION['ONLYPACKAGE'] = self.only_package OPTION['STANDALONE'] = self.standalone OPTION['IGNOREGIT'] = self.ignore_git OPTION['SKIP_DOCS'] = self.skip_docs OPTION['NOEXAMPLES'] = self.no_examples OPTION['BUILDTESTS'] = self.build_tests OPTION['NO_JOM'] = self.no_jom OPTION['XVFB'] = self.use_xvfb OPTION['REUSE_BUILD'] = self.reuse_build OPTION['SKIP_CMAKE'] = self.skip_cmake OPTION['SKIP_MAKE_INSTALL'] = self.skip_make_install OPTION['SKIP_PACKAGING'] = self.skip_packaging OPTION['VERBOSE_BUILD'] = self.verbose_build if self.verbose_build: log.set_verbosity(1) OPTION['SANITIZE_ADDRESS'] = self.sanitize_address OPTION['SHORTER_PATHS'] = self.shorter_paths OPTION['DOC_BUILD_ONLINE'] = self.doc_build_online # make qtinfo.py independent of relative paths. qmake_abs_path = os.path.abspath(self.qmake) OPTION['QMAKE'] = qmake_abs_path OPTION['QT_VERSION'] = self.qt QtInfo().setup(qmake_abs_path, self.qt) OPTION['CMAKE'] = os.path.abspath(self.cmake) OPTION['OPENSSL'] = self.openssl OPTION['SHIBOKEN_CONFIG_DIR'] = self.shiboken_config_dir OPTION['MAKESPEC'] = self.make_spec OPTION['MACOS_ARCH'] = self.macos_arch OPTION['MACOS_SYSROOT'] = self.macos_sysroot OPTION['MACOS_DEPLOYMENT_TARGET'] = self.macos_deployment_target OPTION['SKIP_MODULES'] = self.skip_modules OPTION['MODULE_SUBSET'] = self.module_subset OPTION['RPATH_VALUES'] = self.rpath OPTION['QT_CONF_PREFIX'] = self.qt_conf_prefix OPTION['QT_SRC'] = self.qt_src_dir def _determine_defaults_and_check(self): if not self.cmake: self.cmake = find_executable("cmake") if not self.cmake: print("cmake could not be found.") return False if not os.path.exists(self.cmake): print("'{}' does not exist.".format(self.cmake)) return False if not self.qmake: self.qmake = find_executable("qmake") if not self.qmake: self.qmake = find_executable("qmake-qt5") if not self.qmake: print("qmake could not be found.") return False if not os.path.exists(self.qmake): print("'{}' does not exist.".format(self.qmake)) return False if not self.make_spec: self.make_spec = _AVAILABLE_MKSPECS[0] if self.make_spec not in _AVAILABLE_MKSPECS: print('Invalid option --make-spec "{}". Available values are {}'.format(OPTION["MAKESPEC"], _AVAILABLE_MKSPECS)) return False if OPTION["JOBS"] and sys.platform == 'win32' and self.no_jom: print("Option --jobs can only be used with jom on Windows.") return False return True build_scripts/platforms/000077500000000000000000000000001376617013100157405ustar00rootroot00000000000000build_scripts/platforms/__init__.py000066400000000000000000000035521376617013100200560ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# build_scripts/platforms/linux.py000066400000000000000000000136731376617013100174630ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from ..utils import (copydir, copyfile, copy_icu_libs, find_files_using_glob, linux_set_rpaths, linux_run_read_elf, linux_get_rpaths, rpaths_has_origin) from ..config import config def prepare_standalone_package_linux(self, vars): built_modules = vars['built_modules'] constrain_modules = None copy_plugins = True copy_qml = True copy_translations = True copy_qt_conf = True should_copy_icu_libs = True if config.is_internal_shiboken_generator_build(): constrain_modules = ["Core", "Network", "Xml", "XmlPatterns"] copy_plugins = False copy_qml = False copy_translations = False copy_qt_conf = False should_copy_icu_libs = False # /lib/* -> /{st_package_name}/Qt/lib destination_lib_dir = "{st_build_dir}/{st_package_name}/Qt/lib" accepted_modules = ['libQt5*.so.?'] if constrain_modules: accepted_modules = ["libQt5" + module + "*.so.?" for module in constrain_modules] accepted_modules.append("libicu*.so.??") copydir("{qt_lib_dir}", destination_lib_dir, filter=accepted_modules, recursive=False, vars=vars, force_copy_symlinks=True) if should_copy_icu_libs: # Check if ICU libraries were copied over to the destination # Qt libdir. resolved_destination_lib_dir = destination_lib_dir.format(**vars) maybe_icu_libs = find_files_using_glob(resolved_destination_lib_dir, "libicu*") # If no ICU libraries are present in the Qt libdir (like when # Qt is built against system ICU, or in the Coin CI where ICU # libs are in a different directory) try to find out / resolve # which ICU libs are used by QtCore (if used at all) using a # custom written ldd, and copy the ICU libs to the Pyside Qt # dir if necessary. We choose the QtCore lib to inspect, by # checking which QtCore library the shiboken2 executable uses. if not maybe_icu_libs: copy_icu_libs(self._patchelf_path, resolved_destination_lib_dir) # Patching designer to use the Qt libraries provided in the wheel if config.is_internal_pyside_build(): designer_path = "{st_build_dir}/{st_package_name}/designer".format(**vars) rpaths = linux_get_rpaths(designer_path) if not rpaths or not rpaths_has_origin(rpaths): rpaths.insert(0, '$ORIGIN/../lib') new_rpaths_string = ":".join(rpaths) linux_set_rpaths(self._patchelf_path, designer_path, new_rpaths_string) if self.is_webengine_built(built_modules): copydir("{qt_lib_execs_dir}", "{st_build_dir}/{st_package_name}/Qt/libexec", filter=None, recursive=False, vars=vars) copydir("{qt_prefix_dir}/resources", "{st_build_dir}/{st_package_name}/Qt/resources", filter=None, recursive=False, vars=vars) if copy_plugins: # /plugins/* -> /{st_package_name}/Qt/plugins copydir("{qt_plugins_dir}", "{st_build_dir}/{st_package_name}/Qt/plugins", filter=["*.so"], recursive=True, vars=vars) if copy_qml: # /qml/* -> /{st_package_name}/Qt/qml copydir("{qt_qml_dir}", "{st_build_dir}/{st_package_name}/Qt/qml", filter=None, force=False, recursive=True, ignore=["*.so.debug"], vars=vars) if copy_translations: # /translations/* -> # /{st_package_name}/Qt/translations copydir("{qt_translations_dir}", "{st_build_dir}/{st_package_name}/Qt/translations", filter=["*.qm", "*.pak"], force=False, vars=vars) if copy_qt_conf: # Copy the qt.conf file to libexec. copyfile( "{build_dir}/pyside2/{st_package_name}/qt.conf", "{st_build_dir}/{st_package_name}/Qt/libexec", vars=vars) build_scripts/platforms/macos.py000066400000000000000000000214721376617013100174220ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import fnmatch import os from ..utils import copydir, copyfile, macos_fix_rpaths_for_library, macos_add_rpath from ..config import config def prepare_standalone_package_macos(self, vars): built_modules = vars['built_modules'] constrain_modules = None copy_plugins = True copy_qml = True copy_translations = True copy_qt_conf = True if config.is_internal_shiboken_generator_build(): constrain_modules = ["Core", "Network", "Xml", "XmlPatterns"] constrain_frameworks = ['Qt' + name + '.framework' for name in constrain_modules] copy_plugins = False copy_qml = False copy_translations = False copy_qt_conf = False # Directory filter for skipping unnecessary files. def general_dir_filter(dir_name, parent_full_path, dir_full_path): if fnmatch.fnmatch(dir_name, "*.dSYM"): return False return True # Filter out debug plugins and qml plugins in the # debug_and_release config. no_copy_debug = True def file_variant_filter(file_name, file_full_path): if self.qtinfo.build_type != 'debug_and_release': return True if file_name.endswith('_debug.dylib') and no_copy_debug: return False return True # Patching designer to use the Qt libraries provided in the wheel if config.is_internal_pyside_build(): designer_bundle = "{st_build_dir}/{st_package_name}/Designer.app".format(**vars) designer_binary = "{}/Contents/MacOS/Designer".format(designer_bundle) rpath = "@loader_path/../../../Qt/lib" macos_add_rpath(rpath, designer_binary) # /lib/* -> /{st_package_name}/Qt/lib if self.qt_is_framework_build(): def framework_dir_filter(dir_name, parent_full_path, dir_full_path): if '.framework' in dir_name: if (dir_name.startswith('QtWebEngine') and not self.is_webengine_built(built_modules)): return False if constrain_modules and dir_name not in constrain_frameworks: return False if dir_name in ['Headers', 'fonts']: return False if dir_full_path.endswith('Versions/Current'): return False if dir_full_path.endswith('Versions/5/Resources'): return False if dir_full_path.endswith('Versions/5/Helpers'): return False return general_dir_filter(dir_name, parent_full_path, dir_full_path) # Filter out debug frameworks in the # debug_and_release config. no_copy_debug = True def framework_variant_filter(file_name, file_full_path): if self.qtinfo.build_type != 'debug_and_release': return True dir_path = os.path.dirname(file_full_path) in_framework = dir_path.endswith("Versions/5") if file_name.endswith('_debug') and in_framework and no_copy_debug: return False return True copydir("{qt_lib_dir}", "{st_build_dir}/{st_package_name}/Qt/lib", recursive=True, vars=vars, ignore=["*.la", "*.a", "*.cmake", "*.pc", "*.prl"], dir_filter_function=framework_dir_filter, file_filter_function=framework_variant_filter) # Fix rpath for WebEngine process executable. The already # present rpath does not work because it assumes a symlink # from Versions/5/Helpers, thus adding two more levels of # directory hierarchy. if self.is_webengine_built(built_modules): qt_lib_path = "{st_build_dir}/{st_package_name}/Qt/lib".format(**vars) bundle = "QtWebEngineCore.framework/Helpers/" bundle += "QtWebEngineProcess.app" binary = "Contents/MacOS/QtWebEngineProcess" webengine_process_path = os.path.join(bundle, binary) final_path = os.path.join(qt_lib_path, webengine_process_path) rpath = "@loader_path/../../../../../" macos_fix_rpaths_for_library(final_path, rpath) else: ignored_modules = [] if not self.is_webengine_built(built_modules): ignored_modules.extend(['libQt5WebEngine*.dylib']) if 'WebKit' not in built_modules: ignored_modules.extend(['libQt5WebKit*.dylib']) accepted_modules = ['libQt5*.5.dylib'] if constrain_modules: accepted_modules = ["libQt5" + module + "*.5.dylib" for module in constrain_modules] copydir("{qt_lib_dir}", "{st_build_dir}/{st_package_name}/Qt/lib", filter=accepted_modules, ignore=ignored_modules, file_filter_function=file_variant_filter, recursive=True, vars=vars, force_copy_symlinks=True) if self.is_webengine_built(built_modules): copydir("{qt_lib_execs_dir}", "{st_build_dir}/{st_package_name}/Qt/libexec", filter=None, recursive=False, vars=vars) copydir("{qt_prefix_dir}/resources", "{st_build_dir}/{st_package_name}/Qt/resources", filter=None, recursive=False, vars=vars) # Fix rpath for WebEngine process executable. qt_libexec_path = "{st_build_dir}/{st_package_name}/Qt/libexec".format(**vars) binary = "QtWebEngineProcess" final_path = os.path.join(qt_libexec_path, binary) rpath = "@loader_path/../lib" macos_fix_rpaths_for_library(final_path, rpath) if copy_qt_conf: # Copy the qt.conf file to libexec. copyfile( "{build_dir}/pyside2/{st_package_name}/qt.conf", "{st_build_dir}/{st_package_name}/Qt/libexec", vars=vars) if copy_plugins: # /plugins/* -> /{st_package_name}/Qt/plugins copydir("{qt_plugins_dir}", "{st_build_dir}/{st_package_name}/Qt/plugins", filter=["*.dylib"], recursive=True, dir_filter_function=general_dir_filter, file_filter_function=file_variant_filter, vars=vars) if copy_qml: # /qml/* -> /{st_package_name}/Qt/qml copydir("{qt_qml_dir}", "{st_build_dir}/{st_package_name}/Qt/qml", filter=None, recursive=True, force=False, dir_filter_function=general_dir_filter, file_filter_function=file_variant_filter, vars=vars) if copy_translations: # /translations/* -> # /{st_package_name}/Qt/translations copydir("{qt_translations_dir}", "{st_build_dir}/{st_package_name}/Qt/translations", filter=["*.qm", "*.pak"], force=False, vars=vars) build_scripts/platforms/unix.py000066400000000000000000000215071376617013100173020ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import os import sys import fnmatch from .linux import prepare_standalone_package_linux from .macos import prepare_standalone_package_macos from ..config import config from ..options import OPTION from ..utils import copydir, copyfile, makefile from ..utils import regenerate_qt_resources def prepare_packages_posix(self, vars): executables = [] # /lib/site-packages/{st_package_name}/* -> # /{st_package_name} # This copies the module .so/.dylib files and various .py files # (__init__, config, git version, etc.) copydir( "{site_packages_dir}/{st_package_name}", "{st_build_dir}/{st_package_name}", vars=vars) generated_config = self.get_built_pyside_config(vars) def adjusted_lib_name(name, version): postfix = '' if sys.platform.startswith('linux'): postfix = '.so.' + version elif sys.platform == 'darwin': postfix = '.' + version + '.dylib' return name + postfix if config.is_internal_shiboken_module_build(): # /shiboken2/doc/html/* -> # /{st_package_name}/docs/shiboken2 copydir( "{build_dir}/shiboken2/doc/html", "{st_build_dir}/{st_package_name}/docs/shiboken2", force=False, vars=vars) # /lib/lib* -> {st_package_name}/ copydir( "{install_dir}/lib/", "{st_build_dir}/{st_package_name}", filter=[ adjusted_lib_name("libshiboken*", generated_config['shiboken_library_soversion']), ], recursive=False, vars=vars, force_copy_symlinks=True) if config.is_internal_shiboken_generator_build(): # /bin/* -> {st_package_name}/ executables.extend(copydir( "{install_dir}/bin/", "{st_build_dir}/{st_package_name}", filter=[ "shiboken2", ], recursive=False, vars=vars)) # Used to create scripts directory. makefile( "{st_build_dir}/{st_package_name}/scripts/shiboken_tool.py", vars=vars) # For setting up setuptools entry points. copyfile( "{install_dir}/bin/shiboken_tool.py", "{st_build_dir}/{st_package_name}/scripts/shiboken_tool.py", force=False, vars=vars) if config.is_internal_shiboken_generator_build() or config.is_internal_pyside_build(): # /include/* -> /{st_package_name}/include copydir( "{install_dir}/include/{cmake_package_name}", "{st_build_dir}/{st_package_name}/include", vars=vars) if config.is_internal_pyside_build(): makefile( "{st_build_dir}/{st_package_name}/scripts/__init__.py", vars=vars) # For setting up setuptools entry points copyfile( "{install_dir}/bin/pyside_tool.py", "{st_build_dir}/{st_package_name}/scripts/pyside_tool.py", force=False, vars=vars) # /bin/* -> {st_package_name}/ executables.extend(copydir( "{install_dir}/bin/", "{st_build_dir}/{st_package_name}", filter=[ "pyside2-lupdate", "uic", "rcc", ], recursive=False, vars=vars)) # Copying designer if sys.platform == "darwin": executables.extend(copydir( "{install_dir}/bin/Designer.app", "{st_build_dir}/{st_package_name}/Designer.app", filter=None, recursive=True, force=False, vars=vars)) else: copyfile( "{install_dir}/bin/designer", "{st_build_dir}/{st_package_name}/designer", force=False, vars=vars) # /lib/lib* -> {st_package_name}/ copydir( "{install_dir}/lib/", "{st_build_dir}/{st_package_name}", filter=[ adjusted_lib_name("libpyside*", generated_config['pyside_library_soversion']), ], recursive=False, vars=vars, force_copy_symlinks=True) # /share/{st_package_name}/typesystems/* -> # /{st_package_name}/typesystems copydir( "{install_dir}/share/{st_package_name}/typesystems", "{st_build_dir}/{st_package_name}/typesystems", vars=vars) # /share/{st_package_name}/glue/* -> # /{st_package_name}/glue copydir( "{install_dir}/share/{st_package_name}/glue", "{st_build_dir}/{st_package_name}/glue", vars=vars) # /pyside2/{st_package_name}/support/* -> # /{st_package_name}/support/* copydir( "{build_dir}/pyside2/{st_package_name}/support", "{st_build_dir}/{st_package_name}/support", vars=vars) # /pyside2/{st_package_name}/*.pyi -> # /{st_package_name}/*.pyi copydir( "{build_dir}/pyside2/{st_package_name}", "{st_build_dir}/{st_package_name}", filter=["*.pyi", "py.typed"], vars=vars) if not OPTION["NOEXAMPLES"]: def pycache_dir_filter(dir_name, parent_full_path, dir_full_path): if fnmatch.fnmatch(dir_name, "__pycache__"): return False return True # examples/* -> /{st_package_name}/examples copydir(os.path.join(self.script_dir, "examples"), "{st_build_dir}/{st_package_name}/examples", force=False, vars=vars, dir_filter_function=pycache_dir_filter) # Re-generate examples Qt resource files for Python 3 # compatibility if sys.version_info[0] == 3: examples_path = "{st_build_dir}/{st_package_name}/examples".format(**vars) pyside_rcc_path = "{install_dir}/bin/rcc".format(**vars) pyside_rcc_options = ['-g', 'python'] regenerate_qt_resources(examples_path, pyside_rcc_path, pyside_rcc_options) # Copy Qt libs to package if OPTION["STANDALONE"]: if config.is_internal_pyside_build() or config.is_internal_shiboken_generator_build(): vars['built_modules'] = generated_config['built_modules'] if sys.platform == 'darwin': prepare_standalone_package_macos(self, vars) else: prepare_standalone_package_linux(self, vars) if config.is_internal_shiboken_generator_build(): # Copy over clang before rpath patching. self.prepare_standalone_clang(is_win=False) # Update rpath to $ORIGIN if sys.platform.startswith('linux') or sys.platform.startswith('darwin'): rpath_path = "{st_build_dir}/{st_package_name}".format(**vars) self.update_rpath(rpath_path, executables) build_scripts/platforms/windows_desktop.py000066400000000000000000000433511376617013100215430ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import functools import os import sys import fnmatch from ..config import config from ..options import OPTION from ..utils import copydir, copyfile, makefile from ..utils import regenerate_qt_resources, filter_match from ..utils import download_and_extract_7z def prepare_packages_win32(self, vars): # For now, debug symbols will not be shipped into the package. copy_pdbs = False pdbs = [] if (self.debug or self.build_type == 'RelWithDebInfo') and copy_pdbs: pdbs = ['*.pdb'] # /lib/site-packages/{st_package_name}/* -> # /{st_package_name} # This copies the module .pyd files and various .py files # (__init__, config, git version, etc.) copydir( "{site_packages_dir}/{st_package_name}", "{st_build_dir}/{st_package_name}", vars=vars) if config.is_internal_shiboken_module_build(): # /shiboken2/doc/html/* -> # /{st_package_name}/docs/shiboken2 copydir( "{build_dir}/shiboken2/doc/html", "{st_build_dir}/{st_package_name}/docs/shiboken2", force=False, vars=vars) # /bin/*.dll -> {st_package_name}/ copydir( "{install_dir}/bin/", "{st_build_dir}/{st_package_name}", filter=["shiboken*.dll"], recursive=False, vars=vars) # /lib/*.lib -> {st_package_name}/ copydir( "{install_dir}/lib/", "{st_build_dir}/{st_package_name}", filter=["shiboken*.lib"], recursive=False, vars=vars) # @TODO: Fix this .pdb file not to overwrite release # {shibokengenerator}.pdb file. # Task-number: PYSIDE-615 copydir( "{build_dir}/shiboken2/shibokenmodule", "{st_build_dir}/{st_package_name}", filter=pdbs, recursive=False, vars=vars) # pdb files for libshiboken and libpyside copydir( "{build_dir}/shiboken2/libshiboken", "{st_build_dir}/{st_package_name}", filter=pdbs, recursive=False, vars=vars) if config.is_internal_shiboken_generator_build(): # /bin/*.dll -> {st_package_name}/ copydir( "{install_dir}/bin/", "{st_build_dir}/{st_package_name}", filter=["shiboken*.exe"], recursive=False, vars=vars) # Used to create scripts directory. makefile( "{st_build_dir}/{st_package_name}/scripts/shiboken_tool.py", vars=vars) # For setting up setuptools entry points. copyfile( "{install_dir}/bin/shiboken_tool.py", "{st_build_dir}/{st_package_name}/scripts/shiboken_tool.py", force=False, vars=vars) # @TODO: Fix this .pdb file not to overwrite release # {shibokenmodule}.pdb file. # Task-number: PYSIDE-615 copydir( "{build_dir}/shiboken2/generator", "{st_build_dir}/{st_package_name}", filter=pdbs, recursive=False, vars=vars) if config.is_internal_shiboken_generator_build() or config.is_internal_pyside_build(): # /include/* -> /{st_package_name}/include copydir( "{install_dir}/include/{cmake_package_name}", "{st_build_dir}/{st_package_name}/include", vars=vars) if config.is_internal_pyside_build(): # /pyside2/{st_package_name}/*.pdb -> # /{st_package_name} copydir( "{build_dir}/pyside2/{st_package_name}", "{st_build_dir}/{st_package_name}", filter=pdbs, recursive=False, vars=vars) makefile( "{st_build_dir}/{st_package_name}/scripts/__init__.py", vars=vars) # For setting up setuptools entry points copyfile( "{install_dir}/bin/pyside_tool.py", "{st_build_dir}/{st_package_name}/scripts/pyside_tool.py", force=False, vars=vars) # /bin/*.exe,*.dll -> {st_package_name}/ copydir( "{install_dir}/bin/", "{st_build_dir}/{st_package_name}", filter=["pyside*.exe", "pyside*.dll", "uic.exe", "rcc.exe", "designer.exe"], recursive=False, vars=vars) # /lib/*.lib -> {st_package_name}/ copydir( "{install_dir}/lib/", "{st_build_dir}/{st_package_name}", filter=["pyside*.lib"], recursive=False, vars=vars) # /share/{st_package_name}/typesystems/* -> # /{st_package_name}/typesystems copydir( "{install_dir}/share/{st_package_name}/typesystems", "{st_build_dir}/{st_package_name}/typesystems", vars=vars) # /share/{st_package_name}/glue/* -> # /{st_package_name}/glue copydir( "{install_dir}/share/{st_package_name}/glue", "{st_build_dir}/{st_package_name}/glue", vars=vars) # /pyside2/{st_package_name}/support/* -> # /{st_package_name}/support/* copydir( "{build_dir}/pyside2/{st_package_name}/support", "{st_build_dir}/{st_package_name}/support", vars=vars) # /pyside2/{st_package_name}/*.pyi -> # /{st_package_name}/*.pyi copydir( "{build_dir}/pyside2/{st_package_name}", "{st_build_dir}/{st_package_name}", filter=["*.pyi", "py.typed"], vars=vars) copydir( "{build_dir}/pyside2/libpyside", "{st_build_dir}/{st_package_name}", filter=pdbs, recursive=False, vars=vars) if not OPTION["NOEXAMPLES"]: def pycache_dir_filter(dir_name, parent_full_path, dir_full_path): if fnmatch.fnmatch(dir_name, "__pycache__"): return False return True # examples/* -> /{st_package_name}/examples copydir(os.path.join(self.script_dir, "examples"), "{st_build_dir}/{st_package_name}/examples", force=False, vars=vars, dir_filter_function=pycache_dir_filter) # Re-generate examples Qt resource files for Python 3 # compatibility if sys.version_info[0] == 3: examples_path = "{st_build_dir}/{st_package_name}/examples".format( **vars) pyside_rcc_path = "{install_dir}/bin/rcc.exe".format( **vars) pyside_rcc_options = ['-g', 'python'] regenerate_qt_resources(examples_path, pyside_rcc_path, pyside_rcc_options) if vars['ssl_libs_dir']: # /* -> /{st_package_name}/openssl copydir("{ssl_libs_dir}", "{st_build_dir}/{st_package_name}/openssl", filter=[ "libeay32.dll", "ssleay32.dll"], force=False, vars=vars) if config.is_internal_shiboken_module_build(): # The C++ std library dlls need to be packaged with the # shiboken module, because libshiboken uses C++ code. copy_msvc_redist_files(vars, "{build_dir}/msvc_redist".format(**vars)) if config.is_internal_pyside_build() or config.is_internal_shiboken_generator_build(): copy_qt_artifacts(self, copy_pdbs, vars) copy_msvc_redist_files(vars, "{build_dir}/msvc_redist".format(**vars)) def copy_msvc_redist_files(vars, redist_target_path): # MSVC redistributable file list. msvc_redist = [ "concrt140.dll", "msvcp140.dll", "ucrtbase.dll", "vcamp140.dll", "vccorlib140.dll", "vcomp140.dll", "vcruntime140.dll", "vcruntime140_1.dll", "msvcp140_1.dll", "msvcp140_2.dll", "msvcp140_codecvt_ids.dll" ] # Make a directory where the files should be extracted. if not os.path.exists(redist_target_path): os.makedirs(redist_target_path) # Extract Qt dependency dlls when building on Qt CI. in_coin = os.environ.get('COIN_LAUNCH_PARAMETERS', None) if in_coin is not None: redist_url = "http://download.qt.io/development_releases/prebuilt/vcredist/" zip_file = "pyside_qt_deps_64_2019.7z" if "{target_arch}".format(**vars) == "32": zip_file = "pyside_qt_deps_32_2019.7z" download_and_extract_7z(redist_url + zip_file, redist_target_path) else: print("Qt dependency DLLs (MSVC redist) will not be downloaded and extracted.") copydir(redist_target_path, "{st_build_dir}/{st_package_name}", filter=msvc_redist, recursive=False, vars=vars) def copy_qt_artifacts(self, copy_pdbs, vars): built_modules = self.get_built_pyside_config(vars)['built_modules'] constrain_modules = None copy_plugins = True copy_qml = True copy_translations = True copy_qt_conf = True copy_qt_permanent_artifacts = True copy_msvc_redist = False copy_clang = False if config.is_internal_shiboken_generator_build(): constrain_modules = ["Core", "Network", "Xml", "XmlPatterns"] copy_plugins = False copy_qml = False copy_translations = False copy_qt_conf = False copy_qt_permanent_artifacts = False copy_msvc_redist = True copy_clang = True # /bin/*.dll and Qt *.exe -> /{st_package_name} qt_artifacts_permanent = [ "opengl*.dll", "d3d*.dll", "designer.exe", "linguist.exe", "lrelease.exe", "lupdate.exe", "lconvert.exe", "qtdiag.exe" ] # Choose which EGL library variants to copy. qt_artifacts_egl = [ "libEGL{}.dll", "libGLESv2{}.dll" ] if self.qtinfo.build_type != 'debug_and_release': egl_suffix = '*' elif self.debug: egl_suffix = 'd' else: egl_suffix = '' qt_artifacts_egl = [a.format(egl_suffix) for a in qt_artifacts_egl] artifacts = [] if copy_qt_permanent_artifacts: artifacts += qt_artifacts_permanent artifacts += qt_artifacts_egl if copy_msvc_redist: # The target path has to be qt_bin_dir at the moment, # because the extracted archive also contains the opengl32sw # and the d3dcompiler dlls, which are copied not by this # function, but by the copydir below. copy_msvc_redist_files(vars, "{qt_bin_dir}".format(**vars)) if artifacts: copydir("{qt_bin_dir}", "{st_build_dir}/{st_package_name}", filter=artifacts, recursive=False, vars=vars) # /bin/*.dll and Qt *.pdbs -> /{st_package_name} part two # File filter to copy only debug or only release files. if constrain_modules: qt_dll_patterns = ["Qt5" + x + "{}.dll" for x in constrain_modules] if copy_pdbs: qt_dll_patterns += ["Qt5" + x + "{}.pdb" for x in constrain_modules] else: qt_dll_patterns = ["Qt5*{}.dll", "lib*{}.dll"] if copy_pdbs: qt_dll_patterns += ["Qt5*{}.pdb", "lib*{}.pdb"] def qt_build_config_filter(patterns, file_name, file_full_path): release = [a.format('') for a in patterns] debug = [a.format('d') for a in patterns] # If qt is not a debug_and_release build, that means there # is only one set of shared libraries, so we can just copy # them. if self.qtinfo.build_type != 'debug_and_release': if filter_match(file_name, release): return True return False # In debug_and_release case, choosing which files to copy # is more difficult. We want to copy only the files that # match the PySide2 build type. So if PySide2 is built in # debug mode, we want to copy only Qt debug libraries # (ending with "d.dll"). Or vice versa. The problem is that # some libraries have "d" as the last character of the # actual library name (for example Qt5Gamepad.dll and # Qt5Gamepadd.dll). So we can't just match a pattern ending # in "d". Instead we check if there exists a file with the # same name plus an additional "d" at the end, and using # that information we can judge if the currently processed # file is a debug or release file. # e.g. ["Qt5Cored", ".dll"] file_split = os.path.splitext(file_name) file_base_name = file_split[0] file_ext = file_split[1] # e.g. "/home/work/qt/qtbase/bin" file_path_dir_name = os.path.dirname(file_full_path) # e.g. "Qt5Coredd" maybe_debug_name = "{}d".format(file_base_name) if self.debug: filter = debug def predicate(path): return not os.path.exists(path) else: filter = release def predicate(path): return os.path.exists(path) # e.g. "/home/work/qt/qtbase/bin/Qt5Coredd.dll" other_config_path = os.path.join(file_path_dir_name, maybe_debug_name + file_ext) if (filter_match(file_name, filter) and predicate(other_config_path)): return True return False qt_dll_filter = functools.partial(qt_build_config_filter, qt_dll_patterns) copydir("{qt_bin_dir}", "{st_build_dir}/{st_package_name}", file_filter_function=qt_dll_filter, recursive=False, vars=vars) if copy_plugins: # /plugins/* -> /{st_package_name}/plugins plugin_dll_patterns = ["*{}.dll"] pdb_pattern = "*{}.pdb" if copy_pdbs: plugin_dll_patterns += [pdb_pattern] plugin_dll_filter = functools.partial(qt_build_config_filter, plugin_dll_patterns) copydir("{qt_plugins_dir}", "{st_build_dir}/{st_package_name}/plugins", file_filter_function=plugin_dll_filter, vars=vars) if copy_translations: # /translations/* -> /{st_package_name}/translations copydir("{qt_translations_dir}", "{st_build_dir}/{st_package_name}/translations", filter=["*.qm", "*.pak"], force=False, vars=vars) if copy_qml: # /qml/* -> /{st_package_name}/qml qml_dll_patterns = ["*{}.dll"] qml_ignore_patterns = qml_dll_patterns + [pdb_pattern] qml_ignore = [a.format('') for a in qml_ignore_patterns] # Copy all files that are not dlls and pdbs (.qml, qmldir). copydir("{qt_qml_dir}", "{st_build_dir}/{st_package_name}/qml", ignore=qml_ignore, force=False, recursive=True, vars=vars) if copy_pdbs: qml_dll_patterns += [pdb_pattern] qml_dll_filter = functools.partial(qt_build_config_filter, qml_dll_patterns) # Copy all dlls (and possibly pdbs). copydir("{qt_qml_dir}", "{st_build_dir}/{st_package_name}/qml", file_filter_function=qml_dll_filter, force=False, recursive=True, vars=vars) if self.is_webengine_built(built_modules): copydir("{qt_prefix_dir}/resources", "{st_build_dir}/{st_package_name}/resources", filter=None, recursive=False, vars=vars) filter = 'QtWebEngineProcess{}.exe'.format( 'd' if self.debug else '') copydir("{qt_bin_dir}", "{st_build_dir}/{st_package_name}", filter=[filter], recursive=False, vars=vars) if copy_qt_conf: # Copy the qt.conf file to prefix dir. copyfile("{build_dir}/pyside2/{st_package_name}/qt.conf", "{st_build_dir}/{st_package_name}", vars=vars) if copy_clang: self.prepare_standalone_clang(is_win=True) build_scripts/qp5_tool.py000066400000000000000000000340251376617013100160510ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2019 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from __future__ import print_function from argparse import ArgumentParser, RawTextHelpFormatter import datetime from enum import Enum import os import re import subprocess import sys import time import warnings DESC = """ Utility script for working with Qt for Python. Feel free to extend! Typical Usage: Update and build a repository: python qp5_tool -p -b qp5_tool.py uses a configuration file "%CONFIGFILE%" in the format key=value. It is possible to use repository-specific values by adding a key postfixed by a dash and the repository folder base name, eg: Modules-pyside-setup512=Core,Gui,Widgets,Network,Test Configuration keys: Acceleration Incredibuild or unset BuildArguments Arguments to setup.py Generator Generator to be used for CMake. Currently, only Ninja is supported. Jobs Number of jobs to be run simultaneously Modules Comma separated list of modules to be built (for --module-subset=) Python Python executable (Use python_d for debug builds on Windows) Arbitrary keys can be defined and referenced by $(name): MinimalModules=Core,Gui,Widgets,Network,Test Modules=$(MinimalModules),Multimedia Modules-pyside-setup-minimal=$(MinimalModules) """ class Acceleration(Enum): NONE = 0 INCREDIBUILD = 1 class BuildMode(Enum): NONE = 0 BUILD = 1 RECONFIGURE = 2 MAKE = 3 DEFAULT_BUILD_ARGS = ['--build-tests', '--skip-docs', '--quiet'] IS_WINDOWS = sys.platform == 'win32' INCREDIBUILD_CONSOLE = 'BuildConsole' if IS_WINDOWS else '/opt/incredibuild/bin/ib_console' # Config file keys ACCELERATION_KEY = 'Acceleration' BUILDARGUMENTS_KEY = 'BuildArguments' GENERATOR_KEY = 'Generator' JOBS_KEY = 'Jobs' MODULES_KEY = 'Modules' PYTHON_KEY = 'Python' DEFAULT_MODULES = "Core,Gui,Widgets,Network,Test,Qml,Quick,Multimedia,MultimediaWidgets" DEFAULT_CONFIG_FILE = "Modules={}\n".format(DEFAULT_MODULES) build_mode = BuildMode.NONE opt_dry_run = False def which(needle): """Perform a path search""" needles = [needle] if IS_WINDOWS: for ext in ("exe", "bat", "cmd"): needles.append("{}.{}".format(needle, ext)) for path in os.environ.get("PATH", "").split(os.pathsep): for n in needles: binary = os.path.join(path, n) if os.path.isfile(binary): return binary return None def command_log_string(args, dir): result = '[{}]'.format(os.path.basename(dir)) for arg in args: result += ' "{}"'.format(arg) if ' ' in arg else ' {}'.format(arg) return result def execute(args): """Execute a command and print to log""" log_string = command_log_string(args, os.getcwd()) print(log_string) if opt_dry_run: return exit_code = subprocess.call(args) if exit_code != 0: raise RuntimeError('FAIL({}): {}'.format(exit_code, log_string)) def run_process_output(args): """Run a process and return its output. Also run in dry_run mode""" std_out = subprocess.Popen(args, universal_newlines=1, stdout=subprocess.PIPE).stdout result = [line.rstrip() for line in std_out.readlines()] std_out.close() return result def run_git(args): """Run git in the current directory and its submodules""" args.insert(0, git) # run in repo execute(args) # run for submodules module_args = [git, "submodule", "foreach"] module_args.extend(args) execute(module_args) def expand_reference(cache_dict, value): """Expand references to other keys in config files $(name) by value.""" pattern = re.compile(r"\$\([^)]+\)") while True: match = pattern.match(value) if not match: break key = match.group(0)[2:-1] value = value[:match.start(0)] + cache_dict[key] + value[match.end(0):] return value def editor(): editor = os.getenv('EDITOR') if not editor: return 'notepad' if IS_WINDOWS else 'vi' editor = editor.strip() if IS_WINDOWS: # Windows: git requires quotes in the variable if editor.startswith('"') and editor.endswith('"'): editor = editor[1:-1] editor = editor.replace('/', '\\') return editor def edit_config_file(): exit_code = -1 try: exit_code = subprocess.call([editor(), config_file]) except Exception as e: reason = str(e) print('Unable to launch: {}: {}'.format(editor(), reason)) return exit_code """ Config file handling, cache and read function """ config_dict = {} def read_config_file(file_name): """Read the config file into config_dict, expanding continuation lines""" global config_dict keyPattern = re.compile(r'^\s*([A-Za-z0-9\_\-]+)\s*=\s*(.*)$') with open(file_name) as f: while True: line = f.readline() if not line: break line = line.rstrip() match = keyPattern.match(line) if match: key = match.group(1) value = match.group(2) while value.endswith('\\'): value = value.rstrip('\\') value += f.readline().rstrip() config_dict[key] = expand_reference(config_dict, value) def read_config(key): """ Read a value from the '$HOME/.qp5_tool' configuration file. When given a key 'key' for the repository directory '/foo/qt-5', check for the repo-specific value 'key-qt5' and then for the general 'key'. """ if not config_dict: read_config_file(config_file) repo_value = config_dict.get(key + '-' + base_dir) return repo_value if repo_value else config_dict.get(key) def read_bool_config(key): value = read_config(key) return value and value in ['1', 'true', 'True'] def read_int_config(key, default=-1): value = read_config(key) return int(value) if value else default def read_acceleration_config(): value = read_config(ACCELERATION_KEY) if value: value = value.lower() if value == 'incredibuild': return Acceleration.INCREDIBUILD return Acceleration.NONE def read_config_build_arguments(): value = read_config(BUILDARGUMENTS_KEY) if value: return re.split(r'\s+', value) return DEFAULT_BUILD_ARGS def read_config_modules_argument(): value = read_config(MODULES_KEY) if value and value != '' and value != 'all': return '--module-subset=' + value return None def read_config_python_binary(): binary = read_config(PYTHON_KEY) if binary: return binary # Use 'python3' unless virtualenv is set use_py3 = (not os.environ.get('VIRTUAL_ENV') and which('python3')) return 'python3' if use_py3 else 'python' def get_config_file(base_name): home = os.getenv('HOME') if IS_WINDOWS: # Set a HOME variable on Windows such that scp. etc. # feel at home (locating .ssh). if not home: home = os.getenv('HOMEDRIVE') + os.getenv('HOMEPATH') os.environ['HOME'] = home user = os.getenv('USERNAME') config_file = os.path.join(os.getenv('APPDATA'), base_name) else: user = os.getenv('USER') config_dir = os.path.join(home, '.config') if os.path.exists(config_dir): config_file = os.path.join(config_dir, base_name) else: config_file = os.path.join(home, '.' + base_name) return config_file def build(target): """Run configure and build steps""" start_time = time.time() arguments = [] acceleration = read_acceleration_config() if not IS_WINDOWS and acceleration == Acceleration.INCREDIBUILD: arguments.append(INCREDIBUILD_CONSOLE) arguments.append('--avoid') # caching, v0.96.74 arguments.extend([read_config_python_binary(), 'setup.py', target]) arguments.extend(read_config_build_arguments()) generator = read_config(GENERATOR_KEY) if generator == 'Ninja': arguments.extend(['--make-spec', 'ninja']) jobs = read_int_config(JOBS_KEY) if jobs > 1: arguments.extend(['-j', str(jobs)]) if build_mode != BuildMode.BUILD: arguments.extend(['--reuse-build', '--ignore-git']) if build_mode != BuildMode.RECONFIGURE: arguments.append('--skip-cmake') modules = read_config_modules_argument() if modules: arguments.append(modules) if IS_WINDOWS and acceleration == Acceleration.INCREDIBUILD: arg_string = ' '.join(arguments) arguments = [INCREDIBUILD_CONSOLE, '/command={}'.format(arg_string)] execute(arguments) elapsed_time = int(time.time() - start_time) print('--- Done({}s) ---'.format(elapsed_time)) def run_tests(): """Run tests redirected into a log file with a time stamp""" logfile_name = datetime.datetime.today().strftime("test_%Y%m%d_%H%M.txt") binary = sys.executable command = '"{}" testrunner.py test > {}'.format(binary, logfile_name) print(command_log_string([command], os.getcwd())) start_time = time.time() result = 0 if opt_dry_run else os.system(command) elapsed_time = int(time.time() - start_time) print('--- Done({}s) ---'.format(elapsed_time)) return result def create_argument_parser(desc): parser = ArgumentParser(description=desc, formatter_class=RawTextHelpFormatter) parser.add_argument('--dry-run', '-d', action='store_true', help='Dry run, print commands') parser.add_argument('--edit', '-e', action='store_true', help='Edit config file') parser.add_argument('--reset', '-r', action='store_true', help='Git reset hard to upstream state') parser.add_argument('--clean', '-c', action='store_true', help='Git clean') parser.add_argument('--pull', '-p', action='store_true', help='Git pull') parser.add_argument('--build', '-b', action='store_true', help='Build (configure + build)') parser.add_argument('--make', '-m', action='store_true', help='Make') parser.add_argument('--no-install', '-n', action='store_true', help='Run --build only, do not install') parser.add_argument('--Make', '-M', action='store_true', help='cmake + Make (continue broken build)') parser.add_argument('--test', '-t', action='store_true', help='Run tests') parser.add_argument('--version', '-v', action='version', version='%(prog)s 1.0') return parser if __name__ == '__main__': git = None base_dir = None config_file = None user = None config_file = get_config_file('qp5_tool.conf') argument_parser = create_argument_parser(DESC.replace('%CONFIGFILE%', config_file)) options = argument_parser.parse_args() opt_dry_run = options.dry_run if options.edit: sys.exit(edit_config_file()) if options.build: build_mode = BuildMode.BUILD elif options.make: build_mode = BuildMode.MAKE elif options.Make: build_mode = BuildMode.RECONFIGURE if build_mode == BuildMode.NONE and not (options.clean or options.reset or options.pull or options.test): argument_parser.print_help() sys.exit(0) git = 'git' if which(git) is None: warnings.warn('Unable to find git', RuntimeWarning) sys.exit(-1) if not os.path.exists(config_file): print('Create initial config file ', config_file, " ..") with open(config_file, 'w') as f: f.write(DEFAULT_CONFIG_FILE.format(' '.join(DEFAULT_BUILD_ARGS))) while not os.path.exists('.gitmodules'): cwd = os.getcwd() if cwd == '/' or (IS_WINDOWS and len(cwd) < 4): warnings.warn('Unable to find git root', RuntimeWarning) sys.exit(-1) os.chdir(os.path.dirname(cwd)) base_dir = os.path.basename(os.getcwd()) if options.clean: run_git(['clean', '-dxf']) if options.reset: run_git(['reset', '--hard', '@{upstream}']) if options.pull: run_git(['pull', '--rebase']) if build_mode != BuildMode.NONE: target = 'build' if options.no_install else 'install' build(target) if options.test: sys.exit(run_tests()) sys.exit(0) build_scripts/qtinfo.py000066400000000000000000000233221376617013100156050ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import os import sys import re import subprocess def _effective_qmake_command(qmake, qt_version): """Check whether qmake path is a link to qtchooser and append the desired Qt version in that case""" result = [qmake] # Looking whether qmake path is a link to qtchooser and whether the link # exists if os.path.islink(qmake) and os.path.lexists(qmake): if not qt_version: print('--qt must be specified when using qtchooser.') sys.exit(-1) # Set -qt=X here. if "qtchooser" in os.readlink(qmake): result.append("-qt={}".format(qt_version)) return result class QtInfo(object): class __QtInfo: # Python singleton def __init__(self): self._qmake_command = None # Dict to cache qmake values. self._query_dict = {} # Dict to cache mkspecs variables. self._mkspecs_dict = {} def setup(self, qmake, qt_version): self._qmake_command = _effective_qmake_command(qmake, qt_version) def get_qmake_command(self): qmake_command_string = self._qmake_command[0] for entry in self._qmake_command[1:]: qmake_command_string += " {}".format(entry) return qmake_command_string def get_version(self): return self.get_property("QT_VERSION") def get_bins_path(self): return self.get_property("QT_INSTALL_BINS") def get_libs_path(self): return self.get_property("QT_INSTALL_LIBS") def get_libs_execs_path(self): return self.get_property("QT_INSTALL_LIBEXECS") def get_plugins_path(self): return self.get_property("QT_INSTALL_PLUGINS") def get_prefix_path(self): return self.get_property("QT_INSTALL_PREFIX") def get_imports_path(self): return self.get_property("QT_INSTALL_IMPORTS") def get_translations_path(self): return self.get_property("QT_INSTALL_TRANSLATIONS") def get_headers_path(self): return self.get_property("QT_INSTALL_HEADERS") def get_docs_path(self): return self.get_property("QT_INSTALL_DOCS") def get_qml_path(self): return self.get_property("QT_INSTALL_QML") def get_macos_deployment_target(self): """ Return value is a macOS version or None. """ return self.get_property("QMAKE_MACOSX_DEPLOYMENT_TARGET") def get_build_type(self): """ Return value is either debug, release, debug_release, or None. """ return self.get_property("BUILD_TYPE") def get_src_dir(self): """ Return path to Qt src dir or None.. """ return self.get_property("QT_INSTALL_PREFIX/src") def get_property(self, prop_name): if not self._query_dict: self._get_query_properties() self._get_other_properties() if prop_name not in self._query_dict: return None return self._query_dict[prop_name] def get_mkspecs_variables(self): return self._mkspecs_dict def _get_qmake_output(self, args_list=[]): assert(self._qmake_command) cmd = self._qmake_command + args_list proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=False) output = proc.communicate()[0] proc.wait() if proc.returncode != 0: return "" if sys.version_info >= (3,): output = str(output, 'ascii').strip() else: output = output.strip() return output def _parse_query_properties(self, process_output): props = {} if not process_output: return props lines = [s.strip() for s in process_output.splitlines()] for line in lines: if line and ':' in line: key, value = line.split(':', 1) props[key] = value return props def _get_query_properties(self): output = self._get_qmake_output(['-query']) self._query_dict = self._parse_query_properties(output) def _parse_qt_build_type(self): key = 'QT_CONFIG' if key not in self._mkspecs_dict: return None qt_config = self._mkspecs_dict[key] if 'debug_and_release' in qt_config: return 'debug_and_release' split = qt_config.split(' ') if 'release' in split and 'debug' in split: return 'debug_and_release' if 'release' in split: return 'release' if 'debug' in split: return 'debug' return None def _get_other_properties(self): # Get the src property separately, because it is not returned by # qmake unless explicitly specified. key = 'QT_INSTALL_PREFIX/src' result = self._get_qmake_output(['-query', key]) self._query_dict[key] = result # Get mkspecs variables and cache them. self._get_qmake_mkspecs_variables() # Get macOS minimum deployment target. key = 'QMAKE_MACOSX_DEPLOYMENT_TARGET' if key in self._mkspecs_dict: self._query_dict[key] = self._mkspecs_dict[key] # Figure out how Qt was built: # debug mode, release mode, or both. build_type = self._parse_qt_build_type() if build_type: self._query_dict['BUILD_TYPE'] = build_type def _get_qmake_mkspecs_variables(self): # Create empty temporary qmake project file. temp_file_name = 'qmake_fake_empty_project.txt' open(temp_file_name, 'a').close() # Query qmake for all of its mkspecs variables. qmake_output = self._get_qmake_output(['-E', temp_file_name]) lines = [s.strip() for s in qmake_output.splitlines()] pattern = re.compile(r"^(.+?)=(.+?)$") for line in lines: found = pattern.search(line) if found: key = found.group(1).strip() value = found.group(2).strip() self._mkspecs_dict[key] = value # We need to clean up after qmake, which always creates a # .qmake.stash file after a -E invocation. qmake_stash_file = os.path.join(os.getcwd(), ".qmake.stash") if os.path.exists(qmake_stash_file): os.remove(qmake_stash_file) # Also clean up the temporary empty project file. if os.path.exists(temp_file_name): os.remove(temp_file_name) version = property(get_version) bins_dir = property(get_bins_path) libs_dir = property(get_libs_path) lib_execs_dir = property(get_libs_execs_path) plugins_dir = property(get_plugins_path) prefix_dir = property(get_prefix_path) qmake_command = property(get_qmake_command) imports_dir = property(get_imports_path) translations_dir = property(get_translations_path) headers_dir = property(get_headers_path) docs_dir = property(get_docs_path) qml_dir = property(get_qml_path) macos_min_deployment_target = property(get_macos_deployment_target) build_type = property(get_build_type) src_dir = property(get_src_dir) _instance = None # singleton helpers def __new__(cls): # __new__ always a classmethod if not QtInfo._instance: QtInfo._instance = QtInfo.__QtInfo() return QtInfo._instance def __getattr__(self, name): return getattr(self._instance, name) def __setattr__(self, name): return setattr(self._instance, name) build_scripts/setup_runner.py000066400000000000000000000170501376617013100170370ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import sys import os import textwrap from setuptools import setup # Import setuptools before distutils import distutils.log as log from build_scripts.config import config from build_scripts.main import get_package_version, get_setuptools_extension_modules from build_scripts.main import cmd_class_dict from build_scripts.options import ADDITIONAL_OPTIONS, OPTION from build_scripts.utils import run_process class SetupRunner(object): def __init__(self, orig_argv): self.invocations_list = [] # Keep the original args around in case we ever need to pass # modified arguments to the sub invocations. self.orig_argv = orig_argv self.sub_argv = list(orig_argv) self.setup_script_dir = os.getcwd() @staticmethod def cmd_line_argument_is_in_args(argument, args): """ Check if command line argument was passed in args. """ return any(arg for arg in list(args) if "--" + argument in arg) @staticmethod def remove_cmd_line_argument_in_args(argument, args): """ Remove command line argument from args. """ return [arg for arg in list(args) if "--" + argument not in arg] @staticmethod def construct_cmd_line_argument(name, value=None): """ Constructs a command line argument given name and value. """ if not value: return "--{}".format(name) return "--{}={}".format(name, value) @staticmethod def construct_internal_build_type_cmd_line_argument(internal_build_type): return SetupRunner.construct_cmd_line_argument("internal-build-type", internal_build_type) def add_setup_internal_invocation(self, build_type, reuse_build=False): """ Enqueues a script sub-invocation to be executed later. """ internal_build_type_arg = self.construct_internal_build_type_cmd_line_argument(build_type) setup_cmd = [sys.executable] + self.sub_argv + [internal_build_type_arg] # Add --reuse-build option if requested and not already present. if reuse_build and not self.cmd_line_argument_is_in_args("reuse-build", self.sub_argv): setup_cmd.append(self.construct_cmd_line_argument("reuse-build")) self.invocations_list.append(setup_cmd) def run_setup(self): """ Decide what kind of build is requested and then execute it. In the top-level invocation case, the script will spawn setup.py again (possibly multiple times). In the internal invocation case, the script will run setuptools.setup(). """ # Prepare initial config. config.init_config(build_type=OPTION["BUILD_TYPE"], internal_build_type=OPTION["INTERNAL_BUILD_TYPE"], cmd_class_dict=cmd_class_dict, package_version=get_package_version(), ext_modules=get_setuptools_extension_modules(), setup_script_dir=self.setup_script_dir, quiet=OPTION["QUIET"]) # This is an internal invocation of setup.py, so start actual # build. if config.is_internal_invocation(): if config.internal_build_type not in config.get_allowed_internal_build_values(): raise RuntimeError("Invalid '{}' option given to --internal-build-type. " .format(config.internal_build_type)) self.run_setuptools_setup() return # This is a top-level invocation of setup.py, so figure out what # modules we will build and depending on that, call setup.py # multiple times with different arguments. if config.build_type not in config.get_allowed_top_level_build_values(): raise RuntimeError("Invalid '{}' option given to --build-type. " .format(config.build_type)) # Build everything: shiboken2, shiboken2-generator and PySide2. help_requested = '--help' in self.sub_argv or '-h' in self.sub_argv if help_requested: self.add_setup_internal_invocation(config.pyside_option_name) elif config.is_top_level_build_all(): self.add_setup_internal_invocation(config.shiboken_module_option_name) # Reuse the shiboken build for the generator package instead # of rebuilding it again. self.add_setup_internal_invocation(config.shiboken_generator_option_name, reuse_build=True) self.add_setup_internal_invocation(config.pyside_option_name) elif config.is_top_level_build_shiboken_module(): self.add_setup_internal_invocation(config.shiboken_module_option_name) elif config.is_top_level_build_shiboken_generator(): self.add_setup_internal_invocation(config.shiboken_generator_option_name) elif config.is_top_level_build_pyside(): self.add_setup_internal_invocation(config.pyside_option_name) for cmd in self.invocations_list: cmd_as_string = " ".join(cmd) log.info("\nRunning setup: {}\n".format(cmd_as_string)) exit_code = run_process(cmd) if exit_code != 0: msg = textwrap.dedent(""" setup.py invocation failed with exit code: {}.\n\n setup.py invocation was: {} """).format(exit_code, cmd_as_string) raise RuntimeError(msg) if help_requested: print(ADDITIONAL_OPTIONS) @staticmethod def run_setuptools_setup(): """ Runs setuptools.setup() once in a single setup.py sub-invocation. """ kwargs = config.setup_kwargs setup(**kwargs) build_scripts/utils.py000066400000000000000000001211031376617013100154410ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# import sys import os import re import stat import errno import shutil import subprocess import fnmatch import itertools import glob # There is no urllib.request in Python2 try: import urllib.request as urllib except ImportError: import urllib import distutils.log as log from distutils.errors import DistutilsSetupError try: WindowsError except NameError: WindowsError = None def filter_match(name, patterns): for pattern in patterns: if pattern is None: continue if fnmatch.fnmatch(name, pattern): return True return False def update_env_path(newpaths): paths = os.environ['PATH'].lower().split(os.pathsep) for path in newpaths: if not path.lower() in paths: log.info("Inserting path '{}' to environment".format(path)) paths.insert(0, path) os.environ['PATH'] = "{}{}{}".format(path, os.pathsep, os.environ['PATH']) def winsdk_setenv(platform_arch, build_type): from distutils.msvc9compiler import VERSION as MSVC_VERSION from distutils.msvc9compiler import Reg from distutils.msvc9compiler import HKEYS from distutils.msvc9compiler import WINSDK_BASE sdk_version_map = { "v6.0a": 9.0, "v6.1": 9.0, "v7.0": 9.0, "v7.0a": 10.0, "v7.1": 10.0 } log.info("Searching Windows SDK with MSVC compiler version {}".format(MSVC_VERSION)) setenv_paths = [] for base in HKEYS: sdk_versions = Reg.read_keys(base, WINSDK_BASE) if sdk_versions: for sdk_version in sdk_versions: installationfolder = Reg.get_value("{}\\{}".format(WINSDK_BASE, sdk_version), "installationfolder") # productversion = Reg.get_value("{}\\{}".format(WINSDK_BASE, sdk_version), # "productversion") setenv_path = os.path.join(installationfolder, os.path.join('bin', 'SetEnv.cmd')) if not os.path.exists(setenv_path): continue if sdk_version not in sdk_version_map: continue if sdk_version_map[sdk_version] != MSVC_VERSION: continue setenv_paths.append(setenv_path) if len(setenv_paths) == 0: raise DistutilsSetupError("Failed to find the Windows SDK with MSVC compiler " "version {}".format(MSVC_VERSION)) for setenv_path in setenv_paths: log.info("Found {}".format(setenv_path)) # Get SDK env (use latest SDK version installed on system) setenv_path = setenv_paths[-1] log.info("Using {} ".format(setenv_path)) build_arch = "/x86" if platform_arch.startswith("32") else "/x64" build_type = "/Debug" if build_type.lower() == "debug" else "/Release" setenv_cmd = [setenv_path, build_arch, build_type] setenv_env = get_environment_from_batch_command(setenv_cmd) setenv_env_paths = os.pathsep.join([setenv_env[k] for k in setenv_env if k.upper() == 'PATH']).split(os.pathsep) setenv_env_without_paths = dict([(k, setenv_env[k]) for k in setenv_env if k.upper() != 'PATH']) # Extend os.environ with SDK env log.info("Initializing Windows SDK env...") update_env_path(setenv_env_paths) for k in sorted(setenv_env_without_paths): v = setenv_env_without_paths[k] log.info("Inserting '{} = {}' to environment".format(k, v)) os.environ[k] = v log.info("Done initializing Windows SDK env") def find_vcdir(version): """ This is the customized version of distutils.msvc9compiler.find_vcvarsall method """ from distutils.msvc9compiler import VS_BASE from distutils.msvc9compiler import Reg vsbase = VS_BASE % version try: productdir = Reg.get_value(r"{}\Setup\VC".format(vsbase), "productdir") except KeyError: productdir = None # trying Express edition if productdir is None: try: from distutils.msvc9compiler import VSEXPRESS_BASE except ImportError: pass else: vsbase = VSEXPRESS_BASE % version try: productdir = Reg.get_value(r"{}\Setup\VC".format(vsbase), "productdir") except KeyError: productdir = None log.debug("Unable to find productdir in registry") if not productdir or not os.path.isdir(productdir): toolskey = "VS{:0.0f}0COMNTOOLS".format(version) toolsdir = os.environ.get(toolskey, None) if toolsdir and os.path.isdir(toolsdir): productdir = os.path.join(toolsdir, os.pardir, os.pardir, "VC") productdir = os.path.abspath(productdir) if not os.path.isdir(productdir): log.debug("{} is not a valid directory".format(productdir)) return None else: log.debug("Env var {} is not set or invalid".format(toolskey)) if not productdir: log.debug("No productdir found") return None return productdir def init_msvc_env(platform_arch, build_type): from distutils.msvc9compiler import VERSION as MSVC_VERSION log.info("Searching MSVC compiler version {}".format(MSVC_VERSION)) vcdir_path = find_vcdir(MSVC_VERSION) if not vcdir_path: raise DistutilsSetupError("Failed to find the MSVC compiler version {} on your " "system.".format(MSVC_VERSION)) else: log.info("Found {}".format(vcdir_path)) log.info("Searching MSVC compiler {} environment init script".format(MSVC_VERSION)) if platform_arch.startswith("32"): vcvars_path = os.path.join(vcdir_path, "bin", "vcvars32.bat") else: vcvars_path = os.path.join(vcdir_path, "bin", "vcvars64.bat") if not os.path.exists(vcvars_path): vcvars_path = os.path.join(vcdir_path, "bin", "amd64", "vcvars64.bat") if not os.path.exists(vcvars_path): vcvars_path = os.path.join(vcdir_path, "bin", "amd64", "vcvarsamd64.bat") if not os.path.exists(vcvars_path): # MSVC init script not found, try to find and init Windows SDK env log.error("Failed to find the MSVC compiler environment init script " "(vcvars.bat) on your system.") winsdk_setenv(platform_arch, build_type) return else: log.info("Found {}".format(vcvars_path)) # Get MSVC env log.info("Using MSVC {} in {}".format(MSVC_VERSION, vcvars_path)) msvc_arch = "x86" if platform_arch.startswith("32") else "amd64" log.info("Getting MSVC env for {} architecture".format(msvc_arch)) vcvars_cmd = [vcvars_path, msvc_arch] msvc_env = get_environment_from_batch_command(vcvars_cmd) msvc_env_paths = os.pathsep.join([msvc_env[k] for k in msvc_env if k.upper() == 'PATH']).split(os.pathsep) msvc_env_without_paths = dict([(k, msvc_env[k]) for k in msvc_env if k.upper() != 'PATH']) # Extend os.environ with MSVC env log.info("Initializing MSVC env...") update_env_path(msvc_env_paths) for k in sorted(msvc_env_without_paths): v = msvc_env_without_paths[k] log.info("Inserting '{} = {}' to environment".format(k, v)) os.environ[k] = v log.info("Done initializing MSVC env") def copyfile(src, dst, force=True, vars=None, force_copy_symlink=False, make_writable_by_owner=False): if vars is not None: src = src.format(**vars) dst = dst.format(**vars) if not os.path.exists(src) and not force: log.info("**Skiping copy file {} to {}. Source does not exists.".format(src, dst)) return if not os.path.islink(src) or force_copy_symlink: log.info("Copying file {} to {}.".format(src, dst)) shutil.copy2(src, dst) if make_writable_by_owner: make_file_writable_by_owner(dst) else: link_target_path = os.path.realpath(src) if os.path.dirname(link_target_path) == os.path.dirname(src): link_target = os.path.basename(link_target_path) link_name = os.path.basename(src) current_directory = os.getcwd() try: target_dir = dst if os.path.isdir(dst) else os.path.dirname(dst) os.chdir(target_dir) if os.path.exists(link_name): os.remove(link_name) log.info("Symlinking {} -> {} in {}.".format(link_name, link_target, target_dir)) os.symlink(link_target, link_name) except OSError: log.error("{} -> {}: Error creating symlink".format(link_name, link_target)) finally: os.chdir(current_directory) else: log.error("{} -> {}: Can only create symlinks within the same " "directory".format(src, link_target_path)) return dst def makefile(dst, content=None, vars=None): if vars is not None: if content is not None: content = content.format(**vars) dst = dst.format(**vars) log.info("Making file {}.".format(dst)) dstdir = os.path.dirname(dst) if not os.path.exists(dstdir): os.makedirs(dstdir) with open(dst, "wt") as f: if content is not None: f.write(content) def copydir(src, dst, filter=None, ignore=None, force=True, recursive=True, vars=None, dir_filter_function=None, file_filter_function=None, force_copy_symlinks=False): if vars is not None: src = src.format(**vars) dst = dst.format(**vars) if filter is not None: for i in range(len(filter)): filter[i] = filter[i].format(**vars) if ignore is not None: for i in range(len(ignore)): ignore[i] = ignore[i].format(**vars) if not os.path.exists(src) and not force: log.info("**Skiping copy tree {} to {}. Source does not exists. " "filter={}. ignore={}.".format(src, dst, filter, ignore)) return [] log.info("Copying tree {} to {}. filter={}. ignore={}.".format(src, dst, filter, ignore)) names = os.listdir(src) results = [] errors = [] for name in names: srcname = os.path.join(src, name) dstname = os.path.join(dst, name) try: if os.path.isdir(srcname): if (dir_filter_function and not dir_filter_function(name, src, srcname)): continue if recursive: results.extend(copydir(srcname, dstname, filter, ignore, force, recursive, vars, dir_filter_function, file_filter_function, force_copy_symlinks)) else: if ((file_filter_function is not None and not file_filter_function(name, srcname)) or (filter is not None and not filter_match(name, filter)) or (ignore is not None and filter_match(name, ignore))): continue if not os.path.exists(dst): os.makedirs(dst) results.append(copyfile(srcname, dstname, True, vars, force_copy_symlinks)) # catch the Error from the recursive copytree so that we can # continue with other files except shutil.Error as err: errors.extend(err.args[0]) except EnvironmentError as why: errors.append((srcname, dstname, str(why))) try: if os.path.exists(dst): shutil.copystat(src, dst) except OSError as why: if WindowsError is not None and isinstance(why, WindowsError): # Copying file access times may fail on Windows pass else: errors.extend((src, dst, str(why))) if errors: raise EnvironmentError(errors) return results def make_file_writable_by_owner(path): current_permissions = stat.S_IMODE(os.lstat(path).st_mode) os.chmod(path, current_permissions | stat.S_IWUSR) def rmtree(dirname, ignore=False): def handle_remove_readonly(func, path, exc): excvalue = exc[1] if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES: os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO) # 0777 func(path) else: raise IOError shutil.rmtree(dirname, ignore_errors=ignore, onerror=handle_remove_readonly) def run_process_output(args, initial_env=None): if initial_env is None: initial_env = os.environ std_out = subprocess.Popen(args, env=initial_env, universal_newlines=1, stdout=subprocess.PIPE).stdout result = [] for raw_line in std_out.readlines(): line = raw_line if sys.version_info >= (3,) else raw_line.decode('utf-8') result.append(line.rstrip()) std_out.close() return result def run_process(args, initial_env=None): """ Run process until completion and return the process exit code. No output is captured. """ command = " ".join([(" " in x and '"{}"'.format(x) or x) for x in args]) log.info("In directory {}:\n\tRunning command: {}".format(os.getcwd(), command)) if initial_env is None: initial_env = os.environ kwargs = {} kwargs['env'] = initial_env exit_code = subprocess.call(args, **kwargs) return exit_code def get_environment_from_batch_command(env_cmd, initial=None): """ Take a command (either a single command or list of arguments) and return the environment created after running that command. Note that if the command must be a batch file or .cmd file, or the changes to the environment will not be captured. If initial is supplied, it is used as the initial environment passed to the child process. """ def validate_pair(ob): try: if not (len(ob) == 2): print("Unexpected result: {}".format(ob)) raise ValueError except: return False return True def consume(iter): try: while True: next(iter) except StopIteration: pass if not isinstance(env_cmd, (list, tuple)): env_cmd = [env_cmd] # construct the command that will alter the environment env_cmd = subprocess.list2cmdline(env_cmd) # create a tag so we can tell in the output when the proc is done tag = 'Done running command' # construct a cmd.exe command to do accomplish this cmd = 'cmd.exe /E:ON /V:ON /s /c "{} && echo "{}" && set"'.format(env_cmd, tag) # launch the process proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, env=initial) # parse the output sent to stdout lines = proc.stdout if sys.version_info[0] > 2: # make sure the lines are strings lines = map(lambda s: s.decode(), lines) # consume whatever output occurs until the tag is reached consume(itertools.takewhile(lambda l: tag not in l, lines)) # define a way to handle each KEY=VALUE line # parse key/values into pairs pairs = map(lambda l: l.rstrip().split('=', 1), lines) # make sure the pairs are valid valid_pairs = filter(validate_pair, pairs) # construct a dictionary of the pairs result = dict(valid_pairs) # let the process finish proc.communicate() return result def regenerate_qt_resources(src, pyside_rcc_path, pyside_rcc_options): names = os.listdir(src) for name in names: srcname = os.path.join(src, name) if os.path.isdir(srcname): regenerate_qt_resources(srcname, pyside_rcc_path, pyside_rcc_options) elif srcname.endswith('.qrc'): # Replace last occurence of '.qrc' in srcname srcname_split = srcname.rsplit('.qrc', 1) dstname = '_rc.py'.join(srcname_split) if os.path.exists(dstname): log.info('Regenerating {} from {}'.format(dstname, os.path.basename(srcname))) run_process([pyside_rcc_path] + pyside_rcc_options + [srcname, '-o', dstname]) def back_tick(cmd, ret_err=False): """ Run command `cmd`, return stdout, or stdout, stderr, return_code if `ret_err` is True. Roughly equivalent to ``check_output`` in Python 2.7 Parameters ---------- cmd : str command to execute ret_err : bool, optional If True, return stderr and return_code in addition to stdout. If False, just return stdout Returns ------- out : str or tuple If `ret_err` is False, return stripped string containing stdout from `cmd`. If `ret_err` is True, return tuple of (stdout, stderr, return_code) where ``stdout`` is the stripped stdout, and ``stderr`` is the stripped stderr, and ``return_code`` is the process exit code. Raises ------ Raises RuntimeError if command returns non-zero exit code when ret_err isn't set. """ proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) out, err = proc.communicate() if not isinstance(out, str): # python 3 out = out.decode() err = err.decode() retcode = proc.returncode if retcode is None and not ret_err: proc.terminate() raise RuntimeError("{} process did not terminate".format(cmd)) if retcode != 0 and not ret_err: raise RuntimeError("{} process returned code {}\n*** {}".format( (cmd, retcode, err))) out = out.strip() if not ret_err: return out return out, err.strip(), retcode MACOS_OUTNAME_RE = re.compile(r'\(compatibility version [\d.]+, current version [\d.]+\)') def macos_get_install_names(libpath): """ Get macOS library install names from library `libpath` using ``otool`` Parameters ---------- libpath : str path to library Returns ------- install_names : list of str install names in library `libpath` """ out = back_tick("otool -L {}".format(libpath)) libs = [line for line in out.split('\n')][1:] return [MACOS_OUTNAME_RE.sub('', lib).strip() for lib in libs] MACOS_RPATH_RE = re.compile(r"path (.+) \(offset \d+\)") def macos_get_rpaths(libpath): """ Get rpath load commands from library `libpath` using ``otool`` Parameters ---------- libpath : str path to library Returns ------- rpaths : list of str rpath values stored in ``libpath`` Notes ----- See ``man dyld`` for more information on rpaths in libraries """ lines = back_tick('otool -l {}'.format(libpath)).split('\n') ctr = 0 rpaths = [] while ctr < len(lines): line = lines[ctr].strip() if line != 'cmd LC_RPATH': ctr += 1 continue assert lines[ctr + 1].strip().startswith('cmdsize') rpath_line = lines[ctr + 2].strip() match = MACOS_RPATH_RE.match(rpath_line) if match is None: raise RuntimeError("Unexpected path line: {}".format(rpath_line)) rpaths.append(match.groups()[0]) ctr += 3 return rpaths def macos_add_rpath(rpath, library_path): back_tick("install_name_tool -add_rpath {} {}".format(rpath, library_path)) def macos_fix_rpaths_for_library(library_path, qt_lib_dir): """ Adds required rpath load commands to given library. This is a necessary post-installation step, to allow loading PySide modules without setting DYLD_LIBRARY_PATH or DYLD_FRAMEWORK_PATH. The CMake rpath commands which are added at build time are used only for testing (make check), and they are stripped once the equivalent of make install is executed (except for shiboken, which currently uses CMAKE_INSTALL_RPATH_USE_LINK_PATH, which might be necessary to remove in the future). Parameters ---------- library_path : str path to library for which to set rpaths. qt_lib_dir : str rpath to installed Qt lib directory. """ install_names = macos_get_install_names(library_path) existing_rpath_commands = macos_get_rpaths(library_path) needs_loader_path = False for install_name in install_names: # Absolute path, skip it. if install_name[0] == '/': continue # If there are dynamic library install names that contain # @rpath tokens, we will provide an rpath load command with the # value of "@loader_path". This will allow loading dependent # libraries from within the same directory as 'library_path'. if install_name[0] == '@': needs_loader_path = True break if needs_loader_path and "@loader_path" not in existing_rpath_commands: macos_add_rpath("@loader_path", library_path) # If the library depends on a Qt library, add an rpath load comment # pointing to the Qt lib directory. macos_add_qt_rpath(library_path, qt_lib_dir, existing_rpath_commands, install_names) def macos_add_qt_rpath(library_path, qt_lib_dir, existing_rpath_commands=[], library_dependencies=[]): """ Adds an rpath load command to the Qt lib directory if necessary Checks if library pointed to by 'library_path' has Qt dependencies, and adds an rpath load command that points to the Qt lib directory (qt_lib_dir). """ if not existing_rpath_commands: existing_rpath_commands = macos_get_rpaths(library_path) # Return early if qt rpath is already present. if qt_lib_dir in existing_rpath_commands: return # Check if any library dependencies are Qt libraries (hacky). if not library_dependencies: library_dependencies = macos_get_install_names(library_path) needs_qt_rpath = False for library in library_dependencies: if 'Qt' in library: needs_qt_rpath = True break if needs_qt_rpath: macos_add_rpath(qt_lib_dir, library_path) # Find an executable specified by a glob pattern ('foo*') in the OS path def find_glob_in_path(pattern): result = [] if sys.platform == 'win32': pattern += '.exe' for path in os.environ.get('PATH', '').split(os.pathsep): for match in glob.glob(os.path.join(path, pattern)): result.append(match) return result # Locate the most recent version of llvm_config in the path. def find_llvm_config(): version_re = re.compile(r'(\d+)\.(\d+)\.(\d+)') result = None last_version_string = '000000' for llvm_config in find_glob_in_path('llvm-config*'): try: output = run_process_output([llvm_config, '--version']) if output: match = version_re.match(output[0]) if match: version_string = "{:02d}{:02d}{:02d}".format(int(match.group(1)), int(match.group(2)), int(match.group(3))) if (version_string > last_version_string): result = llvm_config last_version_string = version_string except OSError: pass return result # Add Clang to path for Windows for the shiboken ApiExtractor tests. # Revisit once Clang is bundled with Qt. def detect_clang(): source = 'LLVM_INSTALL_DIR' clang_dir = os.environ.get(source, None) if not clang_dir: source = 'CLANG_INSTALL_DIR' clang_dir = os.environ.get(source, None) if not clang_dir: source = find_llvm_config() try: if source is not None: output = run_process_output([source, '--prefix']) if output: clang_dir = output[0] except OSError: pass if clang_dir: arch = '64' if sys.maxsize > 2 ** 31 - 1 else '32' clang_dir = clang_dir.replace('_ARCH_', arch) return (clang_dir, source) _7z_binary = None def download_and_extract_7z(fileurl, target): """ Downloads 7z file from fileurl and extract to target """ info = "" localfile = None for i in range(1, 10): try: print("Downloading fileUrl {}, attempt #{}".format(fileurl, i)) localfile, info = urllib.urlretrieve(fileurl) break except: pass if not localfile: print("Error downloading {} : {}".format(fileurl, info)) raise RuntimeError(' Error downloading {}'.format(fileurl)) try: global _7z_binary outputDir = "-o{}".format(target) if not _7z_binary: if sys.platform == 'win32': candidate = 'c:\\Program Files\\7-Zip\\7z.exe' if os.path.exists(candidate): _7z_binary = candidate if not _7z_binary: _7z_binary = '7z' print("calling {} x {} {}".format(_7z_binary, localfile, outputDir)) subprocess.call([_7z_binary, "x", "-y", localfile, outputDir]) except: raise RuntimeError(' Error extracting {}'.format(localfile)) def split_and_strip(sinput): lines = [s.strip() for s in sinput.splitlines()] return lines def ldd_get_dependencies(executable_path): """ Returns a dictionary of dependencies that `executable_path` depends on. The keys are library names and the values are the library paths. """ output = ldd(executable_path) lines = split_and_strip(output) pattern = re.compile(r"\s*(.*?)\s+=>\s+(.*?)\s+\(.*\)") dependencies = {} for line in lines: match = pattern.search(line) if match: dependencies[match.group(1)] = match.group(2) return dependencies def ldd_get_paths_for_dependencies(dependencies_regex, executable_path=None, dependencies=None): """ Returns file paths to shared library dependencies that match given `dependencies_regex` against given `executable_path`. The function retrieves the list of shared library dependencies using ld.so for the given `executable_path` in order to search for libraries that match the `dependencies_regex`, and then returns a list of absolute paths of the matching libraries. If no matching library is found in the list of dependencies, an empty list is returned. """ if not dependencies and not executable_path: return None if not dependencies: dependencies = ldd_get_dependencies(executable_path) pattern = re.compile(dependencies_regex) paths = [] for key in dependencies: match = pattern.search(key) if match: paths.append(dependencies[key]) return paths def ldd(executable_path): """ Returns ld.so output of shared library dependencies for given `executable_path`. This is a partial port of /usr/bin/ldd from bash to Python. The dependency list is retrieved by setting the LD_TRACE_LOADED_OBJECTS=1 environment variable, and executing the given path via the dynamic loader ld.so. Only works on Linux. The port is required to make this work on systems that might not have ldd. This is because ldd (on Ubuntu) is shipped in the libc-bin package that, which might have a minuscule percentage of not being installed. Parameters ---------- executable_path : str path to executable or shared library. Returns ------- output : str the raw output retrieved from the dynamic linker. """ chosen_rtld = None # List of ld's considered by ldd on Ubuntu (here's hoping it's the # same on all distros). rtld_list = ["/lib/ld-linux.so.2", "/lib64/ld-linux-x86-64.so.2", "/libx32/ld-linux-x32.so.2"] # Choose appropriate runtime dynamic linker. for rtld in rtld_list: if os.path.isfile(rtld) and os.access(rtld, os.X_OK): (_, _, code) = back_tick(rtld, True) # Code 127 is returned by ld.so when called without any # arguments (some kind of sanity check I guess). if code == 127: (_, _, code) = back_tick("{} --verify {}".format(rtld, executable_path), True) # Codes 0 and 2 mean given executable_path can be # understood by ld.so. if code in [0, 2]: chosen_rtld = rtld break if not chosen_rtld: raise RuntimeError("Could not find appropriate ld.so to query for dependencies.") # Query for shared library dependencies. rtld_env = "LD_TRACE_LOADED_OBJECTS=1" rtld_cmd = "{} {} {}".format(rtld_env, chosen_rtld, executable_path) (out, _, return_code) = back_tick(rtld_cmd, True) if return_code == 0: return out else: raise RuntimeError("ld.so failed to query for dependent shared " "libraries of {} ".format(executable_path)) def find_files_using_glob(path, pattern): """ Returns list of files that matched glob `pattern` in `path`. """ final_pattern = os.path.join(path, pattern) maybe_files = glob.glob(final_pattern) return maybe_files def find_qt_core_library_glob(lib_dir): """ Returns path to the QtCore library found in `lib_dir`. """ maybe_file = find_files_using_glob(lib_dir, "libQt5Core.so.?") if len(maybe_file) == 1: return maybe_file[0] return None # @TODO: Possibly fix ICU library copying on macOS and Windows. # This would require to implement the equivalent of the custom written # ldd for the specified platforms. # This has less priority because ICU libs are not used in the default # Qt configuration build. def copy_icu_libs(patchelf, destination_lib_dir): """ Copy ICU libraries that QtCore depends on, to given `destination_lib_dir`. """ qt_core_library_path = find_qt_core_library_glob(destination_lib_dir) if not qt_core_library_path or not os.path.exists(qt_core_library_path): raise RuntimeError('QtCore library does not exist at path: {}. ' 'Failed to copy ICU libraries.'.format(qt_core_library_path)) dependencies = ldd_get_dependencies(qt_core_library_path) icu_regex = r"^libicu.+" icu_compiled_pattern = re.compile(icu_regex) icu_required = False for dependency in dependencies: match = icu_compiled_pattern.search(dependency) if match: icu_required = True break if icu_required: paths = ldd_get_paths_for_dependencies(icu_regex, dependencies=dependencies) if not paths: raise RuntimeError("Failed to find the necessary ICU libraries required by QtCore.") log.info('Copying the detected ICU libraries required by QtCore.') if not os.path.exists(destination_lib_dir): os.makedirs(destination_lib_dir) for path in paths: basename = os.path.basename(path) destination = os.path.join(destination_lib_dir, basename) copyfile(path, destination, force_copy_symlink=True) # Patch the ICU libraries to contain the $ORIGIN rpath # value, so that only the local package libraries are used. linux_set_rpaths(patchelf, destination, '$ORIGIN') # Patch the QtCore library to find the copied over ICU libraries # (if necessary). log.info("Checking if QtCore library needs a new rpath to make it work with ICU libs.") rpaths = linux_get_rpaths(qt_core_library_path) if not rpaths or not rpaths_has_origin(rpaths): log.info('Patching QtCore library to contain $ORIGIN rpath.') rpaths.insert(0, '$ORIGIN') new_rpaths_string = ":".join(rpaths) linux_set_rpaths(patchelf, qt_core_library_path, new_rpaths_string) def linux_run_read_elf(executable_path): cmd = "readelf -d {}".format(executable_path) (out, err, code) = back_tick(cmd, True) if code != 0: raise RuntimeError("Running `readelf -d {}` failed with error " "output:\n {}. ".format(executable_path, err)) lines = split_and_strip(out) return lines def linux_set_rpaths(patchelf, executable_path, rpath_string): """ Patches the `executable_path` with a new rpath string. """ cmd = [patchelf, '--set-rpath', rpath_string, executable_path] if run_process(cmd) != 0: raise RuntimeError("Error patching rpath in {}".format(executable_path)) def linux_get_dependent_libraries(executable_path): """ Returns a list of libraries that executable_path depends on. """ lines = linux_run_read_elf(executable_path) pattern = re.compile(r"^.+?\(NEEDED\).+?\[(.+?)\]$") library_lines = [] for line in lines: match = pattern.search(line) if match: library_line = match.group(1) library_lines.append(library_line) return library_lines def linux_get_rpaths(executable_path): """ Returns a list of run path values embedded in the executable or just an empty list. """ lines = linux_run_read_elf(executable_path) pattern = re.compile(r"^.+?\(RUNPATH\).+?\[(.+?)\]$") rpath_line = None for line in lines: match = pattern.search(line) if match: rpath_line = match.group(1) break rpaths = [] if rpath_line: rpaths = rpath_line.split(':') return rpaths def rpaths_has_origin(rpaths): """ Return True if the specified list of rpaths has an "$ORIGIN" value (aka current dir). """ if not rpaths: return False pattern = re.compile(r"^\$ORIGIN(/)?$") for rpath in rpaths: match = pattern.search(rpath) if match: return True return False def linux_needs_qt_rpath(executable_path): """ Returns true if library_path depends on Qt libraries. """ dependencies = linux_get_dependent_libraries(executable_path) # Check if any library dependencies are Qt libraries (hacky). needs_qt_rpath = False for dep in dependencies: if 'Qt' in dep: needs_qt_rpath = True break return needs_qt_rpath def linux_fix_rpaths_for_library(patchelf, executable_path, qt_rpath, override=False): """ Adds or overrides required rpaths in given executable / library. """ rpaths = ['$ORIGIN/'] existing_rpaths = [] if not override: existing_rpaths = linux_get_rpaths(executable_path) rpaths.extend(existing_rpaths) if linux_needs_qt_rpath(executable_path) and qt_rpath not in existing_rpaths: rpaths.append(qt_rpath) rpaths_string = ':'.join(rpaths) linux_set_rpaths(patchelf, executable_path, rpaths_string) def memoize(function): """ Decorator to wrap a function with a memoizing callable. It returns cached values when the wrapped function is called with the same arguments. """ memo = {} def wrapper(*args): if args in memo: return memo[args] else: rv = function(*args) memo[args] = rv return rv return wrapper def get_python_dict(python_script_path): try: with open(python_script_path) as f: python_dict = {} code = compile(f.read(), python_script_path, 'exec') exec(code, {}, python_dict) return python_dict except IOError as e: print("get_python_dict: Couldn't get dict from python " "file: {}.".format(python_script_path)) raise def install_pip_package_from_url_specifier(env_pip, url, upgrade=True): args = [env_pip, "install", url] if upgrade: args.append("--upgrade") args.append(url) run_instruction(args, "Failed to install {}".format(url)) def install_pip_dependencies(env_pip, packages, upgrade=True): for p in packages: args = [env_pip, "install"] if upgrade: args.append("--upgrade") args.append(p) run_instruction(args, "Failed to install {}".format(p)) def get_qtci_virtualEnv(python_ver, host, hostArch, targetArch): _pExe = "python" _env = "env{}".format(str(python_ver)) env_python = _env + "/bin/python" env_pip = _env + "/bin/pip" if host == "Windows": print("New virtualenv to build {} in {} host".format(targetArch, hostArch)) _pExe = "python.exe" # With windows we are creating building 32-bit target in 64-bit host if hostArch == "X86_64" and targetArch == "X86": if python_ver.startswith("3"): var = "PYTHON" + python_ver + "-32_PATH" print("Try to find python from {} env variable".format(var)) _path = os.getenv(var, "") _pExe = os.path.join(_path, "python.exe") if not os.path.isfile(_pExe): print("Can't find python.exe from {}, using default python3".format(_pExe)) _pExe = os.path.join(os.getenv("PYTHON3_32_PATH"), "python.exe") else: _pExe = os.path.join(os.getenv("PYTHON2_32_PATH"), "python.exe") else: if python_ver.startswith("3"): var = "PYTHON" + python_ver + "-64_PATH" print("Try to find python from {} env variable".format(var)) _path = os.getenv(var, "") _pExe = os.path.join(_path, "python.exe") if not os.path.isfile(_pExe): print("Can't find python.exe from {}, using default python3".format(_pExe)) _pExe = os.path.join(os.getenv("PYTHON3_PATH"), "python.exe") env_python = _env + "\\Scripts\\python.exe" env_pip = _env + "\\Scripts\\pip.exe" else: if python_ver == "3": _pExe = "python3" return(_pExe, _env, env_pip, env_python) def run_instruction(instruction, error, initial_env=None): if initial_env is None: initial_env = os.environ print("Running Coin instruction: {}".format(' '.join(str(e) for e in instruction))) result = subprocess.call(instruction, env=initial_env) if result != 0: print("ERROR : {}".format(error)) exit(result) def acceptCITestConfiguration(hostOS, hostOSVer, targetArch, compiler): # Disable unsupported CI configs for now # NOTE: String must match with QT CI's storagestruct thrift if (hostOSVer in ["WinRT_10", "WebAssembly", "Ubuntu_18_04", "Android_ANY"] or hostOSVer.startswith("SLES_")): print("Disabled {} from Coin configuration".format(hostOSVer)) return False # With 5.11 CI will create two sets of release binaries, # one with msvc 2015 and one with msvc 2017 # we shouldn't release the 2015 version. # BUT, 32 bit build is done only on msvc 2015... if compiler in ["MSVC2015"] and targetArch in ["X86_64"]: print("Disabled {} to {} from Coin configuration".format(compiler, targetArch)) return False return True def get_ci_qmake_path(ci_install_dir, ci_host_os): qmake_path = "--qmake={}".format(ci_install_dir) if ci_host_os == "MacOS": return qmake_path + "/bin/qmake" elif ci_host_os == "Windows": return qmake_path + "\\bin\\qmake.exe" else: return qmake_path + "/bin/qmake" build_scripts/wheel_override.py000066400000000000000000000222411376617013100173070ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# wheel_module_exists = False import os import sys from .options import DistUtilsCommandMixin, OPTION from distutils import log as logger from email.generator import Generator from .wheel_utils import get_package_version, get_qt_version, macos_plat_name try: from distutils import log as logger from wheel.bdist_wheel import bdist_wheel as _bdist_wheel from wheel.bdist_wheel import safer_name as _safer_name from wheel.bdist_wheel import get_abi_tag, get_platform from packaging import tags from wheel import __version__ as wheel_version wheel_module_exists = True except Exception as e: _bdist_wheel, wheel_version = type, '' # dummy to make class statement happy print('***** Exception while trying to prepare bdist_wheel override class: {}. ' 'Skipping wheel overriding.'.format(e)) def get_bdist_wheel_override(): return PysideBuildWheel if wheel_module_exists else None class PysideBuildWheel(_bdist_wheel, DistUtilsCommandMixin): user_options = (_bdist_wheel.user_options + DistUtilsCommandMixin.mixin_user_options if wheel_module_exists else None) def __init__(self, *args, **kwargs): self._package_version = None _bdist_wheel.__init__(self, *args, **kwargs) DistUtilsCommandMixin.__init__(self) def finalize_options(self): DistUtilsCommandMixin.mixin_finalize_options(self) if sys.platform == 'darwin': # Override the platform name to contain the correct # minimum deployment target. # This is used in the final wheel name. self.plat_name = macos_plat_name() # When limited API is requested, notify bdist_wheel to # create a properly named package. limited_api_enabled = (OPTION["LIMITED_API"] == 'yes' and sys.version_info[0] >= 3) if limited_api_enabled: self.py_limited_api = "cp35.cp36.cp37.cp38.cp39" self._package_version = get_package_version() _bdist_wheel.finalize_options(self) @property def wheel_dist_name(self): # Slightly modified version of wheel's wheel_dist_name # method, to add the Qt version as well. # Example: # PySide2-5.6-5.6.4-cp27-cp27m-macosx_10_10_intel.whl # The PySide2 version is "5.6". # The Qt version built against is "5.6.4". wheel_version = "{}-{}".format(self._package_version, get_qt_version()) components = (_safer_name(self.distribution.get_name()), wheel_version) if self.build_number: components += (self.build_number,) return '-'.join(components) # Copy of get_tag from bdist_wheel.py, to allow setting a # multi-python impl tag, by removing an assert. Otherwise we # would have to rename wheels manually for limited api # packages. Also we set "none" abi tag on Windows, because # pip does not yet support "abi3" tag, leading to # installation failure when tried. def get_tag(self): # bdist sets self.plat_name if unset, we should only use it for purepy # wheels if the user supplied it. if self.plat_name_supplied: plat_name = self.plat_name elif self.root_is_pure: plat_name = 'any' else: # macosx contains system version in platform name so need special handle if self.plat_name and not self.plat_name.startswith("macosx"): plat_name = self.plat_name else: # on macosx always limit the platform name to comply with any # c-extension modules in bdist_dir, since the user can specify # a higher MACOSX_DEPLOYMENT_TARGET via tools like CMake # on other platforms, and on macosx if there are no c-extension # modules, use the default platform name. plat_name = get_platform(self.bdist_dir) if plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize == 2147483647: plat_name = 'linux_i686' # To allow uploading to pypi, we need the wheel name # to contain 'manylinux1'. # The wheel which will be uploaded to pypi will be # built on RHEL7, so it doesn't completely qualify for # manylinux1 support, but it's the minimum requirement # for building Qt. We only enable this for x64 limited # api builds (which are the only ones uploaded to # pypi). # TODO: Add actual distro detection, instead of # relying on limited_api option. if (plat_name in ('linux-x86_64', 'linux_x86_64') and sys.maxsize > 2147483647 and (self.py_limited_api or sys.version_info[0] == 2)): plat_name = 'manylinux1_x86_64' plat_name = plat_name.replace('-', '_').replace('.', '_') if self.root_is_pure: if self.universal: impl = 'py2.py3' else: impl = self.python_tag tag = (impl, 'none', plat_name) else: impl_name = tags.interpreter_name() impl_ver = tags.interpreter_version() impl = impl_name + impl_ver # We don't work on CPython 3.1, 3.0. if self.py_limited_api and (impl_name + impl_ver).startswith('cp3'): impl = self.py_limited_api abi_tag = "abi3" if sys.platform != "win32" else "none" else: abi_tag = str(get_abi_tag()).lower() tag = (impl, abi_tag, plat_name) supported_tags = [(t.interpreter, t.abi, t.platform) for t in tags.sys_tags()] # XXX switch to this alternate implementation for non-pure: if (self.py_limited_api) or (plat_name in ('manylinux1_x86_64') and sys.version_info[0] == 2): return tag assert tag in supported_tags, ("would build wheel with unsupported tag {}".format(tag)) return tag # Copy of get_tag from bdist_wheel.py, to write a triplet Tag # only once for the limited_api case. def write_wheelfile(self, wheelfile_base, generator='bdist_wheel (' + wheel_version + ')'): from email.message import Message msg = Message() msg['Wheel-Version'] = '1.0' # of the spec msg['Generator'] = generator msg['Root-Is-Purelib'] = str(self.root_is_pure).lower() if self.build_number is not None: msg['Build'] = self.build_number # Doesn't work for bdist_wininst impl_tag, abi_tag, plat_tag = self.get_tag() # To enable pypi upload we are adjusting the wheel name pypi_ready = (OPTION["LIMITED_API"] and sys.version_info[0] >= 3) or (sys.version_info[0] == 2) def writeTag(impl): for abi in abi_tag.split('.'): for plat in plat_tag.split('.'): msg['Tag'] = '-'.join((impl, abi, plat)) if pypi_ready: writeTag(impl_tag) else: for impl in impl_tag.split('.'): writeTag(impl) wheelfile_path = os.path.join(wheelfile_base, 'WHEEL') logger.info('creating %s', wheelfile_path) with open(wheelfile_path, 'w') as f: Generator(f, maxheaderlen=0).flatten(msg) if not wheel_module_exists: del PysideBuildWheel build_scripts/wheel_utils.py000066400000000000000000000143731376617013100166370ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2020 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from __future__ import print_function import os import time from distutils.errors import DistutilsSetupError from distutils.sysconfig import get_config_var from distutils.util import get_platform from distutils.version import LooseVersion from .options import OPTION from .qtinfo import QtInfo from .utils import memoize, get_python_dict @memoize def get_package_timestamp(): """ In a Coin CI build the returned timestamp will be the Coin integration id timestamp. For regular builds it's just the current timestamp or a user provided one.""" option_value = OPTION["PACKAGE_TIMESTAMP"] return option_value if option_value else int(time.time()) def get_qt_version(): qtinfo = QtInfo() qt_version = qtinfo.version if not qt_version: m = "Failed to query the Qt version with qmake {0}".format(qtinfo.qmake_command) raise DistutilsSetupError(m) if LooseVersion(qtinfo.version) < LooseVersion("5.7"): m = "Incompatible Qt version detected: {}. A Qt version >= 5.7 is required.".format(qt_version) raise DistutilsSetupError(m) return qt_version @memoize def get_package_version(): """ Returns the version string for the PySide2 package. """ setup_script_dir = os.getcwd() pyside_version_py = os.path.join( setup_script_dir, "sources", "pyside2", "pyside_version.py") d = get_python_dict(pyside_version_py) final_version = "{}.{}.{}".format( d['major_version'], d['minor_version'], d['patch_version']) release_version_type = d['release_version_type'] pre_release_version = d['pre_release_version'] if pre_release_version and release_version_type: final_version += release_version_type + pre_release_version if release_version_type.startswith("comm"): final_version += "." + release_version_type # Add the current timestamp to the version number, to suggest it # is a development snapshot build. if OPTION["SNAPSHOT_BUILD"]: final_version += ".dev{}".format(get_package_timestamp()) return final_version def macos_qt_min_deployment_target(): target = QtInfo().macos_min_deployment_target if not target: raise DistutilsSetupError("Failed to query for Qt's QMAKE_MACOSX_DEPLOYMENT_TARGET.") return target @memoize def macos_pyside_min_deployment_target(): """ Compute and validate PySide2 MACOSX_DEPLOYMENT_TARGET value. Candidate sources that are considered: - setup.py provided value - maximum value between minimum deployment target of the Python interpreter and the minimum deployment target of the Qt libraries. If setup.py value is provided, that takes precedence. Otherwise use the maximum of the above mentioned two values. """ python_target = get_config_var('MACOSX_DEPLOYMENT_TARGET') or None qt_target = macos_qt_min_deployment_target() setup_target = OPTION["MACOS_DEPLOYMENT_TARGET"] qt_target_split = [int(x) for x in qt_target.split('.')] if python_target: python_target_split = [int(x) for x in python_target.split('.')] if setup_target: setup_target_split = [int(x) for x in setup_target.split('.')] message = ("Can't set MACOSX_DEPLOYMENT_TARGET value to {} because " "{} was built with minimum deployment target set to {}.") # setup.py provided OPTION["MACOS_DEPLOYMENT_TARGET"] value takes # precedence. if setup_target: if python_target and setup_target_split < python_target_split: raise DistutilsSetupError(message.format(setup_target, "Python", python_target)) if setup_target_split < qt_target_split: raise DistutilsSetupError(message.format(setup_target, "Qt", qt_target)) # All checks clear, use setup.py provided value. return setup_target # Setup.py value not provided, # use same value as provided by Qt. if python_target: maximum_target = '.'.join([str(e) for e in max(python_target_split, qt_target_split)]) else: maximum_target = qt_target return maximum_target @memoize def macos_plat_name(): deployment_target = macos_pyside_min_deployment_target() # Example triple "macosx-10.12-x86_64". plat = get_platform().split("-") plat_name = "{}-{}-{}".format(plat[0], deployment_target, plat[2]) return plat_name coin/000077500000000000000000000000001376617013100120135ustar00rootroot00000000000000coin/instructions/000077500000000000000000000000001376617013100145575ustar00rootroot00000000000000coin/instructions/common_environment.yaml000066400000000000000000000067501376617013100213670ustar00rootroot00000000000000type: Group instructions: - type: EnvironmentVariable variableName: TARGET_ARCHITECTURE variableValue: amd64 enable_if: condition: and conditions: - condition: property property: target.arch equals_value: X86_64 - condition: property property: host.os equals_value: Windows - type: EnvironmentVariable variableName: TARGET_ARCHITECTURE variableValue: amd64_x86 enable_if: condition: and conditions: - condition: property property: target.arch equals_value: X86 - condition: property property: host.os equals_value: Windows - type: EnvironmentVariable variableName: CI_TARGET_ARCHITECTURE variableValue: X86_64 enable_if: condition: property property: target.arch equals_value: X86_64 - type: EnvironmentVariable variableName: CI_TARGET_ARCHITECTURE variableValue: X86 enable_if: condition: property property: target.arch equals_value: X86 - type: EnvironmentVariable variableName: CI_PACKAGING_FEATURE variableValue: "--packaging" enable_if: condition: property property: features contains_value: Packaging - type: EnvironmentVariable variableName: CI_OS variableValue: "MacOS" enable_if: condition: property property: host.os equals_value: MacOS - type: EnvironmentVariable variableName: CI_OS variableValue: "Linux" enable_if: condition: property property: host.os equals_value: Linux - type: EnvironmentVariable variableName: CI_OS variableValue: "Windows" enable_if: condition: property property: host.os equals_value: Windows - type: EnvironmentVariable variableName: MAKEFLAGS variableValue: "" enable_if: condition: property property: host.os equals_value: Windows - type: AppendToEnvironmentVariable variableName: PATH variableValue: ;%CI_JOM_PATH% enable_if: condition: property property: host.os equals_value: Windows - type: PrependToEnvironmentVariable variableName: PATH variableValue: "\\Users\\qt\\work\\install\\bin;" enable_if: condition: property property: host.os equals_value: Windows - type: EnvironmentVariable variableName: ICC64_18_LDLP variableValue: /opt/intel/lib/intel64 enable_if: condition: property property: target.compiler equals_value: ICC_18 - type: EnvironmentVariable variableName: ICC64_18_PATH # Seems a bit hard to maintain variableValue: /opt/intel/compilers_and_libraries_2018.1.163/linux/bin/intel64:/opt/intel/bin enable_if: condition: property property: target.compiler equals_value: ICC_18 - type: AppendToEnvironmentVariable variableName: LD_LIBRARY_PATH variableValue: :/opt/intel/lib/intel64 enable_if: condition: property property: target.compiler equals_value: ICC_18 - type: AppendToEnvironmentVariable variableName: PATH variableValue: ":{{.Env.ICC64_18_PATH}}" enable_if: condition: property property: target.compiler equals_value: ICC_18 coin/instructions/execute_build_instructions.yaml000066400000000000000000000046611376617013100231170ustar00rootroot00000000000000type: Group instructions: - type: ExecuteCommand command: "python -u coin_build_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=/Users/qt/work/install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}} --phase=ALL" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 1200 enable_if: condition: property property: host.os equals_value: MacOS userMessageOnFailure: > Failed to execute build instructions on osx - type: ExecuteCommand command: "python -u coin_build_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=/home/qt/work/install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}} --phase=ALL" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 600 enable_if: condition: property property: host.os equals_value: Linux userMessageOnFailure: > Failed to execute build instructions on Linux - type: ExecuteCommand command: "c:\\users\\qt\\MSVC.bat python -u coin_build_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=\\Users\\qt\\work\\install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}} --phase=BUILD" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 600 enable_if: condition: property property: host.os equals_value: Windows userMessageOnFailure: > Failed to execute build instructions on Windows - type: SignPackage directory: "{{.AgentWorkingDir}}\\pyside" maxTimeInSeconds: 1200 maxTimeBetweenOutput: 1200 enable_if: condition: property property: host.os equals_value: Windows - type: ChangeDirectory directory: "{{.AgentWorkingDir}}\\pyside\\pyside-setup" enable_if: condition: property property: host.os equals_value: Windows - type: ExecuteCommand command: "c:\\users\\qt\\MSVC.bat python -u coin_build_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=\\Users\\qt\\work\\install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}} --phase=WHEEL" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 300 enable_if: condition: property property: host.os equals_value: Windows userMessageOnFailure: > Failed to create wheels for Windows coin/instructions/execute_license_check.yaml000066400000000000000000000020671376617013100217510ustar00rootroot00000000000000type: Group instructions: - type: ChangeDirectory directory: "{{.AgentWorkingDir}}" - type: InstallSourceArchive maxTimeInSeconds: 600 maxTimeBetweenOutput: 600 project: qt/qtbase ref: 5.15 directory: qt/qtbase userMessageOnFailure: > Could not install source archive. Please investigate why. - type: InstallSourceArchive maxTimeInSeconds: 600 maxTimeBetweenOutput: 600 project: qt/qtqa ref: master directory: qt/qtqa-latest userMessageOnFailure: > Could not install source archive. Please investigate why. - type: EnvironmentVariable variableName: QT_MODULE_TO_TEST variableValue: pyside/pyside-setup userMessageOnFailure: > Failed to set environment variable. This should not happen. - type: ExecuteCommand command: perl qt/qtqa-latest/tests/prebuild/license/tst_licenses.pl maxTimeInSeconds: 7200 maxTimeBetweenOutput: 120 userMessageOnFailure: > Failed to run license check script. coin/instructions/execute_test_instructions.yaml000066400000000000000000000032411376617013100227700ustar00rootroot00000000000000type: Group enable_if: condition: property property: features not_contains_value: LicenseCheck instructions: - type: EnvironmentVariable variableName: QTEST_ENVIRONMENT variableValue: "ci" - type: ExecuteCommand command: "python -u coin_test_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=/Users/qt/work/install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}}" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 1200 enable_if: condition: property property: host.os equals_value: MacOS userMessageOnFailure: > Failed to execute test instructions on osx - type: ExecuteCommand command: "python -u coin_test_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=/home/qt/work/install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}}" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 600 enable_if: condition: property property: host.os equals_value: Linux userMessageOnFailure: > Failed to execute test instructions on Linux - type: ExecuteCommand command: "c:\\users\\qt\\MSVC.bat python -u coin_test_instructions.py --os={{.Env.CI_OS}} {{.Env.CI_PACKAGING_FEATURE}} --instdir=\\Users\\qt\\work\\install --targetOs={{.Env.CI_OS}} --hostArch=X86_64 --targetArch={{.Env.CI_TARGET_ARCHITECTURE}}" maxTimeInSeconds: 14400 maxTimeBetweenOutput: 600 enable_if: condition: property property: host.os equals_value: Windows userMessageOnFailure: > Failed to execute test instructions on 64 bit Windows coin/instructions/find_path_to_msvc_compiler.yaml000066400000000000000000000016371376617013100230320ustar00rootroot00000000000000type: Group enable_if: condition: property property: host.os equals_value: Windows instructions: - type: EnvironmentVariable variableName: VC_SCRIPT variableValue: "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2017\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat" enable_if: condition: property property: host.compiler equals_value: MSVC2017 - type: EnvironmentVariable variableName: VC_SCRIPT variableValue: "%ProgramFiles(x86)%\\Microsoft Visual Studio\\2019\\Professional\\VC\\Auxiliary\\Build\\vcvarsall.bat" enable_if: condition: property property: host.compiler equals_value: MSVC2019 - type: WriteFile fileContents: "call \"{{.Env.VC_SCRIPT}}\" {{.Env.TARGET_ARCHITECTURE}} \r\ncmd /c %*" filename: "c:\\users\\qt\\MSVC.bat" fileMode: 420 enable_if: condition: property property: host.os equals_value: Windows coin/instructions/relocate_pyside.yaml000066400000000000000000000032761376617013100206260ustar00rootroot00000000000000type: Group enable_if: condition: property property: features not_contains_value: LicenseCheck instructions: - type: ChangeDirectory directory: "{{.AgentWorkingDir}}/pyside" maxTimeInSeconds: 300 maxTimeBetweenOutput: 120 userMessageOnFailure: > Failed to change to pyside dir - type: ExecuteCommand command: c:\\users\\qt\\MSVC.bat rd /s /q pyside-setup maxTimeInSeconds: 300 maxTimeBetweenOutput: 120 enable_if: condition: property property: host.os equals_value: Windows userMessageOnFailure: > Failed to remove pyside-setup dir - type: ExecuteCommand command: /bin/rm -rf pyside-setup maxTimeInSeconds: 300 maxTimeBetweenOutput: 120 enable_if: condition: property property: host.os not_equals_value: Windows userMessageOnFailure: > Failed to remove pyside-setup dir - type: InstallBinaryArchive relativeStoragePath: "{{.Env.MODULE_ARTIFACTS_RELATIVE_STORAGE_PATH}}/artifacts.tar.gz" directory: "pyside" maxTimeInSeconds: 1200 maxTimeBetweenOutput: 1200 - type: ChangeDirectory directory: "{{.AgentWorkingDir}}\\pyside\\pyside-setup" maxTimeInSeconds: 7200 maxTimeBetweenOutput: 120 enable_if: condition: property property: host.os equals_value: Windows userMessageOnFailure: > Failed to install binary artifacts - type: ChangeDirectory directory: "{{.AgentWorkingDir}}/pyside/pyside-setup" maxTimeInSeconds: 7200 maxTimeBetweenOutput: 120 enable_if: condition: property property: host.os not_equals_value: Windows userMessageOnFailure: > Failed to change to pyside-setup dir coin/module_config.yaml000066400000000000000000000051011376617013100155060ustar00rootroot00000000000000version: 2 accept_configuration: condition: or conditions: - condition: and conditions: - condition: property # No cross compilation property: host.os equals_property: target.os - condition: property # qtnamespace is not supported property: configureArgs not_contains_value: -qtnamespace - condition: property # no-widgets is notsupported property: configureArgs not_contains_value: -no-widgets - condition: property # no-gui is not supported property: configureArgs not_contains_value: -no-gui - condition: property # Following configs are not supported property: target.osVersion not_in_values: [OPENSUSE_13_01, QEMU, WebAssembly, Ubuntu_18_04, SLES_12, SLES_15] - condition: property # MibnGW and msvc2015 are not supported property: target.compiler not_in_values: [Mingw, MSVC2015] - condition: and conditions: - condition: property property: target.osVersion equals_value: Ubuntu_18_04 - condition: property property: features contains_value: LicenseCheck upload_pyside: &upload_pyside type: Group instructions: - type: UploadArtifact archiveDirectory: "{{.AgentWorkingDir}}\\pyside" transferType: UploadModuleBuildArtifact maxTimeInSeconds: 1200 maxTimeBetweenOutput: 1200 enable_if: condition: property property: host.os equals_value: Windows - type: UploadArtifact archiveDirectory: "{{.AgentWorkingDir}}/pyside" transferType: UploadModuleBuildArtifact maxTimeInSeconds: 1200 maxTimeBetweenOutput: 1200 enable_if: condition: property property: host.os not_equals_value: Windows instructions: LicenseCheck: - !include "{{pyside/pyside-setup}}/execute_license_check.yaml" Build: - !include "{{pyside/pyside-setup}}/common_environment.yaml" - !include "{{pyside/pyside-setup}}/find_path_to_msvc_compiler.yaml" - !include "{{pyside/pyside-setup}}/execute_build_instructions.yaml" - *upload_pyside Test: - !include "{{pyside/pyside-setup}}/common_environment.yaml" - !include "{{pyside/pyside-setup}}/find_path_to_msvc_compiler.yaml" - !include "{{pyside/pyside-setup}}/relocate_pyside.yaml" - !include "{{pyside/pyside-setup}}/execute_test_instructions.yaml" coin_build_instructions.py000066400000000000000000000166671376617013100164100ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from build_scripts.options import has_option from build_scripts.options import option_value from build_scripts.utils import install_pip_dependencies from build_scripts.utils import get_qtci_virtualEnv from build_scripts.utils import run_instruction from build_scripts.utils import rmtree from build_scripts.utils import get_python_dict from build_scripts.utils import get_ci_qmake_path import os import datetime import calendar import site import sys # Values must match COIN thrift CI_HOST_OS = option_value("os") CI_TARGET_OS = option_value("targetOs") CI_HOST_ARCH = option_value("hostArch") CI_TARGET_ARCH = option_value("targetArch") CI_HOST_OS_VER = option_value("osVer") CI_ENV_INSTALL_DIR = option_value("instdir") CI_ENV_AGENT_DIR = option_value("agentdir") CI_COMPILER = option_value("compiler") CI_INTEGRATION_ID = option_value("coinIntegrationId") or str(calendar.timegm(datetime.datetime.now().timetuple())) CI_FEATURES = [] _ci_features = option_value("features") if _ci_features is not None: for f in _ci_features.split(', '): CI_FEATURES.append(f) CI_RELEASE_CONF = has_option("packaging") CI_TEST_PHASE = option_value("phase") if CI_TEST_PHASE not in ["ALL", "BUILD", "WHEEL"]: CI_TEST_PHASE = "ALL" def get_current_script_path(): """ Returns the absolute path containing this script. """ try: this_file = __file__ except NameError: this_file = sys.argv[0] this_file = os.path.abspath(this_file) return os.path.dirname(this_file) def is_snapshot_build(): """ Returns True if project needs to be built with --snapshot-build This is true if the version found in pyside_version.py is not a pre-release version (no alphas, betas). This eliminates the need to remove the --snapshot-build option on a per-release branch basis (less things to remember to do for a release). """ setup_script_dir = get_current_script_path() pyside_version_py = os.path.join( setup_script_dir, "sources", "pyside2", "pyside_version.py") d = get_python_dict(pyside_version_py) release_version_type = d['release_version_type'] pre_release_version = d['pre_release_version'] if pre_release_version and release_version_type: return True return False def call_setup(python_ver, phase): print("call_setup") print("python_ver", python_ver) print("phase", phase) _pExe, _env, env_pip, env_python = get_qtci_virtualEnv(python_ver, CI_HOST_OS, CI_HOST_ARCH, CI_TARGET_ARCH) if phase in ["BUILD"]: rmtree(_env, True) # Pinning the virtualenv before creating one run_instruction(["pip", "install", "--user", "virtualenv==20.0.25"], "Failed to pin virtualenv") # installing to user base might not be in PATH by default. env_path = os.path.join(site.USER_BASE, "bin") v_env = os.path.join(env_path, "virtualenv") if sys.platform == "win32": env_path = os.path.join(site.USER_BASE, "Scripts") v_env = os.path.join(env_path, "virtualenv.exe") try: run_instruction([v_env, "--version"], "Using default virtualenv") except Exception as e: v_env = "virtualenv" run_instruction([v_env, "-p", _pExe, _env], "Failed to create virtualenv") # When the 'python_ver' variable is empty, we are using Python 2 # Pip is always upgraded when CI template is provisioned, upgrading it in later phase may cause perm issue run_instruction([env_pip, "install", "-r", "requirements.txt"], "Failed to install dependencies") if sys.platform == "win32": run_instruction([env_pip, "install", "numpy==1.19.3"], "Failed to install numpy 1.19.3") else: run_instruction([env_pip, "install", "numpy"], "Failed to install numpy") cmd = [env_python, "-u", "setup.py"] if phase in ["BUILD"]: cmd += ["build", "--standalone", "--skip-packaging"] elif phase in ["WHEEL"] or CI_RELEASE_CONF: cmd += ["bdist_wheel", "--reuse-build", "--standalone", "--skip-cmake", "--skip-make-install", "--only-package"] cmd += ["--build-tests", "--parallel=4", "--verbose-build"] if python_ver == "3": cmd += ["--limited-api=yes"] if is_snapshot_build(): cmd += ["--snapshot-build"] qmake_path = get_ci_qmake_path(CI_ENV_INSTALL_DIR, CI_HOST_OS) cmd.append(qmake_path) # Due to certain older CMake versions generating very long paths # (at least with CMake 3.6.2) when using the export() function, # pass the shorter paths option on Windows so we don't hit # the path character length limit (260). if CI_HOST_OS == "Windows": cmd += ["--shorter-paths"] cmd += ["--package-timestamp=" + CI_INTEGRATION_ID] env = os.environ run_instruction(cmd, "Failed to run setup.py for build", initial_env=env) def run_build_instructions(phase): # Uses default python, hopefully we have python2 installed on all hosts # Skip building using Python 2 on Windows, because of different MSVC C runtimes (VS2008 vs VS2015+) if CI_HOST_OS != "Windows": call_setup("", phase) # In case of packaging build, we have to build also python3 wheel if CI_RELEASE_CONF and CI_HOST_OS_VER not in ["RHEL_6_6"]: call_setup("3", phase) if __name__ == "__main__": # Remove some environment variables that impact cmake for env_var in ['CC', 'CXX']: if os.environ.get(env_var): del os.environ[env_var] if CI_TEST_PHASE in ["ALL", "BUILD"]: run_build_instructions("BUILD") if CI_TEST_PHASE in ["ALL", "WHEEL"]: run_build_instructions("WHEEL") coin_test_instructions.py000066400000000000000000000126551376617013100162610ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2019 The Qt Company Ltd. ## Contact: https://www.qt.io/licensing/ ## ## This file is part of Qt for Python. ## ## $QT_BEGIN_LICENSE:LGPL$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 3 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL3 included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 3 requirements ## will be met: https://www.gnu.org/licenses/lgpl-3.0.html. ## ## GNU General Public License Usage ## Alternatively, this file may be used under the terms of the GNU ## General Public License version 2.0 or (at your option) the GNU General ## Public license version 3 or any later version approved by the KDE Free ## Qt Foundation. The licenses are as published by the Free Software ## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 ## included in the packaging of this file. Please review the following ## information to ensure the GNU General Public License requirements will ## be met: https://www.gnu.org/licenses/gpl-2.0.html and ## https://www.gnu.org/licenses/gpl-3.0.html. ## ## $QT_END_LICENSE$ ## ############################################################################# from build_scripts.options import has_option from build_scripts.options import option_value from build_scripts.utils import install_pip_dependencies from build_scripts.utils import get_qtci_virtualEnv from build_scripts.utils import run_instruction from build_scripts.utils import rmtree from build_scripts.utils import get_ci_qmake_path import os import site import sys # Values must match COIN thrift CI_HOST_OS = option_value("os") CI_TARGET_OS = option_value("targetOs") CI_HOST_ARCH = option_value("hostArch") CI_TARGET_ARCH = option_value("targetArch") CI_HOST_OS_VER = option_value("osVer") CI_ENV_INSTALL_DIR = option_value("instdir") CI_ENV_AGENT_DIR = option_value("agentdir") or "." CI_COMPILER = option_value("compiler") CI_FEATURES = [] _ci_features = option_value("features") if _ci_features is not None: for f in _ci_features.split(', '): CI_FEATURES.append(f) CI_RELEASE_CONF = has_option("packaging") def call_testrunner(python_ver, buildnro): _pExe, _env, env_pip, env_python = get_qtci_virtualEnv(python_ver, CI_HOST_OS, CI_HOST_ARCH, CI_TARGET_ARCH) rmtree(_env, True) # Pinning the virtualenv before creating one run_instruction(["pip", "install", "--user", "virtualenv==20.0.25"], "Failed to pin virtualenv") # installing to user base might not be in PATH by default. env_path = os.path.join(site.USER_BASE, "bin") v_env = os.path.join(env_path, "virtualenv") if sys.platform == "win32": env_path = os.path.join(site.USER_BASE, "Scripts") v_env = os.path.join(env_path, "virtualenv.exe") try: run_instruction([v_env, "--version"], "Using default virtualenv") except Exception as e: v_env = "virtualenv" run_instruction([v_env, "-p", _pExe, _env], "Failed to create virtualenv") # When the 'python_ver' variable is empty, we are using Python 2 # Pip is always upgraded when CI template is provisioned, upgrading it in later phase may cause perm issue run_instruction([env_pip, "install", "-r", "requirements.txt"], "Failed to install dependencies") if sys.platform == "win32": run_instruction([env_pip, "install", "numpy==1.19.3"], "Failed to install numpy 1.19.3") else: run_instruction([env_pip, "install", "numpy"], "Failed to install numpy") cmd = [env_python, "testrunner.py", "test", "--blacklist", "build_history/blacklist.txt", "--buildno=" + buildnro] run_instruction(cmd, "Failed to run testrunner.py") qmake_path = get_ci_qmake_path(CI_ENV_INSTALL_DIR, CI_HOST_OS) # Try to install built wheels, and build some buildable examples. if CI_RELEASE_CONF: wheel_tester_path = os.path.join("testing", "wheel_tester.py") cmd = [env_python, wheel_tester_path, qmake_path] run_instruction(cmd, "Error while running wheel_tester.py") def run_test_instructions(): # Remove some environment variables that impact cmake for env_var in ['CC', 'CXX']: if os.environ.get(env_var): del os.environ[env_var] os.chdir(CI_ENV_AGENT_DIR) testRun = 0 # We didn't build for Python 2 in win if CI_HOST_OS != "Windows": call_testrunner("", str(testRun)) testRun =+ 1 # We know that second build was with python3 if CI_RELEASE_CONF: # In win machines, there are additional python versions to test with if CI_HOST_OS == "Windows": call_testrunner("3.6.1", str(testRun)) call_testrunner("3.8.1", str(testRun)) else: call_testrunner("3", str(testRun)) if __name__ == "__main__": run_test_instructions() dist/000077500000000000000000000000001376617013100120265ustar00rootroot00000000000000dist/changes-1.2.3000066400000000000000000000370111376617013100140220ustar00rootroot00000000000000Changes ======= 1.2.3 (2014-??-??) ------------------ Major changes ~~~~~~~~~~~~~ PySide-setup ************ - On Linux systems there is no more need to call the post-install script 1.2.2 (2014-04-24) ------------------ Complete list of changes and bug fixes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PySide ****** - Fix PYSIDE-190: QCoreApplication would deadlock on exit if the global QThreadPool.globalInstance() is running a QRunnable with python code - Change GlobalReceiver to explicitly 'use' [dis]connectNotify of the base class in order to avoid hiding these with its own overloads. - Add explicit casts when initializing an int[] using {}'s, as required by C++11 to be "well formed" - Fix PYSIDE-172: multiple rules for file - Use file system encoding instead of assumed 'ascii' when registering qt.conf in Qt resource system Shiboken ******** - Remove rejection lines that cause the sample_list test to fail - Remove protected from samblebinding test - Add parsing of 'noexcept' keyword - Fix function rejections (i.e. support overloads) - Fix building with python 3.3 and 3.4 - Doc: Stop requiring sphinx.ext.refcounting with Sphinx 1.2+ - Fix for containers with 'const' values - Fix compilation issue on OS X 10.9 - Only use fields in PyTypeObject when defining types - Fix buffer overrun processing macro definitions - Fix 'special' include handling - Fix finding container base classes - Refactor and improve added function resolving - Work around MSVC's deficient in libsample/transform.cpp - Fix description of sample/transform unit test - Change wrapping and indent of some code in Handler::startElement to improve consistency - Fix '%#' substitution for # > 9 - Improve dependencies for tests 1.2.1 (2013-08-16) ------------------ Major changes ~~~~~~~~~~~~~ PySide ****** - In memory qt.conf generation and registration Shiboken ******** - Better support for more than 9 arguments to methods - Avoiding a segfault when getting the .name attribute on an enum value with no name PySide-setup ************ - Switched to the new setuptools (v0.9.8) which has been merged with Distribute again and works for Python 2 and 3 with one codebase - Support for building windows binaries with only Windows SDK installed (Visual Studio is no more required) - Removed --msvc-version option. Required msvc compiler version is now resolved from python interpreter version 1.2.0 (2013-07-02) ------------------ Major changes ~~~~~~~~~~~~~ PySide ****** - Fix multiple segfaults and better track the life time of Qt objects - Fix multiple memory leaks Shiboken ******** - Install the shiboken module to site-packages - Fix multiple segfaults PySide-setup ************ - On Windows system, when installing PySide binary distribution via easy_install, there is no more need to call the post-install script - Support for building windows binaries outside of Visual Studio command prompt - Build and package the shiboken docs when sphinx is installed Complete list of changes and bug fixes ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ PySide ****** - Set up PYTHONPATH for tests correctly - Fix potential segfault at shutdown - Fix PYSIDE-61 - Tell Qt to look for qml imports in the PySide package - fix build in C++11 mode - Fix QByteArray memory leak - Ignore QtCore import errors when initializing plugins folder - Preload OpenSSL DLLs on Windows. - Look first in the PySide package for Qt's plugins folder, instead of just in Qt's install or build folder - Add explicit type conversion to fix mingw compile error - Use QObject property to invalidate wrapper before deletion - Invalidate metaObject wrapper before deletion - Fix reference leak on convertion from a C++ map type to Python dict - Change the order of pysitetest and signals directories because signals/disconnect_test.py depends on pysidetest module Shiboken ******** - Removed old logos from html docs - Add missing return on module init error - Don't break -Werror=non-virtual-dtor - Fixing shiboken test for minimal binding test - Decref reference to type object - Fix segfault when using shiboken.delete - Use non-static method def for instance methods - Fix bug introduced when recursive_invalidate was added - fix build in C++11 mode - Prevent infinite recursion in invalidate - Fix possible conflict with garbage collector - Fix possible crash at exit - Fix handling of unsigned long long and provide unittests - Add test to illustrate issue on typedef enum - Use getWrapperForQObject to convert if generating for PySide - Allow compilation without a python shared library - Use parent class's metaObject if wrapper is NULL - Optionally assert on free'd pointer with a valid wrapper - Find python3 libraries when built with pydebug enabled - Fix PYSIDE-108 bug and add example - PYSIDE-83 Fix segfault calling shiboken.dump - Fix and test case for bug PYSIDE-72 - Override all functions with the same name, not just one - Update vector conversion - Add typedef examples to minimal - Add test files back to cmake - Don't use it->second after erasing it - Find function modifications defined in the 2nd+ base class. Fixes bug PYSIDE-54. - Set a default hash function for all ObjectTypes. Fix bug PYSIDE-42. - Fix compilation when there is no libxslt installed on the system. - Fixed resolving of SOABI. SOABI is implemented on Linux, but not on Windows - Don't use inline methods in dllexported classes to keep VC++ happy - Use SpooledTemporaryFile in 2.6+ os.tmpfile() fails on win32 if process doesn't have admin permissions PySide-setup ************ - Support for building windows binaries outside of Visual Studio command prompt - Build and package the shiboken docs when sphinx is installed - Support Ubuntu 13.04 and Fedora 18 - Fixed "develop" setuptools command - Documentation updates - Add --build-tests option to enable building the tests - Add --jom and --jobs options - Add --no-examples option to exclude the examples - Add --relwithdebinfo option to enable a release-with-debug-info build mode - Add --ignore-git option - Add --make-spec option to specify make generator 1.1.2 (2012-08-28) ------------------ Bug fixes ~~~~~~~~~ - During signal emission don't get return type after callback - Invalidate QStandardModel::invisibleRootItem in clear() method - QAbstractItemModel has wrong ownership policy for selectionModel() - Improved QVector to python conversion - Disable docstring generation if tools aren't found. - Fixed some issues compiling PySide using VC++ - Install the shiboken module to site-packages - Fix compilation when there is no libxslt installed on the system. - Set a default hash function for all ObjectTypes. - Fix segfault calling shiboken.dump 1.1.1 (2012-04-19) ------------------ Major changes ~~~~~~~~~~~~~ - Unified toolchain! No more GeneratorRunner and ApiExtractor, now you just need Shiboken to compile PySide. Bug fixes ~~~~~~~~~ - 1105 Spyder fails with HEAD - 1126 Segfault when exception is raised in signalInstanceDisconnect - 1135 SIGSEGV when loading custom widget using QUiLoader when overriding createWidget() - 1041 QAbstractItemModel has wrong ownership policy for selectionModel() - 1086 generatorrunner segfault processing #include - 1110 Concurrency error causes GC heap corruption - 1113 Instantiating QObject in user-defined QML element's constructor crashes if instantiated from QML - 1129 Segmentation fault on close by QStandardItem/QStandardItemModel - 1104 QSettings has problems with long integers - 1108 tests/QtGui/pyside_reload_test.py fails when bytecode writing is disabled - 1138 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception (again) - 1124 QPainter.drawPixmapFragments should take a list as first argument - 1065 Invalid example in QFileDialog documentation - 1092 shiboken names itself a 'generator' - 1094 shiboken doesn't complain about invalid options - 1044 Incorrect call to parent constructor in example - 1139 Crash at exit due to thread state (tstate) being NULL - PYSIDE-41 QModelIndex unhashable 1.1.0 (2012-01-02) ------------------ Major changes ~~~~~~~~~~~~~ - New type converter scheme Bug fixes ~~~~~~~~~ - 1010 Shiboken Cygwin patch - 1034 Error compiling PySide with Python 3.2.2 32bit on Windows - 1040 pyside-uic overwriting attributes before they are being used - 1053 pyside-lupdate used with .pro files can't handle Windows paths that contain spaces - 1060 Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception - 1063 Bug writing to files using "QTextStream + QFile + QTextEdit" on Linux - 1069 QtCore.QDataStream silently fails on writing Python string - 1077 Application exit crash when call QSyntaxHighlighter.document() - 1082 OSX binary links are broken - 1083 winId returns a PyCObject making it impossible to compare two winIds - 1084 Crash (segfault) when writing unicode string on socket - 1091 PixmapFragment and drawPixmapFragments are not bound - 1095 No examples for shiboken tutorial - 1097 QtGui.QShortcut.setKey requires QKeySequence - 1101 Report invalid function signatures in typesystem - 902 Expose Shiboken functionality through a Python module - 969 viewOptions of QAbstractItemView error 1.0.9 (2011-11-29) ------------------ Bug fixes ~~~~~~~~~ - 1058 Strange code in PySide/QtUiTools/glue/plugins.h - 1057 valgrind detected "Conditional jump or move depends on uninitialised value" - 1052 PySideConfig.cmake contains an infinite loop due to missing default for SHIBOKEN_PYTHON_SUFFIX - 1048 QGridLayout.itemAtPosition() crashes when it should return None - 1037 shiboken fails to build against python 3.2 (both normal and -dbg) on i386 (and others) - 1036 Qt.KeyboardModifiers always evaluates to zero - 1033 QDialog.DialogCode instances and return value from \QDialog.exec_ hash to different values - 1031 QState.parentState() or QState.machine() causes python crash at exit - 1029 qmlRegisterType Fails to Increase the Ref Count - 1028 QWidget winId missing - 1016 Calling of Q_INVOKABLE method returning not QVariant is impossible... - 1013 connect to QSqlTableModel.primeInsert() causes crash - 1012 FTBFS with hardening flags enabled - 1011 PySide Cygwin patch - 1010 Shiboken Cygwin patch - 1009 GeneratorRunner Cygwin patch - 1008 ApiExtractor Cygwin patch - 891 ApiExtractor doesn't support doxygen as backend to doc generation. 1.0.8 (2011-10-21) ------------------ Major changes ~~~~~~~~~~~~~ - Experimental Python3.2 support - Qt4.8 beta support Bug fixes ~~~~~~~~~ - 1022 RuntimeError: maximum recursion depth exceeded while getting the str of an object - 1019 Overriding QWidget.show or QWidget.hide do not work - 944 Segfault on QIcon(None).pixmap() 1.0.7 (2011-09-21) ------------------ Bug fixes ~~~~~~~~~ - 996 Missing dependencies for QtWebKit in buildscripts for Fedora - 986 Documentation links - 985 Provide versioned pyside-docs zip file to help packagers - 981 QSettings docs should empathize the behavior changes of value() on different platforms - 902 Expose Shiboken functionality through a Python module - 997 QDeclarativePropertyMap doesn't work. - 994 QIODevice.readData must use qmemcpy instead of qstrncpy - 989 Pickling QColor fails - 987 Disconnecting a signal that has not been connected - 973 shouldInterruptJavaScript slot override is never called - 966 QX11Info.display() missing - 959 can't pass QVariant to the QtWebkit bridge - 1006 Segfault in QLabel init - 1002 Segmentation fault on PySide/Spyder exit - 998 Segfault with Spyder after switching to another app - 995 QDeclarativeView.itemAt returns faulty reference. (leading to SEGFAULT) - 990 Segfault when trying to disconnect a signal that is not connected - 975 Possible memory leak - 991 The __repr__ of various types is broken - 988 The type supplied with currentChanged signal in QTabWidget has changed in 1.0.6 1.0.6 (2011-08-22) ------------------ Major changes ~~~~~~~~~~~~~ - New documentation layout; - Fixed some regressions from the last release (1.0.5); - Optimizations during anonymous connection; Bug fixes ~~~~~~~~~ - 972 anchorlayout.py of graphicsview example raised a unwriteable memory exception when exits - 953 Segfault when QObject is garbage collected after QTimer.singeShot - 951 ComponentComplete not called on QDeclarativeItem subclass - 965 Segfault in QtUiTools.QUiLoader.load - 958 Segmentation fault with resource files - 944 Segfault on QIcon(None).pixmap() - 941 Signals with QtCore.Qt types as arguments has invalid signatures - 964 QAbstractItemView.moveCursor() method is missing - 963 What's This not displaying QTableWidget column header information as in Qt Designer - 961 QColor.__repr__/__str__ should be more pythonic - 960 QColor.__reduce__ is incorrect for HSL colors - 950 implement Q_INVOKABLE - 940 setAttributeArray/setUniformValueArray do not take arrays - 931 isinstance() fails with Signal instances - 928 100's of QGraphicItems with signal connections causes slowdown - 930 Documentation mixes signals and functions. - 923 Make QScriptValue (or QScriptValueIterator) implement the Python iterator protocol - 922 QScriptValue's repr() should give some information about its data - 900 QtCore.Property as decorator - 895 jQuery version is outdated, distribution code de-duplication breaks documentation search - 731 Can't specify more than a single 'since' argument - 983 copy.deepcopy raises SystemError with QColor - 947 NETWORK_ERR during interaction QtWebKit window with server - 873 Deprecated methods could emit DeprecationWarning - 831 PySide docs would have a "Inherited by" list for each class 1.0.5 (2011-07-22) ------------------ Major changes ~~~~~~~~~~~~~ - Widgets present on "ui" files are exported in the root widget, check PySide ML thread for more information[1]; - pyside-uic generate menubars without parent on MacOS plataform; - Signal connection optimizations; Bug fixes ~~~~~~~~~ - 892 Segfault when destructing QWidget and QApplication has event filter installed - 407 Crash while multiple inheriting with QObject and native python class - 939 Shiboken::importModule must verify if PyImport_ImportModule succeeds - 937 missing pid method in QProcess - 927 Segfault on QThread code. - 925 Segfault when passing a QScriptValue as QObject or when using .toVariant() on a QScriptValue - 905 QtGui.QHBoxLayout.setMargin function call is created by pyside-uic, but this is not available in the pyside bindings - 904 Repeatedly opening a QDialog with Qt.WA_DeleteOnClose set crashes PySide - 899 Segfault with 'QVariantList' Property. - 893 Shiboken leak reference in the parent control - 878 Shiboken may generate incompatible modules if a new class is added. - 938 QTemporaryFile JPEG problem - 934 A __getitem__ of QByteArray behaves strange - 929 pkg-config files do not know about Python version tags - 926 qmlRegisterType does not work with QObject - 924 Allow QScriptValue to be accessed via [] - 921 Signals not automatically disconnected on object destruction - 920 Cannot use same slot for two signals - 919 Default arguments on QStyle methods not working - 915 QDeclarativeView.scene().addItem(x) make the x object invalid - 913 Widgets inside QTabWidget are not exported as members of the containing widget - 910 installEventFilter() increments reference count on target object - 907 pyside-uic adds MainWindow.setMenuBar(self.menubar) to the generated code under OS X - 903 eventFilter in ItemDelegate - 897 QObject.property() and QObject.setProperty() methods fails for user-defined properties - 896 QObject.staticMetaObject() is missing - 916 Missing info about when is possible to use keyword arguments in docs [was: QListWidgetItem's constructor ignores text parameter] - 890 Add signal connection example for valueChanged(int) on QSpinBox to the docs - 821 Mapping interface for QPixmapCache - 909 Deletion of QMainWindow/QApplication leads to segmentation fault dist/changes-5.12.1000066400000000000000000000044431376617013100141100ustar00rootroot00000000000000Qt for Python 5.12.1 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-878] Added binding for QWebEngineUrlScheme which was missing - Completed the signature introspection - Activated existence_test.py for 5.12 - [PYSIDE-868] Fixed a crash related to multiple inheritance - [PYSIDE-886] Fixed crash when mixing static overloads with instance methods in derived classes - [PYSIDE-892] Added free functions from namespace QtQml - Fixed a rare type hint racing condition - Used helper function for accessing the meta object in quick type registration for libpyside - [PYSIDE-883] Fixed regression related to removing createIndex method that uses PyObject* - [PYSIDE-882] Avoided the creation of empty build directories in the install tree - Produced TypeError messages using the signature module - Replaced nullptr by None in signatures in the documentation - Updated and fixed the Slot documentation - Added \nullptr macro definition in the documentation - [PYSIDE-874] Fixed wrong METADATA for generated wheels - [PYSIDE-898] Improved check when a QFlag is found - [PYSIDE-790] Fixed a crash when overriding QAbstractNativeEventFilter.QAbstractNativeEventFilter() - Added support for the help() function using the signature module - [PYSIDE-880] Fixed an issue on the setup.py when running under non-UTF8 locale **************************************************************************** * Shiboken2 * **************************************************************************** - Make signatures in overload decisor code more verbose in shiboken - [PYSIDE-914] Included MSVC dlls in the shiboken module package dist/changes-5.12.2000066400000000000000000000050731376617013100141110ustar00rootroot00000000000000Qt for Python 5.12.2 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-934] Added a method to VoidPtr called toBytes() to get the bytes representation. - [PYSIDE-95] Added ownership transfer for QGraphicsItemGroup.addToGroup - [PYSIDE-928][PYSIDE-937][PYSIDE-943] Fixing a refcounting bug shown by __doc__ handling - [PYSIDE-931] Added the attribute 'allow-thread' to the type system and class entries. - [PYSIDE-947] Fixed conversions of list of smart pointers to python - [PYSIDE-953] Preventing Python 3.5 from crashing the build - [PYSIDE-940] Added setPageSize new signature to QPageSize - [PYSIDE-950] Allowed subclassing PyCFunction in extension modules - [PYSIDE-938] Set the proper parent when overloading QUiLoader.addAction() - Added common QPrintSupport typesystem for QWebEngine - [PYSIDE-942] Fixed an error when importing signatures in frozen executables - [PYSIDE-948] Fixed problem when using smart pointers with namespaces - [PYSIDE-45] Added support for using PyObject wrapper when an invalid QVariant is used - [PYSIDE-922] Added pyObj check for the setSequenceOwnership - [PYSIDE-919] Modernized the cmake build process - [PYSIDE-924] Propagated Property attributes to the MetaObject - Improved the type hints for containers - [PYSIDE-906] Added missing classes QWebEngineHistory and WebEngineHistoryItem - Added QtRemoteObject classes - Added a script to generate a debug log in windows called debug_windows.py **************************************************************************** * Shiboken2 * **************************************************************************** - Fixed many build warnings on shiboken and pyside - Extended the exception handling test in shiboken - [PYSIDE-929] Added dependency version for shiboken2 - [PYSIDE-914] Including MSVC dlls in the shiboken module package - [PYSIDE-932] Implement Embedding To Make Signatures Always Available dist/changes-5.12.3000066400000000000000000000032421376617013100141060ustar00rootroot00000000000000Qt for Python 5.12.3 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-993] Use correct environment variable to detect when running in Coin - Many updated to the documentation - Add array modification for QGLShaderProgram::setAttributeArray(int,const float *v,int,int) - Signatures: Add support for PySide2.QtCore.short/ushort/signed char - Add explicit methods for QOpenGLShaderProgramm.setUniformValue (i/f) **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-977] Shiboken: Add "noexcept" to wrapper when wrapped function is noexcept - [PYSIDE-975] shiboken: Allow for include paths with relative directories - [PYSIDE-995] shiboken: Enable adding call operators - shiboken: Move the Api extractor documentation into shiboken - shiboken: Fix code injection not working for operator functions - shiboken: Enable including typesystem XML snippets via entities dist/changes-5.12.4000066400000000000000000000042741376617013100141150ustar00rootroot00000000000000Qt for Python 5.12.4 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-571] correct bool(qApp) on Python 2 - [PYSIDE-735] generate_pyi: Simplify, Enhance and Get Rid Of Any Import Problems - [PYSIDE-865] opengl/contextinfo.py: Fix exception on exit - [PYSIDE-865] opengl/contextinfo.py: Polish the example a bit - [PYSIDE-908] Complete the help() support for Types - [PYSIDE-955] Add PySide2: Add OpenGL version functions as separate module - [PYSIDE-980] CMake: Change the default behavior CMAKE_BUILD_TYPE - [PYSIDE-996] Fix PyInstaller after removal of COIN glitches - [PYSIDE-1003] Fix Shiboken.ObjectType.__new__ for Python 2.7 V2 - [PYSIDE-1004] Make the __signature__ attribute writable by default - [PYSIDE-1008] Fix propagation of existing LD env vars when calling generate_pyi - [PYSIDE-1009] Signature: Try to recognize unknown modules in errorhandler.py - [PYSIDE-1012] Fix build on centOS/conda forge - [PYSIDE-1019] PySide: Allow any existing attribute in the constructor - [PYSIDE-1022] TabbedBrowser Example: Fix "Open in new tab" - [PYSIDE-1027] Fix negative refcount on QSocketNotifier **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-955] shiboken/Generators: Cache class information lists per class - [PYSIDE-1016] shiboken: Fix handling shared pointers passed by const-ref, take 2 - [PYSIDE-1017] shiboken: Enable specifying names for a parameters of added functions dist/changes-5.12.5000066400000000000000000000033421376617013100141110ustar00rootroot00000000000000 Qt for Python 5.12.5 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-571] Support the qApp macro in "scriptable application" - [PYSIDE-634] Add support for parameterNames in Signals - [PYSIDE-951] Correct QtPrintSupport dependency - [PYSIDE-1010] Add optional support for types in QSettings::value - [PYSIDE-1020] Fix pyside2-uic to generate correct code for QWebview and QQuickWidget - [PYSIDE-1028] Leave QVariantMap as a name, not a type - [PYSIDE-1029] Fix type name for lookup of QFlags<> converters - [PYSIDE-1032] Use default compiler on macOS - [PYSIDE-1035] Fix pyside2-uic to generate correct code for QTableWidget - [PYSIDE-1066] Fix Xcode sdk value embedded into PySide2 binaries **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1024] shiboken: Generate code for smart pointers only within declaring package - [PYSIDE-1037] shiboken: Allow for "auto" as target of type for CONVERTTOCPP in injected code dist/changes-5.12.6000066400000000000000000000021131376617013100141050ustar00rootroot00000000000000Qt for Python 5.12.6 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [Fixes: PYSIDE-1007] Remove extra ref on QDataStream::setDevice - [Fixes: PYSIDE-1051] Fix heaptype conflict with QtCore.QObject.__new__in Python 2.7 **************************************************************************** * Shiboken2 * **************************************************************************** - No changes dist/changes-5.13.0000066400000000000000000000026111376617013100141030ustar00rootroot00000000000000Qt for Python 5.13.0 is a minor release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-487] Add bindings for 5.13 - [PYSIDE-571] Support the qApp macro in "scriptable application" - [PYSIDE-841] Doc: Add QML Integration tutorial - [PYSIDE-841] Docs: Add Expenses tool tutorial - [PYSIDE-855] Regenerate all example forms using the python-extended rcc of 5.14 - [PYSIDE-1029] Fix type name for lookup of QFlags<> converters - [PYSIDE-1032] Use default compiler on macOS **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1024] shiboken: Generate code for smart pointers only within declaring package dist/changes-5.13.1000066400000000000000000000043121376617013100141040ustar00rootroot00000000000000 Qt for Python 5.13.1 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [Fixes https://github.com/spyder-ide/qtpy/issues/195] Fix RuntimeError: dictionary changed size during iteration - [PYSIDE-634] Add support for parameterNames in Signals - [PYSIDE-951] Cleanup signature module before substantial change - [PYSIDE-951] correct QtPrintSupport dependency - [PYSIDE-1010] Add optional support for types in QSettings::value - [PYSIDE-1020] Fix pyside2-uic to generate correct code for QWebview and QQuickWidget - [PYSIDE-1028] Leave QVariantMap as a name, not a type - [PYSIDE-1033] CMake modularization: macros creation - [PYSIDE-1035] Fix pyside2-uic to generate correct code for QTableWidget - [PYSIDE-1051] Fix heaptype conflict with QtCore.QObject.__new__in Python 2.7 - [PYSIDE-1052] Add QtCore.Slot.__signature__ and much more manually - [PYSIDE-1059] Documentation: update QInputDialog snippets - [PYSIDE-1066] Fix Xcode sdk value embedded into PySide2 binaries - [PYSIDE-1067] Update docs style - [PYSIDE-1073] Fix a typing bug in Python 2.7 and update - [PYSIDE-1077] Fix wrong Python init return codes - [PYSIDE-1079] signature: Support typing.Optional[T] and refine a bit **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1024] shiboken: Generate code for smart pointers only within declaring package - [PYSIDE-1037] shiboken: Allow for "auto" as target of type for CONVERTTOCPP in injected code dist/changes-5.13.2000066400000000000000000000030741376617013100141110ustar00rootroot00000000000000Qt for Python 5.13.2 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-785] Release ownership in QAbstractVideoFilterWrapper::createFilterRunnable - [PYSIDE-820] Fix booleans and empty list cases in QSettings - [PYSIDE-849] Add inject-code for QVideoFrame::bits() - [PYSIDE-1007] Remove extra ref on QDataStream::setDevice - [PYSIDE-1019] libpyside: Fix compiler warning - [PYSIDE-1049] Split build instructions to build and packaging - [PYSIDE-1051] Fix heaptype conflict with QtCore.QObject.__new__in Python 2.7 - [PYSIDE-1089] Fix formatting of the deployment documentation - [PYSIDE-1093] Fix bad shutdown effect on QApplication.instance() **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1095] shiboken: Fix handling of modified default expressions dist/changes-5.14.0000066400000000000000000000066351376617013100141160ustar00rootroot00000000000000Qt for Python 5.14.0 is a minor release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * Important Source Incompatible/Behavior Changes * **************************************************************************** - [PYSIDE-990] It is no longer possible to nest types in typesystem files by by qualifying the namespace components with "::". The elements need to be properly nested. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-487] Add bindings for Qt 5.14 - [PYSIDE-785] Release ownership in QAbstractVideoFilterWrapper::createFilterRunnable - [PYSIDE-795] Create a framework for deprecated functions - [PYSIDE-795] Make the function registry more usable in Python modules - [PYSIDE-795] Improve the NumPy Support by iterables - [PYSIDE-820] Fix booleans and empty list cases in QSettings - [PYSIDE-849] Add inject-code for QVideoFrame::bits() - [PYSIDE-939] Add support for Python 3.8 - [PYSIDE-939] Fix refcount issues with QSettings glue code - [PYSIDE-939] Finalize the Python 3.8 refcount fix - [PYSIDE-951] Support Pointer Primitive Types by Arrays or Result Tuples - [PYSIDE-1007] Remove extra ref on QDataStream::setDevice - [PYSIDE-1033] CMake modularization: macros creation - [PYSIDE-1041] Enable multimedia classes after API fixup - [PYSIDE-1047] QtWinExtras: Add QtWin namespace - [PYSIDE-1051] Fix heaptype conflict with QtCore.QObject.__new__in Python 2.7 - [PYSIDE-1052] Add QtCore.Slot.__signature__ and much more manually - [PYSIDE-1059] Documentation: update QInputDialog snippets - [PYSIDE-1066] Fix Xcode sdk value embedded into PySide2 binaries - [PYSIDE-1067] Update docs style - [PYSIDE-1067] New documentation structure - [PYSIDE-1068] Add designer to the pyside tools - [PYSIDE-1073] Fix a typing bug in Python 2.7 and update - [PYSIDE-1077] Fix wrong Python init return codes - [PYSIDE-1079] signature: Support typing.Optional[T] and refine a bit - [PYSIDE-1089] Fix formatting of the deployment documentation - [PYSIDE-1093] Fix bad shutdown effect on QApplication.instance() - [PYSIDE-1098] Replace pyside2-uic/pyside2-rcc by uic/rcc which now have an option to generate Python - [PYSIDE-1101] Remove QGraphicsItem::scroll from QtChart - [PYSIDE-1140] Add python_requires to the python setup - [QTBUG-66304] Blacklist failing QtPositioning test **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-454] Fix crash when smartptr template class cannot be found - [PYSIDE-1037] Allow for "auto" as target of type for CONVERTTOCPP in injected code - [PYSIDE-1095] Fix handling of modified default expressions dist/changes-5.14.1000066400000000000000000000030761376617013100141130ustar00rootroot00000000000000Qt for Python 5.14.1 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-841] Add example for Threads and Signals - [PYSIDE-1135] qApp: Ensure QtCore import when embedded QApplication subclass is used - [PYSIDE-1158] Let qApp be noApp instead of pretending to be None - [PYSIDE-1164] qApp: make sure to create the right instance when embedding - [PYSIDE-1165] designer: patch rpath for unix - [PYSIDE-1192] libpyside: Set default signal name only if previously assigned - [PYSIDE-1201] docs: Fix pre overlap and improve reading - [PYSIDE-1205] libpyside: avoid freeing char* - [PYSIDE-1207] Fix ownership of QTextDocument::createObject **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1191] shiboken: Introduce "until" version attribute as opposite of "since" dist/changes-5.14.2000066400000000000000000000067331376617013100141170ustar00rootroot00000000000000Qt for Python 5.14.2 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-135] Add doc getter for Property - [PYSIDE-239] Python enum types can now be used as a valid signal type. - [PYSIDE-939] Fix Python 3.8 warnings about deprecated int conversions of enums/flags - [PYSIDE-571] qApp has been turned into a normal Python variable. This implies that QtWidgets.qApp no longer works; it should be replaced by qApp. - [PYSIDE-803] GUI slowdowns caused by background threads have been fixed by reducing GIL allocation and usage of Py_(BEGIN|END)_ALLOW_THREADS. - [PYSIDE-858] Windows binaries are now signed. - [PYSIDE-939] Fix testrunner for Python 3.8/Linux - [PYSIDE-946] Add functions with callback of QWebEnginePage - [PYSIDE-1231] Further issues introduced by Python 3.8 have been addressed: - Warnings about deprecated int conversions of enumerations and flags have been fixed. - Packages can now be built with Python 3.8.1. - Tests run with Python 3.8.1. - [PYSIDE-1189] A crash caused by wrong ownership of the return value of QList/QTable/QTreeWidget.mimeData() has been fixed. - [PYSIDE-1199] The webchannel standalone example has been added. - [PYSIDE-1204] QByteArray now properly supports the PyBuffer interface. - [PYSIDE-1214] For accessors returning non-exposed classes inheriting QObject, the most-derived wrapper is now created. - [PYSIDE-1229] testrunner: Fix disrupted lines in the error log - [PYSIDE-1236] Fix running scriptableapplication in a virtualenv on Windows with Python 3.8 - [PYSIDE-1247] Avoid a signature warning in Python 3.6 - [PYSIDE-1250] PySide2: Use int for QVariant conversion when possible - [PYSIDE-1251] Invert QTreeWidgetItem clear function loop **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-803] The default of the "allow-thread" attribute has been changed to false as it was observed to cause performance issues when using threads. - [PYSIDE-1112] The shiboken documentation has been re-structured. - [PYSIDE-1228] Typedef'ed anonymous enums are now supported. - [PYSIDE-1240] The manual test dumpcodemodel has been modified to output typesystem XML, enabling convenient generation of typesystem file skeletons for new bindings. - [PYSIDE-1241] Improve error messages about invalid types of added functions - [PYSIDE-1241] Enable flags types in added functions - [PYSIDE-1246] Fix classes with virtual destructors not being considered polymorphic dist/changes-5.14.2.2000066400000000000000000000033461376617013100142540ustar00rootroot00000000000000Qt for Python 5.14.2.2 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-1100] Support type checking with the mypy module - [PYSIDE-1236] samplebinding: Fix running with Python 3.8.2 on Windows - [PYSIDE-1255] Fix memory corruption for QML registered types - [PYSIDE-1271] QMutexLocker: allow-thread in constructor - [PYSIDE-1272] signature: Add comparison for existing_doc type - [PYSIDE-1285] qareaseries: keep references of lower/upper series - [PYSIDE-1293] Windows: Fix encoding in custom message handler - [PYSIDE-15] Support pickling of Qt Enum objects - [PYSIDE-1223] Add QtUiTools.loadUiType - [PYSIDE-1286] Implement __qualname__ and correct __module__ for classes - [PYSIDE-1303] PySide2: Fix conversion of quintptr **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1286] shiboken: Prepare for introduction of __qualname__ - [PYSIDE-1298] libshiboken: Support musl libc - [PYSIDE-1299] shiboken: Fix cross builds dist/changes-5.14.2.3000066400000000000000000000027671376617013100142630ustar00rootroot00000000000000Qt for Python 5.14.2.3 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-1223] pyside2-uic instead of uic is not used for loadUiType() - [PYSIDE-1257] Deployment with cx_freeze using zip_include_packages has been fixed - [PYSIDE-1282] A crash using QThread.terminate() on pthreads has been fixed - [PYSIDE-1311] The downloads functionality of the Tabbedbrowser example has been fixed - [PYSIDE-1321] A leaking reference in the PySide2 property getter has been fixed **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-1325] Wrong generated code for default-initialized function arguments ({}) has been fixed dist/changes-5.15.0000066400000000000000000000044551376617013100141150ustar00rootroot00000000000000Qt for Python 5.15.0 is a minor release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-487] Add API of Qt 5.15 - [PYSIDE-487] Add support for QSerialPort - [PYSIDE-487] Add QtQuickControls2 - [PYSIDE-841] example: add systray example - [PYSIDE-841] doc: add more videos from Qt events - [PYSIDE-841] doc: add tutorial for using qrc files - [PYSIDE-904] libpyside: Remove deprecated API - [PYSIDE-904] Add support for template type aliases - [PYSIDE-957] Add a tool to dump meta objects of QObject-derived classes - [PYSIDE-1280] Enable injecting raw code for setattro/getattro - [PYSIDE-1309] Rename and update some snippets **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-454] shiboken: Add a way of specifying system includes to be parsed - [PYSIDE-454] shiboken: Handle smart pointers with const pointees - [PYSIDE-904] libshiboken: Remove deprecated API - [PYSIDE-957] shiboken: Fix refcounts of sbkenum - [PYSIDE-990] shiboken: Handle inline namespaces - [PYSIDE-1024] shiboken: Make it possible to specify smartpointer instantiations - [PYSIDE-1074] shiboken: Fix classes in hidden namespaces - [PYSIDE-1188] shiboken: Fix shared pointer return value in virtual function - [PYSIDE-1265] shiboken: Introduce a separate logging category for documentation generation - [PYSIDE-1265] shiboken: Change debug messages to use qCInfo and remove some messages - [PYSIDE-1267] shiboken: Allow for parsing headers under system include paths - [PYSIDE-1296] shiboken: Support non-type template parameters in functions dist/changes-5.15.1000066400000000000000000000070461376617013100141150ustar00rootroot00000000000000Qt for Python 5.15.1 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-74] Implement default __ne__ and __eq__ for all PySide types - [PYSIDE-198] Add compatibility with Nuitka - [PYSIDE-829] signature: Avoid non-existent attributes in compiled code (Nuitka) - [PYSIDE-841] doc: Add widget styling tutorial - [PYSIDE-841] add quick painteditem example - [PYSIDE-904] Add QObject.findChildren(QRegularExpression) - [PYSIDE-904] qp5_tool.py: Add an configuration key for the CMake generator - [PYSIDE-904] Port some examples from QRegExp to QRegularExpression - [PYSIDE-904] Fix libsample/photon test for Qt 6 / Windows - [PYSIDE-904] Enable adding operators ==, != as functions without code injection - [PYSIDE-957] Implement the QEnum/QFlag decorator, V2 - [PYSIDE-981] Return QVariantList when using list as Signal argument - [PYSIDE-1019] feature-select: Implement a selectable feature framework - [PYSIDE-1019] feature-select: allow snake_case instead of camelCase for methods - [PYSIDE-1019] feature-select: delay the feature switching - [PYSIDE-1223] Use pyside2-uic instead of uic for the loadUiType - [PYSIDE-1257] Potential fix for deploying with cx_freeze using zip_include_packages - [PYSIDE-1282] pthreads: Try to abandon the GIL in case a thread was terminated - [PYSIDE-1292] Doc: Enable doc builds using the offline template - [PYSIDE-1313] basewrapper.cpp: add PyErr_Fetch/Restore in SbkDeallocWrapperCommon() - [PYSIDE-1317] Add QSocketDescriptor class - [PYSIDE-1321] Fix leaking reference in PySide2 property getter - [PYSIDE-1321] Fix some leaks in enumeration creation - [PYSIDE-1323] Add missing Win runtime dll into win wheels - [PYSIDE-1323] Update vcredist binaries for MSVC 2019 - [PYSIDE-1332] Fix crashes in QThread::wait(), QWaitCondition::wait() - [PYSIDE-1349] QQmlComponent: allow thread in constructors - [PYSIDE-1353] doc: fix Property indentation - [PYSIDE-1355] Add Qt3DExtras.QNormalDiffuseMapAlphaMaterial - [PYSIDE-1368] __feature__: ignore if `__name__` does not exist in a module - [PYSIDE-1372] QDomElement: remove unnecesary setAttribute overloads - [PYSIDE-1374] Add the QWidget *-based overloads of the QtWinExtras functions **************************************************************************** * Shiboken2 * **************************************************************************** * shiboken now accepts multiple headers on the command line. * A number of error and warning messages have been prefixed by file name and line for better tooling. - [PYSIDE-841] Add custom widget shiboken example - [PYSIDE-904] shiboken2: Handle virtual methods returning a reference - [PYSIDE-1019] shiboken2: Re-add support for parsing Q_PROPERTY - [PYSIDE-1177] shiboken: Fix __doc__ setter for derived types - [PYSIDE-1325] shiboken: Fix default-initialized function arguments - [PYSIDE-1327] shiboken: Resolve typedef'ed base classes dist/changes-5.15.2000066400000000000000000000067411376617013100141170ustar00rootroot00000000000000Qt for Python 5.15.2 is a bug-fix release. For more details, refer to the online documentation included in this distribution. The documentation is also available online: https://doc.qt.io/qtforpython/ Some of the changes listed in this file include issue tracking numbers corresponding to tasks in the Qt Bug Tracker: https://bugreports.qt.io/ Each of these identifiers can be entered in the bug tracker to obtain more information about a particular change. **************************************************************************** * Important Source Incompatible/Behavior Changes * **************************************************************************** - Projects generating bindings for Qt-based code no longer need to include pyside2_global.h for the property and signal/slot annotations to work. **************************************************************************** * PySide2 * **************************************************************************** - [PYSIDE-487] Some missing enumerations and classes were added. - [PYSIDE-644] QNetworkCookie was added to WebEngineCore. - [PYSIDE-665] A crash when reimplementing QLayout.takeAt() was fixed. - [PYSIDE-807] setup.py was rewritten to properly show options the in command help. - [PYSIDE-972] Launching PySide2 from paths with non-ASCII Latin1 characters was fixed. - [PYSIDE-1019] feature_select: Qt Properties are now represented as Python properties. - [PYSIDE-1070] A crash when overriding QUiLoader::createWidget() in QUiLoader was fixed. - [PYSIDE-1082] A crash when creating QMimeData from Q(Plain)TextEdit::createMimeDataFromSelection() was fixed. - [PYSIDE-1202] More classes from QtConcurrent were added. - [PYSIDE-1224] The namespace QColorConstants was added. - [PYSIDE-1326] Operators for QFlags on hidden top level namespace are now generated. - [PYSIDE-1354] Slots being invoked from the wrong thread were fixed. - [PYSIDE-1381] The dependency of the QtQml module header on internal header pysideqmlregistertype.h was removed. - [PYSIDE-1385] Deprecated wheel.pep425tags imports were removed. - [PYSIDE-1390] setup.py: The build_rst_docs command was added to build rst documentation only - [PYSIDE-1397] Functions taking a smart pointer now accept smart pointers to base classes. - [PYSIDE-1410] QAxBase::dynamicCall() was fixed. **************************************************************************** * Shiboken2 * **************************************************************************** - [PYSIDE-841] The documentation on modifications was restructured. - [PYSIDE-904] An attribute for generating "using namespace" was added. - [PYSIDE-1019] A way of specifying properties for non-Qt classes in typesystem XML was added. - [PYSIDE-1075] Functions from invisible namespaces are now generated into their parent namespaces. - [PYSIDE-1224] Variables in namespaces are now generated. - [PYSIDE-1366] The order of overloads may now be specified to work around problems with the order generated by the overload decisor. - [PYSIDE-1388] Final classes with protected methods when disabling the protected hack are now correctly generated. docs/000077500000000000000000000000001376617013100120135ustar00rootroot00000000000000docs/.gitignore000066400000000000000000000000101376617013100137720ustar00rootroot00000000000000_build/ examples/000077500000000000000000000000001376617013100127015ustar00rootroot00000000000000examples/3d/000077500000000000000000000000001376617013100132075ustar00rootroot00000000000000examples/3d/3d.pyproject000066400000000000000000000000411376617013100154510ustar00rootroot00000000000000{ "files": ["simple3d.py"] } examples/3d/simple3d.py000066400000000000000000000141411376617013100153020ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 qt3d/simple-cpp example from Qt v5.x""" import sys from PySide2.QtCore import(Property, QObject, QPropertyAnimation, Signal) from PySide2.QtGui import (QGuiApplication, QMatrix4x4, QQuaternion, QVector3D) from PySide2.Qt3DCore import (Qt3DCore) from PySide2.Qt3DExtras import (Qt3DExtras) class OrbitTransformController(QObject): def __init__(self, parent): super(OrbitTransformController, self).__init__(parent) self._target = None self._matrix = QMatrix4x4() self._radius = 1 self._angle = 0 def setTarget(self, t): self._target = t def getTarget(self): return self._target def setRadius(self, radius): if self._radius != radius: self._radius = radius self.updateMatrix() self.radiusChanged.emit() def getRadius(self): return self._radius def setAngle(self, angle): if self._angle != angle: self._angle = angle self.updateMatrix() self.angleChanged.emit() def getAngle(self): return self._angle def updateMatrix(self): self._matrix.setToIdentity() self._matrix.rotate(self._angle, QVector3D(0, 1, 0)) self._matrix.translate(self._radius, 0, 0) if self._target is not None: self._target.setMatrix(self._matrix) angleChanged = Signal() radiusChanged = Signal() angle = Property(float, getAngle, setAngle, notify=angleChanged) radius = Property(float, getRadius, setRadius, notify=radiusChanged) class Window(Qt3DExtras.Qt3DWindow): def __init__(self): super(Window, self).__init__() # Camera self.camera().lens().setPerspectiveProjection(45, 16 / 9, 0.1, 1000) self.camera().setPosition(QVector3D(0, 0, 40)) self.camera().setViewCenter(QVector3D(0, 0, 0)) # For camera controls self.createScene() self.camController = Qt3DExtras.QOrbitCameraController(self.rootEntity) self.camController.setLinearSpeed(50) self.camController.setLookSpeed(180) self.camController.setCamera(self.camera()) self.setRootEntity(self.rootEntity) def createScene(self): # Root entity self.rootEntity = Qt3DCore.QEntity() # Material self.material = Qt3DExtras.QPhongMaterial(self.rootEntity) # Torus self.torusEntity = Qt3DCore.QEntity(self.rootEntity) self.torusMesh = Qt3DExtras.QTorusMesh() self.torusMesh.setRadius(5) self.torusMesh.setMinorRadius(1) self.torusMesh.setRings(100) self.torusMesh.setSlices(20) self.torusTransform = Qt3DCore.QTransform() self.torusTransform.setScale3D(QVector3D(1.5, 1, 0.5)) self.torusTransform.setRotation(QQuaternion.fromAxisAndAngle(QVector3D(1, 0, 0), 45)) self.torusEntity.addComponent(self.torusMesh) self.torusEntity.addComponent(self.torusTransform) self.torusEntity.addComponent(self.material) # Sphere self.sphereEntity = Qt3DCore.QEntity(self.rootEntity) self.sphereMesh = Qt3DExtras.QSphereMesh() self.sphereMesh.setRadius(3) self.sphereTransform = Qt3DCore.QTransform() self.controller = OrbitTransformController(self.sphereTransform) self.controller.setTarget(self.sphereTransform) self.controller.setRadius(20) self.sphereRotateTransformAnimation = QPropertyAnimation(self.sphereTransform) self.sphereRotateTransformAnimation.setTargetObject(self.controller) self.sphereRotateTransformAnimation.setPropertyName(b"angle") self.sphereRotateTransformAnimation.setStartValue(0) self.sphereRotateTransformAnimation.setEndValue(360) self.sphereRotateTransformAnimation.setDuration(10000) self.sphereRotateTransformAnimation.setLoopCount(-1) self.sphereRotateTransformAnimation.start() self.sphereEntity.addComponent(self.sphereMesh) self.sphereEntity.addComponent(self.sphereTransform) self.sphereEntity.addComponent(self.material) if __name__ == '__main__': app = QGuiApplication(sys.argv) view = Window() view.show() sys.exit(app.exec_()) examples/axcontainer/000077500000000000000000000000001376617013100152145ustar00rootroot00000000000000examples/axcontainer/axcontainer.pyproject000066400000000000000000000000411376617013100214630ustar00rootroot00000000000000{ "files": ["axviewer.py"] } examples/axcontainer/axviewer.py000066400000000000000000000066411376617013100174270ustar00rootroot00000000000000 ############################################################################# ## ## 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 Active Qt Viewer example""" import sys from PySide2.QtAxContainer import QAxSelect, QAxWidget from PySide2.QtWidgets import (QAction, QApplication, QDialog, QMainWindow, QMessageBox, QToolBar) class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() toolBar = QToolBar() self.addToolBar(toolBar) fileMenu = self.menuBar().addMenu("&File") loadAction = QAction("Load...", self, shortcut="Ctrl+L", triggered=self.load) fileMenu.addAction(loadAction) toolBar.addAction(loadAction) exitAction = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) fileMenu.addAction(exitAction) aboutMenu = self.menuBar().addMenu("&About") aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt) aboutMenu.addAction(aboutQtAct) self.axWidget = QAxWidget() self.setCentralWidget(self.axWidget) def load(self): axSelect = QAxSelect(self) if axSelect.exec_() == QDialog.Accepted: clsid = axSelect.clsid() if not self.axWidget.setControl(clsid): QMessageBox.warning(self, "AxViewer", "Unable to load " + clsid + ".") if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() availableGeometry = app.desktop().availableGeometry(mainWin) mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2) mainWin.show() sys.exit(app.exec_()) examples/charts/000077500000000000000000000000001376617013100141655ustar00rootroot00000000000000examples/charts/audio.py000066400000000000000000000116201376617013100156400ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 charts/audio example from Qt v5.x""" import sys from PySide2.QtCharts import QtCharts from PySide2.QtCore import QPointF from PySide2.QtMultimedia import (QAudioDeviceInfo, QAudioFormat, QAudioInput) from PySide2.QtWidgets import QApplication, QMainWindow, QMessageBox sampleCount = 2000 resolution = 4 class MainWindow(QMainWindow): def __init__(self, device): super(MainWindow, self).__init__() self.series = QtCharts.QLineSeries() self.chart = QtCharts.QChart() self.chart.addSeries(self.series) self.axisX = QtCharts.QValueAxis() self.axisX.setRange(0, sampleCount) self.axisX.setLabelFormat("%g") self.axisX.setTitleText("Samples") self.axisY = QtCharts.QValueAxis() self.axisY.setRange(-1, 1) self.axisY.setTitleText("Audio level") self.chart.setAxisX(self.axisX, self.series) self.chart.setAxisY(self.axisY, self.series) self.chart.legend().hide() self.chart.setTitle("Data from the microphone ({})".format(device.deviceName())) formatAudio = QAudioFormat() formatAudio.setSampleRate(8000) formatAudio.setChannelCount(1) formatAudio.setSampleSize(8) formatAudio.setCodec("audio/pcm") formatAudio.setByteOrder(QAudioFormat.LittleEndian) formatAudio.setSampleType(QAudioFormat.UnSignedInt) self.audioInput = QAudioInput(device, formatAudio, self) self.ioDevice = self.audioInput.start() self.ioDevice.readyRead.connect(self._readyRead) self.chartView = QtCharts.QChartView(self.chart) self.setCentralWidget(self.chartView) self.buffer = [QPointF(x, 0) for x in range(sampleCount)] self.series.append(self.buffer) def closeEvent(self, event): if self.audioInput is not None: self.audioInput.stop() event.accept() def _readyRead(self): data = self.ioDevice.readAll() availableSamples = data.size() // resolution start = 0 if (availableSamples < sampleCount): start = sampleCount - availableSamples for s in range(start): self.buffer[s].setY(self.buffer[s + availableSamples].y()) dataIndex = 0 for s in range(start, sampleCount): value = (ord(data[dataIndex]) - 128) / 128 self.buffer[s].setY(value) dataIndex = dataIndex + resolution self.series.replace(self.buffer) if __name__ == '__main__': app = QApplication(sys.argv) inputDevice = QAudioDeviceInfo.defaultInputDevice() if (inputDevice.isNull()): QMessageBox.warning(None, "audio", "There is no audio input device available.") sys.exit(-1) mainWin = MainWindow(inputDevice) mainWin.setWindowTitle("audio") availableGeometry = app.desktop().availableGeometry(mainWin) size = availableGeometry.height() * 3 / 4 mainWin.resize(size, size) mainWin.show() sys.exit(app.exec_()) examples/charts/callout.py000066400000000000000000000232421376617013100162050ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 Callout example from Qt v5.x""" import sys from PySide2.QtWidgets import (QApplication, QGraphicsScene, QGraphicsView, QGraphicsSimpleTextItem, QGraphicsItem) from PySide2.QtCore import Qt, QPointF, QRectF, QRect from PySide2.QtCharts import QtCharts from PySide2.QtGui import QPainter, QFont, QFontMetrics, QPainterPath, QColor class Callout(QGraphicsItem): def __init__(self, chart): QGraphicsItem.__init__(self, chart) self._chart = chart self._text = "" self._textRect = QRectF() self._anchor = QPointF() self._font = QFont() self._rect = QRectF() def boundingRect(self): anchor = self.mapFromParent(self._chart.mapToPosition(self._anchor)) rect = QRectF() rect.setLeft(min(self._rect.left(), anchor.x())) rect.setRight(max(self._rect.right(), anchor.x())) rect.setTop(min(self._rect.top(), anchor.y())) rect.setBottom(max(self._rect.bottom(), anchor.y())) return rect def paint(self, painter, option, widget): path = QPainterPath() path.addRoundedRect(self._rect, 5, 5) anchor = self.mapFromParent(self._chart.mapToPosition(self._anchor)) if not self._rect.contains(anchor) and not self._anchor.isNull(): point1 = QPointF() point2 = QPointF() # establish the position of the anchor point in relation to _rect above = anchor.y() <= self._rect.top() aboveCenter = (anchor.y() > self._rect.top() and anchor.y() <= self._rect.center().y()) belowCenter = (anchor.y() > self._rect.center().y() and anchor.y() <= self._rect.bottom()) below = anchor.y() > self._rect.bottom() onLeft = anchor.x() <= self._rect.left() leftOfCenter = (anchor.x() > self._rect.left() and anchor.x() <= self._rect.center().x()) rightOfCenter = (anchor.x() > self._rect.center().x() and anchor.x() <= self._rect.right()) onRight = anchor.x() > self._rect.right() # get the nearest _rect corner. x = (onRight + rightOfCenter) * self._rect.width() y = (below + belowCenter) * self._rect.height() cornerCase = ((above and onLeft) or (above and onRight) or (below and onLeft) or (below and onRight)) vertical = abs(anchor.x() - x) > abs(anchor.y() - y) x1 = (x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * int(not vertical) * (onLeft * 10 - onRight * 20)) y1 = (y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * (above * 10 - below * 20)) point1.setX(x1) point1.setY(y1) x2 = (x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * int(not vertical) * (onLeft * 20 - onRight * 10)) y2 = (y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * (above * 20 - below * 10)) point2.setX(x2) point2.setY(y2) path.moveTo(point1) path.lineTo(anchor) path.lineTo(point2) path = path.simplified() painter.setBrush(QColor(255, 255, 255)) painter.drawPath(path) painter.drawText(self._textRect, self._text) def mousePressEvent(self, event): event.setAccepted(True) def mouseMoveEvent(self, event): if event.buttons() & Qt.LeftButton: self.setPos(mapToParent( event.pos() - event.buttonDownPos(Qt.LeftButton))) event.setAccepted(True) else: event.setAccepted(False) def setText(self, text): self._text = text metrics = QFontMetrics(self._font) self._textRect = QRectF(metrics.boundingRect( QRect(0.0, 0.0, 150.0, 150.0),Qt.AlignLeft, self._text)) self._textRect.translate(5, 5) self.prepareGeometryChange() self._rect = self._textRect.adjusted(-5, -5, 5, 5) def setAnchor(self, point): self._anchor = QPointF(point) def updateGeometry(self): self.prepareGeometryChange() self.setPos(self._chart.mapToPosition( self._anchor) + QPointF(10, -50)) class View(QGraphicsView): def __init__(self, parent = None): super(View, self).__init__(parent) self.setScene(QGraphicsScene(self)) self.setDragMode(QGraphicsView.NoDrag) self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # Chart self._chart = QtCharts.QChart() self._chart.setMinimumSize(640, 480) self._chart.setTitle("Hover the line to show callout. Click the line " "to make it stay") self._chart.legend().hide() self.series = QtCharts.QLineSeries() self.series.append(1, 3) self.series.append(4, 5) self.series.append(5, 4.5) self.series.append(7, 1) self.series.append(11, 2) self._chart.addSeries(self.series) self.series2 = QtCharts.QSplineSeries() self.series2.append(1.6, 1.4) self.series2.append(2.4, 3.5) self.series2.append(3.7, 2.5) self.series2.append(7, 4) self.series2.append(10, 2) self._chart.addSeries(self.series2) self._chart.createDefaultAxes() self._chart.setAcceptHoverEvents(True) self.setRenderHint(QPainter.Antialiasing) self.scene().addItem(self._chart) self._coordX = QGraphicsSimpleTextItem(self._chart) self._coordX.setPos( self._chart.size().width()/2 - 50, self._chart.size().height()) self._coordX.setText("X: ") self._coordY = QGraphicsSimpleTextItem(self._chart) self._coordY.setPos( self._chart.size().width()/2 + 50, self._chart.size().height()) self._coordY.setText("Y: ") self._callouts = [] self._tooltip = Callout(self._chart) self.series.clicked.connect(self.keepCallout) self.series.hovered.connect(self.tooltip) self.series2.clicked.connect(self.keepCallout) self.series2.hovered.connect(self.tooltip) self.setMouseTracking(True) def resizeEvent(self, event): if self.scene(): self.scene().setSceneRect(QRectF(QPointF(0, 0), event.size())) self._chart.resize(event.size()) self._coordX.setPos( self._chart.size().width()/2 - 50, self._chart.size().height() - 20) self._coordY.setPos( self._chart.size().width()/2 + 50, self._chart.size().height() - 20) for callout in self._callouts: callout.updateGeometry() QGraphicsView.resizeEvent(self, event) def mouseMoveEvent(self, event): self._coordX.setText("X: {0:.2f}" .format(self._chart.mapToValue(event.pos()).x())) self._coordY.setText("Y: {0:.2f}" .format(self._chart.mapToValue(event.pos()).y())) QGraphicsView.mouseMoveEvent(self, event) def keepCallout(self): self._callouts.append(self._tooltip) self._tooltip = Callout(self._chart) def tooltip(self, point, state): if self._tooltip == 0: self._tooltip = Callout(self._chart) if state: self._tooltip.setText("X: {0:.2f} \nY: {1:.2f} " .format(point.x(),point.y())) self._tooltip.setAnchor(point) self._tooltip.setZValue(11) self._tooltip.updateGeometry() self._tooltip.show() else: self._tooltip.hide() if __name__ == "__main__": app = QApplication(sys.argv) v = View() v.show() sys.exit(app.exec_()) examples/charts/charts.pyproject000066400000000000000000000004211376617013100174070ustar00rootroot00000000000000{ "files": ["percentbarchart.py", "donutbreakdown.py", "legend.py", "nesteddonuts.py", "modeldata.py", "lineandbar.py", "memoryusage.py", "callout.py", "audio.py", "linechart.py", "logvalueaxis.py", "piechart.py", "temperaturerecords.py"] } examples/charts/chartthemes/000077500000000000000000000000001376617013100164745ustar00rootroot00000000000000examples/charts/chartthemes/README.md000066400000000000000000000003611376617013100177530ustar00rootroot00000000000000# Chart themes To generated the file `ui_themewidget.py`, the following command need to be executed: `pyside2-uic themewidget.ui > ui_themewidget.py` Also, if you modify the UI file, then you would need to run the previous command again. examples/charts/chartthemes/chartthemes.pyproject000066400000000000000000000000741376617013100227450ustar00rootroot00000000000000{ "files": ["main.py", "README.md", "themewidget.ui"] } examples/charts/chartthemes/main.py000066400000000000000000000364001376617013100177750ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 Chart Themes example from Qt v5.x""" import sys from PySide2.QtCore import QPointF, Qt from PySide2.QtGui import QColor, QPainter, QPalette from PySide2.QtWidgets import (QApplication, QMainWindow, QSizePolicy, QWidget) from PySide2.QtCharts import QtCharts from ui_themewidget import Ui_ThemeWidgetForm as ui from random import random, uniform class ThemeWidget(QWidget): def __init__(self, parent): QWidget.__init__(self, parent) self.charts = [] self.ui = ui() self.list_count = 3 self.value_max = 10 self.value_count = 7 self.data_table = self.generate_random_data(self.list_count, self.value_max, self.value_count) self.ui.setupUi(self) self.populate_themebox() self.populate_animationbox() self.populate_legendbox() # Area Chart chart_view = QtCharts.QChartView(self.create_areachart()) self.ui.gridLayout.addWidget(chart_view, 1, 0) self.charts.append(chart_view) # Pie Chart chart_view = QtCharts.QChartView(self.createPieChart()) chart_view.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored) self.ui.gridLayout.addWidget(chart_view, 1, 1) self.charts.append(chart_view) # Line Chart chart_view = QtCharts.QChartView(self.createLineChart()) self.ui.gridLayout.addWidget(chart_view, 1, 2) self.charts.append(chart_view) # Bar Chart chart_view = QtCharts.QChartView(self.createBarChart()) self.ui.gridLayout.addWidget(chart_view, 2, 0) self.charts.append(chart_view) # Spline Chart chart_view = QtCharts.QChartView(self.createSplineChart()) self.ui.gridLayout.addWidget(chart_view, 2, 1) self.charts.append(chart_view) # Scatter Chart chart_view = QtCharts.QChartView(self.create_scatterchart()) self.ui.gridLayout.addWidget(chart_view, 2, 2) self.charts.append(chart_view) # Set defaults self.ui.antialiasCheckBox.setChecked(True) # Set the colors from the light theme as default ones pal = qApp.palette() pal.setColor(QPalette.Window, QColor(0xf0f0f0)) pal.setColor(QPalette.WindowText, QColor(0x404044)) qApp.setPalette(pal) self.updateUI() def generate_random_data(self, list_count, value_max, value_count): data_table = [] for i in range(list_count): data_list = [] y_value = 0 for j in range(value_count): constant = value_max / float(value_count) y_value += uniform(0, constant) x_value = (j + random()) * constant value = QPointF(x_value, y_value) label = "Slice {}: {}".format(i, j) data_list.append((value, label)) data_table.append(data_list) return data_table def populate_themebox(self): theme = self.ui.themeComboBox theme.addItem("Light", QtCharts.QChart.ChartThemeLight) theme.addItem("Blue Cerulean", QtCharts.QChart.ChartThemeBlueCerulean) theme.addItem("Dark", QtCharts.QChart.ChartThemeDark) theme.addItem("Brown Sand", QtCharts.QChart.ChartThemeBrownSand) theme.addItem("Blue NCS", QtCharts.QChart.ChartThemeBlueNcs) theme.addItem("High Contrast", QtCharts.QChart.ChartThemeHighContrast) theme.addItem("Blue Icy", QtCharts.QChart.ChartThemeBlueIcy) theme.addItem("Qt", QtCharts.QChart.ChartThemeQt) def populate_animationbox(self): animated = self.ui.animatedComboBox animated.addItem("No Animations", QtCharts.QChart.NoAnimation) animated.addItem("GridAxis Animations", QtCharts.QChart.GridAxisAnimations) animated.addItem("Series Animations", QtCharts.QChart.SeriesAnimations) animated.addItem("All Animations", QtCharts.QChart.AllAnimations) def populate_legendbox(self): legend = self.ui.legendComboBox legend.addItem("No Legend ", 0) legend.addItem("Legend Top", Qt.AlignTop) legend.addItem("Legend Bottom", Qt.AlignBottom) legend.addItem("Legend Left", Qt.AlignLeft) legend.addItem("Legend Right", Qt.AlignRight) def create_areachart(self): chart = QtCharts.QChart() chart.setTitle("Area Chart") # The lower series initialized to zero values lower_series = None name = "Series " for i in range(len(self.data_table)): upper_series = QtCharts.QLineSeries(chart) for j in range(len(self.data_table[i])): data = self.data_table[i][j] if lower_series: points = lower_series.pointsVector() y_value = points[i].y() + data[0].y() upper_series.append(QPointF(j, y_value)) else: upper_series.append(QPointF(j, data[0].y())) area = QtCharts.QAreaSeries(upper_series, lower_series) area.setName("{}{}".format(name, i)) chart.addSeries(area) lower_series = upper_series chart.createDefaultAxes() chart.axisX().setRange(0, self.value_count - 1) chart.axisY().setRange(0, self.value_max) # Add space to label to add space between labels and axis chart.axisY().setLabelFormat("%.1f ") return chart def createBarChart(self): chart = QtCharts.QChart() chart.setTitle("Bar chart") series = QtCharts.QStackedBarSeries(chart) for i in range(len(self.data_table)): barset = QtCharts.QBarSet("Bar set {}".format(i)) for data in self.data_table[i]: barset.append(data[0].y()) series.append(barset) chart.addSeries(series) chart.createDefaultAxes() chart.axisY().setRange(0, self.value_max * 2) # Add space to label to add space between labels and axis chart.axisY().setLabelFormat("%.1f ") return chart def createLineChart(self): chart = QtCharts.QChart() chart.setTitle("Line chart") name = "Series " for i, lst in enumerate(self.data_table): series = QtCharts.QLineSeries(chart) for data in lst: series.append(data[0]) series.setName("{}{}".format(name, i)) chart.addSeries(series) chart.createDefaultAxes() chart.axisX().setRange(0, self.value_max) chart.axisY().setRange(0, self.value_count) # Add space to label to add space between labels and axis chart.axisY().setLabelFormat("%.1f ") return chart def createPieChart(self): chart = QtCharts.QChart() chart.setTitle("Pie chart") series = QtCharts.QPieSeries(chart) for data in self.data_table[0]: slc = series.append(data[1], data[0].y()) if data == self.data_table[0][0]: # Show the first slice exploded with label slc.setLabelVisible() slc.setExploded() slc.setExplodeDistanceFactor(0.5) series.setPieSize(0.4) chart.addSeries(series) return chart def createSplineChart(self): chart = QtCharts.QChart() chart.setTitle("Spline chart") name = "Series " for i, lst in enumerate(self.data_table): series = QtCharts.QSplineSeries(chart) for data in lst: series.append(data[0]) series.setName("{}{}".format(name, i)) chart.addSeries(series) chart.createDefaultAxes() chart.axisX().setRange(0, self.value_max) chart.axisY().setRange(0, self.value_count) # Add space to label to add space between labels and axis chart.axisY().setLabelFormat("%.1f ") return chart def create_scatterchart(self): chart = QtCharts.QChart() chart.setTitle("Scatter chart") name = "Series " for i, lst in enumerate(self.data_table): series = QtCharts.QScatterSeries(chart) for data in lst: series.append(data[0]) series.setName("{}{}".format(name, i)) chart.addSeries(series) chart.createDefaultAxes() chart.axisX().setRange(0, self.value_max) chart.axisY().setRange(0, self.value_count) # Add space to label to add space between labels and axis chart.axisY().setLabelFormat("%.1f ") return chart def updateUI(self): def set_colors(window_color, text_color): pal = self.window().palette() pal.setColor(QPalette.Window, window_color) pal.setColor(QPalette.WindowText, text_color) self.window().setPalette(pal) idx = self.ui.themeComboBox.currentIndex() theme = self.ui.themeComboBox.itemData(idx) if len(self.charts): chart_theme = self.charts[0].chart().theme() if chart_theme != theme: for chart_view in self.charts: if theme == 0: theme_name = QtCharts.QChart.ChartThemeLight elif theme == 1: theme_name = QtCharts.QChart.ChartThemeBlueCerulean elif theme == 2: theme_name = QtCharts.QChart.ChartThemeDark elif theme == 3: theme_name = QtCharts.QChart.ChartThemeBrownSand elif theme == 4: theme_name = QtCharts.QChart.ChartThemeBlueNcs elif theme == 5: theme_name = QtCharts.QChart.ChartThemeHighContrast elif theme == 6: theme_name = QtCharts.QChart.ChartThemeBlueIcy elif theme == 7: theme_name = QtCharts.QChart.ChartThemeQt else: theme_name = QtCharts.QChart.ChartThemeLight chart_view.chart().setTheme(theme_name) # Set palette colors based on selected theme if theme == QtCharts.QChart.ChartThemeLight: set_colors(QColor(0xf0f0f0), QColor(0x404044)) elif theme == QtCharts.QChart.ChartThemeDark: set_colors(QColor(0x121218), QColor(0xd6d6d6)) elif theme == QtCharts.QChart.ChartThemeBlueCerulean: set_colors(QColor(0x40434a), QColor(0xd6d6d6)) elif theme == QtCharts.QChart.ChartThemeBrownSand: set_colors(QColor(0x9e8965), QColor(0x404044)) elif theme == QtCharts.QChart.ChartThemeBlueNcs: set_colors(QColor(0x018bba), QColor(0x404044)) elif theme == QtCharts.QChart.ChartThemeHighContrast: set_colors(QColor(0xffab03), QColor(0x181818)) elif theme == QtCharts.QChart.ChartThemeBlueIcy: set_colors(QColor(0xcee7f0), QColor(0x404044)) else: set_colors(QColor(0xf0f0f0), QColor(0x404044)) # Update antialiasing checked = self.ui.antialiasCheckBox.isChecked() for chart in self.charts: chart.setRenderHint(QPainter.Antialiasing, checked) # Update animation options idx = self.ui.animatedComboBox.currentIndex() options = self.ui.animatedComboBox.itemData(idx) if len(self.charts): chart = self.charts[0].chart() animation_options = chart.animationOptions() if animation_options != options: for chart_view in self.charts: options_name = QtCharts.QChart.NoAnimation if options == 0: options_name = QtCharts.QChart.NoAnimation elif options == 1: options_name = QtCharts.QChart.GridAxisAnimations elif options == 2: options_name = QtCharts.QChart.SeriesAnimations elif options == 3: options_name = QtCharts.QChart.AllAnimations chart_view.chart().setAnimationOptions(options_name) # Update legend alignment idx = self.ui.legendComboBox.currentIndex() alignment = self.ui.legendComboBox.itemData(idx) if not alignment: for chart_view in self.charts: chart_view.chart().legend().hide() else: for chart_view in self.charts: alignment_name = Qt.AlignTop if alignment == 32: alignment_name = Qt.AlignTop elif alignment == 64: alignment_name = Qt.AlignBottom elif alignment == 1: alignment_name = Qt.AlignLeft elif alignment == 2: alignment_name = Qt.AlignRight chart_view.chart().legend().setAlignment(alignment_name) chart_view.chart().legend().show() if __name__ == "__main__": app = QApplication(sys.argv) window = QMainWindow() widget = ThemeWidget(None) window.setCentralWidget(widget) available_geometry = app.desktop().availableGeometry(window) size = available_geometry.height() * 0.75 window.setFixedSize(size, size * 0.8) window.show() sys.exit(app.exec_()) examples/charts/chartthemes/themewidget.ui000066400000000000000000000051011376617013100213360ustar00rootroot00000000000000 ThemeWidgetForm 0 0 900 600 Theme: Animation: Legend: Anti-aliasing false Qt::Horizontal 40 20 themeComboBox currentIndexChanged(int) ThemeWidgetForm updateUI() antialiasCheckBox toggled(bool) ThemeWidgetForm updateUI() legendComboBox currentIndexChanged(int) ThemeWidgetForm updateUI() animatedComboBox currentIndexChanged(int) ThemeWidgetForm updateUI() updateUI() examples/charts/chartthemes/ui_themewidget.py000066400000000000000000000065741376617013100220650ustar00rootroot00000000000000# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'themewidget.ui' ## ## Created by: Qt User Interface Compiler version 5.14.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 * class Ui_ThemeWidgetForm(object): def setupUi(self, ThemeWidgetForm): if ThemeWidgetForm.objectName(): ThemeWidgetForm.setObjectName(u"ThemeWidgetForm") ThemeWidgetForm.resize(900, 600) self.gridLayout = QGridLayout(ThemeWidgetForm) self.gridLayout.setObjectName(u"gridLayout") self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName(u"horizontalLayout") self.themeLabel = QLabel(ThemeWidgetForm) self.themeLabel.setObjectName(u"themeLabel") self.horizontalLayout.addWidget(self.themeLabel) self.themeComboBox = QComboBox(ThemeWidgetForm) self.themeComboBox.setObjectName(u"themeComboBox") self.horizontalLayout.addWidget(self.themeComboBox) self.animatedLabel = QLabel(ThemeWidgetForm) self.animatedLabel.setObjectName(u"animatedLabel") self.horizontalLayout.addWidget(self.animatedLabel) self.animatedComboBox = QComboBox(ThemeWidgetForm) self.animatedComboBox.setObjectName(u"animatedComboBox") self.horizontalLayout.addWidget(self.animatedComboBox) self.legendLabel = QLabel(ThemeWidgetForm) self.legendLabel.setObjectName(u"legendLabel") self.horizontalLayout.addWidget(self.legendLabel) self.legendComboBox = QComboBox(ThemeWidgetForm) self.legendComboBox.setObjectName(u"legendComboBox") self.horizontalLayout.addWidget(self.legendComboBox) self.antialiasCheckBox = QCheckBox(ThemeWidgetForm) self.antialiasCheckBox.setObjectName(u"antialiasCheckBox") self.antialiasCheckBox.setChecked(False) self.horizontalLayout.addWidget(self.antialiasCheckBox) self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.horizontalLayout.addItem(self.horizontalSpacer) self.gridLayout.addLayout(self.horizontalLayout, 0, 0, 1, 3) self.retranslateUi(ThemeWidgetForm) self.themeComboBox.currentIndexChanged.connect(ThemeWidgetForm.updateUI) self.antialiasCheckBox.toggled.connect(ThemeWidgetForm.updateUI) self.legendComboBox.currentIndexChanged.connect(ThemeWidgetForm.updateUI) self.animatedComboBox.currentIndexChanged.connect(ThemeWidgetForm.updateUI) QMetaObject.connectSlotsByName(ThemeWidgetForm) # setupUi def retranslateUi(self, ThemeWidgetForm): self.themeLabel.setText(QCoreApplication.translate("ThemeWidgetForm", u"Theme:", None)) self.animatedLabel.setText(QCoreApplication.translate("ThemeWidgetForm", u"Animation:", None)) self.legendLabel.setText(QCoreApplication.translate("ThemeWidgetForm", u"Legend:", None)) self.antialiasCheckBox.setText(QCoreApplication.translate("ThemeWidgetForm", u"Anti-aliasing", None)) # retranslateUi examples/charts/donutbreakdown.py000066400000000000000000000155671376617013100176030ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 Donut Chart Breakdown example from Qt v5.x""" import sys from PySide2.QtCore import Qt from PySide2.QtGui import QColor, QFont, QPainter from PySide2.QtWidgets import QApplication, QMainWindow from PySide2.QtCharts import QtCharts class MainSlice(QtCharts.QPieSlice): def __init__(self, breakdown_series, parent=None): super(MainSlice, self).__init__(parent) self.breakdown_series = breakdown_series self.name = None self.percentageChanged.connect(self.update_label) def get_breakdown_series(self): return self.breakdown_series def setName(self, name): self.name = name def name(self): return self.name def update_label(self): self.setLabel("{} {:.2f}%".format(self.name, self.percentage() * 100)) class DonutBreakdownChart(QtCharts.QChart): def __init__(self, parent=None): super(DonutBreakdownChart, self).__init__(QtCharts.QChart.ChartTypeCartesian, parent, Qt.WindowFlags()) self.main_series = QtCharts.QPieSeries() self.main_series.setPieSize(0.7) self.addSeries(self.main_series) def add_breakdown_series(self, breakdown_series, color): font = QFont("Arial", 8) # add breakdown series as a slice to center pie main_slice = MainSlice(breakdown_series) main_slice.setName(breakdown_series.name()) main_slice.setValue(breakdown_series.sum()) self.main_series.append(main_slice) # customize the slice main_slice.setBrush(color) main_slice.setLabelVisible() main_slice.setLabelColor(Qt.white) main_slice.setLabelPosition(QtCharts.QPieSlice.LabelInsideHorizontal) main_slice.setLabelFont(font) # position and customize the breakdown series breakdown_series.setPieSize(0.8) breakdown_series.setHoleSize(0.7) breakdown_series.setLabelsVisible() for pie_slice in breakdown_series.slices(): color = QColor(color).lighter(115) pie_slice.setBrush(color) pie_slice.setLabelFont(font) # add the series to the chart self.addSeries(breakdown_series) # recalculate breakdown donut segments self.recalculate_angles() # update customize legend markers self.update_legend_markers() def recalculate_angles(self): angle = 0 slices = self.main_series.slices() for pie_slice in slices: breakdown_series = pie_slice.get_breakdown_series() breakdown_series.setPieStartAngle(angle) angle += pie_slice.percentage() * 360.0 # full pie is 360.0 breakdown_series.setPieEndAngle(angle) def update_legend_markers(self): # go through all markers for series in self.series(): markers = self.legend().markers(series) for marker in markers: if series == self.main_series: # hide markers from main series marker.setVisible(False) else: # modify markers from breakdown series marker.setLabel("{} {:.2f}%".format( marker.slice().label(), marker.slice().percentage() * 100, 0)) marker.setFont(QFont("Arial", 8)) if __name__ == "__main__": app = QApplication(sys.argv) # Graph is based on data of: # 'Total consumption of energy increased by 10 per cent in 2010' # Statistics Finland, 13 December 2011 # http://www.stat.fi/til/ekul/2010/ekul_2010_2011-12-13_tie_001_en.html series1 = QtCharts.QPieSeries() series1.setName("Fossil fuels") series1.append("Oil", 353295) series1.append("Coal", 188500) series1.append("Natural gas", 148680) series1.append("Peat", 94545) series2 = QtCharts.QPieSeries() series2.setName("Renewables") series2.append("Wood fuels", 319663) series2.append("Hydro power", 45875) series2.append("Wind power", 1060) series3 = QtCharts.QPieSeries() series3.setName("Others") series3.append("Nuclear energy", 238789) series3.append("Import energy", 37802) series3.append("Other", 32441) donut_breakdown = DonutBreakdownChart() donut_breakdown.setAnimationOptions(QtCharts.QChart.AllAnimations) donut_breakdown.setTitle("Total consumption of energy in Finland 2010") donut_breakdown.legend().setAlignment(Qt.AlignRight) donut_breakdown.add_breakdown_series(series1, Qt.red) donut_breakdown.add_breakdown_series(series2, Qt.darkGreen) donut_breakdown.add_breakdown_series(series3, Qt.darkBlue) window = QMainWindow() chart_view = QtCharts.QChartView(donut_breakdown) chart_view.setRenderHint(QPainter.Antialiasing) window.setCentralWidget(chart_view) available_geometry = app.desktop().availableGeometry(window) size = available_geometry.height() * 0.75 window.resize(size, size * 0.8) window.show() sys.exit(app.exec_()) examples/charts/legend.py000066400000000000000000000225101376617013100157750ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 Legend example from Qt v5.x""" import sys from PySide2.QtCore import Qt, QRectF from PySide2.QtGui import QBrush, QColor, QPainter, QPen from PySide2.QtWidgets import (QApplication, QDoubleSpinBox, QFormLayout, QGridLayout, QGroupBox, QPushButton, QWidget) from PySide2.QtCharts import QtCharts class MainWidget(QWidget): def __init__(self, parent=None): super(MainWidget, self).__init__(parent) self.chart = QtCharts.QChart() self.series = QtCharts.QBarSeries() self.main_layout = QGridLayout() self.button_layout = QGridLayout() self.font_layout = QFormLayout() self.font_size = QDoubleSpinBox() self.legend_posx = QDoubleSpinBox() self.legend_posy = QDoubleSpinBox() self.legend_width = QDoubleSpinBox() self.legend_height = QDoubleSpinBox() self.detach_legend_button = QPushButton("Toggle attached") self.detach_legend_button.clicked.connect(self.toggle_attached) self.button_layout.addWidget(self.detach_legend_button, 0, 0) self.add_set_button = QPushButton("add barset") self.add_set_button.clicked.connect(self.add_barset) self.button_layout.addWidget(self.add_set_button, 2, 0) self.remove_barset_button = QPushButton("remove barset") self.remove_barset_button.clicked.connect(self.remove_barset) self.button_layout.addWidget(self.remove_barset_button, 3, 0) self.align_button = QPushButton("Align (Bottom)") self.align_button.clicked.connect(self.set_legend_alignment) self.button_layout.addWidget(self.align_button, 4, 0) self.bold_button = QPushButton("Toggle bold") self.bold_button.clicked.connect(self.toggle_bold) self.button_layout.addWidget(self.bold_button, 8, 0) self.italic_button = QPushButton("Toggle italic") self.italic_button.clicked.connect(self.toggle_italic) self.button_layout.addWidget(self.italic_button, 9, 0) self.legend_posx.valueChanged.connect(self.update_legend_layout) self.legend_posy.valueChanged.connect(self.update_legend_layout) self.legend_width.valueChanged.connect(self.update_legend_layout) self.legend_height.valueChanged.connect(self.update_legend_layout) legend_layout = QFormLayout() legend_layout.addRow("HPos", self.legend_posx) legend_layout.addRow("VPos", self.legend_posy) legend_layout.addRow("Width", self.legend_width) legend_layout.addRow("Height", self.legend_height) self.legend_settings = QGroupBox("Detached legend") self.legend_settings.setLayout(legend_layout) self.button_layout.addWidget(self.legend_settings) self.legend_settings.setVisible(False) # Create chart view with the chart self.chart_view = QtCharts.QChartView(self.chart, self) # Create spinbox to modify font size self.font_size.setValue(self.chart.legend().font().pointSizeF()) self.font_size.valueChanged.connect(self.font_size_changed) self.font_layout.addRow("Legend font size", self.font_size) # Create layout for grid and detached legend self.main_layout.addLayout(self.button_layout, 0, 0) self.main_layout.addLayout(self.font_layout, 1, 0) self.main_layout.addWidget(self.chart_view, 0, 1, 3, 1) self.setLayout(self.main_layout) self.create_series() def create_series(self): self.add_barset() self.add_barset() self.add_barset() self.add_barset() self.chart.addSeries(self.series) self.chart.setTitle("Legend detach example") self.chart.createDefaultAxes() self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chart_view.setRenderHint(QPainter.Antialiasing) def show_legend_spinbox(self): self.legend_settings.setVisible(True) chart_viewrect = self.chart_view.rect() self.legend_posx.setMinimum(0) self.legend_posx.setMaximum(chart_viewrect.width()) self.legend_posx.setValue(150) self.legend_posy.setMinimum(0) self.legend_posy.setMaximum(chart_viewrect.height()) self.legend_posy.setValue(150) self.legend_width.setMinimum(0) self.legend_width.setMaximum(chart_viewrect.width()) self.legend_width.setValue(150) self.legend_height.setMinimum(0) self.legend_height.setMaximum(chart_viewrect.height()) self.legend_height.setValue(75) def hideLegendSpinbox(self): self.legend_settings.setVisible(False) def toggle_attached(self): legend = self.chart.legend() if legend.isAttachedToChart(): legend.detachFromChart() legend.setBackgroundVisible(True) legend.setBrush(QBrush(QColor(128, 128, 128, 128))) legend.setPen(QPen(QColor(192, 192, 192, 192))) self.show_legend_spinbox() self.update_legend_layout() else: legend.attachToChart() legend.setBackgroundVisible(False) self.hideLegendSpinbox() self.update() def add_barset(self): series_count = self.series.count() bar_set = QtCharts.QBarSet("set {}".format(series_count)) delta = series_count * 0.1 bar_set.append([1 + delta, 2 + delta, 3 + delta, 4 + delta]) self.series.append(bar_set) def remove_barset(self): sets = self.series.barSets() len_sets = len(sets) if len_sets > 0: self.series.remove(sets[len_sets - 1]) def set_legend_alignment(self): button = self.sender() legend = self.chart.legend() alignment = legend.alignment() if alignment == Qt.AlignTop: legend.setAlignment(Qt.AlignLeft) if button: button.setText("Align (Left)") elif alignment == Qt.AlignLeft: legend.setAlignment(Qt.AlignBottom) if button: button.setText("Align (Bottom)") elif alignment == Qt.AlignBottom: legend.setAlignment(Qt.AlignRight) if button: button.setText("Align (Right)") else: if button: button.setText("Align (Top)") legend.setAlignment(Qt.AlignTop) def toggle_bold(self): legend = self.chart.legend() font = legend.font() font.setBold(not font.bold()) legend.setFont(font) def toggle_italic(self): legend = self.chart.legend() font = legend.font() font.setItalic(not font.italic()) legend.setFont(font) def font_size_changed(self): legend = self.chart.legend() font = legend.font() font_size = self.font_size.value() if font_size < 1: font_size = 1 font.setPointSizeF(font_size) legend.setFont(font) def update_legend_layout(self): legend = self.chart.legend() rect = QRectF(self.legend_posx.value(), self.legend_posy.value(), self.legend_width.value(), self.legend_height.value()) legend.setGeometry(rect) legend.update() if __name__ == "__main__": app = QApplication(sys.argv) w = MainWidget() available_geometry = app.desktop().availableGeometry(w) size = available_geometry.height() * 0.75 w.setFixedSize(size, size) w.show() sys.exit(app.exec_()) examples/charts/lineandbar.py000066400000000000000000000106151376617013100166410ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 line/bar example from Qt v5.x""" import sys from PySide2.QtCore import QPoint, Qt from PySide2.QtGui import QPainter from PySide2.QtWidgets import QMainWindow, QApplication from PySide2.QtCharts import QtCharts class TestChart(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.set0 = QtCharts.QBarSet("Jane") self.set1 = QtCharts.QBarSet("John") self.set2 = QtCharts.QBarSet("Axel") self.set3 = QtCharts.QBarSet("Mary") self.set4 = QtCharts.QBarSet("Sam") self.set0.append([1, 2, 3, 4, 5, 6]) self.set1.append([5, 0, 0, 4, 0, 7]) self.set2.append([3, 5, 8, 13, 8, 5]) self.set3.append([5, 6, 7, 3, 4, 5]) self.set4.append([9, 7, 5, 3, 1, 2]) self.barSeries = QtCharts.QBarSeries() self.barSeries.append(self.set0) self.barSeries.append(self.set1) self.barSeries.append(self.set2) self.barSeries.append(self.set3) self.barSeries.append(self.set4) self.lineSeries = QtCharts.QLineSeries() self.lineSeries.setName("trend") self.lineSeries.append(QPoint(0, 4)) self.lineSeries.append(QPoint(1, 15)) self.lineSeries.append(QPoint(2, 20)) self.lineSeries.append(QPoint(3, 4)) self.lineSeries.append(QPoint(4, 12)) self.lineSeries.append(QPoint(5, 17)) self.chart = QtCharts.QChart() self.chart.addSeries(self.barSeries) self.chart.addSeries(self.lineSeries) self.chart.setTitle("Line and barchart example") self.categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] self.axisX = QtCharts.QBarCategoryAxis() self.axisX.append(self.categories) self.chart.setAxisX(self.axisX, self.lineSeries) self.chart.setAxisX(self.axisX, self.barSeries) self.axisX.setRange("Jan", "Jun") self.axisY = QtCharts.QValueAxis() self.chart.setAxisY(self.axisY, self.lineSeries) self.chart.setAxisY(self.axisY, self.barSeries) self.axisY.setRange(0, 20) self.chart.legend().setVisible(True) self.chart.legend().setAlignment(Qt.AlignBottom) self.chartView = QtCharts.QChartView(self.chart) self.chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(self.chartView) if __name__ == "__main__": app = QApplication(sys.argv) window = TestChart() window.show() window.resize(440, 300) sys.exit(app.exec_()) examples/charts/linechart.py000066400000000000000000000062731376617013100165200ustar00rootroot00000000000000############################################################################# ## ## 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 linechart example from Qt v5.x""" import sys from PySide2.QtCore import QPointF from PySide2.QtGui import QPainter from PySide2.QtWidgets import QMainWindow, QApplication from PySide2.QtCharts import QtCharts class TestChart(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.series = QtCharts.QLineSeries() self.series.append(0, 6) self.series.append(2, 4) self.series.append(3, 8) self.series.append(7, 4) self.series.append(10, 5) self.series.append(QPointF(11, 1)) self.series.append(QPointF(13, 3)) self.series.append(QPointF(17, 6)) self.series.append(QPointF(18, 3)) self.series.append(QPointF(20, 2)) self.chart = QtCharts.QChart() self.chart.legend().hide() self.chart.addSeries(self.series) self.chart.createDefaultAxes() self.chart.setTitle("Simple line chart example") self.chartView = QtCharts.QChartView(self.chart) self.chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(self.chartView) if __name__ == "__main__": app = QApplication(sys.argv) window = TestChart() window.show() window.resize(440, 300) sys.exit(app.exec_()) examples/charts/logvalueaxis.py000066400000000000000000000070301376617013100172420ustar00rootroot00000000000000############################################################################# ## ## 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 Logarithmic Axis Example from Qt v5.x""" import sys from PySide2.QtCore import Qt, QPointF from PySide2.QtGui import QPainter from PySide2.QtWidgets import QMainWindow, QApplication from PySide2.QtCharts import QtCharts class TestChart(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.series = QtCharts.QLineSeries() self.series.append([ QPointF(1.0, 1.0), QPointF(2.0, 73.0), QPointF(3.0, 268.0), QPointF(4.0, 17.0), QPointF(5.0, 4325.0), QPointF(6.0, 723.0)]) self.chart = QtCharts.QChart() self.chart.addSeries(self.series) self.chart.legend().hide() self.chart.setTitle("Logarithmic axis example") self.axisX = QtCharts.QValueAxis() self.axisX.setTitleText("Data point") self.axisX.setLabelFormat("%i") self.axisX.setTickCount(self.series.count()) self.chart.addAxis(self.axisX, Qt.AlignBottom) self.series.attachAxis(self.axisX) self.axisY = QtCharts.QLogValueAxis() self.axisY.setTitleText("Values") self.axisY.setLabelFormat("%g") self.axisY.setBase(8.0) self.axisY.setMinorTickCount(-1) self.chart.addAxis(self.axisY, Qt.AlignLeft) self.series.attachAxis(self.axisY) self.chartView = QtCharts.QChartView(self.chart) self.chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(self.chartView) if __name__ == "__main__": app = QApplication(sys.argv) window = TestChart() window.show() window.resize(800, 600) sys.exit(app.exec_()) examples/charts/memoryusage.py000066400000000000000000000116301376617013100170750ustar00rootroot00000000000000 ############################################################################# ## ## 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 Charts example: Simple memory usage viewer""" import os import sys from PySide2.QtCore import QProcess from PySide2.QtWidgets import QApplication, QMainWindow from PySide2.QtCharts import QtCharts def runProcess(command, arguments): process = QProcess() process.start(command, arguments) process.waitForFinished() std_output = process.readAllStandardOutput().data().decode('utf-8') return std_output.split('\n') def getMemoryUsage(): result = [] if sys.platform == 'win32': # Windows: Obtain memory usage in KB from 'tasklist' for line in runProcess('tasklist', [])[3:]: if len(line) >= 74: command = line[0:23].strip() if command.endswith('.exe'): command = command[0:len(command) - 4] memoryUsage = float(line[64:74].strip().replace(',', '').replace('.', '')) legend = '' if memoryUsage > 10240: legend = '{} {}M'.format(command, round(memoryUsage / 1024)) else: legend = '{} {}K'.format(command, round(memoryUsage)) result.append([legend, memoryUsage]) else: # Unix: Obtain memory usage percentage from 'ps' psOptions = ['-e', 'v'] memoryColumn = 8 commandColumn = 9 if sys.platform == 'darwin': psOptions = ['-e', '-v'] memoryColumn = 11 commandColumn = 12 for line in runProcess('ps', psOptions): tokens = line.split(None) if len(tokens) > commandColumn and "PID" not in tokens: # Percentage and command command = tokens[commandColumn] if not command.startswith('['): command = os.path.basename(command) memoryUsage = round(float(tokens[memoryColumn].replace(',', '.'))) legend = '{} {}%'.format(command, memoryUsage) result.append([legend, memoryUsage]) result.sort(key = lambda x: x[1], reverse=True) return result class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('Memory Usage') memoryUsage = getMemoryUsage() if len(memoryUsage) > 5: memoryUsage = memoryUsage[0:4] self.series = QtCharts.QPieSeries() for item in memoryUsage: self.series.append(item[0], item[1]) slice = self.series.slices()[0] slice.setExploded() slice.setLabelVisible() self.chart = QtCharts.QChart() self.chart.addSeries(self.series) self.chartView = QtCharts.QChartView(self.chart) self.setCentralWidget(self.chartView) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() availableGeometry = app.desktop().availableGeometry(mainWin) size = availableGeometry.height() * 3 / 4 mainWin.resize(size, size) mainWin.show() sys.exit(app.exec_()) examples/charts/modeldata.py000066400000000000000000000152201376617013100164710ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 Model Data example from Qt v5.x""" import sys from random import randrange from PySide2.QtCore import QAbstractTableModel, QModelIndex, QRect, Qt from PySide2.QtGui import QColor, QPainter from PySide2.QtWidgets import (QApplication, QGridLayout, QHeaderView, QTableView, QWidget) from PySide2.QtCharts import QtCharts class CustomTableModel(QAbstractTableModel): def __init__(self): QAbstractTableModel.__init__(self) self.input_data = [] self.mapping = {} self.column_count = 4 self.row_count = 15 for i in range(self.row_count): data_vec = [0]*self.column_count for k in range(len(data_vec)): if k % 2 == 0: data_vec[k] = i * 50 + randrange(30) else: data_vec[k] = randrange(100) self.input_data.append(data_vec) def rowCount(self, parent=QModelIndex()): return len(self.input_data) def columnCount(self, parent=QModelIndex()): return self.column_count def headerData(self, section, orientation, role): if role != Qt.DisplayRole: return None if orientation == Qt.Horizontal: if section % 2 == 0: return "x" else: return "y" else: return "{}".format(section + 1) def data(self, index, role=Qt.DisplayRole): if role == Qt.DisplayRole: return self.input_data[index.row()][index.column()] elif role == Qt.EditRole: return self.input_data[index.row()][index.column()] elif role == Qt.BackgroundRole: for color, rect in self.mapping.items(): if rect.contains(index.column(), index.row()): return QColor(color) # cell not mapped return white color return QColor(Qt.white) return None def setData(self, index, value, role=Qt.EditRole): if index.isValid() and role == Qt.EditRole: self.input_data[index.row()][index.column()] = float(value) self.dataChanged.emit(index, index) return True return False def flags(self, index): return Qt.ItemIsEnabled | Qt.ItemIsEditable | Qt.ItemIsSelectable def add_mapping(self, color, area): self.mapping[color] = area def clear_mapping(self): self.mapping = {} class TableWidget(QWidget): def __init__(self): QWidget.__init__(self) self.model = CustomTableModel() self.table_view = QTableView() self.table_view.setModel(self.model) self.table_view.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) self.table_view.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) self.chart = QtCharts.QChart() self.chart.setAnimationOptions(QtCharts.QChart.AllAnimations) self.series = QtCharts.QLineSeries() self.series.setName("Line 1") self.mapper = QtCharts.QVXYModelMapper(self) self.mapper.setXColumn(0) self.mapper.setYColumn(1) self.mapper.setSeries(self.series) self.mapper.setModel(self.model) self.chart.addSeries(self.series) # for storing color hex from the series seriesColorHex = "#000000" # get the color of the series and use it for showing the mapped area seriesColorHex = "{}".format(self.series.pen().color().name()) self.model.add_mapping(seriesColorHex, QRect(0, 0, 2, self.model.rowCount())) # series 2 self.series = QtCharts.QLineSeries() self.series.setName("Line 2") self.mapper = QtCharts.QVXYModelMapper(self) self.mapper.setXColumn(2) self.mapper.setYColumn(3) self.mapper.setSeries(self.series) self.mapper.setModel(self.model) self.chart.addSeries(self.series) # get the color of the series and use it for showing the mapped area seriesColorHex = "{}".format(self.series.pen().color().name()) self.model.add_mapping(seriesColorHex, QRect(2, 0, 2, self.model.rowCount())) self.chart.createDefaultAxes() self.chart_view = QtCharts.QChartView(self.chart) self.chart_view.setRenderHint(QPainter.Antialiasing) self.chart_view.setMinimumSize(640, 480) # create main layout self.main_layout = QGridLayout() self.main_layout.addWidget(self.table_view, 1, 0) self.main_layout.addWidget(self.chart_view, 1, 1) self.main_layout.setColumnStretch(1, 1) self.main_layout.setColumnStretch(0, 0) self.setLayout(self.main_layout) if __name__ == "__main__": app = QApplication(sys.argv) w = TableWidget() w.show() sys.exit(app.exec_()) examples/charts/nesteddonuts.py000066400000000000000000000120631376617013100172600ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 Nested Donuts example from Qt v5.x""" import sys from PySide2.QtCore import Qt, QTimer from PySide2.QtGui import QPainter from PySide2.QtWidgets import QApplication, QGridLayout, QWidget from PySide2.QtCharts import QtCharts from random import randrange from functools import partial class Widget(QWidget): def __init__(self): QWidget.__init__(self) self.setMinimumSize(800, 600) self.donuts = [] self.chart_view = QtCharts.QChartView() self.chart_view.setRenderHint(QPainter.Antialiasing) self.chart = self.chart_view.chart() self.chart.legend().setVisible(False) self.chart.setTitle("Nested donuts demo") self.chart.setAnimationOptions(QtCharts.QChart.AllAnimations) self.min_size = 0.1 self.max_size = 0.9 self.donut_count = 5 self.setup_donuts() # create main layout self.main_layout = QGridLayout(self) self.main_layout.addWidget(self.chart_view, 1, 1) self.setLayout(self.main_layout) self.update_timer = QTimer(self) self.update_timer.timeout.connect(self.update_rotation) self.update_timer.start(1250) def setup_donuts(self): for i in range(self.donut_count): donut = QtCharts.QPieSeries() slccount = randrange(3, 6) for j in range(slccount): value = randrange(100, 200) slc = QtCharts.QPieSlice(str(value), value) slc.setLabelVisible(True) slc.setLabelColor(Qt.white) slc.setLabelPosition(QtCharts.QPieSlice.LabelInsideTangential) # Connection using an extra parameter for the slot slc.hovered[bool].connect(partial(self.explode_slice, slc=slc)) donut.append(slc) size = (self.max_size - self.min_size)/self.donut_count donut.setHoleSize(self.min_size + i * size) donut.setPieSize(self.min_size + (i + 1) * size) self.donuts.append(donut) self.chart_view.chart().addSeries(donut) def update_rotation(self): for donut in self.donuts: phase_shift = randrange(-50, 100) donut.setPieStartAngle(donut.pieStartAngle() + phase_shift) donut.setPieEndAngle(donut.pieEndAngle() + phase_shift) def explode_slice(self, exploded, slc): if exploded: self.update_timer.stop() slice_startangle = slc.startAngle() slice_endangle = slc.startAngle() + slc.angleSpan() donut = slc.series() idx = self.donuts.index(donut) for i in range(idx + 1, len(self.donuts)): self.donuts[i].setPieStartAngle(slice_endangle) self.donuts[i].setPieEndAngle(360 + slice_startangle) else: for donut in self.donuts: donut.setPieStartAngle(0) donut.setPieEndAngle(360) self.update_timer.start() slc.setExploded(exploded) if __name__ == "__main__": app = QApplication(sys.argv) w = Widget() w.show() sys.exit(app.exec_()) examples/charts/percentbarchart.py000066400000000000000000000071471376617013100177170ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 Percent Bar Chart example from Qt v5.x""" import sys from PySide2.QtCore import Qt from PySide2.QtGui import QPainter from PySide2.QtWidgets import (QMainWindow, QApplication) from PySide2.QtCharts import QtCharts class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) set0 = QtCharts.QBarSet("Jane") set1 = QtCharts.QBarSet("John") set2 = QtCharts.QBarSet("Axel") set3 = QtCharts.QBarSet("Mary") set4 = QtCharts.QBarSet("Samantha") set0.append([1, 2, 3, 4, 5, 6]) set1.append([5, 0, 0, 4, 0, 7]) set2.append([3, 5, 8, 13, 8, 5]) set3.append([5, 6, 7, 3, 4, 5]) set4.append([9, 7, 5, 3, 1, 2]) series = QtCharts.QPercentBarSeries() series.append(set0) series.append(set1) series.append(set2) series.append(set3) series.append(set4) chart = QtCharts.QChart() chart.addSeries(series) chart.setTitle("Simple percentbarchart example") chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations) categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun"] axis = QtCharts.QBarCategoryAxis() axis.append(categories) chart.createDefaultAxes() chart.setAxisX(axis, series) chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view = QtCharts.QChartView(chart) chart_view.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chart_view) if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() w.resize(420, 300) w.show() sys.exit(app.exec_()) examples/charts/piechart.py000066400000000000000000000062431376617013100163430ustar00rootroot00000000000000############################################################################# ## ## 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 Pie Chart Example from Qt v5.x""" import sys from PySide2.QtCore import Qt from PySide2.QtGui import QPainter, QPen from PySide2.QtWidgets import QMainWindow, QApplication from PySide2.QtCharts import QtCharts class TestChart(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.series = QtCharts.QPieSeries() self.series.append('Jane', 1) self.series.append('Joe', 2) self.series.append('Andy', 3) self.series.append('Barbara', 4) self.series.append('Axel', 5) self.slice = self.series.slices()[1] self.slice.setExploded() self.slice.setLabelVisible() self.slice.setPen(QPen(Qt.darkGreen, 2)) self.slice.setBrush(Qt.green) self.chart = QtCharts.QChart() self.chart.addSeries(self.series) self.chart.setTitle('Simple piechart example') self.chart.legend().hide() self.chartView = QtCharts.QChartView(self.chart) self.chartView.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(self.chartView) if __name__ == "__main__": app = QApplication(sys.argv) window = TestChart() window.show() window.resize(440, 300) sys.exit(app.exec_()) examples/charts/qmlpolarchart/000077500000000000000000000000001376617013100170365ustar00rootroot00000000000000examples/charts/qmlpolarchart/View1.qml000066400000000000000000000044711376617013100205520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtCharts 2.0 Item { anchors.fill: parent //![1] PolarChartView { title: "Two Series, Common Axes" anchors.fill: parent legend.visible: false antialiasing: true ValueAxis { id: axisAngular min: 0 max: 20 tickCount: 9 } ValueAxis { id: axisRadial min: -0.5 max: 1.5 } SplineSeries { id: series1 axisAngular: axisAngular axisRadial: axisRadial pointsVisible: true } ScatterSeries { id: series2 axisAngular: axisAngular axisRadial: axisRadial markerSize: 10 } } // Add data dynamically to the series Component.onCompleted: { for (var i = 0; i <= 20; i++) { series1.append(i, Math.random()); series2.append(i, Math.random()); } } //![1] } examples/charts/qmlpolarchart/View2.qml000066400000000000000000000100111376617013100205360ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtCharts 2.0 Item { anchors.fill: parent //![1] PolarChartView { title: "Historical Area Series" anchors.fill: parent legend.visible: false antialiasing: true DateTimeAxis { id: axis1 format: "yyyy MMM" tickCount: 13 } ValueAxis { id: axis2 } LineSeries { id: lowerLine axisAngular: axis1 axisRadial: axis2 // Please note that month in JavaScript months are zero based, so 2 means March XYPoint { x: toMsecsSinceEpoch(new Date(1950, 0, 1)); y: 15 } XYPoint { x: toMsecsSinceEpoch(new Date(1962, 4, 1)); y: 35 } XYPoint { x: toMsecsSinceEpoch(new Date(1970, 0, 1)); y: 50 } XYPoint { x: toMsecsSinceEpoch(new Date(1978, 2, 1)); y: 75 } XYPoint { x: toMsecsSinceEpoch(new Date(1987, 11, 1)); y: 102 } XYPoint { x: toMsecsSinceEpoch(new Date(1992, 1, 1)); y: 132 } XYPoint { x: toMsecsSinceEpoch(new Date(1998, 7, 1)); y: 100 } XYPoint { x: toMsecsSinceEpoch(new Date(2002, 4, 1)); y: 120 } XYPoint { x: toMsecsSinceEpoch(new Date(2012, 8, 1)); y: 140 } XYPoint { x: toMsecsSinceEpoch(new Date(2013, 5, 1)); y: 150 } } LineSeries { id: upperLine axisAngular: axis1 axisRadial: axis2 // Please note that month in JavaScript months are zero based, so 2 means March XYPoint { x: toMsecsSinceEpoch(new Date(1950, 0, 1)); y: 30 } XYPoint { x: toMsecsSinceEpoch(new Date(1962, 4, 1)); y: 55 } XYPoint { x: toMsecsSinceEpoch(new Date(1970, 0, 1)); y: 80 } XYPoint { x: toMsecsSinceEpoch(new Date(1978, 2, 1)); y: 105 } XYPoint { x: toMsecsSinceEpoch(new Date(1987, 11, 1)); y: 125 } XYPoint { x: toMsecsSinceEpoch(new Date(1992, 1, 1)); y: 160 } XYPoint { x: toMsecsSinceEpoch(new Date(1998, 7, 1)); y: 140 } XYPoint { x: toMsecsSinceEpoch(new Date(2002, 4, 1)); y: 140 } XYPoint { x: toMsecsSinceEpoch(new Date(2012, 8, 1)); y: 170 } XYPoint { x: toMsecsSinceEpoch(new Date(2013, 5, 1)); y: 200 } } AreaSeries { axisAngular: axis1 axisRadial: axis2 lowerSeries: lowerLine upperSeries: upperLine } } // DateTimeAxis is based on QDateTimes so we must convert our JavaScript dates to // milliseconds since epoch to make them match the DateTimeAxis values function toMsecsSinceEpoch(date) { var msecs = date.getTime(); return msecs; } //![1] } examples/charts/qmlpolarchart/View3.qml000066400000000000000000000053421376617013100205520ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 import QtCharts 2.0 Item { anchors.fill: parent //![1] PolarChartView { title: "Numerical Data for Dummies" anchors.fill: parent legend.visible: false antialiasing: true LineSeries { axisRadial: CategoryAxis { min: 0 max: 30 CategoryRange { label: "critical" endValue: 2 } CategoryRange { label: "low" endValue: 7 } CategoryRange { label: "normal" endValue: 12 } CategoryRange { label: "high" endValue: 18 } CategoryRange { label: "extremely high" endValue: 30 } } axisAngular: ValueAxis { tickCount: 13 } XYPoint { x: 0; y: 4.3 } XYPoint { x: 1; y: 4.1 } XYPoint { x: 2; y: 4.7 } XYPoint { x: 3; y: 3.9 } XYPoint { x: 4; y: 5.2 } XYPoint { x: 5; y: 5.3 } XYPoint { x: 6; y: 6.1 } XYPoint { x: 7; y: 7.7 } XYPoint { x: 8; y: 12.9 } XYPoint { x: 9; y: 19.2 } } } //![1] } examples/charts/qmlpolarchart/main.qml000066400000000000000000000053631376617013100205040ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Charts module of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:GPL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3 or (at your option) any later version ** approved by the KDE Free Qt Foundation. The licenses are as published by ** the Free Software Foundation and appearing in the file LICENSE.GPL3 ** included in the packaging of this file. Please review the following ** information to ensure the GNU General Public License requirements will ** be met: https://www.gnu.org/licenses/gpl-3.0.html. ** ** $QT_END_LICENSE$ ** ****************************************************************************/ import QtQuick 2.0 Item { width: 800 height: 600 property bool sourceLoaded: false ListView { id: root focus: true anchors.fill: parent snapMode: ListView.SnapOneItem highlightRangeMode: ListView.StrictlyEnforceRange highlightMoveDuration: 250 orientation: ListView.Horizontal boundsBehavior: Flickable.StopAtBounds onCurrentIndexChanged: { if (infoText.opacity > 0.0) { if (sourceLoaded) infoText.opacity = 0.0; else if (currentIndex != 0) currentIndex = 0; } } model: ListModel { ListElement {component: "View1.qml"} ListElement {component: "View2.qml"} ListElement {component: "View3.qml"} } delegate: Loader { width: root.width height: root.height source: component asynchronous: true onLoaded: sourceLoaded = true } } Rectangle { id: infoText anchors.centerIn: parent width: parent.width height: 40 color: "black" Text { color: "white" anchors.centerIn: parent text: "You can navigate between views using swipe or arrow keys" } Behavior on opacity { NumberAnimation { duration: 400 } } } } examples/charts/qmlpolarchart/qmlpolarchart.py000066400000000000000000000051441376617013100222650ustar00rootroot00000000000000############################################################################# ## ## 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 QML Polar Chart Example from Qt v5.x""" import sys import os from PySide2.QtQuick import QQuickView from PySide2.QtCore import Qt, QUrl from PySide2.QtWidgets import QApplication, QMainWindow if __name__ == '__main__': app = QApplication(sys.argv) viewer = QQuickView() viewer.engine().addImportPath(os.path.dirname(__file__)) viewer.engine().quit.connect(viewer.close) viewer.setTitle = "QML Polar Chart" qmlFile = os.path.join(os.path.dirname(__file__), 'main.qml') viewer.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) viewer.setResizeMode(QQuickView.SizeRootObjectToView) viewer.show() sys.exit(app.exec_()) examples/charts/qmlpolarchart/qmlpolarchart.pyproject000066400000000000000000000001461376617013100236510ustar00rootroot00000000000000{ "files": ["View1.qml", "View1.qml", "View2.qml", "View3.qml", "main.qml", "qmlpolarchart.py"] } examples/charts/temperaturerecords.py000066400000000000000000000073371376617013100204700ustar00rootroot00000000000000############################################################################# ## ## 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 Temperature Records example from Qt v5.x""" import sys from PySide2.QtCore import Qt from PySide2.QtGui import QPainter from PySide2.QtWidgets import QMainWindow, QApplication from PySide2.QtCharts import QtCharts class MainWindow(QMainWindow): def __init__(self): QMainWindow.__init__(self) low = QtCharts.QBarSet("Min") high = QtCharts.QBarSet("Max") low.append([-52, -50, -45.3, -37.0, -25.6, -8.0, -6.0, -11.8, -19.7, -32.8, -43.0, -48.0]) high.append([11.9, 12.8, 18.5, 26.5, 32.0, 34.8, 38.2, 34.8, 29.8, 20.4, 15.1, 11.8]) series = QtCharts.QStackedBarSeries() series.append(low) series.append(high) chart = QtCharts.QChart() chart.addSeries(series) chart.setTitle("Temperature records in celcius") chart.setAnimationOptions(QtCharts.QChart.SeriesAnimations) categories = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] axisX = QtCharts.QBarCategoryAxis() axisX.append(categories) axisX.setTitleText("Month") chart.addAxis(axisX, Qt.AlignBottom) axisY = QtCharts.QValueAxis() axisY.setRange(-52, 52) axisY.setTitleText("Temperature [°C]") chart.addAxis(axisY, Qt.AlignLeft) series.attachAxis(axisX) series.attachAxis(axisY) chart.legend().setVisible(True) chart.legend().setAlignment(Qt.AlignBottom) chart_view = QtCharts.QChartView(chart) chart_view.setRenderHint(QPainter.Antialiasing) self.setCentralWidget(chart_view) if __name__ == "__main__": app = QApplication(sys.argv) w = MainWindow() w.resize(600, 300) w.show() sys.exit(app.exec_()) examples/corelib/000077500000000000000000000000001376617013100143205ustar00rootroot00000000000000examples/corelib/threads/000077500000000000000000000000001376617013100157525ustar00rootroot00000000000000examples/corelib/threads/mandelbrot.py000066400000000000000000000277611376617013100204700ustar00rootroot00000000000000 ############################################################################# ## ## 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 corelib/threads/mandelbrot example from Qt v5.x, originating from PyQt""" from PySide2.QtCore import (Signal, QMutex, QMutexLocker, QPoint, QSize, Qt, QThread, QWaitCondition) from PySide2.QtGui import QColor, QImage, QPainter, QPixmap, qRgb from PySide2.QtWidgets import QApplication, QWidget DefaultCenterX = -0.647011 DefaultCenterY = -0.0395159 DefaultScale = 0.00403897 ZoomInFactor = 0.8 ZoomOutFactor = 1 / ZoomInFactor ScrollStep = 20 class RenderThread(QThread): ColormapSize = 512 renderedImage = Signal(QImage, float) def __init__(self, parent=None): super(RenderThread, self).__init__(parent) self.mutex = QMutex() self.condition = QWaitCondition() self.centerX = 0.0 self.centerY = 0.0 self.scaleFactor = 0.0 self.resultSize = QSize() self.colormap = [] self.restart = False self.abort = False for i in range(RenderThread.ColormapSize): self.colormap.append(self.rgbFromWaveLength(380.0 + (i * 400.0 / RenderThread.ColormapSize))) def stop(self): self.mutex.lock() self.abort = True self.condition.wakeOne() self.mutex.unlock() self.wait(2000) def render(self, centerX, centerY, scaleFactor, resultSize): locker = QMutexLocker(self.mutex) self.centerX = centerX self.centerY = centerY self.scaleFactor = scaleFactor self.resultSize = resultSize if not self.isRunning(): self.start(QThread.LowPriority) else: self.restart = True self.condition.wakeOne() def run(self): while True: self.mutex.lock() resultSize = self.resultSize scaleFactor = self.scaleFactor centerX = self.centerX centerY = self.centerY self.mutex.unlock() halfWidth = resultSize.width() // 2 halfHeight = resultSize.height() // 2 image = QImage(resultSize, QImage.Format_RGB32) NumPasses = 8 curpass = 0 while curpass < NumPasses: MaxIterations = (1 << (2 * curpass + 6)) + 32 Limit = 4 allBlack = True for y in range(-halfHeight, halfHeight): if self.restart: break if self.abort: return ay = 1j * (centerY + (y * scaleFactor)) for x in range(-halfWidth, halfWidth): c0 = centerX + (x * scaleFactor) + ay c = c0 numIterations = 0 while numIterations < MaxIterations: numIterations += 1 c = c*c + c0 if abs(c) >= Limit: break numIterations += 1 c = c*c + c0 if abs(c) >= Limit: break numIterations += 1 c = c*c + c0 if abs(c) >= Limit: break numIterations += 1 c = c*c + c0 if abs(c) >= Limit: break if numIterations < MaxIterations: image.setPixel(x + halfWidth, y + halfHeight, self.colormap[numIterations % RenderThread.ColormapSize]) allBlack = False else: image.setPixel(x + halfWidth, y + halfHeight, qRgb(0, 0, 0)) if allBlack and curpass == 0: curpass = 4 else: if not self.restart: self.renderedImage.emit(image, scaleFactor) curpass += 1 self.mutex.lock() if not self.restart: self.condition.wait(self.mutex) self.restart = False self.mutex.unlock() def rgbFromWaveLength(self, wave): r = 0.0 g = 0.0 b = 0.0 if wave >= 380.0 and wave <= 440.0: r = -1.0 * (wave - 440.0) / (440.0 - 380.0) b = 1.0 elif wave >= 440.0 and wave <= 490.0: g = (wave - 440.0) / (490.0 - 440.0) b = 1.0 elif wave >= 490.0 and wave <= 510.0: g = 1.0 b = -1.0 * (wave - 510.0) / (510.0 - 490.0) elif wave >= 510.0 and wave <= 580.0: r = (wave - 510.0) / (580.0 - 510.0) g = 1.0 elif wave >= 580.0 and wave <= 645.0: r = 1.0 g = -1.0 * (wave - 645.0) / (645.0 - 580.0) elif wave >= 645.0 and wave <= 780.0: r = 1.0 s = 1.0 if wave > 700.0: s = 0.3 + 0.7 * (780.0 - wave) / (780.0 - 700.0) elif wave < 420.0: s = 0.3 + 0.7 * (wave - 380.0) / (420.0 - 380.0) r = pow(r * s, 0.8) g = pow(g * s, 0.8) b = pow(b * s, 0.8) return qRgb(r*255, g*255, b*255) class MandelbrotWidget(QWidget): def __init__(self, parent=None): super(MandelbrotWidget, self).__init__(parent) self.thread = RenderThread() self.pixmap = QPixmap() self.pixmapOffset = QPoint() self.lastDragPos = QPoint() self.centerX = DefaultCenterX self.centerY = DefaultCenterY self.pixmapScale = DefaultScale self.curScale = DefaultScale self.thread.renderedImage.connect(self.updatePixmap) self.setWindowTitle("Mandelbrot") self.setCursor(Qt.CrossCursor) self.resize(550, 400) def paintEvent(self, event): painter = QPainter(self) painter.fillRect(self.rect(), Qt.black) if self.pixmap.isNull(): painter.setPen(Qt.white) painter.drawText(self.rect(), Qt.AlignCenter, "Rendering initial image, please wait...") return if self.curScale == self.pixmapScale: painter.drawPixmap(self.pixmapOffset, self.pixmap) else: scaleFactor = self.pixmapScale / self.curScale newWidth = int(self.pixmap.width() * scaleFactor) newHeight = int(self.pixmap.height() * scaleFactor) newX = self.pixmapOffset.x() + (self.pixmap.width() - newWidth) / 2 newY = self.pixmapOffset.y() + (self.pixmap.height() - newHeight) / 2 painter.save() painter.translate(newX, newY) painter.scale(scaleFactor, scaleFactor) exposed, _ = painter.matrix().inverted() exposed = exposed.mapRect(self.rect()).adjusted(-1, -1, 1, 1) painter.drawPixmap(exposed, self.pixmap, exposed) painter.restore() text = "Use mouse wheel or the '+' and '-' keys to zoom. Press and " \ "hold left mouse button to scroll." metrics = painter.fontMetrics() textWidth = metrics.width(text) painter.setPen(Qt.NoPen) painter.setBrush(QColor(0, 0, 0, 127)) painter.drawRect((self.width() - textWidth) / 2 - 5, 0, textWidth + 10, metrics.lineSpacing() + 5) painter.setPen(Qt.white) painter.drawText((self.width() - textWidth) / 2, metrics.leading() + metrics.ascent(), text) def resizeEvent(self, event): self.thread.render(self.centerX, self.centerY, self.curScale, self.size()) def keyPressEvent(self, event): if event.key() == Qt.Key_Plus: self.zoom(ZoomInFactor) elif event.key() == Qt.Key_Minus: self.zoom(ZoomOutFactor) elif event.key() == Qt.Key_Left: self.scroll(-ScrollStep, 0) elif event.key() == Qt.Key_Right: self.scroll(+ScrollStep, 0) elif event.key() == Qt.Key_Down: self.scroll(0, -ScrollStep) elif event.key() == Qt.Key_Up: self.scroll(0, +ScrollStep) else: super(MandelbrotWidget, self).keyPressEvent(event) def wheelEvent(self, event): numDegrees = event.angleDelta().y() / 8 numSteps = numDegrees / 15.0 self.zoom(pow(ZoomInFactor, numSteps)) def mousePressEvent(self, event): if event.buttons() == Qt.LeftButton: self.lastDragPos = QPoint(event.pos()) def mouseMoveEvent(self, event): if event.buttons() & Qt.LeftButton: self.pixmapOffset += event.pos() - self.lastDragPos self.lastDragPos = QPoint(event.pos()) self.update() def mouseReleaseEvent(self, event): if event.button() == Qt.LeftButton: self.pixmapOffset += event.pos() - self.lastDragPos self.lastDragPos = QPoint() deltaX = (self.width() - self.pixmap.width()) / 2 - self.pixmapOffset.x() deltaY = (self.height() - self.pixmap.height()) / 2 - self.pixmapOffset.y() self.scroll(deltaX, deltaY) def updatePixmap(self, image, scaleFactor): if not self.lastDragPos.isNull(): return self.pixmap = QPixmap.fromImage(image) self.pixmapOffset = QPoint() self.lastDragPosition = QPoint() self.pixmapScale = scaleFactor self.update() def zoom(self, zoomFactor): self.curScale *= zoomFactor self.update() self.thread.render(self.centerX, self.centerY, self.curScale, self.size()) def scroll(self, deltaX, deltaY): self.centerX += deltaX * self.curScale self.centerY += deltaY * self.curScale self.update() self.thread.render(self.centerX, self.centerY, self.curScale, self.size()) if __name__ == '__main__': import sys app = QApplication(sys.argv) widget = MandelbrotWidget() widget.show() r = app.exec_() widget.thread.stop() sys.exit(r) examples/corelib/threads/threads.pyproject000066400000000000000000000000431376617013100213420ustar00rootroot00000000000000{ "files": ["mandelbrot.py"] } examples/corelib/tools/000077500000000000000000000000001376617013100154605ustar00rootroot00000000000000examples/corelib/tools/codecs/000077500000000000000000000000001376617013100167205ustar00rootroot00000000000000examples/corelib/tools/codecs/codecs.py000066400000000000000000000213571376617013100205420ustar00rootroot00000000000000 ############################################################################# ## ## 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/tools/codecs example from Qt v5.x""" from PySide2 import QtCore, QtWidgets def codec_name(codec): try: # Python v3. name = str(codec.name(), encoding='ascii') except TypeError: # Python v2. name = str(codec.name()) return name class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.textEdit = QtWidgets.QTextEdit() self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap) self.setCentralWidget(self.textEdit) self.codecs = [] self.findCodecs() self.previewForm = PreviewForm(self) self.previewForm.setCodecList(self.codecs) self.saveAsActs = [] self.createActions() self.createMenus() self.setWindowTitle("Codecs") self.resize(500, 400) def open(self): fileName, _ = QtWidgets.QFileDialog.getOpenFileName(self) if fileName: inFile = QtCore.QFile(fileName) if not inFile.open(QtCore.QFile.ReadOnly): QtWidgets.QMessageBox.warning(self, "Codecs", "Cannot read file %s:\n%s" % (fileName, inFile.errorString())) return data = inFile.readAll() self.previewForm.setEncodedData(data) if self.previewForm.exec_(): self.textEdit.setPlainText(self.previewForm.decodedString()) def save(self): fileName = QtWidgets.QFileDialog.getSaveFileName(self) if fileName: outFile = QtCore.QFile(fileName) if not outFile.open(QtCore.QFile.WriteOnly|QtCore.QFile.Text): QtWidgets.QMessageBox.warning(self, "Codecs", "Cannot write file %s:\n%s" % (fileName, outFile.errorString())) return action = self.sender() codecName = action.data() out = QtCore.QTextStream(outFile) out.setCodec(codecName) out << self.textEdit.toPlainText() def about(self): QtWidgets.QMessageBox.about(self, "About Codecs", "The Codecs example demonstrates how to read and " "write files using various encodings.") def aboutToShowSaveAsMenu(self): currentText = self.textEdit.toPlainText() for action in self.saveAsActs: codecName = str(action.data()) codec = QtCore.QTextCodec.codecForName(codecName) action.setVisible(codec and codec.canEncode(currentText)) def findCodecs(self): codecMap = [] iso8859RegExp = QtCore.QRegularExpression('^ISO[- ]8859-([0-9]+).*$') assert iso8859RegExp.isValid() for mib in QtCore.QTextCodec.availableMibs(): codec = QtCore.QTextCodec.codecForMib(mib) sortKey = codec_name(codec).upper() rank = 0 if sortKey.startswith('UTF-8'): rank = 1 elif sortKey.startswith('UTF-16'): rank = 2 else: match = iso8859RegExp.match(sortKey) if match.hasMatch(): if len(match.captured(1)) == 1: rank = 3 else: rank = 4 else: rank = 5 codecMap.append((str(rank) + sortKey, codec)) codecMap.sort() self.codecs = [item[-1] for item in codecMap] def createActions(self): self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open) for codec in self.codecs: name = codec_name(codec) action = QtWidgets.QAction(name + '...', self, triggered=self.save) action.setData(name) self.saveAsActs.append(action) self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) self.aboutAct = QtWidgets.QAction("&About", self, triggered=self.about) self.aboutQtAct = QtWidgets.QAction("About &Qt", self, triggered=qApp.aboutQt) def createMenus(self): self.saveAsMenu = QtWidgets.QMenu("&Save As", self) for action in self.saveAsActs: self.saveAsMenu.addAction(action) self.saveAsMenu.aboutToShow.connect(self.aboutToShowSaveAsMenu) self.fileMenu = QtWidgets.QMenu("&File", self) self.fileMenu.addAction(self.openAct) self.fileMenu.addMenu(self.saveAsMenu) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAct) self.helpMenu = QtWidgets.QMenu("&Help", self) self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) self.menuBar().addMenu(self.fileMenu) self.menuBar().addSeparator() self.menuBar().addMenu(self.helpMenu) class PreviewForm(QtWidgets.QDialog): def __init__(self, parent): super(PreviewForm, self).__init__(parent) self.encodingComboBox = QtWidgets.QComboBox() encodingLabel = QtWidgets.QLabel("&Encoding:") encodingLabel.setBuddy(self.encodingComboBox) self.textEdit = QtWidgets.QTextEdit() self.textEdit.setLineWrapMode(QtWidgets.QTextEdit.NoWrap) self.textEdit.setReadOnly(True) buttonBox = QtWidgets.QDialogButtonBox(QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel) self.encodingComboBox.activated.connect(self.updateTextEdit) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) mainLayout = QtWidgets.QGridLayout() mainLayout.addWidget(encodingLabel, 0, 0) mainLayout.addWidget(self.encodingComboBox, 0, 1) mainLayout.addWidget(self.textEdit, 1, 0, 1, 2) mainLayout.addWidget(buttonBox, 2, 0, 1, 2) self.setLayout(mainLayout) self.setWindowTitle("Choose Encoding") self.resize(400, 300) def setCodecList(self, codecs): self.encodingComboBox.clear() for codec in codecs: self.encodingComboBox.addItem(codec_name(codec), codec.mibEnum()) def setEncodedData(self, data): self.encodedData = data self.updateTextEdit() def decodedString(self): return self.decodedStr def updateTextEdit(self): mib = self.encodingComboBox.itemData(self.encodingComboBox.currentIndex()) codec = QtCore.QTextCodec.codecForMib(mib) data = QtCore.QTextStream(self.encodedData) data.setAutoDetectUnicode(False) data.setCodec(codec) self.decodedStr = data.readAll() self.textEdit.setPlainText(self.decodedStr) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/corelib/tools/codecs/codecs.pyproject000066400000000000000000000000371376617013100221210ustar00rootroot00000000000000{ "files": ["codecs.py"] } examples/corelib/tools/regexp.py000066400000000000000000000176701376617013100173370ustar00rootroot00000000000000 ############################################################################# ## ## 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/tools/regexp example from Qt v5.x""" from PySide2 import QtCore, QtGui, QtWidgets class RegExpDialog(QtWidgets.QDialog): MaxCaptures = 6 def __init__(self, parent=None): super(RegExpDialog, self).__init__(parent) self.patternComboBox = QtWidgets.QComboBox() self.patternComboBox.setEditable(True) self.patternComboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) patternLabel = QtWidgets.QLabel("&Pattern:") patternLabel.setBuddy(self.patternComboBox) self.escapedPatternLineEdit = QtWidgets.QLineEdit() self.escapedPatternLineEdit.setReadOnly(True) palette = self.escapedPatternLineEdit.palette() palette.setBrush(QtGui.QPalette.Base, palette.brush(QtGui.QPalette.Disabled, QtGui.QPalette.Base)) self.escapedPatternLineEdit.setPalette(palette) escapedPatternLabel = QtWidgets.QLabel("&Escaped Pattern:") escapedPatternLabel.setBuddy(self.escapedPatternLineEdit) self.syntaxComboBox = QtWidgets.QComboBox() self.syntaxComboBox.addItem("Regular expression v1", QtCore.QRegExp.RegExp) self.syntaxComboBox.addItem("Regular expression v2", QtCore.QRegExp.RegExp2) self.syntaxComboBox.addItem("Wildcard", QtCore.QRegExp.Wildcard) self.syntaxComboBox.addItem("Fixed string", QtCore.QRegExp.FixedString) syntaxLabel = QtWidgets.QLabel("&Pattern Syntax:") syntaxLabel.setBuddy(self.syntaxComboBox) self.textComboBox = QtWidgets.QComboBox() self.textComboBox.setEditable(True) self.textComboBox.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) textLabel = QtWidgets.QLabel("&Text:") textLabel.setBuddy(self.textComboBox) self.caseSensitiveCheckBox = QtWidgets.QCheckBox("Case &Sensitive") self.caseSensitiveCheckBox.setChecked(True) self.minimalCheckBox = QtWidgets.QCheckBox("&Minimal") indexLabel = QtWidgets.QLabel("Index of Match:") self.indexEdit = QtWidgets.QLineEdit() self.indexEdit.setReadOnly(True) matchedLengthLabel = QtWidgets.QLabel("Matched Length:") self.matchedLengthEdit = QtWidgets.QLineEdit() self.matchedLengthEdit.setReadOnly(True) self.captureLabels = [] self.captureEdits = [] for i in range(self.MaxCaptures): self.captureLabels.append(QtWidgets.QLabel("Capture %d:" % i)) self.captureEdits.append(QtWidgets.QLineEdit()) self.captureEdits[i].setReadOnly(True) self.captureLabels[0].setText("Match:") checkBoxLayout = QtWidgets.QHBoxLayout() checkBoxLayout.addWidget(self.caseSensitiveCheckBox) checkBoxLayout.addWidget(self.minimalCheckBox) checkBoxLayout.addStretch(1) mainLayout = QtWidgets.QGridLayout() mainLayout.addWidget(patternLabel, 0, 0) mainLayout.addWidget(self.patternComboBox, 0, 1) mainLayout.addWidget(escapedPatternLabel, 1, 0) mainLayout.addWidget(self.escapedPatternLineEdit, 1, 1) mainLayout.addWidget(syntaxLabel, 2, 0) mainLayout.addWidget(self.syntaxComboBox, 2, 1) mainLayout.addLayout(checkBoxLayout, 3, 0, 1, 2) mainLayout.addWidget(textLabel, 4, 0) mainLayout.addWidget(self.textComboBox, 4, 1) mainLayout.addWidget(indexLabel, 5, 0) mainLayout.addWidget(self.indexEdit, 5, 1) mainLayout.addWidget(matchedLengthLabel, 6, 0) mainLayout.addWidget(self.matchedLengthEdit, 6, 1) for i in range(self.MaxCaptures): mainLayout.addWidget(self.captureLabels[i], 7 + i, 0) mainLayout.addWidget(self.captureEdits[i], 7 + i, 1) self.setLayout(mainLayout) self.patternComboBox.editTextChanged.connect(self.refresh) self.textComboBox.editTextChanged.connect(self.refresh) self.caseSensitiveCheckBox.toggled.connect(self.refresh) self.minimalCheckBox.toggled.connect(self.refresh) self.syntaxComboBox.currentIndexChanged.connect(self.refresh) self.patternComboBox.addItem("[A-Za-z_]+([A-Za-z_0-9]*)") self.textComboBox.addItem("(10 + delta4)* 32") self.setWindowTitle("RegExp") self.setFixedHeight(self.sizeHint().height()) self.refresh() def refresh(self): self.setUpdatesEnabled(False) pattern = self.patternComboBox.currentText() text = self.textComboBox.currentText() escaped = str(pattern) escaped.replace('\\', '\\\\') escaped.replace('"', '\\"') self.escapedPatternLineEdit.setText('"' + escaped + '"') rx = QtCore.QRegExp(pattern) cs = QtCore.Qt.CaseInsensitive if self.caseSensitiveCheckBox.isChecked(): cs = QtCore.Qt.CaseSensitive rx.setCaseSensitivity(cs) rx.setMinimal(self.minimalCheckBox.isChecked()) syntax = self.syntaxComboBox.itemData(self.syntaxComboBox.currentIndex()) rx.setPatternSyntax(QtCore.QRegExp.PatternSyntax(syntax)) palette = self.patternComboBox.palette() if rx.isValid(): palette.setColor(QtGui.QPalette.Text, self.textComboBox.palette().color(QtGui.QPalette.Text)) else: palette.setColor(QtGui.QPalette.Text, QtCore.Qt.red) self.patternComboBox.setPalette(palette) self.indexEdit.setText(str(rx.indexIn(text))) self.matchedLengthEdit.setText(str(rx.matchedLength())) for i in range(self.MaxCaptures): self.captureLabels[i].setEnabled(i <= rx.captureCount()) self.captureEdits[i].setEnabled(i <= rx.captureCount()) self.captureEdits[i].setText(rx.cap(i)) self.setUpdatesEnabled(True) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) dialog = RegExpDialog() sys.exit(dialog.exec_()) examples/corelib/tools/settingseditor/000077500000000000000000000000001376617013100205275ustar00rootroot00000000000000examples/corelib/tools/settingseditor/settingseditor.py000066400000000000000000000722061376617013100241570ustar00rootroot00000000000000# -*- coding: utf-8 -*- ############################################################################# ## ## Copyright (C) 2013 Riverbank Computing Limited. ## 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/tools/settingseditor example from Qt v5.x""" import sys from PySide2.QtCore import (QByteArray, QDate, QDateTime, QDir, QEvent, QPoint, QRect, QRegularExpression, QSettings, QSize, QTime, QTimer, Qt) from PySide2.QtGui import (QColor, QIcon, QIntValidator, QDoubleValidator, QRegularExpressionValidator, QValidator) from PySide2.QtWidgets import (QAbstractItemView, QAction, QApplication, QCheckBox, QComboBox, QFileDialog, QDialog, QDialogButtonBox, QGridLayout, QGroupBox, QHeaderView, QInputDialog, QItemDelegate, QLabel, QLineEdit, QMainWindow, QMessageBox, QStyle, QSpinBox, QStyleOptionViewItem, QTableWidget, QTableWidgetItem, QTreeWidget, QTreeWidgetItem, QVBoxLayout) class TypeChecker: def __init__(self, parent=None): self.bool_exp = QRegularExpression('^(true)|(false)$') assert self.bool_exp.isValid() self.bool_exp.setPatternOptions(QRegularExpression.CaseInsensitiveOption) self.byteArray_exp = QRegularExpression(r'^[\x00-\xff]*$') assert self.byteArray_exp.isValid() self.char_exp = QRegularExpression('^.$') assert self.char_exp.isValid() pattern = r'^[+-]?\d+$' self.int_exp = QRegularExpression(pattern) assert self.int_exp.isValid() pattern = r'^\(([0-9]*),([0-9]*),([0-9]*),([0-9]*)\)$' self.color_exp = QRegularExpression(pattern) assert self.color_exp.isValid() pattern = r'^\((-?[0-9]*),(-?[0-9]*)\)$' self.point_exp = QRegularExpression(pattern) assert self.point_exp.isValid() pattern = r'^\((-?[0-9]*),(-?[0-9]*),(-?[0-9]*),(-?[0-9]*)\)$' self.rect_exp = QRegularExpression(pattern) assert self.rect_exp.isValid() self.size_exp = QRegularExpression(self.point_exp) date_pattern = '([0-9]{,4})-([0-9]{,2})-([0-9]{,2})' self.date_exp = QRegularExpression('^{}$'.format(date_pattern)) assert self.date_exp.isValid() time_pattern = '([0-9]{,2}):([0-9]{,2}):([0-9]{,2})' self.time_exp = QRegularExpression('^{}$'.format(time_pattern)) assert self.time_exp.isValid() pattern = '^{}T{}$'.format(date_pattern, time_pattern) self.dateTime_exp = QRegularExpression(pattern) assert self.dateTime_exp.isValid() def type_from_text(self, text): if self.bool_exp.match(text).hasMatch(): return bool if self.int_exp.match(text).hasMatch(): return int return None def create_validator(self, value, parent): if isinstance(value, bool): return QRegularExpressionValidator(self.bool_exp, parent) if isinstance(value, float): return QDoubleValidator(parent) if isinstance(value, int): return QIntValidator(parent) if isinstance(value, QByteArray): return QRegularExpressionValidator(self.byteArray_exp, parent) if isinstance(value, QColor): return QRegularExpressionValidator(self.color_exp, parent) if isinstance(value, QDate): return QRegularExpressionValidator(self.date_exp, parent) if isinstance(value, QDateTime): return QRegularExpressionValidator(self.dateTime_exp, parent) if isinstance(value, QTime): return QRegularExpressionValidator(self.time_exp, parent) if isinstance(value, QPoint): return QRegularExpressionValidator(self.point_exp, parent) if isinstance(value, QRect): return QRegularExpressionValidator(self.rect_exp, parent) if isinstance(value, QSize): return QRegularExpressionValidator(self.size_exp, parent) return None def from_string(self, text, original_value): if isinstance(original_value, QColor): match = self.color_exp.match(text) return QColor(min(int(match.captured(1)), 255), min(int(match.captured(2)), 255), min(int(match.captured(3)), 255), min(int(match.captured(4)), 255)) if isinstance(original_value, QDate): value = QDate.fromString(text, Qt.ISODate) return value if value.isValid() else None if isinstance(original_value, QDateTime): value = QDateTime.fromString(text, Qt.ISODate) return value if value.isValid() else None if isinstance(original_value, QTime): value = QTime.fromString(text, Qt.ISODate) return value if value.isValid() else None if isinstance(original_value, QPoint): match = self.point_exp.match(text) return QPoint(int(match.captured(1)), int(match.captured(2))) if isinstance(original_value, QRect): match = self.rect_exp.match(text) return QRect(int(match.captured(1)), int(match.captured(2)), int(match.captured(3)), int(match.captured(4))) if isinstance(original_value, QSize): match = self.size_exp.match(text) return QSize(int(match.captured(1)), int(match.captured(2))) if isinstance(original_value, list): return text.split(',') return type(original_value)(text) class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.settings_tree = SettingsTree() self.setCentralWidget(self.settings_tree) self.location_dialog = None self.create_actions() self.create_menus() self.auto_refresh_action.setChecked(True) self.fallbacks_action.setChecked(True) self.setWindowTitle("Settings Editor") self.resize(500, 600) def open_settings(self): if self.location_dialog is None: self.location_dialog = LocationDialog(self) if self.location_dialog.exec_(): settings = QSettings(self.location_dialog.format(), self.location_dialog.scope(), self.location_dialog.organization(), self.location_dialog.application()) self.set_settings_object(settings) self.fallbacks_action.setEnabled(True) def open_inifile(self): file_name, _ = QFileDialog.getOpenFileName(self, "Open INI File", '', "INI Files (*.ini *.conf)") if file_name: self.load_ini_file(file_name) def load_ini_file(self, file_name): settings = QSettings(file_name, QSettings.IniFormat) if settings.status() != QSettings.NoError: return self.set_settings_object(settings) self.fallbacks_action.setEnabled(False) def open_property_list(self): file_name, _ = QFileDialog.getOpenFileName(self, "Open Property List", '', "Property List Files (*.plist)") if file_name: settings = QSettings(file_name, QSettings.NativeFormat) self.set_settings_object(settings) self.fallbacks_action.setEnabled(False) def open_registry_path(self): path, ok = QInputDialog.getText(self, "Open Registry Path", "Enter the path in the Windows registry:", QLineEdit.Normal, 'HKEY_CURRENT_USER\\') if ok and path != '': settings = QSettings(path, QSettings.NativeFormat) self.set_settings_object(settings) self.fallbacks_action.setEnabled(False) def about(self): QMessageBox.about(self, "About Settings Editor", "The Settings Editor example shows how to access " "application settings using Qt.") def create_actions(self): self.open_settings_action = QAction("&Open Application Settings...", self, shortcut="Ctrl+O", triggered=self.open_settings) self.open_ini_file_action = QAction("Open I&NI File...", self, shortcut="Ctrl+N", triggered=self.open_inifile) self.open_property_list_action = QAction("Open macOS &Property List...", self, shortcut="Ctrl+P", triggered=self.open_property_list) if sys.platform != 'darwin': self.open_property_list_action.setEnabled(False) self.open_registry_path_action = QAction( "Open Windows &Registry Path...", self, shortcut="Ctrl+G", triggered=self.open_registry_path) if sys.platform != 'win32': self.open_registry_path_action.setEnabled(False) self.refresh_action = QAction("&Refresh", self, shortcut="Ctrl+R", enabled=False, triggered=self.settings_tree.refresh) self.exit_action = QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) self.auto_refresh_action = QAction("&Auto-Refresh", self, shortcut="Ctrl+A", checkable=True, enabled=False) self.auto_refresh_action.triggered[bool].connect(self.settings_tree.set_auto_refresh) self.auto_refresh_action.triggered[bool].connect(self.refresh_action.setDisabled) self.fallbacks_action = QAction("&Fallbacks", self, shortcut="Ctrl+F", checkable=True, enabled=False) self.fallbacks_action.triggered[bool].connect(self.settings_tree.set_fallbacks_enabled) self.about_action = QAction("&About", self, triggered=self.about) self.about_Qt_action = QAction("About &Qt", self, triggered=qApp.aboutQt) def create_menus(self): self.file_menu = self.menuBar().addMenu("&File") self.file_menu.addAction(self.open_settings_action) self.file_menu.addAction(self.open_ini_file_action) self.file_menu.addAction(self.open_property_list_action) self.file_menu.addAction(self.open_registry_path_action) self.file_menu.addSeparator() self.file_menu.addAction(self.refresh_action) self.file_menu.addSeparator() self.file_menu.addAction(self.exit_action) self.options_menu = self.menuBar().addMenu("&Options") self.options_menu.addAction(self.auto_refresh_action) self.options_menu.addAction(self.fallbacks_action) self.menuBar().addSeparator() self.help_menu = self.menuBar().addMenu("&Help") self.help_menu.addAction(self.about_action) self.help_menu.addAction(self.about_Qt_action) def set_settings_object(self, settings): settings.setFallbacksEnabled(self.fallbacks_action.isChecked()) self.settings_tree.set_settings_object(settings) self.refresh_action.setEnabled(True) self.auto_refresh_action.setEnabled(True) nice_name = QDir.fromNativeSeparators(settings.fileName()) nice_name = nice_name.split('/')[-1] if not settings.isWritable(): nice_name += " (read only)" self.setWindowTitle("{} - Settings Editor".format(nice_name)) class LocationDialog(QDialog): def __init__(self, parent=None): super(LocationDialog, self).__init__(parent) self.format_combo = QComboBox() self.format_combo.addItem("Native") self.format_combo.addItem("INI") self.scope_cCombo = QComboBox() self.scope_cCombo.addItem("User") self.scope_cCombo.addItem("System") self.organization_combo = QComboBox() self.organization_combo.addItem("Trolltech") self.organization_combo.setEditable(True) self.application_combo = QComboBox() self.application_combo.addItem("Any") self.application_combo.addItem("Application Example") self.application_combo.addItem("Assistant") self.application_combo.addItem("Designer") self.application_combo.addItem("Linguist") self.application_combo.setEditable(True) self.application_combo.setCurrentIndex(3) format_label = QLabel("&Format:") format_label.setBuddy(self.format_combo) scope_label = QLabel("&Scope:") scope_label.setBuddy(self.scope_cCombo) organization_label = QLabel("&Organization:") organization_label.setBuddy(self.organization_combo) application_label = QLabel("&Application:") application_label.setBuddy(self.application_combo) self.locations_groupbox = QGroupBox("Setting Locations") self.locations_table = QTableWidget() self.locations_table.setSelectionMode(QAbstractItemView.SingleSelection) self.locations_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.locations_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.locations_table.setColumnCount(2) self.locations_table.setHorizontalHeaderLabels(("Location", "Access")) self.locations_table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch) self.locations_table.horizontalHeader().resizeSection(1, 180) self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.format_combo.activated.connect(self.update_locations) self.scope_cCombo.activated.connect(self.update_locations) self.organization_combo.lineEdit().editingFinished.connect(self.update_locations) self.application_combo.lineEdit().editingFinished.connect(self.update_locations) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) locations_layout = QVBoxLayout(self.locations_groupbox) locations_layout.addWidget(self.locations_table) mainLayout = QGridLayout(self) mainLayout.addWidget(format_label, 0, 0) mainLayout.addWidget(self.format_combo, 0, 1) mainLayout.addWidget(scope_label, 1, 0) mainLayout.addWidget(self.scope_cCombo, 1, 1) mainLayout.addWidget(organization_label, 2, 0) mainLayout.addWidget(self.organization_combo, 2, 1) mainLayout.addWidget(application_label, 3, 0) mainLayout.addWidget(self.application_combo, 3, 1) mainLayout.addWidget(self.locations_groupbox, 4, 0, 1, 2) mainLayout.addWidget(self.button_box, 5, 0, 1, 2) self.update_locations() self.setWindowTitle("Open Application Settings") self.resize(650, 400) def format(self): if self.format_combo.currentIndex() == 0: return QSettings.NativeFormat else: return QSettings.IniFormat def scope(self): if self.scope_cCombo.currentIndex() == 0: return QSettings.UserScope else: return QSettings.SystemScope def organization(self): return self.organization_combo.currentText() def application(self): if self.application_combo.currentText() == "Any": return '' return self.application_combo.currentText() def update_locations(self): self.locations_table.setUpdatesEnabled(False) self.locations_table.setRowCount(0) for i in range(2): if i == 0: if self.scope() == QSettings.SystemScope: continue actualScope = QSettings.UserScope else: actualScope = QSettings.SystemScope for j in range(2): if j == 0: if not self.application(): continue actualApplication = self.application() else: actualApplication = '' settings = QSettings(self.format(), actualScope, self.organization(), actualApplication) row = self.locations_table.rowCount() self.locations_table.setRowCount(row + 1) item0 = QTableWidgetItem() item0.setText(settings.fileName()) item1 = QTableWidgetItem() disable = not (settings.childKeys() or settings.childGroups()) if row == 0: if settings.isWritable(): item1.setText("Read-write") disable = False else: item1.setText("Read-only") self.button_box.button(QDialogButtonBox.Ok).setDisabled(disable) else: item1.setText("Read-only fallback") if disable: item0.setFlags(item0.flags() & ~Qt.ItemIsEnabled) item1.setFlags(item1.flags() & ~Qt.ItemIsEnabled) self.locations_table.setItem(row, 0, item0) self.locations_table.setItem(row, 1, item1) self.locations_table.setUpdatesEnabled(True) class SettingsTree(QTreeWidget): def __init__(self, parent=None): super(SettingsTree, self).__init__(parent) self._type_checker = TypeChecker() self.setItemDelegate(VariantDelegate(self._type_checker, self)) self.setHeaderLabels(("Setting", "Type", "Value")) self.header().setSectionResizeMode(0, QHeaderView.Stretch) self.header().setSectionResizeMode(2, QHeaderView.Stretch) self.settings = None self.refresh_timer = QTimer() self.refresh_timer.setInterval(2000) self.auto_refresh = False self.group_icon = QIcon() style = self.style() self.group_icon.addPixmap(style.standardPixmap(QStyle.SP_DirClosedIcon), QIcon.Normal, QIcon.Off) self.group_icon.addPixmap(style.standardPixmap(QStyle.SP_DirOpenIcon), QIcon.Normal, QIcon.On) self.key_icon = QIcon() self.key_icon.addPixmap(style.standardPixmap(QStyle.SP_FileIcon)) self.refresh_timer.timeout.connect(self.maybe_refresh) def set_settings_object(self, settings): self.settings = settings self.clear() if self.settings is not None: self.settings.setParent(self) self.refresh() if self.auto_refresh: self.refresh_timer.start() else: self.refresh_timer.stop() def sizeHint(self): return QSize(800, 600) def set_auto_refresh(self, autoRefresh): self.auto_refresh = autoRefresh if self.settings is not None: if self.auto_refresh: self.maybe_refresh() self.refresh_timer.start() else: self.refresh_timer.stop() def set_fallbacks_enabled(self, enabled): if self.settings is not None: self.settings.setFallbacksEnabled(enabled) self.refresh() def maybe_refresh(self): if self.state() != QAbstractItemView.EditingState: self.refresh() def refresh(self): if self.settings is None: return # The signal might not be connected. try: self.itemChanged.disconnect(self.update_setting) except: pass self.settings.sync() self.update_child_items(None) self.itemChanged.connect(self.update_setting) def event(self, event): if event.type() == QEvent.WindowActivate: if self.isActiveWindow() and self.auto_refresh: self.maybe_refresh() return super(SettingsTree, self).event(event) def update_setting(self, item): key = item.text(0) ancestor = item.parent() while ancestor: key = ancestor.text(0) + '/' + key ancestor = ancestor.parent() d = item.data(2, Qt.UserRole) self.settings.setValue(key, item.data(2, Qt.UserRole)) if self.auto_refresh: self.refresh() def update_child_items(self, parent): divider_index = 0 for group in self.settings.childGroups(): child_index = self.find_child(parent, group, divider_index) if child_index != -1: child = self.child_at(parent, child_index) child.setText(1, '') child.setText(2, '') child.setData(2, Qt.UserRole, None) self.move_item_forward(parent, child_index, divider_index) else: child = self.create_item(group, parent, divider_index) child.setIcon(0, self.group_icon) divider_index += 1 self.settings.beginGroup(group) self.update_child_items(child) self.settings.endGroup() for key in self.settings.childKeys(): child_index = self.find_child(parent, key, 0) if child_index == -1 or child_index >= divider_index: if child_index != -1: child = self.child_at(parent, child_index) for i in range(child.childCount()): self.delete_item(child, i) self.move_item_forward(parent, child_index, divider_index) else: child = self.create_item(key, parent, divider_index) child.setIcon(0, self.key_icon) divider_index += 1 else: child = self.child_at(parent, child_index) value = self.settings.value(key) if value is None: child.setText(1, 'Invalid') else: # Try to convert to type unless a QByteArray is received if isinstance(value, str): value_type = self._type_checker.type_from_text(value) if value_type: value = self.settings.value(key, type=value_type) child.setText(1, value.__class__.__name__) child.setText(2, VariantDelegate.displayText(value)) child.setData(2, Qt.UserRole, value) while divider_index < self.child_count(parent): self.delete_item(parent, divider_index) def create_item(self, text, parent, index): after = None if index != 0: after = self.child_at(parent, index - 1) if parent is not None: item = QTreeWidgetItem(parent, after) else: item = QTreeWidgetItem(self, after) item.setText(0, text) item.setFlags(item.flags() | Qt.ItemIsEditable) return item def delete_item(self, parent, index): if parent is not None: item = parent.takeChild(index) else: item = self.takeTopLevelItem(index) del item def child_at(self, parent, index): if parent is not None: return parent.child(index) else: return self.topLevelItem(index) def child_count(self, parent): if parent is not None: return parent.childCount() else: return self.topLevelItemCount() def find_child(self, parent, text, startIndex): for i in range(self.child_count(parent)): if self.child_at(parent, i).text(0) == text: return i return -1 def move_item_forward(self, parent, oldIndex, newIndex): for int in range(oldIndex - newIndex): self.delete_item(parent, newIndex) class VariantDelegate(QItemDelegate): def __init__(self, type_checker, parent=None): super(VariantDelegate, self).__init__(parent) self._type_checker = type_checker def paint(self, painter, option, index): if index.column() == 2: value = index.model().data(index, Qt.UserRole) if not self.is_supported_type(value): my_option = QStyleOptionViewItem(option) my_option.state &= ~QStyle.State_Enabled super(VariantDelegate, self).paint(painter, my_option, index) return super(VariantDelegate, self).paint(painter, option, index) def createEditor(self, parent, option, index): if index.column() != 2: return None original_value = index.model().data(index, Qt.UserRole) if not self.is_supported_type(original_value): return None editor = None if isinstance(original_value, bool): editor = QCheckBox(parent) if isinstance(original_value, int): editor = QSpinBox(parent) editor.setRange(-32767, 32767) else: editor = QLineEdit(parent) editor.setFrame(False) validator = self._type_checker.create_validator(original_value, editor) if validator: editor.setValidator(validator) return editor def setEditorData(self, editor, index): if not editor: return value = index.model().data(index, Qt.UserRole) if isinstance(editor, QCheckBox): editor.setCheckState(Qt.Checked if value else Qt.Unchecked) elif isinstance(editor, QSpinBox): editor.setValue(value) else: editor.setText(self.displayText(value)) def value_from_lineedit(self, lineedit, model, index): if not lineedit.isModified(): return None text = lineedit.text() validator = lineedit.validator() if validator is not None: state, text, _ = validator.validate(text, 0) if state != QValidator.Acceptable: return None original_value = index.model().data(index, Qt.UserRole) return self._type_checker.from_string(text, original_value) def setModelData(self, editor, model, index): value = None if isinstance(editor, QCheckBox): value = editor.checkState() == Qt.Checked elif isinstance(editor, QSpinBox): value = editor.value() else: value = self.value_from_lineedit(editor, model, index) if not value is None: model.setData(index, value, Qt.UserRole) model.setData(index, self.displayText(value), Qt.DisplayRole) @staticmethod def is_supported_type(value): return isinstance(value, (bool, float, int, QByteArray, str, QColor, QDate, QDateTime, QTime, QPoint, QRect, QSize, list)) @staticmethod def displayText(value): if isinstance(value, str): return value if isinstance(value, bool): return '✓' if value else '☐' if isinstance(value, (int, float, QByteArray)): return str(value) if isinstance(value, QColor): return '({},{},{},{})'.format(value.red(), value.green(), value.blue(), value.alpha()) if isinstance(value, (QDate, QDateTime, QTime)): return value.toString(Qt.ISODate) if isinstance(value, QPoint): return '({},{})'.format(value.x(), value.y()) if isinstance(value, QRect): return '({},{},{},{})'.format(value.x(), value.y(), value.width(), value.height()) if isinstance(value, QSize): return '({},{})'.format(value.width(), value.height()) if isinstance(value, list): return ','.join(value) if value is None: return '' return '<{}>'.format(value) if __name__ == '__main__': app = QApplication(sys.argv) main_win = MainWindow() if len(sys.argv) > 1: main_win.load_ini_file(sys.argv[1]) main_win.show() sys.exit(app.exec_()) examples/corelib/tools/settingseditor/settingseditor.pyproject000066400000000000000000000000471376617013100255400ustar00rootroot00000000000000{ "files": ["settingseditor.py"] } examples/corelib/tools/tools.pyproject000066400000000000000000000000371376617013100205610ustar00rootroot00000000000000{ "files": ["regexp.py"] } examples/datavisualization/000077500000000000000000000000001376617013100164345ustar00rootroot00000000000000examples/datavisualization/bars3d.py000066400000000000000000000105151376617013100201660ustar00rootroot00000000000000 ############################################################################# ## ## 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 QtDataVisualization example""" import sys from PySide2.QtCore import Qt from PySide2.QtGui import QGuiApplication from PySide2.QtWidgets import QApplication, QSizePolicy, QMainWindow, QWidget from PySide2.QtDataVisualization import QtDataVisualization def dataToBarDataRow(data): return list(QtDataVisualization.QBarDataItem(d) for d in data) def dataToBarDataArray(data): return list(dataToBarDataRow(row) for row in data) class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('Qt DataVisualization 3D Bars') self.bars = QtDataVisualization.Q3DBars() self.columnAxis = QtDataVisualization.QCategory3DAxis() self.columnAxis.setTitle('Columns') self.columnAxis.setTitleVisible(True) self.columnAxis.setLabels(['Column1', 'Column2']) self.columnAxis.setLabelAutoRotation(30) self.rowAxis = QtDataVisualization.QCategory3DAxis() self.rowAxis.setTitle('Rows') self.rowAxis.setTitleVisible(True) self.rowAxis.setLabels(['Row1', 'Row2']) self.rowAxis.setLabelAutoRotation(30) self.valueAxis = QtDataVisualization.QValue3DAxis() self.valueAxis.setTitle('Values') self.valueAxis.setTitleVisible(True) self.valueAxis.setRange(0, 5) self.bars.setRowAxis(self.rowAxis) self.bars.setColumnAxis(self.columnAxis) self.bars.setValueAxis(self.valueAxis) self.series = QtDataVisualization.QBar3DSeries() self.arrayData = [[1, 2], [3, 4]] self.series.dataProxy().addRows(dataToBarDataArray(self.arrayData)) self.bars.setPrimarySeries(self.series) self.container = QWidget.createWindowContainer(self.bars) if not self.bars.hasContext(): print("Couldn't initialize the OpenGL context.") sys.exit(-1) camera = self.bars.scene().activeCamera() camera.setYRotation(22.5) geometry = QGuiApplication.primaryScreen().geometry() size = geometry.height() * 3 / 4 self.container.setMinimumSize(size, size) self.container.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.container.setFocusPolicy(Qt.StrongFocus) self.setCentralWidget(self.container) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/datavisualization/datavisualization.pyproject000066400000000000000000000000371376617013100241300ustar00rootroot00000000000000{ "files": ["bars3d.py"] } examples/declarative/000077500000000000000000000000001376617013100151645ustar00rootroot00000000000000examples/declarative/declarative.pyproject000066400000000000000000000000771376617013100214140ustar00rootroot00000000000000{ "files": ["view.qml", "scrolling.py", "usingmodel.py"] } examples/declarative/extending/000077500000000000000000000000001376617013100171515ustar00rootroot00000000000000examples/declarative/extending/chapter1-basics/000077500000000000000000000000001376617013100221225ustar00rootroot00000000000000examples/declarative/extending/chapter1-basics/app.qml000066400000000000000000000045611376617013100234230ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** ****************************************************************************/ //![0] import Charts 1.0 import QtQuick 2.0 Item { width: 300; height: 200 PieChart { id: aPieChart anchors.centerIn: parent width: 100; height: 100 name: "A simple pie chart" color: "red" } Text { anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 } text: aPieChart.name } } //![0] examples/declarative/extending/chapter1-basics/basics.py000066400000000000000000000073411376617013100237450ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function """PySide2 port of the qml/tutorials/extending-qml/chapter1-basics example from Qt v5.x""" import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils')) from utils import text_type from PySide2.QtCore import Property, Signal, QUrl from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor from PySide2.QtQml import qmlRegisterType from PySide2.QtQuick import QQuickPaintedItem, QQuickView class PieChart (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) self._name = u'' def paint(self, painter): pen = QPen(self.color, 2) painter.setPen(pen) painter.setRenderHints(QPainter.Antialiasing, True) painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16) def getColor(self): return self._color def setColor(self, value): self._color = value def getName(self): return self._name def setName(self, value): self._name = value nameChanged = Signal() color = Property(QColor, getColor, setColor) name = Property(text_type, getName, setName, notify=nameChanged) if __name__ == '__main__': app = QGuiApplication(sys.argv) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/extending/chapter1-basics/chapter1-basics.pyproject000066400000000000000000000000521376617013100270310ustar00rootroot00000000000000{ "files": ["basics.py", "app.qml"] } examples/declarative/extending/chapter2-methods/000077500000000000000000000000001376617013100223225ustar00rootroot00000000000000examples/declarative/extending/chapter2-methods/app.qml000066400000000000000000000050041376617013100236140ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** ****************************************************************************/ //![0] import Charts 1.0 import QtQuick 2.0 Item { width: 300; height: 200 PieChart { id: aPieChart anchors.centerIn: parent width: 100; height: 100 color: "red" onChartCleared: console.log("The chart has been cleared") } MouseArea { anchors.fill: parent onClicked: aPieChart.clearChart() } Text { anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 } text: "Click anywhere to clear the chart" } } //![0] examples/declarative/extending/chapter2-methods/chapter2-methods.pyproject000066400000000000000000000000531376617013100274320ustar00rootroot00000000000000{ "files": ["methods.py", "app.qml"] } examples/declarative/extending/chapter2-methods/methods.py000066400000000000000000000076071376617013100243510ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function """PySide2 port of the qml/tutorials/extending-qml/chapter2-methods example from Qt v5.x""" import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils')) from utils import text_type from PySide2.QtCore import Property, Signal, Slot, QUrl, Qt from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor from PySide2.QtQml import qmlRegisterType from PySide2.QtQuick import QQuickPaintedItem, QQuickView class PieChart (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) self._name = u'' def paint(self, painter): pen = QPen(self.color, 2) painter.setPen(pen) painter.setRenderHints(QPainter.Antialiasing, True) painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16) def getColor(self): return self._color def setColor(self, value): self._color = value def getName(self): return self._name def setName(self, value): self._name = value color = Property(QColor, getColor, setColor) name = Property(text_type, getName, setName) chartCleared = Signal() @Slot() # This should be something like @Invokable def clearChart(self): self.setColor(Qt.transparent) self.update() self.chartCleared.emit() if __name__ == '__main__': app = QGuiApplication(sys.argv) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/extending/chapter3-bindings/000077500000000000000000000000001376617013100224555ustar00rootroot00000000000000examples/declarative/extending/chapter3-bindings/app.qml000066400000000000000000000051721376617013100237550ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** ****************************************************************************/ //![0] import Charts 1.0 import QtQuick 2.0 Item { width: 300; height: 200 Row { anchors.centerIn: parent spacing: 20 PieChart { id: chartA width: 100; height: 100 color: "red" } PieChart { id: chartB width: 100; height: 100 color: chartA.color } } MouseArea { anchors.fill: parent onClicked: { chartA.color = "blue" } } Text { anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 } text: "Click anywhere to change the chart color" } } //![0] examples/declarative/extending/chapter3-bindings/bindings.py000066400000000000000000000100751376617013100246270ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function """PySide2 port of the qml/tutorials/extending-qml/chapter3-bindings example from Qt v5.x""" import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils')) from utils import text_type from PySide2.QtCore import Property, Signal, Slot, QUrl, Qt from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor from PySide2.QtQml import qmlRegisterType from PySide2.QtQuick import QQuickPaintedItem, QQuickView class PieChart (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) self._name = u'' self._color = QColor() def paint(self, painter): pen = QPen(self._color, 2) painter.setPen(pen) painter.setRenderHints(QPainter.Antialiasing, True) painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16) def getColor(self): return self._color def setColor(self, value): if value != self._color: self._color = value self.update() self.colorChanged.emit() def getName(self): return self._name def setName(self, value): self._name = value colorChanged = Signal() color = Property(QColor, getColor, setColor, notify=colorChanged) name = Property(text_type, getName, setName) chartCleared = Signal() @Slot() # This should be something like @Invokable def clearChart(self): self.setColor(Qt.transparent) self.update() self.chartCleared.emit() if __name__ == '__main__': app = QGuiApplication(sys.argv) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/extending/chapter3-bindings/chapter3-bindings.pyproject000066400000000000000000000000541376617013100277210ustar00rootroot00000000000000{ "files": ["app.qml", "bindings.py"] } examples/declarative/extending/chapter4-customPropertyTypes/000077500000000000000000000000001376617013100247655ustar00rootroot00000000000000examples/declarative/extending/chapter4-customPropertyTypes/app.qml000066400000000000000000000044531376617013100262660ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** ****************************************************************************/ //![0] import Charts 1.0 import QtQuick 2.0 Item { width: 300; height: 200 PieChart { id: chart anchors.centerIn: parent width: 100; height: 100 pieSlice: PieSlice { anchors.fill: parent color: "red" } } Component.onCompleted: console.log("The pie is colored " + chart.pieSlice.color) } //![0] examples/declarative/extending/chapter4-customPropertyTypes/chapter4-customPropertyTypes.pyproject000066400000000000000000000000671376617013100345450ustar00rootroot00000000000000{ "files": ["app.qml", "customPropertyTypes.py"] } examples/declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py000066400000000000000000000102201376617013100314360ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function """PySide2 port of the qml/tutorials/extending-qml/chapter4-customPropertyTypes example from Qt v5.x""" import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils')) from utils import text_type from PySide2.QtCore import Property, QUrl from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor from PySide2.QtQml import qmlRegisterType from PySide2.QtQuick import QQuickPaintedItem, QQuickView, QQuickItem class PieSlice (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) self._color = QColor() def getColor(self): return self._color def setColor(self, value): self._color = value color = Property(QColor, getColor, setColor) def paint(self, painter): pen = QPen(self._color, 2) painter.setPen(pen) painter.setRenderHints(QPainter.Antialiasing, True) painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), 90 * 16, 290 * 16) class PieChart (QQuickItem): def __init__(self, parent = None): QQuickItem.__init__(self, parent) self._name = None self._pieSlice = None def getName(self): return self._name def setName(self, value): self._name = value name = Property(text_type, getName, setName) def getPieSlice(self): return self._pieSlice def setPieSlice(self, value): self._pieSlice = value self._pieSlice.setParentItem(self) pieSlice = Property(PieSlice, getPieSlice, setPieSlice) if __name__ == '__main__': app = QGuiApplication(sys.argv) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice") view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/extending/chapter5-listproperties/000077500000000000000000000000001376617013100237525ustar00rootroot00000000000000examples/declarative/extending/chapter5-listproperties/app.qml000066400000000000000000000051021376617013100252430ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** ****************************************************************************/ //![0] import Charts 1.0 import QtQuick 2.0 Item { width: 300; height: 200 PieChart { anchors.centerIn: parent width: 100; height: 100 slices: [ PieSlice { anchors.fill: parent color: "red" fromAngle: 0; angleSpan: 110 }, PieSlice { anchors.fill: parent color: "black" fromAngle: 110; angleSpan: 50 }, PieSlice { anchors.fill: parent color: "blue" fromAngle: 160; angleSpan: 100 } ] } } //![0] examples/declarative/extending/chapter5-listproperties/chapter5-listproperties.pyproject000066400000000000000000000000621376617013100325120ustar00rootroot00000000000000{ "files": ["app.qml", "listproperties.py"] } examples/declarative/extending/chapter5-listproperties/listproperties.py000066400000000000000000000110151376617013100274120ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function """PySide2 port of the qml/tutorials/extending-qml/chapter5-listproperties example from Qt v5.x""" import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', 'utils')) from utils import text_type from PySide2.QtCore import Property, QUrl from PySide2.QtGui import QGuiApplication, QPen, QPainter, QColor from PySide2.QtQml import qmlRegisterType, ListProperty from PySide2.QtQuick import QQuickPaintedItem, QQuickView, QQuickItem class PieSlice (QQuickPaintedItem): def __init__(self, parent = None): QQuickPaintedItem.__init__(self, parent) self._color = QColor() self._fromAngle = 0 self._angleSpan = 0 def getColor(self): return self._color def setColor(self, value): self._color = value def getFromAngle(self): return self._angle def setFromAngle(self, value): self._fromAngle = value def getAngleSpan(self): return self._angleSpan def setAngleSpan(self, value): self._angleSpan = value color = Property(QColor, getColor, setColor) fromAngle = Property(int, getFromAngle, setFromAngle) angleSpan = Property(int, getAngleSpan, setAngleSpan) def paint(self, painter): pen = QPen(self._color, 2) painter.setPen(pen) painter.setRenderHints(QPainter.Antialiasing, True) painter.drawPie(self.boundingRect().adjusted(1,1,-1,-1), self._fromAngle * 16, self._angleSpan * 16) class PieChart (QQuickItem): def __init__(self, parent = None): QQuickItem.__init__(self, parent) self._name = u'' self._slices = [] def getName(self): return self._name def setName(self, value): self._name = value name = Property(text_type, getName, setName) def appendSlice(self, _slice): _slice.setParentItem(self) self._slices.append(_slice) slices = ListProperty(PieSlice, appendSlice) if __name__ == '__main__': app = QGuiApplication(sys.argv) qmlRegisterType(PieChart, 'Charts', 1, 0, 'PieChart') qmlRegisterType(PieSlice, "Charts", 1, 0, "PieSlice") view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlFile = os.path.join(os.path.dirname(__file__), 'app.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/scrolling.py000066400000000000000000000054511376617013100175370ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QUrl from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView # This example uses a QML file to show a scrolling list containing # all the items listed in dataList. if __name__ == '__main__': dataList = ["Item 1", "Item 2", "Item 3", "Item 4"] app = QGuiApplication(sys.argv) view = QQuickView() ctxt = view.rootContext() ctxt.setContextProperty("myModel", dataList) qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view examples/declarative/signals/000077500000000000000000000000001376617013100166245ustar00rootroot00000000000000examples/declarative/signals/pytoqml1/000077500000000000000000000000001376617013100204125ustar00rootroot00000000000000examples/declarative/signals/pytoqml1/main.py000066400000000000000000000053201376617013100217100ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QTimer, QUrl from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView if __name__ == '__main__': app = QGuiApplication(sys.argv) timer = QTimer() timer.start(2000) view = QQuickView() qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) root = view.rootObject() timer.timeout.connect(root.updateRotater) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/signals/pytoqml1/pytoqml1.pyproject000066400000000000000000000000511376617013100241350ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/signals/pytoqml1/view.qml000066400000000000000000000050301376617013100220750ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 Rectangle { id: page function updateRotater() { rotater.angle = rotater.angle + 45 } width: 500; height: 200 color: "lightgray" Rectangle { id: rotater property real angle : 0 x: 240 width: 100; height: 10 color: "black" y: 95 transform: Rotation { origin.x: 10; origin.y: 5 angle: rotater.angle Behavior on angle { SpringAnimation { spring: 1.4 damping: .05 } } } } } examples/declarative/signals/qmltopy1/000077500000000000000000000000001376617013100204125ustar00rootroot00000000000000examples/declarative/signals/qmltopy1/main.py000066400000000000000000000060251376617013100217130ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QObject, QUrl, Slot from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView class Console(QObject): """Output stuff on the console.""" @Slot(str) @Slot('double') def output(self, s): print(s) @Slot(str) def outputStr(self, s): print(s) @Slot('double') def outputFloat(self, x): print(x) if __name__ == '__main__': app = QGuiApplication(sys.argv) view = QQuickView() # Instantiate the Python object. con = Console() # Expose the object to QML. context = view.rootContext() context.setContextProperty("con", con) qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/signals/qmltopy1/qmltopy1.pyproject000066400000000000000000000000511376617013100241350ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/signals/qmltopy1/view.qml000066400000000000000000000060431376617013100221020ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 Rectangle { id: page width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" anchors.horizontalCenter: page.horizontalCenter y: 30 font.pointSize: 24; font.bold: true } Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 120 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent onClicked: { // once the "con" context has been declared, // slots can be called like functions con.outputFloat(123) con.outputStr("foobar") con.output(helloText.x) con.output(helloText.text) } } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16 } } } examples/declarative/signals/qmltopy2/000077500000000000000000000000001376617013100204135ustar00rootroot00000000000000examples/declarative/signals/qmltopy2/main.py000066400000000000000000000060251376617013100217140ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QObject, QUrl, Slot from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView class RotateValue(QObject): def __init__(self): super(RotateValue,self).__init__() self.r = 0 # If a slot returns a value, the return value type must be explicitly # defined in the decorator. @Slot(result=int) def val(self): self.r = self.r + 10 return self.r if __name__ == '__main__': app = QGuiApplication(sys.argv) view = QQuickView() rotatevalue = RotateValue() context = view.rootContext() context.setContextProperty("rotatevalue", rotatevalue) qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/signals/qmltopy2/qmltopy2.pyproject000066400000000000000000000000511376617013100241370ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/signals/qmltopy2/view.qml000066400000000000000000000055071376617013100221070ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 Rectangle { id: page width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" anchors.horizontalCenter: page.horizontalCenter y: 30 font.pointSize: 24; font.bold: true } Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 120 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent onClicked: { helloText.rotation = rotatevalue.val() } } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16 } } } examples/declarative/signals/qmltopy3/000077500000000000000000000000001376617013100204145ustar00rootroot00000000000000examples/declarative/signals/qmltopy3/main.py000066400000000000000000000054221376617013100217150ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QUrl from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView def sayThis(s): print(s) if __name__ == '__main__': app = QGuiApplication(sys.argv) view = QQuickView() qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) root = view.rootObject() root.textRotationChanged.connect(sayThis) root.buttonClicked.connect(lambda: sayThis("clicked button (QML top-level signal)")) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/signals/qmltopy3/qmltopy3.pyproject000066400000000000000000000000511376617013100241410ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/signals/qmltopy3/view.qml000066400000000000000000000067021376617013100221060ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 Rectangle { id: page signal buttonClicked signal textRotationChanged(double rot) width: 500; height: 200 color: "lightgray" Text { id: helloText text: "Hello world!" y: 30 x: page.width/2-width/2 font.pointSize: 24; font.bold: true onRotationChanged: textRotationChanged(rotation) states: State { name: "down"; when: buttonMouseArea.pressed === true PropertyChanges { target: helloText; rotation: 180; y: 100; } } transitions: Transition { from: ""; to: "down"; reversible: true ParallelAnimation { NumberAnimation { properties: "y,rotation" duration: 500 easing.type: Easing.InOutQuad } } } } Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter y: 120 MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent onClicked: { buttonClicked() } } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16 } } } examples/declarative/signals/qmltopy4/000077500000000000000000000000001376617013100204155ustar00rootroot00000000000000examples/declarative/signals/qmltopy4/main.py000066400000000000000000000054461376617013100217240ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QObject, QUrl from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView def sayThis(s): print(s) if __name__ == '__main__': app = QGuiApplication(sys.argv) view = QQuickView() qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) root = view.rootObject() button = root.findChild(QObject, "buttonMouseArea") button.clicked.connect(lambda: sayThis("clicked button (signal directly connected)")) view.show() res = app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view sys.exit(res) examples/declarative/signals/qmltopy4/qmltopy4.pyproject000066400000000000000000000000511376617013100241430ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/signals/qmltopy4/view.qml000066400000000000000000000051261376617013100221060ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 Rectangle { id: page width: 500; height: 200 color: "lightgray" Rectangle { id: button width: 150; height: 40 color: "darkgray" anchors.horizontalCenter: page.horizontalCenter anchors.verticalCenter: page.verticalCenter MouseArea { id: buttonMouseArea objectName: "buttonMouseArea" anchors.fill: parent } Text { id: buttonText text: "Press me!" anchors.horizontalCenter: button.horizontalCenter anchors.verticalCenter: button.verticalCenter font.pointSize: 16 } } } examples/declarative/textproperties/000077500000000000000000000000001376617013100202655ustar00rootroot00000000000000examples/declarative/textproperties/main.py000066400000000000000000000072201376617013100215640ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 os.path import abspath, dirname, join from PySide2.QtCore import QObject, Slot from PySide2.QtGui import QGuiApplication from PySide2.QtQml import QQmlApplicationEngine from PySide2.QtQuickControls2 import QQuickStyle class Bridge(QObject): @Slot(str, result=str) def getColor(self, s): if s.lower() == "red": return "#ef9a9a" elif s.lower() == "green": return "#a5d6a7" elif s.lower() == "blue": return "#90caf9" else: return "white" @Slot(float, result=int) def getSize(self, s): size = int(s * 34) if size <= 0: return 1 else: return size @Slot(str, result=bool) def getItalic(self, s): if s.lower() == "italic": return True else: return False @Slot(str, result=bool) def getBold(self, s): if s.lower() == "bold": return True else: return False @Slot(str, result=bool) def getUnderline(self, s): if s.lower() == "underline": return True else: return False if __name__ == '__main__': app = QGuiApplication(sys.argv) QQuickStyle.setStyle("Material") engine = QQmlApplicationEngine() # Instance of the Python object bridge = Bridge() # Expose the Python object to QML context = engine.rootContext() context.setContextProperty("con", bridge) # Get the path of the current directory, and then add the name # of the QML file, to load it. qmlFile = join(dirname(__file__), 'view.qml') engine.load(abspath(qmlFile)) if not engine.rootObjects(): sys.exit(-1) sys.exit(app.exec_()) examples/declarative/textproperties/textproperties.pyproject000066400000000000000000000000511376617013100253230ustar00rootroot00000000000000{ "files": ["main.py", "view.qml"] } examples/declarative/textproperties/view.qml000066400000000000000000000152221376617013100217540ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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 QtQuick 2.0 import QtQuick.Layouts 1.11 import QtQuick.Controls 2.1 import QtQuick.Window 2.1 import QtQuick.Controls.Material 2.1 ApplicationWindow { id: page width: 800 height: 400 visible: true Material.theme: Material.Dark Material.accent: Material.Red GridLayout { id: grid columns: 2 rows: 3 ColumnLayout { spacing: 2 Layout.columnSpan: 1 Layout.preferredWidth: 400 Text { id: leftlabel Layout.alignment: Qt.AlignHCenter color: "white" font.pointSize: 16 text: "Qt for Python" Layout.preferredHeight: 100 Material.accent: Material.Green } RadioButton { id: italic Layout.alignment: Qt.AlignLeft text: "Italic" onToggled: { leftlabel.font.italic = con.getItalic(italic.text) leftlabel.font.bold = con.getBold(italic.text) leftlabel.font.underline = con.getUnderline(italic.text) } } RadioButton { id: bold Layout.alignment: Qt.AlignLeft text: "Bold" onToggled: { leftlabel.font.italic = con.getItalic(bold.text) leftlabel.font.bold = con.getBold(bold.text) leftlabel.font.underline = con.getUnderline(bold.text) } } RadioButton { id: underline Layout.alignment: Qt.AlignLeft text: "Underline" onToggled: { leftlabel.font.italic = con.getItalic(underline.text) leftlabel.font.bold = con.getBold(underline.text) leftlabel.font.underline = con.getUnderline(underline.text) } } RadioButton { id: noneradio Layout.alignment: Qt.AlignLeft text: "None" checked: true onToggled: { leftlabel.font.italic = con.getItalic(noneradio.text) leftlabel.font.bold = con.getBold(noneradio.text) leftlabel.font.underline = con.getUnderline(noneradio.text) } } } ColumnLayout { id: rightcolumn spacing: 2 Layout.columnSpan: 1 Layout.preferredWidth: 400 Layout.preferredHeight: 400 Layout.fillWidth: true RowLayout { Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Button { id: red text: "Red" highlighted: true Material.accent: Material.Red onClicked: { leftlabel.color = con.getColor(red.text) } } Button { id: green text: "Green" highlighted: true Material.accent: Material.Green onClicked: { leftlabel.color = con.getColor(green.text) } } Button { id: blue text: "Blue" highlighted: true Material.accent: Material.Blue onClicked: { leftlabel.color = con.getColor(blue.text) } } Button { id: nonebutton text: "None" highlighted: true Material.accent: Material.BlueGrey onClicked: { leftlabel.color = con.getColor(nonebutton.text) } } } RowLayout { Layout.fillWidth: true Layout.alignment: Qt.AlignVCenter | Qt.AlignHCenter Text { id: rightlabel color: "white" Layout.alignment: Qt.AlignLeft text: "Font size" Material.accent: Material.White } Slider { width: rightcolumn.width*0.6 Layout.alignment: Qt.AlignRight id: slider value: 0.5 onValueChanged: { leftlabel.font.pointSize = con.getSize(value) } } } } } } examples/declarative/usingmodel.py000066400000000000000000000071611376617013100177110ustar00rootroot00000000000000 ############################################################################# ## ## 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 print_function import os import sys from PySide2.QtCore import QAbstractListModel, Qt, QUrl, QByteArray from PySide2.QtGui import QGuiApplication from PySide2.QtQuick import QQuickView class PersonModel (QAbstractListModel): MyRole = Qt.UserRole + 1 def __init__(self, parent = None): QAbstractListModel.__init__(self, parent) self._data = [] def roleNames(self): roles = { PersonModel.MyRole : QByteArray(b'modelData'), Qt.DisplayRole : QByteArray(b'display') } return roles def rowCount(self, index): return len(self._data) def data(self, index, role): d = self._data[index.row()] if role == Qt.DisplayRole: return d['name'] elif role == Qt.DecorationRole: return Qt.black elif role == PersonModel.MyRole: return d['myrole'] return None def populate(self): self._data.append({'name':'Qt', 'myrole':'role1'}) self._data.append({'name':'PySide', 'myrole':'role2'}) if __name__ == '__main__': app = QGuiApplication(sys.argv) view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) myModel = PersonModel() myModel.populate() view.rootContext().setContextProperty("myModel", myModel) qmlFile = os.path.join(os.path.dirname(__file__), 'view.qml') view.setSource(QUrl.fromLocalFile(os.path.abspath(qmlFile))) if view.status() == QQuickView.Error: sys.exit(-1) view.show() app.exec_() # Deleting the view before it goes out of scope is required to make sure all child QML instances # are destroyed in the correct order. del view examples/declarative/view.qml000066400000000000000000000047411376617013100166570ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 ListView { width: 100 height: 100 anchors.fill: parent model: myModel delegate: Component { Rectangle { height: 25 width: 100 Text { function displayText() { var result = "" if (typeof display !== "undefined") result = display + ": " result += modelData return result } text: displayText() } } } } examples/examples.pyproject000066400000000000000000000122551376617013100164650ustar00rootroot00000000000000{ "files": ["charts/memoryusage.py", "corelib/threads/mandelbrot.py", "corelib/tools/codecs/codecs.py", "corelib/tools/regexp.py", "corelib/tools/settingseditor/settingseditor.py", "declarative/extending/chapter1-basics/basics.py", "declarative/extending/chapter2-methods/methods.py", "declarative/extending/chapter3-bindings/bindings.py", "declarative/extending/chapter4-customPropertyTypes/customPropertyTypes.py", "declarative/extending/chapter5-listproperties/listproperties.py", "declarative/scrolling.py", "declarative/signals/pytoqml1/main.py", "declarative/signals/qmltopy1/main.py", "declarative/signals/qmltopy2/main.py", "declarative/signals/qmltopy3/main.py", "declarative/signals/qmltopy4/main.py", "declarative/usingmodel.py", "installer_test/hello.py", "macextras/macpasteboardmime.py", "multimedia/audiooutput.py", "multimedia/camera.py", "multimedia/player.py", "network/blockingfortuneclient.py", "network/fortuneclient.py", "network/fortuneserver.py", "network/threadedfortuneserver.py", "opengl/2dpainting.py", "opengl/grabber.py", "opengl/hellogl.py", "opengl/overpainting.py", "opengl/samplebuffers.py", "opengl/textures/textures.py", "script/helloscript.py", "texttospeech/texttospeech.py", "tutorial/t1.py", "tutorial/t10.py", "tutorial/t11.py", "tutorial/t12.py", "tutorial/t13.py", "tutorial/t14.py", "tutorial/t2.py", "tutorial/t3.py", "tutorial/t4.py", "tutorial/t5.py", "tutorial/t6.py", "tutorial/t7.py", "tutorial/t8.py", "tutorial/t9.py", "webenginewidgets/simplebrowser.py", "widgets/animation/animatedtiles/animatedtiles.py", "widgets/animation/appchooser/appchooser.py", "widgets/animation/easing/easing.py", "widgets/animation/states/states.py", "widgets/dialogs/classwizard/classwizard.py", "widgets/dialogs/extension.py", "widgets/dialogs/findfiles.py", "widgets/dialogs/standarddialogs.py", "widgets/dialogs/trivialwizard.py", "widgets/draganddrop/draggabletext/draggabletext.py", "widgets/effects/lighting.py", "widgets/graphicsview/anchorlayout.py", "widgets/graphicsview/collidingmice/collidingmice.py", "widgets/graphicsview/diagramscene/diagramscene.py", "widgets/graphicsview/dragdroprobot/dragdroprobot.py", "widgets/graphicsview/elasticnodes.py", "widgets/itemviews/addressbook/adddialogwidget.py", "widgets/itemviews/addressbook/addressbook.py", "widgets/itemviews/addressbook/addresswidget.py", "widgets/itemviews/addressbook/newaddresstab.py", "widgets/itemviews/addressbook/tablemodel.py", "widgets/itemviews/basicsortfiltermodel.py", "widgets/itemviews/fetchmore.py", "widgets/itemviews/stardelegate/stardelegate.py", "widgets/itemviews/stardelegate/stareditor.py", "widgets/itemviews/stardelegate/starrating.py", "widgets/layouts/basiclayouts.py", "widgets/layouts/dynamiclayouts.py", "widgets/layouts/flowlayout.py", "widgets/mainwindows/application/application.py", "widgets/mainwindows/dockwidgets/dockwidgets.py", "widgets/mainwindows/mdi/mdi.py", "widgets/painting/basicdrawing/basicdrawing.py", "widgets/painting/concentriccircles.py", "widgets/richtext/orderform.py", "widgets/richtext/syntaxhighlighter.py", "widgets/richtext/syntaxhighlighter/syntaxhighlighter.py", "widgets/richtext/textobject/textobject.py", "widgets/state-machine/eventtrans.py", "widgets/state-machine/factstates.py", "widgets/state-machine/pingpong.py", "widgets/state-machine/rogue.py", "widgets/state-machine/trafficlight.py", "widgets/state-machine/twowaybutton.py", "widgets/tutorials/addressbook/part1.py", "widgets/tutorials/addressbook/part2.py", "widgets/tutorials/addressbook/part3.py", "widgets/tutorials/addressbook/part4.py", "widgets/tutorials/addressbook/part5.py", "widgets/tutorials/addressbook/part6.py", "widgets/tutorials/addressbook/part7.py", "widgets/widgets/hellogl_openglwidget_legacy.py", "widgets/widgets/tetrix.py", "xml/dombookmarks/dombookmarks.py", "xmlpatterns/schema/schema.py"] } examples/external/000077500000000000000000000000001376617013100145235ustar00rootroot00000000000000examples/external/matplotlib/000077500000000000000000000000001376617013100166725ustar00rootroot00000000000000examples/external/matplotlib/requirements.txt000066400000000000000000000000131376617013100221500ustar00rootroot00000000000000matplotlib examples/external/matplotlib/widget_3dplot.py000066400000000000000000000222171376617013100220200ustar00rootroot00000000000000############################################################################# ## ## 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 import numpy as np from matplotlib.backends.backend_qt5agg import FigureCanvas from matplotlib.figure import Figure from mpl_toolkits.mplot3d import axes3d from PySide2.QtCore import Qt, Slot from PySide2.QtGui import QKeySequence from PySide2.QtWidgets import (QAction, QApplication, QComboBox, QHBoxLayout, QHeaderView, QLabel, QMainWindow, QSlider, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget) """This example implements the interaction between Qt Widgets and a 3D matplotlib plot""" class ApplicationWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self.column_names = ["Column A", "Column B", "Column C"] # Central widget self._main = QWidget() self.setCentralWidget(self._main) # Main menu bar self.menu = self.menuBar() self.menu_file = self.menu.addMenu("File") exit = QAction("Exit", self, triggered=qApp.quit) self.menu_file.addAction(exit) self.menu_about = self.menu.addMenu("&About") about = QAction("About Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents), triggered=qApp.aboutQt) self.menu_about.addAction(about) # Figure (Left) self.fig = Figure(figsize=(5, 3)) self.canvas = FigureCanvas(self.fig) # Sliders (Left) self.slider_azim = QSlider(minimum=0, maximum=360, orientation=Qt.Horizontal) self.slider_elev = QSlider(minimum=0, maximum=360, orientation=Qt.Horizontal) self.slider_azim_layout = QHBoxLayout() self.slider_azim_layout.addWidget(QLabel("{}".format(self.slider_azim.minimum()))) self.slider_azim_layout.addWidget(self.slider_azim) self.slider_azim_layout.addWidget(QLabel("{}".format(self.slider_azim.maximum()))) self.slider_elev_layout = QHBoxLayout() self.slider_elev_layout.addWidget(QLabel("{}".format(self.slider_elev.minimum()))) self.slider_elev_layout.addWidget(self.slider_elev) self.slider_elev_layout.addWidget(QLabel("{}".format(self.slider_elev.maximum()))) # Table (Right) self.table = QTableWidget() header = self.table.horizontalHeader() header.setSectionResizeMode(QHeaderView.Stretch) # ComboBox (Right) self.combo = QComboBox() self.combo.addItems(["Wired", "Surface", "Triangular Surface", "Sphere"]) # Right layout rlayout = QVBoxLayout() rlayout.setContentsMargins(1, 1, 1, 1) rlayout.addWidget(QLabel("Plot type:")) rlayout.addWidget(self.combo) rlayout.addWidget(self.table) # Left layout llayout = QVBoxLayout() rlayout.setContentsMargins(1, 1, 1, 1) llayout.addWidget(self.canvas, 88) llayout.addWidget(QLabel("Azimuth:"), 1) llayout.addLayout(self.slider_azim_layout, 5) llayout.addWidget(QLabel("Elevation:"), 1) llayout.addLayout(self.slider_elev_layout, 5) # Main layout layout = QHBoxLayout(self._main) layout.addLayout(llayout, 70) layout.addLayout(rlayout, 30) # Signal and Slots connections self.combo.currentTextChanged.connect(self.combo_option) self.slider_azim.valueChanged.connect(self.rotate_azim) self.slider_elev.valueChanged.connect(self.rotate_elev) # Initial setup self.plot_wire() self._ax.view_init(30, 30) self.slider_azim.setValue(30) self.slider_elev.setValue(30) self.fig.canvas.mpl_connect("button_release_event", self.on_click) # Matplotlib slot method def on_click(self, event): azim, elev = self._ax.azim, self._ax.elev self.slider_azim.setValue(azim + 180) self.slider_elev.setValue(elev + 180) # Utils methods def set_table_data(self, X, Y, Z): for i in range(len(X)): self.table.setItem(i, 0, QTableWidgetItem("{:.2f}".format(X[i]))) self.table.setItem(i, 1, QTableWidgetItem("{:.2f}".format(Y[i]))) self.table.setItem(i, 2, QTableWidgetItem("{:.2f}".format(Z[i]))) def set_canvas_table_configuration(self, row_count, data): self.fig.set_canvas(self.canvas) self._ax = self.canvas.figure.add_subplot(projection="3d") self._ax.set_xlabel(self.column_names[0]) self._ax.set_ylabel(self.column_names[1]) self._ax.set_zlabel(self.column_names[2]) self.table.setRowCount(row_count) self.table.setColumnCount(3) self.table.setHorizontalHeaderLabels(self.column_names) self.set_table_data(data[0], data[1], data[2]) # Plot methods def plot_wire(self): # Data self.X, self.Y, self.Z = axes3d.get_test_data(0.03) self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0])) self._ax.plot_wireframe(self.X, self.Y, self.Z, rstride=10, cstride=10, cmap="viridis") self.canvas.draw() def plot_surface(self): # Data self.X, self.Y = np.meshgrid(np.linspace(-6, 6, 30), np.linspace(-6, 6, 30)) self.Z = np.sin(np.sqrt(self.X ** 2 + self.Y ** 2)) self.set_canvas_table_configuration(len(self.X[0]), (self.X[0], self.Y[0], self.Z[0])) self._ax.plot_surface(self.X, self.Y, self.Z, rstride=1, cstride=1, cmap="viridis", edgecolor="none") self.canvas.draw() def plot_triangular_surface(self): # Data radii = np.linspace(0.125, 1.0, 8) angles = np.linspace(0, 2 * np.pi, 36, endpoint=False)[..., np.newaxis] self.X = np.append(0, (radii * np.cos(angles)).flatten()) self.Y = np.append(0, (radii * np.sin(angles)).flatten()) self.Z = np.sin(-self.X * self.Y) self.set_canvas_table_configuration(len(self.X), (self.X, self.Y, self.Z)) self._ax.plot_trisurf(self.X, self.Y, self.Z, linewidth=0.2, antialiased=True) self.canvas.draw() def plot_sphere(self): # Data u = np.linspace(0, 2 * np.pi, 100) v = np.linspace(0, np.pi, 100) self.X = 10 * np.outer(np.cos(u), np.sin(v)) self.Y = 10 * np.outer(np.sin(u), np.sin(v)) self.Z = 9 * np.outer(np.ones(np.size(u)), np.cos(v)) self.set_canvas_table_configuration(len(self.X), (self.X[0], self.Y[0], self.Z[0])) self._ax.plot_surface(self.X, self.Y, self.Z) self.canvas.draw() # Slots @Slot() def combo_option(self, text): if text == "Wired": self.plot_wire() elif text == "Surface": self.plot_surface() elif text == "Triangular Surface": self.plot_triangular_surface() elif text == "Sphere": self.plot_sphere() @Slot() def rotate_azim(self, value): self._ax.view_init(self._ax.elev, value) self.fig.set_canvas(self.canvas) self.canvas.draw() @Slot() def rotate_elev(self, value): self._ax.view_init(value, self._ax.azim) self.fig.set_canvas(self.canvas) self.canvas.draw() if __name__ == "__main__": app = QApplication(sys.argv) w = ApplicationWindow() w.setFixedSize(1280, 720) w.show() app.exec_() examples/external/opencv/000077500000000000000000000000001376617013100160155ustar00rootroot00000000000000examples/external/opencv/requirements.txt000066400000000000000000000000161376617013100212760ustar00rootroot00000000000000opencv-python examples/external/opencv/webcam_pattern_detection.py000066400000000000000000000164741376617013100234340ustar00rootroot00000000000000############################################################################# ## ## 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 os import sys import time import cv2 from PySide2.QtCore import Qt, QThread, Signal, Slot from PySide2.QtGui import QImage, QKeySequence, QPixmap from PySide2.QtWidgets import (QAction, QApplication, QComboBox, QGroupBox, QHBoxLayout, QLabel, QMainWindow, QPushButton, QSizePolicy, QVBoxLayout, QWidget) """This example uses the video from a webcam to apply pattern detection from the OpenCV module. e.g.: face, eyes, body, etc.""" class Thread(QThread): updateFrame = Signal(QImage) def __init__(self, parent=None): QThread.__init__(self, parent) self.trained_file = None self.status = True self.cap = True def set_file(self, fname): # The data comes with the 'opencv-python' module self.trained_file = os.path.join(cv2.data.haarcascades, fname) def run(self): self.cap = cv2.VideoCapture(0) while self.status: cascade = cv2.CascadeClassifier(self.trained_file) ret, frame = self.cap.read() if not ret: continue # Reading frame in gray scale to process the pattern gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) detections = cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) # Drawing green rectangle around the pattern for (x, y, w, h) in detections: pos_ori = (x, y) pos_end = (x + w, y + h) color = (0, 255, 0) cv2.rectangle(frame, pos_ori, pos_end, color, 2) # Reading the image in RGB to display it color_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # Creating and scaling QImage h, w, ch = color_frame.shape img = QImage(color_frame.data, w, h, ch * w, QImage.Format_RGB888) scaled_img = img.scaled(640, 480, Qt.KeepAspectRatio) # Emit signal self.updateFrame.emit(scaled_img) sys.exit(-1) class Window(QMainWindow): def __init__(self): QMainWindow.__init__(self) # Title and dimensions self.setWindowTitle("Patterns detection") self.setGeometry(0, 0, 800, 500) # Main menu bar self.menu = self.menuBar() self.menu_file = self.menu.addMenu("File") exit = QAction("Exit", self, triggered=qApp.quit) self.menu_file.addAction(exit) self.menu_about = self.menu.addMenu("&About") about = QAction("About Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents), triggered=qApp.aboutQt) self.menu_about.addAction(about) # Create a label for the display camera self.label = QLabel(self) self.label.setFixedSize(640, 480) # Thread in charge of updating the image self.th = Thread(self) self.th.finished.connect(self.close) self.th.updateFrame.connect(self.setImage) # Model group self.group_model = QGroupBox("Trained model") self.group_model.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) model_layout = QHBoxLayout() self.combobox = QComboBox() for xml_file in os.listdir(cv2.data.haarcascades): if xml_file.endswith(".xml"): self.combobox.addItem(xml_file) model_layout.addWidget(QLabel("File:"), 10) model_layout.addWidget(self.combobox, 90) self.group_model.setLayout(model_layout) # Buttons layout buttons_layout = QHBoxLayout() self.button1 = QPushButton("Start") self.button2 = QPushButton("Stop/Close") self.button1.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.button2.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) buttons_layout.addWidget(self.button2) buttons_layout.addWidget(self.button1) right_layout = QHBoxLayout() right_layout.addWidget(self.group_model, 1) right_layout.addLayout(buttons_layout, 1) # Main layout layout = QVBoxLayout() layout.addWidget(self.label) layout.addLayout(right_layout) # Central widget widget = QWidget(self) widget.setLayout(layout) self.setCentralWidget(widget) # Connections self.button1.clicked.connect(self.start) self.button2.clicked.connect(self.kill_thread) self.button2.setEnabled(False) self.combobox.currentTextChanged.connect(self.set_model) @Slot() def set_model(self, text): self.th.set_file(text) @Slot() def kill_thread(self): print("Finishing...") self.button2.setEnabled(False) self.button1.setEnabled(True) self.th.cap.release() cv2.destroyAllWindows() self.status = False self.th.terminate() # Give time for the thread to finish time.sleep(1) @Slot() def start(self): print("Starting...") self.button2.setEnabled(True) self.button1.setEnabled(False) self.th.set_file(self.combobox.currentText()) self.th.start() @Slot(QImage) def setImage(self, image): self.label.setPixmap(QPixmap.fromImage(image)) if __name__ == "__main__": app = QApplication() w = Window() w.show() sys.exit(app.exec_()) examples/external/scikit/000077500000000000000000000000001376617013100160115ustar00rootroot00000000000000examples/external/scikit/requirements.txt000066400000000000000000000000151376617013100212710ustar00rootroot00000000000000scikit-image examples/external/scikit/staining_colors_separation.py000066400000000000000000000160661376617013100240160ustar00rootroot00000000000000############################################################################# ## ## 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 import numpy as np from matplotlib.backends.backend_qt5agg import FigureCanvas from matplotlib.colors import LinearSegmentedColormap from matplotlib.figure import Figure from PySide2.QtCore import Qt, Slot from PySide2.QtGui import QKeySequence from PySide2.QtWidgets import (QAction, QApplication, QHBoxLayout, QLabel, QMainWindow, QPushButton, QSizePolicy, QVBoxLayout, QWidget) from skimage import data from skimage.color import rgb2hed from skimage.exposure import rescale_intensity class ApplicationWindow(QMainWindow): """ Example based on the example by 'scikit-image' gallery: "Immunohistochemical staining colors separation" https://scikit-image.org/docs/stable/auto_examples/color_exposure/plot_ihc_color_separation.html """ def __init__(self, parent=None): QMainWindow.__init__(self, parent) self._main = QWidget() self.setCentralWidget(self._main) # Main menu bar self.menu = self.menuBar() self.menu_file = self.menu.addMenu("File") exit = QAction("Exit", self, triggered=qApp.quit) self.menu_file.addAction(exit) self.menu_about = self.menu.addMenu("&About") about = QAction("About Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents), triggered=qApp.aboutQt) self.menu_about.addAction(about) # Create an artificial color close to the original one self.ihc_rgb = data.immunohistochemistry() self.ihc_hed = rgb2hed(self.ihc_rgb) main_layout = QVBoxLayout(self._main) plot_layout = QHBoxLayout() button_layout = QHBoxLayout() label_layout = QHBoxLayout() self.canvas1 = FigureCanvas(Figure(figsize=(5, 5))) self.canvas2 = FigureCanvas(Figure(figsize=(5, 5))) self._ax1 = self.canvas1.figure.subplots() self._ax2 = self.canvas2.figure.subplots() self._ax1.imshow(self.ihc_rgb) plot_layout.addWidget(self.canvas1) plot_layout.addWidget(self.canvas2) self.button1 = QPushButton("Hematoxylin") self.button2 = QPushButton("Eosin") self.button3 = QPushButton("DAB") self.button4 = QPushButton("Fluorescence") self.button1.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.button2.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.button3.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.button4.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) self.button1.clicked.connect(self.plot_hematoxylin) self.button2.clicked.connect(self.plot_eosin) self.button3.clicked.connect(self.plot_dab) self.button4.clicked.connect(self.plot_final) self.label1 = QLabel("Original", alignment=Qt.AlignCenter) self.label2 = QLabel("", alignment=Qt.AlignCenter) font = self.label1.font() font.setPointSize(16) self.label1.setFont(font) self.label2.setFont(font) label_layout.addWidget(self.label1) label_layout.addWidget(self.label2) button_layout.addWidget(self.button1) button_layout.addWidget(self.button2) button_layout.addWidget(self.button3) button_layout.addWidget(self.button4) main_layout.addLayout(label_layout, 2) main_layout.addLayout(plot_layout, 88) main_layout.addLayout(button_layout, 10) # Default image self.plot_hematoxylin() def set_buttons_state(self, states): self.button1.setEnabled(states[0]) self.button2.setEnabled(states[1]) self.button3.setEnabled(states[2]) self.button4.setEnabled(states[3]) @Slot() def plot_hematoxylin(self): cmap_hema = LinearSegmentedColormap.from_list("mycmap", ["white", "navy"]) self._ax2.imshow(self.ihc_hed[:, :, 0], cmap=cmap_hema) self.canvas2.draw() self.label2.setText("Hematoxylin") self.set_buttons_state((False, True, True, True)) @Slot() def plot_eosin(self): cmap_eosin = LinearSegmentedColormap.from_list("mycmap", ["darkviolet", "white"]) self._ax2.imshow(self.ihc_hed[:, :, 1], cmap=cmap_eosin) self.canvas2.draw() self.label2.setText("Eosin") self.set_buttons_state((True, False, True, True)) @Slot() def plot_dab(self): cmap_dab = LinearSegmentedColormap.from_list("mycmap", ["white", "saddlebrown"]) self._ax2.imshow(self.ihc_hed[:, :, 2], cmap=cmap_dab) self.canvas2.draw() self.label2.setText("DAB") self.set_buttons_state((True, True, False, True)) @Slot() def plot_final(self): h = rescale_intensity(self.ihc_hed[:, :, 0], out_range=(0, 1)) d = rescale_intensity(self.ihc_hed[:, :, 2], out_range=(0, 1)) zdh = np.dstack((np.zeros_like(h), d, h)) self._ax2.imshow(zdh) self.canvas2.draw() self.label2.setText("Stain separated image") self.set_buttons_state((True, True, True, False)) if __name__ == "__main__": app = QApplication(sys.argv) w = ApplicationWindow() w.show() app.exec_() examples/installer_test/000077500000000000000000000000001376617013100157355ustar00rootroot00000000000000examples/installer_test/hello.py000066400000000000000000000074571376617013100174270ustar00rootroot00000000000000# This Python file uses the following encoding: utf-8 # It has been edited by fix-complaints.py . ############################################################################# ## ## 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$ ## ############################################################################# """ hello.py -------- This simple script shows a label with changing "Hello World" messages. It can be used directly as a script, but we use it also to automatically test PyInstaller. See testing/wheel_tester.py . When used with PyInstaller, it automatically stops its execution after 2 seconds. """ from __future__ import print_function import sys import random import platform import time from PySide2.QtWidgets import (QApplication, QLabel, QPushButton, QVBoxLayout, QWidget) from PySide2.QtCore import Slot, Qt, QTimer class MyWidget(QWidget): def __init__(self): QWidget.__init__(self) self.hello = ["Hallo Welt", "你好,世界", "Hei maailma", "Hola Mundo", "Привет мир"] self.button = QPushButton("Click me!") self.text = QLabel("Hello World embedded={}".format(sys.pyside_uses_embedding)) self.text.setAlignment(Qt.AlignCenter) self.layout = QVBoxLayout() self.layout.addWidget(self.text) self.layout.addWidget(self.button) self.setLayout(self.layout) # Connecting the signal self.button.clicked.connect(self.magic) @Slot() def magic(self): self.text.setText(random.choice(self.hello)) if __name__ == "__main__": print("Start of hello.py ", time.ctime()) print(" sys.version = {}".format(sys.version.splitlines()[0])) print(" platform.platform() = {}".format(platform.platform())) app = QApplication() widget = MyWidget() widget.resize(800, 600) widget.show() if sys.pyside_uses_embedding: milliseconds = 2 * 1000 # run 2 second QTimer.singleShot(milliseconds, app.quit) retcode = app.exec_() print("End of hello.py ", time.ctime()) sys.exit(retcode) examples/installer_test/hello_app.spec000066400000000000000000000073321376617013100205610ustar00rootroot00000000000000# This Python file uses the following encoding: utf-8 # It has been edited by fix-complaints.py . ############################################################################# ## ## 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$ ## ############################################################################# """ hello_app.spec This is almost the spec file generated by running PyInstaller. Just the paths were adjusted and made relative. As an effect, all the analysis is avoided, and the log file of wheel_tester.py went down from 775 lines to 278 lines. :-) """ block_cipher = None a = Analysis(['hello.py'], pathex=['pyinstaller'], binaries=[], datas=[], hiddenimports=[], hookspath=[], runtime_hooks=[], # 2019-04-28 # This hack circumvents a side effect of Python 2.7.16 which leads to a failure # in 'hook-_tkinter.py'. The error is reported. Until it is fixed, we circumvent # the problem by this exclude. # This effect is triggered by installing 'numpy'. It is somewhat special since # the problem does not show up in Python 3.7 . tkinter would have the same # problem on Python 3.7, but numpy would not trigger it for some reason. excludes=['FixTk', 'tcl', 'tk', '_tkinter', 'tkinter', 'Tkinter'], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False) pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) exe = EXE(pyz, a.scripts, [], exclude_binaries=True, name='hello_app', debug=False, bootloader_ignore_signals=False, strip=False, upx=True, console=True ) coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True, name='hello_app') examples/macextras/000077500000000000000000000000001376617013100146705ustar00rootroot00000000000000examples/macextras/macextras.pyproject000066400000000000000000000000521376617013100206150ustar00rootroot00000000000000{ "files": ["macpasteboardmime.py"] } examples/macextras/macpasteboardmime.py000066400000000000000000000106721376617013100207250ustar00rootroot00000000000000 ############################################################################ ## ## 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$ ## ############################################################################ import sys from PySide2 import QtCore, QtWidgets try: from PySide2 import QtMacExtras except ImportError: app = QtWidgets.QApplication(sys.argv) messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "QtMacExtras macpasteboardmime", "This exampe only runs on macOS and QtMacExtras must be installed to run this example.", QtWidgets.QMessageBox.Close) messageBox.exec_() sys.exit(1) class VCardMime(QtMacExtras.QMacPasteboardMime): def __init__(self, t = QtMacExtras.QMacPasteboardMime.MIME_ALL): super(VCardMime, self).__init__(t) def convertorName(self): return "VCardMime" def canConvert(self, mime, flav): if self.mimeFor(flav) == mime: return True else: return False def mimeFor(self, flav): if flav == "public.vcard": return "application/x-mycompany-VCard" else: return "" def flavorFor(self, mime): if mime == "application/x-mycompany-VCard": return "public.vcard" else: return "" def convertToMime(self, mime, data, flav): all = QtCore.QByteArray() for i in data: all += i return all def convertFromMime(mime, data, flav): # Todo: implement! return [] class TestWidget(QtWidgets.QWidget): def __init__(self, parent=None): super(TestWidget, self).__init__(parent) self.vcardMime = VCardMime() self.setAcceptDrops(True) self.label1 = QtWidgets.QLabel() self.label2 = QtWidgets.QLabel() layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label1) layout.addWidget(self.label2) self.setLayout(layout) self.label1.setText("Please drag a \"VCard\" from Contacts application, normally a name in the list, and drop here.") def dragEnterEvent(self, e): e.accept() def dropEvent(self, e): e.accept() self.contentsDropEvent(e) def contentsDropEvent(self, e): if e.mimeData().hasFormat("application/x-mycompany-VCard"): s = e.mimeData().data( "application/x-mycompany-VCard" ) # s now contains text of vcard self.label2.setText(str(s)) e.acceptProposedAction() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) QtMacExtras.qRegisterDraggedTypes(["public.vcard"]) wid1 = TestWidget() wid1.show() sys.exit(app.exec_()) examples/multimedia/000077500000000000000000000000001376617013100150335ustar00rootroot00000000000000examples/multimedia/audiooutput.py000066400000000000000000000253771376617013100200050ustar00rootroot00000000000000 ############################################################################# ## ## 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 multimedia/audiooutput example from Qt v5.x, originating from PyQt""" from math import pi, sin from struct import pack from PySide2.QtCore import QByteArray, QIODevice, Qt, QTimer, qWarning from PySide2.QtMultimedia import (QAudio, QAudioDeviceInfo, QAudioFormat, QAudioOutput) from PySide2.QtWidgets import (QApplication, QComboBox, QHBoxLayout, QLabel, QMainWindow, QPushButton, QSlider, QVBoxLayout, QWidget) class Generator(QIODevice): def __init__(self, format, durationUs, sampleRate, parent): super(Generator, self).__init__(parent) self.m_pos = 0 self.m_buffer = QByteArray() self.generateData(format, durationUs, sampleRate) def start(self): self.open(QIODevice.ReadOnly) def stop(self): self.m_pos = 0 self.close() def generateData(self, format, durationUs, sampleRate): pack_format = '' if format.sampleSize() == 8: if format.sampleType() == QAudioFormat.UnSignedInt: scaler = lambda x: ((1.0 + x) / 2 * 255) pack_format = 'B' elif format.sampleType() == QAudioFormat.SignedInt: scaler = lambda x: x * 127 pack_format = 'b' elif format.sampleSize() == 16: if format.sampleType() == QAudioFormat.UnSignedInt: scaler = lambda x: (1.0 + x) / 2 * 65535 pack_format = 'H' elif format.sampleType() == QAudioFormat.SignedInt: scaler = lambda x: x * 32767 pack_format = 'h' assert(pack_format != '') channelBytes = format.sampleSize() // 8 sampleBytes = format.channelCount() * channelBytes length = (format.sampleRate() * format.channelCount() * (format.sampleSize() // 8)) * durationUs // 100000 self.m_buffer.clear() sampleIndex = 0 factor = 2 * pi * sampleRate / format.sampleRate() while length != 0: x = sin((sampleIndex % format.sampleRate()) * factor) packed = pack(pack_format, int(scaler(x))) for _ in range(format.channelCount()): self.m_buffer.append(packed) length -= channelBytes sampleIndex += 1 def readData(self, maxlen): data = QByteArray() total = 0 while maxlen > total: chunk = min(self.m_buffer.size() - self.m_pos, maxlen - total) data.append(self.m_buffer.mid(self.m_pos, chunk)) self.m_pos = (self.m_pos + chunk) % self.m_buffer.size() total += chunk return data.data() def writeData(self, data): return 0 def bytesAvailable(self): return self.m_buffer.size() + super(Generator, self).bytesAvailable() class AudioTest(QMainWindow): PUSH_MODE_LABEL = "Enable push mode" PULL_MODE_LABEL = "Enable pull mode" SUSPEND_LABEL = "Suspend playback" RESUME_LABEL = "Resume playback" DurationSeconds = 1 ToneSampleRateHz = 600 DataSampleRateHz = 44100 def __init__(self): super(AudioTest, self).__init__() self.m_device = QAudioDeviceInfo.defaultOutputDevice() self.m_output = None self.initializeWindow() self.initializeAudio() def initializeWindow(self): layout = QVBoxLayout() self.m_deviceBox = QComboBox() self.m_deviceBox.activated[int].connect(self.deviceChanged) for deviceInfo in QAudioDeviceInfo.availableDevices(QAudio.AudioOutput): self.m_deviceBox.addItem(deviceInfo.deviceName(), deviceInfo) layout.addWidget(self.m_deviceBox) self.m_modeButton = QPushButton() self.m_modeButton.clicked.connect(self.toggleMode) self.m_modeButton.setText(self.PUSH_MODE_LABEL) layout.addWidget(self.m_modeButton) self.m_suspendResumeButton = QPushButton( clicked=self.toggleSuspendResume) self.m_suspendResumeButton.setText(self.SUSPEND_LABEL) layout.addWidget(self.m_suspendResumeButton) volumeBox = QHBoxLayout() volumeLabel = QLabel("Volume:") self.m_volumeSlider = QSlider(Qt.Horizontal, minimum=0, maximum=100, singleStep=10) self.m_volumeSlider.valueChanged.connect(self.volumeChanged) volumeBox.addWidget(volumeLabel) volumeBox.addWidget(self.m_volumeSlider) layout.addLayout(volumeBox) window = QWidget() window.setLayout(layout) self.setCentralWidget(window) def initializeAudio(self): self.m_pullTimer = QTimer(self) self.m_pullTimer.timeout.connect(self.pullTimerExpired) self.m_pullMode = True self.m_format = QAudioFormat() self.m_format.setSampleRate(self.DataSampleRateHz) self.m_format.setChannelCount(1) self.m_format.setSampleSize(16) self.m_format.setCodec('audio/pcm') self.m_format.setByteOrder(QAudioFormat.LittleEndian) self.m_format.setSampleType(QAudioFormat.SignedInt) info = QAudioDeviceInfo(QAudioDeviceInfo.defaultOutputDevice()) if not info.isFormatSupported(self.m_format): qWarning("Default format not supported - trying to use nearest") self.m_format = info.nearestFormat(self.m_format) self.m_generator = Generator(self.m_format, self.DurationSeconds * 1000000, self.ToneSampleRateHz, self) self.createAudioOutput() def createAudioOutput(self): self.m_audioOutput = QAudioOutput(self.m_device, self.m_format) self.m_audioOutput.notify.connect(self.notified) self.m_audioOutput.stateChanged.connect(self.handleStateChanged) self.m_generator.start() self.m_audioOutput.start(self.m_generator) self.m_volumeSlider.setValue(self.m_audioOutput.volume() * 100) def deviceChanged(self, index): self.m_pullTimer.stop() self.m_generator.stop() self.m_audioOutput.stop() self.m_device = self.m_deviceBox.itemData(index) self.createAudioOutput() def volumeChanged(self, value): if self.m_audioOutput is not None: self.m_audioOutput.setVolume(value / 100.0) def notified(self): qWarning("bytesFree = %d, elapsedUSecs = %d, processedUSecs = %d" % ( self.m_audioOutput.bytesFree(), self.m_audioOutput.elapsedUSecs(), self.m_audioOutput.processedUSecs())) def pullTimerExpired(self): if self.m_audioOutput is not None and self.m_audioOutput.state() != QAudio.StoppedState: chunks = self.m_audioOutput.bytesFree() // self.m_audioOutput.periodSize() for _ in range(chunks): data = self.m_generator.read(self.m_audioOutput.periodSize()) if data is None or len(data) != self.m_audioOutput.periodSize(): break self.m_output.write(data) def toggleMode(self): self.m_pullTimer.stop() self.m_audioOutput.stop() if self.m_pullMode: self.m_modeButton.setText(self.PULL_MODE_LABEL) self.m_output = self.m_audioOutput.start() self.m_pullMode = False self.m_pullTimer.start(20) else: self.m_modeButton.setText(self.PUSH_MODE_LABEL) self.m_pullMode = True self.m_audioOutput.start(self.m_generator) self.m_suspendResumeButton.setText(self.SUSPEND_LABEL) def toggleSuspendResume(self): if self.m_audioOutput.state() == QAudio.SuspendedState: qWarning("status: Suspended, resume()") self.m_audioOutput.resume() self.m_suspendResumeButton.setText(self.SUSPEND_LABEL) elif self.m_audioOutput.state() == QAudio.ActiveState: qWarning("status: Active, suspend()") self.m_audioOutput.suspend() self.m_suspendResumeButton.setText(self.RESUME_LABEL) elif self.m_audioOutput.state() == QAudio.StoppedState: qWarning("status: Stopped, resume()") self.m_audioOutput.resume() self.m_suspendResumeButton.setText(self.SUSPEND_LABEL) elif self.m_audioOutput.state() == QAudio.IdleState: qWarning("status: IdleState") stateMap = { QAudio.ActiveState: "ActiveState", QAudio.SuspendedState: "SuspendedState", QAudio.StoppedState: "StoppedState", QAudio.IdleState: "IdleState"} def handleStateChanged(self, state): qWarning("state = " + self.stateMap.get(state, "Unknown")) if __name__ == '__main__': import sys app = QApplication(sys.argv) app.setApplicationName("Audio Output Test") audio = AudioTest() audio.show() sys.exit(app.exec_()) examples/multimedia/camera.py000066400000000000000000000157761376617013100166550ustar00rootroot00000000000000 ############################################################################# ## ## 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 Multimedia Camera Example""" import os, sys from PySide2.QtCore import QDate, QDir, QStandardPaths, Qt, QUrl from PySide2.QtGui import QGuiApplication, QDesktopServices, QIcon from PySide2.QtGui import QImage, QPixmap from PySide2.QtWidgets import (QAction, QApplication, QHBoxLayout, QLabel, QMainWindow, QPushButton, QTabWidget, QToolBar, QVBoxLayout, QWidget) from PySide2.QtMultimedia import QCamera, QCameraImageCapture, QCameraInfo from PySide2.QtMultimediaWidgets import QCameraViewfinder class ImageView(QWidget): def __init__(self, previewImage, fileName): super(ImageView, self).__init__() self.fileName = fileName mainLayout = QVBoxLayout(self) self.imageLabel = QLabel() self.imageLabel.setPixmap(QPixmap.fromImage(previewImage)) mainLayout.addWidget(self.imageLabel) topLayout = QHBoxLayout() self.fileNameLabel = QLabel(QDir.toNativeSeparators(fileName)) self.fileNameLabel.setTextInteractionFlags(Qt.TextBrowserInteraction) topLayout.addWidget(self.fileNameLabel) topLayout.addStretch() copyButton = QPushButton("Copy") copyButton.setToolTip("Copy file name to clipboard") topLayout.addWidget(copyButton) copyButton.clicked.connect(self.copy) launchButton = QPushButton("Launch") launchButton.setToolTip("Launch image viewer") topLayout.addWidget(launchButton) launchButton.clicked.connect(self.launch) mainLayout.addLayout(topLayout) def copy(self): QGuiApplication.clipboard().setText(self.fileNameLabel.text()) def launch(self): QDesktopServices.openUrl(QUrl.fromLocalFile(self.fileName)) class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.cameraInfo = QCameraInfo.defaultCamera() self.camera = QCamera(self.cameraInfo) self.camera.setCaptureMode(QCamera.CaptureStillImage) self.imageCapture = QCameraImageCapture(self.camera) self.imageCapture.imageCaptured.connect(self.imageCaptured) self.imageCapture.imageSaved.connect(self.imageSaved) self.currentPreview = QImage() toolBar = QToolBar() self.addToolBar(toolBar) fileMenu = self.menuBar().addMenu("&File") shutterIcon = QIcon(os.path.join(os.path.dirname(__file__), "shutter.svg")) self.takePictureAction = QAction(shutterIcon, "&Take Picture", self, shortcut="Ctrl+T", triggered=self.takePicture) self.takePictureAction.setToolTip("Take Picture") fileMenu.addAction(self.takePictureAction) toolBar.addAction(self.takePictureAction) exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit", self, shortcut="Ctrl+Q", triggered=self.close) fileMenu.addAction(exitAction) aboutMenu = self.menuBar().addMenu("&About") aboutQtAction = QAction("About &Qt", self, triggered=qApp.aboutQt) aboutMenu.addAction(aboutQtAction) self.tabWidget = QTabWidget() self.setCentralWidget(self.tabWidget) self.cameraViewfinder = QCameraViewfinder() self.camera.setViewfinder(self.cameraViewfinder) self.tabWidget.addTab(self.cameraViewfinder, "Viewfinder") if self.camera.status() != QCamera.UnavailableStatus: name = self.cameraInfo.description() self.setWindowTitle("PySide2 Camera Example (" + name + ")") self.statusBar().showMessage("Starting: '" + name + "'", 5000) self.camera.start() else: self.setWindowTitle("PySide2 Camera Example") self.takePictureAction.setEnabled(False) self.statusBar().showMessage("Camera unavailable", 5000) def nextImageFileName(self): picturesLocation = QStandardPaths.writableLocation(QStandardPaths.PicturesLocation) dateString = QDate.currentDate().toString("yyyyMMdd") pattern = picturesLocation + "/pyside2_camera_" + dateString + "_{:03d}.jpg" n = 1 while True: result = pattern.format(n) if not os.path.exists(result): return result n = n + 1 return None def takePicture(self): self.currentPreview = QImage() self.camera.searchAndLock() self.imageCapture.capture(self.nextImageFileName()) self.camera.unlock() def imageCaptured(self, id, previewImage): self.currentPreview = previewImage def imageSaved(self, id, fileName): index = self.tabWidget.count() imageView = ImageView(self.currentPreview, fileName) self.tabWidget.addTab(imageView, "Capture #{}".format(index)) self.tabWidget.setCurrentIndex(index) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() availableGeometry = app.desktop().availableGeometry(mainWin) mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2) mainWin.show() sys.exit(app.exec_()) examples/multimedia/multimedia.pyproject000066400000000000000000000000761376617013100211310ustar00rootroot00000000000000{ "files": ["player.py", "audiooutput.py", "camera.py"] } examples/multimedia/player.py000066400000000000000000000154671376617013100167160ustar00rootroot00000000000000 ############################################################################# ## ## 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 Multimedia player example""" import sys from PySide2.QtCore import QStandardPaths, Qt from PySide2.QtGui import QIcon, QKeySequence from PySide2.QtWidgets import (QAction, QApplication, QDialog, QFileDialog, QMainWindow, QSlider, QStyle, QToolBar) from PySide2.QtMultimedia import QMediaPlayer, QMediaPlaylist from PySide2.QtMultimediaWidgets import QVideoWidget class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.playlist = QMediaPlaylist() self.player = QMediaPlayer() toolBar = QToolBar() self.addToolBar(toolBar) fileMenu = self.menuBar().addMenu("&File") openAction = QAction(QIcon.fromTheme("document-open"), "&Open...", self, shortcut=QKeySequence.Open, triggered=self.open) fileMenu.addAction(openAction) exitAction = QAction(QIcon.fromTheme("application-exit"), "E&xit", self, shortcut="Ctrl+Q", triggered=self.close) fileMenu.addAction(exitAction) playMenu = self.menuBar().addMenu("&Play") playIcon = self.style().standardIcon(QStyle.SP_MediaPlay) self.playAction = toolBar.addAction(playIcon, "Play") self.playAction.triggered.connect(self.player.play) playMenu.addAction(self.playAction) previousIcon = self.style().standardIcon(QStyle.SP_MediaSkipBackward) self.previousAction = toolBar.addAction(previousIcon, "Previous") self.previousAction.triggered.connect(self.previousClicked) playMenu.addAction(self.previousAction) pauseIcon = self.style().standardIcon(QStyle.SP_MediaPause) self.pauseAction = toolBar.addAction(pauseIcon, "Pause") self.pauseAction.triggered.connect(self.player.pause) playMenu.addAction(self.pauseAction) nextIcon = self.style().standardIcon(QStyle.SP_MediaSkipForward) self.nextAction = toolBar.addAction(nextIcon, "Next") self.nextAction.triggered.connect(self.playlist.next) playMenu.addAction(self.nextAction) stopIcon = self.style().standardIcon(QStyle.SP_MediaStop) self.stopAction = toolBar.addAction(stopIcon, "Stop") self.stopAction.triggered.connect(self.player.stop) playMenu.addAction(self.stopAction) self.volumeSlider = QSlider() self.volumeSlider.setOrientation(Qt.Horizontal) self.volumeSlider.setMinimum(0) self.volumeSlider.setMaximum(100) self.volumeSlider.setFixedWidth(app.desktop().availableGeometry(self).width() / 10) self.volumeSlider.setValue(self.player.volume()) self.volumeSlider.setTickInterval(10) self.volumeSlider.setTickPosition(QSlider.TicksBelow) self.volumeSlider.setToolTip("Volume") self.volumeSlider.valueChanged.connect(self.player.setVolume) toolBar.addWidget(self.volumeSlider) aboutMenu = self.menuBar().addMenu("&About") aboutQtAct = QAction("About &Qt", self, triggered=qApp.aboutQt) aboutMenu.addAction(aboutQtAct) self.videoWidget = QVideoWidget() self.setCentralWidget(self.videoWidget) self.player.setPlaylist(self.playlist) self.player.stateChanged.connect(self.updateButtons) self.player.setVideoOutput(self.videoWidget) self.updateButtons(self.player.state()) def open(self): fileDialog = QFileDialog(self) supportedMimeTypes = QMediaPlayer.supportedMimeTypes() if not supportedMimeTypes: supportedMimeTypes.append("video/x-msvideo") # AVI fileDialog.setMimeTypeFilters(supportedMimeTypes) moviesLocation = QStandardPaths.writableLocation(QStandardPaths.MoviesLocation) fileDialog.setDirectory(moviesLocation) if fileDialog.exec_() == QDialog.Accepted: self.playlist.addMedia(fileDialog.selectedUrls()[0]) self.player.play() def previousClicked(self): # Go to previous track if we are within the first 5 seconds of playback # Otherwise, seek to the beginning. if self.player.position() <= 5000: self.playlist.previous() else: player.setPosition(0) def updateButtons(self, state): mediaCount = self.playlist.mediaCount() self.playAction.setEnabled(mediaCount > 0 and state != QMediaPlayer.PlayingState) self.pauseAction.setEnabled(state == QMediaPlayer.PlayingState) self.stopAction.setEnabled(state != QMediaPlayer.StoppedState) self.previousAction.setEnabled(self.player.position() > 0) self.nextAction.setEnabled(mediaCount > 1) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() availableGeometry = app.desktop().availableGeometry(mainWin) mainWin.resize(availableGeometry.width() / 3, availableGeometry.height() / 2) mainWin.show() sys.exit(app.exec_()) examples/multimedia/shutter.svg000066400000000000000000000026761376617013100172650ustar00rootroot00000000000000 examples/network/000077500000000000000000000000001376617013100143725ustar00rootroot00000000000000examples/network/blockingfortuneclient.py000066400000000000000000000202411376617013100213350ustar00rootroot00000000000000 ############################################################################# ## ## 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 network/blockingfortunclient example from Qt v5.x, originating from PyQt""" from PySide2.QtCore import (Signal, QDataStream, QMutex, QMutexLocker, QThread, QWaitCondition) from PySide2.QtGui import QIntValidator from PySide2.QtWidgets import (QApplication, QDialogButtonBox, QGridLayout, QLabel, QLineEdit, QMessageBox, QPushButton, QWidget) from PySide2.QtNetwork import (QAbstractSocket, QHostAddress, QNetworkInterface, QTcpSocket) class FortuneThread(QThread): newFortune = Signal(str) error = Signal(int, str) def __init__(self, parent=None): super(FortuneThread, self).__init__(parent) self.quit = False self.hostName = '' self.cond = QWaitCondition() self.mutex = QMutex() self.port = 0 def __del__(self): self.mutex.lock() self.quit = True self.cond.wakeOne() self.mutex.unlock() self.wait() def requestNewFortune(self, hostname, port): locker = QMutexLocker(self.mutex) self.hostName = hostname self.port = port if not self.isRunning(): self.start() else: self.cond.wakeOne() def run(self): self.mutex.lock() serverName = self.hostName serverPort = self.port self.mutex.unlock() while not self.quit: Timeout = 5 * 1000 socket = QTcpSocket() socket.connectToHost(serverName, serverPort) if not socket.waitForConnected(Timeout): self.error.emit(socket.error(), socket.errorString()) return while socket.bytesAvailable() < 2: if not socket.waitForReadyRead(Timeout): self.error.emit(socket.error(), socket.errorString()) return instr = QDataStream(socket) instr.setVersion(QDataStream.Qt_4_0) blockSize = instr.readUInt16() while socket.bytesAvailable() < blockSize: if not socket.waitForReadyRead(Timeout): self.error.emit(socket.error(), socket.errorString()) return self.mutex.lock() fortune = instr.readQString() self.newFortune.emit(fortune) self.cond.wait(self.mutex) serverName = self.hostName serverPort = self.port self.mutex.unlock() class BlockingClient(QWidget): def __init__(self, parent=None): super(BlockingClient, self).__init__(parent) self.thread = FortuneThread() self.currentFortune = '' hostLabel = QLabel("&Server name:") portLabel = QLabel("S&erver port:") for ipAddress in QNetworkInterface.allAddresses(): if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0: break else: ipAddress = QHostAddress(QHostAddress.LocalHost) ipAddress = ipAddress.toString() self.hostLineEdit = QLineEdit(ipAddress) self.portLineEdit = QLineEdit() self.portLineEdit.setValidator(QIntValidator(1, 65535, self)) hostLabel.setBuddy(self.hostLineEdit) portLabel.setBuddy(self.portLineEdit) self.statusLabel = QLabel( "This example requires that you run the Fortune Server example as well.") self.statusLabel.setWordWrap(True) self.getFortuneButton = QPushButton("Get Fortune") self.getFortuneButton.setDefault(True) self.getFortuneButton.setEnabled(False) quitButton = QPushButton("Quit") buttonBox = QDialogButtonBox() buttonBox.addButton(self.getFortuneButton, QDialogButtonBox.ActionRole) buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole) self.getFortuneButton.clicked.connect(self.requestNewFortune) quitButton.clicked.connect(self.close) self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton) self.portLineEdit.textChanged.connect(self.enableGetFortuneButton) self.thread.newFortune.connect(self.showFortune) self.thread.error.connect(self.displayError) mainLayout = QGridLayout() mainLayout.addWidget(hostLabel, 0, 0) mainLayout.addWidget(self.hostLineEdit, 0, 1) mainLayout.addWidget(portLabel, 1, 0) mainLayout.addWidget(self.portLineEdit, 1, 1) mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2) mainLayout.addWidget(buttonBox, 3, 0, 1, 2) self.setLayout(mainLayout) self.setWindowTitle("Blocking Fortune Client") self.portLineEdit.setFocus() def requestNewFortune(self): self.getFortuneButton.setEnabled(False) self.thread.requestNewFortune(self.hostLineEdit.text(), int(self.portLineEdit.text())) def showFortune(self, nextFortune): if nextFortune == self.currentFortune: self.requestNewFortune() return self.currentFortune = nextFortune self.statusLabel.setText(self.currentFortune) self.getFortuneButton.setEnabled(True) def displayError(self, socketError, message): if socketError == QAbstractSocket.HostNotFoundError: QMessageBox.information(self, "Blocking Fortune Client", "The host was not found. Please check the host and port " "settings.") elif socketError == QAbstractSocket.ConnectionRefusedError: QMessageBox.information(self, "Blocking Fortune Client", "The connection was refused by the peer. Make sure the " "fortune server is running, and check that the host name " "and port settings are correct.") else: QMessageBox.information(self, "Blocking Fortune Client", "The following error occurred: %s." % message) self.getFortuneButton.setEnabled(True) def enableGetFortuneButton(self): self.getFortuneButton.setEnabled(self.hostLineEdit.text() != '' and self.portLineEdit.text() != '') if __name__ == '__main__': import sys app = QApplication(sys.argv) client = BlockingClient() client.show() sys.exit(app.exec_()) examples/network/fortuneclient.py000066400000000000000000000147211376617013100176320ustar00rootroot00000000000000 ############################################################################# ## ## 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 network/fortuneclient example from Qt v5.x""" from PySide2 import QtCore, QtGui, QtWidgets, QtNetwork class Client(QtWidgets.QDialog): def __init__(self, parent=None): super(Client, self).__init__(parent) self.blockSize = 0 self.currentFortune = '' hostLabel = QtWidgets.QLabel("&Server name:") portLabel = QtWidgets.QLabel("S&erver port:") self.hostLineEdit = QtWidgets.QLineEdit('Localhost') self.portLineEdit = QtWidgets.QLineEdit() self.portLineEdit.setValidator(QtGui.QIntValidator(1, 65535, self)) hostLabel.setBuddy(self.hostLineEdit) portLabel.setBuddy(self.portLineEdit) self.statusLabel = QtWidgets.QLabel("This examples requires that you run " "the Fortune Server example as well.") self.getFortuneButton = QtWidgets.QPushButton("Get Fortune") self.getFortuneButton.setDefault(True) self.getFortuneButton.setEnabled(False) quitButton = QtWidgets.QPushButton("Quit") buttonBox = QtWidgets.QDialogButtonBox() buttonBox.addButton(self.getFortuneButton, QtWidgets.QDialogButtonBox.ActionRole) buttonBox.addButton(quitButton, QtWidgets.QDialogButtonBox.RejectRole) self.tcpSocket = QtNetwork.QTcpSocket(self) self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton) self.portLineEdit.textChanged.connect(self.enableGetFortuneButton) self.getFortuneButton.clicked.connect(self.requestNewFortune) quitButton.clicked.connect(self.close) self.tcpSocket.readyRead.connect(self.readFortune) self.tcpSocket.error.connect(self.displayError) mainLayout = QtWidgets.QGridLayout() mainLayout.addWidget(hostLabel, 0, 0) mainLayout.addWidget(self.hostLineEdit, 0, 1) mainLayout.addWidget(portLabel, 1, 0) mainLayout.addWidget(self.portLineEdit, 1, 1) mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2) mainLayout.addWidget(buttonBox, 3, 0, 1, 2) self.setLayout(mainLayout) self.setWindowTitle("Fortune Client") self.portLineEdit.setFocus() def requestNewFortune(self): self.getFortuneButton.setEnabled(False) self.blockSize = 0 self.tcpSocket.abort() self.tcpSocket.connectToHost(self.hostLineEdit.text(), int(self.portLineEdit.text())) def readFortune(self): instr = QtCore.QDataStream(self.tcpSocket) instr.setVersion(QtCore.QDataStream.Qt_4_0) if self.blockSize == 0: if self.tcpSocket.bytesAvailable() < 2: return self.blockSize = instr.readUInt16() if self.tcpSocket.bytesAvailable() < self.blockSize: return nextFortune = instr.readString() try: # Python v3. nextFortune = str(nextFortune, encoding='ascii') except TypeError: # Python v2. pass if nextFortune == self.currentFortune: QtCore.QTimer.singleShot(0, self.requestNewFortune) return self.currentFortune = nextFortune self.statusLabel.setText(self.currentFortune) self.getFortuneButton.setEnabled(True) def displayError(self, socketError): if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError: pass elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError: QtWidgets.QMessageBox.information(self, "Fortune Client", "The host was not found. Please check the host name and " "port settings.") elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError: QtWidgets.QMessageBox.information(self, "Fortune Client", "The connection was refused by the peer. Make sure the " "fortune server is running, and check that the host name " "and port settings are correct.") else: QtWidgets.QMessageBox.information(self, "Fortune Client", "The following error occurred: %s." % self.tcpSocket.errorString()) self.getFortuneButton.setEnabled(True) def enableGetFortuneButton(self): self.getFortuneButton.setEnabled(bool(self.hostLineEdit.text() and self.portLineEdit.text())) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) client = Client() client.show() sys.exit(client.exec_()) examples/network/fortuneserver.py000066400000000000000000000107401376617013100176570ustar00rootroot00000000000000 ############################################################################# ## ## 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 network/fortuneserver example from Qt v5.x""" import random from PySide2 import QtCore, QtWidgets, QtNetwork class Server(QtWidgets.QDialog): def __init__(self, parent=None): super(Server, self).__init__(parent) statusLabel = QtWidgets.QLabel() quitButton = QtWidgets.QPushButton("Quit") quitButton.setAutoDefault(False) self.tcpServer = QtNetwork.QTcpServer(self) if not self.tcpServer.listen(): QtWidgets.QMessageBox.critical(self, "Fortune Server", "Unable to start the server: %s." % self.tcpServer.errorString()) self.close() return statusLabel.setText("The server is running on port %d.\nRun the " "Fortune Client example now." % self.tcpServer.serverPort()) self.fortunes = ( "You've been leading a dog's life. Stay off the furniture.", "You've got to think about tomorrow.", "You will be surprised by a loud noise.", "You will feel hungry again in another hour.", "You might have mail.", "You cannot kill time without injuring eternity.", "Computers are not intelligent. They only think they are.") quitButton.clicked.connect(self.close) self.tcpServer.newConnection.connect(self.sendFortune) buttonLayout = QtWidgets.QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(quitButton) buttonLayout.addStretch(1) mainLayout = QtWidgets.QVBoxLayout() mainLayout.addWidget(statusLabel) mainLayout.addLayout(buttonLayout) self.setLayout(mainLayout) self.setWindowTitle("Fortune Server") def sendFortune(self): block = QtCore.QByteArray() out = QtCore.QDataStream(block, QtCore.QIODevice.WriteOnly) out.setVersion(QtCore.QDataStream.Qt_4_0) out.writeUInt16(0) fortune = self.fortunes[random.randint(0, len(self.fortunes) - 1)] out.writeString(fortune) out.device().seek(0) out.writeUInt16(block.size() - 2) clientConnection = self.tcpServer.nextPendingConnection() clientConnection.disconnected.connect(clientConnection.deleteLater) clientConnection.write(block) clientConnection.disconnectFromHost() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) server = Server() random.seed(None) sys.exit(server.exec_()) examples/network/network.pyproject000066400000000000000000000002001376617013100200140ustar00rootroot00000000000000{ "files": ["blockingfortuneclient.py", "fortuneserver.py", "threadedfortuneserver.py", "fortuneclient.py"] } examples/network/threadedfortuneserver.py000066400000000000000000000127541376617013100213670ustar00rootroot00000000000000 ############################################################################# ## ## 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 network/threadedfortuneserver example from Qt v5.x, originating from PyQt""" import random from PySide2.QtCore import (Signal, QByteArray, QDataStream, QIODevice, QThread, Qt) from PySide2.QtWidgets import (QApplication, QDialog, QHBoxLayout, QLabel, QMessageBox, QPushButton, QVBoxLayout) from PySide2.QtNetwork import (QHostAddress, QNetworkInterface, QTcpServer, QTcpSocket) class FortuneThread(QThread): error = Signal(QTcpSocket.SocketError) def __init__(self, socketDescriptor, fortune, parent): super(FortuneThread, self).__init__(parent) self.socketDescriptor = socketDescriptor self.text = fortune def run(self): tcpSocket = QTcpSocket() if not tcpSocket.setSocketDescriptor(self.socketDescriptor): self.error.emit(tcpSocket.error()) return block = QByteArray() outstr = QDataStream(block, QIODevice.WriteOnly) outstr.setVersion(QDataStream.Qt_4_0) outstr.writeUInt16(0) outstr.writeQString(self.text) outstr.device().seek(0) outstr.writeUInt16(block.size() - 2) tcpSocket.write(block) tcpSocket.disconnectFromHost() tcpSocket.waitForDisconnected() class FortuneServer(QTcpServer): fortunes = ( "You've been leading a dog's life. Stay off the furniture.", "You've got to think about tomorrow.", "You will be surprised by a loud noise.", "You will feel hungry again in another hour.", "You might have mail.", "You cannot kill time without injuring eternity.", "Computers are not intelligent. They only think they are.") def incomingConnection(self, socketDescriptor): fortune = self.fortunes[random.randint(0, len(self.fortunes) - 1)] thread = FortuneThread(socketDescriptor, fortune, self) thread.finished.connect(thread.deleteLater) thread.start() class Dialog(QDialog): def __init__(self, parent=None): super(Dialog, self).__init__(parent) self.server = FortuneServer() statusLabel = QLabel() statusLabel.setTextInteractionFlags(Qt.TextBrowserInteraction) statusLabel.setWordWrap(True) quitButton = QPushButton("Quit") quitButton.setAutoDefault(False) if not self.server.listen(): QMessageBox.critical(self, "Threaded Fortune Server", "Unable to start the server: %s." % self.server.errorString()) self.close() return for ipAddress in QNetworkInterface.allAddresses(): if ipAddress != QHostAddress.LocalHost and ipAddress.toIPv4Address() != 0: break else: ipAddress = QHostAddress(QHostAddress.LocalHost) ipAddress = ipAddress.toString() statusLabel.setText("The server is running on\n\nIP: %s\nport: %d\n\n" "Run the Fortune Client example now." % (ipAddress, self.server.serverPort())) quitButton.clicked.connect(self.close) buttonLayout = QHBoxLayout() buttonLayout.addStretch(1) buttonLayout.addWidget(quitButton) buttonLayout.addStretch(1) mainLayout = QVBoxLayout() mainLayout.addWidget(statusLabel) mainLayout.addLayout(buttonLayout) self.setLayout(mainLayout) self.setWindowTitle("Threaded Fortune Server") if __name__ == '__main__': import sys app = QApplication(sys.argv) dialog = Dialog() dialog.show() sys.exit(dialog.exec_()) examples/opengl/000077500000000000000000000000001376617013100141655ustar00rootroot00000000000000examples/opengl/2dpainting.py000066400000000000000000000135631376617013100166060ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/legacy/2dpainting example from Qt v5.x""" import sys from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtOpenGL import * try: from OpenGL import GL except ImportError: app = QApplication(sys.argv) messageBox = QMessageBox(QMessageBox.Critical, "OpenGL 2dpainting", "PyOpenGL must be installed to run this example.", QMessageBox.Close) messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate") messageBox.exec_() sys.exit(1) class Helper: def __init__(self): gradient = QLinearGradient(QPointF(50, -20), QPointF(80, 20)) gradient.setColorAt(0.0, Qt.white) gradient.setColorAt(1.0, QColor(0xa6, 0xce, 0x39)) self.background = QBrush(QColor(64, 32, 64)) self.circleBrush = QBrush(gradient) self.circlePen = QPen(Qt.black) self.circlePen.setWidth(1) self.textPen = QPen(Qt.white) self.textFont = QFont() self.textFont.setPixelSize(50) def paint(self, painter, event, elapsed): painter.fillRect(event.rect(), self.background) painter.translate(100, 100) painter.save() painter.setBrush(self.circleBrush) painter.setPen(self.circlePen) painter.rotate(elapsed * 0.030) r = elapsed/1000.0 n = 30 for i in range(n): painter.rotate(30) radius = 0 + 120.0*((i+r)/n) circleRadius = 1 + ((i+r)/n)*20 painter.drawEllipse(QRectF(radius, -circleRadius, circleRadius*2, circleRadius*2)) painter.restore() painter.setPen(self.textPen) painter.setFont(self.textFont) painter.drawText(QRect(-50, -50, 100, 100), Qt.AlignCenter, "Qt") class Widget(QWidget): def __init__(self, helper, parent = None): QWidget.__init__(self, parent) self.helper = helper self.elapsed = 0 self.setFixedSize(200, 200) def animate(self): self.elapsed = (self.elapsed + self.sender().interval()) % 1000 self.repaint() def paintEvent(self, event): painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) self.helper.paint(painter, event, self.elapsed) painter.end() class GLWidget(QGLWidget): def __init__(self, helper, parent = None): QGLWidget.__init__(self, QGLFormat(QGL.SampleBuffers), parent) self.helper = helper self.elapsed = 0 self.setFixedSize(200, 200) def animate(self): self.elapsed = (self.elapsed + self.sender().interval()) % 1000 self.repaint() def paintEvent(self, event): painter = QPainter() painter.begin(self) self.helper.paint(painter, event, self.elapsed) painter.end() class Window(QWidget): def __init__(self, parent = None): QWidget.__init__(self, parent) helper = Helper() native = Widget(helper, self) openGL = GLWidget(helper, self) nativeLabel = QLabel(self.tr("Native")) nativeLabel.setAlignment(Qt.AlignHCenter) openGLLabel = QLabel(self.tr("OpenGL")) openGLLabel.setAlignment(Qt.AlignHCenter) layout = QGridLayout() layout.addWidget(native, 0, 0) layout.addWidget(openGL, 0, 1) layout.addWidget(nativeLabel, 1, 0) layout.addWidget(openGLLabel, 1, 1) self.setLayout(layout) timer = QTimer(self) self.connect(timer, SIGNAL("timeout()"), native.animate) self.connect(timer, SIGNAL("timeout()"), openGL.animate) timer.start(50) self.setWindowTitle(self.tr("2D Painting on Native and OpenGL Widgets")) if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) examples/opengl/contextinfo.py000066400000000000000000000260321376617013100171020ustar00rootroot00000000000000 ############################################################################# ## ## 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/contextinfo example from Qt v5.x""" from argparse import ArgumentParser, RawTextHelpFormatter import numpy import sys from textwrap import dedent from PySide2.QtCore import QCoreApplication, QLibraryInfo, QSize, QTimer, Qt from PySide2.QtGui import (QMatrix4x4, QOpenGLBuffer, QOpenGLContext, QOpenGLShader, QOpenGLShaderProgram, QOpenGLVertexArrayObject, QSurfaceFormat, QWindow) from PySide2.QtWidgets import (QApplication, QHBoxLayout, QMessageBox, QPlainTextEdit, QWidget) from PySide2.support import VoidPtr try: from OpenGL import GL except ImportError: app = QApplication(sys.argv) messageBox = QMessageBox(QMessageBox.Critical, "ContextInfo", "PyOpenGL must be installed to run this example.", QMessageBox.Close) messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate") messageBox.exec_() sys.exit(1) vertexShaderSource110 = dedent(""" // version 110 attribute highp vec4 posAttr; attribute lowp vec4 colAttr; varying lowp vec4 col; uniform highp mat4 matrix; void main() { col = colAttr; gl_Position = matrix * posAttr; } """) fragmentShaderSource110 = dedent(""" // version 110 varying lowp vec4 col; void main() { gl_FragColor = col; } """) vertexShaderSource = dedent(""" // version 150 in vec4 posAttr; in vec4 colAttr; out vec4 col; uniform mat4 matrix; void main() { col = colAttr; gl_Position = matrix * posAttr; } """) fragmentShaderSource = dedent(""" // version 150 in vec4 col; out vec4 fragColor; void main() { fragColor = col; } """) vertices = numpy.array([0, 0.707, -0.5, -0.5, 0.5, -0.5], dtype = numpy.float32) colors = numpy.array([1, 0, 0, 0, 1, 0, 0, 0, 1], dtype = numpy.float32) def print_surface_format(surface_format): profile_name = 'core' if surface_format.profile() == QSurfaceFormat.CoreProfile else 'compatibility' return "{} version {}.{}".format(profile_name, surface_format.majorVersion(), surface_format.minorVersion()) class RenderWindow(QWindow): def __init__(self, format): super(RenderWindow, self).__init__() self.setSurfaceType(QWindow.OpenGLSurface) self.setFormat(format) self.context = QOpenGLContext(self) self.context.setFormat(self.requestedFormat()) if not self.context.create(): raise Exception("Unable to create GL context") self.program = None self.timer = None self.angle = 0 def initGl(self): self.program = QOpenGLShaderProgram(self) self.vao = QOpenGLVertexArrayObject() self.vbo = QOpenGLBuffer() format = self.context.format() useNewStyleShader = format.profile() == QSurfaceFormat.CoreProfile # Try to handle 3.0 & 3.1 that do not have the core/compatibility profile # concept 3.2+ has. This may still fail since version 150 (3.2) is # specified in the sources but it's worth a try. if (format.renderableType() == QSurfaceFormat.OpenGL and format.majorVersion() == 3 and format.minorVersion() <= 1): useNewStyleShader = not format.testOption(QSurfaceFormat.DeprecatedFunctions) vertexShader = vertexShaderSource if useNewStyleShader else vertexShaderSource110 fragmentShader = fragmentShaderSource if useNewStyleShader else fragmentShaderSource110 if not self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, vertexShader): raise Exception("Vertex shader could not be added: {} ({})".format(self.program.log(), vertexShader)) if not self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, fragmentShader): raise Exception("Fragment shader could not be added: {} ({})".format(self.program.log(), fragmentShader)) if not self.program.link(): raise Exception("Could not link shaders: {}".format(self.program.log())) self.posAttr = self.program.attributeLocation("posAttr") self.colAttr = self.program.attributeLocation("colAttr") self.matrixUniform = self.program.uniformLocation("matrix") self.vbo.create() self.vbo.bind() self.verticesData = vertices.tobytes() self.colorsData = colors.tobytes() verticesSize = 4 * vertices.size colorsSize = 4 * colors.size self.vbo.allocate(VoidPtr(self.verticesData), verticesSize + colorsSize) self.vbo.write(verticesSize, VoidPtr(self.colorsData), colorsSize) self.vbo.release() vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao) if self.vao.isCreated(): # have VAO support, use it self.setupVertexAttribs() def setupVertexAttribs(self): self.vbo.bind() self.program.setAttributeBuffer(self.posAttr, GL.GL_FLOAT, 0, 2) self.program.setAttributeBuffer(self.colAttr, GL.GL_FLOAT, 4 * vertices.size, 3) self.program.enableAttributeArray(self.posAttr) self.program.enableAttributeArray(self.colAttr) self.vbo.release() def exposeEvent(self, event): if self.isExposed(): self.render() if self.timer is None: self.timer = QTimer(self) self.timer.timeout.connect(self.slotTimer) if not self.timer.isActive(): self.timer.start(10) else: if self.timer and self.timer.isActive(): self.timer.stop() def render(self): if not self.context.makeCurrent(self): raise Exception("makeCurrent() failed") functions = self.context.functions() if self.program is None: functions.glEnable(GL.GL_DEPTH_TEST) functions.glClearColor(0, 0, 0, 1) self.initGl() retinaScale = self.devicePixelRatio() functions.glViewport(0, 0, self.width() * retinaScale, self.height() * retinaScale) functions.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) self.program.bind() matrix = QMatrix4x4() matrix.perspective(60, 4 / 3, 0.1, 100) matrix.translate(0, 0, -2) matrix.rotate(self.angle, 0, 1, 0) self.program.setUniformValue(self.matrixUniform, matrix) if self.vao.isCreated(): self.vao.bind() else: # no VAO support, set the vertex attribute arrays now self.setupVertexAttribs() functions.glDrawArrays(GL.GL_TRIANGLES, 0, 3) self.vao.release() self.program.release() # swapInterval is 1 by default which means that swapBuffers() will (hopefully) block # and wait for vsync. self.context.swapBuffers(self) self.context.doneCurrent() def slotTimer(self): self.render() self.angle += 1 def glInfo(self): if not self.context.makeCurrent(self): raise Exception("makeCurrent() failed") functions = self.context.functions() text = """Vendor: {}\nRenderer: {}\nVersion: {}\nShading language: {} \nContext Format: {}\n\nSurface Format: {}""".format( functions.glGetString(GL.GL_VENDOR), functions.glGetString(GL.GL_RENDERER), functions.glGetString(GL.GL_VERSION), functions.glGetString(GL.GL_SHADING_LANGUAGE_VERSION), print_surface_format(self.context.format()), print_surface_format(self.format())) self.context.doneCurrent() return text class MainWindow(QWidget): def __init__(self): super(MainWindow, self).__init__() hBoxLayout = QHBoxLayout(self) self.plainTextEdit = QPlainTextEdit() self.plainTextEdit.setMinimumWidth(400) self.plainTextEdit.setReadOnly(True) hBoxLayout.addWidget(self.plainTextEdit) self.renderWindow = RenderWindow(QSurfaceFormat()) container = QWidget.createWindowContainer(self.renderWindow) container.setMinimumSize(QSize(400, 400)) hBoxLayout.addWidget(container) def updateDescription(self): text = "{}\n\nPython {}\n\n{}".format(QLibraryInfo.build(), sys.version, self.renderWindow.glInfo()) self.plainTextEdit.setPlainText(text) if __name__ == '__main__': parser = ArgumentParser(description="contextinfo", formatter_class=RawTextHelpFormatter) parser.add_argument('--gles', '-g', action='store_true', help='Use OpenGL ES') parser.add_argument('--software', '-s', action='store_true', help='Use Software OpenGL') parser.add_argument('--desktop', '-d', action='store_true', help='Use Desktop OpenGL') options = parser.parse_args() if options.gles: QCoreApplication.setAttribute(Qt.AA_UseOpenGLES) elif options.software: QCoreApplication.setAttribute(Qt.AA_UseSoftwareOpenGL) elif options.desktop: QCoreApplication.setAttribute(Qt.AA_UseDesktopOpenGL) app = QApplication(sys.argv) mainWindow = MainWindow() mainWindow.show() mainWindow.updateDescription() sys.exit(app.exec_()) examples/opengl/grabber.py000066400000000000000000000355151376617013100161540ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/legacy/grabber example from Qt v5.x""" import sys import math from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL try: from OpenGL.GL import * except ImportError: app = QtWidgets.QApplication(sys.argv) messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL grabber", "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 GLWidget(QtOpenGL.QGLWidget): xRotationChanged = QtCore.Signal(int) yRotationChanged = QtCore.Signal(int) zRotationChanged = QtCore.Signal(int) def __init__(self, parent=None): super(GLWidget, self).__init__(parent) self.gear1 = 0 self.gear2 = 0 self.gear3 = 0 self.xRot = 0 self.yRot = 0 self.zRot = 0 self.gear1Rot = 0 timer = QtCore.QTimer(self) timer.timeout.connect(self.advanceGears) timer.start(20) def freeResources(self): self.makeCurrent() glDeleteLists(self.gear1, 1) glDeleteLists(self.gear2, 1) glDeleteLists(self.gear3, 1) def setXRotation(self, angle): self.normalizeAngle(angle) if angle != self.xRot: self.xRot = angle self.xRotationChanged.emit(angle) self.updateGL() def setYRotation(self, angle): self.normalizeAngle(angle) if angle != self.yRot: self.yRot = angle self.yRotationChanged.emit(angle) self.updateGL() def setZRotation(self, angle): self.normalizeAngle(angle) if angle != self.zRot: self.zRot = angle self.zRotationChanged.emit(angle) self.updateGL() def initializeGL(self): lightPos = (5.0, 5.0, 10.0, 1.0) reflectance1 = (0.8, 0.1, 0.0, 1.0) reflectance2 = (0.0, 0.8, 0.2, 1.0) reflectance3 = (0.2, 0.2, 1.0, 1.0) glLightfv(GL_LIGHT0, GL_POSITION, lightPos) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) glEnable(GL_DEPTH_TEST) self.gear1 = self.makeGear(reflectance1, 1.0, 4.0, 1.0, 0.7, 20) self.gear2 = self.makeGear(reflectance2, 0.5, 2.0, 2.0, 0.7, 10) self.gear3 = self.makeGear(reflectance3, 1.3, 2.0, 0.5, 0.7, 10) glEnable(GL_NORMALIZE) glClearColor(0.0, 0.0, 0.0, 1.0) def paintGL(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glPushMatrix() glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0) glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0) glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0) self.drawGear(self.gear1, -3.0, -2.0, 0.0, self.gear1Rot / 16.0) self.drawGear(self.gear2, +3.1, -2.0, 0.0, -2.0 * (self.gear1Rot / 16.0) - 9.0) glRotated(+90.0, 1.0, 0.0, 0.0) self.drawGear(self.gear3, -3.1, -1.8, -2.2, +2.0 * (self.gear1Rot / 16.0) - 2.0) glPopMatrix() def resizeGL(self, width, height): side = min(width, height) if side < 0: return glViewport(int((width - side) / 2), int((height - side) / 2), side, side) glMatrixMode(GL_PROJECTION) glLoadIdentity() glFrustum(-1.0, +1.0, -1.0, 1.0, 5.0, 60.0) glMatrixMode(GL_MODELVIEW) glLoadIdentity() glTranslated(0.0, 0.0, -40.0) def mousePressEvent(self, event): self.lastPos = 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 = event.pos() def advanceGears(self): self.gear1Rot += 2 * 16 self.updateGL() def xRotation(self): return self.xRot def yRotation(self): return self.yRot def zRotation(self): return self.zRot def makeGear(self, reflectance, innerRadius, outerRadius, thickness, toothSize, toothCount): list = glGenLists(1) glNewList(list, GL_COMPILE) glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, reflectance) r0 = innerRadius r1 = outerRadius - toothSize / 2.0 r2 = outerRadius + toothSize / 2.0 delta = (2.0 * math.pi / toothCount) / 4.0 z = thickness / 2.0 glShadeModel(GL_FLAT) for i in range(2): if i == 0: sign = +1.0 else: sign = -1.0 glNormal3d(0.0, 0.0, sign) glBegin(GL_QUAD_STRIP) for j in range(toothCount+1): angle = 2.0 * math.pi * j / toothCount glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), sign * z) glVertex3d(r1 * math.cos(angle), r1 * math.sin(angle), sign * z) glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), sign * z) glVertex3d(r1 * math.cos(angle + 3 * delta), r1 * math.sin(angle + 3 * delta), sign * z) glEnd() glBegin(GL_QUADS) for j in range(toothCount): angle = 2.0 * math.pi * j / toothCount glVertex3d(r1 * math.cos(angle), r1 * math.sin(angle), sign * z) glVertex3d(r2 * math.cos(angle + delta), r2 * math.sin(angle + delta), sign * z) glVertex3d(r2 * math.cos(angle + 2 * delta), r2 * math.sin(angle + 2 * delta), sign * z) glVertex3d(r1 * math.cos(angle + 3 * delta), r1 * math.sin(angle + 3 * delta), sign * z) glEnd() glBegin(GL_QUAD_STRIP) for i in range(toothCount): for j in range(2): angle = 2.0 * math.pi * (i + (j / 2.0)) / toothCount s1 = r1 s2 = r2 if j == 1: s1, s2 = s2, s1 glNormal3d(math.cos(angle), math.sin(angle), 0.0) glVertex3d(s1 * math.cos(angle), s1 * math.sin(angle), +z) glVertex3d(s1 * math.cos(angle), s1 * math.sin(angle), -z) glNormal3d(s2 * math.sin(angle + delta) - s1 * math.sin(angle), s1 * math.cos(angle) - s2 * math.cos(angle + delta), 0.0) glVertex3d(s2 * math.cos(angle + delta), s2 * math.sin(angle + delta), +z) glVertex3d(s2 * math.cos(angle + delta), s2 * math.sin(angle + delta), -z) glVertex3d(r1, 0.0, +z) glVertex3d(r1, 0.0, -z) glEnd() glShadeModel(GL_SMOOTH) glBegin(GL_QUAD_STRIP) for i in range(toothCount+1): angle = i * 2.0 * math.pi / toothCount glNormal3d(-math.cos(angle), -math.sin(angle), 0.0) glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), +z) glVertex3d(r0 * math.cos(angle), r0 * math.sin(angle), -z) glEnd() glEndList() return list def drawGear(self, gear, dx, dy, dz, angle): glPushMatrix() glTranslated(dx, dy, dz) glRotated(angle, 0.0, 0.0, 1.0) glCallList(gear) glPopMatrix() def normalizeAngle(self, angle): while (angle < 0): angle += 360 * 16 while (angle > 360 * 16): angle -= 360 * 16 class MainWindow(QtWidgets.QMainWindow): def __init__(self): super(MainWindow, self).__init__() centralWidget = QtWidgets.QWidget() self.setCentralWidget(centralWidget) self.glWidget = GLWidget() self.pixmapLabel = QtWidgets.QLabel() self.glWidgetArea = QtWidgets.QScrollArea() self.glWidgetArea.setWidget(self.glWidget) self.glWidgetArea.setWidgetResizable(True) self.glWidgetArea.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.glWidgetArea.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.glWidgetArea.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) self.glWidgetArea.setMinimumSize(50, 50) self.pixmapLabelArea = QtWidgets.QScrollArea() self.pixmapLabelArea.setWidget(self.pixmapLabel) self.pixmapLabelArea.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) self.pixmapLabelArea.setMinimumSize(50, 50) xSlider = self.createSlider(self.glWidget.xRotationChanged, self.glWidget.setXRotation) ySlider = self.createSlider(self.glWidget.yRotationChanged, self.glWidget.setYRotation) zSlider = self.createSlider(self.glWidget.zRotationChanged, self.glWidget.setZRotation) self.createActions() self.createMenus() centralLayout = QtWidgets.QGridLayout() centralLayout.addWidget(self.glWidgetArea, 0, 0) centralLayout.addWidget(self.pixmapLabelArea, 0, 1) centralLayout.addWidget(xSlider, 1, 0, 1, 2) centralLayout.addWidget(ySlider, 2, 0, 1, 2) centralLayout.addWidget(zSlider, 3, 0, 1, 2) centralWidget.setLayout(centralLayout) xSlider.setValue(15 * 16) ySlider.setValue(345 * 16) zSlider.setValue(0 * 16) self.setWindowTitle("Grabber") self.resize(400, 300) def renderIntoPixmap(self): size = self.getSize() if size.isValid(): pixmap = self.glWidget.renderPixmap(size.width(), size.height()) self.setPixmap(pixmap) def grabFrameBuffer(self): image = self.glWidget.grabFrameBuffer() self.setPixmap(QtGui.QPixmap.fromImage(image)) def clearPixmap(self): self.setPixmap(QtGui.QPixmap()) def about(self): QtWidgets.QMessageBox.about(self, "About Grabber", "The Grabber example demonstrates two approaches for " "rendering OpenGL into a Qt pixmap.") def createActions(self): self.renderIntoPixmapAct = QtWidgets.QAction("&Render into Pixmap...", self, shortcut="Ctrl+R", triggered=self.renderIntoPixmap) self.grabFrameBufferAct = QtWidgets.QAction("&Grab Frame Buffer", self, shortcut="Ctrl+G", triggered=self.grabFrameBuffer) self.clearPixmapAct = QtWidgets.QAction("&Clear Pixmap", self, shortcut="Ctrl+L", triggered=self.clearPixmap) self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) self.aboutAct = QtWidgets.QAction("&About", self, triggered=self.about) self.aboutQtAct = QtWidgets.QAction("About &Qt", self, triggered=qApp.aboutQt) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.renderIntoPixmapAct) self.fileMenu.addAction(self.grabFrameBufferAct) self.fileMenu.addAction(self.clearPixmapAct) self.fileMenu.addSeparator() self.fileMenu.addAction(self.exitAct) self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createSlider(self, changedSignal, setterSlot): slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) slider.setRange(0, 360 * 16) slider.setSingleStep(16) slider.setPageStep(15 * 16) slider.setTickInterval(15 * 16) slider.setTickPosition(QtWidgets.QSlider.TicksRight) slider.valueChanged.connect(setterSlot) changedSignal.connect(slider.setValue) return slider def setPixmap(self, pixmap): self.pixmapLabel.setPixmap(pixmap) size = pixmap.size() if size - QtCore.QSize(1, 0) == self.pixmapLabelArea.maximumViewportSize(): size -= QtCore.QSize(1, 0) self.pixmapLabel.resize(size) def getSize(self): text, ok = QtWidgets.QInputDialog.getText(self, "Grabber", "Enter pixmap size:", QtWidgets.QLineEdit.Normal, "%d x %d" % (self.glWidget.width(), self.glWidget.height())) if not ok: return QtCore.QSize() regExp = QtCore.QRegularExpression("([0-9]+) *x *([0-9]+)") assert regExp.isValid() match = regExp.match(text) if match.hasMatch(): width = int(match.captured(1)) height = int(match.captured(2)) if width > 0 and width < 2048 and height > 0 and height < 2048: return QtCore.QSize(width, height) return self.glWidget.size() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() res = app.exec_() mainWin.glWidget.freeResources() sys.exit(res) examples/opengl/hellogl.py000066400000000000000000000227431376617013100161750ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/legacy/hellogl example from Qt v5.x""" import sys import math from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL 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("Hello GL")) 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(QtOpenGL.QGLWidget): xRotationChanged = QtCore.Signal(int) yRotationChanged = QtCore.Signal(int) zRotationChanged = QtCore.Signal(int) def __init__(self, parent=None): QtOpenGL.QGLWidget.__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.updateGL() def setYRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.yRot: self.yRot = angle self.emit(QtCore.SIGNAL("yRotationChanged(int)"), angle) self.updateGL() def setZRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.zRot: self.zRot = angle self.emit(QtCore.SIGNAL("zRotationChanged(int)"), angle) self.updateGL() def initializeGL(self): self.qglClearColor(self.trolltechPurple.darker()) 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): self.qglColor(self.trolltechGreen) 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): self.qglColor(self.trolltechGreen.darker(250 + int(100 * x1))) 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) examples/opengl/hellogl2.py000066400000000000000000000404141376617013100162520ustar00rootroot00000000000000 ############################################################################ ## ## Copyright (C) 2013 Riverbank Computing Limited. ## Copyright (C) 2018 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/hellogl2 example from Qt v5.x""" import sys import math import numpy import ctypes from PySide2.QtCore import QCoreApplication, Signal, SIGNAL, SLOT, Qt, QSize, QPoint from PySide2.QtGui import (QVector3D, QOpenGLFunctions, QOpenGLVertexArrayObject, QOpenGLBuffer, QOpenGLShaderProgram, QMatrix4x4, QOpenGLShader, QOpenGLContext, QSurfaceFormat) from PySide2.QtWidgets import (QApplication, QWidget, QMessageBox, QHBoxLayout, QSlider, QOpenGLWidget) from shiboken2 import VoidPtr try: from OpenGL import GL except ImportError: app = QApplication(sys.argv) messageBox = QMessageBox(QMessageBox.Critical, "OpenGL hellogl", "PyOpenGL must be installed to run this example.", QMessageBox.Close) messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate") messageBox.exec_() sys.exit(1) class Window(QWidget): def __init__(self, parent=None): QWidget.__init__(self, parent) self.glWidget = GLWidget() self.xSlider = self.createSlider(SIGNAL("xRotationChanged(int)"), self.glWidget.setXRotation) self.ySlider = self.createSlider(SIGNAL("yRotationChanged(int)"), self.glWidget.setYRotation) self.zSlider = self.createSlider(SIGNAL("zRotationChanged(int)"), self.glWidget.setZRotation) mainLayout = QHBoxLayout() mainLayout.addWidget(self.glWidget) mainLayout.addWidget(self.xSlider) mainLayout.addWidget(self.ySlider) mainLayout.addWidget(self.zSlider) self.setLayout(mainLayout) self.xSlider.setValue(15 * 16) self.ySlider.setValue(345 * 16) self.zSlider.setValue(0 * 16) self.setWindowTitle(self.tr("Hello GL")) def createSlider(self, changedSignal, setterSlot): slider = QSlider(Qt.Vertical) slider.setRange(0, 360 * 16) slider.setSingleStep(16) slider.setPageStep(15 * 16) slider.setTickInterval(15 * 16) slider.setTickPosition(QSlider.TicksRight) self.glWidget.connect(slider, SIGNAL("valueChanged(int)"), setterSlot) self.connect(self.glWidget, changedSignal, slider, SLOT("setValue(int)")) return slider def keyPressEvent(self, event): if event.key() == Qt.Key_Escape: self.close() else: super(Window, self).keyPressEvent(event) class Logo(): def __init__(self): self.m_count = 0 self.i = 0 self.m_data = numpy.empty(2500 * 6, dtype = ctypes.c_float) 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 = 100 for i in range(NumSectors): angle = (i * 2 * Pi) / NumSectors x5 = 0.30 * math.sin(angle) y5 = 0.30 * math.cos(angle) x6 = 0.20 * math.sin(angle) y6 = 0.20 * math.cos(angle) angle = ((i + 1) * 2 * Pi) / NumSectors x7 = 0.20 * math.sin(angle) y7 = 0.20 * math.cos(angle) x8 = 0.30 * math.sin(angle) y8 = 0.30 * math.cos(angle) self.quad(x5, y5, x6, y6, x7, y7, x8, y8) self.extrude(x6, y6, x7, y7) self.extrude(x8, y8, x5, y5) def constData(self): return self.m_data.tobytes() def count(self): return self.m_count def vertexCount(self): return self.m_count / 6 def quad(self, x1, y1, x2, y2, x3, y3, x4, y4): n = QVector3D.normal(QVector3D(x4 - x1, y4 - y1, 0), QVector3D(x2 - x1, y2 - y1, 0)) self.add(QVector3D(x1, y1, -0.05), n) self.add(QVector3D(x4, y4, -0.05), n) self.add(QVector3D(x2, y2, -0.05), n) self.add(QVector3D(x3, y3, -0.05), n) self.add(QVector3D(x2, y2, -0.05), n) self.add(QVector3D(x4, y4, -0.05), n) n = QVector3D.normal(QVector3D(x1 - x4, y1 - y4, 0), QVector3D(x2 - x4, y2 - y4, 0)) self.add(QVector3D(x4, y4, 0.05), n) self.add(QVector3D(x1, y1, 0.05), n) self.add(QVector3D(x2, y2, 0.05), n) self.add(QVector3D(x2, y2, 0.05), n) self.add(QVector3D(x3, y3, 0.05), n) self.add(QVector3D(x4, y4, 0.05), n) def extrude(self, x1, y1, x2, y2): n = QVector3D.normal(QVector3D(0, 0, -0.1), QVector3D(x2 - x1, y2 - y1, 0)) self.add(QVector3D(x1, y1, 0.05), n) self.add(QVector3D(x1, y1, -0.05), n) self.add(QVector3D(x2, y2, 0.05), n) self.add(QVector3D(x2, y2, -0.05), n) self.add(QVector3D(x2, y2, 0.05), n) self.add(QVector3D(x1, y1, -0.05), n) def add(self, v, n): self.m_data[self.i] = v.x() self.i += 1 self.m_data[self.i] = v.y() self.i += 1 self.m_data[self.i] = v.z() self.i += 1 self.m_data[self.i] = n.x() self.i += 1 self.m_data[self.i] = n.y() self.i += 1 self.m_data[self.i] = n.z() self.i += 1 self.m_count += 6 class GLWidget(QOpenGLWidget, QOpenGLFunctions): xRotationChanged = Signal(int) yRotationChanged = Signal(int) zRotationChanged = Signal(int) def __init__(self, parent=None): QOpenGLWidget.__init__(self, parent) QOpenGLFunctions.__init__(self) self.core = "--coreprofile" in QCoreApplication.arguments() self.xRot = 0 self.yRot = 0 self.zRot = 0 self.lastPos = 0 self.logo = Logo() self.vao = QOpenGLVertexArrayObject() self.logoVbo = QOpenGLBuffer() self.program = QOpenGLShaderProgram() self.projMatrixLoc = 0 self.mvMatrixLoc = 0 self.normalMatrixLoc = 0 self.lightPosLoc = 0 self.proj = QMatrix4x4() self.camera = QMatrix4x4() self.world = QMatrix4x4() self.transparent = "--transparent" in QCoreApplication.arguments() if self.transparent: fmt = self.format() fmt.setAlphaBufferSize(8) self.setFormat(fmt) def xRotation(self): return self.xRot def yRotation(self): return self.yRot def zRotation(self): return self.zRot def minimumSizeHint(self): return QSize(50, 50) def sizeHint(self): return QSize(400, 400) def normalizeAngle(self, angle): while angle < 0: angle += 360 * 16 while angle > 360 * 16: angle -= 360 * 16 return angle def setXRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.xRot: self.xRot = angle self.emit(SIGNAL("xRotationChanged(int)"), angle) self.update() def setYRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.yRot: self.yRot = angle self.emit(SIGNAL("yRotationChanged(int)"), angle) self.update() def setZRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.zRot: self.zRot = angle self.emit(SIGNAL("zRotationChanged(int)"), angle) self.update() def cleanup(self): self.makeCurrent() self.logoVbo.destroy() del self.program self.program = None self.doneCurrent() def vertexShaderSourceCore(self): return """#version 150 in vec4 vertex; in vec3 normal; out vec3 vert; out vec3 vertNormal; uniform mat4 projMatrix; uniform mat4 mvMatrix; uniform mat3 normalMatrix; void main() { vert = vertex.xyz; vertNormal = normalMatrix * normal; gl_Position = projMatrix * mvMatrix * vertex; }""" def fragmentShaderSourceCore(self): return """#version 150 in highp vec3 vert; in highp vec3 vertNormal; out highp vec4 fragColor; uniform highp vec3 lightPos; void main() { highp vec3 L = normalize(lightPos - vert); highp float NL = max(dot(normalize(vertNormal), L), 0.0); highp vec3 color = vec3(0.39, 1.0, 0.0); highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0); fragColor = vec4(col, 1.0); }""" def vertexShaderSource(self): return """attribute vec4 vertex; attribute vec3 normal; varying vec3 vert; varying vec3 vertNormal; uniform mat4 projMatrix; uniform mat4 mvMatrix; uniform mat3 normalMatrix; void main() { vert = vertex.xyz; vertNormal = normalMatrix * normal; gl_Position = projMatrix * mvMatrix * vertex; }""" def fragmentShaderSource(self): return """varying highp vec3 vert; varying highp vec3 vertNormal; uniform highp vec3 lightPos; void main() { highp vec3 L = normalize(lightPos - vert); highp float NL = max(dot(normalize(vertNormal), L), 0.0); highp vec3 color = vec3(0.39, 1.0, 0.0); highp vec3 col = clamp(color * 0.2 + color * 0.8 * NL, 0.0, 1.0); gl_FragColor = vec4(col, 1.0); }""" def initializeGL(self): self.context().aboutToBeDestroyed.connect(self.cleanup) self.initializeOpenGLFunctions() self.glClearColor(0, 0, 0, 1) self.program = QOpenGLShaderProgram() if self.core: self.vertexShader = self.vertexShaderSourceCore() self.fragmentShader = self.fragmentShaderSourceCore() else: self.vertexShader = self.vertexShaderSource() self.fragmentShader = self.fragmentShaderSource() self.program.addShaderFromSourceCode(QOpenGLShader.Vertex, self.vertexShader) self.program.addShaderFromSourceCode(QOpenGLShader.Fragment, self.fragmentShader) self.program.bindAttributeLocation("vertex", 0) self.program.bindAttributeLocation("normal", 1) self.program.link() self.program.bind() self.projMatrixLoc = self.program.uniformLocation("projMatrix") self.mvMatrixLoc = self.program.uniformLocation("mvMatrix") self.normalMatrixLoc = self.program.uniformLocation("normalMatrix") self.lightPosLoc = self.program.uniformLocation("lightPos") self.vao.create() vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao) self.logoVbo.create() self.logoVbo.bind() float_size = ctypes.sizeof(ctypes.c_float) self.logoVbo.allocate(self.logo.constData(), self.logo.count() * float_size) self.setupVertexAttribs() self.camera.setToIdentity() self.camera.translate(0, 0, -1) self.program.setUniformValue(self.lightPosLoc, QVector3D(0, 0, 70)) self.program.release() vaoBinder = None def setupVertexAttribs(self): self.logoVbo.bind() f = QOpenGLContext.currentContext().functions() f.glEnableVertexAttribArray(0) f.glEnableVertexAttribArray(1) float_size = ctypes.sizeof(ctypes.c_float) null = VoidPtr(0) pointer = VoidPtr(3 * float_size) f.glVertexAttribPointer(0, 3, int(GL.GL_FLOAT), int(GL.GL_FALSE), 6 * float_size, null) f.glVertexAttribPointer(1, 3, int(GL.GL_FLOAT), int(GL.GL_FALSE), 6 * float_size, pointer) self.logoVbo.release() def paintGL(self): self.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT) self.glEnable(GL.GL_DEPTH_TEST) self.glEnable(GL.GL_CULL_FACE) self.world.setToIdentity() self.world.rotate(180 - (self.xRot / 16), 1, 0, 0) self.world.rotate(self.yRot / 16, 0, 1, 0) self.world.rotate(self.zRot / 16, 0, 0, 1) vaoBinder = QOpenGLVertexArrayObject.Binder(self.vao) self.program.bind() self.program.setUniformValue(self.projMatrixLoc, self.proj) self.program.setUniformValue(self.mvMatrixLoc, self.camera * self.world) normalMatrix = self.world.normalMatrix() self.program.setUniformValue(self.normalMatrixLoc, normalMatrix) self.glDrawArrays(GL.GL_TRIANGLES, 0, self.logo.vertexCount()) self.program.release() vaoBinder = None def resizeGL(self, width, height): self.proj.setToIdentity() self.proj.perspective(45, width / height, 0.01, 100) def mousePressEvent(self, event): self.lastPos = QPoint(event.pos()) def mouseMoveEvent(self, event): dx = event.x() - self.lastPos.x() dy = event.y() - self.lastPos.y() if event.buttons() & Qt.LeftButton: self.setXRotation(self.xRot + 8 * dy) self.setYRotation(self.yRot + 8 * dx) elif event.buttons() & Qt.RightButton: self.setXRotation(self.xRot + 8 * dy) self.setZRotation(self.zRot + 8 * dx) self.lastPos = QPoint(event.pos()) if __name__ == '__main__': app = QApplication(sys.argv) fmt = QSurfaceFormat() fmt.setDepthBufferSize(24) if "--multisample" in QCoreApplication.arguments(): fmt.setSamples(4) if "--coreprofile" in QCoreApplication.arguments(): fmt.setVersion(3, 2) fmt.setProfile(QSurfaceFormat.CoreProfile) QSurfaceFormat.setDefaultFormat(fmt) mainWindow = Window() if "--transparent" in QCoreApplication.arguments(): mainWindow.setAttribute(Qt.WA_TranslucentBackground) mainWindow.setAttribute(Qt.WA_NoSystemBackground, False) mainWindow.resize(mainWindow.sizeHint()) mainWindow.show() res = app.exec_() sys.exit(res) examples/opengl/opengl.pyproject000066400000000000000000000002431376617013100174110ustar00rootroot00000000000000{ "files": ["grabber.py", "samplebuffers.py", "hellogl.py", "hellogl2.py", "contextinfo.py", "2dpainting.py", "overpainting.py"] } examples/opengl/overpainting.py000066400000000000000000000321741376617013100172530ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/legacy/overpainting example from Qt v5.x""" import sys import math, random from PySide2.QtCore import * from PySide2.QtGui import * from PySide2.QtWidgets import * from PySide2.QtOpenGL import * try: from OpenGL.GL import * except ImportError: app = QApplication(sys.argv) messageBox = QMessageBox(QMessageBox.Critical, "OpenGL overpainting", "PyOpenGL must be installed to run this example.", QMessageBox.Close) messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate") messageBox.exec_() sys.exit(1) class Bubble: def __init__(self, position, radius, velocity): self.position = position self.vel = velocity self.radius = radius self.innerColor = self.randomColor() self.outerColor = self.randomColor() self.updateBrush() def updateBrush(self): gradient = QRadialGradient(QPointF(self.radius, self.radius), self.radius, QPointF(self.radius*0.5, self.radius*0.5)) gradient.setColorAt(0, QColor(255, 255, 255, 255)) gradient.setColorAt(0.25, self.innerColor) gradient.setColorAt(1, self.outerColor) self.brush = QBrush(gradient) def drawBubble(self, painter): painter.save() painter.translate(self.position.x() - self.radius, self.position.y() - self.radius) painter.setBrush(self.brush) painter.drawEllipse(0, 0, int(2*self.radius), int(2*self.radius)) painter.restore() def randomColor(self): red = random.randrange(205, 256) green = random.randrange(205, 256) blue = random.randrange(205, 256) alpha = random.randrange(91, 192) return QColor(red, green, blue, alpha) def move(self, bbox): self.position += self.vel leftOverflow = self.position.x() - self.radius - bbox.left() rightOverflow = self.position.x() + self.radius - bbox.right() topOverflow = self.position.y() - self.radius - bbox.top() bottomOverflow = self.position.y() + self.radius - bbox.bottom() if leftOverflow < 0.0: self.position.setX(self.position.x() - 2 * leftOverflow) self.vel.setX(-self.vel.x()) elif rightOverflow > 0.0: self.position.setX(self.position.x() - 2 * rightOverflow) self.vel.setX(-self.vel.x()) if topOverflow < 0.0: self.position.setY(self.position.y() - 2 * topOverflow) self.vel.setY(-self.vel.y()) elif bottomOverflow > 0.0: self.position.setY(self.position.y() - 2 * bottomOverflow) self.vel.setY(-self.vel.y()) def rect(self): return QRectF(self.position.x() - self.radius, self.position.y() - self.radius, 2 * self.radius, 2 * self.radius) class GLWidget(QGLWidget): def __init__(self, parent = None): QGLWidget.__init__(self, QGLFormat(QGL.SampleBuffers), parent) midnight = QTime(0, 0, 0) random.seed(midnight.secsTo(QTime.currentTime())) self.object = 0 self.xRot = 0 self.yRot = 0 self.zRot = 0 self.image = QImage() self.bubbles = [] self.lastPos = QPoint() self.trolltechGreen = QColor.fromCmykF(0.40, 0.0, 1.0, 0.0) self.trolltechPurple = QColor.fromCmykF(0.39, 0.39, 0.0, 0.0) self.animationTimer = QTimer() self.animationTimer.setSingleShot(False) self.connect(self.animationTimer, SIGNAL("timeout()"), self.animate) self.animationTimer.start(25) self.setAttribute(Qt.WA_NoSystemBackground) self.setMinimumSize(200, 200) self.setWindowTitle(self.tr("Overpainting a Scene")) def freeResources(self): self.makeCurrent() glDeleteLists(self.object, 1) def setXRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.xRot: self.xRot = angle self.emit(SIGNAL("xRotationChanged(int)"), angle) def setYRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.yRot: self.yRot = angle self.emit(SIGNAL("yRotationChanged(int)"), angle) def setZRotation(self, angle): angle = self.normalizeAngle(angle) if angle != self.zRot: self.zRot = angle self.emit(SIGNAL("zRotationChanged(int)"), angle) def initializeGL(self): self.object = self.makeObject() def mousePressEvent(self, event): self.lastPos = QPoint(event.pos()) def mouseMoveEvent(self, event): dx = event.x() - self.lastPos.x() dy = event.y() - self.lastPos.y() if event.buttons() & Qt.LeftButton: self.setXRotation(self.xRot + 8 * dy) self.setYRotation(self.yRot + 8 * dx) elif event.buttons() & Qt.RightButton: self.setXRotation(self.xRot + 8 * dy) self.setZRotation(self.zRot + 8 * dx) self.lastPos = QPoint(event.pos()) def paintEvent(self, event): painter = QPainter() painter.begin(self) painter.setRenderHint(QPainter.Antialiasing) glPushAttrib(GL_ALL_ATTRIB_BITS) glMatrixMode(GL_PROJECTION) glPushMatrix() glMatrixMode(GL_MODELVIEW) glPushMatrix() self.qglClearColor(self.trolltechPurple.darker()) glShadeModel(GL_SMOOTH) glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glEnable(GL_LIGHTING) glEnable(GL_LIGHT0) lightPosition = ( 0.5, 5.0, 7.0, 1.0 ) glLightfv(GL_LIGHT0, GL_POSITION, lightPosition) self.resizeGL(self.width(), self.height()) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() glTranslated(0.0, 0.0, -10.0) glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0) glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0) glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0) glCallList(self.object) glPopAttrib() glMatrixMode(GL_MODELVIEW) glPopMatrix() glMatrixMode(GL_PROJECTION) glPopMatrix() glDisable(GL_CULL_FACE) ### not required if begin() also does it for bubble in self.bubbles: if bubble.rect().intersects(QRectF(event.rect())): bubble.drawBubble(painter) painter.drawImage((self.width() - self.image.width())/2, 0, self.image) painter.end() def resizeGL(self, width, height): side = min(width, height) glViewport(int((width - side) / 2), int((height - side) / 2), side, side) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0) glMatrixMode(GL_MODELVIEW) self.formatInstructions(width, height) def showEvent(self, event): self.createBubbles(20 - len(self.bubbles)) def sizeHint(self): return QSize(400, 400) def makeObject(self): list = glGenLists(1) glNewList(list, GL_COMPILE) glEnable(GL_NORMALIZE) glBegin(GL_QUADS) logoDiffuseColor = (self.trolltechGreen.red()/255.0, self.trolltechGreen.green()/255.0, self.trolltechGreen.blue()/255.0, 1.0) glMaterialfv(GL_FRONT, GL_DIFFUSE, logoDiffuseColor) 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) NumSectors = 200 for i in range(NumSectors): angle1 = (i * 2 * math.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 * math.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) glEnd() glEndList() return list def quad(self, x1, y1, x2, y2, x3, y3, x4, y4): glNormal3d(0.0, 0.0, -1.0) glVertex3d(x1, y1, -0.05) glVertex3d(x2, y2, -0.05) glVertex3d(x3, y3, -0.05) glVertex3d(x4, y4, -0.05) glNormal3d(0.0, 0.0, 1.0) glVertex3d(x4, y4, +0.05) glVertex3d(x3, y3, +0.05) glVertex3d(x2, y2, +0.05) glVertex3d(x1, y1, +0.05) def extrude(self, x1, y1, x2, y2): self.qglColor(self.trolltechGreen.darker(250 + int(100 * x1))) glNormal3d((x1 + x2)/2.0, (y1 + y2)/2.0, 0.0) glVertex3d(x1, y1, +0.05) glVertex3d(x2, y2, +0.05) glVertex3d(x2, y2, -0.05) 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 createBubbles(self, number): for i in range(number): position = QPointF(self.width()*(0.1 + 0.8*random.random()), self.height()*(0.1 + 0.8*random.random())) radius = min(self.width(), self.height())*(0.0125 + 0.0875*random.random()) velocity = QPointF(self.width()*0.0125*(-0.5 + random.random()), self.height()*0.0125*(-0.5 + random.random())) self.bubbles.append(Bubble(position, radius, velocity)) def animate(self): for bubble in self.bubbles: self.update(bubble.rect().toRect()) bubble.move(self.rect()) self.update(bubble.rect().toRect()) def formatInstructions(self, width, height): text = self.tr("Click and drag with the left mouse button " "to rotate the Qt logo.") metrics = QFontMetrics(self.font()) border = max(4, metrics.leading()) rect = metrics.boundingRect(0, 0, width - 2*border, int(height*0.125), Qt.AlignCenter | Qt.TextWordWrap, text) self.image = QImage(width, rect.height() + 2*border, QImage.Format_ARGB32_Premultiplied) self.image.fill(qRgba(0, 0, 0, 127)) painter = QPainter() painter.begin(self.image) painter.setRenderHint(QPainter.TextAntialiasing) painter.setPen(Qt.white) painter.drawText((width - rect.width())/2, border, rect.width(), rect.height(), Qt.AlignCenter | Qt.TextWordWrap, text) painter.end() if __name__ == '__main__': app = QApplication(sys.argv) window = GLWidget() window.show() res = app.exec_() window.freeResources() sys.exit(res) examples/opengl/samplebuffers.py000066400000000000000000000146501376617013100174030ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/legacy/samplebuffers example from Qt v5.x""" import sys import math from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL try: from OpenGL import GL except ImportError: app = QtWidgets.QApplication(sys.argv) messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL samplebuffers", "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 GLWidget(QtOpenGL.QGLWidget): GL_MULTISAMPLE = 0x809D rot = 0.0 def __init__(self, parent=None): QtOpenGL.QGLWidget.__init__(self, QtOpenGL.QGLFormat(QtOpenGL.QGL.SampleBuffers), parent) self.list_ = [] self.startTimer(40) self.setWindowTitle(self.tr("Sample Buffers")) def initializeGL(self): GL.glMatrixMode(GL.GL_PROJECTION) GL.glLoadIdentity() GL.glOrtho( -.5, .5, .5, -.5, -1000, 1000) GL.glMatrixMode(GL.GL_MODELVIEW) GL.glLoadIdentity() GL.glClearColor(1.0, 1.0, 1.0, 1.0) self.makeObject() def resizeGL(self, w, h): GL.glViewport(0, 0, w, h) def paintGL(self): GL.glClear(GL.GL_COLOR_BUFFER_BIT) GL.glMatrixMode(GL.GL_MODELVIEW) GL.glPushMatrix() GL.glEnable(GLWidget.GL_MULTISAMPLE) GL.glTranslatef( -0.25, -0.10, 0.0) GL.glScalef(0.75, 1.15, 0.0) GL.glRotatef(GLWidget.rot, 0.0, 0.0, 1.0) GL.glCallList(self.list_) GL.glPopMatrix() GL.glPushMatrix() GL.glDisable(GLWidget.GL_MULTISAMPLE) GL.glTranslatef(0.25, -0.10, 0.0) GL.glScalef(0.75, 1.15, 0.0) GL.glRotatef(GLWidget.rot, 0.0, 0.0, 1.0) GL.glCallList(self.list_) GL.glPopMatrix() GLWidget.rot += 0.2 self.qglColor(QtCore.Qt.black) self.renderText(-0.35, 0.4, 0.0, "Multisampling enabled") self.renderText(0.15, 0.4, 0.0, "Multisampling disabled") def timerEvent(self, event): self.update() def makeObject(self): trolltechGreen = QtGui.QColor.fromCmykF(0.40, 0.0, 1.0, 0.0) Pi = 3.14159265358979323846 NumSectors = 15 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.list_ = GL.glGenLists(1) GL.glNewList(self.list_, GL.GL_COMPILE) for i in range(NumSectors): angle1 = float((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 = float(((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.qglColor(trolltechGreen) self.quad(GL.GL_QUADS, x5, y5, x6, y6, x7, y7, x8, y8) self.qglColor(QtCore.Qt.black) self.quad(GL.GL_LINE_LOOP, x5, y5, x6, y6, x7, y7, x8, y8) self.qglColor(trolltechGreen) self.quad(GL.GL_QUADS, x1, y1, x2, y2, y2, x2, y1, x1) self.quad(GL.GL_QUADS, x3, y3, x4, y4, y4, x4, y3, x3) self.qglColor(QtCore.Qt.black) self.quad(GL.GL_LINE_LOOP, x1, y1, x2, y2, y2, x2, y1, x1) self.quad(GL.GL_LINE_LOOP, x3, y3, x4, y4, y4, x4, y3, x3) GL.glEndList() def quad(self, primitive, x1, y1, x2, y2, x3, y3, x4, y4): GL.glBegin(primitive) GL.glVertex2d(x1, y1) GL.glVertex2d(x2, y2) GL.glVertex2d(x3, y3) GL.glVertex2d(x4, y4) GL.glEnd() def freeResources(self): self.makeCurrent() GL.glDeleteLists(self.list_, 1) if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) if not QtOpenGL.QGLFormat.hasOpenGL(): QMessageBox.information(0, "OpenGL pbuffers", "This system does not support OpenGL.", QMessageBox.Ok) sys.exit(1) f = QtOpenGL.QGLFormat.defaultFormat() f.setSampleBuffers(True) QtOpenGL.QGLFormat.setDefaultFormat(f) widget = GLWidget() widget.resize(640, 480) widget.show() res = app.exec_() widget.freeResources() sys.exit(res) examples/opengl/textures/000077500000000000000000000000001376617013100160505ustar00rootroot00000000000000examples/opengl/textures/images/000077500000000000000000000000001376617013100173155ustar00rootroot00000000000000examples/opengl/textures/images/side1.png000066400000000000000000000020241376617013100210260ustar00rootroot00000000000000PNG  IHDRkXTPLTE| (0088@HPPXX`hhppxxĈȐȘ̘РԨ԰ذظܸ5up pHYsHHFk>IDATxas@##il bbmђr)8r~ΰ3]̝0ZE y^w5h ;KҼ H[zn#o_*P̫**`£H[51(Cϲ[ vudqU,o; `~$e,l=fmՑ\w8嗋4|.,'diӄ*Q̮2/J ;_$*\<^TS/-_: Pݴ6xl2 r&* )?^|Z\HkYڂɏ Tϻ{7 wJgS t˚R XYGߚSK<&IV6%IDATxaw8`Ba`vtuQ*2Pbo;=g$7w}*&:4W>&U(]10JiVqu, PվpYC{W P$]7paR16nogPD#:ݝu2?8 3,kc$':2C6lC-O@qS<߈Y0TZyP8`殇 v|ãC? PUO_ؿM@Kߔvִ<>{ I])5mhL4 9}3cH>C\|dW (Ff/^Gl8itVdǖﮧidl~}QooZ 冯TpoD^]*C{ oc^ؐHWiȩ|m% H|Lc?C bDVWs8=>rdf;e/ d.*3`o8>7tސUl&ƌWMXMYh pGdJQIDATxiCLP(-Rx娂"E d釾r&f6#G1;3+@̇@@@ p&@.}@@@@@@@@@@@@@@@@@@@ Zg/tR))-V[}E=,,JZg3ꮖMLUo_%ɫҷXv8s,a+N^~ɢx2Pʴ &qÒ-S&PMq/gL8};p[Jz9 ("[>wOǿ6 zkP~h|uC\ s=W3/M,?=?bq]<=,. bpl< PN qzLl @`d4B(Ib[d" F+{SnfMI sˤV-~C[󗮃o!v\Q SZN߅QlW5P2xUvjSSuX̕A^4Jol} `H\p౎FwFOEa2W5m9)SeѸfq[q\** yL%#-8&2p{E/IJ;+IPX+-t'O9'NP\8GE HRvɓF3<ڥ}>p=@=`\={9H`F( !2n @x,}i5V=U?˝Q̋,=+Y[0I쇱S;`qnvcE4H$6h $ۻZD JQ\[KZvc p[j߆4*zC`D(eLtZd6K8[ 1~ظs%4nQ// Ϣ pyMȼ®Qغr3 0cTe*XТ oWy\M̊Iwch3]5cCb{m5,A1J )prř=&U)8hŁu~;/дb 8[:LCAcP5Bִ21,ljӠrg@`1y6^X\9mxvvѯ[8,@NjBvۍM`6оx,`h~`hGS+X} aX/)\`oޛ&Qrq4roL/2.[5*JbVcF][)Js$Kχݫb>LȒ %Ri?YG(g@q@A@Gh|IENDB`examples/opengl/textures/images/side4.png000066400000000000000000000024761376617013100210440ustar00rootroot00000000000000PNG  IHDRkXTPLTE| ((0088@@HPPXX`hhppxΙw pHYsHHFk>?IDATxv@ 4b($SĈyG %s>@A3p@@".} @ @ @ @|8tsι @͇!.@cc<2>9e<TQ>S p`2 Pc 9l `2 t p2 P~T^*P L꾷 7?x+sK(:{XTx8usDPg`E&?wK<uH@Ձ9 @hCOkP!h(p >; + υ1T;8B @AP6VS N  P @SPDj8ܝ!8=~p?UD,)P16@if14>}@ `l@TFA1.6,`l`lBcUah 6 F.cM} _䭯c;ڿLZv)] 4P5pUE)"*du  86o~78Ps5CSpO!h>`by/ yoz^`uځ r0"pC@[^Rt-:@ 1:@p @ @X ;\h()VvO?6r }<@Cgmia44^еhX7ve*`~i d$*Z*"&v`gLFk1h?]'P*'% @(E @ @ @ *"p@zLgpv IENDB`examples/opengl/textures/images/side5.png000066400000000000000000000036471376617013100210460ustar00rootroot00000000000000PNG  IHDRkXTPLTEx (008@@HPPX``hppx* pHYsHHFk>IDATxb8`KB!f&@!m63hfv@@@஫C|Iv\7;aQuenIP,50M;y1/GrfH|4@&9@h%(ߔ5X<j0Z0@!L KzLŐ0e l(%? `pPQuPuX6"M~TP&yHV{Q-PA6AFqiEq*˲<,<ҧcQ{mU44ga/ߵ(@y\l?ୱ2~kry'܂<٬p~5q$dʙn-#Y'=@ߟfEo:k `)Khy[S7 Ѝ MLZ5 0T60:b՟ub'B}?ڔ<)%I|e_3 Ti\=-QjI@*4<1jd@p W|*WPaKZ*p֘(v\#0|^]&+!2CAdW͈x{fpZ'+@*x0 žej4I0&wC {}v`WU2\cx(d&hVC0g?\vp5d/?g^k\N-`g s~){ ~v<O~y~>S ."&$vaozt?VeP |~IM,4q&PTx`!EACiF2C*qx?+ T90 pHYsHHFk>DIDATxk[H@RTJa-V\``I7s0ɜy7 O  e`B@`iNOΣa绛Q234/sD3%O䀮iy`3B2w1x=טEw,;iF{[Hhhs%J#v6_7ZNY|fЯ3jX?`hDӕR_u{7)ߩD~>A@g $I?0%"}N7`Nл s !{]^Ht&BL'TNh^rFI]pK ?@*9 x"x!`KVc 2i?#ڤ`2EZP":}epF`XFx_0tp b0q^S#190`HF L(MR&T)Q+ VHU cZ+J}?iTD+Wh-h [(+bn|M:vN2'$5F0BGuq qֶV} 5nal!PR8φ04ejF.cq"$iSsB߶-t @ z%[o\ѳkoh{C>s(F79C_v͒3`MޫOc,?KߛO~&qpُ׵=n-=!qVU-"9^zu8$_1x/%*|\9;Et*6;\~S:6)slƶi g||ǮPp,wpG>VLV;BU7s|=]dvXO;",Eh@6GfXe 3BujR?Я0bǵ|cyQC"0>쓆=vHm>񋅷NUH`t]DWs|Gf`H :teW<,:=%c&l If\b.xDliڑ3"6VWгjwqIZnUv(?P (c}s"a;Ҡ/˪"CuV:1ICŻx& N:8'[GлqRH2b|=:@nhI D魧FC@opp=$k ז>j٪F^H9f}rf} w4)Q7ѥhZ@LjPJ>h`lO͉弐vd4~|D?+~>7ȋg hS3w8GQX)6E(̳I ӊi0Hy ko+^3[濬`+! ƥV\d?~v`u+L`r q/KHHY}4+SR^@`ڹzvvo\&ر<ΪiQ@`*i ~NkԥuQ3IENDB`examples/opengl/textures/textures.py000066400000000000000000000177671376617013100203270ustar00rootroot00000000000000 ############################################################################ ## ## 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 opengl/textures example from Qt v5.x""" import sys from PySide2 import QtCore, QtGui, QtWidgets, QtOpenGL try: from OpenGL.GL import * except ImportError: app = QtWidgets.QApplication(sys.argv) messageBox = QtWidgets.QMessageBox(QtWidgets.QMessageBox.Critical, "OpenGL textures", "PyOpenGL must be installed to run this example.", QtWidgets.QMessageBox.Close) messageBox.setDetailedText("Run:\npip install PyOpenGL PyOpenGL_accelerate") messageBox.exec_() sys.exit(1) import textures_rc class GLWidget(QtOpenGL.QGLWidget): sharedObject = 0 refCount = 0 coords = ( ( ( +1, -1, -1 ), ( -1, -1, -1 ), ( -1, +1, -1 ), ( +1, +1, -1 ) ), ( ( +1, +1, -1 ), ( -1, +1, -1 ), ( -1, +1, +1 ), ( +1, +1, +1 ) ), ( ( +1, -1, +1 ), ( +1, -1, -1 ), ( +1, +1, -1 ), ( +1, +1, +1 ) ), ( ( -1, -1, -1 ), ( -1, -1, +1 ), ( -1, +1, +1 ), ( -1, +1, -1 ) ), ( ( +1, -1, +1 ), ( -1, -1, +1 ), ( -1, -1, -1 ), ( +1, -1, -1 ) ), ( ( -1, -1, +1 ), ( +1, -1, +1 ), ( +1, +1, +1 ), ( -1, +1, +1 ) ) ) clicked = QtCore.Signal() def __init__(self, parent, shareWidget): QtOpenGL.QGLWidget.__init__(self, parent, shareWidget) self.clearColor = QtCore.Qt.black self.xRot = 0 self.yRot = 0 self.zRot = 0 self.clearColor = QtGui.QColor() self.lastPos = QtCore.QPoint() def freeGLResources(self): GLWidget.refCount -= 1 if GLWidget.refCount == 0: self.makeCurrent() glDeleteLists(self.__class__.sharedObject, 1) def minimumSizeHint(self): return QtCore.QSize(50, 50) def sizeHint(self): return QtCore.QSize(200, 200) def rotateBy(self, xAngle, yAngle, zAngle): self.xRot = (self.xRot + xAngle) % 5760 self.yRot = (self.yRot + yAngle) % 5760 self.zRot = (self.zRot + zAngle) % 5760 self.updateGL() def setClearColor(self, color): self.clearColor = color self.updateGL() def initializeGL(self): if not GLWidget.sharedObject: self.textures = [] for i in range(6): self.textures.append(self.bindTexture(QtGui.QPixmap(":/images/side%d.png" % (i + 1)))) GLWidget.sharedObject = self.makeObject() GLWidget.refCount += 1 glEnable(GL_DEPTH_TEST) glEnable(GL_CULL_FACE) glEnable(GL_TEXTURE_2D) def paintGL(self): self.qglClearColor(self.clearColor) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() glTranslated(0.0, 0.0, -10.0) glRotated(self.xRot / 16.0, 1.0, 0.0, 0.0) glRotated(self.yRot / 16.0, 0.0, 1.0, 0.0) glRotated(self.zRot / 16.0, 0.0, 0.0, 1.0) glCallList(GLWidget.sharedObject) def resizeGL(self, width, height): side = min(width, height) glViewport(int((width - side) / 2), int((height - side) / 2), side, side) glMatrixMode(GL_PROJECTION) glLoadIdentity() glOrtho(-0.5, +0.5, +0.5, -0.5, 4.0, 15.0) glMatrixMode(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.rotateBy(8 * dy, 8 * dx, 0) elif event.buttons() & QtCore.Qt.RightButton: self.rotateBy(8 * dy, 0, 8 * dx) self.lastPos = QtCore.QPoint(event.pos()) def mouseReleaseEvent(self, event): self.clicked.emit() def makeObject(self): dlist = glGenLists(1) glNewList(dlist, GL_COMPILE) for i in range(6): glBindTexture(GL_TEXTURE_2D, self.textures[i]) glBegin(GL_QUADS) for j in range(4): tx = {False: 0, True: 1}[j == 0 or j == 3] ty = {False: 0, True: 1}[j == 0 or j == 1] glTexCoord2d(tx, ty) glVertex3d(0.2 * GLWidget.coords[i][j][0], 0.2 * GLWidget.coords[i][j][1], 0.2 * GLWidget.coords[i][j][2]) glEnd() glEndList() return dlist class Window(QtWidgets.QWidget): NumRows = 2 NumColumns = 3 def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) mainLayout = QtWidgets.QGridLayout() self.glWidgets = [] for i in range(Window.NumRows): self.glWidgets.append([]) for j in range(Window.NumColumns): self.glWidgets[i].append(None) for i in range(Window.NumRows): for j in range(Window.NumColumns): clearColor = QtGui.QColor() clearColor.setHsv(((i * Window.NumColumns) + j) * 255 / (Window.NumRows * Window.NumColumns - 1), 255, 63) self.glWidgets[i][j] = GLWidget(self, self.glWidgets[0][0]) self.glWidgets[i][j].setClearColor(clearColor) self.glWidgets[i][j].rotateBy(+42 * 16, +42 * 16, -21 * 16) mainLayout.addWidget(self.glWidgets[i][j], i, j) self.glWidgets[i][j].clicked.connect(self.setCurrentGlWidget) qApp.lastWindowClosed.connect(self.glWidgets[i][j].freeGLResources) self.setLayout(mainLayout) self.currentGlWidget = self.glWidgets[0][0] timer = QtCore.QTimer(self) timer.timeout.connect(self.rotateOneStep) timer.start(20) self.setWindowTitle(self.tr("Textures")) def setCurrentGlWidget(self): self.currentGlWidget = self.sender() def rotateOneStep(self): if self.currentGlWidget: self.currentGlWidget.rotateBy(+2 * 16, +2 * 16, -1 * 16) if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) examples/opengl/textures/textures.pyproject000066400000000000000000000001031376617013100216660ustar00rootroot00000000000000{ "files": ["textures.qrc", "textures_rc.py", "textures.py"] } examples/opengl/textures/textures.qrc000066400000000000000000000004161376617013100204430ustar00rootroot00000000000000 images/side1.png images/side2.png images/side3.png images/side4.png images/side5.png images/side6.png examples/opengl/textures/textures_rc.py000066400000000000000000001107231376617013100207750ustar00rootroot00000000000000# 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\x14\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00k\xacXT\ \x00\x00\x00\x9fPLTE\xf8|\x00\xf8\x80\x00\xf8\x80\ \x08\xf8\x84\x08\xf8\x84\x10\xf8\x88\x10\xf8\x88\x18\xf8\x8c\x18\ \xf8\x8c \xf8\x90 \xf8\x94(\xf8\x940\xf8\x980\xf8\ \x988\xf8\x9c8\xf8\xa0@\xf8\xa4H\xf8\xa4P\xf8\xa8\ P\xf8\xa8X\xf8\xacX\xf8\xb0`\xf8\xb0h\xf8\xb4h\ \xf8\xb4p\xf8\xb8p\xf8\xb8x\xf8\xbcx\xf8\xc0\x80\xf8\ \xc4\x88\xf8\xc8\x90\xf8\xc8\x98\xf8\xcc\x98\xf8\xd0\xa0\xf8\xd4\ \xa8\xf8\xd4\xb0\xf8\xd8\xb0\xf8\xd8\xb8\xf8\xdc\xb8\xf8\xe0\xc0\ \xf8\xe0\xc8\xf8\xe4\xc8\xf8\xe4\xd0\xf8\xe8\xd0\xf8\xec\xd8\xf8\ \xec\xe0\xf8\xf0\xe0\xf8\xf0\xe8\xf8\xf4\xe8\xf8\xf4\xf0\xf8\xf8\ \xf0\xf8\xf8\xf8\xf8\xfc\xf85u\xa4p\x00\x00\x00\x09p\ HYs\x00\x00\x00H\x00\x00\x00H\x00F\xc9k>\ \x00\x00\x03\x1bIDATx\xda\xed\xddas\xd2@\ \x10\x80\xe1\x8b\x10#\x1a\x01#il\x0b\xb1\x80\x0db\ \x10b\xe8\xff\xffm\xb6\xd5\xd1\x92\x12r)8r\xbb\ \xef~\xce\xb0\xec3\xc9]\xb8\xd9\x1d\xcc\x9d\xf20\x00\ \x00\x00\x00\x00\x00\xdc\x19\x85\x01\x00\x00\x00\xec\x02\xa8Z\ \xfa\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\x00\x80\xff\x18E\xae\x1a \x1by\ \x91^\x80\xf5\xb8w\xff5\xdeh\x05\x98\x0d\xbd\xa7\xbd\ ;\xca\x00\xf2K\xbf\xd2\xbc\xa4\x09\xa0H\xc3\xe7\xdd[\ z\x00n#o_\xfb\x9a\x12\x80\xfc*\xa8\xe9\xdf\xd3\ \x00P\xb9\xf5\xb5\x01\xcc\xab\xb7\xbe*\x80\xaf\x89\xdf\xd0\ \xc2*\x19`\xf5\xf8\xc2\xa3\x15\xa0H\xdf[51\xcb\ \x04(\xa7C\xcf\xb2\x8b[ \xc0v\x1eu\xec\xdb\xd8\ \xc5\x01dq\xb7U\x1f\xbf,\x80\xec\xc2o;\xc8 \ \x08`\x91\xbc~\xc1$\x87\x14\x80\xace\xf5\xb2\x00\xb2\ \xd8\x7f\xf1,\x8f\xf3\x00\xe5l\xd4=f\x98\xc9m\x80\ \xcd\xcd\xf0\xd5\x91\xd3\x5c\x0e\x03\xe4\xe3\xbew\xfc8\x9b\ \xa3\x00\xe5\x97\x8b\xe04\xf3|.\x02,'\x03\xefd\ \x03\x8d\xae\x01\xe4i\xe4\x9b\xd3\x84\x83\x00\xab\x0f\xa7*\ \xdeQ\x80\xcc\xae2/J\x02\x99\x00\x0b\x9b\xf2;\x97\ \xeb\xfb\xd3\x00_$\xc0\xb2\xb9*\x7f\x5c<^\x9a\x88\ \x04\xf8\xdeTS/-\x7f_:\x15\x09P\x1e\xae\xe8\ \xdd\xb4\xd5\xcd\xe2\xe26x\xe8\xc9\x1e\xdc\xeel\x182\ \x01\xfa\xf5\x0b\xff\xb2r&*\x13 \xae)?^\xb5\ |Z\x5c\x05Hk\xf7\xbd\xbd\xa9\xe5\x01\xecY\xda\x82\ \xc9\x8f\xda\xd4\x02\x7f\x0bT\xcf\xbb{7\xdb\x03\xa9\x05\ \x02\x0cwJ\x08g\x87S\x0b\x04\xf8\xfct\xdf\xcb\x9a\ R\x0b\x04X\xffY\xf8G\xdf\x9aSK<\x0f\xf8\xf5\ &\xd0IV6\xa9%\x02\x00\x00\ \x06\xc0IDATx\xda\xed\xdd\xdbb\x9b8\x10\x06\ `K\x85B!f\xa1&\x1c\x8a\x03\x81\x9a@!\xf0\ \xfe\x8f\xb7\x17\xbbm\xe2\xc6\x18\x8c\xf5\x13\x81\x86\xcb6\ \x17\xf83\x16\xd2hf\xb4\xeb\x15\xbfv\x04@\x00\x04\ @\x00\x04\xd0\xef\x14\xbc\x08\x80\x00\x08\xe0\x1c@\xa9\xa1\ \x8f\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\ \x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\ \x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\ \x80\x00\x08\xe0\xae\xabC\xde|\xd7I\x0f\xf0\xccv\x5c\ 7\xac\x07\xc7;\x04a\x9c\x1d\x7f\xc4Q\x18\ \xf8\x07\xcfu\xf6\xb6e\x1a\xba\xc6\xd9n\xc7\x7fI\x0e\ P\xf2\xc1\xcc,\xc65\xdd0M\xcb\xde;\x8e\xeby\ \x07\xff1\xf8\xf0\xf9\xc6/Gr\x80\x00\x9d\xe0fH\ \x0e\x10\xa1\x01|\xc9\x01\x124@&9@\x8a\x06h\ %\x07(\xc0\x9f\xdf\x94\xfd5X\x82\x01<\xd9\x01j\ 0\xc0\x0f\xd9\x01Z0@!\xfdL\x10\x0c\xf0Kz\ \x00\x0e\xfd\xfcL\xfe\xc5\x90\x0e\x05\xd0\xe4\x070e\x7f\ \x0b\xa2\x01l(\x80%?\xc0\x1e\x0a`\xcb\x0f\xe0\xaa\ \x0epP\x1d\xe0Qu\x80Pu\x80X\xf5\xb7\x006\ \x22\xf2M~\x80T\xf5\x89P&yH\x14\x0e\x90\xab\ \xbe\x16\xc0\xc6\xc4V\xb0\x1a\x04\xc7\xc4\xe4\xdf\x1a{Q\ \xfd-PA\x7f\x01\x95\xfc\x00\xf5\x87\xfd\xc0\xff6\x04\ \xff\xec\x08\xfaA\x18Fq\x9c\x1c\x8fi\x96\xe5Eq\ *\xcb\xb2<\xfd,\xf2<\xcb\xd2\xa7c\x92\xc4Q\x14\ \x86\x81\xef\x1f\xbe{\xae\xeb\xec\xf7\xb6m\x99\xa6\xf1U\ \xd74\x1e\xf5\xf2\x034g\x00a/\xdf\xb5(@\xa4\ \x1e\xc0y\x5c\xadl\ \xb2\x8b\xa7?\x05\xac\x95\x1d\xe0\xad\xb12\x9f\xbe~k\ \xa7\xaf\xa0r\xd9\x01\x82y\x11\xfd'\xbe\xdc\x82\x00<\ \x0f\xf0\xd9\xacp~5q$\xb0d\x07\xe8\xfb\xca\x99\ \x15\xc9n\xa6-#Y'=@\xdf\x9ffEo:\ k\xa1\xc9 \x1e`\xe6\xd5\x1a\xcb\xcc\x04\xa4\x05\xe8\xeb\ )K\xe9h\xc3\x00\x93\xfa\x90y[\x06\x98\x12S\xb7\ 7\x0d\xd0\x8d\xbf\x0c\xcdM\x03L\xd8Z5\xb6\x0d0\ \x1eT\xd66\x0e0:\x0e\xf2\x8d\x03\x8c\x86\xd5\xd9\xd6\ \x01b\xd5\x9f\x80\xb1\xa8\xaa\xbeu\x80\xb1\xf6\xf4\xe6\xe6\ \x01b\x95'B}?\xda\x94\xd4\xd9<\xc0\xc8)%\ \xde\xf6\x01\xf6\xe0\xbcI\xe9\x01|e\xe3\x01\xff_\xd7\ 3\x0d\xab\xed\x03\xe4\xe0\xd6\xd2\xd2\x03T\xd8i\x80\xfc\ \x00\xbf\xc0\xfb\xc3\xd2\x03\x5c=\xaf-Q\x00\xe0j\x92\ I\xad\x00@\x8f\x1d\x02\xd6\xfd\x04\x84*\x004\xe0<\ 1\xe9\x01jd@p\x0d\x00W\xea\xce|\x99\x01*\ WPaK\x8a\x9c\x07\xc3\x00Z\x9f\x89*p\x8b\xd6\ \x98(\x19\x7f\xd9\xedv\x5c\xcc#0|^]&+\ \xc0\xb3!2\xa1\xdd\xc4\xc5CA\x00\x7f\xaad\x98\x88\ \xc6\x07\x1d\x03W\xcd\x88\x07x{f\xff\x11p\x7f\x83\ \xb5\xb7Z'+@*\xb4\x97x0\x04 \xea\xb0\x06\ \xf1\x00\x8d\xd0\xc2\x9e\xaf\xc0e\x00j\x104\x04\xe6\xf1\ \x95\xc0\x14I\x18\xc0\xbb0&\xbbw\xb6\xeeC\xe7\x00\ \x80\xf7{\xda\xfa}\x93\x81v`W\x80U2\x03\ \xb4\xe2\x8a\x5ccx\xe1(d&h\x8a\xba\xd7VC\ \xff\x000\x00g?\x5cv\xc7p5\xf0\x0e\xd4d/\ \x9f?\xef\x9b\xc1g\xff^k\x86\x5c\x04\x00\x01\xda\xf3\ \x1b\xd7\xe7N\x89-`\x18\x00\xbb\x1a\xfc\xeb\xceg\x0a\ \x04\xf8\x01\x00\x05\xf0\xf7\xad\xebs~\x05)\xbe{\x04\ \x0c\xe0\xc3~\x9ev\xfb\x84\xa8\xb8<\x00\xe8\xa2O\xa9\ \x80\x00\xbc~\xb8y~\xeb>\xf6\xcf\xcbS .\xbc\ \xbf\x22&$va\xf8\xf2ozt\xb3\xcb\xdf?\x17\ \x7fV\x15\x06\xe0\xd2\xf8e\xdeP\xdd\x11\x0d|~\xc0\ IM\x18\x80\x8b\x9b\xfa,\x98\xf8\x104\x03\xb9q\x1a\ \xe2\xa0&PTx`\x04\x9b\x14\xc5\x18\xaa\x9c\xd4!\ \xbdEA\xfb\x02Ci\xdeF2\xf6\x14\xa4C\xe9\xc1\ \x06\xa6\xb7*\x08\xe0qx?+\xb8\xf2 \xb7\x91\xbe\ T\x1790\xc0\xd5\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00k\xacXT\ \x00\x00\x00\xa5PLTE\x00|\xf8\x00\x80\xf8\x08\x80\ \xf8\x08\x84\xf8\x10\x84\xf8\x10\x88\xf8\x18\x88\xf8\x18\x8c\xf8\ \x90\xf8(\x90\xf8(\x94\xf80\x94\xf80\x98\xf88\ \x98\xf88\x9c\xf8@\x9c\xf8@\xa0\xf8H\xa4\xf8P\xa4\ \xf8P\xa8\xf8X\xa8\xf8X\xac\xf8`\xb0\xf8h\xb0\xf8\ h\xb4\xf8p\xb4\xf8p\xb8\xf8x\xbc\xf8\x80\xbc\xf8\x80\ \xc0\xf8\x88\xc4\xf8\x90\xc4\xf8\x90\xc8\xf8\x98\xcc\xf8\xa0\xcc\ \xf8\xa0\xd0\xf8\xa8\xd4\xf8\xb0\xd8\xf8\xb8\xd8\xf8\xb8\xdc\xf8\ \xc0\xdc\xf8\xc0\xe0\xf8\xc8\xe0\xf8\xc8\xe4\xf8\xd0\xe4\xf8\xd0\ \xe8\xf8\xd8\xe8\xf8\xd8\xec\xf8\xe0\xec\xf8\xe0\xf0\xf8\xe8\xf4\ \xf8\xf0\xf4\xf8\xf0\xf8\xf8\xf8\xf8\xf8\xf8\xfc\xf8\xce\x99\xaa\ w\x00\x00\x00\x09pHYs\x00\x00\x00H\x00\x00\x00\ H\x00F\xc9k>\x00\x00\x04?IDATx\xda\ \xed\xdd\xe1v\xd2@\x10\x05\xe0\x0d4\x05\x91b(\x82\ \x14$\x16S\xc4\x88\x18\x13\xd3y\xffG\xf3\x8f\x9e\xee\ %\x9b\x9e\xb6\xb6s\xef>@\x0f\xfbA\x93\xbd3\ \x13p\x02\xbe\x1c\x01\x08@\x00\x02\x10@\x1c\xe0\x22\x00\ \x01\x08\xa0\x01\xa0.}\x04 \x00\x01\x08@\x00\x02\x10\ \x80\x00\x04 \x00\x01\x08@\x00\x02\x10\x80\x00\x04 \x00\ \x01\x08@\x00\x02\x10\x80\x00\x04 \x00\x01\x08@\x00\x02\ \x10\xe0\x05\xac\x9f\xd9|8\x02\x05\xa8\xf3t\xd2s\xce\ \xb9\x1e @\x91\xcd\x87\xd1\xdf!\x96.\x16@\x9d\xa7\ \x93\xf3cc<\x08\x00\xea\x8d\x07\x03\xa8\xf3\xf42>\ 9\xc8e\x18\xa0<\xfe\xc6\xc3\x00T\xbd\xa0Q>\xbb\ \x00S\x87\x0dp\xe3\xb0\x01\xaa\x18\x1c`\xe2\xb0\x012\ \x87\x0dP\xc6\xe0\x00c\x87\x0d\x909l\x80\xf2\x0c\x1c\ `\xec\xb0\x012\x87\x0d\x10t\x07\xb0\x0cp\xe9\xb0\x01\ 2\x87\x0dP\xc5\xe0\x00~\x06\x88\x00\x01T\x08^\xe0\ \x01\xa8*P\xbf\xc6\x03\x98\xf9\x1b\xdc\x0a\x1c\xc0\xd6\xdf\ \xdfL\xe0\x00\xea\xbe\xb7\xbd\xb8\xc2\x03\xb8\xf2\xb7\x97\x09\ \x1c\xc07\xff\xb6\x97\x08\x1e\xc0\xc0?\x02\x14x\x00+\ \x7fsK\x81\x03(:\xea\x08\x80\x07\x90\xf8{\xdb\x08\ \x1c\xc0\xda\xdf\xdaX\xe0\x00T\x08\xec\x14x\x00\xaa\x13\ \xba\x128\x00u\x06\xfes\x05D\x02Pg`\xf7E\ \xe0\x00\x96\xfe\xbe&\x02\x07\xf0\xc3?\x03wK<\x00\ u\x04H\x05\x0e@\xd5\x81\x07\x02\x07\xa0\xeb\xc09\x1e\ \xc0\xfc\xa0\x0c\x84\x06\xb0\x8b\x0e\xca@h\x00C\x7fO\ k\x81\x03P!h(p\x00\xea\x0a\x18\xed\xf0\x00>\ \xf8;\x9a\x0b\x1c\xc0\xa9+ \x04\xc0\xf0\xb0\x10\x0e\x06\ \xf0\xd9\xdf\xcf\x85\xc0\x01\xd4\xe7\xf7\x9e\x011\x00T\xfb\ ;\x118\x80B\x0d@\xec\xf0\x00\xc6\xf7\x94AP\x00\ 6\xee\x9fV\x18\x16\xc0\x9b\xfbS \x04\xc0\xb5\xbf\x97\ N\x09\x07\xa0\xcb \x0b\x81\x03P\xb7\xc0\xb3\x0a\x0e@\ \xdf\x02S\x81\x03P\xcfD\xf5j8\x80\xdc\x9d\xa8\x03\ !\x00\xa8\x14\xd8\x178\x00=\x11~\x03\x07p\xdb?\ U\x08\x04\x00\xf8\xe4\xf4D,\x1a\xc0\xaf\xb8)\x06\x1b\ \x07P\xcd\xf0\xa31\xd86@\xd9i\x8c\xc1\xb6\x01f\ \xcd1\xd84\x80>\x04\xcf\x04\x0e\xe0}@\x0c\xb6\x0c\ \xf0\xdd\x05\xc4`\xcb\x00\xe3\x90\x18l\x18@\xa7\xa0T\ \xe0\x00FA1\xd8.\xc06,\x06\xdb\x05\x18\x85\xc5\ `\xb3\x00\xdb\xc0\x18l\x16`\x18\x18\x83\xad\x02lB\ c\xb0U\x80ah\x0c6\x0a\xb0\x09\x8e\xc1F\x01.\ \x82c\xb0M\x00}\x0b\xd8\xe3\x01\xbc\xf3_\xfc\xa5\xc0\ \x01\xe4\xad\xaf\x00\xc6\x00\x92\xb6\xb7\x00c\x00;\xf5\xda\ \xbf\xe2\x01LZ\x1e\x02\xad\x01\xec\xa3v)\xc0\x1c\xc0\ \xac]\x0c4\x07P\xaa\x0f\xc05\x1e\x80\x1a\x88\xe9\xd6\ p\x00U\xb7E)\xd8\x22\xc0*\xbc\x19d\x12\xe0\xf6\ \xbcu\x0c\xb2\x05\xa0\x1e\x0b86\x16o\x1d\xc0\xff~\ \x1c7\x128\x80\xb6\xa5Ps\x00\xe3\x07\x1d\x82\xec\x00\ \xec\xdb5C\xec\x01\xa8SpO\xe0\x00\xf4!h\x8d\ \x07\x90>\xfc\x03`\x03\xa0\xe9\xb7b\x1ey\x15/\x0d\ \xe0\xe6y\xf7\x1f\xd2oz^\x80\x04\x1c`\xef\xc0\x01\ \xe6\xe0\x00u\x17\x1c\xe0\xda\x81\x03\x0c\xc0\x01r\x07\x0e\ 0\x05\x07\xa8\x22p\x80\xbdC\xff\x17@\xff\x04\xc8[\ ^\x04\xc1\x01Rt\x80-:@\x89\x0e 1:@\ \x82\x0ep\x85\x0e\xf0\x08\xaf\xc4\xe0\xb3\xc3\x04 \x00\x01\ \x08@\x00\x02\x10\x80\x00\x04 \x00\x01\x08@\x00\x02\x9c\ X\x0d\xbf;\x5c\x9b\x07h()V\xe6\x01vO?\ \x10\xf6\xb2\x016\xa7\x01r\xf3\x00\x0d}\x95\xcc<@\ Cgmi\x1e\xa0a\xc84\xb1\x0e\xd04^\xd0\xb5\ \x0e\xf0\xb1\xa9\x07\x90\x1b\x07h\x1c\xb3\x9e\xd9\x06X7\ v\x81\xba\x95e\x80*`\xce~i\x19 d\xba$\ *\xec\x02\xac\x82Z\xa1\x83\xda*\xc0\x22\xb0\x19\x9c\xd4\ &\x01\xf6\xa3\xe0v\xf8`g\x0e\xa0\xdeL\xda\xcc\x17\ F\xd3\xfc\x15\x03\xac\x96\x07k1\xbdh?]\x19'\ \xf3\xbb\xbfP\xbc*\x80'\x18%\xdd\x12\x80\x00\x04 \ \x00\x01\x08@\x00\x02\x18(\x8a\xfe\xafE\x00\x02\x10\x80\ \x00\x04 \x00\x01\x08@\x00\x02\x10\x80\x00\x04 \x00\x01\ \x08@\x00\x02\x10\x80\x00\x04 \x00\x01\x08@\x00\x02\x10\ \x80\x00\x04 \x00*\x00\xda\x22\x00\x01\x08p\x07\x80\xbb\ \x08@\x00\x02\x10\x00z\xfd\x06\x0eL\xb1gp\xf4v\ \x0b\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00\x09\x13\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00k\xacXT\ \x00\x00\x00\xedPLTEx\x00\xf8\x80\x00\xf8\x80\x04\ \xf8\x80\x08\xf8\x80\x0c\xf8\x88\x10\xf8\x88\x14\xf8\x88\x18\xf8\ \x88\x1c\xf8\x88 \xf8\x90 \xf8\x90$\xf8\x90(\xf8\x90\ ,\xf8\x900\xf8\x980\xf8\x984\xf8\x988\xf8\x98<\ \xf8\x98@\xf8\xa0@\xf8\xa0D\xf8\xa0H\xf8\xa0L\xf8\ \xa0P\xf8\xa8P\xf8\xa8T\xf8\xa8X\xf8\xa8\x5c\xf8\xa8\ `\xf8\xb0`\xf8\xb0d\xf8\xb0h\xf8\xb0l\xf8\xb0p\ \xf8\xb8p\xf8\xb8t\xf8\xb8x\xf8\xb8|\xf8\xb8\x80\xf8\ \xc0\x80\xf8\xc0\x84\xf8\xc0\x88\xf8\xc0\x8c\xf8\xc0\x90\xf8\xc8\ \x90\xf8\xc8\x94\xf8\xc8\x98\xf8\xc8\x9c\xf8\xc8\xa0\xf8\xd0\xa0\ \xf8\xd0\xa4\xf8\xd0\xa8\xf8\xd0\xac\xf8\xd0\xb0\xf8\xd8\xb0\xf8\ \xd8\xb4\xf8\xd8\xb8\xf8\xd8\xbc\xf8\xd8\xc0\xf8\xe0\xc0\xf8\xe0\ \xc4\xf8\xe0\xc8\xf8\xe0\xcc\xf8\xe0\xd0\xf8\xe8\xd0\xf8\xe8\xd4\ \xf8\xe8\xd8\xf8\xe8\xdc\xf8\xe8\xe0\xf8\xf0\xe0\xf8\xf0\xe4\xf8\ \xf0\xe8\xf8\xf0\xec\xf8\xf0\xf0\xf8\xf8\xf0\xf8\xf8\xf4\xf8\xf8\ \xf8\xf8\xf8\xfc\xf8\x09\xd19\xc7\x00\x00\x00\x09pHY\ s\x00\x00\x00H\x00\x00\x00H\x00F\xc9k>\x00\x00\ \x07\xccIDATx\xda\xed\xddiC\xdaL\x10\x00\ \xe0\x1cP\x90\xa3(-R\x81\xaax\x03\xe5\xa8\x82\x22\ E\xa8\x81\x0a\x91d\xfe\xff\xcf\xe9\x87\xbe\xafr\xe4\xce\ &f6\xb3\xdf#\xd9G\xc81;3+@\xcc\x87\ @\x00\x04@\x00\x04@\x00 \xc4p\x10\x00\x01\x10\xc0\ &@\xac.}\x04@\x00\x04@\x00\x04@\x00\x04@\ \x00\x04@\x00\x04@\x00\x04@\x00\x04@\x00\x04@\x00\ \x04@\x00\x04@\x00\x04@\x00\x04@\x00\x04@\x00\x04\ @\x00\x04@\x00\x04@\x00\x04@\x00\x04@\x00\xac\x87\ \xae\x0cZg\x95/\xf9tR\x96\x04)\xf1)\x9d-\ V\xce[}E\x8f\x03\x80\xd2=\xfe,\x99\xa4,J\ \x85Zg\xc63\xc0\xea\xae\x96\xb2M\xdcLUo_\ \xb9\x04\xd0\xee\x0e%\x87\xc9\xab\xd2\xb7\xbe\xc6\x1b\xc0\xe4\ Xv\x95\xc0\x9b8\x9fs\x04\xa0\xff,\xb8\xcfa\x16\ +\x13N\x00^\x1b\x9f<\xe6qW\xe7\x1c\x00\xa8W\ \x09\xef\x99\xec\xd2\xf9\x0a9\xc0\xab\x9f\xe9\x0b\x82 d\ \xc6\x98\x01\xb4V\xd2w9\x83x\xa6\xa1\x05\xb8K3\ \xa9\xe88X\xe2\x04P\xf7Y\xd5\xb4\xa4\x9fQ\x02<\ \xb0\xab\xea\x91\xc7\x18\x01\xae\x18\xd65%\x9e\x10\x02\x1c\ \xb2\xac\xecJL\xf1\x01$Y\x02\x08\xa9%6\x809\ \xe3\xea\xbe\xa2\x8e\x0c\xe0\x8eu}\xe3\x052\x80s\xd6\ \x00\xe2\x04\x17\xc0\x01\xf3\x12\xd7}T\x00\xba\xcc\x1c@\ \xe8`\x02\xf8\x1d@\x95sJG\x04\xd0\x0d\xa2\xce\xfb\ \x16\x11\xc0I\x10\x00yD\x00\xf9@J\xfd'h\x00\ 4\xd1\xf4n\x96\xab\x5cw\x87OSE\x99\x8e\x07\x9d\ \xcb\xf2\x9e\x1b\x80K4\x00c\x93\x17\xdb\xb3\xe1N\x8c\ k\xd9?q\x1c3\xcc\xa1\x01h\x19\x86yGf\xf7\ \xcca\xd9\xa1\xc0\x1c\x0b@\xd5 \xc4k\xb9\xe8\xa5T\ \x1c\x01\x0c\xb0\x00dv\xbe\xbc\xb61\x8dQ\xd6\x01\xc0\ \x15\x12\x80\xe5\xf6\x89\x9f8\x88l\xaej\xf6\x00e$\ \x00\xc3\xad_\x7f\xcf\xd9a\x0d[\x80\xcfH\x00n6\ \x977\x86N\x8fk\xdb.\x13 \x01\xd8\x08\x87\x89\xf7\ \xce\x0f\xbc\xb0\x01H\x22\x01\xd8\xb8\xb1\xf7\xdc\x1c\xf9\xc5\ &(\x80\x03\xe0\xcf\xc6\xf5\xcf]$\xcdz)M\xc6\ \x01\xd0_\x7f\x81\xd1\xfc\x5c>\x90\xfe\x04\xd6~\xc9\xa2\ \xdbx\xf6\xca2\x9a\x9c\xc6\x01P\xf4\x13\xca\xb4\x0c&\ \x16q\x00\xbc\x87\xc3\x92\xee\xf3\x9d\x9e-S&P\x00\ \xacM\xe1\x07\x8b\xc7\xe8\xb5q\x83\x02\xa0\xe7/\x8ag\ \x15L\x1a\xa2\x008};\xdf\x06\xebp\xe2\x12\x05\xc0\ [J\x98\xacz9\xfc\x97\xf9\xfc\x0b(\x02\x22\xda[\ >\xe4wO\xc7\xbf\x84\xf76\x1c\x0c\xc0\xd3\xdb\xf9z\ \xcbkP\xcd\x01~\xa3\x00h\xfb|u\xd3C\x5c\x1c\ \x0b\x04\xa0\xeas=W3\x05\xe8\xe1\x00\xc8\xfa\x8c\xe2\ /M\x9f\x83\x91,\x8d\xfd\xec\xfd\x1b?=\x1e?\xe3\ bq\x94]<\xed=\xae\xaa\xc7\x04\xc0,.\xf6\x0b\ b\x02pl<\xff\x13\x88\x0b\x80\xf1\xcbPN\x8b\x0b\ \x80qz\x99\x1cL\xbal\x14\x01\x9a\x86\xc1\xd0\x07\x88\ \x0d@\xce\x08\xe0\x07\xc4\x06`d4\xff\x06\xc4\x07\xa0\ \x18B\x1c(\xca\x00\x06I\xf6b\x07\xe2\x03\xf0\xba[\ d\x22\x0f F\x00\xbb+\xe4{S\x88\x11\xc0nf\ MI\x85\x18\x01\x0c\xb6s\xcb\xa4V\xc0\x9f\x18-\x80\ \xbb\xed\xf9\xe7~C\x9c\x00\x1a[\xf3\x97\xae\x83o\xa8\ \x10!\x80\xe5v\xa6\x5cQ\x09\xe1S\xa3\x03\xd0\xdbZ\ \x14N\xdf\x85\xf2\xb1Q\x01\x18l\xa5\x16\xcbW\xdc5\ P\xb0\xfa\xf2\xb7\xb6\xde\x7f\xa4\xfa2\xac\xcf\xfex\x00\ \xa5U\x92vj\xe6\x07S\x95S\x00u\xf9\xdfX\xcc\ \x95\xa7A\xab^4\xcd\x08J\xee\xd7\x1a\xc3\x05o\x00\ \xaa\xe8\xb6l\xba\xda}\xe1\x09`\xe0\xa5H\xa2\xd0\x5c\ p\x03\xe0\xb1\x8eF\xac\ \x89\x92w\x81\x1aF\x80\x7f\xa9O\x99\xf2E\xe7a2\ W5\x00\x00m9\x1b\xf5\xae\xca)\xf7\x02S\x84\x00\ \xfae\xf1\xfa\xd1\xb8\x80fq[q\xf9\x94\x5c\xe1*\ *\x0c\x00\xa0\xdf\x1f\xbayL\x10\xe7\xbc\x01\x00\xc0\xfc\ \xd8\x05\xc1%\x87\x00\x00\xb3#\xe7-\x85\xb8\x04\x00\x18\ 8\xee&2\xe6\x13\x00\x96\xa5p{\xcbE/IJ\ \xaf;\x03\xf8\xcc+\x80I\xa6\xe8\xeeP\xb9\x05\xb0\xa9\ \x1f\xff\x7f\x8c\xf8\x05X+\xbc\xb4\x18-\x8e\x01t'\ \xcd\x18O9\x06\x80\x85\x83'\xe3\x12\xcf\x00N\x96P\ \xf2\x5c\x038\x08\xa0\xa6\xf8\x06\x18\xd9GE\xf8\x06\xb0\ \xff\x0aH\x9c\x03\xd8\xe6R\x88\x9c\x03\xe8v\xad\xc9\x93\ \x9c\x03\xd8F\xd13\xbc\x03<\xda\xa5\x0e\xf1\x0e\xb0\xb2\ \x89\x0f}\xe5\x1d\xc0\xee>p\xc4=@=\xc6\xef\x02\ \x00`\xdb\x5c\xb1\xc3=\xc0\xd0\x1a\xe0\x89{\x00\xc5\xfa\ 9H\xe3\x1e`\x11F\x8f\xe9(\x03\xbc\x0a!\xb4\x95\ \x8b2\x80n\x09\xd0\xe6\x1f@\xb3\x04x\x89,\x80\xfa\ \xc0\xa8\xd6}i5\x7fV=\xa5\x18\x03\xa8\xf7\xe7\x05\ \x91U\xd3?\xcb\x9d\x9a\x1aQ\x04\xb8\xcc\x8b,\xff=\ \x13+\x80Y\x14\x01\xde[\x1f0I\xe7\xec\x87\xb1\xd1\ \x02S\x80\xb3\xb7\xf3;`qn\x8d\xe0\xef\x01\x8c\x01\ \xd6v\x17c\xd1\xf3\xe5\xbbE4H\x8b$\x80\xc26\ h\x9f\x0d\xa3\xb1$\xdb\xbb\xc0\xda\xeeZ\xfe\xb7D\xb2\ \xb8\x0bJQ\xcd\x13\x5c[\xd2K\xfb\xfe\x92Z\x84\x85\ \x19v\x15c\x0bp\xca\xf2[j\xbe\xdf\x864\x8f*\ \xc0zC`\xf9\x8f\xcf\x07\xe1D(\xade\xd9\x02L\ \x18\xe6t\x9b\xff\x02\xd2Zd\x016\xf7\xd7\xf2\xd7\x01\ \xe1K8[\x0d1~\x17\xd8\xb8s%\xfd4\x01\x98\ \x06\x9c\x17\x10\x10\xc0\xe6nQ\x87\xc0\xea/\xad/\x0a\ \xcf\xa2\x0cp\xbdy\xb2M\xcf\x7f\xc8\xbc\xc2\xae\x0fQ\ \x06\xd8\xbar\x89\x9e3\xb9\x0a\xc1\xae\x06\x04\x060c\ T\xe1e\x9a*X\xd0\xa2\x0d\xa0oW\x81\xecy\x8a\ \x5cM\xcc\x8aI\x12\xacw\xdbc\x1e\x12\xdb\xd9h3\ \xeb\xe1\xb1]5\xdbcCb\xbd\xbf\x04{\x80\xddm\ \x06\xb3\xae\x9f\x085\xb3,A1\x80\xdeJ\xac\x01\x0c\ \x82\x18)\x97\xfdp\xf5r\x88\xad\xc5\x99\x03\x18=\xc0\ &\xee\xdd\xfc\x85U)\xe88h\xa0\x00\xc6\xc5\x81u\ \xe7\xd7\xee\xc5~\xc0\x05\x02\x01\x03\x80\xf1\xf5;\xeb\xb4\ /\xfa\xd0\xb4b\xa4\x098\x00\xcc\xf6[\xae:\xb9\x16\ \xae\xceLC\x00A\xf5\x96c\x0eP5\x9dB\xdd\xf6\ \x91\xe0\xd6\xb4\x8221\x02,\x00\x16\xb1l\xa9j\x95\ \xd3\xa0\xf7r\xe6\x11\x80g@\x03`\x9d\xe0\x99\xbd1\ y6\x9e^X\xd4\xcf\x1e\x06\xd8\x5c\x8f9\x80m\x8d\ x\xe6\xe4v\xeb\x85v\xd1\xaf[\xed8,\xfd\x00@\ \x04\x00Nj\xc2\xe5B\xe5\xac\xd1\xe9v\xdb\x8d\xcb\xea\ \x81M\xa5`6\xd0\xbe\xca\x01\x00\xe4\x05\xa6\xe3x\x05\ \xc8\x00\xaa,\xa7\x9f\x1f\x03`\x03h\xb0\x9b~\xa2\x8d\ \xb1\xaf\xf0\x03\xb3\xf9\xd7\xc2\xe8\xac\xca\x1e`\xceh\xfa\ GS\x00\x94\x00\xeb+\xa4\x9e\x87X}\x06\xc0\x0a\xe0\ \xbfa\x96X\x9b\x01\xe0\x05\xf0\xdb/)\xdb\x5c\x00`\ \x06\x80\xc7o\xde\x9b\x86\xc9\xdf\xc7\x10\xea\x08&Qr\ q\x93\xf34\xfbro\x05\xc0\x03\x00\x00L/2.\ [\xa4\xd5\x1f5\x08\x7f\x04\x99*\xab\xb4J\xce\xee\x08\ b\xae\xd6V\xe0cF\xc0\xb9\xc2\xfa\xb4]\xcd[)\ \xc8\xd9Js\xb4\x82\x8f\x1b\xa1$K\xcf\x87\xdd\xab\xe3\ \xc3b>\x9dL\xc8\x92 %R\x99\xfc\xfe\xd7\xf2i\ \xb3?Y\xc0G\x8f(g\x8b\x13\x00\x01\x10\x00\x01\x10\ \x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\ \x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\ \x10\x00\x01\x10\x00\x01\x10@\x80\x00q\x1b\x04@\x00\x04\ \xf0\x0e\x10\xdfA\x00\x04@\x00\x04\x10\xeb\xf1\x17\xe9\x89\ Gh\xda\x1b|\x00\x00\x00\x00\x00IEND\xaeB\ `\x82\ \x00\x00\x06\xe8\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x01\x00\x00\x00\x01\x00\x08\x03\x00\x00\x00k\xacXT\ \x00\x00\x00\x8aPLTE\x00\xfcx\x00\xfc\x80\x08\xfc\ \x80\x10\xfc\x80\x10\xfc\x88\x18\xfc\x88 \xfc\x88 \xfc\x90\ (\xfc\x900\xfc\x900\xfc\x988\xfc\x98@\xfc\x98@\ \xfc\xa0H\xfc\xa0P\xfc\xa0P\xfc\xa8X\xfc\xa8`\xfc\ \xa8`\xfc\xb0h\xfc\xb0p\xfc\xb0p\xfc\xb8x\xfc\xb8\ \x80\xfc\xb8\x80\xfc\xc0\x88\xfc\xc0\x90\xfc\xc0\x90\xfc\xc8\x98\ \xfc\xc8\xa0\xfc\xd0\xa8\xfc\xd0\xb0\xfc\xd0\xb0\xfc\xd8\xb8\xfc\ \xd8\xc0\xfc\xe0\xc8\xfc\xe0\xd0\xfc\xe0\xd0\xfc\xe8\xd8\xfc\xe8\ \xe0\xfc\xe8\xe0\xfc\xf0\xe8\xfc\xf0\xf0\xfc\xf0\xf0\xfc\xf8\xf8\ \xfc\xf8`;^\x10\x00\x00\x00\x09pHYs\x00\x00\ \x00H\x00\x00\x00H\x00F\xc9k>\x00\x00\x06\x04I\ DATx\xda\xed\xddaw\xa28\x14\x06`Ba\ `\xa4\xba\xd0vtuQ*2Pb\xf8\xff\x7fo\ ;\x9d=g\xdb\x01\x14\x85$7\xe4\xcdw\xcf\xe9}\ *\xe1\xe6\xe6&:\x8d\xe5\xc3\x01\x00\x00\x00\x00\x00\x00\ 4\x8e\x85\x03\x00\x00\x00\xc0W\x00\xab\xa6>\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\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00&\x1eU\x9e\xae\x93(\xf4]\x971\xd7\xf3\x830\ J\xd6iV\x08\x1b\x00\xc4q\xf3\xe8\xf6u,\x06\xf1\ \xf6\xc8\xe7\x0cP\xed\x1e\xd9\xd5\xbe\xcdp\x9d\x8bY\x02\ \xf0\x7f\x16C{W\xd9\xea \xe6\x06P$\xec\xa6\xfe\ ]7\xc9\xe7\x04p\x8c\xee\xe8a\x0eR1\x13\x80\xe3\ \xe2\xce6no\xcbg\x00PD#:\xd9\xdd\x9d\xe9\ \x00u2\xb2\x99?8\x1a\x0d\x90\xba\xe3\xcf3,k\ c\x01\xca\xc5$':\x1e2C\x016l\xaaC-\ O\xc2@\x80\x89\xfe\xfd\xff\xcd\x04\x95q\x00S<\xfd\ \x9f\xdf\x88\x85Y\x00<\x9e\xfah\x97{4\x0a\xe0\xdb\ \xf4\x87\xdb\xd8\xc1 \x00.\xe3x\x1f\xcb\xcd\x01(\xa4\ \x1cptO\xc6\x00\x1c\xe5\x1c\xf1\xf4*S\x00RI\ \x87\x5c\xbf\x0bC\x006\xb2\x8e\xf9\xbe\x18\x02\x90\xc8\x02\ p23\x00\x1e\xa5\x01x\xdc\x08\x80@\xdeY\xf7\x17\ #\x00\x98<\x00V\x1a\x00\xc0\x1d\x89ci\x00\xc0\x80\ <\x88\xb9w\x7fK\x0a\xfa\x00\x97\xf2 o\xb5\xcd\x8a\ \x8f\x99L\xf0\x22\xdb\xae\xbc\x9b\x01\x12\xfa\x00\xbdy\xd0\ b\xdb~\x82\xcbMx\xe3,\xc0\xc9\x03t\xe7A\xee\ \xba/\x93=\xc57=\x0f\x7f\x93\x07\xe8\xca\x83\xbc\xdd\ \xa54\xb6\x5c\xdeR\x1e\x22\x0f\xd0\xde\x09`?\xceW\ >\x93\xdd0\x19T\xd4\x01ZyP8`\xe6\xae\x87\ \x7f\x09v\xd4\x01\xfe|\xa2\xe3a\x8b\xb8\xe7\xa1\x00\x8f\ \xc4\x01\xfe\xcc\x83\xd6C?\xb8\x1e\xfa\x1e \x0eP\xdc\ \x19\xff\xf0U\xe4O\xda\x00\xaf_\xfe\xd8\xbf\xc6M\x9f\ \x9d\xe3@\x1b\xe0K\x1e\xe4\xdf\x94\xb6\xd4\xc3v\x13\xd6\ \xb4\x01\xbe<\xca\xfb\xdb>{\x18\x04\xb0\xa2\x0d\xf0\xf9\ I\xf6\xc7\xe7\x10])5m\x80hL\xfd\xe24\x04\ \xa4\x0d\xf09\x0f\xba}3cH>\xe4\xd3\x06\xf8\ \x94\x07\xb1\xdb\xeb\xd8C\xf6\x14\x5c\xd2\x00|d\xf9\xc6\ W\x99\x09\xc9\x00(Ff\xed/\xa6\x7f\x03^G\xa6\ l\xf9\x80\xe28i\x80t\xec\x1f\xca\x14V\x04d\x00\ \xac\xc7\x96\xef\xae\xa7\x02\x11i\x80dl\xce~}Q\ \x98\x90\x06\xf8\xf4\x0f\xbc\xaf\xc3oo\xf8Z \x18\x9b\ \xb0\xe5\x86\xaf\x06\xd9\xd8\x7fT\xa9poD\x02\x00\x1f\ \x93\x07\xff^\x13\x9b]\x11*\xc6\xe4\xc1\x1fC\xa8{\ \x09\xc8\x00\xc8\xc6oc^\x03\xd8\x90\x06H\xc7W\xaf\ \xaf\x01\x1ci\x03\x04\xee\xc8\xa9\xea|m% H\x03\ |Lc?\xf3C\xba\xbd\xfb\xd3\xca\x0abD\x8f\xce\ VW\x00\xf6s\x078\x19\xbf=>rd\x97\x01\xe2\ f\xee\x00;e\xef\x00\xa2\x00/\x8a\x0a\xa2d\x01.\ \xd7\x03\xb6\xf3\x07\xb8\xd8*\xe1\xf2\xd9\x03\xd43\xe8\x14\ \x95\xf7\x12`o\xf3\x07\xb88\x07>7\xf3\x07\xb8t\ \xde\x90U\xf3\x07\xe0l\x06\x07&\xc6\x8c\xbd\xbaW\x00\ M\x80XM\x7f\x1cY\x00\xe1\xaah\x0b \x0cp\xa9\ G\xe6d\x03\xc0JQ\x9f\xe0\x00\x00\x00\x09\ pHYs\x00\x00\x00H\x00\x00\x00H\x00F\xc9k\ >\x00\x00\x08DIDATx\xda\xed\xddk[\xda\ H\x14\x00\xe0@R\x01\x05T\xac\xc8J\x11a-V\ \xa4\x5c\xaa`\x15\xb9\x88`\x00I\xce\xff\xff7\xfb\xa1\ \xbb\xed\xb6\x0fs\x83\x990\xc9\x9c\xf9\xacy\x987\x99\ \xfb\x99\x19\x0b\x0cO\x16\x02 \x00\x02 \x00\x02\x80e\ `B\x00\x04@\x80\xdf\x01\x8c\xaa\xfa\x10\x00\x01\x10\x00\ \x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\ \x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10\ \x00\x01\x10\x00\x01\x10\x00\x01\x10\x00\x01\x10`\xf7i\xe5\ N\x86O\x0f\xdd\xce\xa3a\x00\xf3\xe7\xbb\x9b\xf2\xd9Q\ 2\xfe3\x96\xa7\xb84\x04\xc0\x1f\xb7/s\x1f\xd6D\ 3%\x9f\xa2\x0f\xe0\xf5\xafO\xe2\xe4\x80\xae\xaa\x17i\ \x80y\xbb`3B\xda2\xe3\xc8\x02\xbcw\xf21\x8e\ \xa0\xbex=\x9a\x00\xe3\xb2\xcd\x1b\xd7\x98\x9bE\x0f\xa0\ w,\x12\xd9\xe9\xb8\xd1\x02\xf0;i\xb1\xd0\xd6F\xb4\ \xbe\x80{\xc1\xec[\xb5H\xd5\x01\xfd\xachhs%\ J\x95\xe0\xec\x9c#\xc7v6_\xba\xaa7Z\xedN\ \xbbY\xff|\x1d\xa1f\xd0\xaf3j\xfeX\xa6\xf4\xb5\ ?\x8f\xec`hD\xff\xfa\xd3\x95\xdeR\xfd\x8f\xd8\x1d\ \x80_\xa3u{\xb27\xaf\x11\x1f\x0e\x8f)\xaf\xdf\xa9\ \xbcD~>\xa0A\x1e\xf0\xa4\xdb\x1e@\xc4\x01\x16g\ \xc4\xec\x1f\xf5\x0c\x98\x11\x1a$I\xd9?\xe8\x9a0%\ \xd6\x22}\xfeN\xc37`N\xd0\xbb \xbd\xfes\x17\ \xfa\x00\xee\x11!\xfb{]\x00\x03\x00^H\xc5\xff\ t\x0e&\x00\xf4\x1dB\xfe\xaf\x01L\x00\xb8'T\x7f\ N\x0f\x8c\x00h\x10^\x7fr\x02F\x00\xd4I]\xbf\ \x19\x18\x01pK\xc8\xff\xe1\x02\x8c\x00 \xe5?\xb3\xd3\ \xfc\x07\x07@*\xff\xe99\x18\x01\xf0\x8d\x90\xff\xc4\x0c\ \x8c\x00x\x22\xb4\x7f\xf6\x08\x8c\x00x!\xf5\x7f\xba`\ \x04\x80K\xea\xffV\xc1\x08\x00\xef\x90\x90\xffc\xdf\x0c\ \x802i\xf8?\x03#\x00\xda\xa4\xf1\x7f\x1b\x8c\x00\x18\ \x93\xe6\x7f\xf2`\x04\xc02EZ\xf0\x9a\x99\x01P\x22\ \x15\x80:\x18\x01\xf0\x9d\x94\xff}\xdf\x08\x80e\x82\x04\ p\x0fF\x00\x14\x89\xeb\x1f`\x04\x00\xb1\x00X\x0fF\ \x00x\x07\xc4\xc5_0\x02\xe0\x86\xf8\x01t\x8c\x00p\ \x89\xf1\x1f\x09\xcf\x08\x80b0q^\xda\x02\x8c\xc8\x11\ \x10S#\x00\xc81\x0090\x01`H\xfe\x00\x9aF\ \x00\xe4\xc9\x00\xae\x09\x00\x94\x0f\xe0\x18L\x00(\x90\x01\ \xaeM\x00\x98R\x82\x00\x07&\x00T)Q\x80\xbe\x01\ \x00+\x87\x0c\x90\x07\x03\x00\x9aVH\xaa\x00U\x00\x19\ \x0a\xc0\xa3\x01\x00cZ\x14\xf8\xc2\x00\x80+J\xfe\x93\ \x10}\x00?i\x85\xa5\x0eT\x03\xf0D+\x01W\x06\ \x00\x94h\x00-\x03\x00\xf6h\x00\xfd\xe8\x03\x0c\xa9[\ \x81(+b\xb3n\xbd|\x9aM:v\xccN\xa42\ '\x17\xf5\xee$\x94\x005\xeaF0BG\xf8\xadu\ \xbe\xee\xc3q\x0a\x8dq\xe8\x00\xa8\x9b\xc1\xd6\xb6\x82\xab\ V\x8e\xb6}\xac\xee\x86\x0a\xc0\xa5\x96\x805\x93\x01n\ \xd5al\x9d\x8c\xe5\x07!\x02\xe8P\xf3R\xf8\xf3\xcf\ \x17\xd58\xcf\x86\xd9\xfc04\x00ejF.\xff\xf8\ \xeb\x96cq\xa6\xe2\x22$\x00i\x81\xad\xdfS\x91s\ \x03\xf6\xeeB\x01\xb0\x10\xd8\xfb\xdf\xb6-\xa1t\xbe\x0a\ \x01@\x8f\x9e\x87\xff\xad\x0az%\xe1[\xc1\xb2o\xfa\ \x03\x5c\xd1\xb3\xf0ko\xc8\xfch\x83{\xd1\x12C\xed\ \x01>\xd2s\xf0\xf3(\xa4\xd7\xd4F7\xc39C\xdd\ \x01\xf6\xe8\x19\x18\xfd\xd7_v\xac\xcd\x923\xd6\x1b`\ \xce\xf8\xfd\xff\xee\x8a\x7f\xb6\xadM\xd3\xde\xab\xd6\x00O\ \x8c\x9f\xffc,\xd4\xdf<\xff\x96\x95Y\xe9\x0c\xd0`\ \xfc\xfa9\x00\xc0p\x9b\xfc[VQg\x00V\xd3\xb6\ \x04\x80\xc9\x87-\xef\xc8lj\x0cp\xc2\xf8\xed+\xca\ \xf6\x01\xee$1\xccV:\x00\xabq\xf3\xe0=km\ \x9d\xce\xb4\x05\xf0Y\x07\xc2\xf9\xfe\xa9\x8c\x8bb{\xba\ \x02\xccX\xbf\xdc\xafH\xb9)7\xe5k\x0a\xf0\xcc\xfa\ \xe5mIw\x05\xb75\x05\xb8c\x9e\x87(\x09\xe0\xc0\ \xd7\x13\xe0V\xb4>?\xbd\xbe\x1f\xb9K\xdf\x9bO\xba\ \xb5\x93\x98\xc0\x7f~\xd3\x13\xa0&\x92\xfb\xf8\xf9\xc3\xef\ \xefq\xd1\xcap\xff\xf3\xa1\x9e\x00\x97\xfc\xd9\x8f\x95\xd7\ \xb5\xe6=n\x82\x17-\x01\x8a\xfc=\xfa\x11\xa1!\xad\ qV\x13U-\x01\xb8\x1b\xf9\x229^z\x98\xe0\x9b\ \x1b\xf1u\x048\xb4$\xbc\xbe\x19_1x\xd4\x11\xe0\ \x80/\xff%\xc6\xc4*\x97\xc0\x95\x8e\x00|\xf3\x5c9\ \xd6\xd7;\xdf\xe7\xa9Et\x04\xe0*\xbe6;\x5c~\ \xccS\x13\xba\x1a\x02\xec\xc9:\x17\x98\xa7\xcb\xdc\xd1\x10\ \xc0\x966\x90)\x04s\xc0\xael\x80\xb8\xb4\x17\xf7\xc6\ \xb6\xcci\x08 \xb1\xfd\xae\xb3g\xc8\xc3\xf9\x05|\xe6\ |\x94\xc7\xaeP\xa7\xfa\x01p,wp\xc7\xfd\xb0G\ \x96\x0f\xfa\x01\xb0\xdf\xda>\xf7\xb3VL\xcdV\x18;\ B\x02U7s\xf6\xac\xa6\x1f\x00\xfb\xa8|\x81\xe9\xcc\ \xf1\x96=\xea]\x00d\xa5v\xdfXO;\xd5\x0f\x80\ \x19\xf2\x22\x14,\xfeE\xfdh@6\xc0Gf\xb4\x97\ \xc8\xd3Xe\xe0 \x843B\x15\x99ujR?\x80\ \xaa\x8c\x81\xd0\xaf\xf4\x89\xfe\xb0\x0f\xfa\x010\xfb\xafb\ \xe7\xc7\xb5\x18\xd3\xca\xfa\x01|c\x01<\x83\xc4J \ \xa6\x1f\x00+@\xc4\x12\x8bo\xf1\xe9c\x0b[?\x80\ \x17\x16\x80\xe0\x11\xa2\xf4\xc9\xc1\x84~\x00\x0b\x16\x80\xe0\ \xbd)\xe7ak\x06\x99\xc3A\xc1\xe3Sja\xeb\x08\ 1\xbb\x82\x82\xab\x19-\xd1\xcd\x07;\x07`\x05I\x09\ >\x8e\x1ey\xfcQC\x80\xba\xdc\x220\xa0>\xec\x93\ \x86\x00=v\x94\x98H\x9a\x86m>\x80\xf1\x8b\x85\xb7\ N\xcfU\xc7\xc9H\x07`t]DWs\x96|\xa1\ \xe7\x1a\x01\xb0\x9a\x01\xc1\xad\x90\x1eG\xe0\xb1f\x00\x8c\ \xf1`\x7f\x83\x1fH\x1c\x0a\xf8:\x02te\x8e\x06\xc1\ W\xbd<,\x1f\xc0\x95:\x93\xbd\xa2=\xab\xac%\x00\ c\x16\xa7&\xb1\x12l\xeb\x09\xf0If\xac\xff\x5cb\ \x85\x1a\x14\x00\xbd\xfb.x\x9c\xecD\xedl\x80\x12\x80\ \x99\xcci\xbc\xbe\xda\x91\x80\x9a\xed\xf3\x19\x893\x22\xb4\ 6\xe5VW\x00\xfa\x18\xfe\xbb\xd0\xb3\x9aj\x17\xc7w\ q\x84\x86\xd8IZ\x94n\x95\x9c\xb3\x89U\x00\xd0\xd7\ \xc8\xc5v\xbb(?\x96P\x09\x00\xf5\x04\x01\xb1\xd3\xf4\ (\xab\xcdc}\x01\xe8s\xe3\x22\xa7a\xac\xc8;\x08\ \xd2\xa0/\x00\xec\xcb\xaa\x04\x06\xca\xf7\x0e\xaa\x01\xb8\x91\ \xd5\x15\x22\xefCuV:\x03\xb81I\x8bC\x05\xc5\ \xbb\x05\x94\x1d\xa8x&\xa7\x0c\xf8\xb6\xdaN\x80:\x80\ \x9e\x9c8\xb1'\xf5[G\x15\x01\xd0\xbb\xc3\xdcqR\ \xc4\x1dH\xb1\x89\xee\x00\xf72b|=\xe2:\xdb\x05\ \xe8\x0e@\x8f\x97\x1bn\xa9h\xbb\xfa\x03\xdcI\xf8\x04\ \xb2\x0a\x17D\x94\x03\xf8\xe9\xad\xa7F\x1f\x89\x1b\x0e\xde\ C\x00@o\x08\xb8\xb2p\xa4p=$\x00\x00\xf8k\ \xcb \xd7\x96\xea>\x90j\x00\xd7\xd9\xaa\x10\xb8\xa4\x83\ F\xd2^H\x00\xa8\xb39\xcc\xfbf}\xd2\x19\x93\xf1\ \x11\x84\x05\x00r\xd4\x00\xa7\xd9f} \xc9w4)\ \x05\x98Q7\xd1\xa5h\xbd\xb9\xab\x00Z@\xf5\x00\xe4\ \x86\xec\xc7\x88\x96\xb8PJ>h\xa4\x08\xa1\x02`l\ \xfb\x89\xd5\xd6O\x8f\xcd\x89\x87\x11\xe5\xbc\x90\x01\xb0v\ \xbdd\xd74\xe9~\x93\xd8|\x9c\x84\xe1D\xc9?\x12\ +~>\xd7\xfb\xfd\xa5\xbe7\xc8\x8b\xabg\x0a\xeeh\ S\x0e\xe03w\x108\xa5\xce\xf8GQX\x0e\xbe\xe6\ )\x116E\x15\xb7\xb3(\x07\x00\xbf\xcc\xb3\x9f\xdaI\ \xa5\x93\x8c \xd3\x8a\x92\xdbi\xd4\x030\xa6Hy\x93\ \xad\xe8\x96\xd6 \x00\xa0ko\x9d\xff\xcc+\x84\x18\x00\ ^3[\xe6\xbf\xac\xec\x8a\xca`\x00\xc0\xfb\x1c\xdb\xe6\ \xf5+\xbc\x94! \x00\x80\xe1\xe1\xc6\xa5\xffV\xe5\xdd\ \x5c\x81\x01\x00\xb4\x13\x9bd?~\xa1\xf6v\xc2\x00\x01\ `u+L`\xff\xad\xfar\xc6 \x01\x00\xbc\xb6\xd0\ q\x9a\xc9/K\x80H\x01\x00\xc0\xe0\x92\xf3HY\xa7\ \x1c\xc8}4\x81\x03\x00\xf8\xdf+\xccS\x06R\xa5^\ @\xb7\x12\xee\x00\x00\x00`\xda\xb9\xcc\x12z\xfd\xb1\xcc\ \xe5\xdd\x1b\x04\x96v\x04\x00\x00\xe0\xbfvo\xab\x85\x5c\ &\xe9\xd8\xb1\x98\x93<\xc8\xe6\xce\xaa\xcd\xc7i\xc0\xf7\ Q\xee\x10@\x8f\x84\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\ \x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\ \x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\x00\x08\x80\ \x00\x08`*\x80i\x09\x01\x10\x00\x01~\x01\x98\x9b\x10\ \x00\x01\x10\x00\x01\x8cN\xff\x00\xf3k\xd4\xa5uQ\x85\ 3\x00\x00\x00\x00IEND\xaeB`\x82\ " qt_resource_name = b"\ \x00\x06\ \x07\x03}\xc3\ \x00i\ \x00m\x00a\x00g\x00e\x00s\ \x00\x09\ \x0a\x84\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x001\x00.\x00p\x00n\x00g\ \x00\x09\ \x0a\x88\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x005\x00.\x00p\x00n\x00g\ \x00\x09\ \x0a\x87\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x004\x00.\x00p\x00n\x00g\ \x00\x09\ \x0a\x86\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x003\x00.\x00p\x00n\x00g\ \x00\x09\ \x0a\x85\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x002\x00.\x00p\x00n\x00g\ \x00\x09\ \x0a\x89\xa4\xa7\ \x00s\ \x00i\x00d\x00e\x006\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\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \x00\x00\x01e\xaf\x16\xd2\x95\ \x00\x00\x00r\x00\x00\x00\x00\x00\x01\x00\x00\x1a\x1c\ \x00\x00\x01e\xaf\x16\xd2\x95\ \x00\x00\x00Z\x00\x00\x00\x00\x00\x01\x00\x00\x11\x05\ \x00\x00\x01e\xaf\x16\xd2\x95\ \x00\x00\x00B\x00\x00\x00\x00\x00\x01\x00\x00\x0b\xc3\ \x00\x00\x01e\xaf\x16\xd2\x95\ \x00\x00\x00*\x00\x00\x00\x00\x00\x01\x00\x00\x04\x18\ \x00\x00\x01e\xaf\x16\xd2\x95\ \x00\x00\x00\x8a\x00\x00\x00\x00\x00\x01\x00\x00!\x08\ \x00\x00\x01e\xaf\x16\xd2\x95\ " 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() examples/quick/000077500000000000000000000000001376617013100140155ustar00rootroot00000000000000examples/quick/customitems/000077500000000000000000000000001376617013100163715ustar00rootroot00000000000000examples/quick/customitems/painteditem/000077500000000000000000000000001376617013100206745ustar00rootroot00000000000000examples/quick/customitems/painteditem/main.qml000066400000000000000000000073431376617013100223420ustar00rootroot00000000000000/**************************************************************************** ** ** 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 QtQuick 2.0 import TextBalloonPlugin 1.0 Item { height: 480 width: 320 //! [0] ListModel { id: balloonModel ListElement { balloonWidth: 200 } ListElement { balloonWidth: 120 } } ListView { anchors.bottom: controls.top anchors.bottomMargin: 2 anchors.top: parent.top id: balloonView delegate: TextBalloon { anchors.right: index % 2 == 0 ? undefined : parent.right height: 60 rightAligned: index % 2 == 0 ? false : true width: balloonWidth } model: balloonModel spacing: 5 width: parent.width } //! [0] //! [1] Rectangle { id: controls anchors.bottom: parent.bottom anchors.left: parent.left anchors.margins: 1 anchors.right: parent.right border.width: 2 color: "white" height: parent.height * 0.15 Text { anchors.centerIn: parent text: "Add another balloon" } MouseArea { anchors.fill: parent hoverEnabled: true onClicked: { balloonModel.append({ "balloonWidth": Math.floor( Math.random( ) * 200 + 100) }) balloonView.positionViewAtIndex(balloonView.count - 1, ListView.End) } onEntered: { parent.color = "#8ac953" } onExited: { parent.color = "white" } } } //! [1] } examples/quick/customitems/painteditem/painteditem.py000066400000000000000000000075151376617013100235610ustar00rootroot00000000000000############################################################################# ## ## 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.QtGui import QPainter, QBrush, QColor from PySide2.QtWidgets import QApplication from PySide2.QtQml import qmlRegisterType from PySide2.QtCore import QUrl, Property, Signal, Qt, QPointF from PySide2.QtQuick import QQuickPaintedItem, QQuickView class TextBalloon(QQuickPaintedItem): rightAlignedChanged = Signal() def __init__(self, parent=None): self._rightAligned = False super().__init__(parent) @Property(bool, notify=rightAlignedChanged) def rightAligned(self): return self._rightAligned @rightAligned.setter def rightAlignedSet(self, value): self._rightAligned = value self.rightAlignedChanged.emit() def paint(self, painter: QPainter): brush = QBrush(QColor("#007430")) painter.setBrush(brush) painter.setPen(Qt.NoPen) painter.setRenderHint(QPainter.Antialiasing) itemSize = self.size() painter.drawRoundedRect(0, 0, itemSize.width(), itemSize.height() - 10, 10, 10) if self.rightAligned: points = [ QPointF(itemSize.width() - 10.0, itemSize.height() - 10.0), QPointF(itemSize.width() - 20.0, itemSize.height()), QPointF(itemSize.width() - 30.0, itemSize.height() - 10.0), ] else: points = [ QPointF(10.0, itemSize.height() - 10.0), QPointF(20.0, itemSize.height()), QPointF(30.0, itemSize.height() - 10.0), ] painter.drawConvexPolygon(points) if __name__ == "__main__": app = QApplication(sys.argv) view = QQuickView() view.setResizeMode(QQuickView.SizeRootObjectToView) qmlRegisterType(TextBalloon, "TextBalloonPlugin", 1, 0, "TextBalloon") view.setSource(QUrl.fromLocalFile("main.qml")) if view.status() == QQuickView.Error: sys.exit(-1) view.show() sys.exit(app.exec_()) examples/quick/customitems/painteditem/painteditem.pyproject000066400000000000000000000000671376617013100251430ustar00rootroot00000000000000{ "files": ["main.qml", "painteditem.pyproject"] } examples/remoteobjects/000077500000000000000000000000001376617013100155465ustar00rootroot00000000000000examples/remoteobjects/modelview/000077500000000000000000000000001376617013100175415ustar00rootroot00000000000000examples/remoteobjects/modelview/modelview.pyproject000066400000000000000000000000761376617013100235000ustar00rootroot00000000000000{ "files": ["modelviewserver.py", "modelviewclient.py"] } examples/remoteobjects/modelview/modelviewclient.py000066400000000000000000000050401376617013100233040ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Ford Motor Company ## 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$ ## ############################################################################# """PySide2 port of the remoteobjects/modelviewclient example from Qt v5.x""" import sys from PySide2.QtCore import QUrl from PySide2.QtWidgets import (QApplication, QTreeView) from PySide2.QtRemoteObjects import QRemoteObjectNode if __name__ == '__main__': app = QApplication(sys.argv) node = QRemoteObjectNode(QUrl("local:registry")) node.setHeartbeatInterval(1000) view = QTreeView() view.setWindowTitle("RemoteView") view.resize(640,480) model = node.acquireModel("RemoteModel") view.setModel(model) view.show() sys.exit(app.exec_()) examples/remoteobjects/modelview/modelviewserver.py000066400000000000000000000125731376617013100233450ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Ford Motor Company ## 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$ ## ############################################################################# """PySide2 port of the remoteobjects/modelviewserver example from Qt v5.x""" import sys from PySide2.QtCore import (Qt, QByteArray, QModelIndex, QObject, QTimer, QUrl) from PySide2.QtGui import (QColor, QStandardItemModel, QStandardItem) from PySide2.QtWidgets import (QApplication, QTreeView) from PySide2.QtRemoteObjects import QRemoteObjectHost, QRemoteObjectRegistryHost class TimerHandler(QObject): def __init__(self, model): super(TimerHandler, self).__init__() self._model = model def change_data(self): for i in range(10, 50): self._model.setData(self._model.index(i, 1), QColor(Qt.blue), Qt.BackgroundRole) def insert_data(self): self._model.insertRows(2, 9) for i in range(2, 11): self._model.setData(self._model.index(i, 1), QColor(Qt.green), Qt.BackgroundRole) self._model.setData(self._model.index(i, 1), "InsertedRow", Qt.DisplayRole) def remove_data(self): self._model.removeRows(2, 4) def change_flags(self): item = self._model.item(0, 0) item.setEnabled(False) item = item.child(0, 0) item.setFlags(item.flags() & Qt.ItemIsSelectable) def move_data(self): self._model.moveRows(QModelIndex(), 2, 4, QModelIndex(), 10) def add_child(num_children, nesting_level): result = [] if nesting_level == 0: return result for i in range(num_children): child = QStandardItem("Child num {}, nesting Level {}".format(i + 1, nesting_level)) if i == 0: child.appendRow(add_child(num_children, nesting_level -1)) result.append(child) return result if __name__ == '__main__': app = QApplication(sys.argv) model_size = 100000 list = [] source_model = QStandardItemModel() horizontal_header_list = ["First Column with spacing", "Second Column with spacing"] source_model.setHorizontalHeaderLabels(horizontal_header_list) for i in range(model_size): first_item = QStandardItem("FancyTextNumber {}".format(i)) if i == 0: first_item.appendRow(add_child(2, 2)) second_item = QStandardItem("FancyRow2TextNumber {}".format(i)) if i % 2 == 0: first_item.setBackground(Qt.red) row = [first_item, second_item] source_model.invisibleRootItem().appendRow(row) list.append("FancyTextNumber {}".format(i)) # Needed by QMLModelViewClient role_names = { Qt.DisplayRole : QByteArray(b'_text'), Qt.BackgroundRole : QByteArray(b'_color') } source_model.setItemRoleNames(role_names) roles = [Qt.DisplayRole, Qt.BackgroundRole] print("Creating registry host") node = QRemoteObjectRegistryHost(QUrl("local:registry")) node2 = QRemoteObjectHost(QUrl("local:replica"), QUrl("local:registry")) node2.enableRemoting(source_model, "RemoteModel", roles) view = QTreeView() view.setWindowTitle("SourceView") view.setModel(source_model) view.show() handler = TimerHandler(source_model) QTimer.singleShot(5000, handler.change_data) QTimer.singleShot(10000, handler.insert_data) QTimer.singleShot(11000, handler.change_flags) QTimer.singleShot(12000, handler.remove_data) QTimer.singleShot(13000, handler.move_data) sys.exit(app.exec_()) examples/samplebinding/000077500000000000000000000000001376617013100155155ustar00rootroot00000000000000examples/samplebinding/CMakeLists.txt000066400000000000000000000244221376617013100202610ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) cmake_policy(VERSION 3.1) # Enable policy to not use RPATH settings for install_name on macOS. if(POLICY CMP0068) cmake_policy(SET CMP0068 NEW) endif() # Consider changing the project name to something relevant for you. project(SampleBinding) # ================================ General configuration ====================================== # Set CPP standard to C++11 minimum. set(CMAKE_CXX_STANDARD 11) # The sample library for which we will create bindings. You can change the name to something # relevant for your project. set(sample_library "libuniverse") # The name of the generated bindings module (as imported in Python). You can change the name # to something relevant for your project. set(bindings_library "Universe") # The header file with all the types and functions for which bindings will be generated. # Usually it simply includes other headers of the library you are creating bindings for. set(wrapped_header ${CMAKE_SOURCE_DIR}/bindings.h) # The typesystem xml file which defines the relationships between the C++ types / functions # and the corresponding Python equivalents. set(typesystem_file ${CMAKE_SOURCE_DIR}/bindings.xml) # Specify which C++ files will be generated by shiboken. This includes the module wrapper # and a '.cpp' file per C++ type. These are needed for generating the module shared # library. set(generated_sources ${CMAKE_CURRENT_BINARY_DIR}/${bindings_library}/universe_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${bindings_library}/icecream_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${bindings_library}/truck_wrapper.cpp) # ================================== Shiboken detection ====================================== # Use provided python interpreter if given. if(NOT python_interpreter) find_program(python_interpreter "python") endif() message(STATUS "Using python interpreter: ${python_interpreter}") # Macro to get various pyside / python include / link flags and paths. # Uses the not entirely supported utils/pyside2_config.py file. macro(pyside2_config option output_var) if(${ARGC} GREATER 2) set(is_list ${ARGV2}) else() set(is_list "") endif() execute_process( COMMAND ${python_interpreter} "${CMAKE_SOURCE_DIR}/../utils/pyside2_config.py" ${option} OUTPUT_VARIABLE ${output_var} OUTPUT_STRIP_TRAILING_WHITESPACE) if ("${${output_var}}" STREQUAL "") message(FATAL_ERROR "Error: Calling pyside2_config.py ${option} returned no output.") endif() if(is_list) string (REPLACE " " ";" ${output_var} "${${output_var}}") endif() endmacro() # Query for the shiboken generator path, Python path, include paths and linker flags. pyside2_config(--shiboken2-module-path shiboken2_module_path) pyside2_config(--shiboken2-generator-path shiboken2_generator_path) pyside2_config(--python-include-path python_include_dir) pyside2_config(--shiboken2-generator-include-path shiboken_include_dir 1) pyside2_config(--shiboken2-module-shared-libraries-cmake shiboken_shared_libraries 0) pyside2_config(--python-link-flags-cmake python_linking_data 0) set(shiboken_path "${shiboken2_generator_path}/shiboken2${CMAKE_EXECUTABLE_SUFFIX}") if(NOT EXISTS ${shiboken_path}) message(FATAL_ERROR "Shiboken executable not found at path: ${shiboken_path}") endif() # ==================================== RPATH configuration ==================================== # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly with some custom script or tool). # ============================================================================================= # Enable rpaths so that the built shared libraries find their dependencies. set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH ${shiboken2_module_path} ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # ============================================================================================= # !!! End of dubious section. # ============================================================================================= # =============================== CMake target - sample_library =============================== # Define the sample shared library for which we will create bindings. set(${sample_library}_sources icecream.cpp truck.cpp) add_library(${sample_library} SHARED ${${sample_library}_sources}) set_property(TARGET ${sample_library} PROPERTY PREFIX "") # Needed mostly on Windows to export symbols, and create a .lib file, otherwise the binding # library can't link to the sample library. target_compile_definitions(${sample_library} PRIVATE BINDINGS_BUILD) # ====================== Shiboken target for generating binding C++ files ==================== # Set up the options to pass to shiboken. set(shiboken_options --generator-set=shiboken --enable-parent-ctor-heuristic --enable-return-value-heuristic --use-isnull-as-nb_nonzero --avoid-protected-hack -I${CMAKE_SOURCE_DIR} -T${CMAKE_SOURCE_DIR} --output-directory=${CMAKE_CURRENT_BINARY_DIR} ) set(generated_sources_dependencies ${wrapped_header} ${typesystem_file}) # Add custom target to run shiboken to generate the binding cpp files. add_custom_command(OUTPUT ${generated_sources} COMMAND ${shiboken_path} ${shiboken_options} ${wrapped_header} ${typesystem_file} DEPENDS ${generated_sources_dependencies} IMPLICIT_DEPENDS CXX ${wrapped_header} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Running generator for ${typesystem_file}.") # =============================== CMake target - bindings_library ============================= # Set the cpp files which will be used for the bindings library. set(${bindings_library}_sources ${generated_sources}) # Define and build the bindings library. add_library(${bindings_library} MODULE ${${bindings_library}_sources}) # Apply relevant include and link flags. target_include_directories(${bindings_library} PRIVATE ${python_include_dir}) target_include_directories(${bindings_library} PRIVATE ${shiboken_include_dir}) target_include_directories(${bindings_library} PRIVATE ${CMAKE_SOURCE_DIR}) target_link_libraries(${bindings_library} PRIVATE ${shiboken_shared_libraries}) target_link_libraries(${bindings_library} PRIVATE ${sample_library}) # Adjust the name of generated module. set_property(TARGET ${bindings_library} PROPERTY PREFIX "") set_property(TARGET ${bindings_library} PROPERTY OUTPUT_NAME "${bindings_library}${PYTHON_EXTENSION_SUFFIX}") if(WIN32) set_property(TARGET ${bindings_library} PROPERTY SUFFIX ".pyd") endif() # Make sure the linker doesn't complain about not finding Python symbols on macOS. if(APPLE) set_target_properties(${bindings_library} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") endif(APPLE) # Find and link to the python import library only on Windows. # On Linux and macOS, the undefined symbols will get resolved by the dynamic linker # (the symbols will be picked up in the Python executable). if (WIN32) list(GET python_linking_data 0 python_libdir) list(GET python_linking_data 1 python_lib) find_library(python_link_flags ${python_lib} PATHS ${python_libdir} HINTS ${python_libdir}) target_link_libraries(${bindings_library} PRIVATE ${python_link_flags}) endif() # ================================= Dubious deployment section ================================ set(windows_shiboken_shared_libraries) if(WIN32) # ========================================================================================= # !!! (The section below is deployment related, so in a real world application you will # want to take care of this properly (this is simply to eliminate errors that users usually # encounter. # ========================================================================================= # Circumvent some "#pragma comment(lib)"s in "include/pyconfig.h" which might force to link # against a wrong python shared library. set(python_versions_list 3 32 33 34 35 36 37 38) set(python_additional_link_flags "") foreach(ver ${python_versions_list}) set(python_additional_link_flags "${python_additional_link_flags} /NODEFAULTLIB:\"python${ver}_d.lib\"") set(python_additional_link_flags "${python_additional_link_flags} /NODEFAULTLIB:\"python${ver}.lib\"") endforeach() set_target_properties(${bindings_library} PROPERTIES LINK_FLAGS "${python_additional_link_flags}") # Compile a list of shiboken shared libraries to be installed, so that # the user doesn't have to set the PATH manually to point to the PySide2 package. foreach(library_path ${shiboken_shared_libraries}) string(REGEX REPLACE ".lib$" ".dll" library_path ${library_path}) file(TO_CMAKE_PATH ${library_path} library_path) list(APPEND windows_shiboken_shared_libraries "${library_path}") endforeach() # ========================================================================================= # !!! End of dubious section. # ========================================================================================= endif() # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly with some custom script or tool). # ============================================================================================= # Install the library and the bindings module into the source folder near the main.py file, so # that the Python interpeter successfully imports the used module. install(TARGETS ${bindings_library} ${sample_library} LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR} RUNTIME DESTINATION ${CMAKE_CURRENT_SOURCE_DIR} ) install(FILES ${windows_shiboken_shared_libraries} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}) # ============================================================================================= # !!! End of dubious section. # ============================================================================================= examples/samplebinding/README.md000066400000000000000000000175031376617013100170020ustar00rootroot00000000000000# Sample bindings example This example showcases how to generate Python bindings for a non-Qt C++ library. The example defines a CMake project that builds two libraries: * `libuniverse` - a sample library with two C++ classes. * `Universe` - the generated Python extension module that contains bindings to the library above. The project file is structured in such a way that a user can copy-paste in into their own project, and be able to build it with a minimal amount of modifications. ## Description The libuniverse library declares two classes: `Icecream` and `Truck`. `Icecream` objects have a flavor, and an accessor for returning the flavor. `Truck` instances store a vector of `Icecream` objects, and have various methods for adding new flavors, printing available flavors, delivering icecream, etc. From a C++ perspective, `Icecream` instances are treated as **object types** (pointer semantics) because the class declares virtual methods. In contrast `Truck` does not define virtual methods and is treated as a **value type** (copy semantics). Because `Truck` is a value type and it stores a vector of `Icecream` pointers, the rule of three has to be taken into account (implement the copy constructor, assignment operator, destructor). And due to `Icecream` objects being copyable, the type has to define an implementation of the *clone()* method, to avoid type slicing issues. Both of these types and their methods will be exposed to Python by generating CPython code. The code is generated by **shiboken** and placed in separate ".cpp" files named after each C++ type. The code is then compiled and linked into a shared library. The shared library is a CPython extension module, which is loaded by the Python interpreter. Beacuse the C++ language has different semantics to Python, shiboken needs help in figuring out how to generate the bindings code. This is done by specifying a special XML file called a typesystem file. In the typesystem file you specify things like: * which C++ primitive types should have bindings (int, bool, float) * which C++ classes should have bindings (Icecream) and what kind of semantics (value / object) * Ownership rules (who deletes the C++ objects, C++ or Python) * Code injection (for various special cases that shiboken doesn't know about) * Package name (name of package as imported from Python) In this example we declare `bool` and `std::string` as primitive types, `Icecream` as an object type, `Truck` as a value type, and the `clone()` and `addIcecreamFlavor(Icecream*)` need additional info about who owns the parameter objects when passing them across language boundaries (in this case C++ will delete the objects). The `Truck` has getters and setters for the string `arrivalMessage`. In the type system file, we declare this to be a property in Python: ``` ``` It can then be used in a more pythonic way: ``` special_truck.arrivalMessage = "A new SPECIAL icecream truck has arrived!\n" ``` After shiboken generates the C++ code and CMake makes an extension module from the code, the types can be accessed in Python simply by importing them using the original C++ names. ``` from Universe import Icecream, Truck ``` Constructing C++ wrapped objects is the same as in Python ``` icecream = Icecream("vanilla") truck = Truck() ``` And actual C++ constructors are mapped to the Python `__init__` method. ``` class VanillaChocolateIcecream(Icecream): def __init__(self, flavor=""): super(VanillaChocolateIcecream, self).__init__(flavor) ``` C++ methods can be accessed as regular Python methods using the C++ names ``` truck.addIcecreamFlavor(icecream) ``` Inheritance works as with regular Python classes, and virtual C++ methods can be overridden simply by definining a method with the same name as in the C++ class. ``` class VanillaChocolateIcecream(Icecream): # ... def getFlavor(self): return "vanilla sprinked with chocolate" ``` The `main.py` script demonstrates usages of these types. The CMake project file contains many comments explaining all the build rules for those interested in the build process. ## Building the project This example can only be built using **CMake**. The following requirements need to be met: * A PySide2 package is installed into the current active Python environment (system or virtualenv) * A new enough version of CMake (**3.1+**). For Windows you will also need: * a Visual Studio environment to be active in your terminal * Correct visual studio architecture chosen (32 vs 64 bit) * Make sure that your Python intepreter and bindings project build configuration is the same (all Release, which is more likely, or all Debug). The build uses the `pyside2_config.py` file to configure the project using the current PySide2/Shiboken2 installation. ### Using CMake You can build and run this example by executing the following commands (slightly adapted to your file system layout) in a terminal: On macOS/Linux: ```bash cd ~/pyside-setup/examples/samplebinding mkdir build cd build cmake -H.. -B. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release make make install python ../main.py ``` On Windows: ```bash cd C:\pyside-setup\examples\samplebinding mkdir build cd build cmake -H.. -B. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release # or if you have jom available # cmake -H.. -B. -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release nmake # or jom nmake install # or jom install python ..\main.py ``` #### Windows troubleshooting It is possible that **CMake** can pick up the wrong compiler for a different architecture, but it can be addressed explicitly using the -G option: ```bash cmake -H.. -B. -G "Visual Studio 14 Win64" ``` If the `-G "Visual Studio 14 Win64"` option is used, a `sln` file will be generated, and can be used with `MSBuild` instead of `nmake/jom`. The easiest way to both build and install in this case, is to use the cmake executable: ```bash cmake --build . --target install --config Release ``` Note that using the "NMake Makefiles JOM" generator is preferred to the MSBuild one, because the MSBuild one generates configs for both Debug and Release, and this might lead to building errors if you accidentally build the wrong config at least once. ## Virtualenv Support If the python application is started from a terminal with an activated python virtual environment, that environment's packages will be used for the python module import process. In this case, make sure that the bindings were built while the `virtualenv` was active, so that the build system picks up the correct python shared library and PySide2 / shiboken package. ## Linux Shared Libraries Notes For this example's purpose, we link against the absolute path of the dependent shared library `libshiboken` because the installation of the library is done via a wheel, and there is no clean solution to include symbolic links in a wheel package (so that passing -lshiboken to the linker would work). ## Windows Notes The build config of the bindings (Debug or Release) should match the PySide2 build config, otherwise the application will not properly work. In practice this means the only supported configurations are: 1. release config build of the bindings + PySide2 `setup.py` without `--debug` flag + `python.exe` for the PySide2 build process + `python36.dll` for the linked in shared library. 2. debug config build of the application + PySide2 `setup.py` **with** `--debug` flag + `python_d.exe` for the PySide2 build process + `python36_d.dll` for the linked in shared library. This is necessary because all the shared libraries in question have to link to the same C++ runtime library (`msvcrt.dll` or `msvcrtd.dll`). To make the example as self-contained as possible, the shared libraries in use (`pyside2.dll`, `shiboken2.dll`) are hard-linked into the build folder of the application. examples/samplebinding/bindings.h000066400000000000000000000050131376617013100174620ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef BINDINGS_H #define BINDINGS_H #include "icecream.h" #include "truck.h" #endif // BINDINGS_H examples/samplebinding/bindings.xml000066400000000000000000000070141376617013100200360ustar00rootroot00000000000000 examples/samplebinding/icecream.cpp000066400000000000000000000052351376617013100177760ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include "icecream.h" Icecream::Icecream(const std::string &flavor) : m_flavor(flavor) {} Icecream::~Icecream() {} const std::string Icecream::getFlavor() { return m_flavor; } Icecream *Icecream::clone() { return new Icecream(*this); } examples/samplebinding/icecream.h000066400000000000000000000053441376617013100174440ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef ICECREAM_H #define ICECREAM_H #include #include "macros.h" class BINDINGS_API Icecream { public: Icecream(const std::string &flavor); virtual Icecream *clone(); virtual ~Icecream(); virtual const std::string getFlavor(); private: std::string m_flavor; }; #endif // ICECREAM_H examples/samplebinding/macros.h000066400000000000000000000056451376617013100171640ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef MACROS_H #define MACROS_H #if defined _WIN32 || defined __CYGWIN__ // Export symbols when creating .dll and .lib, and import them when using .lib. #if BINDINGS_BUILD #define BINDINGS_API __declspec(dllexport) #else #define BINDINGS_API __declspec(dllimport) #endif // Disable warnings about exporting STL types being a bad idea. Don't use this in production // code. #pragma warning( disable : 4251 ) #else #define BINDINGS_API #endif #endif // MACROS_H examples/samplebinding/main.py000066400000000000000000000074351376617013100170240ustar00rootroot00000000000000 ############################################################################ ## ## Copyright (C) 2018 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 print_function """An example showcasing how to use bindings for a custom non-Qt C++ library""" from Universe import Icecream, Truck class VanillaChocolateIcecream(Icecream): def __init__(self, flavor=""): super(VanillaChocolateIcecream, self).__init__(flavor) def clone(self): return VanillaChocolateIcecream(self.getFlavor()) def getFlavor(self): return "vanilla sprinked with chocolate" class VanillaChocolateCherryIcecream(VanillaChocolateIcecream): def __init__(self, flavor=""): super(VanillaChocolateIcecream, self).__init__(flavor) def clone(self): return VanillaChocolateCherryIcecream(self.getFlavor()) def getFlavor(self): base_flavor = super(VanillaChocolateCherryIcecream, self).getFlavor() return base_flavor + " and a cherry" if __name__ == '__main__': leave_on_destruction = True truck = Truck(leave_on_destruction) flavors = ["vanilla", "chocolate", "strawberry"] for f in flavors: icecream = Icecream(f) truck.addIcecreamFlavor(icecream) truck.addIcecreamFlavor(VanillaChocolateIcecream()) truck.addIcecreamFlavor(VanillaChocolateCherryIcecream()) truck.arrive() truck.printAvailableFlavors() result = truck.deliver() if result: print("All the kids got some icecream!") else: print("Aww, someone didn't get the flavor they wanted...") if not result: special_truck = Truck(truck) del truck print("") special_truck.arrivalMessage = "A new SPECIAL icecream truck has arrived!\n" special_truck.arrive() special_truck.addIcecreamFlavor(Icecream("SPECIAL *magical* icecream")) special_truck.printAvailableFlavors() special_truck.deliver() print("Now everyone got the flavor they wanted!") special_truck.leave() examples/samplebinding/truck.cpp000066400000000000000000000103601376617013100173510ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include #include #include "truck.h" Truck::Truck(bool leaveOnDestruction) : m_leaveOnDestruction(leaveOnDestruction) {} Truck::Truck(const Truck &other) { for (size_t i = 0; i < other.m_flavors.size(); ++i) { addIcecreamFlavor(other.m_flavors[i]->clone()); } } Truck &Truck::operator=(const Truck &other) { if (this != &other) { clearFlavors(); for (size_t i = 0; i < other.m_flavors.size(); ++i) { addIcecreamFlavor(other.m_flavors[i]->clone()); } } return *this; } Truck::~Truck() { if (m_leaveOnDestruction) leave(); clearFlavors(); } void Truck::addIcecreamFlavor(Icecream *icecream) { m_flavors.push_back(icecream); } void Truck::printAvailableFlavors() const { std::cout << "It sells the following flavors: \n"; for (size_t i = 0; i < m_flavors.size(); ++ i) { std::cout << " * " << m_flavors[i]->getFlavor() << '\n'; } std::cout << '\n'; } void Truck::arrive() const { std::cout << m_arrivalMessage; } void Truck::leave() const { std::cout << "The truck left the neighborhood.\n"; } void Truck::setLeaveOnDestruction(bool value) { m_leaveOnDestruction = value; } void Truck::setArrivalMessage(const std::string &message) { m_arrivalMessage = message; } std::string Truck::getArrivalMessage() const { return m_arrivalMessage; } bool Truck::deliver() const { std::random_device rd; std::mt19937 mt(rd()); std::uniform_int_distribution dist(1, 2); std::cout << "The truck started delivering icecream to all the kids in the neighborhood.\n"; bool result = false; if (dist(mt) == 2) result = true; return result; } void Truck::clearFlavors() { for (size_t i = 0; i < m_flavors.size(); ++i) { delete m_flavors[i]; } m_flavors.clear(); } examples/samplebinding/truck.h000066400000000000000000000062621376617013100170240ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef TRUCK_H #define TRUCK_H #include #include "icecream.h" #include "macros.h" class BINDINGS_API Truck { public: Truck(bool leaveOnDestruction = false); Truck(const Truck &other); Truck& operator=(const Truck &other); ~Truck(); void addIcecreamFlavor(Icecream *icecream); void printAvailableFlavors() const; bool deliver() const; void arrive() const; void leave() const; void setLeaveOnDestruction(bool value); void setArrivalMessage(const std::string &message); std::string getArrivalMessage() const; private: void clearFlavors(); bool m_leaveOnDestruction = false; std::string m_arrivalMessage = "A new icecream truck has arrived!\n"; std::vector m_flavors; }; #endif // TRUCK_H examples/script/000077500000000000000000000000001376617013100142055ustar00rootroot00000000000000examples/script/README.md000066400000000000000000000005211376617013100154620ustar00rootroot00000000000000# About QtScript The QtScript module is deprecated since Qt 5.5, and hence is not being distributed through our wheels. However, it is possible to access the module when using a local build of PySide2 which was built against a Qt installation containing the Qt Script module (ALL_OPTIONAL_MODULES in `sources/pyside2/CMakeLists.txt`). examples/script/helloscript.py000066400000000000000000000046541376617013100171200ustar00rootroot00000000000000 ############################################################################# ## ## 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 script/helloscript example from Qt v5.x""" import sys from PySide2 import QtWidgets, QtScript app = QtWidgets.QApplication(sys.argv) engine = QtScript.QScriptEngine() button = QtWidgets.QPushButton() scriptButton = engine.newQObject(button) engine.globalObject().setProperty("button", scriptButton) engine.evaluate("button.text = 'Hello World from PySide2!'") engine.evaluate("button.styleSheet = 'font-style: italic'") engine.evaluate("button.show()") sys.exit(app.exec_()) examples/script/script.pyproject000066400000000000000000000000611376617013100174470ustar00rootroot00000000000000{ "files": ["README.md", "helloscript.py"] } examples/scriptableapplication/000077500000000000000000000000001376617013100172555ustar00rootroot00000000000000examples/scriptableapplication/CMakeLists.txt000066400000000000000000000225331376617013100220220ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) cmake_policy(VERSION 3.1) # Enable policy to run automoc on generated files. if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() project(scriptableapplication) # Set CPP standard to C++11 minimum. set(CMAKE_CXX_STANDARD 11) # Find required Qt packages. find_package(Qt5 5.12 REQUIRED COMPONENTS Core Gui Widgets) # Use provided python interpreter if given. if(NOT python_interpreter) find_program(python_interpreter "python") endif() message(STATUS "Using python interpreter: ${python_interpreter}") # Macro to get various pyside / python include / link flags. macro(pyside2_config option output_var) if(${ARGC} GREATER 2) set(is_list ${ARGV2}) else() set(is_list "") endif() execute_process( COMMAND ${python_interpreter} "${CMAKE_SOURCE_DIR}/../utils/pyside2_config.py" ${option} OUTPUT_VARIABLE ${output_var} OUTPUT_STRIP_TRAILING_WHITESPACE) if ("${${output_var}}" STREQUAL "") message(FATAL_ERROR "Error: Calling pyside2_config.py ${option} returned no output.") endif() if(is_list) string (REPLACE " " ";" ${output_var} "${${output_var}}") endif() endmacro() # Query for the shiboken2-generator path, PySide2 path, Python path, include paths and linker flags. pyside2_config(--shiboken2-module-path SHIBOKEN2_MODULE_PATH) pyside2_config(--shiboken2-generator-path SHIBOKEN2_GENERATOR_PATH) pyside2_config(--pyside2-path PYSIDE2_PATH) pyside2_config(--python-include-path PYTHON_INCLUDE_DIR) pyside2_config(--shiboken2-generator-include-path SHIBOKEN2_GENERATOR_INCLUDE_DIR 1) pyside2_config(--pyside2-include-path PYSIDE2_INCLUDE_DIR 1) pyside2_config(--python-link-flags-cmake PYTHON_LINKING_DATA 0) pyside2_config(--shiboken2-module-shared-libraries-cmake SHIBOKEN2_MODULE_SHARED_LIBRARIES 0) pyside2_config(--pyside2-shared-libraries-cmake PYSIDE2_SHARED_LIBRARIES 0) set(SHIBOKEN_PATH "${SHIBOKEN2_GENERATOR_PATH}/shiboken2${CMAKE_EXECUTABLE_SUFFIX}") if(NOT EXISTS ${SHIBOKEN_PATH}) message(FATAL_ERROR "Shiboken executable not found at path: ${SHIBOKEN_PATH}") endif() # Get all relevant Qt include dirs, to pass them on to shiboken. get_property(QT_CORE_INCLUDE_DIRS TARGET Qt5::Core PROPERTY INTERFACE_INCLUDE_DIRECTORIES) get_property(QT_GUI_INCLUDE_DIRS TARGET Qt5::Gui PROPERTY INTERFACE_INCLUDE_DIRECTORIES) get_property(QT_WIDGETS_INCLUDE_DIRS TARGET Qt5::Widgets PROPERTY INTERFACE_INCLUDE_DIRECTORIES) set(QT_INCLUDE_DIRS ${QT_CORE_INCLUDE_DIRS} ${QT_GUI_INCLUDE_DIRS} ${QT_WIDGETS_INCLUDE_DIRS}) set(INCLUDES "") foreach(INCLUDE_DIR ${QT_INCLUDE_DIRS}) list(APPEND INCLUDES "-I${INCLUDE_DIR}") endforeach() # On macOS, check if Qt is a framework build. This affects how include paths should be handled. get_target_property(QtCore_is_framework Qt5::Core FRAMEWORK) if (QtCore_is_framework) get_target_property(qt_core_library_location Qt5::Core LOCATION) get_filename_component(qt_core_library_location_dir "${qt_core_library_location}" DIRECTORY) get_filename_component(lib_dir "${qt_core_library_location_dir}/../" ABSOLUTE) list(APPEND INCLUDES "--framework-include-paths=${lib_dir}") endif() # Set up the options to pass to shiboken. set(WRAPPED_HEADER ${CMAKE_SOURCE_DIR}/wrappedclasses.h) set(TYPESYSTEM_FILE ${CMAKE_SOURCE_DIR}/scriptableapplication.xml) set(SHIBOKEN_OPTIONS --generator-set=shiboken --enable-parent-ctor-heuristic --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero --avoid-protected-hack ${INCLUDES} -I${CMAKE_SOURCE_DIR} -T${CMAKE_SOURCE_DIR} -T${PYSIDE2_PATH}/typesystems --output-directory=${CMAKE_CURRENT_BINARY_DIR} ) # Specify which sources will be generated by shiboken, and their dependencies. set(GENERATED_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/AppLib/applib_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/AppLib/mainwindow_wrapper.cpp) set(GENERATED_SOURCES_DEPENDENCIES ${WRAPPED_HEADER} ${TYPESYSTEM_FILE} ) # Add custom target to run shiboken. add_custom_command(OUTPUT ${GENERATED_SOURCES} COMMAND ${SHIBOKEN_PATH} ${SHIBOKEN_OPTIONS} ${WRAPPED_HEADER} ${TYPESYSTEM_FILE} DEPENDS ${GENERATED_SOURCES_DEPENDENCIES} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Running generator for ${TYPESYSTEM_FILE}.") # Set the CPP files. set(SOURCES mainwindow.cpp pythonutils.cpp ${GENERATED_SOURCES} ) # We need to include the headers for the module bindings that we use. set(PYSIDE2_ADDITIONAL_INCLUDES "") foreach(INCLUDE_DIR ${PYSIDE2_INCLUDE_DIR}) list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtCore") list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtGui") list(APPEND PYSIDE2_ADDITIONAL_INCLUDES "${INCLUDE_DIR}/QtWidgets") endforeach() # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly with some custom script or tool). # ============================================================================================= # Enable rpaths so that the example can be executed from the build dir. set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH ${PYSIDE2_PATH} ${SHIBOKEN2_MODULE_PATH}) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # ============================================================================================= # !!! End of dubious section. # ============================================================================================= # Declare executable so we can enable automoc. add_executable(${PROJECT_NAME} main.cpp) # Enable automoc. set_property(TARGET ${PROJECT_NAME} PROPERTY AUTOMOC 1) # Add the rest of the sources. target_sources(${PROJECT_NAME} PUBLIC ${SOURCES}) # Apply relevant include and link flags. target_include_directories(${PROJECT_NAME} PRIVATE ${PYTHON_INCLUDE_DIR}) target_include_directories(${PROJECT_NAME} PRIVATE ${SHIBOKEN2_GENERATOR_INCLUDE_DIR}) target_include_directories(${PROJECT_NAME} PRIVATE ${PYSIDE2_INCLUDE_DIR}) target_include_directories(${PROJECT_NAME} PRIVATE ${PYSIDE2_ADDITIONAL_INCLUDES}) target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_SOURCE_DIR}) target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Widgets) target_link_libraries(${PROJECT_NAME} PRIVATE ${SHIBOKEN2_MODULE_SHARED_LIBRARIES}) target_link_libraries(${PROJECT_NAME} PRIVATE ${PYSIDE2_SHARED_LIBRARIES}) # Find and link to the python library. list(GET PYTHON_LINKING_DATA 0 PYTHON_LIBDIR) list(GET PYTHON_LINKING_DATA 1 PYTHON_LIB) find_library(PYTHON_LINK_FLAGS ${PYTHON_LIB} PATHS ${PYTHON_LIBDIR} HINTS ${PYTHON_LIBDIR}) target_link_libraries(${PROJECT_NAME} PRIVATE ${PYTHON_LINK_FLAGS}) # Same as CONFIG += no_keywords to avoid syntax errors in object.h due to the usage of the word Slot target_compile_definitions(${PROJECT_NAME} PRIVATE QT_NO_KEYWORDS) if(WIN32) # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly (this is simply to eliminate errors that users usually encounter. # ============================================================================================= # Circumvent some "#pragma comment(lib)"s in "include/pyconfig.h" which might force to link # against a wrong python shared library. set(PYTHON_VERSIONS_LIST 3 32 33 34 35 36 37 38) set(PYTHON_ADDITIONAL_LINK_FLAGS "") foreach(VER ${PYTHON_VERSIONS_LIST}) set(PYTHON_ADDITIONAL_LINK_FLAGS "${PYTHON_ADDITIONAL_LINK_FLAGS} /NODEFAULTLIB:\"python${VER}_d.lib\"") set(PYTHON_ADDITIONAL_LINK_FLAGS "${PYTHON_ADDITIONAL_LINK_FLAGS} /NODEFAULTLIB:\"python${VER}.lib\"") endforeach() set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "${PYTHON_ADDITIONAL_LINK_FLAGS}") # Add custom target to hard link PySide2 shared libraries (just like in qmake example), so you # don't have to set PATH manually to point to the PySide2 package. set(shared_libraries ${SHIBOKEN2_MODULE_SHARED_LIBRARIES} ${PYSIDE2_SHARED_LIBRARIES}) foreach(LIBRARY_PATH ${shared_libraries}) string(REGEX REPLACE ".lib$" ".dll" LIBRARY_PATH ${LIBRARY_PATH}) get_filename_component(BASE_NAME ${LIBRARY_PATH} NAME) file(TO_NATIVE_PATH ${LIBRARY_PATH} SOURCE_PATH) file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${BASE_NAME}" DEST_PATH) add_custom_command(OUTPUT "${BASE_NAME}" COMMAND mklink /H "${DEST_PATH}" "${SOURCE_PATH}" DEPENDS ${LIBRARY_PATH} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Creating hardlink to PySide2 shared library ${BASE_NAME}") # Fake target that depends on the previous one, but has special ALL keyword, which means # it will always be executed. add_custom_target("fake_${BASE_NAME}" ALL DEPENDS ${BASE_NAME}) endforeach() # ============================================================================================= # !!! End of dubious section. # ============================================================================================= endif() examples/scriptableapplication/README.md000066400000000000000000000140051376617013100205340ustar00rootroot00000000000000# Scriptable Application This example demonstrates how to make a Qt C++ application scriptable. It has a class **MainWindow** (`mainwindow.{cpp,h}`) that inherits from *QMainWindow*, for which bindings are generated using Shiboken. The header `wrappedclasses.h` is passed to Shiboken which generates class wrappers and headers in a sub directory called **AppLib/** which are linked to the application. The files `pythonutils.{cpp,h}` contain some code which binds the instance of **MainWindow** to a variable called **'mainWindow'** in the global Python namespace (`__main___`). It is then possible to run Python script snippets like: ```python mainWindow.testFunction1() ``` which trigger the underlying C++ function. ## Building the project This example can be built using *CMake* or *QMake*, but there are common requirements that you need to take into consideration: * Make sure that a --standalone PySide2 package (bundled with Qt libraries) is installed into the current active Python environment (system or virtualenv) * qmake has to be in your PATH: * so that CMake find_package(Qt5) works (used for include headers), * used for building the application with qmake instead of CMake * use the same Qt version for building the example application, as was used for building PySide2, this is to ensure binary compatibility between the newly generated bindings libraries, the PySide2 libraries and the Qt libraries. For Windows you will also need: * a Visual Studio environment to be active in your terminal * Correct visual studio architecture chosen (32 vs 64 bit) * Make sure that your Qt + Python + PySide2 package + app build configuration is the same (all Release, which is more likely, or all Debug). * Make sure that your Qt + Python + PySide2 package + app are built with the same version of MSVC, to avoid mixing of C++ runtime libraries. In principle this means that if you use the python.org provided Python interpreters, you need to use MSVC2015 for Python 3 projects, and MSVC2008 for Python 2 projects. Which also means that you can't use official Qt packages, because none of the supported ones are built with MSVC2008. Both build options will use the `pyside2_config.py` file to configure the project using the current PySide2/Shiboken2 installation (for qmake via pyside2.pri, and for CMake via the project CMakeLists.txt). ### Using CMake To build this example with CMake you will need a recent version of CMake (3.1+). You can build this example by executing the following commands (slightly adapted to your file system layout) in a terminal: On macOS/Linux: ```bash cd ~/pyside-setup/examples/scriptableapplication mkdir build cd build cmake -H.. -B. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release make ./scriptableapplication ``` On Windows: ```bash cd C:\pyside-setup\examples\scriptableapplication mkdir build cd build cmake -H.. -B. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release # or if you have jom available # cmake -H.. -B. -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release nmake # or jom scriptableapplication.exe ``` ### Using QMake The file `scriptableapplication.pro` is the project file associated to the example when using qmake. You can build this example by executing: ```bash mkdir build cd build qmake .. make # or nmake / jom for Windows ``` #### Windows troubleshooting Using **qmake** should work out of the box, there was a known issue with directories and white spaces that is solved by using the "~1" character, so the path will change from: c:\Program Files\Python34\libs to c:\Progra~1\Python34\libs this will avoid the issues when the Makefiles are generated. It is possible when using **cmake** to pick up the wrong compiler for a different architecture, but it can be addressed explicitly using the -G option: ```bash cmake -H.. -B. -G "Visual Studio 14 Win64" -DCMAKE_BUILD_TYPE=Release ``` If the `-G "Visual Studio 14 Win64"` option is used, a `sln` file will be generated, and can be used with `MSBuild` instead of `nmake/jom`. ```bash MSBuild scriptableapplication.sln "/p:Configuration=Release" ``` Note that using the "NMake Makefiles JOM" generator is preferred to the MSBuild one, because in the latter case the executable is placed into a directory other than the one that contains the dependency dlls (shiboken, pyside). This leads to execution problems if the application is started within the Release subdirectory and not the one containing the dependencies. ## Virtualenv Support If the application is started from a terminal with an activated python virtual environment, that environment's packages will be used for the python module import process. In this case, make sure that the application was built while the `virtualenv` was active, so that the build system picks up the correct python shared library and PySide2 package. ## Linux Shared Libraries Notes For this example's purpose, we link against the absolute paths of the shared libraries (`libshiboken` and `libpyside`) because the installation of the modules is being done via wheels, and there is no clean solution to include symbolic links in the package (so that regular -lshiboken works). ## Windows Notes The build config of the application (Debug or Release) should match the PySide2 build config, otherwise the application will not properly work. In practice this means the only supported configurations are: 1. release config build of the application + PySide2 `setup.py` without `--debug` flag + `python.exe` for the PySide2 build process + `python36.dll` for the linked in shared library + release build of Qt. 2. debug config build of the application + PySide2 `setup.py` **with** `--debug` flag + `python_d.exe` for the PySide2 build process + `python36_d.dll` for the linked in shared library + debug build of Qt. This is necessary because all the shared libraries in question have to link to the same C++ runtime library (`msvcrt.dll` or `msvcrtd.dll`). To make the example as self-contained as possible, the shared libraries in use (`pyside2.dll`, `shiboken2.dll`) are hard-linked into the build folder of the application. examples/scriptableapplication/main.cpp000066400000000000000000000054331376617013100207120ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include "mainwindow.h" #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow mainWindow; const QRect availableGeometry = mainWindow.screen()->availableGeometry(); mainWindow.resize(availableGeometry.width() / 2, availableGeometry.height() / 2); mainWindow.show(); return a.exec(); } examples/scriptableapplication/mainwindow.cpp000066400000000000000000000132551376617013100221430ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include "mainwindow.h" #include "pythonutils.h" #include #include #include #include #include #include #include #include #include #include #include #include static const char defaultScript[] = R"( print("Hello, world") mainWindow.testFunction1() )"; MainWindow::MainWindow() : m_scriptEdit(new QPlainTextEdit(QString::fromLatin1(defaultScript).trimmed(), this)) { setWindowTitle(tr("Scriptable Application")); QMenu *fileMenu = menuBar()->addMenu(tr("&File")); const QIcon runIcon = QIcon::fromTheme(QStringLiteral("system-run")); QAction *runAction = fileMenu->addAction(runIcon, tr("&Run..."), this, &MainWindow::slotRunScript); runAction->setShortcut(Qt::CTRL | Qt::Key_R); QAction *diagnosticAction = fileMenu->addAction(tr("&Print Diagnostics"), this, &MainWindow::slotPrintDiagnostics); diagnosticAction->setShortcut(Qt::CTRL | Qt::Key_D); fileMenu->addAction(tr("&Invoke testFunction1()"), this, &MainWindow::testFunction1); const QIcon quitIcon = QIcon::fromTheme(QStringLiteral("application-exit")); QAction *quitAction = fileMenu->addAction(quitIcon, tr("&Quit"), qApp, &QCoreApplication::quit); quitAction->setShortcut(Qt::CTRL | Qt::Key_Q); QMenu *editMenu = menuBar()->addMenu(tr("&Edit")); const QIcon clearIcon = QIcon::fromTheme(QStringLiteral("edit-clear")); QAction *clearAction = editMenu->addAction(clearIcon, tr("&Clear"), m_scriptEdit, &QPlainTextEdit::clear); QMenu *helpMenu = menuBar()->addMenu(tr("&Help")); const QIcon aboutIcon = QIcon::fromTheme(QStringLiteral("help-about")); QAction *aboutAction = helpMenu->addAction(aboutIcon, tr("&About Qt"), qApp, &QApplication::aboutQt); QToolBar *toolBar = new QToolBar; addToolBar(toolBar); toolBar->addAction(quitAction); toolBar->addSeparator(); toolBar->addAction(clearAction); toolBar->addSeparator(); toolBar->addAction(runAction); toolBar->addSeparator(); toolBar->addAction(aboutAction); m_scriptEdit->setFont(QFontDatabase::systemFont(QFontDatabase::FixedFont)); setCentralWidget(m_scriptEdit); if (!PythonUtils::bindAppObject("__main__", "mainWindow", PythonUtils::MainWindowType, this)) statusBar()->showMessage(tr("Error loading the application module")); } void MainWindow::slotRunScript() { const QStringList script = m_scriptEdit->toPlainText().trimmed().split(QLatin1Char('\n'), Qt::SkipEmptyParts); if (!script.isEmpty()) runScript(script); } void MainWindow::slotPrintDiagnostics() { const QStringList script = QStringList() << "import sys" << "print('Path=', sys.path)" << "print('Executable=', sys.executable)"; runScript(script); } void MainWindow::runScript(const QStringList &script) { if (!::PythonUtils::runScript(script)) statusBar()->showMessage(tr("Error running script")); } void MainWindow::testFunction1() { static int n = 1; QString message; QTextStream(&message) << __FUNCTION__ << " called #" << n++; qDebug().noquote() << message; statusBar()->showMessage(message); } examples/scriptableapplication/mainwindow.h000066400000000000000000000054611376617013100216100ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef MAINWINDOW_H #define MAINWINDOW_H #include class QPlainTextEdit; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(); void testFunction1(); private Q_SLOTS: void slotRunScript(); void slotPrintDiagnostics(); private: void runScript(const QStringList &); QPlainTextEdit *m_scriptEdit; }; #endif // MAINWINDOW_H examples/scriptableapplication/pyside2.pri000066400000000000000000000050661376617013100213570ustar00rootroot00000000000000PYSIDE_CONFIG = $$PWD/../utils/pyside2_config.py # Use provided python interpreter if given. isEmpty(python_interpreter) { python_interpreter = python } message(Using python interpreter: $$python_interpreter) SHIBOKEN2_GENERATOR = $$system($$python_interpreter $$PYSIDE_CONFIG --shiboken2-generator-path) isEmpty(SHIBOKEN2_GENERATOR): error(Unable to locate the shiboken2-generator package location) SHIBOKEN2_MODULE = $$system($$python_interpreter $$PYSIDE_CONFIG --shiboken2-module-path) isEmpty(SHIBOKEN2_MODULE): error(Unable to locate the shiboken2 package location) PYSIDE2 = $$system($$python_interpreter $$PYSIDE_CONFIG --pyside2-path) isEmpty(PYSIDE2): error(Unable to locate the PySide2 package location) PYTHON_INCLUDE = $$system($$python_interpreter $$PYSIDE_CONFIG --python-include-path) isEmpty(PYTHON_INCLUDE): error(Unable to locate the Python include headers directory) PYTHON_LFLAGS = $$system($$python_interpreter $$PYSIDE_CONFIG --python-link-flags-qmake) isEmpty(PYTHON_LFLAGS): error(Unable to locate the Python library for linking) SHIBOKEN2_INCLUDE = $$system($$python_interpreter $$PYSIDE_CONFIG --shiboken2-generator-include-path) isEmpty(SHIBOKEN2_INCLUDE): error(Unable to locate the shiboken include headers directory) PYSIDE2_INCLUDE = $$system($$python_interpreter $$PYSIDE_CONFIG --pyside2-include-path) isEmpty(PYSIDE2_INCLUDE): error(Unable to locate the PySide2 include headers directory) SHIBOKEN2_LFLAGS = $$system($$python_interpreter $$PYSIDE_CONFIG --shiboken2-module-qmake-lflags) isEmpty(SHIBOKEN2_LFLAGS): error(Unable to locate the shiboken libraries for linking) PYSIDE2_LFLAGS = $$system($$python_interpreter $$PYSIDE_CONFIG --pyside2-qmake-lflags) isEmpty(PYSIDE2_LFLAGS): error(Unable to locate the PySide2 libraries for linking) SHIBOKEN2_SHARED_LIBRARIES = $$system($$python_interpreter $$PYSIDE_CONFIG --shiboken2-module-shared-libraries-qmake) isEmpty(SHIBOKEN2_SHARED_LIBRARIES): error(Unable to locate the used shiboken2 module shared libraries) PYSIDE2_SHARED_LIBRARIES = $$system($$python_interpreter $$PYSIDE_CONFIG --pyside2-shared-libraries-qmake) isEmpty(PYSIDE2_SHARED_LIBRARIES): error(Unable to locate the used PySide2 shared libraries) INCLUDEPATH += "$$PYTHON_INCLUDE" $$PYSIDE2_INCLUDE $$SHIBOKEN2_INCLUDE LIBS += $$PYTHON_LFLAGS $$PYSIDE2_LFLAGS $$SHIBOKEN2_LFLAGS !build_pass:message(INCLUDEPATH is $$INCLUDEPATH) !build_pass:message(LIBS are $$LIBS) !build_pass:message(Using $$PYSIDE2) !win32 { !build_pass:message(RPATH will include $$PYSIDE2 and $$SHIBOKEN2_MODULE) QMAKE_RPATHDIR += $$PYSIDE2 $$SHIBOKEN2_MODULE } examples/scriptableapplication/pythonutils.cpp000066400000000000000000000143321376617013100223660ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include "pythonutils.h" #include #include #include #include #include #include #include #include #include #include /* from AppLib bindings */ #if PY_MAJOR_VERSION >= 3 extern "C" PyObject *PyInit_AppLib(); #else extern "C" void initAppLib(); #endif // This variable stores all Python types exported by this module. extern PyTypeObject **SbkAppLibTypes; // This variable stores all type converters exported by this module. extern SbkConverter **SbkAppLibTypeConverters; namespace PythonUtils { static State state = PythonUninitialized; static void cleanup() { if (state > PythonUninitialized) { Py_Finalize(); state = PythonUninitialized; } } static const char virtualEnvVar[] = "VIRTUAL_ENV"; // If there is an active python virtual environment, use that environment's // packages location. static void initVirtualEnvironment() { QByteArray virtualEnvPath = qgetenv(virtualEnvVar); // As of Python 3.8, Python is no longer able to run stand-alone in a // virtualenv due to missing libraries. Add the path to the modules instead. if (QOperatingSystemVersion::currentType() == QOperatingSystemVersion::Windows && (PY_MAJOR_VERSION > 3 || (PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION >= 8))) { qputenv("PYTHONPATH", virtualEnvPath + "\\Lib\\site-packages"); } else { qputenv("PYTHONHOME", virtualEnvPath); } } State init() { if (state > PythonUninitialized) return state; if (qEnvironmentVariableIsSet(virtualEnvVar)) initVirtualEnvironment(); Py_Initialize(); qAddPostRoutine(cleanup); state = PythonInitialized; #if PY_MAJOR_VERSION >= 3 const bool pythonInitialized = PyInit_AppLib() != nullptr; #else const bool pythonInitialized = true; initAppLib(); #endif const bool pyErrorOccurred = PyErr_Occurred() != nullptr; if (pythonInitialized && !pyErrorOccurred) { state = AppModuleLoaded; } else { if (pyErrorOccurred) PyErr_Print(); qWarning("Failed to initialize the module."); } return state; } bool bindAppObject(const QString &moduleName, const QString &name, int index, QObject *o) { if (init() != AppModuleLoaded) return false; PyTypeObject *typeObject = SbkAppLibTypes[index]; PyObject *po = Shiboken::Conversions::pointerToPython(reinterpret_cast(typeObject), o); if (!po) { qWarning() << __FUNCTION__ << "Failed to create wrapper for" << o; return false; } Py_INCREF(po); PyObject *module = PyImport_AddModule(moduleName.toLocal8Bit().constData()); if (!module) { Py_DECREF(po); if (PyErr_Occurred()) PyErr_Print(); qWarning() << __FUNCTION__ << "Failed to locate module" << moduleName; return false; } if (PyModule_AddObject(module, name.toLocal8Bit().constData(), po) < 0) { if (PyErr_Occurred()) PyErr_Print(); qWarning() << __FUNCTION__ << "Failed add object" << name << "to" << moduleName; return false; } return true; } bool runScript(const QStringList &script) { if (init() == PythonUninitialized) return false; // Concatenating all the lines QString content; QTextStream ss(&content); for (const QString &line: script) ss << line << "\n"; // Executing the whole script as one line bool result = true; const QByteArray line = content.toUtf8(); if (PyRun_SimpleString(line.constData()) == -1) { if (PyErr_Occurred()) PyErr_Print(); result = false; } return result; } } // namespace PythonUtils examples/scriptableapplication/pythonutils.h000066400000000000000000000056241376617013100220370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef PYTHONUTILS_H #define PYTHONUTILS_H class QObject; class QString; class QStringList; namespace PythonUtils { enum AppLibTypes { MainWindowType = 0 // SBK_MAINWINDOW_IDX }; enum State { PythonUninitialized, PythonInitialized, AppModuleLoaded }; State init(); bool bindAppObject(const QString &moduleName, const QString &name, int index, QObject *o); bool runScript(const QStringList &script); } // namespace PythonUtils #endif // PYTHONUTILS_H examples/scriptableapplication/scriptableapplication.pro000066400000000000000000000064601376617013100243610ustar00rootroot00000000000000TEMPLATE = app CONFIG += no_keywords # avoid clash with slots in Python.h CONFIG += console force_debug_info QT += widgets include(pyside2.pri) WRAPPED_HEADER = wrappedclasses.h WRAPPER_DIR = $$OUT_PWD/AppLib TYPESYSTEM_FILE = scriptableapplication.xml QT_INCLUDEPATHS = -I"$$[QT_INSTALL_HEADERS]" -I"$$[QT_INSTALL_HEADERS]/QtCore" \ -I"$$[QT_INSTALL_HEADERS]/QtGui" -I"$$[QT_INSTALL_HEADERS]/QtWidgets" # On macOS, check if Qt is a framework build. This affects how include paths should be handled. qtConfig(framework): QT_INCLUDEPATHS += --framework-include-paths=$$[QT_INSTALL_LIBS] SHIBOKEN_OPTIONS = --generator-set=shiboken --enable-parent-ctor-heuristic \ --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero \ $$QT_INCLUDEPATHS -I$$PWD -T$$PWD -T$$PYSIDE2/typesystems --output-directory=$$OUT_PWD # MSVC does not honor #define protected public... win32:SHIBOKEN_OPTIONS += --avoid-protected-hack # Prepare the shiboken tool QT_TOOL.shiboken.binary = $$system_path($$SHIBOKEN2_GENERATOR/shiboken2) qtPrepareTool(SHIBOKEN, shiboken) # Shiboken run that adds the module wrapper to GENERATED_SOURCES shiboken.output = $$WRAPPER_DIR/applib_module_wrapper.cpp shiboken.commands = $$SHIBOKEN $$SHIBOKEN_OPTIONS $$PWD/wrappedclasses.h ${QMAKE_FILE_IN} shiboken.input = TYPESYSTEM_FILE shiboken.dependency_type = TYPE_C shiboken.variable_out = GENERATED_SOURCES # A dummy command that pretends to produce the class wrappers from the headers # depending on the module wrapper WRAPPED_CLASSES = mainwindow.h module_wrapper_dummy_command.output = $$WRAPPER_DIR/${QMAKE_FILE_BASE}_wrapper.cpp module_wrapper_dummy_command.commands = echo ${QMAKE_FILE_IN} module_wrapper_dummy_command.depends = $$WRAPPER_DIR/applib_module_wrapper.cpp module_wrapper_dummy_command.input = WRAPPED_CLASSES module_wrapper_dummy_command.dependency_type = TYPE_C module_wrapper_dummy_command.variable_out = GENERATED_SOURCES # Get the path component to the active config build folder defineReplace(getOutDir) { out_dir = $$OUT_PWD CONFIG(release, debug|release): out_dir = $$out_dir/release else:out_dir = $$out_dir/debug return($$out_dir) } # Create hardlinks to the PySide2 shared libraries, so the example can be executed without manually # setting the PATH. win32 { out_dir = $$getOutDir() # no_link tell not to link to the output files, target_predeps forces the command to actually # execute, explicit_dependencies is a magic value that tells qmake not to run the commands # if the output files already exist. hard_link_libraries.CONFIG = no_link target_predeps explicit_dependencies hard_link_libraries.output = $$out_dir/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT} hard_link_libraries.commands = mklink /H $$shell_path($$out_dir/${QMAKE_FILE_BASE}${QMAKE_FILE_EXT}) $$shell_path(${QMAKE_FILE_IN}) hard_link_libraries.input = PYSIDE2_SHARED_LIBRARIES SHIBOKEN2_SHARED_LIBRARIES } QMAKE_EXTRA_COMPILERS += shiboken module_wrapper_dummy_command win32:QMAKE_EXTRA_COMPILERS += hard_link_libraries INCLUDEPATH += $$WRAPPER_DIR for(i, PYSIDE2_INCLUDE) { INCLUDEPATH += $$i/QtWidgets $$i/QtGui $$i/QtCore } SOURCES += \ main.cpp \ mainwindow.cpp \ pythonutils.cpp HEADERS += \ mainwindow.h \ pythonutils.h OTHER_FILES += $$TYPESYSTEM_FILE $$WRAPPED_HEADER pyside2_config.py README.md examples/scriptableapplication/scriptableapplication.xml000066400000000000000000000051271376617013100243600ustar00rootroot00000000000000 examples/scriptableapplication/wrappedclasses.h000066400000000000000000000050141376617013100224460ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2017 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef WRAPPEDCLASSES_H #define WRAPPEDCLASSES_H #include #endif // WRAPPEDCLASSES_H examples/sql/000077500000000000000000000000001376617013100135005ustar00rootroot00000000000000examples/sql/books/000077500000000000000000000000001376617013100146155ustar00rootroot00000000000000examples/sql/books/bookdelegate.py000066400000000000000000000130651376617013100176210ustar00rootroot00000000000000############################################################################# ## ## 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 copy from PySide2.QtSql import QSqlRelationalDelegate from PySide2.QtWidgets import QSpinBox, QStyle from PySide2.QtGui import QPixmap, QPalette from PySide2.QtCore import QEvent, QSize, Qt class BookDelegate(QSqlRelationalDelegate): """Books delegate to rate the books""" def __init__(self, parent=None): QSqlRelationalDelegate.__init__(self, parent) self.star = QPixmap(":/images/star.png") def paint(self, painter, option, index): """ Paint the items in the table. If the item referred to by is a StarRating, we handle the painting ourselves. For the other items, we let the base class handle the painting as usual. In a polished application, we'd use a better check than the column number to find out if we needed to paint the stars, but it works for the purposes of this example. """ if index.column() != 5: # Since we draw the grid ourselves: opt = copy.copy(option) opt.rect = option.rect.adjusted(0, 0, -1, -1) QSqlRelationalDelegate.paint(self, painter, opt, index) else: model = index.model() if option.state & QStyle.State_Enabled: if option.state & QStyle.State_Active: color_group = QPalette.Normal else: color_group = QPalette.Inactive else: color_group = QPalette.Disabled if option.state & QStyle.State_Selected: painter.fillRect(option.rect, option.palette.color(color_group, QPalette.Highlight)) rating = model.data(index, Qt.DisplayRole) width = self.star.width() height = self.star.height() x = option.rect.x() y = option.rect.y() + (option.rect.height() / 2) - (height / 2) for i in range(rating): painter.drawPixmap(x, y, self.star) x += width # Since we draw the grid ourselves: self.drawFocus(painter, option, option.rect.adjusted(0, 0, -1, -1)) pen = painter.pen() painter.setPen(option.palette.color(QPalette.Mid)) painter.drawLine(option.rect.bottomLeft(), option.rect.bottomRight()) painter.drawLine(option.rect.topRight(), option.rect.bottomRight()) painter.setPen(pen) def sizeHint(self, option, index): """ Returns the size needed to display the item in a QSize object. """ if index.column() == 5: size_hint = QSize(5 * self.star.width(), self.star.height()) + QSize(1, 1) return size_hint # Since we draw the grid ourselves: return QSqlRelationalDelegate.sizeHint(self, option, index) + QSize(1, 1) def editorEvent(self, event, model, option, index): if index.column() != 5: return False if event.type() == QEvent.MouseButtonPress: mouse_pos = event.pos() new_stars = int(0.7 + (mouse_pos.x() - option.rect.x()) / self.star.width()) stars = max(0, min(new_stars, 5)) model.setData(index, stars) # So that the selection can change return False return True def createEditor(self, parent, option, index): if index.column() != 4: return QSqlRelationalDelegate.createEditor(self, parent, option, index) # For editing the year, return a spinbox with a range from -1000 to 2100. spinbox = QSpinBox(parent) spinbox.setFrame(False) spinbox.setMaximum(2100) spinbox.setMinimum(-1000) return spinbox examples/sql/books/books.pyproject000066400000000000000000000002351376617013100176730ustar00rootroot00000000000000{ "files": ["main.py", "bookdelegate.py", "bookwindow.py", "createdb.py", "books.qrc", "bookwindow.ui", "images/star.png"] } examples/sql/books/books.qrc000066400000000000000000000001411376617013100164350ustar00rootroot00000000000000 images/star.png examples/sql/books/bookwindow.py000066400000000000000000000137411376617013100173570ustar00rootroot00000000000000############################################################################# ## ## 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 __future__ import print_function, absolute_import from PySide2.QtWidgets import (QAbstractItemView, QDataWidgetMapper, QHeaderView, QMainWindow, QMessageBox) from PySide2.QtGui import QKeySequence from PySide2.QtSql import QSqlRelation, QSqlRelationalTableModel, QSqlTableModel from PySide2.QtCore import Qt, Slot import createdb from ui_bookwindow import Ui_BookWindow from bookdelegate import BookDelegate class BookWindow(QMainWindow, Ui_BookWindow): """A window to show the books available""" def __init__(self): QMainWindow.__init__(self) self.setupUi(self) #Initialize db createdb.init_db() model = QSqlRelationalTableModel(self.bookTable) model.setEditStrategy(QSqlTableModel.OnManualSubmit) model.setTable("books") # Remember the indexes of the columns: author_idx = model.fieldIndex("author") genre_idx = model.fieldIndex("genre") # Set the relations to the other database tables: model.setRelation(author_idx, QSqlRelation("authors", "id", "name")) model.setRelation(genre_idx, QSqlRelation("genres", "id", "name")) # Set the localized header captions: model.setHeaderData(author_idx, Qt.Horizontal, self.tr("Author Name")) model.setHeaderData(genre_idx, Qt.Horizontal, self.tr("Genre")) model.setHeaderData(model.fieldIndex("title"), Qt.Horizontal, self.tr("Title")) model.setHeaderData(model.fieldIndex("year"), Qt.Horizontal, self.tr("Year")) model.setHeaderData(model.fieldIndex("rating"), Qt.Horizontal, self.tr("Rating")) if not model.select(): print(model.lastError()) # Set the model and hide the ID column: self.bookTable.setModel(model) self.bookTable.setItemDelegate(BookDelegate(self.bookTable)) self.bookTable.setColumnHidden(model.fieldIndex("id"), True) self.bookTable.setSelectionMode(QAbstractItemView.SingleSelection) # Initialize the Author combo box: self.authorEdit.setModel(model.relationModel(author_idx)) self.authorEdit.setModelColumn(model.relationModel(author_idx).fieldIndex("name")) self.genreEdit.setModel(model.relationModel(genre_idx)) self.genreEdit.setModelColumn(model.relationModel(genre_idx).fieldIndex("name")) # Lock and prohibit resizing of the width of the rating column: self.bookTable.horizontalHeader().setSectionResizeMode(model.fieldIndex("rating"), QHeaderView.ResizeToContents) mapper = QDataWidgetMapper(self) mapper.setModel(model) mapper.setItemDelegate(BookDelegate(self)) mapper.addMapping(self.titleEdit, model.fieldIndex("title")) mapper.addMapping(self.yearEdit, model.fieldIndex("year")) mapper.addMapping(self.authorEdit, author_idx) mapper.addMapping(self.genreEdit, genre_idx) mapper.addMapping(self.ratingEdit, model.fieldIndex("rating")) selection_model = self.bookTable.selectionModel() selection_model.currentRowChanged.connect(mapper.setCurrentModelIndex) self.bookTable.setCurrentIndex(model.index(0, 0)) self.create_menubar() def showError(err): QMessageBox.critical(self, "Unable to initialize Database", "Error initializing database: " + err.text()) def create_menubar(self): file_menu = self.menuBar().addMenu(self.tr("&File")) quit_action = file_menu.addAction(self.tr("&Quit")) quit_action.triggered.connect(qApp.quit) help_menu = self.menuBar().addMenu(self.tr("&Help")) about_action = help_menu.addAction(self.tr("&About")) about_action.setShortcut(QKeySequence.HelpContents) about_action.triggered.connect(self.about) aboutQt_action = help_menu.addAction("&About Qt") aboutQt_action.triggered.connect(qApp.aboutQt) @Slot() def about(self): QMessageBox.about(self, self.tr("About Books"), self.tr("

The Books example shows how to use Qt SQL classes " "with a model/view framework.")) examples/sql/books/bookwindow.ui000066400000000000000000000111451376617013100173400ustar00rootroot00000000000000 BookWindow 0 0 601 420 Books 6 9 9 9 9 6 9 9 9 9 QAbstractItemView::SelectRows Details <b>Title:</b> true <b>Author: </b> true <b>Genre:</b> true <b>Year:</b> true -1000 2100 <b>Rating:</b> 5 bookTable titleEdit authorEdit genreEdit yearEdit examples/sql/books/createdb.py000066400000000000000000000116111376617013100167400ustar00rootroot00000000000000############################################################################# ## ## 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.QtSql import QSqlDatabase, QSqlQuery from datetime import date def add_book(q, title, year, authorId, genreId, rating): q.addBindValue(title) q.addBindValue(year) q.addBindValue(authorId) q.addBindValue(genreId) q.addBindValue(rating) q.exec_() def add_genre(q, name): q.addBindValue(name) q.exec_() return q.lastInsertId() def add_author(q, name, birthdate): q.addBindValue(name) q.addBindValue(str(birthdate)) q.exec_() return q.lastInsertId() BOOKS_SQL = """ create table books(id integer primary key, title varchar, author integer, genre integer, year integer, rating integer) """ AUTHORS_SQL = """ create table authors(id integer primary key, name varchar, birthdate text) """ GENRES_SQL = """ create table genres(id integer primary key, name varchar) """ INSERT_AUTHOR_SQL = """ insert into authors(name, birthdate) values(?, ?) """ INSERT_GENRE_SQL = """ insert into genres(name) values(?) """ INSERT_BOOK_SQL = """ insert into books(title, year, author, genre, rating) values(?, ?, ?, ?, ?) """ def init_db(): """ init_db() Initializes the database. If tables "books" and "authors" are already in the database, do nothing. Return value: None or raises ValueError The error value is the QtSql error instance. """ def check(func, *args): if not func(*args): raise ValueError(func.__self__.lastError()) db = QSqlDatabase.addDatabase("QSQLITE") db.setDatabaseName(":memory:") check(db.open) q = QSqlQuery() check(q.exec_, BOOKS_SQL) check(q.exec_, AUTHORS_SQL) check(q.exec_, GENRES_SQL) check(q.prepare, INSERT_AUTHOR_SQL) asimovId = add_author(q, "Isaac Asimov", date(1920, 2, 1)) greeneId = add_author(q, "Graham Greene", date(1904, 10, 2)) pratchettId = add_author(q, "Terry Pratchett", date(1948, 4, 28)) check(q.prepare,INSERT_GENRE_SQL) sfiction = add_genre(q, "Science Fiction") fiction = add_genre(q, "Fiction") fantasy = add_genre(q, "Fantasy") check(q.prepare,INSERT_BOOK_SQL) add_book(q, "Foundation", 1951, asimovId, sfiction, 3) add_book(q, "Foundation and Empire", 1952, asimovId, sfiction, 4) add_book(q, "Second Foundation", 1953, asimovId, sfiction, 3) add_book(q, "Foundation's Edge", 1982, asimovId, sfiction, 3) add_book(q, "Foundation and Earth", 1986, asimovId, sfiction, 4) add_book(q, "Prelude to Foundation", 1988, asimovId, sfiction, 3) add_book(q, "Forward the Foundation", 1993, asimovId, sfiction, 3) add_book(q, "The Power and the Glory", 1940, greeneId, fiction, 4) add_book(q, "The Third Man", 1950, greeneId, fiction, 5) add_book(q, "Our Man in Havana", 1958, greeneId, fiction, 4) add_book(q, "Guards! Guards!", 1989, pratchettId, fantasy, 3) add_book(q, "Night Watch", 2002, pratchettId, fantasy, 3) add_book(q, "Going Postal", 2004, pratchettId, fantasy, 3) examples/sql/books/images/000077500000000000000000000000001376617013100160625ustar00rootroot00000000000000examples/sql/books/images/star.png000066400000000000000000000014161376617013100175430ustar00rootroot00000000000000PNG  IHDRa pHYs  d_tIME ~:bKGDIDAT8c:c#:d& vx͜=o i,X4ҥLǻ ;M8,yMOv y1g-k3)l F1`y׮Mgi~Yҥ_7xEm>'338gif&&D&NxD'[E>jֽu"׷=~SNOQMn5-Vf[Ψ![W}Jw&e^Wot{/Y̲D%gm|YޠEOVi3is/ZiҾm~^(jGL߮]F,#2`Q֔1_qyT?`l9g-i?p保kf }i>#d8kx a씸;x԰Gڙ:L9 f;[{hk1󀰈(,hFC1+K122i7 b68 T=cW$o{ULIENDB`examples/sql/books/main.py000066400000000000000000000042651376617013100161220ustar00rootroot00000000000000############################################################################# ## ## 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 bookwindow import BookWindow import rc_books if __name__ == "__main__": app = QApplication([]) window = BookWindow() window.resize(800, 600) window.show() sys.exit(app.exec_()) examples/sql/books/rc_books.py000066400000000000000000000065331376617013100167770ustar00rootroot00000000000000# 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\x03\x0e\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x00\x10\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\ \x00\x00\x00\x09pHYs\x00\x00\x0b\x11\x00\x00\x0b\x11\ \x01\x7fd_\x91\x00\x00\x00\x07tIME\x07\xd4\x09\ \x03\x12\x11\x08\x18~\xe5:\x00\x00\x00\x06bKGD\ \x00\xff\x00\xff\x00\xff\xa0\xbd\xa7\x93\x00\x00\x02\x9bID\ AT8\xcbc\x98:c\x1e#:\xe6\xe5d\xcf\x17\ \x12\x12\x16\xc4&\x87\x8e\x19\xb0\x09v\xc6\x18\xb7x\xea\ \x8b\xcd\x9c=o\x09i\x06,X4\x8f\xf1\xd2\xa5\x99\ L\xb9\xa1\x16\xc5\xc7\xbb\xed\xff\x0a\xf2\xb2;M\x9f\xb5\ \x908\x03\x16,\x9a\xcb\xf8\xe0\xde\x04\x96\xc7\x0f\xdby\ \xe7MO\xc8\xfbv\xbf\xe5\xff\xb4\x0a\x9b\x9by\x851\ \xdc\xd3g-\x82k\x983\x7f)\xe3l F1`\ \xca\xf4y\x8c\xd7\xaeMg\x02i~\xf2\xa8Y\xe1\xd2\ \xa5\xfa\xdc_\x9f7\xfd\xffx\xbf\xea\x7fE\x96m\x97\ \x81\x81>'33\x8b\xa5\x9e8gi\xb8\x9e\xc0f\ &&\xa6D\x14\x03&N\x9d\xc7x\xef\xdeD\x96'\ \x0f[E\x9f>j\xd6\xbdu\xb3\x22\xef\xd7\xb7=\xff\ \xbe\x7f\xe8\xfb\x7f~S\xcc\xef\x05\xc5\xea\x9fNOQ\ \xfb\x7f\xbaM\xed\xbf\x87\x1a\xefn5-\x1dV\x14\x03\ f\xcf[\xce\xa8\xa4\xa9![W\xed\x9b}\xefJ\xcb\ \xcew\xaf&\x7f\xfa\xfee\xc9\xff\xef\x1f\xfa\xff\xbf\xbf\ \x95\xf2\xff\xc9^\x83\xffW\x17\xaa\xfdot\x12{\xc4\ \xc7\xc7/\x8e\x12\x06Y\xb9\x85\xcc\xb2\x82\x1c\xf3\xa7D\ \xab\xfe\xfa\xbe%\xe2\xff\x8fgm\xff\x7f|\x9a\x08\xd6\ \xfc\xf5Y\xcd\xff\xd7\xe7\xfc\xfe\xdf\xde\xa0\xf5\x7fE\x94\ \xecO\x16\x16V\xebi3\xe7\xa3\x06\xe2\xe4is\x18\ \xe7/Z\xc1\xc8\xce\xc1i\x10\xe5\xa8\xd2\xbe\xa6\xcd\xe7\ \xf6\xc3m\x99\xff~^(\xf8\xff\xe1j\xe0\xff\x17G\ L\xff\xdf\xdf\xae\xf6\xbf\xc2]\xf4\xba\x9a\x9a\x06\x1bF\ ,\x00\x01#2\xe6\xe6\xe6`Q\xd6\x941_\xde\xe4\ q\xfb\xc3y\xd3\xff\x1b\x8aT\xff\xbf?`\xff\xff\xdc\ l\xe5\xff\xea\xc2\x1c9\xd3g-\xc0i\x00\x13\x10\x8b\ \x03\xb1?\x10\xe7\xf5\x16\xd8\xde\xf8p\xc6\xe4\xbf\x9d<\ \xf7t\x7fC\xe9\x95\xb7\x96\xd9\xff\x9b\x9c,\xfdN@\ @H\x14\x9b\x01LP,\x06\xc4\x19@|\x22;\xca\ \xf0\xe7\xe9\xf9\x06\xff\x81\xec\x03@\xbc^\x82\x9f\xf3\xf6\ \x9e\x1a\xf3_az\x823P\xd2\x01T#3\x10\x0b\ \x00\xb1\x1e\x10\x17\x03\xf1\xd1\xa8@\xdd\x9f\xad\x09J \ \x03\xfe\x00\xf17 >\x0f\xb4kf\xb9\xa7\xea\x0d}\ i>#d\x03\xb4\x808\x08\x88k\x81x\x09\xd4\xc6\ \x1b\x11a\x06\xdf\xec\x94\xb8\xdf\x03\xd9;\x81x\x1a\x10\ \xf7\x82\xd4\xb0\xb2\xb1G\xf9\xda\x99:L\x9d9\x9f\x09\ f\x80\x0e\x10;\x02\xb1\x13\x10[\x00\xb1\x01\x10\x07\x06\ {h\x9c\x02\xd2k\xa0\x86\x8b\x001\x17\x10\xf3\x80\xb0\ \x88\x88(\xcb,hFC\xf6\x02\x08\xb3\x001+\x10\ K122\xe4\x01i7 \x96\x01b6\xa88\x0b\ T=cW\xef$\xb0\x01\x00\xceo{\xf5UL\xf0\ \xac\x00\x00\x00\x00IEND\xaeB`\x82\ " qt_resource_name = b"\ \x00\x06\ \x07\x03}\xc3\ \x00i\ \x00m\x00a\x00g\x00e\x00s\ \x00\x08\ \x0a\x85X\x07\ \x00s\ \x00t\x00a\x00r\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\x01j\x965\xd3\xea\ " 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() examples/sql/books/ui_bookwindow.py000066400000000000000000000122141376617013100200460ustar00rootroot00000000000000# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'bookwindow.ui' ## ## Created by: Qt User Interface Compiler version 5.14.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 (QBrush, QColor, QConicalGradient, QFont, QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient) from PySide2.QtWidgets import * class Ui_BookWindow(object): def setupUi(self, BookWindow): if BookWindow.objectName(): BookWindow.setObjectName(u"BookWindow") BookWindow.resize(601, 420) self.centralWidget = QWidget(BookWindow) self.centralWidget.setObjectName(u"centralWidget") self.vboxLayout = QVBoxLayout(self.centralWidget) self.vboxLayout.setSpacing(6) self.vboxLayout.setObjectName(u"vboxLayout") self.vboxLayout.setContentsMargins(9, 9, 9, 9) self.groupBox = QGroupBox(self.centralWidget) self.groupBox.setObjectName(u"groupBox") self.vboxLayout1 = QVBoxLayout(self.groupBox) self.vboxLayout1.setSpacing(6) self.vboxLayout1.setObjectName(u"vboxLayout1") self.vboxLayout1.setContentsMargins(9, 9, 9, 9) self.bookTable = QTableView(self.groupBox) self.bookTable.setObjectName(u"bookTable") self.bookTable.setSelectionBehavior(QAbstractItemView.SelectRows) self.vboxLayout1.addWidget(self.bookTable) self.groupBox_2 = QGroupBox(self.groupBox) self.groupBox_2.setObjectName(u"groupBox_2") self.formLayout = QFormLayout(self.groupBox_2) self.formLayout.setObjectName(u"formLayout") self.label_5 = QLabel(self.groupBox_2) self.label_5.setObjectName(u"label_5") self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label_5) self.titleEdit = QLineEdit(self.groupBox_2) self.titleEdit.setObjectName(u"titleEdit") self.titleEdit.setEnabled(True) self.formLayout.setWidget(0, QFormLayout.FieldRole, self.titleEdit) self.label_2 = QLabel(self.groupBox_2) self.label_2.setObjectName(u"label_2") self.formLayout.setWidget(1, QFormLayout.LabelRole, self.label_2) self.authorEdit = QComboBox(self.groupBox_2) self.authorEdit.setObjectName(u"authorEdit") self.authorEdit.setEnabled(True) self.formLayout.setWidget(1, QFormLayout.FieldRole, self.authorEdit) self.label_3 = QLabel(self.groupBox_2) self.label_3.setObjectName(u"label_3") self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3) self.genreEdit = QComboBox(self.groupBox_2) self.genreEdit.setObjectName(u"genreEdit") self.genreEdit.setEnabled(True) self.formLayout.setWidget(2, QFormLayout.FieldRole, self.genreEdit) self.label_4 = QLabel(self.groupBox_2) self.label_4.setObjectName(u"label_4") self.formLayout.setWidget(3, QFormLayout.LabelRole, self.label_4) self.yearEdit = QSpinBox(self.groupBox_2) self.yearEdit.setObjectName(u"yearEdit") self.yearEdit.setEnabled(True) self.yearEdit.setMinimum(-1000) self.yearEdit.setMaximum(2100) self.formLayout.setWidget(3, QFormLayout.FieldRole, self.yearEdit) self.label = QLabel(self.groupBox_2) self.label.setObjectName(u"label") self.formLayout.setWidget(4, QFormLayout.LabelRole, self.label) self.ratingEdit = QSpinBox(self.groupBox_2) self.ratingEdit.setObjectName(u"ratingEdit") self.ratingEdit.setMaximum(5) self.formLayout.setWidget(4, QFormLayout.FieldRole, self.ratingEdit) self.vboxLayout1.addWidget(self.groupBox_2) self.vboxLayout.addWidget(self.groupBox) BookWindow.setCentralWidget(self.centralWidget) QWidget.setTabOrder(self.bookTable, self.titleEdit) QWidget.setTabOrder(self.titleEdit, self.authorEdit) QWidget.setTabOrder(self.authorEdit, self.genreEdit) QWidget.setTabOrder(self.genreEdit, self.yearEdit) self.retranslateUi(BookWindow) QMetaObject.connectSlotsByName(BookWindow) # setupUi def retranslateUi(self, BookWindow): BookWindow.setWindowTitle(QCoreApplication.translate("BookWindow", u"Books", None)) self.groupBox.setTitle("") self.groupBox_2.setTitle(QCoreApplication.translate("BookWindow", u"Details", None)) self.label_5.setText(QCoreApplication.translate("BookWindow", u"Title:", None)) self.label_2.setText(QCoreApplication.translate("BookWindow", u"Author: ", None)) self.label_3.setText(QCoreApplication.translate("BookWindow", u"Genre:", None)) self.label_4.setText(QCoreApplication.translate("BookWindow", u"Year:", None)) self.yearEdit.setPrefix("") self.label.setText(QCoreApplication.translate("BookWindow", u"Rating:", None)) # retranslateUi examples/texttospeech/000077500000000000000000000000001376617013100154205ustar00rootroot00000000000000examples/texttospeech/texttospeech.py000066400000000000000000000104331376617013100205120ustar00rootroot00000000000000 ############################################################################# ## ## 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 QTextToSpeech example""" import sys from PySide2.QtCore import Qt from PySide2.QtWidgets import (QApplication, QComboBox, QFormLayout, QHBoxLayout, QLineEdit, QMainWindow, QPushButton, QSlider, QWidget) from PySide2.QtTextToSpeech import QTextToSpeech class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() centralWidget = QWidget() self.setCentralWidget(centralWidget) layout = QFormLayout(centralWidget) textLayout = QHBoxLayout() self.text = QLineEdit('Hello, PySide2') self.text.setClearButtonEnabled(True) textLayout.addWidget(self.text) self.sayButton = QPushButton('Say') textLayout.addWidget(self.sayButton) self.text.returnPressed.connect(self.sayButton.animateClick) self.sayButton.clicked.connect(self.say) layout.addRow('Text:', textLayout) self.voiceCombo = QComboBox() layout.addRow('Voice:', self.voiceCombo) self.volumeSlider = QSlider(Qt.Horizontal) self.volumeSlider.setMinimum(0) self.volumeSlider.setMaximum(100) self.volumeSlider.setValue(100) layout.addRow('Volume:', self.volumeSlider) self.engine = None engineNames = QTextToSpeech.availableEngines() if len(engineNames) > 0: engineName = engineNames[0] self.engine = QTextToSpeech(engineName) self.engine.stateChanged.connect(self.stateChanged) self.setWindowTitle('QTextToSpeech Example ({})'.format(engineName)) self.voices = [] for voice in self.engine.availableVoices(): self.voices.append(voice) self.voiceCombo.addItem(voice.name()) else: self.setWindowTitle('QTextToSpeech Example (no engines available)') self.sayButton.setEnabled(False) def say(self): self.sayButton.setEnabled(False) self.engine.setVoice(self.voices[self.voiceCombo.currentIndex()]) self.engine.setVolume(float(self.volumeSlider.value()) / 100) self.engine.say(self.text.text()) def stateChanged(self, state): if (state == QTextToSpeech.State.Ready): self.sayButton.setEnabled(True) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/texttospeech/texttospeech.pyproject000066400000000000000000000000451376617013100220770ustar00rootroot00000000000000{ "files": ["texttospeech.py"] } examples/tutorial/000077500000000000000000000000001376617013100145445ustar00rootroot00000000000000examples/tutorial/t1.py000066400000000000000000000042061376617013100154440ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 1 import sys from PySide2 import QtWidgets app = QtWidgets.QApplication(sys.argv) hello = QtWidgets.QPushButton("Hello world!") hello.resize(100, 30) hello.show() sys.exit(app.exec_()) examples/tutorial/t10.py000066400000000000000000000145011376617013100155230ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 10 import sys from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) forceChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.currentForce = 0 self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def force(self): return self.currentForce @QtCore.Slot(int) def setForce(self, force): if force < 0: force = 0 if self.currentForce == force: return self.currentForce = force self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce) def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.translate(0, self.height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(QtCore.QRect(33, -4, 15, 8)) def cannonRect(self): result = QtCore.QRect(0, 0, 50, 50) result.moveBottomLeft(self.rect().bottomLect()) return result class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("&Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange() angle.setRange(5, 70) force = LCDRange() force.setRange(10, 50) cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle) self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) self.connect(force, QtCore.SIGNAL("valueChanged(int)"), cannonField.setForce) self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"), force.setValue) leftLayout = QtWidgets.QVBoxLayout() leftLayout.addWidget(angle) leftLayout.addWidget(force) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addLayout(leftLayout, 1, 0) gridLayout.addWidget(cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) force.setValue(25) angle.setFocus() app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.setGeometry(100, 100, 500, 355) widget.show() sys.exit(app.exec_()) examples/tutorial/t11.py000066400000000000000000000210161376617013100155230ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 11 import sys import math from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) forceChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.currentForce = 0 self.timerCount = 0 self.autoShootTimer = QtCore.QTimer(self) self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"), self.moveShot) self.shootAngle = 0 self.shootForce = 0 self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def force(self): return self.currentForce @QtCore.Slot(int) def setForce(self, force): if force < 0: force = 0 if self.currentForce == force: return self.currentForce = force self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce) @QtCore.Slot() def shoot(self): if self.autoShootTimer.isActive(): return self.timerCount = 0 self.shootAngle = self.currentAngle self.shootForce = self.currentForce self.autoShootTimer.start(5) @QtCore.Slot() def moveShot(self): region = QtGui.QRegion(self.shotRect()) self.timerCount += 1 shotR = self.shotRect() if shotR.x() > self.width() or shotR.y() > self.height(): self.autoShootTimer.stop() else: region = region.united(QtGui.QRegion(shotR)) self.update(region) def paintEvent(self, event): painter = QtGui.QPainter(self) self.paintCannon(painter) if self.autoShootTimer.isActive(): self.paintShot(painter) def paintShot(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.black) painter.drawRect(self.shotRect()) barrelRect = QtCore.QRect(33, -4, 15, 8) def paintCannon(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.save() painter.translate(0, self.height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(CannonField.barrelRect) painter.restore() def cannonRect(self): result = QtCore.QRect(0, 0, 50, 50) result.moveBottomLeft(self.rect().bottomLect()) return result def shotRect(self): gravity = 4.0 time = self.timerCount / 40.0 velocity = self.shootForce radians = self.shootAngle * 3.14159265 / 180 velx = velocity * math.cos(radians) vely = velocity * math.sin(radians) x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians) y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians) x = x0 + velx * time y = y0 + vely * time - 0.5 * gravity * time * time result = QtCore.QRect(0, 0, 6, 6) result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y))) return result class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("&Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange() angle.setRange(5, 70) force = LCDRange() force.setRange(10, 50) cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle) self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) self.connect(force, QtCore.SIGNAL("valueChanged(int)"), cannonField.setForce) self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"), force.setValue) shoot = QtWidgets.QPushButton("&Shoot") shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot) topLayout = QtWidgets.QHBoxLayout() topLayout.addWidget(shoot) topLayout.addStretch(1) leftLayout = QtWidgets.QVBoxLayout() leftLayout.addWidget(angle) leftLayout.addWidget(force) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addLayout(topLayout, 0, 1) gridLayout.addLayout(leftLayout, 1, 0) gridLayout.addWidget(cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) force.setValue(25) angle.setFocus() app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.setGeometry(100, 100, 500, 355) widget.show() sys.exit(app.exec_()) examples/tutorial/t12.py000066400000000000000000000237501376617013100155330ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 12 import sys import math import random from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, text=None, parent=None): if isinstance(text, QtWidgets.QWidget): parent = text text = None QtWidgets.QWidget.__init__(self, parent) self.init() if text: self.setText(text) def init(self): lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.label = QtWidgets.QLabel() self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) layout.addWidget(self.label) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def text(self): return self.label.text() def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) def setText(self, text): self.label.setText(text) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) forceChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.currentForce = 0 self.timerCount = 0 self.autoShootTimer = QtCore.QTimer(self) self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"), self.moveShot) self.shootAngle = 0 self.shootForce = 0 self.target = QtCore.QPoint(0, 0) self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) self.newTarget() def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def force(self): return self.currentForce @QtCore.Slot(int) def setForce(self, force): if force < 0: force = 0 if self.currentForce == force: return self.currentForce = force self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce) @QtCore.Slot() def shoot(self): if self.autoShootTimer.isActive(): return self.timerCount = 0 self.shootAngle = self.currentAngle self.shootForce = self.currentForce self.autoShootTimer.start(5) firstTime = True def newTarget(self): if CannonField.firstTime: CannonField.firstTime = False midnight = QtCore.QTime(0, 0, 0) random.seed(midnight.secsTo(QtCore.QTime.currentTime())) self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1)) self.update() @QtCore.Slot() def moveShot(self): region = QtGui.QRegion(self.shotRect()) self.timerCount += 1 shotR = self.shotRect() if shotR.intersects(self.targetRect()): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("hit()")) elif shotR.x() > self.width() or shotR.y() > self.height(): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("missed()")) else: region = region.united(QtGui.QRegion(shotR)) self.update(region) def paintEvent(self, event): painter = QtGui.QPainter(self) self.paintCannon(painter) if self.autoShootTimer.isActive(): self.paintShot(painter) self.paintTarget(painter) def paintShot(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.black) painter.drawRect(self.shotRect()) def paintTarget(self, painter): painter.setPen(QtCore.Qt.black) painter.setBrush(QtCore.Qt.red) painter.drawRect(self.targetRect()) barrelRect = QtCore.QRect(33, -4, 15, 8) def paintCannon(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.save() painter.translate(0, self.height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(CannonField.barrelRect) painter.restore() def cannonRect(self): result = QtCore.QRect(0, 0, 50, 50) result.moveBottomLeft(self.rect().bottomLect()) return result def shotRect(self): gravity = 4.0 time = self.timerCount / 40.0 velocity = self.shootForce radians = self.shootAngle * 3.14159265 / 180 velx = velocity * math.cos(radians) vely = velocity * math.sin(radians) x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians) y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians) x = x0 + velx * time y = y0 + vely * time - 0.5 * gravity * time * time result = QtCore.QRect(0, 0, 6, 6) result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y))) return result def targetRect(self): result = QtCore.QRect(0, 0, 20, 10) result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y())) return result class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("&Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange("ANGLE") angle.setRange(5, 70) force = LCDRange("FORCE") force.setRange(10, 50) cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle) self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) self.connect(force, QtCore.SIGNAL("valueChanged(int)"), cannonField.setForce) self.connect(cannonField, QtCore.SIGNAL("forceChanged(int)"), force.setValue) shoot = QtWidgets.QPushButton("&Shoot") shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(shoot, QtCore.SIGNAL("clicked()"), cannonField.shoot) topLayout = QtWidgets.QHBoxLayout() topLayout.addWidget(shoot) topLayout.addStretch(1) leftLayout = QtWidgets.QVBoxLayout() leftLayout.addWidget(angle) leftLayout.addWidget(force) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addLayout(topLayout, 0, 1) gridLayout.addLayout(leftLayout, 1, 0) gridLayout.addWidget(cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) force.setValue(25) angle.setFocus() app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.setGeometry(100, 100, 500, 355) widget.show() sys.exit(app.exec_()) examples/tutorial/t13.py000066400000000000000000000314141376617013100155300ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 13 import sys import math import random from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, text=None, parent=None): if isinstance(text, QtWidgets.QWidget): parent = text text = None QtWidgets.QWidget.__init__(self, parent) self.init() if text: self.setText(text) def init(self): lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.label = QtWidgets.QLabel() self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) layout.addWidget(self.label) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def text(self): return self.label.text() def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) def setText(self, text): self.label.setText(text) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) forceChanged = QtCore.Signal(int) hit = QtCore.Signal() missed = QtCore.Signal() canShoot = QtCore.Signal(bool) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.currentForce = 0 self.timerCount = 0 self.autoShootTimer = QtCore.QTimer(self) self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"), self.moveShot) self.shootAngle = 0 self.shootForce = 0 self.target = QtCore.QPoint(0, 0) self.gameEnded = False self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) self.newTarget() def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def force(self): return self.currentForce @QtCore.Slot(int) def setForce(self, force): if force < 0: force = 0 if self.currentForce == force: return self.currentForce = force self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce) @QtCore.Slot() def shoot(self): if self.isShooting(): return self.timerCount = 0 self.shootAngle = self.currentAngle self.shootForce = self.currentForce self.autoShootTimer.start(5) self.emit(QtCore.SIGNAL("canShoot(bool)"), False) firstTime = True def newTarget(self): if CannonField.firstTime: CannonField.firstTime = False midnight = QtCore.QTime(0, 0, 0) random.seed(midnight.secsTo(QtCore.QTime.currentTime())) self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1)) self.update() def setGameOver(self): if self.gameEnded: return if self.isShooting(): self.autoShootTimer.stop() self.gameEnded = True self.update() def restartGame(self): if self.isShooting(): self.autoShootTimer.stop() self.gameEnded = False self.update() self.emit(QtCore.SIGNAL("canShoot(bool)"), True) @QtCore.Slot() def moveShot(self): region = QtGui.QRegion(self.shotRect()) self.timerCount += 1 shotR = self.shotRect() if shotR.intersects(self.targetRect()): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("hit()")) self.emit(QtCore.SIGNAL("canShoot(bool)"), True) elif shotR.x() > self.width() or shotR.y() > self.height(): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("missed()")) self.emit(QtCore.SIGNAL("canShoot(bool)"), True) else: region = region.united(QtGui.QRegion(shotR)) self.update(region) def paintEvent(self, event): painter = QtGui.QPainter(self) if self.gameEnded: painter.setPen(QtCore.Qt.black) painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold)) painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over") self.paintCannon(painter) if self.isShooting(): self.paintShot(painter) if not self.gameEnded: self.paintTarget(painter) def paintShot(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.black) painter.drawRect(self.shotRect()) def paintTarget(self, painter): painter.setPen(QtCore.Qt.black) painter.setBrush(QtCore.Qt.red) painter.drawRect(self.targetRect()) barrelRect = QtCore.QRect(33, -4, 15, 8) def paintCannon(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.save() painter.translate(0, self.height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(CannonField.barrelRect) painter.restore() def cannonRect(self): result = QtCore.QRect(0, 0, 50, 50) result.moveBottomLeft(self.rect().bottomLect()) return result def shotRect(self): gravity = 4.0 time = self.timerCount / 40.0 velocity = self.shootForce radians = self.shootAngle * 3.14159265 / 180 velx = velocity * math.cos(radians) vely = velocity * math.sin(radians) x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians) y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians) x = x0 + velx * time y = y0 + vely * time - 0.5 * gravity * time * time result = QtCore.QRect(0, 0, 6, 6) result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y))) return result def targetRect(self): result = QtCore.QRect(0, 0, 20, 10) result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y())) return result def gameOver(self): return self.gameEnded def isShooting(self): return self.autoShootTimer.isActive() class GameBoard(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("&Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange("ANGLE") angle.setRange(5, 70) force = LCDRange("FORCE") force.setRange(10, 50) self.cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), self.cannonField.setAngle) self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) self.connect(force, QtCore.SIGNAL("valueChanged(int)"), self.cannonField.setForce) self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"), force.setValue) self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit) self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed) shoot = QtWidgets.QPushButton("&Shoot") shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire) self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"), shoot, QtCore.SLOT("setEnabled(bool)")) restart = QtWidgets.QPushButton("&New Game") restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame) self.hits = QtWidgets.QLCDNumber(2) self.shotsLeft = QtWidgets.QLCDNumber(2) hitsLabel = QtWidgets.QLabel("HITS") shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT") topLayout = QtWidgets.QHBoxLayout() topLayout.addWidget(shoot) topLayout.addWidget(self.hits) topLayout.addWidget(hitsLabel) topLayout.addWidget(self.shotsLeft) topLayout.addWidget(shotsLeftLabel) topLayout.addStretch(1) topLayout.addWidget(restart) leftLayout = QtWidgets.QVBoxLayout() leftLayout.addWidget(angle) leftLayout.addWidget(force) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addLayout(topLayout, 0, 1) gridLayout.addLayout(leftLayout, 1, 0) gridLayout.addWidget(self.cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) force.setValue(25) angle.setFocus() self.newGame() @QtCore.Slot() def fire(self): if self.cannonField.gameOver() or self.cannonField.isShooting(): return self.shotsLeft.display(self.shotsLeft.intValue() - 1) self.cannonField.shoot() @QtCore.Slot() def hit(self): self.hits.display(self.hits.intValue() + 1) if self.shotsLeft.intValue() == 0: self.cannonField.setGameOver() else: self.cannonField.newTarget() @QtCore.Slot() def missed(self): if self.shotsLeft.intValue() == 0: self.cannonField.setGameOver() @QtCore.Slot() def newGame(self): self.shotsLeft.display(15) self.hits.display(0) self.cannonField.restartGame() self.cannonField.newTarget() app = QtWidgets.QApplication(sys.argv) board = GameBoard() board.setGeometry(100, 100, 500, 355) board.show() sys.exit(app.exec_()) examples/tutorial/t14.py000066400000000000000000000353221376617013100155330ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 14 import sys import math import random from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, text=None, parent=None): if isinstance(text, QtWidgets.QWidget): parent = text text = None QtWidgets.QWidget.__init__(self, parent) self.init() if text: self.setText(text) def init(self): lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.label = QtWidgets.QLabel() self.label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignTop) self.label.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) layout.addWidget(self.label) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def text(self): return self.label.text() def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) def setText(self, text): self.label.setText(text) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) forceChanged = QtCore.Signal(int) hit = QtCore.Signal() missed = QtCore.Signal() canShoot = QtCore.Signal(bool) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.currentForce = 0 self.timerCount = 0 self.autoShootTimer = QtCore.QTimer(self) self.connect(self.autoShootTimer, QtCore.SIGNAL("timeout()"), self.moveShot) self.shootAngle = 0 self.shootForce = 0 self.target = QtCore.QPoint(0, 0) self.gameEnded = False self.barrelPressed = False self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) self.newTarget() def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def force(self): return self.currentForce @QtCore.Slot(int) def setForce(self, force): if force < 0: force = 0 if self.currentForce == force: return self.currentForce = force self.emit(QtCore.SIGNAL("forceChanged(int)"), self.currentForce) @QtCore.Slot() def shoot(self): if self.isShooting(): return self.timerCount = 0 self.shootAngle = self.currentAngle self.shootForce = self.currentForce self.autoShootTimer.start(5) self.emit(QtCore.SIGNAL("canShoot(bool)"), False) firstTime = True def newTarget(self): if CannonField.firstTime: CannonField.firstTime = False midnight = QtCore.QTime(0, 0, 0) random.seed(midnight.secsTo(QtCore.QTime.currentTime())) self.target = QtCore.QPoint(200 + random.randint(0, 190 - 1), 10 + random.randint(0, 255 - 1)) self.update() def setGameOver(self): if self.gameEnded: return if self.isShooting(): self.autoShootTimer.stop() self.gameEnded = True self.update() def restartGame(self): if self.isShooting(): self.autoShootTimer.stop() self.gameEnded = False self.update() self.emit(QtCore.SIGNAL("canShoot(bool)"), True) @QtCore.Slot() def moveShot(self): region = QtGui.QRegion(self.shotRect()) self.timerCount += 1 shotR = self.shotRect() if shotR.intersects(self.targetRect()): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("hit()")) self.emit(QtCore.SIGNAL("canShoot(bool)"), True) elif shotR.x() > self.width() or shotR.y() > self.height() or shotR.intersects(self.barrierRect()): self.autoShootTimer.stop() self.emit(QtCore.SIGNAL("missed()")) self.emit(QtCore.SIGNAL("canShoot(bool)"), True) else: region = region.united(QtGui.QRegion(shotR)) self.update(region) def mousePressEvent(self, event): if event.button() != QtCore.Qt.LeftButton: return if self.barrelHit(event.pos()): self.barrelPressed = True def mouseMoveEvent(self, event): if not self.barrelPressed: return pos = event.pos() 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.setAngle(round(rad * 180 / 3.14159265)) def mouseReleaseEvent(self, event): if event.button() == QtCore.Qt.LeftButton: self.barrelPressed = False def paintEvent(self, event): painter = QtGui.QPainter(self) if self.gameEnded: painter.setPen(QtCore.Qt.black) painter.setFont(QtGui.QFont("Courier", 48, QtGui.QFont.Bold)) painter.drawText(self.rect(), QtCore.Qt.AlignCenter, "Game Over") self.paintCannon(painter) self.paintBarrier(painter) if self.isShooting(): self.paintShot(painter) if not self.gameEnded: self.paintTarget(painter) def paintShot(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.black) painter.drawRect(self.shotRect()) def paintTarget(self, painter): painter.setPen(QtCore.Qt.black) painter.setBrush(QtCore.Qt.red) painter.drawRect(self.targetRect()) def paintBarrier(self, painter): painter.setPen(QtCore.Qt.black) painter.setBrush(QtCore.Qt.yellow) painter.drawRect(self.barrierRect()) barrelRect = QtCore.QRect(33, -4, 15, 8) def paintCannon(self, painter): painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.save() painter.translate(0, self.height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(CannonField.barrelRect) painter.restore() def cannonRect(self): result = QtCore.QRect(0, 0, 50, 50) result.moveBottomLeft(self.rect().bottomLect()) return result def shotRect(self): gravity = 4.0 time = self.timerCount / 40.0 velocity = self.shootForce radians = self.shootAngle * 3.14159265 / 180 velx = velocity * math.cos(radians) vely = velocity * math.sin(radians) x0 = (CannonField.barrelRect.right() + 5) * math.cos(radians) y0 = (CannonField.barrelRect.right() + 5) * math.sin(radians) x = x0 + velx * time y = y0 + vely * time - 0.5 * gravity * time * time result = QtCore.QRect(0, 0, 6, 6) result.moveCenter(QtCore.QPoint(round(x), self.height() - 1 - round(y))) return result def targetRect(self): result = QtCore.QRect(0, 0, 20, 10) result.moveCenter(QtCore.QPoint(self.target.x(), self.height() - 1 - self.target.y())) return result def barrierRect(self): return QtCore.QRect(145, self.height() - 100, 15, 99) def barrelHit(self, pos): matrix = QtGui.QTransform() matrix.translate(0, self.height()) matrix.rotate(-self.currentAngle) matrix, invertible = matrix.inverted() return self.barrelRect.contains(matrix.map(pos)) def gameOver(self): return self.gameEnded def isShooting(self): return self.autoShootTimer.isActive() def sizeHint(self): return QtCore.QSize(400, 300) class GameBoard(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("&Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange("ANGLE") angle.setRange(5, 70) force = LCDRange("FORCE") force.setRange(10, 50) cannonBox = QtWidgets.QFrame() cannonBox.setFrameStyle(QtWidgets.QFrame.WinPanel | QtWidgets.QFrame.Sunken) self.cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), self.cannonField.setAngle) self.connect(self.cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) self.connect(force, QtCore.SIGNAL("valueChanged(int)"), self.cannonField.setForce) self.connect(self.cannonField, QtCore.SIGNAL("forceChanged(int)"), force.setValue) self.connect(self.cannonField, QtCore.SIGNAL("hit()"), self.hit) self.connect(self.cannonField, QtCore.SIGNAL("missed()"), self.missed) shoot = QtWidgets.QPushButton("&Shoot") shoot.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(shoot, QtCore.SIGNAL("clicked()"), self.fire) self.connect(self.cannonField, QtCore.SIGNAL("canShoot(bool)"), shoot, QtCore.SLOT("setEnabled(bool)")) restart = QtWidgets.QPushButton("&New Game") restart.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(restart, QtCore.SIGNAL("clicked()"), self.newGame) self.hits = QtWidgets.QLCDNumber(2) self.shotsLeft = QtWidgets.QLCDNumber(2) hitsLabel = QtWidgets.QLabel("HITS") shotsLeftLabel = QtWidgets.QLabel("SHOTS LEFT") QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Enter), self, self.fire) QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.Key_Return), self, self.fire) QtWidgets.QShortcut(QtGui.QKeySequence(QtCore.Qt.CTRL + QtCore.Qt.Key_Q), self, QtCore.SLOT("close()")) topLayout = QtWidgets.QHBoxLayout() topLayout.addWidget(shoot) topLayout.addWidget(self.hits) topLayout.addWidget(hitsLabel) topLayout.addWidget(self.shotsLeft) topLayout.addWidget(shotsLeftLabel) topLayout.addStretch(1) topLayout.addWidget(restart) leftLayout = QtWidgets.QVBoxLayout() leftLayout.addWidget(angle) leftLayout.addWidget(force) cannonLayout = QtWidgets.QVBoxLayout() cannonLayout.addWidget(self.cannonField) cannonBox.setLayout(cannonLayout) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addLayout(topLayout, 0, 1) gridLayout.addLayout(leftLayout, 1, 0) gridLayout.addWidget(cannonBox, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) force.setValue(25) angle.setFocus() self.newGame() @QtCore.Slot() def fire(self): if self.cannonField.gameOver() or self.cannonField.isShooting(): return self.shotsLeft.display(self.shotsLeft.intValue() - 1) self.cannonField.shoot() @QtCore.Slot() def hit(self): self.hits.display(self.hits.intValue() + 1) if self.shotsLeft.intValue() == 0: self.cannonField.setGameOver() else: self.cannonField.newTarget() @QtCore.Slot() def missed(self): if self.shotsLeft.intValue() == 0: self.cannonField.setGameOver() @QtCore.Slot() def newGame(self): self.shotsLeft.display(15) self.hits.display(0) self.cannonField.restartGame() self.cannonField.newTarget() app = QtWidgets.QApplication(sys.argv) board = GameBoard() board.setGeometry(100, 100, 500, 355) board.show() sys.exit(app.exec_()) examples/tutorial/t2.py000066400000000000000000000044561376617013100154540ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 2 import sys from PySide2 import QtCore, QtGui, QtWidgets app = QtWidgets.QApplication(sys.argv) quit = QtWidgets.QPushButton("Quit") quit.resize(75, 30) quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()")) quit.show() sys.exit(app.exec_()) examples/tutorial/t3.py000066400000000000000000000045731376617013100154550ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 3 import sys from PySide2 import QtCore, QtGui, QtWidgets app = QtWidgets.QApplication(sys.argv) window = QtWidgets.QWidget() window.resize(200, 120) quit = QtWidgets.QPushButton("Quit", window) quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) quit.setGeometry(10, 40, 180, 40) QtCore.QObject.connect(quit, QtCore.SIGNAL("clicked()"), app, QtCore.SLOT("quit()")) window.show() sys.exit(app.exec_()) examples/tutorial/t4.py000066400000000000000000000050371376617013100154520ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 4 import sys from PySide2 import QtCore, QtGui, QtWidgets class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.setFixedSize(200, 120) self.quit = QtWidgets.QPushButton("Quit", self) self.quit.setGeometry(62, 40, 75, 30) self.quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(self.quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) examples/tutorial/t5.py000066400000000000000000000055611376617013100154550ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 5 import sys from PySide2 import QtCore, QtGui, QtWidgets class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) lcd = QtWidgets.QLCDNumber(2) slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) slider.setRange(0, 99) slider.setValue(0) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) self.connect(slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(quit) layout.addWidget(lcd) layout.addWidget(slider) self.setLayout(layout) app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) examples/tutorial/t6.py000066400000000000000000000063641376617013100154600ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 6 import sys from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) slider.setRange(0, 99) slider.setValue(0) self.connect(slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(slider) self.setLayout(layout) class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) grid = QtWidgets.QGridLayout() layout = QtWidgets.QVBoxLayout() layout.addWidget(quit) layout.addLayout(grid) self.setLayout(layout) for row in range(3): for column in range(3): grid.addWidget(LCDRange(), row, column) app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) examples/tutorial/t7.py000066400000000000000000000075461376617013100154640ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 7 import sys from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) self.setLayout(layout) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) grid = QtWidgets.QGridLayout() previousRange = None layout = QtWidgets.QVBoxLayout() layout.addWidget(quit) layout.addLayout(grid) self.setLayout(layout) for row in range(3): for column in range(3): lcdRange = LCDRange() grid.addWidget(lcdRange, row, column) if previousRange: self.connect(lcdRange, QtCore.SIGNAL("valueChanged(int)"), previousRange.setValue) previousRange = lcdRange app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.show() sys.exit(app.exec_()) examples/tutorial/t8.py000066400000000000000000000122401376617013100154500ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 8 import sys from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange.setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def paintEvent(self, event): painter = QtGui.QPainter(self) painter.drawText(200, 200, "Angle = %d" % self.currentAngle) class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange() angle.setRange(5, 70) cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle) self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addWidget(angle, 1, 0) gridLayout.addWidget(cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) angle.setFocus() app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.setGeometry(100, 100, 500, 355) widget.show() sys.exit(app.exec_()) examples/tutorial/t9.py000066400000000000000000000126071376617013100154600ustar00rootroot00000000000000 ############################################################################# ## ## 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 tutorial 9 import sys from PySide2 import QtCore, QtGui, QtWidgets class LCDRange(QtWidgets.QWidget): valueChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) lcd = QtWidgets.QLCDNumber(2) self.slider = QtWidgets.QSlider(QtCore.Qt.Horizontal) self.slider.setRange(0, 99) self.slider.setValue(0) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), lcd, QtCore.SLOT("display(int)")) self.connect(self.slider, QtCore.SIGNAL("valueChanged(int)"), self, QtCore.SIGNAL("valueChanged(int)")) layout = QtWidgets.QVBoxLayout() layout.addWidget(lcd) layout.addWidget(self.slider) self.setLayout(layout) self.setFocusProxy(self.slider) def value(self): return self.slider.value() @QtCore.Slot(int) def setValue(self, value): self.slider.setValue(value) def setRange(self, minValue, maxValue): if minValue < 0 or maxValue > 99 or minValue > maxValue: QtCore.qWarning("LCDRange::setRange(%d, %d)\n" "\tRange must be 0..99\n" "\tand minValue must not be greater than maxValue" % (minValue, maxValue)) return self.slider.setRange(minValue, maxValue) class CannonField(QtWidgets.QWidget): angleChanged = QtCore.Signal(int) def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) self.currentAngle = 45 self.setPalette(QtGui.QPalette(QtGui.QColor(250, 250, 200))) self.setAutoFillBackground(True) def angle(self): return self.currentAngle @QtCore.Slot(int) def setAngle(self, angle): if angle < 5: angle = 5 if angle > 70: angle = 70 if self.currentAngle == angle: return self.currentAngle = angle self.update() self.emit(QtCore.SIGNAL("angleChanged(int)"), self.currentAngle) def paintEvent(self, event): painter = QtGui.QPainter(self) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(QtCore.Qt.blue) painter.translate(0, self.rect().height()) painter.drawPie(QtCore.QRect(-35, -35, 70, 70), 0, 90 * 16) painter.rotate(-self.currentAngle) painter.drawRect(QtCore.QRect(33, -4, 15, 8)) class MyWidget(QtWidgets.QWidget): def __init__(self, parent=None): QtWidgets.QWidget.__init__(self, parent) quit = QtWidgets.QPushButton("Quit") quit.setFont(QtGui.QFont("Times", 18, QtGui.QFont.Bold)) self.connect(quit, QtCore.SIGNAL("clicked()"), qApp, QtCore.SLOT("quit()")) angle = LCDRange() angle.setRange(5, 70) cannonField = CannonField() self.connect(angle, QtCore.SIGNAL("valueChanged(int)"), cannonField.setAngle) self.connect(cannonField, QtCore.SIGNAL("angleChanged(int)"), angle.setValue) gridLayout = QtWidgets.QGridLayout() gridLayout.addWidget(quit, 0, 0) gridLayout.addWidget(angle, 1, 0) gridLayout.addWidget(cannonField, 1, 1, 2, 1) gridLayout.setColumnStretch(1, 10) self.setLayout(gridLayout) angle.setValue(60) angle.setFocus() app = QtWidgets.QApplication(sys.argv) widget = MyWidget() widget.setGeometry(100, 100, 500, 355) widget.show() sys.exit(app.exec_()) examples/tutorial/tutorial.pyproject000066400000000000000000000002611376617013100203470ustar00rootroot00000000000000{ "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"] } examples/uiloader/000077500000000000000000000000001376617013100145055ustar00rootroot00000000000000examples/uiloader/uiloader.py000066400000000000000000000056511376617013100166720ustar00rootroot00000000000000############################################################################# ## ## 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$ ## ############################################################################# """QUiLoader example, showing how to dynamically load a Qt Designer form from a UI file.""" from argparse import ArgumentParser, RawTextHelpFormatter import sys from PySide2.QtCore import Qt, QFile, QIODevice from PySide2.QtWidgets import QApplication, QWidget from PySide2.QtUiTools import QUiLoader if __name__ == '__main__': arg_parser = ArgumentParser(description="QUiLoader example", formatter_class=RawTextHelpFormatter) arg_parser.add_argument('file', type=str, help='UI file') args = arg_parser.parse_args() ui_file_name = args.file app = QApplication(sys.argv) ui_file = QFile(ui_file_name) if not ui_file.open(QIODevice.ReadOnly): print("Cannot open {}: {}".format(ui_file_name, ui_file.errorString())) sys.exit(-1) loader = QUiLoader() widget = loader.load(ui_file, None) ui_file.close() if not widget: print(loader.errorString()) sys.exit(-1) widget.show() sys.exit(app.exec_()) examples/utils/000077500000000000000000000000001376617013100140415ustar00rootroot00000000000000examples/utils/pyside2_config.py000066400000000000000000000313531376617013100173240ustar00rootroot00000000000000############################################################################# ## ## 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 os, glob, re, sys from distutils import sysconfig generic_error = (' Did you forget to activate your virtualenv? Or perhaps' ' you forgot to build / install PySide2 into your currently active Python' ' environment?') pyside2_error = 'Unable to locate PySide2.' + generic_error shiboken2_module_error = 'Unable to locate shiboken2-module.' + generic_error shiboken2_generator_error = 'Unable to locate shiboken2-generator.' + generic_error pyside2_libs_error = 'Unable to locate the PySide2 shared libraries.' + generic_error python_link_error = 'Unable to locate the Python library for linking.' python_include_error = 'Unable to locate the Python include headers directory.' options = [] # option, function, error, description options.append(("--shiboken2-module-path", lambda: find_shiboken2_module(), shiboken2_module_error, "Print shiboken2 module location")) options.append(("--shiboken2-generator-path", lambda: find_shiboken2_generator(), shiboken2_generator_error, "Print shiboken2 generator location")) options.append(("--pyside2-path", lambda: find_pyside2(), pyside2_error, "Print PySide2 location")) options.append(("--python-include-path", lambda: get_python_include_path(), python_include_error, "Print Python include path")) options.append(("--shiboken2-generator-include-path", lambda: get_package_include_path(Package.shiboken2_generator), pyside2_error, "Print shiboken2 generator include paths")) options.append(("--pyside2-include-path", lambda: get_package_include_path(Package.pyside2), pyside2_error, "Print PySide2 include paths")) options.append(("--python-link-flags-qmake", lambda: python_link_flags_qmake(), python_link_error, "Print python link flags for qmake")) options.append(("--python-link-flags-cmake", lambda: python_link_flags_cmake(), python_link_error, "Print python link flags for cmake")) options.append(("--shiboken2-module-qmake-lflags", lambda: get_package_qmake_lflags(Package.shiboken2_module), pyside2_error, "Print shiboken2 shared library link flags for qmake")) options.append(("--pyside2-qmake-lflags", lambda: get_package_qmake_lflags(Package.pyside2), pyside2_error, "Print PySide2 shared library link flags for qmake")) options.append(("--shiboken2-module-shared-libraries-qmake", lambda: get_shared_libraries_qmake(Package.shiboken2_module), pyside2_libs_error, "Print paths of shiboken2 shared libraries (.so's, .dylib's, .dll's) for qmake")) options.append(("--shiboken2-module-shared-libraries-cmake", lambda: get_shared_libraries_cmake(Package.shiboken2_module), pyside2_libs_error, "Print paths of shiboken2 shared libraries (.so's, .dylib's, .dll's) for cmake")) options.append(("--pyside2-shared-libraries-qmake", lambda: get_shared_libraries_qmake(Package.pyside2), pyside2_libs_error, "Print paths of PySide2 shared libraries (.so's, .dylib's, .dll's) for qmake")) options.append(("--pyside2-shared-libraries-cmake", lambda: get_shared_libraries_cmake(Package.pyside2), pyside2_libs_error, "Print paths of PySide2 shared libraries (.so's, .dylib's, .dll's) for cmake")) options_usage = '' for i, (flag, _, _, description) in enumerate(options): options_usage += ' {:<45} {}'.format(flag, description) if i < len(options) - 1: options_usage += '\n' usage = """ Utility to determine include/link options of shiboken2/PySide2 and Python for qmake/CMake projects that would like to embed or build custom shiboken2/PySide2 bindings. Usage: pyside2_config.py [option] Options: {} -a Print all options and their values --help/-h Print this help """.format(options_usage) option = sys.argv[1] if len(sys.argv) == 2 else '-a' if option == '-h' or option == '--help': print(usage) sys.exit(0) class Package(object): shiboken2_module = 1 shiboken2_generator = 2 pyside2 = 3 def clean_path(path): return path if sys.platform != 'win32' else path.replace('\\', '/') def shared_library_suffix(): if sys.platform == 'win32': return 'lib' elif sys.platform == 'darwin': return 'dylib' # Linux else: return 'so.*' def import_suffixes(): if (sys.version_info >= (3, 4)): import importlib.machinery return importlib.machinery.EXTENSION_SUFFIXES else: import imp result = [] for t in imp.get_suffixes(): result.append(t[0]) return result def is_debug(): debug_suffix = '_d.pyd' if sys.platform == 'win32' else '_d.so' return any([s.endswith(debug_suffix) for s in import_suffixes()]) def shared_library_glob_pattern(): glob = '*.' + shared_library_suffix() return glob if sys.platform == 'win32' else 'lib' + glob def filter_shared_libraries(libs_list): def predicate(lib_name): basename = os.path.basename(lib_name) if 'shiboken' in basename or 'pyside2' in basename: return True return False result = [lib for lib in libs_list if predicate(lib)] return result # Return qmake link option for a library file name def link_option(lib): # On Linux: # Since we cannot include symlinks with wheel packages # we are using an absolute path for the libpyside and libshiboken # libraries when compiling the project baseName = os.path.basename(lib) link = ' -l' if sys.platform in ['linux', 'linux2']: # Linux: 'libfoo.so' -> '/absolute/path/libfoo.so' link = lib elif sys.platform in ['darwin']: # Darwin: 'libfoo.so' -> '-lfoo' link += os.path.splitext(baseName[3:])[0] else: # Windows: 'libfoo.dll' -> 'libfoo.dll' link += os.path.splitext(baseName)[0] return link # Locate PySide2 via sys.path package path. def find_pyside2(): return find_package_path("PySide2") def find_shiboken2_module(): return find_package_path("shiboken2") def find_shiboken2_generator(): return find_package_path("shiboken2_generator") def find_package(which_package): if which_package == Package.shiboken2_module: return find_shiboken2_module() if which_package == Package.shiboken2_generator: return find_shiboken2_generator() if which_package == Package.pyside2: return find_pyside2() return None def find_package_path(dir_name): for p in sys.path: if 'site-' in p: package = os.path.join(p, dir_name) if os.path.exists(package): return clean_path(os.path.realpath(package)) return None # Return version as "3.5" def python_version(): return str(sys.version_info[0]) + '.' + str(sys.version_info[1]) def get_python_include_path(): return sysconfig.get_python_inc() def python_link_flags_qmake(): flags = python_link_data() if sys.platform == 'win32': libdir = flags['libdir'] # This will add the "~1" shortcut for directories that # contain white spaces # e.g.: "Program Files" to "Progra~1" for d in libdir.split("\\"): if " " in d: libdir = libdir.replace(d, d.split(" ")[0][:-1]+"~1") return '-L{} -l{}'.format(libdir, flags['lib']) elif sys.platform == 'darwin': return '-L{} -l{}'.format(flags['libdir'], flags['lib']) else: # Linux and anything else return '-L{} -l{}'.format(flags['libdir'], flags['lib']) def python_link_flags_cmake(): flags = python_link_data() libdir = flags['libdir'] lib = re.sub(r'.dll$', '.lib', flags['lib']) return '{};{}'.format(libdir, lib) def python_link_data(): # @TODO Fix to work with static builds of Python libdir = sysconfig.get_config_var('LIBDIR') if libdir is None: libdir = os.path.abspath(os.path.join( sysconfig.get_config_var('LIBDEST'), "..", "libs")) version = python_version() version_no_dots = version.replace('.', '') flags = {} flags['libdir'] = libdir if sys.platform == 'win32': suffix = '_d' if is_debug() else '' flags['lib'] = 'python{}{}'.format(version_no_dots, suffix) elif sys.platform == 'darwin': flags['lib'] = 'python{}'.format(version) # Linux and anything else else: if sys.version_info[0] < 3: suffix = '_d' if is_debug() else '' flags['lib'] = 'python{}{}'.format(version, suffix) else: flags['lib'] = 'python{}{}'.format(version, sys.abiflags) return flags def get_package_include_path(which_package): package_path = find_package(which_package) if package_path is None: return None includes = "{0}/include".format(package_path) return includes def get_package_qmake_lflags(which_package): package_path = find_package(which_package) if package_path is None: return None link = "-L{}".format(package_path) glob_result = glob.glob(os.path.join(package_path, shared_library_glob_pattern())) for lib in filter_shared_libraries(glob_result): link += ' ' link += link_option(lib) return link def get_shared_libraries_data(which_package): package_path = find_package(which_package) if package_path is None: return None glob_result = glob.glob(os.path.join(package_path, shared_library_glob_pattern())) filtered_libs = filter_shared_libraries(glob_result) libs = [] if sys.platform == 'win32': for lib in filtered_libs: libs.append(os.path.realpath(lib)) else: for lib in filtered_libs: libs.append(lib) return libs def get_shared_libraries_qmake(which_package): libs = get_shared_libraries_data(which_package) if libs is None: return None if sys.platform == 'win32': if not libs: return '' dlls = '' for lib in libs: dll = os.path.splitext(lib)[0] + '.dll' dlls += dll + ' ' return dlls else: libs_string = '' for lib in libs: libs_string += lib + ' ' return libs_string def get_shared_libraries_cmake(which_package): libs = get_shared_libraries_data(which_package) result = ';'.join(libs) return result print_all = option == "-a" for argument, handler, error, _ in options: if option == argument or print_all: handler_result = handler() if handler_result is None: sys.exit(error) line = handler_result if print_all: line = "{:<40}: ".format(argument) + line print(line) examples/utils/utils.py000066400000000000000000000040341376617013100155540ustar00rootroot00000000000000 ############################################################################# ## ## 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 isPY3 = sys.version_info[0] == 3 if isPY3: text_type = str else: text_type = unicode examples/webchannel/000077500000000000000000000000001376617013100150075ustar00rootroot00000000000000examples/webchannel/standalone/000077500000000000000000000000001376617013100171375ustar00rootroot00000000000000examples/webchannel/standalone/core.py000066400000000000000000000052251376617013100204450ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ## 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 QObject, Signal, Slot class Core(QObject): """An instance of this class gets published over the WebChannel and is then accessible to HTML clients.""" sendText = Signal(str) def __init__(self, dialog, parent=None): super(Core, self).__init__(parent) self._dialog = dialog self._dialog.sendText.connect(self._emit_send_text) @Slot(str) def _emit_send_text(self, text): self.sendText.emit(text) @Slot(str) def receiveText(self, text): self._dialog.displayMessage("Received message: {}".format(text)) examples/webchannel/standalone/dialog.py000066400000000000000000000053661376617013100207620ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ## 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 Signal, Slot from PySide2.QtWidgets import QDialog from ui_dialog import Ui_Dialog class Dialog(QDialog): sendText = Signal(str) def __init__(self, parent=None): super(Dialog, self).__init__(parent) self._ui = Ui_Dialog() self._ui.setupUi(self) self._ui.send.clicked.connect(self.clicked) @Slot(str) def displayMessage(self, message): self._ui.output.appendPlainText(message) @Slot() def clicked(self): text = self._ui.input.text() if not text: return self.sendText.emit(text) self.displayMessage("Sent message: {}".format(text)) self._ui.input.clear() examples/webchannel/standalone/dialog.ui000066400000000000000000000022461376617013100207410ustar00rootroot00000000000000 Dialog 0 0 400 300 Dialog Message Contents Send true Initializing WebChannel... false examples/webchannel/standalone/index.html000066400000000000000000000056501376617013100211420ustar00rootroot00000000000000
examples/webchannel/standalone/main.py000066400000000000000000000075771376617013100204550ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2016 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ## 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 os import sys from PySide2.QtWidgets import QApplication from PySide2.QtGui import QDesktopServices from PySide2.QtNetwork import QHostAddress, QSslSocket from PySide2.QtCore import (QFile, QFileInfo, QUrl) from PySide2.QtWebChannel import QWebChannel from PySide2.QtWebSockets import QWebSocketServer from dialog import Dialog from core import Core from websocketclientwrapper import WebSocketClientWrapper if __name__ == '__main__': app = QApplication(sys.argv) if not QSslSocket.supportsSsl(): print('The example requires SSL support.') sys.exit(-1) cur_dir = os.path.dirname(os.path.abspath(__file__)) jsFileInfo = QFileInfo(cur_dir + "/qwebchannel.js") if not jsFileInfo.exists(): QFile.copy(":/qtwebchannel/qwebchannel.js", jsFileInfo.absoluteFilePath()) # setup the QWebSocketServer server = QWebSocketServer("QWebChannel Standalone Example Server", QWebSocketServer.NonSecureMode) if not server.listen(QHostAddress.LocalHost, 12345): print("Failed to open web socket server.") sys.exit(-1) # wrap WebSocket clients in QWebChannelAbstractTransport objects clientWrapper = WebSocketClientWrapper(server) # setup the channel channel = QWebChannel() clientWrapper.clientConnected.connect(channel.connectTo) # setup the UI dialog = Dialog() # setup the core and publish it to the QWebChannel core = Core(dialog) channel.registerObject("core", core) # open a browser window with the client HTML page url = QUrl.fromLocalFile(cur_dir + "/index.html") QDesktopServices.openUrl(url) message = "Initialization complete, opening browser at {}.".format( url.toDisplayString()) dialog.displayMessage(message) dialog.show() sys.exit(app.exec_()) examples/webchannel/standalone/standalone.pyproject000066400000000000000000000002241376617013100232260ustar00rootroot00000000000000{ "files": ["main.py", "core.py", "dialog.py", "websocketclientwrapper.py", "websockettransport.py", "dialog.ui", "index.html"] } examples/webchannel/standalone/ui_dialog.py000066400000000000000000000036551376617013100214560ustar00rootroot00000000000000# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'dialog.ui' ## ## Created by: Qt User Interface Compiler version 5.14.1 ## ## 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 (QBrush, QColor, QConicalGradient, QCursor, QFont, QFontDatabase, QIcon, QLinearGradient, QPalette, QPainter, QPixmap, QRadialGradient) from PySide2.QtWidgets import * class Ui_Dialog(object): def setupUi(self, Dialog): if not Dialog.objectName(): Dialog.setObjectName(u"Dialog") Dialog.resize(400, 300) self.gridLayout = QGridLayout(Dialog) self.gridLayout.setObjectName(u"gridLayout") self.input = QLineEdit(Dialog) self.input.setObjectName(u"input") self.gridLayout.addWidget(self.input, 1, 0, 1, 1) self.send = QPushButton(Dialog) self.send.setObjectName(u"send") self.gridLayout.addWidget(self.send, 1, 1, 1, 1) self.output = QPlainTextEdit(Dialog) self.output.setObjectName(u"output") self.output.setReadOnly(True) self.output.setPlainText(u"Initializing WebChannel...") self.output.setBackgroundVisible(False) self.gridLayout.addWidget(self.output, 0, 0, 1, 2) self.retranslateUi(Dialog) QMetaObject.connectSlotsByName(Dialog) # setupUi def retranslateUi(self, Dialog): Dialog.setWindowTitle(QCoreApplication.translate("Dialog", u"Dialog", None)) self.input.setPlaceholderText(QCoreApplication.translate("Dialog", u"Message Contents", None)) self.send.setText(QCoreApplication.translate("Dialog", u"Send", None)) # retranslateUi examples/webchannel/standalone/websocketclientwrapper.py000066400000000000000000000064501376617013100243040ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ## 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 QObject, Signal, Slot from websockettransport import WebSocketTransport class WebSocketClientWrapper(QObject): """Wraps connected QWebSockets clients in WebSocketTransport objects. This code is all that is required to connect incoming WebSockets to the WebChannel. Any kind of remote JavaScript client that supports WebSockets can thus receive messages and access the published objects. """ clientConnected = Signal(WebSocketTransport) def __init__(self, server, parent=None): """Construct the client wrapper with the given parent. All clients connecting to the QWebSocketServer will be automatically wrapped in WebSocketTransport objects.""" super(WebSocketClientWrapper, self).__init__(parent) self._server = server self._server.newConnection.connect(self.handleNewConnection) self._transports = [] @Slot() def handleNewConnection(self): """Wrap an incoming WebSocket connection in a WebSocketTransport object.""" socket = self._server.nextPendingConnection() transport = WebSocketTransport(socket) self._transports.append(transport) self.clientConnected.emit(transport) examples/webchannel/standalone/websockettransport.py000066400000000000000000000077661376617013100234740ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2017 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author Milian Wolff ## 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.QtWebChannel import QWebChannelAbstractTransport from PySide2.QtCore import QByteArray, QJsonDocument, Slot class WebSocketTransport(QWebChannelAbstractTransport): """QWebChannelAbstractSocket implementation using a QWebSocket internally. The transport delegates all messages received over the QWebSocket over its textMessageReceived signal. Analogously, all calls to sendTextMessage will be sent over the QWebSocket to the remote client. """ def __init__(self, socket): """Construct the transport object and wrap the given socket. The socket is also set as the parent of the transport object.""" super(WebSocketTransport, self).__init__(socket) self._socket = socket self._socket.textMessageReceived.connect(self.textMessageReceived) self._socket.disconnected.connect(self._disconnected) def __del__(self): """Destroys the WebSocketTransport.""" self._socket.deleteLater() def _disconnected(self): self.deleteLater() def sendMessage(self, message): """Serialize the JSON message and send it as a text message via the WebSocket to the client.""" doc = QJsonDocument(message) json_message = str(doc.toJson(QJsonDocument.Compact), "utf-8") self._socket.sendTextMessage(json_message) @Slot(str) def textMessageReceived(self, message_data_in): """Deserialize the stringified JSON messageData and emit messageReceived.""" message_data = QByteArray(bytes(message_data_in, encoding='utf8')) message = QJsonDocument.fromJson(message_data) if message.isNull(): print("Failed to parse text message as JSON object:", message_data) return if not message.isObject(): print("Received JSON message that is not an object: ", message_data) return self.messageReceived.emit(message.object(), self) examples/webenginequick/000077500000000000000000000000001376617013100157015ustar00rootroot00000000000000examples/webenginequick/browser.qml000066400000000000000000000042141376617013100201000ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2018 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 QtQuick 2.0 import QtQuick.Window 2.0 import QtWebEngine 1.0 Window { width: 1024 height: 768 visible: true WebEngineView { anchors.fill: parent url: "https://www.qt.io" } } examples/webenginequick/quicknanobrowser.py000066400000000000000000000047241376617013100216560ustar00rootroot00000000000000############################################################################# ## ## 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 WebEngine QtQuick 2 Example""" import os from PySide2.QtCore import QUrl from PySide2.QtQml import QQmlApplicationEngine from PySide2.QtWidgets import QApplication from PySide2.QtWebEngine import QtWebEngine def main(): app = QApplication([]) QtWebEngine.initialize() engine = QQmlApplicationEngine() qml_file_path = os.path.join(os.path.dirname(__file__), 'browser.qml') qml_url = QUrl.fromLocalFile(os.path.abspath(qml_file_path)) engine.load(qml_url) app.exec_() if __name__ == '__main__': main() examples/webenginequick/webenginequick.pyproject000066400000000000000000000000701376617013100226370ustar00rootroot00000000000000{ "files": ["quicknanobrowser.py", "browser.qml"] } examples/webenginewidgets/000077500000000000000000000000001376617013100162335ustar00rootroot00000000000000examples/webenginewidgets/simplebrowser.py000066400000000000000000000102001376617013100214730ustar00rootroot00000000000000 ############################################################################# ## ## 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 WebEngineWidgets Example""" import sys from PySide2.QtCore import QUrl from PySide2.QtGui import QIcon from PySide2.QtWidgets import (QApplication, QLineEdit, QMainWindow, QPushButton, QToolBar) from PySide2.QtWebEngineWidgets import QWebEnginePage, QWebEngineView class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 WebEngineWidgets Example') self.toolBar = QToolBar() self.addToolBar(self.toolBar) self.backButton = QPushButton() self.backButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/left-32.png')) self.backButton.clicked.connect(self.back) self.toolBar.addWidget(self.backButton) self.forwardButton = QPushButton() self.forwardButton.setIcon(QIcon(':/qt-project.org/styles/commonstyle/images/right-32.png')) self.forwardButton.clicked.connect(self.forward) self.toolBar.addWidget(self.forwardButton) self.addressLineEdit = QLineEdit() self.addressLineEdit.returnPressed.connect(self.load) self.toolBar.addWidget(self.addressLineEdit) self.webEngineView = QWebEngineView() self.setCentralWidget(self.webEngineView) initialUrl = 'http://qt.io' self.addressLineEdit.setText(initialUrl) self.webEngineView.load(QUrl(initialUrl)) self.webEngineView.page().titleChanged.connect(self.setWindowTitle) self.webEngineView.page().urlChanged.connect(self.urlChanged) def load(self): url = QUrl.fromUserInput(self.addressLineEdit.text()) if url.isValid(): self.webEngineView.load(url) def back(self): self.webEngineView.page().triggerAction(QWebEnginePage.Back) def forward(self): self.webEngineView.page().triggerAction(QWebEnginePage.Forward) def urlChanged(self, url): self.addressLineEdit.setText(url.toString()) if __name__ == '__main__': app = QApplication(sys.argv) mainWin = MainWindow() availableGeometry = app.desktop().availableGeometry(mainWin) mainWin.resize(availableGeometry.width() * 2 / 3, availableGeometry.height() * 2 / 3) mainWin.show() sys.exit(app.exec_()) examples/webenginewidgets/tabbedbrowser/000077500000000000000000000000001376617013100210605ustar00rootroot00000000000000examples/webenginewidgets/tabbedbrowser/bookmarkwidget.py000066400000000000000000000254561376617013100244570ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 json import os import warnings from PySide2 import QtCore from PySide2.QtCore import QDir, QFileInfo, QStandardPaths, Qt, QUrl from PySide2.QtGui import QIcon, QStandardItem, QStandardItemModel from PySide2.QtWidgets import QMenu, QMessageBox, QTreeView _url_role = Qt.UserRole + 1 # Default bookmarks as an array of arrays which is the form # used to read from/write to a .json bookmarks file _default_bookmarks = [ ['Tool Bar'], ['http://qt.io', 'Qt', ':/qt-project.org/qmessagebox/images/qtlogo-64.png'], ['https://download.qt.io/snapshots/ci/pyside/', 'Downloads'], ['https://doc.qt.io/qtforpython/', 'Documentation'], ['https://bugreports.qt.io/projects/PYSIDE/', 'Bug Reports'], ['https://www.python.org/', 'Python', None], ['https://wiki.qt.io/PySide2', 'Qt for Python', None], ['Other Bookmarks'] ] def _config_dir(): return '{}/QtForPythonBrowser'.format( QStandardPaths.writableLocation(QStandardPaths.ConfigLocation)) _bookmark_file = 'bookmarks.json' def _create_folder_item(title): result = QStandardItem(title) result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) return result def _create_item(url, title, icon): result = QStandardItem(title) result.setFlags(Qt.ItemIsEnabled | Qt.ItemIsSelectable) result.setData(url, _url_role) if icon is not None: result.setIcon(icon) return result # Create the model from an array of arrays def _create_model(parent, serialized_bookmarks): result = QStandardItemModel(0, 1, parent) last_folder_item = None for entry in serialized_bookmarks: if len(entry) == 1: last_folder_item = _create_folder_item(entry[0]) result.appendRow(last_folder_item) else: url = QUrl.fromUserInput(entry[0]) title = entry[1] icon = QIcon(entry[2]) if len(entry) > 2 and entry[2] else None last_folder_item.appendRow(_create_item(url, title, icon)) return result # Serialize model into an array of arrays, writing out the icons # into .png files under directory in the process def _serialize_model(model, directory): result = [] folder_count = model.rowCount() for f in range(0, folder_count): folder_item = model.item(f) result.append([folder_item.text()]) item_count = folder_item.rowCount() for i in range(0, item_count): item = folder_item.child(i) entry = [item.data(_url_role).toString(), item.text()] icon = item.icon() if not icon.isNull(): icon_sizes = icon.availableSizes() largest_size = icon_sizes[len(icon_sizes) - 1] icon_file_name = '{}/icon{:02}_{:02}_{}.png'.format(directory, f, i, largest_size.width()) icon.pixmap(largest_size).save(icon_file_name, 'PNG') entry.append(icon_file_name) result.append(entry) return result # Bookmarks as a tree view to be used in a dock widget with # functionality to persist and populate tool bars and menus. class BookmarkWidget(QTreeView): """Provides a tree view to manage the bookmarks.""" open_bookmark = QtCore.Signal(QUrl) open_bookmark_in_new_tab = QtCore.Signal(QUrl) changed = QtCore.Signal() def __init__(self): super(BookmarkWidget, self).__init__() self.setRootIsDecorated(False) self.setUniformRowHeights(True) self.setHeaderHidden(True) self._model = _create_model(self, self._read_bookmarks()) self.setModel(self._model) self.expandAll() self.activated.connect(self._activated) self._model.rowsInserted.connect(self._changed) self._model.rowsRemoved.connect(self._changed) self._model.dataChanged.connect(self._changed) self._modified = False def _changed(self): self._modified = True self.changed.emit() def _activated(self, index): item = self._model.itemFromIndex(index) self.open_bookmark.emit(item.data(_url_role)) def _action_activated(self, index): action = self.sender() self.open_bookmark.emit(action.data()) def _tool_bar_item(self): return self._model.item(0, 0) def _other_item(self): return self._model.item(1, 0) def add_bookmark(self, url, title, icon): self._other_item().appendRow(_create_item(url, title, icon)) def add_tool_bar_bookmark(self, url, title, icon): self._tool_bar_item().appendRow(_create_item(url, title, icon)) # Synchronize the bookmarks under parent_item to a target_object # like QMenu/QToolBar, which has a list of actions. Update # the existing actions, append new ones if needed or hide # superfluous ones def _populate_actions(self, parent_item, target_object, first_action): existing_actions = target_object.actions() existing_action_count = len(existing_actions) a = first_action row_count = parent_item.rowCount() for r in range(0, row_count): item = parent_item.child(r) title = item.text() icon = item.icon() url = item.data(_url_role) if a < existing_action_count: action = existing_actions[a] if (title != action.toolTip()): action.setText(BookmarkWidget.short_title(title)) action.setIcon(icon) action.setToolTip(title) action.setData(url) action.setVisible(True) else: short_title = BookmarkWidget.short_title(title) action = target_object.addAction(icon, short_title) action.setToolTip(title) action.setData(url) action.triggered.connect(self._action_activated) a = a + 1 while a < existing_action_count: existing_actions[a].setVisible(False) a = a + 1 def populate_tool_bar(self, tool_bar): self._populate_actions(self._tool_bar_item(), tool_bar, 0) def populate_other(self, menu, first_action): self._populate_actions(self._other_item(), menu, first_action) def _current_item(self): index = self.currentIndex() if index.isValid(): item = self._model.itemFromIndex(index) if item.parent(): # exclude top level items return item return None def context_menu_event(self, event): context_menu = QMenu() open_in_new_tab_action = context_menu.addAction("Open in New Tab") remove_action = context_menu.addAction("Remove...") current_item = self._current_item() open_in_new_tab_action.setEnabled(current_item is not None) remove_action.setEnabled(current_item is not None) chosen_action = context_menu.exec_(event.globalPos()) if chosen_action == open_in_new_tab_action: self.open_bookmarkInNewTab.emit(current_item.data(_url_role)) elif chosen_action == remove_action: self._remove_item(current_item) def _remove_item(self, item): message = "Would you like to remove \"{}\"?".format(item.text()) button = QMessageBox.question(self, "Remove", message, QMessageBox.Yes | QMessageBox.No) if button == QMessageBox.Yes: item.parent().removeRow(item.row()) def write_bookmarks(self): if not self._modified: return dir_path = _config_dir() native_dir_path = QDir.toNativeSeparators(dir_path) dir = QFileInfo(dir_path) if not dir.isDir(): print('Creating {}...'.format(native_dir_path)) if not QDir(dir.absolutePath()).mkpath(dir.fileName()): warnings.warn('Cannot create {}.'.format(native_dir_path), RuntimeWarning) return serialized_model = _serialize_model(self._model, dir_path) bookmark_file_name = os.path.join(native_dir_path, _bookmark_file) print('Writing {}...'.format(bookmark_file_name)) with open(bookmark_file_name, 'w') as bookmark_file: json.dump(serialized_model, bookmark_file, indent=4) def _read_bookmarks(self): bookmark_file_name = os.path.join(QDir.toNativeSeparators(_config_dir()), _bookmark_file) if os.path.exists(bookmark_file_name): print('Reading {}...'.format(bookmark_file_name)) return json.load(open(bookmark_file_name)) return _default_bookmarks # Return a short title for a bookmark action, # "Qt | Cross Platform.." -> "Qt" @staticmethod def short_title(t): i = t.find(' | ') if i == -1: i = t.find(' - ') return t[0:i] if i != -1 else t examples/webenginewidgets/tabbedbrowser/browsertabwidget.py000066400000000000000000000234611376617013100250160ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 functools import partial from bookmarkwidget import BookmarkWidget from webengineview import WebEngineView from historywindow import HistoryWindow from PySide2 import QtCore from PySide2.QtCore import Qt, QUrl from PySide2.QtWidgets import QMenu, QTabBar, QTabWidget from PySide2.QtWebEngineWidgets import QWebEngineDownloadItem, QWebEnginePage class BrowserTabWidget(QTabWidget): """Enables having several tabs with QWebEngineView.""" url_changed = QtCore.Signal(QUrl) enabled_changed = QtCore.Signal(QWebEnginePage.WebAction, bool) download_requested = QtCore.Signal(QWebEngineDownloadItem) def __init__(self, window_factory_function): super(BrowserTabWidget, self).__init__() self.setTabsClosable(True) self._window_factory_function = window_factory_function self._webengineviews = [] self._history_windows = {} # map WebengineView to HistoryWindow self.currentChanged.connect(self._current_changed) self.tabCloseRequested.connect(self.handle_tab_close_request) self._actions_enabled = {} for web_action in WebEngineView.web_actions(): self._actions_enabled[web_action] = False tab_bar = self.tabBar() tab_bar.setSelectionBehaviorOnRemove(QTabBar.SelectPreviousTab) tab_bar.setContextMenuPolicy(Qt.CustomContextMenu) tab_bar.customContextMenuRequested.connect(self._handle_tab_context_menu) def add_browser_tab(self): factory_func = partial(BrowserTabWidget.add_browser_tab, self) web_engine_view = WebEngineView(factory_func, self._window_factory_function) index = self.count() self._webengineviews.append(web_engine_view) title = 'Tab {}'.format(index + 1) self.addTab(web_engine_view, title) page = web_engine_view.page() page.titleChanged.connect(self._title_changed) page.iconChanged.connect(self._icon_changed) page.profile().downloadRequested.connect(self._download_requested) web_engine_view.urlChanged.connect(self._url_changed) web_engine_view.enabled_changed.connect(self._enabled_changed) self.setCurrentIndex(index) return web_engine_view def load(self, url): index = self.currentIndex() if index >= 0 and url.isValid(): self._webengineviews[index].setUrl(url) def find(self, needle, flags): index = self.currentIndex() if index >= 0: self._webengineviews[index].page().findText(needle, flags) def url(self): index = self.currentIndex() return self._webengineviews[index].url() if index >= 0 else QUrl() def _url_changed(self, url): index = self.currentIndex() if index >= 0 and self._webengineviews[index] == self.sender(): self.url_changed.emit(url) def _title_changed(self, title): index = self._index_of_page(self.sender()) if (index >= 0): self.setTabText(index, BookmarkWidget.short_title(title)) def _icon_changed(self, icon): index = self._index_of_page(self.sender()) if (index >= 0): self.setTabIcon(index, icon) def _enabled_changed(self, web_action, enabled): index = self.currentIndex() if index >= 0 and self._webengineviews[index] == self.sender(): self._check_emit_enabled_changed(web_action, enabled) def _check_emit_enabled_changed(self, web_action, enabled): if enabled != self._actions_enabled[web_action]: self._actions_enabled[web_action] = enabled self.enabled_changed.emit(web_action, enabled) def _current_changed(self, index): self._update_actions(index) self.url_changed.emit(self.url()) def _update_actions(self, index): if index >= 0 and index < len(self._webengineviews): view = self._webengineviews[index] for web_action in WebEngineView.web_actions(): enabled = view.is_web_action_enabled(web_action) self._check_emit_enabled_changed(web_action, enabled) def back(self): self._trigger_action(QWebEnginePage.Back) def forward(self): self._trigger_action(QWebEnginePage.Forward) def reload(self): self._trigger_action(QWebEnginePage.Reload) def undo(self): self._trigger_action(QWebEnginePage.Undo) def redo(self): self._trigger_action(QWebEnginePage.Redo) def cut(self): self._trigger_action(QWebEnginePage.Cut) def copy(self): self._trigger_action(QWebEnginePage.Copy) def paste(self): self._trigger_action(QWebEnginePage.Paste) def select_all(self): self._trigger_action(QWebEnginePage.SelectAll) def show_history(self): index = self.currentIndex() if index >= 0: webengineview = self._webengineviews[index] history_window = self._history_windows.get(webengineview) if not history_window: history = webengineview.page().history() history_window = HistoryWindow(history, self) history_window.open_url.connect(self.load) history_window.setWindowFlags(history_window.windowFlags() | Qt.Window) history_window.setWindowTitle('History') self._history_windows[webengineview] = history_window else: history_window.refresh() history_window.show() history_window.raise_() def zoom_factor(self): return self._webengineviews[0].zoomFactor() if self._webengineviews else 1.0 def set_zoom_factor(self, z): for w in self._webengineviews: w.setZoomFactor(z) def _handle_tab_context_menu(self, point): index = self.tabBar().tabAt(point) if index < 0: return tab_count = len(self._webengineviews) context_menu = QMenu() duplicate_tab_action = context_menu.addAction("Duplicate Tab") close_other_tabs_action = context_menu.addAction("Close Other Tabs") close_other_tabs_action.setEnabled(tab_count > 1) close_tabs_to_the_right_action = context_menu.addAction("Close Tabs to the Right") close_tabs_to_the_right_action.setEnabled(index < tab_count - 1) close_tab_action = context_menu.addAction("&Close Tab") chosen_action = context_menu.exec_(self.tabBar().mapToGlobal(point)) if chosen_action == duplicate_tab_action: current_url = self.url() self.add_browser_tab().load(current_url) elif chosen_action == close_other_tabs_action: for t in range(tab_count - 1, -1, -1): if t != index: self.handle_tab_close_request(t) elif chosen_action == close_tabs_to_the_right_action: for t in range(tab_count - 1, index, -1): self.handle_tab_close_request(t) elif chosen_action == close_tab_action: self.handle_tab_close_request(index) def handle_tab_close_request(self, index): if (index >= 0 and self.count() > 1): webengineview = self._webengineviews[index] if self._history_windows.get(webengineview): del self._history_windows[webengineview] self._webengineviews.remove(webengineview) self.removeTab(index) def close_current_tab(self): self.handle_tab_close_request(self.currentIndex()) def _trigger_action(self, action): index = self.currentIndex() if index >= 0: self._webengineviews[index].page().triggerAction(action) def _index_of_page(self, web_page): for p in range(0, len(self._webengineviews)): if (self._webengineviews[p].page() == web_page): return p return -1 def _download_requested(self, item): self.download_requested.emit(item) examples/webenginewidgets/tabbedbrowser/downloadwidget.py000066400000000000000000000144741376617013100244570ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 from PySide2.QtCore import QDir, QFileInfo, QStandardPaths, Qt, QUrl from PySide2.QtGui import QDesktopServices from PySide2.QtWidgets import QMenu, QProgressBar, QStyleFactory from PySide2.QtWebEngineWidgets import QWebEngineDownloadItem # A QProgressBar with context menu for displaying downloads in a QStatusBar. class DownloadWidget(QProgressBar): """Lets you track progress of a QWebEngineDownloadItem.""" finished = QtCore.Signal() remove_requested = QtCore.Signal() def __init__(self, download_item): super(DownloadWidget, self).__init__() self._download_item = download_item download_item.finished.connect(self._finished) download_item.downloadProgress.connect(self._download_progress) download_item.stateChanged.connect(self._update_tool_tip()) path = download_item.path() self.setMaximumWidth(300) # Shorten 'PySide2-5.11.0a1-5.11.0-cp36-cp36m-linux_x86_64.whl'... description = QFileInfo(path).fileName() description_length = len(description) if description_length > 30: description = '{}...{}'.format(description[0:10], description[description_length - 10:]) self.setFormat('{} %p%'.format(description)) self.setOrientation(Qt.Horizontal) self.setMinimum(0) self.setValue(0) self.setMaximum(100) self._update_tool_tip() # Force progress bar text to be shown on macoS by using 'fusion' style if sys.platform == 'darwin': self.setStyle(QStyleFactory.create('fusion')) @staticmethod def open_file(file): QDesktopServices.openUrl(QUrl.fromLocalFile(file)) @staticmethod def open_download_directory(): path = QStandardPaths.writableLocation(QStandardPaths.DownloadLocation) DownloadWidget.open_file(path) def state(self): return self._download_item.state() def _update_tool_tip(self): path = self._download_item.path() tool_tip = "{}\n{}".format(self._download_item.url().toString(), QDir.toNativeSeparators(path)) total_bytes = self._download_item.totalBytes() if total_bytes > 0: tool_tip += "\n{}K".format(total_bytes / 1024) state = self.state() if state == QWebEngineDownloadItem.DownloadRequested: tool_tip += "\n(requested)" elif state == QWebEngineDownloadItem.DownloadInProgress: tool_tip += "\n(downloading)" elif state == QWebEngineDownloadItem.DownloadCompleted: tool_tip += "\n(completed)" elif state == QWebEngineDownloadItem.DownloadCancelled: tool_tip += "\n(cancelled)" else: tool_tip += "\n(interrupted)" self.setToolTip(tool_tip) def _download_progress(self, bytes_received, bytes_total): self.setValue(int(100 * bytes_received / bytes_total)) def _finished(self): self._update_tool_tip() self.finished.emit() def _launch(self): DownloadWidget.open_file(self._download_item.path()) def mouseDoubleClickEvent(self, event): if self.state() == QWebEngineDownloadItem.DownloadCompleted: self._launch() def contextMenuEvent(self, event): state = self.state() context_menu = QMenu() launch_action = context_menu.addAction("Launch") launch_action.setEnabled(state == QWebEngineDownloadItem.DownloadCompleted) show_in_folder_action = context_menu.addAction("Show in Folder") show_in_folder_action.setEnabled(state == QWebEngineDownloadItem.DownloadCompleted) cancel_action = context_menu.addAction("Cancel") cancel_action.setEnabled(state == QWebEngineDownloadItem.DownloadInProgress) remove_action = context_menu.addAction("Remove") remove_action.setEnabled(state != QWebEngineDownloadItem.DownloadInProgress) chosen_action = context_menu.exec_(event.globalPos()) if chosen_action == launch_action: self._launch() elif chosen_action == show_in_folder_action: path = QFileInfo(self._download_item.path()).absolutePath() DownloadWidget.open_file(path) elif chosen_action == cancel_action: self._download_item.cancel() elif chosen_action == remove_action: self.remove_requested.emit() examples/webenginewidgets/tabbedbrowser/findtoolbar.py000066400000000000000000000101041376617013100237310ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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 from PySide2.QtCore import Qt from PySide2.QtGui import QIcon, QKeySequence from PySide2.QtWidgets import QCheckBox, QLineEdit, QToolBar, QToolButton from PySide2.QtWebEngineWidgets import QWebEnginePage # A Find tool bar (bottom area) class FindToolBar(QToolBar): find = QtCore.Signal(str, QWebEnginePage.FindFlags) def __init__(self): super(FindToolBar, self).__init__() self._line_edit = QLineEdit() self._line_edit.setClearButtonEnabled(True) self._line_edit.setPlaceholderText("Find...") self._line_edit.setMaximumWidth(300) self._line_edit.returnPressed.connect(self._find_next) self.addWidget(self._line_edit) self._previous_button = QToolButton() style_icons = ':/qt-project.org/styles/commonstyle/images/' self._previous_button.setIcon(QIcon(style_icons + 'up-32.png')) self._previous_button.clicked.connect(self._find_previous) self.addWidget(self._previous_button) self._next_button = QToolButton() self._next_button.setIcon(QIcon(style_icons + 'down-32.png')) self._next_button.clicked.connect(self._find_next) self.addWidget(self._next_button) self._case_sensitive_checkbox = QCheckBox('Case Sensitive') self.addWidget(self._case_sensitive_checkbox) self._hideButton = QToolButton() self._hideButton.setShortcut(QKeySequence(Qt.Key_Escape)) self._hideButton.setIcon(QIcon(style_icons + 'closedock-16.png')) self._hideButton.clicked.connect(self.hide) self.addWidget(self._hideButton) def focus_find(self): self._line_edit.setFocus() def _emit_find(self, backward): needle = self._line_edit.text().strip() if needle: flags = QWebEnginePage.FindFlags() if self._case_sensitive_checkbox.isChecked(): flags |= QWebEnginePage.FindCaseSensitively if backward: flags |= QWebEnginePage.FindBackward self.find.emit(needle, flags) def _find_next(self): self._emit_find(False) def _find_previous(self): self._emit_find(True) examples/webenginewidgets/tabbedbrowser/historywindow.py000066400000000000000000000073411376617013100243700ustar00rootroot00000000000000############################################################################# ## ## 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.QtWidgets import QApplication, QTreeView from PySide2.QtCore import Signal, QAbstractTableModel, QModelIndex, Qt, QUrl class HistoryModel(QAbstractTableModel): def __init__(self, history, parent=None): super(HistoryModel, self).__init__(parent) self._history = history def headerData(self, section, orientation, role=Qt.DisplayRole): if orientation == Qt.Horizontal and role == Qt.DisplayRole: return 'Title' if section == 0 else 'Url' return None def rowCount(self, index=QModelIndex()): return self._history.count() def columnCount(self, index=QModelIndex()): return 2 def item_at(self, model_index): return self._history.itemAt(model_index.row()) def data(self, index, role=Qt.DisplayRole): item = self.item_at(index) column = index.column() if role == Qt.DisplayRole: return item.title() if column == 0 else item.url().toString() return None def refresh(self): self.beginResetModel() self.endResetModel() class HistoryWindow(QTreeView): open_url = Signal(QUrl) def __init__(self, history, parent): super(HistoryWindow, self).__init__(parent) self._model = HistoryModel(history, self) self.setModel(self._model) self.activated.connect(self._activated) screen = QApplication.desktop().screenGeometry(parent) self.resize(screen.width() / 3, screen.height() / 3) self._adjustSize() def refresh(self): self._model.refresh() self._adjustSize() def _adjustSize(self): if (self._model.rowCount() > 0): self.resizeColumnToContents(0) def _activated(self, index): item = self._model.item_at(index) self.open_url.emit(item.url()) examples/webenginewidgets/tabbedbrowser/main.py000066400000000000000000000377651376617013100224000ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2018 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 WebEngineWidgets Example""" import sys from bookmarkwidget import BookmarkWidget from browsertabwidget import BrowserTabWidget from downloadwidget import DownloadWidget from findtoolbar import FindToolBar from webengineview import WebEngineView from PySide2 import QtCore from PySide2.QtCore import Qt, QUrl from PySide2.QtGui import QKeySequence, QIcon from PySide2.QtWidgets import (QAction, QApplication, QDockWidget, QLabel, QLineEdit, QMainWindow, QToolBar) from PySide2.QtWebEngineWidgets import QWebEngineDownloadItem, QWebEnginePage main_windows = [] def create_main_window(): """Creates a MainWindow using 75% of the available screen resolution.""" main_win = MainWindow() main_windows.append(main_win) available_geometry = app.desktop().availableGeometry(main_win) main_win.resize(available_geometry.width() * 2 / 3, available_geometry.height() * 2 / 3) main_win.show() return main_win def create_main_window_with_browser(): """Creates a MainWindow with a BrowserTabWidget.""" main_win = create_main_window() return main_win.add_browser_tab() class MainWindow(QMainWindow): """Provides the parent window that includes the BookmarkWidget, BrowserTabWidget, and a DownloadWidget, to offer the complete web browsing experience.""" def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle('PySide2 tabbed browser Example') self._tab_widget = BrowserTabWidget(create_main_window_with_browser) self._tab_widget.enabled_changed.connect(self._enabled_changed) self._tab_widget.download_requested.connect(self._download_requested) self.setCentralWidget(self._tab_widget) self.connect(self._tab_widget, QtCore.SIGNAL("url_changed(QUrl)"), self.url_changed) self._bookmark_dock = QDockWidget() self._bookmark_dock.setWindowTitle('Bookmarks') self._bookmark_widget = BookmarkWidget() self._bookmark_widget.open_bookmark.connect(self.load_url) self._bookmark_widget.open_bookmark_in_new_tab.connect(self.load_url_in_new_tab) self._bookmark_dock.setWidget(self._bookmark_widget) self.addDockWidget(Qt.LeftDockWidgetArea, self._bookmark_dock) self._find_tool_bar = None self._actions = {} self._create_menu() self._tool_bar = QToolBar() self.addToolBar(self._tool_bar) for action in self._actions.values(): if not action.icon().isNull(): self._tool_bar.addAction(action) self._addres_line_edit = QLineEdit() self._addres_line_edit.setClearButtonEnabled(True) self._addres_line_edit.returnPressed.connect(self.load) self._tool_bar.addWidget(self._addres_line_edit) self._zoom_label = QLabel() self.statusBar().addPermanentWidget(self._zoom_label) self._update_zoom_label() self._bookmarksToolBar = QToolBar() self.addToolBar(Qt.TopToolBarArea, self._bookmarksToolBar) self.insertToolBarBreak(self._bookmarksToolBar) self._bookmark_widget.changed.connect(self._update_bookmarks) self._update_bookmarks() def _update_bookmarks(self): self._bookmark_widget.populate_tool_bar(self._bookmarksToolBar) self._bookmark_widget.populate_other(self._bookmark_menu, 3) def _create_menu(self): file_menu = self.menuBar().addMenu("&File") exit_action = QAction(QIcon.fromTheme("application-exit"), "E&xit", self, shortcut="Ctrl+Q", triggered=qApp.quit) file_menu.addAction(exit_action) navigation_menu = self.menuBar().addMenu("&Navigation") style_icons = ':/qt-project.org/styles/commonstyle/images/' back_action = QAction(QIcon.fromTheme("go-previous", QIcon(style_icons + 'left-32.png')), "Back", self, shortcut=QKeySequence(QKeySequence.Back), triggered=self._tab_widget.back) self._actions[QWebEnginePage.Back] = back_action back_action.setEnabled(False) navigation_menu.addAction(back_action) forward_action = QAction(QIcon.fromTheme("go-next", QIcon(style_icons + 'right-32.png')), "Forward", self, shortcut=QKeySequence(QKeySequence.Forward), triggered=self._tab_widget.forward) forward_action.setEnabled(False) self._actions[QWebEnginePage.Forward] = forward_action navigation_menu.addAction(forward_action) reload_action = QAction(QIcon(style_icons + 'refresh-32.png'), "Reload", self, shortcut=QKeySequence(QKeySequence.Refresh), triggered=self._tab_widget.reload) self._actions[QWebEnginePage.Reload] = reload_action reload_action.setEnabled(False) navigation_menu.addAction(reload_action) navigation_menu.addSeparator() new_tab_action = QAction("New Tab", self, shortcut='Ctrl+T', triggered=self.add_browser_tab) navigation_menu.addAction(new_tab_action) close_tab_action = QAction("Close Current Tab", self, shortcut="Ctrl+W", triggered=self._close_current_tab) navigation_menu.addAction(close_tab_action) navigation_menu.addSeparator() history_action = QAction("History...", self, triggered=self._tab_widget.show_history) navigation_menu.addAction(history_action) edit_menu = self.menuBar().addMenu("&Edit") find_action = QAction("Find", self, shortcut=QKeySequence(QKeySequence.Find), triggered=self._show_find) edit_menu.addAction(find_action) edit_menu.addSeparator() undo_action = QAction("Undo", self, shortcut=QKeySequence(QKeySequence.Undo), triggered=self._tab_widget.undo) self._actions[QWebEnginePage.Undo] = undo_action undo_action.setEnabled(False) edit_menu.addAction(undo_action) redo_action = QAction("Redo", self, shortcut=QKeySequence(QKeySequence.Redo), triggered=self._tab_widget.redo) self._actions[QWebEnginePage.Redo] = redo_action redo_action.setEnabled(False) edit_menu.addAction(redo_action) edit_menu.addSeparator() cut_action = QAction("Cut", self, shortcut=QKeySequence(QKeySequence.Cut), triggered=self._tab_widget.cut) self._actions[QWebEnginePage.Cut] = cut_action cut_action.setEnabled(False) edit_menu.addAction(cut_action) copy_action = QAction("Copy", self, shortcut=QKeySequence(QKeySequence.Copy), triggered=self._tab_widget.copy) self._actions[QWebEnginePage.Copy] = copy_action copy_action.setEnabled(False) edit_menu.addAction(copy_action) paste_action = QAction("Paste", self, shortcut=QKeySequence(QKeySequence.Paste), triggered=self._tab_widget.paste) self._actions[QWebEnginePage.Paste] = paste_action paste_action.setEnabled(False) edit_menu.addAction(paste_action) edit_menu.addSeparator() select_all_action = QAction("Select All", self, shortcut=QKeySequence(QKeySequence.SelectAll), triggered=self._tab_widget.select_all) self._actions[QWebEnginePage.SelectAll] = select_all_action select_all_action.setEnabled(False) edit_menu.addAction(select_all_action) self._bookmark_menu = self.menuBar().addMenu("&Bookmarks") add_bookmark_action = QAction("&Add Bookmark", self, triggered=self._add_bookmark) self._bookmark_menu.addAction(add_bookmark_action) add_tool_bar_bookmark_action = QAction("&Add Bookmark to Tool Bar", self, triggered=self._add_tool_bar_bookmark) self._bookmark_menu.addAction(add_tool_bar_bookmark_action) self._bookmark_menu.addSeparator() tools_menu = self.menuBar().addMenu("&Tools") download_action = QAction("Open Downloads", self, triggered=DownloadWidget.open_download_directory) tools_menu.addAction(download_action) window_menu = self.menuBar().addMenu("&Window") window_menu.addAction(self._bookmark_dock.toggleViewAction()) window_menu.addSeparator() zoom_in_action = QAction(QIcon.fromTheme("zoom-in"), "Zoom In", self, shortcut=QKeySequence(QKeySequence.ZoomIn), triggered=self._zoom_in) window_menu.addAction(zoom_in_action) zoom_out_action = QAction(QIcon.fromTheme("zoom-out"), "Zoom Out", self, shortcut=QKeySequence(QKeySequence.ZoomOut), triggered=self._zoom_out) window_menu.addAction(zoom_out_action) reset_zoom_action = QAction(QIcon.fromTheme("zoom-original"), "Reset Zoom", self, shortcut="Ctrl+0", triggered=self._reset_zoom) window_menu.addAction(reset_zoom_action) about_menu = self.menuBar().addMenu("&About") about_action = QAction("About Qt", self, shortcut=QKeySequence(QKeySequence.HelpContents), triggered=qApp.aboutQt) about_menu.addAction(about_action) def add_browser_tab(self): return self._tab_widget.add_browser_tab() def _close_current_tab(self): if self._tab_widget.count() > 1: self._tab_widget.close_current_tab() else: self.close() def close_event(self, event): main_windows.remove(self) event.accept() def load(self): url_string = self._addres_line_edit.text().strip() if url_string: self.load_url_string(url_string) def load_url_string(self, url_s): url = QUrl.fromUserInput(url_s) if (url.isValid()): self.load_url(url) def load_url(self, url): self._tab_widget.load(url) def load_url_in_new_tab(self, url): self.add_browser_tab().load(url) def url_changed(self, url): self._addres_line_edit.setText(url.toString()) def _enabled_changed(self, web_action, enabled): action = self._actions[web_action] if action: action.setEnabled(enabled) def _add_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_bookmark(url, title, icon) def _add_tool_bar_bookmark(self): index = self._tab_widget.currentIndex() if index >= 0: url = self._tab_widget.url() title = self._tab_widget.tabText(index) icon = self._tab_widget.tabIcon(index) self._bookmark_widget.add_tool_bar_bookmark(url, title, icon) def _zoom_in(self): new_zoom = self._tab_widget.zoom_factor() * 1.5 if (new_zoom <= WebEngineView.maximum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _zoom_out(self): new_zoom = self._tab_widget.zoom_factor() / 1.5 if (new_zoom >= WebEngineView.minimum_zoom_factor()): self._tab_widget.set_zoom_factor(new_zoom) self._update_zoom_label() def _reset_zoom(self): self._tab_widget.set_zoom_factor(1) self._update_zoom_label() def _update_zoom_label(self): percent = int(self._tab_widget.zoom_factor() * 100) self._zoom_label.setText("{}%".format(percent)) def _download_requested(self, item): # Remove old downloads before opening a new one for old_download in self.statusBar().children(): if (type(old_download).__name__ == 'DownloadWidget' and old_download.state() != QWebEngineDownloadItem.DownloadInProgress): self.statusBar().removeWidget(old_download) del old_download item.accept() download_widget = DownloadWidget(item) download_widget.remove_requested.connect(self._remove_download_requested, Qt.QueuedConnection) self.statusBar().addWidget(download_widget) def _remove_download_requested(self): download_widget = self.sender() self.statusBar().removeWidget(download_widget) del download_widget def _show_find(self): if self._find_tool_bar is None: self._find_tool_bar = FindToolBar() self._find_tool_bar.find.connect(self._tab_widget.find) self.addToolBar(Qt.BottomToolBarArea, self._find_tool_bar) else: self._find_tool_bar.show() self._find_tool_bar.focus_find() def write_bookmarks(self): self._bookmark_widget.write_bookmarks() if __name__ == '__main__': app = QApplication(sys.argv) main_win = create_main_window() initial_urls = sys.argv[1:] if not initial_urls: initial_urls.append('http://qt.io') for url in initial_urls: main_win.load_url_in_new_tab(QUrl.fromUserInput(url)) exit_code = app.exec_() main_win.write_bookmarks() sys.exit(exit_code) examples/webenginewidgets/tabbedbrowser/tabbedbrowser.pyproject000066400000000000000000000002641376617013100256500ustar00rootroot00000000000000{ "files": ["main.py", "bookmarkwidget.py", "browsertabwidget.py", "downloadwidget.py", "findtoolbar.py", "historywindow.py", "webengineview.py"] } examples/webenginewidgets/tabbedbrowser/webengineview.py000066400000000000000000000071331376617013100242740ustar00rootroot00000000000000############################################################################# ## ## Copyright (C) 2018 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.QtWebEngineWidgets import QWebEnginePage, QWebEngineView from PySide2 import QtCore _web_actions = [QWebEnginePage.Back, QWebEnginePage.Forward, QWebEnginePage.Reload, QWebEnginePage.Undo, QWebEnginePage.Redo, QWebEnginePage.Cut, QWebEnginePage.Copy, QWebEnginePage.Paste, QWebEnginePage.SelectAll] class WebEngineView(QWebEngineView): enabled_changed = QtCore.Signal(QWebEnginePage.WebAction, bool) @staticmethod def web_actions(): return _web_actions @staticmethod def minimum_zoom_factor(): return 0.25 @staticmethod def maximum_zoom_factor(): return 5 def __init__(self, tab_factory_func, window_factory_func): super(WebEngineView, self).__init__() self._tab_factory_func = tab_factory_func self._window_factory_func = window_factory_func page = self.page() self._actions = {} for web_action in WebEngineView.web_actions(): action = page.action(web_action) action.changed.connect(self._enabled_changed) self._actions[action] = web_action def is_web_action_enabled(self, web_action): return self.page().action(web_action).isEnabled() def createWindow(self, window_type): if (window_type == QWebEnginePage.WebBrowserTab or window_type == QWebEnginePage.WebBrowserBackgroundTab): return self._tab_factory_func() return self._window_factory_func() def _enabled_changed(self): action = self.sender() web_action = self._actions[action] self.enabled_changed.emit(web_action, action.isEnabled()) examples/webenginewidgets/webenginewidgets.pyproject000066400000000000000000000000461376617013100235260ustar00rootroot00000000000000{ "files": ["simplebrowser.py"] } examples/widgetbinding/000077500000000000000000000000001376617013100155175ustar00rootroot00000000000000examples/widgetbinding/CMakeLists.txt000066400000000000000000000305551376617013100202670ustar00rootroot00000000000000cmake_minimum_required(VERSION 3.1) cmake_policy(VERSION 3.1) # Enable policy to not use RPATH settings for install_name on macOS. if(POLICY CMP0068) cmake_policy(SET CMP0068 NEW) endif() # Enable policy to run automoc on generated files. if(POLICY CMP0071) cmake_policy(SET CMP0071 NEW) endif() # Consider changing the project name to something relevant for you. project(wiggly LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) find_package(Qt5 5.12 REQUIRED COMPONENTS Core Gui Widgets) # ================================ General configuration ====================================== # Set CPP standard to C++11 minimum. set(CMAKE_CXX_STANDARD 11) # The wiggly library for which we will create bindings. You can change the name to something # relevant for your project. set(wiggly_library "libwiggly") # The name of the generated bindings module (as imported in Python). You can change the name # to something relevant for your project. set(bindings_library "wiggly") # The header file with all the types and functions for which bindings will be generated. # Usually it simply includes other headers of the library you are creating bindings for. set(wrapped_header ${CMAKE_SOURCE_DIR}/bindings.h) # The typesystem xml file which defines the relationships between the C++ types / functions # and the corresponding Python equivalents. set(typesystem_file ${CMAKE_SOURCE_DIR}/bindings.xml) # Specify which C++ files will be generated by shiboken. This includes the module wrapper # and a '.cpp' file per C++ type. These are needed for generating the module shared # library. set(generated_sources ${CMAKE_CURRENT_BINARY_DIR}/${bindings_library}/wiggly_module_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/${bindings_library}/wigglywidget_wrapper.cpp) # ================================== Shiboken detection ====================================== # Use provided python interpreter if given. if(NOT python_interpreter) find_program(python_interpreter "python") endif() message(STATUS "Using python interpreter: ${python_interpreter}") # Macro to get various pyside / python include / link flags and paths. # Uses the not entirely supported utils/pyside2_config.py file. macro(pyside2_config option output_var) if(${ARGC} GREATER 2) set(is_list ${ARGV2}) else() set(is_list "") endif() execute_process( COMMAND ${python_interpreter} "${CMAKE_SOURCE_DIR}/../utils/pyside2_config.py" ${option} OUTPUT_VARIABLE ${output_var} OUTPUT_STRIP_TRAILING_WHITESPACE) if ("${${output_var}}" STREQUAL "") message(FATAL_ERROR "Error: Calling pyside2_config.py ${option} returned no output.") endif() if(is_list) string (REPLACE " " ";" ${output_var} "${${output_var}}") endif() endmacro() # Query for the shiboken generator path, Python path, include paths and linker flags. pyside2_config(--shiboken2-module-path shiboken2_module_path) pyside2_config(--shiboken2-generator-path shiboken2_generator_path) pyside2_config(--pyside2-path pyside2_path) pyside2_config(--pyside2-include-path pyside2_include_dir 1) pyside2_config(--python-include-path python_include_dir) pyside2_config(--shiboken2-generator-include-path shiboken_include_dir 1) pyside2_config(--shiboken2-module-shared-libraries-cmake shiboken_shared_libraries 0) pyside2_config(--python-link-flags-cmake python_linking_data 0) pyside2_config(--pyside2-shared-libraries-cmake pyside2_shared_libraries 0) set(shiboken_path "${shiboken2_generator_path}/shiboken2${CMAKE_EXECUTABLE_SUFFIX}") if(NOT EXISTS ${shiboken_path}) message(FATAL_ERROR "Shiboken executable not found at path: ${shiboken_path}") endif() # ==================================== RPATH configuration ==================================== # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly with some custom script or tool). # ============================================================================================= # Enable rpaths so that the built shared libraries find their dependencies. set(CMAKE_SKIP_BUILD_RPATH FALSE) set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE) set(CMAKE_INSTALL_RPATH ${shiboken2_module_path} ${CMAKE_CURRENT_SOURCE_DIR}) set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # ============================================================================================= # !!! End of dubious section. # ============================================================================================= # =============================== CMake target - wiggly_library =============================== # Get all relevant Qt include dirs, to pass them on to shiboken. get_property(QT_CORE_INCLUDE_DIRS TARGET Qt5::Core PROPERTY INTERFACE_INCLUDE_DIRECTORIES) get_property(QT_GUI_INCLUDE_DIRS TARGET Qt5::Gui PROPERTY INTERFACE_INCLUDE_DIRECTORIES) get_property(QT_WIDGETS_INCLUDE_DIRS TARGET Qt5::Widgets PROPERTY INTERFACE_INCLUDE_DIRECTORIES) set(QT_INCLUDE_DIRS ${QT_CORE_INCLUDE_DIRS} ${QT_GUI_INCLUDE_DIRS} ${QT_WIDGETS_INCLUDE_DIRS}) set(INCLUDES "") foreach(INCLUDE_DIR ${QT_INCLUDE_DIRS}) list(APPEND INCLUDES "-I${INCLUDE_DIR}") endforeach() # On macOS, check if Qt is a framework build. This affects how include paths should be handled. get_target_property(QtCore_is_framework Qt5::Core FRAMEWORK) if (QtCore_is_framework) get_target_property(qt_core_library_location Qt5::Core LOCATION) get_filename_component(qt_core_library_location_dir "${qt_core_library_location}" DIRECTORY) get_filename_component(lib_dir "${qt_core_library_location_dir}/../" ABSOLUTE) list(APPEND INCLUDES "--framework-include-paths=${lib_dir}") endif() # We need to include the headers for the module bindings that we use. set(pyside2_additional_includes "") foreach(INCLUDE_DIR ${pyside2_include_dir}) list(APPEND pyside2_additional_includes "${INCLUDE_DIR}/QtCore") list(APPEND pyside2_additional_includes "${INCLUDE_DIR}/QtGui") list(APPEND pyside2_additional_includes "${INCLUDE_DIR}/QtWidgets") endforeach() # Define the wiggly shared library for which we will create bindings. set(${wiggly_library}_sources wigglywidget.cpp) add_library(${wiggly_library} SHARED ${${wiggly_library}_sources}) set_property(TARGET ${wiggly_library} PROPERTY PREFIX "") # Needed mostly on Windows to export symbols, and create a .lib file, otherwise the binding # library can't link to the wiggly library. target_compile_definitions(${wiggly_library} PRIVATE BINDINGS_BUILD) # ====================== Shiboken target for generating binding C++ files ==================== # Set up the options to pass to shiboken. set(shiboken_options --generator-set=shiboken --enable-parent-ctor-heuristic --enable-pyside-extensions --enable-return-value-heuristic --use-isnull-as-nb_nonzero --avoid-protected-hack ${INCLUDES} -I${CMAKE_SOURCE_DIR} -T${CMAKE_SOURCE_DIR} -T${pyside2_path}/typesystems --output-directory=${CMAKE_CURRENT_BINARY_DIR} ) set(generated_sources_dependencies ${wrapped_header} ${typesystem_file}) # Add custom target to run shiboken to generate the binding cpp files. add_custom_command(OUTPUT ${generated_sources} COMMAND ${shiboken_path} ${shiboken_options} ${wrapped_header} ${typesystem_file} DEPENDS ${generated_sources_dependencies} #IMPLICIT_DEPENDS CXX ${wrapped_header} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} COMMENT "Running generator for ${typesystem_file}.") # =============================== CMake target - bindings_library ============================= # Set the cpp files which will be used for the bindings library. set(${bindings_library}_sources ${generated_sources}) # Define and build the bindings library. add_library(${bindings_library} SHARED ${${bindings_library}_sources}) # Apply relevant include and link flags. target_include_directories(${bindings_library} PRIVATE ${pyside2_additional_includes}) target_include_directories(${bindings_library} PRIVATE ${pyside2_include_dir}) target_include_directories(${bindings_library} PRIVATE ${python_include_dir}) target_include_directories(${bindings_library} PRIVATE ${shiboken_include_dir}) target_link_libraries(${wiggly_library} PRIVATE Qt5::Widgets) target_link_libraries(${bindings_library} PRIVATE Qt5::Widgets) target_link_libraries(${bindings_library} PRIVATE ${wiggly_library}) target_link_libraries(${bindings_library} PRIVATE ${pyside2_shared_libraries}) target_link_libraries(${bindings_library} PRIVATE ${shiboken_shared_libraries}) # Adjust the name of generated module. set_property(TARGET ${bindings_library} PROPERTY PREFIX "") set_property(TARGET ${bindings_library} PROPERTY OUTPUT_NAME "${bindings_library}${PYTHON_EXTENSION_SUFFIX}") if(WIN32) set_property(TARGET ${bindings_library} PROPERTY SUFFIX ".pyd") endif() # Make sure the linker doesn't complain about not finding Python symbols on macOS. if(APPLE) set_target_properties(${bindings_library} PROPERTIES LINK_FLAGS "-undefined dynamic_lookup") endif(APPLE) # Find and link to the python import library only on Windows. # On Linux and macOS, the undefined symbols will get resolved by the dynamic linker # (the symbols will be picked up in the Python executable). if (WIN32) list(GET python_linking_data 0 python_libdir) list(GET python_linking_data 1 python_lib) find_library(python_link_flags ${python_lib} PATHS ${python_libdir} HINTS ${python_libdir}) target_link_libraries(${bindings_library} PRIVATE ${python_link_flags}) endif() # ================================= Dubious deployment section ================================ set(windows_shiboken_shared_libraries) if(WIN32) # ========================================================================================= # !!! (The section below is deployment related, so in a real world application you will # want to take care of this properly (this is simply to eliminate errors that users usually # encounter. # ========================================================================================= # Circumvent some "#pragma comment(lib)"s in "include/pyconfig.h" which might force to link # against a wrong python shared library. set(python_versions_list 3 32 33 34 35 36 37 38) set(python_additional_link_flags "") foreach(ver ${python_versions_list}) set(python_additional_link_flags "${python_additional_link_flags} /NODEFAULTLIB:\"python${ver}_d.lib\"") set(python_additional_link_flags "${python_additional_link_flags} /NODEFAULTLIB:\"python${ver}.lib\"") endforeach() set_target_properties(${bindings_library} PROPERTIES LINK_FLAGS "${python_additional_link_flags}") # Compile a list of shiboken shared libraries to be installed, so that # the user doesn't have to set the PATH manually to point to the PySide2 package. foreach(library_path ${shiboken_shared_libraries}) string(REGEX REPLACE ".lib$" ".dll" library_path ${library_path}) file(TO_CMAKE_PATH ${library_path} library_path) list(APPEND windows_shiboken_shared_libraries "${library_path}") endforeach() # ========================================================================================= # !!! End of dubious section. # ========================================================================================= endif() # ============================================================================================= # !!! (The section below is deployment related, so in a real world application you will want to # take care of this properly with some custom script or tool). # ============================================================================================= # Install the library and the bindings module into the source folder near the main.py file, so # that the Python interpeter successfully imports the used module. install(TARGETS ${bindings_library} ${wiggly_library} LIBRARY DESTINATION ${CMAKE_CURRENT_SOURCE_DIR} RUNTIME DESTINATION ${CMAKE_CURRENT_SOURCE_DIR} ) install(FILES ${windows_shiboken_shared_libraries} DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}) # ============================================================================================= # !!! End of dubious section. # ============================================================================================= examples/widgetbinding/README.md000066400000000000000000000046111376617013100170000ustar00rootroot00000000000000# WigglyWidget The original Qt/C++ example can be found here: https://doc.qt.io/qt-5/qtwidgets-widgets-wiggly-example.html This example shows how to interact with a custom widget from two different ways: * A full Python translation from a C++ example, * A Python binding generated from the C++ file. The original example contained three different files: * `main.cpp/h`, which was translated to `main.py`, * `dialog.cpp/h`, which was translated to `dialog.py`, * `wigglywidget.cpp/h`, which was translated to `wigglywidget.py`, but also remains as is, to enable the binding generation through Shiboken. In the `dialog.py` file you will find two imports that will be related to each of the two approaches described before:: # Python translated file from wigglywidget import WigglyWidget # Binding module create with Shiboken from wiggly import WigglyWidget ## Steps to build the bindings The most important files are: * `bindings.xml`, to specify the class that we want to expose from C++ to Python, * `bindings.h` to include the header of the classes we want to expose * `CMakeList.txt`, with all the instructions to build the shared libraries (DLL, or dylib) * `pyside2_config.py` which is located in the utils directory, one level up, to get the path for Shiboken and PySide. Now create a `build/` directory, and from inside run `cmake ..` to use the provided `CMakeLists.txt`. To build, just run `make`, and `make install` to copy the generated files to the main example directory to be able to run the final example: `python main.py`. You should be able to see two identical custom widgets, one being the Python translation, and the other one being the C++ one. ### Windows For windows it's recommended to use either `nmake`, `jom` or `ninja`, when running cmake. ```bash cmake -H.. -B. -G "NMake Makefiles" -DCMAKE_BUILD_TYPE=Release # for nmake cmake -H.. -B. -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release # for jom cmake -H.. -B. -G Ninja -DCMAKE_BUILD_TYPE=Release # for ninja ``` ### Linux, macOS Generally using `make` will be enough, but as in the Windows case, you can use ninja to build the project. ```bash cmake -H.. -B. -G Ninja -DCMAKE_BUILD_TYPE=Release ``` ## Final words Since this example originated by mixing the concepts of the `scriptableapplication` and `samplebinding` examples, you can complement this README with the ones in those directories. examples/widgetbinding/bindings.h000066400000000000000000000047721376617013100174770ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef BINDINGS_H #define BINDINGS_H #include "wigglywidget.h" #endif // BINDINGS_H examples/widgetbinding/bindings.xml000066400000000000000000000051521376617013100200410ustar00rootroot00000000000000 examples/widgetbinding/dialog.py000066400000000000000000000064041376617013100173340ustar00rootroot00000000000000############################################################################ ## ## 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$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## BSD License Usage ## Alternatively, 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 QDialog, QLineEdit, QVBoxLayout # Python binding from the C++ widget from wiggly import WigglyWidget as WigglyWidgetCPP # Python-only widget from wigglywidget import WigglyWidget as WigglyWidgetPY class Dialog(QDialog): def __init__(self, parent=None): super(Dialog, self).__init__(parent) wiggly_widget_py = WigglyWidgetPY(self) wiggly_widget_cpp = WigglyWidgetCPP(self) lineEdit = QLineEdit(self) layout = QVBoxLayout(self) layout.addWidget(wiggly_widget_py) layout.addWidget(wiggly_widget_cpp) layout.addWidget(lineEdit) lineEdit.textChanged.connect(wiggly_widget_py.setText) lineEdit.textChanged.connect(wiggly_widget_cpp.setText) lineEdit.setText("Hello world!") self.setWindowTitle("Wiggly") self.resize(360, 145) examples/widgetbinding/macros.h000066400000000000000000000052671376617013100171660ustar00rootroot00000000000000/**************************************************************************** ** ** 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$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef MACROS_H #define MACROS_H #include // Export symbols when creating .dll and .lib, and import them when using .lib. #if BINDINGS_BUILD # define BINDINGS_API Q_DECL_EXPORT #else # define BINDINGS_API Q_DECL_IMPORT #endif #endif // MACROS_H examples/widgetbinding/main.py000066400000000000000000000051421376617013100170170ustar00rootroot00000000000000############################################################################ ## ## 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$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## BSD License Usage ## Alternatively, 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 dialog import Dialog if __name__ == "__main__": app = QApplication() w = Dialog() w.show() sys.exit(app.exec_()) examples/widgetbinding/wigglywidget.cpp000066400000000000000000000074501376617013100207370ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #include "wigglywidget.h" #include #include #include //! [0] WigglyWidget::WigglyWidget(QWidget *parent) : QWidget(parent), step(0) { setBackgroundRole(QPalette::Midlight); setAutoFillBackground(true); QFont newFont = font(); newFont.setPointSize(newFont.pointSize() + 20); setFont(newFont); timer.start(60, this); } //! [0] //! [1] void WigglyWidget::paintEvent(QPaintEvent * /* event */) //! [1] //! [2] { static constexpr int sineTable[16] = { 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38 }; QFontMetrics metrics(font()); int x = (width() - metrics.horizontalAdvance(text)) / 2; int y = (height() + metrics.ascent() - metrics.descent()) / 2; QColor color; //! [2] //! [3] QPainter painter(this); //! [3] //! [4] for (int i = 0; i < text.size(); ++i) { int index = (step + i) % 16; color.setHsv((15 - index) * 16, 255, 191); painter.setPen(color); painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400), QString(text[i])); x += metrics.horizontalAdvance(text[i]); } } //! [4] //! [5] void WigglyWidget::timerEvent(QTimerEvent *event) //! [5] //! [6] { if (event->timerId() == timer.timerId()) { ++step; update(); } else { QWidget::timerEvent(event); } //! [6] } examples/widgetbinding/wigglywidget.h000066400000000000000000000056241376617013100204050ustar00rootroot00000000000000/**************************************************************************** ** ** Copyright (C) 2016 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the examples of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:BSD$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and The Qt Company. For licensing terms ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** ** BSD License Usage ** Alternatively, 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$ ** ****************************************************************************/ #ifndef WIGGLYWIDGET_H #define WIGGLYWIDGET_H #include "macros.h" #include #include //! [0] class BINDINGS_API WigglyWidget : public QWidget { Q_OBJECT public: WigglyWidget(QWidget *parent = nullptr); public slots: void setText(const QString &newText) { text = newText; } protected: void paintEvent(QPaintEvent *event) override; void timerEvent(QTimerEvent *event) override; private: QBasicTimer timer; QString text; int step; }; //! [0] #endif examples/widgetbinding/wigglywidget.py000066400000000000000000000077201376617013100206050ustar00rootroot00000000000000############################################################################ ## ## 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$ ## Commercial License Usage ## Licensees holding valid commercial Qt licenses may use this file in ## accordance with the commercial license agreement provided with the ## Software or, alternatively, in accordance with the terms contained in ## a written agreement between you and The Qt Company. For licensing terms ## and conditions see https://www.qt.io/terms-conditions. For further ## information use the contact form at https://www.qt.io/contact-us. ## ## BSD License Usage ## Alternatively, 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 QBasicTimer from PySide2.QtGui import QColor, QFontMetrics, QPainter, QPalette from PySide2.QtWidgets import QWidget class WigglyWidget(QWidget): def __init__(self, parent=None): super(WigglyWidget, self).__init__(parent) self.step = 0 self.text = "" self.setBackgroundRole(QPalette.Midlight) self.setAutoFillBackground(True) newFont = self.font() newFont.setPointSize(newFont.pointSize() + 20) self.setFont(newFont) self.timer = QBasicTimer() self.timer.start(60, self) def paintEvent(self, event): sineTable = [0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38] metrics = QFontMetrics(self.font()) x = (self.width() - metrics.horizontalAdvance(self.text)) / 2 y = (self.height() + metrics.ascent() - metrics.descent()) / 2 color = QColor() painter = QPainter(self) for i in range(len(self.text)): index = (self.step + i) % 16 color.setHsv((15 - index) * 16, 255, 191) painter.setPen(color) painter.drawText(x, y - ((sineTable[index] * metrics.height()) / 400), str(self.text[i])) x += metrics.horizontalAdvance(self.text[i]) def timerEvent(self, event): if event.timerId() == self.timer.timerId(): self.step += 1 self.update() else: QWidget.timerEvent(event) def setText(self, text): self.text = text examples/widgets/000077500000000000000000000000001376617013100143475ustar00rootroot00000000000000examples/widgets/animation/000077500000000000000000000000001376617013100163265ustar00rootroot00000000000000examples/widgets/animation/animatedtiles/000077500000000000000000000000001376617013100211515ustar00rootroot00000000000000examples/widgets/animation/animatedtiles/animatedtiles.py000066400000000000000000000210731376617013100243510ustar00rootroot00000000000000 ############################################################################# ## ## 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 # Deriving from more than one wrapped class is not supported, so we use # composition and delegate the property. class Pixmap(QtCore.QObject): def __init__(self, pix): super(Pixmap, self).__init__() self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix) self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache) def set_pos(self, pos): self.pixmap_item.setPos(pos) def get_pos(self): return self.pixmap_item.pos() pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos) class Button(QtWidgets.QGraphicsWidget): pressed = QtCore.Signal() def __init__(self, pixmap, parent=None): super(Button, self).__init__(parent) self._pix = pixmap self.setAcceptHoverEvents(True) self.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache) def boundingRect(self): return QtCore.QRectF(-65, -65, 130, 130) def shape(self): path = QtGui.QPainterPath() path.addEllipse(self.boundingRect()) return path def paint(self, painter, option, widget): down = option.state & QtWidgets.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 else: color_0 = QtCore.Qt.lightGray color_1 = QtCore.Qt.darkGray if down: color_0, color_1 = color_1, color_0 grad.setColorAt(0, color_0) grad.setColorAt(1, color_1) painter.setPen(QtCore.Qt.darkGray) painter.setBrush(grad) painter.drawEllipse(r) color_0 = QtCore.Qt.darkGray color_1 = QtCore.Qt.lightGray if down: color_0, color_1 = color_1, color_0 grad.setColorAt(0, color_0) grad.setColorAt(1, color_1) painter.setPen(QtCore.Qt.NoPen) painter.setBrush(grad) if down: painter.translate(2, 2) painter.drawEllipse(r.adjusted(5, 5, -5, -5)) painter.drawPixmap(-self._pix.width() / 2, -self._pix.height() / 2, self._pix) def mousePressEvent(self, ev): self.pressed.emit() self.update() def mouseReleaseEvent(self, ev): self.update() class View(QtWidgets.QGraphicsView): def resizeEvent(self, event): super(View, self).resizeEvent(event) self.fitInView(self.sceneRect(), QtCore.Qt.KeepAspectRatio) if __name__ == '__main__': import sys import math app = QtWidgets.QApplication(sys.argv) kineticPix = QtGui.QPixmap(':/images/kinetic.png') bgPix = QtGui.QPixmap(':/images/Time-For-Lunch-2.jpg') scene = QtWidgets.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_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) # States. rootState = QtCore.QState() ellipseState = QtCore.QState(rootState) figure8State = QtCore.QState(rootState) randomState = QtCore.QState(rootState) tiledState = QtCore.QState(rootState) centeredState = QtCore.QState(rootState) # Values. 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)) # 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)) # Random. randomState.assignProperty(item, 'pos', QtCore.QPointF(-250 + QtCore.qrand() % 500, -250 + QtCore.qrand() % 500)) # Tiled. tiledState.assignProperty(item, 'pos', QtCore.QPointF(((i % 8) - 4) * kineticPix.width() + kineticPix.width() / 2, ((i // 8) - 4) * kineticPix.height() + kineticPix.height() / 2)) # Centered. centeredState.assignProperty(item, 'pos', QtCore.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.show() states = QtCore.QStateMachine() states.addState(rootState) states.setInitialState(rootState) rootState.setInitialState(centeredState) group = QtCore.QParallelAnimationGroup() for i, item in enumerate(items): anim = QtCore.QPropertyAnimation(item, b'pos') anim.setDuration(750 + i * 25) anim.setEasingCurve(QtCore.QEasingCurve.InOutBack) group.addAnimation(anim) trans = rootState.addTransition(ellipseButton.pressed, ellipseState) trans.addAnimation(group) trans = rootState.addTransition(figure8Button.pressed, figure8State) trans.addAnimation(group) trans = rootState.addTransition(randomButton.pressed, randomState) trans.addAnimation(group) trans = rootState.addTransition(tiledButton.pressed, tiledState) trans.addAnimation(group) trans = rootState.addTransition(centeredButton.pressed, centeredState) trans.addAnimation(group) timer = QtCore.QTimer() timer.start(125) timer.setSingleShot(True) trans = rootState.addTransition(timer.timeout, ellipseState) trans.addAnimation(group) states.start() sys.exit(app.exec_()) examples/widgets/animation/animatedtiles/animatedtiles.pyproject000066400000000000000000000001401376617013100257300ustar00rootroot00000000000000{ "files": ["animatedtiles.qrc", "animatedtiles.py", "animatedtiles_rc.py"] } examples/widgets/animation/animatedtiles/animatedtiles.qrc000066400000000000000000000005041376617013100245020ustar00rootroot00000000000000 images/Time-For-Lunch-2.jpg images/centered.png images/ellipse.png images/figure8.png images/kinetic.png images/random.png images/tile.png examples/widgets/animation/animatedtiles/animatedtiles_rc.py000066400000000000000000010751261376617013100250460ustar00rootroot00000000000000# 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\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;\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\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<\ \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+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\ \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\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\ \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\x1e\xba\x16\x7fM\x00\x00 \x00IDATx\ \xda\xed\xbdy\x9c\x5cU\x99\xff\xff>w\xa9[\xd5\xd5\ \xdd\xd5\xdd\xe9-Iw\xd2!\x1b\x09Y\x00Y\x02\x81\ \x08\x88@@\x10F\x5cf\x1c\xc1\x19\x01\xf9\x02\x83\xdf\ A\xe7\x0b\xe38\x83\xc8W\x04t\x5cXd@Q\x91\ M\x04\xd9\x05!\x04\x08\x09\xd9C:\x0bM\xd6N\xa7\ \xf7\xa5\xba\xf6\xed\xae\xe7\xf7\xc7\xed\xbaI\x005`\xc0\ \xef\xcc\x8f\xf3z\xd5\xab\xb7\xeaS\xf7\x9e\xe7\x9cg\xf9\ <\x9f\xe7\xb9\xf0\xd1\xf8h|4>\x1a\x1f\x8d\x8f\xc6\ G\xe3\xa3\xf1\xd1\xf8h\xfc\x8f\x1f\xe2\x7f\xf2\xcd\x9dt\ \xd2I;\xa7L\x992QJ\x89\x00\xa4\xad %\xa0\ HP$B\xbcs\x05J\xa5Rx\xc9\x92%_L\ \xa7\xd3\x0f\xff5\xaeY\xfb &\xad\xaf\xaf_\x94\xcf\ \xe7'\x1d\xf4\xae\x10\x02\xcf\xf3\xa8\xa9\xa9ynpp\ 0q\xa8\xaeCU\xd5\xeaB\xa1\x10\x01\xd8c\x0f2\ \xf3s\x05*\xa3:NJ\xc3K\x87\xf0r\xfe\xf7n\ J\xc3M\x86\x00\xf0<\x0f)\xa5\xf6\xd7\xdaD\x1f\xc8\ \x07\xd7\xd5\xd5\xdd\xf5\xd9\xcf~v6\x80'=\xdc\x0a\ \x8b\xb0\xa1 \xad\xb1\x97\xad\x80\x1c\xdb\x9dc;\xd40\ \x0c\x1e\x7f\xfc\xf1c\x81C&\x10)\xa5\xb4,\x0b\x01\ \x8c\xb8)>\x16\xa9$$\xab8\xf6\x88\x05l\x1f]\ O\x22\x93\xa4\xae*Bn\xd8f\xf8wu\x07l\x90\ \xffQ\x02\xb1m\xdb\x18\x1a\x1a\x02`g\xbe\x9f\x85W\ \x81\xed\xed\xbfP`\x0f\x86(\xee\x8cb\xee\x8e\x80\x90\ TUU\x81/\xa6C6\x5c\xd7\xc5\xb2,\x90 t\ \xf0\x84\xc3E3\xbe\xcfs=\xb7q\xeb\x99\xbf\xe7G\ O\xfe\x90\x89\xad\x1eK\x06\x9e\xf1\xdf7&\x8c\xbf\xa6\ @\x94\x0fh^\xcf4ML\xd3\xc4v]t]!\ 7P\xc5\xb7?\xfe[\xce\x9eq1\x8a\x13a\xdc\xe4\ \x0aB\x93\xf3\x98%\x0b\xcb\xb20M\xf3\xa0\x17\xa2\xa5\ \xa5\xe5\xe0.\xc2\xf3\xa4eY\xd8\xb6\x8d\x87$\x951\ 9\xfa\xf0#\xe9H\xaf@\x11\x0a\x9f8\xfa\x93TU\ \xc5PB\x12\xc7q0M\x13\xc7q\xfe\xaavO{\ \x1f\xea\xe8\xc2c\x8e9\xe6_\x1c\xc7\xf1$\x12U\xaa\ \xb8\xb6\xf4E\xabH4]u;;;[M\xd3\xf4\ w\xa9\xe7b\x96\x14\xfe\xed\xcc;\xf8\xe9\xfak8\xab\ \xf9\x1bLQ\xe2\x9c4\xeb(\xee\xde~\xab/\x08U\ \x12\x0a\x85\x90\xf2\xe0\x0eHoo/mmm\xab\x1a\ \x1b\x1b)\x1bl<\x05\x89$\x95N\xd6M9l\xca\ \x0cEQ@\x08\xa4+\x11\x86\xcb\xdc\xfc\x14r\xbf\x84\ \xd3~\xf6q*B\xd39\xf9\x8e\x93\xd1U\x0d\x81F\ (T\xc3\xce\x9d[hmmEJ\x89\xeb\xbaSC\ \xa1\xd0\x82\xf7\xb2.\x15\x15\x15TWW\xaf\xe9\xee\xee\ \x96\x1f\xaa@,\xcb\x9a{\xd8a\x87\x1d\x97H\xf8\xaa\ \xbe\xaf\xae\x8b\xd9\x0bu\xac\x81\x08\xceH\x18\x91\x8b\xd0\ \xdd\xa3b\xdb\xb6\xbfK\x85\x87kKf\xb5\xcd@\xd9\ \x03E;K\xb6\x98\xe3\xa5\xdd\x0f\xe0y\xbeJ\x11\xaa\ \x0c\xde\x7f\x90#\x5c__\xbf`\xda\xb4ix\x9eG\ Q\x9ah\x87\xa7\xa8\x0c\x87\xe8\x5c\xe11\xae\xba\x1e\xcb\ 2\xd1\x84\xca\xf6\xf1[9\xe1\xecJ\x5c\xd7\xc3\x1e\xd1\ q\x07\xa3X\xc3P\x93\x19\x87\x9dR(\x16J\xa8\xaa\ @\xd34r\xb9\x1c\xae\xeb\xca\x93N:\xe9\xfa\xda\xda\ \xda\xeb\x01\x1c\xe9\xa2Wy\xe0(`\x8f\xd9\xbf\xc0\xf6\ \xc9@\xcd\xed\xde\xbd\x9b\xb5k\xd7F\x80\xd2\x87nC\ J\xa5\x12\xa6i\x92sKD\x8e-\xa2V+D\xaa\ s03\x87f\x08\xc4Z'\xd0\xc9\x9e\xe6\xa1\xaa*\ \xa9\x5c\x1aEQQ\x15\x1d\xdb3\xa9\xd2+\xf1$X\ \xa6\x89\xd0\x08\xde\x7f\xb0\x8e\x99\xe7y\x94J%\xf0$\ \x9dz7\x0b\x8f\xd6\x81\x22F<\x83\xbd\xc7\xc2\xb2-\ \x81\x93\x9b\ \xbe\xcc7Oz\x88\x90jP2Kd2\x19\x86\x86\ \x86\x18\x1a\x1abS\xecu\xe4\xc2\x1d8\xa6\x87i\x9a\ X\xa6\x85\xa2K\x1c\xc7en\xf4\x5c\xbev\xe2\x8f\x89\ DB\xd4\xb4TR}R\x12\xcf\xf07f\xf9>\xff\ jF\xbd\xbc\x83,\xcbB\x08\x98\xa0\x1e\xc5\x8a\x9e'\ \xf9\xed\xf2\xdf\xf0\xa5#\xbf\x89\xeb:\xa4\xd3iR\xa9\ \x14\xf9B\x1e\xc7\xb3I\xd6.c\xeb\xee\xdd\xf4\xe46\ Cm??Z{9\xe9d\x8eT:M:\x9d&\ \x93\xc9 \x84\xf8\xb3\xc7d\xfc\xf8\xf1A\xbc\xe0\x0b\xd2\ \x02!\xd1\xc3\x1a\x9f\x9cs>\xab\x07\x9fAz\xbe\x0a\ \xb4l\x1b=\xac#\xac\x18\xbd\xc5\x1d\xb4\xf7\xaf\xe0\xb0\ \xfay4\xd54\xa1\x0a\x1d\xd7uq\x1c'\xd8\x14\x91\ *\x81\xaa\x8a\xe0\xf7\xb6m#tA\x85\xde\xc0\x95\x9f\ \xf8&?|\xf6\x07\x5cz\xec\xad\x5c\xb3\xe8\x1e\xda\x1a\ g\xe0\xb8\x0e\x8e\xe3\xbf<\xcfCQ\x94\x0f\xdf\xa8\x97\ O\x88m\xdb8\xd8\x08\xa1\x10\xd6#\xb8\x9e\x8d+]\ \x92\xc5a\x14E\x0b\xbc\x15\xd7q\x91\x8a\x87kI\x9e\ \xeb\xba\x85\xd2V\x97\xe2\x80 \xdf\xa51\xb4\xb1\x88\x11\ \xd1A\x82e\xdaTF\xabn\x9e;g\xee\xe8\x1f\xc3\ \x0fR\xa9\xd4\xeb===w\x97\x05288\xe8{\ f\xa3.\xabo\xcap\xfe\x0f\xcfc0\x91C\x9a\x05\ $\x1e\x02\x81|\xdae\xad\xda\xc1\xe5\x8f\x5c\xc3h6\ \xc1\xe5w_\xc1\x9a7^\xc3t\x8b\xbe]\xd9\xefd\ j\x86\xc2\xf6\x9f\xbbT\xc7r`\xfafB_Q\xc5\ \xeaW\x93\xcc\xbdv\x1e\xd5\x91\x18_\xfa\xd1Wq\xa5\ \x8b\xa1F\xd0#\x1aB\xf8\x1bTU\xd5C\xe2.k\ \xef\xf7\x84X\x96\x85-\x1c4Ec0\xbf\x973b\ \x0b\xe8\x89\x99$\x0a~\xfc\xa1i\xfe\xd4u\x05\x95\xa5\ \xd7\x8dbgd\x10\x04\xda\xb6\xcd\xa2E\x8bh\x98m\ \xa2\x0a\x85Nm/G,\xd2\xb1\xfb*\xce\xb6\x07\x22\ \xc8t\xe8]A\x9d-[\xb6\x00\xdc]VY\x93'\ O&\x12\x89 \x84\xa0\xcf\x19\xa1\xee\xfc!&\xca*\ \x9c\xfe\x0a\xac\xde\x0a\xdcx\x08\xe4\xbe\x89j\xaa\xc6\xb1\ w\xef^\x22TQ\x1bn\xc4s\x07q\x1c'\xf0\xee\ \xd4\x9cG}c=\xe3\xea\xc6\xa1(\x0a;\x0b\xfd\xcc\ \xfc\x5c\x91XL\xc7M\xc7\xb0z#8\x835X\xfd\ a\x14E\x04\xaa\x13\xa0\xbb\xbb\xfb\xaf+\x90R\xa9\x84\ \xadI\xa4\x0cc\xd7l'1\xecp\xd2\xc7\x8e\xe4W\ \x9bn\xa0/\xd9\xc7Yg\x9d\xc5\xa5\x97^\xca\xf2\xe5\ \xcbiooghh\x08\xd7uq]\x97\x81\x81\x01\ \xcaqJ\xca)\x10=9K\xa89\x8a\xd7\x90D;\ J\x10\x12\x158%\x0fUh\x0c=\xd0\xe8cO\xfb\ \xdd|\xf9\xfbr\xec\xa0\x08\x85-\xd6\x1e\xe6\xd56S\ \xb2\x0a\xd4\xcc\x0bQ\x98\xdd\x0bH\x84\x13\x22\xbd\xaa\x9a\ \xe2\x8e0\x00!\x11\xe6\xbaW\xcf#[\xca`\xd9V\ \xa0r\x00*\x84\x82;6\xa7\x10\x82\xbe\xd2('7\ \xd6Q,\xba\x1c9\xe38\xb6\xd6\xac@\xceu\x11\xa8\ \xe46E\xc9\xac\xa9\x02!Q\x14\x05\xcf\xf3>x\x81\ \x8c\x1f?\x9e\x81\x81\x81\x03\x8d\x8e\xa28\xc9d\x92T\ *\x85\xady\x94\xac\x18\x8e\x90\xdc\xf5\xc6\xd7\xf9\xc6\x19\ 7#\xc3&\x96[\xe0\xfa\xeb\xafg\xd9\xb2e|\xfe\ \xf3\x9fG\xd7u\x22\x91\x08;v\xec\xa0\xb2\xb2\x92\xf6\ \xf6v_\xa0\xb6\x8d\xed\xda\x18\x9aJjH\xe5\x07\x17\ >\xcd`z\x80\xfb6]\xcf\xe2y\x7f\xc3\xf3]\xf7\ \x8e\xb9\xc5\xbcC e\xe1Z\x96\x85\x22\x04\x8a\xa2`\ \xd96_=\xfcgdD\x17\x9a\xe1\x91\x1cuX\x91\ \xf89I|{ \xa5\xc4\x93\x1e\xdd\xdb\x06H\xec\xb4\ \xc9\xc6K8\xd5\xfb<\xc2\xa8P\x025&\x84\x00\x01\ %\xd3\xe4\x82\xe6\xef1\xaa\xb7s\xcd\x82{xe\xf3\ \xcbd\x22\x1d\xb4\xb3\x0b\xdb\xb6\x90H4M\xc3\xb6m\ TU}\xcf\xce\xc9{\x12\xc8\xc0\xc0\x00mmm\xff\ \xbb\xba\xba\xfah?\x00\x13\x8c&F\xe7\xab\xaa\x8a\xa2\ (\xe8R\xc1\xc9Hr\x03.v\x9f\xe0\xeb\xff\xf2\xcf\ \xa4wIJ\xa3\x82\xaf|\xe5+|\xfb\xdb\xdf\xe6W\ \xbf\xfa\x15\xdb\xb7oGJI\x22\x91 \x16\x8b\xd1\xd9\ \xd9I}}\xbd\x1f\x19K\x1b\x01\x1c\x1e^\xcc\x9a\xc1\ \xa7\xd9\xd35\xca9\xe3\xff\x0f\x0b\x0f;\x965C\xcf\ \xb2\xd3,\xbd\xab@\xca'\xc4q\x1c\x14\x04J\xa5\xa0\ sg\x96#\xcf\x9b\xcde\xbf\xbd\x9c\xfb\xfev\x1d\xc3\ u#x\x03#<\xe4\xfc\x0e\xd3\x1c\xfb\x7f\xcdc\xe5\ wS\xa8\xba@\x11\x0a\xc5b\x91b\xb1\x08@\x95\x1b\ \xc2uU\xff\xd4)\x0aBHF\x86J\x9c\xfd\xe9O\ r\xe5\xd37p\xe6\xd4\x8b\x99\xde0\x8f\x94n\xb0\xc1\ \xdd\x8ei\xfa\x0e\x85\x94\xfe\xebC1\xea\xe3\xc6\x8d\xfb\ \xc2\xb4i\xd3\x8e\x07p\xa5\xc7\xfa=o\xa0\x0a\x95\x89\ \x13'b\xdb6\xe9g-R\xd2CJ\x81\x94a4\ @\xd3-\xfa\xfa\xfa\xb8\xf4\xd2K\xdfu\xce\x5c.G\ ,\x16\xf3]g\xe1 \x84B\xa5Q\x83\xe5\x16q=\ \x97\xba\x86\x10]\xa9\xadd\xac\x04\x96\xa5\xa1h\xe2\x1d\ \x02Q\x14%8%\x02\x81\xa2\xa8\xb8.h\xaa\x8a\x10\ \xfe\xc28\x8e\xc3\xea\x9e\xdf\xe3\xb9.\x96\xe5\x05\xae\xf2\ \x9c\xf9\xb3\xe9\xe8\xe8 \x16\x8b\x05\xaa\x13\xc0\xf1\x94}\ \xa7NQ\xc0\xd8\x87~\x0aEA\x08A\xb6\x94e\xc3\ \xc8\x92`.\xc4\xbe\xe0\xf0`\x91\x86\xbfH \x9e\xe7\ \x09\xd34\x91R\xf2\x96\xd9K\xed\x14\x97\xe3\x9a\x8e\xe7\ \x9cs\xce\xe6\xe4\x93O\xe6\xa7?\xfd)[\xb7ne\ \xfe\xfc\xf9\xac\x5c\xb9\x92\x993g\xb2f\xcd\x1a\xe2\xf1\ 8\xe1p\x98|>\x1f\xec\x9c\x8cRb\xfc\x1c\x85\xfa\ \xc4T\x8a\xd9\x9c\xef\x18(\x0e\x8a\xa22\x9c\xeba~\ t.\x03\xc2d\xb4\xd0\xcf\x84\xc8D\x84\x14X\xa6\x85\ p\xdfyB\xf6\x07\x0f\x05\x02\x0145E\xc8e\x1c\ \xa4\xeb\xab&\x17\x9b\xb0R\x85\xebf0M\xb7\x0c\x8b\ \x80\x84I\x93&\xa1i\x1a\xae\xeb\x06\xf3*\x1b$9\ '\x03X\xbe\xca\x0aC}}\x84\xcd;w -\x1d\ EQH\x17\xe3\x1cV}4;\xdc\x17\xb0,_e\ \x95m\xc7\x87\x22\x10)\xe5>\xfd\xeb\xf9\xae\xa4\x10\x82\ \x9a\x9a\x1a\x22\x91H\xe0\x7f\x87B!\x8e:\xea(\xf6\ \xee\xdd\xcb\xd1G\x1f\xcd\xbau\xeb0\x0c\x83\x9a\x9a\x1a\ \xd2\xe94B\x08R\x86\xc7\xb4OE\x08\xaf\x9e\xc6\x96\ \xd5\xeb|\xf0Q\xf7PD\x98Ac9\x13\xf5\x8bh\ \x9a?\x9d{\xd6\xff\x1b\xe7\x86\xfe\x91\xaap-%\xab\ \x0f\xe5]\x04\x22\x84\x1f/\x94J%\x941,c\xc2\ \xc4j~\xf2\xca\xb7\xb8\xeb\xc2e\xdc\xf4\xda\xc5H3\ BcM3\xb6\xd3E\xa9d\xf9\xaa\xc5\x15\x8c?]\ b\x0eU\xe1fu\x9c\xa4\x06\xb6\x82P\xfd\x135\xe2\ $\x82\x13\xe2T\xbaTU\x86\xb9s\xdd\xff\xe6\xa7\x9f\ [\xca\x7fm\xb8\x86\x1d\x99\x0eZ\xf4Vl\xd7\x22\x9f\ /\x80\xf0\x05\xa2(\xca\x87vB(\x9f\x10Ox(\ B\xa1\xbd\xbd\x9d\xd1\xd18\xc3\xc3\xc3\x14\x0a\x05\x00:\ ::\x02]\xea\xban\xb0kJ\xa5\x12\x86a\xf8I\ (\xdd\xa3\xc20\xd84\xf4:\x89D\x8eb\xb1\x88\x19\ \x92\x14\xad\x18F4\xc2\xb5\xbf\xbb\x98\xbb\xbf\xf2[2\ \xde \x8fu\xfc\x88R\xcactd\x14\xcdP\xcaj\ \xca\xdb_ \xc5b\x91T*\x85@P0%%\xcb\ \xa4\xcb{\x85_/\xbf\x87\x86\xda\x09\xac\x8b/\xc5K\ \x08\xba7&\xc9\xa7}\xf7V\xc3\xa0uA\x05\xfd\xf1\ \xbd\xfeB\x86$\x89Wc\x14;\xa2A\x90X,\x16\ \xfd\xf9\xab<,\xd7\x82\xaa8_\xfb\xed\xe79r\xc6\ \x0cR\xb9a\x92\xf18;\x96$\xc9\xe7\xfd9\x85\x10\ \x18\x86\xf1\xe1\xa0\xbd\xe5\x88\x18@\xea\x12\x90\xd4\x8f\x1b\ G<\x1eGQ\x14*++\xffd\x10\xd9\xdf\xdfO\ 2\x99DQ\x14r\xc2\xa1dW\x10\xad\xcf\x93VU\ TUEC\x82\x10\x08EPiH.\xfa\xe6\xa7\x19\ \xed\xb0I\xed. \x14\x81Q\xa1\x07\xf3\x19\x86q\xf1\ \x84\x09\x13\xf6\xf4\xf7\xf7\xdf*\x84@\x1d\x9bC\x11\x0a\ F\xc1E\xba\x92d\x07<\xbc\xfd\x1e\x867[\x98i\ \x171\x16/h\x9a\xe6g\x03=\x97\xd3&\xfc#b\ \xa2CzX\xf0J\xf26Fl_\xf5\xb9\xae\x8b\xa2\ (h\x9a\x86\xa2(D\xd3.\xe9^\x87\xfe\x0d&\x89\ \x1d\x9bx~\xef\xfa\xfd\x5c[\x81\xae\xebH)\x83\xa0\ \xf0P\x9c\x10\xf5\xcf\xbd\xa1\xa1\xa1\xe1RUU'\xba\ \xaeKV\xb5\x98\xff\xe9(g\x1c\xfd\x0f\x94fl\xe2\ \xb2\xcf\x5c\x87\xd1\xa20\xfe8A2\xba\x87\xee5\x19\ \xf2\x85<\x85B\x81\x81\x81\x01+\x9b\xcdZ\xb6m\xab\ \x8e\xe3\x08)%\xc5\x88\xc7\xec\x8fW\x92\xed\xb5)\xec\ \xd1\x88D\x22\x18B\xa3\xd8\x01]/\x9a\x0c\xac\xb4\xc9\ tJ\x9c\xac\x8f\xbe\xaa\xaaZN\xc5\x22\x84`\xe2\xc4\ \x89$\x12\x89d8\x1cV3\x99\xcc\xceX,v|\ \xb1XT\x9a\x9b\x9b\x09%%{_\xb2\x19\xdd\xecR\ \xe8\x07\x5c\x05MS\xc7\xbc%\x7f>!\x04\x9a0\xc8\ \x1f\xdd\xce\xff:\xf6{D\x8d*\x06\x0a\xbb\xd9\xbd\xb9\ \x97\x5c\x9f\x87\xe38\x14\x0a\x05\xc6\x8f\x1f\xcfUW]\ E\xbao\x84\xe4F\x0dg(D\xc8\xad R\x11\xa1\ \xa2\xa2\x02EQ\x08\x87\xc3\x01\xa0h\x18\x06\xf1x\xfc\ QUU\x1f+\x14\x0a\xde\x07.\x10`\xa2\xe7y\xe4\ \x0d\x879\xa7V\x93t\x07\xb9\xee\x9c;\x18\x12o\xb1\ 1\xf5\x02\x0b\xe7\x9c\xca\x9e\xc4V\x06\xd6\xfa\xd8\x96\xa2\ (L\x9f2S\x9du\xf8l=\x91J\x88R\xa9D\ \xa9T\xa2\xca2\xc8t\xb9\xf4\xaf\xcb3g\xd6[d\xea\xe2j\xce\x9eq1\xd9B\x8e\xe7:\xef\ \x22\xb1\xdd\x09\x04R,\x16y\xf9\xe5\x97\x91Rr\xd2\ \xc9'\x91/\xe4\x995{\x16UUU\xcc\x9b7\x0f\ \x80s\xce9\x87\xe9\xd3\xa7\x07s\x16\x8bE\xb6m\xdb\ 6\xe7/\x15\xc6A\x81\x8b\x8e\xe30::\xca\xe8\xe8\ (\xe9L\x86\xa2U\xa4\x10\xd9\xc5\xf7\x9f\xfa.\x9a\xae\ \x90U\xbay\xea\xad\xbb\xe9\xebH\x92L&H$\x12\ \xa4S\x19\xd4\xd3v#>\xbe\x1d\x19)q\xc2\x09'\ \xb0~\xfdz>v\xcc\xd1\xc4\xec\xf1Th\xd5L\x99\ 2\x85d2Iss3\xe3\xc7\x8f\xa7\xb6\xb6\x96\xa9\ S\xa72}\xfat\x14Ea\xf2\xe4\xc9h\x9aF8\ \x1c\xa6\xb1\xb11\xd8\x8d\xea\xcc8B\x11TTT\xe0\ y\x1e\x8d\x8d\x8d\xc4\xe3q&M\x9a\x84\xeb\xbaL\x98\ 0\x81\x86\x86\x06f\xce\x9c\x19\xc04uuu\x9c~\ \xfa\xe9\x14\x0a\x05TE\xa1R\xaf\xc5vM,\xcf\xa4\ \xdah\x08\xbc\xb5\xb2\xda\xea\xea\xea\xc2u]\x86\x87\x87\ \xf1<\x8f\xda\xdaZ\xf2\xf9<\x9a\xa6\x91L&\xe9\xeb\ \xeb\xc3q\x1c\x9a\x9b\x9b)\x95J\xc1I\xfePh@\ 3g\xce\x5cc\x9a\xe6q\x8a\xa2\x90\xaat\xf8\xd47\ \x1b1\x0cAj\xb7\xc3\xf0\x16\x93\xf8[\x16\xf9a\xf7\ \x00lGU5\xce\xb9\xe2T\xf4y{x\xf1;{\ \xf8\xc9\x0d?#\x9dNs\xef\xbd\xf7RSSCg\ g'\xae\xebr\xec\xb1\xc7\x92L&\xe9\xef\xef\x0f\x9c\ \x01\xcf\xf3\xde\xf1*\xbb\xa6\x95\x95\x95\x0cezPL\ \x83\x193f2<\x14\xa3^\x1e\xcd\ \xcd\xcd\x18\x89$\x1bo.\xe2\x94\xe4\x18kD\x22\xd1\ 0\x0c5\xb88\xcf\xf3P\x04|\xe6\xd8\xbf'\xde\xb4\ \x89WBw\xf2\xfd\xef\x7f\x9fo~\xf3\x9bd2\x19\ \x22\x91\x08\xb6mSUUE{{\xbb\x7f\xf3\x08<\ W\xe2I\x17!\x14\xdf\xb0*\x1a\x9e\x94(B\x09\x22\ u\xcb\xb2h\xaanedd\xc4\x8f\x01\xa4\xc4\xb1\x1d\ \x96\xbd\xf2\x1a\xaet\xd0\x14\x1dO\xfaq\x8d\x82\x8a\x16\ \xd2\x82m'<\x81\xebJ\x9c\xa2\xc7\xcf\x97\xdfIc\ \xb4\x85\xcd\x85\xe5\x14m\x95=o\xc4)&\xfd 3\ \x1c6\xd0\x09St\xf2DB\x11,\xdb\xf6m\x11:\ \x8a.\x0f\xd8\xc2A|\x95\xc9|x9u\xdb\xb6\xb9\ \xfa\xea\xabY\xb4h\x11\x8e\xe3\xf0\xe8\xa3\x8f\x92\xc9d\ \x82\xa0\xafP(0}\xfat\xde|\xf3M\x12\x89\x04\ \xf5\xf5\xf5l\xdd\xba\x15M\xd5X\xd3\xf3\x1c!\xcd \ \x97\xcb\xf1\xf5\xaf\x7f\x9dB\xa1@MM\x0d\xd1h\x94\ \xad[\xb7\xd2\xd8\xd8\xe8\xab\x0b\xc5e\xce\xe7\x22\x1c;\ \xeeB\xccp\x1f\xa9\xbe0\xeb{^\xe5\xf4cNf\ \xdd\x8eW\xd9\xf3\x8c\x83\xa2ACC\x03\xc5b1\xf0\ \xfc\x5c\xc7\xa1\xdb\xebg\xde\x19\x95\x5cq\xc2\xcd\xfcb\ \xe3\xb78\xa5\xf12V\xedz\x95|\xc56\xb6<\x90\ !\x9f- \x10\xe4\xc6y,8;\x86\x18\xf6x\xfc\ \xf9\x9f\x92\xeev1G \xdb\xe7`\xe7\xf7yJ\x9e\ \xa5p\xfa\x1d-\xfc\xe8\xec\xdf\xf3\x99\xff\xfc$\xff\xf2\ \xe9\x7fG\x91!6$\x7f\xc7\x0b\xff\xf5\x06\xa5>=\ \x10\xcaK/\xbd\xd4\x0c\x0c\x1fJ\xb6\xccA\xb9\xbd\x93\ 'O\xa6X,2s\xe6L\x14Ea\xda\xb4iT\ VVRUU\xc5SO=\x15\x18\xe2L&\xc3\xc6\ \x8d\x1b\x09\x85B\x08\x04\xba\x88Pt\xf2\xec\xdd5\xe2\ \xbb\x91\xd1h\x80\x13\x95\xed\x83m\xdbH\xcdc\xe2\x91\ \xd5\xbc5\xf8*?\xb8\xe0\x01L%\xc5\x7f<\xbb\x86\ \xc5'\x9fM\x9f\xdaN\xef\xf3i\xd4\x90O\xa6+\xc3\ \xe5\x96e\x11\x0eG0\xea\x1cZ\xe6\xd7p\xc6\x19g\ \xb0T\xf9!\xc7\xb7\x9e\xc8P\xa4\x8b\xe1\xe8^\xba\xaa\ <\x0c=LCC\x03\xc3\x83Ct=\x06B\x11\xc4\ U\x90c\xe6Sx\x1aFX\x04*S\x95\x1a\x8a]\ \x85\xc4%K/M5\xcd<\xbf\xfaUv*\x1b\xf1\ \xc6\xd4\x1e\xc2\xf7\xfc\xaa\xaa\xaa\xc8f\xb3\x87\x94\xba\xf4\ g\x05\x12\x89D\xb8\xe9\xa6\x9b8\xf7\xdcs\xf9\xde\xf7\ \xbeG\xa9T\x0atrY?\xf7\xf6\xf6\x1e`\x03\x14\ \xa1\xb0\xec\xad\xa5\xcc=\xfeD\xd6\xb6u\xe3\x0c\x86\x89\ F\xa3\xa4\xd3\xe9\x03\xd2\xb5\x89D\xc2\x0f\xc6B\x12\xcb\ \x0dS\xd1X\xe2{\x7f\xb8\x86\x1b?\xf3\x13\x8cJ\x87\ _n\xfc\x0f\xe2\x03&\xa9t\x12E\x13\xd8\xb6\x1d\xc4\ \x13e\xbe\x95\x94\xe0x&\xb9b\x0e+k\xa0\x1a\x16\ \xaa\xaaS\x1fj\xa3dn\xe0\xb6\x1f\xdfA}}=\ \xabV\xadb\xe3\xc6\x8d\x84\xc3azzzhll\ \xa4\xab\xab\x8b\xd9\xb3gcY\x16\x1b6l\xa0\xa2\xa2\ \x82\xbe\xae\x01\x14\x0dTU\xc7q\x05\xaet\x89\xe8a\ \xa4\xe7\xe1\xd8\x0e\xa6\xe5\x93\x1b\xca\xc1\xee\x87N\x03r\ ]W\xaf\xac\xacd\xe9\xd2\xa5\xc1\x05\x94\x8d^90\ \x13\x12\xf6O);\xb6\xc7\xda\xc4#t\xf7EH\x0d\ eI\xa7\x0bTUUQWW\x17\x08\xa4\x1cPy\ \x9e\x87\x82D\x0b\x0b\x8a\x09\x97\xc1\x9d[9\xeb\xcb'\ \x91\xeb\xf5\xb0\xf3\x12+\xe3\xa2\x85\xf6\xc5#\xe5\xcdP\ *\x95\x90\x9e\xc4q<\x22Q\x95k\x9f\xfd,7\x9e\ \xf90\xbf\xd8r\x1d\x83\xfaN\x1a\xf4\x06\xa4\x84q\xe3\ \xc6\x91\xcdfimme\xdd\xbau\xcc\x9f?\x1f\xcf\ \xf3\x98={6CCC\xe4\xf3y\xda\xda\xda\x985\ k\x16\x0f<\xf0\x00BQp4?\xfa\xff\xdb\xa3\xff\ \x89\xbc\xecG\xa2r\xc6\x94\x7f`\xabs'\xd6\x98@\ \x0eU\x86\xf0={YUUU\x0b<\xcf\xaby\x9b\ gQ\xdb\xda\xda\xfaP.\x97CHp\xa7\x08\x8e;\ \xb7\x9a\xfc\x90K~\xd8\xa50\xe4\x11\xa9\xd2)\xa5=\ \x92\xbbl<\xe92y\xf2dt]'\x97\xcba\xdb\ 6\xc3\xc3\xc3\x84B!\xe6\xcd\x9bG_o\x1f\x96m\ \xe3\x99r\x8c\x08\xed;\x0c\xae\xeb\x1e\xa0:\xa3\xd1(\ \xa5R\x89|>\xef_\xbc\x04s\x9a\xe0o\xbe\xd1\x84\ \xebBK\xf8(\xc67\xd7\xb2z\xd7K\xe4\xfa]\xba\ \x1e\x0c\xd12\xb1\x95c\x8f=\x96\x17^x!\x88\xa6\ -\xcb\xc20|\xdbV\xcee\xf8\xfc\x00\x81]\xf08\ \xed\xceJ\xf2C\x06?\xff\xfcRnZ\xf1e\xba\xd2\ o\x22\xf1\xd8\xfc\xd3\x12\xc9N\x07\x90\xd4\xd6\xd6\xb2s\ \xe7\xce\xe6d29\xf4\xa1\x0a\xe4\xdd\x86\xae\xebM\xf3\ \xe7\xcf\x1fL\xa5R\xd4\xd4\xd4\x90\xcbfq,?_\ \x82\x02\x8a\xcf\xb29\x00\xdbjiia``\x00\xcf\ \xf3\x13@\xa6ir\xdf}\xf7\xd1\xd2\xd2\x82\xa2(<\ \xf9\xe4\x93\xec\xde\xbd\x1b\xd7u\x03ol\xc2\x84\x09t\ vv\x92L&\xd14\x8dt:M\x22\x91\xc04\xcd\ @uy\x8d\x82\x93\xff\xb1\x96\xf8\x0e\x9bT\xa7\xcd\xe8\ 6\x0b3\xe5\xa1h\x82\xc6\xf1\xf5A*\xf9\xcfy\xaf\ \xe5\xb5\xc8\xa5\x0a\x1c\xf5\x8d\x10NIR\xa1\xd6\xa1\xaa\ \x1eY3I\xba\xc7a\xfb\x139<\xc77\x19\xd5\xd5\ \xd5\xe4\xf3\xf93\xc3\xe1\xf0h*\x952{zz\xb6\ \xfeU\xb9\xbdB\x08\x1e}\xf4Q\xa4\x94\xac\x5c\xb9\x92\ \xdd\xbbw\xd3\xdb\xdb\xebg\x01\xc7^\xaa\xaab\x18\x06\ \x9d\x9d\x9dD\x22\x11t]?\x80\xa11}\xfat^\ \x7f\xfdu>\xfb\xd9\xcf\xd2\xda\xdaJ$\x12\xa1\xbf\xbf\ \x9f\x193f\xd0\xde\xde\x8ea\x18444\x90\xcdf\ I\xa5R\xe8\xba\xee\xa3\xbb\x8a\x82a\x18|\xf1\x8b_\ \xe4\xe5\x97_\xa6\xe7\xa1\xb19]\x97q1\x0f\xb7\xd2\ \xb7e\xfb{d\xb1X\x8c\xed\xdb\xb7\x9fR*\x95\xf6\ \xbc\xedV\x8e>\xfc\xf0\xc3\x9f\xc8\xe5r\x14\x0a\x05\x16\ -Z\x84\xb2\xbc\x92\x10P\xf0l\xb4:\x0b-5\x91\ \x06\x04\x0d'\xbec\x19^PU\x95\x8e\x8e\x8e\x1d=\ ==3\xffj'D\xd3\xb4\xa6\xa3\x8f>z\xf0\x96\ [n\xa1\xa9\xa9\x09\xc30\xb8\xe1\x86\x1bhhh@\ UU\x16,X\xc0]w\xddEUU\x15MMM\ \x84\xc3a^x\xe1\x85 \xc3\xd7\xd0\xd0\xc0\xde\xbd{\ \x99>}:G\x1ey$\x83\x83\x83$\x93\xc9 \xe1\ 4V\x12\x80\xae\xeb\x14\x8bE\x1c\xc7!\x12\x89\x04d\ \x02EQx\xf3\xcd7\xd9\xbcy3\x00\x1b6l@\ \xd34V\xae\x5c\xc9\xe4\xc9\x93\xc9f\xb3L\x992\x85\ b\xb1\xc8\xfa\xf5\xeb\x91R244\xc4[o\xbd5\ }tttW\xf9>\x1a\x1b\x1b\xaf-\x14\x0a\xc7\xd4\ \xd6\xd6^X\xbe\xf6l6\x1bD\xde\x83\xc5a*#\ >\xac.\xed1\xe6\xbe#\x984i\x12U\xd5U>\ \x89[\x08\x1c\xc7\xb1\x84\x10]c\xea\x5c\xdb\xb4i\xd3\ }\xf1x\xfc;\x1f\xea\x09Q\x14\x85G\x1f}\x94\xe3\ \x8f?\x9eg\x9f}\x96\x5c.\x17\xa8\x93\xce\xce\xce \ g\x1e\x8f\xc7\xf1<\x8fH$B&\x93\xe1\x86\x1bn\ `\xca\x94)\x5c|\xf1\xc5\x98\xa6\xc9\xca\x95+\x03\x1b\ Q\x86G\xca\xc6\xb2\x9c\xdb\xd6u\x1d\xdb\xb6\x09\x87\xc3\ A\x00\xbaq\xe3F\x9a\x9a\x9a\xd8\xb1c\x07\xa3\xa3\xa3\ \x81\x0b]YY\xc9\xc6\x8d\x1b\x19\x1a\x1a\xa2\xa1\xa1\x01\ ]\xd7\xe9\xed\xedEUU\xa4\x94\xe2m\xc1\xee%\x0b\ \x17.\x9cf\xdb\xb6D\x22\x8a\xd5i\xaab\x1a^*\ \x84\x9b\xd6\x11R\x01\x05\x84\x90\x01\xc8d\x95,z\xd8\ L\xf3\x94Z\xdc\x8c\x8e\x9b\xd2\xf0\xb2ZHh\xcc\x00\ \x08\x87\xc3l\xd8\xb0\xa1\xf1\xc3\x88\xd4\xeb\x92\xc9\xa4>\ V\x5c\xd3\xe0\xba.k\xd6\xaca\xf5\xea\xd5\xef\xf06\ \xca\xbc\xdf\xb2j\xdb?\xc5YUUE\xa9T\xe2\x17\ \xbf\xf8\x05\xf7\xde{/\xb6mSSSCcc#\ /\xbc\xf0\x02\xad\xad\xad\xe4\xf3y\xb2\xd9,\x9e\xe7\x91\ N\xa7\xc9f\xb3\xc4b1R\xc9\x14U\x95\xd5\x14K\ \x05.\xbb\xec2b\xb1\x98\x8fO\x8d\xedh!\x04o\ \xbd\xf5V\x90\xde\xdd\x1f\xde\x187n\xdc\xbb\xb2\xe3\x13\ \x89\x04\xb6m\x8b\xbd\xf6\x10\xb3?i\x22\xa3\x0a\x1e\x0e\ \xaa\xa6\xe0\xa5t\xac\x01\x03\xbb/L\xa9\xd3?\xa1\xd2\ \x85\xdaya\xea\x16\x94(\xbaq\x14\x05\x9c\x9c\xca\xf0\ C\x8d\xef\xb8\xe7\x0fT \x8a\xa2\xac\xb9\xf0\xc2\x0b\xa7\ \xbd\x17\xcad(\x14\xe2\xc5\x17_|\xc24\xcd'\x01\ \xea\xeb\xebo\xbd\xe9\xa6\x9b\x9a\xce:\xeb,V\xadZ\ \x15\xa8\xa7r\x1c\xa3(\x0a\xbd\xbd\xbd\x07\xe0P\xd1h\ \x94\xfa\xfaz\xc65\xd7\xc3\xbc!\xaa#!^\xb9m\ 7\xb1X,`\x9d\x1f\xcc\xd8?\x95\xfcv:\xaam\ \xdbX\xd2FAA\xcfM\xe4\xe6\xf3\xee\xe1\x85\xdd\xbf\ \xe6\xf9\xd1\xc7\x99<\xbf\x9e\xbe\xd8 \xd9\xedZpj\ ?1\xe1\x5c\xae8\xf5j\xbe\xf0\xd3\xd3\xf8\xa7\xf3\xaf\ \xe4\xd1U\xf7\x049\xa3\xbf\x94\xe8p\xd0\x02\xf1<\xaf\ \xaaL\xb1\x1cu3L\xbc M\xa4B\x01K\xc1\xb3\ \x15\xdc\x94\x865`\xe0\x0c\x19\xb8\x19\x1d!\xfc\xaa\xa8\ P(\xd4>00\xf0\xeb1(\xff?\xea\xeb\xeb\x1b\ W\xae\x5c)\xf6\x8fct]\xff\x93\xe0]>\x97g\ C~\x07g\xcc\xaa@\xd5-\x16\xdeX\x81\xa6\x14\xd0\ U\x1d\xd7\x968q\x83\xd4\xd2\xda\xe0\x7f^{\xed\xb5\ \xaf\xe6\xf3\xf9G\xde\xb6\xa1\xdc\xa6\xa6\xa6\xfc\xdb\xe77\ M\x13\xc7v\xf0T?\x99\xf5\x99\xe9\xd7\xf0_\xab\xff\ \x9d/\xcc\xfaWf-\xfc\x04z\xb4\xc4\xcd\xbb\xaf\xde\ G\x06\xf7\x04\xaft?\x88\xf6l\x8cO\xcd\xfe2m\ \xb1#p\x5c\xc7'~\x8f\x09\xe4C9!ep\xcf\ \xb1\x1d\xb2J\x9e\xcajA6gr\xce\x11\x7f\xcf\xa8\ \xd9\xcd\x9bC\xab\xa9\x9a\xe6Q\x18\xcd0\xf4p=B\ \x0bj>\x82\xab\x8b\xc7\xe3\x09\xdb\xb6\xa7\x9a\xa6\x19@\ 1\xe5,[RI\xd18Q\xc7M\xebxY\x1di\ \xa9d\x0b)\x8c\xb0\xc1\xb8\xbaq@\x06E\x15\xcc3\ \xbe\xc0\xe2\xc5gc\x91\xe3{O\xfd;\xf3gOf\ \xab\xb35\x98g,\xbf]\xf4^\x7f\x19\xcd\xb1:\x1a\x12G\xb1n\ h;\x9f=\xf9B\x1e\x1f\xf4\xc9m\x8a\xa4\x1c\x91\xef\ \x8f\xf5d\xc3\xe10\xae\xeb\xa2i\x1a\x13'N\xc4u\ ]\xd2N\x81Y\x17\xb9\x18a\x05\x17\x1b\xa18xy\ \x85\xedw\xd7`\x88\x0a?J\xf0 \x95*r\xfe\xf1\ \x17q\xdb\xda\xcb\xf8\xfc\xf4\xff\xe0\xdf\x17\xdf\x81\xad\x8f\ \xd2\xbe\xf5\xaa`\xc1\xfeH\x04\xad\xb4\xb4\xb4\x8c\x94\x13\ U\x00\x9e\xea\xa2i*\x9e)\x10R\xd0 \x1a\xc8=\ \x067{\xd7\xa3+\x06?\xf5nCA\xc5\x99\xbb\x9b\ I\xb3\x9a\xf6\x95\xbc\xa1\xd0\x1ai\xe5\xb0\xe6\xc3X\xdf\ \xbb\x97\x1a\xa3\x11\x89\xc4\xb2\xec\x03(\xb4\x1f\x8a@\xca\ \xc7\xdb\x15\x0e\x0aa\x16\xcd]\xc4\xca\xa1\x87\x19\xe9\xaa\ \xc0p\xea\xb1\xbd\x12H\xe1\x03\x88\x1e\xe5\x9c\xf3\xa9\xe3\ \xc7\x8f\x1f\x1c\x18\x18\xb8\xa7|\xc1\xe5\x8b.\xd3\xf8m\ \xd7&\xa4k$\x06]~p\xc1\xe3tf\xd6\xf1\xe0\ \xc6\xffDz\xc2'\x19H\xc0\x00\xab$\x89F*\xf0\ \x84C\xb6\x90g\xdd\xce\x0dT\xb4\xf4\xa3)\xa1}\x05\ B\xefN\xe94***\x88D\x22H\xcf\xa3G\x0e\ 3\xff\x22k\x1f\xe1n4\x843\x10\xa1\xd4m\x10N\ T\x8f\x91\x8a\xc2\x84\x8d0\xf3\xa7\x9f\xc4&\xf7\x09,\ k\xdf\xbe:\xa5\xedR&O\x8f\xf0\xfc\xf0*Vt\ \xd9P\xe6h\x8d\xdd\xdf_rB\x0e\xda\x02\x95\x0d\xa0\ eYx\xae\x07c\xa5\xcc\x08Q\xa6\x92Qrrc\ \xef3\x83r\x85\xc3\x0f?\xfc\x14\xc30\xbeZ\x9e#\ \x16\x8bq\xd7]w1~\xfc\xf8}u&\xb6\x83\x10\ \x82\xaf\x1c\xf3m\xd6\x0c=\xce\xcem\x19f\xa9\x9f\xa5\ \xd2\xa8\x0e\xe6AB\xac\xc6`$5J\xb5^\xcf\xf8\ \xbaF\x5c\xcf\xc6vl\x84T\x02\xc2\xdb\x1f\xa3rJ\ )\xc7j>l\xf2\x22\x0f\x12\x0a)\x95\x0bf\xff/\ \xaa\x9bC\x18\xb3\xd3\x8c;7Nx~\x22\x98\xcbq\ \x5c\x96t\xdd\x87c{$\x93I\x92\xc9$\xa5\x82\xc9\ \xa3\x9b\xee\xc2\x949B\x95\x92\xce\xe2Z\x86w\xe7\x82\ \xbf\x8fQ\x9e\x9c\x0f\xd5\x86\xb8\xae\x8b\x82\xc2\x8b\xed\x7f\ \xe0\xe4\x8f\x9dLJ\xea\xbc\xd6\xf54G6~\x8d\x97\ \xc5sXV\x1eE\xfa\xe8\xec\x98W\xe6\x95w\xefu\ \xd7]G<\x1e\xa7\xa5\xa5\x85B\xa1\xe0\x9f\x10a\xa3\ H\x95\xc3\x9a\xa6\xf2\xda\xe0JF\x0b%v\x0du \ \xf0\x17Z \x90H*+\x22<\xb2\xe5\x87|y\xc1\ w\xe8\xcc\xad\xe6\xcd\xfc\xf3\x9c\x119\x1b[\xeec\x1f\ \xfe1\xb7\xb3\x1c\xb1KW\xe2\x85|\xa4\xe0\xc63\x1f\ \xe6\xa9\xad?\xe7\xba\x85\x0f\xb0d\xe3\x12\xcc\xea\x9d,\ Y\xff*\xa6\xe9s\x03\x8c\x90M\xffj\x8b=#\xa9\ \xa0 \xc7qm\x92\x9b,n\xf8\xfa\xad(\xd2 \xdf\ \xefa\xe7u&\x8e\xaf\x06!Q5\x85\x9a\x9a\x9a\xcf\ \xcf\x9d;\xf7\xf8\xfd?\x7fpp\x90\xee\xee\xee\x8f\xe7\ r9\xeb\x90\x09\xa4P(\xe0\xd86f\xc4\xc3\xc3e\ \xb3\xf50\x87\xf5M\xa5\xaeQ\xa1m\x96\xca\x7f\xae\xba\ \x04\xcb\x09\x91\xcb\xe5Qt\x7fa\xca\xc1\x5c\xd9\x03Y\ \xb9r%\x9f\xf9\xccg\x02@\xcf\xf3\x81\xafL\xea\xeb\xe8\xe8P\x0e\xe9\x09\xc9\xe7\xf3\ ~N\xa0Bb\xbb\x16\x9a\xaa\xf2x\xe7w9\xa2t\ \x0c\x96ma\xa5\x15\xb6\xfd>I\xc9\xb6\x10\xce\x81\xf6\ \xa2<\x96/_\xce\xf3\xcf?\xcf\xe0\xe0 ---\ ~\xb5\x92\xea\xa7n\xef[v\x0f\xffr\xc1\xb5\x94\x1a\ \xc4\xe7O\xfe<\x8d\x93\xa0\xc7\ I\xe18\x0e\x93&M\xc2H$X{c\x1e\xb74\ \x06\xce\x0a\x90h\x84\xc2\xfb\xf2\xf9\x7f\x8a\x81^\x16\x88\ t%\xd2\xf3\x91\xe9T!\xce\xec\xdaS\x982q\x02\ /\xae\xf78\xbe\xf9S\xbc\xe1\xfe80\xe0\xe1p\x98\ hE\x94\xa6\xba\x094\xd6J\xde\xdc\xbe\x85\xb6\xb6\xb6\ }\xf9\x1c\x1fW\xc1sB|\xef\x93O\xf2\xd2\x96\x17\ p\xaa\xf7\x92\xd8\x1ba\x93\xfd\x80_\x16gyA\xeb\ \x90\x83!\xd3\xbd'\x81\xb4\xb5\xb5q\xe1\x85\x17\xb2~\ \xfdz\x06z\x06\xf1\xac\x0cn\xc8A\xea\x12+b\x05\ \x09'\xcf\xf3\xc8\xe5r\xc1\xcf\x803\x06\xa9\x9c[\x86\ Ub\xb1\xd8\x8b\xae\xeb~\xd2\xcf:z(\x86\xbfk\ \xdbG~G\xc7\xfd\xaf0\xd8S\xc0*H\xee\xbc\xf3\ N&O\x9e\xcc\xf0\xf00K\x96,\xc14M\x5c\xd7\ \xa5P(\x90\xc9d\x980a\x02{\xf6\xecadd\ \x84\xe6\xe6f\xba\xbb\xbb\xffh*:\x9f\xcf#]\x0f\ \xcb\xf6\x09\x15\xdf}\xf5b\xae?\xf5\x11\x1e\xdat\x0b\ ;\xb4e\xf4wV\xe2\xd8.\xb9\x5c\xa1\x9cf\xa0\xc7\ \x1b\xa1\xf9\xb2Q\x22\xba\x8e\xbcg\x14\xe14\x04 \xa8\ \x8a\x82\x22\x04!k\x1c\xb1h\x8c\x1f\xbdt\x1d\xf7^\ \xfc\x07\xeaO\xaa#\xd7\xbe\x85\x1ek\x17\x96\xa9|p\ \x02\xf9\xf5\xaf\x7f\xcd\xab\xaf\xbe\xca-\xb7\xdc\xc2\xb2e\ \xcb\xd8\xb8q#B\x08\xba\xbb\xbb\x994i\x12\x93'\ Of\xf5\xea\xd5tttp\xec\xb1\xc7\xb2q\xe3F\ \x8a\xc5\x22\xaa\xaa.8\xf1\xc4\x13e@\x92\xf6<4\ ]\x05GH\x84\xdf\x94\xa7\xfd[\x1e\x12P\x14\x1d\xa1\ \xda\xa8z-\x8e\x19\x0f\xa2\xf8\xa9S\xa7\xf2\xc8#_\ \x1c\x22(\x00\x00\x19\xedIDAT\x8fPWWG\ ss3\x8d\x8d\x8d\xdc\x7f\xff\xfd\x14\x0a\x05\xc2\xe10\ \xb1X\xac\x5c8\x8a\xe7ym\xb5\xb5\xb5\x1f\xdb\x8f\xa8\ \x11v]7\xb0!\xb6\x09\x8e\xb4Q+m~\xb0\xfa\ +\xb4\xd5\xcc\xa0\x94\xb6\xc9\x0f'\xe8|-E\xb1\xe8\ \xab\x97H8\x8c]mQS\x15\xc6\xce\x87i\xac\x99\ \x88=`\xe3I\x1f\x8dv\xa5@\x11\x02\xe9)8\x9e\ \x0d\x02\x14\xdde\xf7\xc0.\xba\xd3\xdbpl\xb0m\x11\ l\x88r\xa5\xd5!\x13\xc8\x13O<\xc1i\xa7\x9d\xc6\ \x9e={\x18\x1a\x1a\xc2\xb6}\xa3\xabi\x1a[\xb7n\ \xc5\xb2,\x92\xc9d@\xb0\x03\x02\xe2\xf2\xc4\x89\x13}\ o\xa3\x94\xa2n\xf10\x13&\x86q\xb2\xaa\xb0\xfb\x22\ 8\x03a\xac\xbe\x08e\x07\xba\xcc\xc1*l\xc9s\xe3\ \x8d7r\xc6\x19g\xf0\xfa\xeb\xaf\xe3y\x1e\xbbv\xed\ \xc2\xb6mt]g\xc2\x84\x09\x14\x0a\x05t]\x0f\xc0\ \xc3\xe6\xe6ff\xce\x9c\xf9\x1d\xe0;\xfb\x93\xfd\xb6l\ \xd9\x82\xa6iHE\xa2\xc7a\xef\xcbEF\xb6\x9a\xa4\ \xbaF\x11l; #Q\xb6{\xaa\xea\x17u\x96\x8a\ .\xb7\x9c\xf9;\xfe\xfe\xa9\xf3(9.\x12\x9fl!\ <@\x0a\xf4\x88CH5h\x8cN\x22Y\x1cB\x11\ Q\xf0\x14l\xc7\x0a\xd4_\x99\x94}Hm\xc8=\xf7\ \xdc\xc3C\x0f=D.\x97{\x87~\x06\xd8\xb9sg\ \xf0\xbb5k\xd6P]]\x1d\xfc\xbd\x8c\xf5\x8c\x94R\ \x1c9\xa5\x82b\xc9f\xf6\xe4\xe3\xd8S\xb3\x09gv\ \x16\xcf\x93\x98{*\x18}1\x86Pe\x90\xcc\x8aF\ \xa3A>_\x08\xe1\x97\xd2\xd96\x93'O\xc6\xb6m\ \x14\x04;\xd4=\x1cs\xa1\x86\x90\x0a\xd2\x12x%\x15\ '\x1e\xc2\xea7p\x86\x0d\x9c\xb1\xce7\xc7\x1cs\x0c\ \x97^z)\xf7\xfd\xea>\xe4(Hu\x90\xba)^\ `\x13L\xd3$\x1a\x8d2\x86\x00\xa3i*\x02\xbf\xe6\ \xb1\xae\xaa\x96\x82\x95\xc3q\xfcf9\xa5R\x09E\x0a\ B\x02l-\xc1\x8f\xff\xf0\x7f\xf9\xe5\xa5Op\xd3\xeb\ \x17ax1\xaa#1L\xb3\x97R\xc9\x0b\xec\xe9\xc1\ \x00\x8f\xef\x05\x5c\xdce\x9a\xa6aYV\xcd>\x86\xe2\ \x810\xc5\xdbK\xce\xb2\xd9\xec\x01\xb9\x0d\xff\xf7\x1e\x9e\ '9.t9-\x0d\x1agL\xba\x84_\xbc\xfe\x9f\ \xcc\x98\xda\xcc\xaa=\xab\xb0-\x1b\xa1\xf95)u\x8d\ 1B^\xa5\xaf\xd3\x14I\xae\x90e\xfc\xf8\xf1D\xa3\ Q\xb2\xd9l\xd0m!WY@\xd3\xab\x89)\x93X\ 8\xf7\x14^\xda\xfd0\xce8\x171/A\xfc\xd5(\ \xf9-~\xb1\xcd\x1dw\xdc\xc1\x8a\x15+\xf8\xc1\x7f\xfe\ \x80_\xfd\xeaW\xcc\x91G\xd0\xdd\xdd\xcd\xacY\xb3x\ \xe1\x85\x17\x984i\x12\x96e\xa1i\x1a\xa1P\x88T\ 25Vk(\xf6\xabIq\xb0l\xcb/\x83p\xa1\ \xb2\x14\xc2\xf6t:\xcc'Y\xdds\x18U\x15U\x0c\ \xe6w\x93\x1ft\x89\xf7%\xb1\x0b\xfbR\xbe\x07C9\ =h\x81\x8c\x8c\x8c\x9cT,\x16\x7fr\xce9\xe7\x5c\ }\xdbm\xb7\x91\xcdfy\xf8\xe1\x87\xd9\xb5k\x17\x8a\ \xa2\x90L&\x89D\x22(\x8a\xc2\xe8\xe8h\x90\xf5K\ \xa5R\x94J\xa5\x00Zp\xa5G\xa9\xe8q\xf1y\x7f\ \xcfM+\xfe\x1e\xadf\x02S\xab\x8eavC++\ \xe5*L\xcbD\xb8>0\xd9tA\x96\xaa\x89\x05\xec\ \x11\x03w0\x02\x1d\x02g\xd8\x0b\xa8H\xb6m\xe3J\ \xdf\x08I\x04\xdf<\xe5^~\xf4\xf2\xbf\xf2\xefg<\ \xc4\xea\x8do\xb2\xc9\xf95Cv\x1f\xb6\xed/\xe6\xd3\ O?\xcd\x82\x05\x0bhoog\xe7\xce\x9d\xc1\x02%\ \x12\x09J\xa5\x12\x89D\x22H;\x17\x0a\x05\xca\x0dl\ \x5ci2\x9a\x1e\xa5\xda\xa8#\xed$\x02\xc6\x0d\x02\x94\ \xbc\xa00\xe2\x91\x1bv\xb9\xf5\xd9\x1bI\xecpIu\ : \xfd\xba\xf7\xb2\x0c\x0e\xb6\xa0\xe7=\xa9,!\x84\ \xbep\xe1B\xd6\xad[\xc79\xe7\x9c\xc3\xe1\x87\x1fN\ >\x9f\xc7\xf3\x155\x1d\xf7\x88\x86+\ X\xd6\xf9\x04\xd7j7\xd3PW\x83\xd5o\xe18.\ \xa6\xe9C3w\xdey'w\xdcq\xc7\x1f\xbd\xbf\xd1\ \xd1\xd1\x03~\x8eU\x8f\xe5\x5c\xa2:\xff\xe7\xf7\x9f\xa5\ 64\x89\xed\xc5^\xa2\xd1(\x86a\xd0\xd4\xd4Dj\ s\x8a-\x9b\xdd1\xb7\xdb\xefhT\x15\xf3\x0e\xa0\xd6\ \x96\x0b\x98\x0e\xb9@\xa4\x94\xfc\xf6\xb7\xbf\xa5\x9c`\xea\ \xe8\xe8\x08 \x8b\xb2\x8d\x10BP(\x14p]7\x10\ VY?\x03\xb8a\x8fHX\xe7\xe5\x0d\xcb\x09QM\ m\xb4\x9e\x81L\x17gU\x7f\x9c\xadr\x07\xa6UB\ \xf1| \xb3:},\xe7\x1f\xfdE^Z\xbd\x8eq\ \xd2\xe3\xf4\xd9\xa7\xf0}\xebv\xc2\xaa\xb1\x8f\x947V\ a\xa8(\x82\x03m\xa6\xc0\xf6\x8ac'\xc9%\x95J\ \xf9\xe9\x80\xb1`PJ\xe9\x7f\xaf\xf9|\xa2\xb0\x16\xa5\ `gQ\x84\x8ak\xfa\x0b\x97N\xa5pZ\x1cL\xa7\ \x84\x16\xf5\xd88\xb4\x02\xd7\x11466r\xf7\xddw\ \xe3y\x1e\xabW\xaff\xd5\xaaU\xb4\xb6\xb6\xb2f\xcd\ \x1a\x8e<\xf2H6m\xf27W]]\x1d\xf9|\x9e\ \xde\xde\xde\x83\xe6\xff\xbeW\xacX\xd54\x8dg\x9ey\ F\x0a!\x84\x22\x94\x80=\xe8J\x9f\xaf\xa4)!?\ ?\xae\x86p\x1c\x87\x8a\x8a\x0a\xa4\x94A\xe9\xb1\xa5\xd8\ h\xba\xe0\xc1\xed\xff\xce-g?\xce\xda\xe1'\x085\ \xf7\xd3\x93\xdf\x82\xedY\x14\xf2\x05\x14\xdd\x8f\x01\x8e\x9b\ \xbe\x80\xee\xd4v\xde\xec_\xc7\xc2\x19\xa7\x11V\x8c\xb1\ \xb23\x11\xb4\xf8P\xa4@\x22\xa8\xad\x0f\x91\xceg8\ \xf7\x88\x7f Q\x1c \x97+1\xb5\xf6(\xda\x9d?\ \xe0\xba\xd2\xf7\xf2\x5cA\xa9&\xc1\xb4\xd8\x5cJ\xa5\x12\ \x03n\x8a\x19_4\x99V\xb1\x90\x8b\xcf\xf8\x125j\ +7=~\x0d\xcf^\xbf\x0e\x0f_\xe0\x91\xa2\xce\xc0\ \x1b&\x99^\x87\xd4\x9e\x02\xbaZ]\xce\xed0w\xee\ \x5c\xaa\xaa\xaa\xc8\xe5rttt\xa0\xeb:\xb1X\x0c\ )%\xc9d\x12\xd34ikkc\xdb\xb6m\x1f\x8c\ \xcaR\x14\xe5\xd17\xdexc\xda\xacY\xb3N+\x14\ \x0aX\xd2E\x9f\x9e\xa7\xae\xaa\x96\xb3\xe7~\x8e\x92i\ \xb1t\xfb\x13\x9c9\xfb\x1c\x96\xee\xfe-\xe9\xf5a\x0a\ \x85\x02B\x88`\x87\xe4\x85\x87\xedZ\x84\xaa<\xfe\xed\ \xf7\x17\xb1x\xfe\xd9d\xf3)\xd6\xc7W\xb2\xf3\xe5,\ \xd9\x82\x19\xec\xf4\x92i\xe2X*\xae\xe3\x91+\xa5\xf0\ \x1c\x1f\xcd\x95xh\x9a\xe6\xcf-\xfd\xb8\x06\xe1q\xcd\ \xd3\xe7\xf3\xc3\xf3\x9e\xe2\xc6\xd7/$S\x8a\xa3\xe9\x1a\ V\xc9\x22\x97\xdb\x97+\x99\x14\x9dF>\x9f\xf7S\xb7\ \xd8\xd8\xa6\xcb\xac\xc6E<\xd9\xfe3\x0eS?\xc11\ \x0d\x8byF\xae\xa6\xbe\xa1\x9e\xe3\x8f?\x9e\xad[\xb6\ \x12\xff\x83\x83\xe5\x98\xb8\x99\x0c\xd1j\x9dd2\xc9\xd7\ \xbe\xf65Z[[\xe9\xec\xec\xdcW.'%;v\ \xec\x08\x16?\x95J\x05,\x99?\x06\xe9\xfcE\x02\xc9\ d2/UUU\x9d\xdc\xda\xdazZ2\x99\xa4\x88\ E\xf5\xc9:\xc74\x9e\xc9\xdcc\x9aY\xb7\xb1\x93\xef\ \x7f\xe6n\x8e\x9by\x0cC\xcf,cGO\x08\xe1\xaa\ \xa4R\xa9\xc0\x80FJ.\xd9!\x87\xc1\x8d\x16\xa3\xdb\ \xf6\xb0\xfa\x96\xbb\x83^UM\xa2\x99\xa6\xb9\xfb>\xef\ \xf7\x0f?\x05c\xcdZ\xfbx\x09\x80\x09\x13\xc7S,\ \x16\xc9f\xb3\xe4\xf3y\x84\x148\xa6\xf0\x85\x5cmq\ \xe3k\x7fG$\x5cAA\xd5Hv\xdat\xaeL!\ \x9d\x80\xe0\xc7\xb8\xeaq\xf4\xf7\xf7\xfb\xecy\xd5\x19\xab\ \xf8\xf2\xf12\xd7\xf3H\x17\x13\xa8\xaa\xc6\xaaU\xabx\ \xf1\xc5\x17\xf9\xd2\x97\xbe\xc4\xb2e\xcb\xa8\xa8\xa8\xe0\xfe\ \xfb\xef\xa7\xad\xad\x8d\xae\xae\xae\xc0=\xae\xa9\xa99\xa8\ \xb5\x8b\xc7\xe3\x1f\x0c\x0dHU\xd5i\xe5\xf6L\xb6\xf0\ o\xa8R\x8fa\xbaEL\xa7\xc4P\xa6\x97\xbel,\ \x80\xebq\xf6\xf9\xde\xd7^{-K\x96,\xa1\xe7\xbe\ \x04\xaek\x13\x05\xf4J+(\x1c\xddY\xe8\xe7\x88\xcf\ 8T\x845\xa4\xa9b't\xdc\x11\x03\xab?\x8c\x97\ \xd5\x10\x9a\x0c\x82\xc6l6\xeb\xefL\xd7#\xdc-\xd8\ \xf6\xbb\x1c\xe9\xbd\x0eN!\x81]\x908E\x89\x94\xa0\ \xa8jP\xb8g\x84\x22l\xeaZE\xb5l\xf6\xf3\x1d\ \x86\x87\xae\x18\xec\x18\xdd\xc8\xf1G\x9f\xc0x\xedp6\ \xed^\x13p\xbd\xda\xda\xda\xe8\xee\xee\xf6\x05?\x86\xd8\ \x0e\x0c\x0cp\xc3\x0d70::\xca\x93O>\x19T\ (\xe7r\xb9\xe0$\x94I\xe5\xb5\xb5\xb5\xe5b\xa4\xd1\ \xe1\xe1\xe1\x85\x8d\x8d\x8dfoo\xef\xa1\x15\x88\x94\xf2\ \xb0\x80\x9d\xa8\xb8\xa8Bc\xb48@St.5\x15\ i\xb2V\x1a]\x0d\xa3\xa0`[&\xd2\x118\x8e\xc3\ 3\xcf<\xc3\xe8\xe8('\x9f|2\xbf\xff\xfd\xef\x03\ ,j\xd9\xb2e\x81\xc1\xef-\xc5Y4~\x1c\x85\xac\ \xc7q\xd3?\xce\xa6\xc1e83rT\xa9\x92\xec\xe6\ \x0a2\xafW\xfb\x86X\xf1\x8bz\x16/^\xcc\xec\xd9\ \xb3yi\xc9Kx\x19\x09\x8cB\x05X\x9a\x85\x88\xf9\ \x0b\xa8\xeb:\x99L\x06\xc7q\xd0t\x85d\xb7\x83^\ _\xf4\x93U8x\x9e\xc1@\xe8U\xc2\xc5\xd3\xc9\xd7\ \xf6\xb0\xdbz\x19]5\xb8\xe8\xa2\x8b\x98={v\xd0\ \xe5\xc7\xf3<\x86\x86\x86\x98:u*\xdf\xf8\xc67\x10\ B\x10\x0a\x85\xde5\x07S.2\xcdd2\xd4\xd4\xd4\ P(\x14\x9c\xd1\xd1\xd1\xed\x1f\x14QN\x09\x1a\x98\xa9\ ~n\xb5P\xb9\x8d\xb6\xca\xeb8b\xf1\x09\x5c\xf3\xe4\ \x05\xb4Ml\x06\x01\x96e\xe2\x8da9o\xbe\xf9&\ \x8d\x8d\x8dd2\x99r\xd3d\x86\x87\x87\x0f\xf0\xc0\x84\ \x10\x94l\x93\x0bZne\xc4\xdb\xc0?/\xb8\x9b\x97\ \xda\x97\x90\x8el\xa5\xdd\xde\x15\xf4\x16)\x0b\xe4\xf2\xcb\ /'\x97\xcbq\xdai\xa7q\xfb\xed\xb7s\xc2\x89\x0b\ \xe8\xee\xee\xe6\xc8#\x8f\xe4\xd1G\x1fe\xf2\xe4\xc9~\ {\xc1T\x8aT*\xc5\xe0\xe0 \x95\x95Q2\x99\x0c\ \xa6iR\xf0\xfc2\x08O\x95\xfc\xf4\x8d\x7f\xe2\xaaS\ \xbf\x8d\xed\x940M\x18\xd7TK___\xa0j5\ M\xc30\x0czzz\x10\x9a@\xd5\xfcf\x0193\ C\xa5Q\xedWiEM\xec0\xe6\xa2\x10\x82D\x22\xe1\xe7\x054I\xc9\x8aa\ \xabp\xe5o\xcf\xe6\xd1\xaflD\x8bX\xdc\xb7\xe9\xdb\ x.\xc4\x87\x92APt\xeb\xad\xb7\xbe#\xdf\xbd?\ \x1b\xdd\x87F`x\xa0\xc4\xd9\xe7\x9e\xc6\x95\xcf\x5c\xcf\ \xe2\x19\x173\xa9v\x06\x03\xa4\x91\xde\xce\xa0\xb7H\xb9\ \x8e\xbc\xbb\xbb\x9b\x13O<\x91\xdf\xfc\xe67\x01\x15\xb5\ \xdcL@J\x19\xb4\xf7\xd0u\xdd\x8f\xac\xc7>\xafl\ \x84+\x8a\x1e\xa5\xb8G\xcf\xae\x12\xf1\xad\x16\xff\xf0\xdd\ \xaf\xfb\xf9{\x05FFF\x0ep\xf7\xcb\xc5\xa4\x0a\x82\ \xf8\x94\x0c\xc7\x9eY\xc5\xaf\xfev%g\xde9\x85g\ \xaeX\xc1\xe6\xce\x0e\x9e\xea\xbd\x91\xad\x8f\x8f2\xba\xc9\ 7\xde\x86a\xb0}\xfbv\x1a\x1b\x1b?8\x81\x94\x17\ XQ\x144O\xa2\xea\x02\xd7\xf1`Tr\xca\xa5\x87\ \x93\xeb\xf2\xb0\xf2\x123\xe3\x05\x1c\xa5b\xb1(\xcb\xb5\ \xeao\x17\xae\x10b\xdf\x0e2|\x17z\xff\xbf\xdb\x8e\ \xcd\xae\xec\xc61\xd6\xbc\x15\xb0\x91\x15E\xe1[\xdf\xfa\ \x16\xd1h4 \xc1\x95\xe7\xdf\xbcys\x80\x18\xec\xff\ \x99\xe5\xfa\x12\xc30\xb8\xfa\xea\xabY\xbe|9\x83/\ \x0e\xe2z\x1e!\xc7\xa6\xa9Q\xeek\xed7\xa6\xa6\xca\ \xbd|\xcb\xc1\xad\x22\x05R\x08j\xeat\xe2\x99\x11\xae\ 8\xe9F\xfa\xb3\xbb\x18I\xa48~\xe2\xd9\xbca\xff\ \x9c2\x85\xablS\xde\x0b\xe9\xe1}\x09D\x08\xc1\xb4\ i\xd3H\xa5R\x0c\xdck\xd2c\x9a\x08E\xe2\xe7m\ \xfd\xc0$\xa4J\xa4\x22\xcb\xa4i100\xb0ld\ d\xe4\x94\xb7\xcf5g\xce\x9c\xb8i\x9a\xe3\x84\x10`\ @MM\x98=}}x\x8e\x82\xa6\xe8d\xcd$M\ \x916v\xbaqL\xd3\x0e\xba\xef\xd8\xb6M4\x1a\x0d\ \xd2\xb6\xfb{re\xb8\xfb\x80\x93\xe8\x82e\xfa\xc4\xed\ \xab\xae\xba\x0a!\x04\x0f>\xf8 \xdf\xfe\xf6\xb7\xe9\xea\ \xeab\xe6\xcc\x99\x8c\x8c\x8c`\xdb6MMM\xbc\xf2\ \xca+\x84B!\xc6\x8f\x1f\xcf\xbau\xeb\xb0m\xdb\xc7\ \xe6<\xb0,p\xa5\xcd\xb5/\x9e\xc7\xff=\xf5)\xee\ \xdd\xfc\xcf\xf4\xa4\xdeBK\xa8\x94\x0a&\x99\x8cy\xc0\ &x/l\xc6\xf7c\xd49\xf2\xc8#\xb9\xec\xb2\xcb\ 8\xe2\x88#\xb8\xf9\xe6\x9b\xe9\xec\xec\xa4\xa6\xa6\x86\x91\ \x91\x11t\xddo.988\x88\xae\xebh\x9a\xc6\xe0\ \xe0 \xe9t\xda\xfbc\x89\xa3R\xa9\xe4\xef\xc8*\xc9\ \xb8q\x95\xfch\xd9\xbfp\xd7\xdf-\xe3\x97o\x5c\xcf\ \x9b\xa9-\x1c1i\x0e\xae7\xc6\x0e\x1c\xb3!S\xa7\ N\x0b\xe2\x15UUY\xb1b\x05\xcd\xcd\xcd\xef\xea\xeb\ \xab!\x08\xcdM\xd2\xb7\xb2H!\xe9\xb0k\xd7.\xae\ \xbc\xf2J\xf6\xee\xddK\xb1X\xa4\xb1\xb1\x91\xca\xcaJ\ t]g\xd9\xb2e\xd4\xd5\xd5\xd1\xda\xdaJOOO\ PN],\x16\x83\xb8\xc7I\x0b\x92\xfd~1\xe9\xbf\ >y>\x15F\x98l\xce%\xddc\xd2\xb9\x22\x8b\xaa\ \xa8\x07l\x9a\xb1\xcd\x11\x06\x984i\x92\xdd\xdd\xdd\xed\ \x1e\xb2r\x84\xda\xda\xda5MMM\xc7\x1d,\xa7\xb6\ <\x5c\xd7\xa5\xbf\xbf\x7f\xc6\xc8\xc8\xc8\xce\xfd\x7f?}\ \xfa\xf4x\xa9T\x1a\xa7(\x0a\xc3\x13\x5c\xfe\xf1[\x13\ \xb1,\x97\x9a\xc2\xb1\x1c5g\x0aKw\xff\x06M\xd3\ X\xf5\x83\x04\xa9._\x17TVT\xb1\xe8\x96*\x86\ \xeeoD:\xbeZX\xbbv-\xd1h\x94p8\x1c\ 0\xef\xcbi]\xc7\xb51\xa2!\xdc\x92\x0c\x9a\x0b\xec\ \xcfR\xf9S\x19\xd2\xe6\xe6\xe6\xfd\xaazd\x90\xb3\xf9\ c\x9b\xb5\xa7\xa7\x87m\xdb\xb6!\x84\xa0\xb2\xb22(\ \x8e-o\xbe\xb5k\xd7~)\x99L>pHO\x88\ a\x18\xcc\x981\x03\x80~3\xc1\xe4\xb3\xf3D\xc2\x1a\ \xc24\xb0\x87B8\xc3a\x9c\xe1\x03\x1bYF\x22\x11\ \xee\xbd\xf7\xde\xf4\xbbMY&\x97\x85sP\xcax\x0c\ m\xb1\xe8\xd8\xf3\x0a\xcf\xdf\xb9\x04\xcf\x14\xd8y\x0f\xd7\ \xf4\x8d\xf1\xbe\xbc\xb9\xc0v\x1c\xa4\xed\xeb\xfa9s\xe6\ \xd0\xda\xdaJ,\x16c\xdb\xb6m\x8c\x8e\x8e\xd2\xd4\xd4\ \xc4\xd0\xd0\x10\xfd\xfd\xfdx\xa6\xaf\xbaL\xd3\x0c\xe8G\ \x0a\x02\xc7\x94\xd8\xb2\x84B\x08\xcb-\xa1\xab\x1aH\x05\ M\xd5(\x95\x8a\x0c\x0d\x0d!\x10\xac,m\xe5\x9c\xcb\ b(R\xe0\x9a\x80\xa5\xfb\xd76`P\xda]\x81\x97\ \xf5\xaf\xadP(P[[\x1bT\x1bG\x8c\x8a \xce\ \x8aF\xa3\x7f\xd6\xe3z_\x02)\xe7\xb4\x15\x04\xa3Z\ \x9c\xf9-a2\xd94\xedwXL\xac\x99\x82\xebe\ \x11\x8a\xc0r\x1dt] M\x0dD\x82\xb3\xce\x5c<\ T\xb6\x01e\xa3\xd7\xd5\xd5E(\x14\xe2\xf4\xd3Og\ \xfd\xdau\xb4\xdf\xec \x85\x0eBG\x93n\xd9\xd1\xc6\ \x88*\x81\x8b\x5cf\xa2X\xa6\xefV\xab\xaa\xca\xc0\xc0\ \x00\xae\xebRYYI&\x93\x09X\x1e\x8e\xe3\x10\x0e\ \x879\xef\xbc\xf3H\xa7\xd3,_\xbe<\xc8\x08\x0eG\ \x8b\x9c~U\x15\xc7\x1aW\xd10\xc5dQ\xeb\x17\xb8\ \x7f\xc5O\xf9\xf8\x91\x0b\xb9\xf3\xb9o\xd3\xff\x98\x87\xa5\ \xfa\x0d\xd2\x0aX\x18\xbaB#Gr\xfaQ\xe7\xf0\xe4\ \xb6\xbbP\x9dJr-\xbd\x8c\xe4%\xa5\xd1H\xe01\ \x1es\xcc1l\xdf\xbe\x9d|\xa6\x8017IiW\ \x04\xa1\xec\xf3\x0e\x0f\xa9@\xaa\xab\xab\x03\x86\xa0\x82\x00\ Mb;.\x7f3\xf1&\x12\x8dw\x05\xbb \xe5f\ \x19wA\x9cq\x0d:N\x1e\xec\xa1\x0a\xdc\x11\x03{\ \xd0@\x16U\xdc\xbc\x8a\xa6i\x94J%~\xf3\x9b\xdf\ \x00p\xc6\x19g\xb0|\xf9r\x1c\xc7!\x1e\x8fSS\ SCOO\x0f\x8b\x16-bdd\x845k\xd6\x10\ \x8dF\xd9\xbb\xa7\x1b\x81\xc0\xb2l<\x9b :\x0e\x87\ \xc3\xa4R\xa9\xe0Z\xfb\xfa\xfa\x08\x87\xc3X\x96E\x22\ \x91`\xca\x94)\x81k,\x84\xc0\x0d\xbb\xa8\x8a\xc6&\ \xef~.\x09\xdd\xceS\xbb\x7f\xc4No);\xdfx\ \x0eO*~\x1a\xda\x94~OGC08\x94\xe3;\ \x17\xdc\xca\xff~\xf6\x0c\xee\xfe\xfc\x12\xf6\xf4\xf7\xf0t\ \xef\xad\x0c\xda]\x81\x0a\xf4<\x8fx<>\x86\xe1)\ x\x8e\x87k\x9a\x08\x95\x03\x02\xc9\xbf\x98J\x1a\x90d\ \x0d#\xd8\x09%\xd3\xf4\xdb|\xdb\x06\xe7\x9d\xb8\x98\xbc\ \x99\x09\xe8\xa1#N\x9a\x8aP\x083\xab\xb0p\xca\xf9\ \xd4N\xd1\x88\x1e\x95\xa1\xf6\xec\x11*O\x89\x07\xdd\xb1\ \xcb^\xd0\xc8\xc8\x08\xe1p\x18EQ\x983g\x0e\x86\ a0i\xd2$l\xdb\x0e:D\x9cx\xe2\x89\xa4\xd3\ \xe91WR9\xa0M\xb9\xeb\xbaA\xcb\xf0r\xb3\x9c\ x<\x1e\xd4=vtt\xf0\xec\xb3\xcf\xa2\xaaj\xd0\ \x81\xa2P,b;\x16(6w\xb4_\xc6p\xb6\x0f\ \x89$?\xe2\xb2\xfe\xde8\xae\xb7\xaf\xeb\xb5\xa2(\x8c\ \x0c\x98\xc4jB(\xaaKD\xaf\xa4\xa6\xb2\x86x\xae\ /H\x96\x95\x89\x7f]]]~sNUA\xba\xde\ \x014\xd7?\xe7\x02\xbf/\xb7\xb7\xac:\x04~\xa0U\ \xf6*\xf6\xb5\xff\xb6q\x15\x17E\x15|z\xd27\xc9\ \xc8]\x5c\xbf\xe81\x1e]\xfd \xcd\x93t\x9eXq\ _p\x93\xd1h\x94+\xaf\xbc\x92\xc9\x93'\xd3\xdf\xdf\ \x8f\xeb\xba,]\xba\x14\xcf\xf3hoo\xc7q\x9c@\ \x1d\x95\x03\xcb\x90f\x04\xf1\x8bk\xf9I\xa0P(D\ ]]\x1dB\x08jkk\xdfv\xc1c$\x03E\x04\ \xa5\xd0\x9e\xe7Q\x9dQ\xe9ZR \xd7\xedbe=\ \xd6\x14V\xe2\x14\xc1\xb3%\x8a*p\x0dw_[C\ \x14t]\xc1\x19\xe35\x83\xff\xf4 \x04\xb8\xae\x87i\ \xfa\xfc3\xd7q\xa8m\xae'\x99\x8f\x13\x8a\x99\x84*\ U\xd2\xb6\xdf7\xf2`J\x15\xdeW\xa4^^x\x81\ \xdf0\xc0\xf1lJ\xa6\x89\xa6\xe8\xfb\x0a`\x0c\x0fO\ \x0aZ\xabg\xf0\x9b=\xbf\xa0-t\x22\xf5\x91\x16\x0c\ %\x83\xf4\x08\x04R*\x95d(\x14\x12\x9d\x9d\x9d\xfb\ G\xefR\x08!\x5c\xd7E\xda`{\xde\x98C\xa8\x82\ \x02\x96cc:\x92\xd1\x91\x04r\x8ce_\xceL\xe6\ \xf3\xf9u\x1d\x1d\x1d\x0f\xd6\xd7\xd7\xffX\xd34\xbf\x0f\ |\x9d\xc7\xe1\x0b+\xc0\xae\xa22WEuu5\x97\ \x5cr\x09\xcb\x97/gxp\x18\xc5\xc9\xe1\x86\x5c<\ \xcd\xc3\x8d\xba\x01\xe4Q\xdex\xcaXC\x9c\xa9\xd3k\ \xd8\xd1\xb5\x97\xd3\x0f\xfb;\xde\x1c^M2Qdv\ \xc3\x09\xbc\xe5\xfc\x01\xcb\xf2\xb3\x86\x85|\x81\x07\x7f\xf9\ 0?y\xea\xfb\xfc\xcd'N\xe5g\x8f\xfd\xc4\xcf\x82\ \xaa|0'DJ\xa9J)e\xa9T\x12\x02\x81\xe7\ \xb9TD\x15\xfe\xf9\xe1\x8b\x91\x9e\xc0\xb6}B\xb6\xa7\ \xb9\x08\x11\x02$\xaa\xe2\x1b\xb3\x91T\x9c\x5ce\x7f\xa0\ n\x00\x1a\x1b\x1b\xc5\x1bo\xbc\xf1\x95b\xb1\xf8\x10\xe0\ E\xa3\xd1\xeb\xa7M\x9b\xf6\xcdd2\x89\xa3H\xa6\x7f\ \xa5\x92\xd6\x960vAb\x17=R\x9d6\x99n\x87\ %\xffl\x07^\xfb\xd8\xb3\xa6D,\x16C\xd3\xb4]\ \xf9|\xfe\xce\x96\x96\x96\x1f\x97yXn\xb5\xa0\xed\xd4\ (ZX\xf2\xd2\xfa~~\xf6\xfd_\xb1w\xef^n\ \xbf\xfdvn\xb8\xe1\x06t]\xa7\xbe\xbe\x9eb\xb1\xc8\ \xee\xdd\xbbY\xb4h\x11\xeb\xd6\xadc\xfd\xfa\xf5\xe4r\ 9\xc4\x98G\xa7\xeb*\xdfy\xf5\x0b\xdc~\xc1\x0b|\ \x7f\xcd\x97\xc8Z\x09\x14]\x90\xcf\x9ad\xb3>\xea\xeb\ X.#r3N\xddV\x96\xedN!]I\xb1T\ D(>\x13\xf2\x90\x0bd\xd7\xae]\x9fjii\x19\ H\xa7\xd3~\x13\xfdq\x02\xd3\x89\xe2\xd5\xeea\xb4\x90\ %\x22k|\x81D \xa4\x84\xe8Jw0\xbf\xfe4\ \x8e\x9e>\x8f\xd7w\xbc\xc2\x11\xb1\xa3Y\xea=\x8fe\ 9A\x8e\x22\x12\x89\xd8\xc5b\xb14\xf6\xb3\x13\x0e\x87\ 1\x0c\x03\x03\xe8\xff\x95C\xbf\x92{\x17Z\xab\xbe?\ \xc5Ud\xb3\xd9m\xbbv\xed\xbaA\xd7\xf57\x01\xb5\ LD\x90B\xe2\xb9>'\xca5!j\x84y\xfa\xe9\ \xa7\xb9\xf6\xdaky\xe9\xa5\x97(\x95JD\xa3Q\xfa\ \xfb\xfb\x89\xc5b\x0c\x0f\x0f\xd3\xd9\xd9I8\xec'\xd7\ J\xa5\x12\x8aP\xb0]\x0f\xc7\xb3\xa9\xab7\xb8\xfe\xb5\ O\xfb\xea\xafO2\xb4\xb9\xc8\x9eey\x14m\x8c\x9d\ \xe8)$\xf2C\xa0\xba\x0c\x15\xf6\xb2wm\x9a\x5c\xae\ \x04\x82C\xefe\x8d1\xef\x06\x03\xd6\x05\x10\xb2\xa0\x98\ \xf6\x18y\xd3\xc4\xca{\xb8^\x0e\xc7q(\x19.\xb6\ [\xc1\x92\xa1\x9fpN\xe3\xb7xx\xeb-\xec\x16/\ \x92\xd8\xbe\x02O\xbad\xb3\xd9 >y;\x95\xa8\xad\ \xad\x8d\x1bo\xbc\x91\x89\x13'\xf2\xcb_\xfe\x92\xae\xae\ .\xc6\x8f\x1f\xcf\xb6m\xdb\xa8\xaf\xf7\xbb3tuu\ a\x18\x06\x91H\x84\xae\xae.\x84\x10\x83\x89D\xe27\ \xe5\xb0\xa7\x5c`4a\xc2\x04\xd2\xc3i^\xbf>\xe7\ \xc7\x22\x8a\xca\xcb/\xbf\xcc\x86\x0d\x1b\x82\x16\x1d\xe5\xe8\ \xbe\xfc\xb5\x9c\xb3(cv\xae\xebR\xdb\xa9\xb1\xe6\xc7\ )\xac\x8c\x87S\x928y\x89\xf4|\xb7\xa8\xdc\x8bE\ Q\x14\x8c\x90\xc1u_\xf8!n\xc1\x8f\x9f$\xa0\xee\ \xc7u>\xa4\xd0\xc9\xfe\xf8\x90\xae\xeb,^\xbc\x98u\ k\xd6\xb1\xe9f\x0b\x94\x10n\xd1\xc4t\x0b8\xb6C\ \xa9R\xe2H\x0bCSyv\xe8&N\x98r\x1a\xf9\ d\x89\x91\xb7z\xd9\xf3r\x81b\xf1\xdd\x9f\x8a\xe6\xba\ .3f\xcc \x1e\x8f\xf3\xc9O~\x92\x193f\x90\ J\xa58\xee\xb8\xe3hkk\xa3\xbf\xbf\x9fP(\x14\ \xa4F\xcbMd\xde\x8e:\x94i?\xe5\xf4\xf1\xaaU\ \xabH\xa5R\xbc\xfa\xea\xab\x18\x86A\xb1X\x0c\xc0\xbf\ r\x92i,n\x19P\x14\xa5\xccH\x98\xfe\xb9\xcf}\ N9\xf5\xd4Sy\xf8\xe1\x87\xc9f\xb3\xe4\xd4\x5c`\ C\xcb\x0d0]\xd7'Q\x94\x89\xe5\xd5J\x03N\xd8\ \xc1R,\x22\x91\x08\x85B!\xe8lqH\xb9\xbd\xfb\ \x0bf\xcd\x9a5l\xd8\xb0\x81O}\xeaSl\xde\xbc\ \x99\x81\x81\x01\x96.]J>\x9f\xc7u\x5c\xa2I\x85\ \xa1\x0d\x16\x85>\x87\xe4\xce\x04\xcfu\xdf\x87\xa2\x0b\x14\ \x15\x14m\x7f\xba\xa6\xfa\x0eDv\xd5\xaaU,X\xb0\ \x80\xdbn\xbb\x8d\xa5K\x97\x22\xa5\xe4\x91G\x1e!\x9f\ \xcf\x13\x0e\x87\x83\xee\x0e\xa5R\x89\xe5\xcb\x97\xbf+\xd5\ \xbf\x0c\xb5K)9\xec\xb0\xc3X\xb2d\x09\xba\xaes\ \xe2\x89'\xb2p\xe1B\xee\xbd\xf7^*++\xa9\xaf\ \xaf'\x9f\xcf\xb3g\x8f\xdfqc\xeb\xd6\xadW'\x12\ \x89\xc7\x00f\xcc\x98Q\xb8\xe4\x92K\x22\xa3\xa3\xa3\x5c\ ~\xf9\xe5\xdc{\xef\xbd\x9c\x7f\xfe\xf9\xb4\xb7\xb73g\ \xce\x1c\x9e{\xee9f\xce\x9cICC\x03\xc9d\x92\ U\xabV\xd1\xdb\xdb\x1b\xb8\xe7\x1f\xfb\xd8\xc7X\xbbv\ -\xbbw\xef\xe6\xb0\xc3\x0ec\xd7\xae]\x1f\x8c@\xca\ ^H.\x97\xa3\xa1\xa1\x01!\x04\xb3f\xcd\xe2\xd5W\ _\xa5\xb1\xb1\x91\xeb\xaf\xbf\x9e\x07\x1f|\x90\xc4\x8e\x04\ \x8ai\x12\x8e94\xce\xf6K\xaa\xcb\xcc\xf1r\xd3\xe2\ w\xab\x1d\x0f\x87\xc3\xdc|\xf3\xcd\xef\xfa\xd9e\x1ak\ \xb9\x9b6\x10`Eo\xbf\xc6+\xae\xb8\x823\xcf<\ \x93\xe5\xcb\x97\x07\xdea\xb9\xe1\x81\x94\x92\xd1\xd1Q\xf6\ \xec\xd9\x13\x08tl\x9e\xa0\xc2\xa8\xb2\xb2R\xbc\xfe\xfa\ \xeb\x9c{\xee\xb9\xdcp\xc3\x0dX\x96\xc5\xe6\xcd\x9b\xe9\ \xea\xea\xa2\xae\xae\x8e\x5c.\xc7\xde\xbd{\xe9\xec\xec\xc4\ \xb2,\x0a\x85\x02RJ\x8e8\xe2\x08\x1e{\xec1t\ ]'\x1a\x8dRQQA\x22\x918(\xd4\xf7}U\ '\xb6\xb5\xb5\xc9\xa6\xa6&&O\x9e\xcc\xc0\xc0@\xe0\ 1\xc5\xe3q\x1e|\xf0A\xdex\xe3\x0d\xbe\xfa\xd5\xaf\ r\xfb\xed\xb7388H$\x12\xa1\xbe\xbe\x9e\x95+\ W\xd2\xdc\xdc\xcc\xae]\xbb\x18\x1d\x1d\xa5\xae\xae\x8e\x81\ \x81\x01v\xef\xde}Q\x22\x91\xb8\x7flQfVU\ U\xcd\x14B\xbc\x97Nm\x9e\xeb\xba]\x83\x83\x83o\ \x96m\xc8\xe1\x87\x1f^hnn>\xa0\xcb\xf6\x1f+\ w\xdb_\x0do\xd8\xb0\xe1\xcb\xc9d\xf2>\x80\x13N\ 8\xa1X(\x14\xc2e\x0cm\x7f\xd2\xf4\xfe_\xdfN\ \xa5\x0d\x85BA\xccT\xee\xefUn:\xbde\xcb\x96\ /%\x12\x89\x07\x0e\xb9\xca\xcad2ttt\x04y\ \xeb2\xd7\xf7\xe9\xa7\x9f\xe6\xea\xab\xaf\xe6\xb5\xd7^c\ \xc7\x8e\x1d\x81](C\x0a\xa1P(\xc8\xe2\xbd\xdbC\ \x1c\xb3\xd9\xec\xf6l6\xbb\xfd\xfd\x5cW}}}\x99\ \xdda\x0e\x0d\x0d-\xee\xe9\xe9y\xafS\xd8555\ \x9b\xcb\x0c\xfe\xe1\xe1\xe1\xe7\xa3\xd1\xa8Z,\x16\x8fU\ \x14e<\x80\xabB\xdd\x14\x8d\xe1\xad\x05\xa4+)\xd9\ %\xc2Z\x05 \xc7\xf0\xbb\x12MMM\x07\x08o\xff\ \xb6\xebB\x08\xfd\x90\x9f\x90\xfa\xfa\xfa\xdd\xabV\xad:\ \xac\xbd\xbd\x9d\xa3\x8f>\x9a'\x9f|\xb2\x8c\xe6\x069\ \xecp8\xfc\x0e\xaf\xe2\xddv\xaaa\x18l\xdb\xb6-\ 8!\xff/\x8e\xf1\xe3\xc7?\x1a\x0a\x85.\x04\xc8U\ x\x9c\xf1\xcdF\x22\x06\xe4\x87\xab\xf8\xfay\xff\xc6\xed\ +\xaf\x81\x92\xce\xc0\x86\x22o=\x96\xf5\x1f\xb0\xe97\ F{\xa8\xbf\xbf\xff\x8b\xfb\xa9\xc1\xd2!\xf5\xb2\xf6\xc3\ \xb3\xe4M7\xdd\xc4-\xb7\xdc\xc2K/\xbdDoo\ \xaf\xff(\x87t\x1a]\xd7\x83'\xcd\x1cLr?\x9b\ \xcd\xfe\xc9\xd6\x1a\xff\x8f\x0c%p\xf3m\x81\xe7IJ\ IArG\x9c\xcb\xbe|\x15\x99.+\xd8\xdbF$\ \x14\xe4\xed\x85(?h\xe3\xe0\x1f6\xf9\xbes\xea\xed\ \xed\xed,^\xbc8h>,\xa5\xa4\xba\xba\xfa\x8f\x16\ \x5c\xc6b1v\xee\xdcyl\x7f\x7f\xffz\xfe\x9b\x8e\ SN9\x85\xae\xae.\xf6\xdc\x99\xc3s%R\x1a\x08\ \xa9S]\x1d\xf1\x0bx\xc6lF9<\xb0m\xfb=\ \xb7\xbc~_\x021M\xf3e\xd7u\xb7\x95\xbd\x93\x83\ \xe9\x10\x94J\xa5l\xcf\xf3F\xff;\x0aBJi^\ r\xc9%\x9cr\xca)\xb4\xb4\xb4p\xc7\x1dw\x90J\ \xa5hhh\xa0\xb7\xb7\x97\x9a\x9a\x1a\xda\xda\xdaX\xb1\ bE\x90\xa2\xd8\xb0a\x03\xb6m\xaf\xfb\xc0\x05R]\ ]\xcd\xf0\xf0\xf0e\xc3\xc3\xc3\xfc\xffh\xc82\x0e\x15\ \x0e\xfb}\x80\xcb}\xbd\xa6L\x99\xc2\xe6\xcd\x9b\x990\ a\x02S\xa7N\xa5\xa7\xa7\x87\xee\xee\xee2\xb9\xc1\xfe\ \xc0\x05r(\xdbj\xffw\x19\x9a\xa6q\xff\xfd\xf7\xf3\ \xc2\x0b/\x90\xcdf\x83\xb8\xa5\x1cxJ)\xe9\xee\xee\ \x0e\xbe\xf7<\xef}7\xe8\xd7\xf8h\xfc\xd9\xe18N\ \xc80\x0c\xd2\xe9\xf4\x01\x1e\xe2\x9f\x8ai\xc6\x82\xe7\xf7\ \xec\xad\x88\x8f\x96\xfb\xcf\x8fH$\xd2T*\x95\xaa\xde\ \xe3\xba\xbauuu\x83\xa3\xa3\xa3\x85\x8fV\xf0\xa3\xf1\ \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\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\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\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;\ (\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\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\x13ON\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*\ \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\ \x00\x00~\xd7\ \xff\ \xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x00\x00\x01\x00\ \x01\x00\x00\xff\xdb\x00C\x00\x04\x02\x03\x03\x03\x02\x04\x03\ \x03\x03\x04\x04\x04\x04\x05\x09\x06\x05\x05\x05\x05\x0b\x08\x08\ \x06\x09\x0d\x0b\x0d\x0d\x0d\x0b\x0c\x0c\x0e\x10\x14\x11\x0e\x0f\ \x13\x0f\x0c\x0c\x12\x18\x12\x13\x15\x16\x17\x17\x17\x0e\x11\x19\ \x1b\x19\x16\x1a\x14\x16\x17\x16\xff\xdb\x00C\x01\x04\x04\x04\ \x05\x05\x05\x0a\x06\x06\x0a\x16\x0f\x0c\x0f\x16\x16\x16\x16\x16\ \x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\ \x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\ \x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\x16\xff\xfe\x00\ \x10Time for Lunch\xff\ \xc0\x00\x11\x08\x02\x00\x02\x00\x03\x01\x22\x00\x02\x11\x01\x03\ \x11\x01\xff\xc4\x00\x1b\x00\x00\x02\x03\x01\x01\x01\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x02\x03\x01\x04\x05\x00\x06\x08\xff\ \xc4\x00D\x10\x00\x02\x01\x02\x04\x04\x04\x03\x07\x02\x04\x05\ \x04\x01\x05\x01\x01\x02\x03\x00\x11\x04\x12!1\x05AQ\ a\x13\x222qB\x81\x91\x14#R\xa1\xb1\xc1\xd1b\ \xe1\x063r\xf0$C\x82\x92\xf1\x15Ss\xa2%4\ 5Tc\x93\xa3\xff\xc4\x00\x19\x01\x01\x01\x01\x01\x01\x01\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\ \xff\xc4\x00!\x11\x01\x01\x01\x00\x03\x01\x01\x01\x00\x03\x01\ \x01\x00\x00\x00\x00\x00\x01\x11\x02!1A\x12Q\x222\ aqB\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\x11\x00?\ \x00\xfas\xfc<\xe0\xa6#\x072g\x92\x16\xcc\xb9\xc5\ \xcd\xbfZ\xb12\xca\xaa^\x17\xce\xa0z\x1f[\x0e\xd5\ \x9f#\xb2\xc9\xf6\x98n\x1c\xa8\x0cGPt?:\xbd\ \x82\xc5&)C\x0b\x09G\xa9:\xfbW\xca\x97\xe3\xd5\ \x7f\xae\x86H\xa6\x8b5\x95\x18\x1b\x10O\xe9Dn\x0d\ \x8d\xfe\xa6\xaaN\xf2a\x84\xb0\xe5\xf2Hn\x1a\x9b\x83\ \x90\xcb\x85\xbbjP\xe5\xbfZtXo\x97\xa0\xa9\x0a\ \x0d\xb5\x00\x93a\xae\xe6\x80\x9a\xe6\xf3D\xc8[-\xfd\ '\xa1\xa8\x0dI\xd8\xb1\xa6!\x1c\xd40;\x83\xad\xe9\ ~s\x1a\x99J\x99-\xe6 \xef\xd0\xd0}\xe6k\xf4\ \xfaT\x8d\xc3H\x22\x95\xf0\xb9\xf2\xe5o!\xd8Q\xba\ F\xc7\xcf\x18\xbe\xf7ScY\xf8\xec\xdfk|\xdb\x93\ z\xbb\x87\xb8\xc2G\x98\xdc\x90H=\xa9\x94\x9f\x11D\ \x16\x8dB\xdfs\xcc\xfc\xe8\x89\x04RA\xa9V\x07K\ \xfbS\xa0\xdc\xce\x08*\xda\x8a\xcb\xe2\x03\xc3\xc7J\x8a\ l\x03m\xbdh\xc6\x0b8Q\xcc\xda\xb2\xb8\x8c\x82L\ |\xae\xb7\xb1ntr\xf0\xc0\xeco{\x93\xce\x8b\x0d\ '\x85\x88I\x00\x00\xab^\xf6\xabX<\x22\x18\x95\xe6\ \x04\x97\xf4\xa86\xb0\xeaj1x\x03\x94\xbe\x1d\xf3\x00\ .U\xb7\x1f\xcdg)\xd6\x932\xba\x87\x8d\xae\x8d\xa8\ \xa5;\x00z\x9e\x95\x9d\xc3q\xde\x00\xf0\xa6\x1fvZ\ \xc4sS\xd6\xb4\xbd:\x83p\xda\x86\x1c\xebr\xeb8\ \x15\xb0\xf4\xefR\xa1lC*\xb0;\xdcW|\xbe\x94\ $\xf7\x1fZ\x90\xd4B\xa3\xcb\x12\x0fk\xff\x005$\ \xa9P\xa0\x00\x06\xc0\x0d\xa9W'\x9d\xbaiD\xa4\xfc\ \xc5Z\x85\x1a\x90\xf76\xb5T\xe3\x99\x1b\x18\x12\ ./\xce\xd6\xfd\xa8\x93\xa5}T\xb8\x03z\xec\xca~\ !K\xf8\x87j%\xbd\x0b\x13\xb9\x04\xec;nk\x9a\ \x8a\xd4,9\xd4\x80G1\xbd\x060\xe6\xc0\xca\xed\x9b\ :[\xce\xbb\x81\xad\xff\x00ja\xa8U\x0cY\x1a\xd9\ dR\xa6\xf5\x12\x7f\xc3\xae5\x8d\xe4B\xc6E`\xca\ -\x98X\xef\xde\xb4%[\x12\x1bMmX\x5c-\x12\ >&`\x9dmsl\xc7MyV\xfc\x8b\x93\x10c\ rX\x91tf\xdc\xf6\xa3\x87p_U\x9fCa\xa9\ \xedCko\xb9\xab$\x03Ku\xa5i@Q\x90\x0a\ ebt7R7S\xd4W\x05\xae\x22\xf5-I\xb6\ \xedk~5\x1f\xa8\xe5C\xe2\xc4\x08P\xfe#\x1d\x95\ +\x85\xd4\xdc\x13z% \x12B(b,X\x0dj\ Ce/\x13\xa8\x8a@Y-\xc8\xfe\x95\x9a<\xad`\ \xac\xec>\x1c\xa4\x0f\x995x\x12\x0d\xc6\xe2\xaaq\x04\ d\x930'\xc3}F\xba\x03EQ\xc1\xb7\xbb\x06b\ ,H\x16\x00t\x02\xac\xf0\xd9\x15I\x85\x8e\x8e|\xbd\ \x8dg\x83F\xadj%j\xc6\xb9\x1a\xd7\x0b\x83q\xca\ \xab\xe1\xb1K\x22e\x93\xd6\x07\xab\xf1\x7fz1 ,\ C\xe9m\x81\xad\xeb\x18\xa1\xc7\x11\x17\x1cLz\x19\x14\ 5\xba\x13V8,\xb7\x8d\xb0\xa7e\x05\x90\xfe\xb4\x9e\ ?(lLh-q\x18\xd7\x99\xbd\x17\x04\x04E4\ \xa7se\x1dz\xd6?\xfak\xe2\xe3\x9a\x84\x01\x89B\ M\x9fCBX^\xd7\xd7\xa5\x09n\x95\xa6A&&\ 1\x03\x86?|\x01Q\xa6\xe7\xad#\x86\xe1\x8c\x83\xc6\ \x95\x88\x04\xd8-\xaeZ\x83\x8a\xa9\x13x\xc0\x8bJo\ n\x95g\x0f/\x8d\x1a\xacJ\xd0\xaa\x8b3\xff\x00\x15\ \x9fom|\x5cgU\xd6B\x16\xda\x05\x1a\x9f\xa5\x04\ \x99\xe7P\xa6\xf1E\xbe\xbb\xb5\x02\x14\x8cZ!n\xad\ \xf1\x1f\x9dq\x90\x03\xa97\xf6\xad\xeb#H\x9a1\xf7\ \x13\x1e\xeb \xd0\xd1x\xae\x83\xfe\x22,\xa3\xf1\xa6\xd4\ \xb5\x95v\xd4{\x8ab\xb8\xea\xba\xf2<\xeaFs\xd0\ \xdc\x1d\x88\xe7R\x80\xad\xd0\x00\x5c\x1b\x12v_\x7f\xe2\ \x94\x09Qh\xe6U^Kk\x95\xf64Hl\x81@\ \xb2\x8b\x9bS\xa8\xdb\xc9\xcb\x10I\xfc,\xa3-\x03b\ \x10>I\x94\xc4\xdd\xb5SBZ\xba@%\x89\xa3m\ \xacH=-V\xa3\x1aED21\xba\x81}9\xd5\ \x19\xe6\x97\x132\x85Q\xd1T\x1d\xaa\xd4f\xd8x\xd4\ \x8f\xf9`\x10Ep\xc8\xa6\xe9\x1a!:\x5cQPb\ \xc3(`\x1d\xf3\xb3hu\xda\xf5TH\xfe>C+\ e$\xa9?\x95]\x8c\xfd\xea\xfb\x8a\xcc\x9c\xdaW\xff\ \x00Q\xa2\xd3\x1d\xc3m\xf6\x93\x98\x5c\x05:u\xa5c\ pF;\xe20\xacJ\x83|\xbc\xd6\xbb\x86\xb9\x18\xc5\ _\xc42\x9f\xa5^\x85\xf2\xbd\xef\xd4\x1a\xcc\xee5U\ \xa1\xe2\x90\xa2x8\xe9\x14\xc8y\xef\xcb\xe2\xa7`\xd3\ &\x0e\xf9\x95\x83\xbd\xee\xa7Aa\xfd\xeb\x17\xfcI\xc3\ \x8c\x0e1P\xa91\xc9|\xd67\xb1\xae\xe0\xd8\x99\xe1\ \xe1\xb6\x8aB\xa1$\xb6R47\xd7Z\xcc\xe5e\xca\ \xb3\xae\x9bn\xf6\xd1lhNk\xf9\xafz\xa0\x9cK\ \x12\x18\x1f\x0e\x0f\xfb\x05\x13qLK\x10|8\x7f\xec\ \x15\xaf\xd4\x18\xd3Cp\x0fZ+X\xd5|\x06&<\ b\x15\x0b\xe1\xc8.r\x03pE4\xe7\xb5\x81\xd2\xb4\ 0sB\x93\x15.J\x95\xd2\xe0n(\xa2\x8d\xa2L\ \xb1H\x1d\x7f\x03\x8b}\x0d\x04WS\xae\xa0\xfeT8\ \xfc`\xc3\x1f\x0e4W\x92\xda\x96\xd4/j\x91\xe4\x82\ \xac@*@\xf3)\xdc\x7fj5Fqp\x85\x87a\ X\xd2q\x0cI\x95\x9f\xc4\xc8\xea\x97\x19t\x02\xda\xdb\ \xfd\xf5\xa3\xc5bg2\x12\xd39\xb0\x07\xd5\xf3\xab\xf5\ \x17\xe6\xb4q\xb8\x85\xc1\xc4Ky\xe4 \x80\xb7\xf4\xf2\ \xd6\xb2\xf8r>'\x14\x91\x90<\xcd\xa9\xb5\x01\xbb\xef\ }y_SZ\x9c\x1f\x0cp\xf0\x99\x9a\xf9\xdcYT\ \xe9a\xd6\x8f\xf6\xa7\xc8\xb6\xe5s\x1c\xa2\xc3a\xedP\ \x09\x0dplj\x06\xdb\x1f\xa5M\xbb7\xd2\xb6\xca\x8f\ \x19\xc3\x02F*5\x16\xd9\xc0\x1e\x93\xd6\x83\x84\xe3\x15\ A\x86fa\x1bzX\x8d\x14\xd6\x88;\x82\x0d\x98Y\ \xae9VF;\x0c\xd8i\xb2\xda\xe8}'\xa8\xac\xde\ \xae\xc6\xa7}5\x9dH\xb0\xb8 \xf3\x06\xe0\x8a\xebZ\ \xb1\xf08\xa9\xb0\xc0\x04qnh\xfb\x1a\xbb\x17\x16\xc3\ \xb8\x1e,EI:\xe5;U9A\x8bU#q\xdb\ _\xf7\xfe\xf9P\xc5.\x1e`\x0cS)\xect4D\ 2\xee\x08'Z\xd0H6\xac\xfe8o\x8d_\xfe5\ \xfd*\xfa\x02\xcc\x00\xdc\x9a\xcd\xe2\xb2,\xb8\xd3\x93P\ \xa0(=mG/\x0c\xf5\x7f\x84\xa8^\x1c\x08\xbd\xdd\ \xc9?/\xfc\xd3\xb1\x0b\x9e\x1cB\x87\xf4\xb6k[\x9f\ J_\x0eB\x9c><\xc4\xf9\xae\xc0v\xd3\xf8\xa6\xb2\ 334L\x15\xddlA\xd8\xd6\xa7\x81\x9a\xa0X{\ ^\x8dEq\x8d\x94\x90E\x99|\xae\xbc\xd4\xd4\x81X\ )\x14-r<\xba_\x99\xa2a\xa8S\xcfZ\x83P\ -\x87\xbf\xd6\x81\xb5\xdf^\xc6\x98\xfb\xd4\x11ef\xcb\ \x98\xa8\xbeQ\xce\xa3\x15x\xa6\x1c\xe2b\x13F\x01\x96\ 1f\x00\xea\xc3\x91\xab\x03\x12$h\x0b\xb1\x19r\x80\ \xe0\xe9\xca\xd7\xe9\xd2\x83\x0d$\xf2D%\xcf\x0cw$\ \x0f\xbb\xd6\xba|\x1e!\xf0L\xf0\xe4fk\xa9\xfa\xdf\ J?\xec-\x19\x90\xac\x84\x11nc\xda\x82\xb3\xb8W\ \x11\x950\x82,Jg\x11\xbeC}\xc0\xde\xb4\xe3\xc9\ ,bH[:\x1f\x91\x1e\xf4\xcb\xbe\x0b0\x04\x0a\x16\ \x02\xd4\xc6h\xc7\xc4[\xba\xad\xc7\xd6\xa0\xa8\xb0 \x82\ \x0e\xc7\xad@\xa2\x05\x08\xb51\x96\x84\x8bT\x90h]\ \x16X\x8clm\xcc\x1e\x95\xcd\xa6\xa6\x87)'6\xa0\ \xde\xf5\x15)P\xc7!F\xddM\xa8A\xe9W\xb1\x11\ \x89\xd4\x5cY\xc6\xc7\xafj\xa2\xc0\xab\x15ab7\xac\ Y\x8dJ\x90M>,I\xf4\xcb\xa8\xda\xe3qUo\ ]z4\xa7\x8f\xc8>\xd0\xb6\xd4xj\x01\x1b^\xd5\ s\x87\x008T@\xf3f\xfd\xab3\x8a\xbb\xae\x1e,\ J\x00B\xf9%\x16\xf5t\xbdh\xf0\xf9#n\x15\x1f\ \x86I\x0a\xc7\x97Ze\xff\x00*>\x1a\xd6\xe5\xa1\xa8\ \x0e\x08%\xae\x00\xde\x96\xcfn\xbfJ(\x88\xf2\x86\x1a\ \xb4\x83\xf2\xb9\xfd\x85h%\xd5dp\xf3)'\xe1K\ \xe8\xa3\xa5\x10`\x14(\x00\x01\xb0\x14\xbb\xeb]z\xba\ C,m\xa5r0\xca)lm\xef\xca\xb8i\xa5Z\ \x8e\x06\x89Z\x92\x0d\x12\xb5)eZ\x8c05]M\ \x125L\x9f\x5c@$\xa6\xe0z\xf5\xff\x00\xeb\xfc\xd0\ \x17*B\x8bgoH<\xbb\xd4\x82\x15\x02\x8fH\xff\ \x00w\xa9\x08\x9b\x9b\xd4\x11\xde\x84=\xf6\xd6\xa0\xbd\xb7\ #\xebR1H[\xb16\x0a\x09'\xa5c;\x8b\xeb\ {\x9e\xd5\x7f\x1d.\x5c&PHi?!Yn\xc1\ \x98\xef\xd0VyV\xb8\xc1\xe0d\xf0\xf1h\xcc5\x0c\ 4\xebZ9|\xe5\x17]mYN\x032\xdbB5\ \xbdj\xc2VX\xf3\xa9\xf5\x8b6\xba\x8e\xbf\x90\xfc\xea\ \xe2hdO\x1aB\xc5\xc0\x86\xd9\x00#\xd6:\x8a\xa7\ /\x0c\xf00\xe5pe\xa5B\xd9\x9a\xfe\xa1\xa7J\xba\ \xc71\xe9\xd2\xdc\xaa#,\xb2z\x8fcM\x92\x86;\ \xa3\xa7\xad\x19}\xc5\xa8I\xb0\xbdox\xaeHV9\ \xb9\xf9\x85\xff\x00Z\x5c\x98L\x14\xda\x98\x8cm\xf8\x90\ \xfev\xac\xfe?\x87Y8Id\xc3\xe2\x04\xcb\xb87\ \xb5la\xf1\x98LBf\x0f\xe0\xb70\xfb|\x8dR\ \x9f\x86L\x83\xa7\xfe)\x9b\xc8u\x08\x83\x85F\xb1\xb0\x9d\ \xdb3\xa9\xba\x0f\xad\x89\xf9U\xb6\x83\x0c\x14/\xd9\xe3\ o(\xd5\xb5;Q/\x99H\xe6\xdeP}\xcd\xbf\x9a\ \x97 \xb9#j\xdc\x923\xb4*\xb0+\x020\xd1)\ \x1b\x10/M\xb9f$\x9b\x93K\x8f\xcc\xc4\x8e[S\ )\x89\x1a\xe5\xa9\xb1\xae\x16\xe6k\x98\xd9I\xed\xa5)\ \xd6\xa8:\xaeVP\xc3{\x11z\x9b-\xb6\xbfs\x5c\ \xbb\x91\xc8T\x83h\xb6\xf0\x22?\xf4\xd4\x18\xb0\xcc|\ \xf8HO\xfd4\xc0\xb6\xa8\x22\xf5bU\x93\x87\xe1\x1e\ _\xba\xcd\x13[\xad\xc7\xf6\xa0d\xe28M\x98\xbcc\ o\x89MZ7\x0d\x99E:76\x0c\xa4\x8b\xd1\x91\ k*Lv%\x90\xa5\xd5/\xbeU\xb1\xaa\xca\x09k\ \x0dI5\xb9,0K\xfed\x22\xfdWCA\x87\xc2\ a\xe1\x93\xc4\x5c\xce\xc3`\xc0XQ\xf9\xa7N*\x11\ U\x00\xb0U\x02\xdd+\x80\xa9\x00\x93s\xb9\xa3Qj\ \xd8\x0c\xd8x\xe7\x00\xb1+\x22\x8b\x07Sb{\x1a\xa2\ \xd1I\x1b\xb2L\xccYE\xc3m\x98u\xf7\xad 4\ \xa9uW\xc8\x19C\x00\xd6\xb1\xe8\x7f\xf1U\xe3\xa2V\ KXh\x05\xaa7\x15\xa3&\x16\x177\x19\x93\xdbQ\ H\x93\x04\xc3\xd0\xe8}\xf4\xb5f\xf1\xa7T\x9cT)\ \xdcU\x87\xc2\xce/x\xc9\x03\x98\xda\x97\xe1=\xfd\ $w\x22\xb3\x94\xe9N\xa1sF\xa2\xc0y\xd7NG\ \x7f\xce\xad\xe0\x98\xae\x0d,m\xe6o\xda\xaba\xe1\x97\ \x13\x8a\x92e[F\xab\x91o\xa05qc\x11\xc2\xb1\ \x83{^\xe7\xbd1Rx\x86\x14b\x90\x98\xc0YF\ \xb6\x03G\xfe\xf5\x9d\x83\x90\xc3\x8b\x11\x9f\xf2\xd4^q\ \xd7\xb5l\x00\xf9\x08\x8d\x82\xbf\x22k'\x1b\x1f\x87+\ \x8c\x99K\xbec\xf4\x1f\xbd\xe8\xe5\xfdS\xf8\xd79\xd5\ \x82\xa3\x10\xb6\xf2\xdbAjZ\x15q)Ke\x12y\ l:\xd2p8\x94|\x11\x85\x9b,\x80dC\xd6\xfc\ \xbfZ\xbb\xe1\xd9\x02F\xb9\x94m\x93Qz\xd4\xec*\ \xc8r\xe9k\x93\xb5\x09N\xacj\xc1\x85\xefr\x8d~\ \xcah\x1d\x0a\x9b\x10G\xb8\xa3\x11\x05\x05\xef\xb9\xeev\ \xa8+M\x22\x81\x8e\xb4\x22\x8a\xd2\xe7\x84L\x08&\xce\ =-\xd7\xb5<\xda\xd7\xa0a\xa5\xf9\xd4ef:\xb2\ 9V\xb8#{\xd0\x93W8\xa2f\x8cL7\x1eV\ \xfd\xaa\x8b\x1b\x0a\xe7zn\x09TK\x14\xb0\x1d\x9d\x0f\ \xc8\x8di_\xe1Y\xbe\xe9\xa1a\xe5g\xca;\x5cQ\ \xc6\xc1#\x9aF\xf4\xa4d\x9e\xf5G\x81\xb6H\xd5\x94\ \xf9\xbcqj\xcf\x96&\xe3\x1b\x1a\x82\xcc'\xc3\x007\ rh\xa6S\xe3\xb2\x81\xf1\x1a\x01c/\x8a\x0f\x96!\ \x95;\x9ef\xba23\xbfZ\x82u\xb0\xff\x00\xc5\x0d\ \xeb\x97Fmw\xa9'\xda\xbb\x9dup\xde\xa4*\x90\ j9T\xd3\x10\xd0\xd3\x03dB\xf6\xb9\x1a(\xeaN\ \xd4\x90i\x80\xdaM\xae\x22\xd0wc\xfc\x0aRc\xfb\ \xbb\x82\x09c\xbbnMH$\xea~@\xd0\x83z\x9a\ \x90\x89\x07qR,\x06w\xb2\xa8\xde\x84\x15U.\xe6\ \xca9\xd5<^ \xcc\xd6\x02\xc86\x14[\x83\x03\x89\ \x93\xc6\x94\xb9\x03\xa0\x1d\x05!\x92\xcdu6\xa35\x04\ \x8a\xc3e_\xcc\xb5g\x0d+\xc3,em\xacNM\ \xc6\xf5]V\xee\x14jI\xb7\xbdLr\x07\xc4b\x82\ j\x11\x15E\xba\x03D\xa9~<\x5c\x0f\xebVC\xdb\ QOP\x1c^6W\x1d\x8dd\x0ab1\x06\xe0\xdb\ \xda\xb59\x0cil\xda\xe9qaD\x06\x97\xa4a\xf1\ \x80\x8c\xb3\xeb\xfd|\xfeud\xa8\xdcZ\xc4hF\x97\ \xad\xb3\x5c\xb7\x07CcM\x129\xd4\xe5=\xca\x82i\ ,r\xdb\x98\xa9Wa\xa9\x1eSP\xc3s\xb1\x16&\ \xc3\xa0\x16\x15\x22\x81[7\xa4|\xcd\x18\xbf6?A\ Jt\x8f\x92H\x17\xf1=\xea\x09b\xd6\x1a\x8eu,\ \xa0\xcb\x197%A5#z\x90\xb3\x05\xd0-\x16\xb7\ \xd5\x8f\xca\x84m\x5c\x09\x02\xd7\x07\xde\x94\xe2\xa4\x9b\x96\ \xa8(\xdb\x02*o\xad\x10\xd4\x8d\x0d\xc9\xe9Rr\xa8\ U\xb5\x16\x8as;*)\x1b\xb1\xb5\x04\xf8\xa8 f\ Me\x91wQ\xa0S\xd0\x9f\xda\xb3\xb1\x12\xc94\x85\ \xdd\xd2\xe7\x90R@\xf9\xdcUn&\xceB@+f\ \x07b\xa6\xf4\x8cw\x88\x90\x06\x8c\xb2\xeasZ\x83\x84\ C|3\xb3\xb4\x85X\xf9G\xa7\xf4\xa7\xcb\x87q\x1b\ \x08\xe5\xf2\x91\xaa\xb6\xa4S\xecJ\x8b\x8e!r\xcb\x15\ \xcd\xbdk\xa7\xe5Vp\xe74!\x85\xf2\x9dErD\ \x90\xc2-\xe6,u\xa6@\xb9p\xca\xa3\x935\xbd\xaf\ T\xd4\xe1D\x05\xeb\x82\xd1(&\xf6\xd0mz\xd2H\ [\x0b\xd4\x8e\xc0\x9e\xfbW\x05Q\xc8_\xa9\xd4\xd4\xee\ ie\xda\xfe\x1f\xfe\xd5\xd7\xfb\xc4]\x8ebl{\x0f\ \xefGk\x0d(^\xe6dQ\xba\xdc\xb5\xb9\x02*H\ \xa8\x22\x8f'\xf5\x1f\xca\xa0\xa1\xe4~\xa2\xa4\x00\x0d\xe9\ 8\xecIE1+\x12\xe7C\xae\xd5en\x1bm}\ \xeb9\x22\x95f\x0e\xf0;\x00nGZ\xcd\xff\x00\x86\ \x1f\x02\xb2\xe1T5\xeeM\xcd\xeb\x88\xa3\x12\xac\xade\ \xb8na\x86\xd5\x05:\xde\xa2V\xec@\xb0\xb6\xe6\x93\ \x89\xc2\xfd\xa4\x12\x08\xf1SMF\x8e:\x1a\xb4\x16\xc2\ \xc0\x0a\x122\xb6a}N\xb4bbH\x0a\xb5\x8d\xee\ \xa7@\x16\xc0\x1bZ\xfdMD^=\xad\x11}9)\ 5\xbeX\x93r\x17\xe6\xa2\xa4;\x0fM\x97\xb8\x00~\ \x95\x9f\xc1\xd6\x03<\xe0\x0c\xcf(\xbf\x22H\xa6a\xf1\ \xf3\xc5\xe5s\xe2%\xad\x95\x8dk\xc8$-{\x86\x1d\ \x1e\xc6\xdfZ\xcc\xe2\xf0*\x05\x964 1\xb3\x0e\x86\ \xb3e\x9d\xc3.\xae\x12\xaf\x1a\xc8\x9e\x97\x17\x1d\xbbP\ 0\xa4\xf0\x96'\x0d$\x7f\x81\x81\x1e\xd4\xf76\x17\xa7\ \xde\xd9\xa4\xbe\x8e\xbf3B\xe6\xf4\xc6\x16\xd4\xeeiF\ \xa3\x09\xc7\xe9\x82=\xd8Vs\x5c\xe85&\xaeqw\ \xb1HG\xc2.\xde\xe6\xa9b\xa7L\x14\x1e+\x1b\xca\ \xeb\xf7Km\xbb\xd7>W\xb6\xa2\xaf\x1d\x9b\xc2\x85p\ h\xd7k\xdeP\x0e\xe7\x90\xa3\xc3Db\x96\x08\x94]\ \xa3!\x9d\xbb\x92\x0dg`\x95\xe7\xc6x\xb2\x02\xe1N\ v\xef[\x5c1\x95\xf1\xf9\xdfQ\x18-o\xc4\xfc\xcf\ \xcbj\xe7;\xbaj\xd3\xc8q9\xb2\x02\x88\xc6\xee\xe7\ \x7faR\xcc,\x15E\x94\x0b\x01\xd2\x82\xe5\x9c\xb9\xe7\ \xb5A5\xd7F\x08\xb5\x85\xcdp:w&\x80\xea@\ <\xb55 \xd5\xab\x0c\x06\xa6\xf4\xbb\xd4\x83V\xac0\ \x1a\x9b\xd0\x03\x5c\xc7\xc8mH66\xf3\x02>\xa6\xa3\ \x0eO\x84bcw\x8d\x89:\xef~t1\x9c\xc4[\ \x9dJ\x10Y\xa6\xe6\xf6\x0b\xfe\x91\xce\xa4`4Y\x95\ \x10\xbc\x86\xca?:\x05\xb6\xb76\x00\x5c\x9e\x95K\x19\ ?\x8b-\x97\xd0\xbe\x9am\xc4|\xad\xe19\xf26\xdd\ \x8dU\xd3\x99\x14.\x5c71\xd2\xad\xc5[\x0e2\xdc\ 0\xfa\xd1\x0bZ\xd5S\x09)\x9a\x1b1\xf3\xa0\xb6\xa7\ qV\x86\x80\x03]\x18\xb0C\xb5M\xc2\xa9c\xb2\x8b\ \xd4\x0aV9\x98a\xec\xa2\xe1\x8f\x98\xda\xa0l\x0d\x9e\ \x1f\x14\xee\xe4\xdf\xb5\xb6\x14B\xa8\xe1\xa7\x96/*\xea\ \xa7\xe1;V\x83\x03`v\xd3P)\x9d\x9a\xe0ju\ \xa07\xb5\xaf\xad\x12\x85\x03\xaf\xb9\xa4\x08\x0b\xd3\x10\x12\ \xac\x01\xb3[\xcao\xce\x81OsDF\x9b\x9f\xad1\ 1\xf1\x0a\xd0I\xe1\xce\xad\xab\x12\xb2\x01\xa1\xbe\xb6=\ \x0d]\xc0`\x1d\x8a\xc9\x88\x5c\x89\xbd\xb9\xb5\x5c\x8f\xcc\ \xb9\x5c\x93\xd6\xfa\xdb\xda\x8a\x16$4n\xc1\x9a3k\ \xf5\x1c\xa8\x9ca\xd1F\xd7\x94 \x00(\x16\x00r\xa7\ \x0d(\x10[[kF+q\x9a\x15H\xd5\x8b\x91`\ 5=\xab\x91m\x1a\x8bX\xda\xf6\xe9}i\x8c\xb7\x0a\ \xa7bu\xee\x00\xbf\xebj\xe6\x1a\x9du\xa4\x16\xe3\xc8\ z\xda\xa4\x0b\x00:W8\xf2\xdb\xae\x82\x8c\x81z\x92\ \x02\xde\x88\x0bT\xd7T\x9c\xc4*\x96;(\xb9\xa8A\ e\xd7\xd4uc\xd4\xd4M\xfeK\xdc\x5ce5&\xe0\ \xdb\xa6\xf5$\xd4\x13j\x16\xbd\xea\x00&\xa4\xe3\xbdq\ -\xc8\xfeu9M.P\xd2DR;\x00ws\xb7\ \xb0\xebRU\xe2R\xa32\x847e\xdd\x87\xe9D\x98\ \xd4\xca\x03\xa3\x16\xe7nt\xa90S/\xa4\x07\x03\xf0\ \xd4p\xf4\x07\x17\xe6\xf8A65\xcfn\x95\xb5gq\ u\x80\x01\xcb;\xd8\x9a\x0c\xe9\x98\xa4\x9fv\xdf\x85\xb9\ \xd3\x8e\xa6\xe6\xb9\x80kfEkmq\xb5i\x00E\ \xa6\x9f\x91\xa9)ng\xf2\xa9x\xe3e9\xa3]\xb7\ \x02\xc4P\xc4\xd9\xe0F\xce=>k\x9aR\x0a\xeb\xea\ 4\xb9!W\x86D7b\xcaH\xbfZj\xb25\xc2\ H\xacWp*P\x0c\xe3\xbe\x94\x16?\x0a9qL\ \xa6\xded#^\xb5f\xe0\xc9\xa6\xc2\xa8\xc8L8\x9b\ \x8b\x82\x8fqz\xbe\xb9Xg\x8c\xddH\xbd\xeb\x9c4\ \x12R\x98\x84F\x91\xfd+\xaf\xbfjs\x8b\xd6o\x13\ \x9c;xi\xe8S\xf5\xefE\xb9\x14!O\x8d\x8c\xcc\ \xfa\xdc\x96>\xc3Z\xc1\xe2\x18\x891x\xb2\xe7[\x9b\ (\xe89\x0a\xdb\xc3\xb0\x13\x1c\xc6\xc0\xa9\x1f\x95R\x8b\ \x87M\x83f\xc4L\x97\x0am\x19\xe4OZ\xe3\xca[\ \x1b\x82\xc2\xa1\xc3D\xaa\x06\xb1\x83$\x96\xeb\xc8U\xbe\ \x10\xa0I>\x97)\x18[\xdf\xbe\xbf\x9dT\x04)\x8a\ 6\xf5Js\xb0\xe7\x94m\xf9\xd5\xae\x18$-:D\ \xe3\xc4\xca\x0b\xb7%7\xda\x9e>\xaa\xb2\xc0\x8fP#\ \xde\x84\xef@\x1ah\x0d\xb1\x0d\x9e6:8\xd6\xd4c\ #\x1f,\xa8I\xd8f\xad\x00\x8b\x8b\xe9{\x9a\x91\xf4\ \xa2de\x17*m\xd6\xa3B*(k\x01R\xa7\xad\ D\xa6(UZ\x5c\xdem\x94oE\x04\xb1\xcfq\x1e\ `G#\xce\xa0\x91n\xf5\xc4\x1256\xedS\xb5H\ \xda\xb4\x10T\x88\x88]Y\xfc\x8b\xeei\xaen\xe6\xdb\ \x00\x05@\x03\xc6N\xaa\x85\x80\xbf;\xefC#\xacQ\ \xf8\x8d\xafA\xd6\xa4_\x10\x97\x22x*um[\xf8\ \xaa`\x9a\xe7fw.\xc6\xe4\x9b\x93R9VkC\ \x02\xa7\x95\x08:Q\x0d\xeb)\x04P\xb0`\xd7\xb5\xc0\ \xa6\xd8t\xa8u\xb8\x22\xfb\xd3\x88\xef\x05\xf9!=\xc6\ \xb5$\xac\x0c\x1aV\xb3\x0fJ\x0d\xc9\xac\xd7\x5cL\x1e\ KH\x8c\xdb\x00w\xab\x98\x18N\x1d\xe7\ \x95rjZ\xdf*\xeb\xf5\xe7\xbdM\xeaNQ\x94\x00\ E\x8f^\xb5\x22\xba\xbb.\x9b\x9f\xad!1\xb9IC\ \x8d\xc7:\xd2\x84\x89\x22\xce\x9a\x8b\xed\xccVQ66\ :S \x91\xd1\xcbF\xc4Z\x99U\x8dKT\xa1\x00\ \x12\xc7\xcbk\x9b\xf3\x15Iq\x92\x81b\x15\xbd\xc5A\ \xc4\xcb#X\x90\x01\xd0\xe5\x00V\xb5\x9cX\xc2a\x85\ \xbcV\x0drn\xa8>\x1e\x97\xa7\x15\xb1%\x9e\xc7\x9d\ \xda\xb3VydFW\x91\x89\x89\xb2\x93\xd7\xa5@\xd7\ [\xd1,X\xd4\x02\xfa\x06S\xff\x00P\xae`A\xda\ \xb3\x056\x09\xe4\x8d\xb47\x1f\x84\xedO\xe9b\xfa\xd3\ \x06\xd4\xb8\xd8:\x07]\x9b\xf2\xa6.\xd5\xa0 \x01\xde\ \xa0i\xc4\xd4.\xc61q\xf2\xa2]\xaa \xb1\xe23\ _p,\xbe\xd5\xa4\xb1\xa0RI\xb0\x1b\x93G\x1d\x9a\ \xc5Ha\xd4\x1aN%Ka\xca\xdfB\xcb\x7f\xadH\ \xc3\xc6\x8fe,\x17\x9a\xdfF\xa5\x91\xe6.\xf7C\xa6\ \xc0\xf6\xbe\xff\x00\xef\xb5\x1eE\xb6\xda\xf5\xe7]\x1f\xa6\ \xf6\xde\x8a\x94\x05\x8dCf\xd4\x9e\xf4Cz\x164J\ t\xd6\xa4\x9a\xea\xeb\x8a\x1c\xc2\x94\xe9T\xb2\x15\x07^\ U\xc0\xb1\x17h\xf5\xff\x00X\xa1,z\xd4f\xd6\x84\ \x98\x9d\x1e\xfb\x02\x0e\xa0\x9d\xa8\xb3\x0byl\xdd\xf6\x1f\ _\xe2\x80\xb2\x8f1\x03\xdf-\xeb\xb3\x12n\xdf.\xd5\ !\x9b\x11\xad\xdf\xb5\xac\xbf\xef\xde\xf4.\xe6\xfe`-\ \xd6\xf5\xd7\xbd\x0by\xc6P}\xcfJ\x92o\xad\x03\xa8\ \xfbDrX\x5c\xddO}(\xc0\x00Xr\xa8'\xfe\ *4\xe8\xa4\x9a\xaau\xaa@\xa3\xcbP\xc2\xc6\xa4\x5c\ \xc8\xcd\x19U`\xb9\xb4$\xf4\xa4\xc7\x87\x857\x5c\xe7\ \xabmV\x0d\x09\xd2\x8b\x09^\x16IC\xc4\xaa\x0d\xac\ \xcb{\x5cQ3\x0c\xc0\x15t'k\xda\xc7\xe6*I\ \xa8`\x0a\x95aph*|O\x04fc4c\xcd\ o2\xdbSY*\xf3\xe1\xa5%KF\xdb\x11\xd2\xb7\ F`\xc6'`@\x17Cm\xfbRx\x94i6\x19\ \xdd\x96\xef\x18\xba\xd8z\x8fJ\xc7.;\xdc2\xa8\xcb\ \x8eW\x87\xc1\xb8I\xd8\x02u\xdc\x7f5\x9d8*l\ E\x88\xe5Y\xf8\xa9\x1d\xe5i\x09\xb3_\x97*\xbd\x04\ \x87\x11\x82Y\x08\xf3)\xc8\xdd\xfaW\x1f\xd7\xe9\xbc\xc1\ a 2\xbd\xce\x8a75|\xb9\x06\xc0\x0c\xbbe#\ J\xe5\x8cC\x08\x8co\xbbw4'z\xdec,\xdf\ \xf1\x07\x0e\xcf:\xe2\xa2\x94E\x1eP\xa7\xa8\xf6\xa6p\ \x22\x829\xa1\x8c\x10\xa1os\xbb\x1b\xefW'\x8f\xc6\ \xc2\xcb\x0d\xaeJ\xdd}\xc5e\xf0yD8\xd0\x1bi\ \x01C\xafZ\xc5\x92r\xd3\xf1\xa2H\xcaT\x8b\xa9\xd0\ \x8aP\x83\x0a?\xe4\x9f\xfb\xcd6E*\xc5H\xb5B\ \x0b\xb0\x1dkU\x17\x88\xfb\x98\x0c\xb0\xb3&R\x01R\ \xd7\x06\x811\x98r.\xca\xeaz\x0dA\xa1\xc5\xbb\xcf\ )\xc3\xc2\x9a)\xd7\xa94qa\x22D\xfb\xe0]\x8f\ l\x05\x1d\xefIY\xd9\xf1x\xbf(\xb6m\x85\xf6\ \x14\xd9`l2\x89\x92K\xd8\xd8\xe9j`\xc3Eq\ \xe13\xc6\xc0\xe8w\xae\xc7D\xde_\x1b\x13~\x8b`\ \x09\xa3>\xa3\xa1\x94M\x00\x93.S{\x1a\x9b\xda\xa8\ \xe08\xa6\x0f3aV\x1767R\xc6\xc4\x9ab\xf1\ 4\xccsa\x11\x11}D\xb1\xbd3\x94\xfe\xacZ\x9a\ \xcb\x873\x92W\xc2 \x83\xfbULd\xad$\xd7a\ k\x01\xa7J\xa9\x8d\xe3M\x89O\x0f\x09\x04j\x11\xae\ \xaa\xe7\xd5\xdf^t/\xc5\x1d\x90\xc9\x16\x1a\x1c\xc3\xd6\ \x18j\xa7\xb8\xac\xdep\xc9V*A\xe5I\xc0q\x11\ \x89\xc4$2\xe1\xa3\x05\xcd\x8b.\x96\xf9S\xf2\x9f\x10\ \xa2\x82M\xed\xa52\xcb\xe2\x12\xd1\xa8\xa7\xc1\x83\x00\x03\ 3[\xfaV\xadE\x1e\x1dv\x88\x1f\xf5\x1b\xd38\x8d\ Q\x14h\x8c\xc2\xe0m\xb9\xab\x86\x08\x1e\xf6L\xa6\xc4\ \xe8t\xdb\xa5gb\xa2\xc5b/\xe16t\x1b\x22\xe9\ o\x956b\xd5\xec<\xb1J\xf3\x0c\xa1K\x1b\xc7\xdb\ \xda\xa8\xc6\xcd\x98\xa9\xdc\x1a\xb3\xe2i\x1e\x1c\xc5\x95\xa2\ m\x5c\x0eU]G\x9d\x18\x1b\xe6K\x93\xd6\x8a\xa0\xc5\ \x10\xa8Z\x9a\x88\xb4\xb5\xedR7\xb6\x95\x0ahY\x19\ \xd8\xb0\xd8\x9d)de\x14\x9b\x9b\xd7\x01\xc8\x0a\x88\x83\ \xa9\xf3\x03o\xd2\x8cj47\xa5\x04\xae\xc3\xa9\xa2\x16\ E\xcfm\x07\xa4u=\x05C\x0b.{\x85\x09\xa9'\ \xa5p`\xe0J\xc4\xa9\x22\xc8\xbf\x84u\xf75'\x22\ \xf8Q\xe5$f&\xec{\xd7f<\x87\xd6\xacC\x84\ wP\xc6\xc8\xa7\x9bni\xc9\x84\x81F\xa5\x98\xfd)\ \xca\xb5H\x13\xf8O\xca\xb9X\xb3\x10E\xb4\xab\xb2a\ R\xc4\xc6\xc4\x11\xc8\xd5-L\x9a\x822\xe8oV%\ \xae\x1f)V1\x9d\x9boz\xbd\x01\xba\xebX\xf9\xd8\ ?\x90lw\xad\xa5\xb1\x01\x80\xd0\x80E\xab\x5cE1\ \x05\xcd\xaa\xb9\x97.=\xa6\xb1+\x9a\xd7\xb7*\xb5\x0f\ \xa8w\xa1\x89\x8a\xc0\x97PW(\xfe\xf5\xb01\x22;\ \xaa#\x06\xbf\x98\xf6\x03_\xd6\x8ck\xf3\xaa9\xbe\xcf\ \x8b\xce\x05\xc1\x1b{\xd5\xd6`\xa0\x1e\xa0\x10)\x94%\ Z\xea=\xa8\xaem\xbd-v\xb7M(\x81\xa4&\x88\ \x11j\x1b\xd0\x96\xb5HLE\x094,\xff\x00*\x0c\ \xe3k\x8f\xad\x1ap\xcb\xf7\xae,\x05)\x9a\xc3Z\x12\ \xe4\xec>\xb4i\xc1\xca\xcdu\x03\xad\xeaskK]\ \xfa\x93\xce\x88T\x86O\x97\xb5\xf54\xd4\x17\x00.\xdc\ \xadB\x8aXX\x0b\xde\x80,\xda\xc5\x19\xd7b\xdf\x86\ \x90\x99\xa7\x0a\x08\x89s\x11\xbbr\x14X$`\x8d,\ \x9e\xb9?J\x88\xb0\x8c\x8b\xe6\x908\xbd\xec\x05\x81\xf7\ \xa6\xc6|\xbb\x9b\x8ad\xbb\xda\x15\x03\xef\xbe\xd4gj\ \x5c\x84\x09<\xc7K\x5cU@I\xb8\xb8\x04\xd03]\ \x8a\xda\xdf:\xe9e\xb9\xb2}k\x88\x0a,>f\x83\ \x11A#\x85[\xd4\xbbYI\xe9U\xee\xce\xf75\x9b\ I\x81n\xa4\x1dX\x8b\xdf\xa1\xaax\xec@f@\x9b\ /\xab\xdf\x9d[S\xf7\x83\xde\xb2\xb1\x0d|d\xebq\ \x96\xf9\x94t\xbe\xf5\x9eW\xa3\x18\xdcj\x1f\x07\x18\xf6\ [#\x1b\xafqE\xfe\x1c\x90\x0e!\xe1\xc8~\xed\x81\ ,:[\x9d^\xc5\xc2\xb8\xb8|\x22@u\xf4\x13\xfa\ VV\x0dZ\x0e a\x95J\xb3\x02\xba\xf2\xbdp\xb3\ 9k\x7f\x1e\x8a`D\x876\xf4\xa3\xbdU\xc1\xe3\x8a\ \x0f\x03\x11r\xb7\xd1\x8e\xebW\x19H \x8dA\xd8\x8e\ u\xd3u\x90\x83\x95\x83\x0eU\x9d\xc5\xb0l\x926\x22\ \x11x\x98\xdfO\x84\xd6\x8b)\x1a\x10Er\x12\xbbs\ \xde\xfc\xe8\xb3T\xac\xfc\x169r\x88\xb17*6~\ b\xad#\xc0\xd6)\x89\x8c\xdf]M\x88\xa8\xc4a0\ \xb3\xfa\x94\xc4\xddPh~UVN\x16o\xf7X\x88\ \xdb\xb3yh\xff\x00(W\xd7\xcc\x09Y\xa2\xb76\x0c\ )\x12b\xb0HNi\xcb\x11\xc9S\x7f\x9dQ~\x1d\ \x8bR\x09\x8b2\xdfR\xa6\xf5W\x1cx\x96\x1f\x10P\ a~\xef\xe1\x1e\x1d\xc5\xa8\xbc\xac\xf8\xa4]\xc4qW\ #&\x1a1\x10#V\xdd\xbe\xb5Q\xdd\x84\xb9\x14\xe7\ \xc4\xb0\xccK\x1d\x10u4\x98\xb1,Ii\xf0\x91\x8c\ \xbb\xe5&\xff\x00AT1\xd5\xd8\x13\x93\ \x04\xad\xacb\xec\xcd\xd6\xdc\xa92\x9c\xc5p\xe8Ag\ \xc9m@\x14\xeb\xac\x85\x93eq\x94v\x1c\xa9J\ \x98\xb9\xd2F\x00*\xbe]\xd9\x86\xff\x00*Yfs\ v7\xa5\xa0\x14\xc1XhB\xa4P\xd7|'\xda\xa4\ 3\xf8y\x9eB\x8f\x9d\x00\xd0\xd8h(\x97j`\xa2\ \xe7PE\xcfz\xea\x95>`\x06\xa7\x90\x1b\xd2\x02\xaa\ \xb2\xe2\x0c$\xb3\xacv9\x07\xc4\xd5\xa1\x87\xc3\xa4\x07\ \xc5\x94\x03!\xe5\xc9j\xbc\x90}\x90}\xa8\x00%c\ b\x06\xb9h\xf0\xb3O\x89>u@\xa3\x98\x16\xb53\ \xaa\xaa\xcbH\xa4\xdc\xb1\xd7\x99\x15\xc4\x81\xb9\x1fZQ\ Vg\x0aM\xc0\xfc\xaa|!\x9a\xf7\xb0\xe9K&\xd5\ |r\x82L\x80\x00m\xafzp\x04h\x18\xfc\xeaU\ A>}o\xa1\x1d\xaaL\xf1z\xd2\xe1m\x9b\x0c\xc2\ \xf7(t\xf6\xac\xe90\xec\x98\x96A|\xbc\xb5\xb5\xe9\ \xd8\x1c\xd0\xe2u\x07+\x0b\x1a\xb8\xf5Z\xadP\xc5A\ =\x05\xc5\x14c-\xd0\xdb\xf1\x0f\xdc}\x7fZP\x0f\ |\xadk_SE$\x81\x02;\x1b\x0c\xc5I\xecE\ td\xae'\x1d\xd26Ro\xaa\xfc\xea\xc3\x00\xa7(\ \xdc\x00\x09\xf9P\x0c\xb3H\x1a\xf7\x8e=\x8f&4N\ u&\xa4\x90m\x5c\x1a\x80\x1a\xea\x92X\x96\xbd\xc9\x02\ \xfbP\xb5\xed\xebo\xad@>Q\xdcW\x1a\x90lO\ \xa8\xde\xd5$\x0e\x82\xba\xf5\x0chH \x03\xa5u\xea\ *T\x5c\xda\x84%7\x15\x18\xccJ\xe1\x80E\x01\xe5\ \x22\xf6; \xeak\x95\xd4\x11\x93\xef\x09<\x81\xb0\xf9\ \xd6\x5c\xce\xcf3\xb3\x1b\xb31,z\x9a\xad\xc8\xa2\xcb\ b\xf12\x8b>%\xb2\xfe\x18\xd7-\xe8\xb0\xb8\x89b\ #\xc3b\x007\xb7Z\xab\x1dY\xc1Fe\x9dcQ\ \xab\x1bQ\xde\x9a\xdd'\xee\xc3\x81\xba\x83j\x15M/\ }N\xa6\x9c@\xd8l\x05\x85\x01\x16:m\xd2\xbb\xb0\ [\xf9T\x9bl/Kh\xc1\xf5jz\xd3$\x04\xe8\ N\x9d\x05A\xd3Z*!\xa2PAQ\xa8\xeb@\xf9\ \xb7\x16\x14\xe6\xa5=f\x98S\x82}v\xf6\x14\x04\xd3\ \x1c\xd2\x98\xd6iFb\x1a\xfd+7\x8a/\x83/\x8e\ o\xb8Ry2\x9a\xd0\xaa\xdcMZT\x11x%\xd2\ \xd7$u\xac_\x0cP\x93F mC<)\x8c\x8c\ $\xa1\x83)\xf2\xc8\xa3Q\xefD\xe2d\x16C\x13\x90\ ,3\x8b\x11U'N\x22\xe4\xdcHG\xf4\x9f\xe2\xb9\ \xd6\x88\xc4\x1cF\x1d\x8a\xe2b\xf1Ph$\x1b\xfdi\ \xf8>'\x04p\x18\xb3\xba\x03\xb1a|\xbf:\x94\xc1\ \xe2\xda/\xbe%T\xf2`I4\xb1\xc3\xb0\xef\x7f\x0a\ D'\x98\x91\x8a[\xf5\xac\xf7<=5\xb0\xc6)0\ \xaa\xd1\xe2RK^\xe6\xfa\xd7\x1c\x9c\xe4O\xfb\xab\xcf\ bp\xf8\x9c\x0c\x99\xd6\xe8/\xa3+\xdc\x1f\xca\x8a>\ -6\xd8\x80\xb3/2V\xcd\xf5\xa7\xf7>\x8cn\xbf\ \x87k\xf8\xd1\xe9\xfdT\x99$\x85uiG\xfd:\xd5\ ($\xc3b\x85\xb0\xf2\x15{_\xc3}?:\x19\x94\ \xa9\xb3\x0b\x11M\xe5\xd2\xc5\xa6\xc5\xc2\x86\xe8\xae\xc7\xbe\ \x82\x82n!$\xa9\xe1\x95\xca\x84X\x8c\xc4\xfe\xb5P\ \xd4V?T\x86L4\xa4\xfd\xd6:\xea\x0e\xceJ\xda\ \x974\x18\xd4\x5c\xca\xe92\x0d\xf6 \x8e\xf7\xa7W+\ \x14`T\xd8\xd1\x90\xeb5\x22\x84\xc8d\xc3\x01\x0c\x84\ \x1c\xd1\x1fD\x9e\xdd\x0dV\xc4\xc7\x97\x12cA\xec\x08\ \xd6\xb6q\x18\x13\x8b\x9d\x1a\x01\x95\x9fW\xe8+Qp\ \xf8h\xe1\x10\x01\xaa\x8b\x09@\xd5M\x13\x86\xady\xdc\ &\x0f\xc3\x0b.$X\x9dU9\x9fz\xbe\xb3\xc4\x8c\ \xa9;dY\xd0Y\xc0\xd8\x82w\xfa\xd0c\xf0\xd2\xe1\ \xe6\xb4\x870mC\xfe*V+\x0e\xf8\x98bX\x99\ <\x80\xdf3X\xd1\xe7\x8b\xd6\xa6\x0b\x08\xe6p\xe5\xbc\ \x8bf\x0c\xba\xde\xaef\x0f;*\x87v\xbf\x9b(\x00\ /\xcc\xd6?\x0a3Y\xf4\x01\x01\x1c\x86\x99\xab\ \x11\xa3J\x84\x17\x91\x85\xb9e \x93\xec+\xacJ\x12\ 0\xb3\xda\xdb\xdcT\x09[\x93(\xee\x00\x15\xd7\xb9\xb9\ 7\xfc\xe9\x06\xd9\xef\xe5\x855\xe4\xf2X\xd4H\xd9\x06\ f\xc3N\x07[\x83@\xb7\xb0\x06\xa5K\x03qqJ\ \xc0}\xa8\xb7\x97\x0d\x03\xbbuaz\xbf\xc3\x9a5\x16\ \x95DS0\xbd\x8e\xdf\xf9\xa8\xe1\xea\xce\xc5\xdf\xd2\xbc\ \x86\x975fx\xa3\x9cZT\xb9\xea45\xa9/\xa2\ \xd0\xca\xab\x88!3^4\xd5\xcf\xe2=\x05\x1a\xe82\ \x8d\x14l\x06\xc2\xb8!H\xc2 \xb2\x8d\xaf]f:\ \x11a\xce\x96Q\x1f\xa3\xe7D\x05H\x15\xd6\xa98T\ \xaa\xdc\xf4\x00\x5c\x9e\x82\x88!\x22\xf6\xd3\xa9\xaa\xdcG\ \x12\x91Da\x8d\x83;\x8b1\x07\xd2)\xeaz\x99\x7f\ \xe29\xde\x5cDo\x1b\x11\x1b\x0c\xaa:Z\x91\xc3\xb1\ r\xe1\xa5\xf5\x96F\xf5\x03\xaf:,Y\xcf\x85\x0dc\ \xf7l\x0f\xd7J\xaa\xbe\xabt\xae6\xf7\xad\xe3\xd9B\ \xe2X\x04\x8b\xb7\xed\xca\xa2d\x12\xc2c&\xda\x82\x0d\ f\x7f\x87\xb16\xc2\x80\x7f\xe5\xb1V\x17\xe4y\xd6\xa9\ \xecn\x0e\xc6\xbd\x12\xeca+e\x01WE]\xab\x98\ \xde\xa2\xba\x94\xea\xe1\xb8\xae\xae\xa9\x05=\x03\xda\xa1\x88\ \x02\xa2C\x96\xe7\x91\xde\x96\x5cocn\xb4j\x135\ \xea/C{\xed\xadp\xa1\x08\x7fs@\x5c\xca\xb9\x22\ F*M\x99\xf9Z\x8bB\xac\xa4\x8f0\x22\x81\xa6\x8e\ \x1c\x22\xc8\xdb\x81`\xbd\xeaI\xc7bW\x0d\x0eU>\ r,\x8b\xd0u\xac\xe4k\xebI\x9eW\x9ac#\x9b\ \x93MH\xe4E\x0c\xc8\xc0u\x22\xb1\xfa\xda\xd6a\xa9\ \xbdnp|?\x81\x17\x88\xe3\xef\x1fn\xc2\xb0\xe1\xb6\ q}\xaf\xadzS\xea\x1d,-\xf4\xae\x9c'l\xf2\ 0\x1d*\x0dJT\x91]Y)\xc5\x03\xfai\xac)\ l9QQGz\x5c\x83\xa9\x03\xdc\x8a)\xdf\xc2\x89\ \xa4<\xb6\xf7\xac\xa4\xbc\xd8\x91\x9c\x17\xccu\xb5c\x95\ 1y\xd7K\xddm\xfe\xa1I%N\xc77\xfa\x05\xff\ \x00=\xa8\xcaF\x86\xe9\x1a-\xb9\xda\x85\x89;\x92h\ !\xef\xea\x11\x8e\xdef\xfe(H\xb17y\x1b\xdc\ \x81\xfbQ1\xa0cY\xa8\xb3\x06\x1b5\xfc\x22O;\ \xb5B\xbcq\xe9\x1a\xe4\xf6\x1a\xd4\xb1\xa0&\x82#;\ o\xe2=\xfd\xcd\x04\x92\x17[\x00\xbe\xf9\x05N\x9d?\ *\x06\x00\xf2\xb7\xb5E\xca\xea\x17!\x8a6^a\x96\ \xa9q\x0c\x0c\x0e\x9e&\x1f\x07\x11\xfcH\x14\xdcw\xab\ z\xdb\xad@$\x1b\x8b\x82:Qd\xa9\x84\xcb\x00$\ \x1c2\x0e\xb6\xb8\x22\xb4p\x03\x0f\x89\x83+\x02d]\ \x02\x97\xd6\xdfJ\xb3\x89\x86\x1c@\x1e4va\xf1-\ \x81\xaar\xf0\xdb11b\x00<\x83\x0b~u\xcf\xf3\ eka\xcd\x86\xc3)\xb3@\xe0\x8e\xaeiX\x98p\ \x91.b\x18_a{\xd4\x88\xf8\xbcc,r\x19\x07\ \xf4\xb0kP\xcb>5|\x98\x8c\x1e}9-\xbfJ\ z\xfe\x01a\xa3\xc2K\x19a\x1b\x12\xbb\xdd\xadN\x8d\ c\x12\x00\xb0\xc6\xba\xda\xe0kUc\xe2\x10D26\ \x19\x96\xfe\xa0\x0d\xa8\xcf\x11\xc1^\xf9'\xfa\x8a\xb6!\ \xc4\xa03\xceE\x99\xd8\x81\xfd iR\x8a\xcc\xc0\x0d\ I\xa0\x18\xec&c\xe4\x93+\xea\xb7al\xdd;^\ \xaab\xf8\x94\x85Z(\xa2\x10\x83\xa1\xebF\xc8\x85\xc6\ \xa6\x8d\x82@\x871\x8c\x9c\xcd\xcb\xda\xa9(\xa1\x07Z\ 5:W=\xde\xda\xc4\x93j\xe4b\xae\x19M\x88\xd8\ \xd7\x1a\x8euD\xdd\xc3M\xf6\x9c\x1aLO\x9cy_\ \xdf\xad\x1a\x9a\xce\xe0\xb8\x85\x8eF\x86V\xb4r\x0d\xfa\ \x1eF\xb4\x8a\x95k\x1a\xed\xc6\xecf\xa5\x9f\xc3\x85\xe5\ \xe6\xa3Oz\xce\x04\x93s\xa95w\x19\xff\x00\xed\xf2\ \x7f\xa9k?R\xb6\x1b\xde\xaeJ,F\xaaP\xeb\x9a\ 1\xff\x00\xfd\x0f\xf1\xfa\xd11,\xd7cD\xe1\xcb\xf9\ \xc5\x8fKZ\xd59hA\x17\xe5\xa5M\x8f;\x9a \ \xbdh\x82\xd3\x8bB\xa2\x8a\xd4@W\x01H^\xc1\xae\ \x5c*\xdb\xe2$\xd3\x00:\xd8km/\xd6\x87\x00s\ a\xb2\xde\xe5\x0e\xdd\xa8\xe5\x0c\x19U\x05\xdc\xec\xbf\xb9\ \xad\xb2\xab\x84\x5cD\xa5\x9b\xc6ePu7\xe7V\x82\ \xb8\xf8\x8c\xab\xce\xfa0\xfeh\xa0\x87\xc2\x84%\xeeI\ \xbb{\xd1\xaa\xda\x99\x10\x14\x06\x17S{n-b=\ \xe8q2\xc7\x86\x8c3\x82\xcc\xde\x95\x15`\xda\xe1\xc8\ \xdbF=\x8f\xf0j\x97\x1eShM\xb4\x00\x8f\xce\xab\ \xd4J8\xbcD\xb3\xb9,H^J6\x15Vk\x86\ \x03\x91\xa6\xb6\xf42\x8c\xc9\xa6\xe0\xd7+\xdbc+\x9a\ 9\x13|\xc8l+21j\xd6\xc3\xa4\x84$\x99\x18\ \xaf3j\xcd\x992L\xeb\xd1\x88\xac\xf2\x89w\x807\ \xdf\xc9\x17\xfe\xe2~cQ[8,F\x82)-o\ \x84\xf4\xaf=\xc3\xa4\xf0\xb1\xd1Im\x98V\xcc\xca\x15\ \xca\x8eF\xbap\xbd\x0a\xd2 \x8f\xe6\xa2\xb3\xe2\x9aX\ \xfd\x0e@\xe9N\x18\xd9\x00\xf3\x227\xca\xd5\xd3\xf5\x19\ \xc5\xaa\x83\xb5W\x18\xddu\x85~D\xd7\x1cbi\xf7\ G\xbf\x9a\xad\x8b\x0c}\xe8\x0d)\xf1\x84\xe8\xb0\xaf\xd4\ \x9aS\xe3\xa4\x07A\x18\xed\x96\x8d\x87\x0f\xc8;\xfdj\ B\xad\xf6\xaa\x9fl\x97\xf1\xaf\xd0Q.2A\xba\xa3\ \x0fj6,[\x05cF\x91\xb4T\x17\xf7\xac\x8cL\ \xad,\xcd-\xaf}\xd0s\x1d\xbb\xd6\x9ab \x91\x1a\ 9\x03(u\xb1\xe9Y\x93\xc4b\x90\xad\xee\xa7\xd2z\ \xd6y\x18\xb1\xc2p\xcb,\xa6V\xf3F\x9a\xfb\x9e\x95\ \xab\x9f0*\xe02\x9f\x84\xedY<;\x10\xd0\xc8\xc0\ e\xcb&\xe0\xecOz\xd5K2\x07_I\xfc\x8fJ\ \xd7\x0f\x05Q\xc7A\xe0J\x0a\xff\x00\x96\xfa\xafn\xd5\ \xb1\x80\x98O\x83G\xbe\xaa2\xb5R\xc7(l\x03\xdf\ \xe1!\x85\x07\xf8~R'xN\xce\xb7\x1e\xe2\xb5:\ \xa2\xf8\xd8\x8d\xb5\xb1\xa6\x83\xa5W\x06\xfa\xd3\x11\xb4\xae\ \xac\x8d\xe9/\xbd0\x9b\xd0\xb6\xbaT\x95\xf1h\x1e\x02\ \xa4hY\x7fZQE@B\x22\xa8\xec*\xcc\x80\x98\ \xd8\x0d\xedq\xdf\x9d-\xc0:\x8d\x8e\xa2\xb1aU\x90\ ij[iV\x1du\xa4\xc8\xa4Vi%\xa8\x1fJ\ a\x14\xb7\x15\x84[\x9dhh\xce\xf5\x0c*2\x80\xef\ C\xa5\xe8\x88\xd2\x84\xd4Phk\x89\xa8\xbd\x1a\x93B\ \xdbWr\xa8k\x05,\xcc\xaa\xa3\x994 \x10/\xb5\ Hi\x14Ydp;5Fh\x7f\xf7\xd0{\xd12\ \x90;u\x07J\x93\xbcW\x1b\x90}\xd4\x1f\xda\x93$\ xi.$\xc3G\xee\x83)\xa3a\xce\x85\xa8\xa6\x14\ \xd8L\x13#(Y\x10\x1d\xfc\xc1\x81\xf9P\xae\x0b\x09\ uR\xf2\xca>\x1c\xda\x11\xfd4\xebP\xca\xa4\x02\x14\ }\xe3\x8f \xef\xd6\xb3\x90\x99\x19H\x85\xa1\x85#\xe5\ \xe9\xb9\xa3\xce$\x19e\x8e7\x1d\x0a\x8f\xda\x97#\x03\ &\xfa\xf3\xf7\xa9C\xad\x86\xf5\xa0\xa7\xc5p\x89\x08Y\ \xa1-\xe1\xb97\x07\xe1=*\x90\xadN5*\xc7\x85\ \x18`\xc0\xbb6g\x03\x90\xe5YC87\xbe\x9d\xab\ \x9f94\xc3-\xa5Z\xc3q\x0cLJ\x130t\x02\ \xc1\x5c\x5c\x0a\xa6\xcc.2\xde\xe3\xad\x19:_)\x17\ \xa2t\xbdk\xc5\x8a\x87\x17\x87\x920\x9e\x1c\x85}7\ \xd0\xfbUX\xe3fl\x80k\xfaR8ya\x89\x89\ \x81\xd4\xb8\xd6\xb5\xf1P\x09\x99\xd6\x18\xec\xaa|\xe8>\ =4\x1e\xdd\xab\xa4\xff\x00(<^l\xad\xe4\x91\x03\ \x0e\xa7zT\xd8 |\xd0\xb5\xff\x00\xa4\xefV\x05\x88\ -\x96\xc6\xe4\x10w\x16\xa9\xb7=/]q\x86k#\ #e`A\x1b\x83Qj\xd2\x9d\x12X\xfc\xe8s[\ F\xb6\xd5\x9f0h\xc9R<\xc3KVlj\x22\xa4\ \x0a\x08\xcb\xde\xe7_z`d\x04)\x0e\xccu\x08\xa3\ Z\x91\x98gh\x982\x9bf`\xbf\xef\xe5Z>\x81\ h\xc5\xc1\xd776\xeek2\xc78g\x00e\xf4 \ 7\xd7\xa9\xabX\x09\xf4\xf0\xa4:|$\xf2\xadq\xa2\ \xac\x80H\xe9]b\x07Z;[C][\x08\x16#\ ]T\x8b\x1aF\x22)\xe6\x84\xc2\x02\xb8\x02\xea\xd7\xb1\ '\xa5?(\xde\xd5\x0c\x0a\xea\x9a\x1d\xedEL\x09K\ G\x7f\xf8iI\x1c\x88\xfe+\x94\x87\x85d\x00\x8b\xe8\ GB+_\x88a\x9aq\xe2\xc1\xfeg\xc4/\xbfq\ TW\x0f+L\x10\xc6G\x8b\xdb\x98\xfeG\xe9\x5c\xef\ \x1c\xadJ\xd2\xc2\x1f\x0f\x86!Q\xb4E\x88\xeb\xad`\ q\xa8\xc0\xc5x\xaa4p\x09\xf7\xb5z\x0cS*\xe0\ \xce]\xb2\x84QY\xfck\x0c\x17\xc2K\x82d\x8c\xe5\ '\xad\xf4\xfe)\xe76\x08\xc4\xad\xd5\x7f\x17\x0f\x14\xa3\ \xe2@\x0f\xb8\xacG_.p\x08\x04\x90A\xf8O1\ Z| \x93\xc3\x98\x1f\x86M>\x95\x8e>\xe3Ua\ E\xc8\x02\xa4\xa9\xcb}\x0d\xba\x1b\xd0H\xc50\xee\xe3\ p,>u!\x12(\xe3\x91\x17\xd3l\xdf\xd4\x0dl\ :\xb9\xb4\x15,2\xb1\x1d*\x18\x12E\xada\xca\xf5\ \x00\x156\xd7Z\x19\x0a\xc7\x11v\x07(6\xd0S\x09\ l\xd9B\xeb\xefC2\x13\x86\x931\xbf\x97kTA\ \x19I\x14\xb4l\x0d\xb7\x16\xd4We\xe9J\xc1\xe1\xa4\ \xc8%IB\x13\xe9\x16\xde\xacD\xfe `\xcb\x96D\ \xf5/\xefD\xff\x00\xa8 u\x15$\x02,E\xc5\x16\ \x95\x1fZQ\x7fgf\x04\xa0\xcc-\xa8\x1b\xd1\xe0\xb1\ r\xe1\x9f,we\xb8\xcf\x13|^\xdd\x0d\x1c24\ R\x07M\xc5\x5c\x9e\x1c>.!)\x05[\x9b//\ z\xa4\xfe-Q\xe2\x1c`>Xc\x8c\x04'\xef\x05\ \x8d\xea\xd7\x03\x8f6)gCx\xd0^\xff\x00\xb5J\ p\x9c7\xda\x04\xcd;\x16\x03_.\xe7\xad\x5c\x8a5\ \x89m\x0e\x97\xd4\x92=^\xe2\xb5%\xdd\xa2\xe7\xc5\x85\ $S\x01\xb8\xa4#f!m\x95\xed\xe9\xeb\xdcu\xa3\ \x0dc\xa9\xb5t`\xca\xeb\xd7\x02\x0dV\x9b\x14\xd1J\ \xc8\xf1\x03m\x88;\xd5n%\x9b\xebB\xe2\xdee\x17\ \xe6Ts\xf6\xefA\x87\xc4G0\xb0\xf2\xb7\xe1<\xe8\ \xf3kV\xea)\x80oM\xc8;\x11H\x11\xda\xf9\x97\ \xe7V%\xba\x13,jH\xf8\xd0~\xa2\xa1\xca\x90\x19\ He;\x11\xce\x8b\x0cT\x91-\xb5-\x94\xf2\xb5Z\ u\x06\x94\xc9X\xb0\xab2\x91\xc8|\x8d\x03\xe6\x03\xd2\ j\xc3-\xa8mYJ\xb9\x81\xedB\xe5m\xbd\x14\xb1\ \x95k[J\xe0\x05\xb6\x154C\xb0\x1dj\x01\xb8\xb8\ \xd0Q\xca\x97:iKTe;\xdcVjI\x02\xdb\ _\xde\x86P\x81\xa2v\x00\x05r\x09\xe9qDv\xae\ \xd0\x82\xad\xaa\xb0\xb1\x15 \xc8[5\x9cf\x1c\xc1\xd6\ \x80\x8f\x08\xf8\x90j\xa7\xd7\x1f\xf1D\x97\xcf\xe0\xbe\xac\ \xa2\xea\xdf\x8cT\xae\x8c\x0e\x97\x15\x17+$\xa9\x9e2\ H\xe6\x08\xda\x84\xadtQ\x04\xc4M\x97Eu\x0c\xa0\ \x1e\xf5$tcB'\x15+@\xea\x88\x80\x16\xb7\x9d\ \x85\xc51b`\xe5T4\x926\xef\xcc\xfbv\xa9\x0c\ \x1a<\xb2\x00P\xee\x0dT\xe3\x12\xcd\x87\x850\xb8|\ Y\x8dYs\x12E\xcd\x8d\x17\xae\xd2\xd4\x91\x88\x96\xf3\ \xba\xc6\xbd\xcd\xefUf\xe2I\x1d\xd7\x0a\xa4\x9bz\xdf\ \x97\xb5P\x88\xb1\xf2\xac\xcc\xe3\xf0\xcctoc\xca\xad\ \xe18x\x95\x81\x934\x00\x9d\x15\xacK{Vv\xdf\ \x0a\xb2\xe6\x91\xafb\xceN\xbc\xcd^\xc3p\xc9\x993\ J\xcb\x08#L\xda\x93\xf2\xab\xf8h\xe2\xc3\x8c\x98h\ \x80nn\xda\xb7\xf6\xaeyaV9\xe5$\x8d\xca\xae\ k|\xe9\x9c'\xd1\xaa\x91\xf0`\xe4\x01\x8cK\x9d\x00\ \xc8u\xaa3\x06\x8eF\x8d\xacr\x92/\xd6\xb7\xf0\xcd\ \x1eQ\x88\x0dx\xd2\xecI\x16\xda\xb1\x1cx\xd2\xb1\x03\ \xd6\xd7\x03\xde\x9e\x5cd\xf1Jw\x02\x84\xcb\x8d\x0c}\ \x11\xf9\x9e\xb7 \x8c\x04\x90\xa9\xd5\xa4\xd7\xb5\xa98\x5c\ 2\xe10\x8b\x11\xf5\xb6\xb2i\xf9U\xc4\x06\xf9\x94\x8b\ \x91b\x1bf\xe9\xeck|x\xe4\xc6mB\x92T\x16\ >f%\x9b\xb5\xff\x00\xd8\xa9\x06\x93\x01\xcf\x96U\x1e\ R\xa3\xf4\xb56\xb4\x04\x0dt\xa8&\x8f!\xb6a\xe9\ n\x86\x86\xf5 \xd2\x99\xec\x0a\xb1\x07qRO\xfcK\ \x8d\x8f\x82\xb6\xfa\xd5\xae \x83\xc38\x83\xb2\x0f8\xeb\ X\xf1N\xff\x00k8\x86BU\xae\x0e\x9aZ\xb1z\ j.\x8a5\xa1L\xae\x99\xa3`\xcb\xfaQ\x8e\x94\xa6\ \x86\x0ao\x16<\xacFu\x1aw\x14\xda\xce\x81\xccr\ \x87\x07cZL<\xdalu\x15\xb9Y\xa9\xa8\x22\xa4\ m\x5ciE\x95*n\xbfO\xe2\xa6\xe5\xd3)sf\ \xd8\xf4=h\x88\xa0e \xdd4=:\xd4\x95\xe3I\ e\xc4*J\xbeUbI\xb6\xfa\xd4\x7f\x88\xd4\xb6\x06\ 9G\xc2\xf6=\xaa\xccW\x08\x01\xb8\xae\xc6(|\x04\ \x88\xcbq\xa1\xac\xe7I\x82\xf8Id\x8f\xed\x09\x189\ \xc7\xde\xa0\xdd\xba0\xefV\xb0\x91x\x185\x8c\x9b\xb3\ \x9c\xe7\xf6\xa6f!\x81]-\xa5\xab\xac\x02\x15\x1b)\ \xba\xff\x00\xa4\xff\x00\xb3X\x93\x1a\xd7\x05\x0e\x8c\x8cl\ \x18Z\xfd*\xa3bLp\x18\x0a\xdc\xdb*\x91\xefV\ t\xcc\x09\xda\xd5.\xb0\xbc\xaa\xcd\x18b9\xd5@\x97\ ;F\xac\xc1Ae\x04\xde\xa0\x829\xaf\xbd\xa8\x9d\xff\ \x00.T\x05\xa9N\x1a\x0b\x0b\xf75(\x03]\x18h\ \xc2\xc6\x82\xfa\xd7J\xe68\x19\xc6\xe3A\xda\xf5'F\ -\x87A\xcc\x5c~t\x13\xab\xf8\xab\x88\x8c\xdd\x90y\ \xd7\xa8\xa6@\x19\xf0\xf1\x04\x17%-\xa7Z\xb5\x86\xc2\ (#\xc6$\x96\xd3(6\xb5\xea\xcdJnA\x01\x94\ \xddX\x5cP\xd5\xfc:\xe1\x9e \x828\x83Gqf\ <\xafJ\xc4\xc3\x87\x22\xf0\xc8\xa5\xbf\x00\xd6\x9cZ\xab\ M\xc3\xcab{\xee\xa7B:\xd2\xb5\x04\x82,jw\ 4\x16\x9cF\xf1\xa9\x06\xe0\xech\xefT\xb8{\xb3F\ P\x1fI$\x03\xd2\xad\x8a\xdc\xac\x982\xba\xe5qq\ \xf9\x8e\xe2\x97,\xb2\xc5 I\xc9\x926\xd5_\x98\xf7\ \xa2Zb>Srt:\x1aP\xa3\x7f(+\xe6\x1e\ \xf5\xd8\x88\xd7\x11\x1f\xf5\x0d\x8f\xecj\xbe,\xf8\x0c\xb3\ \xc4r\x82l@\xf4\x9an\x16_\x19Ke\xca\xcb\xbd\ \xb9\x8a\xb7\xe5\x0aH\xae\xd2\x05OU\xf4\xab\xe2V[\ .#\xca\xc7f\xf8[\xe7\xd6\x95,F,@\xc4G\ r\xb7\xf3-\xefjk2\x11cb\x0e\xd7\xe7T\x98\ \x85r\x06a\xb7QI\x90\xe4l\xcb\xa2\xc8lG,\ \xddjV$V\xcc\x85\x93\xfd&\xd4\xbcD\x02ML\ \xd2_\x95\xf5\x15]C\x06\xf4/B\x09\x03_P\x16\ 6\xd9\xbb\xd4\x92\x0a\xdf\xad\x04\x04\xde\x81\x85\x11\xde\x85\ \xa8Aa\xa5%\xc6\xb4\xe64\xa65\x94L\x82\x96i\ \xce9R\xd8kS@aBE\x19\xa1\xac\xa2\xe7B\ \xf1fSi\x22\xd5O\xedR\xb9e\x8de]/\xbd\ \xb9\x1a5\xd1\xae9R\x9e\x19Rc&\x1e@\x81\x86\ \xa0\x9d\x8dE\xd3\x12\x98\xac9 \x9c\xcaA\x15\xd7c\ {\x0f\x9d20\x14\x16\xbey\x1b\xd4\xe7\xf4\x1d\xa8X\ \x00.6\xe9B,)\x1b\xd5O\xf1\x08o\x16'\x03\ \xcac\x02\xfe\xd5|\xedJ\xe21x\xbc=\xf6\xcd\x17\ \x98\x1e\xdc\xe8\xb3\xa5\xac\xfe\x0b\x1a\xcb\x8eQ \xb8\x00\ \x9bV\xb3\xbf\x8a2\xc9\xe9\xf8m\xf0\xfbVg\x046\ \xc7\x82\x7f\x09\xfd*\xfa\x99]\xc8\x81c\xc8\x86\xc5\x9f\ \x99\xa3\x87\x8a\x8dVv\x19g\x99Z?\xe9\xf57c\ MW\xd3.U\xc9\xf8m\xa5\x0a\xa9c\x94\x80\xaf\xbe\ Pn\x1b\xb85\xda\x83b-[\x05q)F\x1f\x02\ \xd8TV\x19\x9a\xe0\xf2*u\xa5\xff\x00\x87\xe2\x0d\x88\ i\x98]b\x17\x00\xf3<\xa9\x9cc\xccrX\xe9\x11\ \x00\xf2\xba\x9f\xe2\x8f\x81\x9f\xff\x00\x1d%\xbf\xf7G\xe9\ G\xff\x00G\xe2\xf09\xef~t\xd8\x90\x0f\x88\xe9\xa9\ \xa4GG\x88|\x98)\x9bc\x96\xc0\xf75\xb6\x04\xa5\ @\x01T\x01\xca\xc2\x8a\x92\x9a\x0f.\x9d\xb9\x1a`a\ `z\xd4\x85z\x91@\x0d\xe8\x85I\xd3X\xe0\xe6V\ \x1a:e\xff\x00\x7fJ\xa2\x80\xc5\x12F\x0e\xca/\xde\ \xaeb\xce\x5c\x04\xff\x00\x89\x92\xca;\xd5\x18$\x12\xc4\ \xac\xcc\xaa\xca,\xe0\x9bZ\xab\xe9\x89\xca\xab\x8b\x81\x96\ \xca^\xf9\x80\xd8\xd3N\xf4\x99\xd1\xe6d1\xb0DM\ \x9c\xf3\xee\x05\x1f\x88C\x85\x94z\x8d\x84\x8b\xb1\xf7\xa2\ \x13+O\x0c\xd9\xb0\xc8\xdamcY{\x1b\x1d\xc5_\ \xe1\xcc\x0e\x19\x97\x9a\x9b\xd6\xb8\xfa)\xe4\xd7\x03Q]\ [\x02\xae5\xc2\xba\xa4\x1a\x923D\xeb\xd5H\xa9\x22\ \xba/X\x1dt\xa92i\x8b\xa8\xf7M\xbd\x8f\xf7\xa8\ \x98e\x91\x97\xa1\x22\xa0\xb8F\x88\x9d\x03\x12\xa7\xe7\x5c\ \xcb\x98\xe9`7\xae\xf4\x8bW5\xd5\x85\xc5\xb7\xa1&\ \xf5$1\xae\xd0+3\x1b*\x8b\x9a\x93PP\xc0_\xf8\xa8\x82\x19\xe1\x95\xb2\xa1`y\ \x06\xe7Wp\xf8L\xe8|m\x10\xfc6\xd4\xd0C\x85\ \x18\x84\x0eUT!\xf2[O\x95[\xc3\xc8\xef\x9d%\ [<|\xfa\x8ad\xfe\x8b]\x0cqa\x80H\x97,\ o\xb1&\xe5[\xdf\xbd\x17\xa5\xaeF\xa0\xd4\x92,A\ \x17\x07q\xd6\xa2\xc4(U\x90\x10?\x1a\xdfN\x97\xde\ \xb6\x19\xb8\xf8rb,\xb7!\xc5\xc5\x0eY\xb0\xd2\xab\ \xb2\x15#QqW\xd29<\x7f\x1aVK\x80B*\ \xebj1{e6 \xee\x0e\xd5\x9c:\xcb\xc5\xe2\x13\ \xc4\x0e\xf192\x0b\xf9\x0d\xea\x22x\xe5\x04\xc6Na\ \xba\xb0\xd4S\xf8\xb8\x5c,\xb0\xcf\x1a\xddB\x90\xca\x0e\ \xabz\xcdw\x93\x11\x8e\x0f\x87R\xadn\x7f\xa9\xac[\ \x94\xc5\xfc\x1b\x14\xc4\xa9\x02\xe0\x9biW\xa3\xf13\x9b\ \xdc\x0e\xf5G\x0eY]ZP\x8db\x09h\xf9|\xab\ Q\xc7\x98\x90A[\xe8Eo\x88\xa1\x19\xba\x8f\xa5\x12\ \xb6\xe0\x8a\x8a\xe5\xf5\x8fz\xd0\x06(,\xa5p\xcb\xa1\ \xbd\xd8\x81\xb53\x0f\x141\xaeX\xc3+\x1d\xc95S\ \x0d7\x87\x8dq)#5\xc15p\xd8\xe8u\xf64\ O\xea\x10r\x0d\x8e\xff\x00\xad\x0e\x89\xa0\x07\xc3\xfa\xe4\ \xfe\xd4\x19n\xc73\x1d\x0e\x95 \x10tf\xa5\x08\xf9\ @ \xdd\x08\xd0\x8d\xa8X\xd0\xc8Y\x15\x98\x05*}\ c\xf7\x15\xcel\x05\x8d\xc1\xd8\xf5\xa9!\xbdT'\x7f\ z\xe6:{\xd0\xb16\xd3qYN4-D5\x17\ \x1bP\xbd\x15\x16\xc7z\x07\xda\x88\xef@\xf4 \x9a\x17\ \xa2\xa1j\x9a\x03\x0a\x13GBE\x15\x06\xd5\xc4\x03\xa5\ I\xd0W\x0c\xdd\x85\x08 \x11\xa0\xd4T\x10I\xd6\xd6\ \xa9bF\xeb\xf4\xa3X\x99\x975\xac\xb6\xf5\x1d\x05H\ \xa5`\xd5\x18\x86X\xb0\x92\xbb\x91\xe6R\xaa\x0f3J\ \xc4b \xc3|BW\xe4\x14\xe9\xf5\xaa8\xa9\xe7\xc5\ 8\x0eo\xaf\x95@\xd2\xb3ya\xc1\xf0x\xd9\xf1z\ rF\xb9\xe9\xa5h\xc2\x99!d\xb5\x8a\xc9\xaf{\xed\ C\x81\x80\xe1p\xc5Z\xde$\x9e\xa1\xd0S\x88b3\ \xa2\xe6`,\xcb\xf8\x87\xf2)\xe32+C\xe5e\xc8\ \xe2\xeb\x7f\x98\xf6\xa9\x80;\x19\x22c\x9aH\x9a\xdan\ E(\xca\x89\xe6l\xe0wKR\x10\xc9\x89\xc7\xb1R\ c\xcenH;\x0a\xb5b\xdf\x12* Ev\xca\xea\ I#\xaa\xda\xc6\xff\x00-~U_\x81N#\x99\xb0\ \xf2\x1b$\x9a{\x1eUn\x18\xa0\x89\x83\x14\xcey\xb3\ \x9dMcq\xbcF'\x09\xc5\xa5\x82\x19YbCt\ \x17\xe5\xca\x8e]v\xa7\xf1\xbcd\xcbp\x07\x9a\xfc\xc6\ \xd4gX\xd5\x5c\x96V{\x9bt\x03_\xda\xab\xae5\ %\x8e'\x926f\x960\xc0\x82/\xd3_\xa5XR\ \xe0\x16u\xc8XeU\xe6\xa3\xbdt\x96VR\xba\x0a\ \xeb\xdbm\xb9\x8aYk0\x1c\x88\xa9'CR\xc3\x97\ \xda\x8a\xe1S3\x9b/z\xab,\xa20\x19\xda\xecF\ \x8b\xfc\xd5w\x9aIH2\x1dF\x80\x0d\x80\xa3b\xc3\ \xa6\x99\xa5\x92\xe3E\x1b\x0e\x94$\x86>uV=\xc5\ ,\x1a+\xd1\xa4E\xaeu\xa0\xc6\x100O~\xa2\xde\ \xf4W\x19\x80\xe6j\x9f\x13\xc4#H\xb0\xa99W\x9f\ \x22j\xb7\xa5\x17`r\xf8h\xdd\x8d\xc9\x1a\x9a\xbb\xc2\ [\xef\x99\x09\xf5.\xddMd\xf0\xb7\xf2\x11\xda\xf4\xd8!iee\x03E\xb2\xdf\ \xa73\xfb}*\x93b\xe7\xd1DJ\x19\xb4\x0dj\xd9\ \xe1\xd1xX\x04Q\xab\x90K\x9d\xf5\xa7\x8ftQ\x80\ \xaa\xa1\x14YWj\xed\x06 r/\x1f\xd6\xc6\xa4\x82\ 7\x04PI\xa6+\x0c{\x91]\x00\x8e\xd45&\xd6\ $\x9b\x00.OJ\xa3\x89\xe2E^\xd0\x22e\x1f\x13\ \x0b\x93E\xb2%\xda\xe1\xa9\xb5V\xe1\xf8\xdf\xb4J!\ \x95P3zYE\xb5\xe9j\xb2\x18(.M\x82\x82\ oT\xb2\xa5\x0e4|D\x9dA\x16KX\xf5\x02\x93\ \x1ck\x04b4\xdc\x80Y\xb9\x9a\x949\x99\xcbZ\xc5\ Ik\xed@\xaf\xe2C\x1c\x82\xc72\xebn\xdaV>\ \xebFC\xa4\xab\xee+FB\xb0\xe2\x80\xd5c\x92\xe0\ \xf4\x06\xa8`T>25apZ\xaf\xe2T\xc9\x87\ q\xf1\x0f0\xd2\xb5<\x14l\x086<\xab\x85\xb5c\ \xb2\x8b\x9a\xa7\x1e.a\x95\x06V;\x00V\xe6\x9b\x8a\ \x13\xb4*\xc5\x95\x90\x1b\xba\xa0\xb5\xbd\xe9\xd0\x08\xf0\xc6\ `f\x95\xca\x97$\x81j\xb6\x00>[\x82\xca5\xbe\ \xf5\xceA \x8fI\x1e_j\x16\x8d\x1ee\x94\xb3\x06\ Qo/:\xb1\x05\x1a\xc4\x8b\x12)\x9b\xebA\x89\xb7\ \xa8is\xadDLr\xdb) s\x15!^\xc6\x84\ \x00\xb9\xd1v\x048\x16\xd8\x1a\x92E\xed}h&W\ b\xad\x1bZD\xd0\x03\xb3\x0e\x95T\x82hI\xa5}\ \xad\x09*\xf0\xb0k\xec\xa6\x8f\xc4\x87\xf18\xee\xc8@\ \x15\x9dC$\x8b\xb5\xc1R\x06\x9d\x08\xff\x00\xcd\x09R\ v\xd6\x85\xf1\x18t\xff\x00\x98X\x8e@h~uJ\ X\xf1\x0e\xc6a\xa6m@\x07QU\xa7\x16\xa4\xb20\ V\x04\xb3l\xa3z\x16#6B\xa5\x09\xf4\xdc\xdc7\ \xce\xab\x0cTXX\x8ep^V\xe5\x7f\xd6\xb98\x84\ 3D\xe9$E4&\xe0\xdc\x0a\xce\xac<\x8b\x1b\x1a\ \x83A\x0c\xa1\x80I\x18k\xe8\x93\x93\x0a6\x04\x0b\xee\ ;kI\x06\x80\x16;(\xb9\xaa\xd8|S\xc9\x89\xc9\ '\xa1\xcd\x80\xfc5e\xf2\xb4N\xa4\xd82\x91~\x95\ \x99.\x1exN\x7f\x84\x1fP:Vyi\x8d\x09\x06\ Q\xdc\x1a\xe1r.E\xa91\xe3\x22h\xc3J\xcd\x9c\ \x0b\x1b\x0d\xe9\xb0I,\xaa\x1dc\x8e8\xfa\xb6\xa5\xa9\ \xd0\x0c|\xc7\x0d\x84VP\x0b\xbbX_[\x0a\xc9\x96\ Y$\xbew-}\xeek[\x89+\xbe\x04\x93\x87\x8d\ \xb28\xb5\xa4\xeb\xde\xb2d1\x89\x04r+B\xcd\xe9\ \xb9\xba\x9f\x9ds\xe7\xe9\x85\xac-,\x81bBI\xe5\ [8,2ac\x1b<\xbc\xd8\x8d\xbd\xa9|\x163\ \x16\x1eI4\xcc[(\xedO{\x8dG:x\xcc\xed\ T\x9d\xf5:\x9a\x9fj\xe5QmE\xfb\xd7Y\xbbV\ \xc0\x96G>]Z\xdc\x9bQU\xe7\x88A\x8f\x8d\x97\ (\x0fk\xad\xce\x9dE>0U\xee\x0d\xef\xbf\xf3T\ JH\xb8\xc0\xa430m\xba\xd1L_XJ\xcd\x96\ \xf7\x0aM\xcf@+\x17\x8d\x83\x8f\xe3\xea\xb1\x82\x04\x81\ ~U\xa3\xc5x\xb6\x0e\x0c\xf0\xa5\xe4\x91\xbf\xcc\x03a\ \xda\xaa\xe1ch\x10\xe2&\x00b'\xd4\x0b\xea\x8ak\ <\xb2\xf4\xa2\xfe\x04\xabc\xceP2\xa4d.\x9d\x06\ \xf5dX\xefTxA\xff\x00\x89o\xfe6\xfd*\xe0\ 5\xae>\x0a\x0035\xce\xc3n\xf4^UFv\x1e\ U\x17\xb7SE\x90\xa9\x0au?\xadV\xe22\x02\xc2\ % \x85\xde\xdc\xcd7\xa4D\xae\xd29f7&\xb8\ T\x0a\x90+\x0d\x0dM\xa9\x80\xd2A\xb5Njt`\ \xb1\x12\x98\x85\x94]\xdcYG\xefT\x1b\x09\x89\x92u\ A\x13\x0d7#AW\xdc\xf9\xe6k\xf9\xae2\xf5\x0b\ m(\x92F\x0b\x94\xb1\xef\xad\x16j\xd0\x88\xca E\ M\xb7n\xb4\xf0u\xa0\x0dD\x0dn\x05\xac\x1e'\xc3\ \x19\x1c]9[qZ\x09b\xb9\x94\xddz\xd6:\xd3\ `\x95\xe27F#\xb5jQ\x8dE\xd3\xdb\xf4\xa2\x1b\ \x8aF\x1f\x15\x1c\x9a?\x91\xbf#N\x22\xde\xd5\xb8\x04\ E\xe8H\xa2]\xaamz@-}\x0e\xaat\x22\xb3\ q1\x18\xa5+\xcb\x91\xebZ\x85t\xa0\x91\x12D\xcb\ \xb8\xe5\xd4Vl\xd3+/\x99\xedR\x85\xafe\xd4\ \x9a\xb8\xd88\x80\xb8w\xbd\xf4\xd2\x9d\x1cQE\xe8]\ \x7f\x11\xde\x8f\xcd:\xa7\x88\x85\xd2\x14\x91\xf5`y\xfc\ 4\xcc,N\x22%\xdd\x95[e\x06\xd7\xa7\xcc\x03d\ \x8d\xbe#\x98\x8e\xc2\x86G$\xf7\xab\x02\x02[D\x96\ E\xf9\xde\x97\x1c2}\xa5d\x92\x5c\xc1u\xbf:,\ \xda\x5c\x9a%4\xa2\xf8\xab\x95\xc0\x1b\x7f\xcckV9\ \x17\xda\xb6\xb1\xe9\xe2\xe0\x1dF\xe9\xe7\x15\x8ck\x1c\xfd\ 18B\xcb\x8a\x8d\x94\x90C\x8dkk\x88\x9c\xb0\xcd\ a\xb9\xcb\xf9\xd6\x18b\x08#q[x\xe1\x9f\x08\xc4\ \x10n\xaa\xd7\xbe\xfak\xf9\xd5\xc7\xca\xaf\xac\xb2\x85\xe0\ \x960E\xd9\x0d\xbf_\xda\x87\x0e\x99pq\x03\xcc\x16\ \x16\xe8i\xd10RX\xe8\xa1M\xc9\xe5\xa5\x097\xca\ \xb6\xb1\x08\x05\xbeU\x13xq\xb66\x22\xd6\xdfz\xd2\ \xbeSs\xcbz\xc9C\x96E'\x91\xb9\xadI\x08c\ \x9b\x93kZ\xe2*\xa3\xdb\x0d\x8fY\x009\x0bf\x1e\ \xd5a\xb1\x10\xa4lC\x86&\xf6Q\xce\xf4\x18\xb4\xcd\ \x11\x1b\x91\xaa\xf5\x15E-\x9dsm~tx\x9aX\ \x5c\xdfd\x8f6\xfa\xdb\xda\x8a\xe6\xf6\x16\xbf~T3\ \x92$\xb2\xb5\x94\xed\xd8W\x0b(\xb0\xf9\xd6\x82Xf\ \xf5\x12}\xb4\xa9\x16\x0baC\x9a\xa4\x1b\xd4\x9c\xe7c\ \xd0\xd0\xb07\xbdI`|\xa3s\xa5\x11\xb0\x1a\x9b{\ \xd4\x80Y\xaf}\x01\xebm~\xb5\x05\xd8\x0f3\x5cs\ \x07QRY:\x8e\xe7aI\x9f\x11\x85E9\xdeM\ \xb4\xfb\xb2/\xf3\xa1*q\x18\xd5fS\x10\xb8\x93`\ 9\x1ad\xb8\x94\x8a \xcb\xe6\x90-\x89\xbf\x95,9\ \x9a\xab\x89\xc6\x99/\x1a\xa6D\xe5f\xd4\xfc\xeb7\x1d\ \x02*\xc7\xe13*\xc8\xd6*Z\xff\x00:\xe7yg\ \x8dHc\xa9\x99\xcb\xa4\x89+\x1d\xf2\x9b\xd0\xba\xb4x\ i\x8b\xa9\x19\x93(\xb8\xb5\xc9\xa3\xc9\x0c\x0f\x91 C\ \x94\xd8\xb1\xbd\xcdA*\xba\xacD\x13\xb1r[\xe9z\ \xcbH\xe1\xe2L<\x19'pP\x9b\x15\xdc\xa5\xf65\ w\xc3\xc4a\xe3\xf1\x95\xac/ku\xaa1\x0f\x10\xbc\ m\x7f:\x9b\x9b\xfc\xe9\xff\x00\xe1\xe9\xc60\x0c<\xcd\ \xe6\x88]n}B\xa9\xfc\x15x\xd9\x91X\x8b\x07P\ H\xe9B\x9eG\x22\xe3^\xb4\xd9\x83\x03f\x16=)\ l\x9d\xf5\xae\x81^|(|u\x94\x05R\xa1\x9b\xb5\ X6\xb0U\x16U\x16\x15(\xa0H\x0d\xcd\xda6\xbf\ \xc8\x8b~\xf5\xce\xcb\x04Fil\x00\xf4\x83\xf1\x1a'\ I[\x8c\xb8\x8f\x06 \xbf\x9aC\x98\x8e\xd5\x9b,&\ `\x98{\xfaHwb==\x05\x14\xaf&'\x11\x99\ \xdb\xcc\xc6\xde\xd5\xab\x81\x81S\x0e1\x0e\xbewve\ S\xf9\x13\xf2\xae\x7f\xedO\x82\x0a#\x88&\x97>f\ \xb5u\xafDA-s\xa94J-\xef]p\x01\x12\ \xc6\xf7\xd3\xa5\x11\x14V\xae\xa9\x04!$\x00\x09'\xa5\ T\xe3s[\x0c\xeb\x86e3\xc6\x9fx\xc3\x9a\xf4\x1e\ \xd5g\x1f+A\x81,\x9a4\x8d\x92\xfd\x05\xab7\x05\ \x1f\x8d!B3\x07\xd1\x87Q\xbf\xec\x07\xce\xb3\xca\xfc\ 0\x8f\xf0\xde\x03\xc5\xc5}\xa7\x14\xb6Fo('W\ 5\xb4\xf1E3\xf9\xb0\xebr~\x0d\x0d\x09\xc2\xb7\x88\ \xae1\x08\x85=*\xaal\xbd\xab\xa6Lc\xbeQ*\ \x88\xce\xec\xa2\xc2\x8e3\xf33\x15\xba\xad\x12\x18\xf8\xa0\ \x8e'\x06\xcf`j\xe3j\xc7.\xd7\xd2\x97\x1e\x124\ \x90\xc6\xb1\ 1\x89\xe1b^?\xc2H\xadh\xc9>\xe4\xda\xb2\xf8\ \xc3+q\x19\x8a\x9b\x8c\xd4r\xf0\xf1\xf5^\xf5s\x07\ \xc4\x0cqx2\xa0t\xd8\x1ej*\x8d\xcd\x1e\x1f\x0f\ 4\xe6\xd1\xa5\xc7S\xb0\xacKg\x8dU\x9c\xd0\xb3\x08\ \xcb\xe4\xcbb\xca\xfaf'a~\x95\x0e\xcce!\xd4\ \x8b\xebs\xce\x87\x89p\xb7\x91Q\xc4\xd1\x992ee\ #G\xb6\xc2\xfc\xa98a\xc4p\xa9g\xc2F\xd1t\ \x12\xde\xfe\xd7\xa7n\xf6\x16\x01\xab\xfc>l\xf1\xf8-\ k\xaf\xa3\xbfj\xce\x8f\x11\x85\x90\xd9\xcb\xe1\xdf\xa3\xa9\ \xb5\x19\x93\x0c\x84\x13\x8c\x86\xfc\x80{~\xb6\xadJ\x9a\ \xc0\xd8\x827\x06\x96\xf8l36l\xac\xb77!N\ \x87\xf8\xa4G\xc4\xb0\xf2X\x11c\xd4\x87\xf3{\x1bZ\ \x8f\xed\x98[^\xed\xedc\x7f\xa5\xab[\x19\xcas\xaa\ \x93\xd3KoQ\xcb\xb8\xa5.&\x16\xbd\x96@\x06\xec\ \x086\xa1\x97\x13\x02Y\xbcL\xf7\xdc.\xf5lG\x0a\ %\x22\x90\xb3\xc6\xe2\xe8I\x1c\xef\xb8\xa3\x92ha\x8b\ \xc4\x95\xec\x0e\xca\x06\xa6\xadF\xb1_\x9fj\x8b\x80o\ \xcf\xa9\xac\xe9\xb8\xab\xe6\xfb\x98\xa3U\xfe\xa1rk\x93\ \x8a=\x8f\x89\x04o\xd2\xde_\xd2\x8f\xd49W\xa5b\ \xaf\x98\x12;\x8aW\x15\x7f\x17\x86\xc8I\xb9\x0e\xb9o\ \xb8\xaa\xe7\x89\x86[}\x95\x07\xfdf\x93\x8a\x9eLQ\ \x16P\xaa\xa3\xd2\x0e\x9e\xf4^S\xe2\x92\xaa\x85,@\ \x1b\xdcU\x9c\x16\x08\xe2\xe4\x13\xb0\x0b\x1cw\x11\xe6\x1a\ {\xf7\xa8\xc2D\xcf2\xf8Vw\xbe\x83[\x03\xdc\xed\ Z\xcf\x00\x8e4\x89\x1a\xe25\x03\xdc\xf35\x9e'\x07 \ \x12)S\xf0\xb0:\x1fcZ \xda\x98\xcb\xf6\x9c\x1c\ \xb8c\xa9\xcaZ=y\x8f\xf7\xf9QxO\x8bA\xc3\ q_k\xc3\xb4R\xff\x00\x9b\x1a\xdd[\x9b\x0avj\ \xc4\xc1Np\xf8\x94\x94|'^\xe2\xb7J\xab\xc2\xb3\ \xc5\xacm\xff\x00\xd7\xb1\xab\x8d\xd8\xab\x81\xa3SK]\ \xefD4\xad\xa3\x95\xc6\x5c\xac.\x0e\xe2\x95\x89\x86I\ -\xe1\xc8\xce\xa3\xe1f\xd4{W^\xa4\x1e\x86\xa1\x83\ \xc1&\x1eL>R\x80\xc8\xbe\xa1\xb3TO\x86`3\ \xc2\xec\xd6\xd4\x83\xb8\xa2F%\xc3\x05\xbb\x01`F\xf5\ o\x0b\x0b\xe6\x0f%\xd4t\xe7Z\x93U\xe8\x1c\x17\x14\ \xf9\xb3O\xe6E\xd0\x13\xb8\xadeee\xcc\xac\x18\x1e\ b\xb3\xe7\x846(\x22yU\x85\xfb\x0a8\xe2\x9e\x07\ \xcd\x13\x09\x0709\xfc\xab|v3Wt\xb5\x0b\xca\ \xaa\xf9\x0c\x8b~\xe3j\x1c\xd7P\xc0\x11~Gq]\ \x98,\xb76\x02@\x06c\xc8\x8eG\xde\xb5\xa0\xacv\ x^\x1aJ\xad\x9br\xbc\xa9\x1e\x22\xc4\xaa`\x91\ \xb3\x11g\xb8\xa9\xe2Q\xa2\x15e\x00\x16\xbd\xc7*>\ \x1c\x88\x22\xf1H\x05\xb3[^U\x9f\xa5j&I#\ \x0f\x1f1\xa8\xe9I\x9do\xa8\x1a\x93F\xdeo2\xd9\ \x5clmo\x91\xedI\xc6I)O\x0d!eo\x88\ \x8d@\x1d\xa9\xa11\x80\x07#z#\xf9\xf2\xa4\xe1o\ \xe0\xa5\x81\xf2\x5c\x1f\xf7\xf3\xa6\xa1\x0c\xc4\xd1\x10\xd0\x88\ \xa3i\x0e\xbe\x1a\x96\xac)\x1b3\x96;\x93z\xd6\xe2\ rx|9\xb6\xbc\x87'\xefU\xf8T(\xb0\xfd\xa1\ \xd4\x16ce\xbf*\xcf.\xee5:\x80\xc1`L\x8a\ $\x95\xb2-\xf4[jkDeT\x08\x8b\x95\x06\xc2\ \x96\xceI\xb95\x19\xe9\x9d\x0bt\xc0\xd6\xda\xdf1C\ *\x89.\xca\xc5$\xfcC\x9f\xbd\x0em*\x03T\x15\ \xe7R<\x93F;\x159O\xc8\x8aW\x85\x87\xfc3\ \x7f\xfe\xe6\xae\xbb#\xa6W\x19\x87nUVH\x98\x5c\ \xa0,?1E\x87I8l\x16l\xc2\x19/\xd7\xc5\ 4f4\x90\x91\xe2\xba_k\xd8\x8f\x9d\xa8\x0b\xdb\x90\ 4%\xbb\x0a:!o\xb4aX0$\x03\xb1\x1b\x1a\ \xbb\x82\xe2\x10\xc8\xbe\x1c\xa1\x22p=EFSU\xc4\ \xc4\xc7\xe1\xbd\x99:\x1a\x19p\x0e\xcb\x9f\x0f\xf7\x8b\xd3\ \x9dSg\x87\xff\x00V\xf1s\xc1\x14\x82h\xd9d\xcc\ \x9a\xaalu\xb5g\xcf;\xca\xe5\xdc\xdd\x8dHVU\ UpT2\xb2j9\xdc\x11\xfb\xd5v$\x12\x0e\x96\ \xa3\x95\xaaA\x86\xa2\x07\xa5)N\xb4kY&\x03\xf9\ \xd5\x84\x8c\xbc\x820\xb9\xb2\x90\x15m\xa36\xe4\x9e\xb6\ \xa4D\x06`[\xd25>\xd5\xab\xc2\xa3)\x84\x18\x89\ W\xef$b\xc9q\xa8\x07\x9do\x8c\xd1j\xd4\x00\xe1\ \xe1\x11\x83\xe6\xb7\x9c\x8e\xbd*C\x03K\x1b\xd1\xa0\xd6\ \xba0\xe2\x0fJ\x13\xa1\xa6i}\xea\x1b(\xd4\x91\xf2\ \xab\x11zT\x15\xa6\x05\x0c.*J\x91R!\x85\x01\ \x8b\xef!\x04x\x99\ \x10\x03er\x07\xb5;\x05\x8a\x9f\x0a\xf7\x8aL\xb9\xbe\ \x13\xb1\xad,F\x1f\x0b\x8b\x9c\xcd/\x8b\x1b\x9fQ@\ \x0ec\xd7Z\x98\xb0\xbc>\x16\x0c\xb04\xac\x07\xaaV\ \xd3\xe9X\x9cl\xa7J\x8b\x8b!\xb0\x9b\x08\x84\xfcE\ \x09\x1f\x96\xd4\xf4\xc6\xf0\xf7[\xf8\xb2\xc6z2f\xfd\ *Z<$\x82\xcf\x83\x8c\x5c\xef\x1d\xd4\xd4E\xc1\xe0\ \xc4K\x9b\x0f#(\x06\xe5\x1fo`ks\xf4\x0f\x89\ #\x98\x06\x86ee=t5m0\xf8D\x8d^Y\ \x90\xdf\xab\x7f\x15\x9b\x8b\x86h\x9f,\x91\x14\x03am\ \x00\xa4\xd3\xb9\xf06\x863\x05\x18\xca\xb3\x10\x07%\x8f\ \x7f\x9dp\xc7\xe0\xd5\x0c\x85\xa4\xb2\xf3\x22\xb2\xe0\xc3K\ *fX\xe4a{yV\xac7\x09\x92X\x8cR\xc8\ \x89sq\xe6\xd4{\x8a\xd6\xf2\xf9\x06E\xa81\xf0)\ - \x92\xf2\x0b\xdf\xa0\xa7G\x8f\xc0\xb7\xfc\xe6\x07\xba\ U\x01\xc3\x8c\x91\xae|B)_!\xb0:\xda\xa3\xff\ \x00M`r\xa6\x223a\xbe\xa2\xf5K\xc9dl\xa1\ Y\x174R,\x83\xaa\x9b\xd7_u\x22\xe0\xee\x0db\ \x9c\x166#\x9e?1\xe6ck\xfdi\x90\xf1LD\ DG\x89\x842\xed\x98\x8b\x1f\xad?\xaf\xe8\xc6\x89\x86\ \x03\xaeC\xa7\xf5iS\x9e5\x5c\xaa\x00\x1d\xa9\x11b\ \xb0\xf8\x96\xc8\xb2\x80\xc0^\xcd\xa7\xe7OX\xd9E\xd5\ .:\x8di\x9f\xf1\x09\x1e\xe3E5!\x9f6k\xdb\ \xe7K\xcfj\x8c\xf7\xab@\xdaE\x8aG2\x12\x16B\ \x18\x1066\xb5\xa8#\x99\x1a{\x05t\xcd\xe9\xcd\xb3\ Q&v\xf4\x82~W\xa5b\xe4H\x94\xb4\xee;(\ :\xdf\x95E_\xfcD\xf7X\xa0\xda\xc31\xf74\xdc\ <\x80``\x04X\xe4\xe5\xefYSb\xa6\x93\x16D\ \x90\xabHA*\xf9\xb4\xb7Z\xd2\x0d\x96\x18E\xf3\x11\ \x18\xcd\xde\xb3.\xdbNtfu\xfcU\x19\xd6\xfa0\ \xa5\xddM\xedj\x02|\xd6\x14\xeaX\xcdj\xe7c\x94\ \xd8\xda\x96I\xa8k\xe54\xa3\x81\xb0\x16\xe9P\x5c\x82\ \x08\xde\x96\xadqS\x98\xdc^\xa4\x99`\x8e\x7f19\ \x1f\xa8\xd8\xfb\xd5\x82\xab\xe3\xd5\ \xef\x0c\xab\xa1\x0d\x97\xde\xb3L\x1b\x95\x0f\xa6]\x09+\ ~T\x82\xc4\x9b \xbd\xb75bE\x01\x99@\xd2\xfb\ R\x9b\xca\xa4\xa8\x1aP\x00z\x8a\x8a0\xa0\x0d.{\ \xd0\xb0\x00\x5c\x9d*:\x12+\x90\x90t\xf9\xd4\xfbk\ P\xdb[\xadE%\xcb\x02\xa2\xd6\xe7ak\xd0\xe2#\ Y\xa1\x11\xb3\xe5\xb3\x5c\x1b^\xa4\xda\xdd\x85B\x92X\ \x007\xa9\x13&\x0b\x0e\xb1\xb4\x9e$\x96Q\xcc\x00\x0d\ P\x9c[\x13\xf6\x8f\x133\x0fM\x86\x8b\xf5\xab\x5cR\ l\xcf\xe0\xaf\xa57#\x99\xaae\xack\x9d\xcd\xe8\xc0\ \xe7b}c\xfe\x91@\xcc\x11\xb4\xdc\x8doD\xc06\ \xbb\x1eD\x0a\xe8\xa1i\xb1H\xa4\x8b1\x02\xb3I\xf3\ O<\xa9\x95\xa4%\x7f\x08\xa4S\x0dqS\xae\x97\xf9\ \xd3\xa8\xba\x90(\x97Sc\xa1\xa2\x0aN\x9c\xea@\xb5\ \x10Z$\x0d\x94\x92\x01\xb1\xd4s\xa3\xcaJ\x82\x96\xf9\ \xd4\x8b\x17\xa9\xa6\x15\xe9P\x16\xacA\x15\xa9\x87O\x0b\ \x0e\xa9\xf17\x99\xbfj\xa5\x84\x88I\x89D\xd8\x13\xad\ h\xb0\xbb\x93\xca\xf5\xbe0Z\xe5w\xcb\x96\xf7\x1d\x0e\ \xa3\xf3\xa8l\x84\xdd\xa1\x88\x91\xcc\xadH\xf6\xae\x22\xf5\ \xa6P]\xed`\xc4\x0e\x83JS\x13z2-B\xd5\ \x17\x06>!\x1f\x0c\x9a\x8e\xcd\xd2\x96X\xe753\x06\ 1\xa2%\xb3<\x82\xd7\xed\xadt\xa6\xf2\x16\x1dhB\ \x0cF\xa0\xda\x8f\xc5c\xeb\xb3\x8f\xea\x17\xa4\x13]\x9a\ \xadN\x97\x0b\x81\x94\xdc\xc1\x90\xf5\x8c\xd8\x0f\x95%p\ S\xc4o\x85\xc7\x01m\x81%i\xads\xb3\x11P\xb9\ \xc1\xd4\x82(\xe9%_\x8c\xaf4\x9b\xd8\x83K\x9b\x1b\ \xc4\xd1\xb2\xb4EOh\xe9\xd7\xa2YdQe\x91\x80\ \xe8\x1a\xac\xff\x00\xa9I\xa6\xe2s\xe8|s}\xbc\xa4\ R\x8e\x0f\x1c\xceA\x85\xef\xcc\x9a\xd1\x92Wo)v\ os\xb5C=\x97V6\x14~g\xf4\xea\xb4x'\ EG\x9d\xd0\x04$5\xbc\xc7)\xdfm\xaa\xd6!F\ \x7f.\xd6\xf2\xf7\x1c\xa9bQ}\x14\x91\xb1\xa8\x88\xe4\ /\x16bFP\xe9~]E3'\x819\x0d\xaf{\ \x1a\x94R\x0d\xc9\xbd\x0ej\x82\xd79A\xf7\xa9\x19z\ \xeb\xd2U\x9b5\x81\xd0u\xa3,\xdf\x87\xe9V\xac\x1d\ \xeco\xf5\xae\xbf*X%\xb4\x0b\xda\x89J3eY\ U\x98| \xebV\xa1#\xdc^\xf4y\xcd'U;\ {\x8a\x95k\x8au\x1a\x1a\xc6\xe3CI\xc5a\xd2b\ ]<\xaf\xd3\x91\xa2&\xc2\xf5\x19\x88;\x1a\x92\x83\x02\ \xad\x94\x82\x08\xe4k\x81\xf3\x5chj\xf4\xea\xb3\x80\x18\ Y\x86\xcdT\xa5V\x8eB\xae\xba\x8e\x87z\xc5\x8d.\ \xe0\xb1l\x06I.\xc3a\xd4U\xdc\x19_\xb1!L\ \xac\xba\x86\xd3\x9fz\xc5\x8c\xd9\x89\xd7Z\xb9\x86\x9d\xe3\ |\xc8\xd6c\xa1\xbe\xa1\xbb\x1f\xe6\x99\xc8X\xb9.\x16\ 'l\xc8\xde\x19<\xadqR\x15\xf0jdW\x12'\ \xc4\xb6\xb5\x0f\xdb $(VY\x0f\xfc\xb6?\xa1\xe7\ Q6\x22\x16V[=\xd9mb+]3\xda\xe4l\ \xae\xe0\xc7r\xac4\xa7\xa5\xf9\x8dj\xa6\x15U\xb0(\ \x14X\xe5 \x1e`\xd3\xb8y\x90\xc0\xa5\xe5b\x0e\xc0\ \x80kp,-\x10\x17\xa8\x19\xbf\x1c\x7f\xf6\x1f\xe6\x8c\ \x1b\x0f0\x00~%:|\xfaV\x83\x80\xa9+pE\ \x15\xba\xd4\xd8\xf4\xad\x05Ybe\xfb\xc3r\xa0Y\xc0\ \xdc\x8e\xbf+\xd7\x10\xac\xb7R\x19z\x8a\xb5\x1f\xac\x03\ \xb5\xf5\xaax8\xb2\x89\x7f\xd6@\x17\xe5z\xcd\x87\x5c\ \x14\x0d\x86\xf4\xa6*\xd8\xd0\x83\xfeR\x93\xf3\xab%{\ \x81\xef\xa5V\x96HS\x1b\xe2\x86\x047\x95\xc8\x1a\x5c\ \xf3\xa2\x940\xa0+M\x0f\x13\x1b+\x8b\xf4:W:\ \xdbqY\xc4AE\x1b(\xa0t\x0c-v\xfdi\xe4\ P\xb2\xd0\x88\xc8\x14ipj\x08\xf3\x5c\x9b\xd3\x1a\x81\ \xadz\x8c\x09\x1aZ\x82g\xf00\xed'\xc4|\xabM\ Qso\xf6*\x87\x11\x97\xc5\x94\x85\xf4&\x8bG+\ \x90\xab{\xd0\x91\xda\x8a\xa2\xb94\x1b\x0a\xe4\xcc\xac\x18\ \x1b\x11\xb1\xa2\xa9\xb5:\x9cl\x05\xe8\xe3\xb3\x0f('\ \xf2\xa2\xcb\xe5:_M\xa9\x9c:\x13#\x14\xb5\x94j\ [\xa52\x22c\xc2\xcf4\xb9Q3\x13\xae\x9c\xaa\xf4\ V\xd5I;\x1a\x22\xa6\x91j\x12\ /N(y\xd02\xda\xac\x05e%\xac\x06\xa6\xabI\ \x0f\x8b\x8b\x92r/\x18k\x8b\xfcV\xab\x8c\x0e]=\ Ou]>\xa7\xe5B\xea-\x94h\xa0X\x0e\xd4X\ b\xbc\x9a\xb1&\x94\xe2\xd4\xf9\x01Q\xa8\xbd\xb9\x8et\ \xa3\xe6\xd2\xd6\xa8\x93mI\xa1aM\x22\xd4,+(\ \x86\x16=\x8d\x0d\xc5\xedNe\x14!-\xb5\x18t\x9c\ T\xb2F\xd1\xaa?\x86\x8e5{R\xb18\x86\x81\xc0\ \x8f\x11\xe3\xa1\x1a\x83\xadZ\x9a!,&6l\xba\xdc\ 5\xb6\xa4\xe0\xe0\xf0&>-\xb3|\x04\xech\xba\x81\ \x0c\x92\xcd\xacx[\x13\xbb5\xec)\xc4\xfd\xe7\xa8\xb1\ \x03V\xfe:S$gm\x19\x8f\xb7*ZzmQ\ q77\x22\xf5\xc2\xd6\xb5\x87\xd2\xa6\xd5\xd5'\x0e\xd4\ Z\xda\x86\xe0\x1dj\x0b\x12l4\xa9\x08\xd4W\x1a\xea\ \x93\xaaI\xbd\x095\x17\xbdHw\x05r\xba\x86^\x86\ \x96#\x8e\x07\xfbDjJ\x8fR\x9dl:\x8a j\ d\x91a\x81\xa4a|\xc3(^\xb5\x221\xb3\xc4e\ \x8aH\xdb3)\xf3\x10-\xa5ZpX\xe7@J\xb6\ \xa0\x8a\xcf\xc1\xe1\x9eo19Pn\xc6\x9f\x8a\x85p\ \xf0\xe7\x8ei\x03_@M\xafD\xb7\xd4\xb1f\x02\xe5\ H\x1dmQqUp\x12b\x1f\x14\xa3;0>\xab\ \x9b\x8bU\xa2.\xf6Q}t\xa6v\x84\xa7\xa1\xaa\xdc\ KI\xd5\xbf\x12\xebVB0\x17 }j\xb7\x12 \ \xca\x88\x06\xa8\xba\x9a\xaf\x80\x9a4:P\x81sG\x10\ \xf3\x009jh\x22\x96?\x16H\x16\xf6$5X\xc0\ B`\x8d\xf3\x90]\x8d\xbeT\x97v\x8eH\x1d#.\ \xc06\x80U\x9c9\x12G\x9dAR\x0d\x99N\xe2\x99\ \xe8\xa6\xaf\xadGz\xbb\xc3t\xc5\xa8\x03F\xd0\xd55\ \xbe`@'\xda\xb4\xb8|>\x18\xf1\x18\xf9\x88\xb2\x8e\ \x95\xd7\x8f\xac\xd5\xc8\xb6\xa3t\x04\x5c\x0dM%\xa4\xf0\ \xec\xc7a\xbd\x14\x18\x98\xa4uMT\x93\xa5\xf9\xd7M\ \x9e2r\x5cyO*\xaf\xc5\x0d\xa1\x09\xf8\x8d\xea\xd1\ \x037z\xa3\xc5\x9b\xefUz-\x5c\xba\x8a(\xb5-\ \xbb\xd1\xb9\x16\xde\x96\xfbW&\xa1\x13\xa3\x11\x9e=\x5c\ \x0dT\xec\xc2\xa3\x0ff\x80\xb0\x04\x10\xd6e\xe8h\xce\ \xfaS\x06\x1aV\x1fhD\xd6\xde`t\x12\x0f\xe6\x8c\ $\xf3\xa8j\xb0p\x93\x11\x99V\xe0\xea5\xd6\x97&\ \x1ep\x0f\xdd\x9d*\xca\x95\x9c\xd0\xd3\x1a\x19\x83\x10b\ m;P\x15`.T\x81\xd4\x8a\xc3H\xae\x22\xbb\xf2\ \xfdh\x80\xf7\xff\x00\xb8\xd4\x83\x96\xb8\x8ab\x8f\xea?\ =k\xb2\x83\xb9?-)\xc1\xa5e\xa9\x00\x027\xb9\ \xda\x9b\x91O#\xefz\xe8\xe3\xc8sn?J\xb1k\ c\x86\xa6\x5c\x1ek\x83\x98\xe8GAV\x00\xa4p\xf5\ \xb6\x15Z2\x10\x96>_\x84\xf6#\xf7\xa7\x86\x05s\ \x00E\x8d\x88;\xa9\xe8k\xb4\xf1\x87Z\xbaP\x91G\ \xe2\xc8\xe1\x00\xd0_\xe2\xedQ4\xb1\xe1\xe2\xf1$\xd4\ \x9fJ\xf5\xac\xdcd\xef\x89l\xd2\x01a\xb2\xf2\x15[\ \x89nN%\x1a\xbd\xa2\x830\x1c\xdc\xd0/\x13|\xb6\ xQ\xbb\x8d?J\xa4\xaa\xc4\x90\x01k}h\x95$\ \xbf\xf9on\xb9M\xab?\xaar4b\xc6\xe1\xa4\xd1\ \xb3D{\xea(\xe4H\xf1)\x95$F\xc9\xb1S\xad\ \xfaVw\x81'\xfe\xd3\xff\x00\xdahLR\x03p\x8e\ \x08\xe6\x06\xd4\xea\xc3\x9a\x09nT\xc6\xe6\xdam@\x90\ \xc8\xad\x90\x8c\xa4m\x98\x81\x7f\xadT\xc6\x89\xe4R\x22\ \x95\xc4\x8a/\xe5>\xa1\xfc\xd6n J\x04q\xbb3\ <\xc6\xc0\x9b\x9b\x0b\xf2\xaew\x96|2=\x5c\x0e\x1d\ \x0f\x88\xea\x19F\xa7\x91\xaepH>\x12g;f:\ (\xaf=\x04\x86,lb+\x00\xac\x006\xf5\x0b\xd7\ \xa2\xf1\xd6Y\x99\x0e\x8e\x09\x00r5\xd3\x8f-\x16a\ yJ\x82]\x83;hH\xd8\x0e\x82\x81\x859\xc6\x96\ \xa4\xc8r\xa7}\x85T\x16\xe5z\x8aC\xaa\xf8\x83!\ \xf7\xa7 \x19M\xc8\xd7\xf2\xa1\xb0X\xaf\xd7z\xc9\x85\ :\xebKk\x03nt\xf6\x04\x8eB\x96\xc8\x09\xd6\xf7\ \xebQ(\x8a\x82\xb4\xc6\xd3\x7f\xad\x0d\x18\x80E\x04\xca\ \x0e\x16U\x22\xf6RG\xbd:\xb9\x00,W\xf1\x02(\ \xc4T\xc3\xcc\x17\x9d\x85\xf5\xedP\x16\x89\x980Ck\ \x12\xa2\xff\x00J\x86 \x0b\x93A\x09\x1a\xd0\x9bW<\ \x82\xfbP\x9b\x9dI\xb7aAqU\xbd\xcdJ\x82M\ \x95o\xec*\x15\x030^\xa6\xabO\x88\x91\xa4\xf0`\ ,\x17m\x0e\xadE\xb8\x96\xe4\xc9\x18\xbc\xb2*v\xbd\ \xcf\xd2\x85\xed\x942\xe6!\x86\x84\xad\xa8p\xf0$>\ g\x01\xe5;\xdfP\xb4nK5\xc9\xb9\xa5\x16sT\ D\x18\x9b\x93\xa5\x18\x17\xf6\xfdh\xd5I6\x03\xd8T\ \x83j\xaf\xc5?\xcdE\xbe\xcb\xb7J\xba\x88\xc4}\xd2\ \xab\x9el}+\xfc\xd4\xa4\x10\xc6\xe5\xdb\xefd;\xb3\ m\xf2\x15f\x8df\xc3.\x22$\xb4l\xca\xb4\xdc>\ \x1eLCx\xb31\xc9\xd4\x9dO\xb5h4\x84\xefo\ kP\xc8\xdb\x17\xb9\xcd\xa2\xa8\xe7\xfcU\xf9Z\x04P\ \x13$J\x11y\xff\x00sH\x9ab[\xc1\xc3\x0b\xb1\ \xd0\xb7\xf1V\x99T\xaf\xdej\xa3R\xa3D\x1e\xfdi\ \x18c\x0c\x0c\xeeT\xdd\xbd#\x98\x14\xd4\xe8Pa\x22\ .\xdego\xd7\xa5U\xb3\xbc\x85\xc9\xb9cszl\ \xce\xf3I\x99\xb4\x1c\x80\xe5\x5c\xaba\xa5f\x90\xaa\x91\ \xfd\xaa\xce\x0f\x0c\xd2\xb5\x94X\x0d\xcf!L\xc1`\xda\ O<\x9eT\xeb\xd6\xb4\x11\x00P\xaa,\xa3\xf3\xadN\ ?h\xb58`!\x5c\xb1\x0bw\xb6\xa6\x8c$G\x16\ \x19\xa3\x5c\xd2!\xbfBF\xd5*\xb6\xda\x83\x17\x13\xb2\ ,\x88}\x1c\xbfz\xe8\xc1\xe9\x1a\x81e@\xbe\xc2\x99\ \x15\x936v\xb0\x1a\xde\x86\x09ch\x95\xd9\xc6kj\ \xa3{\xfbT\x82d\x901\x1a\x8fH\xe4\xbf\xde\xb4\x83\ \x8bI\x5c\x092\xd9W@\xbc\xc7\xbd\x06\x10g\xc4\x22\ \xf5aW\xa3\xf2\x8boK\x8a \x98\xd2\xc0yB\xe6\ \x1d\xb9Ux\xf64\xf6\xcau\xb7:\xa1\xc5Tx\xe0\ \xda\xfeQ\xbe\xb5t\x1a\xa5\xc55\xc4\xfb(\xa7\x97\x8a\ *\xb1\xd2\x90I\x00\x8e\x86\xd4\xd9\x0d(\x9b\xfc\xcd\xeb\ \x9bP\xec\x04A\x98\xc8\xc2\xea\xbb\x0e\xa6\x9f\x8ab0\ \xce\xc4\xea\xdeQS\x87\x190\x88:\xdd\xab\xa4\xb1x\ \x94\x81`\x0b\xeb\xcc\xedZ\xf8\x91|\xa0\x06\x16\xd0~\ \x94\x12\x1e\x94R\x90\xd7\xccozQ\x1d\xcd\x14'3\ l\x09\xd3\xbdH\x91\x8e\xfb\x0eGZ\x0b\x80,+\x94\ \x92l\x01&\x84\xe9b\x86OR\x05'\xe2Z\xa7<\ M\x0b\xe5apv#cW\xb4\x0c\x14\xba\x06;\x02\ \xd4\x18\xb0\x87\x0cD\x92\x22\x95\xd5u\xbf\xe9E\x86)\ \x0br\xa2PI\xb0\xd4\xd0#\xc1\xcf\x13\x17\xd4\xd0\x89\ \x96i\xd3\x0f\x09!\x5c\xf9\xda\xda\x9f\xedF\x93\x90\xa6\ l\xab\x9aF\x1f\x0a\x0b\xfet\xc1\x95E\xe4\x8aH\x87\ \xe2k\x11\xf9T\x02\x02\xe5@\x15z\x0a4b\xbbs\ \xe5LK\xdc9\xc3a2\xf3F\xbe\xfb\xde\x8f\x150\ \x86E{\x5c\xb2\x80A6\x04\xeaE\xfeB\xa8`$\ \x11b\xb3\x92l\xe3+\x0e\xd4\x7f\xe2X%\x93\x04\x92\ F\x0b\x04\x7f5\xba\x01Z\xdf\xf1\x1fI\x96y\xb18\ \x96X\xbc\xf2\xf3k\xf9S\xda\xb4!\xc1\xb4\x08\x1b\x13\ 1\x9d\x86\xad\x1d\xb6\xf9\xd5_\xf0\x8a4e\xf3\xad\x89\ \xbb-\xc6\xfaoZ\xc4\x02\xc1\xb9\x8et\xf1\x9b5[\ \xf0\x11\x95\xb2\xac*\xa8\x1bP@\xb1\xa6\x80\xe1n%\ r\x07\x22i*\x8f\x1b\x05m\x81%\x1fqn\x86\x9d\ \x1b\x07%C\xad\xf9\x81\xbdn2?\x12f_) \ \x1e\xadC\x92[\x1b\xc8u\xdc^\xf7\xa6\x0a%Pk\ X\x08XT\x91\xe2G\x1b\x01\xa8\xf2\xdb\xf4\xac/\xf1\ \x06\x0da\xe2\x8f,`\xe5\xf0\x96\xc3\x90&\xbd\x134\ HIy\x05\x97SmM\xab#\x12\xed\x89\x9d\x8b\xaf\ \xf9\xc7\xd3\xd0r\x15\xcf\x9c\x99\x8dK\xdb\x1f\x83a\xdc\ \xced\x91\x09\x8e=M\xfa\xf2\x15\xa4\xcd\x9c\x97\xd8\xdf\ Z\xb4\xf8o\xb1\xc6\xb0\x0b\xdbrz\x9aD\x82\xcf\xee\ +\x19\x9d\x1d\xd1\xc1\x8a\x01BM\xa8\x1b0\xde\x9a\xea\ \x08\xb8\xb3)\xd8\xf2\xaaN5\xae\x8eW\x88\xdd\x0f\xb8\ ;\x1aub\xd3(\xbd\xec>\x94\x0fr\xc0[cr\ h\xe3\x929c,\xba\x11\xea\x1d*\x06\xe4\xf5\xab\x01\ L,h\x1cS\xa4\xda\x96\xda\x8a\x11F\x94\xc2\xccz\ \x1au.ASA\xa8\xcd\x91\x1d\xf9\xaa\x93]n\xe6\ \xa0\xd8\x5c\x1d\x98\x10k(\xb4\x92\x03\x021\x99\x14\x05\ \x02\xd7\xd4P\xab\xc3-\xc4fY\x0fP\x9aU\x7f\xb1\ D\x8f\x98\xb9q\xf8mjy&\xc0\x1d\x00\xd9F\xc2\ \xb3\xb7\xe9\x10\x8a\xdf\x04\x97\xf6_\xe6\xa3(\xd6\xe0\xff\ \x00\xd4\xc0~\x97\xa15\x16\xbd%3\x06(V)#\ BE\x8d\x81\xfdj\xae\x12)`\xc7 e\x076\xc4\ \x1d=\xea\xd2\xad\xcd\x80\xd4\xd1\xaf\x99\x83(\xb8\x00\xaa\ w\xeah\xcd\xed\x00\xee@\xae\xb6\x94A,.\xcc\xa0\ u,)\x89\x16r\x08\x05\x97\xae\x81O\xcc\xefV\x22\ \xe3\x17Q\xa51\x14\x0dl>b\xa3\x10q\x10\xa0e\ Hr\xed\xa1\xcdL\xb1\x08\xb9\xc8/o5\x86\xd5\xa0\ \xe6b\xdb\x9d\xb6\xedBu\xa2\xae\xb7]j\x01\x02\xf4\ k\x14\x9fk\xf13G\x95T\xaa\x0d\xcd\xbeU \x00\ \xa5\x98\x85Q\xb95_\x11\x89\xcdt\x8b\xca\x9c\xcf3\ U\xc8\x85\x8a\x91A\xca\xa7;\x0e\xdeQ\xfe\xfe~\xf5\ W)&\xe7sF\x05\xa9\x98x\x9eV\xb2\x0d9\x9e\ \x95\x9fZ\xf0\xb4BNU\x04\x93W\xf0\xb8\x05[4\ \xda\xb7\xe0\x1f\xbd;\x0f\x1cp\x0b&\xad\xcd\xbf\x8af\ j\xdc\x98\xcd\xa9\xb5\xed\xca\xdc\x85\x12\x8a\x1b\x82,j\ V\xca\xb6\x17\xa5\x91\x8b^\xd7\xa6\xa1Q\xccw\xaa\xac\ u\x00nh\xe3\x00noZ\x95\x1bh\xd4\xe5\x8d@\ \xbe\xe7\xad\x14^Im{\xe9B\xac-cLR\x00\ \xd3JP\xc3P\xcb#'\xde\x04\xcc\xa1l\xc0\x1dF\ \xb5\x05\xa8Y\xc8F#s\xe5\x1e\xe7Ju\x1d\x04\xa9\ *\x07P@&\xda\xd6~._\x12wn\xa6\xacJ\ \xe2\x0c)Pv\x19W\xbfz\xce&\xe3S\xf2\xac\xf2\ \xaaD;_@hKT3Z\x82#\x9etQ\xcd\ \x85cZj1\xb2\xaa\xdf@\xa0~T\x8cc\x950\ \xba\x9dC\xe5\xa2\x99\xc6cm\xafI\x91\x81@\xcc.\ #p\xde\xc3\x9d6\x887o9\xe9z\x16z\x17\xbe\ r\x07\xd6\x96Y\x7f\x18b>\x1475#\x01\x19K\ 1\xca\xa3sUq\x18\xdb\xdda\x05W\xaf3Mo\ 1\x0d \x04\x8d\x97\x92\xff\x00&\x97&\x1e)\x1f5\ \xcau\x00iY\xbb\xf0\xacA\x1c\x22\x04&5r\xeb\ \x98\x96\xde\x8e<>\x1a\xe7\xc8\xc2\xeao\xe6\xedB\x18\ X(\x16\x0a,(\xe2\xdc\xff\x00\xa4\xfe\x95\xa4\xcc\x8b\ \x0f\x85Q\xe8g\xff\x00Q\xb5\xa9\xb0\xc5\x04s,\xb1\ \x87\x05v\x17\xb8\xa0Z%\x22\xf5\x89\x84\xe54W\xa5\ \xa9\xa2\x06\xb5\x00\x85h`\x1dq\x18v\xc3Hu\xb7\ \x94\xedY\xe0\x1264P\xb3#\x86\x06\xc4\x1a\xd4\xaa\ \x8e\x09d\xc3cAcfC\x95\x815\xab\x81\x99\xb1\ 14\x99W-\x81\x16\xf8O0}\xa9\x18\xec2c\ \xb0\xeb\x22\x0bKk\x829\xf5\x15\x9d\x85i0\xf2\x96\ \x89\xca\xb6\xc7\xca5\xf7\xebN\xde5\x9f[\xeaH\xd8\ \x91\xedQ\x1a\x83\x8b\x92O\xc22\xfb\x9bjj\x84<\ NAa*D\xfa\xea@ \xd5\xdc\x06%19\xc0\ 9_1`\x87r9\xfb\xd6\xe5\x94a\xf4\x9ct\xb2\ T_*\xb6\xed\xd7\xb5:\xab\xf1\x17UTV\xb1\ \x0a\x0b\x9d\x7f*o\x82;\x8aL\x90a|\x08\xf7\x90\ \x0b\x91\xd2\x93\xc2!\xb1\xfbK\xec\xa7\xc8-\xb9\xebT\ s4\x85\x09\xdd\xc5\xfed\xff\x00z\xda\x08\x22\x81c\ \x03\xd1a\xf3\xac\xce\xee\x9f\x112x\xb1\x956\xd7k\ \xf25\x97*\x14%O\xa8\x1dkX\x9a\xa3\xc5\x96\xcc\ \xae>!\xad\x5c\xe7\xd5\x14_jQ\xfd\xe9\x8fK\xae\ m@\xe1\xdc\xa6-no\xae\xa3\xad_}\x18\xdb\xad\ gF\xb9\xa5\x04\xef\x9a\xb4d\xd6C\xefT\xf1R\xdf\ QK\x90\xe9jc\x02t\x1a\xd2dh\xc1\xb7\x88>\ @\x90>u\x00\xd0\xbe\xd4K\x94\x93\x96Ekn\x06\ \xe2\x84\x82\xc4\xdb\xff\x00\x154Y\xde\x85\xaa%\x95\x82\ \xe6\x8a\x02\xe87s\xcf\xda\xa6\xe1\x91\x5c\x02\x03\x0b\xd8\ \xd6QN5\xa8jc-\xecoP\x10f\x1c\xfa\xd1\ \x87@\x14\x9a,\xb6\xa6e\xa9\xcbV-((*\xca\ K.ak\x8d\xc5\x14q\xc6\xb1\xf8e\xe5u\xe8N\ [})\x81h\x82\xd3\x80\x0a\xa9\x18\xb4Q*\x9eF\ \xd75,^\xd7snW4\xc8\x94\x5c\xb1\x04\xf6\x1c\ \xeap\xe2b\xec\xf3F\xcavO)!~\x94\xe2\x05\ \xac\xc1\x9dH\xb7\xa1[\xf5?\xc5G:k[5\x83\ \x02w\xb6\xb4\x06\x94\x1dzW;\xc7\x12\xe7\x96\xe3\xf0\ \x8e\xb5.\xc9\x14^#\xeb\xf8GST&\x91\xe5\x90\ \xbb\x1b\x9f\xd2\xb3n$\xe2q\x0d3o\xec\xa3aK\ B\xc3s\xf2\xa8\xb6\xba\x1av\x16#+\x1b\x90\xaa7\ 5\x8e\xebF\xe10\xe6_;\x9c\xa89\xf5\xf6\xab\xc0\ \x85\x5c\x882\xa8\xe5J\x04\x9bk`\x05\x80\xa2&\xba\ H\xc8\xf3\x1a\xec\xc6\x97\x9a\xba\xe6\x95\x86\x86\xa9\xce\x00\ \xb94\x9c\xe3\xdf\xb0\xa8\x05\xcb^\xd6\xa8b\xc4m\xb9\ \xe6i\x81\xc5V\xbd\x10n\xf5,Y\x06\x8c=VW\ \xa6#\x166\x02\xe6\x9d\x06\xe6\xbd\x0e\x22A\x14Q\xb9\ \x22\xe6Aa}M&lT\x10\x86\xbbf+\xea\xb6\ \xcbT\xa7\x9d\xe7\x91f\x94\xda\xc2\xf1\xa7\xe1\xee{\xd1\ y\x19\x0e\xc5N\xd3I\xad\x85\xb4\x03\xa0\xa4\xbb\xd2\xf3\ \x8044\xb7\x92\xb3y5\x83v\xbd\x1e\x00\xdf\x12\x0f\ \xe1\x05\xaa\xa3\xc9\xad\x85\xc9\xab\x1c:\xe29\x1e\xfb\xd9\ E\x12\xf6\xbe-\x96\xd2\xe7A\xd4\xd0\x19T^\xec\x08\ \x22\xc6\xd4\xb6`5\xa0-}kZ\x12K\x15\xca]\ \xddG':\x7fz\x92\xeeE\x89\xb0\xe8(\x0bP\x93\ Y\xd3\x86s\x05M\xa8\x81k^\xff\x00QH\xbb\x5c\ [\xe7FI#O\x9dZ\xb0\xe5bE\xf2\xe9O\x84\ \xf9\x88\xec\x7fJ\xac\x5c\x11\xe5;\xd3bb\xa6\xd6\xb9\ \xca\x7fJ\xd4\xa1H\x1a\x90u\xa5g\xca.A>\xd4\ h\xc1\xb5\x17\xac4|f\x8cR\xe3\xa6-i\x94\x8b\ t\xbfz$7r7\xb5V\x92kh\x01\x04\xefz\ \x98K\x13\xa5\xea\xd3\x8d\x9e\x17)\xb1\x88\x9e\xeb\xefC\ \xc4p\x8c\xef\xe3\xc0\xb7\xbf\xad@\xd8\xf5\xaaQKk\ \x16$0=+W\x0f\x88Yb\xf1C\x00\xc3\xd4\x01\ \xfc\xeb\xa4\xb2\xcce\x93\xa86:\x1a8]\xd2Ux\ \xdb+\xae\xa1\xbb\xd6\xb4\xc9\x16%-*\xef\xa8`,\ Ee\xe30\xef\x87\x97+j\x0e\xaa\xc3cE\x98\xa5\ l\xc5\x8c\x8aX\x83\x94q&\xcc\x80s\xa8\xc4D\xad\ \x85\x99\xe6[\xb9\x5c\xc7]\xba\x0a\xcb\xe1\xb8\xaf\xb3L\ I\x17V\x16`7\xab\xd8\xbcv\x1d\xb0\xae\x91\xbb3\ 8\xb5\x8a\xda\xd5\xb9\xcbgc\x19\xc8\xe4H\xad\xa6\x84\ V\xec\xad\xf7\x82\xfc\xc6j\xc0\x17,\x15E\xc9\xda\xb7\ J\x02@:\x9c\xa2\xe4\xfbQ\xc1rC0.\x14\x1d\ F\xa6\xaa\xf1fE\x85\x03\xba\xa9\xb9\xde\x89\x8b\x16&\ +\xaa\xde\xc2C\xcf\xda\xa3\x1e\x8a0\xcc\xc85\x0d\xb9\ \xd4\x9b\xf5\xa6\xdd\x81\x9d-\x94\xf9\x9dGMnO\xb5\ -\x8a\x9f*,\x8c\xd6\xbf\xa6\xc0|\xcd\x1el\xb7*\ \x02\xf5\xb0\xb5-\xdd\x8a\x9b\xb1\xd7\xbdslXP\xfe\ 8&8\xd9\x13R\x15\xaej\xdb2\x9b\x95\x0e\xc7\xba\ \xe5\xfc\xcd'\x00\xb6\x89\x9f\xf1\x1b\x0f\x955\xc3\x91\xa2\ \xb1\xaa\x0aS\x9b\xe8\xd6a\xf8~\x1f\xef@\xee\xd6\xd1\ \x88\xf6\xa9\x9d\xa2\x89o4\xca\xbd\x86\xa6\x93\x16'\x0b\ 4\xa2$f\x0cv,45j\x826v\xb9\x16a\ \xb3\x8d\xc5W\xc4<\xc9*\xa6\x22K\xc4\xc7R9\x8a\ \xb6\x14\xe6 \xe9a\xafj\xad(I\xe5\x12\xbd\xcck\ \xa4k\xf8\xbb\xd1H\x89\x12!\x0bp\x84X\xb5\xad\xa7\ E\x1f\xbds\x9b\x9b\xec\x06\xc3\xa0\xaef\xb9\xeb\xd0t\ \xae\xb5\xf7\xa9\x04\x02{\x0a5Kl*TQ\x9d*\ \xc4\x10\x95\xd9E\x10\xa9\x03\xa5(9jr\xf7\xa3`\ \x91\xaei\xa4X\xc7}\xea\xac\xfcJ$\x16\x82<\xc7\ \xf1>\xdfJ\x91\xc1\x09\x16[\x9e\x82\xa5\xad\x10\x1e4\ \x89\x1fB\xc6\xb3\xe5\xe28\xa7[fT\xff\x00B\xda\ \xa8\xcd!$\xdc\x96'rk\x17\x9c\x87\x1bo\x8a\xc2\ \xb9\x03\xc6g*\xe2\xc7.\xda\xf2\xa2L\x92\xdd\xa2\x91\ Xs\xedY1\x00\x11F\x9f\x11\x07\xbd\x80\x1f\xa9\xaa\ \xd2\xe3\x0e\x1aL\x98\x7f3\x83\xe6o\xda\x8f\xdez\xb1\ \xa3\x8f\x90K?\x94\xddTXUrG3\xf2\x14B\ H\xf1\x10\x09\xe1\x16\xbe\x8e\xbf\x84\xd0_\xf2\xa3\xd2\xe2\ \xdd\xad\xf3\xad(PG\x02'\xc5k\x9a\xcf\xc3)\x93\ \x10\x8b\xd5\xabI\xc8.H\xebZ\xe3\xd0\xa8.A\xf4\ \xde\x84\xca/\xb5\xaav\xa5L\x09~\x80\xd3\xa0\xdc\xeb\ \xd6\xa6\xf7\xdf\xe9HE\xb3\x5c\x9d\xa8\xcb\x81\xdc\xf4\x15\ j0\x9e\xa6\xbb8\xef\xf4\xa5\xa9 k\xa9\xa3\x8c3\ \x9b(\xf7\xedN\xa1\x06\x1d\x0f\xd2\x89nN\x83\xf3\xa5\ <\xd8tb\xa2h\xe4\x90|\x0aj\x9e#\x19+\xdd\ A\xc8\xbf\x84Q\xfaK\xf2\xcc\x90\xfa\x9dX\xfe\x10u\ \xaa\xf3\xe3eq\x95>\xedz/\xf3Ts\x1a\x90\xd5\ \x9bm8\xb05UF\x17\x04\x97=\xc0\xe5\xf55\xd9\ \xd9\x98\x93IlB\xa6<\xc5!\xb2\xb2\x00\x1a\xf7\xb5\ \x1b\x5c>]I\xed\xce\x8d)s@Ozb\xe1\xe7\ qp\x84\x03\xcd\xb4\x14G\x0a\x8b\xebr\xe4\xf2]\x05\ YR\xbc(\xd3Jr\xe8\x0f3\xc8U\xdb\x85@\x89\ \xb2\x8a\x92HP\xa0\x05\x1d\x05,\x9a|\x0e&\xb8\x9a\ \x12{\x9fj\x16c}\xf4\xa8\xa5\x9a\xa05\x05H\x1a\ \xd1\xa8\xc5\xa6!\x03RiK\xbd\x1a\xd2\x8cPsf\ [\x0e\x97\xa6@\xcc$\xcc\xc2\x96\xa7J4\xadFU\ q\xe8\xd0\xb9\x16\xf2\xb6\xc7\xb5\x0e\x181\xd4[]5\ \xad\x06A4F3\xbd\xbc\xa6\xa8\x94x\xd8\xad\xaco\ \xb1\xe5E\x98bRV\x0dk\x0d\xfaSs\xbd\xafk\ RaB\xad\x99\x88\xf6\xa3\xbd\xee:\xd1\x0atac\ \xa8\xa7B\x86\xdeE6\xa5\xa2\xd8\xd8\x00[s}\x97\ \xdf\xf8\xa2\x965\x93C4\x99\xb96\xc0|\xa9\x82\x9a\ \x8a\x19\x8em\x02\xe9N\x85\xbc9\x03(\xb6\xba\xf7\xa4\ \xa3\x1b(`v\xaa\xf2qY\ \xb4\xcb\x14@\xff\x00\xa6\xf5d\xe00\xe93\x09]\x9c\ \x8b\xf9F\x80Q\xa2A\x1b}\xd4\x08\xa7\xa9\x175\xc3\ 97\xd1\x7fm\xc5\xa4h\x04\xa5[(-n\xa6\x91\ 6'\x11&\x8f3\x90M\xce\xb5\xbc\xd6Q\x91Q\x00\ \xb0\xd3(\xa4\xcb\x0e\x1d\xc1\xcd\x87\x8c\x9e\xa0X\xd6\xaf\ \x1b\xfdZ\xf3n\xecX\xe9\xa9\xe7Qw\x8c\x82\xa7[\ \xd6\xe8\xc3\xe1QH\x18T\xeeI\xbdV\xc5p\xe8\xe5\ \xf3\xe1\xceV\xff\x00\xdb<\xfd\xab\x17\x85:\x9c>9\ q\x11\xa4x\x80\x10\x1dY\xaf\xea\x02\xdb\xfdEX\x90\ f[\xa1B\x08\xf2\xd9\x86\xd5\x910)\x9e3\xff\x00\ -U-\xdc\x9b\x9aG\x85&\x5c\xd9\x18\x0e\xb6\xab\xf5\ b\xc6\xc1x!\x07\xc6\x9d\x10\xf4\x1a\x9aK\xf1(\x14\ \xda(\x19\xf5\xdd\xcd\xbfJ\xcc\xb5\x12\xa8\xe9G\xee\xfc\ X\xd2N'\x11\xd2L>^\x99[\xf9\xa7\xae#\x06\ \xc37\xda2\xf6#Z\xce\x87\x05<\xab\x9a8\x0b\x03\ \xce\xd4\xd4\xe1x\x92\xd6x\x84c\xabZ\xb5/%\xd2\ \xebc0j\x09\x12\xbb\x9e\x81m\xf9\xd2\xbe\xdd\x88\x98\ \xe4\xc2A\x97M\xeds\xf5\xae\xc2\xf0\xec4c4\x8e\ \xd27A\xa2\x8a\xb62\x85\xca\x8a\x15z\x0a\xd7c\xa5\ \x13\x82\x9aC\x9f\x118V;\x86\xb94c\x87A\x94\ \x033\x5cnr\xe8}\xaa\xdd\x8dq\x01W3\xb0Q\ \xd4\xd5\x91j\xaf\xfe\x99\x87,-<\x84~\x1c\xbb\xfd\ (\xfc>\x1d\x85\xda\x10\xcd\xd0\x9c\xc7\xfbR\xf1X\x92\ \xdeX\xae\xab\xd7\x99\xaa\xc0X\x97c\xa2\xeaMf\xd9\ <8l\xd34\xae[.Q\x1a\x8b[\x99'\xfbR\ %\xc3\xe1\xf1k\x91\xd3$\x9f\x0b\x8d\x01\xf7\x15\xcc\xc5\ W3z\xa49\x98t\x1c\x85u\xae4\xac\xd2\xcd\xc1\ \xcb'\x0f\xc7\x94\x9c0S\xa3\xafQZ3 R\x0a\ \x9c\xca\xc2\xe0\xf5\x15_\x8f\xa6|<\x13[\xcd\xaa\x13\ m\xfaU\x8e\x03\x1c\xb3\xe1L3\x02\xa15Fm\xed\ \xccQ=\xc5\xff\x00N\xe1\x91\xfd\xe9\x97\x92\x0f\xce\xad\ \x11R\x02\xaa\x04Ae\x1f\x9dA\xda\xbafFPE\ \x0b\x0b\xd4\x9a\x83R\x09],I\xb5Gm\xbeTD\ \x8a\x8b\x83Rq\xd0\x0d\x0b\x13\xb2\x8euW\x17\x8dw\ \x06=\x90\x1fB\xe8>z\xdc\xd3\xf1D\xae\x14\xb86\ (A\x07oz\xcc{\xe67\xde\xf5\x9eW\x0c\x11H\ \xe5\xb6H\xd29\x14\xddJ\x8b\x03\xd8\xd3$\x1e!2\ *\x90o\xe7^ji\x17\x14x\x9c@\xc3\xe1Rk\ \xa8\x99\x89\x11\xb1\x1b\x0e\xf5\x82\x91{^\xc6\xddj\xcc\ \x18Wp\x19\xceE<\xce\xe6\xa8`1\xbcRfv\ \x9b\x13\x85\xc8\x8b\xba\x1e|\xafW\xb0\xdcNS\x88H\ 10\xc4\xcb&\x89*\x8b\x0b\xf7\xa7\x8d\x95v\xb4p\ \xf86\xb6x30\x16\xce\xc6\xe7\xe9L\x8d\xb2\x05\x88\ \x15\x03d`\xb6\xbfc\xde\x80\x99\xd4ZH#$n\ \x11\xac\xdfJ\x15\x9b\x0f\x22\xb24\x99:\xac\x9a\x11]\ :d\xc6$\x9dw\xef@\xc6\xe7\xd8\xebJ\x93\x17\x1a\ I\x91\x88\x91F\xce\xa7_\x9d\x13\x9d\x99Neaq\ \xde\x8d8\x96j\x02\xd5\x04\xdf\x9d\xbbP\xb9\xb7;P\ \x5c\xcdPj./\xa0\xbf\xb5F`v\xbe\xb4$\xeb\ z\x82X[KQ\xc8\x22\x8d~\xf1\x82\x9e\x97\xb9\xa8\ \xc3xS\x12\x15\xcenJt\xbdHq[.\x9b\xf3\ \xa3\x03Z\x0f\x0b]\xed\xefF\xa2\xca\x05\xefJ\x1a\xd3\ \x12\x821L\x02\xd5\xa8\xc8\xd2\x98\xf1\xac\xcb\x95\xf4<\ \x9b\xa5)i\xe9\xbdi3\xe6\x8d\xe2r\x8e5\x1f\x9d\ \x08\xad9#Y\x93#\xef\xf0\xb7J\xce\x91\x19$(\ \xc0\x82\x0db\xcc2\xe9\xae\xb9O\x87\xbd\x8e\xa4\x9d\xcf\ 3\x5c\x05\x1c\xdf\xe77\xb9\xb5\x0d\xe9\x02Sp\x15\xaf\ a\xb7Q\xdcS\x16\xecr\x9fX\x17\xb0\xd9\x87Q\xfc\ R\x81\xa9\x92\xed\x87p/u\x19\x92\xdb\x83LG)\ 7\x16\xde\xb5\x0c\xf1\x05R\xee\x01 h5\xaf?\x06\ +\x171\x11\xa1\x05\x8f\xc5m~\xb5\xbd\x87\x89a\x85\ P\x85f\xb0\xccmz\xd7\x1b\xa2\x9aE\x8e\x86\xa4\x5c\ \xd2\xd4\xaa}\xd9\xd1o\xe4'oj`\x16\xde\xb6\x04\ *1\x04XD\x0d\x8b\xeez\x0a\x0cT\xf1\xe1\x94g\ \xbb;\x0b\xac`jG^\xd5\x9d6&iY\x89\x01\ .,\x15M\xc9\xf7\xaa\xf2\x90Hw\x10\x99\xb1X\x85\ \x82\x1b\x95\x1a\x0e\xe6\x9b\x0cq\xe1\x90\xc6\x08\xb9\x1ef\ \xebK\xc1\xc0b\x87;+\x09\x1fn\xc2\x98\xca\xbb\x9d\ }\xe8\xff\x00\xa5K\x8a\x801\x02@,$\x17\xf9\xf3\ \xaa\x97\xd6\xb41\xe9\x9f\x0d\xa0\xd63\x7f\x95g\x1d\xeb\ \x1c\xbd1\xa6[2+\x8f\x89E,\x92\xcam\xa5\xff\ \x00:^\x0d\xf3A\x97\x9a~\x94C\xa06\xa8\x16I\ 6\xb8\xd3\xad\x14zJ\xa7\xa1\xa2+\xe4\xca5\xcd\xce\ \xb8Gv\x00Tu\x8f\xc4n\xb8\xa6p\x80\x17!\x9b\ \xb9\x06\xa8\xe2#\x9de\xf1\xf0\xec\xc7[\x94\xbd\xed\xf2\ \xadN-\x22\xc9\x8a|\xa3\xc9\x1a\xe4\xbd\xb7nuD\ \xe6\x04\x10lo\xbdr\xe5;n\x22qcr\x02\x92\ \xb7 r4\xce\x16\x10\xe3a2\x80\xc9\x9bQKu\ \xcf\xb9\xf9\xd0FZ9\x01S\xa84yS\xd1JI\ \x94\x8e\x9a\x1d-QcA\x81\xc4..0\x09\x02e\ \x1a\x8bz\xbb\xd3\xc2\x9b_a\xde\xbb0U\xad\xca\x89\ A'J\x87\x96\x04\xdeL\xc7\xa2\x8b\xd5y\xb1.\xc3\ ,c \xeb\xce\x8d]\xac\xcb$q\x03\x9d\x81o\xc2\ 7\xaa8\xdcC4-)L\xd9H\x01o\xa0\x146\ $\xde\x89UJ\x95\x7fK\x0b\x1a-\xb4\xe4\x84G9\ \x91n0\x8fnEM\xe9\x18\x99d\x98\x18\xa3\x85\x94\ s\x16\xb9\xad\x08\xd4\xa4i\x116*,\xa4\x1d\x1b\xfb\ \xd4\xb1k\xdc\x92\x1bk\xf3\xac\xe6\xc3\xaa\xb6&$.\ ,\xc5|\xc2\xd5\xd1\xa3\x19\x02\xa0'1\xb5\xa9\xae\x09\ 7&\x9f\x80\x0a\xaad\xb7\x9a\xf6\x14\xc8\x8a\xe21$\ \x185\xcd\xe6\x7f\x13K\x8d/j\xa9\x81\x91\xd7\x88F\ \xd9\x89%\xad\xa9\xab\xdcn\xc7\x07\x106\xf5\x1a\xad\xc1\ \xe2\x0f\x8a\xf1\x18yb\x19\xbe|\xa8\xbf\xec\xa7\x8b\xd2\ \x8c\xb20\x1b\x03Bh\x98\xdd\x89<\xe8k\xa0A\xa1\ \x22\x8c\xd4\x11Y@\xcb\xda\xba\xdd\xa8\xab\x8e\xd5$\x04\ \x8eU\xf0\xa4$\x03\xccr\xd2\xb3q\x11\x15\x95\xa3`\ \x04\xa9\xb8\xe4\xc3\xa8\xad*\xab\xc4\xcf\xdf\xea\xc4\x1d\x19\ \x1b\xa7oj\xcf)\xd1\x8c\xf2)|b1/\x08\x12\ X\xe6\x81\xec5\xe4j\xd4\xaa\xa4\x16]4\xb9C\xb8\ \xfeGqJ\xc5\xdb\xff\x00G\xc4\xdc\x1b\x1c\xb6\xb8\xef\ \x5c\xec\xe8\xb3\xb8;^9\xe3\xfe\x90\xdfJ\xb2\x8c\xa5\ 2H\x09[\xdcX\xd8\x83\xd4V~\x12S\x06!d\ \x1b\x0d\xfb\x8a\xd0\x9d\x02\xbf\x94\xf9H\xba\x9e\xd5\x89z\ j\xb4\xe3\xc7Lp\xba\xb2\xbbGk1\x1e\xa5\xeb\xd8\ \xd5Y\x1c\xc91w\xe6nmN\xe0 :N\x8e3\ (PmV\xc48a\xa8\x83^\xecH\xae\xb3l\xd6\ J\x9a,3\xe1\xcb@\x09`4\x02\xe4\xfc\xc5'\x0d\ \x8ah\x87\x87\x22f^\x9b\x11Ws\x90\x00_(\x1b\ \x05\xd0\x0a\x09\x95f\x89\xfcE\x04\xaa\x92\x18\x0di\xb3\ \xf8\x80\xb8\x8c3\x9dY\x90\xf5#\xf8\xae\x027\x92\xd1\ \xb7\x88m}6\x1e\xe4\xd5H\xb0\xd3I\x1et\x8c\x95\ \xebW0Q48v\x0e\xb6w#\x9e\xb6\xa2[}\ Tr\x00\xabr\x83/6F\xbd\xbd\xc5\xab\x92\x10@\ (3\x03\xb1\x06\xf7\xa3\x8c\x957\x06\xb9\xa2\x85\xbe\x12\ \x87\xf1!\xb5o\x02\xb62\x0f\x1b\x1a\xa9\x18\xf3\x103\ \xdbaV\x06\x1a\x0b\x04U\x0aW\xd3';\xd3\x22H\ \xe2\x8f$@\xd8\xfa\x98\xee\xd4V\xaaE\xa8aq\x98\ \x80\x1a\xf9\x5c\x03\xb1\xa5\xa6l\xf6\xb0\xbfz\xb1\xb8\xcc\ nT\x8b5\xb5\xb5\xb6?K\x83\x5c\x22\xb9\x00&k\ \xecF\xb7\xfaS\x80*\xa7\xf1\x0f\xa5\x15\xb5\xb5\x19\x8e\ E[\xb2\xb0\x1f\xd4\xbf\xbdB\x03{\x90\x05\xb6\xad'\ \xa6\xa0\xa8QF*\x16\x8dWJO\x10\x8e\xea\xb3\ \x00\x09\x0aF\xbc\xcf/\xd6\x9e\x9b\x0a\xecU\x86\x02R\ v\x16\xf9kP\x8c\xccD\x8d\x98\xe4[\xd8t\xd8T\ \x07\xba\x86\x1c\xe8\x1c\xb2\x5c\xdbQ\xb85\x03E\x03\xe7\ X\xd6\xf0\xd5j4b\x0d\xc1\xd6\x90\x0d\x1a\xb6\xb5j\ \xc5\xcc\x10\xf1'U\xb0\x00\x9b\xb5\x85i\x06\xb9\xbdS\ \xc0\xc7\xe1E\x99\xbdn>\x82\xac)\xae\x93\xa8\xcd=\ N\x96:\x83\xc8\xd2\xf1R\xb6\x16\x0c\xf1\xc8\x00&\xca\ \xac/cR\xa6\xa9\xf12\xd3q\x05\x81nB\xd9@\ \xef\xce\xb5oA\xd8<<\x98\x962;\xb6R|\xce\ \xdb\xb1\xab\xf0\xc7\x0c+h\xd0\x7f\xa8\xeek\x88T\x02\ 4\x16U\xd0Z\xa2\xe6\xa91\x22F\xcb\xa1\xbd\xb9\x1a\ \x02t\xa9\x90\xe9@\x08\xd8\xde\xfbUR\x01\xf3j.\ \x0e\xe2\xb3q\x91\x18\xa6*v\xdc\x1e\xa2\xb4\x89\xd7c\ I\xc5\xc4&\x87/\xc6\xba\xaf~\xd5\x9b4\xc6|2\ \x98\xa5\x0e5\x1b\x11\xd6\xae\xddJ\x86Su;Vq\ \xd0\xdb\xa5\x1e\x12s\x11\xca\xd7(w\x1d+\x12\x9b\x17\ \xc6\xa2\xa5\xe5\xf0 y\x88\xcd\x94i\xf3\xa1[\x10\x1d\ M\xd4\xd2\xe7\x99\xfcv\xc2\xb2\xab+\xecm\xafj\xd0\ \x8c\xb9A\x22\xday\x18\x83\xae\xf7\xd4\x1f\xce\x94\xa3;\ e\x22\xc0\x9d{U\x8cL\x18\x88\x03\x09\xf5wl\xd7\ \x1bm\xa5 \xdcj-\x5c\xabmu\xe1\xd8E\xb4m\ \x035\xc7\xac6\xf5\x9d\xc5\xf0p\xe0\x98frCj\ \xa2\xda\xfc\xe8\xb0\xf8\x9cBYD\xec\x14k`k7\ \x13<\xb3\xc9\x9aY\x19\xcd\xf9\xd3\xcb\x94\xcf\x04\x94\xc8\ 1\xd2\xc2\xe1\xa1\x0a\xb6\xfe\x9b\x9a\xd4y\x8e\x22$\x9e\ \xe4\x86\x1a\x8b\xecy\xd6\x22)v\x0a\xa2\xe4\xec\x05m\ a\x22hp)\x13\xfa\xaeI\x1d/\xca\x8e\x16\xd3b\ \x10\x86\x17\x156\x14J\x8a\xa6\xe0W\x11[d&\xf5\ \xd55\xd6\xa99N\x99H\x0c\xa7\x91\x1b\xd1|6\xb9\ `6?\x10\xf7\xeb\xefCj\xed\x8dH.\xbaf\x04\ \x10v \xdc\x1a\xb1\x82\x17\xc3\x9e\xaa\xd4\xab\x82nI\ \x04\xeeG?q\xb1\xa6\xe0\x0d\xa71\xb6PYt\xe8\ \xdd\xc5S\xd5|'\x8e\x1f\xf8XV\xda\x96&\xbb\x85\ G\x93\x04\xd2_Y\x1a\xdfJW\x18\x94M\x89X\xa3\ \xaa\x0b\x0fz\xbc#\xf0\xa1HA\x07\x22\xd8\xfb\xd5\ ?\xdbW\xc2\xce\xf5\x07j\x93s}(N\xf4\xd4\xeb\ \x9a\xed\xeb\xaa9P\x9cM\x095&\x84\xd4\x90[\xa5\ V\xe2\xba\xf8m\xd5H\xab\x06\x91\xc5\x01\xf0\x22\x16:\ \xdc\xd6o\x85U\x1bA\x1bl\x0d\xc1\xe6;\x8a,R\ \x99p\x18\x88U~\xf1mp6$k\xa7\xb8\xa4\xb0\ $\xe5\xda\xd4\xd4kb\x1a;\xe5\x91\x95]\x0f\xca\xd6\ \xacB\xc0e`\xcdqmv;\xd6\x86\x05\xbc\x5c\x0d\ \x89\xf3Bm\xff\x00I\xab\xf3G\x06 \x9f\xb4\xc1g\ \xe6\xe9\xa1\xfaPa\xb8w\x85$\x86\x09D\xa8\xe8F\ ]\x9a\xfc\xb4\xac\xce\x16S\xa7p\x01\xac\xe7\x96O\xde\ \xae\x1d\xa9\x5c&\x16\x8b\x0b#:\x952\x10\xa0\x11m\ \xa9\xc4v\xae\xb3\xc0\x00\x096\x02\xf48\xb7\x10\xe1\xdf\ 1\xb3\xb8\xb0\x1c\xed]\x888\x87\xc5\x88\x22\x93\x22\xb2\ \x06\xf6\x16\xa1\x9f\x06\x83\x0e\xefy\x0b(\xbev\xd8\xf6\ \xab\xff\x00\x01\x18,HH\xc4r)(5\x04n*\ \xca\xcb\x86\x94\x12\x98\x80\x00?\x10\xb5\xeb9\x04\x92\x9f\ \x06%,X\xedj\xb6\x9c9\x96\xe0\xcc\x99\xbf\x09\x16\ \xfc\xeb2\xdc+H\x84\x0c\xc0\x82\xa7@A\xbd\xe8\xd4\ iK\xc2D\xd0!\x8d\xca\x92\xc77\x94\xdf\x91\xa6\xd6\ \xe0\xa9\x14LR8\xcc\xb2\xb6T\x1c\xedr}\xaa\x10\ (S$\x87*/\xa8\xfe\xd5\x99\x8b\x9eL^#A\ \xa06E\x1c\x85V\xe0[n&C\xe5\xc2\xc0/\xc9\ \x9b\xccO\xca\x8aW\xc7\xaa\x91$\xb9!\x91o\x90\xb8\ VS\xda\x9f\x84\xc3G\x83P\x02\x86\x9bvr==\ \x85v5L\xd8b\xbe\xa6S\x98\x5c\xdf\xde\x9c\xb9\xda\ &\x0c7\x14\x8c\xf8\x89\x88\x1a\x8fO\x8bv\xb7\xb5\x1a\ c\xe6\x89\xc4x\xc8s\x10lX\xe8\xc3\xf9\xa6\xc3\x89\ VDV\x8eB\xcb`\xc5u\xfc\xaa\xc3,s\xc6R\ KJ\x9fFZd\xfeU\xbf\xd4\xc2c\x9dsA \ q\xd0\xe8G\xca\xa4\x82\xa6\xc4[\xde\xa9bxl\x89\ \xf7\x98f.\xa0{0\xae\x83\x88K\x1d\x93\x10\x9e\x22\ \x8e\xba0\xf9\xd5\xbf\xd1\x9f\xc5\xe5&\x97\xc4\xcf\xfc\x1a\ \xc2\x0f\x9av \xff\x00\xa7\x99\xa6F\xd1\xcd\x1ex[\ 0\x03Q\xcdj\xb7\x13\x90}\xa5#;\x04(\x18\xf2\ k\xde\xd4\xdf\x14\xf5Q\x81\x92\x14c`Yu\xb7\x22\ 4\xa5\xc4\xc4\xa5\xb2\x93\x97M(\xf1\x09\x96Ic$\ \x8b6p\x0e\xe0\x1f\xefS\x83\x86Y\x17\xd2\x04w\xf5\ \x1a\xe7\xf5\xa4\x00O#\xfa\xd5\xdc\x16\x16\xd6\x92Qq\ \xb8^\xbe\xf4\xdc,pD@R\xa2S{\x16:\xff\ \x00jd\x88T\x16\x98e\x03v#Z\xdc\xe2-3\ RF\xd7;\x0a\xec\xc0\x10\x0df\xcf6i\xfcA|\ \xabl\xa7\xb7z\xd1#\xc4T\x90i\x9dsS(\xc3\ \x90\xf45NV\xf0\xf8\xe1<\x84\xb5f%\xd4)'\ S\xb5fb\x8en.\xcd`O\x8a6\xe7\xad6\xf4\ \xa3fM$`9\x1a\x8b\xe9C5\x8c\xcf\xa0\xdc\xf2\ \xa8\x0cG\x7f\x9dkB\x0b\x5c\x91D\xbc\xe8R\xc4t\ #\xadp7\xedm\xe8H~}(/\xa5\xead6\ ]MF\xf4T\xa9\xc4`\xce\xa6d\x1a\x8fX\x1f\xad\ Q\xb0\xadp\x1b=\xd4\x12{U|V\x0f1\xbck\ \x91\xb9\xa9\xe7\xedY\xb3\xebR\xaaa\xe5xI\xcan\ \x0e\xe0\xecj\xdc\x13G&$\x16!\x18\xc7\xe5\xbe\xdb\ \xf5\xaaEH6;\xd4\xb0o#\x80NK\x86\x03{\ \x1a%\xa6\xb4X9\x1e\x19L\xeaw\x04\x5cR\xfe\xc3\ \x85c\x7f\xb2\xb0<\xf25\x87\xd2\xa8\xea#\x0f\x1c\xbe\ ^\xa0\xfe\xa2\xa0O#\xe8]\xaf\xefW\xea}\x18n\ \x22\x0c4.Us=\xc5\x8f\x9bjTq\xe1\xd1\xc1\ \x8f\x0a\xa0\xff\x00V\xb5\xc0Q\xa8\xd2\x82,\xc4\x9d\x95\ @\xfc T\x85[\xfaE\x08\xa9\xbd V\xf7\xfa\xd4\ \x1fz\x8b\xd7jjN;\xee>\x95\xd6=EM\xab\ \xaaH\x1b\xdbc\x5ct\xa9\xde\xba\xc7\xb1\xa9 \x94H\ \x8c\xb2\xb6T\x1c\xfa\xd5)\xf8\x89\x91\xbc(\x07\x86>\ \x16'[\xf7\xae\xe3\xce\xde,q\x0d\x15P\x1bw4\ \xee\x19\x86\x8e,2\xe2$PY\x86`O\xc0\xbd}\ \xeb;m\xc8s\xad;\x04\xb0\x9cB\xe2f_\x0f8\ \xcc\xaa\xdb^\xad\xcb|\xc6\xfb\xd2\xf0\x91\xc6\xf0\x09d\ \x19\x9f19I\xd1o\xa8\xa6J\xda\x92kp}/\ \xe1\x14$T\xee/\xb0\xaeS}A v\xa5\x04\x8e\ \xd4\x07\xc4\xbe\xc2\xdd\xa8\xc99\xf2\xefP\xc6\xc4\x0e\xb4\ \x9a\x13Fh\x1b@OJ\x10N\xa6\xf5S\x8a\x13\ &$\x22| \x00\x073W\xa1\x1e#j<\xab\xa9\ \x17\xde\xa8F\xc1\xb1\x99\xdb{\x97\xfakY\xe4\xd4*\ \x00|gH\x99W\xc2\xb6yH\xbe\xbd\x05\x0e#\x06\ &\x97\xc4\x8f\x16\xc5\xfa\xca,O\xcciO+\xe1@\ \xa9k4\x87\xc4\x93\xdc\xf2\xa8U\xbe\xf5\x9c\xeb\xb4\x98\ \xe3\x9f\xc1?hB\x19=.5\x0c*\xc7\x0bO\xf3\ $?\x08\xb0=\xea\xae\xe0\xe5\x1bu5\xa3\xc3\x93\xfe\ \x04X\x80Y\x89`\xcc\x05\xad\xa5j\x0a\x8cn! \ \x11\x19\x95\x9f\xc4\x04\xe6\xcd\xa8\xd6\xd4P\xaaN\xb9\xb0\ \xce$\xed\xb3\x0f\x95'\x8bdd\x80\x85\x0f\x95O\x99\ \x9b*\x03\x7f\xce\xa9x\xe1\x08\xfb\xc7b\x0e\x9e\x19\xc8\ \xa3\xdb\xadW\x96^\xd6to\x13\x90\x8ch1\xbd\x8a\ (\x17\x1dE6\x18\x04\x98p\xf8\x89$\xcd&\xa3]\ \x87\xb5W\x82\x07\xc6g\x95\x0a\xa9\x07\xcc\x09\xb7\xce\xb4\ %>}5\xb0\x00w\xa2w\xdaV\xc0\xe1\xcc\x124\ \x99\xd7.V\x02\xc7RM4\x0f\x95HP\xa2\xc3\xf3\ \xa1\x93Sn\x94\xe6!\x8b\x16\xd3\x97:b\x85\x08^\ F\xca\x8b\xbbTD\xaa\x22\xcf!\xca\x8a55C\x15\ 4\xb8\xe9\x84P\xa1\xc8\x0d\x95G\xeai\xb7\x10q\xd8\ \x97\xc5J#\x8dH\x8c\x1b\x22\x0e}\xebC\x87\xe1W\ \x06\xa1\x9e\xc6s\xff\x00\xd3\xfb\xd1a0\xf1\xe0\xd0e\ \x0a\xf3s\x7f\xc3\xd8ST\x5c\xdc\xd38\xfd\xa3\x5cT\ \xb0\xef\xde\xa7\x0cr\xb9\x16\xbeaj4Z`\x5c\xdf\ \xcdhk\xa2Q\x1d\xfc$\x09}\xed\xbd\x0e%\x0a\xa3\ N\xacU\x97\x9f^\xd4\xe8\xc1*o\xb865\x18\x98\ \xcc\xb6\x86\xf6U7v\xfd\xaa\xc4N\x0f\x16$`\xae\ \xb6c\xa0u\xda\x9b\x8a\x82,R\xdaQg\xd6\xce4\ \xd7\xbd(`\xa3Y\x96E\x9a\xca\x1a\xe4\x15\xd4\xd5\x96\ 9\x98\x9bnoT\xdc\xed\x7f\xe3($\xfc6v\x95\ \x80 !=C\x0a\x87\x03\x11\x11d$\xa4\xeaJ\xf6\ ==\xebG\x89F\xb3p\xf3\x03\xb1\x1e#YH\xe5\ \xfd\xab\x0b\x86\xca\xd8Lca\xa5\xd1Y\xaco\xf0\x91\ \xb1\xac^\xae\x19\xda\xc7\x09U\x9es\x1c\xceIx\xd4\ \xa96\xb1\xb0\x1e[\xf5\xb8?\xecV\x8a\x07\x13\x08\x94\ \x05|\xb7\xb7\xe0\x15\x93\x82\x85^\x18b\x11\x96w\xb3\ \x02\xbb\x8dkhD\x90\xca\xcc\xacY\x88\xb1\xd0\x00O\ 3O\x1f\x15#\x11\x83R\xb7\x80\x5c\x8d\xc1\x1a\x9e\xe2\ \xaa\x9f\x14\xb0F.\xdc\xacN\xbfJ\xd1\x04\x8a\x89P\ L\xca\xf9\x8aH\x9b5\xafzl\x12\xa94m\x1d\xbc\ E+\x7f\xc5\xa5hp\xe9VL:Dtt\x04-\ \xf9\x8a^&\x19\xe6 /\x85e\xd7Ck\x9e\xba\xd2\ \xf0\x0a\xc9\x8f\x8dX\x10Cs\xa6uSF\x1f\xf3T\ \x9d\x81\xbf\xd2\xb1a\x19\xf1\xe0\xa9\xd1\xa5\xba\xdf\x90\xbd\ l\xc2~\xf5}\xedX\xa2\xe9\x8e\x00[\xcb&\x976\ \xb6\xb5r\xf8\xa3f}fo\xf5\x1a\x85\x153_\xc5\ }G\xa8\xf2\xefC\xafa\xf9\xd6\x80\xd4),Xy\ F\xa7\xe4+)\xb8\x96 L\xe20B\x83\xa0\xab\x9c\ M\xcc|8\xda\xf7v\x00\xd6A:\xdf\xebX\xe5s\ \xc6\xa4_\x87\x88,\x8d|L6\xe4\x0a\xff\x00\x15/\ \xc4\xa0S\x95av?\xd4l+8\x11\xf8\x87\xd6\xb8\ \xe6;X\x0eW\xa3\xf5NC\xf18\xccD\xd7\x19\xb2\ /E\xd2\x82\x1cn*\x11e\x94\x95\xfc-\xa8\xa0\xe5\ \xb8\xbf\xb5_\xc0\xe1\xa28A#\xc6$g&\xdd\xa8\ \x9bj\xb9\x0b\x18\xcc6 \x85\x99|7\xfcCj9\ 0n\x144l$\x07\xf0\x9dh\xce\x03\x0d \xb9V\ \x8c\xff\x00N\xb4\xb5\xc0\xe2\xf0\xe7>\x12Q'`l\ ~\x9c\xeb]\xfd\x1d+O\x01-\x9d3,\xab\xea\x1b\ g\x14\xa5L\xc72\x03k\xfd=\xea\xf2\xe3\xca\x9c\x98\ \xbc1\xb8;\x81cS+`\xe6\x91\x1e\x192;\x1c\ \xadql\xdamFE\xb5]R\xdc\xc9\xf74@Z\ \x9c\xf8YF\xa9g\x07\x9a\x9aS\xab!\xb3)\x1e\xf5\ bEuE\xeb\xaaN\x22\xe6\xa4W\x0a\x9a\x92@\xae\ \xae\xae\xa5:\xdd\xab\xad\xadMu\xaa\xc4\xa7\xc7c\xce\ \xb1N\xa2\xc4\xaeF7\xe66\xd3\xfd\xefM\xc1\xb1\x97\ \x0e\x80\x90R\x15\xd1m\xcc1\x02\xff\x00\x91\xa7I\x1f\ \x8f\x87\x93\x0f\xcd\x85\xd7\xdcUn\x1e\xcc\x85\xe0sl\ \xe8\x96\x1c\xb3j~Z\x00+9\xda\xf8\xbd\xc3\xc9+\ *\x12/\xa3\x0b\xf3\xa2\x90\x5cX\xfeT\x8e\x1c\xc0c\ ,~ TU\x87\xb1\xadO\x05\xf5]\x94\x96\xcb\x5c\ \x17!\x1a\xe8i\x84s\x1b\xfe\xb5\x04\xa8L\xee\xe1T\ s5\x12\xda\xec\xd7^[\x9a\x9c\xba\xdc\xb5\xcdLo\ \x0c\xa4\x84\x97nEmE\x94\x13et$n/o\ \xd6\xa4Y\x15\xd9FRX\x85Q\xb9;S\x0cM\xb8\ \x1au\xbe\x9fZ\x8b+\x1b\xe8\xc2-\x06\xb7\x05\x8dX\ \x95\xe4VL$\x8c\x8c\xb6`\x00!\xc0\x1a\xf3\xfc\xaa\ \x9c0\x9c\x99\x94\x11\x9bC+h\x00\xe7n\xb5\x7f\x1f\ \xe4\x81]\x15C3X\xf9F\xbaU+\x97bY\x8b\ \x1eu\x8eS\xb3\x13)\x0f)a\xb6\xc2\x84\x81mj\ v\xae5\x92\x18\x904\x81T\x1b\x13\xa8\xbe\xf4\xec\x04\ \x0a\xd238\xba\xc5\xa1\x1d[\xff\x004\xdc6\x1c\xa6\ \x11\xe7&\xcd\x94\x95\x16\xe5V2,h\xb1\xa0\xd2\xc0\ \x93\xd4\x91[\x9cF\x93\xc4\xd0\xe28y\x03x\x9b0\ \x00r\xac`:\x0a\xf4\x11\xb1W\xb8\x17\xb6\xe3\xf65\ \x9b\xc5\xb0\x9e\x0c\xbe*)1\xbe\xa0\x9eG\xa5\x1c\xf8\ \xfdR\x87\x829\x18\xf5\x8c\x1b,\xbeS\xde\xae\x85\x02\ R:\x0eu\x9b\xc3\xe3i1\xf1\x22\x9b\x12\xe3Z\xd8\ \x97+H\xc5E\x81&\xd5p\x9d*U\xaaZ5\xf0\ \xcc\x8d\xe5U\xdc\xd1H\xd1A\x18\x92r@>\x95\x1b\ \xb5Qi&\xe28\x85\x88-\x90\x1d\x15t\x0a)\xb4\ GL\xd3\xf1\x0cB\xc3\x12\x15\x8cl9{\x9a\xd0\x82\ 8\xf0\xb0\xf8P\x9dO\xad\xc6\xed\xfd\xaabT\x81\x0c\ 0\x8b \xe7\xcd\xbb\x9a\x9bS&v\x82\x06\xb4\xd8\xd7\ \x95B\x8bS\x10V\x85\x12\x8dmLAP\x83J5\ \x14\xc0\x9b\x84\x900\x17\xd2\xe4u\xa3(B\x05:\x93\ \xe6c\xd4\x9dk\x94\x03\xa3lA\x14is\x18\xcf\xeb\ _+Xt\xd8\xfd+Q\x14V\xc0\x9bl*\x02\xe5\ P)\xd7[\xdb\xf2\xb5\x00\x07.\xa3QF%>(\ @x\xd3\xa2\xdc\xfc\xeb#\x8f\xc7q\x16%E\x8by\ X\xf7\x15\xaf\xc5t\xc4\x8f\xf4\x0f\xd2\xb3\xb8\xbe_\xfd\ (\xe6\xdf\xc4\x19=\xf9\xfeU\xcf\x9c\xf5\xae-<\x1c\ \x0b\x86\xc3\xa1\x0bi\x1d\x05\xcf\xe1\x16\xda\xb8\xdc\x9a~\ (}\xe6Q\xb0\x00}\x00\x14\x83\xa5i\x97\x0a%4\ 5+R\x18\xda\x89\x81\x91@\x06\xce\xba\xa3_cB\ \xb4@\xebLC\x0d\x9dD\x83Bw\xecy\xd6o\x1b\ \x8d\x93\x18f\x1bK\xe6\x06\xb4\x09\xca\xcc\xe1K+j\ \xe0n\x0fZ\x99\x169\x22\xc9 \x12Fv \xed\xed\ U\x9b\x0c\xea\xaba\xb1\xf0\xc8\x80b.\x8e\x05\xb3\x01\ {\xd3\xdal(\x5c\xc7\x13\x19\x03\xa6\xff\x00J\xac\xfc\ 2&k\xc7\x88\xca:2\x9b\xfeT\xa9\xb8d\xf1\xdc\ \x96\x8f/\x22Z\xd7\xa3yE\xd0x\xa6)g\xcb\x1c\ W\xc8\x97\xd4\xf3\xaa\x95c\xecs\x88L\x9e\x04\xae\xa3\ \xf0.\x9fZB\x14u%C\x02\xbe\xa5a\xa8\xac]\ \xfa\xd4\xc7\x0b\xd7X\xd4\x8a\x90<\xb7\xa0\x86\xc6\xb5x\ m\x9f\x87-\xbe\x06 \xfc\xeb/\xe5W\xf8\x1c\x83\xc4\ x\x0f\xfc\xc02\xfb\xd6\xb8\xfa/\x8bV\xae\xb5\x19\x17\ \x14$k]\x18C\xdaE\xc9*\x89\x01\xd2\xcc/U\ \x8e\x0b\x0e\xf2\xfd\xdeh\xc2\x12I\xbd\xc5\xc8\xb5\xaa\xd1\ \x16\x89\x8el\xbb\x00}\xcd\xaa]B\x9c\x8a<\xab\xa0\ \xa3\x16\xb3\x1f\x0b\x8b\xc1\xfd\xec\x12\xe6A\xbd\x8e\xde\xe2\ \xad`1#\x15\xf7N\xa0H\x06\x9ah\xd5e\x09V\ \xb8\xff\x00\xcdQ\xe2xQ\x1f\xfcL\x07(\xbf\x99\x7f\ \x09\xa33\xc3\xba\xb0\xf8X\xe4\xbeQ\xe1\xb7>\x9f\xda\ \xa9\xcc\x8b\x13e\x92DS\xca\xe7z\xb5\x83\x91\xf1\x8e\ \xc9,\x8cr\x0c\xc5A\xb6pv?\xcf\xb5I\xc2\xc6\ \xd8\x93\x11\x04\xc2\x101\x07R/\xd2\xac\xdf\x12\x93)\ Sc\xf9W\x0a\xb1\x8d\x84\xc5/Ua\xe5\xb7JO\ \xb5\x18\x5c\x05u\xaaF\x82\xa0\x1b\xd2\x93Pjk\x8e\ \xa2\xa4\x10J\xb0a\xb8:U>4\x1a,D\x8e\x9e\ Q\x94I\x19\x07\xa6\x9f\xb8\xabmS,Qb\x03D\ \xe3\xccQB\xb5\xbd7\xfe\xe0Vl\xde\x908d\x8b\ \x89\x9a)\xd2\xd9\x81\xb4\x8a9\x1e\xb5d\xd7\x9e\xc1\xb4\ \xf8N&\xa2\x13f\x12e:\xdbJ\xf4\x122\xb4\xbe\ \x22\xb7\x92A\x99}\xaa\xe1v\x1a\x9b\xd28\x92_\x07\ \x985\xad%\xed\xd7J+\xf9\xf3\x0d@\xa6\xe4\xf1<\ \x10\xc3\xca%$\xdc^\xfaS\xe8'\x0c|\x18\x11\x14\ \x10\xc4]\x88\xefL,X\x11 \x0e?\xa8^\x80\x7f\ \x9b\xf3\xe7L7\xbdQ\x06\xd1e\xcb\xe0Gn\x9a\xff\ \x005 \x8b\x05\x00(\x1b(\xda\xa6\xc6\xa4\x0b\xd2\x89\ \xe2Z`\xd0\x85\xbd\xa4?\xa5f\xc6r\xb5\xcf=\xeb\ W\x1e?\xe1\x93\xff\x00\x90\xfe\x95\x9c\xa8\x19\xcfj\xc7\ /LA\xd7P4\xefE\x86\x88\xcb\x88X\xee\x06c\ \xc8^\x8a\xd5k\x85\xc6s;\x80n\x05\x87\xce\x896\ \x9a\x9e \xfe\x1e\x1f\x22\x9d$\xd0\x0bk\x94T`\x09\ \x93\x0cU\x8d\xccgK\xf4\xa8\xe2eO\x86\x80\xdd\x94\ \x1b\xd8\xde\xd50\xc5.\x12\xd2\xba\x82\x8e,@5\xaf\ \xac\xfc7-/\x89\x18\xd3\x07\xe0\xc8\xda\xca\xeam\xd0\ u\xab\x12\xbcP\xe1\x8e \xd9\xd7\xe1\x1dMcb\xa5\ y\xe62Hu?\x956\xa8L8\xf90\x9c\x5c\x09\ \x11\x04q\xb7\xa4\x0d\xbb\xd6\x8c\xdcEP\x0c\xb8T7\ \x17\x0d\x98\x91\xee+3\x8a\xa7\x89\x83I\x88\xbb#e\ '\xb7*w\x0e\xe1\xdcV\xc1Q\x13\xc3\xb5\xfe\xf0\xf9\ G\xf7\xaer\xf2\x97#]\x02w\x9b\x15\x88\xcc\xe73\ \xb6\x80\x01\xfaV\xbe\x12\x0f\xb2a|/\xf9\x8f\xac\x9d\ \xbbQ\xe0\xe0L9 F\x04\xfb\xdc\xdfo\xe9\xa2\xb5\ \xeb|x\xe7u\x9bAkX\xd1\x01S\x96\xedo\x99\ \xa3U\xad\x0dB\xad5V\xb9\x16\x98\x05A\xca(\xd4\ kP\xbb\xda\x88\x9bh\xba\xb7\xb6\xd5\xa4$Zj\x8f\ 0\xe8\xfeS\xd8\x8d\x8f\xedI\x89\xb3\x1f1\xdb\x96\xd4\ \xd8\x8f\xde*\x83\xe5\xccH\xee@\xdb\xf3\xadD\xe3{\ nhZ\x9aF\x9a\xd00\xa93x\xb7\xff\x00\xaa\x1f\ \xe8_\xd2\xb2\xb8\xf3\x11\x85\x82;h\xc4\xb9\xf7\xda\xb6\ x\xba}\xea=\xfdK\xfaiY\x0d\x0e\ \xcdp\x7f\xee\xae\x5c\xe7U\xae-\xc9\xbc\xc1_l\xea\ \x1b\xda\x90\xc0\xde\x8b\x87\x16\x9f\x85\xc0Cge\x05\x0d\ \xbb\x7f\xe6\x89\x81\x07Q\xaf\xb5j\xff\x00Y,/Z\ !]Q~\xd4!\x0fz\x9a\x10jA5!\x02A\ \x04n)DM\x16+,\x00\x15\x94f\x00\x8b\x81L\ \x152\x5cF\xd2\xa5\xc3\xc6\xbe\xe0\x8e\x96\xa5\x03\x10\xf8\ \xc8\xe2-\x9a5\x00\xeac\xb5\x1e\x192\xc2\xae|\xce\ \xe2\xe4\xb6\xb6\xaa2K\x88\x9dns\xba\x83\xf0\x8d\x05\ ]I\x84\xa1r\x02\x0a\xd8\x15;\xe9T\xa4\xd0\xd2f\ \xcd\x98\xdf\xad\xea\xbc\xb0&#\x89J\x19r\xda\xf7u\ \x1a\xfc\xea\xc6f\x12\x00\xaas|+\xd7\xdf\xb5tq\ \xac \x859\x8b\x1f3\x1eg\xb7j}\x0c\x9cf\x19\ \xf0\xf2\xe5:\xa9\xd5XliV5\xbb<^>\x19\ \xa2\xe7\xba{\xd61[\x12\x087\x15\x8e\x5cq\xa9A\ m-V8@\xff\x00\xf2P\xff\x00\xaa\x92l7 \ {\xd5\x8e\x12?\xfc\x8c'\xfa\xaa\x9e\xa6\x89\x02\xdaR\ \xcd1\x98l\x01'\xda\x81\xae\x01\xd0V\xd9q\x00\xca\ \xa9sd_\x10\x81\xcc\xec*\x05\xedm\xed\xce\xa1\x81\ *\xac\x1a\xefke;0\xe9\xd8\xd3\x22\x0aE\x95\x80\ #p\xda\x11R\x0d\x8d\x12s\xd02\x9d\x18r4\xc5\ \x8c\xf2\x19\xbd\x8d\xe9%l\xe5FR\x06\xecN\x9e\xda\ njL\xfe*\x92`\x18b\xa0>Tk.\xbb\x83\ \xc8\xfc\xe9\xdc\x1b\x1d\x1e6Is0I\x99uRt\ 6<\x8dY\x9a\x05\xc4\xc2\xd8v\x94\x80\xe2\xd6\x0a\x00\ \xbfZ\xf3\x85%\xc0c\xd9\x1d|\xcbp\xc3\x91\x15\x8b\ o\x1b\xbf\x0c\xed\xe9\xa7\x89\x9e\x06F\x1c\xae\xa6\xb3-\ G\x82\xc5\xbcyd\x8d\xd8\xc4\xc7U4\xdcZ\x05\x9c\ \xd8h\xda\x8a\xd6\xea\x22\xc6\xbb-4-qZ\x16\xaa\ \xe3\xe6\x92\x08\xd0Dr\x97\xb9'\xb7J\x94\xc5a\xde\ 0\xce\xf9Z\xde`\x16\xfa\xd3\xa7\x8e9#\xfb\xc4$\ \xa0\xd0\x83jK\xe0bq\xe4c\x1b\x7fV\xa2\x8e\xf7\ \xa3\xd3\x96H$l\xb1\xcbs\xfdB\xd4J\xd9\xe51\ #\x03\x95,Ort\xb5V~\x1f8\x04\xfd\xd3v\ V\xd7\xe9N\xc0\x14\x83\x06\xceHV\x8e\xec\xc0\xef\xdb\ J;\xde\xd3;\x10VO\xf11\xc8C^O\xae\x95\ \xb2a\x11\xc3\x1cm\xeaD\x00\xf65\x99\xfe\x1e\x84\xcb\ \xc6\x17\x12\xea\x08MM\xf9\x9a\xd6\x931\xb9*nh\ \xe1\xe6\xaaQ\xb2\xadB\xc8J\x94\x07)$\x10z\x11\ \xb5\x11@9k\xd6\x81\xd4\x12,5\xad#4 H\ \xabl\xdb\x8e\x87\x98\xa1f\xb1\xb5\xa8\x92\xd7$yI\ \xdfK\x86\xf7\x1f\xb8\xa9\xb5\xcd\xadf\x1a\xe5\xbe\xfd\xc7\ ZR(\xd4P\xae\xf4kP\xa0\xc7.l\x18#\xe1\ }~u\x9c\x10.\xa0\xed\xbdi\xe2Al\x1c\x80n\ ,O\xb5QP-Y\xbe\x99B\x12\xe6\xdbs'\xa5\ \x5c\xc0%\xf0\xcc\xc4\xb2)`\x02\x8d\x0b\x0b\x1dOJ\ B\x80\x14+Z\xcer\xfc\x86\xa7\xf2\x1f\x9d\x5c\xc0\xdd\ \xa0\x91\x8e\xe6K\xfeUH\xa8\xac\xa5r\x18\xd3/\xe1\ \xcbP\xd8D\x98\x04\xf1dP=*u\x02\x99aL\ \x87\xd6GU }\x0di\x96\x0e5\xc3HQI\xca\ \xa4\xdb\xa0\x1b\x0f\xd2\xff\x00:\xb1\xc3\xb8xx\x84\xd8\ \x82\xc1\x0f\xa5F\xedT\x9c\x10\xc5H\xd4\x1b\x1a\xdfm\ Bd\xb6L\x82\xc4{V8\xf7u\xaaRA\x86\x8d\ r$\x00\x5c\xdf19\x884\xb4y\x12_\xb3\xce\xd7\ \x0d\xe8n_\xf8\xa7\xb0#\x98?\x95-\xf2\x99!r\ @\xc9%\x89'`\x7f\xbdl9\x94\x98\xd8\x0dY|\ \xcb\xae\xc4W@\xc92\xe7B\x01\xf8\x94\x9d\xa8\xe2\x17\ \x97/3py\xf6\xac\xf8\x96!#\xac\x8c\xdeQ\xe5\ \xcbE\xaa4\x02\x1b\x92t'\xb7*%[Ta\x03\ \x8c\x22g7'Q~B\x9a\x10\x9f\xeemZ\xc0\x85\ \x14\x5c\xab\x88#q\xa7#\xd6\xa4R\x9c\xbe\xaa8\xf4\ [\x03\xcc\xdf\xebAmk\xaeCyM\x89:\x8a\x90\ \xa6\xb6\x9dM\x1cyd\x87+r\xe69\x1e\xb5 \x8e\ \x82\xb8\x1c\xa4\xe5\x1a\x1d\xc5i%$a'\x85=\xae\ }/\xc9\xa8\xd9M\xedo\x95-\x99]2\xb4d\xaf\ }\xc5\x04s\x98\xdf\xc2\x98\x92\xa7\xd0\xc7\x97j\x90x\ \x9a_\x0c\xadoKkX\xfc`[\x09\x0c\xd9o\xe1\ K\xa9\xe87\xfdks\x1a\xc8 x\xdd\xd41\x17\x00\ \x9e\x95\x95\x8cH\xdf\x014fE7\x00\x8b\x1eco\ \xd6\xb1\xce\x18\xff\xd9\ \x00\x00*\x0f\ \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+\xec\xa5\xbbn\x00\x00 \x00IDATx\ \xda\xed\x9dy\x94]U\x9d\xef?\xfb\x0cw\xae95\ \xa5\x06*!!\x09\x14\x15\x84\x88\xd1\x00\x09\x08\xad\x08\ \x1d[\xec6`\x0bH\xd3\xf0\x1ch\xc4\xf5\xda\xd5O\ xH\x83\xda\x93\xadH\xabK\xb4\x15Q@\x9f\xd84\ \xad\x08\xd8\x0e\xc8 $\x81\x8c\x18\x92\x9a\x92\xaaT\xaa\ \xea\xd6p\xab\xea\xce\xc3\x99\xf6\xfb\xe3\xd6>\xb9\xc9\x13\ \x03a\xce\xcb^+\x8b[\xdc\xe1\x9c\xbb\xbf\xfb7}\ \x7f\xc3\x85\xe3\xeb\xf8:\xbe\x8e\xaf\xe3\xeb\xf8:\xbe\x8e\ \xaf\xe3\xeb\xf8:\xe6\x97x3\xddLuuuW&\ \x931\xa5\x94^]]\xdd\xfb\xd6\xacY\xf39\xd34\ ]\xd7u\xe5\xfe\xfd\xfb[V\xacX\x81\xe7y$\x93\ IZ[[)\x95Jh\x9a\xc6\xae]\xbb\xb0m\xbb\ \xfc\x85\x84@\xd3\xb4\x83_P\x08\x0bp\xd5c\xc30\ \xfa\x00\x0d \x1e\x8f\x7f0\x1e\x8f\x8f\xa8\xd7\xb6\xb6\xb6\ \x12\x8f\xc7\xdf\xd0=0\xde\xc8\x8b\xb7\xb5\xb5-\x9d\x9b\ \x9b{\xa7\x94\xd2\x03X\xbe|\xf9\xb7\xdb\xdb\xdb\xc3R\ J\x86\xf6\x0d\x11\x0c\x06\xa5\xa6i\xc2\x95.\x86a\xe0\ 8\x0eH\xc9D>A\x87\xd1A&\x93\x01]\x90v\ \xf2\x9c\xbd\xea\x9d\x00L'\xa6\xd1\x84\x86\xae\xeb\x00\xe8\ \xba\x1e\x90\x12D\xf9\xe8\x85\x813\xd5\xf5\x1b\x1b\x1bw\ \xae\x5c\xb9\xd2\x11B\xb0g\xcf\x1e\x86\x87\x87\x1b\xdf\xe8\ C\xf9\xba\x03RUUef2\x19\x1d`vv\xf6\ \xba\x8f~\xf4\xa3\xd7\xab\xe7\xfa\xfb\xfb\xcb'\x5c\x08\xf2\ \x94\xb0J\x96\x10\x9a \xe7\x14\xf0<\x0f\xcb\xb2\xc0\x83\ \x9c[\xc4\xb2,,\xcb\xc2\xd6]\x1c\xd7&\x9dN\x03\ p`z\x9c\xd3N\xea\xa6X*\xa1\xeb:;v?\ OU\x93\xc0\x9b\x0b!\x84\x00I\xf9\x9f\x00\x04\xb5\xea\ \xda\xd1h\x94\xee\xee\xee>@\xb8\xaek\xee\xd9\xb3g\ \xd1\xff\x17\x80\xb4\xb5\xb5=\xb8x\xf1\xe2\x8b\xa4\x94\xf4\ \xf7\xf7333S>\xf9@\xc9.o\xb2\x00\x8a\x9e\ \x85\xed\xd8\x08!p\x1c\x07)%\x96e!=\x89\x94\ \x1e\xb6mcY\x16\x8e!\x91\xe0\x7f\x86\xf4\x1a\ \x8f\xc7\x07\x8e\x19@\x1a\x1b\x1b?X(\x14\x22\x80\x15\ \x0c\x06\x97\xc7b1\xa4\x94\x98\x01\xd3\xdfX\x00\xc7s\ (\x95J\xfe\xc6Z\x96U\x06BZx\x9eW~\xce\ \x03)%\xa5R\xa9\x0c\x88\xe7\x95\x01,\x16\x01p\x1d\ \xd7\xffLW\xd3\x91\xea}@\x7fo\x1f\xe77\x9eG\ n4\x87)\xa0\x14M\xb3\xa0C\xc3\x89\x87\x909\x13\ t\x09\x9aDh\xc8\xb3\xce:\xeb\xb7\x00\xa6i\xf2\xe8\ \xa3\x8f\xde\x09|\xfc\x98\x01d\xc1\x82\x05\xf7\xbf\xedm\ o\xd34Mc\xef\xde\xbd\x94J\xa5\xf2\xa6\xba6\xb6\ eW\x80P\xdeh\x81@J\xcf\x07\xca\x96\xb6/!\ x\x12\xcf\x93\x077}\xfeD\xab\xd7\xba^YzJ\ \xa5\x12\xba\xa6\xfb\xcf\x09!\x90\x9e\x87\x87\x87+]\x12\ \xb33\x88%3\xa4\xa4\x09\x0b%\xd2\x168\xc9\x00n\ \xca\xc0K\x1b\xa2l\xd5\xc00\x0c\xea\xea\xeaNok\ k\xbbE\x08\xc1\xec\xec\xec\xf3ccc\x0f\xbe\xe5\x00\ \xe9\xe8\xe88\xa3\xa6\xa6\x86R\xa9\x84\xe7y^\xa1P\ \xd0t]\xc7u\xdd\x83\x00H\x0f\xcb\xb6|\x0fI\xd9\ \x09!\x04\x9eGY\xedH\x89\x8d\x8d7\xbf\xd1\xd2\xf5\ \x90B\xfa\x9b\xeeI\x81@\x1c\x04\xc4=(!\xba\xa6\ \xf9\xd2$\x84\xf0\xc1\xb1m\x9b\x03\xc3#\x9c\xbb\xe8\x5c\ dR\xe2II6\x92\xa2a\xa9\x8e7\x17B\xda\x02\ iiH\xab\xec\xaduvv\x9e\x09\x9ci\x18\x06;\ v\xec\xb8\xa7\x12\x90W\xdb3{\xad\x00\x09477\ o\xe9\xe9\xe9\xc1q\x1c6o\xde\x8cm\xdb\xb8\xae{\ P\xf5\xcc\x03`[\x07U\x96\xe7yX\xae[6\xbe\ \xa0\xc0\xc4\x16\x0eBB:\x9d.KQ\xb0D\xb1X\ $\x9f\xcf#\x1d\x81DV|\xc6A@4\xa1\xe1y\ \x15\x122\x0f\x88\xfa\xdcT*\x85\xe7yL\xa7f\xd1\ \x16M23rX\x14`x\xd8\x89\x00\xd6\x810B\ +\xbb\xd4\xb3\xb3\xb3+[[[o\x06t\xe0\xe1x\ <\xfe\xdc\x9bVB\xda\xda\xda\x9a\xc7\xc6\xc6j\x80\xa0\ \xfa\xc2\xae\xeb\xfa\x1b\xa1i\x1a\xae\xeb\xfa\x9b'=\x89\ \xed\x1c\x04\xc4\xc5#\x9b\xca\xa0\x09\x0d\xdb\xb3\xc8\xd8\x19\ \x1c\xc7\xc1\xd1=bf\xc4WY\x8ea\x93\xcdf\xc9\ \xe5rHG\xe0x.sss\x00\xe4\xbd\x22\xb6m\ Q(\x14\xd0\x84@\x9a\x07\xc1\x92\xe0{g\xbe\xd7\x06\ \xe4\xe6\xd2,k<\xcd\xb7\xe1\xe3\xc1q\x16\xad\x08\xe2\ L\x86qsAd\xa71o[$\x8b\x16-\xea\x01\ z4Mc\xfb\xf6\xed\x8975 \x85B\xe1\x9eK\ /\xbd\xf4\x82\x5c.\xc7\xe8\xe8(\xb6m\xfb\x1e\x92\x0a\ \xe2*7\xc2\x93\x92\x5c.G.\x97+\x8bU8\xe8\ \x9ffWs1L\x1d\xcf\xf30\xe4\xc1\x80\xafP*\ \x10Lk\x18U\xe5[\x176\xe8\x9e@3\xca\xeaE\ w\x05\x99L\x96t:\x8d@\x10\xaa\x8fP\xb4\x8b\xf3\ \x12\xe2\xf9\xce\x80\xef\xb5\xc9\xb2\xfa+\x96\xca\xaf\xd9\x9f\ \x9d\xa2\xed\xe2\x14\xd4\x070:%\x86\x06^Q\xc3M\ \x1a83\x012\xcfU\x81&\xd14\x8d|>\x1f\x01\ j\xe7\xf71\xf1\xa6\x03\xc4\xf3<-\x18\x0cR(\x14\ |\xd5\xe48\xcea\xb6\xc1\xa3P(\xcc?v\xfd\x13\ \x0b\x10\x8c\x84\xd0\xe6\xf5~ \xaf!\xea4\xce=\xf7\ \x5cfgg\xe9\xeb\xeb\xe3\x82\x0b.\xe0\xf2\xcb/\xe7\ \xce;\xefdpp\x90\xcb/\xbf\x9cX,\xc6\x9dw\ \xde\x89\xa6itvvr\xe0\xc0\x01tC\xc70\x0c\ \x04\xe0\x14lr\xb9LY:\x1d\xd7W\x91\xea\x9e<\ \xcf\xf3\xed\x13\x80\x91\xb4\xf1\x1e]DB\x96%\xca\xd3\ \x9d\xb2-\xb24\x04\x02\xdd\xf4|7\xb9\xa7\xa7\xe7\x9f\ O=\xf5\xd4\x7f.\x95J\xfc\xeaW\xbf\x12o\x0a@\ \x9a\x9b\x9b\x9b\x84\x10\x0f\x01\x05\xcb\xb2z\xd4\x06+\xa9\ \xa8TY*\xa6\xc8f\xb3h\x9a\x86eY\x18\xba\x81\ a\x94oC\x93\x82\xf7\xbc\xe7=\xdct\xd3M\x5c{\ \xed\xb5\x9c{\xee\xb9\xbc\xfd\xedo\xa7\xbb\xbb\x9bu\xeb\ \xd6q\xcb-\xb7\xf0\xfc\xf3\xcfs\xe5\x95W\xf2\x9d\xef\ |\x87w\xbc\xe3\x1d\x5cp\xc1\x05\xdc\x7f\xff\xfd\xdcx\ \xe3\x8dtvv\xf2\xcc3\xcfp\xcf=\xf7PSS\ C4\x1aezz\x1a\xd70\xd04\x0d\xcd\x12d\xb2\ \x19\xb2\xd9\xac\xaf:=\xcf\xf3\x1f;\x8eC8\x12&\ \x181\xd14\x8dg\x8b{x\xef51\x04\xe5\x80\xd2\ J\x988\x13a\xac\x91\x10\xeel`\xde1\x91\x04\x83\ \xc17\x8f\xca\x9a\x9c\x9c\x5c\xf4\xfe\xf7\xbf\xff\xccX,\ \xc6\xe6\xcd\x9b)\x16\x8b\xb2T*\x09\x05\x82\xeb\xba8\ \x8e\xc3\xdc\xdc\x1cB\x08t}\xfe\xf4\x0a\x81\xe6iH\ $w\xddu\x17\x89D\x82[o\xbd\x95\xab\xae\xba\x8a\ \xbe\xbe>\xce9\xe7\x1cv\xec\xd8\xc1e\x97]\x86\xe7\ \x95}\xd0o}\xeb[\xdcp\xc3\x0d|\xe1\x0b_ \ \x91H\xd0\xd3\xd3C\xb1Xdff\x86\x93O>\x99\ \xde\xde^:;;Y\xbcx1\x9f\xfa\xd4\xa7X\xb5\ j\x15g\x9f}6\xae\xeb\xf2\x9e\xf7\xbc\x87\x87\x1ez\ \x88R\xa9t\xd0Y8\xcc\xd1p\xe7\x1d\x0a\xdb\xb6I\ &\x93\x94\x92s\xec\xb87\x87\xe7I\x14\xfd\x22\xca\x11\ >\xd6\x8c\x815\x11\xf0\xf9\xb3\xea\xea\xea\xafK)\x09\ \x87\xc3\xcfMMM}\xffu\x05\xa4\xb9\xb9\x99\xc9\xc9\ I\xf5g\xde\xb6\xed\xcaS'\xd4\xc9S_XyP\ \x0a\x90\xaa\xaa*.\xbd\xf4R~\xfc\xe3\x1f\xf3\xde\xf7\ \xbe\x17!\x04\x17]t\x11\xdf\xf8\xc67x\xf0\xc1\x07\ \xf9\xc8G>\xc2\xf6\xed\xdb\xe9\xef\xef\xe7\xea\xab\xaf\xa6\ X,\xa2i\x1a\x0f>\xf8 ?\xfc\xe1\x0f\xf1<\x8f\ E\x8b\x16q\xf1\xc5\x17c\x9a\xe5\xd3|\xc5\x15Wp\ \xd9e\x97\xf1\xe8\xa3\x8f\xb2`\xc1\x02\xaa\xaa\xaa\x08\x85\ B\xe4r9\xee\xbd\xf7^\x22\x91\x08###\xec\xdf\ \xbf\xdfw\xa7\x93\xc9$\x8e\xe3\xf8\xae\xb2\xeb\xbah\x9a\ F\xa9T\xe2\xc0\x81\x03\xac?\xff\xa22\x18H\xa6\xf4\ \x04\x9d+L\xbc\x94\x89\x9b1\xf1\xaaMd\x87\x86\xd0\ $\x18R\x22\xf9\xa4a\x18l\xdd\xba\xf5G\xaf; \ \x93\x93\x93466\xfe\xd5\x89'\x9e\xf8\xdd|>\x8f\ \xeb\xba\x12\x10\x95~~\xa5\x97%\x84@\x08\x81\xb2/\ \xb7\xdf~;\xd9l\x96\xb5k\xd7\xf2\xf4\xd3O\xb3~\ \xfdz\xf6\xec\xd9\x83\xe38<\xf6\xd8c<\xfa\xe8\xa3\ \xe4\xf3yZZZ\xfc\xd3\x5c(\x14X\xb0`\x01\xa1\ P\x88B\xa1@*\x95\x22\x1a\x8d\xfaj#\x10\x08\xf0\ \xc0\x03\x0f077G\xa9T\x927\xddt\x93\x08\x04\ \x02eoK\xd3H\xa5R\xe8\xba\xce\xc2\x85\x0b\xf9\xb7\ \x7f\xfb7>\xf3\x99\xcf\x90L&\xfd\xf7+i\x0e\x04\ \x02\xbe\xb4\xcc\xcc\xce \xa5$\xe7\x96\x08_\x18Gv\ \x04\xd1\x84\x86\xa6yH\xcd\xc3\xc9\xe8\xd8\xe3!R\xbf\ \xae\x13\xe8\x12\xc30\x90R\xda\xaf$F9j\x95e\ YVW[[\x1bsss\xd8\xb6-\x94\xf1V1\ \x80\x94\xd2?}\xae\xebr\xddu\xd7q\xf5\xd5W\xb3\ a\xc3\x06v\xed\xda\xc5\xfa\xf5\xeby\xf2\xc9'q\x1c\ \x87\xeb\xaf/\xf3\x8b\x13\x13\x13H)\xfdk\xec\xdb\xb7\ \xef\x90k\x1e8p@m\xa0\xed8\xce\x01)%\xba\ \xae[\xf9|\xfe\xf2\xb1\xb1\xb1)\x80@ pIs\ s\xf3\xed\xb9\x5c\x8eB\xa1@,\x16\xe3\xdak\xaf\xa5\ \xa3\xa3\x83m\xdb\xb6\xf1\xdd\xef~\x97\x91\x91\x11\x9a\x9a\ \x9a|B\xd2q\x1c\x92\xc9$\xae\xeb\xd2\xd0\xd0p0\ \x9d\x97\xfc\xfd\x07F0\xa7\x1c\x06\x83\xd0\x12\x5cJ\ (8\x90\x1eD\x22\x11\x1e\x94\xe2c\x88y\xc6?\ \x9f\xcf\xffIss\xf3c\x9a\xa6i\xf1x|\xdd\xeb\ fC\xa4\x94V\xa9T\xc2\xb6m?\xbe\x80r\xf0\x96\ N\xa71M\x13!\x04\xa5R\x89p8\xcc\xdf\xfe\xed\ \xdf\xf2\xf4\xd3O\xd3\xdc\xdc\xcc\x8f~\xf4#\x1e\x7f\xfc\ q\x06\x07\x07\x0f\x01 \x12\x89\xfc\xe1\xa4\x8d\x10X\x96\ \xb5O\xd3\xb4!@:\x8e\xb3+\x1e\x8f\x7f\xfa\x0f\xbd\ 6\x12\x89|{\xeb\xd6\xad\xff\x09H\xdb\xb6\xb3\x8b\x17\ /\x1emhh\x88(\x09\xb9\xef\xbe\xfb\xe4\x97\xbe\xf4\ %\xf1\xbd\xef}\x8f\x0f|\xe0\x03|\xe8C\x1f\xe2\xf3\ \x9f\xff<\xdb\xb7o\xf7=\xaeJ\xa7$\x91Hp\xf6\ \x9a\xb3p\x1c\x07\x81`\xd4\x1c\xe3\x84\xf3\xa0mz9\ N\x22\x84\x1d\x0f![\xe6\xe3\x14C\x02\xb4\x18\x86\xd1\ \xb2q\xe3\xc6\xa3\x8a\xe0_6 uuu\xd7\xaeY\ \xb3\xe6\x1f\x07\x07\x07C\x8eSfUu]?$\xde\ \xb0,\x8b@ \xc0\x0d7\xdc\xc0\x8a\x15+\xb8\xe6\x9a\ k\xb8\xfe\xfa\xeb\xb9\xf0\xc2\x0b\x19\x1e\x1ef>9D\ ,\x16;\x12\xe8. \x85\x10d2\x99o\xc4\xe3\xf1\ \xaf\x1c\xe9\xfe\xd2\xe9t\x1e\xf0\x93N\xa3\xa3\xa3\xebG\ FF\xccy\xe9\xf9\xc7\xf1\xf1\xf1\xd3.\xb8\xe0\x02\x12\ \x89\x04\xb7\xddv\x1b\x13\x13\x13,^\xbc\x98\xe7\x9f\x7f\ \x9e|>\x8fm\xdb\x14\x0a\x05\xd4ws]\x97B\xa1\ P\xfeN\xc2\xa0\xd03\x81\xb6\xa0\x16\xad6G\xf4\x14\ \x0d\xa9I\xa4\x0dN2\xc0\xec\xcf\xeb\xf1\x8a\x9aR]\ \x1c\x8d\xea2\x8eBU\xb5-\x5c\xb8\xb0~ll\xcc\ \xb7\x17\x954\x87J\x0c\x01\xac_\xbf\x9e\xbe\xbe>L\ \xd3d\xf3\xe6\xcd<\xf5\xd4S\x04\x83A\x82\xc1\xa0O\ \x8f\x1c\x8e\x81\xb2EUUUl\xd9\xb2\xa5=\x99L\ N\xbc\x12\x9d\x9c\xc9d~\xa3\x1e\x87\xc3\xe1K\x0e\x1c\ 8`\x00\x9e\xeb\xba'\xdep\xc3\x0d\xd1\xaf|\xe5+\ \xf4\xf6\xf6\xd2\xd1\xd1\xc1\x9dw\xde\xc9\xfa\xf5\xeb)\x14\ \x0a\xbe]q\x1c\x07\xc7q\x98\x9d\x9d\xc5.Y\x94J\ :/\xf4\xe7y\xfb\xc2\x0b\x89\x85\xa3<\xbe\xef?\x08\ \xe9\xd5\xd8d\xc9\x1f\xb0\x91\x0eh\x9a\x86i\x9a\xf4\xf4\ \xf4\xdc\x9dL&7\x8d\x8c\x8c\xdc\xf9\x9aI\x88RC\ \x95\xbe\xbb\xd2\xc1\xb6m\xb3p\xe1B\xee\xb9\xe7\x1e>\ \xfc\xe1\x0f\xf3\xaf\xff\xfa\xaf\xfc\xdd\xdf\xfd\x1d\xc1`\xb0\ \xcc;\xcdK\x90\xe7y\xa8\xbc\x83R\x13\xf3\xf6@\xa4\ R\xa9\x87\x80\x84\xae\xeb\xe9p8l+\xc3\xab\xa4\xea\ \x95\xacD\x22qm\x22Q\x0e\xa8\xeb\xeb\xeb\x9f\x8c\xc5\ bg\xdf|\xf3\xcd\x8c\x8f\x8fs\xfb\xed\xb7\xb3s\xe7\ N\x02\x81\x80O\x5cV~\xbf\xe9\xe9i\xba\xbb\xbb\xcb\ \x81\xab+y|\xfcq\xba\xcf\x09\xd2\xae\xb5\xe2N\x84\ \xf0R\x0b\xa1\xed\x10r\x15]\xd7\xaf\xec\xef\xef\xd7_\ +@B\xef{\xdf\xfb\xf6\x1e8p\xa0Z\x89\xb2\xa2\ F\x94\xeb)\xa5\xe4\xd3\x9f\xfe4O=\xf5\x14\xf3\x5c\ \x0f\x1f\xfc\xe0\x07\xa9\xa9\xa9yI\x170M\x93-[\ \xb6|>\x93\xc9\xbc\xaa\xfc\xd0\x8bH\xfa\x8d\x03\x03\x03\ \xf5\x9a\xa6YR\xca\xff\xf5O\xff\xf4Oko\xba\xe9\ &,\xcbb\xdd\xbau\xec\xdb\xb7\x8f\xb1\xb11_\x8d\ 9\x8e\xe3\xb3\xc69\xafD\xdb{J\x84\xdb\xa1\xd0<\ \x8b\x01\x04\xb5\x08n\x09(\x98L\xfd\xa4\x11ax\x18\ \x86\xe1\xc7P\xaf\x05 \xf5\xd5\xd5\xd5\x0bu]\xf7%\ \xa4P(P,\x16\x09\x04\x02\x84\xc3a4M\xe3'\ ?\xf9\x09W\x5cq\x05\xb5\xb5\xb5\x14\x8bE\xdf[9\ \x5c\x1a\xd4\xdf\xba\xae\x93N\xa7w\x1a\x86\xf1\xb8\xeb\xba\ N$\x12\x89g2\x99\xd7\x14\x0cM\xd3\xc8f\xb3\xbf\ \xcbf\xb3\xea4_a\x18\x06\xb7\xdcr\x0b\x86a\xc8\ \xbb\xee\xbaK\xac^\xbd\xda\x7f\xbdr\xe3\x95&\xc8\x14\ sD\xb6\xe7\x98\xfa}\x9a\xcb\xcf\xf8[\x5c\xbd\xc0C\ \xbd\xdf\xa6)\xdc\xc5Df\x88\xb9\xb1\x22\xc2(_g\ fffQ4\x1a\xfd\xcb\x5c.w\xdf\xab\x02H\x85\ \xdev\x95\xaf\xaeD\xd9\xb2,\xf2\xf9<\xed\xed\xed<\ \xf4\xd0C\xbc\xff\xfd\xefg\xdf\xbe}\x5cw\xddu\x04\ \x02\x014M\xfbCU \x87|~8\x1c&\x1e\x8f\ ?533s\xc3\xeb\x95F>\xfc\xd4\xa6\xd3\xe9\xcd\ ;v\xec\x08z\x9e\xa7\xb7\xb4\xb4\xbc\xff\xe9\xa7\x9fF\ \xd7u\x84\x10\x84\xc3\xe1CT\x97i\x9a\x9c}\xda\x1a\ \xa4\x07\xaet\xd9\xd6\xbb\x11\xd3\xd0Y\xea\x9c\x83;#\ Xj/\x86\xd5\xaa\x9eG\x02\xac)\x14\x0ak\xee\xbe\ \xfb\xeeW\x07\x90x\x9fg\xef\xde\xbd\xe1|>_\xe4M\ \xb8\xea\xea\xea\x1e;\xe5\x94S\xce]\xbe|9[\xb7\ nezz\x9a\xd6\xd6V\xa4\x94d2\x19\x16-Z\ \x84\x8e\x86S\x82\xa2W\xc4\xa5\x84iG\xd0\x8dy5\ m\x820\xfcxJ\x9a\xa6)\xb6o\xdf\xbezll\ l\xf3+\xb5!1\xcf\xf3\xaa\xd4\xe9p]\xd7gk\ \xe3\xf18\xe7\x9cs\x0e7\xddt\x13\xdb\xb6m#\x97\ \xcb177G*\x95\x22\x10\x08\xd0\xda\xda\xca\xd8\xd8\ \x18ccc\xacX\xb1\x82m\xdb\xb6Q,\x16\x7f5\ >>~k,\x16K\xd7\xd7\xd7\x97\xf2\xf9\xfc\x9b\x11\ \x0f\x84\x10\x01\xdb\xb6y\xe2\x89'\xe8\xee\xee\x96\x97\x5c\ r\x89\xb8\xeb\xae\xbb\xa8\xad\xad\xc5\xf3<\x9fG\x1b\xd5\ gh\xff\x8bY\x164\x06p\xf2V9\xcb8\x15\xc2\ \x9a\x08\x22\x0b:^^\x07\x10\xd1h\x14\xc30\x9cW\ \xac\xb2\xea\xeb\xebooll\xfcS\xe5\xea*@\xba\ \xba\xbax\xf6\xd9g\xd9\xb4i\xd3\x8b\xbewtt\xd4\ \x97\x9a\xde\xde^b\xb1\x18\x81@`r\xff\xfe\xfdO\ \xcf\xcd\xcd\xf9i\xd77\xe3r\x1c\xe7\xf3\x03\x03\x03\xcd\ \xb6m\xafY\xb3f\xcd\xb5CCC\x18\x86qH~\ \x07 e\xe58\xb39J!/y\xd7\x09\xef\xa3\xaf\ j3\xe9\x8e\x19@P\x186\x99\xf9E\x0d\xe8e\xf2\ \xf3U\xb1!\xae\xebF\x94\xfb\xaa\x0a\x0b\xde\xfd\xeew\ 3::\xcac\x8f=F8\x1c\xf6\xcb<\x15\xbd\xae\ \x0c~\x85k[.\x09u]\xd2\xe9t\x947\xf9\xaa\ \xae\xae&\x9dN\xff\xf7<7\xe6\x0e\x0d\x0d]\x9bL\ &QU3\x9e\xe7\xd1\xdf\xdfOUU\x15\x86g\xb3\ \xedk6\x94\xa2\xcc\xd5\xedD\x0a\x93x\xca!`\xea\ \x14\x0b\x19\x9cT9==55E,\x16\xfbaS\ S\xd3\x0dSSS\x8f\x1e5 RJWI\x86\xb2\ \x07\x13\x13\x13\xdcx\xe3\x8d|\xf5\xab_\xe5\xf6\xdbo\ gxx\x98\x93O>\x99\x99\x99\x19\xe2\xf1855\ 5<\xff\xfc\xf3h\x9a\xc6I'\x9d\xc4\x96-[\xc4\ \xe8\xe8\xe8\x13\xd3\xd3\xd3\xeb\x00\x16.\x5c\xc8\xf8\xf8\xf8\ \x9b\x16\x10\xc5\x02\xcfK\xb7\xa9\xb2\x9c\xabV\xad\x92\xa3\ \xa3\xa3\x22\x99L\xd2\xd0\xd0\xc0\xc9'\x9f\x5c&#=\ \x1bN\x9a\xa1\xa6\xae\x80\x97\x0eP\x93Z\x84\x976q\ S\x06\xb4\x80\xd0\xa5\x22>O\xba\xf7\xde{\x1b\x8eZ\ B\x9a\x9a\x9a\x16\xbb\xae\xfbn\xe59\x05\x02\x01\x02\x81\ \x00CCCl\xd8\xb0\xc1\xf7\x9a\x00~\xff\xfb\xdf\xfb\ 9\xf3\xcaxc\xd3\xa6M\x84B!\xffu\xc0\x9b\x1a\ \x8c?\x10D>\xbae\xcb\x96\xb5\x81@\xe0\xea\xf3\xce\ ;\xef\x8a\x1f\xfc\xe0\x07~j!\x93\xc9 =\x8f1\ \x99\xe0\x8c\xb79\xd8\x8eKU\xa8\x86\x82\x9bA\xe8\xe5\ \x82\xbe\xfc\xae\x18\xe9gj@\x1ctr\xfe\xe8\xf5\x8e\ @\xcc\xad\x89D\x22\x0b]\xd7%\x99L\x22\xa5\xe4\xfa\ \xeb\xaf\xa7X,\x12\x0e\x87\x89D\x22>H\xa1P\x88\ `0H8\x1c&\x1c\x0e\x13\x0a\x85\x08\x85B\xc4b\ \xb1C\xbc\xab\xb7\xda\xcad2\x93\xa5R\xe9IM\xd3\ F\xbe\xf5\xado\x1d\x22=~2N\xba\x80\xc6by\ \x11\x9fY}7\x7f\x7f\xee\x8f\x18\xde\xe3\xd2\x11[\x8e\ \x08\x96k\xcf\x14{|\xa4\x98\xe4\x8f>\x1b\x0e\x87\xaf\ \x5c\xb2d\xc9\xdd\x00\xc9d\x92\xa6\xa6&~\xf2\x93\x9f\ 0==\xcdC\x0f=\xc4\xfe\xfd\xfbY\xb7n\x1d\x8f\ <\xf2\x08+W\xae$\x91H088HOO\x0f\ \x8d\x8d\x8d\xfc\xf0\x87?\xa4X,\xce\xbc\xf0\xc2\x0b\x8d\ \xcd\xcd\xcd\x81\xc9\xc9\xc9\xd2[\x15\x98\x9a\x9a\x9a/\xac\ ^\xbd\xfa\xa6\xd1\xd1Q\x92\xc9$\xa1P\x88\xd3O?\ \x9d@ \x80\x04\x02\x86\x86t\x028^\x09\xc30q\ \xa4\x8d\xa6\x97k\xcfd\x0510<<\x1c\x7f\xfa\xe9\ \xa7\x17\x1e\x95\xca\xd24-\xacT\x90\xae\xeb\x84B!\ >\xf9\xc9O\xd2\xd9\xd9\xc9\x0b/\xbc\x80\x94\x92\xde\xde\ ^t]\xf7\xf3\x1c\x00\x8f<\xf2\x08\xae\xeb\xaa\x82\x06\ \x09\xc8\xb72\x18\xf3t\xcb\xcf\x9ey\xe6\x99\xfd\x0b\x17\ .\xbc\xbd\xbd\xbd=:::\xea\xf3y\x1e\x1e\xdb\xeb\ \xfb8\xeb/\x22\x18\x19\x137m\xa0\xa7\x82\xb8)\x03\ 7m`\x8d\x85\x10\x02\xc5h\x9bGmCB\xa1\xd0\ \xa7e\xd9\xaa\x8b%K\x96\xe08\x0e\xf9|\x9e={\ \xf6\xf8\xd1\xab\xe2|\x82\xc1\xa0\x9f\x94Qe\x9b\x80L\ \xa5R6\xc7\xc0\xcad2\xcf\x02\xcf\x1a\x86\xf1\x8f#\ ##QM\xd3\x0e&\xe5\xa4C\xfdB\x03\xe1\xea,\ j<\x85\x9aEU\xbc0\xb5\x89X\xa0\x96\xbc>\xc5\ \xc8W[\x11Z\x99PU\x99\xd5\xa3\x02DJ)\xa4\ \x94\xa2T*\xf1\x89O|\x02\xc30\xb8\xe8\xa2\x8b\xf8\ \xf2\x97\xbf\x8ci\x9a\x18\x86A*\x95bdd\x84\xee\ \xeen\x86\x87\x87I\xa7\xd3\xf4\xf7\xf7\x93\xcdf\xc9d\ 2\x7f300\xf0\x0d\x8e\xa1\xa5\ \xa4\x85B\xa1\xee\xa8mH}}}\x7fSS\xd3R\ \xd7u\xa9\xab\xab\xe3\x8a+\xae\xa0\xb7\xb7\xd7/6\xf0\ \xdb\x0aJ%B\xa1\x10\xa5R\x89l6K4\x1a%\ \x95J\x91\xcdf\xaf;\xd6\x00iii\xf9\x8c\x10\xe2\ \xb3B\x88\xba\x95+W\xfa\xb9\x9e\xa2g\x11:9\x85\ \xe1\x18x\xd3\x11\x9c\xc90h\x1eB\x13*\xd7\x8e\x94\ \x92\xe9\xe9i\x1e{\xec1q\xb4q\x88Pt\xb5\xae\ \xeb\xdcu\xd7]\x87$\xa3*\xdd[\x15\xb9\x9a\xa6\x89\ m\xdb2\x16\x8b\x89t:\xad\x1fK`TWW3\ 11\xf1\xa5\xd6\xd6\xd6k\x81:\xcf\xf3\xcaD\xa9\xd0\ x\xac\xb8\x9d\xbf\x5c\xd5\x84#m,\xb7D\xcc\x08\xe3\ ft\xbcT\x90\xdc\xce\x18V<\xf0\x07\xa9\xff\x97\xe5\ \xf6\x02\xa6m\xdb\x5cp\xc1\x05466r\xf5\xd5W\ \xd3\xd4\xd4\x84i\x9a,^\xbc\x98\x8e\x8e\x0eL\xd3\xa4\ \xb1\xb1\x91d2I.\x97C\xd7u\xe2\xf1\xb8\xd8\xbd\ {\xf7/2\x99\xcc/\x8f%@\x94\xcb+\xe6O\xa1\ JEX\x96\x85\xd0\xca\xe5\xa6\xef\x8c\xfd5_\x5c\xf7\ 0\xcbj\xcfdy\xc3\xd9D;%\xc4J\x07\x1b\x8c\ ^\x89\x0d\x01\xc4|v\x8d{\xef\xbd\x97\xa1\xa1!\xf6\ \xec\xd9\x83i\x9a\xd4\xd7\xd7\x93\xcdf\xd1u\x9d\xce\xce\ Njkk\xd9\xbbw/===d2\x19\x0a\x85\ \xc2\xe6x<\xde\xcb1\xb8\x1c\xc7\x91~W0\xa0!\ \xd0C\x82}{\x93\xfc\xcb\xff\xb8\x9c\xeb\x1e|7w\ _\xb6\x99\xc9\xb9i\x9eK\xfc\x17\xdf\xfb\xd5\xbdX\x96\ \xe6\x07\x94\xaf\x88\xcb\xd24\x8d\x81\x81\x01.\xba\xe8\x22\ \x0a\x85\x82\xaf\x0b+\xcb\x5c\xfa\xfa\xfa\xfc\xc7O?\xfd\ \xf4!Q\xf9\xb1\xb8fff\xde\xd5\xd2\xd22\xa5x\ -\x81@\x84\x05\x85\x9cG8t\xd0\xabu\x5c\x87\xc7\ \x87\xfe\x03\xcf\x95\xbe\xbd}\xa5\x12B \x10\xa0\xbe\xbe\ \x9e@ \xa0\xaa\x14\x09\x06\x83d2\x19jjj\xfc\ \xbc\xba\xca\xa9g2\x19,\xcb\xb2\x81\xb1c\x15\x10\xd7\ u\xb3\xf3\x92R\xa6C(\xe7\x80b1\x13\xdb\x02\xd7\ \x9b\xef\x08\xc6\xc5\xf5\x1c<\xd7\xc5\xb2\xbcW\x0e\x88\xe7\ y\xac[\xb7\x8e+\xaf\xbc\x923\xce8\x83\x87\x1f~\ \x98\xdf\xfd\xeew\xe4\xf3y&&&8\xe3\x8c3\x98\ \x9c\x9c\xa4\xaf\xaf\x0f\xcf\xf3hll\xe4\x85\x17^\xc0\ \xf3\xbc}\xf1x\xfc\xdf\xdf\x0c\x93\x11^\xab5\xcfd\ K\xcb\xb2\x84@ 4\x9d\xa5\xcb\xeayd\xeb\xcf\xf9\ \xcc9\xdf\xe2\xbf\xf6|\x13'\x17\xe6\xbc\xc5\x1b\xe8u\ \xbeC\xa9\xe4\x1c\xa2U\x8eZB6n\xdc\xc8\xf4\xf4\ 4555\x0c\x0c\x0c\xf8(K)\xf9\xe9O\x7f\xea\ W\x92x\x9e\xc7\xd4\xd4\x94*\xae\x16\xc01\x0b\x06`\ \x15\x0a\x85\xd9B\xa1P\x9fL&\xd1\x84F\xbe\xd9\xa3\ hU\xf1\x1fC\x7f\xcf'c\xdf\xe3@\xae\x9f\xe7'\ ~\x87\x11\xd0\x98\x19K17W\xaeCP\x99\xd5\xa3\ \x06\xc40\x0cFGG\x19\x1e\x1eF\xd7u\xdf\xe5\xd5\ 4\xcd\xff[E\xed*\x0f299\xd9\xd2\xda\xda\xfa\ \xbex<\xfe\xc8\xb1\xaa\xb5\x84\x10\x96JW\xab\x86\x1e\ #(\xa8\x22\xc2\x1d\x8f]K\xb2\xcfcfo\x81R\ \xd2#7\xe9\x224\xe1\xef\xd3Q\x03\x12\x8dF\xf9\xc8\ G>B\x7f\x7f?\x17_|1O<\xf1\x04CC\ C\xd4\xd5\xd5\xe18\x8e\xef\x06\x8e\x8c\x8c\x90L&i\ iiarr\x92\x5c.WM\xb9\x18\xe6\x98\x03\xa4\ \xa5\xa5EU\xe9Ku\x08kkk1\x87\x8b\xf5\ )\xa4\x94l\xdc\xb8\x91\xba\xba:jkkq]\x97\ \xd1\xd1Q\xba\xba\xba\xfc\xc6\x97\xb6\xb66r\xb9\x9c\x02\ \xca;\x16Ecbb\x82\xf6\xf6\xf6\xef\x06\x02\x81F\ \xd7u\xb9\xe3\x8e;X\xb7n\x1d_\xfb\xda\xd78p\ \xe0\x00\x9e\xe7\x91\xc9d0\x0c\x83\xd9\xd9Y\xaa\xab\xab\ \x09\x85B\x0c\x0f\x0fS(\x148R\x0d\xc1\x91\xd8^\ ~\xf1\x8b_\xf0\xf3\x9f\xff\xfcE_Si'v\xed\ \xdaE$\x12yI\xc6\xeb\xad\xbc\x02\x81\xc0\xdaU\xab\ V\x19\xbf\xff\xfd\xefY\xb1b\x05}}}\xac]\xbb\ \x96\xef\x7f\xff\xfb\xf4\xf4\xf4066FWW\x17\x8f\ <\xf2\x08\xd5\xd5\xd5\xb4\xb7\xb7s\xdai\xa7q\xdf}\ \xf7\x1d17\xf4G\x15Zkk\xebpUU\xd5\x09\ \x95\x84Z\xa9T\x22\x12\x89\xf8\x95%\x91H\x84\x5c.\ \x87\xe7y\xd4\xd5\xd5\xf9\xd2\xd2\xde\xden\xcf\xcd\xcd\xdd\ \xb3g\xcf\x9e\xab\x8f5@\x16-Z4x\xea\xa9\xa7\ \x9e811\xc1\x92%KX\xb3f\x0d\xbf\xfc\xe5/\ )\x95J\x04\x02\x01\xb2\xd9,\xe1p\x98t:\xed\xef\ \x9b\xe7y\xe4r9\x5c\xd7e\xe7\xce\x9dG\xc7eE\ \xa3Q\xeb\x9b\xdf\xfc&\xa9T\x8a\x0f|\xe0\x03\xdc\x7f\ \xff\xfd\xf4\xf6\xf6\xd2\xd0\xd0@UU\x15\xcf=\xf7\x1c\ UUU\xf4\xf5\xf5111AWW\x17###\ \x0c\x0f\x0f\xe38\x8e)\x840\x8fA0\xfe*\x10\x08\ \xd4\xcd\xcc\xcc \x84`h\xdf\x10\x03\x03\x83\x18\xc6\xa1\ '\xdf\x1f\x863\x1fw\x08!\x08\x85B\xfe\xff?*\ @t]\xe7s\x9f\xfb\x1c_\xfc\xe2\x17\xb9\xf5\xd6[\ \xd9\xb1c\x87_u\x91\xcf\xe7\xd1u\xdd\xafFq\x1c\ \x87\xe1\xe1a?\x8a\x9fw\x8d\xbdyI;f\x5c\xe0\ \xb6\xb6\xb6\x7f\x5c\xbati=\xc0\x8e]\xcf\xe35\xa5\ \x89\x04Ld&\x80\xb44\xdc\xf6ENd\x0d\xdaD;n\xca$S\ J\x91\x9c+3\xe0\xaa\xb7\xe4\xa5\xd4\xf8\xfeQ\x09\xb1\ m\xbb\xdf\xb2,\xd6\xae]\xcb\xb2e\xcb\x18\x1f\x1f\xa7\ T*177Gss3\xe9t\x9a\xda\xdaZR\ \xa9\x14\x93\x93\x93TWW\xa3\xeb:\xaa\x87\xc4\xb6m\ L\xd3\x94\x15N\xc2[Vu\xe5\xf3\xf9\x8f\xfd\xe9\x9f\ \xfe\xe9\x97M\xd3\x04)\xc9\xd8E\xde\xbdh9\xa9\x9f\ \x19\xcc\x15S\xfc\xc3\xc3_\xc6\xd0\x0d4C X\x80\ \xae\xc1\x82F\x9d\xa1\xa1!\x1a\x1b\x1b)\x16\x8b\x04\x83\ A\xe9y^\xf8\x15\xd1\xefcccl\xd8\xb0\x01\xc3\ 0\xfc\xfc\xb9Z\x83\x83\x83\xbe\xc1\x02x\xee\xb9\xe70\ M\x93J\xe2\xcdu\xdd\xaa\x95+W\xde5555\ \x18\x8f\xc7\xff\xe1\xad*!\x9e\xe7\xd5)\x16\xbb m\ \xec5#,\xe8\x89\xe1\xe2\x22mp'\xa2X\x93\x01\ \x9c\xc9 V\xdc\xf0\xab\xdeUCl*\x95\xa2\xb9\xb9\ Y\x14\x8b\xc5\xab\xda\xda\xda\x18\x1b\x1b{\xf9*K\xd3\ 4O\xa9\x9eH$B0\x18\xf4\xeb\xb0T\xd7\xd4\xe1\ 5Xjz\x82j\x03\x03B===W\x01\x7fr\ \x0c\xd8\x8fr\xff\xa1eQW\x13\xa2Tp8w\xc1\ _\xf3\xde%W\x10h\xb5\xa8\x7f\x9bC\xd5y\x09J\ y\xfb\xe0L\xc8\xf9z,U\xa0.\x84\x08\xbe\x18\x18\ G\x94\x90\xaa\xaa\xaa{\xc7\xc6\xc6\xd6\x7f\xf6\xb3\x9f\xfd\ \xf3\x9a\x9a\x1a.\xbd\xf4Rn\xbb\xed6\x92\xc9$+\ W\xae\xc4\xf3<~\xf9\xcb_\xb2r\xe5Jv\xec\xd8\ \x01@0\x18\xa4X,\x92\xcdf\xfd\xc1\x01\xf3\xae\x9e\ \xfbVT]\xa1P\xe8/\xd6\xaf_\x7f\xff|%\x8d\ t])\xc2U:\xde/\x1a\xc8\x08\xc9\x03\xdao@\ \x80\xa6u\xfa\xef\xa9\xae\xd7\xd8\xbcy3\xcb\x96-\xf3\ [\xe1\x94*?R\xd0\xfcG\x01\x99\x9a\x9a\x92\x8b\x16\ -\xb2\x1ex\xe0\x01>\xfe\xf1\x8fs\xf3\xcd7\xd3\xd7\ \xd7\x87\xa6i\xc4\xe3q?%\xb9e\xcb\x16\x0a\x85\x02\ \xc9d\x92\xe6\xe6f\x9f|T\xee\xafm\xdb\x84\xc3\xe1\ 3.\xbc\xf0\xc2g\x06\x06\x06\xfe{pp\xf0\xd6\xb7\ \x90\xaa\x0a)\x9bh\x08]\x0c\x9d\xb0\x8bw\x9c_\x85\ \xeb\xb9\xd8)\x0d\xd2\x11\xdc\xb4\x81\x9b4)\x0e\x86\x91\ \xae\x00\xb7\xac\xde+\xa7\xd7\x05\x02\x01\x12\x89\xc4\xf3\x86\ a\xec{En\xaf\x94Rs]\x97/}\xe9K~\ \xbd\x95\xf2\x16\xa4<\xb4]K\xd34\xa6\xa7\xa7}\xf1\ T\xddF\xf3\x11lM}}\xfd;kkk\xf7\xbe\ EH\xc4\xda\xfa\xfa\xfa%\x89Db\xd1|\xd2\x0d]\ j\xe8\x96 5$\xa9\xd3N\xa4\xb5\xae\x9a\x01o;\ \xa2JCT\x0br/T\xe3\x155\x7f\x22\xc5\xc1\xd9\ \x92R\xb52|sjj\xea\x99W\x04\xc8\xec\xec\xec\ W\xb3\xd9l\xe75\xd7\x5c\xf3\xaeB\xa1\xc0\xbb\xde\xf5\ .\x1ex\xe0\x01<\xcfc\xc1\x82\x05\x8c\x8f\x8f\x13\x0e\ \x87\x89\xc5b<\xf3\xcc3\xb4\xb7\xb7\xd3\xd2\xd2B\xb1\ X\xf4I\xb6\xcaQ\x15/\xb7M\xf8\x8dZ\xc5b\xf1\ \xe3\xa7\x9f~\xfa?(C^\x92\x16\xc1\x06\x87\xa6\xd9\ \xb7#\x9e\x13\xe4\x80\x1c\x0e\x01N\xf5\xdf\xd3\xded\xb0\ {\xf7n\xbf\x15CU\xe2\xa84\x05\xe59\x8dG\xaf\ \xb2\x0c\xc3 \x9dNo^\xb8p\xe1\xd0\xbe}\xfb\xde\ \xf5\xef\xff\xfe\xef\xf4\xf7\xf7\xb3t\xe9R\x0c\xc3\xf0\xdb\ \xa3\x0d\xc3 \x1a\x8dr\xca)\xa7077GCC\ \xc3!\x05e\xaaIt\x9e\x07\xfb\xe0%\x97\x5cr\xfe\ \xcc\xcc\x8c\xd8\xbe}{w:\x9dN\xbcY@\xa8\xb4\ m\x9e\xe7\x99\xf9|\x1e!\x04y\xb7\x04\xe7\x1e`\xf1\ \xb20\xd2\x03i\xcfG\xe4\x96\x86=m\x92z\xbc\x0e\ )\x5c\xbf\xa1G\x1d\xc0d2I0\x18D\xd34\x19\ \x08\x04\x84eY\xe6+\x02\xa4\x22\x12\x17}}}\xac\ [\xb7\xce7P\x87\x97\x8d*\xf5%\x84\xe0\xd7\xbf\xfe\ \xf5\xc1!e\x9aF\xb1X\xf4\x01\x11B\x84\x0d\xc3\x08\ \xd7\xd6\xd6bY\xd6\x9b\x8a\x16\x8e\xc7\xe3\x9cr\xca)\ \xff\xa7\xb9\xb9\xb9\xb3T*ud\xd2i\xf04\x1c\xcf\ \xc3x\xb2\x96\xa1\xcd\x82\xf9V\xe7\x0a^\xd6%;3\ MuM\x95\xdfa\xe6\xcf\x1b\xb6mB\xa1\x10\xba\xae\ \x8bM\x9b6\x9dX__?\xf1\x8a\x00Q\xabT*\ M\x99\xa69\xaa\xebz{SS\x13\x86a\xf8\xdc\x8c\ \x9a_\x15\x0a\x85|#\xaf\x8a\xe9\xd4\x00\x80\xd9\xd9Y\ \x7f\xca\x8e\x9a\xdb\xeb8\x0e]]]\xd7\x04\x02\x81\xec\ \xc4\xc4\xc4\xf3SSSO\xbe\xd1R1\xefY^\xb0\ `\xc1\x82z\x80\x84\x9d\xa6z\xcd,\xf5\xd5!\x9c\xc9\ 0\xced\x08Y\xd2\xf1J\xe5\xb9\xbex\xe5\xc3\x18m\ )w\x07TN]U\xd9SUt.\xa5\xdc73\ 3s\xc4\xfbyI\x95\x85\xf9|\xfe\xbf\xc7\xc7\xc7\x7f\ \xdc\xd4\xd4\xf4?\xef\xbe\xfbnV\xadZ\xe5\xab\xa3\x0f\ }\xe8CLNN\xb2|\xf9r\xba\xba\xba\x98\x99\x99\ a\xed\xda\xb5\xac^\xbd\xda\x1fJ\xa6Z\xdb\x22\x91\x88\ ?$\xcc\xf3==}\xdbK\xbd\x97\ \x97\x05\x88\xda\xd4D\x22!=\xcf\x13\xf3\x5c\x15\xba\xae\ S,\x16\x0f\xe9QW4\x8bJh%\x93Iff\ f\xa8\xa9\xa9\xc1\xb2,L\xd3T\x80\xc8\xce\xce\xce\x8f\ ,Y\xb2\xe4#\xba\xae\xf3\xab_\xfd\xea*\xe0\xee\xd7\ AU\xb5\xa5\xd3\xe9\xf3<\xcf+\xe5r\xb9\xe5\xaac\ 8e\xe7\x09\xafL\xa1\x05\x83\xd0%\x91\x96\xc0M\x99\ 8I\x037i\x10\xf6j\xa9\xae\xa9Fz\xd2\xb7\x8b\ \xba\xae\xfb\x83\xdc\x943T1(\xe1\xc0\xe8\xe8\xe8o\ _\x0b@\xe2[\xb7n\x0d\x06\x83\xc1[>\xf1\x89O\ \xdcx\xf6\xd9gs\xfe\xf9\xe7\xf3\xedo\x7f\x9b\xed\xbb\ %_\xa5\x00\x00\x09\x83IDAT\xdb\xb7\xf3\x8ew\ \xbc\x83t:\xcd\xe0\xe0 555>\xaf\xb5z\xf5\ j\x9e{\xee9\x1f\xac\xc3g\xf8Z\x96%\x94s0\ \xdf\x22\xd7\xd1\xdd\xdd}\x86\x94\x92\x99\x99\x99=\x13\x13\ \x13\xafI#{\xa1P\xf8\xcb\xcb.\xbb\xec\x9fU\xbb\ rQ+\x12\xad\x13`\xe9x%\x0d\x99.\xdb\x88\xb2\ b\x97\xc8\x060\x9a\x0d\xb6\xef\xd8F\xc8:\x98bP\ \x87+\x99L\x22\x84\xf0\x0f\x9ceY\x04\x83Al\xdb\ ~YsF^\x0e \x92\xf2\xcfM8\xdb\xb7oG\ J\xc9\x8f\x7f\xfcc\xa6\xa7\xa7\xf1<\x8f\x07\x1ex\xc0\ O^U\x8e\xca\xdb\xb4i\x93_\xfe\xa2NN\xa1P\ 8\xc4E\xac\x9c\xd5x\xea\xa9\xa7\xde\xd6\xd1\xd1q[\ $\x12\xe1\xe1\x87\x1f^\x05l}\x15\xa5\xe2\x03\xc0i\ \xe5\xbdt\xdf\xbds\xe7\xce\xf2\xc8\x0c\xcfA\x9c\x90\xa6\ \xa6t\xa8Wj'u\xec\xf1 &!\x9a\x9b\x9b9\ \xfc\xc7\x04\x0e?\x5c\xca3\x8d\xc5bd\xb3Y\x06\x07\ \x07\xfbu]\x1fx\xad\x00\xf1\x1d\x81P(\xc4\xb6m\ \xdb\xfci\xa4\xaa]AuTU&\xf2\x95d\xa8\xea\ \x8b\x5c.G\xb1X\xf4\xd9\xe3J\xcfKM\x11M\xa7\ \xd3x\x9eGGG\xc7\x7f\x9et\xd2IE\xd7u\xf5\ \xde\xde\xde;\xe2\xf1\xf8\xd7^\xce\x8d\x1e6\xce\x96l\ 6{\xcde\x97]va6\x9bE\x08A\xa2v\x5c\ v.3\x85\x15\x0f\xe3\xcc\x04\x91\x19\xd3\xf7h\xa5\xe7\ !5Ixi\x98\x8d\x9b6R[[\xeb\x03R9\ \xe4SM\xe9VqW0xp\x5c\xfa\xf4\xf4\xf4\xb2\ \x97\xcb\xdd\xbdl@t]\xbf\xfb\xc9'\x9f|J\xd7\ \xf5+/\xba\xe8\xa2\xcb\xd6\xae]K[[\x1b\x9b6\ m\x22\x9dN\x93L&\x99\x9b\x9bC\xd7uN8\xe1\ \x04\x86\x87\x87\x99\x98\x98\xe0\xf4\xd3O\xe7\x85\x17^8\ \x044\xdb\xb6\xfd!6\xa5R\x89`0\xe8\x7fa\xdb\ \xb6\xa9\xab\xab\xebT?\xfe\xb2k\xd7\xaeu\xe1px\ \x06\xd0\x82\xc1`!\x99L>p\xa4{\x9d\x9c\x9c\xe4\ \xe4\x93O~|\xd1\xa2Ek\x95]\xdb7\xb6W\x06\ \x82\x9a\x90\x05\x03}&\x22\x0e\xf4\x83\xd0l\x84f\xe3\ z\xae\x1f?\x00\xd4\xd4\xd4\xa0\xe9\x07\x8b;*\x01Q\ \x01\xaf*\x5c8\xf1\xc4\x13\x89\xc7\xe3\x94J%\xaa\xaa\ \xaa\x0e\x99R\xf1r\x88\xd4\x97\x0d\xc8\xdc\xdc\xdc 0\ XSSs\xd6\xce\x9d;Y\xbe|9\x03\x03\x03\xfe\ TO%\xca\xae\xeb266\xe6s];v\xec\xf0\ \xdb\xe0T\x10977\xc7\xe1\xe3e+\xb8/\x7f\x13\ \x00\xd9\xdd\xdd}\xc9\x8a\x15+.\x01\xd8\xbf\x7f\x7f~\ tt\xb4e^E\xe8SSSO\xba\xae\x1b\x9f\xe7\ \x8d\x16\xb5\xb5\xb5m\xac,\xd9\xac\xdc\x10\xe9I\xa1\xa4\ @I)\xc0\xf4\xf44===~,1;;[\ \xe6\xaf\xe6'ST\x8e\x16Q\x80T\xd2\x22K\x96,\ azz\x9aR\xa947555R,\x16\x9d\xa3\ Q\xab\xaf\xa8o\xa0\xad\xad\x8d\x8d\x1b7\x02\xfc\xc1Y\ \x1eUUU\x87\xe7W\x08\x85B\xb8\xae\xcb\xd4\xd4\x94\ \x1f\xd9+]\xac\x86\x84)\x09Q\x7f\x03\x22\x97\xcb1\ 11\xa1\xf4td\xc5\x8a\x15_W\xc4\xdd\xd6\xad[\ \xa9\xae\xae\xf6\x83\xd0\xe9\xe9\xe9?X\xb2\xe98\x0e\x17\ ^x\xa1\xef\x11\x8d\x8f\x8f\xd3\xd8\xd8\xe8\xdf\xbfr]\ \x95:R?\xb1\xa1\xa6\xe2)W]U\x8e\xa8a\x97\ \xba\xae322\xa2\x00zx\xf7\xee\xdd\x97\x1f\xed\x9e\ \x1e5 \x9e\xe7}\xed\xd9g\x9f\xfd\xb1eY+{\ zz\xee\xbd\xf5\xd6[ikk\xe3g?\xfb\x19;\ v\xec@\x08A6\x9be\xd9\xb2e\xf4\xf6\xf6\xfa\xcd\ =\x8d\x8d\x8d\xec\xdb\xb7\xcf\xd7\xbb\x8a\xda><\xd2U\ )`\xe5N\xab\x0dRA\xa6\xda\x14)%\xad\xad\xad\ \xb4\xb5\xb5!\x84`rr\x92\xd6\xd6V?\x0e\xd8\xbb\ w\xaf\x9f\xd7\xdf\xb5k\x97\xcf\xbf\xa9\x93\x7f\xb8\x81V\ \xb4\x90\xf2\x9e\x0e\xf7\x0c\xd5\xf5\x01\x9fH\x1d\x1c\x1cd\ nn\x8e\xaa\xaa**\x87v\xbe\xae\x80d2\x99)\ `J\xd7\xf5*M\xd3\xf8\xdc\xe7>GCC\x03\x89\ D\xc2\xffRRJ&&&\x0e\xa1\xeb\x15X\xb1X\ \x8c\xee\xeen\xe2\xf1\xb8\xaf\x12*\x87k\xaa\x7fJ\x8a\ \x94\xe1\xaf\xcc\xb1Tf\xf2\x14\x11\xa8\x0c\xadr4\x14\ \xeb\xac\xdcT\xc58+\xf0\xd5\xe7\xa8\x83\xa0<\xc2\xca\ \xc2\x84\xf9\xa19\xfe\xf7P\x0e\xcc\xb2e\xcb\xe8\xeb\xeb\ \xc30\x0c\xe2\xf1\xf8\x1dB\x08\xafP(<\xf3\x86\x00\ R\xa1\x86\x9cR\xa9T\x0c\x87\xc3\xc5d2\x19\x8dF\ \xa3f0\x18D\xd7u\x7f4\xac:e\xca\xb0\xaaM\ S\xd5\x8f*\x9a\xd7u\xddO\xffVf\xd6TO\xb8\ \x92\x10!\x84/!\x95:^\x01\xa7\x1c\x05\xe5\xc1\xa9\ MW\xaaG\x01\xa2\xc6\xc1V>\xa7\x0e@% \x95\ ?\xb7QUU\xe5\x17\x5c\xff\xf6\xb7\xbf%\x12\x89\x10\ \x89D\xd8\xb7o\x9f?3\xb2\xa9\xa9\x89\xa9\xa9\xa97\ \x06\x10\xdb\xb6\x9f\xdb\xbe}{\x18\xa0\xbe\xbe\xfe7\xdd\ \xdd\xdd\xe7}\xecc\x1f\xe3\xc9'\x9fd``\xc0O\ a*C\xaf6D\xd7u\xb2\xd9\xac\xcf\xf7\xd4\xd4\xd4\ \xf8\x06_\xc53*\xda\xadT\x1b*\xd9\xa3\x00;|\ \xde|\xa5$\x05\x02\x01\x7fc\xd5\xa6+\xe6\xf9p\x8f\ I]Oy\x81J\x22T\x1b\x9f\xca\x8btvv\xb2\ |\xf9r\x1e{\xec1<\xcf\xa3\xa5\xa5\xe5\xff\xe9\x1b\ \x9f\xf7\ \xd5\x92J\x03T\xb2\xd1J\xdbh\x9aFMM\x8d\xff\ 9\xea\xf5\x81@\x00\xd7uy\xea\xa9\xa70\x0c\x83P\ (\xf4D*\x95\xba\xfc\xb5\xda\xb7\xd7\x0c\x90D\x22\xe1\ \xcf\xea\xee\xec\xec\x1c\xe8\xec\xec\x5c\xf2\x12\xed\x90O?\ x\x9e\xc7\xc2\x85\x0b\x19\x1c\x1c$\x12\x89\xf8S\xa6\xfd\ \xde\xbe\x0a\x1aF\xd9\x1de\xaf\x14X\x87O\xd6V\x91\ \xb9\xa6i\xbe\x87\xa7$\xa8\xb3\xb3\x13\xc30\x18\x1c\x1c\ \xf4'\x1f\xcdW\xce\xa4ggg\x9f\x13Bx\x96e\ m~-\xd3\x02\xafK\x87\x7f.\x97\xfb\xfe\xf8\xf8\xf8\ \x02\xcamn\xef\x0b\x87\xc3\xcb\x8e\xd4\xaf=33C\ \x10\xe0\x99g\x9e\xf17\xf0\xec\xb3\xcff\xe3\xc6\x8d\ h\x9a\xe6\xf7\xa8$\x12\x09\xbf\x92R\xd9\x0a\xd34\x0f\ \x99\xbc\x1d\x0c\x06}O\xaf\xb5\xb5\x95\xd9\xd9\xd9r\xea\ 5\x1ae\xe9\xd2\xa5\x0c\x0f\x0f\x93\xcb\xe5\xd04M\xfd\ W\x0a!\x84\xe38\xaa#l\xdf\xd0\xd0\xd0\xf9/\x96\ \xf6}K\x012?\x90\xfe\x0b*\x9f|\xc2\x09'\xb4\ .X\xb0`YE\xe4+\xc5\x1f\xe09*\xd5\x98\x8a\ i*\xf3\xf8\xd1h\xd4\x1f1X__\xcf\xf2\xe5\xcb\ \xd9\xb3g\x0fuuu\xe4r9\x82\xc1 \xb9\x5c\x8e\ \x13O<\x11!\x04\xa9T\x8aD\x22AGG\x07\xef\ |\xe7;\xf9\xf5\xaf\x7fM\xa1P\xa0\xa1\xa1\x81\xde\xde\ ^4Mc\xff\xfe\xfdJ\x8d\x89\xc1\xc1\xc1o9\x8e\ \xb3\x0fp#\x91\xc8\xc0\xe1\xc5\x10\xaf\xd5z\xddg\xae\ k\x9a\xb6@\xd3\xb4\xc8\xfc\xe3\x0fvww\x7f\xe5H\ \xf3?\x94>Wv'\x10\x08\xf8\x86\xd9\xb2\xca?\xb3\ z\xd5UWq\xdf}\xf7\x11\x0e\x87\xa9\xad\xadez\ z\xda\x9f>\xb1a\xc3\x06~\xfe\xf3\x9f377G\ WW\x17\xdd\xdd\xdd<\xfe\xf8\xe3\xaa:\xdfWm\xea\ \xf7\x15]\xd7%\x93\xc9\x9c\x1b\x8f\xc7\x1f\x7f\xbd\xf7\xe7\ \x0d\x1d\x82\x1f\x0e\x87Okll\xbcL\xd7u\x07 \ \x1a\x8d~*\x18\x0c\x1eq\xae\xaf\x9a`\xa7\xd4\xd3\xd8\ \xd8\x18\xd5\xd5\xd58\x8e\xe3\xe7$\x14\xf1711A\ ]]\x9d?s8\x16\x8b\xf9\x81a\xa1P\xf0m\xca\ \xfc\xe8\xf3Cf\xd1\xbf\x11\xe3l\xdf\xd0)1\x85B\ a\xc7\xc8\xc8\xc8\x8e\x0a\xdd\xecE\xa3\xd1*)\xa5\xb4\ m\xbb\xcb0\x8c?;R\xa3\xbd\xb2\x05\xcac*\x16\ \x8b~\x90\xa9b\x09\xf5k\x9c\xd9l\x16\xcf\xf3vK\ )u\xd7u\xddd2\xf9\xf7\xe3\xe3\xe3?y\xb1\xcf\ ~#\xc6\xd9\xbe\xa1\x12r$\xed\x06\xf8\x9c~,\x16\ \xbbZ\xd3\xb4\xd8\x8b\x81\xa2\x96i\x9a>\x95!\x84(\ \x00{\x8b\xc5bVJ)c\xb1Xfvvv\xfb\ ai\xddcy\x04\xc8\xf1u|\x1d_\xc7\xd7\xf1u\ |\x1d_\xc7\xd7\xf1\x05\xc0\xff\x05\xf4\xe6\xb0\x9e\xc6n\ \xd0\xb8\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00?\xd1\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x00P\x00\x00\x00P\x08\x06\x00\x00\x00\x8e\x11\xf2\xad\ \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\ \x0e6\x08!\xa9\x064\x00\x00 \x00IDATx\ \xda\x9c\xbci\x98$Wy\xe7\xfb;\xb1\xe6\x9eY\x99\ Y[\xd7\xd2U]\xbd\xaa\x17I-\xb5\xf6\xd6\x0e\x12\ \x12\x18\x8cm`|\x19l#\x1b\xcc\xb0\x08\xcf\x18\xdb\ c?\x9e\xe5\xdeg\xbc\x8c\xf1x{\xbc\x8c=6\xc6\ \xf6\x18\x06c\x1b\x0c\xd8\x80\x05Z\x11\x12\xddH\xa8[\ \xea}QU\xd7\xbe\xe4\x16\xfbz\xee\x87\xac\xcc\xae\x06\ \xc6s\x9f\x9b\x1f\xba\xb3\x9e8q\xe2\x8d\x13'\x22\xce\ \xef\xfd\xff\xdf\x14\xefz\xd7\xbb\xa4\xe38\xd4j5^\ \x7f\xfdu|\xdfgaa\xc1\xfa\xe8G?Z,\x97\ \xcb\x84a\xc8\x8b/\xbe\x88\xaa\xaa\x84aH\x18\x86t\ :\x1d\xd6\xd7\xd7\xa9\xd5j\x9c9sfuhh\xa8\ \xf8\xfe\xf7\xbf?[\xab\xd5\xf8\xf4\xa7?\xcd\xf0\xf00\ \x17/^dhh\x88\xf9\xf9yL\xd3\xc44MN\ \x9e<\x19%I\x12\xfc\xe2/\xfebaxx\x98g\ \x9ey\x06\xc7q\xb8r\xe5\x0a\x83\x83\x834\x1a\x0d\x86\ \x87\x87\xd9\xd8\xd8`nn\x0e\xdb\xb6;\xb7\xdf~\xbb\ x\xc3\x1b\xdeP\xac\xd7\xeb<\xf3\xcc3\xac\xac\xac\x90\ \xa6)\x8e\xe3P*\x95\xb8|\xf92Q\x14\xe1\xba.\ \xf3\xf3\xf3\xb3\xefy\xcf{\xb6?\xf0\xc0\x03|\xe9K\ _\xe2\xca\x95+\x14\x0a\x05\x82 \x8a\x22fgg\ \xa9V\xab4\x9bM.]\xbat\xee\xae\xbb\xee\xda\xf9\ \xb3?\xfb\xb3\xcas\xcf=\xc7K/\xbd\xc4\xf4\xf44\ \x97/_F\xd34l\xdbfrr\x92s\xe7\xce\xb1\ \xb8\xb8\xb8\xb4\xb2\xb2\xb2\xfc\xeb\xbf\xfe\xeb7f\xb3Y\ N\x9c8\xc1\xfa\xfa:\xb6m\xa3\x0c\x0d\x0d\x91\xcb\xe5\ \x10B099\x89\xa6i\x08!\xc8\xe7\xf3\xfc\xc8\x8f\ \xfc\x08\x83\x83\x83T\xabU\xa6\xa6\xa6\xd8\xb1c\x07\xc5\ b\x91R\xa9\x84\xae\xeb\x8c\x8d\x8d\x01\x10\x86!\x0f<\ \xf0\x00\xd7_\x7f=\xa6i255\xc5\xe0\xe0 \xdb\ \xb7o\xa7^\xafc\x9a&\xfb\xf7\xefG\x08\x81\xef\xfb\ \xec\xdf\xbf\xbf\xbfmll\x8cR\xa9\xc4\xbe}\xfb\xc8\ \xe7\xf3\x14\x0a\x05v\xee\xdcI\xa1P@UUVW\ W\xb9\xfd\xf6\xdb)\x95J\xa4iJ&\x93\xa1T*\ \x11\x04\x01\xba\xae#\x84\xa0^\xaf\xa3i\x1aRJ\xf6\ \xee\xdd\xcb}\xf7\xddG\xb1Xdpp\x90\xe9\xe9i\ \x06\x06\x06\x98\x9c\x9c\xc40\x0c\x86\x87\x87\xc9\xe5r\x00\ h\x9a\xc6\xbe}\xfb0\x0c\x83\x5c.\xd7\xdf^(\x14\ 0\x0c\x83(\x8a(\x16\x8b\xa8\xaa\x8a\x10\x82\xc1\xc1A\ n\xbe\xf9f\xc6\xc6\xc6\xd8\xbbwow\xdc\x0e\x1f>\ ,\x01\xa4\x94\xfd\x00;\x9d\x8e\x95\xcf\xe7\x8b\x99L\x06\ \xd7u\x11B \xa5\xa4\xf7\x91R\x22\x84@\x08A\xa7\ \xd3Y\x1d\x1c\x1c,\xa6i\x9a\x05\x88\xa2\xa8\xbf=M\ \xd3\xfe\xbeRJ\xe28\x8e\xa2(\x0a\xf2\xf9|\xa1X\ ,b\xdb\xf6\xf7\xf4\xbb\xf5\x7fM\xd3:\xedv[\x94\ J\xa5b\x92$(\x8ar\xcd\xf1\xb7\xf6_\xadVy\ \xed\xb5\xd7f\xaf\xbb\xee\xba\xed\x8e\xe3\x90\xa6i\xff\x9c\ zmz\xfb\xe8\xba\xce\xec\xec\xec\xb9={\xf6\xecl\ \xb7\xdb\x8a\xa6i\xd7\x1cw\xebGJ\x89\xa2(Kk\ kk\xcbCCC7\x9a\xa6\x89\xef\xfb\x08!\xba1\ \xa6\x89l\x08\x01\x08P\x14\x05\xcf\xf3R\xcb\xb2.g\ \xb3Y\xdd\xb6m\x04\x824\x95\x80@\x08\x09\x9bm{\ \x07\x8b\xe3x\xa5\xd3\xe9\xec\xd14\xad$\x10\x9b\x07\xdd\ \xfcG\x00\x9b\xfbl\x1e0\xf4\xc4\x83 I\x12\xc20\xc4\xf7}\xa2\ $\xa4\xb1\x16\xf2\x8e\xeb\xfe\x1d9o\x86\xf7\xdf\xfc\x9b\ \xbc\xe7\x9e\x9f!\x90n\xbf}\x9a\xa6[\xf6\x8dyt\ \xfb\x87\xd9\xad?\xcc\x8f\xdd\xf2K\xdc\xbf\xe31D\xd1\ '\x08||\xdf'\x8ec\xa28\xc2s]\xa2$f\ \xbc\xb0\x9b\xa3\xa3\xef\xe4\x07\xa7~\x81\x01\xefv\xee\xbf\ \xe1\xcd\xb8I\x1b\xdf\xf3\x89\xa2\x08\x00?\xf0q]\x17\ ]\xd3\x98\xd2o\xe7\x81\xf1\x9f\xe0\x86\xf2\xdb\xf9\xafo\ \xf9\x12\xb2\xe0\xe1\xfb>\x9e\xeb\x91\xa6i7n/ \ \x11\x09\xae\x1b\xf0\xa1\x83\x7f\xc2\x1bv\xbd\x9b\x8f\xde\xfe\ \xe7LL\x8f\x12\xe2\xe1{>a\x18\xf6\xc7$\x08\x03\ \xa4\xf0\xb9]{\x9c['\xde\x80\xa2\xc4:n\xe0\x10\ \x04\x11\xbe\xe7\xf5\x1b{\x9e\xd7}\xfd'\x01\xfb\x87n\ \xe3\xb3\xaf\xfd.\xf3K\xeb\x1c\x1c\xb9\x15\x05\xa5;\xc0\ \xbeO\x92$DQ\x84\xe7y\x84A\xc8\x80>\xc1\xb2\ 5\xcb\x8b\xb3Op\xc7\xf4Cx\x91C\x14\x84\xfd\xfe\ \x92$\xe9\xefk\xaay\x06ru\x9e_\xfa\x1bn\xa8\ \xbf\x81Zn\x84\x92^\xc7\xf3\xaf\x0e`\x12'x\xbe\ O\x1cE\xe4\xf4\x02J\xc6\xe5[\xe7\xbe\x85HUl\ \xbfI\x1c&x~w`\x00\x02?\xc0u=4U\ \xc5i\x09\xbe~\xfe\xf3(q\x9ej\xa5@\x92$x\ \x9e\x87\xe7y\xf4\xee\x1a\xcfsQ\x15\xc1\xc5\xb3\x16\x03\ C*\x1b\xce2\xd7O\xdeL53F\x10v\xe3\x88\ \xa2\xa8{\xe17\xbf\xb7:\x1e?\xf5\xc8c\xfc\xd3\xf9\ O\xa0$2%\xa3\x94\x88\xe2\x88 \x08\xfa\x03\xd8\x9b\ %\x0a*~\xe2P\xcf\x8e3P\xa82\xb7>\x8b\x84\ \xef\x19\xc00\x0c\x89\x93\x18?\xb1\x19,lC\x13Y\ Z\xde\x1aY-G\x14\xc7\x84ax5\x90 \xc0\xf7\ }$)\x0a\x1a\x9e\x03\xa9\xea\xd1r\xdb\xac\xdb+\x84\ \x9b\xdb\x93$!\x8e\xe3\xcd\x81OIdB\x1a\x19\xcc\ \x8c\xee\xa2\xe3\xd8\x943C\x84q\xd0\x8f\x15 \x08C\ |\xdfCQ\x14\xf2E\x9d\xbdC7b\xf9M2J\ \x09M\x18\xdd\xb6a\xf7.\x8b\xa2\x08\xcf\xf7\x91RP\ \x190I\x02\x1d)\x05H\x85\x86\xbbL\x12\xa7\xfd\x01\ \x94R\xe2\xf9>a\x14b\xe8\x1as\xcb\xcb\x18J\x16\ \xedX\xfb\xd3xJ\x03\xdf\xf3\xb0\xec\x88l\x9aAJ\ \x89\xe38\xf8qD\x11\x83/\xbf\xfeG\xbc\xf7\xd0\xaf\ r\xb2\xf3\x0f\x5crO\x10\x8b\x00\xc7qPU\xb5?\ x\xae\xeb\x92\x1a0RW\xf8\xc6\x99\xe7\xf8\xf9G\xff\ \x1f~\xeb\x9b\x1fd|t\x9c4Iq\x9c\xcd\x19\xb5\ 9\x0b\xa4\x94\x0ch\x82\xa7.\xfd\x1d?\xff\xc6\xdf\xe4\ S\xaf\xfd\x1a\x96\xefP\xcaTp\xddy\xe2@b\x18\ \x06a\x18b[\x16\xbe\x1e\xb3d_b\x89E\xf6o\ \xaf!\x07/p\xa9\xd1] [\x96\x8fa\xea\x00\xb8\ \x8e\x83\xdbq\xd1R\x9d\xa5\xe8;\xdc\x9b}+Qq\ \x8e\x8f?\xfdA\x14\x15l\xdbF\xd3\xf4\xab\x93\xc4\xf1\ \x89\xf21\xdb\xb7\x0f\xf2\xd4\xa9\xaf2\xb3}\x86\xdf{\ \xf1q2F\x860\x0e\xb0\xed\x18\xdd\xd4H\xd3\x14w\ sL\xca\xf9\x22\xbf\xf5\xcc\xe3|\xec\xc1?@[\x5c\ \x9b\xa5\xd1Yc\xf9l\x9b\xc8M\x91\xa4\xa4iJ\xab\ \xd5\x22H\x22\x8aA\x1eW[\xe4\xf7\xbe\xf58\x8f^\ \xff\xc3\x9c]=\xc6\xea\x0b\x92v\xdbFQ\x14\xd24\ \xc5\xb6m\xda\xed6R\x15\x08\xa5\xc2\xf3\x8dO0>\ 7\xcajg\x8e\xc5\xd59\x16\xce4\xf1\xdaI\x7f\x0d\ \x16\x86!i\x9aRH\xf2\xcc\x06\xdf\xe2\xd9\x85\xcfb\ \xf9MN/\xbc\xc2\xec1\x9f\x8d\x15\x07\x04\x94J\xa5\ .\xf9D)A&%QJ<\xb3\xfaW\xb4\xd3\xa3\ \xf8\x9e\xc5K\x17O\xb0r\xda\xc1wb2Y\x13\xe8\ \x0e\x90m\xd9\x14\x92\x02\x8eX\xe5\x8b\xb3\xbf\x8deY\ ,\xaf-\xb0\xf2J@\xbbaad\xb5\xfe$\xb1\x1a\ m\x9c\xa2$\x91\x15\xbe\xd5\xfc\x14\xcb\xfe\x8d\x5cn\xbd\ \x8c\xe3\xb8\x5c\xfaf\x03\x99\xa6\xe4\x92\x1ci\x9a\xd2h\ 4\xe9\xc8\x8402q3\x97\xf9\x95\xaf|\x041=\ \xb1S\x0a\x04f^#\x8cB\xb2\xd9,Q\x14Yi\ \x9a\x16k\xd5:r\xacCiXg\xe5;\x1e\xeb\x17\ ]L\xc3D\xa8\xa0\x1a\xdd7Y\x10\x04\xab\x03\x03\x03\ EEQ\xb2RO)\xdd,\x89\x97R\x16^\xe9\x80\ \xa7!\x14\x81jv\xd7`i\x9aFB\x88\xc00\x8c\ B\xa5RA\xee\xb1(\x19:W\x8e[8K\x09\x9a\ \xa6\x81*QuA\x92$\x14\x0a\x85N\xb3\xd9\x14;\ gv\x16\x1b\x9d\x06\xa37\x1b\xcc\xbfhc7B4\ EC\x92\xa2gT\xe2$\xa6R\xa90;;\xfb\xec\ \xce\x9d;\x8f*\xa8$C\x16j*X~\xd5!\x8d\ %\xaa\xa2\x224P\xbakf\xc20\xa4\x5c.[\x02\ Ql\xe2s\xe3[\x0a,\x1cwY?\xe7!C\x15\ d\x8a\x96\xedN\x10\xc30\xe8t:\xc7\xf2\xf9\xfc\x11\ 3[d\xfb#\x12g!a\xfd\x9c\x8fv\xc7\xdd\xb7\ \xd2l6\x19\x1d\x1d\xe5\xc2\x85\x0bx\x9e\xc7\xca\xca\x0a\ ?\xf6c?\xc6\xbe}{\x99\xbb<\xcf\xcb/\xbfB\ }\xbb$\x9d\xec\xbe\x00<\xcf\xa3\xd1hP,\x16\xb9\ t\xe9\x12\x9a\xa6\xf1\xd3?\xfd\xd3\x0cT\x06\xf8\xabO\ \xfe5\x95j\x85\xf2\x9e%j\xb5\x1a\x0b\x0b\x0b\x18\x86\ \x81\xa2(\x5c\xb8p\x810\x0c\xf9\xc0\x07>\xc0\xc1\x83\ \x07\xf9\xe4\x9f\xfe\x05\xaa\xd40F\x97\x19\xbc\xbe\xce\xc6\ \xc6\x06\x03\x03\x034\x9bM\x16\x16\x16\x08\x82\x80;\xef\ \xbc\x93\xc7\x1e{\x8c0\x0cy\xe6\xc9\xe7\x18\xbdq\x19\ US\xe9t:\x14\x0a\x05\x16\x16\x16p]\x97$I\ PU\x95\x87\x1ez\x88\xb7\xbf\xfd\xed|\xe1s_\xe4\ \x95\x13'\x98\xbeS#\x9f\xcf\xb3\xb0\xb0\x80\xe38d\ \xb3Y\x9a\xcd&\xcb\xcb\xcbT\xabU>\xf2\xf8G\xb8\ |\xf1\x12\xcf>\xf5M\xf6\x0cd\xd9}[\xca\xfa\xc6\ :\x85B\x01!\x04KKKX\x96E\x92$|\xe0\ \x03\x1f`jj;O\x7f\xed\x1b4\xd3\x06\x83\x13.\ \xda\xe0\xe0 \x8e\xe3`\x18\x06SSS\x9c;w\x8e\ $I\x98\x99\x99\xe1\xe8\xd1\xbb9U;\xc5Zc\x95\ \xc1\xc1A\x14E\xe1\x95W^att\x14\x80\xe1\xe1\ a.]\xbaD\x9a\xa6\xdcv\xdbmd\xb3Y\xbe\xfc\ \x95/s\xfd\xf5\xd7s\xe6L\x16\xc30\xfaW\xfb\xc0\ \x81\x03\x5c\xbcx\x11\x80\xc3\x87\x0f3>>\xce-w\ \x1caee\x05/\xb2\xd9\xb1c\x07i\x9a244\ \xc4\xae]\xbb\xf8\xcaW\xbe\xd2\x9b%\x94J%\x86\x86\ \x86x\xf5\xd5W\x11\x9a$\x9f\xcfs\xfc\xf8q\xc6\xc6\ \xc6h6\x9b\xe4\xf3y\xd6\xd6\xd6\x10BP*\x95\xd8\ \xbd{7\x03\xf5\x0a\x95j\x89r\xb9\x8c\x94\x92Z\xad\ \x86eY\x0c\x0d\x0d\x11\x04\x01B\x08\x0a\x85\x027\x5c\ \x7f\x03\x193\xc3\x99\xb3g\xd9\xbbw/kkk \ \xa0P(0::J6\x9b\xe5\xe4\xc9\x93\x00\xdcq\ \xc7\x1d\x94J%:\x1d\x0b\xcf\xf38y\xf2$\xe2\xc6\ \x1bo\xec\x03`\x8f\x85\xdb\xed\xb6U*\x95\x8aA\x10\ \xf4\xf9\xf3\xfb}\x14E\xa1\xd3\xe9\xac\x0e\x0d\x0d\x15\x1d\ \xc7\xc9\xf6\x10\xec\x7f\xf7\x89\xe38\x0a\xc30\xc8\xe7\xf3\ \x85\xef\xc7\x9d\xdf\xcd\xda\x8a\xa2t:\x9d\x8e(\x95J\ \xc5\xffS\xfbr\xb9\xcc\xa9S\xa7\x9e\xdd\xb9s\xe7Q\ \xcf\xf3\xf8\xdf\xc5\x22\xa5D\xd34666\x18\x1c\x1c\ \xb4\x82 (\xfeKq\xf7bY[[;644\ t\xa4\xc7\xd6\xbd\x8f\xb65\xaeM\x16\xc6\xb2\xac \x9f\ \xcfg\x15E\x91H\x90\x89\xd8\xc2\xb4\x9b\x8d\x05\xa4i\ *\xe28\x8e;\x9d\x0e= G\x0ad\x17SA\x91\ \xfd\xb6\x9b\xc1H\xdf\xf7\xe3L&\x13+\x8a\x22\x85\x14\ ]\x06\x15\x12\x94\xcdf[X\xd8\xb2,\xdf\xf7\xfd\x0d\ !D\x19\x90$\xa2\xcb\xd9\xca\xb5\xb1H)\x85\xe7y\ \x91\x94raccc]J\x19\x90\x8a.'\xa7\x02\ \x94.\x0bo\xc6!6\x9f\xdd\x0d\xcb\xb2\xb6\x9b\xa6\x19\ \x0b\x90i\xb2\xd9\xd9&7\xb3%\x96 \x08\x94$\xe9\ 6P\xc4&\xbf\xcb\xcdd\xc2\xf8\xae!\xa4\xa7v\x0f\ \xd4\x1d\x14\x96\x96\x96.\xed\xd8\xb1\xe3\x80\xe7zi\x98\ s\xc9\xef\x08\x10\xaeF\xd26I-\x1d\x19uwV\ UU\x00rxxXd2\x19\x02\x11\xc2t\x8bR\ A%\xee\xe8\xd0\xce\x90Z\x1a2Q@\x82\xe7yr\ qq1\x1a\x1b\x1b\x0b\x14E\x91\x8d\xcc\x06c\xbb5\ \xa2\xa6\x86l\x9b$\x8e\x0aI\xff\xea\x8av\xbb\x1d\x04\ A0691Y\xf2\x93\x10uG\x9b\xac\xae\x934\ \x0d\x12KG\x06\xdd~\x01L\xd3\xe4\xc9'\x9f\xbcp\ \xe8\xd0\xa1\xba\x8c%\xab\xb9e\xb6\x1f\xd0\x08\xda \xdb\ \x19\x92\x8e\x01\xbe\x8aL\xc10\x0c\x8e\x1f?\xbemb\ bb\xde4L\xa5\x15\xdar\xe0\x90\x8f\x96\xea\xc4\x0d\ \x9d\xb4\xd3e\xf2n\x92\x03aYV\x9c$\xc9\xc4\xf4\ \xf44\x96\xef\x93\xd9cQ\xa8(\x04\x9d\x14\xad\xfe\x03\ \x1b\xe8\x8aI\xf3\xc9.\xf7\x19\x86@U\xd5\x01\xd34\ s\x9e\xe7\xa3n\xf7\xa9\xdc\xee\xa0\x87E\xc2x\x0d%\ 6\x90\x81F\xe3\x8b\xdd\x1c\xdc\xe6-\xae&I\x82\x9d\ \xb1\x19\xbc\xbe\xc3\xee\xf1\xfd\x90\xa6\xcc\xad\x5cDUT\ :\xcf\xd4\x09\x17u\xd24UTU\xcdi\x9a\x96\x17\ B\xc0\x1e\x8b\x81\xdb5ri\x9dV{\x1d!\x15\xc2\ s\x15\xac\x139\x84\x90h\x9a\x96z\x9e\x07R\xb2!\ [\xec\xbf\xdfFK2\x04n\x03=\xcd\x10\xb9\x02\xfb\ x\x99`QG\xc9*H)7\x1f\xba\xe0\xee]\xa7\ t\xc3\x00Uu\x8auk\x0e\xcb\xb2\xd1:U\x1aO\ \x14\xe9\xa5\xc6\x0c\xc3\xa8\xe8\xaa\x9e\xbf\x98\xac\xf2\xe6\xbb\ sD\x81O\x96\x12\x1d{\x03C\xe4\xe8|\xa3L\xb8\ l\xf4r\x8d\x91L%V\xea0z8\xc0S\xda\xbc\ q\xe7\x0f\xa2<\xba\xfbq\x8a\xd5\x22\xb1\xec\xf2\xec&\ \x0bK\xdf\xf7\xf1|\x9fT\x84Lr7\x1f\xbc\xf3\xbf\ \xf2\xaf\xaf\xfb\x0d\xf6\x0c\x1dex\xdb`\x9f&\x92$\ \x91\xbdLu\x9cF$\xcd\x0a\xf7\x8e\xbf\x93C\x85\xb7\ r\xcf\xf6w\xf3\xa6[\xdeAx-\x0b\xcb\xdeq\xe2\ 4\xe1\xd1\xed\x1faRy\x80\x07\x0f\xbc\x8b\xa33\xef\ \xc2\x11\x1b[)G\xc6q\x8c\xe7\xfa\x84I\xc8Hv\ \x9aG&>\xca\xcf\xdd\xfdI\xbcf\x9d\x1d\xd3S\x84\ \xd2\xed\xf3j\x8f\x85=\xcf\xc50T\xa6\xd5\xbbx\xcb\ \xd4\xe3\x1c\xaa\xbc\x95_y\xcb\xdf\x93\xe6\xec\xcdU\x84\ \x8f\x94\x920\x0c\xa5\xefzD2\xc2s#>|\xfd\ '\xb8\x7f\xf7\xbb\xf8\xd0\x1d\x7fHe4G$\x83>\ gK)\xf1=\x8f8\x89hvZ\xfc\xeeCO\xb3\ \xb4\xbe\x862^\xd8\xc3\xc1\x91;7\x07\xa4\xcb\xc2B\ \x08<\xcf\xc3\x0f|\xc28\xe0\xba\xa1[y~\xe1\xef\ y\xe1\xe4\x09n\x9fz\x08M\xd1\xfbL\x99$\x09A\ \x10tY8\x0a\x19+\xeef\xb1s\x91\xf3k'\xb9\ m\xfa\x01\x924!\x0ec|\xbf{\x92[\xdbg\xd4\ <\x95\xcc \xaf{/\xb0\xbf|?;\x87\x0eP\xd2\ \xeb\xf8\xbe\x8b\xe7y\xc4qL\x1c\xc7\xf8~\xf7{)\ S!WLx\xf6\xc4\xf3\x1c\x1c\xbd\x83\xdd\xb5\x9bp\ \x03\xe7{Y\xd8\xf3QU\x15\xa7-xq\xee\x9f\xc9\ \x8a*C\x03C\xa4I\x17A\x03\xdf\xef'\x13<\xcf\ CQ\x15.\x9f\xb3\x18\x1a\xc9\xe2G.7L\xdc\xc2\ d\xe9:\xfc\xb0\x1bG\x0fA=\xdf'\x0a#4\x99\ a\xb8:\xc4Fz\x06\xcd\x09l\xce\xae\xbcJ\x14\xc5\ \xf8^\xda}\xa0Cw\xc6\xf8\x01\x86\x14\xb8\xa1\xc5`\ i\x02Y\xc8\xf3\xfa\xfa\xb9\xfevUU\xfb,\x1c\xc7\ 1i\x92\xd2\xf4\xd7\x18-?Ls=e\xc5\x9d\xc5\ T\xb3DQD\x10$}\x02\xe9etuR\x14E\ \xc1w%F\xceg\xfe\xd2\x02\x1b\xf6\x0a\x81o\xf6_\ \xf3\xeaos9x\x8e\xacV\xc0q]\ \x1c\xc7\xe9_\x18\xcfu\x09\xc3\x88e\xfbu\xd6[-\ (\xb4H\xab\xb3\x04i\x17\xee\x1d\xc7\xe9gX\x1c\xc7\ \xc1\xeaX$i\xca|\xf4m4\x91\xc1\xcf]\xe4w\ \xbe\xf93\xa8\x9a\x8aeYX\x1d\xab?\xd8\xae\xe3\x12\ \xc7)SS\x15\xbe\xfc\xca\xe7\x19*\x8d\xf0;/\xfe\ \x9b\xae&\x12\xfb8\x8e\xd3\xcf\x22Y\x9d\x0e\xae\xeb\x91\ \xcfe\xf9\xb5\xa7\xdf\xcf/\xdd\xf3\xe7h\xae\xb2\xce\xdc\ \x859\x96\xce\xb5\x08\xac\x84\x84\x04\x80f\xb3I\xab\xd3\ !\xef\xe6\x09U\x95\xbf\xbb\xfck\xbc\xe5\xf0;\x99\xbb\ \xf8\x1ak/I\xda\xedN\x7f\x8d\xd8\x9b\x85\x94\x14\x14\ \xd5\xe0x\xe7S\xd4\xd7\x14\xda\xd12\xf3_\xd9`\xfe\ D\x9b\xc8N\xbf/\x0b/\xf8\xdf\xe1\xb9\xa5\xffE\xa0\ \xd9\x5cz\xfd\xe5\x90v4\xf4\x9c\x82\x96\xed\xb2p\x1c\xc7\ \xb6\xaa\xaaf.\x97\xd3c#b\xec\x1e\x83`!a\ \xe9\x94\x83s\x05\xb4\x8c@\xcf\x8a>\x0b+\x8a\x12\xa8\ \xaaZ\xc8\xe5r\x18\x87\x22j\x15\x9d\xc5\x93\x0e\x1b\xa7\ bD\x22\xd0s\x02a\x80L%\x85B\xa1\xb3\xb1\xb1\ !\x86\x86\x86\x8a\x9d\xd8\xe6\xd0\x0f\x17Y;\x15\xb2|\ \xd2\xc6_VP\x0c0\xf2]}\xa2Z\xad2;;\ \xfb\xec\x8e\x1d;\x8e\x8aT\x90N8\xe42\x1a\x8b/\ ;x\xeb\x09\xba\xa9\xa2\x1a \xb4\xee\xda.\x0cCJ\ \xa5\x92\x15\x87q\xb1cF\xdc\xfc\xd6\x22\xab\xaf\xf9\xac\ \x9e\xf6\xf0W\xba\xed\x8cB\x97\x85M\xd3\xc4u\xdd\xf5\ |>_\xcf\x97\x8bT\x0eDt\xe6#Z\x97C\xb4\ ;\xee\xbd\x05\xc7q\xa8V\xab\x5c\xb9r\xa5\xa7\x0b\xf3\ \xe0\x83\x0fr\xf0\xe0A:-\x8bc\xdf:\xce\xd8H\ \x96\xf1L\x83b\xa9\xc0\xd2\xe2\x12\xcdf\xb3\xa7\x0b3\ ==\xcd#\x8f<\xc2\xf0\xd00\xff\xf3/?\xc5\xde\ \xc9\x09J\x13\x0b\x8c\xde:\xca\xca\xca\x0aa\x18\x92\xcb\ \xe58y\xf2$i\x9a\xf2\xde\xf7\xbe\x97\x83\x07\x0f\xf2\ \x99O\xfd\x0d\x197\x8b\x9a\x9b\xe7\xae\x1f\x9e\xdc\xd4\x90\ \x0dTU\xe3\xdc\xb9s\x84a\xc8\xe1\xc3\x87y\xdb\xdb\ \xdeF\x12'\x9cx\xf9U\x0aj\x8bm\xfb}\xb4\x1b\ \xbbi\xfc\xd7_\x7f\x1dEQp]\x17UUy\xe3\ \x1b\xdf\xc8\xdb\x7f\xa8\xcb\xc2\xaf\x9e|\x95\xd1\x1bT\x86\ \x86\x079w\xf6\x1c\xae\xeb\x92\xcb\xe5h\xb5Z}\x16\ \xfe\xc9\x9f\xfcIV\x96Wx\xfa\xc9\xe7\xd8;Xe\ \xfb\xf5\x1e\xcdV\x83r\xb9\x8c\xa0\xcb\xc2\x8dF\x03!\ \x04\x1f\xff\xf8\xc7\x11B\xf0\xd4\xd7\x9e!-'\x5c\xc8\ \x9cG\x1b\x1b\x1b\xe3\xd2\xa5K\x14\x8bE\xb6m\xdb\xc6\ \xe5\xcb\x97I\x92\x84={\xf6\xf0\xf6\xb7\xbf\x9d\xb9\xb9\ 9V\xd7W\xa8T*\xb8\xae\xcb\xf2\xf22\x03\x03\x03\ X\x96E\xa5R\xe9\xeb\xab\xefx\xc7;P\x14\x85c\ \xc7\x8f1==M\xa1\x9cG\xd7u\xb2\xd9,\xcb\xcb\ \xcb\xec\xd9\xb3\x87\xd7^{\x8d(\x8a\xb8\xe7\x9e{\xb8\ \xe9\xa6\x9b8\x7f\xfe<\xcdf\x13\xcbm399\xd9\ \xcfZo\xdf\xbe\xbd\xcf\xcd\xdb\xb7o\xef\xeb\xbc\xae\xe7\ \xb2\xb6\xb6F\xa5R\xe1\xc5\x17_dhp\x88j\xb5\ \xda\x17\xfc\x01j\xb5\x1a\x07\xf6\x1f\xe0\xf9o\x9f\xa7V\xab!\x84\ \xa0\xd5j\x91\xa6)SSS\x84a\xc8\xd0h\x1d)\ %\x8bK\x0b\x88\x1bn\xb8\xe1\x1a\x16\xcef\xb3\xcc\xce\ \xce\x9e\x9b\x9e\x9e\xde\xddK|\xaa\xaa\xfa=\x9am\x0f\ \xb7<\xcf\xb33\x99\x8c\xa9\xaa\xaa\xbe\xb5\xcd\xa6|\xd8\ o\x9b$\x09R\xca(\x8a\xa2@U\xd5B>\x9f'\ \x8e\xe3~?\xbd7c\xef\x99\xaa(\x0a\xba\xaew\x1a\ \x8d\x86\xa8\xd5jE\xdf\xf7\xd1u\xbd\xdfVQ\x14\xe2\ 8FQ\x14\x92$\xa1V\xabq\xea\xd4\xa9g\xa7\xa6\ \xa6\x8e\xb6\xdbm\xb2\xd9\xec5\xcc\xba\xf5\xbba\x18\xac\ \xae\xaeR\xaf\xd7\xad0\x0c\x8b=Q\xbe\xa7%\xf7t\ \xe4^L\x9b\xcc\xbf^,\x16\xeba\x18b\x18F_\ \x17\xd7\x0a\x85b*\xb6\xf0j\x18\x86\x8a\x10B\xc9\xe5\ rd2\x19\xc4&\xdb\xf6\xf4\xd2Ma\xb6\x1f\x94\xeb\ \xba\x81\xa6ij&\x93Q\x85\x10\x90n\x8a\xf0\xdf\xc5\ \xcd\x9bK\x9fh}}\xdd\xaf\xd7\xeby!\x84\xcc\x9a\ Y\xd2dS\x0f\xde\xc2\xc2\xbd\xcf\xfa\xfaz\x92\xcdf\ \xf5L&\x93f2\x99.\x93\xb3E?\xde\xd2~s\ \xad\x16FQD\xbe\x90OE\xda\xe3l\xfaK\xb3^\ ,\x9bYt\x99$IR,\x16\xbb*\xf6\xbf\xd0\xb7\ eY\x22\x08\x02\xafT*\xc5\xa6iJR\x90IW\ o\xd6Fv\x97\x93\xc4\xd2 \xee\xbf\x14\x12\xdb\xb6k\ \x13\x13\x13\x84QDR\xf4\xc8\x8d\xc4\xa4\xbe\x02\xbeN\ \xea\xa8\xa4\xae\xda\xbf\xa2\xb6m\xaf\xd7\xeb\xf5\x9ai\x9a\ Z$b\xc4\xa8M.\xabu\xb5[\xd7 \xb1UD\ \xd2\x1d\x1d\xcf\xf3\x9c \x08\xd6\xea\xf5\xfa\x80\xaa\xaai\ ;\xd3dhR%v\x14\xf0t\x12WE\xfa*=\ \x81>\x0c\xc3(\x9b\xcd\x16k\xb5Z\xe2\xa4\x1e\xa5]\ \x01$\x0a\xa9\xabv\xdb\xdb*$\x0a 1MS\x5c\ \xbat)>x\xf0 i\x94&\x8d\xfc*\xdbvi\ \x846\xe0\x99\xa4\xaeB\xea\xe8\xc8P`\x9a&\xedv\ ;\x19\x1e\x1e\x8es\x99l\xd2\x0cmY\xdb\x17#\xd2\ n\xdf\xd2\xd3Im\x15\x19+(\xaa\xc00\x0c\xc5\xf7\ }g\xef\x9e\xbd\x81\x1f\x86\xa9\x1c\xb6)\xd6\x15\x12O\ \xa2\x95\x1e\x5c\xd5UU\xa5\xf1\x85\x1a\xb1\xd5e[!\ \x84n\xdb6\x96\xef\x92\x8c\xad\x91\xd9\x1f\xb1-?\xcd\ J\xebu4\xa9\x90\xba:\x8d/\xd6zo\xb3,\x90\ I\xd3T\xef\x18\x16CG\x9a\x8cV\x07Q\x114:\ \xcb\xe8\x19\x95\x8d/\xd6\x88\x9b\x1aI\x92d\x85\x10\x85\ 4MU@\xf5w\xacS\xbe%KM\x1fg\xa9y\ \x05E\xa8x\xa7\x0b\xd8\xaf\x14\x00\x89\xae\xeb9@\x13\ \x09,i\xebl\xbfKb\xa4%d\x9a\x10\x04m\xd2\ @\xa1\xf3b\x89`\xde@\xcd\xa9$I\x92\xf3<\x8f\ \xd4M\xf5\xd5\xa99\xa6\x0f\x0e0\xaeM\xb3b\xcd\x11\ y)q[c\xe3\xcb\x15\xc20B\x08\xa1\xab\xaa\x1a\ \x93\xa2\x9d\xf2\x17x\xeb\xd1<\x2260D\x86\xb6\xbd\ \x8e\xae\x99\xb4\x9e*\x13.\x19\xbd[\xba\x1eEQ~\ \xd5\xea0\xfd\x88\x8dZ\xf6\x98*\xedFyd\xe7\xe3\ \x0cT\x86\x08\x93\xb0\xbf\xa2\x07d\x10\x04\x84AH\xac\ \xfa\xdc^{7wo\x7f'\xff\xe9\x0d\x7f\xcbt\xe5\ 6\x06\xea\xa5\xfe\x83\xbb\xc7\x94A\x10\x10\xcb\x90\xd6\x1a\ \xbc\xeb\xe0\xcf\xf3\xd0\xc4\xe3\x1c\x9a8\xca\xdd\x07\x1f\xc6\ \x0f\x9d^{\xd9\xd3\x91\xc30$\x8c#\xde<\xf3A\ \x86\xd2\xdby\xd3\x0d\xef\xe2\xc8\xe8\x0f\xe1\xd2\xc2\xdf\x8c\ \xa3\xc7\xc2\xbe\x1f\x90\xc8\x88\x89\x81\xdd\xfc\xc8\xde\x7f\xcf\ \xbf;\xfa\xdfY\x9e\xd7\xd919C\x94\xfa\x04\xfeU\ U\xae\xcb\xc2\x1e\xba\xa12c\x1c\xe5\x8d\x13\xff\x86\xbd\ \x85\x87\xf8\xc57~\x92\xd8\xb0\xfb\x9a\xf3\xa6*'}\ \xcf'%\xc6\x0fB\xdew\xf0\x0f\xb9w\xe7;\xf9\xe0\ \xad\x7f@\xa9\x96#\x96]\x1a\xbb\xaa&\xfa\x04QH\ \xa2z\xdc[\xfaY\xf6\x0e\xde\x8a\xb2\x7f\xe40#\x95\ \xb1.\x1dx.\xfe&'\xf6\xde\x88q\x1c\xb0\xb7~\ \x84\xaf\x5c\xfcs._Y\xe4\xd0\xb6\xdbPdw\xd9\ \xd0\xe3\xd5>\x0b\x87!\xbb\xaa7q~\xfd\x15\x8e\xcd\ =\xc9\x1b\xa6\xff5\xba\x92!\x0c\xbb\xf6\xb3^\xdf=\ \x12\xc9\xe9E\x8af\x95\x0b\xce\xb3\x5cW\xb8\x9f\xd1\xca\ $\x06\x19<\xcf\xed\xaa|i\xda\xd7n\xd3$%\xa3\ dI\xf4\x16O|\xfbI\x0e\x8d\xdcA-\xb3\x0d?\ \xf0\xfaq\xf7X\xd8s]4U\xc5j\xc2K\x8bO\ RT\x87\x19\xa9\x0eA*\xf0=\x1f\xdf\xef\x0a\xebA\ \x18\xe0y.B\x11\x5cw\ \xf1\xe3x\xda:A\xe0\xe3\xba)\x19\x99^u&\xc4\ \x11e%\xcb\x17.\xff.?}\xf8\xe3<\xb9\xf8\xdf\ \x99\xeb\x9c\xc7O\xec.\xcbn.!zY\x16\x19C\ \x98\x9f\xc3\xee$\x1c\xd9s#\x7fs\xea\xb7\xa8\x0c\x16\ \x88\xa2\x18\xd7\x0d\x89\xe3\xb8o\x91\x00\xc8\x18\x0aO\x5c\ \xf8_|\xe4\xde\xff\xc2_\x9c\xfaE\xe2X\xa2\xa2\xe1\ \xba]YS\xd7\xf5n\xf0\x91$M%\x0b\xed\x0b,\ \x8aUJ%\x03mx\x8e\x85\xb6N\x1cwm\x19\x99\ \x9c\xd9\x8d\xdb\xf5p-\x17Cj\x5c\x09_b\xc6\xbb\ \x81\x96\xf6\x1a\xbf\xf9\x8d\x0f\xa0\xeb\x1a\xb6\xd3FW\xf5\ \xbe\xb0\x1e\xba\x01iQ255\xc0WO~\x81\x99\ \xc9Q~\xfd\xf9\x1f'\x106Q\x1c\xe1\xba\x11\xaa\xae\ \x5c\xbd+\xe3\x88r\xa1\xcc\xef|\xf3q>r\xf4\xd7\ \xd1l}\x99\xf5\xc5\x16+\xaf7\x89\x83\x94\x5c\xd4\xd5\ @\x9b\xcd&~\x12\x91ws\x84\xea:\x7f\xf0\xed\x8f\ r\xc3\xcc\x8d\xb4ZW8\xffO\x01\xad\x96\xdb\xd7\x85\ \xdb\xed6q\x1cCN E\x95\xcf_\xfeo<\x9c\ \xf9W4\xd3y\x16\x8f\xe9\xac\xce6\x89\x9c\xee\xbaJ\ \xd3\xb4\xbe\xff&\x17\xe5X\x8e^\xe5\xef\xce\xfe\x0e\x8e\ l\xd2\xf6\x9a,]\xb4hnaa\xcf\xf3H\xfc\x98\ pP\xe0\xcb\x0c__\xf8S\x0ekGI\x0b\x1d\xe6\ /\x84,\x9cn\xe1\xb5c4\xa3\xbb2\xb0,\xab\xcb\ \xc2q\x81@Y\xe3E\xfb/H\x8c\x80\x85S\xeb\xbc\ \xfe\xb4K\xa7\xe9~\x17\x0bw\xe8\x14RbJ\x1ck\ ~\x86\xf9x'M\xed2\xeb\x97\x5c.|\xa3+0\ e2\x19\x92$ac\xa3AG&\x04\xa1\x8e\xa5\xbc\ \xce\xc7\x9f\xfe\x08b\xfb\xc4\xb4L<\xc8T\xba\x9d\xe6\ r9\xa2(\xb2\xa4\x94E\xdd00'\x13\x8a\x83*\ \xf6RDc\xd6#j\xa8h\x86\x82\x9a\xe9/\x90\xe7\ 4M\x1b0M\xb3\x18\xeb\x11C\x87\x0d\xe2F\xc2\xc6\ \x15\x07\x7fY%\xf1%fY%M\x13\x00\x0bh\x1a\ \x861\xa9i\x1a\xe6\x9e\x84rQ\xa71\xe7a\xcf'\ \xf8\x1b\xa0\xe7\x15\x14\xbdko+\x16\x8b\x96\xe7y\xc5\ \x8ca\xe2\x19\x013w\xe6h\xcf\x854\xe7]\xfcU\ \x95\xd8\x97dJWYxnn\xee\xd9\x89\x89\x89\xa3\ I\x94\xa2\x8c\x85\xe4s*\x8d\xd7\x03\xac\x85\x10\x81\x8a\ f\x8aM[\x9eJ\x10\x04\x94\xcbe+\x0a\xc2\xa2e\ \xc4\xec\xbf\xa7@s6\xc0Z\x0ap\x16$i\x04f\ E!M\xba\xba\xb0\xe7y\xeb\x86a\xd4Qu&\xef\ \xd6\x88\xec\x14w-F;r\xcbM4[M\x0a\x85\ \x02\xedv\x9b \x08XXX\xe0\xb1\xc7\x1e#\x9f\xcf\ \x93\x84)/\xbd\xfc2ZM\xc5\xcd9(\xaa\x82\xe3\ 8\xac\xae\xaeR\xadV9{\xf6,333\xdc\x7f\ \xff\xfd\x0c\x0f\x0d\xf3\xe9\xff\xf9\x19vMM\xb0\xe0.\ \xb0\xed\xe0(\x1b\x8d\x0dl\xdb\xa6R\xa9\xf0\xca+\xaf\ \xa5\xe4}\xef{\x1f\xf5z\x9d'\xbe\xf25t\x0c\ 2\xc6\x22\xe3\xf7\x8c\xb1\xba\xb6\x82\xd1\xb5\xa9\xf5\xfd\xda\ w\xdey'7\x1e>\x8c\xa1\xe9|\xfb[/3\x5c\ \x0ah\x8f\xb7\xd1\xa6U\xaa\xd5*g\xce\x9c!\x93\xc9\ lZ64\xee\xbb\xef>\x1e}\xf3\xa3\xbc\xf0\x8d\x17\ y\xe9\xa5\x97\x98\xda\x97\xa1|{\x89\xd9\xd9Y,\xcb\ \xa2\x5c.\xb3\xbe\xbe\xce\xd2\xd2\x12\xd5j\x95w\xbf\xfb\ \xdd466x\xe6\xa9\xe7\xd9W\x1f\xc0\xcfz4\x06\ \x1a\x0c\x0e\x0e\x12\x86!+++\xb4\xdbm<\xcf\xe3\ \xc3\x1f\xfe0\x99L\x86W_9MKi\xe2\x97=\ \xb4\xa9\xe9)\xdcS.\x9a\xa6133\xc3\x993g\ H\xd3\x94]\xbbv\xf1\xc8#\x8f\xf0\xe2\x8b/\xb2\xde\ \x5c\xa3V\xab!\xa5\xe4\xfc\xf9\xf3\xd4\xebu<\xcfc\ ``\xa0o\x9b}\xec\xb1\xc7\xf0}\x9f\x13'O0\ 33C\xa1\x94\xa7\x5c.S\x1f\xacs\xfa\xf4in\ \xba\xe9&N\x9c8A\x10\x04\xdc\x7f\xff\xfdLMM\ \xd1n\xb7\xd9\xd8\xd8\xc0\x0b\x1d\xf6\xee\xdb\x0b\x02\x5c\xd7\ e\xf7\xee\xdd\xcc\xcf\xcf\x03\xb0m\xdb6\xde\xf9\x8ew\ \xe0y\x1e\x17.^@\xd7\xab\xec\x1f\xb8\x8eo\x7f\xfb\ \xdb\xd4j5\xea\xf5:\xba\xae\xf7\xb3\xe3\xbbw\xef\xe6\ \xbe{\xef\xe3\xe4\x89\x93\xd4\x06\xab\x98\xa6I\xb9\x5c\xa6\ \xd5j\xf5/\xa4eY\x00\x94\xcbe\xde\xf6\xb6\xb7\xf1\ \xc2\x0b/p\xfe\xc2\x05\xf6\xee\xdd\x8beY\x5c\xbcx\ \x91\x81\x81\x01J\xa5\x12\xa6i\xf2\xdak\xaf!\xa5\xe4\ \xc8\x91#LLL\xf4f$\xaf\xbd\xf6Z\xd7#\xdd\ c\xbf(\x8a\xc8f\xb3X\x96ee2\x99\xe2\xb6m\ \xdbXZZB\xd3\xb4\x1e\xcb\xf6Y\xb4\xb7\x8f\xeb\xba\ s\xd9lv`dd\xa4\xd8K>\xf6\xb6\xa7i\xda\ \xff\xbe\xe9\xdf\xb3\xc20l\xe6\xf3\xf9\xc9\xf1\xf1q\x16\ \x17\x17{\x0b\xf7\xee3t\x93\xa3{\x8c\xabi\x9a\xe5\ \xbanqff\xa6\xefpH\xd3\xb4\xcf\xca=\x96N\ \x92\x84j\xb5\xdag\xe1\x9eQ`+\xe3\xf7r\x97\xbd\ \x9cd\xa3\xd1`hh\xc8\xca\xe5r\xc5\xad+\x84\xad\ \xb1\xf7X^Q\x14\xda\xed\xf6z\xb5Z\xad\xd7j5\ \x9a\xcdf\x9f\x99\xb5l&\x1b\xf4\x98o\xf3\xf9'm\ \xdbn\xd4\xebu\xa3\xd1h\x90\xcd\xe6 \x05]\xdd\xc2\ \xc1[\x18\xdd\xb6m?\x93\xc9H\xc7q\x10B\x905\ s}\xdfr\x9f'\xaf\xb2\xb0\xf0<\x8fL&\x13\xae\ \xaf\xaf\xcbl&K\x9a\x82@\xa2k\xc65\xcc*\x13\ j\x82&\x00\x00\x1fEIDAT\x84`uu\xd5\ \xca\xe5r\x99v\xbb\xad\x17\x8b\xc5.\x93\x7f\x9f~{\ \x03\x93\xa6i\x1b\xe8\x14\x8b\xc5\x10I\xbf\xfdw\xf3\xb0\ \xaa\xaa\x04A\x10\x85a\xa8\xab\xaaj\x02RSt4\ E\xbf\xf6\x1c\x05\x08\x04\xb6m\x8b$IVr\xb9\x5c\ \xd9\xb6\xed\xd4\xd0\xcd\xbe\x9c\xaa\x8d\xec-\x99\xf1\x86\x81\ H\x05\xa8]\x9d\xe0\xf2\xe5\xcb\xcd\xb1\xb1\xb1\xed\x9e\xe7\ \x93\x16=\xb2c\x11i\x92\x82\xab\x93\xb42$-\xad\ \xef\x91v\x1c\xa7011\xa1\xaa\xaaJ\xac$$\xdb\ \xda\x94\xcb*I$Q\x82\x0cQCC::\x02\x81\ \xe38\xba\xe7y\xa5z\xbdn\xa8\xaaJ3\xdb`b\ \x87N\xe4'\xc8N\x96\xa4\xad!]\xb5\x9f\xf4t]\ 7\xc9d2\xf6\xf6\xc9\xc9\x017\x0e\xc8\xefuP\x84\ uU\xd2\x8eI\xd2\xd4!\xa5\xeb\x916\x0c\xce\x9c\ 9\xa3OLL\x94d\x22i\xe66\x18\x99\xd6\x88\xfc\ \x14l\x93\xa4\xad\x93t\xbaq\x1b\x86\xce\xca\xca\x0aC\ CC\xcd\x5c6g\xac\x07\x1d\x86\x0ft\x0d\xec\xa9\xab\ -\x93h\xa3\x1b\xb3\xa2w\x97S\xedv{nh\ pp\xbf\x17F\x88m6\xc5\xaaB\x1c&h\xe57\ \xae\xa2H\x9d\xd6\xd7\xabD+F\xaf\xf6\x22\xafi\x1a\ q\x9a Gm\xb4\xc3-\xf6\xd5nf\xc5\xbe\x8c\xed\ 6P\xbc\x0c\x8d/\x0c\xf6\xec\x17Z\x1c\xc7J\x18\x86\ X\x9a\x83\xb9c\x89\xfd;\x0f2Y\x9d\xe6\xe9s\xff\ @%Wc\xfd\xab9\x82\x05\x13\xd7u\x15EQ\xb4\ \xde\xed\x14\xeflR\xbc9\xc3t\xe9\x00\xe7WN\x92\ \xa6\x92\xe8t\x15\xfbD\xbe\x97 P\xa3(\xd2}7\ `!]\xe1\xe0M\x0e%1\x8c$\xc0\xf6V\x89,\ \x81s\xacJ\xb0\xa0\xf7n\xd1\x9c\xaa\xa9\xc8PbO\ \xad1p{\x99\xaa6\xc1\xba3\x8fe;\x18\xd6\x00\ \x8d\x7f.\x03\xa2\x97.\xd3U)8\x1f.\xb2\xffh\ \x19-\xc9\x923\xb2\xcco\xbcNE\x14\xe8<;@\ \xb8d\xf4\xd2hu\x10\xb4\x02\x8f\x1d\xb7\xfaPls\ \xd3\xf0=(o\xde\xf1\xb3\x8c\x0cN\x11\xa7a\xdf#\ \x0dH\xdf\xf7\xf1=\x9f\x98\x80]\xc6\x03\xfc\xab\x1b>\ \xc6\x8f]\xf7\x9b\x5c?\xf8(\xa3c\xa3}\xed6\xde\ t\x9f\x06A@\x9cD\xac\xaf\x06\xfc\xe8\xc1\x9fC\xb6\ \x07\xf9\xa9#\xbf\xce\x0f\x1dy\x1fA\xe2_\xe3P\xf5\ <\xaf\xef\xfc|\xf3\xcc\x87\xd8\xa1?\xc8\xdd;\x7f\x90\ 7\xed\xfc \xa1f\xe3yW\xfb\xee\x89VQ\x1a1\ \x9c\x9f\xe2\xa1\x89\x0f\xf1sw\xfd\x19\xf6\xd2 7\xee\ \xb9\x95 \xb5\xaf\xd5\x85\xfd\x00\xd7u\xd1t\xc1\x8e\xdc\ \xed|\xf8\xc8\x1fp\xa0\xfaF~\xe9\xbeO\x11g\xba\ m\xb7x\xa4\xa5\xebz$\xa4x\x81\xcf\xfb\x0e\xfc\x01\ \xf7\xed\xf8Q~\xe6\x96O26\xbe\x8d0\xbd\xd6#\ \xed\xf9\x1e~\x10\x10\x0b\x97\xbbs\x1f\xe3\xc0\xf0\x9d(\ 5s\x9c\xa1\xfcX\x9fg{\xce\xa5\xfeI\xc6\x01\xd7\ \x0d\x1f\xe1\x89K\x7f\xc1\x97_x\x8a\xbdC7\xf4l\ \x1a\xfd7_\xdf#\x1d\xfa\xd4\x8cI\xe6\xdb\x17xu\ \xe5\x05n\x99x\x00?\xb6\xfb\xfa\xebV\x8f\xb4\xe7y\ d\xf5\x22\xe5L\x95g\x16>\xcd\x91\x91G)dJ\ h\xa9\x89\xe7y\xb8\xae\xbb\xc5\xc7\xec\x11G\x11\xe5\xec\ \x00J\xa1\xcd\x17_\xfc\x12;k\x07)h\x15\xfc \ \xc0\xf3\xbd\xab\x16_\xdf\xbf\xea\x91n\xe8|\xe6\xe5?\ $\x9f\x8e33>\x09\xa9\x8a\xe7_\xf5Hw\xe3\xea\ z\xa4/\x9c\xb6\xa8\x0d+\xac;\x8b\xec\x9f8DN\ -o\xb2\xb2w\xcd\x85\x8f\xc2\x90v\xdb\xe3\xa7\x1e\xfd\ q\xbez\xe9\x93(a\x1ccy\x9dM\x16\xbe\xeav\ \xefy\x89\x91\x02'\xb4\x19.lg\xa82D\xcbm\ \xf5\xf5\xd5\xad\xbc\x1a\x86!q\x94\x12\xa4\x0e\xb5\xdc\x08\ \x05}\x80\x8e\xdf$o\x94\xfb\x09\x87\x9e\x1a\xd7\x9b\xb1\ \xa9L\x10(hi\x9eX\xb3\xf0\xbc\x08?\xf2\x09C\ \xbf\xdfw\x92$\x04\xa1O\x12\xa7\xa4R\x22c\x9d\xb1\ \xda\x04\xab\xad5\xc24\xd8\xe4\xd5-\x1e\xe9M\x83\x80\ \xa2\xa8d\xb3\x1a\xe3\xe5\x19,\xbf\x89!\xf2H\xb9\xe9\ \xcf\x0e\xbaI\x8d^\xa6GJ(WL\xe2@CW\ \x0c\x04\x0aa\xe2\x13G\xc95\x1e\xe9\x1e\x17\x1b\xba\xc6\ \xdc\xd2\x12E\xa3\x8ar\xac\xf9i|\xd1\xda\xf49{\ \xdfW\x17\xfe\xc6\xca\xa7\xd9n\xdc\xce\xf8N\x85\x13\xcd\ \x7f\xc2\x89\xdb\xb8n7c\xd2\xbb\x85]\xd7%\x08C\ \x0a\xb5\x90\x97_\xff6\x8f?\xfcK|\xfc\xf9\xf7\xf1\ \xed\xc5'I\x93\xf4\x9alL\xafo\xd5H\xf9\xfa\x85\ \xcf\xf2\xf8\xbd\xbf\xc2\xe7N\xfd\x01g\xec\xaf\xa1\xa2\xe2\ \xba\xd7\xcen\xd7\xf5\x88\xe2\x88%\xeb\x12\xed\x8eMm\ \xd8@\xd6/\xb2a\xaf\x10'\xddLO?\x9d\xe5\xfb\ \xb8\x8e\x8b\x94\xd0\xe0,{\x86n\xc0\xcb_\xe4w\x9e\ \xf9\x18\xba\xa6_3\xbb\xbbq;$I\xca\xd4\xd4\x00\ O\x9d\xfeg\xc6k\x93\xfc\xc6s\xef\x07\x91\xf4\xfb\xee\ ]x\xd7\xeb\xde\xc2\x95|\x99\xdfx\xe6\x83|\xf0\xa6\ \xdfAk'\x8b\xb4\xa3\x15\x96\xce5\xf0;)q\x9a\ G\x08A\xb3\xd9\xa4\xdd\xb1(\xb89\x84\xa9\xf2G/\ ?\xce\x1b\xf6\xfe\x10\xab\xf1y\xd6\xbf\xd3\xe5\xdf^2\ \xc1\xb6mZ\xadV7\x87/*<\xbb\xf6g\xa8\xaf\ %\xb4\xc3eZ\x97WY8\xd3\xc0o\xa7\xdf\xc3\xc2\ \xf9(\xc7B\xf82\x9f?\xf3\x87XA\x93\x96\x7f\x9e\ \xd5y\x9bV\xd3\x05!\xb7\xe8\xc21\x81\x96\x12\x93\xe7\ +\xaf\xff\x0f\xee\xd1\xde\x02\x19\x87\xb3\xf3'X9\xdb\ \xd5\x855C\x05\xa0\xddnc7m2Q\x81f\xf2\ :_\xb8\xf4\xbb\xb8q\x93\x8b\xceKl,\xf8l,\ 71\xf2]\x0d\xc4\xb6m\xacF\x07\xbb\xd8\xd5\x85\x9f\ _\xfbK.\xd9{X\x8b\xcf\x11X>\xe7\x9f^C\ \xd1\xe9\xeb\xc2\xcdf\x93N\x9a\x10D\x06\xe6\xc0\x02\xbf\ \xfc\xa5\x9f@\xec\xd8\xb9C\xc6\xb6\xc4,h$iB\ .\x97c}}\xfd\xdc\xe0\xe0\xe0n]\xd3\xd1\xb6\x85\ \xe4\xea\x82\x8d\xb3>v#@z:\xc8\xae\xde\xbb\x99\ \x91^\xadT*E \x8b.\xc9_\x97\x12-\xa7\xb4\ \x96\x1c\x12W#\xf1@\xcf\x0aR\x99\xf6=\xd2\xa6i\ \x16r\xb9\x1c\xca\x8cO^UY9\xef\x10u \xf1\ \xe8V\x11\xe9\xddu]>\x9f_l\xb5Z\xa5\x91\xe1\ \x91\x82\x15Z\xcc<\x98c\xf9\x84Gk\xc9E\x09\x0c\ \x02'\xc1\xc8w9\xfb\x1a\x16\x0e\x12\xf4\xbd1\x85\xac\ \xca\xcai\x9b\xd0\x92\xa4\x9e\x82LA\xcb\x82\xd8L\xc7\ U*\x15K\xa6\xb2\xd8\xc1g\xef\xbdyVN\xba\xd8\ \xab!\xa9\xaf\x10:)fI%\x89\x93\x9e\xe9\xf4X\ >\x9f?b\x98Y\xc6\xeeV\xb0\x97#\xdas!\xda\ \xa1\x03\x87z\x86n\xe6\xe6\xe6H\xd3\x94\x85\x85\x05\x1e\ ~\xf8a\x0e\x1c8@k\xa3\xcds\xcf~\x83\xc9]\ \x196\x1a\x1b\x14\x8b\x05666h4\x1aT\xabU\ \xce\x9d;\x87\xa6i\xbc\xef}\xef\xa3\x90/\xf0\x99O\ }\x96\xda\xb6*W\xd29\x86\x86\x87XZZ\xc24\ \xbb\x0e\xfa\x8b\x17/\x12\x86!\x8f?\xfe8\xf5z\x9d\ /~\xfe\x1f\xbb%WC\xcb\x8c\x1c\x1aauu\x95\ l.\xdb\xd7\xa6=\xcf\xe3\xd6[o\xe5\x91G\x1e\xc1\ \xd0\x0d\x9e}\xeay\x0a\x03\x0d\xe2RD\x14\xc7\x0c\x0e\ \xd6\xb9p\xe1\x02\xaa\xaavMB\x8a\xc2\xbd\xf7\xde\xcb\ \xfd\xf7\xdf\xcf\xd3_\x7f\x86\xd3\xa7\xceP\x9b\xd412\ &\xcdF\x03\xdb\xb5\xc9f\xb2t:\x1dVVV\xa8\ \xd5j\xbc\xef\xfd\xefc~n\x9e\xe7\x9ez\x9e\xebF\ \xf3D\x83\x01\x8df\x93Z\xadJ\x14E,//\xf7\ -)\x1f\xfa\xd0\x87\xa8\xd7k|\xeb\xf9\x97X\xd5W\ \x88\xb6\x07h;v\xec\xe8\x83u\xa1P\xe0\xf4\xe9\xd3\ $I\xc2\xde\xbd{\xb9\xfb\xee\xbb\x09\x82\x80\x95\xf5e\ \x06\x07\x07\xd9\xd8\xd8\xe8\xdf\xba\x96e]\xe3\xa9~\xe0\ \x81\x07PU\x95\xaf?\xf5un\xbb\xf56\xf4\xe3\x1a\ \xa3\xa3\xa3\xfd[\xf6\xe6\x9bo\xe6\xd2\xa5K$I\xc2\ \xad\xb7\xdeJ\xa1\xd0\xbd\x10\xcb\xcb\xcb\xf8\x91\xcb\xee=\ \xbb13&\x8e\xe3p\xd3M7\xf1\xb9\xcf}\x0e\xdf\ \xf7\xd9\xb1c\x07\x87\x0e\x1db\xdf\xbe}\xb4\xda-\xd6\ \xd7\xd7)\x16\x8b<\xf7\xdcs\x8c\x8d\x8d\xd1\xe9t\xd0\ u\x9d+W\xae\xa0(\x0a\xd3\xd3\xd3<\xfa\xe8\xa34\ \x9bMl\xcf\xa2V\xab\x01\xb0R\xc8s\xee\xdc9f\ ff\xb8p\xe1\x02\xab\xab\xab\x14\x0a\x05\xee\xb8\xfd\x0e\ N\x16Nr\xf6\xfcY\x0e\x1d<\xc4\xfa\xfa:\x97.\ ]\xa2^\xafS\xadV\xb9x\xf1\x22'N\x9c\x00\xd8\ R\xb7\xdcM\xae\xbe\xf4\xd2KW=\xd2=\x1d\xb4\xa7\ \x0b\xcf\xcc\xcc\xec\xce\xe7\xf3}\xee\xdb\xaa\xdbn\xf5\x09\ [\x96\xb5:88X\xccd2\xd9^\x8emkm\ \xee\xd6\xbe\x93$\x89\xc20\x0c\xaa\xd5j\xa1R\xa9\xf4\ \x8d\xe1[u\xe1\xad5\xbeB\x88\xc5N\xa7S\xda\xb5\ kW\xa1\xd5j]\xc3\xcb[u\xe74M\x19\x18\x18\ \xe0\xd4\xa9S\xcf\x1e8p\xe0\xa8\xa2(\xddg\xf2\x16\ \x9f\xf3V\x8e\xd74\x8df\xb3\xc9\xd0\xd0\x90\x95\xc9d\ \x8a\xbd\xaa\xa8\xad\xbc\xdf\xd3\xa7{\xe8\xb7\xb6\xb6vl\ dd\xe4H\xb9\x5c\xee\xd6\xc4\xf4j\x9a\xd3Dn(\ \xaa\x10B\x88\x1e#\xca4M\xd7=\xcf+\xb6\xdb\xed\ T\x11\x8a\x90\xa9\xb8\xea\x1d\xde\xc2\x9fB\x08\x91$\xc9\ |\xa7\xd3\xa9\xd8\xb6\x9d\xefZ\x8c\x95n\x9d\xadr\x0d\ 3\xf7N\xc4\x0f\xc3\xd0u]\xb7\xe68\x8eT\x85J\ \x9a\xf2}\xfb\xde\xac\x17^T\x14E\xac\xac\xacD\x02\ !\xb7\xb2\xad\x10\xb2?\xf8\xaa\xaab\xdb\xb6\x04V\x1a\ \x8d\xc6F\x92$\xc1\xbf\xd4\xf7\xe6R\xcaq\x1c'\xef\ \xfb~\xac d*\xaf\xd6\x0b\xf7\xda\xab\xaa\x0a \xa2\ (\x0a\xe38v\xd34moll$H\x01\x12T\ M\xd5\xb4\xf1\xbd\x83\xb5\xa4\xa9#\xd4nmlwm\ \xe4\x8f\x0e\x0e\x0e\xc6I\x9c\x10\x16\x1dr\xdb\x03he\ H\xd6M\x92\x8e\xd6}\xd9\x1a\x12@I\x92\xc4\xa9\xd5\ jYM\xd321\x09\xd1x\x83\x81\x5c\x96h\xcd \ \xd90\x91\x91\x82bv]\xe7A\x10\xb8\xc0\xda\xe0\xe0\ \xe0\x80\xa2(\xe9\xba\xba\xce\xe4u*\xc9\x86I\xbcb\ \x92::B\x93\x08\xad;cr\xb9\xdc6EQF\ +\x95\x0a~\x1c\x92\xb9\xae\x83\xa1*\xc4-\x83\xb4\xd1\ \xe5[\xa1KP$\xba\xd6\xbd\x8dGFF\x22\x99\xa4\ \xc9\x9a\xb2\xc1\xf6\xeb\x15\xc2U\x83h\xd5D\xda:B\ \x91\x08\xbd\xeb\xd2o4\x1a\xb9\xc9\xc9\xc9\x11$\xcab\ \xd0`\xeaf \x12$M\x9d\xa4\x91!\xb14TS\ \x22\x14A\xb3\xd9\x5c\x0f\xc3p\xdf\xb6m\xdb\xca\x8e\xef\ c\xee\xb4\xc9U\x14\xc2\x0eh\xf5\xb7\xae\xa3\xa5\x19\xda\ OU\x89\xd64\x0c\xc3@\xd7\xf5\xc1r\xb9\x5c\xb0=\ \x0fe\x8f\xc5\xe8m\x11x\x0a\x9e\xdf\x22'\xca\xa4m\ \x93\xd6S\x15\x14E\xa1\xd1h\xa4\x85B\xa1\xaa\xebz\ \xbem\xb4\xd9v\x9fJ!\x17\x90\x84\x1ez\x9c'I\ \x13\x9c\xa7F\x88;\x0a\xaa\xaaV-\xcb*\x17\x8b\xc5\ 1!\x04\xdeu\xab\x8c\xde.I]A\xea\xc7\xc8X\ \x12\x9f\xaf\xe1\x9c\xc9\xf4<7Q\x18\x86dt\x93\x0d\ \xddb\xc7\x83!9Y\xc5\xf7=H#\xbc\x86\xc4\x7f\ \xa9\x8a\xbf\xa4S,\x16\x10B\x8cT\x06*#\xd2\x95\ 4\xf7.\xb2\xed\xee\x0c\x8d\x8d\x0d\x0aJ\x85\xc0\x0b\xd1\ \xdbUZ\xdf(b\x9a&\x9a\xa6\x91\xcb\xe5\xc2\xc8\x8f\ \x0c\xbbj3~o\x91\xd8W)h\x05\xe6\xd6.R\ R\x86\xd8\xf8\xc722P1\x0cC\x13B\xa4\xa6a\ \xd0L\x5c&\xef\x04O_\xe3\xd6\xd1{Q\xde\xb6\xeb\ \xe7\x19\x1f\x9b!\xc6\xc7\xf7\xaf\xf51{\x81G\xa4x\ \xec\xd2\xdf\xc4/<\xf0\xa7\xfc\xc2\x83\x9f`b\xf0 \ \xe5\x09\xf3\xbb=\xd2\xa9\xef\xfb\x04I@\xa7\x19\xf1\xe1\ [\x7f\x9f\x8f\xde\xf1\xa7L\x8c\xec\xe6\xae[\xee\xc1K\ \xec\x1e\xb9\xa4I\x92\x5c\xf5H\x13q\xef\xc8{y\xd7\ \xae_\xe5\xd6\xbd\xf7sd\xe6Q\ wl\x7f\x94\xdf\x7f\xe1c\x84V\x86\x1f\xb9\xe1\x03d\ \xd4\x5c\x9f\x95{2\xa5\xbfY\x0a:]\xb8\x99Sk\ \xcf\xf3\xe5\x93\x7f\xc3;\xf7\xfe{&*{\x88\xa3\xb8\ \xcf\xc2=]\xd8\xf3w\xfe\ \xb7\xb9\xa1\xf8\x83<\xb0\xf7\xad\x0cf'q\xbd\xab\x9a\ sO\x17\x8e\xa3\x84rv\x00\x91\xed\xf0\xc4KO\xb0\ \xb3v=\xa3\x85\x1dx\x81\xb7\xd5\x1cO\xe0\xfb8\xae\ \x87\xae)\x04\xad<\x9f<\xf6\x1bL\x9aGx\xf0\xba\ \xb7`\xaay\x5c\xdf\xc5s\xb7\xb2\xb0\x07H\xf2\xe1\x14\ \xeb\xe9\x19*\xf9\x12\xdbJ;\xa8g\xc7\xf1}\xaf\x8f\ o[=\xd2D\x1a7\xee>\xc4\xf3\xeb\x9fBs|\ \x97\xb9\xe6%\xa2(&\xf0#$z_z\x0c\xc3\x80\ ,\x0aq\x12R\xd0+\xe8\x8a\xc9\x8b\x17\xbfB\x9cv\ \x1d\xfd[eM\x80$\x9f\x10$\x1e\x05\xa3\x8c*:\ 8,\xd3p\x97\xf1}\x97\xc0\xd7\xae\xa9\x17\x060\x00\ U\xa8\x04^BuP\xe5\xc5\xb3\xc7\x98k\x9c%\x08\ \xba\xd6\x0eM\xd3z\xcfd\x12#F\x002Q\xa8\x97\ \x07y\xe9\xf2K\xc4%\x1f\x91v\x8b\xbf3\x81\xb9\xe9\ L\x08\x08\xbc\x00Ch\x98\x19\x9dJf\x88\xe5\xf6<\ 1\x1eN`\x11\xf8\x062\x95W\xb5o\xdfG \xf0\ \xd2\x0e%}\x90\x86\xf3<\x0a\x0a\xeb\xce\x12Q\x18\x11\ \xf9\xd15rl\xac\xc5\xa4\xa4\x90\x82c\xa5(\xc7[\ \x9f\xc5\xc8H\x82\xc0\xc3q\x9d\xfe\xf4\xee\x95\xfck\x22\ \xcbW_\xff3\xdes\xf0?s\xca\xfd\x12\x1b\xf1\xe5\ \x9eQ\xa8\xcf\xab\xbd\x92\xff$J\xe9h\x17\xc8\xc8A\ \xee;x/\x9f?\xfbG\xf8\xa9M\x12_Mam\ -\xb8\x16Z\xc2\x8bsO\xf03\xf7\xfe\x06\x7f\x7f\xfa\ \xf7\xb1\xb8B5;\x8a\xe7]u\xc7\xf7\x060\x8ab\ \x96\xad9\x9cN\xc2\xe8\xb6\x02qa\x96\x91\xe2v\xbc\ \xa0;\xa3\xae&\x13||\xcfE\x22\xb0\xb5\xcb\x1c\x1e\ ?JG?\xc3\x17O\xfe\x15\x05\xb3\xd8\xcd\xc6\xb8^\ \x7f@\xba>\xef\x94\xfad\xc4K\xe7^e\xa2>\xce\ \x9f\xbc\xfc\x0bT\x8bu\xdc\xc0\xc1\xb6\x9d\xbe\xee\xed8\ \x0e\x81\xefS*d\xf9\xbf\xff\xf1#\xfc\xe6\xa3_D\ k\xf9\x8b,.\xcd\xb2|\xb1\x8d\xdf\x8e\x89\x93\xf7o\xf9\ \xa3\x1f\xfd'\xce6\xbe\xc9\x95\xd5\xf3\xac\xce7\xf0[\ W=\xd2=\xa7A.\xc9s\xb2\xf5U\x0ex\xb7\xe1\ &\x1d\xce.}\x89\xb9K\x0e\x8du\x17\xa1B\xa5R\ \xe9\x9e`\x10\x13i\xe0\xc9\x0cO\xcc}\x92\xf7\x8c|\ \x0cQj\xf0\xf5W\xbeHc\xde\xa1\xd5\x0cQ\xf5n\ \x92\xb6\xd9hb\xaf\xdb\xe8Q\x91\xa5\xe0\x14\xc7\xd6\xfe\ \x81b1\xcb\x17\xce\xfc1\x8d\xc5\x90\x8d\x95&z\xa6\ +\xe1Z\x96E\xb3\xd9\xea\x96\xe5\xaay\x9e\x5c\xfec\ &\x9dC\x9cY\xf9\x06~'a\xe1\xd5&z\x01L\ \xb3\xab\x0b7\x9bM\xfc\xbc$NM\x16\xd2\x17\xf8\xcd\ \xaf\xfd\x1cb\xfb\xd8\x0e)\x10\xa8\x99\xae?\xaeW/\ \x1cEQ1\x9b\xcd\x91\xbf!flo\x8e\xd5\x93\x1e\ W^\xea\x80e\xa2\xe8\xa0\x9a\xe2\x1a]X\xd7\xf5b\ \x92\x8f\xd8\xfd\xf6\x02\xe1|\xca\xe5\xe3\x1b\xf8\xb3]\x9d\ C\xcb\xf4\xcb\xc8,EQ\x9aR\xca\xc9|>O\xfe\ h\xca\xd8h\x86\xd9\xe3m\xd6\xbf\x93\x90\x86\x02\xd5\x00\ E\xeb.\xc2+\x95J\xd8n\xb7\x8d\x5c6\x87\xad\xb8\ \xdc\xf5\xc1\x1a+'|f\x8f\xb5\x09\xe6u\x10)Z\ FErU\x17\x1e\x1d\x1d=\xea[\x01\x957*L\ N\xe5\x98}\xb1\xcd\xda\x89\x08\xe9u\x7fzE5\xe9\ \xeb\xc2\xb5Z-\x94\x894\xa2\x91\x88\xe9\x1b3,\x1e\ wh^\x0c V\x91H\xb4\xac MRt]o\ z\x9e'3\x99L5W.\xb0\xed^\x89u%f\ \xe3\x9c\x8fv\xe4\xf6\xc3XV\x17yfgg\x09\xc3\ n\xd9\xc0[\xde\xf2\x16v\xed\xda\xc5\xc2\xdc\x22\xa7\xbf\ y\x96\xba\x22)\xed\xf4QT\xa5_/\x5c(\x14\xb8\ r\xe5\x0a\xd5j\x95w\xbc\xe3\x1dh\xaa\xc6\xe7\xff\xf6\ \x8bTk\x03L\xe4\x1bT\x8f\x0e\xd0n\xb7\x09\xc3\x10\ \xd34\xb9p\xe1\x02q\x1c\xf3\xde\xf7\xbe\x97\x1d;v\ \xf0\x0f\x7f\xf7\x05\x94\x15\x8d\xaa\xbd\xce\xce\xdb\x06h\xb5\ [\x18\x86A\x92$,..\x22\xa5d\xdf\xbe}<\ \xf2\xe8#\xf8\xae\xcfw\x9ez\x95\x9c\xd5f\xa6\xea\xa3\ \x8fjd\xb3Y\x16\x16\x16\xfa\xd4 \x84\xe0\x8e;\xee\ \xe0\xce\xbb\xee\xe4\xb9\xa7\xbe\xc1\xe5\xaf\xceR\xd7\x87\x99\ \xbc!K\xb3\xd5\xec\xfe\xd0\x85ibY\x16+++\ \x8c\x8d\x8d\xf1\xe1\x0f\x7f\x98\xe7\x9e~\x8eWO\x9e\xe2\ \xfa\xf12\xd6@\x870\x0aI\xe2\x84b\xb1\xc8\xfc\xfc\ <\xcdf\x13\x80\xff\xf8\x1f\xff#\x00/>\xceC\x0f=\xc4\xd0\ \xd0\x10\x17/]\xec\x0e\xfcf2`ll\x8c\xa5\xa5\ %FFF\xb8|\xf92\x00\x0f?\xfc0{\xf6\xec\ \xa1\xd3\xe9\xb0\xb6\xb6\xc6\xb9s\xb0o\xdf>._\xbe\ \x8c\xef\xfb\x8c\x8f\x8f\xb3\xb2\xb2B\x1c\xc7\xdc|\xf3\xcd\ \xdcy\xc7\x9d\xec\xdc\xb9\x93\xbf\xfc\xcb\xbfd~a\x9e\ \xd1\x91Q\x9ex\xe2\x09\xea\xf5:\x00kkkDQ\ \x84\xa6i\x1c?P\xadV\x8b[\xcd\xde[\xf9\xb9\xf7\ =\x8ec+\x0c\xc3f\xb1X\x9c\x1c\x18\x18\xa0\xd3\xe9\ \x5c\xc3\xab=\x1d\xb9\xf7\xb7a\x18\xa1\xe38\xc6\xf0\xf0\ 0\xb6m\x7f\x8fwy\xeb\xefcU*\x15N\x9f>\ \xfd\xec\xee\xdd\xbb\x8fn\xb1\xfc^\xb3O\xef\x7fM\xd3\ X[[c||<\xb4m\xdb\xf8\x97j\xa27\xcf\ \xb7iY\x96,\x97\xcb\xd5\xef\xde\xae\xa5I\x1am\xf5\ 1;\x8e\x83eY^\xb5Z\xcd\xb4Z\xdd\xf4\xbdL\ \x05\x8a\x10\x08\xe5{xUX\x96\x95h\x9a\xd6\xcd^\ #\xd0\x84\xde\xd5\x85\x95\xab5\x19[\xfc\xd7\xd2u\xdd\ P\xd7u\x1c\xc7AW\xf5k\xea\x85\x15]\x5c\xd3\x7f\ \xa7\xd3\x91\x8a\xa2D\xbe\xefk\x9a\xa6\x09\x12\x81\x14\xa0\ j\x12E\xb9\xb6\xed&\xf8\xcb$Id\x9a\xa6\xb1\x82\ \xd25^#Q\x94>\xd7\xf6\xab\x0a\xe28N,\xcb\ JUU\x15\x02\xf8\x17\xea\x85\xc5\xe6z7\xcaf\xb3\ q\x9a\xa6R\xc8\xcd\xbae@\xdb69\x12\xc8H\xd9\ ,\x90\xee\x16/\xaf\xae\xae^\xaa\xd7\xeb\x07}\xcf\x97\ \xa1\xd1\xd5\x85qM\xd2N\xb7FWF\x0aB\x93\xbd\ <\x9cQ*\x95\xf4L&CDD:\xde\xa6\x985\ HZ\xbd\xba\xdb\xab\x81\x87a\x18\xb8\xae\xbbZ,\x16\ gt]\x17-\xb5\xc5\xf0\x1eHm\x8d\xb4e\x22\x1d\ m\xd3H\xde\xbf\xfa\x9e\xeb\xb9\xb2Z\xad\x0e\x04I\x88\ \xb2\xa3MN3\x88[:i[GFj\xf7\xc7\xc5\ \x90d2\x19.^\xbcX\x19\x1e\x1e\x0e|\xd7\x8f\xdb\ \x99\x16#\x13*\xe1\x86Ajk\xdd\x1a\xe7D T\ \xd0u]\x18\x86\xe1\x8f\x8c\x8c\x04\x193S\xfe?\xd4\ \x0bc\xdb\xb6~\xe5\xca\x95\xb5r\xb9\x5c\x0c\xe38\x0d\ \xca\x16\x95\xbaJ\xda\xd1\xd1F~\xa4U\xd05\x9d\xe6\ S\x15\xa2U\x1dE\x15\x08!j\xa5R)\x9fJP\ v9\x8c\xde\x11\x11\x05.\x22\xd2\xd0E\x864Ph\ \xfec\x1dUU\xd1u]\x98\xa6\xa9\xea\xba\x8ec\xb8\ \x0c\xde\xe5S/j\x10\x87\x84\x9e\x0b\xba\xa4\xfd\xe5!\ \xe2\x96\x8a\x94Rh\x9a\xa6\x1b\x86!4M\xc3\x1d\xeb\ 0|\xbfFQ\x8e\xb2\xdaXA\x93\x1a\xf1B\x91\xce\ \xf1\x022\x06\xd34\xd5>\x0b\xab\x1d\xf6\xbf)BK\ T|\xc7\xc1$G\xe4\x82u\xacD\xb0h\xf4~\x03\ \xb1R.\x973A\x94\x90\xb9\xc5e\xdb!\x13\xabm\ \x91\xa1@\x10\x06\xe8N\x99\xc6\xd7\xcb\x98\x86\x81\xa6i\ y\xd34\xed\xff/\xf5\xc2\xaa\xaa\xa2\xaaj\xb5\x90\xcf\ \xe7\x96\xfd\x16\x13o\x94\x14\x06}\x22\xcfG\xb9c\xea\ \x1d\x88<\xc4\xd2\xff.\xa6\xec\xfe\x9d\xaa\x015y\x80\ \xff\xf0\xe0\xa7x\xef\x91_\xa5V\xdcA}\xdb\xc05\ 5\xbd}\x94K\x03\xec5\x9dw\x1f\xfae\xde\xbc\xe3\ c\x1c\x9c\xb8\x87{nx#^\xe4\x5c\xf3\xdbY\xbd\ \xe3\xf8I\xc0}#?\xc1\xb0r#\x8f\xdd\xf1\x1f\xb8\ e\xf2\xedxz\xa3\xef\x22M\x92DvQ1$L\ #j\xe66\x1e\x19\xfb\xb7\xfc\xa7\x87?\xcd\xeb\xf3\x1e\ \xa3\xe3\xc3\xc4\xe2\xaa\x8fYv\xa7,\x9e\xe7c\xe4\x04\ \xdb\x94\xdb\xf9\xbd\x1f|\x9aJf\x86_~\xdb\x1f\xe3\ e\x1a\x04\x9bu\xd0\xff\x7f\xea\x85=\xcf'\x88\x02\x94\ L\xc0\xee\xf4\x9d\xfc\xe8M?\x87rx\xf8A\xee\x99\ \xf9\x81M\x16\xbeV\x17\xf6<\x9f(\x0a8\x05/\x9c\x07\x1f\ \xaf='&\x8e\xec\xa0\x08\xc1R\xbd\x81*b\xc8\xa7\ \xea/\x93\xeeNa\xbbvD\xda\xaf4\xa8E\xa0r\ r\xfe\xcflI\x1d\xa0o\x83\xcbD\xebT8\x98\xff\ \x93Xw,\x17#>\xc1\xd2\x92\xc9\xce\xa1a^9\ \xff+&\x97\xcf\xe2\xd8N\x94\xe9]I\xe9\xab\x9a\xe0\ \xed\xcb/r\xf8K\x8f\xf1\xfb\xd1\xc7\xb8l\x1e'\x9d\ \xc8\xa3_\x97\x176\x8dp\xd7gn\xf9\x0a\xf5\x86E\ \xae(\x90\xf23\xa8R\x02\xdb\xb5>3n\xd340\ m\x0b\x09A]\xb9\xc8p\xff\x97\x99\xf2N\xf0\xd73\ \xcf\xd1\xa5u\x87\xe3\xd6\x8d\x08\xb93L\x13\xcf\x87\x8d\ \x1b\xf3\xbc\x7f\xee}\xfa\xb2\xfd<\xfd\xe1#d\xe2\x85\ hN\xae\x91\x09a\x8b\x5c!\x93\xe1\x89\xa3?\xe5\x81\ \x9d\xbfDi*\xd3\xcc.M3[\xaa\xa0\xd7<\xba\ \xdd\xd0\x17.\x97\xcb\xd4\x1b\xcb\xc4\x9bIl\x15\x9e:\ \xf10\xf7\xec\xb9\x8f\xe9\xb9\xd3,\x9d\x81j\xb5\x1ei\ \xe1\xce\x15HRB\xa8\x05\xfex\xe6\x09~\xb1\xfe\x19\ f\xec\xb3\xcc\x8df)_\xada\xd5\xfd\xce\xbb]\x84\ Vt\xdb1\xaa\xfe%^=\xfb\x0cn\xa2\xce\xe5\x85\ \xb3\x94>0\xa8\xce\x1b\x91/l\x18\x06\x8e\xe9`\xc9\ >\x86\x1f\xe3\xd8\xe4\x1f\xd8\xbf\xf9n\xc8T879\ \xcf\xfc\xe5:\x8d%\x07I\x84\xefl\xe5r\x99J\xbd\ A\xbf\x9dc\xd2\xf8\x98w'\xffD\x90h\xf2\xaf\x99\ \x97Y\x982)\xcf\xd7P\xe3J\xa4\x85\x97\xab\x0d\x1a\ \x09\x1f/H\xf1\xce\xdcsl\xf5\xf70\xee|@c\ \xd1\xe0\xca\xa92\x8e\xee\x13O\x84Z\xb8\x5c.c$\ |L[P\xe9\x1e\xe5\xb9\xe3O\xa2<\xff\xc3\xd3\x98\ \x8b\x10\xcbH\xa8\xaa\x125\xd6\xca\xb2LL\xd3p\x17\ \x02\xe6\xff\xe3\xd1\x98\x9a\xe3\xc7O=\x8a>\xaeA\x10\ \x10K+\x91\xb1\xd3n\xc0\xc0\xb7|\x96\xce\xb9\xc8\xad\ n\xee{\xe9\xfb\xe8%\x0d\xb3^&\x91\x15\x88pu\ \x8f\x8e\x9d\xcf\xe7\xb1g[L\xbd\x1d\xf0\xe1\xe8\x9b,\ \x8e\xda\xf8\x96\x84\x92\x04-\xa6FPd\x10\x04h\x09\ \x0d\xcf\xb0\x99?\xed\xb2<;\xc3\xb1_?\x8e~Y\ \xc5\x5cr\x89g\x15\x14ED\x81H\xa1(\xc4d\x15\ }\xdc\xa7Z\x87\x17/\xbe\xc4\xd2y\x9f\xc6\x15\x1f-\ )\xa3%\xd5\xa8\xd2Y\x08\x81\x1aS\xe9\xd6}\x16G\ \x1d\x96\xe7\x179~\xee\x05\x96\xce\x05\xb8z@<+\ PT9\x823%I\x22!i\xd4.\xb84\x15\x9f\ \xb3\x93\xef\xa0l\xda\xb0\x05\xe9&\xd0\xd40\xc1\xe8\xfb\ >333\xec\xd9\xb3\x87\x81\x81\x01,\xdd\xe6\xf4\x07\ \x9f\xb0*\x19CJ,R\xdc\xd7\xc3\xfc\xc2<\x8dz\ \x83B\xa1\xc0\xd8\xd8\x18\xbd\xbd\xbd\xec\xdb\xb7\x8fTw\ \x8a\xbf\xff\xed\x0dz\xfbzY\xe5\xcc\xd3\xbb{\x15\xf5\ F\x8dVK'\x9dNs\xe1\xc2\x05\x0c\xc3\xe0\xfe\xfb\ \xefg\xe7\xce\x9d\xbc\xf5\xfa?\xb0\xaa6\x922\xc3\xb6\ \x039\x9a\xcd&\xb9\x5c\x8eZ\xad\xc6\xf4\xf44\xadV\ \x8b\xe1\xe1aFFF\x88i1>9\xf5)\x9e\xd1\ \xe2\x06\xa9El\xabF&\x97\xe1R\xe9\x12\xf1x<\ L'\xa9*###\xdc|\xf3\xcd\x9c\xf8\xe7I\x16\ /V(j\x82\xbeA\x19w\xadC\xb5R\xed\x10\xb8\ Ql\xf6\xd0\xa1C,U\xaa||\xec4\x99T\x8a\ x\xcc$\x7f\xd32\xb9|\x0e\xcb\xb2\xa8T*\xb4Z\ -t]\xe7\xc8CGh5\x9b\x8c\x97&Y\xaa\xd5\ \xc8:\x16\xca\xf0\xf06\xce\x9f?\xcf\xe0\xe0 \xa9T\ *\x12\xfc{\xf7\xee\xe5\xf6\xdbo\x0f!\x1f~G.\ \x97\xc3\xb6\xed\x08\xcb\xb5L\x8bb\xb1\xc8\xd8\xd8\x18\xf9\ |\x9eC\x87\x0e\x91\xcf\xe7\xb9:s\x95\xa1\xa1!&\ &&\xe8\xd4(_\xb9r\x85\xad[\xb7R*\x950\ M\x93;\xee\xb8\x83M\x9b6111\x11.\x00\x9e\ \xc1\xf6\xed\xdb9}\xfa4\xe9t\x9a\xfe\xfe~\xe6\xe6\ \xe6\x00\xd8\xb1c\x07\x07\x0f\x1ed\xfd\xfa\xf5<\xfb\xec\ \xb3,,,P(\x148y\xf2$}\xbd}\xed\xc6\ \xca\x90\xd1Q\x14\x85\x91\x91\x11\xee\xbd\xf7^\x1c\xc7\xa1\ T*144\xc4\xa5K\x97\xc8f\xb3\x1c=z\x94\ \xb5k\xd7255E\xb9\x5c&\x97\xcbq\xf8\xf0a\ FGG)W+l\xde\xbc\x19]\xd7\xb9p\xe1\x02\ \x99L\x86b\xb1H\xa9T\x8a|\xe1#G\x8ep\xee\ \xdc9\xc6\xc7\xc7\x99\x9d\x9d\x0d\x19\xe9]\xbbv\x05\x1d\ \x9d\xe88\x0e\xc9d\x92\xc9\xc9\xc9\x8bk\xd6\xac\x19\xda\ \xbcy3ccc\xd1\xce\xf3\xf5\xdd\xcc\xed\xf8SS\ \xd3\xb4\xd8\xd6\xad[\xd5j\xb5\xca\xf2\xf2r\xa4U;\ ^k'b/IR\xd9u\xddq`W6\x9b\x8d\ h\x82\x95\xbb)+\xfdgUU\x1b\xb3\xb3\xb3\xd2\xfe\ \xfd\xfbSccc\x916\xed<6:\x15-\xae\xeb\ v\x18\xe9\x89\x91\x91\x91\x1bm\xdb\x8e\xbc\xdb\xcen\xf2\ \xca\xa6\x8e\x95\xbep\x87\xed^\xb9X\xac\x1c\xbb\xef\xfb\ \x08!\xa8\xd7\xeb\xe5b\xb1\xd8388\xc8\xe4\xe4d\ tK+\xa9\xeet\xa4)\xa5v\x96\xd6u]\xaf\xbd\ \xbfF2\xd1\x15b\xb4\xda\xf5\x5cr\x88\xf8Z\x96\xe5\ \xa6R)uvv\x16Y\x96\xdb\x8c\xf4\xf5\x1cs\xd0\ \x99DyffFZ\xbdz\xb5'\x84\x90bZ\xec\ \xb3Yd\xaey\xbd\xed\x1a\xe4\xa0X,*SSS\ $\x12\x09:ZXj\x7f\xb7\xab\xab;\xfaM\xfb\x8f\ \x9a\xba\xaec;6q-\x8e\xefC\x5c\xfb\xfc\xf1\x85\ \x10\x94\xcbe\x84\x10R\xbd^GBB\x1514%\ \xb6\x82\x91\x96\x22M\xdch4\xf0}\xbf\x99N\xa7{\ \x16\x16\x16\xe8Jt\x11\xf8a}\x96\x92\x1b\x8cGZ\ \xb1s6eYv\xf3\xf9<\x86n\xe0t\x99$\xfb\ \xed\xb0\x94\xd0\x10\xf8\xba\x1a\xe6\x85\xdb\x98l\xa5Ri\ \x15\x0a\x05U\x08\x11\xf3\xf0\xf0V-\xd3\x9dRB\xd6\ \xb8\x93\xe9u\xe5N\x0d|\x22\x16\x8b\xe5\x93\xc9\xa4\xa3\ (\x8ah\xcaMr\x03\x12\xbe)\x11\xb4T|]!\ \xb0\xe4\xd0\xeb\x0d\xaf\x02!\x84H\xe6r9Z\xbeA\ z\xa3\x05\xaeL\xa0+\x04\xa6\xd2\xee\xda\x92\x91\xa4\x10\ kS\x14e\xb2\xa7\xa7g\x93\xa9\x9b\xd4\xe2U\xfa\x06\ \x05N\xb3\x9ds\xd6\xc3\x9cs'\xb1.\xcb2}}\ }j\xe0\x07\x94\x9d:}[ \xb0$|C!0\ \x04~3\xe4\xafe!wV\xf7K\x99Lf\xd0\xb2\ \x1d\xfcUMR\x05\x19W\x07%{\xa0\x8c,\x04K\ oeq\xe6\xb5N\x0b[\x5c\x08\x81\xe3{\xf8\xfd\xcb\ $w\xb7\xe8M\x0c\xd04\xeb!ti+T^)\ Fw\x9a\xa2(\xb2\xe7y\xe8\xaaAl{\x95\xe2\x9a\ \x1c)5\xcbLu\x8aX\x5c\xa5~,\x8f=\x13\xc3\ \xf7}YQ\x94d,\x16\xd3\x14E\x91\xe7VO\xb3\ \xe5N\x8dDP`\xa9YA\xc8\x02w\xaa\x9b\xe5\x8f\ R\xf8n\xd8 bY\x16\xb2/\x05sJE\x1a\xdc\ \x1b\x10\x0f\xb2Xv\x0b\xd7\xb1\x09\x0c\x95\xfa\xf1\x0c\xce\ \xa2\x8a\xa6i\x04A\x10\x97e\x19\xd9\x95Y^\xb7\xc0\ \xe6=i\x12A\x9e\xa6^\xc3\xb6\x1dh$\xa9\xbe\x99\ ]Y\xaf'9\xb6\xc3|r\x91\xe1\xbdI\x02+\x8e\ *K4Z\x15TEc\xf1\x95<\xbe\x11\xed\xe4\xa4\ \x09\xa0j\xe8\xac\xbbMG\xc9\x18\x0c\xa4\x86\x90\x0f\xac\ {\x80dW\xbb;\xcb\xba\x96\x17\x0e+\x92,<\xd9\ f}\xec\xab|o\xc7\xa3|\xe7\x0b\x8f\xb3.\xb3;\ *1\xec\xd8\x9aQ\xfe\xd7sX\xa84\xf8\xd1\xee'\ \x19\xce\xde\xc57\xb7?\xc0\xb7n\xfd\x01\xa6\xdbZI\ \xa8\x06\x1dYg\x05\x06\xbbz\xeffw\xf1\xbb\xdc\xb3\ \xfbA\xbe\xb8\xea\x1b\xe8\xa2\x82q\xadG\xba\x93\x17\x96\ \xbc\xc0amn\x13_\x1f|\x88\x9f\xdf\xf9[2\xe6\ m\xac\xea\xed\xc1\xf6\xcc(E\x19\xf5_\x1b&\x8a&\ \xb11\xb9\x87\x07oy\x9a\xa1\xfc^~\xb2\xf7\x19l\ m\xf934k\xc7s\x96U\xb82Q\xe3\xd1}\xcf\ \xb3!\xbb\x9b\x9f\xed\x7f\x01'\xd9\x88>\xbf\x96\xd6l\ \xe7\x85e\x83}\xa9v^xMj\x13\xeb\x0b\xdb\xb0\ \xedPyt\xb4p(\xf8M\x5c\xd7dS\xe1\x16\x8e\ \xcf\xfc\x85\xf7N}\xc4\xce5\xfb\xc2d\xf9\x0am\x1b\ ia\xdb\x22+\x06\x98\xaa\x958q\xf9u\xbe6t\ \x08\x81\xc0u\xbdHgw\x1a\x83\x0c\xc3 p\x15\x06\ s7q\xd6|\x95\x1d\xf9\xbb\xd8X\xdcF_\xd7z\ \xcc\xeb|a\xd34\xc2\xbc\xb0\x92\xa4\xeaL\xf3\xdf\xd2\ (\xb7\xae\xdbK>\xbe\x1a\xd32\xaeS\x22\xa1\xe7\xac\ \x08AsI\xf0\xda\xd9\xe7Y\xadmc\xfb\xda\xedh\ R\x22\xd4\xca\xc6\x0aMn\x1a\x04\x81G\xd6\xdb@\xd5\ +\xd1\x97\xed\xa7\xb7{\x80\xde\xe4@\x14\xde\xeeHP\ \xbd\xcdH7\xday\xe13\x95\xf7\xf8\x1f\xcb\xb6\x8e\xf6\ \x8f\xf1\xef\x16\x00\x00\x00\x00IEND\xaeB`\x82\ \ " qt_resource_name = b"\ \x00\x06\ \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\ \x00\x14\ \x00\x22\x00G\ \x00T\ \x00i\x00m\x00e\x00-\x00F\x00o\x00r\x00-\x00L\x00u\x00n\x00c\x00h\x00-\x002\x00.\ \x00j\x00p\x00g\ \x00\x0b\ \x07P1G\ \x00e\ \x00l\x00l\x00i\x00p\x00s\x00e\x00.\x00p\x00n\x00g\ \x00\x08\ \x00(X'\ \x00t\ \x00i\x00l\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\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\ " 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() examples/widgets/animation/animatedtiles/images/000077500000000000000000000000001376617013100224165ustar00rootroot00000000000000examples/widgets/animation/animatedtiles/images/Time-For-Lunch-2.jpg000066400000000000000000000773271376617013100257700ustar00rootroot00000000000000JFIFC    C   Time for Lunch"D!1AQa"2qB#Rb3r$CSs%45Tc!!1AQ"2aqB ?s<#2g̹ͿZ2ʪ^Πz[՟#n GPt?:&)C G:WʗH5ODn NaHn˅jPZtXo a怚D[-' Iر!0;~sJ- }kTH"o!QFScYk|ۓzGܐH=DBsRAVKS*ڊJlmh 8QڲL|ntro{΋ 'I^X<"6j1x.Ug)֓2;zqvZsSִ:pچr8RlC*;W|$ZBk5$P W'iDZ6T./}Tz~!Kj% ;nk,9ԀG10:[λjaU YdRî5BE`-X޴%[MmX\->&`mslMyVcrXtfp_UCaCko$Kui@Q ebt7R7SW"-Ik~5CP#+z% B(b,X jCe/@Y-<`>5x qd0'}FEQb,HtI|gFj%jƹ qʫK"ez1 ,CmLz5V8,e?(lLh-qיE4sez?k㚄BMCBX^ץ nA&&1?|Q#ጃƕ-ZxJong/JЪ3om|\gUBPEZ!nq7#H1 x",Եv{bIݵSBZ@%mH=-VED21}92QTfxԏ`EpȦ!:\QPb(`huTH>C+e$?]̜WQm\:ucpF;0J|ֻ_2^5U␢x8y`&AaIÌ1P1|7ؙᶊB$R47ZeʳnlhNkzKqLK|8CpZ+X|&'<ͩ}y_SZ pYTa֏ȶsaP pljM7ҶʏF*5փAfazXֈ; Y9VF; i}'ޮƧ}5H Z8qnhø,EI:;U9AU#q_P.` S)t4D2'ZH68o_5*ܚ,ӓP(=mG/ ^?/ӱ Bk[J_B>,I˨qUo]z4>жxj^s8T@f3,JB%th#nI ǗZe*>塨%ޖnJ(h%dp)'K裥`(]zC,mr0)lmʸiZZ )eZ05]M5L\@$z*BgoH<ԂHwބ=֠#R1H[6 'c;{.\&PHi?!YnVyVdh5 4Z9|]mYN2B5jVX6hdOB#:/ 0peBٚJ1ܪ#,zcM;}ŨIoxHV9Z\Lژmv?Y8Id˸7laLBf0|RL)uF3U /o(յ;Q/HP}Ϳ #jܒ3*+0)/Mf$KĎ[S)婱kI)֨:VP{z-s\Th"?|HO4"bU_[d8McoMZ7 E:76 ёk*Lv%/U k I5,0Kd"WCAa\`XQN*UU+sQj x+"Sb{ILYEmu 4uWCֱUVKXh7&7QH}fTT) U/xڗ=$w"NsFyNGέ ,moګae[Fo5qc±{^1RxbYFGË^q׵l"k'+KcS9ՂAjZq)Keyl:p8|,dCZFmQz*rk Njr~h Gv+M""L&=-׵<נaef:9V#{ГW8fL7V zn TKȍi_Yag;\Q#FdGHՔqjϖ&'7rhS㲁c/!;f23Zu Fmw'ڻupޤ*j9TdB(NԐiM"wc Rc cnMH$~@ЃzqR,wބU.9<^ 6[Ɣ!u65e_̵g +,emNM]VjILrbjED~<\VCQOP^6Wd b1ڵ9 ilqaDa񀌳|udZhF\CcM9=ʂi,rۘWaSPs&à"[7|6?AJtH= bu,7%A5#z-Տʄm\ ޔ⤛(*oԍ RrUs;*) fMewQSПڳ4R@Un&B@+fbwsZC|3XGˇq򑪶SJ!rͽkVp4!ErD-,u@pʣ5TD(&mzH[ ԎWQ_ie]bl{Gk (^dQܵ*H"'ʠ~ 8IE1+Cenm}9"f;nGZT5M눣ena:ޢV@擉SMF: 2a}NbbH @ZMD^=}9)5Xr梤;M~< ("Has%k$-{Z*4 1e.ȞP0' $6٤3BiF =Vs\5&qwHG.bL+Km>W…phkP琣Db]! g`xNv[\1Q-oj;jq9aR,E ҂圹A5Fp:w&@<5 ի ԃV0\mH66>Obcw:~t1[JY Τ`4Y?:6\K?-оm|96ݍUә.\71ҭ[20 ZS )1󠶧qV]CM©c V9aᏘڠl ߵB᧖/*;V`vP)ju7 [o΁OsDF11 Iέ= ]`Ɉ\\̹\ڊ$4n3kaFה (r ([[kF+qHՋ`5=mX}i bujuzڤ :W8ۮzވ TT*;(AeucMK\e5&ۦ$j&q-u9M.PDR;wsRUR27e݇Dnt0S/pA65ngqu;ؚ 阤v߅ӎ湀kfEkmqiE)ngxe9]PF=>kR 4!WD7bHZj5HWp*P 㾔? 9qLd#^fɦ¨L8qzXgH4RF+jso;xiSE!Oܖ>Z1x[(9 ðRMfL mOZ[¡D$UI>)[߾T)6Jsmծ$-:D %7ڞ>P#ބ@h 6:8c#,If{de*m֣B*(kRD(UZ\moEq`G#Πn56SHڴT]Yin@N;C#QA֤_"x*um[`fw.䛓R9VkC:Q )P`׵tu"ӈ!=Ƶ$ VJ ɬ\LKHwNrjZ*MNQE^".!1IC:҄"ΚVQ66:S FZUKTkIqbA#XVXaV rn>%ǝڳVydFWץ@[,XSP`Aڳ6 䍴7ObԸ:].ՠ ޠi.1q] 3_p,դRIGHaN%KaBHƏe,F.CE]ފCfԞCz4Jt֤”T^UhX,zfք yl_′1-n.!ߵ.`-׽ yP}JoDrX\O}(Xr'*4褚u@PƤ\U`$LJ7\mV ҋ ^ICĪ {\Q3 t'k*I` aph*|Ofc4co2SY*%KFҷF`'`@CmRxi6ݖzJ.;2ˎWIu58*lEYi _*Y)Wa 2Ί75| e#JCow4'zc,:⢔EPp"9osW' J}eyD8iCZŒrHTЊP ?6E*HB kU &RR1r.z AŻ)š)ש4qa"D] lIYx(m`l2Kj`Eq3wD_~` >M.S{ڨ83aV67RĚb4sa}D3Zˇ3W ULd$akJMO j^t/jpV*AIq$2͋.SM2Ѩ3[VEv8QhmLtۥgbb/6t"o6biuskK]ΈTO4.ܭBXX ހ,b߆ srX$`,?J8|dgj\ fA#[ԻYIU5InXߡx@f@/ߝ[S޲ |dqtWj[#qE!~,:[^¸|"@uVV Z aJp9k`D6UrюWH A؎uuUŰl6"xO֋)ErsT9r7*6~b#)]Ma0Ph~UVNoX۳yh(W Y6 )bHNiSQ~R 2RWxPa~Ũ]qW#&1#VݾQ݄İKu4,Ii𑌻&AT1bܩ2pAg m@묅eqvJF*]ن*Yfsv7XhBP|'ڤ3yBh(j`PEz>` $v9աäŔ!j}}%cbhO>u@3HܱיāZQVg M|!K&|rLmzphUA>}oLzm (t0옖A|u+ ZPA=c-}ZP|k_SE$; IEtd'6Ro( P H=&4Nu&m\XPo@>QWlO$ hH u*T\ڄ%7JE"; k <\31,zȢb2>%-谸b#b7ZYFecQQޚ'ÁjM/}N@l:mһ[Tl/Khjz$NAZ*!PAQ@=fS}vҘiFb+7//oRy2ЪMZTx%$u_ PF mC<)$)ȣQDdC,3U'N"HGֈFbPh$i>'pa|:/%T`I4ð D'[<=5)0RK^Obp /+ʊ>-6؀/2V>nkT$uiG:($b{_}?: MŦ†Ǿn!$ʄXPV?TL4:Jڗ4\2 W+`Tѐ5"d D VǗcAֶqW+Qph @My& .$XU9zČ;dYY؂wc洇0mC*V+bX<3X֦ p弋f ޮf;*v(/? 3YJe +J0T [(׹75XHfN[@KqqJ} uazÚ5DS0Ҽ5fxZT45/ʫ!3^4=2l¸!H ]f:aΖQDH֩8T\!"өGDa;1)z9\Do :ZñrF:,Yυ clJt6BXʢdc&ڂ f6€Vy֩nƽa+eWE]ޢḮ=ڡCޖ\ocnj5/C{ps@\ʹ"F*MZB0""ہ`IbW U>r,ukIWc#MHE u"anp|?n°q}zS,-'l0* JT]Y)i)l9QQGz\܊)‰<ؑuc1yKmI%N7=F-څ;h !f(H7y܁Q1cY5"O;BqԱ&#;o=[N?*E!6^aq &Hwzۭ@$:Qd$2"p+d]J@4va-r11b< ~ueka͆)@iXp.b_a{Ԉc,rkP>5|}9-JzaKaݭNcƺkUcD26 ^'!Ġ3E؁ iR I&c+al;^bZ(FȅƦ@1ک(Z5:W=ējbMuDMLOy_߭ฅFVr FkfÅOzs5wk?RޮJ,FP11,cDŏKZ9hAM; hӋB@WH^\*$:km/ևsaݨ U쿹\DePu7V0h„%I{ѪڙS{n-b=q2dž3ޕ`F=jShMΫJ8D,H^J6Vk2ɦ+c+9|l+21jä$3j͙2Lшw7~cQ[8,F)-o=äImVʎFp 梳X@N"7ŪWu~DbiG } )谯ԚSA햍;jBlQ.2Aj6,[cFTL,-}s֚b 9(uYbzyp,VF0*2Y<;e&OzK2_IJQAJ nձOG2R(l!~R'xNη:؍W/0жThhYZQE@B"*̀ qߝ-:aUij[iVuȤVi%Ja[hh *2C҄PhkBWrk,̪4 /HiYdp;5Fh{2;uJW}ړ$xi.$G)a΅L#(YP uR>4Pʤ} ֳH#鹣$e7 ڗ#&CpY-7=*N5*Dž`6gYC8794-Zq LJ0t\\ .2:_)tkŊ0}7UXflkR8yaԸֵP |>=4ݫ(<^lzT |еV-w=/]qk##e`AQjҝXs[F՟0hRh76k28ge 7שX :|$qH]bZ;[C][#]TF")ױ'?( EL KGiI+dGB+_aqg/qTW+LGۘG\J!QE`qx4p z S*]QYk Kd')6ĭ@G_.pAO1Z| ØM>>UaE} H0p,>u!(l l:,2*Ea6Z v(6S lBC21kTAIl WeJ%IBެD `˖D/D u$,EZQgf-r,we|^ 24RM\>.!)[//z-Q`>Xc'6)gCx^Jp7;_.\5mԒ=^%ݢŅ$S#f!mu ct` VJm;n%BeTsAG0f%ةϖUR6 t&!an ҙ qROKծ 88XNk8BUZzj.5L`Q oSrt:P(+؈ j, rl@n_Ke˽ HOUV[.#f[֕,F,@Gr-jk2cbTraQIlˢlG,jV$V̅&ԼDML_]C/B _P6ٻԒ ߭ށޅAa%ƴ45Li9RkS@aBEBfSi"ORee]/5Ѯ9RRc&@E9 Ac{20yX.6B,)Oo'c|J1x=賥 ˎQ V2mVg6ǂ *]ȁcȆşVvgZ?7cMW.Um cPn5ڃb-[q)FTV*u i]b_ᕲ`yWpL|m6CUT![O[%[<|d] qaH,o&[߽FԒ,Aq֢(U?N޶rb,!Yҫ#QqW9<VKB*j1{e6 ՜:92 "xNaS\,BzwRn[ĩiW3GY]ZPb h|QǘA[Eoz(,pˡ؁31X+5S 7q)#55pu4Or n3 tf@ ЍXY*}cl!T'z:{б6qYN4-D5Pzڈ@ j GBEIW ݅ TI֩bFX5H`XR3Jb |BW88o@ҳyaxzrFh™!dɯ{CpZ$Sb3`,)2+Ce;"cHnE(ʉlwKRɉDZRcnH; b* EvI#-~U_N#${UnyMcqF' ťYbCtʎ]vdpgX\V{t_ګ5%'6f0/_XRuXeU棽tVR mYk0'CR×ڊS3/z,0FwIH2F bæE$>uV=,+ѤEu0O~Wj#H9W"j`rhݍ[ .Md!ieeEߧ3}*bDJ jxXQKtQYWj r/Ƥ7PI+ {]5&$.OJE^"e E%᩵VߴJ!P3zYEj(.MoT4|DAKXkb4܀Y9ZIk@C2nV>FC+FBc`T>25apZTɇq0ҵ<l6[5A I_jeQo/:ċ)AisDLr) s!^Ƅv8E}h&WbZDThI} *k즏ć8@C$R RvօtX@h~uJXam@QU0Vlz#6B 7Ϋ TXXp^Vֹ83D$E4& ά<A Ik蓓 6 ;kI;(|Sɉ'̀5eN2~.xNP:Vyi Qr.E1"hJ͜  I,c8 | VP X_[ ɖY$w-}k[+8޲d1r+B鹺s酬-,bBI[8,2ac<؍|3I4[(O{G:xT:jQmEYVG>]ZܛQUA(kΝE>0U TJH30mL_XJ͖ M@+걂~Ux 䑿aڪch&b' k<cP2d.dXTxAo6*5> 35n^UFvUSE u?V2% 7D9f7&T + MANjt`]YGT uA 7#AWk2 m(F jЈ EMnu D n']9[qZ bz:`7F#jQEF?#N"ոEH]mz@-}t"q1+ˑZtD Vl+/ReԚ8wҝQE]ޏ:`y4,N"%ݕ[eקd#†G$[DEޗ2}d\u:,\%4kV9ڶFk18BˊCkkab#q[xn׾kʯ0E _ڇpqi0RXM 7ʶUxq6"zҾSszCE'IckZ* Y9 falC&QE-sm~txX\d6ڊ~T3$W (ւXf} aCԜcа7I`|s{ԀY}m~3\sQRY:aIE9M/*qfS`9d -,9ƙ/Df7*3**Z:ygHcˤ+кxi(ɣ  CرA*Dr[zHL<'pPܥ5wa/ku1m:0 <]n}BxّXPHBG"^كf=)l^|(|uRX6UU(H 6ȋ~Fil'I[ C՛,&`{Hwb==&'իS1wveSO #&>fuDA-s4J-]pӥV!$ 'Ts[ e3ƟxÚg+A,47!B3чQγ0}Fo('W5E3r~ ·1=*lLcQ*Ž33'`jj.җ4Ʊ1b^?Hh>ڲ+qr^s qx2tj*4ѥSKgUгbf'a~e!ԋs·pQљ2ee#G8apgFtקn>l-kjΏߣ {~J؂7l36l7!NGİXcԇ{Z[^c[sKoQ˸.&@6YL.lG %"I︣haĕF_joϩ鸫Urk=o_ҏ9Wb;WIo牆[}fLQP^S⒪,@U w{D2Vw[Z455' )S:cZ ژcZ=yQxOAq_kôR[ vjNp|'^J³ŬmױثSK]D4\.╉I-Σf{W^&L>RȾTO`3ԃF%`Fo %tZUOEeee̬b6("yU 8 09|v3Wt ʪ ~jP~Gq],6@cȎG޵v x^Jr"Ī`gQe*>"H[^Uj&I#1IoFo2\lmoII)O !eo@1#z#oु\ Јi)3;zrx|9'UT(ce*.5:`L$-[jkDeT–I5 t1C*.$Cm*TRի£)W$bqoj淜*CKѠֺ0Ji}(ԑzT .*JR!!xer; L,F /Q@cZ> 4VXlJ!E [z2f*Z<$σ\EK#(o`ks#ee=t5m0D^Y߫h,amӹ63ʳ%p "K*fXa{yV7 XRȉsq{E1)- ߠGUÌ|B)_!:ڣM`r"3aKdlY4R,_u" b6#?1ckiLDDG2혋?ƉCiS5\bȲ^ͧOXE.:i E5!6kKj@EG2B66#{tͳQ&v~WbH;(:ߕE_DX14<``XYSbDHA*Z E޳.NtfuU0Mj|XjcږIk4P\ޖqS^`19 ޳L] +~Tě 5bE@RʤPz0 .{а\*:+tkP[E%ak#Y\^݅BX7& $Q P[3M\Rl௥7#ekb}c@܍oD6D iH1IO<%S qSӨ(Sc N@Z$ sJԋPAO 7jIDh0Zw˖lݡ̭H"P]`JSz2-B>! ҖX531%VI;"j/N(y2ڬe%Ir/kV]=Ou]>B-hXXb&Qt֨mIaM",+(= Ne!-tTFѪ?5{R8Z!,&6l5&>-|h ͬx[5)稱V:S$gm*ZzmQq77"ֵҦ'Zچj l4WꓪI 5Hwr^#DjJRl: jdaa|(^"1eH3)-ZpX@Jo19PnƟpi_@MDԱfHmQqUpb;0>U.Q}tvKIտVB0 }j ʈ4:PsG9jh"?H$5XB`]TvH#.6U9GAR N覯GztŨF5`@'ڴ|>׏ȶt\ M%auMTM2r\yO* 7zśUz-\(-ѹޖW&=\ T£fehSVhD`t$jpV5֗&pݝ*ʕbm;P`.TԊH"hԃb?=k?-)e7ڛO#zsn?Jkc\kGAVpZ2>_#sE;kZPG_Q4$ԟJdla[nN%0/|xQ?JĐk}h$onM?r4bѳD{(H)$FɱSVw'hLRpÚ nTm@ȭmTƉR"Ċ/>n Jq3< w|2=\FpH>g;f:(=,lb+6 עY r5ӏ-ayJ];hH9Ɩr}TzC! MXzɅ:KkntB Q( EU"RG:,W(TP0CkJ A ЛWg;PnK5ɹsTDhI6Tj?E˷J}ҫl}+Ԥd;mff."$lʴ>LCx1ԝOh4okP͢UZP$JysHb[ зVTjRDic Tݽ#Pa".goץUɹcszlI\af ҵX !L`Or[crh9c,*L,hSږڊFzu.ASA͑]n\k(1P-fYPUDqmjy&F³_(~5%3(V)#BEj)` e6=ҭ̀ѯ(wh@A,.̠u,)rOV"Q1 l>bqeHrL/o5ՠb۝Bu]jkk3GT ;U Q5_tʜ3UȅAʧ;Q~W)&sFxV 9ZBNUW[4ڷ;p &Ϳfjܘͩ܅,jVʶ^צQwunhnoZh@^Im{B-cLRJPP#'̡lFYF#sJu*P@&~._wnJ )PvWz&SD;_@hKT3Z#tQͅcZj1@~Tc0C墙cmI@.#pÝ67o9zzr֖Yb>75#K1ʣsUqaW3Mo1 &&)5uiYA"&5r똖ގ<>oBX( ,(̋QgQs,vZ%"4Wh`qvHuY64P#Ԫ dcAcfC514W-O0}2c" Kk9i0ʶ5N5[HؑQO2jj!\_jQKm@ܦ-no_}ۭgFdCTRQKjctdh>@>uоKEknℂ4Yޅ%7sڦ\ QN5jc-oPfч@,eV-((*K.akqƱeuN[})hӀ Q*F5,^snW4Ȕ\pbFvO)!~H[?G:k[5wzW;.^#GST&吻ҳn$q 3oaKBs򨶺v#+75F0_;9\2Jk`&HƗ敆4߰^֨bmiVn,Y=VW#6"AQ"Aa}M&lTf+Tf{yNI44y5vɭɫ:9E-AT^"Զ`5-}kZK]G':zE( PYӆsMk^QH\[FI#OZbEOJ\;bbֹJԡHug.A>h4|fR-itz$7r7VkhzKӍ)Cp@QKk$0=+WYbC뤲e6:8]Ux+ִ%-*`,Ee0+jcElŌXq&̀sD[\] ḯLIV`7ؼv38չgcHVj,EڷJ@:QrC0.FfEމ&+Cڣ05 ԛ݁-GMnO-*,ֿ|l*-݊׽slXP8&8Rj2Ǻ'5Ñ Sa~@шo4ʽ' 4$f v,45j6vaW<*"KR9 aj(IkkH! pXEsàft{ 5Kl*TQ*E(9jr`iX}J$<>J [4BƳ8[fTBڨ!$ܖ'rko¹g*.LݢXsY1FL3oڏzK?TXUrG3BH _ݭ(PG'k)իI.HZШ.Aބ/vL ~Ӡ֦HE\ˁj08 k3(N҉nNz/Ts՛m85UF=5٘IlB]I΍)s@OzbqpʹG r]YR(Jr3Uۅ@HP,|&{jc}5HѨŦ!RiKҌPsf[@$–J4FUqйǵ1[]5A4F3xحoEbRV k SskRaB: tacBE6[s}5C46|mN9((`vqY@d03 ]FQA}597mŤh[(-n6'&3MεQQ(͇X֯ZnXQw[QHTIVpV<:>9qxYEXf[BنՑ0)3-U-ܛG&\bx!ƝK((ͿJ̵GXN'L>^[#72#Z·<8 xxcZ/%c0j mҾ݈AMs4c47A2ʊz cC8V;4cA3\nr}ݍqW3QՑj,-<~(>МRXXיXcMf<8l4[.Q['R%k$ W3z9tu4'ǔ0SQZ3 R _|<[ͪmUL35FmQ=N闒έRAeAںfFPE ԚR ],IGmTDRq uWw=B>zD6(Aoz{7W HH9J$!2*o^jix@Rk{^jWpE<`1Rfvȋ|WNSH10&* vp6x30Ld`cހZH#$nJ"4:]:d$w@JIFΧ_Neaqލ8jߝP;P\Pj./F`v$zX[KQ"~񂞗xSnJtHq[.Z ]FJ1LըҘ˕<)ii3r59#Y#JΑ$( b2鮹O3\7 SpaQSrXهQRp/uۃLG)7޵ R h5?+1m~aPfmzE\Ԫ}o'oj`޶*1XD z Tg; `jG^՝6&iY.,MHwX qfKb;+ n˜ʻ}K1@,$ִ1 3g1[2+E,m:^ A~C6I6ӭzJ+5θGvTunp!#e[N-"Ɋ|佷nuDlor;n"qcr r4a2ɛQKuϹFZ9S4ySJI-QcA..0 ez›_a޻0UʉA'JLǢy.,c ΍]$qo78C4-)LHo6$މUJK -G9n0nEMdsԤi6*,Աkܒkê&$.,|ѣ'1 7& dȊ1$5K/j׈Fى%n6yb|짋Ҍ0Bh݉)=N:R &ʬ/cR2qnB@εoA<<2;R|۱ +hkT4UZ1"Fˡt@URj.q*vcI&/ƺ~՛4|25֮JSu;Vqۥs(w+Ƣ y͔i[Mv²+mjЌA"yΔ;e"{UL wlm j-\muEm5Ǭ6pfrCjBYDk`k7<ɚY˔1 y"$y")v ma"hp)I/ʎb6JW[d&5֩9NH |6`6?CjH.fv ÞԫnIG?q 1PYtS|'XVږ&G_YJWMX z#HA"?Wjs}(N9PM 5&Ԑ[VmH":oUAl ;,RpU~mp6$k$kb;呕]֬Be`qmv;ֆ\ BmIG gPaw$ DF]SpOޮ\& #:2mv 681]8ň""y (v,HHr)(5n*ˆ?9%,Xj9̙ 2+H @AiKD!ʒ7ߑLR8̲Tr}(S$*/ՙL^#A6EV[n&C/ɛOʊWǪ$!oVSڟGPvr==v5LbS\ޜ& 7OvcxslXÉVDVB`u,sRKJFZdUcsA qGʤ[ީbxlf.{0K"0տџ&v Fx[0Qj}#;(kQc`Yu"4ĥM( Ic$6pSYwO#֒Qq^,pD@RS{:jdTev#Z-3RF;  f6iA|lz#TisS(Ð5NV=EMHc\t޺DZ HT)(>'[,q Pw4,2$PY`O};ms;Bf_8̪^| d19IoJڒkp}/$T/S}A vľݨ9P Fh@OJNS&$"| 3W#j<ިF{kY*|gHW¶yH#&ď,OiO+@k4ēU봘?hB=.5 * O$?=u5ÓXY`j n! ͨPN$'ddO*ΩxbȣۭW^toh1(E6p$&]Wg  δ%>}5wwV4.VRM4HPSn!ӗ:b^FʋTD"!ʊ55C4P GiqؗJ#H"}CWsa0e sST\8\Tާ raj4Z`\hkQ$ }% NU^*o65̶U7vN$`cuڛ,RQg4׽(`YEՖ9noT($6v !=C d$J==GFp#YH LcaYo𑱬^ UsIxԩ6[?V|^bwkhD̬YO3O#R\⪟F.ܬNJPLH5zl4mE+ťhpVL:Dtt-^& /eCk ɏXCsuSFTұaѥߐl~}X[&6rf}fo3_}GCaր),XyF+) L0BM|8vA:XsƤ_,|L6 /ĠSav?l+8ָ;XWNC8D/E҂n*e-帿_8A#$g&ݨj 6 |7Cj90n4l$h VN>Q'`l~]+O-3,gL2k=ʜ1;cS+`2;qlmFE]R4@ZYFgS!)bEuEN"W @:ݫMuħcαNĮF76MRm1IͅUn̅slj~Z+9+*/ \XTc,~ TUO]\!isLTs5^[ܵLo nEmEet$n/o֤YFRXQ;S MuZ+-XVL$`!0C+hn]C3XFU+bYuS))a„mjv54T 38š[46&͔V2,hԑ[F8yx0r`: W5Ű *)1GR9,SޮR:ui1"Zؗ+HE&p*UZ5̍UHAr@>Qi&8-t )GL Bl9{Ђ8PObT 0 ͻS&vוBSVmLAPJ50u(B:cԝklAis_+Xt+QVl*P)[.QF%>(@xӢ#q%EyXtďҳ_(=UϜ-< á iڸܚ~(}Q}i %45+Rډ@κ_cB@LC DBwyofK K+jnZ9" Fv U aȀb.{l(\J2&kLj:2Tdܖ/"ZףyEx)gWȗcsL.ZBu%Ca] XԊ<Ƶxm- /Wx2ָ/V$k]CE*/U hIȵl}ͪ]B< A`1#NHhe VQxQL( 3úXQ>ک̋eDSz,r Apv?ϵIؓ1R/Ҭ)ScW /UaJO\uFғPjkJa:U>4,DQImS,QbDQB7Vlސ8d)ف9dמN&fe:J2"A}v8_5%J+ @<%$^S' |]L,X ?^L7QeGn5 ((ڦƤ ҉Z`Ѕ?fr=W?j/LAP4EˈXc^ks;nΉ6 "$ kT` UgKeOݔ0.Һ,@57-/muP Mcby2Hu?6L80\ q ֌EP T7 +3I#e'*wVQõGr#]w3Va|/QL9 Fo颵|xuAkXSoU B5VA(kPڈhդ$Zj0S؍I1ۖ؏*H@D{nhZF03x_Ҳ;hĹڶx}=KiY p\U-ɼ_lڐދCge 扁QjY,/Z!]Q~!zjA5!An)DM+,fL2\Fҥƾ-5c2®|䶶2Kns]Ir ;Tf߭͘꼰&#Jrufs|+ߵtq 93gj} f:XliV5<^>{1[7\qAm-V8@Pl7 {Վ?'R1l'ځVqʩsd_*mΡ*ke;0" E#pR s2r4Ō%lFRNnjL*`b>Tk.6Is0IuRt6vqqcL˦NOOVA^unSQQLS>Ɲ͌^`,cV,;E:MS p?^$<"u,eYbuٟS1"sSay;wxW[W2( s:pJs<&`{ѭ|w_;$}?%sL,01lW)cr -YSLesS CyQ)]R:&$r*n3nsrr&QxiZt(˒0 kZ5UoGQDxI9 Բ&ﳳ39]PhcA@Ek?YLL8FDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDOQ%%`IENDB`examples/widgets/animation/animatedtiles/images/ellipse.png000066400000000000000000000250171376617013100245660ustar00rootroot00000000000000PNG  IHDRddpTsRGBbKGD pHYs+tIME+쥻n IDATxy]U? w95*!!  [6` HhOxHړHKQ@4 $TpÙ>a^+[᜻7}Å:::x3LuuuW&1^]]֬Y94]u[VXy$IZ[[)JhƮ]m@Ӵ_P pc0 0׶=0ȋ-{X|RJ  i•.a8HD>AA&]vL'фD腁3w\BgCRUUef2`vv~׫'\J <˲[IJ,,]&Np`zNX*:;v?OU !Ih>@kٳg=x⋤333S>@.o!p)%e!=mcY!@?X(" b1Xs(JZUBZxW~)%R ,pLWӑ}@o7Gn4)MCÉ9t Dhȳ:i裏 |dmo4Mc޽J6eWPh@Jʖ/!xϓ7}D׺^YzJ !+]3%3 %8nKl0 NokkEccc8Ry^Pt]u݃H˶|I !GYH7BI@=(!$m#\dRII6a7BiiHuvv i;v츧W3{ 477oq6oތm۸{P`[UyX[6BB:.KQDX$#DV|A@4y2T*yLfM23rX`x؉ց0B+Գ+[[[otx<ܛVBښj®i'=#ʠ ۳=bfWYafrHGx.sss"mQ(Є@{g,k<ͷqLqsAd1o[$-z4Mc75 BK/\.(m *7“\.G.+U8fWs1L0P*LkU[6@3EwLt:@P΀ɲ+ʯٟ0:%^QM832U&4|>j1<- R(|8aP(?v ~ !4=\fgg ./;dpp/X,ƝwމitvvrtC0 lrLY:W<]DB%ӝ-4|7O=.JWo @˲z+TY*fheYaoC=tM\{{ouq-sW|w\pxtvv3p=PSSC4ezz04 d٬:=;C8&14g{x51J8al`17ʚ\X,͛)T* 8Bt} iH$wuD[o>9ve]}o}[p | _ HCXdffO>^:;;Yx1ԧXjg}6zRtY8p ۶I&s7I">֌5K) MMM}uIg޶S'S_XyP *.R~!]t7xG>ꫯX,i> ?~~%@/~;lkO~zك8ϐL&+i $_GvфyH!R0Rگ$F9jeYVW[[sssض-V1?}ruqWavy'q/H)k۷k8p@m8)%[|򱱱)@ pIss\B@,km۶~|Bq$p0 F0\J (8D"cy?Isscix|fCVT¶m?rN1M!Rp8Ȍ~#q ᤍXOӴ!@:+6|{֭ H۶/mhh( 䗾%}||C<۷o=J$Hpp`mz9N"![CѲqƣ_6 uuu׮YCSfUu]?$ް,@ 7+k f>9D,;. d2otNGFFy.v,^|>m ws]BPN 36G I N2R]2BU-\~ll̷4J _>Ld`;KyR@Rp8l+ëꕬD"qm"Q럌bg|͌ssNO\V~iˁ+y|q ҮNR r]ׯ_+@B{8pZF)ӟ4O=\yI0M-[|>ɼЋHYROOko&,bݺu۷1_99D{Jۡ<n (LaxP u]%P(P, a4M'? W\qE[9\ߺNwN$g2 Mff4_ar aȻK^r&sD}[\Cߦ)Df"(_gfffQ4\.w߫HvDٲ,<Ԧ;vz駟FuCTi}tֻY꜃;#Xj/ժG) kWxg޽|>_M;S]|9[nezzVd2-ZSWĥiGЍy5m0xJ)o߾zlll+!1p]gk8s7t۶m#177G*"cccXm۶Q,5>>~k,Kח۶y'\r뮻8555O{ZBn9CCClذ~9xcӦMB!u?D>e˖@;~j! =19؎KUA傾gj@tr@̭D" ]%L"믧X,D">HP`0H8& BbCd2RIMFo"=~2NbyY}7[k{|>\dd&~0==C=Yn<+W$H088HOO?X,μ ́[/^Q$PO?@ t8^ 0qkd10<<4-TB!>O /^t]<몂 ȷ2tϞy .=:::y8/"7m)7m`hGmCBЧe٪%K8|={ѫ|QeLR6d2###QM&CB,jW[ZPUգDJ)T*O|0袋򗿌iA*bddnIfd2300 BmH}}}SSRu+/6 J%BRl6K4%Jf;iiiB+Wg:9x0hB*׎i{1qqPtu]$*[m2t:K`TWW311k:Dx\Մ#m,DftTV<m\p466rWԄi,^LӤd2I.Cuؽ{/2/%@+OJEX5_\0jdyD;%J^ |v{w!كiדfuNjkkٻw/===d2 x<1Ǒ~W0!C}{|7w_ɹiKսX4." +\O?!Qfff2x-@G8tЫu\LJϕ}B @  d2jjjʩg2,˲cuRC(b1כ<ŲWy[+38~wy&&&83hll^}x ^5dK˲@ 4yd9|'uCUZB6n4555 (K)OWxԔ*1 ` BPL&фF٣hUC'c@'~ИK17WCPգ0 FGGFu4[E*299x<ȱJW#("]KcfoR#7"4QFG>B?_|1O<CCC8L&iiiarr\.WMEUKukkk1)lܸ:jkkq]QƗ6r;EcbbFu;Xn_8pd0 Y B S(8R ^~_E_Si'vE$yI뭼UVYb}}}]066FWW<մsiq}17GZkkpUU ZT"%H\.ynݳgϞ5@-Z4xꩧ811%KXf /)J,pt:yr9\eΝGeEQ&T|@UU=UUU111AWW### 8)0A0* `hơ'3w!B?*@t]s_[ٱc_uuݯFqa?wyI;f\බ\ti=]5Ld&4ENd D;n$SJ+3ષQ m߲,֮]˲eT*177Gss3tZRTWW:ĶmLӔN[VuM)E޽h9S_ 4C XF!)Ay^ccclذ0Zx0MJuݪ+W5555*!) m5#,"mp'X VUCl*Yū{*K4OH$B0T5XjzjB===Wr ؏reQWTp8w_%WhCy JyLz,U.G{.Rn6$+W<~_rJv@0X,fVT]P/֯_|%t])U:/o@u﩮ؼy3˖-[*?RG-x>s7ׇiq?%e df|Tmۄ3.g{ppַ )h] w_) ܴ4)+a{EnRs]/}K~<]K4}TFlM}};kkkEH%Db| ]j 5$No;JCT r/T5"ْR2|sjjWWl5\B.x==}KD"!=\S,QW4Jh%Ifff,LTΏ,Y#_*AU<+rc8e L%M8I7ijFzҷܔ3T1(o_ @[n [>Oxgso%_ IDAT۷wt: 555>zj{9gZ%s0"}=I#{P.UrQ+`x% .ۈb0 F:bP+L"eYAl~YsF^ M8۷oGJɏc<xO^U۴i_NNP8Exꩧq[$^l}it߽s AtWj'u &!9?\3bdYu]xP(Ķmi]AuTU&d\.GXJKMMxGGGtIEu;^΍6Ζl6{e]va6EAv\v.3h!5Ixi6R[[R9SMVqW0xp\ݽl@t]'|J+/֮]K[[6m"NL&CuN8O^84۶!6R`0a۶T?k׮upxЂ`!L>p{O~|ѢEk]7W}&"lfz?Ԡ;*Q*\8J%Rrԗ 0XSSsΝ;Y|9TO%ʮ266s];vT977e+/}Ɋ+.ؿ~tte^ESSSOm,٬I@I)4===~,1;;['STQT"K,azzR47555R,Qo7YUUUWBԔ+]) Q"111tdŊ_W֭[?X8^x߿r]:R?)W]Ua322zxݗ5 }geY+{zz[ikkg?;v@A6eٲe=۷׻>GCCDRRJ&&&XXn*kJ̱Tf r4T8+稃<„9P̲e0 BP(<RRT d2Ff0Du4:eʰMSՏ*uOVfTO!/!:^MWGV>@% ?QUU\%Dطo?37۶۾}{7}c'd``Oa*C6Du٬_3*ڭT*٣;||$cզ+pI]OyJ"Tʋtvv|r{1<ϣՒJTJhFMM9@uyꩧ0 P(D*ڷ D"\O?x… $S޾ FeXOVi$0'WΤgggBxem~-K.mn ˎԯ=33C g7fƍh$ R 4 }Or5eҥ 4MW !8#l/}K2? *| '.X`YE+9*՘i*h1X__ٳguuur9 \O<!TD"AGG|;MP^4McJo9p#zgk@ӴvwwH?>Wv'ٲ?zUWq}ezzڟ>a~377GWW<:Wm]%ɜ OkllLu ~* q`8$711A]]?s8aPmCfѿl)1BaȎ E*)m0?;Rc*~b klvK)uud2?y~#پr$~,ZӴ؋i>!({bVJ)cXfvvvaicyu|_u|_氞nиIENDB`examples/widgets/animation/animatedtiles/images/figure8.png000066400000000000000000000333421376617013100245020ustar00rootroot00000000000000PNG  IHDRddpTsRGBbKGD pHYs+tIME$| IDATxwe?SN33Lf2jHȺ˲QW_W]]v]EQVPqYuY: )MLϜ9=~8;$ܢH)1 !RJ,u]aU.By oqo4T^{bMF%KNaW_'u DѳuRB])CB)NatH[m.f̘2^B岿1WUU]WUU@? m0|inq !PU˲K}:N.&W?;10I:) 8y)e L{{{6' Rʰ]wÕ6vVCdY 'QA:—rTT'!TWJjժy@MT*ͷm)%LPY*K43 fMU$Aw7DHHCW#pݻw8&@4M41]X離%Kb&.*NgO2އfDQE6U[[fٲeo/=/+ 2f eYWQ@- ]^WC-eYE"hjj,0NN$dYl\}y5kԯ俶l*.þP(pu)J=MgDJ ۶rضM>ukTBQ0mc»Kd.U#*J7w@03L?w83ڂHÏSU[xUn&'l'URzX,"|0IKc,;/ز,l_i>KX'!X^u?Z>Ҭɲ'*>λӓtnD StMsHD6QqR:-ՠHi“T*8!4 EQrA"iʓO>+T9NQ۶4i7twetuuf}c8\P8݈vMk$^(+x*tMM'߁Y^&742e0J@NPކTU$!7(5e !pp·L2iʔ)/;ͳl%ꪫhllW]oP(iq7 rXZ!|̬iu$ni  8100E(~?jxE>njBʽ˘I67V .#P__ܹs}`4M}W@d\pn(X_\.0Y|;_`v-aL4M%tjǨ#8K R1o4@644\Fob7J) 188Hbh75km|/v/d}<>lRH$|H$_ueY_]WEϧ:z)yBW]u~:T￟> LѸi Ajr>ţ_ePxV#JegP]]>{"ޟ$@?!aTT,YRQ!9sFpr*p{(5DH5ېۖ:Ep݂OIi\7KkylÖ-[*s2i$!(JTUP(DX$eY3 ,]..9HR鴯(ⳟ\e,6mP(liQ,)YIZ;HIIMC 5QJa\ItEbYe! 9X=$d~N0#^3Ax*P(뺬^[{RZakjjfJ,՞S򎀘94{سg7x#?H$ y饗Xp!vsm6 rEQ.}%t\EU|>qѝh2>F~n,ˬRȃ 0k֬;T)uAw_i F6Mut 0ͰH8fƌ bfT*8DQq]wIu=  JMz4v84M o?ehF*b޽y2DS_!UUٰa𢡊4߷qqYpl*մLATԜ"ɳӧ !(8eX8L}< M"eCFq"f8TWWIR={nZ5˲]pXG}Է^QJ0<}6_>ijy5) Yy*T4188988MoݠWƶmB5t ?8p!B>T(2Dz,TUT*Q,;w.o&K,axxZ,rH$93̙?AnV? TزDک<O3~w({xqr:~Yb]vg}6hmmO_gܹd2Z[[ ̜97x)@ /޽{T!CF#[|O`6y']D"%9~.~r[1M iBuJs>'t*P1m0Q_=.at ,]n};^-*+( d\bi+fiugiFpsbI0T=ϲ..>c(XǪHԼyl555#Mr@*BHpg _YC~8lp($yO٨w$.ضmDaJݻu]^~#J&%/ }w̍`y# rL1uiDQr( yN\JW)5EL$pWO1L&R4*6,E(:@ ~NSeߏu ޱ{Pyab+ТVJM||nV~s۱Y04STrQP02U2 O?Rxa]]]x'͛aѢER)FGG4$ċ=٩fG|U(RUTU@  UʼyhnnfttJeM `K ۱Hӕ ݏ_4M͡p8\( ;7mOBUQ#.TU|+̟?͛7:˫i$IǛ5"!H)я~ĬY{+esJ~X,"dҤItuud:dBy[/---8px<^Ibk!R ӧ̣~ZzLz\RF+;c'Gsc뺲sJ UUbkU,x-8& 7ogN`ٲelݺe˖Or{n6lgIss3>쟤iE"o!`hhRhتˆdU5..;6h#,MSYaQdƌѪ vyY^(J*L!c؎CSxF;rȣ'G Hgg'/9SxWr`O>_@ >r }Cuk?Jfy,S2+<3WT,~U2 'c qF+i'HP$L\.hx_1gYr /}QVдB~lH$+kA uuN^HGj(PN9|.l,%0}JFֽX~-;_-/57^ʋ֯_UǼ>l.̙CP/;bȫb!\'h4bTUUqr(?!˖-?? xd&MMVJ ]e~W֩zu pD^s| @u\q]&gPr,BH[~knm۶Q*cٲelܸ`0H8&f)[UU%wQ)YJP%H!E<~uoxe:t^s7bzTm۳=zom !*łFHf$.Q3BPrpU~W T41BorO~6\ם_8֟ H*矧}Μ9lnX(j$%3~yVg駐Pv̾] H*k(Rĵ^z[[ۆu֭< }On8A5B͟ w}~+45]; {qEb(Ia7>F`0Ƚ>9>7$JaYRυȱ 4G a8(Bo~o%TjBTJIccEJ"UMa@yr}ضeUtiAN=TK" Nc&V0*Svnkc8E7j8 k @3G`CJ=* l6);^HPN5Mc6>&.<Mtϭxc̙sQ&( {BQgxx8V.U&{ZM?]H l,-LK a̎;PJ#M2\p-(ƴgTspud6#I/WUUzjÁ}eT!Vb/ncC۶=SA1&9j0RϸgMn0P?N۬B P[lᨰ!ވvd` GMs̛暮jmIEUo[~KZn%S_eZئsDxio$ nf{9re˖ٶm۶mcҥlذO6771S;W; VѢ!}0@/¶m5_+]EHKɫ^)>L&ѣG\ץSGe۶mC: K8H j!B cczGDjjj>qy}Gy/w^rOӬ]3gӃ8 !8餓fH{!8Brw<It֤2;̪Sؚ 0ud|DPc>iҤƵkײh"6nXR]/;u{6?@2 ҝ+H2&O|´i^Tqعsud-lD(M6qE[}s֭cIJ,nV;< Az֜9sػwO x7pڴi޷Eнu+'n`t{'{*I*z+ v'eZȷl)e7HaѢE^eI)ubR_^a1,۶kUdd!R1^.P(L,=3nPrvayF5q%1қ,zCҟL&ɓ'LӴ]P4HT5W?:1(gSVXOɍ@Ho)@^UUQ*v_r%===X%kkk??xb^ŋy7iiit:͔)SR}vrr1~"r9:Y$)\]68&M+UXlF>?wJ8a%'&= VH!_:C:FJI8Ʋ,TMXz5|~\Eh|2 HCe&UYfWl۶76.'Ofef̘udΝ;eY@ =5v|Kn]'b5Mò,zɒ%_,侾Cc(W6fNBNC_/wtt<434M{r){nGSt)!{o O3e 0{˜89T*z/ƹJ%|ߟ"dݴ6yXя~s9vIgg?4MN?tϞ={={6~&\.{*BaXO cqS:;6E=gĥwx&m)^qO$i+YŢ?O+ ( hm Ӹ/d$2=7KbE*TҲ}Yg)JÕNJ9P?^,J)%\s [laժU$ -Zihh.\H 齀~)>/‹cfAHSNkY8.M5NtXsw]]M=*{\f@@EQ]"tUѸ m+'KFƝ0ȓ MD6}ö@t]箻_:N)tuu)fu]6o(ްIeeaRhii&|?2#0rmw{u]B骪 OI1,blS}tdI R@"WNzG(d۷Wj-d]Jr"H@_gOK);g*ړ㨪J[[?wcGqضH:~pӦMz?O>RUU;^a${Fh^Ru֡i˗/6} :^x!'O3 </2]v5klذX,Ʃs=wؤaJ*~fQ>-uTUUhjjb̙ L8j1B㋓hGRn:XzKyRyJmN9묳b$I2S0M{rm122Ž;p]۷.P(088xD,aL&]WW˗/gtwwyf~~ԩN4i~%=b˲>M>@s^\j``7r4eEaRf?tSKix8j*_C1nGBw$燈 rb6gϦ۶CJ2bH0${/a$J ś;51pT_E]𰯲Bx`gɱ :L_rvזRvI)7 |ӟ桇g?/8 eޑk쩯Ռ?{!bѯ2:u*t(#SYMMM޽WZgOZTq\p_YkOګA=RJv5K>~S8vx=YUUJ#F<ģJӳ6oތeYӧwZS7|3|Zox?0{l=\(s6lK.a͚5\y<,\ZTU瞛0x튢~{ߋ(c?ӷ5558BJUW}nZ]:#lۦL&# ~NX,wuׯg2>іؽ{7 xzn֭[m7|;Ж,Ybmݺ;wÖ-[Xb? $ 2|:;;yWf rS)ߟFQr1gddu'&nK/~ P*9B)SyoUUe̙d2sޚm7|SW ˲xᇹxGI& H)d߾}'d/t`0OFٳd2(+\q^OSO9 BP&!Mโ ^x!/2޼u! y<Gs{λ曹Yl---<䓾jy n`ӦMד G0Du > w}{AwSo\q%BυB!*/>Mz<{6Okzzz_~E/^\Et]gҥ۷w}۷- Gs#<8MMM\sήP([[[㾏4 mx\Hcc RJ a- yV\+ BxQ{8Nd2]?`m8Gu#`d H| /H]w׻zw]!pIENDB`examples/widgets/animation/animatedtiles/images/kinetic.png000066400000000000000000000151701376617013100245560ustar00rootroot00000000000000PNG  IHDRdi|sRGBbKGD pHYs&&tIME:IDATx{tT?gd y#J(Jké..[zus[z{Kz=*=Z*xJQ #$31f{ Lp;kd~c@eeebc0eY*i ˲03B @QQzgʕc!ؿ?{M!D0* cF|!2T RJikk0A^^SLAJAeY eK((@ &1@;1H 8" ^!T0]rA92gngvmIvl'v·3'ݱO6A˲d"XS @afB*LNJe)&H 4 (G 0z5d`4+-MK^I9 I(x9"kRJTR1T0$B]qR `H4Ubo څr@HbhmNWD &!˅dW  n ieE@=fazz*ϋV!FHAzBQ$ĵB.~C(X3E1݆H )P0ң6 뜟HOwFJdb FOTN]N%Kx QSHLX=^b=*z1 5b!jn% N|/,RG= K4@ y cMId–e@ןK]y9'HV*+10|KWVc@r Kxlk,ITBƲ× ɵd%PZzqH[.0JȐ'#TPծsd5saMTN`zPod/>xwPޕ3 \B cz)xOë?̟>q) {󡓨sDFV\Y0@'<+xWr],^} -VG`aBTEu<9len}X.kOL긿v-K>U\ + aw{fkײ$/_*Œk#ycīGrd=CętS᤮UYn2*;rG>b#FMao aV|zM{i"ATcTVP3qM@)sWjsB\#? Q^vcsS N'T/g= [e twH$\^#|$.7/Kq2~q'(B`?E,~Q@ZPP2s8p?7gYXTsmaOp\k7+0݌ Q:tcr%9O }<坏EsnJG WHGcgXW Ic;?7\LO9?/ǣ225t@Ǜ2 g ^VneeFcހ׫w^U. sD6&b\\A}w 9xQW| a:>Ts W͵*d>dg C:Te)iYaM]+Gg{QLPSBa8>?RWFB4U;ڶzBU;iZ W -Zef]I.+͊:>zhqq1JQfmC#%!|jQe I⩑|gA%99 6fm#¼ A:SqEJ+0jlp\ [[\THG))p(VX-Ԓ#1,U=4%H\Q2RTL)_RXl 8'MrVdmsb_.Oi¡ͮXL4@QX8k8NTa7iAmH2Gb'2=ۜa)% ,1,ˢsn |TܭVhfrBAE7tN7B%-U'r3 X(G+G2.LDQAͽ,qk3<>H4٪?=ݬgg7N! $&:]8*Sm{m=JͤrwԬ,;u_NtsηCOA&fM2iYi$2w+ E\Vpًn( ?S_{dOe8 o}!}Sk@?|mP[)PXu2FMJn+̯)aWbRIUƀWmܟTxgmԻ-Q̙ۛU=C~/;]dΖ`mGʘ$3f>ϖ6nsoÜkx(^g4L3#˰9R\o Ϯ{\o}כl% Tნ K9l5BNl-#?$22*;‡?ϲuwuֱ>!a+ř[~C4 #eiKdj0f.fxc6yGwX^DIfi7#ySʲ, ] W,Q@X2ǒ`5wޓO11*ltkV0rG08QcX,g6$M5ʇ׫t_0%OưbC{G*}q1S-wrbfN*?yŴw/lp^O%sYQgE1BfN].cn%T%͛xk1/xs&HH1wAo?i9EJ\e=CPay.0RdBH$MB'8$goK{G\[uCe{*-#-]HzZ8ǟ `k^(fp(*.hKpIIBIq[9^OˑrIʡ_> >qE{09!cpenrheYto.7Z^m^P. ),b``;3;3bAvݻ4-ŋpK3An]NSX̕9{Ix%g?Y~_Rv&I"v[駟ѣO>[>g[nݾ[r`ug`$R-q~#^z%EXn_]SWWG- -]3z뭌?>+5$DQ sUVglݺ.k?Yf ;{q+wM74PiӦ Znܹlذzh.˺x lΜ9|{Kyѹs|L2ŮOڵk7/~2=iiiIΝ;F;(~an,g}4uU{,{Ue˨?].qFjjjF?fu뮻GyZ,BUU6lGXڎeIHB'WRJuu5;v`w},^8s{zg7twwj*tj,YyY|9gΜᮻz-k׮ncƍ|+_aձdIѳ^M6yf֭[ҥKYn]=S\\ٳkgϞ?OQQ+Ve˖*.K91&L< 7ofٲeu]%%%6JKKQU>ȵ&Mz޽  Xx1زe >V1EEEɓSbc9)%?lIaa!]]]8q"2t/+q2:t(Ѳh4:$tivtt4 &RƍGCCc6! gΜa׮]ttt@0dCJĉ3ٓ[d*++StON>|`͚5̘1H$… Y~=vt]mFAӴ꼼DGM==߱ tvvRWWGii)_5kbXp!uuu;o#矧.WTTD__ft( >ttt*"S:ľ}(++#c=F___f(466GUUgϞe M;v젥yWL0h4ʯ~+kK)RiA/pݰ(x#5MxDNϗծd7yj(' iPٳgLmm-L4 B;vcǎ99 [C.54Wtqk(Ͷ3> .!Mf.kWN!g{`xhq,Q$dLB`LB!OUBƍǬY07L9tTYSh r eF3zKd `۶mcX@,]`TB yTRw/&jV!p-%vBĀ^EQ:TU=iZPӴ1KO~5IENDB`examples/widgets/animation/animatedtiles/images/random.png000066400000000000000000000351711376617013100244130ustar00rootroot00000000000000PNG  IHDRddpTsRGBbKGD pHYs+tIMEM IDATxy\U>w[-Iw! YY@@F\fA 8Wt\Xd@QM! C: MNI5`̏zիSgGh͝tI;L2QJ %HP$BsJRxɒ%_L5Y &_'󨩩ynpp0qCUBc2s*:NJKrnJM<)D~v6'= ۝c;0 cC&), )>$$8l]O"*BnfwulQm`gWP`(bTUU/C6\Ų, tE3s=q뙿GOK7&@h^4MLv]t]!7Pŷ?[Ξq1a B% ˲0M.eYض$19#H@ 8TUPBq0MqvO{c9_$UEH4]u;;;[Mwb;k8LQ4(~/U Hoo/mmm)l<$NM9l EQ@+r~q*B9U F(TΝ[hmmEJSCЂ.TWW@,˚{aH uHݣb۶KkKf@E;KyJ #\__`ڴixGQh \12ф[9J\qXPR(J@4rʓN:Wy(`ٿ@޽kF҇nCJisKD-V+Ds03fZ'ɞ桪*\EQQ3+$XyJ%$z7 ց"F<²-7OzjP2Kd2bSu8iXKen\v⏉DBԴTR}R7f>jF,BŊ'#:iRBdzI.c6Cm??Z{9dT:M:& dA !s>Az l=#y44 uq'*m#tA&?|\z\gx?8dT*y7#&[gٲe|Gu";v젲v_JjH>`z6]y]żC eZ"`6_=gdDuX9I|{ ēHK8<¨P5&%1s͂{xed" ۶H4MömTU}{mmmh?&F竪(RHr.vϤwIJ|+|W۷oGJI" I}}K^̚59 ;5Cϲ,@'qJsg#ϛevu#x#<cwS@ bb@uU) BHFJOr7pԋ0nݎiC1ƍ´iӎp=o 'b6g-RCJa4@-Ku\.G,]g BQq=]dhQ%8%.h8. }NQ؇~ EAAeȒ`.ľ`H 4RK㚎sO?)[ne\3gf8p|>윌RbTٜ(2a~t.dτDXpyB45Ee&Rf0M I&i*$9'X C}};w -EQHV}4;,_emLJ")>"HB!:(Gͺu0 4BRǴOEƖ|QPDAc9h?{p-%]"/J%1,cj~ʷeH3BcM3Ed?]bUfuP5$TTUs槟[mZVl"/(ʇvB(Ox(B8 :::]nkJaI(ݣ04:DbF4µ[2 uRctdPj_ bT*@P0%%ˤ{_/ /K7&ɧ}VàuAB$Wc;AX,<,ׂ8_9r Ra8;$9ᠽ@ԏG<GQ*++dO2DQr¡dWϓVUTUECEPiH.I. Qq *@C FEd<7[i1/hg=&#bCzXJ6Fl_(h(D.^ &x~\[H)PϽRUU'KV(gfl\Ѣ08A25!0:{D* ٽ\8 ƏUW]EoF g(Dȭ REQhxQUU+ .`y 9Vt;o1 ʞVؖ(L2Sul=JRDT2t3g[djΞq1B:" R,y嗑Rr'/5{UUƯ7s9ӧsEm6/A0::(LU.UyꭻHL&H$Sv#>)q '~z>vThL2d2Iss3ǏS2}tEahF81؍8BTTTyq&ML0fΜ4uuu~ TERvM,Ϥhu]^$o.kD"0 58P|ؿ'޴WBwo~d2"mSUUE{{=K/ JA'OX,2sLEaڴiTVVRUUSO=L&ƍ BPt5⻑hmHcռ5*?L%<'MNiԐO+eG0ZpgT!ǷP^< =LCCÃCt=BUcSxFX*S]%K/M5_soфBK(7ײzK] 2c=^x!-0|Ve]8JC?RnZeo"Nֲsd29 ݆MLRԐfq,?_ϲ9jiia``@ir}҂(<޽uol„ tvvL&4t:M"4@uyT6 3hA*yȥ NIR֡Y3Ia9<73h*2{zzUB}Q\ݻwg^bD"t]?1}t^u>J$3fގa444fIRa|__硱9]q1ҷe{dX۷R*V>ßr -ZPl: -5 'c^PU===3j'DӴ>z[n 0hhh@UU,X]wEUUMMMa^x ޽{>}:Gy$$ 4VE!dEQx7ټy36l@4V\ɓfL2bR244[o5}tttW>- ^Xl6Dރa*#>.1#4iUU>[DZ]c\۴i}x; QG}?g}\. gV\.k֬a6ʼ߲j?YUUET{/mSSSCcc#/y,Nfb1RUK.2bOh!oV7nܻm?i" t/L?҅ya(qCT d(_|4'o馛:,VZr( Phz5ü!#!^m7X,`?v:mXFAAMݿǙ< Zpj?1\8jU9p001(?W\)ct]]>gC~g̪@-XUז8q^{G޶ܦ7MvT?_/Wf-zͻGt?lO2m#p\'~ C9!epϱJjA6grϨ͛CQ0p=B j> ۶@1,[RI8QMxYid )q@E3gc{O;gOf5g,]^ͱ:Gnh;=Bmd0i'Nu]NYa8xyw` ?J *rq߁Ҿ`HUi*)R =7{ף+?nCAřIiX߻IJ(@ a]ʡp걽HǏ|.m&k$]~ptfDz'H$F*Cg T)}BN4***D"HϣG3"kn43mNT„0& ,k߾:R&O*VtPh_rB eYxcQQrrc3r?0Z#q]w1~}u&m =mfҨAB`$5J^F\vlTrJ)j>l" ) f/Cӌ;7Nx~"q\t݇c{$I$ɣ”9BZw炿QՆ‹䏝LJ4G6~sXVEWwu]G<BaHÚJF %v u Z H*+"<|yw̭91KW|3橭?纅d,Y*sMj=# qm,n( au&!Q5ϝ;?ppr9 P(6fe0MQm Qta\Yr%g@LP ~NBbxw9t ma>Iɶ΁O_6'Oƶm;=s x%'7p 7s ^z)>(Hu)^`L$2i*汮qf9R E Bl-Opax1#1LR \eaYV>0Kβ '9.t9- gL_̘̪=-5)u1B^IeDQlm!WY@ӫ)X8^081/A(-~w+_W̑GͬYx4ieiPT25Vk(Iql/pt:'YsUU wt% RC9=hT,r9\}mfyٵkL&D"(hKRJZpGqyM+fSavC++*LD>0tAw0g HmJI<^~g5+Xj7PWo8.C3wy'wq~U\:64^(aDjs-1hT֖ @` BP(p]7VY?aHX QMmLgUrUB| :},E^Zq٧}vª7Va(mc'%J週`PJ|`gQk NpZL8466rwyWfժUfSئˬE<3S?1 yF?[嘸 jd2׾5Z[[W.'%;v?J,?Ed2/UUUzZ2E:4cYny C,cGO᪤RFJ.!^UM>?cZx S,fy8\mqkG$\AAHvtL!Ǹqy2HƪUxҗIJe˨吝=9 HUiLoRaELPl,q^{-K,kJ+(Y8T5b't? l6L#-N!]8EjPg"lZElGxp6^p? p 70::ʓO>T(r$I嵵bᅍfoo򰀝Bc8@St.5iV] `[&83<('|2,jٲe-Y4~q?Φe83rT 2WXz/^ٳyiKx BX :Lqtd^_U8x@Uz]5袋={v<:u*7B 5S.2d2P(QN ~nP8b \Mlea9o&d2rdl Zne?/ڗl) /'qiqs‰ #Ge~{TT* Q2 iR2OS0MTK___j5M0 zzz@f93CQWiEM0D"4IɊapoѯlDXܷx.ćAPt뭷#߽?݇F`xƕ\3vΠHO<7L@Juݏ>l+GϮݯ{FFFpŤ ǞYův%g9gX꽑27ކa}v?8XQ4O`Trʥ3b(˵ob2|zێͮ1ּE[h4 ߼ys0Y|9/z!ǦQk7ʽ|"Rjt8FI8~ټa2lS } DiHR kcEm$J"ˤi100ldd䔷5gΜi`@MM=}}xd$M6vqLضM4 Ҷ{ree !> b̙`6MMM+B!ƏϺum<,p͵/=)BK &y&x/lc9#8#줦to.988h tcR*ɸqhٿp-o\ϛ-1i7!SN UUYb!MҷH!k.JKXJt]gٲeJOOOPN],I ~1>y>Fl%cҹ"l4ir5MMM,<\ץ?}xT( \[,±5g KwMX._TVT*oD:ZXv-hp80i]ǵ1!ܒ RSzdcm۶!2(-ok~)L>pHOa̘1~3D4B8aYF"MY&sPx m ߹y񾼹v9sJ,c۶mxL G ǔزB-HM( !,mb(R6`P]P(P[[TG ΊFz_)Z-a24wXLert] M D\)xkɿJd # %|睸 #NP3pNш*Oݱ^pEQ3ga0i$l:Dx≤1WR9MArx<=vttϢjЁP,b;(6w_p$?8뵢( jB(KDx/H]]]~sNUA4?/:~U*qE|z7]\1] ͓tXq_ph+ɓ'ߏ,]hooq@ːfkIP(D]]Bjkkvc$EОQQZR be=V%*p w_[Ct]5 i3qm'*UҶ7`JW^^x0lJ ` O Zg=-t" %R*d(GR!\E`{ޘCcc:ёre_LuX4| +2WEuu5\r ˗/gxp\<ÍQxXCkѵ;^M2Qdv 򳆅|0?y'Ngς|0'DJJ)eTTDዑ}B$T\enobEMd2H֖0vAb=R6n%l^سD,CӴ]|ΖyXn(ZX~~_w^nvnt]bݻYh֭cr9ĘG*y ~ |͗Z ]Ϛd>X.#r3NVN!]ITD(> d׮]jiiH~qӉa%"k|D Jw04>wY=e9A"b41 C{Z?UdmvA7LDB>'5!jy駹ky饗(JDQb I8'JP]dz7OO2Ȟeym)$C wm\Ce1y{^q(.[pNxx-/ؾOd >y;o'_.Ə϶mۨ3tuuaH.D7尧\`4ai^>"/̆ (cvR۩)S8y|܋EQu_!n$u>,^ukֱf nt 8CRH CSyv&Nrdzrbݟ.3f O~3fJ8hkkP(FMdގ:i?UHRAX ri,nPH}N9Syf\`C 0]'QJNR,"B!lqH f͚5lذO}Sl޼.]J>u\I >u߇ mDvժU,XnK"G!R˗+տ K)9Xd s'pB^*++'ϳgqc֭W'f̘QK"\~{|3g{9fΜICCdUVXv-wc׮]@^H.!fW_믿|Ďi94Krw|ek6`Eo+3<˗aၔQtl¨R{p X͛ꢮ\.޽{IJ, RJ8{1t]'RQQA"8(}U'ɦ&&O@1q|Ax կr388H$+W̮]v}Q"lQfVUUBNm]om^hnn>+w_ oذd>N8X(e m_N BATUn:e˖/%d2ttty2駟ꫯ^cǎ](C P(Cl6\W}}}a -yS555 ѨZ,Ue'|9p8val۶-8!/? .UxF"䇫y+"o=7F{!óM7-K/Doo(t]׃'Lr? %pmIJIArG˾|.+F$(?h6s,^8h>,\b1vylzSN9.ܙs%RS] xlF9G8`KlIENDB`examples/widgets/animation/animatedtiles/images/tile.png000066400000000000000000000377211376617013100240730ustar00rootroot00000000000000PNG  IHDRPPsRGBbKGD pHYs+tIME6!4 IDATxڜi$Wy;YY[U]I-m`|l#̰c?gx{=6c ؀ZH[}QU׾z̮s8q'"z׻8j5^u|gaaG?Z,˄aȋ/aHt:שj9sfuhh?[?0/^dhhyL4MN<%I/baxxgyqr 4 `nn۶;~xP<3)P*|2Q.y{?|K_ʕ+  "fggV4M.]t?s=K/4/_F4lfrrsα7fYN8:m B099i!ȏTUرcbR댍!<_=i255 ۷o^c&G߿mllRľ} vIP@UUVWW)JiJ&T*#^iRJ}GXdppi0 rhƾ}0 \.^(0 ((Anfػwow>,;狙LuB R"@AY,i=MRJ8( |X,bM:v[Jb$(r_Vyf㐦izmz={lۊiwGJ(KkkkCCC7!1lPR˲.gYݶm4@ m{x4$Gl0ă I0}$9o瞟!n}[yt٭?̏Kܿ1D'||'c8s]$f~v͸I?q]]Әoo>둦i7n/  vLL{>a$]{['ހ:n{}'n㳯.K;O$DQyAȀ>5ˋOpCxC$kyru_nZn^`'xOEJ[羅HUlI&x~w`?u=4Ui ~(qj@$xysQųC*2OL53Fv㈢{7:?cO$2% ؛% *~Pώ3P2>0 ?,lCYZY-GDŽax5 }$) r۬+ۓ$!́OIdB̌ؔ3CqЏ C|CQEC7bM2J Mݶa.RP0I)HLR>absJXxJlAJ8qD/GЯr\rOqPU?x0RWƙG~d|t4Iq9 h.?SPTpy@bab[d_bEo!/p] [aqR;ܛ}+Qq?AlF1۷ԩ2}{q2F0HwsL"|?@[\YclMiJ"H"AW[8^Ü]= vFQ4Ŷm6RO0>7jg94I !iRHمbMN/1J.D)A&%QJ0F4M;3{0 yqUSt: p]$IPUz|s_'S#ϳ8dY&TU>G|>M d}[:B!KKKXE$|`jj;O4. `SSS;w$Iѻ9U;ZcAEW^atta.]DvmdY/ssL0W\xÇ3>>-waee/ٱci244Į]Wқ%J%xW$sqh6yBP*ؽ{7 jrZeY B 7\3Ùgٻw/kkk P(0::J6ɓqJ%: 8y$o`U*A}E 8 0ǝڊt:(JSr̩SݹsQ"D4666 (KqbY[[;644tֽ5MƲ gEH´i*8;= G dSAHL&+"]f[Xز, !D$ʵH)yraccc]J.'. o!6 ˲ i&7% $6P&d!v.رzisF6I-uwVUUrxxXd2tRA%ΐZ2Q@yrqq1 Ec5l$ IvA0691YuG4 KG~L'pС%e L0 ?mbbb4Lr enaYV$4cQ(I.@U4snEx %6F-&I̭\DUT: u4UTUiB5riV{!s9hzR![FK2n=x`QG*H)7]tUuuk˲:UO è語sDO{C|LlrL%V0z8SڼqIfSj=0Tջx_yߓU0 zD2s#>|'He4G$>gK)=8hvZCO2^;7B<|8ມ[y~y nzML$ AtY8 +fsk'm4!c|{[g< {/|?;PyqL~{)S!WLxݵp{YQU-xqɊ*CCIA'os9xVq]_u Èeu[-(HigXX$i|m4]w3eYX?خ)SS*;/&8"Ye/h܅9εfI! Uk;k/IN؛xS2_`DN/ /ṥE\zv4pǶf.c#b`!a锃s@ϊ> +Zr"jœbD"saL%B!Y;|_VP 0]}Z2;;;TN82/;x  . CJqcF"WBMu|>_ϗTDt#ZC;qV\r rA:-c:HLbf 3==#<0/? J : a8y$iO 7Ԑ TUܹsaÇyF'xU jm}i_EQp]UUy¯|T9whZ}ɟIVWx;XeVrF!Bמ!-'\ȜGҥKEm˗I={9VWT*2XERx;PcǏ1==MGu,ٳ^{({馛8V!j)SSSah)%K nfΞK|=m<ϳ3ͦ|o$ R(@UB>'~?7c( wjEuVQ8FQ$Vqԩgm5̺aR׭0 =Q%t^L̿^,abF_ b*jBrd2&Ma뺁ij&Qn͛Kh}}ݯy!̚YdS½zfL&f2.E?~sFQDOElK^,Yt$IR,*зeY"T*ŦiJRIWoFv ۶kQDRȍĤNꨤڿmiZ$bĨM.u[ UD i;dhR%vtWE*=> (kZ]$ v*$ 1MS\t)>x i&*vi6BP`&v;sl mY#nIm+(0 }g)O\UUe[!n6-?Ju4:/zo,ITCGVQ4:/ֈId4MU@wS%KMgyEx د9@ ,ilKb%dm@b`@ͩ$I !7q~=5! ^=Ef γ\W$<|in$%dIO|IA- ?qXs]4UjKORTA*= Ay.B\wx:A)^u&e%..?}<ߙO.n.!zYC$s#s귨  o O\_|_EX]YSn$M% ,UJ%mxNwmٍp-Cj\ _bƻFWiQ255WO~Q~'6Q\+r|q>rl}+7\@&~ws:r̍ZW8Oׅ6qCN E_o|[/3\ hѦU*gΜ!lZ64>}y饗ڗ|{Y,ˢ\.jw466xWz4 !+++m<0LW_9MKi=)S.133Ù3gHӔ]v#/\V!ui߳0lq{ 3t{inqffpHӴ=NjgQ`+rd`hhrŭ+X^QzZj5fl&o'mnuh ][ݶm?HqB5s}r'Ə]\?(c}6tA@DC#yA_P<|̇ء?;7 fyWVQ1⡉sw 7 Յut|pF~Ogmxz$xQ~O260#~ s(5sXg{ΥI K_xC7l7_#ԌIxunx?Vyd"Lg>͑G)dJhyGJ_;k)h _߿n|?$33> _Hwz/ +;8DN-owͅvqz(acyMvy'.lg2Dmխ!q}$o כL(hiX? Cw$OR"c54-Md,!HI^GJ(WL@CW  aG5Eri|9{WʧnN‰۸n7cһ]%C _6?K|'IlLoHNg쯡n%Mm@/a'LO?,{n_w_3q;$IOgks]x•|x|Ak'5;)qGA٤ݱ(9G/?yֿ^2mZV7/*^CfND@عCƶ,h$iB.c}}n]Ѷꂍ>v#@z:Ȯ޻^T*E ._-W#@ R=ҦirʌO^UY9u Vu]>_lZᑂZ?bYV#s!ڡznHӔ~a8@ks~]6666h4TUΝ;i}/O}ڶ*W9XZZ4/!?8z/~%WCˌauul.צ=[oG }y  RD ֹpvMB½_ӧP12&F۵ft:VVVjc~nzFDfZJE,//-)Їk|XWh;vuP$I޽{ eߺe]~PU?un6[oҥK$I­Jн=13&pM7}ٱcb߾}-)wlcVd\{2Y :]Sk;{&*{=]w< f'qsOrvKOv=xO8)<<LGx`y\sH*J;g}o[=D7>Bs|%(&#$z_z À, qR+ɋBv[eM$$*:8,p}׮0U^BuPųǘk%Mzd#F2QyK%v3LChJf<1N`2WoG %}< Q5rlŤc([Hqk"W_3s?sQϫ$JhA;x/?GM_Mam-Z‹sO3B5;]u0b9Nqav;&||E"?JG?OƸ^@>dK^e>Ο Tu8S*d#_Dk,.Ͳ|ߎo'6ɕ7[W==A.sUx&.}KuBR`i O}| QjWHcޡ QnhbQb11Ő&z+ZEy\c&CY~'a&zL 7M$NMͯb)?W/EQ1͑!floՓW^e蠚]Xb|]C,EQR|>OhhmֿE.+Jn\6+'|f u)ZFErU=[7*LN}ډuzE5µZ-43,wh^ VH MRt]oz'3L5W.^u%f㜏vXVyfgg n[v"y")QT_/\(r jwhTkLTn 4pq;vh[A$,.."d߾}<#wzf꣏jdY ;λ乧Rׇ!KЅibY+++~WO2@0 Ib>C=/]f2`ll%FFF|2?0{鰶ƹso>._B|yǝܹ˿d~aёQx :kkkDQi?PV[[=c+ fX\ë=a80mwycU*N>ݻn^OMX[[c|| 8N,JUUz7fqRͺe@69H,/^}ϗՅqMNFWF B )BKT|$GuDh~R.3Ae!m@N˘iy4/ªjo}"Gc<.5yx_VA}55}K5we޼c{nx#^\YI}#?r#exz"MDvQ1$L#j6?⪏Yv,c۔|Jf_~eu='LM?rxAMV<( 8/='&R*bȧ/NavDگ4ErrlIoDT8Xw,#>ҒΡa^9+&N]I髚/rKǸl'ȣ_6pgn E(3R۵>3n40m A]pN3ѥu֍3Lχ}<#dhN a\!ባ?偝Di*.M3[<.ěIl:0칏,jiHRBx ~f̍f)_aλ]Vt1%^= n关>0/l`>ؿnT879:%IlrJAcw'Dh򯙗Y2)PJ  /Hsl0|@cʩ2OZ\.c$|L[PO<ӘH5ʲLLpјO=>AK+n|ιȭn{% ^&pug[L,-FPdh ϰ?<;ñ_?~Y\rgEDH(d}ܧZ/y-)%ըYS}G9~z@<+PT93%I"!i.4lڰ&0>333ٳ,*CJ,R9)ElF&Rxle}v^xMj ۰Pytp(M\dSN}5d mia"+8qu6tuHgw ps7q|XF_z|a4¼L(K>2S"AsIYmchR" MnG@+ї{@HPH7y3˶IENDB`examples/widgets/animation/appchooser/000077500000000000000000000000001376617013100204715ustar00rootroot00000000000000examples/widgets/animation/appchooser/accessories-dictionary.png000066400000000000000000000124241376617013100256500ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDATx[yd}9vݹ=faal8 N,"'2  ƁY0 G$$vO'a`1!L|z]Iﴐe)e}TzGfmH)s闸tf #g/BcN"-Wh0 xK_JT=/H7kAAVR CRR@`)pMѸًF!.:pX;njYL b/=" IYLB} Gn&!d#لz scRDy帽)y䈱n$& dHI}&8B2za"Cu2C4}x rŕC@UPz(at4VZ4:\e3P0c6F2AU *0.0 %Z_0N ^/T,Sv|r4if&$H♌TH` ; jZ!5S`^־ r'7qE۷CvS.13!{I 4,+ hJ$RM[I~TKT;qB&A^25|.,c~,RTE9Kl!qەL(zY@8hR2۰!Vhk.ޯ`\B.O^"bGj?. AB ҵZJȈbQQFiEA\Qmh2BҐH@~- BQ PZ6ԑ;)04鮀,J {1Eޑ9a ā54x,] "%1![ Ds"ږ<EsN|]_OW=O=ZR0k} MMՅy|ё JQ%T#眳&C4u aN20u1m zXT JK[6Cy2ZPPnZDf#u8@ |.~)2m+Gm)WD74zƍSY @[NAHe:m 2" ︃&.ʼn?%nQ}, 9A؋&u 7M"O3g8p^oר^as .Ж Jb^lV#Fd;ќ޻jgh?~@W^IviPa_kikD[o+~k۶MWSM~i%R"=?ό @g.DA47LOQ +Q1xAs>Lvw$DAZxQzHt# ّ}hy~DB6Z2yװ ^e %ŨvOultM󂡃eq;{9 Jln@[A`0x*&S>CO|8]|5ٱ窥5 ߏ xS>01T8Oqe4y39G6ںvXA }Erjbt rO>AhBj2 @ӻ^AvWs0 Z˩ssd.u#`#1/v /T|RܷwJSW]o0ۿQfr 4}/чsB<_4_~p=rj;ά>ZGAv m[|yI,~_\7ORO~2yKUn{2 S龯<~-ӓs7ozmAq]"o-qRkXT u K*z"h+ǐGWր~&gDHuoKy "/|!{㍔;pQ'G/>v=Xcȷ&[Ih zlKji矇Z`bHOu:M^[4TľaT𡯑 햟}&qtϓOQ!eue+Yg!-%p(Ykm];iIހ K` !?Iuo5VL C Id"-~ԃx眅f m-V[ja<<]O;a}M:L3--o;0 f-[$N[OK-IP( Q-C:p*,χʼ 7 .KPѴ[FtL{)vlcE3tj (Fs&J=ku}0\ 8\ ds}Ω~dq;ݠ|׵s |ATka*\L_Մiph XЇunDo\p/*x7""`[ ! N`ėҏIis-bapn{AA\=JBlA:ly>UQ&Y4]k^Ao&5+(mbbº\*4X^wGιUH~5u-1Z,pжIP ,mT BUWWh'qMJ}Zz7 {ABÕs|>LRg6]Qw6i*[u!Pz;v5٠7naꬅ8/4 nt-Ph*U;yժ:)^VzA]V+b]'ZH ;LDSvȿۻܳX`ZkpR\Z&݇MyAc#F&xR Icdzm;fmȶ-qd2ICXyΜz݁x1+#jJV{h-isd c JI+1ll3fm2ZEqE$q5'cczagҩ4?wRg)ҮYC w Zgx6@bB&R H XĆsFc=8:fAU&/4CɋL&&{!ibY }y~W&n $I!2Ѷ)H6&~ d`4Ys1x̋W൙4 9uɂ7|c ]4,n̔5ug)8)}"#I@2 QAE&iYx-@lǚz>Z&5ݚY0< e5lZ@[@y.}֦iʎ4 ;mDD0:.kW/XC4mB@k@W.ۍ|JOqk, VBCZd;N&u:#tr>ξN=S:y¯A`X= E|Ȏ2d2[>@ O9΂=;Ћnը4ҵh\kq+r#G GYX0b6DSi Q L ` CuӳOW:4_krڄ[UC]fg-;,=WggyL.!Dʄ,5)K|(ZX֜ cY|<su0_gWeԀP  q@zl|qqGYECy_ kDS"dن~CJ"V||?|;2 [z=Xp{Kz<5Tm6_od:Y.eKhy 8f?Ղ4>1 B&R~oL&w)OJ@p;㺋ݤޤ(w+-] F[k}0>x,&ބk_.b#]8IENDB`examples/widgets/animation/appchooser/akregator.png000066400000000000000000000114111376617013100231540ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs^tIME IpAIDATx[ t\y{kZ%ٖdcl164ڔҐBr ] hKH ڭsRR${ 䰕@V/-زllٲ,Kim3:&=i~Oyw+?oc8uR]3\<<гB q5J"S!ԟC@h]v7XQBpe?`n \2. mHjHhJHW$T|Hhِ0M ;?E$&9C2ĀC@hlWP\HSNu-'@ $ A C 63 n:GN.ę,s#ǹ(֧硘d>ӄW3BȂsnpP29 R&n<'h`NԧH4c ? .4C8ȌU_c P$5xE1|ֱ~iZH׾5Z ξ8N>BLp"3iyDه彀Pky zfRCa5)bI%(|8΋l1a8/Z'10^B_ ؄Jq %^FBlD1,#ò-@xAuDYD>żr@6ME-pwCA0=J$ȏ1)K'L $[ԕ_BQ4CW8,WLk(&E.O/eAE26l~un`Mϼ3 6D%@D5c$n>'j-*eVz"ňs X_f8`%(N!d =&n dX@gT}tp+8` ,b6Y8~5TX(g: =U@ @& $ZҙX.9Sxod==Et`)K4al/(羅Om␓M̬$Xu#-y_kH36yɛ3r2Sr MPj:nθ>!|`[y Zʀːd$Pʯ2,:.s A"I+-0W"j'Hn@so5l&'Ӗy}v"N\  bDh Q2Oa00yh\3k9X ${%pvf U`Κ?YG|pؔtIxeP$QXm>S5$@jk:8d˂M~;] Z@*oHx`D6uJ",yOmP&Q%Gȃ2ֳ`R+wt;Z~N|y׬O'i>񊇀;_Sqf|+r@= O|f6ġ*#s%X<+^(GTV8ZPK±bp Pb@x0 HN- ]L ;h?xSt;Q)g",q̜*?p J`ΥNAw\Jalg6 c϶'}7-OUULn \.{ۀщ^ ,;N3怷7~kþ_h(s.:o,]_aӯ.ALܣ㊞58%Jo;wo$70ŀj$n >$3CPC =O 83O>='x@| IsمQ6 3'q!c )ȎEsfW6m{UU53Y{9M~qvgw/q8-)q |·V0oKY;cajT&ZGllL-gk0K_Ib1(}ĵs^o,@uww?ckrZxnW,; |Ip{P`eY7~׿{ܯ.%Q?ZSSsʕ+gKgϞ#IozӔUFL0&U5N^<\˛3_{}$&`<$<[.R6yF0m!FMCDs YÉm<}A_ ?0#[,D.k_Mxu_lJ-8L}%Il]67~d/y,lƬf#.'oZ8Eo`5ca/b9 ~t=@d;yp|Ŋ<$rX#e5&h1p뇎Y&joAJHVY]`)]ơ<zz!ͦ#e$l-@j s2X6#)~ 'p/uMǃ0"7p/1}1O7n5E`---yXU^YB!FGm<\`oߑ~IBO2u5<..WPڋQ$?BoHC:E6f D>_(7Oɰ5ytK`实1h#z8ADN"z'5#|ެȝ5ޛX"of9Ƚ_埵Bou!sH Đ1a<ٟ,$= B@f=\ 977|lPhB-f4$J+HZ }f #T'eyd}uzL6D#E)S;/[i6ۄ6nwى5_u5SZT%-3 ]Jrpn#Z6⾀WTy=)a" ݁9H$0[nymj=.Q'?p=Ɉ*xT*q> . CSpwo͓AW} [%VEdBjA-Ƥ;*UQ #eT󻸧d;.x `Hr$*g;̘ՕBxl% 30d2@pWnw5]skCO2\e,3Դ+)IW2eoYgS1-c :$;bjLĥ>,[OuYϷ4ԴhpLoH@]^u}9]1fUKj$՛& zPt7=ɖӘB7H冚۶z޽L-KEc{,yzUjrx|(kZ]@ !(&UU溚ڦ+8S=cAxw7|W=m۶m5x1d*wTp 塳s p}bNTfW0$֗fi7J"8Qyt.IU!r/ H,nݺ6~=-Os!M_&|6 ݄NB&E/Gt}2!xM`婧\Q: r #(_3~)4"jQb *QP*ɱQ'AnAs&c=LjX self.orig.size().width(): self.p = self.orig.scaled(rect.size().toSize()) else: self.p = QtGui.QPixmap(self.orig) def createStates(objects, selectedRect, parent): for obj in objects: state = QtCore.QState(parent) state.assignProperty(obj, 'geometry', selectedRect) parent.addTransition(obj.clicked, state) def createAnimations(objects, machine): for obj in objects: animation = QtCore.QPropertyAnimation(obj, b'geometry', obj) machine.addDefaultAnimation(animation) if __name__ == '__main__': 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.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)) scene = QtWidgets.QGraphicsScene(0, 0, 300, 300) scene.setBackgroundBrush(QtCore.Qt.white) scene.addItem(p1) scene.addItem(p2) scene.addItem(p3) scene.addItem(p4) window = QtWidgets.QGraphicsView(scene) window.setFrameStyle(0) window.setAlignment(QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) window.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) window.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) machine = QtCore.QStateMachine() machine.setGlobalRestorePolicy(QtCore.QStateMachine.RestoreProperties) group = QtCore.QState(machine) selectedRect = QtCore.QRect(86, 86, 128, 128) idleState = QtCore.QState(group) group.setInitialState(idleState) objects = [p1, p2, p3, p4] createStates(objects, selectedRect, group) createAnimations(objects, machine) machine.setInitialState(group) machine.start() window.resize(300, 300) window.show() sys.exit(app.exec_()) examples/widgets/animation/appchooser/appchooser.pyproject000066400000000000000000000001111376617013100245660ustar00rootroot00000000000000{ "files": ["appchooser_rc.py", "appchooser.py", "appchooser.qrc"] } examples/widgets/animation/appchooser/appchooser.qrc000066400000000000000000000003031376617013100233370ustar00rootroot00000000000000 accessories-dictionary.png akregator.png digikam.png k3b.png examples/widgets/animation/appchooser/appchooser_rc.py000066400000000000000000002055331376617013100237020ustar00rootroot00000000000000# 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\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\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\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\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 \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\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\ 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[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\ \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\x14\x91ID\ ATx\xda\xe5[y\x8cd\xc5}\xfe\xbd\xa3\x8f\xe9\ \xee9v\xa6\x97\xdd\xb9\x96=fa\xef\x05al\xae\ \xa08\xb6 N,\x22'2\x09\x92\x0f\x14 \xc6\x81\ \x18\x84\x92\x08Y\x8a0\x7f\x18\x04\x09\xe0\xf8\x08G$\ \xa2$v\x14\x9b\x80\xf3O\x0e'\x86\x80\xc3a`1\ \xe6\xb0!\xbb\xec\xb2\xf7\xce\xf4L\xcf\xf4\xdd\xfd\xae\xaa\ |\xbfz]\xf3\xfa\x98I\xef\xb4\x90e)e}T\ \xbdzG\xd7\xf7\xbb\xabfmH)\xe9\xffs\xb3\xe9\ \x97\xb8\xbdt\xed\xb5\x03\x9e\xebf\x09\xf0\x84\x18#\xe9\ g\xa5/\xb3B\x88\xac\x14\x18cN\x04\x22-\xfd\xe0\ \xdf\x7f\xf3\x95W\xfe\x8a\xfah\xbf0\x0bx\xefK_\ JT=/\xebH7k\xf8A\x96\x04\x88\x04\x04\x02\ AV\x92\xc8R CRR\x8c\xc9@\xe0\x9e`\x82\ )\x89\x87pM\x18\x87\x08\x02\x12\xd1\xb8\xd9\x8b\xc6F\ !\x86.:p\xc0\xfb\x85X\xc0\xcf\xef\xbe;n\xd5\ jY\xd7\xf3\xc6L\xc3\xc8\x0ab\x12\x06/\x18=\x8d\ \x19\x22\xc8\x0aIY\x92LB\x86} \xd3 G\x06\ n\xa0\x03\xd0\xf3\x80\x00&!\x19\x12d\x00\xdc#\xd9\ \x84z\xae\x1d\xb4\x0c\xd2s\xc9cR\xee\xbc\x88\xe8\xcd\ \x0fD\x00\xef\xdcy\xe7\xed\xe5\xb8\xbd)y\xe2\xe4\x88\ \xb1n$&\x0d\xca\x1ad\x8c\x11H\x12I\x80\x06}\ \xe2&\xa18\xeeB2za\x22\xecC\xed\xf0\x98\xfb\ \xe6u\x04\xb92\xa4\x86\x88\xde\xd7\x08\xafC\x88\xf6\xdf\ 4\xa4\x7f\x01}\x10\x02x\xec\xc2\x0b\xbfr\xc5\x95\x97\ \xdf\xe5\x98C\x94\x1a\x18\xa0@\x88\x90\xaa\xc1\xffU\xff\ \xa1P\xf4z(\xc3a\xa4\x9d\x88t4V\xefZ\xa9\ 4\x05\x8d:\x5c\x99\xcd\xdae3P0c6\xe6\x1b\ \xe1\xb5\xd0\xc4\xf1F2A\xa4\x85U\xa9\xb4\x0b\xa3\xc3\ *\x840.0\x0c\xe3\xef%Z_\x020\xd0\xee\x98\ \x9eN\xce\x0c\x0f\xdf^/\x95\xa9T,Sv|\x9c\ \xfcr\x89\xc84i\xb5f&\x12$\xea\xf5H\x10\xe1\ \xe2\x99\x8c\xd6TH\xcc`\x01\x0c\xa0\xc7;\x98\x0bj\ \xfc\xb2\xa5\xe6\xfcZ\x83\xac\xc1!\xf45\xb2\x86\x06\xc9\ \xcd\xcd\x13\xa5S\xca\xf7\x85\x03\xc1`^\x13\xee\xd6\xbe\ \xb6\x00\xb1\xbf\xa9\xa1\xb5\x0b\x80\xc9\xf3r<\xa2mA\ \x10\x0c\xd7\xf0\x83\x85\xa5\x22\xc5v\xee\xa4Zn\x8e\xcc\ dRKIk]u\xf1l\x96\xbcB\x81\x12\x1b6\ RP\xad\x84k\xf1=2b1\xe2O\x06\x9eG\xd6\ @J\x09\xa81?\xaf4\xeb\xd7A6\x99\xc4;\x1b\ \xc8\xc9\xe5H\xb2e\xc0\xd2\xbcz\x95\xc82\xc9\xaf\xd6\ \xc8\x84P\x02\xd7\xa3\x00\xe4\xf9]\xe9\xba\x91\xf6\x05\xf7\ \x1d\xae\x80\x1e*\xda\xcb+\xec\xd7\x05\x0c 1W\xaf\ \xaf\x9fI\xa5\xa8\x86\x1fu\xaaU\xb2\x86G(`\xe9\ \xc7\xe2x\xa2\xfd\xeb\x120,\x1b\x8btH\xb8\x0e4\ \x08\xcd-,(r6\xb4\xe9,.\xc2\xb4\xe3\xea\x9e\ \xa4\xd0\xff\xb5\x00\xdd\xa5%\x08n\x89\x04\x5c!X*\ 4M\xbe3>\x04\xaa'\xdb\xc27\xbc\xe8\x9e\xd4q\ \xa5E\x18\x00\xfe\xb3\xfe\x9b\xdb\xb7\x8fC\xf0\xa7\xd6\xe2\ \x06vS\xfb\x16\x90.\x04\xc1\x04\x07\xb0\x06\xfc13\ \x98!{\xdd\x08I\x98\xa7\x1c\x0c4\xe9\xb6\xe6,\xcc\ +\xc2\x0dh\xd2J$\x95\x86\xdcR\x99M[I\xab\ ~\xfaTK\x1c\x90T;qB\xbb\x84&\xdaA^\ 2\xda\xef5|\xfd\x8d.\x17\x00\xda,c\x90\x88\x03\ \xe1\xa9~,\xc0\x04R\xaeTE\x069\x8eK\xe7l\ \x9f!\xd7\x07q\x19\xe6\xdb\x95L\xc0\x87\x95\xe8\x00(\ <\x8fG\xa1\x99W\xca\xad\x011\x22-#\x82:K\ D\x02\x88\xae\x89\xc1\xf9\xde\xf7)\xf0\xb9\xf7\xd4\xd8\xc7\ \x98\x94\xba,2\x01\xb8Z(l\xdc\x93X\x0b\xc8\xec\ \xc3\xdd\x7f\xe9W\x001C\xca\x14/\xd2\x81\xcfM\xcf\ l\xa3\xea|\x8e\xccx<\x5cTw\xd3\xe4\xa3l\xa0\ S\x22\xe94\x18\x09\x81\x05 \x02\xc1q!\x04/\x1a\ @\xaf\x82\xacaY\x80\x0d`\x8c\xdf4l\x9bl\xcc\ \xc7\x00\xa4`\xf0\xe4\x9e\xf8y\x951\x82:\xe08\xe1\ \x98\xdd\x8c\xb3\x89\x94\xfbt \xec'\x0d\x9a\xf0\xd1\x18\ /\xd6\xf3|\x15|*\xe5\x1a\x0d \x1a;\xda\x02\xba\ \x9a\x04\x09\x90\x0a<(\xc1g+\x08\xb5\x16\x04LF\ \x91\xb0\x00\xee\xc9\x8e!cX\xb8\xb6\xe0\xd66\x00\xc2\ &`\x19\xca\xc7\x03\xfc\x9e\xd0\x84\x18\xd0\xa8\xaf-\xa4\ 7\x94\x0bX:\x10\xf6\x15\x04\x81y\xdf/\xa2Wd\ <\x04\xb1R\xb5N\x83\x08\x84\x8d\xc5<\xd5\x0aE\x12\ ,\xa5x\x8cMOY\x86e\xa1\xcf\xc4\xc8B\xb0\x8b\ \xc7\x98\x5c\x1c\x81/\xd4\xa2l\x92\x11\x8a\x90C>z\ Y\x87\x90\x9a\xe6\xee\xb7\xb9@8\xa6h\xdc\x01\xd9\x1b\ R2\x89\xed\x9f\xdb\xb0!\x89\xb0V\x93hk.\x84\ \xde\xaf\xd7\x17\xf1\x96\xd2`\xad\x5c\xa6B.O\xe7^\ \x22\x06\x88\xff\x1bb\x19\xb1\xcb\xe2\xf1\xdd\ \x7fG\xf4j?. \xabA\xe0\xbaB\xa0\x0b\xd2\xb5\ Z\x9dJ\x88\xee\xf6\xc8\x88\xd2b\xf5\xd8Q\x8a\x9a\xe2\ \xd4Q\x15F\xe4iEA\x88\x96\xba\xbe\x83\xb0\x5cQ\ \x00m\xe4h\x19\xb2\x1b2B\xd2\x90\xfb\xa9\x0f\x01H\ @\x00~-\x08\x0a\x83B\xa4Q\x0b\xf0\x02\xb8\x16P\ Z6\x06\x92\xd4\x91\x06\xda;)\xb504\xe9\xae\x80\ \xa8\x02,J\xda\x0a\xfc{\xdd\xd8\xd8\xea\xfb\x85\x8e1\ E\xa6\xde\x919\xbaa\x0a\xc4\x8154\xb3\x85\x8d\x0f\ x,\x00]\x0b\xf0\x22%\x071!\x9b[\xd2 D\ \xc0\x10\xcbs\x22\xda\x96\x02<\x0e\xafEsN\x00|\ ]\x02\xf9\xe9\xcf_OW=\xf1O=\x82Z\x07\xf9\ \x88\xb4\x86\x16R\x17\x8c0\x15\x9ak\xb2\x00\xad}\xc0\ \xad\x0a\xb1\x14\xd6\x02\x1eM\xef\xddM\xd5\x85y\x15\xf0\ |\xd1\x91\x09\xb4\xb6\xa3\xb1JQ%T\x83#\xe7\x9c\ \xb3\xe2&\xe9C\xbf\xf3\xdb4u\xc3\x0daN\xe72\ \xd90u1\x13\x91m\x89\x0d\xb4z\xb1\xc4X\xd9\x02\ \xa4T\x99\xa0\x1f\x0b\xf0\x00\xa7\xe4\xfb\x0bJ\x00\xaeK\ \xe3[6C\x00y\xb22\x19\x12Z\xbb\x80PP\x1a\ nZD\xd8\xdb\xdbf\xe8#\x7f\xf9u\xf28@\x0a\ \xfd|\x84\xc3\xdf\xfd.\xcd~\xff)2m\x9b+G\ m)\xcd\xf7WD7\xf9\xd5\xef\xeb\xc04z\xcf\xc6\ \x8dS\x06\xdaY\x09@\xa2\xb5\xb8\x80[\xf4\xfd\xbcN\ \x85A\xb1He\x04\xc2\xf8\xc8:m\xd2\x0a2\x22\x17\ \xb9\x01\xfa\x0b\xef\xb8\x83&.\xbb\x8c\xec\x89\xc9\xe5\xc5\ \x89\x96\xde\x01\xe9\xd2\x1b?%n\x89\xb1Q}\xef,\ \xd1\xed\x0a\xd19A\xd8\x8b&\x91u\xa6\xb9\xbf\x1f\x0b\ \x08\x007\x1f\x04\xf3M\x01\xe0\x22O\xc53g8\x13\ p^o\xd7\xa8^\x8c\xb6\x06<\x9f\xc0s\xdc\xce\xbf\ \xe9&e\x05\xd1\xf3\x91\x96\x1b\xc7O\x10\xb7\xf4\x94\x12\ \x92\x16`o\xd2\x00\xbbM\x19\xbbO\x07uH\xd5\x0f\ \xa8\x5c\xa9D\xf7#\x22\xaa$\xee'\x0b(\x01\x9ct\ \xdd9-\x80J\xa5Jelc\xedK/!b\x01\ tX\x95l\x19\xc7\xb0qZx\xe6iJ\xc2]&\ \x7f\xfd\x13\xf4\xf3\x8d\xe3$r\xf8TG=P\x9f;\ C\xdcR\x9b6\x93\xfc\xef\xe7\x95\xf6<\xc7Q\xd6`\ Y\x5c\x8c\x1aQ\x0ch\xf1\x7f\xc7\xb2i\xc7\xcd7\xd3\ \xf8\xee\xdd\x94\x9a\x9c\xa0\x81-[\xa8\x84\xcd\xd5\x0f\xaf\ \xbaZ\x0b@[\x00\x7f\xe3\xacKb\xb3#\x0dzg\ \x1c'\x1f\x80?/\x88Saei)\xac\x05\x5cW\ \xbb\xc0\x8a\xae0\xb8e+\x15_\x7f\x8d\xe6\xfe\xfaQ\ \xe2\xb6\xeb\xd6[a\x05N\x97\x1b\x94\x17\xf2\xaadN\ \xcf\xccP\x15[\xe1z\x22A\x9b\x10\x18g\xf0\xfc\xd8\ '~\x83\x8a\xd5*\x07\xd3\xb6\xb8 \xd6\x8d\xd2\xd5\x88\ \x1f#\xcf\xfd\x90\xde\xfd\xccu\xf4\xda\xaf^I\x87.\ \xff\x08\xd1\xf3\xcfa\xc5\x1e/>\x82a\xe8\xb3\x01s\ \x0d.\xd0\x96\x09\x9c\x1aJb^l\xbdV#\x1b\x87\ \x15F\x12\xd0d;\xd1\x9c\x1f\xde\xbb\x8fj\xef\x1d\xa6\ \x93g\xe6h\xe1?~@\x93W^I\xf1\xe9\xe9v\ \x17\x00\x1ciP\xf9\xf0a\x9a\xfa\xd8\xc7\xe8\x92\xfb\xef\ \xa7_\xf9\xbdkik\xadD[\xb7o\xa3+\xee\xbd\ \x97~\xf7\xc0k\x14\xdb\xb6M\x93W\xc2\xf8\xe8\xe3\x8f\ S\xe1\x1f\xbeM\x07~\xf2\x16\xe5\x92i\xca%R\xf4\ \xe6\xdc\x22=\xff\xe5?\xa3\xa0\x9d\xbc\xb6\x80\x99\xcf\x8c\ \x8e\xa6\x0c\xb4\xb5\x08@g\x02\xb7.DA\xb0\xbf\xc2\ 47LOQ\x0d\xfb\x02+\x91\xe8\xf6Q\xf6\xfd\xe6\ 1\xf5\xe8\x85\x17\xaax\x11\x90As\x8f>L\xdc\xf6\ \xdcv\x1b\x9bw\x18$\x01\xd9D\xf5\xd0A\xb2\x90Z\ \xe7\x1f\xf9\x16\x1dx\xe4Qz\xfe\xdb\xffH\xaf\xdct\ #\x9d\xbe\xe5\x0b\x14\x1f\x1a\xa2\xab\xbf\xf3\x1d\x92\xc3\xc3\ \xea\xd9\x91}\xfbh\xddy\xe7\xd1\xd1\xe7~DB\xca\ 6\x9f\xafZ\xf62y\x11\x92\xd7\xb0\xf6\x0d\x0c\xec^\ \xab\x05\xc8e\x0b\x08\x82%\xa1\xb6\xc5\xa8\x05v\x9cO\ ul\x86\xect\xbaM\xf3\x82\xa1\x83\x97eq\x90\xc4\ \xf3\xbe\x9a;\xf2\xde\xfb\x94{\xee9\x9a\xb8\xe2\x0aJ\ l\xdd\xd6n\xce@\xfd\xbd\xf7\x88[\x11\xd6\xe0A`\ 0x*&S\xf4\xda\x7f>C\xb3O|\x8f\xe28\ ]\xda|\xcd5\xea\xd9\xb1\xcd\xe7\xaa\xa55\x82\xa0\x8d\ \xbc\x86\xe8 \xaf\x91 \xda\xdf\x8f\x0bx\x80S\x0e\x82\ \xbc>\x18\xd901\x8eT8Oq\xf8\xa1\xce\xfd\xdc\ \xcbe\x044\xb4y39\x88\xfa\xd6\xf9\xe7\xd3\xf0G\ \x7f\x8d6\x7f\xf1\x8b\x94\xda\xba\x95\xb8\xed\xbd\xfdvX\ A\xa3\xcd\x0d\xea\xcd}Erj\xaa\xadbt\x0d\x93\ rO>Ah\xecBj\xce2\x0d\x15@\xd3\xbb\xf7\ \xa8^\x10\xb5Av\x93Ws\xb10\x13\x9c\x9d\x0b\xb4\ \xd6\x02Z\x00\xcb\xa9\x90\xb7\xc5ssd\x8f\x8e\xf2\x81\ \xa7.u#`\x91#\xf0\xff1\x04\xb5\x8b/\xb9\x98\ v\x0a\x97\xb2/\xfc\xd6\xdbT|\xf5\x15\x1a\xbf\xf4R\x1a\ \xdc\xb7w\xb9\xe0\xa9\x14J\xe4\xe0\x9bSW]\x15\x1e\ \x8c\xa8o\x85\xef\xc5\xd9\xd20\x97\xff\xdb\xbfQ\xbd\x87\ \xf5\x1f\xbe\xe5fr \xb4\xed\x9f\xfe4}\xea\xc7/\ \xd1\x87\x1e\xf8s\xda\xf5\xa7\x7fB\xd7<\xfb_4\x99\ \x1d\xa1\xf7_~\xb5\xcb\x15p=r\xe7\xfa\xf5\x9b\xd6\ j\x01\x02\xf0\x8e;\xce\xac>\x18\xe1Z\xa0\xc6G\xe4\ \x99A\xf6\x95v\x0b\x10\xf0\xffm[\xa9|\xe8\x10y\ \xbe\xafI,\x9b\xb5\x83\xcf\xcf~\xf3\xeb\xc4\xed\xc3_\ \xbd\x87\x5c7\x14\xa0OR\xbd\x93\x04\xd9\xf1O~\x92\ \xaa\xa52y\xaeKU\xa4\xdd\xf3n\xb9\x85\x16\x1e{\ \x98\x0e\xbe\xfe\xc62\x99\x83\x85\x0a\xfd\xec\xea\x8fS\xe9\ \xbe\xaf\x92<~\x8c\xa6\xf6\xef\xa7-\xd3\x93\xe4\xdfs\ 7\xbd\xf9\xb5\xaf\x93o\x9az\xf1mAq]\x22\xb1\ o\xad\x7f\x1a\x93\xcd-q\xd5\x05\xe2R\xa6kXT\ \x06\x0bu\x0aK*\x15z\x22h+\x03\xc7\x90\xfe\xaa\ G\xdfW\xd6\x80\xd6~&\x80\xf6\xb3g\x7fD\xd3H\ \x8f\x9c\xca\xf6\xddu\x17\xbd\xf9\x8do\x90\x84Ky \ \x22/\xba\x88\xae|\xe8!\xda{\xe3\x8d\x94;p\x80\ \x86Q\xe1\x89'\xbfG/>\xf1\x14\xb9v\xac\xad\xbc\ =X\xf7\xe8\xc8c\x8f\xd3\xc8\xb7\x1e&[\x08\x95\x02\ \x17\xe3Ih\xda\xea\x8a\x0bzl\x87\x99\xe0\x9f\x01\xd9\ K\x00\xdd\xc5\x10j\x81\xb4\x10i\xce\x04\x93\xe7\x9f\x87\ Z`\x89bHOu\xc4\x04\xdd\x1a\x8d:M^\xf3\ [4\xff\xfa\xebT\xc4\xbea\xa8\xb9\x17\x90\xa1\x10T\ \xae\xbf\xf0\xa1\xaf\x91\x09\xed\x96\x9f}\x86&\x93q\xca\ \xdet\x03\xfd\xcf\x93OQ\xee\xa1\x07\xe8\xc4\x1f\xfd!\ e\xb0u\x8ee\xd2\xe4\x97+\xf4\xf6\x99Y\xca\xc7\x07\ \xc8g\xf2\x11!-\x04\x95%\xe6p\xbf\x93(\xb0\xe2\ \x1cY\x96\xca\x04k\xb6\x80\xa6\x00\xb8\x16\x98\xe4m\xf1\ \xae];i\xfe\xf8I\x8a\x83\xa0\xc0\xde\x80\xdb\x10\x0a\ \x94K`\xae\xe9\xc1\x0c\xc5!\xa0\x8f?\xf8\x00\xbd\xfc\ \x95\xbbI\xb6\x1e\x93\xc3u\xe6o\xbd\x99\x8e\xc15\x1a\ VL\x11\xf0\x0dC\xf5\xa7\xf8\xbe\x95 \xca\x17I\x02\ \xdcd\x22\x15-~\x05\x82\xd4\x83x\xe7\x9c\x85\xb3\x81\ f \x14\x12m-\x16\xe0V[j\x81a\x90<\x82\ \xa8<\x9e]O\xf4\xee;a\x9e}\xfbM:\xf5\xd9\ \xeb\xe8\x10L\xdf3-\xf2-\x8b\x84\x1do;0\xf4\ \xd0\x1f\x89\x0d\x10\xd9\xd1f\x08-\x1c\xb7\x12[\x85$\ \xadN\x94[OK\x00\xf1-\x9f\x1a\x19I\x7f\xbfP\ (\xf6\x0a\x82Q-\x10\x15C\x8b:\x13p*,\xcf\ \x87\xa9\xd0\xf0\xc2\x8d\xca\xbc\xe3\xd1\xfb 7\x8b\x0a.\ \x1fKP\xd1\xb4[\xff\xd5FtL\xa6{)\xdbv\ l\xa2c\x8cE3t\x00\xeb\x0ej\x8c\xee\x0a\xb0\xbd\ (\xd2\xcfFs&J\xe2=ku\x01}0\xb2\x5c\ \x0b8\x5c\x0b\x14\x8bds}\xce\xa9\x90\xba\x1b\x18\xb6\ ~d\xf5q\xb7\x06;\xe7\xba\xdd\xa0\xb7\xd6\xf5|\xd7\ \xb5\x1d\x8fs |\x11\xe8\xe1\x02\x1d\xe7\x02\x8bA\x90\ \xd3\x02\xa8Tka*\x5c\xb7\x8eL\xbd\xb7_\xa1\xc9\ \xce\xeb\xd5\x84\xd0i\xe2\x9d\xcf\xf7p\x83h\xae\xb7\x1b\ \x0e\xb0\x00\x8c\xb5X\x80\x00\xbc\x13\xa8\x05\xd0\x87\x9b\ \x17\xd4\x02u\xd4\xfan\xa9D\x16o\x8a\x5c\xb7\x9bp\ /\xad\x1b\xc6*\x82\xe9\xd6x7\xf1\xfe\x83\x22\x22`\ [ \xec!\x80\xc8\x0dN\xe3`\xc4\x97\xd2\x8fIi\ s-\xb0\x1e\x1b\x9e\x06\xbb\x01\xb6\xabba\xa1\xb7\xf6\ \x99p\xffn\x10\x8d{\xb9A\x8f\xe7A\x5c\x95\xc4=\ \x83\xe0J\xbbBlA\x8b:\x13l\xday>UQ\ \xbe&\xb2Y\x0e4]\x90\x8c\xd6k\xa2^Ao\xd5\ \xe0&\xa3\xfb\xd15\xa3\xc7\x0e\xb0+(\xe2\x1a\x02\x18\ \xbcmbb\xf3\x1a\x04\x10\x05\xc2\xba\x10\x8b\xfa\x88\xfc\ \x5c\xe4\xfa*4\x9fX\xbf^\x9f\xf9wG\xeb\xce\xb9\ UH\xa9~5\x01u\x13\x8f\xc6-\xef\x8a\x1e1\x80\ Z,p\xd0\xb6\xf7\xafI\x00\xda\x02P\x0b,\xc1m\ T\x0d\x9fBUW\x99\x9fW\x81\x90\x84h'\xbd\x1a\ qM\xb8\x9d\xd4J}\xf4\xdcZ\xac\x81\xe7z\x90\xe7\ \x167\x0c\x15\x08{\x06A\x89\xc6\xc1B\x97\xc3\x95\xd6\ s\x81|>L\x85\xd8\x17\x18R\xf2\xa2\xd6\x16\x08\xf5\ \xb8g6\xe8]\x10Q\x0f\xadw6\xcc\xeei*[\ \x9cu\x10\x04\xdc\x12\x04\xa0\x8b!\xa7P\xa0z\xa5\xc2\ \x16\xa0\xbf\xd4;\x10v\x8d5\xe9\xde\xd9\xa07\xf1n\ a\xea\xac\x85\x8d\x9c\x82\x0f8\xbe/\xc84\xe7\xf8\x09\ n\x12\xad\xa7\x00t-Ph\xad\x05*U\xaa;\x0e\ y\xd5\xaa:)\x16\x98\xa3^\xda\xd7V\xd2\xcb\x12z\ \xa4A]V+b\xf8]\x0f\xbd'\x84\xf4\xd9Z\x13\ \x89\xc0\x1aH\x0a;\x95\x96\xf6\xf0\x90L\x8e\x8e\xd1\xe0\ \xe4\x84\x1c\x9d\xdeDS\xbbv\xc8\xbf\xb8\xf3\xcb\xd7\xfd\ \xdb\xbb\xef\xbe\xdc\xb3\x0eX\xf1`\xc4\xf3\xe6Zk\x01\ \xe5\x17p\x83\x18R\xa1\x5cZ\xea&\xdd\x87\x1b\xb8M\ \x8dy\x00\xf7\x0e\x88Ac\x81\x88\xc7\x03#\x91\x10F\ &\xc3\xffxR\x9d\x1d\x0c\x8c\x8f\xcb\xd1\xc9Icd\ z\xda\x1e\x99\x18\xb7m;f\x99\xf8\x9fm\xd9\x14\x8b\ \xc5\xc8\xb6-\xf4q\xe2\xebd2ICX\xe7y\x93\ \x93\x15\x08\xa0\xce\x9cz\xd4\x01\xdd\x81\xf0x\xa31+\ \xf0\x8e\xfe#\xc9\xe4\xf6\x19j\xa0\x18J\x8e\x8d\x91\x80\ \x00V{\x11\xefh-isd\x0d\x0a\x11\x12c\xad\ \x09\x99JI+\x931l\xa4\xd5\x01l\x893\xe3\xe3\ \xe6\xf0\xf4\x94\x99\xc9fm2\xd4\xc6\xc2\xe6\xe5Z\x96\ EqE\x0e$\xe3q5\x8e'\xb8\x8f\x87\xa4c\x98\ \xb7c\xfc\x9cz\x06\x02a\x01\xa8g\xd2\xa94\xed?\ wR\xe9\xadg)\xbc\xd2\xae\x10Y\xa0\x02\x12\x15\x14\ C\x19\x95\x0aw\xec\xc0\xb6\xf8\xb8\x0a\xa7\x8b\xb5Z\xe8\ gx6\xb0\xac@\xc4bB&\x12R\x0e\x0cH\x99\ \xce X\x8e\xc9\xc4\x86s\xcc\xd4\xf8Fc\xdd\xe4\xa4\ =8:fAU&/\xce4\x94C\x92\xc9\x8b\x06\ L\x1e\x9b&\x19\x80&\x8c{!i\xc0b\xe0\x1e\xae\ \x19\xeaY\x0d}\xe4\x87y~W\x83\x05\xa4\xe6&\x92\ \x99\x18n\xf7\xda\x0e\xaf\x9e\x0a\xf9\x8f$I!2\xae\ \xe3\xd1\xb6\xa9)\xf9\xea\xf1\x13\x1e\xcd\xccH\xfb\xe2\x0f\ \x1b\xa3\x9b6\xd9\x03\x83\x83&~\xc8\xd4\x0bd\xad`\ \xac4\x80Y\xb2\x15\x19s\xf9\xf8\x1b\xd41\x0ex\xcc\ \x8bW\xe0\xb5\x99\xfc\x0e4\x0c\xe89u\xf8\xc9\x827\ \x00|\x97c\x11\xf7\xfc\x0c\x93\x0c\x85\xd8\xfc]4\xbe\ \xd6\xd9,\xdc\xc5\xd6\xebn\xcc\x94\xa95\x9c\x08ug\ \x82\x1a\x8a\xa1\x11)\xa78\xf2\x9f)\x14\xbc\x89\xcf}\ \x1e\xe7\x22#\x94I\xa7@2\xc1\x0bQ\x84AE\xbd\ &\x98\x8c\x8e\xe2\x18\xa3\x0f\x17iY\xbcx\x8c-@\ \x11l\x03\x04\xa2\xc7\x9a\x84z>\x11Z\x85&\xac5\ \xdd\x9a\xbaY0<\xd7\xf6\x0d\xbe\xae\x17\x8be\xcb\x13\ \x995l\x87\xa3Z@[@\xa5y.\xb0\x1e\x01\xe5\ \xe4\x9e}\xd6\xa6\xe9i\xca\x8e\x8d\x92\xdd\xd44\xb1\x16\ \x0c\x93;m\xaa\x9aDD\x8e\x11\x04\xbc\xd00\xa5:\ .kW/XC\x9b4\xa3m\x8e\xdf\xd1B@k\ \x8e\xb5@W.\xf3\xf9\xdb\x8d|\xbeJ\xc2O\xb3q\ \xf4k\x01,\x00\xb5\xf3\x09V\ \x8dBC\x93\xd3\xd2\xd7Z\xd4\xda\xd7d;\x03\x9b\x16\ N\x9b&u\xd3\x04\xb5\xf6\xf4\xb3:#t\xb6r>\ \xef\xce\xbe\xf3N=\x7f\xf4\xa8S:y\xc2\xaf\x9e\x99\ \x95A\xa1`X\x8d\xba= E|\xc8\x8e\xa52\xa9\ d2\x96\x88\x0f\xbf\x9e[\xfc\xd7>\xb2@\x94\x0aO\ 9\xce\x82\x90\x92=;\xd0\x8bn\xd5\xa8\x16\x82\xd6\x1a\ 4\xd2\xb5h\x5ck\xb4\xa5\xaf\xd6\xc6\xefq+\xe6r\ \xce\xe9#G\xea\x0bG\x8e\xb8\x85\xe3\xc7\xfd\xf2\xe9\xd3\ \xd2YX0\xfcb\xd16\x1a\x8dD\xdc\xf7S\xb6i\ \xc6\xf1\x8d\xb8\x0a\x90\x86Q\x0bL\xa3\xe4\x1a\x0a\x05`\ \x09\xa2\x9cC\xd1u\xe8\xe9\xd3\xb3O\xbe\x9d\xcf\x1f\xeb\ W\x00:\x134\xea\xbe_\xf2\xa4\x8ckr\xda\x84[\ \xcdUC\x13]\xa9\x15fg\x9d\x1c\xc8-\x1d;\xe6\ ,\x1e=\xeaWggy\x97\xb9L.!D\xca\x84\ ,\x08\xc0\xef5\x1c)K|(\x83Z\xa4X\xc7\xd6\ \x9c\xff\x0dcY\x88|\x01\x9b\xb4<\x14s\xd4u\xe7\ 0_gWe\xe8\xcc\x05\xd4\x80\x02P\x0c\xe7\xfb\x17\ \x80\x0b\xd4q@zl|qqG\x12\x02\xb0Y\x83\ \xb6\xddE\x12\xe4\x1a\xb9C\x87\xeay\x90\xc3_\x7f\x83\ \x0ak\x0e\xe4D\xa9\x14S\x9a\x13\x22\xcd\xe4\x02d\xd9\ \x86\x10~C\xcaJ\x93\x9c\x22V\xf1\xfd|\x11\xc4\x16\ |?\x87\x12|\x1e;\xd12\x13\xea \xc7\xf0[\x10\ \xb4\xf7z\x1c=\xab\xab\xc0\x1e\x02X\xb5\x16p\x80\xd2\ {\x8d\xc6K\x9b\x97\x96\xf6\xbe\xf4\xe0\x83\x8b\x89z\xd5\ <5\x9f\xaf\xe1\x80T\x82\x9cm6\x1a\xc9\x18\x8a_\ \xfe\x16od\x80:\xffY\xad.e\xa1\xe6\xfbK\x15\ h\xac\xe8y\x0b\x8b8f?\x89\xcd\xd5\x82\xeb\x964\ \xa1>\x881\x04 \xcf\x06\xdc\xfa\xfe\xbf\xceB\x00&\ \x85\xe6\xb8\x11R\xda~\xf3\xe4\xe4\x1foL&w\xa7\ \xd2)\xff\x8d\xb9\xdcO\xaa\xa8\x0fJ@\x1e\xc4p\x80\ \x9a;\xe3\xba\x8b\xdd\xa4\x80\xde\xa4\xb8\x17\x8c\x1e\xe4(\ \x1aw\xb7\xd5\xc8\xf6+\x00-\x04\x1b]\x1a\x18\x05\x86\ \x81\x18 \xceF[k\xd4\x18}0\xc4>x\x01\x18\ \xe8,&\xde\x84\xa1k\x84_.b\xfd\xb7\xff\x05\xc7\ \xfd\xe7\xdb#]\x138\x00\x00\x00\x00IEND\xae\ B`\x82\ \x00\x00 \x1c\ \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\x08\x12\x149()\x91|\x0e\x00\x00\x1f\xa9ID\ ATx\xda\xe5\x9b\x09\xb0\x5cW\x99\xdf\xff\xb7\xf7\xbd\ _\xbf\xfd\xe9\xe9=I\xd6.\xd9\xda,y\xc1x\xc0\ vB\x81\xc1\x03d\x0c\x13\x1cBe\x02N\xb1\x84x\ \x5c\xc5\x14UI*TH\x05*\x03\xc3\x14\x03U3\ \x13C*\xae!\x9e\x01&\x05C\x80\xd8\xb2\x0dx\xc3\ \x96%k\xb1\xf5\xb4=k}\xd2\xdb\xb7\xde\xb7\xdb\xb7\ \xf3;\xa7\xbb5\x12\x1a\x0a\x18\xb0\x81J\xcb\x9f\xcf\xed\ \xbb\x9cw\xbe\xed\xff-\xf7\xb4\xfe\x7f\xff8\xaf\xe7\xdf\ Y\xb3f\x8d\xaf\xab\xab\xcb\xd7\xdb\xdbk)\x91H8\ \xd5jU\xb9\x5c\xce[XX\xf0\x96\x97\x97\xbd\x0b\x17\ .x\xd9l\xb6)\x09\xfa-\x16@$\x12\xf1m\xdd\ \xba5\xb0{\xf7\xee\xf8\xddw\xdf\xbd\xb5\xaf\xafog\ 4\x1a]\xcf\xf9u~\xbf\xbf\xd7q\x9c\x04\x14o\xf2\ i4\x1a\x05C\x08c\xa6\x5c.\x9f*\x16\x8b\xe3\xd3\ \xd3\xd3\xfb\xbf\xfd\xedo\x9fK\xc1\ `P\xdcg\xcfW*\x15\x15\x0a\x85I\xac\xe1\xd9\xa9\ \xa9\xa9o=\xca\xe7[\xdf\xfaV\xdeX\xca\xafR\x18\ \xce\xafJ\xdb\xd7_\x7f}\xf4\x13\x9f\xf8\xc4\xaem\xdb\ \xb6}4\x9dN\xdf\x0d\xd3)\xc3\x08\x1a\x15\x1aU\xa9\ TR\x15\xa6j\xb5\x9a\xdcz\xbd%\x00\x08\xa1@\xad\ \x95\xc0\xbc\x15B8\x1aU*\x95\xb2\x14\xe5\xb8\xce\xfd\ \x8b\x8b\x8b\xf3333\xff{ll\xec\xcf>\xf7\xb9\ \xcf\x8dONN\xbaF\x10\xbfn\x018\x1b7n\x8c\ ~\xfa\xd3\x9f\xbey\xc7\x8e\x1d\x7f\x94\xc9d\xde\xe2\xe7\ \x03\xd3\xc6\xafU,\x14T\xe1\xd8P\x15*#\x04\xc8\ \x0a\xa2\x8e \x1aX\x82\xe1\xde\xe78\xf2\x07\x02\x0a\x05\ C\x0a\x86B\x0a\x84C\xf2\x9bc\xc6h<\xae\x9e\xbe\ >\xf5A!\xae---\xd5/]\xba\xf4\xcd#G\ \x8e|\x96\xbf{\x22\x9f\xcf\xbb\xbf\x16\x01\xa0\x9d\xe0\x87\ ?\xfc\xe1\x91\xf7\xbf\xff\xfd\xff~hh\xe8\x03\x98p\ \x10M[\xc6K0n(\xbb\xbc\xac\x85\xb9y\xcd\xce\ \xcdjnvVK\x8bK\xca\xe6\xb2\xd6\x1a:\x02\xf0\ I\x0a\xfa\xfc\x8a\x84\x82J\x18\xcd'\x12\xeaJ\xa7\xd5\ \x95\xe9V*\xd3\xa5h*\xadP\x22\xaep,\xa6n\ \x840\xbcr\xa5b\x1c\xcf\xce\xce\x96\xcf\x9c9\xf3\xc5\ o|\xe3\x1b\x9f\xfb\xfa\xd7\xbf\xbe,\xc9{\xbd\x04\xe0\ \x8c\x8e\x8e\xc6\xbe\xf4\xa5/\xbdc\xcf\x9e=\x7f\x8a\x89\ \x0e]\xd6x>\xaf\x1cLOOM\xe9\xfc\xb9\xf3:\ s\xf6\x8c&&&4\x03\xf3\xf8r\x87qk\xfa\xc2\ =\x1c\xa3}I\x01\xc7\xa7\x00\x18\x10\x0a\xf8\x15E\xcb\ \x89HT\x19\xcc\xbf\xaf\xa7[\x83\x83\x83\xea_\xb1B\ \xe9\x81\x01E3\x19\x85\xcdy\xce\xadZ\xb5J\xc2r\ \xce\x9d;\xf7\xea\xc1\x83\x07\xff\xf5'?\xf9\xc9\xe7]\ >\xaf\xb5\x00|\xb7\xdcrK\xf7\x97\xbf\xfc\xe5\xff@\ H\xfb\xb7f\xed\x98\xa0\x0aPvqQ\x13\x17.\xe8\ \xc4\xf1\x13\x1a;~Lh\xc72^.\x96\xd4\xdb\xdb\ \xa3\x95+\x86\xd5\xc7\xd8\xdd\xd5\xa5X$\xa20\xbe\xde\ lx\x06\x0f\xb8\xa7\xa0\x02\x02\x5cZX\xd0\xfc\xf4\x0c\ 4\x8d`\x9a\x8a\xe0\x06)\x5c\xa0\xbf\xa7G+V\x0e\ k\xc5\xea\xd5\xca\x8c\x8c*\xda\xdb\xab8\xc2\x19\xe5{\ _\x7f\xbf\xc0\x86*\xd8\xf0\x1f\x1f|\xf0\xc1/\xe3\x22\ \x95\xd7J\x00\xfe\xb7\xbf\xfd\xed+>\xff\xf9\xcf\xff\x05\ Z\xb9\x1b`\xb2\x8c\xe7\xd0\xec\xe4\xc5\x8b:\xfa\xca+\ :\xf0\xd2K:~\xf2\xa4f\xa6\xa6\xf1\xd9^m\xdb\ \xbaU\x9b7mR\x22\x1c\x91\xaf\xe9\xc9\xef\xb5\xc81\ \x04\xf3b\x84\xacE4\x0cq\xecr_\xb5Z\xb3s\ \x9e>vL\x0b\x08\xd1\x80c\x12\xb3\xef\x87\xf1\x950\ \xbdb\xfdz\xa5V\x8d*\xc2\xf7\x01\x5cb\xf5u\xd7\ Y\xa0E\x08_\xf9\xd4\xa7>\xf5\xe0\xc9\x93'\x8b?\ /@\xfa\x7f^\xe6?\xf0\x81\x0f\xac\xf9\xccg>\xf3\ H\x7f\x7f\xff\x9d&D\xe5\xdb\x1a;16\xa6\x1f\xfe\ \xf0\x87z\xe2\x07?\xd0\xcb/\xbf\xac\x01\x16\xf5\xcew\ \xdc\xa3\xbbn\xbf]\xd7\xa1\xf5\x0c\xbe\x9d\xc4T\xd3j\ Q\xaaC\x9cKJJt\x88sq\xc6\x18n\x11\xe7\ Zo2\xa5u\x1b\xd6i\x04\x06k\x08\xb9\xb0\xb0\xa8\ \x12\x02/\xf27kKK\xf2U\xaa\x0a \x98J\xdd\ U\xae\x84\x95\x81\x0f\x03\x03\x03\xbbn\xb8\xe1\x86\xadX\ \xc4c\xe7\xcf\x9f\xaf\xfe\xaa\x04\xe0\xbf\xf3\xce;W~\ \xf6\xb3\x9f\xfd_\xc4\xf5[\x0d\x8a\x1b\xb3\x9f\xc3L_\ \xda\x7f@\x8f=\xbeW\xcf>\xfb\xac\x5c|\xfb\xbd\xbf\ \xf7{\xba\xe3\x8do\xd4 \xc0\x95\xc2\xa7\xd3N\x87\xe9\ \x0e\xb3\x0e\x0c\xc2\xa4\xa4\xa81\xf1&$\x99\x11\xe2\x9c\ \x19\xa1\x98\xbd\xc6y\xac\x22\x01&\x5c\xb7n\xbd\xba\x01\ \xc4\xfc\xf4\x94\xaah\xba\x9c\xcb\xab\xba\xbc$\x87\xb5\x84\ \x88\x1e\x0d\x9f\xa3<\xc7\x19\x5c\x05!l\x02\xa36\xee\ \xdb\xb7\xef\xbb\xe0R\xfd\x97\x15\x80\x8f0\xd7\xff\xd0C\ \x0f}\x85\x89\xef\x00\xc4\xac\xd9O]\xba\xa4\xe7\x9f\x7f\ ^\xff\xf7\xb1Gu\xe8\xe0A\xed\xda\xb1C\xff\xfc\xde\ {\xb5\xb2\xa7W\xe9\x0e\xe3Wh8\x0a\x85a\x0c\xaf\ W\x00\xc6\x02\x8c\xfe\xa6 F\xafu\xec3\xc7\xf6\xba\ !)\xc8\x18\x16\xe4\xf1\x9c[\x07;\x12\x1a\xc1\x22\xaa\ 3s\xaa\xb1\x86Z\x89\xd0JD\xb1B\xf03#\x96\ \x96\x03\x8c\xbb\x00JB\xe6&\xb2\xd0\x81\xef\x7f\xff\xfb\ \x8f\xe3Z\xee?V\x00\x0ey{\xea\xe1\x87\x1f\xfe\xcf\ k\xd7\xae\xbd\x8fXn23M\xc3\xfc\x8f\x9f{N\ \x8f\xed\xdd\xab\xb3\xa7O\xeb\xdd\xef|\xa7n\xdb\xbdG\ ]\x80Z\x86\x85t\x18\x8fY\xa6a\xb6\xcd\xa4E|\ 3\x1a\xbfoB\x1c7m$h\x8dj\x9fw\xec\xbd\ \x8c\x1d\xe1X0l2Y\xddZ\xcf\xf0\x9a\x0dj\x10\ N\xddB\x8e0ZS=W@\x08e,!\x88\xa4\ #*\xd6j\xd6\x1dX\xfb.\x92\xb3e\x84\xb0_\xcc\ \xfe\x0b\x0b\x80\xb8\x1e\xf9\xc2\x17\xbep\xefm\xb7\xdd\xf6\ _\x00<\x1f\xcc[\xb3\x7f\xe1\xf9\x17\xb4\xf7\xf1\xc7u\ \x11\xc4\xbf\xef\xf7\x7f_\x1b\x09G]\xf8b\x06\xcd\xe3\ \xd7v\x91!\x18hi\xb5\xcdX\x9b\xa9\xa6e\x9a\xb1\ }\xac\xf6\xb1\xda\xc7\xba\xea\xd8\x8e\xac\xc3S \x0d@\ :\x9eBE\xc9)\xd75\xb4\xf6:5\x96\xc1\x027\ '\xa7\xee\x22\x84\xa2\xfc`B\x08\xb0m\x1a!\x10\x0d\ \x07\x08\x95\xe4\x0b\xbfC\x8e\xf2\x14.:!f\xfcE\ \x04\xe0\xa7\x80\xd9\xf4\x91\x8f|\xe4\xaf@\xe0\xa4\xc9\xe8\ \x96\x09s\x07\x0f\x1c@\xf3\x8f\xeb($\xc7mX\x06R\x83\ CV\x83\xfcU\xc34t%\xf3\x8d\xd6\xb1q\x11\x09\ \x0d\xaf\xd3\x10\x89\x12\xcc\x9bs\x96<\xa8\xf3\x8c\xb8\xbf\ \xd1,+\x90\xea\x95\xcf\x0aQ\x10\xff\xb3\xd7 \xc6\xfa\ rN\xabo\xbcI\xc9\xe1^%\x03\xb8 \xcf\x08W\ uO\x9fU\x1dA\xd4\xb39\xcd\xce\xcc\xa8\xbb\xbb;\ z\xeb\xad\xb7\xfe\x91\xa4\xf0\xcf\x12@\xe0C\x1f\xfa\xd0\ \x1b0\x99\xdb\x0d\xf3\xb5r\x19\xb0\x9b\xd0\x91\xc3\x874\ KN\xffO\xde|\x87\x92\x86Q(\x0e\x85x\x9a\xe5\ KV\xe3\xaee2\x92Ljh\xcbf\x05\x11V\xc7\ \x0a:\xccs\xc0\xf9\x80\x86wnSzh\xa8\xe3\x16\ \x1d!]\x1e\xbd\xf635\xaf\xa6h\xba[\xf8\xc85\ Vd\x05V\xab*Fj\xdd{\xfdv\xd2\xeb\x16w\ \x81Z]M\xc0\xba\x81\x00<\xb2\xc8\x02\x0a4%\xf8\ \xca\x95+\xdfs\xdf}\xf7m\x90\xe4\xfcT\x01P\x8b\ '\xdf\xf6\xb6\xb7\xddO\x1d\xef3\x0f\xe5\xc9\xc0\xc6O\ \x9e\xd0\x19\xd2\xdb5\xc3+\xb5\xb2;\xa3d\x87y\x16\ \xe4s\x01\xa6\x96j4s\xfc$~X\xb1LS\xda\ \xe2\xab\xa4\xc0}\xbdW\xb9Cr \xad\xe4\x86!\x85\ \x13!\xfb\xbd\x01hM\x1dyE.\xc2\xbe\xc6m\x9a\ \x8c\x12\xf7\xa6%\xe6k\xaa~\xf9\x9a\xd7\x06S_\x90\ hC\xe1\xd4\xbdy\xbb\xc2q\x8a),/d\xc2-\ \xb9\x81&\xa7\xe4R\x8c\x09%.\x92=\xd2\xa3\x08\xdd\ ~\xfb\xed\x1f5l\xfe\x14\x01\xd8\xa4g\xd5\xf0\xf0\xf0\ \x9bm\xd3\x02\x9aE\x92\xe3\xc7\x8f+73\xab=\xdb\ \xb7+\xe1\xb5\x98\x0f{m4\xae\xd4D\x1b\x0b3n\ \xa8\x92]\xd6\xa5#GT^Zj#\xbb\xd4C\xde\ \xde\x0b68\x8e\x0f\xd7X\xad\xae\xf5\x83r\x9d\x966\ +\xa4\xd2\xe7_xAY\xf2\x8a+5\xebY\x17`\ l\x0b\xc3O|\x0f\xf6\xad\x92\x17\xc8\x09n8Wc\ \xee\x9a\x821O\x91\x95\x09\xa5F7*>0\xc2\xf7\ \xa0e\xc6/Y\xc5\x80\x8ej^\xbcd\xb1\xa0\x8a@\ \x5c\xce\x01\xea\xef\x06\x13\xd3?M\x00\xa1\xfb\xef\xbf\xff\ \x1e\xc2^\xcc\xdc\x5c\x06\xfd/\x9e;\xa7KP\x17h\ \xba\xb2\xaf\xcf2\x1f1\xc9\x89\xf5A4X\xc2\x02\xaa\ ,\xcao\x17k59\x05^,\x9d\xbf`\x90\xdd2\ \x11'=\x1d\xdd\xbdK\xc9\x15]*\xe3\xef1\xc2\xd4\ \xf2\xc4\xa4.\xec\xdb\xafj\xbe\xd06\xfdF'b@\ \xae%\xbe[l\xa9\x15s\xea\x1e\xdd,gx\xbdj\ \xf1\xaa\xea\xe1\x05y\xf1\xac\xbanZ\xa3\xfe7\xbf\x13\ \xdcY\x05X\xc28@\xe9H\x90\xcd*\xad\xe6\x1d\x98\ \xaf\x9d?/\x1f\xf3\x93\xbe\x1b+\xe8\xff\xd8\xc7>\xf6\ \x96+\xf9\x0et\x0eL\xbc_\xb7n\xdd?\xb5\xfd:\ \xc8\x80\xdf\xc4\xd9s\xca\xcf\xcdi#\x05\x89a>j\ \xd2R\x99,\xcd\x11\xff\xc1\xb0\xf19O5\xbf\x83\x96\ \x1bb\xdd6~/\xf2\x5cyiY}\xeb\xd6\xcaG\ \x8d/\x01X*)\xda\xb7Z\x0b/=\xa5\xec\x899\ \xee\xbd::t\xa2\x87\xeb\x95\xe4sL\x1e\x11V\x80\ FIa\xfa\xacb=\x03\xea\xb9\xee\x065\x86\xd7\xa9\ ^)\xda{\xd3<\xeb\x0f\x84T/\xcdk\xf9\xcc\x01\ \xf98\xbe\xaa\xbcu\x11\x22\x19ccrR>\x5c\xb3\ \x1a)\x8b.\xb4FFF\xee\x91\xf4\xb7P\xf5J\x01\ \xf8\xe8\xeb\xf5Q\xeclC\x00\xb6F_\x9a\x9f\xd7\x0c\ \xc0\xe7\x15\x8a\x1a\x1d\x18\x84yO\xe0}\x0b\xf4\xd4\x12\ \x00\xa7\x14*K\x95LB=#a\x92\x91\x90\xb8l\ \x85 \xa8\x00\x08%\xfa\xfbY\x5cU\x0d\xe2}\x94\x92\ 6h\xd2e\xaaD\x0b\x1d\xedL\x11\x8bi\x9b\xbd\xcb\ \xbc\xf4\x06\xca\x05%\x82CjT)tf/\xa8\xd0\ 3\xc8<+i\x93\x05\x99+m\x05@o\x0d!V\ U\xbc\xf4\x8c\xca\xf3\x17\x98,pu\xaag\xc0\xb5\x84\ 0\x97\xb3\xaa\xd3\x91\x0af\xba,\x18\x92\x22\xdf*)\ ~\x8d\x00\xde\xf7\xbe\xf7\xed\xa4\xe7\x962u~\x1d\xbf\ ^d\xf1\xb9\xf99\x85x\xa8/\x95\xb4\xa6\x1f\xb8B\ \xfb\x12\xa3DN\x8ee\xf4\xd3\xcc\x1c\x1aT\xaa\xe6\x80\ \xcc-!HV\x10-\xcd:\x15\x852\xd7Y\xbbK\ v\xf7\x90\xae&a\xfc\xef\x05\xb5l\x05\xd0\x10\x12\xc0\ \xd7\xc1\x1f\xa7.\xa9\xc6\x5c\x01B E\xce\xd8\x8f\xd1\ \xf4\x0dJ\xaf$\xc4\xcai'W.e\xf2i\x15'\ \x9eC\x18\x01k\x8dWI\x80c8\x96C\x16[\xa3\ ?\x11\xdb\xb8\xd1\xe2U2\x99\x1c}\xef{\xdf\xbb\x96\ V\xda\x92\xb9\xab\xe3\x0b\xc1\xcd\x9b7\xefhX\xe0\xf1\ l\x03syvNU\xe2h\x8c\xefi\x906\xc8\x1f\ \xf5u\x90\xda5\xe4Zr+\x1cg\xb308H\xd2\ \xe2Z\xc1\xe2\xfbh\xc7\xf8\xb1\xa1\xba\xdc&\x85Lw\ \x9f\xd5x\xc7\xd4\xbd\xcbs\xb9\x1dt\x87`<\x880\ \x09}\xccc\xaec\x05~\xf9\xf2!\x95O\x1d\xd0\xc2\ \xab\x879\xc7\xf9\xa6\xc1\x9e%\x15\xce?\xa6\xc2\x1c\xbd\ \x01\x04_\xcf_[\xf9\xda9\xc1\x19\x17k\x0eJ\x82\ ?\xdb~\xa7H\xba\xd1(\xfdJ\x0b\x08c\x1a\xd7\x99\ \xf0\x02Y\xd4,\x90P\x08A$\xda\xa5l\x80\xf3r\ \x98T\x90s\xd9\xd3l\xde\xdfX2\xa5\xe9\x9c\xa2\x83\ k\x94=\xf4\x8c*\x97j\x1d<\xb0\xc5LxuL\ \x99pT$\x16Z\x9a\x9c\xe0\xba\x07\xe3\xcd\xcb\xe9\xb0\ [\xad\xd1\xe8\x98W\xe0bE\xd1\xeb\xd7`\xe6a-\ \x1e;\xa2\xca\x82\x1f\x86[\xf7\xf8\xfc5\x85\xce\x9dV\ \xa3VQ\xd7\xaa\xf5\x98\xfe\xb3\xaa\xcc\x8f\xa9\xb4\x80[\ \x16\xa5z\xe1\xda\xfe\x07\xcc\xd8\xf4\x98WNVy\x00\ \x9d=\x0d\x18\xaeo\x0b\xa0a\x05@\xba\x18\xe5\xe4h\ [\x006\x01*\xe7s\xf2\xd7\xea\xb6;\x13p\xeb\x98\ b\xf8\x1f,\xa8<\xa8V\xc0\xdf'N\xabg\xe3\x0e\ \xe5\x87F\xc9\xc2\x9eWy\xc13\x8b\x87\x19hh\xc0\ @3\xa1*\x8e5\xc0,\x9d\xe2F\xa5S\x00Y7\ \xc1\xda\x96T\xca\xe4\x94\x19\xb8\x9dgi\xa2^\xbc\xa0\ \xfc\xc5\xc6U@\x19\x8cs_\xed\xbb\xf2n\xbdY\x95\ \xc9\xa7T^\xac\xa9Y\x8c\xaa\xe7\x96\x0b\xb8\x90\x09\x93V\x8b\x00\x1eR\x07\x89\x0b\ S\x17\x94\x1aY\x85\x80|\xea\xdd\xb8U\x8d5h\x5c\ \xbc1{\xeb\xaf55\x8c\xf6K\x05\xc6 \xb1\xbf\ d\x05P\xcb\x17H\x84z\x94Y\x13\xa3){\x09,\ \xc1\xdd\x96\x22\xcc[G\x00\xb3\xed\x90\x07\xb9\x0e.\xd4\ \xb4\x02\xa8\xe6l\xc8\xb2\x82\x11\x14\x08\x87m\xe9\xcdw\ S\x17\x94\x0c\xcfW\xba\x80\x0b\xff\x95\x8e\x00\x02\xc1\x80\ \xc2\xc1\x90\x15@\xb3\xcc\x12\x17\xa7\xd4\xe08\x944<\ \xa3\xd5+\xfc\x1f\xe2$\xa3\x9f>},i\x05Q[\ \x9c6\xa6\xd9\xbe\xee\xb6\xcc\xb9\xe8\xd3\xd2\xf1\x83h\xc6\ 0U\x13\x92\xc4Mp/\x88c\x90\xd8\x1690K\ 1U*\xa3\xd5\xcb\xee\x86\xe6\xfd\xa4\xc3!U\xaa\x13\ \xe4\x13E\x04\xd0$\x22\x04@\xff)\xee\xab\xb5u\xd0\ \xae\x03\x1c\xc1,~\xcf\xd8\xd6&k\xf3)\x9cL^\ \x16\x00\xd6^\x96\xe4]i\x01U\x8a\x85,\x17\xe4\xf0\ /\x88\xb4\xa2\xd4\xf3\x05S\x86V\x1cU/M*\x0a\ j\xbbKS\x0a\xa7C\xaa.\xb9\x1d\xe5c\x15\x14H\ ]R3\x19U\xbc\xb7Ou\xb4_\x9e\xba\x88\x00\x0c\ \x006!\xd7,\x02\x018*-\x9eRa\xc3F\xac\ `\xd4j\x85\xa7\xda\xebh\xf97D\xec\x9fF\x0eM\ \x0b\x82\xa3\xb7\xdcl\x05\x10\x8c\xfa\x15\x88\xcf\xca\xf5\x16\ PBYq\x94Q\x9e\xe182\xafj\x10\x86\xeaj\ \x15D0nJ\x82\x9a\x8dm\x86\xe0\x06\x1e\xcb\xe0^i\x01\x15^7_h\xa7\x8a\ V\x00q:-a\x80\xcaqr\xaa.7\x95;\xfa\ \x8a\x86n\xbcY\xdd\xeb7\xca\xb9~7\xfe\x99g\x81\ \xb8E\x22i\xcd+\xc4\xbd\x1e\x0c\x94.\x9e\xc5\x05L\ b\xd2\xb0!\xc8F\x08\x00\x94\x0f~KY\xfa\xea\xb8\ J7lSjhX\xb0)b\x94\x05N\xdb\xe2\x22\ o\xaf\x13J\xddR\xc8\x0a\x8e\x05\x83\x17u\xc6Y\xc5\ z\xa9'\xd21\xd6\xd3$\xaf\x99Pb\x10T\xc7\xdf\ \xb3\xb1\xba\x92\x83\x8eUT\xac\xdf\xa36\xc1\xcc\xc9\xf0\ \xf9\x87\xc9\x1b\xcb\x89\xcbGc\xc6o\x92 \xe6\xe7c\ 6[\x9cfh\x5c\x89\x01\xb51>n\xfb\x8f\xfa\x90\ Z\x82\xfa?\xc2\xc3LbM\xac|>\xaf\xe9\xe7\x7f\ \x04C%\xf9\x9d\x0a\x85\xc9\x08L\x0c!q\xeeql\ \x1eO<\x9e!\xef\x9e\xc5\x8fm(m\xbd\xf4\xb4\x16\ \x00\xd5M\xdd@\x9a=WPi\xf2\x02\xf7W\xed3\ \x1e\xd4tI\x9d\x99\xb7x\xe1\x04\xe8^6\xf7\xd9n\ \xd1\xf9g\x9f\xd3\xf4\xb1\x1f\xab\xb4|F\xd1\x01?\x16\ f\xc2\xd5\x8c\x22\xe9\xb8B\xa9\xa8b\x03A\xf5mu\ \xd4\xb3\xc9S\xcf\x96\x06\x02\x90M\xd6\x1c\xd7G\x04\xf3\ \xb56\x5c\xa0\x9c8\x1dg\xe1\x0a\x9dL\xf7\xa5\x97^\ :r\x0d\x08>\xf9\xe4\x93\x87y\x97V278\x94\ \x9dq\x04\x10\xc5\x0a\x8c\x095%\xea{)w\xf8\xa8\ \xe6\xc7\x0ea\xdeyb\xef\x84\x8d\xd9\x96\xbc\x9a\x05\xb7\ \xfc\xe9c\xc4\xe6&\xd7=\xcb|\xc7\x05:\x84P\xb8\ \x86 \xb0\x1e\x98\xb7f\xcf\x09\xc2$\xf5\xc1\xf4^\xcd\ \xef\x7f\xc2j\xd0\xabY\x90E\x08\x15\x18h\xd0\xf1\x09\ q\xef\x12\xe7/\xe2\xe70\x97HQ|\xf5p-N\ \xe1\x14\xa2\x90\xf1\x81\xfc\xed0XC\xf75\xbf\x22N\ \x00\x1c\x8b\xc9\x0b\x85\x08\xbb\xf4\x12L\x94\x810\xffi\ \xb6\x1b\x9d\xfcI\x10\xf4\xf8\x5cd3\xc3\xab\xd4\x04\xdb\ H\x15If2JP\xe2\xe6\xe9\xa8\xd8\x5c\xda\xe5\xe1\ \x0b5\xcd=\xff\x14\xdd\x9d!\xc5\xfa\xfaU]0f\ i\xea\xfd\x10\xe05\xa7:UW-\x171\xcc\xb6\xa3\ \x83\xc9\x0f`\x1eWA\x8a\x9cs\xad\xc9\xe3\x9b0X\ \x80\xa1yy\x953\xb8\xd8Q\xacb\x99\xe2\x8645\ \xe0\xb4\xdcG\x02\xe9#X\x98A\xf5ypaI\xa1\ \xae\x1e\x1a\x17q\x14\x94\xa0Y\x02@\xc3\xa4pQ\xb1\ 6a1n\x1d\xedW\xc0\x8c\x0a\xd1\x05s\xf1'S\ \xaat\xa5q\xdb\xf5\xca\xb67f\xcd\xcf\xcf\x1f\x94\x94\ \xfd\xc9\x96X\x13\x9a\xc7\x0b\x9e\x05!\xad\x99\xf81\x9d\ \xf4\x9a5\x0a\xa6R\xed\xa6\xa4\xd0\x9c\xa3\xfcI\x1a%\ \xfb\x9eFq\x86\x812B\xb8\x00\xd33\xaa-/\x81\ e\xa1\xab\xc2\x97\x07\xb5\xcd\x1fB\xe3j\xa0A\x97\x89\ .\xaa:\xbf\x17\xac\xd8\x8b\xc6\x8f2OVE\x84\x0b\ \xd6\xd8\x8c\xceA`\xe4\x06<_g\xfe\xf3\xcc;K\ h\x0e\xc2xD\x0e\xc2\xf6\x05\xad\x10\xf0\xeb.\xe6\x8b\ \xf3\xbd\xdd\xaa\xc9\xe1\xf7eBx\x1d\xed\x93p\x053\ \x19\xa5\xae\xdf*_\x81v\x22a\xae\xdb\x82\x04\ \x90B3i\xa8/ \xc0\xc5v\x8b\xb9\x04\xb3.\x89\ H\x85P\x9b'\xf5\xbe\x84\x15\xd4Z\xcf\xf8Mv\x88\ @\x8a\x97k\x14\xdc\xa3l\xdd\x11\x0d\xb5\xdc\xac\x0eU\ \xb87\x8f\xd5,\x04\x14\xc8\x13&\x11\x8cG\xdc\x0fl\ \xda\xa0$/o\xe7\x0ay\xdb\x0db\xd3\xc4\xe3\xf9b\ q\xcaJ\xf2Z\x01\xd8\x93\xb3{\xf7\xee}\x84\xf6\xb8\ \xd9\xdc\xe8\x04\x89\x02I\x04P\xe4\xbd\xa0ry(g\ \xb5Z+8\xca\x9d\x9e\xd7\x12\xe7\xfb\xf7\xec\x84\x11Y\ \x8d7\x1d\x17\x01\xd5)T\xa6h^Vl\x1c\x0fc\ \xce\x84\x22P\x1b\xad$s\x8a\x0fa]2a\xcf\xb1\ Y\x9c\xc7\xc2\xb2/_\xd2\xfc\xcb\x0d0\xc6\xa7df\ \xb0S\x9e\xd8fK\xad\x14\xc6]|\x8a\x90\x03x\x80\ &!\x02\xa1v\xf3\xf7\x10\x08.\xa8\xb2\xd1\x08\xb82\ \x8b\xf6\x970\xff2\x18\x80\xdb\x9e%\xc3\xdc\xf0\xcf\xde\ \xad\xba\xcf\xe9\xecUt\xbf\xff\xdd\xef~\x05&K\xe2\ s\x8d\x00:I\xd2\xfe\xfd\xfb\x1f\xc7\x0a^\xd9\xbe}\ \xfb6\xfag\x0a\x00\x84]\xbbviy\x0e\xf3\x86\xa9\ &\xa4\x860Yr\x83S\xa7\xd4\xbdi-\x0cF\xf0\ \xd7\x12=\xfeW\xb44\x0ec-\x03\xb3\xa6\x7f\xfe\x99\ \xe7\x8cU\xab{\xa3\xc7\xcbM\x97L.\x88\xb5\xa0y\ \x00\x8bf\x08\x02\x80\xc9,\xe93\x9a\xf3\xc8\x00'^\ \xdc\x7f\xe5\x0e&\xee\x97Fv\x01\x8e\xfdT\x99}0\ i\xe6u\x0a\x08\x1d\xa0-\x928!w\xf9\x15\xb0\xa0\ ,\x8c\x11\x80t\xacic\xe1$URz\xb5\xa7\xde\ U\xaezw\x05@r\x98\x08\xf9\xb0\x0e#\x00!\x08\ \xfc\xff\xac\xa7\xec\xb4\x0f0u\xaei:\xe1]`\x90\ \xa3D\xccS\xa8\xa7\xfdr\xd4\xb6\xa1X\xc32\xda\x9f\ \x02W&\xb9\xe7\x22 Y\x00$\xfb\x07u\xaa/\xa5\ \x1d\x0f\xfe\xa1j\x91\x90IzD\x92W\xfb\xc6#\x8f\ <8~\xf6\xec13\xe5\xcfz=\xee\xb2\x0du\x86\ wi\xdb\xd9j\xb2&\x12\x8d\xb2\x80\x98\xc2Pin\ \x16\x90\xa1/\x8f\xd9\xa2=\x00\xad\x81\xc4'\x15\x0c\x9d\ \xc5\xa5+\x80\x95\x09\x18\xd4\x06\xa4\xa6\x804\xcd\x89\xa6\ \xba`\xbege\x83f\x87\x0f@\x0d`\xbeA\x9b[\ \xd8\xac\xa6-\x80\xfa\x82G\xb2\xe3Si\xde\x0a\xa5\xa3\ \xfdN%k)\xc1\x5c\xb1>\xb5\xdc\xad\xc1\x89<7\ \xceP\xfa\xe2\xd1\xc1i|?k6G\xf4\xea\x04\x09\ \xd2\xba\x7f\xf7QEy\xf9\xbaHd\x9a\x9b\x9bc/\ \xd3\xfe\xaf\xfd\xcd\xc3\x0f?d\xf2\xb9\x9fw\x83D\x89\ \x0d\x88\xb3\xec\xb8z\x07\x1b\x0c\xc20o\x22\x01B\x88\ \xabD\xf9\xe9\x00\x88\x04][v\xc6\xd3\x15\x16\xd6\x80\ )\x07@t8\x86\xf1\x98\xc7\xf9\xa6R}\x9e\xd2\xc3\ M\xa5\xb7\xf81_|3\x12\x82\xa2X@\xbc\x85\xe0\ MY`\x13\x0c\xb9\xcb\x9e\x0a\x0b>\xacG\xd7~\x9a\ \xcc\xdb\x83\x10\x98\xd3f\x83&\xdd]\xa0\xc4\x9d&\xde\ \xcf`U\xb90\x80\x99\xd1Y\xf2\xfd\xf0\xbb\xde\xae\x91\ \xb7\xbdU\xd9r\xc9h\xde\x00\xdf\xe4\x9f\xfd\xf1\x1f\x7f\ \x14\x0c\xb8\xe42\xd3\xcf+\x80\x06~3\x07r:\xec\ \xc8\xbc\xdd\xb8B\x10!\x180\x0bCe\xfas\xbeJ\ \x99\xa2\xa4\xa6D\x0f\x9d\xa3^\x13\x8d\xa0\xa0lF\x16\ \xee\xf6Q,\xf9\x14\x1d\xf6\xa3u?\x11\xc1h>\x0c\ \xf3\x09\xf0 E\x0c\xa74\x05\xc5e0\xc0\xad\xdb\xf6\ \x99\x93m\x08x\xa4\xd1i1\xe4\xca\x8f-a\xa3\xcc\ \x99I\xca\xbe-\xf2-\xa2\xf1Y\xfc}\x0e\xca\x86\xb9\ \x9e\xd6\x85DF\xb9\x9bvk\xcb\x07\xff@E\x22\xce\ ,\x9a'\xb3s\xbf\xfd\xcd\xbf}`\xec\xd0\xa1\xa7\x8b\ \x92\xfb\x8bn\x922\xfb\xf4\xcf\xd0._\xcb\x0b\xc5\x8d\ \xc6\x15\x82&\xb4%\x13\xb6\xf8\xa9\xd0\xc5M\xc6K\x8a\ g\xaa\x14DM+\x00'\xe0 \x04S\x81\xf9\x18a\ :\x1c\xe0\xd8j\x1dJ\xf2=\x0d\xf3\x90/\x81*Z\ M\x10\xe2\x9a\xb5\x82\x00V\x13,!\x04bw5'\ \xce1\x9f\x98\xcbA\xd3\xe0E\x17\x00\x98\x89\xa0\xf1:\ \xf9\xfdBX!(\x987\xf9FZ\xe7H\x17g\xe8\ \x18\xedx\xe0\xe3\xaa\x04\xfc-\xe6\xd9\xd4\xf1\xdc\xd3\xcf\ \xfc\xf9\xb7\xbe\xf6W\x7f\xcet\xc5\x7f\xcc.\xb1&T\ 8v\xec\xd8\x89\x15+V\xec!\x22\x0c!\x04k\x05\ \x81T\xca6)k\xe5\x9cR\xdd\xe6]^\xcd4%\ !A~\xcc\xd1o\xb23\x98\x07\x94\xc21L>\xc1\ \xf7\x14\xe7\x93\x5c\x8fsS\xa8\x95\x83\xd9\x1e\xa3k\xdd\ \xc9q\xc0\x93\x18~^G\x10)\x1fX@7\x0a\x0a\ \xd3\x0cIg\x82\x1a\xec\x0e(\x19 E\x07\xe8B\xf8\ {\xa0L\xc78\xd8\xa3\x13\xfe\x08\x9a\xbfI;>\xfe\ 1U\x10\xfa\x0c\xcc\xa38\xb3\x9f\xe9\xd1\xbf\xfc\x93/\ |\xb2[\x9a[\xfe%\xf6\x09zhi\xe1\xf8\xf1\xe3\ c\xbc6\xbf\x0d<\xe8\x09\x1bP\x8c\xc7\xa1$\x05\xd3\ \xb0\xf2K\xa00\xd5\xa1\xdf\xd6\xf6\x08Ab\x0c0\xfa\ \xa1\x90\x80>\x04\x84 \xcc\xc8y5\xfc&w\x87\xcc\ f\xa7\x06c\x83\xb1.Q\x00\xc16\xd6\xe4(\xe9I\ ]4c\xbb2\x01\xf5v\xc3<\x05O\x97/\xacp\ \x93\x88T\x04C\xdc\x84\xaa\x80\xcd\x8b<\x1f}\xd7\xbb\ \xb4\xf9_\xfdK\x15\xb1\x94\xe9\x99\x19\xcb\xfc\xcb\x87\x0f\ \xbf\xf0\x97\x9f\xff\xc2\xbfI6\xea\x13\xe7\xe0\xe1\x97\xdd\ )J\x16\xeb\xce\x8c\x8f\x8f\x1f#*\x98\x04\xa9'\x1c\ \x89\xd8L\xaf\x19\x89S\xa7\xaf\x22\xcbJ\xab\x9c\xaf\x90\ \x81\xd5-S\x0c\xb6*s\xaaP\x05C.\x0b\xe0\x84\ \xd9\xa2+\x15\xb0\x96b\x95\xe3\x0aTkQ\xc1\x05\xd8\ \x1a\x8c\xb8P\x09\xcc\x00\xe9\xa2P\x02\x9cH\xf9\xe8M\ @\xa1&\xd6W\x8f#\xdb\x8c&|Q\x1df\x0d\x9b\ \x1f|PCw\xdd\xa1,Qijz\xda\x00\x1e\xbb\ Y\x0e\xbf\xf8\xb5\xbf\xf8\xef\xf7G\xf2\xd9\xf1\xb3\xac\xfd\ W\xb9Y:\x82\x05\xdc\xc4\xcfa\xfe\x94$i\x17\xdb\ hD\xe5h7H\x85\xca\x00b~^\xc5\xf1\x17\x15\ )\x8f)\x1d\x98W\xa8Qm\xed\x0a5\x8dU\xfe\xf9\ \x9a\x10\xff\x1cK\x9d\xfdN\xed7\xc4\xed\x1e#\x9e\xd4\ )g\xa1 \xc2\x0c\xa2mF/,LN4\xc14\ V\xa6\x17q\xd7]\xda\xf8\x9e{\xd5\xc0\x12\x17\xb3\xcb\ vW:\x95\xac\x8e\x1c<\xf4\xf8_?\xf4\x95\x8fw\ WJ\xa7\x8fK\xeek\xb1]>D\xc7h+{\x08\ ?\xc5o\x05~\x97\x5c\xc1a\x03\x92\x22!\x80\x093\ \x8e\x19\x7f\xa6\xa7W>}\x08?=\xa5\x1ee\x11H\ I\x81j\xc3\xee#\xf0\xd7\x01K[\x11C\xcdv\xba\ k\x81\xc3ic\x82\x9f\xf3\x86`\xda\xe4\xfah\xde\xa3\ \x08\xbaXqu\xae\xe1\xd1\x97\xdc\xa3M\xecG\x0e\xb2\ \x1b-GB\xb6@\x92\xc3\xfe?\xa3\xf9\xc6\x81}\xfb\ \xfe\xc7\xf7\xfe\xfao\xfe\xebH\xd3\xbbx\x04\x91\xbe\x96\ ?\x98\x08@\xc3;w\xee\xfc\x837\xbd\xe9M\x0f\x12\ &S\xec \x17 \xa9\xb0\xc9\xfdYh\xdcAa\xc5\ \x9c\x0a\xaf\x9e\x94&\xc7\x15\x9a\xbf\xa4\x1e\x9a\x1b\x09\xf2\ \xf6@\x89\xd4\xb5J\xeen\x84\xc0?\xf1\x8c|P \ \x88y\x87`8\xa2\x1a\xe3T\xa9\xaaY\xee\xa9bi\ \x03ox\x83F\xd8}\xeet\xa5\xf1\xa0\xaa\x96\xb2Y\ \x9b\xe1Mc\xf6g\xcf\x9c\x99{\xe6\xc9\x1f\xfc\xa7\xa3\ \xcf=\xff\xcd\x95\xd4s\x07%\xef\xf5\xf8\xc9\x8c\x03\xa5\ \xf9\xdcz\xc7\x1dw|\x82\xd7\xcdo\xc6%|\x84K\ \xc5c1\xbb\x83;,)\xee\x0f(\xe6C\xb3\xe4\xe3\ EL\xb4:5\xa9\xe6\xec\x8c|0\xa0\x82ywP\ \xb7U^\xc3T\x85\xe1\x88\x5c\x00\xd6KS\xe3\x0f\xf4\ \xab\x7f\xcbV\xf5n\xdd\x22\x1fnF\xd9\xa0y\xe4\xc5\x17\xffO\xadTy5\xe8\ \xd5\x97\x03\xa6`\x93\x9a\xbf\xa9?\x9du\xd4*\x0d\xa2\ \xb0\xd7\x8d\x81\x0f\xaf\xdd\xb0\xfe\xc6\x15\xc3\xc3\xd7\x03\x94\ \xab\x12\xc9\xd4\xcap$\x9c\xa6\xf1\x8aW\x04\xc3\xdcl\ \x18\xaf\xd0\xb2*\xc1\xfc2m\xab\x0b\xecN?79\ 1q\xf8\xec\xa9\xf1\x83\x5c\x9f\xa6\xfa\xcb\x8a>\xd1\xb2\ \xe4\xfd6\xfex\x9a\xba\x0f\xb7\x97\xc8\xf2\x15\x91\x15\x8c\ \xc3\xe8\x84\x9a\x9c\xc7\xfc=G\xb8=\x90\xc8\xf52\x9b\ 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\ " 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\x07\ \x0e\x95W\x87\ \x00k\ \x003\x00b\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\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\ " 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() examples/widgets/animation/appchooser/digikam.png000066400000000000000000000064061376617013100226120ustar00rootroot00000000000000PNG  IHDR@@iqsBIT|d pHYsu85tEXtSoftwarewww.inkscape.org< IDATx[hUIN&&51^TJ)8"s*a^| }(TJOQ RNA֪^5Qc.F~ a1,XY{ׯ*080GڊAǎS]]iӦ}ᘭ폕W^rA$B۶m[P,͞=eɓ6K.{lٲ!! ,tCٳgϫd2˚C!˗/cxȱ׮]&5 ?BR=;n8qb<ћoذaݘҀ͛79iKϞ=K<@G \ 'qt_H-Zϟ#eА14iҤtɓD hSLƍشiSuq xjժ4a„tƍ4k֬tԩښϟ`zjZpa:{lNwwh/^K۷oo|Ѻ ?[1s޹s+cӃBwѢL3 [n O8~4'~mŊTm0z̙߯Y9}hpBeݻwԩSSWWWzqFlľ> ~ Ma(f˗N===ڿ38bvر͛_mŋoz{{[ϟ?&$Qcmzʮ'wi8DҙL -hQ x?cz>~";loo&2ݻw{_?>;Ԉ 7yxFBtkd=`{n=y 8OHgB=z7صkWMסbL8 69 -0#.yXˈfV$o߾[;wD86TГ'daiܹ)^60`? %j9Κ9@; z`V B$ _o߾Ɛʵ(2d: eІ邐a]jY/^hH>i/2U[@kX< &SaS*M/kJV & ska]hEsG C%ŸڇL `QHUP}GF\a1  A M1֥yZG6~}> i2Fc+31M F2,YB_iFaY\qЬɕuTLkڰG(@!+9 !&/}v8ƨ%X&!PAԿyT&~@M#y0s`ԹC[9 ym 0cc%DY M2fJd5dȘ C&a6pJ|]=9 ԰a1nxyޱ>{QgpV'XV QꎚU:(g1<٢i5` hhJ1pC8q`f,IM>IBݻo)0l`o꫄1|JU>؉uS8\v5 > O@L0\17uwj[eeA2>q@+;B=GOLGgh1PykA 9\3Ju b `jM!@G!<'_wJ5 BXFXTw+@2t6ERaD_O3<)jnn6U E|܃Nz1 aTޡg!ZL'ct qiflH WRDJJs U"' yb1)l1ParT6. T#qjm`FI'T)uwkr$.!އ4͌mZ-*9 KpS9kȘ mc=+N*@=@ o[Ƕ|JNQHi34ydFgh3)}K]"YгI[dZl"؛,nMa~(n굤ypif #1WDž/cRoy(__X2Ue/?D|i>&8XczPW>񾸼A> ~l:œ.E8:ֻ)~!~R,:T@wY̍yKg4t$_ۙOsBeOEq: }`fn<~}AH{`ܳP{̹קil4@#h}Bl@g!TD4Φ4_c bcIENDB`examples/widgets/animation/appchooser/k3b.png000066400000000000000000000200341376617013100216550ustar00rootroot00000000000000PNG  IHDR@@iqbKGD pHYs^tIME9()|IDATx \W_=I.,yxvBd BeNx\UI*TH*U3C*!&Cز xÖ%k=k}۷޷۷;5 J˟w-8Yfk)H8jU\[XX𖗗 .xl) -@$mݺ5{w߽og4]u~qoi4Cc\.*oK`PgW* I٩o=[VXʯRίJ_}Įm۶}4N )UTRjz%@B8U*333{ll>ύONNFn87n~ӟyǎdƯU,TP*# X8 C B Cch<>A!---/]#G|{"ϻ?~hhpM[K0n(yjnvVKK:I J'JՕV*ӥh*P"p,n0rbΖϜ9o|׿,{ƾ/cϞ=]x>LOOM:s&&&4rqk=}Iǧ EˉHT̿[_BE3yέZJrΝ;'?]>|rK@Hf혠 PvqQ.;~Lh2^.ۣ+եX$0lx\ZX 4`)\G+Vkʌ*۫8{_*|/"J+>Z`ŋ:+:K:~f^mۺU7mR"1bE4 qr_Zs>vL рc0bzV*\buYE_ԧ>ɓ'?/@^?g>H&D;16z?/wܣn]ס TjQCKJJtsqnZo2uik/7kKKU JUnᆭXcϟ;W~_[ L_@=W>\|{o §N ¤1&$y"&\nh˫$ <\!l6۷R0C}ĬO]^GuAڱC{WWh8 a W Fu3!)[;"3sZJDB3#JB&ЁZ?Vy{k׮Xn23M{NݫO|n۽G]ZtYaͤE|3oB7m$hjw콌X0l2YZ jNB0ZS=W@e,!#*jX.e_ pm_<[uĿ_ G]bv!hiXe}Ǻ؎S @:BE)5:57'"`Bm!  C.:!fEী|@ s@($mXRCVU4t%ֱq ̛s<󌸿,+ Q rNoI^% WuOUAԳ9̨;z뭷@C0 rБÇ4KNO|Q(xKVe2LjhfV :swnSzh!]35h[5VdV*Fj{vwZ]M< 4%ʕ+s}mTP'O3O5+;dysj4s$~XLS⫤}WCr !!hMyE.¾m%k~S_hCԽyq),/d-&R %.=ң~5lؤgmEǏ+73=۷+ᵘ{m4D 3n]֥#GT^Zj#C 68Xr6+_xAY+5Y`l O| n8Wc1O F7*>0e/Yŀj^d@\?M^\/;KPh21ɉA4X,ok59^,`2'=ݽK]*1Ĥ.ۯj6F'b@%[ls,gxjynZ7YX8@H*?/+>+tL_n?:Ȁsi#a>jR,9O5b6~/\yiY}G/X*)ڷZ /=9::tsLVFIab=5ש^){<T/k8u"ccrR>\).FFFPJQlCF_ yO} *KLB=#al %Y\U }6heD Li˼%CjT)tf/3<+i+m@o !VU,pug0ӑ f,"*)~2u~^d9x/BDNeT-!HV-:2YKv&al.\B E؏ J$i'W.ei'CkWIc8C[?۸U2}{߻Vڒ ͛7hXlsyvNUhi6u5Zr+g08HZh&LwxԽst`<0 }cc~!O«9%?__[9kJ?~H(J cיY,PA$ڥlrTslX2霢k=*j VR SY|ݸU5h\ 1{55K dPHzY){ ,ݖ"[G.ԴlȲmwS W @84<+$>},iQ[6پ̹h0UMp/c90K1U*!UE$"@)uЮ,~&k)L^^]iU,/SVU/M* jKS C.cH]R3UOu_ 6!,8*-RaF`jh7DFM lPBYqQ82jjD0nJm^i^7_hVq:-aqr.7;nY7ʹ~7gE"i+Ľ .LbҰ!F~KYJ7lSjhX)bN"oJR uYz'1$PbT߳UTߣ6ˉGco c6[fh\1>nZ?LbM|>C% L !qqlO䓇yV278q 5%{)waybٖc&=|:P f $^jЫYEh q/0HQ|p-N0XC5"N L0iI\d3ëHIf2JP\ 5=ݝ!U]0fi5:UW-1̶`WAs0Xyy3Qb45G#XAypaIqY@äpQ6a1nW s'Stqʶ7fɖX !15 RМI%Fq2B3-/e—BjA.:؋Ə2OVE ،A`<_g;KhxD.ݪeBxp3*_v"aۂB3i/ v.HP'ZMv@kܣl ܬU7,&Glڠ$/o y bbqJZؓ{}IP你ry(gZ+8ʝY7)Th^Vlc΄"P$sa]2aϱY²/_ 0ƧdfSfK]|x&!v.202۞%ޭUt~&Ks:I ^پ}6g ]viy&0YrSԽi- F=W4c-U{ML.yf,3'^&FvT}0iu -8!w,tic$URzUzw@r#!0ui:]`DSrԶX2ڟW&" Y$u/jIzDW#<8~13z= uwij&Pin/٢=' ť+ 4͉`gef@ `A[ج-GSi N%k)\>ܭ<7Pi|?k6G ҺQEyHdc/?dwD z 0o"BD][vր)@t8R}M1_|3X@MY` ˞ >G~ۃf&]ĝ&`U0YޮUrh 2+~3r:ȼݸB!0 CesJD^lFQ,u?h> E 4e0mxi1ʏ-a̙Iʾ--Y}ʆօDFvk@E",'sͿ}`Сn2._ ō&%MKgDM+' Sa:jJ= /*ZM⚵V,!bw5'1AE:BX!(7FZHgx-Wt.&T8v؉+V!" !kT6)kR]^4%!A~o31L>\sSkq~^G)X@7 Ig( EB{L8أI;>1U ̣8ѿ/|[[% zhic6 < Pǡ$ӰK0աAb 0> y5&wfc.Q6(I]4c2v<O/pTC܄͋<}׻_Kˇ¿I6)JΌ#*'LS"J-S *sPC. ٢+b TkQP PHM@&W#ی&|Qf |PCwݡ,QijzYGWY:a$ihDh7Hb~^))WQm 5UKN7#)g mF/,LN44Vq]{vW:<_?wWJKk]>Dh+{?o~\a"! 3W>}?=eHIj#K[Cvkic`hޣXquїܣMG-GB@?Ɓ}oHӻx?@;w7M&S  YhAaŜ & @ԵJn?|P y`8TYbioxF}t񠪖YMcgϜ{=͕s%Ɍzw|o%|Kc1;,)(CEL:5|0ywPU^T\KSVn"nF٠yOTy5՗`?u* ׍ݰp$Wlв*2m N?791q\ˊ>Ѳ6x脚=G=2Tˠ ׯ߰_7:_S IENDB`examples/widgets/animation/easing/000077500000000000000000000000001376617013100175745ustar00rootroot00000000000000examples/widgets/animation/easing/easing.py000066400000000000000000000234711376617013100214230ustar00rootroot00000000000000 ############################################################################# ## ## 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) def __init__(self, target, prop): super(Animation, self).__init__(target, prop) self.setPathType(Animation.LinearPath) def setPathType(self, pathType): self.m_pathType = pathType self.m_path = QtGui.QPainterPath() def updateCurrentTime(self, currentTime): if self.m_pathType == Animation.CirclePath: if self.m_path.isEmpty(): end = self.endValue() start = self.startValue() self.m_path.moveTo(start) self.m_path.addEllipse(QtCore.QRectF(start, end)) dura = self.duration() if dura == 0: progress = 1.0 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 pt = self.m_path.pointAtPercent(easedProgress) 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 # composition and delegate the property. class Pixmap(QtCore.QObject): def __init__(self, pix): super(Pixmap, self).__init__() self.pixmap_item = QtWidgets.QGraphicsPixmapItem(pix) self.pixmap_item.setCacheMode(QtWidgets.QGraphicsItem.DeviceCoordinateCache) def set_pos(self, pos): self.pixmap_item.setPos(pos) def get_pos(self): return self.pixmap_item.pos() pos = QtCore.Property(QtCore.QPointF, get_pos, set_pos) class Window(QtWidgets.QWidget): def __init__(self, parent=None): super(Window, self).__init__(parent) self.m_iconSize = QtCore.QSize(64, 64) self.m_scene = QtWidgets.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.buttonGroup.setId(m_ui.lineRadio, 0) m_ui.buttonGroup.setId(m_ui.circleRadio, 1) dummy = QtCore.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() curve.setPeriod(value) self.m_anim.setEasingCurve(curve) def amplitudeChanged(self, value): curve = self.m_anim.easingCurve() curve.setAmplitude(value) self.m_anim.setEasingCurve(curve) def overshootChanged(self, value): curve = self.m_anim.easingCurve() curve.setOvershoot(value) self.m_anim.setEasingCurve(curve) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) w = Window() w.resize(600, 600) w.show() sys.exit(app.exec_()) examples/widgets/animation/easing/easing.pyproject000066400000000000000000000001441376617013100230020ustar00rootroot00000000000000{ "files": ["easing.qrc", "ui_form.py", "easing.py", "easing_rc.py", "form.ui"] } examples/widgets/animation/easing/easing.qrc000066400000000000000000000001511376617013100215460ustar00rootroot00000000000000 images/qt-logo.png examples/widgets/animation/easing/easing_rc.py000066400000000000000000000421371376617013100221070ustar00rootroot00000000000000# 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\ $\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() examples/widgets/animation/easing/form.ui000066400000000000000000000135651376617013100211100ustar00rootroot00000000000000 Form 0 0 545 471 Easing curves 0 0 16777215 120 Qt::ScrollBarAlwaysOff QListView::Static false QListView::IconMode false Path type Line true buttonGroup Circle buttonGroup 0 0 Properties QFormLayout::AllNonFixedFieldsGrow Period false -1.000000000000000 0.100000000000000 -1.000000000000000 Amplitude false -1.000000000000000 0.100000000000000 -1.000000000000000 Overshoot false -1.000000000000000 0.100000000000000 -1.000000000000000 Qt::Vertical 20 40 0 0 false examples/widgets/animation/easing/images/000077500000000000000000000000001376617013100210415ustar00rootroot00000000000000examples/widgets/animation/easing/images/qt-logo.png000066400000000000000000000120351376617013100231320ustar00rootroot00000000000000PNG  IHDR.7s`xdIDATxb?>xXfU /y魘?~Q?F[$5)>ҼJxdp>ccfŀg?& 30Bi b/3YTm} /{/aFYEN o0000202p|cz&%u_Gu ^\R8Şpn19$zb?äs&s cgc, !?FF9p 320g```?ӿп? 302pg~!%y_Gu <2w9%pr}pK1bl 0F/!A]p쨻kvp(ֱ $:[^6v:⇲KSxfgL dD$H*0,0.$?"10pp23| R\ ^&> ƪ " _~}`xõ':'nV>gdd`JLL gO"C}2TT0g02TpZb * ??`Xsu"';0M_?1002e   +;^":;pWk_0.P_+?3)$yr-Bt-g``ecdxÒYxU.?~3ASG . e`gddİbCdF3v08@R)j3ɸ3h0H(`u[_0XB3edddx!×_Y a16 c4sMQ3wTŴ4 u8$-e,d<а/m޿A_EDoIL \, 7߃adSdgn T@"T>ɠ !O?BP ܬ ߼X'%,&p%C?"\sg`7/7(03NTɷߟQ<, ? INvN(-diS72?fFf72캽A[|M DCP['6-41Zpwb!ç,ߑ,DzSi(`0)+zN䠶 0 C_Wd!yǁdAW[j"c:"Z8c󶓙|{zMT :]}"? 33pi u *`eb&li:Z")q簗P)lL !"LL cIZ:{@i"8da~ XYeТ8" , ~|g { c`eee`aFv8$-""Xs2220psC~ ;2p edP X>#$r"*2|G8M)!//DϿ ~c`fd!طpd!ᨖ ptT\bB ̍~8 "gda``a`x* a.% ))?3A^BYX믏 ̌dqpFF311 s2z^A.- .Odbf`ï ʚP-{.3 ƑHNLL ,, {"\c``eg`PPg8{2ãW]6H < JB: d`d`b`bbdx;+'/"nصW'X`ufPQa##$$|pEV.V6&߾000@jfXmj%`-'!Uw(4$<"? ~?|I[̂!L/ӧ [=dsa 5ģb 3'O{ pH 30%18:3琚"[৑PgaMF0@V2030{wЃ l| ~fPg= !8,9"j 2, 2 SL5lu-~?U)UU)H)IY>|0l-Y8~ $(бA\X!ޟ }`x:é';|{̆RbYEv@30pp03: Kkf3xY:Buh6m~˗_ /_~ePQfc/>x"089YpGoPdx%MVhoo?3: †YX~Ȍ+a: "y? 2r ~ w71%X1.c````aɟ_ʋLQ?2031pr3p203B' M"k򄑉ׯ ?ePSgezl33< 30|Ϸ4=*Pz=x0"kFn?5p=%Ȁv fSexñ'>xN. l 꺼 cq!ß 1FV+9 ,^60@#2 ጌ g`dptev1{X ~;(x چ< > i2flgmo?3322cbdW SE"8`e< ) Š()g?AG06db?? _LA+RM[bXX";sbX_ff51_1x > fY og_ƿ~3￿ ~,+qNǢ\2dܗz gbzO pH?32de// k^ *!X[$uI^ū 7Eqfbd?&hb?L$%?S3220dafgf*!X[āJW%xnrKGv :, b~sYvf30cw<.(i3Ya}"-s[W5 "9^rc?![bӿ..n+tYBS31"V_ !]C<$yI喹. A@/b?oJ7?v28Foߙ3@2YXy? p=ᖾ#pCW8MQnx-t^b33WfN.VOOui>KRĸepdfb?hÖiٝx<䨞IENDB`examples/widgets/animation/easing/ui_form.py000066400000000000000000000150561376617013100216150ustar00rootroot00000000000000# -*- coding: utf-8 -*- ################################################################################ ## Form generated from reading UI file 'form.ui' ## ## Created by: Qt User Interface Compiler version 5.14.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 * class Ui_Form(object): def setupUi(self, Form): if 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.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.easingCurvePicker.sizePolicy().hasHeightForWidth()) self.easingCurvePicker.setSizePolicy(sizePolicy) self.easingCurvePicker.setMaximumSize(QSize(16777215, 120)) self.easingCurvePicker.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.easingCurvePicker.setMovement(QListView.Static) self.easingCurvePicker.setProperty("isWrapping", False) self.easingCurvePicker.setViewMode(QListView.IconMode) self.easingCurvePicker.setSelectionRectVisible(False) self.gridLayout.addWidget(self.easingCurvePicker, 0, 0, 1, 2) self.verticalLayout = QVBoxLayout() 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.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.setChecked(True) self.verticalLayout_2.addWidget(self.lineRadio) self.circleRadio = QRadioButton(self.groupBox_2) self.buttonGroup.addButton(self.circleRadio) self.circleRadio.setObjectName(u"circleRadio") self.verticalLayout_2.addWidget(self.circleRadio) self.verticalLayout.addWidget(self.groupBox_2) self.groupBox = QGroupBox(Form) self.groupBox.setObjectName(u"groupBox") sizePolicy1 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) self.groupBox.setSizePolicy(sizePolicy1) self.formLayout = QFormLayout(self.groupBox) self.formLayout.setObjectName(u"formLayout") self.formLayout.setFieldGrowthPolicy(QFormLayout.AllNonFixedFieldsGrow) self.label = QLabel(self.groupBox) self.label.setObjectName(u"label") self.formLayout.setWidget(0, QFormLayout.LabelRole, self.label) self.periodSpinBox = QDoubleSpinBox(self.groupBox) self.periodSpinBox.setObjectName(u"periodSpinBox") self.periodSpinBox.setEnabled(False) 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.setMinimum(-1.000000000000000) self.amplitudeSpinBox.setSingleStep(0.100000000000000) self.amplitudeSpinBox.setValue(-1.000000000000000) self.formLayout.setWidget(1, QFormLayout.FieldRole, self.amplitudeSpinBox) self.label_3 = QLabel(self.groupBox) self.label_3.setObjectName(u"label_3") self.formLayout.setWidget(2, QFormLayout.LabelRole, self.label_3) self.overshootSpinBox = QDoubleSpinBox(self.groupBox) self.overshootSpinBox.setObjectName(u"overshootSpinBox") self.overshootSpinBox.setEnabled(False) self.overshootSpinBox.setMinimum(-1.000000000000000) self.overshootSpinBox.setSingleStep(0.100000000000000) self.overshootSpinBox.setValue(-1.000000000000000) self.formLayout.setWidget(2, QFormLayout.FieldRole, self.overshootSpinBox) self.verticalLayout.addWidget(self.groupBox) self.verticalSpacer = QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding) self.verticalLayout.addItem(self.verticalSpacer) self.gridLayout.addLayout(self.verticalLayout, 1, 0, 1, 1) 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) self.gridLayout.addWidget(self.graphicsView, 1, 1, 1, 1) self.retranslateUi(Form) QMetaObject.connectSlotsByName(Form) # setupUi def retranslateUi(self, Form): Form.setWindowTitle(QCoreApplication.translate("Form", u"Easing curves", None)) self.groupBox_2.setTitle(QCoreApplication.translate("Form", u"Path type", None)) self.lineRadio.setText(QCoreApplication.translate("Form", u"Line", None)) 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)) # retranslateUi examples/widgets/animation/states/000077500000000000000000000000001376617013100176315ustar00rootroot00000000000000examples/widgets/animation/states/states.py000066400000000000000000000304531376617013100215130ustar00rootroot00000000000000 ############################################################################# ## ## 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 states_rc class Pixmap(QtWidgets.QGraphicsObject): def __init__(self, pix): super(Pixmap, self).__init__() self.p = QtGui.QPixmap(pix) def paint(self, painter, option, widget): painter.drawPixmap(QtCore.QPointF(), self.p) def boundingRect(self): return QtCore.QRectF(QtCore.QPointF(0, 0), QtCore.QSizeF(self.p.size())) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) # Text edit and button. edit = QtWidgets.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) box = QtWidgets.QGroupBox() box.setFlat(True) box.setTitle("Options") layout2 = QtWidgets.QVBoxLayout() box.setLayout(layout2) layout2.addWidget(QtWidgets.QRadioButton("Herring")) layout2.addWidget(QtWidgets.QRadioButton("Blue Parrot")) layout2.addWidget(QtWidgets.QRadioButton("Petunias")) layout2.addStretch() boxProxy = QtWidgets.QGraphicsProxyWidget() boxProxy.setWidget(box) # Parent widget. widget = QtWidgets.QGraphicsWidget() layout = QtWidgets.QGraphicsLinearLayout(QtCore.Qt.Vertical, widget) layout.addItem(editProxy) layout.addItem(buttonProxy) 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')) scene = QtWidgets.QGraphicsScene(0, 0, 400, 300) scene.setBackgroundBrush(scene.palette().window()) scene.addItem(widget) scene.addItem(boxProxy) scene.addItem(p1) scene.addItem(p2) scene.addItem(p3) scene.addItem(p4) scene.addItem(p5) scene.addItem(p6) machine = QtCore.QStateMachine() state1 = QtCore.QState(machine) state2 = QtCore.QState(machine) state3 = QtCore.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(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(p1, 'opacity', 1.0) state1.assignProperty(p2, 'opacity', 1.0) state1.assignProperty(p3, 'opacity', 1.0) state1.assignProperty(p4, 'opacity', 0.0) state1.assignProperty(p5, 'opacity', 0.0) state1.assignProperty(p6, 'opacity', 0.0) # 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(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(p1, 'opacity', 0.0) state2.assignProperty(p2, 'opacity', 0.0) state2.assignProperty(p3, 'opacity', 0.0) state2.assignProperty(p4, 'opacity', 1.0) state2.assignProperty(p5, 'opacity', 1.0) state2.assignProperty(p6, 'opacity', 1.0) # 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, 'opacity', 1.0) state3.assignProperty(p2, 'opacity', 1.0) state3.assignProperty(p3, 'opacity', 1.0) state3.assignProperty(p4, 'opacity', 1.0) state3.assignProperty(p5, 'opacity', 1.0) 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)) 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)) 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)) machine.start() view = QtWidgets.QGraphicsView(scene) view.show() sys.exit(app.exec_()) examples/widgets/animation/states/states.pyproject000066400000000000000000000000571376617013100230770ustar00rootroot00000000000000{ "files": ["states.py", "states_rc.py"] } examples/widgets/animation/states/states_rc.py000066400000000000000000004271721376617013100222070ustar00rootroot00000000000000# -*- 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$ ## ############################################################################# # Resource object code # # Created: to lokakuuta 14 16:08:44 2010 # by: The Resource Compiler for PySide (Qt v4.7.0) # # WARNING! All changes made in this file will be lost! from PySide2 import QtCore qt_resource_data = b"\ \x00\x00\x1b\x48\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\ \x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x1a\xc5\x49\x44\ \x41\x54\x78\xda\xcd\x7b\x0b\x5c\xcf\xf7\xf7\xbf\xf9\xee\xc6\x30\ \x14\xdb\xd7\xfd\x32\x66\xc6\x66\xc3\xd8\xec\x8a\x51\x51\x2a\x42\ \xae\xb9\x35\x84\xb9\x33\x86\xe6\xba\x94\x6b\xc9\xa5\x74\x2f\x11\ \xa9\x24\x95\x8a\xe4\xbe\xdc\x72\x0b\x45\x49\x4a\x4a\xf7\xcb\xa7\ \xcb\xe7\xf9\x3f\xcf\xd7\x47\xf3\xdd\x77\xdf\xff\x77\xfb\x7d\xc7\ \xf0\x78\x9c\xf5\xde\xfb\xf3\x7e\x9d\xf3\x3c\xe7\x75\x5e\xe7\xf5\ \x7a\x9f\x73\xde\x35\x00\xfc\x65\x5a\xbf\x7e\xbd\xbe\x87\x87\xc7\ \x48\x77\x77\x77\xcb\xad\x5b\xb7\xb6\x5f\xb0\x60\x41\xcd\xff\xf6\ \xfc\xa6\x4d\x9b\x6a\xb9\x07\x44\xce\xf1\x39\x7a\xcf\xca\x3b\x26\ \x65\xa2\x47\x40\xf8\x4f\x32\x76\xd2\xce\x9d\x3b\xad\x5c\x5c\x5c\ \xc6\x0a\x4d\x12\x9a\xbc\x63\xc7\x0e\x5e\x8f\x70\x75\x75\xed\x2d\ \xfc\x9b\x71\xec\xd3\xa6\xbf\x34\x38\x28\x28\xa8\xf6\xee\xdd\xbb\ \x8f\x87\x87\x87\x17\x47\x47\x47\xe3\xe8\xd1\xa3\x90\xbf\x15\xb1\ \xb1\xb1\x5a\xf9\x2d\xf3\xc0\x81\x03\x39\x01\x01\x01\x09\xfb\xf7\ \xef\x4f\x15\xba\x11\x12\x12\xf2\xe0\xd0\xa1\x43\x05\x31\x31\x31\ \xda\x5b\xc9\x77\x50\x5c\x56\xa9\xe8\xc6\xad\x64\xc8\x18\x35\xf6\ \xd4\xa9\x53\x88\x88\x88\x28\x38\x71\xe2\x04\xc2\xc2\xc2\x1e\xc9\ \xb3\xfc\x5b\x10\x19\x19\x09\xa1\x22\xe1\x1b\xb7\x61\xc3\x86\x56\ \x2f\x84\x01\xbc\xbd\xbd\x03\x05\x60\x85\x28\x19\x2b\x33\x64\x2d\ \xb3\x38\xd5\xc7\xc7\x67\x9d\xbf\xbf\x7f\xe0\xae\x5d\xbb\xa2\x45\ \xe1\xdb\x02\xf8\x4a\x58\x70\x60\x8e\xb7\xdd\x92\x87\x7b\xf7\x05\ \x95\xee\xda\x1d\x58\xe6\xe2\xb9\xb7\x6c\xf9\xd6\xb0\xf2\xb9\xce\ \xa7\x2a\xe7\x6f\x3b\x53\xb9\xd6\x3d\xae\x6c\x93\x67\x4c\xe1\x36\ \x8f\x43\x99\xde\x1e\x81\x57\xc3\x67\x98\xaf\xda\xe3\xb0\x6c\xa2\ \xf0\x1c\xec\xe7\xe7\x37\x55\xe4\xcc\x17\x9e\xbb\xf6\xed\xdb\x77\ \x4e\x8c\x53\x29\xc6\xaa\x14\x6f\x19\xf2\x5c\x0d\x20\xb3\x50\xff\ \xd8\xb1\x63\x5a\x01\x75\xea\x3f\xfd\x7e\xd2\xb0\x51\x97\x63\x03\ \x1a\x6e\x3a\x32\x50\x2f\x39\x66\x60\x43\xed\xd1\xc1\x4d\x71\x39\ \x25\x1f\x57\xd3\x0a\x90\x78\xaf\x08\xc9\x19\x45\xb8\x9d\x49\xd2\ \x5d\x27\x09\xdd\xb8\x57\x88\xab\x77\x0b\x70\x6d\x58\x6b\x24\x98\ \xbc\xa5\xfd\xc5\x50\xff\x97\xf3\x06\x7a\x0b\xe3\xfb\xe9\x75\xa8\ \xe6\x2b\x4b\xac\x63\x70\x70\x70\x8a\x78\x5d\xce\x73\x35\x00\xd7\ \xac\xb8\x6c\x95\xa7\xa7\xa7\x55\xf5\xbd\xab\xfd\xeb\x35\x8c\x37\ \xd2\x5f\x15\x6f\xa0\x77\xfb\xe2\x80\x46\xb8\x36\xb8\x09\x6e\x8d\ \x68\x89\x3b\x56\xef\x20\xcd\xe6\x43\x64\xe7\x97\x21\xb7\x50\x83\ \xfc\xe2\x72\x14\x94\xe8\xa8\xb0\xa4\x82\x7f\xd5\xbd\xdc\x22\x0d\ \x72\x0a\x34\xb8\x3f\xf3\x63\xa4\x59\x77\xe0\x38\x8e\x57\x7c\xce\ \x0d\x68\x7c\x9b\xbc\x29\x43\x8c\x1e\x15\x17\x17\xa7\x7d\xae\x06\ \x10\x97\xdc\x2d\x6b\x1c\x02\xa6\xd9\x49\x8b\x66\xb5\xe2\x0d\xf4\ \x17\x9d\x33\xd0\x2f\xb8\x6c\xfa\x36\x6e\x5a\xb6\x40\xca\xf8\x76\ \xb8\x3f\xf5\x7d\x3c\x9c\xd5\x05\x39\x0b\x7b\x20\x6f\x65\x5f\x54\ \x54\x56\xa1\xb2\x4a\x8b\x2a\x92\x56\x0b\xad\x22\x5e\xab\x7b\xfc\ \x4d\x3d\x93\xb7\xd6\x08\xb9\xb6\x5f\x72\x1c\xc7\x93\x0f\xf9\x29\ \xbe\x97\x4c\xdf\x2e\x88\x99\x63\x71\xed\x60\x70\x60\xf1\x73\x35\ \x80\xaf\xaf\xef\x51\x59\x9f\xda\x0b\x03\xdf\x9a\x28\xca\x3f\xa0\ \xe2\xb7\x46\xb6\xc2\xdd\x49\xef\xe2\xc1\xf7\x1f\x20\xe7\x07\x51\ \x7a\x45\x6f\x14\x38\x0c\x40\xd1\x96\x21\x28\x71\xb3\x42\x59\x05\ \x50\xa2\x01\x8a\x84\x0a\xcb\x74\x54\x50\xaa\xfb\x5b\x24\x54\x2c\ \xf7\x4b\xcb\x85\x7c\xbf\x43\x89\xcb\x48\x8e\xe3\x78\xf2\x21\x3f\ \xf2\x25\x7f\x25\xe7\xfc\xf0\x76\xda\xf3\x06\x0d\x27\xec\xb1\xa8\ \xf1\x8f\xe7\x62\x00\xb7\x2d\x9b\x6e\x6e\x75\x72\xc2\xa5\x81\x8d\ \x38\x33\x0a\x58\xd6\xcc\x0f\xf1\x68\xc9\xe7\xc8\xb7\x33\x50\xe0\ \x4b\xdd\xc7\x42\xe3\x3f\x19\x15\x41\xb3\x50\x19\xb9\x04\x0f\x0b\ \x81\x07\x05\x40\x46\x3e\x70\x3f\x0f\x48\x57\xa4\xbb\xce\x10\xca\ \x94\xfb\x59\xf2\x4c\xd5\xd1\x15\xa8\x0a\xff\x81\xe3\x38\x9e\x7c\ \xc8\x8f\x7c\xc9\x9f\x72\x28\x8f\x72\xb9\x34\xae\x9c\x37\xaa\xdf\ \xf2\x6f\x35\xc0\x39\xc3\x06\x9f\x3b\xaf\x58\xa4\xdd\xb0\x7e\x3d\ \x6e\x5b\xb5\x45\xe6\xf4\xce\x78\xb4\xf8\x53\x9d\xe2\xce\x43\x51\ \xe6\x33\x11\x15\xfb\x67\xa2\x2a\x62\x11\x10\xb3\x0c\x88\x5e\x02\ \xed\xe1\x1f\x71\xfb\x21\x90\x94\x05\xdc\x7c\x00\xdc\xc8\x04\x12\ \x9f\x90\xba\x77\x4b\x7e\x4b\x96\x67\xb4\x11\x0b\x80\xc8\x85\x1c\ \xc7\xf1\xe4\x43\x7e\xe4\x4b\xfe\x94\x43\x79\x94\xab\xe4\x27\x98\ \x35\xcd\x25\xa6\xbf\xc5\x00\xbf\x18\xea\x4d\x3c\x6f\xa8\x5f\xe1\ \xb2\x6a\x11\xdc\x76\x6c\x45\xf6\xdc\x8f\x65\x7d\xf7\x41\x91\xd3\ \x60\x94\x79\x4f\x50\xb3\xa6\x7d\xac\x34\x22\x45\x91\xb0\x19\x40\ \xd0\x04\x68\x03\x46\xe0\xd2\x3d\xe0\xc2\x5d\xe0\x5c\x2a\x10\x9f\ \x02\xfc\xf2\x84\xd4\xbd\xf3\xf2\xdb\xc5\x34\x40\xeb\x63\x02\xec\ \xb6\xe0\x38\x8e\x27\x1f\xf2\x23\x5f\xf2\xa7\x1c\xca\xa3\x5c\xca\ \x57\x01\x33\x71\x58\xf3\x0a\x62\x7b\x66\x06\x90\x47\x5f\x3a\x6b\ \xa0\xb7\xe9\x82\x91\xbe\x8a\xcc\xbe\x9b\xed\x10\x12\x1c\xa4\xd6\ \x68\x89\xeb\x28\x94\xef\x9d\xc6\x59\xd6\x29\x1e\x31\x0f\x08\xf9\ \x4e\xa7\x84\xdb\xd7\xc0\xe6\x0e\xa8\x5a\xd3\x08\xc7\x93\x80\x63\ \x37\x81\xa3\x37\x80\x23\x42\x31\x89\x5a\x44\x5f\xd7\xf2\x5a\x51\ \xac\xfc\x76\xfc\x16\x50\xb1\xec\x75\x60\x65\x5d\x8e\xe3\x78\xf2\ \x21\x3f\xf2\xad\xf6\x26\xca\xa3\x5c\x25\x3f\x67\x51\x4f\xa4\x4f\ \xe9\xa8\x70\x9d\x35\x6c\xb4\x89\x58\x9f\xba\x01\x4e\x19\x34\xb6\ \xbb\x38\x40\x1f\x49\x12\x80\x32\xa6\x75\x82\xff\x16\x3b\xec\xf7\ \xf7\x56\xb3\x51\x19\x3a\x57\xb4\x59\xaa\x73\xdb\x03\x53\x00\xff\ \xc1\xc0\xb6\xee\xc0\x9a\x86\xa8\x5a\x5c\x03\x9a\x85\x35\x51\xb4\ \xe0\x0d\x04\x9e\x2b\x83\xff\x99\x12\x78\x9f\x28\x82\x47\x5c\x21\ \xdc\x8e\x15\x28\x72\x97\x6b\x2f\xb9\xe7\x77\xaa\x18\x7b\xe3\x4b\ \x51\x30\xaf\x0e\x4a\xe6\xfe\x83\xe3\x38\x9e\x7c\xc8\x8f\x7c\xc9\ \x9f\x72\x28\x8f\x72\x95\xfc\xc2\x4d\xa6\x78\xb4\xf4\x0b\xe2\x52\ \xf8\x4e\x19\x35\xb6\x7b\xaa\x06\x38\x6d\xa8\x37\xe2\x82\xa1\x1e\ \x99\x73\xdd\xa9\x2d\x2a\xd8\xcf\x1d\xe1\x07\xf6\x73\x7d\xea\x66\ \x3d\x7c\x36\xb0\x77\x24\xe0\xda\x0b\x58\x5d\x1f\x95\x8b\x5e\x42\ \xe9\xfc\x9a\x28\x9c\xf5\x32\xb2\x6c\xea\xe0\xe6\xc4\x36\xd8\x28\ \x67\x97\xb5\xa1\x59\x58\x15\xf4\x00\x3f\x05\x66\xc0\x76\x5f\x06\ \x96\xed\xbd\xaf\xae\x57\x06\x65\xe2\xe7\x90\x2c\xac\x0f\xcb\x46\ \xe2\x84\x36\xc8\x9c\x5c\x17\x79\x33\x5e\xe1\x78\xf2\x21\x3f\xf2\ \x25\x7f\xca\xa1\x3c\xca\x55\xf2\x35\xbb\xbe\xe3\x92\x20\x2e\xe2\ \x53\x38\x89\xf9\xa9\x18\xe0\xac\x91\x7e\xb7\x73\x06\x7a\xe5\x37\ \x2d\x5b\xd2\xc2\x14\xa2\x22\x72\x58\xa0\x3f\x0e\xf8\xb9\x00\x51\ \xe2\xf6\xa1\x36\x80\x9f\x09\xb0\xa1\x2d\xaa\x7e\xac\x81\xb2\xc7\ \x8a\xdf\x9b\x5c\x1f\x97\xc6\xb6\xc1\xa9\x51\x9d\x71\x7a\x54\x27\ \xcc\xf1\xbe\x8b\x99\x3b\x2e\x6b\xa7\xd9\x47\x95\x58\x2d\xd9\xf5\ \xd0\x74\x86\xd3\x6d\xb3\xe9\x4e\xb7\xc7\x2d\xf1\xcb\xb6\xb1\x8f\ \x2c\x9d\xb1\x2d\x41\x3b\xd3\x33\x85\xcf\xaa\x31\x17\xc7\xb4\x45\ \xea\xc4\x06\xc8\x9d\xf6\x2a\xf9\x91\x2f\xf9\x53\x0e\xe5\x51\xae\ \x92\xaf\x8d\x5a\x02\xcd\xee\x29\xc4\x45\x7c\x0a\xe7\x75\xcb\x96\ \xe5\xc4\xfe\x97\x0c\x10\xdf\x5f\xff\x9f\x67\x0c\xf4\xb3\x13\x87\ \x36\xe3\x1a\x53\x5b\x50\x91\xa3\x39\x72\xbd\xac\x71\x3c\x2e\x0e\ \xe1\x5e\x1b\x80\x10\x6b\xc0\xa3\xaf\x9a\x9d\xf2\x1f\x5e\x42\xf1\ \x9c\x7f\x20\x6b\x6a\x6d\x9c\x1d\xd5\x16\xc7\x2c\x3b\x2a\x8a\x1b\ \xde\xae\xd2\x75\x60\xbb\xb4\x6f\xbe\xec\x73\xe0\xe3\x8f\x3f\x76\ \x16\x5a\x2f\xb4\xea\xa3\x8f\x3e\x5a\x4a\xe2\x35\xef\xf1\xb7\xde\ \x5f\xf5\x3e\xb0\xd5\xa8\x5d\xca\x91\xa1\xed\x2b\xaa\xc7\x9f\x19\ \xf9\x0e\xd2\x27\xd5\x41\xde\xf4\x57\xc8\x9f\x72\x28\x8f\x72\x75\ \xf2\x0f\x2f\x62\x80\xa4\x11\x88\x8f\x38\x15\xde\x04\x8b\xe6\xd9\ \xd4\xe1\x7f\x36\xc0\xf1\xfe\x8d\x4e\x5f\x31\xfb\x27\xf7\x5c\x75\ \x10\x29\xdc\x38\x08\x65\x7e\xd6\x38\xed\xb7\x06\x91\x11\x11\xb8\ \xea\xbb\x10\xd8\xf9\x25\x60\xfb\x0a\x34\x0b\x64\xd6\x67\xbe\x8c\ \xd4\x49\xf5\x70\x74\xf8\x3b\x88\x1e\xd6\x0e\xe1\x43\xda\x94\x2c\ \xeb\xd3\x2e\xbe\x6b\xd7\xae\x1b\x44\xb9\x39\xa2\xec\x10\xb9\xfe\ \xec\x43\xdd\xbf\x76\x5d\xba\x74\x69\x4a\xe2\x35\x6f\xf0\x37\x3e\ \xc3\x67\x39\x66\xda\x57\x1d\x8f\x1f\x1c\xdc\xa6\x98\xbc\xc8\x33\ \x79\x5c\x7d\xe4\x4c\x7d\x8d\x72\x28\x8f\x72\x75\xf2\x83\x27\x01\ \x51\x8b\xe9\x09\xc4\x47\x9c\xc4\xab\x70\x9f\x19\xd4\xe4\xf4\xff\ \x64\x80\xb8\x7e\xfa\xc6\x8c\xf8\xc9\x63\xda\x20\x7b\xce\x47\xc8\ \x5f\x6b\x88\x52\xcf\x71\x28\x0d\x5b\x8c\xa8\x88\x30\x84\xca\x12\ \xd0\xee\xfc\x1a\x58\x56\x53\xb9\x66\xfe\xf7\xaf\xe0\xfa\xb8\x06\ \x38\x64\xd1\x06\x91\x16\xad\xb4\x73\xbe\x69\x7f\x56\x94\x58\x2b\ \x0a\x0e\xa7\x72\xa2\x94\xbe\xd0\x2b\x7f\xe4\x92\x7c\x86\xcf\x72\ \x0c\xc7\x92\x87\xcd\x97\x1d\x4e\x46\x0c\x69\x5d\x45\xde\x97\x47\ \xeb\xe1\xe1\xe4\xd7\x28\x8f\x72\x29\x9f\x3b\x05\x3d\x81\x31\x81\ \x07\x28\xe2\x24\x5e\xe2\x56\xf8\xe3\x0c\xdf\x36\xfe\xbf\x19\xc0\ \xb6\x46\xcd\xe3\xfd\x1b\xa7\xca\xde\xaa\x5b\xf7\xcb\xbf\x91\xa3\ \xe9\x08\x54\x84\xcc\x46\xd4\x3e\x0f\x99\xfd\x70\x9c\x71\x9e\x0c\ \x2c\x7f\xfd\x57\xe5\xcf\x8f\xd6\x47\xc8\xe0\x96\x08\x1d\xdc\x5c\ \x63\xdc\xb3\x93\xb7\xcc\xe4\x58\x51\xa4\xb3\xd0\xeb\xff\xeb\x29\ \x8d\x63\xc9\x83\xbc\x8c\x3e\xe9\xec\x15\x6a\xde\xa2\x92\x32\xce\ \x8e\x68\x84\xac\xef\x5e\xaf\x36\x82\xc2\x01\xaf\xfe\xc0\xc1\x69\ \x34\x02\x71\x12\x2f\x71\x2b\xfc\xf1\x43\x5a\xa6\x52\xa7\x3f\x6d\ \x80\x98\x7e\x8d\xa7\x26\x18\x37\xe6\x0b\x08\x5f\x48\x64\x9b\x31\ \x83\x66\x8f\x0d\x0e\x07\xec\x54\x89\x8b\x88\x1d\xb6\xa8\x5c\xdd\ \x48\xb9\x61\x81\x80\xb8\x39\xae\x2e\xf6\x99\x35\x83\xe7\xc0\x66\ \x0f\xbb\x75\xe9\xb2\x46\x66\xee\x2b\x01\x5e\xf7\x69\x25\x2d\xc8\ \x8b\x3c\x47\x0f\x1b\x7a\x29\xd0\xbc\xb5\x96\xb2\xae\x8e\xac\x47\ \x23\x50\xbe\xc2\x81\x9f\x1b\x01\x7e\xa6\x40\xf8\x1c\x9e\x1e\x89\ \x97\xb8\x89\x5f\xe9\x71\xd4\xe8\xed\xa9\x7f\xca\x00\x47\xbe\x6e\ \xf5\xfa\x29\x83\x46\x8f\x6e\x0c\x6f\x81\xcc\x19\x9d\x91\xbf\xe6\ \x5b\x14\x7a\x4c\x40\xa0\xef\x4e\x04\xf8\xfb\x21\xcc\xdd\x1e\x9a\ \xf5\x1d\x50\x21\x81\x88\x91\x39\x53\x40\xec\x37\x6b\x2c\xca\x37\ \x79\x24\x20\x17\xca\x6c\x75\x11\xc0\x2f\x3f\xed\xd4\x15\x79\x3a\ \x38\x38\xc4\x2e\x5e\xf4\x03\x7c\x07\x34\xc9\x0f\x34\x7d\x0b\xa9\ \x63\x6b\x73\x39\x10\x87\xc2\x03\xc7\x8e\x40\xe0\x18\x06\x45\xd9\ \x1e\x65\x29\x78\x8c\x25\x7e\xa5\xc7\xc5\xa1\xad\x1e\x51\xb7\x3f\ \x34\xc0\xa1\x7e\x8d\xe7\x5d\xaa\x9e\x7d\x9e\xb0\x9c\xc7\x62\xfb\ \xe6\x75\x70\x74\x74\xc4\x41\xd7\x35\x28\x75\xee\x05\xed\x92\x1a\ \x28\x96\x83\x4a\xce\xd4\x57\x11\x65\xd1\x00\xfe\x26\x8d\xca\x7b\ \x7c\xd4\xd9\x56\x40\xbe\x23\xa4\x4e\x61\xcf\x82\x24\xf7\xb0\x55\ \xa8\xf8\xf3\x5e\x9f\xae\xf3\x1c\xf0\x56\x59\x84\x59\x43\xa4\x8f\ \xaf\x45\x1c\xc4\x43\x5c\x8c\x07\x8f\x97\xc2\x52\x94\x07\xce\xe0\ \xf9\x80\x7a\x28\x7d\x82\xe6\x8e\x4a\x92\xd7\xf8\x63\x92\xad\xf2\ \x93\x3c\x66\xad\xff\x68\x80\xf0\x7e\x6f\x5d\xe1\xb6\xc7\xb5\x93\ \xb0\x61\x12\x7c\xbc\xbd\xb0\x6d\xeb\x56\x1c\xdb\x3e\x4f\x82\x8b\ \x29\xb0\xf6\x6d\xba\x9c\x3a\xa4\x5c\x1e\xf3\x06\xbc\x06\xd6\xd7\ \x8e\xe8\xf5\x9e\x97\x04\xab\xce\xcf\x52\x79\x92\xa4\xc8\x4c\x0e\ \x1e\x3c\x88\xd5\xab\x57\x7b\x9a\xf4\xe8\xec\xea\x31\xa0\x81\xf6\ \xdc\xb0\x7a\xc8\x9c\xf4\x3a\xf1\x10\x97\xc2\x87\x3d\xc3\xd5\x69\ \xb1\x2a\x72\xb1\xf2\x82\xbc\xd5\x7d\x95\x3e\x31\xe3\x3f\x45\x68\ \x68\x68\x16\x73\x96\x7b\xf7\xee\x8d\xfa\x9d\x01\x0e\x7e\xd1\xf4\ \xcd\x78\x43\xbd\x4a\x46\xce\xa8\x8d\x0b\x21\x09\x4c\x04\xf8\xb8\ \x23\xd1\x7b\x36\x2a\x82\xac\xb9\xe5\xa8\x83\x48\xd1\xec\x97\x95\ \xeb\x05\x0e\xaa\x8b\xc5\xbd\x9b\x9f\x13\xe5\x3f\x17\xe5\xd5\x7b\ \xf9\x33\xa6\x9a\x32\x7b\xd9\x92\x84\x29\x96\xe5\x70\x7b\x89\xf1\ \x47\x8f\x02\x8c\xeb\x21\x4d\xb7\x14\x88\x8b\xf8\x88\x53\xe7\x05\ \x31\xe2\x05\x01\xd3\xd4\x51\x39\x7b\x7e\x37\xdc\x1c\xdd\xa6\x92\ \x3a\x06\x06\x06\x9e\x92\x94\x5a\xe9\xef\x0c\x10\xf0\x6d\x13\x9b\ \x4b\x66\x4d\x64\x9d\x3b\x21\x3a\xe2\x10\x22\xf6\xf9\x22\xdb\x7b\ \x12\xb4\x3c\x7b\xef\x1b\x05\x38\x34\xa7\x95\xd5\x81\x24\x6d\x5c\ \x6d\xb8\x18\xd4\xad\x10\xc5\xc7\x09\x29\x77\xfa\x3b\x48\x92\xae\ \xef\x4b\x32\xe6\xba\x64\xa3\x35\x4b\x96\x2c\xd1\x6c\x37\x68\x80\ \x5b\x96\x75\x90\x31\xa1\x16\x71\x11\x1f\x71\x12\xaf\x3a\x1b\x54\ \x1e\x9c\xaf\xdb\x11\x96\x7d\xa9\xde\x1a\x83\x8c\x9a\xd9\xc8\x32\ \xd8\xca\xac\xb3\xa4\xdb\xbb\xfc\x86\x79\x88\x49\xfb\xb3\xa1\x5e\ \xdb\x21\xc9\x4e\x1c\xdd\xb9\x1a\xf9\x2e\xc3\xb8\x96\x74\x91\xd5\ \xdb\x88\x6b\x4c\x9d\xc4\xb2\xa7\xbc\x86\x93\x43\x6b\xe1\xe7\xde\ \x8d\xae\x75\xeb\xd6\xad\x2d\xc7\x3e\x0f\xea\xd5\xab\x57\xbb\xc5\ \x5f\xbe\x7d\xf1\xe8\xa0\x37\xe8\x05\xc4\x45\x7c\xc4\x49\xbc\xd5\ \x3b\x82\xca\x23\xe4\xff\xdc\x5f\xbd\x27\x44\x9a\xb6\x3a\x21\xf9\ \xcc\x91\x92\x6a\xcf\x17\x03\x8c\x79\x92\xe1\x59\x35\xad\x76\xb0\ \xe7\x0e\x6d\xe4\xa1\x30\x9c\x58\x37\x1d\x79\xeb\x0c\x51\xbe\x47\ \x05\x13\xdd\x1b\xd8\xd6\xae\x8c\xb4\xdc\x76\xd4\x9a\xf3\x1f\xf0\ \x5a\x95\x51\x8f\xce\x56\xd5\x87\x9b\xe7\x41\x94\xfd\x59\xf7\x0f\ \x47\xee\xfc\xb6\xb6\xe6\xce\xc8\x3a\xc4\x45\x7c\xc4\x49\xbc\xc4\ \x4d\xfc\x5c\x06\x3c\x1d\xaa\x83\xd1\x95\x91\x6d\x4a\xdd\x5d\xb6\ \x7e\x45\x0f\x90\x98\x62\xfb\x2b\x33\x2f\x57\x97\x98\xa8\xc8\x70\ \xc4\xba\xac\x46\xde\x8e\xc9\x28\xde\x6f\x8b\xb2\x38\x67\x94\x9c\ \x71\x43\xe1\x61\xb9\xe7\x31\x14\xe9\xf6\x5f\xe1\xfa\xb2\xaf\x70\ \x66\xf6\xd7\xd8\x34\xa0\x69\x56\xf7\xee\xdd\x55\x81\xe2\x79\x12\ \x31\xd8\xf5\x6b\x9e\x71\x64\x72\x6f\x9c\x9f\xf7\x0d\x92\xe4\xf0\ \x93\xb5\xfe\x1b\x14\x78\x0e\x45\x71\xd4\x6a\x68\xce\xba\xa1\xfc\ \xb8\x33\x4a\x83\x6c\x91\xbb\x7d\x0a\xee\xac\x18\x0e\xd7\x85\x53\ \x4c\x59\x74\x91\x7a\xc3\x7a\xdd\xec\xbb\xb9\x19\xf1\x80\x13\x7e\ \x38\x86\xe9\x69\x66\x68\x99\xa4\x64\xee\x8e\xa9\x2a\x66\x6b\x54\ \x12\xc3\x57\xde\xd7\xd7\x84\x3c\xc0\xd4\x9d\xb7\x31\x7a\xd4\x8c\ \x48\x99\x81\x3a\xcf\xdb\x00\xc4\x30\x76\xd8\xd4\x18\x2b\xe7\x5b\ \x58\x12\x70\x1f\x2e\x47\xf3\x11\x71\xa5\x12\x67\xee\x00\xd7\xee\ \x03\x69\x8f\x80\xdc\x12\x40\x92\xcd\x28\xd5\x54\x22\x3d\xa7\x04\ \x01\x1b\xec\x1c\x58\x71\x92\x78\xe2\xa1\x98\x48\x76\x37\xea\xe0\ \xc1\xd0\x8a\xc4\x94\x2c\x14\x95\x56\x00\xd0\x65\x6b\xd3\x73\x81\ \xc4\x0c\x95\xb2\x62\xe6\x86\xc9\x0b\xf5\x0e\x3f\x7e\xdb\x2d\xf4\ \x1a\x64\x33\x53\x84\x73\xfc\x73\x25\x62\xf8\xca\xc4\x7a\xee\xf0\ \x4d\x89\x98\xef\x97\x86\x2d\x87\x73\x71\xe0\x62\x39\x4e\x26\x03\ \x97\xd3\x81\x94\x1c\x20\xa7\x08\x28\xaf\x04\x34\x15\x55\xc8\xca\ \x2b\xc3\x01\x27\x87\x7d\xb2\xc3\x15\x8a\xde\xbe\x8a\xc9\xe1\xc3\ \x87\x35\x41\x7b\xf6\x14\xdf\xcb\x2e\x41\x89\x58\x49\x1c\x00\x79\ \x25\xb4\x9e\xce\x8a\x67\x6e\x03\xe1\x62\xd5\x1d\x47\xf2\xb0\x78\ \x77\x3a\x46\x3b\x5e\xc7\x07\x9f\x7e\xdb\x89\x63\x5f\x04\x22\x96\ \xc1\x0e\x09\x98\xe5\x95\x8a\x0d\x87\xb2\x99\x79\x62\xfa\x8d\x39\ \x48\x26\x62\x25\x1b\x4d\xe5\x69\x84\x2a\x55\x9c\x89\x74\x75\x3a\ \x23\x75\x46\xad\x18\x60\x6f\x0d\x9f\x98\x3b\xd3\xf2\x0a\x4b\xb5\ \x73\x37\x86\x97\xdd\xcf\x29\x45\xa9\x98\x8a\xee\x92\x5b\x0c\xa4\ \xe6\x00\x57\xd2\x81\x53\x62\x80\xd0\x4b\xe5\x70\x8e\xca\xc5\x82\ \x5d\x69\x18\x63\x77\x5c\x23\x96\x7f\xfb\x45\x31\x00\xb1\x8c\x5e\ \x1e\x5d\x35\xdd\xfd\x0e\xec\x43\x1f\x62\xcf\xd9\x52\xc4\xdd\x62\ \x82\x55\x97\x65\xce\x2a\x50\xf5\x06\x16\x5d\x54\xe5\xc9\x6b\xef\ \xb1\xbc\xf4\x07\xb9\xd8\x15\x1c\x73\xb2\x86\x94\xa8\x67\xb2\x42\ \x3b\x7f\x63\x74\x69\xe6\xa3\x52\xba\x89\x3c\x08\x3c\x2a\xa6\xfb\ \x28\x37\x52\xee\x14\x22\x6e\xe5\x18\xf9\x08\xf3\x7c\xef\x62\xc4\ \xb2\x90\x1c\x11\xaa\xf7\x02\x19\x40\x6f\xd2\x42\xdf\x32\x1b\xb7\ \x3b\xb0\x3b\x90\x85\x5d\xa7\x4b\x98\x7c\x65\x06\x5a\xa5\xe1\x1f\ \xfc\x8b\x01\x1e\x15\x6a\xe0\x19\x1c\xaf\xa1\x21\xfc\x0e\xc4\x9d\ \xf8\xd5\x00\x0b\x36\x46\x56\x3d\x31\x00\xd7\xcd\x6f\x0d\x10\x7c\ \x41\xa3\x0c\x30\xd7\xe7\x2e\x46\xae\x88\xc8\x17\xa1\xf5\x5e\x20\ \x03\xd4\xb3\x5a\x1c\x58\xce\xe0\xcc\xbc\x22\x0d\x10\xfb\x6f\x06\ \x28\xf9\x57\x03\x04\x9d\x2d\xa7\x01\x7c\x82\x8f\x45\xd1\x00\xb5\ \xf7\x05\x06\x6e\x3e\xb8\xd3\x55\xfb\x67\x3d\xc0\xd2\xfe\x5c\xa5\ \x08\x7d\xe3\x05\x32\xc0\x1b\x83\x57\x9e\xd6\xd2\x00\x7f\xc6\x03\ \xc2\xbd\xdd\xb3\x25\x06\x94\x78\x78\xf9\xac\xa9\x7e\xcb\x0a\x0e\ \x72\x74\xa8\x62\x0c\x28\xfb\x4f\x31\x20\xf9\x49\x0c\x60\xa4\x65\ \xc4\xfd\x6c\xac\x7d\xdb\x17\xc5\x00\x5d\x87\xd9\xb7\x35\xb1\xbb\ \x8c\xea\x18\xb0\xfb\x4c\xc9\x7f\x8d\x01\x41\xae\x5b\x1e\xf0\x20\ \xb4\x7d\xfb\xf6\x41\x8a\x81\xbc\x5c\xdc\xf5\x72\x58\x55\xf6\xef\ \xbb\xc0\xdd\x7f\xd9\x05\x0e\x5d\xae\xc4\xf6\x98\x3c\x2c\x92\x5d\ \x60\x94\xd3\x0d\x18\x4e\x71\x35\x7f\x51\x0c\x60\x69\xf5\xd3\x78\ \xf3\x75\x57\x7f\xdd\x05\xf6\xc5\xff\x7e\x17\x28\x7b\xb2\x0b\x48\ \x3d\xc3\xaf\x58\x5e\x88\xd2\xbd\xbc\xbc\x6a\xd5\x90\x7e\x9e\x97\ \xa5\xcc\xad\xd9\xbc\x62\xd9\x9d\x3b\xf1\xa7\x91\x97\x78\x1e\x95\ \xf7\xae\xa1\xf0\x5e\x12\x1e\xa6\xa5\x21\x25\x39\x15\x57\x2f\xdf\ \xc0\xd9\xb8\x93\x08\x0a\x3a\x82\xad\x6e\x87\xb0\xd4\x3e\x10\x8b\ \x26\x4c\x77\x79\x51\x0c\xf0\xc3\x28\x6b\x9f\x39\x2b\xf6\x62\xdd\ \x96\x50\xec\xf2\x8f\x46\x6c\xd4\x09\x24\x9c\x3e\x8d\xa4\xc4\x1b\ \xc8\x48\x4d\x45\x7e\x46\x1a\x34\x99\x49\x28\x4d\xbd\x82\xb8\xb0\ \x03\x38\x79\xf2\x24\x0f\x41\xfe\x1c\xcb\x46\x87\xc9\x62\x8d\xaa\ \x79\x53\xac\x9d\x98\x34\x48\x9d\xd8\x5e\xa5\x95\x8b\x77\x58\xa2\ \x32\x6c\x01\xb3\x2b\x7c\xbf\x56\x69\xe8\xd2\x79\xba\x24\xc8\x3d\ \xab\xda\x38\x66\xaa\x77\xfd\x45\x31\x40\x48\xbf\xb7\xcf\xde\x1c\ \x5a\x8f\xb8\x88\x8f\x38\x89\x97\xb8\x89\x5f\xe9\x51\xec\x32\x42\ \x8e\xf9\xab\x10\x19\x7e\x08\xfe\xde\xee\xf7\xc5\xfd\xd5\x3b\x0c\ \x5f\x2f\x83\xa5\xc7\x47\x6b\x6e\x6e\xde\xf3\xaa\x55\x7b\x0d\xbb\ \x32\x72\x16\x7e\xc2\xfc\x3a\x2b\xb2\x4c\x32\xb2\x48\xc9\x3a\x1d\ \x4b\x55\x4c\x3c\xa8\x57\xcf\x24\xcb\xba\x38\x6d\xd4\xa0\xc3\xf3\ \x56\x3e\xb6\x6f\xa3\xd6\x17\x07\xd5\xaf\x4c\x16\x3c\xc4\x45\x7c\ \xc4\x49\xbc\xc4\x4d\xfc\xc9\xbb\x97\x22\x6c\xaf\x0f\x22\xc2\x0e\ \x62\x97\xb3\x03\x46\x0d\x1e\xd4\xa3\x7a\x3c\x1b\x9d\xa2\xe4\x44\ \x74\x5f\x22\x69\xe3\xfd\xa6\xed\x92\xef\x8c\x6b\xc7\xfa\x3b\x8b\ \x8e\xac\xcd\xf3\x75\x92\x15\x5a\x95\x64\xa8\x94\x3a\x1d\xf3\x6f\ \x4c\x46\xa6\x8e\x7e\x03\xa7\x4c\xf5\xdc\x9f\xaf\x01\x58\xbb\xd0\ \x0f\x4a\x1c\xfc\x26\xf1\x10\x17\xf1\x11\xa7\xe0\x95\x17\xb7\xc0\ \x95\x88\x3c\xb0\x17\xf2\x96\x87\xb0\x03\xc1\xf0\x5f\x38\x92\x29\ \xfb\x02\xea\x5a\x3d\x9e\x3b\x40\x9c\x2c\x81\x12\xb9\xf9\x9a\xf5\ \x67\xef\x39\xdf\x95\x25\xc0\x96\x14\x96\x9e\x99\x4e\x62\x5a\x89\ \xe5\x69\x55\x98\x5c\x51\x5b\xb9\xd7\x23\x9b\x57\x91\x2e\x09\x91\ \x6b\x43\xeb\x95\xc6\x1b\x37\xa9\xfd\x77\x29\x2b\xff\x5e\x92\xbe\ \xc1\x0f\x25\x78\xb5\xe0\xff\x5f\xea\xaf\xff\xf1\x65\x93\x06\xda\ \xa4\x61\x75\x15\x9e\x1c\x9b\xd7\x70\x6d\x79\x0f\x84\xb9\xd8\x22\ \x60\xb7\x1f\x82\x83\xf6\x23\x78\xff\x5e\x04\xad\x9b\x8f\x13\x53\ \x3f\x46\xca\xe4\x0e\xf0\x30\xef\x14\x46\x5d\xab\x79\xf2\x4d\x70\ \x8f\x78\x40\xc6\xf1\xe3\xc7\x5f\x92\xe4\x86\xe1\x0d\xab\x76\x15\ \xa9\x13\xda\xa9\x06\x84\x22\x67\x0b\x54\x04\xeb\x8a\x90\x08\x9e\ \x08\x6c\xf9\xe0\xd7\x9c\xc0\x03\xeb\xd7\x91\x32\x4a\x79\x81\xff\ \xb3\x56\x7c\xcb\x96\x2d\x75\xa4\x2d\x2e\x4a\xfe\x56\xd8\xd9\xd9\ \x55\x3a\x3b\x3b\x63\xdb\xb6\x6d\x05\x5e\x2e\xdb\x2a\xfc\xd6\x2f\ \x87\x9f\x93\x1d\x5c\x36\xdb\xc3\xc1\xde\x1e\xab\x56\xad\xc2\x36\ \xe7\x2d\xd8\xe5\xe6\x8c\x18\xa7\xd9\x48\x5a\x67\x82\x07\xf6\x46\ \x4a\x9f\xdb\x93\x3b\x56\x0e\xfa\xbc\xeb\x6f\x76\x2f\x06\xc1\xb5\ \x92\x1f\x63\x7a\xe8\x13\xf9\xd7\x3c\xdc\xac\xcd\xfd\x54\x09\x86\ \x6c\x4e\xe2\x32\x60\xa9\x89\xcb\x40\x65\x57\x7c\x06\xb0\x12\x23\ \xa5\xeb\x27\x5e\x90\x3c\xbc\x2e\x2e\x19\x37\x18\xfd\xac\x94\xb7\ \xb5\xb5\x7d\x55\x26\x29\x63\xe5\xca\x95\x55\xa2\xf4\x5d\x31\xc4\ \x0e\xc1\xec\xef\xeb\xb2\xf5\x56\x80\xb7\x07\xf6\x78\xbb\x21\x28\ \x70\x2f\x02\x77\x79\x22\x54\x82\xdc\x29\x87\x21\xc8\xd8\xd4\x1b\ \x79\x5e\xa3\x50\x16\x3a\x97\xf8\xa9\x87\x5a\xd6\x97\xc7\x77\x28\ \xa4\x8e\xff\x6e\x80\xfe\x92\x23\xcb\x67\x76\x44\x5c\xa3\xf6\xf4\ \x2f\x3a\x78\xdf\xb5\x7e\x17\xf7\xbe\x7b\x8f\x95\x56\xdd\x6e\x10\ \x3a\xef\x49\x30\x74\xea\x84\x0a\x29\x55\x17\xce\x64\x2c\x78\x0d\ \x77\x25\x33\x9c\x68\x51\xaf\xec\xaa\x71\xc3\xf7\x9f\x85\x01\x44\ \x61\xb7\x35\x6b\xd6\x60\x9b\xfc\xab\xbe\x77\xc1\xa8\x51\x97\x0b\ \xc6\xfa\xf9\x49\x96\xf5\x91\x36\xbe\x9e\x2a\xbf\xe7\xcf\xa9\x85\ \xb2\x45\xaf\x40\xeb\xd8\xa9\x3a\xf8\x11\x37\xf1\x53\x0f\xa9\x54\ \xbf\x07\xf7\x41\x1d\x63\xa8\xe3\xef\xea\x02\x92\x1d\xd1\xc8\x4e\ \x70\x9d\xef\xd6\xb2\x0c\x4c\x8e\x0d\x69\x9d\x9f\x32\xa1\xbd\x4a\ \x21\x15\xac\x1b\xc8\xfa\xbb\xce\x0b\x22\xe6\xb2\xfa\xc2\x2d\x86\ \x25\x29\x46\x5c\x95\x86\x4a\x95\xa5\x90\x60\x5e\xff\x2e\x7b\xf8\ \x9e\x81\xfb\x67\x6d\xde\xbc\x39\x8b\xd7\xa4\x8b\x06\x0d\x3e\xbf\ \x38\xb0\x41\xd1\x8d\x21\xf5\x28\xb7\x3a\x25\x4e\x3c\xc4\x45\x7c\ \xc4\x49\xbc\xc4\xad\xf0\x3f\x90\xd9\xbf\x31\xfe\xdd\xf2\x1e\x5d\ \xbb\x0e\xa2\x8e\xbf\x33\x80\xa4\x9a\x4f\x48\x96\xf5\x21\x83\xcb\ \x07\x1f\x7c\xd0\xc4\xb2\x67\x47\x4f\x9e\x09\x68\x35\xe5\x05\xdb\ \x87\xb3\xde\xa6\xf3\x82\xd0\xa9\xdc\x11\x98\x78\xac\x5e\x0a\xdc\ \x7e\x24\x1e\xd4\xc1\xd5\xc1\x6f\xde\xbf\x62\xac\xd7\xfd\x69\xae\ \x7d\x49\x7f\x43\x02\xdf\x21\x35\xf3\x06\x8d\x8c\x2e\x0d\x68\x50\ \x46\xe5\x29\x8f\x72\x29\x9f\x38\x88\x87\xb8\x88\xaf\xba\x3e\x48\ \xdc\xb9\xcb\xbe\x50\x55\xe2\x9f\x0d\xde\x0f\xa7\x6e\xff\x2e\xa3\ \x3a\x25\xd6\x9b\xcd\xc8\x7b\xf6\xec\x09\x14\x0b\xd5\x94\xc2\xac\ \x41\xa8\x49\xeb\x07\x29\xe3\x24\x16\xcc\xee\xc2\x4a\x2b\x5b\x51\ \x74\x3d\x40\x87\x7f\x00\xf6\x5b\x31\x20\xca\x76\xc3\x7e\x00\xdd\ \xe1\xe8\xfe\x63\x23\x24\x0e\x79\xb3\xe2\xa2\x71\xfd\xe9\x4f\xc3\ \x00\x12\x97\x7a\x4a\xd0\xab\x90\xae\xf1\x95\xf1\x86\xfa\x23\x13\ \x06\x36\xac\xa8\x56\x9e\xf2\x28\x97\xf2\x89\x83\x78\x88\x8b\xf8\ \x88\x93\x78\x89\x9b\x05\x91\x4b\xa3\xdb\x95\x50\x27\xea\xf6\xff\ \x2d\x8d\xc9\x12\x48\x0a\xdc\x1f\x98\x25\xef\x05\xcd\xf9\x7e\xdd\ \xbf\x5b\xe7\xf5\x49\x63\xda\x68\xb9\x14\x18\x41\x0b\x37\xab\x02\ \xe9\xe3\xa5\x30\x4f\x77\xca\xda\xd4\x9e\xf1\x80\x05\x09\x9d\x27\ \x4c\xac\xa5\xf6\xe3\x5b\x72\x2a\x4b\x18\xd4\x30\xf0\x82\x41\xfd\ \x56\x7f\xb1\x19\x7b\xdc\xc6\x8d\x1b\xe1\x3a\x69\x40\xe6\x35\xd3\ \xfa\x5a\xf2\x25\x7f\xca\xa1\x3c\xca\xa5\x7c\xe2\x20\x1e\xe2\xaa\ \x2e\x8c\x12\xef\xc3\xf9\xdd\x71\x67\xdc\x3b\x98\xdb\xe7\x7d\x1f\ \xea\xf4\x5f\x8b\xa3\x4e\x4e\x4e\x9f\x47\x47\x47\xb1\xf9\xf9\x32\ \xd7\x89\x14\x3a\xbf\xd8\xd6\xbf\x6d\xe2\xed\xb1\x6d\x75\x01\x71\ \xf9\xd7\x74\x29\x9e\x0e\x59\x71\x61\x8f\x8e\xee\x6c\xb0\xbe\x15\ \x41\x70\x26\xd8\xca\xc2\x35\xa9\x72\xf4\xb7\x2d\xe9\x0d\xf5\xb4\ \x97\x4c\xea\x87\x5f\x34\x6a\x30\xb0\xba\x3c\xfd\x67\x89\x81\x2e\ \x78\xc1\xd8\xd8\xf5\xeb\x1c\xb0\x63\xec\x17\xe4\x47\xbe\xe4\x4f\ \x39\x94\x47\xb9\x94\x4f\x1c\xc4\x43\x5c\xc4\xa7\x70\xe6\x48\xd3\ \xd4\x1d\xe9\x21\x8c\xb6\x78\x27\x8b\xba\x50\xa7\x3f\xac\x0e\x4b\ \x0c\x08\x0e\x0a\xda\x5f\xec\xe1\xe1\xbe\x49\x06\xbc\x29\x25\xaf\ \x59\x87\x8c\x5b\xe5\xb0\x54\x96\x61\xd3\x49\x55\x5a\x4b\x76\x8e\ \x46\xe5\x81\x39\x40\xf4\x13\x23\x70\x06\x78\xfa\xe2\x5a\xcc\x97\ \x80\xc4\x32\xd5\xfd\xf1\xca\x1b\xd4\x36\x49\xb7\xbd\x68\xaa\x77\ \x6f\x9c\x8d\xe3\x69\x93\x29\x9e\xab\xdf\x9f\x73\xb2\xff\xfb\xb3\ \x4e\xbe\xd3\xd5\x3a\xfe\x15\x12\xaf\x79\xcf\x78\xb2\xf7\xaa\x31\ \x93\x1d\x4f\xc7\x9b\xe8\x27\xc9\x8c\x23\x76\xb6\x21\xa4\x2b\x1d\ \xde\x13\xbf\x24\x3f\xf2\x25\x7f\xca\xa1\x3c\xca\xad\x56\x9e\x78\ \x88\x4b\xe1\xcb\x5b\xd5\x17\x3c\xd1\x5e\x1c\xf9\x4e\xe9\x67\xdd\ \xbb\xce\xa5\x2e\x7f\xaa\x41\x82\x27\x2d\xf1\x80\x34\x59\x0a\x5a\ \x59\x7f\xbe\xb2\x23\xbc\xdb\xb3\xdb\xc7\x6b\xe2\x87\xb4\x28\x4b\ \x1e\xd5\x1a\x59\xb3\x3e\xe4\xba\x62\xeb\x2a\x5b\xd4\x9e\x54\x8d\ \x02\x2c\x01\xe7\x2e\x0c\x44\x2c\x4d\xf1\x38\xca\x59\xe2\xd1\x94\ \xc0\xd5\x56\x79\x4b\x3a\x3b\xcc\x1c\xae\x62\xc0\x9a\x04\x7c\xbb\ \xe2\x22\xbe\xf9\xe9\x02\xbe\x5e\x76\x4e\x4b\xe2\x75\x5f\xb9\x67\ \xb8\x3a\x01\x83\xd6\x5e\x41\xa2\xa5\x3e\x58\xe8\x38\xb5\xa0\x2f\ \xd6\xda\xd9\x21\x60\x5a\xdf\xea\x46\x29\xf2\xa7\x1c\xca\xa3\x5c\ \xca\x27\x0e\xe2\x21\x2e\xc1\x67\x80\x94\x89\xed\x70\x63\x64\xeb\ \x2a\x93\x4f\xbb\x6c\x94\x72\x7d\xbb\xff\x53\x8b\x8c\xbc\x25\xd5\ \x96\x60\x78\xd3\xd3\xcb\xa3\xd2\xd1\x69\x73\xf9\xac\xd9\xb3\xce\ \x9b\x7d\xd3\xeb\xd0\xb5\x61\x2d\xaa\xd8\xa4\xfc\x60\xa6\x1c\x90\ \xec\x8d\x28\x8c\x91\xf6\x71\x7f\xe0\x7c\x20\x68\x3c\xe0\xde\x9b\ \x8d\x0a\x0c\x4a\x72\x64\x7e\x62\x08\xce\x5c\xfa\x77\x6f\xe2\x7b\ \xcf\x14\x4c\x71\xbd\x8d\x09\xdb\x92\xc0\x3c\xfe\x98\x2d\x37\x15\ \x8d\x75\xbe\xa9\x52\xed\xdf\xb9\x24\xab\xa4\x46\xda\xc4\xfa\xca\ \xd5\x2f\x2d\xfa\x0c\x3f\xfd\xf4\x13\x42\xe6\x1b\x49\xf9\xbb\x26\ \xf9\x92\x3f\xe5\x50\x1e\xe5\x52\x3e\x71\xe8\x94\xff\xd9\x00\xa9\ \x12\xb3\x6e\x8d\x68\x85\xe9\x5f\x75\xdc\x2f\x51\xbf\xdb\x1f\x55\ \xac\xff\x5b\x29\x7a\xba\xaf\xaf\x4f\xe6\x5a\x7b\xbb\x8a\x61\x96\ \x43\x31\x63\xd0\xd7\x9a\xeb\xc3\x5a\xe0\x86\x34\x28\xa7\x73\x39\ \xd8\x19\xb0\x53\x53\xd6\xdc\xf7\x0c\x3c\x2c\x44\xb2\x22\xcb\xae\ \x4e\x36\x35\xb2\xd3\x93\xbd\x7d\xdc\x9f\x75\xf1\x61\x76\x1d\xac\ \x0b\xcb\x56\x85\x95\xe5\x81\x99\x58\x2a\x45\x8c\x1f\xf7\xa4\x93\ \x58\xd0\x60\xbd\x81\xfd\x83\x2a\xa3\x93\xf3\x7d\x5d\x5d\xe7\xc9\ \xb2\x2e\x90\x5d\x00\x11\xcb\xcc\x50\xb9\xbc\x2e\xf9\x92\x3f\xe5\ \x50\x1e\xe5\x52\xbe\xc2\x91\xb3\xbc\x37\x92\x46\xb7\x11\x7c\x2d\ \x61\xff\x6d\xfb\xb3\xb2\xee\xfb\xfe\x99\xb2\xdd\x9f\x39\x89\xbd\ \x2b\x5e\xb1\xcb\xfa\x3b\xeb\xdc\xe9\x66\xdf\x6a\x13\x2c\x5a\x80\ \xfd\x03\xb4\x74\xee\xaa\x3e\x28\xde\x3a\x8c\xed\x69\xaa\x23\x03\ \xd1\xca\x1b\x74\x0d\x4b\xbb\xcc\x80\x1d\x3d\x58\xaf\xd7\x2d\x8d\ \x1f\x6b\x21\xe0\x97\x52\x56\x97\x54\x97\xe8\xce\xd8\x02\x56\x71\ \x14\xb9\xc6\xaa\x6e\x51\x76\x90\xaa\x74\x56\xe9\x0f\xb5\xd5\x3b\ \xc7\xfd\x55\xed\xe1\xe4\xb8\x19\x51\x6b\xad\x50\xe5\x33\x88\x7c\ \xc9\x9f\x72\x28\x8f\x72\x95\xfc\x07\x0b\x7b\xe2\xc6\xf0\xe6\xb8\ \x3e\xac\xb9\x76\x69\x9f\x77\x4f\x8a\xdb\x0f\xe5\x89\xef\xa9\xb6\ \xca\x0a\xc3\xfa\xfd\xfa\xf5\x9b\x3e\x6c\x40\xff\x6b\x27\xa5\x4f\ \xe7\xba\x45\x53\x24\x8d\x6a\x85\xec\xc5\x9f\xa9\xfa\x7b\xa9\x87\ \x15\x23\xf0\x93\x46\x69\x6e\x49\x3c\x94\x70\x9d\x7a\x19\xa0\x6a\ \x47\x2f\xe6\xe9\x98\xad\x55\x7d\xc1\x51\xd7\xaa\x10\x79\x55\x47\ \x87\xe5\x9a\x7d\xc3\x2c\xbf\x31\x99\x59\xb5\xe9\x5d\x35\xdb\x59\ \x9e\x23\x20\x81\x19\x47\x9c\xe7\xa0\xfc\xc0\xf7\xd5\x0d\xd3\x94\ \xa3\xe4\x15\x6c\x30\xc1\x5d\x9b\xce\x10\x2c\xec\x09\xac\x18\xdd\ \xab\x23\xcf\x31\xc3\x88\xf5\x99\x74\x8b\xb3\x0e\x27\x3b\x43\xbf\ \xee\x5d\x3f\xda\x14\x32\xa0\x45\x36\x3f\x65\xb9\x2e\x94\x32\x5e\ \xce\x0a\x2b\x7a\x57\xb7\xca\xab\x37\x48\x2d\xbd\x41\x88\x19\x19\ \x06\x2a\xed\xc1\xef\x55\x92\xf2\x7c\xaa\xae\xd4\x76\xf6\xce\x6f\ \xa9\xba\x63\x9c\x99\x5c\x6d\xb0\xb5\x32\xde\xa3\xd0\x1f\xb1\xdb\ \xdf\x0f\xb1\x6e\x4b\xa0\x91\x3a\x3f\xf9\x92\x7f\xd1\x16\x0b\x64\ \xcc\xe9\x0e\x76\xb1\x11\xc3\x49\xb3\x16\xc5\xbd\x3f\xf9\xd0\x99\ \xd8\x88\xf1\x99\xb6\xcb\x8b\x80\x57\xc5\xc5\x7a\x08\xd9\x3a\x7c\ \xdd\xfa\xea\x25\xf3\xa6\x55\x6c\xa6\xbc\x2a\x40\x52\xad\x3b\xca\ \x56\xd9\x5f\x19\xa2\xd4\x6b\x3c\xca\xf7\x4d\xd7\xa5\xd5\x8e\xd8\ \x42\x7b\x64\x39\x92\xb3\x80\x5b\xd5\xdf\x0a\x64\x00\xd7\x9f\x50\ \xf5\x37\x03\x4c\x63\xcb\x2c\xff\xa4\x82\x5b\x4e\xc4\x6a\x7e\x32\ \x87\x38\x37\x5b\x14\xee\x1c\xa5\xf8\x66\xfe\xf0\x19\x12\xa5\x81\ \x8b\x32\xaf\x98\x37\xd1\xfa\x18\xb6\x4e\xed\x2a\x58\x88\x89\xd8\ \xfe\x96\x0f\x26\x78\xa4\x94\x08\xfb\x9e\x58\x7c\x5a\xcf\xae\x5d\ \xdc\xbd\xfb\xb7\xbc\x77\xd9\xf4\x9f\xda\xcb\x83\xde\xc2\x55\x01\ \x76\x5b\x3c\x22\x73\xc1\xa7\xe2\xa2\xa6\xec\xce\x50\xc7\xd2\xb2\ \x7d\x33\x91\xf5\xaf\x5f\x8b\xe4\x02\xf7\x14\xc9\x35\x29\x8f\xbf\ \xe9\x72\xf8\xe5\x21\xf3\xd4\x69\x2e\xcd\x73\x26\x22\x24\x89\x79\ \x62\xe3\x34\xa4\x4d\xff\x40\x29\x4e\x19\x97\xa5\x43\x2c\x74\x60\ \x8b\xec\xfe\x9f\x7c\xe8\x4b\x0c\xc4\x42\x4c\x7f\xeb\x27\x33\x8f\ \x4f\x8b\x8d\xc4\xf2\x7d\xe4\xbc\xb0\xa0\x4f\xf7\xce\xbb\x43\x0c\ \x9b\x65\x13\x60\x82\x49\x63\x92\x02\x7a\x4b\x1a\x9e\xd3\x67\x77\ \x43\xae\xbd\xb1\xca\xcd\x17\x69\x9e\x7c\x2b\x94\xaf\x88\xd7\x8a\ \x54\x49\xbe\x44\x23\xd7\x8e\x16\x78\xb0\xe4\x4b\x1c\x5f\x31\x01\ \x52\xb8\x45\xec\xf7\xfd\x65\xb6\x75\x7c\x8f\x18\x37\x2d\x1c\xde\ \xf3\xfd\x60\xca\xa4\x6c\x62\x20\x96\xe7\xf0\xe1\xe4\x6f\xbc\xa1\ \xa9\xcc\xc4\x40\x01\x63\x3b\xb0\x7b\xa7\x60\x97\xbe\xad\xd3\x4e\ \x98\xb6\xc0\x25\x93\xb7\xf8\x4d\x91\xa2\x04\xf3\x66\x2c\x4c\xfc\ \xe6\x8b\xb1\xea\x7f\xbc\x26\x55\x7f\x39\xc6\x67\x39\xe6\xe0\xe6\ \x95\x60\xd3\xc6\x59\x8b\x96\x9a\x3d\x86\x2d\xee\x8f\xfc\xb4\x63\ \x38\x65\x50\x16\x65\x52\xf6\x5f\xc5\xff\x54\x1b\x19\x85\x5a\x0b\ \x99\x09\xc0\xd9\xd2\xbf\xe3\x3a\xc2\xc2\x3c\xcf\x71\xf0\xa7\x88\ \x36\x6e\x59\x79\xde\xac\x79\x55\x4e\x6e\x11\xf2\x8a\x1e\x7f\x2f\ \x58\x5a\x81\xa2\x27\xc4\xef\x07\x75\xdf\x0e\x16\x94\xe1\x82\x79\ \xf3\xaa\x83\xd6\xdf\x6a\xa2\xa2\x0e\xc3\xd3\xdd\x2d\x4f\x66\xda\ \x81\x3c\xc9\x9b\x32\x28\xeb\xf9\x7e\x3a\xfb\xc7\x86\xd0\x97\x99\ \xfa\x40\x8c\x60\x6e\x6d\x6d\x7d\x6e\xd2\xa4\x49\x45\x42\x55\x43\ \x87\x0e\xcd\x1e\x6d\x39\x3c\x75\xe9\xc4\x11\x29\x9b\x57\xda\xe7\ \x3a\xba\x86\x6a\x1c\xdd\xc2\x35\x5b\xd6\x6f\xcb\xb5\x9b\x63\x73\ \x73\xde\x8c\x69\xf1\xf3\xe6\xcf\x3f\x2f\x87\xb0\x6c\xf9\x3a\xb4\ \x54\x52\x75\x9a\x3e\x7d\xfa\x0c\x27\x2f\xf2\x7c\x16\x1d\xa8\xcf\ \xba\x68\x59\x53\xa8\x81\x8d\x8d\x8d\xa9\xb4\xb4\x1d\x95\x63\x6d\ \x16\x5f\x6e\x98\xb8\x0c\x8b\x88\x42\xae\x78\x03\x29\xf1\x66\x32\ \x1b\x18\x8b\x1f\x7f\x30\x5d\x2a\x5f\x85\x56\x49\x9a\x2e\x41\x0c\ \xd6\x82\x3c\x9e\x25\x46\xfe\xe7\x6f\xa5\xe5\xcb\x97\xff\x53\xd2\ \x7b\xc3\xb6\x7b\x07\xad\xde\xb1\xe7\x88\xf7\xce\x7d\xb1\xfe\x2e\ \xbe\xc1\xeb\xe5\xde\x2c\x49\x7c\x4c\xe2\xa7\xf2\xac\xd9\xfd\x5d\ \x78\xfe\x1f\x54\xc7\x67\x32\x0b\x29\x7c\xe5\x00\x00\x00\x00\x49\ \x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x13\x17\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\ \x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x12\x94\x49\x44\ \x41\x54\x78\xda\xed\x9b\x09\x90\x5c\x47\x79\xc7\xff\xdd\xef\x9a\ \x73\x67\xf6\xd2\xae\x56\xbb\xba\xbd\xb2\x84\x0e\x0b\x1b\x51\xb2\ \x1d\x0a\x6c\x8e\x40\x9c\x40\x48\x0a\xca\x54\x80\x70\xe4\xa8\x8a\ \x53\x60\x08\x15\x8a\x22\x45\x48\x02\x14\x47\x01\x45\x05\x63\x28\ \x53\xa9\xd8\xd8\xb1\x62\x82\x6d\x8e\x02\x0c\x54\x30\x92\x15\x09\ \xc9\x96\xac\xd3\xd2\xae\x76\x25\x4b\x7b\x68\xaf\x99\xdd\xd9\x9d\ \x79\xf3\x8e\xee\x7c\xaf\x5f\xc7\x33\x7b\x69\x25\xb0\x1c\x57\xa1\ \x4f\xfa\xeb\xeb\xd7\x3b\xf5\x66\x7e\xff\xef\xeb\x7e\x6f\x34\xb3\ \x4c\x4a\x89\xdf\xe5\xe0\xa4\x6b\x06\x5c\x33\xe0\x9a\x01\xd7\x0c\ \xb8\x66\xc0\x35\x03\x5e\xfa\x60\x51\xe0\xff\x39\xae\xca\x7d\x00\ \xbb\xee\x73\xad\x46\xd2\x79\x95\x44\x78\x13\x24\xef\x92\x12\x79\ \xce\xd1\x68\x9a\x46\x63\xd2\x36\x9a\x52\x09\x33\xcf\x18\xcf\x80\ \x49\x37\x0c\x51\x0c\x05\x0a\xbe\x2f\x0a\x55\x5f\x4c\x54\xaa\xfe\ \xf8\xb6\x75\xa9\x83\x87\x1f\xff\xab\x7b\xf1\x12\x84\xf9\xdb\x97\ \x11\x0c\xaf\xf8\xda\x2d\x8d\x59\xeb\x35\x89\x84\xb5\xa3\x54\x0e\ \xb6\xb7\x2c\x6f\x59\x99\x72\x2c\xa4\x93\x26\x32\x29\x0b\xd9\xb4\ \x85\x5c\xc6\x42\xc2\x31\x60\x5b\x06\x4c\x83\xc3\x88\xc4\x59\x86\ \x31\x64\x00\x74\x0a\x01\xb8\x5e\x88\x3d\x87\xc6\x83\xa1\xbe\x5f\ \x5a\x00\x5e\xde\x06\xb0\x1b\xee\x5d\xd1\xdd\x95\xff\x9b\xed\xef\ \xb0\xdf\xdd\x37\x90\xeb\x5c\xd7\xd5\x00\xce\x01\xc7\xe6\x24\x03\ \x09\x3b\x86\xa5\x63\x3d\xa6\xf9\x48\xb6\xa9\xc6\x96\xc9\x94\x11\ \x8c\x01\xa1\x00\xaa\x04\xbf\xef\xe8\x04\x5a\xf3\xe1\x91\xde\xfd\ \x67\x72\xa0\x78\xd9\x19\xc0\x5e\xf7\x4b\x33\x17\x0e\xbf\x6d\xd3\ \x9a\xdc\x5d\xc9\x64\xc3\xad\x4d\x8d\x0d\x46\xa1\x54\xc5\xaa\x8e\ \x26\x30\x82\xb1\x6d\x05\x1c\x03\x92\x6c\xc7\xd0\x63\x03\x96\x1d\ \xcf\x99\x26\x87\x11\xc9\x60\xaa\x7d\x04\x24\x02\x21\x31\xed\x4a\ \x4c\x56\x8c\xca\xc9\xbd\x8f\x77\x02\x38\xff\xb2\x33\xc0\xda\xf9\ \xdd\xd7\x6e\x5f\x9b\xbf\x2f\x9f\x6d\x5f\x37\x34\x56\x41\x7b\x6b\ \x0e\xe3\xd3\x8c\x40\x12\x90\xdc\x80\x50\x30\x1c\x81\x34\xc0\x25\ \x03\x17\x1c\x2c\xe0\x90\xe0\x08\x49\xbe\x60\x70\x7d\xc0\xe0\x91\ \x24\xb1\x4b\x48\x09\x25\x3f\x94\x38\xda\x57\x46\x02\x13\xc7\x67\ \x4a\x85\x9b\x40\xf1\xb2\x31\x80\xdd\xf2\xe8\xb2\x5c\x22\xf9\xd5\ \x1b\x36\xb4\xdd\x79\x71\xc2\xc5\xc8\xa4\x4f\x00\x16\x38\x67\x08\ \x25\x00\x82\x05\xc1\x8a\x00\x04\xca\xe0\x4b\x0e\x2f\x8c\x2a\xcd\ \x60\xfa\x24\x83\xc5\xd0\x06\xc0\x19\x03\xe7\x50\xf0\x00\x53\xf0\ \x42\x4a\x94\x5d\x81\x54\x32\x39\xf5\xd4\x4f\x1f\xee\x06\x38\xc0\ \xf8\xcb\xc3\x00\x76\xf3\xcf\xb7\xb4\xe6\x1a\x7f\xd1\x90\xb6\x5a\ \xcf\x0c\xfa\x04\x61\x13\x0c\x83\x90\x04\x24\x19\x01\xc5\xe3\x80\ \x80\x0d\xca\xbe\xe0\xe0\x3e\x08\x32\x12\x81\x2b\x78\x46\xc0\x0c\ \x94\x94\x50\x77\xe5\x13\x92\x91\x00\xd7\xe3\xc8\x89\x9e\xd3\x9e\ \x57\xbd\x09\x64\x2e\x98\x81\x28\x3e\x73\xf3\xcd\x2b\x66\x86\x87\ \x1f\x19\xef\xef\x3f\x2c\x81\x43\x9c\x64\x03\x47\xbf\x26\x65\xf5\ \x6a\x1b\x40\xf0\xbb\x77\x80\x27\x7e\x5c\xaa\xf2\xa6\x42\x59\x2a\ \x78\x53\x30\xbd\x7b\x03\x66\x54\x51\xc9\x09\x54\x57\x56\x12\xa8\ \x40\x04\x4b\x42\x2c\x30\x5d\xcc\xd8\x84\xfa\x90\x32\x9e\xf7\x42\ \x89\xed\xeb\xec\xb1\x1f\xdd\xbf\x6b\x73\x0d\x9e\x44\x91\xe4\xfc\ \xb3\x76\x5b\xdb\xce\xd6\x15\x2b\x76\x7a\xd3\xd3\x70\x4b\x25\xb8\ \x53\x53\xc1\x47\xd3\xe9\x43\x7e\xb9\xfc\x98\x00\x1e\xff\x57\x29\ \x8f\xbf\xe8\xf7\x01\xec\xf7\x7e\xdd\x0d\x66\x1c\x04\x43\xb6\x6e\ \x76\x56\xd6\x70\xaa\xc2\xbc\x2e\x73\x65\x80\x56\xfc\x40\x95\x05\ \xe2\x6a\x0b\x11\x29\x5a\x3e\x92\xb2\x44\xf7\x0a\x0b\xd6\xe4\xbe\ \x83\x87\xf7\x7e\xef\x26\x05\xcf\x38\x28\x3f\xfe\x8d\x2d\x85\x4f\ \xd2\x39\x0e\xe5\x57\xad\x32\x79\xf4\xd8\x30\x44\xe8\x79\x4a\x81\ \xeb\x62\x66\x6c\x0c\xa5\xc1\xc1\x28\x9f\x71\xa7\xa7\xff\x0b\xc0\ \x3d\x5f\x92\xf2\xdc\x8b\x63\xc0\xeb\x8e\xff\x84\xd2\x9b\x66\x41\ \xb3\x7a\x23\x2e\x31\x66\x97\xff\x73\xc7\x62\xf8\xe3\x9d\x7c\xf0\ \xe1\x7b\x3e\xd2\x4e\xe0\xfc\x05\x03\x38\x7f\xfc\xdf\xb6\x15\x13\ \xcb\xb7\x6d\x7b\x53\xaa\xa5\x05\x22\x82\xae\x54\x40\x55\x87\x4f\ \x39\xa0\xac\x8f\x95\xca\x64\xc6\xe4\xb9\x73\x81\x5b\x2c\x3e\xc4\ \x84\xf8\xfc\xa7\xa4\x3c\xf1\x1b\x2f\x01\x76\x5b\xff\x1f\xc1\x48\ \x12\xfc\xd5\x8f\x1d\x1b\x4c\x3c\xf3\x3f\x3f\xba\x08\x6e\x76\x28\ \x78\x70\x44\x79\x67\x93\x68\xc9\xe7\x72\x37\x37\xe4\xf3\x90\x42\ \xc0\x64\xd1\xd2\x33\x60\x58\x16\xcc\xa8\x13\x48\xc1\xff\x49\x08\ \x38\x4d\x4d\x68\x48\x26\x4d\x32\xe0\x3d\x33\x83\x83\xef\xfe\x22\ \x63\x0f\x13\xd8\x5d\x77\x4b\x39\x71\xe5\xef\x05\x0c\xf1\xa7\x58\ \x34\xd8\x8b\xa6\xe6\x2c\xc7\xca\xe6\xa0\xff\xf4\xb3\x4f\x6e\x07\ \xb3\x00\x66\x02\xdc\x52\x7a\xdf\x3a\xb9\xb9\xa1\xa9\x89\x85\x13\ \x13\xf0\x49\xa2\x50\x00\x68\xfd\x73\xaa\xb6\xe9\xba\x30\x7d\x1f\ \x16\xc1\xdb\x11\xbc\x94\x48\x02\x48\x32\x86\x6c\x22\x81\xd6\xe5\ \xcb\xd9\xb2\xf6\xf6\x3b\x93\x86\x71\xf4\x9b\x8c\xbd\xe1\xca\x37\ \x41\xc9\x6e\x04\xd8\x6f\x7c\x5f\x7c\x39\x61\x19\xc0\x6b\xb6\x5a\ \x78\xf2\x89\x07\xcb\x0a\xba\xb6\xf6\xf1\x86\x65\x21\xd6\x58\x7e\ \xce\xa0\x16\x97\xd1\x9a\x8f\xaa\x0f\xa8\x4e\x00\x41\xb3\x20\x00\ \x27\x03\x98\xe7\x29\xf1\x6a\x15\x06\x1d\x0b\x9a\xd7\xdd\x01\xdb\ \xb6\x91\x68\x6c\xec\x08\x8a\xc5\x9f\xde\xcf\xd8\xa7\xde\x23\xe5\ \x3f\x5f\xbe\x01\x8c\xad\xfc\x4d\x0d\x58\x1a\x9c\x61\xeb\x5a\x13\ \x5b\x56\xb3\x99\x91\xe1\xa1\xc3\x17\xce\x9e\xb8\x45\x19\xa0\x5b\ \x9f\x73\x13\x7f\x7d\xbd\x07\xa3\x58\x06\xfc\xf8\x7a\x2a\xb4\xa9\ \x4c\xc6\x3b\x28\xd3\x26\x48\x12\x27\x03\x84\xef\xc7\x46\x91\x11\ \x26\x29\xa4\xb1\x3a\x8e\x1e\x63\x59\x8c\x8c\xf9\xa7\xef\x31\x56\ \x7a\xbb\x94\x5f\xbd\x3c\x03\x44\x70\x0e\xdc\x7e\x05\x5e\xc4\xb0\ \x4d\x46\xd0\x1c\x5b\xd7\x18\xd3\xbd\xfd\x43\xa7\x1f\x7c\xf8\x99\ \x0d\x5d\xcb\xcc\x3c\xd8\xec\xea\xbf\x77\x8d\x40\xdb\xf8\x05\x84\ \x53\x53\xe0\xa6\xa9\x3a\x4a\x72\x0e\xae\xaf\x9b\x4a\x64\x80\xd4\ \x42\x5c\x79\x95\x8d\xc8\x0c\xea\x1a\x83\x96\x89\x88\x96\x09\x1d\ \x2b\xc3\xa0\xe2\xcb\x4f\x30\x36\xf4\x46\x29\x77\x2d\x6d\x40\x50\ \x2c\xc1\x5e\xb6\x64\x7b\x2f\x1d\x8c\xc0\x11\x41\x63\xcb\x2a\x3e\ \xdd\x7b\x6e\xe8\xf4\x77\x76\x1d\xda\xe0\x07\xc1\x2b\x09\x96\xc0\ \x1c\xa9\xaa\xaf\xe1\x13\x06\xc7\x07\xbb\x09\xec\xbf\xcf\xa8\x0d\ \x8f\x93\xf4\x6d\x23\x0c\xe8\xd0\x5d\x00\x82\xa6\x2a\x2b\x50\x10\ \xb0\xa4\xca\xf3\x48\x35\xe0\xb9\x99\x31\x32\xe1\xc7\x8c\x3d\xf6\ \x66\x29\xab\x97\x36\xa0\x74\xba\x19\x2d\xed\x1e\x00\x1b\x60\x57\ \x04\xac\x93\x06\xe7\xd8\xb2\x92\x4f\xf7\xf4\x0f\x9f\x7e\xe0\x3f\ \x0f\x5d\x1f\x04\x82\xc0\x39\xc0\x13\x0a\x3a\x84\x49\x39\x92\xa1\ \xf4\xf1\x2d\x0c\x89\xa7\x7e\x0e\xb7\xb7\x17\x1a\x5c\xc9\x27\x31\ \xe8\x3d\x40\x8b\x49\xa9\xe6\x8c\x39\x5b\x33\xe6\x1f\xd7\xe7\x8e\ \x0c\xf0\x01\x00\xf7\x2c\xb1\x04\xaa\xd7\xc1\x1b\xdd\x03\xa7\xfd\ \xd6\xcb\x02\x06\x66\x5d\xd7\xb7\xae\x66\xd8\xbc\x8a\x97\x7a\xce\ \x0e\xf5\x3c\xf0\xc8\xb3\x1a\xdc\xc0\xac\xcd\x0e\x1c\x42\x9a\x1c\ \x7a\xae\x25\x61\xe0\x5d\x6b\x25\xa6\x1f\x3d\x86\x14\x50\xdf\xba\ \x98\x21\x25\xe7\xc1\xe8\xbc\x18\xf0\xe2\xa6\xdc\xb9\xb4\x01\xdc\ \x01\x26\x8f\xec\x40\xeb\xb2\x13\xe0\xe6\xa6\xc5\x80\xe7\x83\x43\ \x81\x9f\xee\x1b\xea\x7d\xe0\x91\xe3\x04\x1e\x12\xb8\xa9\xab\xa9\ \x85\xda\x58\xc8\xd0\x89\x0d\xb0\xf0\xc5\x9d\x16\xda\xb6\xad\x41\ \xc3\xfb\xdf\x8f\xd2\xc3\x0f\x43\x96\xcb\x2f\x00\x0c\x91\x12\xaa\ \xda\x2f\x4a\xb4\x2e\xbd\x07\x18\x0e\x10\xc2\xc6\xe8\x2f\x96\x37\ \xaf\x7d\xe3\xb1\xf1\x19\x73\xf3\xa2\xe0\x36\x03\xbd\x6e\x6c\xea\ \x44\xe9\x54\xdf\x85\xfe\x07\x1e\x39\xd5\x1d\x04\x72\xbb\xaa\xb4\ \x41\x70\x52\x90\x02\x40\x90\x64\x08\x1a\xe8\xb9\x10\xfe\xd4\x64\ \x13\xfd\xa3\x9e\x6f\xef\xd3\xfd\xe8\x5a\xd5\x80\x1d\x7f\x70\x07\ \x52\x3b\x77\x62\xea\xbe\xfb\x50\xdd\xbf\x1f\x13\x00\xce\x92\x9e\ \x27\xa5\x49\x59\x52\x86\x94\xd7\x62\xb8\xb2\x28\x02\x4d\x4b\xde\ \x0a\xb3\x57\xff\x40\x22\xac\x02\xc2\x85\x69\x04\x6e\xd0\x78\xfb\ \xb3\xe9\x74\xea\xd5\x33\x6e\x7d\xc5\x63\xf0\x8d\x2b\xc2\xe9\x53\ \xbd\xe7\xcf\x1f\x38\x7c\x66\x5d\x18\x4a\x1b\xc2\x05\x44\x05\x08\ \x23\xcd\x90\xaa\x75\x9b\x27\xd3\xe3\x58\x2d\xe9\x69\x77\xec\xe2\ \x40\x22\x32\xeb\x6d\x23\xbf\x42\x8b\x37\x81\xfc\x96\x1b\x70\xc7\ \xbb\xfe\x04\x37\x6d\x5e\x0b\xef\xa9\xa7\xf0\xab\x6f\x7e\x13\x63\ \x85\xc2\x82\x3d\x68\xe9\x72\xb6\x20\xa6\xe2\x58\x3a\xf6\x00\x07\ \xfe\x4c\xca\x1d\x97\x36\x60\xe7\x13\x52\x1b\xa0\x55\x95\xd7\x6f\ \xe8\xde\x5f\x4d\xbe\x62\xcd\xc5\x49\xde\x76\x03\x81\x5f\x4f\xe0\ \x27\x4e\xf6\x0f\x1d\x38\xd2\xbf\x3a\xac\x4e\x5a\x08\x26\xe3\xc7\ \x4a\xe8\x16\x67\x7a\x5c\x03\x9e\x3b\xd7\xe8\x14\xbd\xc2\xf8\x45\ \x3b\x32\xe0\x9d\xc3\x3f\xc7\xb2\xea\x18\x04\x24\x42\x00\xcb\xb6\ \x6e\x9c\x7c\xd3\x7b\xdf\x69\x74\xac\xec\xcc\x9c\xfe\xd6\xb7\x30\ \xf8\xb3\x9f\x5d\x72\x21\x9a\xa4\x0e\x52\x27\xc9\xc6\xe2\xf1\x61\ \xe0\x17\x8f\x4a\xf9\xfa\x4b\x1b\x70\xcb\x93\x92\xa0\x81\x50\xc1\ \x93\x5c\x35\xb6\x2d\x39\xfd\xd6\xdf\xbf\x75\x60\xa4\x50\xb6\xf6\ \x1c\xe8\x59\x19\x56\xa7\x4c\x04\xa5\x79\xd5\xd5\x9a\x33\x37\xdf\ \x8c\x9c\x39\xea\x4f\x16\xc7\x2d\xc0\xc4\xbb\x07\x7f\x88\x76\x77\ \x34\x32\x80\x04\x84\x94\x07\x10\xa0\x65\xf3\x86\xe0\xad\xef\x7d\ \x17\xeb\x12\x81\xf1\xdc\x57\xbe\x82\xca\xf0\xf0\xa2\x46\x30\xad\ \x36\xd2\x4a\x52\x02\xb3\x63\x0c\x28\xbe\x03\x48\xf6\x48\x99\x58\ \x7a\x13\xd4\xd7\x5c\x3d\x50\xf2\xfc\x6a\x66\x7a\xf8\x40\xe7\xa9\ \x3e\x99\x0e\x2b\x25\xfd\xae\x2d\x15\x83\x31\x00\xb2\x76\xe9\x8a\ \x83\x2f\x0c\xaf\x0d\x90\xbc\x04\xf0\x34\xc9\x80\x03\x13\x49\x30\ \x08\x25\xa0\x80\x10\x06\x8d\x27\x8e\x9d\x36\xbf\xfd\xb1\x7f\x44\ \xdb\x96\xeb\xc3\xb7\xfc\xed\x87\xd0\xd9\x73\x8a\x0f\x3e\xf6\x18\ \xf3\x8a\xc5\x05\x4d\xd0\xa0\x28\x90\x56\xeb\xae\xd0\x11\x7c\x16\ \xd6\xd3\x19\x88\xdb\x97\xde\x04\x79\xa2\x0e\x5c\x67\xe1\x83\xaa\ \x4d\x29\x6d\x05\x22\x0d\x98\x99\x39\x40\x57\x38\x86\x80\x80\x0d\ \x98\x91\x81\x26\x1c\x52\x02\x5c\xc1\x07\x91\xd9\x90\xda\x10\x28\ \x15\x8e\x3e\x67\x7c\xe7\xe8\x67\xb1\x6c\xcb\xc6\xf0\xcd\x1f\xff\ \x04\xd6\x8f\x8f\xf2\x81\x5d\xbb\x58\xe5\xf9\xe7\xb1\x58\x5c\x20\ \x4d\x93\xd6\x91\xee\x45\x62\x5f\x05\xec\xf6\x2c\x02\xa8\x58\xba\ \x03\x64\x9d\x77\x53\xf1\x86\xc6\xcd\xa8\x2e\x3c\x60\x29\xc0\x08\ \xe7\x54\x96\xcf\x69\x77\x3e\x07\x5c\x46\x7f\xe3\xac\x25\x85\x23\ \xe3\x67\x8f\x0d\x48\x6a\x03\x26\x10\xc0\xa2\xb1\xa1\x97\x83\x54\ \x99\x45\x59\x19\xf1\xe0\xc7\xff\x05\xad\x5b\x37\x85\x7f\xf8\xd1\ \x8f\x61\xbd\x5f\x35\x86\x1e\x7a\x08\x93\xcf\x3c\xb3\xe0\x5d\x4a\ \x25\x99\xc4\xe7\x2b\x62\xcc\x83\x7d\x6b\x16\x21\x04\x0c\x30\x0a\ \x49\x71\xe9\xcb\x20\xa4\x92\x82\x07\xa3\xb9\x14\x25\x03\x92\xd9\ \x2c\x40\x64\x80\xa8\x01\xab\xcc\x6b\x63\x15\x6c\x76\x07\x49\x12\ \xc3\xac\x39\x21\x38\x60\x64\xd5\x79\x2d\xdb\x81\xe3\x5b\xf0\x45\ \x08\x57\x32\x24\x04\x87\x50\xc8\x40\xa8\xb3\xa8\xcb\x53\x47\x4e\ \x1a\xf7\x7f\xe8\x93\x68\xdd\xb6\x29\xbc\xe3\x2f\x3e\x88\xed\x77\ \x67\x8d\xe1\x07\x1f\xc4\x38\x6d\x96\x32\x0c\xc1\x1d\x07\xc3\x9e\ \x1f\xec\x66\x59\x0f\xa8\xb6\x78\x90\x48\x13\x7c\x58\x63\xf6\x17\ \x34\x80\xcc\x31\x70\xfb\x19\x7d\x2f\x50\x06\x98\x45\xe3\x34\x65\ \x53\x49\x70\x2e\x95\x01\x26\x16\x00\x17\x80\x9c\x05\x59\x4b\xac\ \x56\x79\xc6\x38\x72\x59\x07\xd9\x95\x67\xf9\xf9\x0d\x5f\x07\xeb\ \xdf\x86\x7c\x49\x56\x93\x70\x9c\x29\xcf\x85\x15\x98\x30\x24\xc1\ \x4a\x42\x15\x0a\x5a\x65\x01\xd2\x1c\x23\x4a\xcf\x9e\x34\x1e\xbc\ \xeb\x13\x68\xde\xba\x51\xdc\x71\xd7\x07\xe4\x8d\x77\xdf\x6d\x0c\ \xef\xda\x85\x27\x4f\xf5\x54\x2f\x1c\xeb\xb7\x5a\xdc\x20\x55\x81\ \xa1\x1e\x1d\x92\x32\xe0\xa0\x48\x13\xe7\xa4\xee\x02\x98\x35\x78\ \x45\x91\x56\x40\x32\x88\x97\x82\x29\x55\xeb\x23\x24\x89\xa8\x03\ \x04\x42\x9e\xa5\xf9\xd9\xa0\xb5\x2a\x2f\x54\xf9\x48\xea\xfc\xc8\ \x65\x6c\x34\xae\x1d\x01\x5f\xbf\x07\xd5\x65\x07\x4d\x24\x0e\x81\ \x75\x1f\xc2\x0f\x6e\x58\x66\xbd\x7e\x4f\x13\xf2\xbb\x4d\x64\xc6\ \x5d\x50\xf1\x20\x94\x01\x80\x50\x26\x48\x1a\xeb\x63\xc8\x59\x86\ \x48\x52\xe9\xc8\x29\xfe\xd0\x5f\x7e\x0c\x4d\x64\x84\x63\x04\x41\ \x43\x71\xc6\x69\x4a\x25\x51\x81\x1b\xbf\x06\xcf\xc7\x34\x24\x9c\ \xb8\x0d\x9b\xf5\x1d\xb6\x3f\xcb\x00\x3d\xce\x93\x74\xdb\xdb\xba\ \xf2\x5a\x64\x82\x60\x2e\x42\xe9\x00\x5c\x43\x83\xcd\x06\x55\xa1\ \x8d\x90\x52\x57\x1c\x04\x6e\x21\xb7\x7a\x08\x7c\xdd\x41\x84\xd9\ \x01\x54\x05\xe0\xf9\x02\xb0\xa0\xe4\xa6\x05\xdf\x73\x7b\x09\x89\ \x9d\x1c\x1b\xf7\x25\xb0\x72\x77\x0a\x95\x02\x19\x11\x90\x11\x61\ \x0c\x2c\xd5\xb2\xd1\x63\x49\x63\x59\x1b\xab\x63\x30\x4c\x93\x11\ \x99\xee\xe5\x3c\x99\xb4\x11\xb7\x89\x54\x99\x51\x96\x41\x6c\x9e\ \xbe\x77\x1a\x5e\xcc\x80\x56\x30\x56\x9b\x36\x74\x07\x08\x65\x82\ \x5a\x8f\x82\xd9\xb3\x61\xa3\x21\xc7\xbc\xca\x33\x03\x68\x48\xdb\ \xc8\xad\x3a\x0f\xb6\x66\x5f\x0c\x1e\x02\x41\x55\xc2\x0f\x24\x08\ \x0d\x70\x30\x2b\xdc\x94\xc0\xa1\xdb\xca\x38\x41\x46\x6c\xde\x97\ \xc4\xaa\xbd\x69\xb8\x13\x51\x47\xf8\x11\xac\x86\x86\xee\x0e\x0d\ \xae\x40\xc5\x0b\x86\x24\x6c\x0b\x29\xc7\x89\xc1\x69\x0e\x42\xab\ \x2c\xe1\x89\x10\x14\x0d\x24\x63\xa1\x3d\xc0\x8a\x3b\x80\xe9\xc2\ \xc6\x15\x56\x24\x3c\xa1\xc6\x7e\xe0\xaa\xe3\xf9\xff\x3f\x20\xeb\ \x8a\xcf\x90\x4d\x73\x34\x74\x9d\x05\x5b\xbd\x17\x41\x7a\x00\x41\ \x08\xf8\x33\x92\x32\xc1\x87\x42\x19\x20\x24\x4d\x5a\x50\x26\x94\ \x11\x20\x2b\x6c\xf2\x3b\x3e\x67\xd5\x16\x78\xfa\x35\x33\x38\xf6\ \x2a\x8e\x2d\x4f\xa7\xb1\x66\x6f\x12\xd5\x42\x15\xbe\x1f\x10\xeb\ \xec\xea\x0b\x95\xd5\xf2\x50\xc7\x8e\x63\x43\x75\x80\x36\xa0\x5e\ \x46\xd9\x13\x90\xea\x59\xf9\x3c\x03\xf4\x24\x91\x4a\x2c\x6c\x82\ \x03\x2f\xe4\x34\x5e\xf8\x1e\x4c\x81\x67\x4c\x64\x57\xf4\x01\x5d\ \x7b\x10\xa4\x06\xe2\x4a\x97\x22\x68\x0d\x1f\xc4\x2f\x16\x20\xd9\ \x5e\x44\x0e\x91\x92\xe8\x61\x45\x8c\x99\x2e\x3a\xbd\x0c\x72\x01\ \x19\xa1\xcf\x5b\x35\x05\x0e\xee\x28\xe1\xe8\x36\x86\xad\x87\x33\ \x58\xbf\x3f\x09\xaf\x58\x55\x7b\x84\xea\x88\x08\x1a\x22\x36\x41\ \x2b\x99\xa0\x0e\x48\x38\x60\x02\x1a\x5c\x73\x48\x60\x4a\x88\x49\ \x54\x10\x00\x10\x8b\x5d\x06\x05\xaa\x43\x13\x70\x3a\x9a\x74\x95\ \x67\x99\xe0\x4b\x4b\x8d\xeb\x42\x81\x67\x52\x26\x32\x1d\x04\xde\ \xb1\x07\x5e\x62\x20\x86\x9d\x22\x68\x55\x6d\x20\x14\x42\x9f\x27\ \x04\x8c\x0a\xd0\x78\x02\xc8\x9f\x04\x26\x24\xe0\xc6\x97\xba\x71\ \x54\x50\x60\x2e\x1a\x99\x85\xce\x4a\x0a\x39\xdf\xaa\x75\x04\xe9\ \xc0\xa6\x2a\x8e\xac\x63\xb8\xe1\x78\x16\xdd\x87\x93\x74\xfe\x80\ \x0a\x22\x5e\xe8\x08\xa8\xac\x0d\x48\x39\x0a\xbc\x26\xa9\x0c\xa9\ \x7a\xee\x79\x00\x25\x52\x30\xcf\x00\x3d\x39\x8d\x99\x33\xe7\x90\ \x58\xd1\x04\x39\x77\x43\x03\xc1\xf0\x1a\x38\xe7\x0a\x3c\xdd\x76\ \x06\xb2\x8d\xc0\x9d\x0b\xb5\x8a\x07\x71\xd5\x75\x5f\xc6\x86\x1b\ \x33\x31\x74\xc3\x73\x00\xf7\x01\x3f\x2a\x09\x00\x7d\x53\x29\x01\ \x6d\x84\x87\x82\xe5\xa3\x51\x18\xe8\x9a\xb6\x91\xf3\x0c\x70\x05\ \xc1\xe0\x01\xd8\xbf\xb6\x8c\xc3\x5d\x1c\xdb\x4f\xe5\xb0\xf1\x64\ \x06\x7e\x19\xf0\x24\xf4\x72\x10\x64\x80\x8d\x54\x52\x1b\x80\xb8\ \xf5\xa1\x3b\x61\x64\x26\x3c\x00\x60\x6c\xc1\xfb\x00\x3d\x39\x81\ \xe9\x13\xc7\xd0\xfc\xda\xed\xca\xb2\x59\x26\x00\x55\x5f\x2a\xf0\ \x74\x92\x5c\x5e\xd6\x0b\xd9\xb2\x1b\xae\x15\x55\x5c\xe8\x8a\x4b\ \x84\x24\x40\xc1\x6b\xf0\x32\x41\x9f\x20\x9d\xaa\x81\x57\x01\x4c\ \x92\x5c\x52\x1f\xa9\x61\x21\x23\x02\x14\xd2\x01\x1a\x39\x47\xd7\ \x24\x43\xde\xd5\x9f\x3d\x02\xb1\x11\x5d\x33\x38\xdc\x4e\x46\xf4\ \xe5\xb0\xb9\xa7\x11\xbe\xb4\xc9\x08\x03\xb6\x41\x45\x89\x0c\x00\ \xf4\x12\x60\x0a\x7e\xc8\x75\xcf\xee\x2a\x5e\xfc\x0f\xc5\x08\x04\ \x8b\x19\x30\x8a\xb3\xf7\x7d\x1f\xed\x6f\x7f\x0b\x9c\xf6\xe6\xb9\ \x26\xf8\x21\x60\x27\x27\xd1\x7c\xdd\x5e\x54\x93\xbd\x98\xae\x96\ \x51\x75\x43\x9a\xd7\x55\x96\x75\xe0\x5c\x83\x67\x4e\xd7\xc0\x3d\ \xdd\x80\x2e\x6a\x11\xea\x9a\x14\xb4\x09\xa9\x7a\x23\x80\x71\x43\ \xa0\x90\x07\xf2\x15\xa0\xb3\x08\xe4\x5c\xc4\x4b\x43\x02\x15\x84\ \xd8\xb7\x6a\x1c\xcf\xad\xa8\xe0\xc6\x63\xcd\x58\x35\xd9\x04\xce\ \x39\x12\x8e\xa5\x0c\xe0\x92\x04\x46\x45\x11\xde\x03\xc3\xe7\xbf\ \xa0\xed\x2e\x2d\x78\x2b\x4c\x73\x82\x31\x36\x05\x6f\xf4\x38\x9e\ \xfb\xe4\xd7\xb1\xf5\x1b\x9f\x00\xb3\xcc\x7a\x13\xbc\x40\xca\xc0\ \x18\xc2\xc5\xf1\x43\x70\x8c\x75\xc8\xa7\xb2\x90\xf6\x08\xa6\xc3\ \x22\x66\xfc\x69\x04\xc2\x8f\x5b\x3d\x43\xe0\xa9\x08\x3c\x88\xfb\ \xd3\xd7\xef\x4c\x3c\x2c\x1e\x81\x5e\xec\x05\x6d\x42\x72\xb6\x11\ \x13\x06\x50\x6c\x02\x72\x15\xa0\xab\xc4\xd1\x11\x64\xd0\xe1\xe5\ \x90\x1c\x91\xe8\x2d\x8d\xe2\x38\x2b\x61\x83\xdd\x06\xcb\x30\x24\ \xe7\x2c\xba\x12\x28\xf8\x6a\x10\x7a\x0f\x0d\x9c\xfb\xf2\xa1\xc9\ \xc2\x2f\x01\x5c\x24\xf9\x97\x7a\x33\xe4\x91\x86\x30\xf2\xd3\x9f\ \xe0\xfc\xbf\xaf\xc7\xca\x0f\xde\x09\x70\xa6\x4d\x88\x37\x34\x3a\ \x0c\xbd\x00\x2e\x3f\x85\x49\x5f\x22\x65\xb5\xa0\xd1\x5e\x87\xd5\ \x0d\x5c\xb6\xb5\xf7\x4a\x2f\x39\xc8\x47\x2b\xc0\x68\xb9\x11\xe5\ \xe8\x83\xcb\xc9\x32\x84\x27\xb0\x60\x30\x2c\x18\x7a\x89\x28\x13\ \xac\xa4\x85\xb4\x93\x46\x73\xb2\x19\x4d\xc9\x26\x91\x43\xc3\x70\ \xa5\x38\x53\x1e\xee\xbb\xd0\x74\xfe\xe2\x40\x53\xa6\x12\xef\xf0\ \xcd\x3c\x03\x87\x2a\x6f\x70\x0e\x93\x71\x44\x31\x63\xb0\xd2\xa7\ \x9f\x3e\xf4\xf9\x1f\x9f\x3b\xf7\x43\xfd\x06\xb1\x22\x29\x16\x35\ \x40\x77\x41\x09\x40\x0f\x4e\x7d\xfa\x1e\x54\x47\xa6\xb1\xfe\x23\ \x7f\x0e\xe6\xd8\x60\x80\x1f\xea\xfb\x5a\x11\xaa\x04\x29\x50\xc6\ \x19\x94\x13\xdf\xc7\x40\xa2\x97\x25\x7c\x03\xd7\xd9\xd7\x8d\x6c\ \xcc\x6d\xc4\x6d\xcd\xb7\xa5\xda\xd3\xed\x4e\x73\x43\xb3\x59\x0d\ \xaa\xcc\x0d\x5c\x94\xbd\x32\x66\xaa\x33\x98\xaa\x4e\xa1\xe4\x96\ \x30\xe5\x4e\x51\xc5\x2c\x64\x9d\x2c\x92\x56\x12\x29\x3b\x85\x84\ \x95\x80\x63\x3a\xb0\x0d\x5b\x8a\x40\x84\xe3\xa5\x71\x6f\xa4\x32\ \x52\xee\x2f\xf5\xbb\x3d\x17\x7a\x1a\xc7\xa6\xc6\x3a\xe0\x23\xde\ \x0f\xf2\x40\x83\xcd\xd0\x56\x62\x90\xe0\x48\x70\x1b\xb6\x61\x84\ \x64\x82\x75\xf8\xe2\xe8\x91\x7f\xd8\xbd\xf7\x2b\x07\x86\x47\xf7\ \x01\x18\x24\xcd\x48\x8a\xcb\xfb\x78\x9c\x31\x8b\x52\x8e\xb4\x16\ \xad\xaf\x7f\x23\x36\x7d\xee\xc3\xb0\xdb\x9a\x4d\x7f\xc8\x0d\x32\ \xa5\x04\xb2\xf7\x03\x56\x19\xc8\x1c\x03\xb2\xbd\x34\x0e\x48\xba\ \xa2\x7e\x9d\xb5\x24\x27\xe1\xa0\x23\xd1\x21\x3a\x8d\x4e\xd1\x68\ \x37\xca\x8c\x9d\x61\x79\x3b\x2f\x73\x66\x8e\x35\xd8\x0d\x08\xc2\ \x00\xc5\x4a\x11\x85\x4a\x41\x96\xaa\x25\x4c\xba\x93\x6c\xa8\x32\ \xc4\x2e\x94\x2f\x18\x85\x72\x21\x3e\x5f\xa0\xd7\x01\xaf\x7b\x0e\ \x2d\x16\x90\x3c\xa0\x79\xc2\x7a\xf6\x73\xe5\x1b\x8d\xce\xce\x16\ \xf3\x91\xbe\xfe\xef\x7e\xfb\x59\xf5\x11\x7f\xbf\x5e\x54\xd5\xa8\ \xb8\x57\xf0\x45\x49\xfd\xce\x90\xf0\x48\xed\x30\xb2\x1b\x71\xfd\ \xa7\xde\x87\xa6\x5b\x77\x22\x3b\x98\x42\xfb\xdf\xa7\x90\xee\x07\ \x6c\x05\x1e\x87\xd0\xd9\xaa\xc1\xc3\xaa\xcb\x86\xce\x24\x15\x41\ \x9d\x7c\x0d\xe8\x2f\x31\xa7\x8d\x50\x21\x6b\x3f\xd3\x7b\xcc\xa3\ \x78\x02\x9f\x41\x1c\x45\xd2\xb8\x7e\xd3\x13\x48\x8a\x2b\xfe\x8a\ \x8c\x94\x32\x54\x9b\x22\x50\x45\x58\x2a\xe0\xf8\xdf\xf5\x23\x7f\ \xd3\x2a\xac\x3f\xde\x8d\x55\x95\x2f\x80\xe9\x17\x13\x90\x58\x1d\ \x28\x27\x19\x5a\x7c\x4e\xd6\x52\x21\xb5\x84\x9e\x93\x3a\xcf\x9b\ \xd3\xc7\x5c\x4b\xd4\x81\xd7\x63\x71\x35\x7b\xaa\xee\x55\x85\xaa\ \xea\xbf\xcd\x97\xa4\xf4\x09\x2a\x64\x84\x47\x79\x0a\xc5\x83\xcf\ \xa3\x01\x36\x84\xde\xa8\x78\x0d\x5a\x4b\x03\xcf\x85\x5e\xc2\x00\ \x39\xe7\xb8\x06\x3d\x5f\x4c\xe7\xfa\x02\x08\x25\x5b\x43\x57\x5e\ \xdc\x2f\x4b\xeb\x6e\xd0\x27\x2e\xe1\x24\x7e\x8d\x7e\x7c\x0d\x33\ \x18\x9c\x0b\xba\xc4\xf1\xa2\xaa\x19\x37\xcf\xcc\xa5\x4d\x90\x70\ \x31\x41\xcd\xff\x3c\xee\x8d\x66\xa2\xb8\x6a\x5f\x96\xa6\x73\x73\ \xfd\x21\x4d\x3b\x69\x0d\xb6\xe0\x76\x6c\xc2\x5b\xd0\x89\x6e\x24\ \x60\xc3\x9a\xb7\xf6\x6b\x32\x17\xd8\x03\xfc\xd9\x59\x8f\x97\x3e\ \xf6\x20\x09\x7a\x04\x17\xb0\x1b\xc7\xf1\x18\x5c\x9c\xd0\x97\xb9\ \x22\xf1\xf8\x57\xcb\x80\x7a\x13\x1c\x6d\x44\x63\xbc\x49\x62\x39\ \xb6\xe1\x55\x58\x87\x57\x62\x05\x36\xd0\x51\x3b\x1c\x18\x57\x6c\ \x80\x7f\x89\xb9\x22\x8a\x84\xdc\x87\x21\x1c\xc1\x69\xec\x47\x01\ \x7d\xfa\xc6\x66\xb4\x76\x7f\xa9\x37\xbc\xab\x66\xc0\x7c\x23\x4c\ \x6d\x46\x52\xdf\xd1\xe7\x95\x29\x49\xb4\xa0\x9b\xec\xe8\xc4\x1a\ \xb2\xa2\x03\xcd\x68\x27\x35\x23\x8d\x04\x92\xb0\x55\xaf\x18\xda\ \x16\x17\x02\x15\xf8\x2f\xa8\x0c\x0f\x93\xf4\xa7\x40\xb8\x13\x18\ \x24\xbc\x73\x78\x9e\x60\xc7\x30\x00\xa0\xa0\x55\x24\x95\xf5\x4e\ \xe4\x91\x84\x06\x7f\xe9\x7f\x5f\x40\xaf\xb9\x48\x46\x9d\x21\x36\ \x29\x51\xbb\xa9\x55\x39\x51\xd7\x0b\x86\x16\xab\xdb\xfa\x82\x5a\ \x56\x60\x95\x08\x52\xe7\x19\x0d\x4a\xd2\xbd\xb1\x14\xf4\xd5\x37\ \x60\x69\x43\x16\xd9\xce\x50\xcb\xda\x80\x38\x44\x2d\xab\xb9\x50\ \x8f\x43\x2d\xb9\x10\xf0\xcb\xc9\x80\xa5\x8d\xb9\xcc\x50\xa0\x2f\ \x51\x5c\xfb\xd5\x59\xe0\xda\x6f\x8d\x5d\x33\xe0\x9a\x01\xbf\xc3\ \xf1\xbf\x9d\xd2\xae\xe2\x5a\xef\x69\x4e\x00\x00\x00\x00\x49\x45\ \x4e\x44\xae\x42\x60\x82\ \x00\x00\x0d\x06\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\ \x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x0c\x83\x49\x44\ \x41\x54\x78\xda\xed\x9b\x5b\x68\x55\xd9\x19\xc7\xd7\x49\x4e\xa2\ \x26\x26\x1a\xe3\x35\x31\x5e\xc6\x54\xad\x97\x4a\x95\x29\x38\x14\ \xc4\x22\xb6\xcc\x73\x9f\x2a\xf4\x61\x5e\x7c\x10\xc4\xc2\x0c\x08\ \x7d\x28\xf8\x54\x4a\x1f\x15\xa4\x4f\xf6\x51\x0a\x52\x90\x4e\x07\ \x41\x94\xfa\xe0\xfd\xd6\xaa\x03\x5e\xc6\xfb\x35\x51\x63\x2e\x46\ \xcd\xc5\x7e\xbf\x0d\xbf\x61\xcf\x31\x92\x8c\x1c\x83\xc1\x2c\x58\ \xec\xbd\xd7\x59\x7b\xad\xef\xfb\x7f\xf7\xb5\x93\xc2\xeb\xd7\xaf\ \xd3\xc7\xdc\x2a\xa2\x8f\x03\x30\x0e\xc0\x38\x00\xe3\x00\x8c\x03\ \x30\x0e\xc0\x47\xda\x8a\x1f\x1a\x41\xc7\x8e\x1d\xdb\x53\x5d\x5d\ \xfd\xb3\x69\xd3\xa6\x7d\xe1\x98\xad\xad\xad\xed\x8f\x95\x95\x95\ \xf3\x57\xaf\x5e\xfd\x8b\x72\xed\xf7\x41\x24\x42\xdb\xb6\x6d\x5b\ \x50\x2c\x16\xff\x10\xb7\x9f\xcd\x9e\x3d\xbb\x65\xf2\xe4\xc9\x93\ \x18\x87\x36\xaf\xb6\x81\x81\x81\xc1\x4b\x97\x2e\xdd\x1a\x1c\x1c\ \xbc\xd4\xd1\xd1\xf1\xb7\xbd\x7b\xf7\x1e\x1a\xd3\x00\x6c\xd9\xb2\ \xe5\xb3\xfa\xfa\xfa\xc3\x21\xf5\xaa\x21\x09\x2c\x14\xd2\xdb\xc6\ \x03\x84\x74\xfd\xfa\xf5\x43\x15\x15\x15\xbf\xd9\xb3\x67\xcf\xab\ \xb1\x64\x02\x32\xff\xcb\x9a\x9a\x9a\x43\x21\x84\xe2\xcb\x97\x2f\ \x87\x63\x78\xc8\xb1\x96\x96\x96\xf5\xd7\xae\x5d\xfb\x26\x1e\x7f\ \x35\x96\x9c\xa0\x0c\xfc\xb3\xbf\xbf\x3f\x13\x42\x00\x91\xaa\xaa\ \xaa\x52\x98\x02\x3d\xbb\xb7\x3b\x6e\x9f\x38\x71\x62\xc6\x3c\xa0\ \xd1\x9b\x9a\x9a\xd6\x6f\xd8\xb0\x61\xdd\x98\xd2\x80\xcd\x9b\x37\ \xff\x39\x98\x69\xec\xeb\xeb\x4b\xcf\x9e\x3d\x4b\x0f\x1e\x3c\x40\ \xa5\x47\x0a\x5c\x0a\x27\x99\x1a\x1b\x1b\x93\xad\xae\xae\xee\xaf\ \x71\xf9\x74\xac\x00\x00\xb3\x5f\x04\xf3\x48\x10\xef\x9e\x16\x2d\ \x5a\x94\xc2\xf9\xa5\xe7\xcf\x9f\x23\x65\xe7\xa4\xce\xce\xce\xd4\ \xd0\xd0\x90\x31\xfc\xf4\xe9\xd3\x34\x69\xd2\xa4\x74\xfa\xf4\xe9\ \xf4\xe4\xc9\x93\x44\x0b\xff\x91\x68\x53\xa6\x4c\xf9\xf9\xc6\x8d\ \x1b\x8b\x07\x0e\x1c\xe8\xff\xe0\x01\xd8\xb4\x69\x53\x75\xb4\xe9\ \x71\x0b\xc3\x78\xf6\xb4\x6a\xd5\xaa\x34\x61\xc2\x84\x74\xe3\xc6\ \x8d\x34\x6b\xd6\xac\x74\xea\xd4\xa9\xd4\xda\xda\x9a\xe6\xcf\x9f\ \x8f\x9d\xc3\x60\xba\x7a\xf5\x6a\x5a\xb8\x70\x61\x3a\x7b\xf6\x6c\ \xf6\x4e\x77\x77\xb7\xe6\x00\x68\x95\x2f\x5e\xbc\xd8\x14\x4b\xfe\ \xfd\x83\x88\x02\xdb\xb7\x6f\x6f\x7c\xf4\xe8\xd1\xba\x20\xbc\x3f\ \x88\x9d\x17\xd2\x5b\x31\x73\xe6\xcc\xdf\xde\xb9\x73\xa7\x2b\x88\ \x9e\x1c\x63\xd3\x83\xe0\x84\x16\x00\x42\xc4\xf7\x77\xd1\xa2\x4c\ \x33\x02\xcc\x0c\x84\x5b\xb7\x6e\xed\x0b\x8d\xd9\x4f\x38\x8d\x7e\ \x34\xd6\xfc\xf7\x89\x13\x27\x1e\xbc\x17\x00\x7e\x1d\x6d\xc5\x8a\ \x15\x95\xc1\x54\x6d\x30\xd3\x7a\xe6\xcc\x99\xdf\xaf\x59\xb3\xa6\ \x39\x18\x7d\x10\xd2\x68\xba\x70\xe1\x42\xed\xb2\x65\xcb\xd2\xdd\ \xbb\x77\xd3\xd4\xa9\x53\x53\x57\x57\x57\x7a\xfc\xf8\x71\x46\x6c\ \x84\xad\xc4\xbe\xd8\x3e\x12\x0c\xa0\x90\xa8\x9e\x7e\xc4\x0d\x4d\ \x61\x1d\x1c\x28\x66\xc3\xfd\xe5\xcb\x97\xf1\x07\x98\x13\xfb\xbc\ \x0e\xad\xba\x1c\x4e\xf4\x1f\x3d\x3d\x3d\xff\xda\xbf\x7f\xff\x89\ \x98\x33\x38\x62\x00\x76\xec\xd8\xb1\xf4\xe6\xcd\x9b\x5f\xc5\x6d\ \xcb\xe2\xc5\x8b\x6f\xd6\xd6\xd6\xd6\x04\xa1\x8b\x7a\x7b\x7b\x5b\ \xcf\x9f\x3f\xdf\xc8\x26\xa8\x24\x92\x84\x51\x18\xc0\x63\xf3\x8c\ \x6d\xbf\x7a\xf5\xca\xae\x27\x77\x69\xa4\xce\x38\x44\xd2\x99\xcf\ \x18\x4c\x0c\x1b\x0e\x01\x2d\x68\x51\x0b\x78\x3f\x63\xd8\xe7\x90\ \x7a\x8a\xe8\x82\xf9\x00\x3e\x7e\x22\xdb\x3b\xe8\xee\x6c\x6f\x6f\ \xff\x26\xf6\xfd\x32\xe6\xdc\x1e\x12\x80\xdd\xbb\x77\xa3\x8b\xbf\ \x7b\xf8\xf0\xe1\x5f\x8e\x1f\x3f\x3e\x3b\xd4\x88\x97\x0d\x37\x10\ \x08\xe1\x79\x06\x91\x1e\x1b\xdb\xdf\x78\x46\x42\x74\x1b\x6b\xe0\ \xd0\x64\x9e\x3d\x60\x8c\x7b\xae\xf9\x6e\xf3\x3d\xaf\xac\xeb\x95\ \x0e\x00\x79\xe7\x19\x1a\x09\x08\x00\xc5\xfa\x38\x4f\xfc\x48\xe6\ \x67\x42\x1b\xae\x1f\x3d\x7a\xf4\x93\x37\x00\xd8\xb5\x6b\x57\x4d\ \xd8\xd0\xd7\xa1\xaa\xeb\x62\x92\x4c\xb2\x10\x1d\xc6\xd8\x14\xbb\ \x85\x38\x09\x18\x16\x00\x36\x86\x39\x1b\xce\x0b\x2d\x81\x30\xc6\ \xed\x23\x01\x80\x2e\x93\x79\x10\x58\xcb\x88\xe0\xef\x87\x0f\x1f\ \x66\x1f\x98\x56\x08\xdc\xd3\xfb\xc3\x24\xeb\x6f\xdf\xbe\xdd\x5b\ \xf4\x85\x9d\x3b\x77\xb6\x44\x38\xfa\x36\x54\xb9\x96\xd0\x93\x27\ \x02\x64\x91\x18\xe3\x61\xf3\x69\xee\xdc\xb9\x29\x5e\x06\x08\x36\ \x96\x30\x89\xcb\xe6\x00\x60\xe4\xea\x3f\x20\xd6\xe6\xfa\x00\x25\ \x08\x6a\x80\xfb\x39\xce\x9a\x39\x40\x87\xd4\x00\x3b\xcc\xf1\x1e\ \xfe\x06\x8d\x20\x7a\x60\x56\x08\x12\x20\x42\xab\x11\x24\xeb\x17\ \xc3\x17\xfd\x09\x5f\x9d\x01\xb0\x6f\xdf\xbe\xc6\x90\xca\xb5\x28\ \x32\xaa\x64\x3a\xcf\x3c\x49\xca\xca\x95\x2b\x13\xed\xc8\x91\x23\ \x20\x9d\x81\x10\x7e\x00\xe9\xe6\x01\xc8\x88\x8e\x82\x86\x8d\x01\ \x8d\x35\xb2\x4d\x6d\x6a\x14\x8d\xb9\x30\xc7\x1e\xd3\xa7\x4f\xc7\ \x79\xf1\x9b\x1a\x02\xe1\x43\x81\x24\x20\xa5\x20\xc8\x38\xe0\x2b\ \x79\xd6\xc0\x0c\xe8\xd6\x0f\xfc\x86\xe3\xfd\x2a\x9e\xf7\x64\x00\ \xdc\xbb\x77\xef\x3f\x11\x77\xab\x54\x53\x99\xd7\xfe\xc9\xb8\x02\ \x31\x9c\x48\x46\xa4\xf3\x24\x16\xfb\x82\x10\xcd\x23\x22\x00\x8c\ \xf2\x2c\x00\xae\x9b\xad\x41\x13\x00\x12\x20\xd6\x46\xa3\xc8\x01\ \xf2\x4e\x50\xa6\x35\x3d\x9b\x29\x71\xe9\x6f\xac\x8d\x83\xc4\xe1\ \x42\x07\xeb\xd2\xb6\x6e\xdd\x9a\xdd\x9f\x3b\x77\x0e\x67\x4d\xa4\ \x40\x0b\x2b\x02\x88\x4f\x8b\x21\xfd\xda\x50\x8d\x9f\xe6\xbd\xac\ \xc4\xa9\x8a\x84\x29\x50\x43\xa2\x80\x81\x84\x4f\x9e\x3c\xc9\x34\ \xc6\xd9\x54\x00\x40\x18\x86\x95\x8e\x25\xec\x0f\x34\x80\x36\x6f\ \xde\x3c\x9c\x2a\x5a\x04\x31\xec\x07\xb8\x86\x34\x9e\x5d\x03\x1a\ \x74\xb6\xec\x87\x76\x71\xcd\xfb\x09\xe6\xb0\xaf\xeb\x93\x1f\x08\ \x36\x91\x20\xfb\x7d\xce\x9c\x39\x19\x38\x57\xae\x5c\x31\x5a\x4d\ \x2b\xc6\x4b\xad\x11\x8f\x0b\xbc\xa8\x63\x73\x41\x91\x9e\x31\x63\ \x46\xb6\xb0\xa9\xea\xc1\x83\x07\x9d\x87\x8a\xb1\xd1\x1b\x6a\xc9\ \x06\xda\xbf\x44\x0a\xc4\xf2\xe5\xcb\x49\x65\x31\x27\x18\x05\x54\ \xcc\x0a\xa2\x19\xd7\x9e\x95\x24\xb4\x20\x41\x34\x0d\x3a\x98\x03\ \xb3\xa8\x3c\x57\x23\x13\x82\x50\x20\x8c\xab\x45\xf8\x37\xae\xbc\ \x57\xea\x5c\x0b\xc5\xd8\xa0\x10\x8d\x7c\x9b\x8d\xf3\x5e\x7f\x48\ \xc6\x68\x10\xc6\x6f\x3c\x03\x00\x0b\x43\x30\x44\xd2\x35\x0d\x43\ \x9f\xef\x31\x8e\x2f\x21\xa5\x25\x09\x82\x69\xf6\x05\x60\xd6\x40\ \xc3\xb8\xc2\xb4\x0e\xcf\x7d\xd5\x4a\xf6\x31\x17\xc0\xff\xb0\x26\ \x6b\x01\x12\x7b\xd2\xa0\x01\x3e\xbc\xd7\x17\xd9\xf3\x0d\x0d\xe0\ \x65\x88\xd0\x86\xe9\x82\x90\x0f\x7f\x02\x61\x1e\xfe\x86\x5d\x6a\ \x7f\x02\xa0\x59\xd8\xc8\xed\x2f\x5e\xbc\x08\x68\x48\x1d\x89\x03\ \x00\x3e\x08\x69\xb2\x2f\x84\xeb\x00\xe9\x32\x8b\xf4\x55\x5b\xe6\ \x40\x07\x6b\xe0\xf0\x58\x83\x88\xc3\x3c\x0b\x26\x53\xeb\x61\x53\ \xec\xa2\x2a\xf4\xae\x4d\x2f\x9d\x6b\x10\x85\xa4\x4a\xd3\x56\x9c\ \x1c\x0c\x10\x26\x91\x0c\x73\xd0\x06\x00\x83\x01\x1c\x14\x6b\xe1\ \xb1\xd1\x1e\xf3\x07\x01\x61\x5d\x68\x45\x73\xb8\x47\x0b\x99\x03\ \xe3\x80\x00\xf3\xbc\x8b\x43\x25\x04\x1a\xc5\xb8\xda\x87\x01\xa0\ \x4c\x0d\xc2\x60\xc0\x06\x51\x48\x18\x55\x85\x50\x7d\x47\x14\x46\ \x5c\x61\x1c\x8d\xc1\x31\xf2\x1e\x0c\xb3\x06\x0c\x41\x1b\x0c\xd2\ \x01\x4d\xed\x83\x31\xd6\xa5\x94\xc6\x79\x5a\x1a\xb3\x47\x36\x7e\ \xff\xfe\x7d\x9c\xec\xb0\xf5\x05\x3e\x20\x95\xbb\x69\x32\x46\x15\ \x98\x8a\x63\x2b\x33\x31\x4d\x0b\x46\xa8\xe0\x32\x82\x97\x2c\x59\ \x42\xb1\xc4\x19\x5f\x69\x46\x88\xb4\x61\x1e\xa6\x59\x03\x86\x01\ \x8e\xe8\x01\xd3\x5c\x71\xd0\xac\xc9\x95\x75\x19\xc3\x54\x4c\xb3\ \x05\xe2\xfd\x6b\x80\x9b\xda\xb0\x47\xc2\x28\x04\x40\xac\x21\x92\ \x2b\xb6\x8f\x39\x00\x00\xe6\x01\xe1\xe6\x0d\xe6\x21\x26\x2f\xfa\ \x03\x7d\x92\x76\x0e\x38\x80\x82\xc6\xa8\x25\x8c\x13\xfa\x58\x1f\ \xad\x1a\xd6\x07\x94\xb3\x11\x26\x21\x02\x50\xb5\x41\xd4\xbf\x94\ \x79\x54\x17\x82\x91\x26\x7e\x40\x4d\xe4\x1d\x23\x8a\x79\x88\xe9\ \x30\x73\x60\xd4\xb9\xcc\x43\x5b\xe4\x81\x39\x00\x05\x20\x79\xc7\ \x6d\x1b\x15\x0d\x30\x03\x63\x63\x25\x44\x83\x59\x01\x80\x09\xa4\ \x4d\xb9\x8a\xad\x32\x66\x4a\x8c\x64\x35\x15\xcf\x0e\x64\xce\x08\ \x01\xc8\x98\x0b\x8e\xd5\x04\x88\xf7\xd4\x06\x43\x26\x9a\x85\x1f\ \x61\x9d\xd1\xd2\x00\xe3\x36\x1d\x86\x70\x4a\x84\xaf\x7c\xa6\x08\ \xf1\x84\x5d\x3d\x39\x0c\xe8\xd4\xb0\x61\xa3\x00\xa0\x31\x6e\x78\ \x86\x79\xde\xb1\xe0\xa1\x13\x05\x04\x3e\x9f\x00\xc1\xb4\x7b\x51\ \x67\x70\xff\x56\x27\x58\x56\x0d\x90\x51\x9a\xea\x8e\x9a\xe7\x55\ \xd2\x3a\x9d\x28\xc0\xb8\x67\x06\x8c\x31\x17\xa6\xb8\x1a\xfb\xcd\ \xf4\x90\x3c\xcf\xfa\x05\x8b\x1f\x9a\xd9\xa2\x69\x35\x60\xd0\x0c\ \x9b\x68\x1c\xfb\x8e\xaa\x06\x68\xab\x4a\xd1\x31\x98\x70\x1e\xfb\ \x43\x38\x04\xeb\xe1\x71\x60\xf3\x66\x2c\x49\x4d\xd3\x3e\x49\x03\ \x13\x42\xdd\xbb\x6f\xa3\x29\x30\x6c\x8d\x60\xde\x6f\xea\xab\x84\ \x87\xca\x1e\xc9\x31\x00\xd5\x7c\xe2\xfd\xfa\x80\x3c\x21\x82\x9b\ \xaf\xda\x54\x55\x88\xb7\xb4\x05\x00\x41\x50\x0b\xe6\xcf\x5c\x9a\ \xfa\x6b\x1f\xa7\xe6\xa6\x96\x54\xdd\x96\x85\x4c\xed\x1d\x46\x74\ \xb6\xac\xc7\x3b\xae\x6f\x04\x92\x27\xfd\x0a\xa6\x88\x29\x00\x40\ \x59\x35\x60\xd8\x23\x2b\x01\xb0\xa9\x01\xee\x2b\xd1\x8c\xe5\x35\ \xa1\x50\xf7\x32\x2d\x58\xb4\x34\x15\xeb\xfa\x52\xb1\xba\x39\x75\ \x90\x2a\xc7\x3b\x66\x99\x9e\x31\xa2\x19\xac\xaf\x29\x5b\xd0\xe5\ \xa3\x10\xe1\xd0\xcc\xb3\xb4\x55\x94\xd3\x07\xc8\xa8\x04\x20\x95\ \x52\x60\xf2\x67\x0e\xf9\x7b\x9f\x3d\x23\x7c\xde\xdf\x1e\xcc\x3e\ \x4a\xb5\x55\xf5\xa9\x3e\xca\xd8\x89\x75\x93\x53\xfd\xec\xc8\x19\ \x1a\xa6\x38\xcf\xf7\x5c\xc3\xee\xfe\x76\x35\x0d\xb0\xde\x04\xa0\ \xdc\x3e\x20\x4f\x40\xbe\xa2\xf3\xde\x4c\xd0\xef\x7f\x30\xeb\x5c\ \xfb\xf7\x31\xbf\xa7\x37\x75\x84\xea\x77\xb5\xb7\xa5\xee\xb6\xf6\ \xd4\x1b\x6a\x3c\x21\xbe\x9c\x0f\xe6\x34\x8c\xf5\x2c\x99\x05\x54\ \xe9\x6b\x86\x66\x93\xac\x5b\xda\x8a\x12\x53\x6e\x00\x8c\xdd\x3a\ \x2d\x9a\xa1\xd1\x33\x02\x55\x9f\x79\x3a\x35\xed\x1b\x6f\x5e\xc5\ \x07\x8f\xfa\xba\xd4\xf7\xbc\x27\x3d\x8d\x32\xb9\xb3\xa7\x3b\xf5\ \x15\x99\xfb\x7d\xc5\x0a\x00\xbc\x83\xa7\x57\xd2\xa5\x25\x38\x7b\ \x50\x83\x70\x1d\x1d\x00\x24\x40\x00\x2c\xb9\x75\x4a\x82\xc2\xbd\ \x85\x92\xcc\x6b\xe3\xcc\xc9\xca\xe3\xca\x42\x7a\x45\x32\x55\x5d\ \x91\xba\xba\x3b\x23\xb7\x4e\xa9\xab\xb3\xcb\x13\x6b\x22\x06\x60\ \x19\xf7\x65\xdc\xc6\x98\xc5\xd2\x90\xad\xa8\x57\x2e\x57\xf3\x24\ \x57\x42\xcc\xe3\x21\x42\x7f\x03\xb1\x66\x7e\x48\x0e\xdb\xa4\x9b\ \xfe\xe6\x6d\x96\x10\x56\x37\xb3\x21\x4d\xa8\x9c\x98\xba\x7a\xbb\ \xd2\xa3\x2b\x0f\x01\x0c\x2d\x61\x4d\xee\xcd\x1a\x3d\x87\x54\xab\ \xbc\x1f\xdd\x54\x18\x06\xf2\x84\xc0\x84\xa0\xd0\x4c\x7a\x90\x9a\ \x80\x51\x10\x91\x12\x23\xfd\x7c\xf1\x83\x60\x3c\x95\xce\x67\x82\ \xda\x33\x8c\x73\x82\xb4\x60\xc1\x02\xcf\x27\x05\xd8\xc4\x89\x44\ \x69\x74\x8b\x21\x9d\x9a\xcd\xb3\x3a\x80\x80\x60\x6d\x14\xd5\x67\ \x0c\x66\x01\x8a\xda\x3d\x3e\x5b\x65\xc0\x18\xeb\xad\x05\xb4\x65\ \x41\xf0\x9c\x32\x3e\xdb\x71\x40\x2b\xd0\xcc\xc9\x3b\x42\xb5\x84\ \x3d\x47\x4f\x03\x4c\x47\x05\x82\x67\x08\xf1\x68\x8b\x31\x99\xf6\ \xd0\xd3\x12\x1a\x10\x50\x79\x6b\x04\xab\x41\xdf\xf1\xec\x12\x9a\ \xa9\x20\x39\x12\xf3\x5c\xd0\x33\x4a\x80\xf5\xd3\x1d\xe6\x05\xf3\ \xa3\x75\x20\x62\xfd\xaf\xf3\xd3\x0c\x60\xca\x6a\x4d\x02\x21\x1a\ \x40\xf2\x1f\x47\x19\x83\x21\x8b\x17\xa4\xed\x3c\xc3\x27\x5f\x77\ \x00\x94\x4a\x12\x06\xd9\x03\xe6\x35\x09\xfd\x0f\x42\xe0\x58\x8c\ \xdf\x46\xd7\x07\x58\xcf\xeb\x84\x54\x77\x2b\x40\x98\x32\x13\xb4\ \x74\x36\x1c\xf2\x9b\x45\x8b\x15\x9d\x1f\x52\x61\x44\x8f\x1e\x5f\ \xaa\xd1\x0e\x4f\x95\x00\x8f\xf7\x33\xa0\x3c\x29\x6a\x6e\x6e\x36\ \xed\x1d\x55\x1f\x20\xc3\x1e\x45\xeb\x18\x01\x85\x7c\xdc\x83\x4e\ \xf3\x7a\x01\x31\xf4\xe1\x20\x61\x54\xd3\x00\x00\xde\xa1\xf6\x67\ \x1d\xd7\xd4\x21\x5a\x4c\xb1\x27\x63\x74\xd6\xc0\xf9\x01\xfa\x88\ \x00\xe0\x0b\x71\xb9\x01\xc0\xa1\x69\xbf\x66\x6c\x48\x0b\xf5\xd5\ \x57\xc0\xb8\xde\xde\x52\xd7\x44\x4a\xa6\x4a\x73\x0b\x55\xde\x22\ \x27\x9f\x0c\x79\x62\x84\xf4\x31\xbb\x11\x29\x6c\x31\x50\xae\x61\ \xd1\x72\x54\x7f\x36\x88\xb3\x04\x2e\x05\x06\x10\x20\x54\xe7\x05\ \x13\xac\x81\xdd\x23\x71\xa5\x6a\x6d\x60\x46\x49\xb7\xb6\x27\xf9\ \xf1\x54\x29\xff\x75\x8a\x77\xf9\xd6\xc0\xbc\xb5\x6b\xd7\x72\xec\ \xa6\x06\xe9\x24\xf9\x2e\x21\xdd\x00\xde\x87\x06\x34\xf0\xf0\x0e\ \xcd\x8c\xee\x6d\x5a\x80\x2d\x2a\x39\xbb\xc7\xde\x10\xe7\x87\x0d\ \x08\xf1\x4b\x8e\xa7\xba\x1e\x8c\x70\xc6\x0f\x53\x00\xc5\xf1\x39\ \x6b\xc8\x98\xef\x20\x6d\x00\x63\x3d\x2b\x4e\x2a\x40\xd6\xf6\x3d\ \x40\xf5\xbc\x01\xba\xa0\x01\x20\x6f\x15\xf9\xdb\x5b\xff\x14\xed\ \xc7\xb6\x7c\xf5\xa5\xbd\xea\xfd\xd9\xc0\xdf\x4a\x9b\x4e\x12\x8f\ \x0e\x51\x48\x15\xa2\xf3\x69\x33\x34\xd1\x79\x9f\x64\xc7\x46\xe6\ \x67\x68\x33\x29\xe2\x7d\x4b\x5d\x01\xf8\xee\xbb\xef\x86\x22\x59\ \x00\xd1\xd0\xb3\x11\x49\xfe\x5b\x8c\x81\x9b\x64\x5a\x6c\xca\x22\ \xf9\xd8\x9b\xaf\xeb\xed\x2c\x6e\x4d\x0f\x61\x7e\xa8\x90\x28\x8f\ \xb8\xec\x6e\xea\xb5\xa4\x79\x86\xef\x91\xd8\x70\x69\xb9\x66\x82\ \xcf\xf0\x0b\xb6\xe7\x83\x23\x31\x57\xfd\xc7\x85\xf8\xfb\x86\x2f\ \x63\xa8\xad\x18\x52\xea\x08\x6f\x79\x28\x08\x5f\xef\x5f\x58\x04\ \x83\x32\xe2\x55\xe2\x65\x12\x2f\x3f\x10\x44\x7c\x1b\x8f\xcf\xf2\ \x69\xae\xcd\xf8\x3e\x82\x26\x38\x95\x01\xe8\xd4\x58\x63\x7a\xd0\ \x50\x13\x9d\xbf\x57\x80\x3e\xf6\x1b\x88\xf1\xbe\xb8\xbc\x88\xa9\ \x8f\xc3\x41\x3e\x09\xa0\x7e\x6c\x02\x83\xd0\x3a\xc2\x9c\x2e\x45\ \x38\xfe\x3a\xd6\xbb\xc0\x29\x7e\x21\xfe\xf6\x7e\x52\x2c\xbc\x3a\ \x54\xf6\xf3\x40\x77\x59\xfc\xf0\x13\xfe\xcc\x8d\xf9\x79\xc9\x4b\ \x67\x34\xa0\xbe\x1d\xb6\x74\x24\x88\xf8\x5f\xbc\xdb\x99\xde\x4f\ \x73\xc3\x42\xb4\xd7\x65\xc8\x4f\x90\x0e\xb4\x12\x1b\xef\x45\x7f\ \x12\x7f\x71\xfa\x3a\x0b\x81\xf1\xf7\x7d\xd3\x02\xed\x96\x60\x66\ \x6e\x3c\x83\x7e\x7d\x00\x41\xfd\xca\xef\x48\xb2\x10\x9d\x7b\xfa\ \x60\xdc\xb3\x50\x7b\xcc\xb9\x16\xd7\xa7\x69\x6c\x34\x40\xec\x23\ \x68\x04\xe3\x7d\x0e\x9a\x03\x00\x42\x15\x99\x6c\xf4\x9a\xe8\x18\ \xa2\xfa\xeb\xb5\x40\x67\x21\x54\x07\x7f\x44\x07\xc5\x34\x86\xdb\ \xf8\xbf\xce\xa6\x34\xfe\x5f\x63\xe3\x00\x8c\x03\xf0\x11\xb7\xff\ \x03\x7f\x19\x0a\xe4\xd7\x62\x63\xda\x00\x00\x00\x00\x49\x45\x4e\ \x44\xae\x42\x60\x82\ \x00\x00\x15\x14\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x04\x73\x42\x49\x54\x08\x08\x08\x08\x7c\x08\x64\x88\ \x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x06\xec\x00\x00\x06\xec\ \x01\x1e\x75\x38\x35\x00\x00\x00\x19\x74\x45\x58\x74\x53\x6f\x66\ \x74\x77\x61\x72\x65\x00\x77\x77\x77\x2e\x69\x6e\x6b\x73\x63\x61\ \x70\x65\x2e\x6f\x72\x67\x9b\xee\x3c\x1a\x00\x00\x14\x91\x49\x44\ \x41\x54\x78\xda\xe5\x5b\x79\x8c\x64\xc5\x7d\xfe\xbd\xa3\x8f\xe9\ \xee\x39\x76\xa6\x97\xdd\xb9\x96\x3d\x66\x61\xef\x05\x61\x6c\xae\ \xa0\x38\xb6\x20\x4e\x2c\x22\x27\x32\x09\x92\x0f\x14\x20\xc6\x81\ \x18\x84\x92\x08\x59\x8a\x30\x7f\x18\x04\x09\xe0\xf8\x08\x47\x24\ \xa2\x24\x76\x14\x9b\x80\xf3\x4f\x0e\x27\x86\x80\xc3\x61\x60\x31\ \xe6\xb0\x21\xbb\xec\xb2\xf7\xce\xf4\x4c\xcf\xf4\xdd\xfd\xae\xaa\ \x7c\xbf\x7a\x5d\xf3\xfa\x98\x49\xef\xb4\x90\x65\x29\x65\x7d\x54\ \xbd\x7a\x47\xd7\xf7\xbb\xab\x66\x6d\x48\x29\xe9\xff\x73\xb3\xe9\ \x97\xb8\xbd\x74\xed\xb5\x03\x9e\xeb\x66\x09\xf0\x84\x18\x23\xe9\ \x67\xa5\x2f\xb3\x42\x88\xac\x14\x18\x63\x4e\x04\x22\x2d\xfd\xe0\ \xdf\x7f\xf3\x95\x57\xfe\x8a\xfa\x68\xbf\x30\x0b\x78\xef\x4b\x5f\ \x4a\x54\x3d\x2f\xeb\x48\x37\x6b\xf8\x41\x96\x04\x88\x04\x04\x02\ \x41\x56\x92\xc8\x52\x20\x43\x52\x52\x8c\xc9\x40\xe0\x9e\x60\x82\ \x29\x89\x87\x70\x4d\x18\x87\x08\x02\x12\xd1\xb8\xd9\x8b\xc6\x46\ \x21\x86\x2e\x3a\x70\xc0\xfb\x85\x58\xc0\xcf\xef\xbe\x3b\x6e\xd5\ \x6a\x59\xd7\xf3\xc6\x4c\xc3\xc8\x0a\x62\x12\x06\x2f\x18\x3d\x8d\ \x19\x22\xc8\x0a\x49\x59\x92\x4c\x42\x86\x7d\x20\xd3\x20\x47\x06\ \x6e\xa0\x03\xd0\xf3\x80\x00\x26\x21\x19\x12\x64\x00\xdc\x23\xd9\ \x84\x7a\xae\x1d\xb4\x0c\xd2\x73\xc9\x63\x52\xee\xbc\x88\xe8\xcd\ \x0f\x44\x00\xef\xdc\x79\xe7\xed\xe5\xb8\xbd\x29\x79\xe2\xe4\x88\ \xb1\x6e\x24\x26\x0d\xca\x1a\x64\x8c\x11\x48\x12\x49\x80\x06\x7d\ \xe2\x26\xa1\x38\xee\x42\x32\x7a\x61\x22\xec\x43\xed\xf0\x98\xfb\ \xe6\x75\x04\xb9\x32\xa4\x86\x88\xde\xd7\x08\xaf\x43\x88\xf6\xdf\ \x34\xa4\x7f\x01\x7d\x10\x02\x78\xec\xc2\x0b\xbf\x72\xc5\x95\x97\ \xdf\xe5\x98\x43\x94\x1a\x18\xa0\x40\x88\x90\xaa\xc1\xff\x55\xff\ \xa1\x50\xf4\x7a\x28\xc3\x61\xa4\x9d\x88\x74\x34\x56\xef\x5a\xa9\ \x34\x05\x8d\x3a\x5c\x99\xcd\xda\x65\x33\x50\x30\x63\x36\xe6\x1b\ \xe1\xb5\xd0\xc4\xf1\x46\x32\x41\xa4\x85\x55\xa9\xb4\x0b\xa3\xc3\ \x2a\x84\x30\x2e\x30\x0c\xe3\xef\x25\x5a\x5f\x02\x30\xd0\xee\x98\ \x9e\x4e\xce\x0c\x0f\xdf\x5e\x2f\x95\xa9\x54\x2c\x53\x76\x7c\x9c\ \xfc\x72\x89\xc8\x34\x69\xb5\x66\x26\x12\x24\xea\xf5\x48\x10\xe1\ \xe2\x99\x8c\xd6\x54\x48\xcc\x60\x01\x0c\xa0\xc7\x3b\x98\x0b\x6a\ \xfc\xb2\xa5\xe6\xfc\x5a\x83\xac\xc1\x21\xf4\x35\xb2\x86\x06\xc9\ \xcd\xcd\x13\xa5\x53\xca\xf7\x85\x03\xc1\x60\x5e\x13\xee\xd6\xbe\ \xb6\x00\xb1\xbf\xa9\xa1\xb5\x0b\x80\xc9\xf3\x72\x3c\xa2\x6d\x41\ \x10\x0c\xd7\xf0\x83\x85\xa5\x22\xc5\x76\xee\xa4\x5a\x6e\x8e\xcc\ \x64\x52\x4b\x49\x6b\x5d\x75\xf1\x6c\x96\xbc\x42\x81\x12\x1b\x36\ \x52\x50\xad\x84\x6b\xf1\x3d\x32\x62\x31\xe2\x4f\x06\x9e\x47\xd6\ \x40\x4a\x09\xa8\x31\x3f\xaf\x34\xeb\xd7\x41\x36\x99\xc4\x3b\x1b\ \xc8\xc9\xe5\x48\xb2\x65\xc0\xd2\xbc\x7a\x95\xc8\x32\xc9\xaf\xd6\ \xc8\x84\x50\x02\xd7\xa3\x00\xe4\xf9\x5d\xe9\xba\x91\xf6\x05\xf7\ \x1d\xae\x80\x1e\x2a\xda\xcb\x2b\xec\xd7\x05\x0c\x20\x31\x57\xaf\ \xaf\x9f\x49\xa5\xa8\x86\x1f\x75\xaa\x55\xb2\x86\x47\x28\x60\xe9\ \xc7\xe2\x78\xa2\xfd\xeb\x12\x30\x2c\x1b\x8b\x74\x48\xb8\x0e\x34\ \x08\xcd\x2d\x2c\x28\x72\x36\xb4\xe9\x2c\x2e\xc2\xb4\xe3\xea\x9e\ \xa4\xd0\xff\xb5\x00\xdd\xa5\x25\x08\x6e\x89\x04\x5c\x21\x58\x2a\ \x34\x4d\xbe\x33\x3e\x04\xaa\x27\xdb\xc2\x37\xbc\xe8\x9e\xd4\x71\ \xa5\x45\x18\x00\xfe\xb3\xfe\x9b\xdb\xb7\x8f\x43\xf0\xa7\xd6\xe2\ \x06\x76\x53\xfb\x16\x90\x2e\x04\xc1\x04\x07\xb0\x06\xfc\x31\x33\ \x98\x21\x7b\xdd\x08\x49\x98\xa7\x1c\x0c\x34\xe9\xb6\xe6\x2c\xcc\ \x2b\xc2\x0d\x68\xd2\x4a\x24\x95\x86\xdc\x52\x99\x4d\x5b\x49\xab\ \x7e\xfa\x54\x4b\x1c\x90\x54\x3b\x71\x42\xbb\x84\x26\xda\x41\x5e\ \x32\xda\xef\x35\x7c\xfd\x8d\x2e\x17\x00\xda\x2c\x63\x90\x88\x03\ \xe1\xa9\x7e\x2c\xc0\x04\x52\xae\x54\x45\x06\x39\x8e\x4b\xe7\x6c\ \x9f\x21\xd7\x07\x71\x19\xe6\xdb\x95\x4c\xc0\x87\x95\xe8\x00\x28\ \x3c\x8f\x47\xa1\x99\x57\xca\xad\x01\x31\x22\x2d\x23\x82\x3a\x4b\ \x44\x02\x88\xae\x89\xc1\xf9\xde\xf7\x29\xf0\xb9\xf7\xd4\xd8\xc7\ \x98\x94\xba\x2c\x32\x01\xb8\x5a\x28\x6c\xdc\x93\x58\x0b\xc8\xec\ \xc3\xdd\x7f\xe9\x57\x00\x31\x43\xca\x14\x2f\xd2\x81\xcf\x4d\xcf\ \x6c\xa3\xea\x7c\x8e\xcc\x78\x3c\x5c\x54\x77\xd3\xe4\xa3\x6c\xa0\ \x53\x22\xe9\x34\x18\x09\x81\x05\x20\x02\xc1\x71\x21\x04\x2f\x1a\ \x40\xaf\x82\xac\x61\x59\x80\x0d\x60\x8c\xdf\x34\x6c\x9b\x6c\xcc\ \xc7\x00\xa4\x60\xf0\xe4\x9e\xf8\x79\x95\x31\x82\x3a\xe0\x38\xe1\ \x98\xdd\x8c\xb3\x89\x94\xfb\x74\x20\xec\x27\x0d\x9a\xf0\xd1\x18\ \x2f\xd6\xf3\x7c\x15\x7c\x2a\xe5\x1a\x0d\x20\x1a\x3b\xda\x02\xba\ \x9a\x04\x09\x90\x0a\x3c\x28\xc1\x67\x2b\x08\xb5\x16\x04\x4c\x46\ \x91\xb0\x00\xee\xc9\x8e\x21\x63\x58\xb8\xb6\xe0\xd6\x36\x00\xc2\ \x26\x60\x19\xca\xc7\x03\xfc\x9e\xd0\x84\x18\xd0\xa8\xaf\x2d\xa4\ \x37\x94\x0b\x58\x3a\x10\xf6\x15\x04\x81\x79\xdf\x2f\xa2\x57\x64\ \x3c\x04\xb1\x52\xb5\x4e\x83\x08\x84\x8d\xc5\x3c\xd5\x0a\x45\x12\ \x2c\xa5\x78\x8c\x4d\x4f\x59\x86\x65\xa1\xcf\xc4\xc8\x42\xb0\x8b\ \xc7\x98\x5c\x1c\x81\x2f\xd4\xa2\x6c\x92\x11\x8a\x90\x43\x3e\x7a\ \x59\x87\x90\x9a\xe6\xee\xb7\xb9\x40\x38\xa6\x68\xdc\x01\xd9\x1b\ \x52\x32\x89\xed\x9f\xdb\xb0\x21\x89\xb0\x56\x93\x68\x6b\x2e\x84\ \xde\xaf\xd7\x17\xf1\x96\xd2\x60\xad\x5c\xa6\x42\x2e\x4f\xe7\x5e\ \x3c\x4d\xf2\xd4\x29\x1a\xdb\xb5\x8b\xcd\x34\x24\xa5\xc9\xb9\x0e\ \x08\x42\x73\x24\x55\x40\xf6\xa8\xc5\x0d\x80\xee\x9e\xc9\x74\x8e\ \x55\xdf\x4d\x3e\x22\x06\x88\xff\x1b\x62\x19\xb1\xcb\xe2\xf1\xdd\ \x7f\x47\xf4\x6a\x3f\x2e\x20\xab\x41\xe0\xba\x42\xa0\x0b\xd2\xb5\ \x5a\x9d\x4a\x88\xee\xf6\xc8\x88\xd2\x62\xf5\xd8\x51\x8a\x9a\xe2\ \xd4\x51\x15\x46\xe4\x69\x45\x41\x88\x96\xba\xbe\x83\xb0\x5c\x51\ \x00\x6d\xe4\x68\x19\xb2\x1b\x32\x42\xd2\x90\xfb\xa9\x0f\x01\x48\ \x40\x00\x7e\x2d\x08\x0a\x83\x42\xa4\x51\x0b\xf0\x02\xb8\x16\x50\ \x5a\x36\x06\x92\xd4\x91\x06\xda\x3b\x29\xb5\x30\x34\xe9\xae\x80\ \xa8\x02\x2c\x4a\xda\x0a\xfc\x7b\xdd\xd8\xd8\xea\xfb\x85\x8e\x31\ \x45\xa6\xde\x91\x39\xba\x61\x0a\xc4\x81\x35\x34\xb3\x85\x8d\x0f\ \x78\x2c\x00\x5d\x0b\xf0\x22\x25\x07\x31\x21\x9b\x5b\xd2\x20\x44\ \xc0\x10\xcb\x73\x22\xda\x96\x02\x3c\x0e\xaf\x45\x73\x4e\x00\x7c\ \x5d\x02\xf9\xe9\xcf\x5f\x4f\x57\x3d\xf1\x4f\x3d\x82\x5a\x07\xf9\ \x88\xb4\x86\x16\x52\x17\x8c\x30\x15\x9a\x6b\xb2\x00\xad\x7d\xc0\ \xad\x0a\xb1\x14\xd6\x02\x1e\x4d\xef\xdd\x4d\xd5\x85\x79\x15\xf0\ \x7c\xd1\x91\x09\xb4\xb6\xa3\xb1\x4a\x51\x25\x54\x83\x23\xe7\x9c\ \xb3\xe2\x26\xe9\x43\xbf\xf3\xdb\x34\x75\xc3\x0d\x61\x4e\xe7\x32\ \xd9\x30\x75\x31\x13\x91\x6d\x89\x0d\xb4\x7a\xb1\xc4\x58\xd9\x02\ \xa4\x54\x99\xa0\x1f\x0b\xf0\x00\xa7\xe4\xfb\x0b\x4a\x00\xae\x4b\ \xe3\x5b\x36\x43\x00\x79\xb2\x32\x19\x12\x5a\xbb\x80\x50\x50\x1a\ \x6e\x5a\x44\xd8\xdb\xdb\x66\xe8\x23\x7f\xf9\x75\xf2\x38\x40\x0a\ \xfd\x7c\x84\xc3\xdf\xfd\x2e\xcd\x7e\xff\x29\x32\x6d\x9b\x2b\x47\ \x6d\x29\xcd\xf7\x57\x44\x37\xf9\xd5\xef\xeb\xc0\x34\x7a\xcf\xc6\ \x8d\x53\x06\xda\x59\x09\x40\xa2\xb5\xb8\x80\x5b\xf4\xfd\xbc\x4e\ \x85\x41\xb1\x48\x65\x04\xc2\xf8\xc8\x3a\x6d\xd2\x0a\x32\x22\x17\ \xb9\x01\xfa\x0b\xef\xb8\x83\x26\x2e\xbb\x8c\xec\x89\xc9\xe5\xc5\ \x89\x96\xde\x01\xe9\xd2\x1b\x3f\x25\x6e\x89\xb1\x51\x7d\xef\x2c\ \xd1\xed\x0a\xd1\x39\x41\xd8\x8b\x26\x91\x75\xa6\xb9\xbf\x1f\x0b\ \x08\x00\x37\x1f\x04\xf3\x4d\x01\xe0\x22\x4f\xc5\x33\x67\x38\x13\ \x70\x5e\x6f\xd7\xa8\x5e\x8c\xb6\x06\x3c\x9f\xc0\x73\xdc\xce\xbf\ \xe9\x26\x65\x05\xd1\xf3\x91\x96\x1b\xc7\x4f\x10\xb7\xf4\x94\x12\ \x92\x16\x60\x6f\xd2\x00\xbb\x4d\x19\xbb\x4f\x07\x75\x48\xd5\x0f\ \xa8\x5c\xa9\x44\xf7\x23\x22\xaa\x24\xee\x27\x0b\x28\x01\x9c\x74\ \xdd\x39\x2d\x80\x4a\xa5\x4a\x65\x6c\x63\xed\x4b\x2f\x21\x62\x01\ \x74\x58\x95\x6c\x19\xc7\xb0\x71\x5a\x78\xe6\x69\x4a\xc2\x5d\x26\ \x7f\xfd\x13\xf4\xf3\x8d\xe3\x24\x72\xf8\x54\x47\x3d\x50\x9f\x3b\ \x43\xdc\x52\x9b\x36\x93\xfc\xef\xe7\x95\xf6\x3c\xc7\x51\xd6\x60\ \x59\x5c\x8c\x1a\x51\x0c\x68\xf1\x7f\xc7\xb2\x69\xc7\xcd\x37\xd3\ \xf8\xee\xdd\x94\x9a\x9c\xa0\x81\x2d\x5b\xa8\x84\xcd\xd5\x0f\xaf\ \xba\x5a\x0b\x40\x5b\x00\x7f\xe3\xac\x4b\x62\xb3\x23\x0d\x7a\x67\ \x1c\x27\x1f\x80\x3f\x2f\x88\x53\x61\x65\x69\x29\xac\x05\x5c\x57\ \xbb\xc0\x8a\xae\x30\xb8\x65\x2b\x15\x5f\x7f\x8d\xe6\xfe\xfa\x51\ \xe2\xb6\xeb\xd6\x5b\x61\x05\x4e\x97\x1b\x94\x17\xf2\xaa\x64\x4e\ \xcf\xcc\x50\x15\x5b\xe1\x7a\x22\x41\x9b\x10\x18\x67\xf0\xfc\xd8\ \x27\x7e\x83\x8a\xd5\x2a\x07\xd3\xb6\xb8\x20\xd6\x8d\xd2\xd5\x88\ \x1f\x23\xcf\xfd\x90\xde\xfd\xcc\x75\xf4\xda\xaf\x5e\x49\x87\x2e\ \xff\x08\xd1\xf3\xcf\x61\xc5\x1e\x2f\x3e\x82\x61\xe8\xb3\x01\x73\ \x0d\x2e\xd0\x96\x09\x9c\x1a\x4a\x62\x5e\x6c\xbd\x56\x23\x1b\x87\ \x15\x46\x12\xd0\x64\x3b\xd1\x9c\x1f\xde\xbb\x8f\x6a\xef\x1d\xa6\ \x93\x67\xe6\x68\xe1\x3f\x7e\x40\x93\x57\x5e\x49\xf1\xe9\xe9\x76\ \x17\x00\x1c\x69\x50\xf9\xf0\x61\x9a\xfa\xd8\xc7\xe8\x92\xfb\xef\ \xa7\x5f\xf9\xbd\x6b\x69\x6b\xad\x44\x5b\xb7\x6f\xa3\x2b\xee\xbd\ \x97\x7e\xf7\xc0\x6b\x14\xdb\xb6\x4d\x93\x57\xc2\xf8\xe8\xe3\x8f\ \x53\xe1\x1f\xbe\x4d\x07\x7e\xf2\x16\xe5\x92\x69\xca\x25\x52\xf4\ \xe6\xdc\x22\x3d\xff\xe5\x3f\xa3\xa0\x9d\xbc\xb6\x80\x99\xcf\x8c\ \x8e\xa6\x0c\xb4\xb5\x08\x40\x67\x02\xb7\x2e\x44\x41\xb0\xbf\xc2\ \x34\x37\x4c\x4f\x51\x0d\xfb\x02\x2b\x91\xe8\xf6\x51\xf6\xfd\xe6\ \x31\xf5\xe8\x85\x17\xaa\x78\x11\x90\x41\x73\x8f\x3e\x4c\xdc\xf6\ \xdc\x76\x1b\x9b\x77\x18\x24\x01\xd9\x44\xf5\xd0\x41\xb2\x90\x5a\ \xe7\x1f\xf9\x16\x1d\x78\xe4\x51\x7a\xfe\xdb\xff\x48\xaf\xdc\x74\ \x23\x9d\xbe\xe5\x0b\x14\x1f\x1a\xa2\xab\xbf\xf3\x1d\x92\xc3\xc3\ \xea\xd9\x91\x7d\xfb\x68\xdd\x79\xe7\xd1\xd1\xe7\x7e\x44\x42\xca\ \x36\x9f\xaf\x5a\xf6\x32\x79\x11\x92\xd7\xb0\xf6\x0d\x0c\xec\x5e\ \xab\x05\xc8\x65\x0b\x08\x82\x25\xa1\xb6\xc5\xa8\x05\x76\x9c\x4f\ \x75\x6c\x86\xec\x74\xba\x4d\xf3\x82\xa1\x83\x97\x65\x71\x90\xc4\ \xf3\xbe\x9a\x3b\xf2\xde\xfb\x94\x7b\xee\x39\x9a\xb8\xe2\x0a\x4a\ \x6c\xdd\xd6\x6e\xce\x40\xfd\xbd\xf7\x88\x5b\x11\xd6\xe0\x41\x60\ \x30\x78\x2a\x26\x53\xf4\xda\x7f\x3e\x43\xb3\x4f\x7c\x8f\xe2\x38\ \x5d\xda\x7c\xcd\x35\xea\xd9\xb1\xcd\xe7\xaa\xa5\x35\x82\xa0\x8d\ \xbc\x86\xe8\x20\xaf\x91\x20\xda\xdf\x8f\x0b\x78\x80\x53\x0e\x82\ \xbc\x3e\x18\xd9\x30\x31\x8e\x54\x38\x4f\x71\xf8\xa1\xce\xfd\xdc\ \xcb\x65\x04\x34\xb4\x79\x33\x39\x88\xfa\xd6\xf9\xe7\xd3\xf0\x47\ \x7f\x8d\x36\x7f\xf1\x8b\x94\xda\xba\x95\xb8\xed\xbd\xfd\x76\x58\ \x41\xa3\xcd\x0d\xea\xcd\x7d\x45\x72\x6a\xaa\xad\x62\x74\x0d\x93\ \x72\x4f\x3e\x41\x68\xec\x42\x6a\xce\x32\x0d\x15\x40\xd3\xbb\xf7\ \xa8\x5e\x10\xb5\x41\x76\x93\x57\x73\xb1\x30\x13\x9c\x9d\x0b\xb4\ \xd6\x02\x5a\x00\xcb\xa9\x90\xb7\xc5\x73\x73\x64\x8f\x8e\xf2\x81\ \xa7\x2e\x75\x23\x60\x91\x23\xf0\xff\x31\x04\xb5\x8b\x2f\xb9\x98\ \x76\x0a\x97\xb2\x2f\x3c\x4b\xf9\x9b\x7f\x9f\x4a\xaf\x1d\xa0\x89\ \xcb\x2f\xa7\xd4\x8e\x9d\xad\x6e\x00\x01\x1c\x0b\x53\x21\x22\x79\ \xe7\x5f\x7e\x4e\x1f\x3c\x48\xaa\x35\x35\x5e\x7b\xe9\x45\x95\x48\ \x66\xbe\xf0\x07\xe4\x0a\xd1\x45\x94\xd7\x68\x66\x32\x5d\x71\x80\ \x4c\x53\x95\xc4\xfd\xb8\x80\xbb\x84\x5a\xa0\x55\x00\x95\x85\x05\ \x95\x09\x60\xe3\x6a\xb1\x11\x42\x52\x59\x14\x3f\x07\xaf\xff\x2c\ \xfd\xf8\xe1\x47\xe8\x85\x1f\x3c\x4d\xaf\xbc\xf5\x0e\xfd\xf4\x64\ \x8e\x4e\xdf\x77\x2f\x71\xdb\x87\x02\x89\x33\x82\x7e\xaf\x78\xf2\ \x64\x28\x80\x6d\x33\x1d\x55\x20\x22\xc8\xba\x31\xe2\xe6\xe7\xe6\ \xd4\xdc\xc9\xa3\x27\xa8\xf8\xc2\xf3\xb4\xfe\x82\x0b\xe8\xa2\xfb\ \xef\x23\xc7\xe0\xc0\xef\xa9\x2d\x7b\x1d\x19\x63\xe6\xfa\xeb\xe9\ \xdc\x5d\x3b\xda\xc8\x03\x4c\x6c\x37\x77\x06\xda\x5a\x04\x10\x00\ \xde\xac\xeb\xe6\x42\x25\x04\x61\x2d\x80\x54\x68\x8d\x0c\xf3\x2f\ \x33\xe1\x08\xbc\x78\x32\x68\x74\xcf\x1e\x3a\x8e\xe8\xef\xe1\x73\ \xa2\xa5\x34\x3e\xfc\xd6\xdb\x54\x7c\xf5\x15\x1a\xbf\xf4\x52\x1a\ \xdc\xb7\x77\xb9\xe0\xa9\x14\x4a\xe4\xe0\x9b\x53\x57\x5d\x15\x1e\ \x8c\xa8\x6f\x85\xef\xc5\xd9\xd2\x30\x97\xff\xdb\xbf\x51\xbd\x87\ \xf5\x1f\xbe\xe5\x66\x72\x20\xb4\xed\x9f\xfe\x34\x7d\xea\xc7\x2f\ \xd1\x87\x1e\xf8\x73\xda\xf5\xa7\x7f\x42\xd7\x3c\xfb\x5f\x34\x99\ \x1d\xa1\xf7\x5f\x7e\xb5\xcb\x15\x70\x3d\x72\xe7\xfa\xf5\x9b\xd6\ \x6a\x01\x02\xf0\x8e\x3b\xce\xac\x3e\x18\xe1\x5a\xa0\xc6\x47\xe4\ \x99\x41\xf6\x95\x76\x0b\x10\xf0\xff\x6d\x5b\xa9\x7c\xe8\x10\x79\ \xbe\xaf\x49\x2c\x9b\xb5\x83\xcf\xcf\x7e\xf3\xeb\xc4\xed\xc3\x5f\ \xbd\x87\x5c\x37\x14\xa0\x4f\x52\xbd\x93\x04\xd9\xf1\x4f\x7e\x92\ \xaa\xa5\x32\x79\xae\x4b\x55\xa4\xdd\xf3\x6e\xb9\x85\x16\x1e\x7b\ \x98\x0e\xbe\xfe\xc6\x32\x99\x83\x85\x0a\xfd\xec\xea\x8f\x53\xe9\ \xbe\xaf\x92\x3c\x7e\x8c\xa6\xf6\xef\xa7\x2d\xd3\x93\xe4\xdf\x73\ \x37\xbd\xf9\xb5\xaf\x93\x6f\x9a\x7a\xf1\x6d\x41\x71\x5d\x22\xb1\ \x6f\xad\x7f\x1a\x93\xcd\x2d\x71\xd5\x05\xe2\x52\xa6\x6b\x58\x54\ \x06\x0b\x75\x0a\x4b\x2a\x15\x7a\x22\x68\x2b\x03\xc7\x90\xfe\xaa\ \x47\xdf\x57\xd6\x80\xd6\x7e\x26\x80\xf6\xb3\x67\x7f\x44\xd3\x48\ \x8f\x9c\xca\xf6\xdd\x75\x17\xbd\xf9\x8d\x6f\x90\x84\x4b\x79\x20\ \x22\x2f\xba\x88\xae\x7c\xe8\x21\xda\x7b\xe3\x8d\x94\x3b\x70\x80\ \x86\x51\xe1\x89\x27\xbf\x47\x2f\x3e\xf1\x14\xb9\x76\xac\xad\xbc\ \x3d\x58\xf7\xe8\xc8\x63\x8f\xd3\xc8\xb7\x1e\x26\x5b\x08\x95\x02\ \x17\xe3\x49\x68\xda\xea\x8a\x0b\x7a\x6c\x87\x99\xe0\x9f\x01\xd9\ \x4b\x00\xdd\xc5\x10\x6a\x81\xb4\x10\x69\xce\x04\x93\xe7\x9f\x87\ \x5a\x60\x89\x62\x48\x4f\x75\xc4\x04\xdd\x1a\x8d\x3a\x4d\x5e\xf3\ \x5b\x34\xff\xfa\xeb\x54\xc4\xbe\x61\xa8\xb9\x17\x90\xa1\x10\x54\ \xae\xbf\xf0\xa1\xaf\x91\x09\xed\x96\x9f\x7d\x86\x26\x93\x71\xca\ \xde\x74\x03\xfd\xcf\x93\x4f\x51\xee\xa1\x07\xe8\xc4\x1f\xfd\x21\ \x65\xb0\x75\x8e\x65\xd2\xe4\x97\x2b\xf4\xf6\x99\x59\xca\xc7\x07\ \xc8\x67\xf2\x11\x21\x2d\x04\x95\x25\xe6\x70\xbf\x93\x28\xb0\xe2\ \x1c\x59\x96\xca\x04\x6b\xb6\x80\xa6\x00\xb8\x16\x98\xe4\x6d\xf1\ \xae\x5d\x3b\x69\xfe\xf8\x49\x8a\x83\xa0\xc0\xde\x80\xdb\x10\x0a\ \x94\x4b\x60\xae\xe9\xc1\x0c\xc5\x21\xa0\x8f\x3f\xf8\x00\xbd\xfc\ \x95\xbb\x49\xb6\x1e\x93\xc3\x75\xe6\x6f\xbd\x99\x8e\xc1\x35\x1a\ \x56\x4c\x11\xf0\x0d\x43\xf5\xa7\xf8\xbe\x95\x20\xca\x17\x49\x02\ \xdc\x64\x22\x15\x2d\x7e\x05\x82\xd4\x83\x78\xe7\x9c\x85\xb3\x81\ \x66\x20\x14\x12\x6d\x2d\x16\xe0\x56\x5b\x6a\x81\x61\x90\x3c\x82\ \xa8\x3c\x9e\x5d\x4f\xf4\xee\x3b\x61\x9e\x7d\xfb\x4d\x3a\xf5\xd9\ \xeb\xe8\x10\x4c\xdf\x33\x2d\xf2\x2d\x8b\x84\x1d\x6f\x3b\x30\xf4\ \xd0\x1f\x89\x0d\x10\xd9\xd1\x66\x08\x2d\x1c\xb7\x12\x5b\x85\x24\ \xad\x4e\x94\x5b\x4f\x4b\x00\xf1\x2d\x9f\x1a\x19\x49\x7f\xbf\x50\ \x28\xf6\x0a\x82\x51\x2d\x10\x15\x43\x8b\x3a\x13\x70\x2a\x2c\xcf\ \x87\xa9\xd0\xf0\xc2\x8d\xca\xbc\xe3\xd1\xfb\x20\x37\x8b\x0a\x2e\ \x1f\x4b\x50\xd1\xb4\x5b\xff\xd5\x46\x74\x4c\xa6\x7b\x29\xdb\x76\ \x6c\xa2\x63\x8c\x45\x33\x74\x00\xeb\x0e\x6a\x8c\xee\x0a\xb0\xbd\ \x28\xd2\xcf\x46\x73\x26\x4a\xe2\x3d\x6b\x75\x01\x7d\x30\xb2\x5c\ \x0b\x38\x5c\x0b\x14\x8b\x64\x73\x7d\xce\xa9\x90\xba\x1b\x18\xb6\ \x7e\x64\xf5\x71\xb7\x06\x3b\xe7\xba\xdd\xa0\xb7\xd6\xf5\x7c\xd7\ \xb5\x1d\x8f\x73\x20\x7c\x11\xe8\xe1\x02\x1d\xe7\x02\x8b\x41\x90\ \xd3\x02\xa8\x54\x6b\x61\x2a\x5c\xb7\x8e\x4c\xbd\xb7\x5f\xa1\xc9\ \xce\xeb\xd5\x84\xd0\x69\xe2\x9d\xcf\xf7\x70\x83\x68\xae\xb7\x1b\ \x20\x0e\xb0\x00\x8c\xb5\x58\x80\x00\xbc\x13\xa8\x05\xd0\x87\x9b\ \x17\xd4\x02\x75\xd4\xfa\x6e\xa9\x44\x16\x6f\x8a\x5c\xb7\x9b\x70\ \x2f\xad\x1b\xc6\x2a\x82\xe9\xd6\x78\x37\xf1\xfe\x83\x22\x22\x60\ \x5b\x20\xec\x21\x80\xc8\x0d\x4e\xe3\x60\xc4\x97\xd2\x8f\x49\x69\ \x73\x2d\xb0\x1e\x1b\x9e\x06\xbb\x01\xb6\xab\x62\x61\xa1\xb7\xf6\ \x99\x70\xff\x6e\x10\x8d\x7b\xb9\x41\x8f\xe7\x41\x5c\x95\xc4\x3d\ \x83\xe0\x4a\xbb\x42\x6c\x41\x8b\x3a\x13\x6c\xda\x79\x3e\x55\x51\ \xbe\x26\xb2\x59\x0e\x34\x5d\x90\x8c\xd6\x6b\xa2\x5e\x41\x6f\xd5\ \xe0\x26\xa3\xfb\xd1\x35\xa3\xc7\x0e\xb0\x2b\x28\xe2\x1a\x02\x18\ \xbc\x6d\x62\x62\xf3\x1a\x04\x10\x05\xc2\xba\x10\x8b\xfa\x88\xfc\ \x5c\xe4\xfa\x2a\x34\x9f\x58\xbf\x5e\x9f\xf9\x77\x47\xeb\xce\xb9\ \x55\x48\xa9\x7e\x35\x01\x75\x13\x8f\xc6\x2d\xef\x8a\x1e\x31\x80\ \x5a\x2c\x70\xd0\xb6\xf7\xaf\x49\x00\xda\x02\x50\x0b\x2c\xc1\x6d\ \x54\x0d\x9f\x42\x55\x57\x99\x9f\x57\x81\x90\x84\x68\x27\xbd\x1a\ \x71\x4d\xb8\x9d\xd4\x4a\x7d\xf4\xdc\x5a\xac\x81\xe7\x7a\x90\xe7\ \x16\x37\x0c\x15\x08\x7b\x06\x41\x89\xc6\xc1\x42\x97\xc3\x95\xd6\ \x73\x81\x7c\x3e\x4c\x85\xd8\x17\x18\x52\xf2\xa2\xd6\x16\x08\xf5\ \xb8\x67\x36\xe8\x5d\x10\x51\x0f\xad\x77\x36\xcc\xee\x69\x2a\x5b\ \x9c\x75\x10\x04\xdc\x12\x04\xa0\x8b\x21\xa7\x50\xa0\x7a\xa5\xc2\ \x16\xa0\xbf\xd4\x3b\x10\x76\x8d\x35\xe9\xde\xd9\xa0\x37\xf1\x6e\ \x61\xea\xac\x85\x8d\x9c\x82\x0f\x38\xbe\x2f\xc8\x34\xe7\xf8\x09\ \x6e\x12\xad\xa7\x00\x74\x2d\x50\x68\xad\x05\x2a\x55\xaa\x3b\x0e\ \x79\xd5\xaa\x3a\x29\x16\x98\xa3\x5e\xda\xd7\x56\xd2\xcb\x12\x7a\ \xa4\x41\x5d\x56\x2b\x62\xf8\x5d\x0f\xbd\x27\x84\xf4\xd9\x5a\x13\ \x89\xc0\x1a\x48\x0a\x3b\x95\x96\xf6\xf0\x90\x4c\x8e\x8e\xd1\xe0\ \xe4\x84\x1c\x9d\xde\x44\x53\xbb\x76\xc8\xbf\xb8\xf3\xcb\xd7\xfd\ \xdb\xbb\xef\xbe\xdc\xb3\x0e\x58\xf1\x60\xc4\xf3\xe6\x5a\x6b\x01\ \xe5\x17\x70\x83\x18\x52\xa1\x5c\x5a\xea\x26\xdd\x87\x1b\xb8\x4d\ \x8d\x79\x00\xf7\x0e\x88\x41\x63\x81\x88\xc7\x03\x23\x91\x10\x46\ \x26\xc3\xff\x78\x52\x9d\x1d\x0c\x8c\x8f\xcb\xd1\xc9\x49\x63\x64\ \x7a\xda\x1e\x99\x18\xb7\x6d\x3b\x66\x99\xf8\x9f\x6d\xd9\x14\x8b\ \xc5\xc8\xb6\x2d\xf4\x71\xe2\xeb\x64\x32\x49\x43\x58\xe7\x79\x93\ \x93\x15\x08\xa0\xce\x9c\x7a\xd4\x01\xdd\x81\xf0\x78\xa3\x31\x2b\ \xf0\x8e\xfe\x23\xc9\xe4\xf6\x19\x6a\xa0\x18\x4a\x8e\x8d\x91\x80\ \x00\x56\x7b\x11\xef\x68\x2d\x69\x73\x64\x0d\x0a\x11\x12\x63\xad\ \x09\x99\x4a\x49\x2b\x93\x31\x6c\xa4\xd5\x01\x6c\x89\x33\xe3\xe3\ \xe6\xf0\xf4\x94\x99\xc9\x66\x6d\x32\xd4\xc6\xc2\xe6\xe5\x5a\x96\ \x45\x71\x45\x0e\x24\xe3\x71\x35\x8e\x27\xb8\x8f\x87\xa4\x63\x98\ \xb7\x63\xfc\x9c\x7a\x06\x02\x61\x01\xa8\x67\xd2\xa9\x34\xed\x3f\ \x77\x52\xe9\xad\x67\x29\xbc\xd2\xae\x10\x59\xa0\x02\x12\x15\x14\ \x43\x19\x95\x0a\x77\xec\xc0\xb6\xf8\xb8\x0a\xa7\x8b\xb5\x5a\xe8\ \x67\x78\x36\xb0\xac\x40\xc4\x62\x42\x26\x12\x52\x0e\x0c\x48\x99\ \xce\x20\x58\x8e\xc9\xc4\x86\x73\xcc\xd4\xf8\x46\x63\xdd\xe4\xa4\ \x3d\x38\x3a\x66\x41\x55\x26\x2f\xce\x34\x94\x43\x92\xc9\x8b\x06\ \x4c\x1e\x9b\x26\x19\x80\x26\x8c\x7b\x21\x69\xc0\x62\xe0\x1e\xae\ \x19\xea\x59\x0d\x7d\xe4\x87\x79\x7e\x57\x83\x05\xa4\xe6\x26\x92\ \x99\x18\x6e\xf7\xda\x0e\xaf\x9e\x0a\xf9\x8f\x24\x49\x21\x32\xae\ \xe3\xd1\xb6\xa9\x29\xf9\xea\xf1\x13\x1e\xcd\xcc\x48\xfb\xe2\x0f\ \x1b\xa3\x9b\x36\xd9\x03\x83\x83\x26\x7e\xc8\xd4\x0b\x64\xad\x60\ \xac\x34\x80\x59\xb2\x15\x19\x73\xf9\xf8\x1b\xd4\x31\x0e\x78\xcc\ \x8b\x57\xe0\xb5\x99\xfc\x0e\x34\x0c\xe8\x39\x75\xf8\xc9\x82\x37\ \x00\x7c\x97\x63\x11\xf7\xfc\x0c\x93\x0c\x85\xd8\xfc\x5d\x34\xbe\ \xd6\xd9\x2c\xdc\xc5\xd6\xeb\x6e\xcc\x94\xa9\x35\x9c\x08\x75\x67\ \x82\x1a\x8a\xa1\x11\x29\xa7\x38\xf2\x9f\x29\x14\xbc\x89\xcf\x7d\ \x1e\xe7\x22\x23\x94\x49\xa7\x40\x32\xc1\x0b\x51\x84\x41\x45\xbd\ \x26\x98\x8c\x8e\xe2\x18\xa3\x0f\x17\x69\x59\xbc\x78\x8c\x2d\x40\ \x11\x6c\x03\x04\xa2\xc7\x9a\x84\x7a\x3e\x11\x5a\x85\x26\xac\x35\ \xdd\x9a\xba\x59\x30\x3c\xd7\xf6\x0d\xbe\xae\x17\x8b\x65\xcb\x13\ \x99\x35\x6c\x87\xa3\x5a\x40\x5b\x40\xa5\x79\x2e\xb0\x1e\x01\xe5\ \xe4\x9e\x7d\xd6\xa6\xe9\x69\xca\x8e\x8d\x92\xdd\xd4\x34\xb1\x16\ \x0c\x93\x3b\x6d\xaa\x9a\x44\x44\x8e\x11\x04\xbc\xd0\x30\xa5\x3a\ \x2e\x6b\x57\x2f\x58\x43\x9b\x34\xa3\x6d\x8e\xdf\xd1\x42\x40\x6b\ \x8e\xb5\x40\x57\x2e\xf3\xf9\xdb\x8d\x7c\xbe\x4a\xc2\x4f\xb3\x71\ \xf4\x6b\x01\x2c\x00\xb5\xf3\x09\x3c\x4f\x66\xa6\xa7\x51\x06\x8c\ \xd0\xf0\xf0\x30\xff\x78\xf3\xbb\xa1\xf6\x74\xbd\x00\x62\x7a\xcc\ \xe0\x7b\x0a\xda\x2c\xd1\xba\xc9\x47\xd0\x1a\xe6\xbe\x6d\x0c\xa2\ \xda\x0a\xf8\xdd\xd0\xc4\x9b\xbb\x52\xad\x71\xfd\x8c\x16\x4a\xe5\ \xf4\xa9\x1a\x1e\x4c\xaf\xc1\x02\xba\x53\x61\xc9\xf7\x95\x00\x6a\ \xae\x1b\x0c\x25\x93\x76\x22\x9e\x20\x5d\x1b\x60\x31\x6d\x64\xb5\ \x00\x22\xd2\x91\x70\xb4\x56\x5b\x7d\x94\x7b\x4d\x46\x2f\x5e\x9b\ \xb4\xe3\x38\xfa\x0f\x20\xda\xf4\xbb\x02\x1d\xe6\x75\x1c\x50\xdf\ \xd1\xef\xeb\x00\xb9\xf8\xea\x2b\x0d\xc3\xf3\xfa\xb6\x00\xd1\xfc\ \x17\x23\x73\xfc\xb6\x67\xdb\x42\xfd\xa8\x69\x68\xcd\x6a\xad\x69\ \x82\xda\x2c\x79\xac\x89\x30\xb4\x50\x34\xda\xde\xd1\x66\xaf\xef\ \xe9\x6b\xf4\xfa\x5b\x3c\xcf\xdf\x60\x8d\xab\xf9\x0c\x6a\x83\x81\ \x81\x01\x95\xeb\x13\xcd\x38\xd4\xd9\x1a\xa5\x62\xc3\x39\x72\x78\ \xc4\xf5\x7c\xd9\x87\x05\x44\xa9\x10\x07\x23\x67\x78\x11\x3e\x56\ \x8d\x42\x43\x93\xd3\xd2\xd7\x5a\xd4\xda\xd7\x64\x3b\x03\x9b\x16\ \x4e\x9b\x26\x75\xd3\x04\xb5\xf6\xf4\xb3\x3a\x23\x74\xb6\x72\x3e\ \xef\xce\xbe\xf3\x4e\x3d\x7f\xf4\xa8\x53\x3a\x79\xc2\xaf\x9e\x99\ \x95\x41\xa1\x60\x58\x8d\xba\x3d\x20\x45\x7c\xc8\x8e\xa5\x32\xa9\ \x64\x32\x96\x88\x0f\xbf\x9e\x5b\xfc\xd7\x3e\xb2\x40\x94\x0a\x4f\ \x39\xce\x82\x90\x92\x3d\x3b\xd0\x8b\x6e\xd5\xa8\x16\x82\xd6\x1a\ \x34\xd2\xb5\x68\x5c\x6b\xb4\xa5\xaf\xd6\xc6\xef\x71\x2b\xe6\x72\ \xce\xe9\x23\x47\xea\x0b\x47\x8e\xb8\x85\xe3\xc7\xfd\xf2\xe9\xd3\ \xd2\x59\x58\x30\xfc\x62\xd1\x36\x1a\x8d\x44\xdc\xf7\x53\xb6\x69\ \xc6\xf1\x8d\xb8\x0a\x90\x86\x51\x0b\x4c\xa3\xe4\x1a\x0a\x05\x60\ \x09\xa2\x9c\x43\xd1\x75\xe8\xe9\xd3\xb3\x4f\xbe\x9d\xcf\x1f\xeb\ \x57\x00\x3a\x13\x34\xea\xbe\x5f\xf2\xa4\x8c\x6b\x72\xda\x84\x5b\ \xcd\x55\x43\x13\x5d\xa9\x15\x66\x67\x9d\x1c\xc8\x2d\x1d\x3b\xe6\ \x2c\x1e\x3d\xea\x57\x67\x67\x79\x97\xb9\x4c\x2e\x21\x44\xca\x84\ \x2c\x08\xc0\xef\x35\x1c\x29\x4b\x7c\x28\x83\x5a\xa4\x58\xc7\xd6\ \x9c\xff\x0d\x63\x59\x88\x7c\x01\x9b\xb4\x3c\x14\x73\xd4\x75\xe7\ \x30\x5f\x67\x57\x65\xe8\xcc\x05\xd4\x80\x02\x50\x0c\xe7\xfb\x17\ \x80\x0b\xd4\x71\x40\x7a\x6c\x7c\x71\x71\x47\x12\x02\xb0\x59\x83\ \xb6\xdd\x45\x12\xe4\x1a\xb9\x43\x87\xea\x79\x90\xc3\x5f\x7f\x83\ \x0a\x6b\x0e\xe4\x44\xa9\x14\x53\x9a\x13\x22\xcd\xe4\x02\x64\xd9\ \x86\x10\x7e\x43\xca\x4a\x93\x9c\x22\x56\xf1\xfd\x7c\x11\xc4\x16\ \x7c\x3f\x87\x12\x7c\x1e\x3b\xd1\x32\x13\xea\x20\xc7\xf0\x5b\x10\ \xb4\xf7\x7a\x1c\x3d\xab\xab\xc0\x1e\x02\x58\xb5\x16\x70\x80\xd2\ \x7b\x8d\xc6\x4b\x9b\x97\x96\xf6\xbe\xf4\xe0\x83\x8b\x89\x7a\xd5\ \x3c\x35\x9f\xaf\xe1\x80\x54\x82\x9c\x6d\x36\x1a\xc9\x18\x8a\x5f\ \xfe\x16\x6f\x64\x80\x3a\xff\x59\xad\x2e\x65\xa1\xe6\xfb\x4b\x15\ \x68\xac\xe8\x79\x0b\x8b\x38\x66\x3f\x89\xcd\xd5\x82\xeb\x96\x34\ \xa1\x3e\x88\x31\x04\x20\xcf\x06\xdc\xfa\xfe\xbf\xce\x42\x00\x26\ \x85\xe6\xb8\x11\x52\xda\x7e\xf3\xe4\xe4\x1f\x6f\x4c\x26\x77\xa7\ \xd2\x29\xff\x8d\xb9\xdc\x4f\xaa\xa8\x0f\x4a\x40\x1e\xc4\x70\x80\ \x9a\x3b\xe3\xba\x8b\xdd\xa4\x80\xde\xa4\xb8\x17\x8c\x1e\xe4\x28\ \x1a\x77\xb7\xd5\xc8\xf6\x2b\x00\x2d\x04\x1b\x5d\x1a\x18\x05\x86\ \x81\x18\x20\xce\x46\x5b\x6b\xd4\x18\x7d\x30\xc4\x3e\x78\x01\x18\ \xe8\x2c\x26\xde\x84\xa1\x6b\x84\x5f\x2e\x62\xfd\xb7\xff\x05\xc7\ \xfd\xe7\xdb\x23\x5d\x13\x38\x00\x00\x00\x00\x49\x45\x4e\x44\xae\ \x42\x60\x82\ \x00\x00\x20\x1c\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\ \x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x08\x12\x14\x39\x28\x29\x91\x7c\x0e\x00\x00\x1f\xa9\x49\x44\ \x41\x54\x78\xda\xe5\x9b\x09\xb0\x5c\x57\x99\xdf\xff\xb7\xf7\xbd\ \x5f\xbf\xfd\xe9\xe9\x3d\x49\xd6\x2e\xd9\xda\x2c\x79\xc1\x78\xc0\ \x76\x42\x81\xc1\x03\x64\x0c\x13\x1c\x42\x65\x02\x4e\xb1\x84\x78\ \x5c\xc5\x14\x55\x49\x2a\x54\x48\x05\x2a\x03\xc3\x14\x03\x55\x33\ \x13\x43\x2a\xae\x21\x9e\x01\x26\x05\x43\x80\xd8\xb2\x0d\x78\xc3\ \x96\x25\x6b\xb1\xf5\xb4\x3d\x6b\x7d\xd2\xdb\xb7\xde\xb7\xdb\xb7\ \xf3\x3b\xa7\xbb\x35\x12\x1a\x0a\x18\xb0\x81\x4a\xcb\x9f\xcf\xed\ \xbb\x9c\x77\xbe\xed\xff\x2d\xf7\xb4\xfe\x7f\xff\x38\xaf\xe7\xdf\ \x59\xb3\x66\x8d\xaf\xab\xab\xcb\xd7\xdb\xdb\x6b\x29\x91\x48\x38\ \xd5\x6a\x55\xb9\x5c\xce\x5b\x58\x58\xf0\x96\x97\x97\xbd\x0b\x17\ \x2e\x78\xd9\x6c\xb6\x29\x09\xfa\x2d\x16\x40\x24\x12\xf1\x6d\xdd\ \xba\x35\xb0\x7b\xf7\xee\xf8\xdd\x77\xdf\xbd\xb5\xaf\xaf\x6f\x67\ \x34\x1a\x5d\xcf\xf9\x75\x7e\xbf\xbf\xd7\x71\x9c\x04\x14\x6f\xf2\ \x69\x34\x1a\x05\x43\x08\x63\xa6\x5c\x2e\x9f\x2a\x16\x8b\xe3\xd3\ \xd3\xd3\xfb\xbf\xfd\xed\x6f\x9f\x3c\x70\xe0\x40\x0d\xa1\x34\x8c\ \x40\x7e\x1b\x04\xe0\x6c\xda\xb4\x29\x74\xef\xbd\xf7\xf6\xbe\xf5\ \xad\x6f\xbd\x07\x2d\xbf\x3d\x16\x8b\xdd\x1c\x0e\x87\xfb\x60\x5a\ \xf0\x2a\xd7\x75\x2d\xc1\xb0\x3c\xcf\xb3\x0f\xf9\x7c\x3e\x4b\xc1\ \x60\x50\xdc\x67\xcf\x57\x2a\x15\x15\x0a\x85\x49\xac\xe1\xd9\xa9\ \xa9\xa9\x6f\x3d\xca\xe7\x5b\xdf\xfa\x56\xde\x58\xca\xaf\x52\x18\ \xce\xaf\x4a\xdb\xd7\x5f\x7f\x7d\xf4\x13\x9f\xf8\xc4\xae\x6d\xdb\ \xb6\x7d\x34\x9d\x4e\xdf\x0d\xd3\x29\xc3\x08\x1a\x15\x1a\x55\xa9\ \x54\x52\x15\xa6\x6a\xb5\x9a\xdc\x7a\xbd\x25\x00\x08\xa1\x40\xad\ \x95\xc0\xbc\x15\x42\x38\x1a\x55\x2a\x95\xb2\x14\xe5\xb8\xce\xfd\ \x8b\x8b\x8b\xf3\x33\x33\x33\xff\x7b\x6c\x6c\xec\xcf\x3e\xf7\xb9\ \xcf\x8d\x4f\x4e\x4e\xba\x46\x10\xbf\x6e\x01\x38\x1b\x37\x6e\x8c\ \x7e\xfa\xd3\x9f\xbe\x79\xc7\x8e\x1d\x7f\x94\xc9\x64\xde\xe2\xe7\ \x03\xd3\xc6\xaf\x55\x2c\x14\x54\xe1\xd8\x50\x15\x2a\x23\x04\xc8\ \x0a\xa2\x8e\x20\x1a\x58\x82\xe1\xde\xe7\x38\xf2\x07\x02\x0a\x05\ \x43\x0a\x86\x42\x0a\x84\x43\xf2\x9b\x63\xc6\x68\x3c\xae\x9e\xbe\ \x3e\xf5\x41\x21\xae\x2d\x2d\x2d\xd5\x2f\x5d\xba\xf4\xcd\x23\x47\ \x8e\x7c\x96\xbf\x7b\x22\x9f\xcf\xbb\xbf\x16\x01\xa0\x9d\xe0\x87\ \x3f\xfc\xe1\x91\xf7\xbf\xff\xfd\xff\x7e\x68\x68\xe8\x03\x98\x70\ \x10\x4d\x5b\xc6\x4b\x30\x6e\x28\xbb\xbc\xac\x85\xb9\x79\xcd\xce\ \xcd\x6a\x6e\x76\x56\x4b\x8b\x4b\xca\xe6\xb2\xd6\x1a\x3a\x02\xf0\ \x49\x0a\xfa\xfc\x8a\x84\x82\x4a\x18\xcd\x27\x12\xea\x4a\xa7\xd5\ \x95\xe9\x56\x2a\xd3\xa5\x68\x2a\xad\x50\x22\xae\x70\x2c\xa6\x6e\ \x84\x30\xbc\x72\xa5\x62\x1c\xcf\xce\xce\x96\xcf\x9c\x39\xf3\xc5\ \x6f\x7c\xe3\x1b\x9f\xfb\xfa\xd7\xbf\xbe\x2c\xc9\x7b\xbd\x04\xe0\ \x8c\x8e\x8e\xc6\xbe\xf4\xa5\x2f\xbd\x63\xcf\x9e\x3d\x7f\x8a\x89\ \x0e\x5d\xd6\x78\x3e\xaf\x1c\x4c\x4f\x4f\x4d\xe9\xfc\xb9\xf3\x3a\ \x73\xf6\x8c\x26\x26\x26\x34\x03\xf3\xf8\x72\x87\x71\x6b\xfa\xc2\ \x3d\x1c\xa3\x7d\x49\x01\xc7\xa7\x00\x18\x10\x0a\xf8\x15\x45\xcb\ \x89\x48\x54\x19\xcc\xbf\xaf\xa7\x5b\x83\x83\x83\xea\x5f\xb1\x42\ \xe9\x81\x01\x45\x33\x19\x85\xcd\x79\xce\xad\x5a\xb5\x4a\xc2\x72\ \xce\x9d\x3b\xf7\xea\xc1\x83\x07\xff\xf5\x27\x3f\xf9\xc9\xe7\x5d\ \x3e\xaf\xb5\x00\x7c\xb7\xdc\x72\x4b\xf7\x97\xbf\xfc\xe5\xff\x40\ \x48\xfb\xb7\x66\xed\x98\xa0\x0a\x50\x76\x71\x51\x13\x17\x2e\xe8\ \xc4\xf1\x13\x1a\x3b\x7e\x4c\x68\xc7\x32\x5e\x2e\x96\xd4\xdb\xdb\ \xa3\x95\x2b\x86\xd5\xc7\xd8\xdd\xd5\xa5\x58\x24\xa2\x30\xbe\xde\ \x6c\x78\x06\x0f\xb8\xa7\xa0\x02\x02\x5c\x5a\x58\xd0\xfc\xf4\x0c\ \x34\x8d\x60\x9a\x8a\xe0\x06\x29\x5c\xa0\xbf\xa7\x47\x2b\x56\x0e\ \x6b\xc5\xea\xd5\xca\x8c\x8c\x2a\xda\xdb\xab\x38\xc2\x19\xe5\x7b\ \x5f\x7f\xbf\xc0\x86\x2a\xd8\xf0\x1f\x1f\x7c\xf0\xc1\x2f\xe3\x22\ \x95\xd7\x4a\x00\xfe\xb7\xbf\xfd\xed\x2b\x3e\xff\xf9\xcf\xff\x05\ \x5a\xb9\x1b\x60\xb2\x8c\xe7\xd0\xec\xe4\xc5\x8b\x3a\xfa\xca\x2b\ \x3a\xf0\xd2\x4b\x3a\x7e\xf2\xa4\x66\xa6\xa6\xf1\xd9\x5e\x6d\xdb\ \xba\x55\x9b\x37\x6d\x52\x22\x1c\x91\xaf\xe9\xc9\xef\xb5\xc8\x31\ \x04\xf3\x62\x84\xac\x45\x34\x0c\x71\xec\x72\x5f\xb5\x5a\xb3\x73\ \x9e\x3e\x76\x4c\x0b\x08\xd1\x80\x63\x12\xb3\xef\x87\xf1\x95\x30\ \xbd\x62\xfd\x7a\xa5\x56\x8d\x2a\xc2\xf7\x01\x5c\x62\xf5\x75\xd7\ \x59\xa0\x45\x08\x5f\xf9\xd4\xa7\x3e\xf5\xe0\xc9\x93\x27\x8b\x3f\ \x2f\x40\xfa\x7f\x5e\xe6\x3f\xf0\x81\x0f\xac\xf9\xcc\x67\x3e\xf3\ \x48\x7f\x7f\xff\x9d\x26\x44\xe5\xdb\x1a\x3b\x31\x36\xa6\x1f\xfe\ \xf0\x87\x7a\xe2\x07\x3f\xd0\xcb\x2f\xbf\xac\x01\x16\xf5\xce\x77\ \xdc\xa3\xbb\x6e\xbf\x5d\xd7\xa1\xf5\x0c\xbe\x9d\xc4\x54\xd3\x6a\ \x51\xaa\x43\x9c\x4b\x4a\x4a\x74\x88\x73\x71\xc6\x18\x6e\x11\xe7\ \x5a\x6f\x32\xa5\x75\x1b\xd6\x69\x04\x06\x6b\x08\xb9\xb0\xb0\xa8\ \x12\x02\x2f\xf2\x37\x6b\x4b\x4b\xf2\x55\xaa\x0a\x20\x98\x4a\xdd\ \x55\xae\x84\x95\x81\x0f\x03\x03\x03\xbb\x6e\xb8\xe1\x86\xad\x58\ \xc4\x63\xe7\xcf\x9f\xaf\xfe\xaa\x04\xe0\xbf\xf3\xce\x3b\x57\x7e\ \xf6\xb3\x9f\xfd\x5f\xc4\xf5\x5b\x0d\x8a\x1b\xb3\x9f\xc3\x4c\x5f\ \xda\x7f\x40\x8f\x3d\xbe\x57\xcf\x3e\xfb\xac\x5c\x7c\xfb\xbd\xbf\ \xf7\x7b\xba\xe3\x8d\x6f\xd4\x20\xc0\x95\xc2\xa7\xd3\x4e\x87\xe9\ \x0e\xb3\x0e\x0c\xc2\xa4\xa4\xa8\x31\xf1\x26\x24\x99\x11\xe2\x9c\ \x19\xa1\x98\xbd\xc6\x79\xac\x22\x01\x26\x5c\xb7\x6e\xbd\xba\x01\ \xc4\xfc\xf4\x94\xaa\x68\xba\x9c\xcb\xab\xba\xbc\x24\x87\xb5\x84\ \x88\x1e\x0d\x9f\xa3\x3c\xc7\x19\x5c\x05\x21\x6c\x02\xa3\x36\xee\ \xdb\xb7\xef\xbb\xe0\x52\xfd\x97\x15\x80\x8f\x30\xd7\xff\xd0\x43\ \x0f\x7d\x85\x89\xef\x00\xc4\xac\xd9\x4f\x5d\xba\xa4\xe7\x9f\x7f\ \x5e\xff\xf7\xb1\x47\x75\xe8\xe0\x41\xed\xda\xb1\x43\xff\xfc\xde\ \x7b\xb5\xb2\xa7\x57\xe9\x0e\xe3\x57\x68\x38\x0a\x85\x61\x0c\xaf\ \x57\x00\xc6\x02\x8c\xfe\xa6\x20\x46\xaf\x75\xec\x33\xc7\xf6\xba\ \x21\x29\xc8\x18\x16\xe4\xf1\x9c\x5b\x07\x3b\x12\x1a\xc1\x22\xaa\ \x33\x73\xaa\xb1\x86\x5a\x89\xd0\x4a\x44\xb1\x42\xf0\x33\x23\x96\ \x96\x03\x8c\xbb\x00\x4a\x42\xe6\x26\xb2\xd0\x81\xef\x7f\xff\xfb\ \x8f\xe3\x5a\xee\x3f\x56\x00\x0e\x79\x7b\xea\xe1\x87\x1f\xfe\xcf\ \x6b\xd7\xae\xbd\x8f\x58\x6e\x32\x33\x4d\xc3\xfc\x8f\x9f\x7b\x4e\ \x8f\xed\xdd\xab\xb3\xa7\x4f\xeb\xdd\xef\x7c\xa7\x6e\xdb\xbd\x47\ \x5d\x80\x5a\x86\x85\x74\x18\x8f\x59\xa6\x61\xb6\xcd\xa4\x45\x7c\ \x33\x1a\xbf\x6f\x42\x1c\x37\x6d\x24\x68\x8d\x6a\x9f\x77\xec\xbd\ \x8c\x1d\xe1\x58\x30\x6c\x32\x59\xdd\x5a\xcf\xf0\x9a\x0d\x6a\x10\ \x4e\xdd\x42\x8e\x30\x5a\x53\x3d\x57\x40\x08\x65\x2c\x21\x88\xa4\ \x23\x2a\xd6\x6a\xd6\x1d\x58\xfb\x2e\x92\xb3\x65\x84\xb0\x5f\xcc\ \xfe\x0b\x0b\x80\xb8\x1e\xf9\xc2\x17\xbe\x70\xef\x6d\xb7\xdd\xf6\ \x5f\x00\x3c\x1f\xcc\x5b\xb3\x7f\xe1\xf9\x17\xb4\xf7\xf1\xc7\x75\ \x11\xc4\xbf\xef\xf7\x7f\x5f\x1b\x09\x47\x5d\xf8\x62\x06\xcd\xe3\ \xd7\x76\x91\x21\x18\x68\x69\xb5\xcd\x58\x9b\xa9\xa6\x65\x9a\xb1\ \x7d\xac\xf6\xb1\xda\xc7\xba\xea\xd8\x8e\xac\xc3\x53\x20\x0d\x40\ \x3a\x9e\x42\x45\xc9\x29\xd7\x35\xb4\xf6\x3a\x35\x96\xc1\x02\x37\ \x27\xa7\xee\x22\x84\xa2\xfc\x60\x42\x08\xb0\x6d\x1a\x21\x10\x0d\ \x07\x08\x95\xe4\x0b\xbf\x43\x8e\xf2\x14\x2e\x3a\x21\x66\xfc\x45\ \x04\xe0\xa7\x80\xd9\xf4\x91\x8f\x7c\xe4\xaf\x40\xe0\xa4\xc9\xe8\ \x96\x09\x73\x07\x0f\x1c\x40\xf3\x8f\xeb\x3c\x21\xce\x30\xbf\x66\ \x60\x00\xcd\xfb\xd4\xed\xf7\x29\xe9\x39\xd6\x7f\x03\x2d\x2d\x42\ \xad\x58\xaf\x0e\xa3\x57\x33\x79\x95\x15\xa8\x6d\x05\x96\x38\xee\ \x8c\x1c\x28\x18\xa7\x2e\xe8\x8a\x28\x56\x73\xe5\xe5\x4c\xf4\x80\ \x88\x40\xfd\x6b\x56\x03\x86\x17\xb9\xa7\x2a\xaf\x84\x80\x8a\x65\ \xf9\x39\x1f\x8a\xc7\xd4\x20\xcc\xba\x92\x86\x56\xac\x08\x90\xa7\ \xdc\x76\xe2\xc4\x89\x47\x00\xc6\xf2\xcf\x2d\x00\x24\xd7\xf5\xc5\ \x2f\x7e\xf1\xb3\x84\xbb\x5b\x08\x2f\x36\xc1\x39\x41\x48\x7a\xfc\ \x89\x27\x34\x06\xd2\xbf\xfb\x77\xef\xd1\xda\xa1\x15\xea\x86\xf9\ \x54\x44\xea\x92\x8f\xe4\x25\x2e\x11\xbe\x3a\xcc\x59\x26\x1a\x10\ \x82\x40\xcb\x57\x6a\xfe\xaa\x31\x68\xb4\xe6\xba\xc4\xf7\x11\xad\ \xba\x79\x8f\xfa\xd6\xae\x55\x1f\xbe\xde\x47\xa8\xeb\xdf\xb8\x56\ \xf1\x35\xbd\x0a\xf7\xf4\x6b\xd5\x75\x5b\xd4\xbf\xe1\x06\x0d\x6e\ \xde\xac\x9e\xd1\x51\x2d\x9c\x1a\x57\xdf\x48\x9f\x16\x16\x27\x14\ \xab\x53\x64\x95\x5d\x35\x89\x4e\x01\x39\x0a\xa6\x92\xaa\x01\x9e\ \x41\x04\xd1\xc3\x07\x2b\xf0\xbe\xf7\xbd\xef\x3d\x2d\xa9\x71\x8d\ \xa5\xeb\xda\x4f\xf0\x81\x07\x1e\x78\x13\x7e\xff\x1e\xc2\x9d\xcd\ \xe3\xa7\x88\xc9\xa0\xaa\x8e\x1e\x79\x59\xb7\xec\xd9\xad\x75\xc3\ \xc3\x4a\x4b\x84\x38\xc1\x78\x40\x41\x98\x1b\x20\x16\xa7\x07\xfb\ \x5b\x0c\x37\x5a\xc4\xf1\x15\x82\xb8\x96\x12\x84\xcc\x55\x37\xed\ \x91\x83\xfb\xa8\x69\xdc\xe4\xea\xcc\xc4\xf1\xd7\x55\x27\x19\x8a\ \x45\xc3\xdc\x1f\x30\x67\x3a\xff\xc9\x2b\x57\x14\x4b\x74\x6b\x64\ \xeb\xf5\x44\x08\xbf\xe2\xc2\x32\x4c\x74\xc0\x3a\x6b\x27\x4e\xca\ \x9b\x5f\xd0\x0c\x19\x29\x25\xb7\xe0\xe5\x81\x0f\x7e\xf0\x83\x9b\ \xcd\x04\x3f\x4b\x00\x0e\xda\xcf\x50\xca\xfe\x21\x26\x18\xb0\xf1\ \x9e\xd4\x76\xec\xe8\x98\x8e\x1c\x3a\xa4\x34\xfe\x75\xeb\xce\x5d\ \x4a\x35\x05\xd8\x11\xaf\xc3\x3e\x28\x24\xc7\x6d\x58\x06\x52\x83\ \x43\x56\x83\xfc\x55\xc3\x34\x74\x25\xf3\x8d\xd6\xb1\x71\x11\x09\ \x0d\xaf\xd3\x10\x89\x12\xcc\x9b\x73\x96\x3c\xa8\xf3\x8c\xb8\xbf\ \xd1\x2c\x2b\x90\xea\x95\xcf\x0a\x51\x10\xff\xb3\xd7\x20\xc6\xfa\ \x72\x4e\xab\x6f\xbc\x49\xc9\xe1\x5e\x25\x03\xb8\x20\xcf\x08\x57\ \x75\x4f\x9f\x55\x1d\x41\xd4\xb3\x39\xcd\xce\xcc\xa8\xbb\xbb\x3b\ \x7a\xeb\xad\xb7\xfe\x91\xa4\xf0\xcf\x12\x40\xe0\x43\x1f\xfa\xd0\ \x1b\x30\x99\xdb\x0d\xf3\xb5\x72\x19\xb0\x9b\xd0\x91\xc3\x87\x34\ \x4b\x4e\xff\x4f\xde\x7c\x87\x92\x86\x51\x28\x0e\x85\x78\x9a\xe5\ \x4b\x56\xe3\xae\x65\x32\x92\x4c\x6a\x68\xcb\x66\x05\x11\x56\xc7\ \x0a\x3a\xcc\x73\xc0\xf9\x80\x86\x77\x6e\x53\x7a\x68\xa8\xe3\x16\ \x1d\x21\x5d\x1e\xbd\xf6\x33\x35\xaf\xa6\x68\xba\x5b\xf8\xc8\x35\ \x56\x64\x05\x56\xab\x2a\x46\x6a\xdd\x7b\xfd\x76\xd2\xeb\x16\x77\ \x81\x5a\x5d\x4d\xc0\xba\x81\x00\x3c\xb2\xc8\x02\x0a\x34\x25\xf8\ \xca\x95\x2b\xdf\x73\xdf\x7d\xf7\x6d\x90\xe4\xfc\x54\x01\x50\x8b\ \x27\xdf\xf6\xb6\xb7\xdd\x4f\x1d\xef\x33\x0f\xe5\xc9\xc0\xc6\x4f\ \x9e\xd0\x19\xd2\xdb\x35\xc3\x2b\xb5\xb2\x3b\xa3\x64\x87\x79\x16\ \xe4\x73\x01\xa6\x96\x6a\x34\x73\xfc\x24\x7e\x58\xb1\x4c\x53\xda\ \xe2\xab\xa4\xc0\x7d\xbd\x57\xb9\x43\x72\x20\xad\xe4\x86\x21\x85\ \x13\x21\xfb\xbd\x01\x68\x4d\x1d\x79\x45\x2e\xc2\xbe\xc6\x6d\x9a\ \x8c\x12\xf7\xa6\x25\xe6\x6b\xaa\x7e\xf9\x9a\xd7\x06\x53\x5f\x90\ \x68\x43\xe1\xd4\xbd\x79\xbb\xc2\x71\x8a\x29\x2c\x2f\x64\xc2\x2d\ \xb9\x81\x26\xa7\xe4\x52\x8c\x09\x25\x2e\x92\x3d\xd2\xa3\x08\xdd\ \x7e\xfb\xed\x1f\x35\x6c\xfe\x14\x01\xd8\xa4\x67\xd5\xf0\xf0\xf0\ \x9b\x6d\xd3\x02\x9a\x45\x92\xe3\xc7\x8f\x2b\x37\x33\xab\x3d\xdb\ \xb7\x2b\xe1\xb5\x98\x0f\x7b\x6d\x34\xae\xd4\x44\x1b\x0b\x33\x6e\ \xa8\x92\x5d\xd6\xa5\x23\x47\x54\x5e\x5a\x6a\x23\xbb\xd4\x43\xde\ \xde\x0b\x36\x38\x8e\x0f\xd7\x58\xad\xae\xf5\x83\x72\x9d\x96\x36\ \x2b\xa4\xd2\xe7\x5f\x78\x41\x59\xf2\x8a\x2b\x35\xeb\x59\x17\x60\ \x6c\x0b\xc3\x4f\x7c\x0f\xf6\xad\x92\x17\xc8\x09\x6e\x38\x57\x63\ \xee\x9a\x82\x31\x4f\x91\x95\x09\xa5\x46\x37\x2a\x3e\x30\xc2\xf7\ \xa0\x65\xc6\x2f\x59\xc5\x80\x8e\x6a\x5e\xbc\x64\xb1\xa0\x8a\x40\ \x5c\xce\x01\xea\xef\x06\x13\xd3\x3f\x4d\x00\xa1\xfb\xef\xbf\xff\ \x1e\xc2\x5e\xcc\xdc\x5c\x06\xfd\x2f\x9e\x3b\xa7\x4b\x50\x17\x68\ \xba\xb2\xaf\xcf\x32\x1f\x31\xc9\x89\xf5\x41\x34\x58\xc2\x02\xaa\ \x2c\xca\x6f\x17\x6b\x35\x39\x05\x5e\x2c\x9d\xbf\x60\x90\xdd\x32\ \x11\x27\x3d\x1d\xdd\xbd\x4b\xc9\x15\x5d\x2a\xe3\xef\x31\xc2\xd4\ \xf2\xc4\xa4\x2e\xec\xdb\xaf\x6a\xbe\xd0\x36\xfd\x46\x27\x62\x40\ \xae\x25\xbe\x5b\x6c\xa9\x15\x73\xea\x1e\xdd\x2c\x67\x78\xbd\x6a\ \xf1\xaa\xea\xe1\x05\x79\xf1\xac\xba\x6e\x5a\xa3\xfe\x37\xbf\x13\ \xdc\x59\x05\x58\xc2\x38\x40\xe9\x48\x90\xcd\x2a\xad\xe6\x1d\x98\ \xaf\x9d\x3f\x2f\x1f\xf3\x93\xbe\x1b\x2b\xe8\xff\xd8\xc7\x3e\xf6\ \x96\x2b\xf9\x0e\x74\x0e\x4c\xbc\x5f\xb7\x6e\xdd\x3f\xb5\xfd\x3a\ \xc8\x80\xdf\xc4\xd9\x73\xca\xcf\xcd\x69\x23\x05\x89\x61\x3e\x6a\ \xd2\x52\x99\x2c\xcd\x11\xff\xc1\xb0\xf1\x39\x4f\x35\xbf\x83\x96\ \x1b\x62\xdd\x36\x7e\x2f\xf2\x5c\x79\x69\x59\x7d\xeb\xd6\xca\x47\ \x8d\x2f\x01\x58\x2a\x29\xda\xb7\x5a\x0b\x2f\x3d\xa5\xec\x89\x39\ \xee\xbd\x3a\x3a\x74\xa2\x87\xeb\x95\xe4\x73\x4c\x1e\x11\x56\x80\ \x46\x49\x61\xfa\xac\x62\x3d\x03\xea\xb9\xee\x06\x35\x86\xd7\xa9\ \x5e\x29\xda\x7b\xd3\x3c\xeb\x0f\x84\x54\x2f\xcd\x6b\xf9\xcc\x01\ \xf9\x38\xbe\xaa\xbc\x75\x11\x22\x19\x63\x63\x72\x52\x3e\x5c\xb3\ \x1a\x29\x8b\x2e\xb4\x46\x46\x46\xee\x91\xf4\xb7\x50\xf5\x4a\x01\ \xf8\xe8\xeb\xf5\x51\xec\x6c\x43\x00\xb6\x46\x5f\x9a\x9f\xd7\x0c\ \xc0\xe7\x15\x8a\x1a\x1d\x18\x84\x79\x4f\xe0\x7d\x0b\xf4\xd4\x12\ \x00\xa7\x14\x2a\x4b\x95\x4c\x42\x3d\x23\x61\x92\x91\x90\xb8\x6c\ \x85\x20\xa8\x00\x08\x25\xfa\xfb\x59\x5c\x55\x0d\xe2\x7d\x94\x92\ \x36\x68\xd2\x65\xaa\x44\x0b\x1d\xed\x4c\x11\x8b\x69\x9b\xbd\xcb\ \xbc\xf4\x06\xca\x05\x25\x82\x43\x6a\x54\x29\x74\x66\x2f\xa8\xd0\ \x33\xc8\x3c\x2b\x69\x93\x05\x99\x2b\x6d\x05\x40\x6f\x0d\x21\x56\ \x55\xbc\xf4\x8c\xca\xf3\x17\x98\x2c\x70\x75\xaa\x67\xc0\xb5\x84\ \x30\x97\xb3\xaa\xd3\x91\x0a\x66\xba\x2c\x18\x92\x22\xdf\x2a\x29\ \x7e\x8d\x00\xde\xf7\xbe\xf7\xed\xa4\xe7\x96\x32\x75\x7e\x1d\xbf\ \x5e\x64\xf1\xb9\xf9\x39\x85\x78\xa8\x2f\x95\xb4\xa6\x1f\xb8\x42\ \xfb\x12\xa3\x44\x4e\x8e\x65\xf4\xd3\xcc\x1c\x1a\x54\xaa\xe6\x80\ \xcc\x2d\x21\x48\x56\x10\x2d\xcd\x3a\x15\x85\x32\xd7\x59\xbb\x4b\ \x76\xf7\x90\xae\x26\x61\xfc\xef\x05\xb5\x6c\x05\xd0\x10\x12\xc0\ \xd7\xc1\x1f\xa7\x2e\xa9\xc6\x5c\x01\x42\x20\x45\xce\xd8\x8f\xd1\ \xf4\x0d\x4a\xaf\x24\xc4\xca\x69\x27\x57\x2e\x65\xf2\x69\x15\x27\ \x9e\x43\x18\x01\x6b\x8d\x57\x49\x80\x63\x38\x96\x43\x16\x5b\xa3\ \x3f\x11\xdb\xb8\xd1\xe2\x55\x32\x99\x1c\x7d\xef\x7b\xdf\xbb\x96\ \x56\xda\x92\xb9\xab\xe3\x0b\xc1\xcd\x9b\x37\xef\x68\x58\xe0\xf1\ \x6c\x03\x73\x79\x76\x4e\x55\xe2\x68\x8c\xef\x69\x90\x36\xc8\x1f\ \xf5\x75\x90\xda\x35\xe4\x5a\x72\x2b\x1c\x67\xb3\x30\x38\x48\xd2\ \xe2\x5a\xc1\xe2\xfb\x68\xc7\xf8\xb1\xa1\xba\xdc\x26\x85\x4c\x77\ \x9f\xd5\x78\xc7\xd4\xbd\xcb\x73\xb9\x1d\x74\x87\x60\x3c\x88\x30\ \x09\x7d\xcc\x63\xae\x63\x05\x7e\xf9\xf2\x21\x95\x4f\x1d\xd0\xc2\ \xab\x87\x39\xc7\xf9\xa6\xc1\x9e\x25\x15\xce\x3f\xa6\xc2\x1c\xbd\ \x01\x04\x5f\xcf\x5f\x5b\xf9\xda\x39\xc1\x19\x17\x6b\x0e\x4a\x82\ \x3f\xdb\x7e\xa7\x48\xba\xd1\x28\xfd\x4a\x0b\x08\x63\x1a\xd7\x99\ \xf0\x02\x59\xd4\x2c\x90\x50\x08\x41\x24\xda\xa5\x6c\x80\xf3\x72\ \x98\x54\x90\x73\xd9\xd3\x6c\xde\xdf\x58\x32\xa5\xe9\x9c\xa2\x83\ \x6b\x94\x3d\xf4\x8c\x2a\x97\x6a\x1d\x3c\xb0\xc5\x4c\x78\x75\x4c\ \x99\x70\x54\x24\x16\x5a\x9a\x9c\xe0\xba\x07\xe3\xcd\xcb\xe9\xb0\ \x5b\xad\xd1\xe8\x98\x57\xe0\x62\x45\xd1\xeb\xd7\x60\xe6\x61\x2d\ \x1e\x3b\xa2\xca\x82\x1f\x86\x5b\xf7\xf8\xfc\x35\x85\xce\x9d\x56\ \xa3\x56\x51\xd7\xaa\xf5\x98\xfe\xb3\xaa\xcc\x8f\xa9\xb4\x80\x5b\ \x16\xa5\x7a\xe1\xda\xfe\x07\xcc\xd8\xf4\x98\x57\x4e\x56\x79\x00\ \x9d\x3d\x0d\x18\xae\x6f\x0b\xa0\x61\x05\x40\xba\x18\xe5\xe4\x68\ \x5b\x00\x36\x01\x2a\xe7\x73\xf2\xd7\xea\xb6\x3b\x13\x70\xeb\x98\ \x62\xf8\x1f\x2c\xa8\x3c\xa8\x56\xc0\xdf\x27\x4e\xab\x67\xe3\x0e\ \xe5\x87\x46\xc9\xc2\x9e\x57\x79\xc1\x33\x8b\x87\x19\x68\x68\xc0\ \x40\x33\xa1\x2a\x8e\x35\xc0\x2c\x9d\xe2\x46\xa5\x53\x00\x59\x37\ \xc1\xda\x96\x54\xca\xe4\x94\x19\xb8\x9d\x67\x69\xa2\x5e\xbc\xa0\ \xfc\xc5\xc6\x55\x40\x19\x8c\x73\x5f\xed\xbb\xf2\x6e\xbd\x59\x95\ \xc9\xa7\x54\x5e\xac\xa9\x59\x8c\xaa\x3c\x57\x27\xa7\xa8\xf2\xb7\ \xac\x17\x5d\xbd\x4c\x5c\x5a\x46\x08\xf4\x26\xa9\x8c\xac\x52\x00\ \xc3\x75\x6d\xe5\xd7\x6d\x82\xcd\xc9\x08\xfe\xdf\xdd\xa9\xc4\xea\ \xa0\xa6\xcb\x03\x41\xd3\x91\x09\x88\x73\x39\x72\x11\x34\x68\x7c\ \xfc\x27\xd2\x69\x66\xc4\x4c\x9b\xf4\xec\x12\xe4\xe7\x45\x0d\x6c\ \xd8\xae\xd2\xf8\x51\x98\x58\xb4\x02\x18\xde\xb3\x4b\x4e\xb7\x2b\ \x07\x21\x86\x58\x40\x64\xc5\x88\x4a\xaf\xce\x6a\x74\xcf\x1b\x25\ \xaf\x85\x01\x67\x9e\x79\x56\x7e\xea\xfd\x08\x7d\xbe\xee\x61\x22\ \x45\x31\xcf\xf5\x9b\x55\xdf\x1c\x63\x0e\x33\x7f\x15\x4d\x2f\x68\ \xe1\xf4\xb8\x8a\x67\xa6\x34\xe1\xfe\x9d\x32\x83\x39\x84\x44\xb4\ \x28\x86\x55\x99\xcb\x2b\x10\xa9\xcb\x09\xb3\xf6\x25\x3f\x56\x72\ \x79\x6d\xd6\x0d\x7d\x75\x97\x90\x5d\xc4\x00\xfa\xad\x1b\xc0\x6b\ \x7f\xc7\xfa\x2f\x63\x00\xbe\x11\x45\x00\xd6\x02\xdc\x3a\x92\x05\ \x40\xa8\xeb\x61\xcc\x91\x8b\xf9\x05\x42\x36\x5e\x5f\x4d\xae\x6b\ \x47\xaf\x8e\x58\x08\x87\x15\x6a\xf4\x10\x5a\x0e\x0f\x0e\x81\xd8\ \xd6\xcf\x6d\xb8\x13\x0c\xd4\x8b\x59\xeb\x42\x19\xac\x24\x3c\x14\ \x15\x27\x3b\x58\x80\xe6\x5c\xc5\x46\x42\xea\xd9\x76\x8b\xfc\xa1\ \x20\xf3\x56\xed\x73\x16\x6b\xcc\x75\x4c\x37\xde\xdf\xa7\x91\x9b\ \x6e\x26\x5b\xcd\xc0\x64\x5e\xf9\x19\xae\xe5\xfd\x58\x4e\x90\x28\ \xb0\x48\x32\x86\x9b\x76\xb9\x8a\x64\x58\xcb\x95\x3a\x6a\x97\xe6\ \x5e\x0d\x1e\x02\x81\x4e\xc8\x8f\x9b\xe1\x2a\x01\x70\x32\x72\xb9\ \x16\x77\x5b\x80\x17\x96\x14\x89\xf9\x31\xdd\x28\x8b\xd4\x15\x49\ \xcb\xb5\x82\xf0\x4c\x49\x5a\x5a\xb6\xb1\x21\xdc\x3d\x80\x46\xdb\ \x80\xe7\x1a\xe1\x34\x31\xfb\x49\xc1\x15\x89\xcb\x0a\x65\x76\xdd\ \x22\x5f\x2c\xcb\x12\x4a\x24\x31\x45\x25\x56\x39\xca\xec\xbe\x55\ \x99\xd5\x6b\xdb\x00\x57\x62\xc1\xb8\xa3\x4d\xa6\xda\x64\xc1\xd2\ \x53\xff\xa6\x75\xd6\x2a\x4a\x53\x92\x9b\x8d\x20\xd8\xba\xaa\x26\ \xde\x57\x1d\x18\xa4\x14\xee\x62\xed\xc1\xab\x2c\x14\x62\xe4\x79\ \x9a\xa8\x1d\x01\xc4\x7e\x12\x04\x1d\x4c\xc3\xf1\x0c\x83\xf6\x4a\ \xd3\x5e\x08\x3a\x52\x18\xb2\xe8\x0f\x98\xd9\x30\xe5\x75\x26\xbe\ \x3a\xe6\x34\xeb\x46\xca\x06\xa1\xeb\x36\x7d\xc5\x96\xda\xd6\x01\ \x92\x97\x7d\xf2\xa6\xcf\xab\xb1\x9a\x50\x18\x0a\xab\xff\x86\xdd\ \xca\x12\x59\x34\x77\xc6\x3c\x49\x65\x78\x17\xf8\xb1\x0d\x2d\x8a\ \x79\xd0\x7e\x39\xaf\x06\x02\x38\xfd\xa3\xa7\x2c\xd3\xe1\x78\x5c\ \x83\x37\x5c\x8f\x55\x31\xab\x93\xc5\x22\x82\x6a\xe4\x04\x78\x86\ \x55\x26\x5a\x79\xf8\x39\x38\x06\xcc\x98\x05\x7b\xf8\x7a\x93\xe7\ \x9d\x2b\x85\x60\xad\x08\x2b\xef\x84\xe7\x4e\xd2\xd8\x11\x00\x42\ \xe7\xc3\x85\x76\x3b\xcc\x4f\xa3\x11\x62\x45\x7e\x18\xf0\xe1\x54\ \x75\xb7\x80\xb6\x42\x52\xbd\x3d\xe7\x55\x42\x68\xb6\x42\x98\x5a\ \x3e\xe7\x96\x0b\xb8\x90\x09\x93\x56\x8b\x00\x1e\x52\x07\x89\x0b\ \x53\x17\x94\x1a\x59\x85\x80\x7c\xea\xdd\xb8\x55\x8d\x35\x68\x5c\ \x20\xbc\x31\x7b\xeb\xaf\x35\x35\x8c\xf6\x4b\x05\xc6\x20\xb1\xbf\ \x64\x05\x50\xcb\x17\x48\x84\x7a\x94\x59\x13\xa3\x29\x7b\x09\x2c\ \xc1\xdd\x96\x22\xcc\x5b\x47\x00\xb3\xed\x90\x07\xb9\x0e\x2e\xd4\ \xb4\x02\xa8\xe6\x6c\xc8\xb2\x82\x11\x14\x08\x87\x6d\xe9\xcd\x77\ \x53\x17\x94\x0c\xcf\x57\xba\x80\x0b\xff\x95\x8e\x00\x02\xc1\x80\ \xc2\xc1\x90\x15\x40\xb3\xcc\x12\x17\xa7\xd4\xe0\x38\x94\x34\x3c\ \xa3\xd5\x2b\xfc\x1f\xe2\x24\xa3\x9f\x3e\x7d\x2c\x69\x05\x51\x5b\ \x9c\x36\xa6\xd9\xbe\xee\xb6\xcc\xb9\xe8\xd3\xd2\xf1\x83\x68\xc6\ \x30\x55\x13\x92\xc4\x4d\x70\x2f\x88\x63\x90\xd8\x16\x39\x30\x4b\ \x31\x55\x2a\xa3\xd5\xcb\xee\x86\xe6\xfd\xa4\xc3\x21\x55\xaa\x13\ \xe4\x13\x45\x04\xd0\x24\x22\x04\x40\xff\x29\xee\xab\xb5\x75\xd0\ \xae\x03\x1c\xc1\x2c\x7e\xcf\xd8\xd6\x26\x6b\xf3\x29\x9c\x4c\x5e\ \x16\x00\xd6\x5e\x96\xe4\x5d\x69\x01\x55\x8a\x85\x2c\x17\xe4\xf0\ \x2f\x88\xb4\xa2\xd4\xf3\x05\x53\x86\x56\x1c\x55\x2f\x4d\x2a\x0a\ \x6a\xbb\x4b\x53\x0a\xa7\x43\xaa\x2e\xb9\x1d\xe5\x63\x15\x14\x48\ \x5d\x52\x33\x19\x55\xbc\xb7\x4f\x75\xb4\x5f\x9e\xba\x88\x00\x0c\ \x00\x36\x21\xd7\x2c\x02\x01\x38\x2a\x2d\x9e\x52\x61\xc3\x46\xac\ \x60\xd4\x6a\x85\xa7\xda\xeb\x68\xf9\x37\x44\xec\x9f\x46\x0e\x4d\ \x0b\x82\xa3\xb7\xdc\x6c\x05\x10\x8c\xfa\x15\x88\xcf\xca\xf5\x16\ \x50\x42\x59\x71\x94\x51\x9e\xe1\x38\x32\xaf\x6a\x10\x86\xea\x6a\ \x15\x44\x30\x6e\x4a\x82\x9a\x8d\x6d\x86\xe0\x06\x1e\x3c\x53\x84\ \x51\x94\x75\xde\x99\xa1\xec\x79\x06\xb7\x63\x01\x4d\x88\x28\xb3\ \x30\xe9\xb5\x93\x9d\x40\x84\xbc\x9d\xc2\x21\x84\x69\xca\x63\xc2\ \x19\xfa\x82\x17\x4f\x29\xb3\x69\xbb\xe2\x1b\x57\x28\x71\x5d\x58\ \xb1\x15\x94\xc6\x2b\xa5\xd4\xfa\xa8\xd2\x3b\x37\x72\x6d\x27\x9a\ \x0a\xa8\x34\x37\xad\xda\xec\x02\xe6\xd9\xd2\x1e\x02\x80\x18\xb1\ \x82\xf2\xa5\xa2\x96\x8e\x1e\xe0\xb8\x24\x54\x67\x1b\x9a\x6a\x6b\ \xbe\x69\xc8\xa5\x09\x33\x8f\xb5\x95\x1c\x2e\x5b\xf4\xc7\xa4\x03\ \x54\x7a\xa4\xb3\xd5\x29\x3a\x3f\xe4\x23\x7c\x0f\xc5\x68\x84\xa4\ \x27\x94\x1c\xad\xaa\x6b\x6d\x43\xd1\x6e\x62\xfb\x30\x58\x91\xa0\ \x44\x4e\x19\x16\x3a\xd6\x60\x5c\x22\x24\x7f\x3c\x81\xe2\xd2\xea\ \x58\x38\xca\x3e\xcb\xe0\x5e\x69\x01\x15\x5e\x37\x5f\x68\xa7\x8a\ \x56\x00\x71\x3a\x2d\x61\x80\xca\x71\x72\xaa\x2e\x37\x95\x3b\xfa\ \x8a\x86\x6e\xbc\x59\xdd\xeb\x37\xca\xb9\x7e\x37\xfe\x99\x67\x81\ \xb8\x45\x22\x69\xcd\x2b\xc4\xbd\x1e\x0c\x94\x2e\x9e\xc5\x05\x4c\ \x62\xd2\xb0\x21\xc8\x46\x08\x00\x94\x0f\x7e\x4b\x59\xfa\xea\xb8\ \x4a\x37\x6c\x53\x6a\x68\x58\xb0\x29\x62\x94\x05\x4e\xdb\xe2\x22\ \x6f\xaf\x13\x4a\xdd\x52\xc8\x0a\x8e\x05\x83\x17\x75\xc6\x59\xc5\ \x7a\xa9\x27\xd2\x31\xd6\xd3\x24\xaf\x99\x50\x62\x10\x54\xc7\xdf\ \xb3\xb1\xba\x92\x83\x8e\x55\x54\xac\xdf\xa3\x36\xc1\xcc\xc9\xf0\ \xf9\x87\xc9\x1b\xcb\x89\xcb\x47\x63\xc6\x6f\x92\x20\xe6\xe7\x63\ \x36\x5b\x9c\x66\x68\x5c\x89\x01\xb5\x31\x3e\x6e\xfb\x8f\xfa\x90\ \x5a\x82\xfa\x3f\xc2\xc3\x4c\x62\x4d\xac\x7c\x3e\xaf\xe9\xe7\x7f\ \x04\x43\x25\xf9\x9d\x0a\x85\xc9\x08\x4c\x0c\x21\x71\xee\x71\x6c\ \x1e\x4f\x3c\x9e\x21\xef\x9e\xc5\x8f\x6d\x28\x6d\xbd\xf4\xb4\x16\ \x00\xd5\x4d\xdd\x40\x9a\x3d\x57\x50\x69\xf2\x02\xf7\x57\xed\x33\ \x1e\xd4\x74\x49\x9d\x99\xb7\x78\xe1\x04\xe8\x5e\x36\xf7\xd9\x6e\ \xd1\xf9\x67\x9f\xd3\xf4\xb1\x1f\xab\xb4\x7c\x46\xd1\x01\x3f\x16\ \x66\xc2\xd5\x8c\x22\xe9\xb8\x42\xa9\xa8\x62\x03\x41\xf5\x6d\x75\ \xd4\xb3\xc9\x53\xcf\x96\x06\x02\x90\x4d\xd6\x1c\xd7\x47\x04\xf3\ \xb5\x36\x5c\xa0\x9c\x38\x1d\x67\xe1\x0a\x9d\x4c\xf7\xa5\x97\x5e\ \x3a\x72\x0d\x08\x3e\xf9\xe4\x93\x87\x79\x97\x56\x32\x37\x38\x94\ \x9d\x71\x04\x10\xc5\x0a\x8c\x09\x35\x25\xea\x7b\x29\x77\xf8\xa8\ \xe6\xc7\x0e\x61\xde\x79\x62\xef\x84\x8d\xd9\x96\xbc\x9a\x05\xb7\ \xfc\xe9\x63\xc4\xe6\x26\xd7\x3d\xcb\x7c\xc7\x05\x3a\x84\x50\xb8\ \x86\x20\xb0\x1e\x98\xb7\x66\xcf\x09\xc2\x24\xf5\xc1\xf4\x5e\xcd\ \xef\x7f\xc2\x6a\xd0\xab\x59\x90\x45\x08\x15\x18\x68\xd0\xf1\x09\ \x71\xef\x12\xe7\x2f\xe2\xe7\x30\x97\x48\x51\x7c\xf5\x70\x2d\x4e\ \xe1\x14\xa2\x90\xf1\x81\xfc\xed\x30\x58\x43\xf7\x35\xbf\x22\x4e\ \x00\x1c\x8b\xc9\x0b\x85\x08\xbb\xf4\x12\x4c\x94\x81\x30\xff\x69\ \xb6\x1b\x9d\xfc\x49\x10\xf4\xf8\x5c\x64\x33\xc3\xab\xd4\x04\xdb\ \x48\x15\x49\x66\x32\x4a\x50\xe2\xe6\xe9\xa8\xd8\x5c\xda\xe5\xe1\ \x0b\x35\xcd\x3d\xff\x14\xdd\x9d\x21\xc5\xfa\xfa\x55\x5d\x30\x66\ \x69\xea\xfd\x10\xe0\x35\xa7\x3a\x55\x57\x2d\x17\x31\xcc\xb6\xa3\ \x83\xc9\x0f\x60\x1e\x57\x41\x8a\x9c\x73\xad\xc9\xe3\x9b\x30\x58\ \x80\xa1\x79\x79\x95\x33\xb8\xd8\x51\xac\x62\x99\xe2\x86\x34\x35\ \xe0\xb4\xdc\x47\x02\xe9\x23\x58\x98\x41\xf5\x79\x70\x61\x49\xa1\ \xae\x1e\x1a\x17\x71\x14\x94\xa0\x59\x02\x40\xc3\xa4\x70\x51\xb1\ \x36\x61\x31\x6e\x1d\xed\x57\xc0\x8c\x0a\xd1\x05\x73\xf1\x27\x53\ \xaa\x74\xa5\x71\xdb\xf5\xca\xb6\x37\x66\xcd\xcf\xcf\x1f\x94\x94\ \xfd\xc9\x96\x58\x13\x9a\xc7\x0b\x9e\x05\x21\xad\x99\xf8\x31\x9d\ \xf4\x9a\x35\x0a\xa6\x52\xed\xa6\xa4\xd0\x9c\xa3\xfc\x49\x1a\x25\ \xfb\x9e\x46\x71\x86\x81\x32\x42\xb8\x00\xd3\x33\xaa\x2d\x2f\x81\ \x65\xa1\xab\xc2\x97\x07\xb5\xcd\x1f\x42\xe3\x6a\xa0\x41\x97\x89\ \x2e\xaa\x3a\xbf\x17\xac\xd8\x8b\xc6\x8f\x32\x4f\x56\x45\x84\x0b\ \xd6\xd8\x8c\xce\x41\x60\xe4\x06\x3c\x5f\x67\xfe\xf3\xcc\x3b\x4b\ \x68\x0e\xc2\x78\x44\x0e\xc2\xf6\x05\xad\x10\xf0\xeb\x2e\xe6\x8b\ \xf3\xbd\xdd\xaa\xc9\xe1\xf7\x65\x42\x78\x1d\xed\x93\x70\x05\x33\ \x19\xa5\xae\xdf\x2a\x5f\x3c\x66\x9b\x21\xa6\xd7\xc1\xde\x81\xc7\ \x84\x4a\xff\xa1\x9e\x60\xe9\x3b\xdf\xf9\xce\xf7\x30\x91\xaa\xc1\ \x02\x87\x50\x18\xe7\x0d\x4c\x64\x90\xb4\x36\x16\xb5\x21\x05\xb9\ \x80\xf2\xd2\xf2\xe1\x63\x5a\x3a\x31\x66\x72\x76\xa8\x26\x37\x3f\ \xa7\xe5\xb1\x7d\x2a\x4d\x2f\xb0\xc0\xa0\x01\x1c\x8b\x1d\x3c\x70\ \xd9\xfc\x1b\x90\xcf\xef\xa2\x4d\x63\xf6\x27\x08\xaf\x17\x44\xc5\ \xc5\xb1\xc9\x14\x49\x6d\x67\xc8\xeb\x0b\x71\xc1\x91\x15\x58\x85\ \x0c\xaf\x1b\x8c\x49\xf6\x0d\x12\x96\xbb\x15\x80\xe9\x96\x19\xc9\ \xb6\xcd\x85\xf6\x1d\x5f\x08\x0e\x18\x9b\x30\x8e\xe9\x8b\x42\xc8\ \x57\xc0\xfc\x3d\x08\xe4\x5f\x0e\xfa\xb4\xfa\xce\x3b\x55\x67\x1d\ \xed\x0d\x1d\xcb\xff\xf3\xab\x5f\x7d\x54\x92\x7b\x4d\x4f\x50\x2c\ \x85\xed\x25\x63\x48\xe8\x50\x3c\x1e\xbf\x85\x92\x51\x41\xd0\x33\ \x45\x27\x25\x4b\x77\x55\x24\x27\xcc\x62\x2b\xad\xdc\xb9\x3a\xfe\ \xba\x4f\x09\x5c\x21\x94\x4e\x09\x75\x63\xa2\x05\x15\xcf\x03\x82\ \xe5\x59\xe5\xa7\xd1\x98\x79\x3e\x81\x76\x22\x61\xae\xdb\x82\x04\ \x90\x42\x33\x69\xa8\x2f\x20\xc0\xc5\x76\x8b\xb9\x04\xb3\x2e\x89\ \x48\x85\x50\x9b\x27\xf5\xbe\x84\x15\xd4\x5a\xcf\xf8\x4d\x76\x88\ \x40\x8a\x97\x6b\x14\xdc\xa3\x6c\xdd\x11\x0d\xb5\xdc\xac\x0e\x55\ \xb8\x37\x8f\xd5\x2c\x04\x14\xc8\x13\x26\x11\x8c\x47\xdc\x0f\x6c\ \xda\xa0\x24\x2f\x6f\xe7\x0a\x79\xdb\x0d\x62\xd3\xc4\xe3\xf9\x62\ \x71\xca\x4a\xf2\x5a\x01\xd8\x93\xb3\x7b\xf7\xee\x7d\x84\xf6\xb8\ \xd9\xdc\xe8\x04\x89\x02\x49\x04\x50\xe4\xbd\xa0\x72\x79\x28\x67\ \xb5\x5a\x2b\x38\xca\x9d\x9e\xd7\x12\xe7\xfb\xf7\xec\x84\x11\x59\ \x8d\x37\x1d\x17\x01\xd5\x29\x54\xa6\x68\x5e\x56\x6c\x1c\x0f\x63\ \xce\x84\x22\x50\x1b\xad\x24\x73\x8a\x0f\x61\x5d\x32\x61\xcf\xb1\ \x59\x9c\xc7\xc2\xb2\x2f\x5f\xd2\xfc\xcb\x0d\x30\xc6\xa7\x64\x66\ \xb0\x53\x9e\xd8\x66\x4b\xad\x14\xc6\x5d\x7c\x8a\x90\x03\x78\x80\ \x26\x21\x02\xa1\x76\xf3\xf7\x10\x08\x2e\xa8\xb2\xd1\x08\xb8\x32\ \x8b\xf6\x97\x30\xff\x32\x18\x80\xdb\x9e\x25\xc3\xdc\xf0\xcf\xde\ \xad\xba\xcf\xe9\xec\x55\x74\xbf\xff\xdd\xef\x7e\x05\x26\x4b\xe2\ \x73\x8d\x00\x3a\x49\xd2\xfe\xfd\xfb\x1f\xc7\x0a\x5e\xd9\xbe\x7d\ \xfb\x36\xfa\x67\x0a\x00\x84\x5d\xbb\x76\x69\x79\x0e\xf3\x86\xa9\ \x26\xa4\x86\x30\x59\x72\x83\x53\xa7\xd4\xbd\x69\x2d\x0c\x46\xf0\ \xd7\x12\x3d\xfe\x57\xb4\x34\x0e\x63\x2d\x03\xb3\xa6\x7f\xfe\x99\ \xe7\x8c\x55\xab\x7b\xa3\xc7\xcb\x4d\x97\x4c\x2e\x88\xb5\xa0\x79\ \x00\x8b\x66\x08\x02\x80\xc9\x2c\xe9\x33\x9a\xf3\xc8\x00\x27\x5e\ \xdc\x7f\xe5\x0e\x26\xee\x97\x46\x76\x01\x8e\xfd\x54\x99\x7d\x30\ \x69\xe6\x75\x0a\x08\x1d\xa0\x2d\x92\x3c\x65\x6b\xf2\x2f\x32\xd7\ \x14\x82\xce\x05\x01\xbf\xa8\xf2\x7d\xdd\x8a\xdc\xb2\x5b\x29\xc0\ \x6f\x1e\xed\x9b\x8d\x1d\x67\x4e\x9f\x7e\xe2\x99\xa7\x9e\x3a\x20\ \x56\xff\x53\xdf\x0e\x77\xb2\x42\x5e\x8b\xf9\xb6\x6c\xd9\xf2\x16\ \x3a\xc5\x8e\x49\x8a\x82\x50\x9d\xee\x6a\x93\x56\xb7\x8c\x00\x6c\ \xda\xea\x90\xa2\xd6\xd0\x68\x17\x3e\x38\x21\x77\xf9\x15\xb0\xa0\ \x2c\x8c\x11\x80\x74\xac\x69\x63\xe1\x24\x55\x52\x7a\xb5\xa7\xde\ \x55\xae\x7a\x77\x05\x40\x72\x98\x08\xf9\xb0\x0e\x23\x00\x21\x08\ \xfc\xff\xac\xa7\xec\xb4\x0f\x30\x75\xae\x69\x3a\xe1\x5d\x60\x90\ \xa3\x44\xcc\x53\xa8\xa7\xfd\x72\xd4\xb6\xa1\x58\xc3\x32\xda\x9f\ \x02\x57\x26\xb9\xe7\x22\x20\x59\x00\x24\xfb\x07\x75\xaa\x2f\xa5\ \x1d\x0f\xfe\xa1\x6a\x91\x90\x49\x7a\x44\x92\x57\xfb\xc6\x23\x8f\ \x3c\x38\x7e\xf6\xec\x31\x33\xe5\xcf\x7a\x3d\xee\xb2\x0d\x75\x86\ \x77\x69\xdb\xd9\x6a\xb2\x26\x12\x8d\xb2\x80\x98\xc2\x50\x69\x6e\ \x16\x90\xa1\x2f\x8f\xd9\xa2\x3d\x00\xad\x81\xc4\x27\x15\x0c\x9d\ \xc5\xa5\x2b\x80\x95\x09\x18\xd4\x06\xa4\xa6\x80\x34\xcd\x89\xa6\ \xba\x60\xbe\x67\x65\x83\x66\x87\x0f\x40\x0d\x60\xbe\x41\x9b\x5b\ \xd8\xac\xa6\x2d\x80\xfa\x82\x47\xb2\xe3\x53\x69\xde\x0a\xa5\xa3\ \xfd\x4e\x25\x6b\x29\xc1\x5c\xb1\x3e\xb5\xdc\xad\xc1\x89\x3c\x37\ \xce\x50\xfa\xe2\xd1\xc1\x69\x7c\x3f\x6b\x36\x47\xf4\xea\x04\x09\ \xd2\xba\x7f\xf7\x51\x45\x79\xf9\xba\x48\x64\x9a\x9b\x9b\x63\x2f\ \xd3\xfe\xaf\xfd\xcd\xc3\x0f\x3f\x64\xf2\xb9\x9f\x77\x83\x44\x89\ \x0d\x88\xb3\xec\xb8\x7a\x07\x1b\x0c\xc2\x30\x6f\x22\x01\x42\x88\ \xab\x44\xf9\xe9\x00\x88\x04\x5d\x5b\x76\xc6\xd3\x15\x16\xd6\x80\ \x29\x07\x40\x74\x38\x86\xf1\x98\xc7\xf9\xa6\x52\x7d\x9e\xd2\xc3\ \x4d\xa5\xb7\xf8\x31\x5f\x7c\x33\x12\x82\xa2\x58\x40\xbc\x85\xe0\ \x4d\x59\x60\x13\x0c\xb9\xcb\x9e\x0a\x0b\x3e\xac\x47\xd7\x7e\x9a\ \xcc\xdb\x83\x10\x98\xd3\x66\x83\x26\xdd\x5d\xa0\xc4\x9d\x26\xde\ \xcf\x60\x55\xb9\x30\x80\x99\xd1\x59\xf2\xfd\xf0\xbb\xde\xae\x91\ \xb7\xbd\x55\xd9\x72\xc9\x68\xde\x00\xdf\xe4\x9f\xfd\xf1\x1f\x7f\ \x14\x0c\xb8\xe4\x32\xd3\xcf\x2b\x80\x06\x7e\x33\x07\x72\x3a\xec\ \xc8\xbc\xdd\xb8\x42\x10\x21\x18\x30\x0b\x43\x65\xfa\x73\xbe\x4a\ \x99\xa2\xa4\xa6\x44\x0f\x9d\xa3\x5e\x13\x8d\xa0\xa0\x6c\x46\x16\ \xee\xf6\x51\x2c\xf9\x14\x1d\xf6\xa3\x75\x3f\x11\xc1\x68\x3e\x0c\ \xf3\x09\xf0\x20\x45\x0c\xa7\x34\x05\xc5\x65\x30\xc0\xad\xdb\xf6\ \x99\x93\x6d\x08\x78\xa4\xd1\x69\x31\xe4\xca\x8f\x2d\x61\xa3\xcc\ \x99\x49\xca\xbe\x2d\xf2\x2d\xa2\xf1\x59\xfc\x7d\x0e\xca\x86\xb9\ \x9e\xd6\x85\x44\x46\xb9\x9b\x76\x6b\xcb\x07\xff\x40\x45\x22\xce\ \x2c\x9a\x27\xb3\x73\xbf\xfd\xcd\xbf\x7d\x60\xec\xd0\xa1\xa7\x8b\ \x92\xfb\x8b\x6e\x92\x32\xfb\xf4\xcf\xd0\x2e\x5f\xcb\x0b\xc5\x8d\ \xc6\x15\x82\x26\xb4\x25\x13\xb6\xf8\xa9\xd0\xc5\x4d\xc6\x4b\x8a\ \x67\xaa\x14\x44\x4d\x2b\x00\x27\xe0\x20\x04\x53\x81\xf9\x18\x61\ \x3a\x1c\xe0\xd8\x6a\x1d\x4a\xf2\x3d\x0d\xf3\x90\x2f\x81\x2a\x5a\ \x4d\x10\xe2\x9a\xb5\x82\x00\x56\x13\x2c\x21\x04\x62\x77\x35\x27\ \xce\x31\x9f\x98\xcb\x41\xd3\xe0\x45\x17\x00\x98\x89\xa0\xf1\x3a\ \xf9\xfd\x42\x58\x21\x28\x98\x37\xf9\x46\x5a\xe7\x48\x17\x67\xe8\ \x18\xed\x78\xe0\xe3\xaa\x04\xfc\x2d\xe6\xd9\xd4\xf1\xdc\xd3\xcf\ \xfc\xf9\xb7\xbe\xf6\x57\x7f\xce\x74\xc5\x7f\xcc\x2e\xb1\x26\x54\ \x38\x76\xec\xd8\x89\x15\x2b\x56\xec\x21\x22\x0c\x21\x04\x6b\x05\ \x81\x54\xca\x36\x29\x6b\xe5\x9c\x52\xdd\xe6\x5d\x5e\xcd\x34\x25\ \x21\x41\x7e\xcc\xd1\x6f\xb2\x33\x98\x07\x94\xc2\x31\x4c\x3e\xc1\ \xf7\x14\xe7\x93\x5c\x8f\x73\x53\xa8\x95\x83\xd9\x1e\xa3\x6b\xdd\ \xc9\x71\xc0\x93\x18\x7e\x5e\x47\x10\x29\x1f\x58\x40\x37\x0a\x0a\ \xd3\x0c\x49\x67\x82\x1a\xec\x0e\x28\x19\x20\x45\x07\xe8\x42\xf8\ \x7b\xa0\x4c\xc7\x38\xd8\xa3\x13\xfe\x08\x9a\xbf\x49\x3b\x3e\xfe\ \x31\x55\x10\xfa\x0c\xcc\xa3\x38\xb3\x9f\xe9\xd1\xbf\xfc\x93\x2f\ \x7c\xb2\x5b\x9a\x5b\xfe\x25\xf6\x09\x7a\x68\x69\xe1\xf8\xf1\xe3\ \x63\xbc\x36\xbf\x0d\x3c\xe8\x09\x1b\x50\x8c\xc7\xa1\x24\x05\xd3\ \xb0\xf2\x4b\xa0\x30\xd5\xa1\xdf\xd6\xf6\x08\x41\x62\x0c\x30\xfa\ \xa1\x90\x80\x3e\x04\x84\x20\xcc\xc8\x79\x35\xfc\x26\x77\x87\xcc\ \x66\xa7\x06\x63\x83\xb1\x2e\x51\x00\xc1\x36\xd6\xe4\x28\xe9\x49\ \x5d\x34\x63\xbb\x32\x01\xf5\x76\xc3\x3c\x05\x4f\x97\x2f\xac\x70\ \x93\x88\x54\x04\x43\xdc\x84\xaa\x80\xcd\x8b\x3c\x1f\x7d\xd7\xbb\ \xb4\xf9\x5f\xfd\x4b\x15\xb1\x94\xe9\x99\x19\xcb\xfc\xcb\x87\x0f\ \xbf\xf0\x97\x9f\xff\xc2\xbf\x49\x36\xea\x13\xe7\xe0\xe1\x97\xdd\ \x29\x4a\x16\xeb\xce\x8c\x8f\x8f\x1f\x23\x2a\x98\x04\xa9\x27\x1c\ \x89\xd8\x4c\xaf\x19\x89\x53\xa7\xaf\x22\xcb\x4a\xab\x9c\xaf\x90\ \x81\xd5\x2d\x53\x0c\xb6\x2a\x73\xaa\x50\x05\x43\x2e\x0b\xe0\x84\ \xd9\xa2\x2b\x15\xb0\x96\x62\x95\xe3\x0a\x54\x6b\x51\xc1\x05\xd8\ \x1a\x8c\xb8\x50\x09\xcc\x00\xe9\xa2\x50\x02\x9c\x48\xf9\xe8\x4d\ \x40\xa1\x26\xd6\x57\x8f\x23\xdb\x8c\x26\x7c\x51\x1d\x66\x0d\x9b\ \x1f\x7c\x50\x43\x77\xdd\xa1\x2c\x51\x69\x6a\x7a\xda\x00\x1e\xbb\ \x59\x0e\xbf\xf8\xb5\xbf\xf8\xef\xf7\x47\xf2\xd9\xf1\xb3\xac\xfd\ \x57\xb9\x59\x3a\x82\x05\xdc\xc4\xcf\x61\xfe\x94\x24\x69\x17\xdb\ \x68\x44\xe5\x68\x37\x48\x85\xca\x00\x62\x7e\x5e\xc5\xf1\x17\x15\ \x29\x8f\x29\x1d\x98\x57\xa8\x51\x6d\xed\x0a\x35\x8d\x55\xfe\xf9\ \x9a\x10\xff\x1c\x4b\x9d\xfd\x4e\xed\x37\xc4\xed\x1e\x23\x9e\xd4\ \x29\x67\xa1\x20\xc2\x0c\xa2\x6d\x46\x2f\x2c\x4c\x4e\x34\xc1\x34\ \x56\xa6\x17\x71\xd7\x5d\xda\xf8\x9e\x7b\xd5\xc0\x12\x17\xb3\xcb\ \x76\x57\x3a\x95\xac\x8e\x1c\x3c\xf4\xf8\x5f\x3f\xf4\x95\x8f\x77\ \x57\x4a\xa7\x8f\x4b\xee\x6b\xb1\x5d\x3e\x44\xc7\x68\x2b\x7b\x08\ \x3f\xc5\x6f\x05\x7e\x97\x5c\xc1\x61\x03\x92\x22\x21\x80\x09\x33\ \x8e\x19\x7f\xa6\xa7\x57\x3e\x7d\x08\x3f\x3d\xa5\x1e\x65\x11\x48\ \x49\x81\x6a\xc3\xee\x23\xf0\xd7\x01\x4b\x5b\x11\x43\xcd\x76\xba\ \x6b\x81\xc3\x69\x63\x82\x9f\xf3\x86\x60\xda\xe4\xfa\x68\xde\xa3\ \x08\xba\x58\x71\x75\xae\xe1\xd1\x97\xdc\xa3\x4d\xec\x47\x0e\xb2\ \x1b\x2d\x47\x42\xb6\x40\x92\xc3\xfe\x3f\xa3\xf9\xc6\x81\x7d\xfb\ \xfe\xc7\xf7\xfe\xfa\x6f\xfe\xeb\x48\xd3\xbb\x78\x04\x91\xbe\x96\ \x3f\x98\x08\x40\xc3\x3b\x77\xee\xfc\x83\x37\xbd\xe9\x4d\x0f\x12\ \x26\x53\xec\x20\x17\x20\xa9\xb0\xc9\xfd\x59\x68\xdc\x41\x61\xc5\ \x9c\x0a\xaf\x9e\x94\x26\xc7\x15\x9a\xbf\xa4\x1e\x9a\x1b\x09\xf2\ \xf6\x40\x89\xd4\xb5\x4a\xee\x6e\x84\xc0\x3f\xf1\x8c\x7c\x50\x20\ \x88\x79\x87\x60\x38\xa2\x1a\xe3\x54\xa9\xaa\x59\xee\xa9\x62\x69\ \x03\x6f\x78\x83\x46\xd8\x7d\xee\x74\xa5\xf1\xa0\xaa\x96\xb2\x59\ \x9b\xe1\x4d\x63\xf6\x67\xcf\x9c\x99\x7b\xe6\xc9\x1f\xfc\xa7\xa3\ \xcf\x3d\xff\xcd\x95\xd4\x73\x07\x25\xef\xf5\xf8\xc9\x8c\x03\xa5\ \xf9\xdc\x7a\xc7\x1d\x77\x7c\x82\xd7\xcd\x6f\xc6\x25\x7c\x84\x4b\ \xc5\x63\x31\xbb\x83\x3b\x2c\x29\xee\x0f\x28\xe6\x43\xb3\xe4\xe3\ \x45\x4c\xb4\x3a\x35\xa9\xe6\xec\x8c\x7c\x30\xa0\x82\x79\x77\x50\ \xb7\x55\x5e\xc3\x54\x85\xe1\x88\x5c\x00\xd6\x4b\x53\xe3\x0f\xf4\ \xab\x7f\xcb\x56\xf5\x6e\xdd\x22\x1f\x6e\x46\xd9\xa0\x3c\x6e\x96\ \xe3\x99\x2c\xcf\xd2\xd4\x10\xd9\xaa\xcb\xa6\xcd\xbf\xfb\xc1\xf7\ \x1f\xfd\x6f\xde\xe2\xe2\xd1\xf5\xf2\x2a\x3f\x92\x9a\xaf\xf7\x8f\ \xa6\x82\xd0\x8a\x0d\x1b\x36\xdc\x73\xe3\x8d\x37\xde\xbf\x7e\xfd\ \xfa\x1b\x00\x4a\xb3\xc9\xda\x6e\x47\x09\xe3\x1a\x21\x63\x15\x50\ \x14\x0d\x47\x8c\x60\x10\x4a\xc0\x74\x6b\x3b\x11\x83\x63\x87\xeb\ \xe2\x9a\x82\x41\x46\xbf\x5c\x47\xb6\x86\x2f\x03\x6e\x14\x26\x2a\ \x96\x4a\xc8\xab\xd0\xc9\xeb\xbd\xd3\xe3\xe3\x2f\x1c\xdc\xf7\xe2\ \x97\xce\x1d\x1d\x7b\x22\xd3\x6c\x2c\x8d\x4b\x8d\x5f\xe7\xcf\xe6\ \x1c\x28\x02\x0d\xaf\x5b\xbb\xf6\x2d\x3b\x76\xee\xfc\x17\xb8\xc5\ \x6e\x04\x11\xc2\x42\xac\x20\x00\x4f\x11\x3d\x14\x0c\xc0\x3c\xcc\ \xf2\xfb\x20\x2c\x3f\x00\x01\x78\x68\x9f\xff\xd9\xa4\xa8\xe1\x79\ \x96\xea\x00\x62\x0d\xe6\xcb\x30\x6f\x18\xe7\x17\xa5\x26\xa7\x2f\ \x4f\x9c\x3f\xff\xdc\xe1\xfd\x07\xbe\x7a\xe1\xd4\xf8\xd3\x51\xcf\ \x9d\x0f\x49\xb5\x73\xbf\x41\x3f\x9c\x74\xa0\x30\xec\xf4\x26\x62\ \xb1\x2d\xdb\x77\xee\x7c\xc7\xc8\xe8\xe8\xef\x80\x0f\x1b\x32\xec\ \xd4\x64\x07\xea\xdf\x0b\x02\x4d\x07\x10\x46\xe7\x5d\x9d\xda\xbb\ \x37\x08\xb7\xb6\x75\x45\x35\x6a\x4b\xd8\xa5\xc5\xc5\xc2\xfc\xdc\ \xdc\x31\x36\x6b\x3e\x79\xe4\xc5\x17\xff\x4f\xad\x54\x79\x35\xe8\ \xd5\x97\x03\xa6\x60\x93\x9a\xbf\xa9\x3f\x9d\x75\xd4\x2a\x0d\xa2\ \xb0\xd7\x8d\x81\x0f\xaf\xdd\xb0\xfe\xc6\x15\xc3\xc3\xd7\x03\x94\ \xab\x12\xc9\xd4\xca\x70\x24\x9c\xa6\xf1\x8a\x57\x04\xc3\xdc\x6c\ \x18\xaf\xd0\xb2\x2a\xc1\xfc\x32\x6d\xab\x0b\xec\x4e\x3f\x37\x39\ \x31\x71\xf8\xec\xa9\xf1\x83\x5c\x9f\xa6\xfa\xcb\x8a\x3e\xd1\xb2\ \xe4\xfd\x36\xfe\x78\x9a\xba\x0f\xb7\x97\xc8\xf2\x15\x91\x15\x8c\ \xc3\xe8\x84\x9a\x9c\xc7\xfc\x3d\x47\xb8\x3d\x90\xc8\xf5\x32\x9b\ \x54\xcb\xa0\x80\xcd\x08\x0c\xd7\xaf\xf5\x8f\xa8\x9d\xdf\xb0\x5f\ \xad\x37\xf5\x3a\x7f\xfe\x1f\x5f\xbc\xdd\xe6\x1a\x53\x0c\xc2\x00\ \x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\x82\ \x00\x00\x13\x09\ \x89\ \x50\x4e\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\ \x00\x00\x40\x00\x00\x00\x40\x08\x06\x00\x00\x00\xaa\x69\x71\xde\ \x00\x00\x00\x06\x62\x4b\x47\x44\x00\xff\x00\xff\x00\xff\xa0\xbd\ \xa7\x93\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x1b\xaf\x00\x00\ \x1b\xaf\x01\x5e\x1a\x91\x1c\x00\x00\x00\x07\x74\x49\x4d\x45\x07\ \xd7\x09\x17\x17\x15\x19\x49\x86\x70\x41\x00\x00\x12\x96\x49\x44\ \x41\x54\x78\xda\xed\x5b\x09\x74\x5c\xd5\x79\xfe\xee\x7b\xb3\x6b\ \xb4\x5a\xb2\x25\xd9\x96\x64\x63\x6c\x83\x31\x36\xb6\x81\x00\xe1\ \xb0\x34\x14\xc2\xda\x94\x86\x04\xd2\x90\x42\x72\x20\x5d\x20\x14\ \x68\x08\x4b\x48\x09\x87\xda\xad\x73\x52\x52\x02\x24\xad\x7b\x20\ \xe4\xb0\x95\xcd\x40\xb0\x1b\x56\x2f\x80\xb1\x2d\xdb\xd8\xb2\x6c\ \x6c\xd9\xb2\x2c\xc9\x1a\x4b\x1a\x69\xf6\xe5\x6d\xf7\xf6\x7f\x33\ \xef\xf0\xf4\x3a\x9a\x19\x1b\x26\x3d\xc9\x69\x7e\x9d\x4f\xf7\xbd\ \xfb\xee\x9b\x79\xdf\x77\xff\xe5\xbe\x2b\x1b\x7f\xb4\x3f\xda\xff\ \x6f\x63\x38\x0e\x1b\xbb\x05\x75\x52\xed\xf4\x8b\x5d\x33\x97\x5c\ \x06\xb7\xef\x3c\xa1\xa4\x3c\xd0\xb3\xc3\x42\xcd\x0c\x71\x35\x15\ \x12\x4a\x22\xc4\x53\xe3\x21\x91\x8d\x85\x84\xc0\x10\x80\x10\xe1\ \xe8\xd4\x9f\x43\xf9\x83\x16\x40\xfc\xd8\x7f\x95\x68\x5d\x76\x37\ \xe7\x58\xc6\xd3\x51\x99\x08\x42\x70\x01\xe1\x0e\x12\xaa\xc0\x65\ \x3f\x84\xec\x81\x60\x6e\x82\x0b\x90\x5c\x10\x82\x03\xdc\x00\xd7\ \xd2\x02\xba\x32\x2e\x0c\x6d\x48\xe8\x6a\x48\x68\x4a\x48\xe8\xd9\ \x10\x57\xd3\x24\x54\x7c\x48\x68\xd9\x90\x30\x85\x12\x08\x4d\x7f\ \x0c\x99\xdf\x3b\x01\xc4\x03\x9e\x3f\xc7\xf9\xf7\xbf\x88\xe6\x45\ \xcc\x24\x04\xae\x03\x26\x39\x43\x05\x32\x11\x80\xc4\x80\x9a\xcc\ \x43\xcf\x40\x68\x19\xf0\x6c\x82\x90\x02\x57\x92\xe0\xa6\x50\xb2\ \x0f\x5c\x48\x04\x53\x13\x4e\xd0\xc1\x75\x2d\x27\x14\x40\xd7\x0d\ \x03\x24\x0a\x41\x8d\x0a\xae\x87\x08\x43\xc2\xa0\x36\x07\x95\x04\ \x33\xa1\x0c\x09\x6e\x84\x00\x84\x3a\x1e\x47\xf2\xff\x4e\x80\xa7\ \x2e\xee\xc4\x99\xb7\x2c\x85\xb0\xc8\x73\x23\x07\xc7\xb9\x28\xd6\ \xa7\xe7\xa1\x98\xe2\x64\xed\x3e\xd3\x84\x00\x57\x33\xa4\xa3\x42\ \xc8\x82\x73\x0e\x03\x6e\x70\x12\xd6\x50\x32\x39\x01\x0d\x12\x52\ \xcf\xc4\x01\xba\x26\xcc\x1f\x6e\x80\x3c\x89\xa0\x27\x68\x60\x4e\ \x90\x1c\x04\x0f\x01\x3c\xc4\x64\x98\xd8\xd9\x71\x29\xba\xd9\xc5\ \x10\x95\x11\xe0\x85\x6b\x53\x58\x78\x6d\x20\x3f\xf3\x46\x09\x01\ \x9c\x62\x38\xc6\x8b\xdc\x35\x1b\xa2\xc8\x58\xf2\x1e\x40\x00\x14\ \x4e\x90\xdc\x80\xcb\x47\xf0\xe7\x3c\x46\xd7\x75\x18\x9a\x96\xf3\ \x20\x9d\x33\x12\x27\x09\x3d\x35\x06\x75\xa4\x07\x7a\xa2\x0f\xae\ \x00\x03\xf3\xe4\x6f\x37\x14\xf1\x3a\x35\xdf\xe8\x58\x81\x04\xca\ \x98\x0b\x65\x8d\xb9\x72\x0f\x97\x8b\x69\x82\x63\xc6\xb9\x89\x82\ \x63\xc7\x78\x61\x58\x2d\xb7\xfa\x8b\x8c\x35\x21\xc9\xf9\x3e\xcd\ \xf4\x96\xd4\xa7\xe2\x48\x34\xc6\x63\x0b\x95\x0f\x3f\xd9\x0b\xd4\ \xd7\x00\xb3\x2e\x85\xde\x34\x97\x9c\xec\x03\xe8\x43\xab\xc1\xb3\ \x06\xd4\x38\xae\xc8\x8c\x88\x55\xa2\x1b\x5f\x63\x0b\x50\xd2\x24\ \x94\x35\x0e\x88\x89\x04\x78\x01\x81\xa2\xd7\x45\x31\x91\x8a\x7c\ \xd6\xb1\x7e\xb6\x69\x5a\x1a\x48\x1c\x01\x0e\xbf\x0f\xd7\xbe\x35\ \xa8\x5a\xba\x02\x9e\xe9\xcb\x00\x96\x1f\x0a\xce\xbe\xda\xf3\x38\ \x4e\x00\x3e\xaf\x00\x42\x4c\x70\xdd\x22\x33\x69\x79\x44\xd9\x87\ \xe7\xe5\xbd\x80\x50\xfe\xb3\xed\x6b\x79\x11\x0e\xbc\x09\xac\xbd\ \x13\x7a\x66\x16\x52\x43\x02\xe9\x61\x01\x35\x29\x98\xa1\x62\x49\ \x25\x04\x28\x7c\x38\xce\x8b\xcc\x6c\x31\x61\x8e\x91\x38\x2f\x15\ \x5a\x93\x08\x13\x27\xf2\xe9\x31\xe4\xec\x93\xd5\x30\x12\x5e\xa4\ \x8f\x9a\xe4\xf3\xb7\x42\xc0\x5f\x81\x1c\x20\x0a\xc9\xd8\x84\x4a\ \x92\x71\x1e\x97\x0a\x25\x5e\x46\x9c\x42\xf1\x6c\xf2\xf6\x44\x31\ \xdd\x2c\xaf\xd6\x23\xc3\xb2\xcf\x2d\x40\xa1\xdb\x15\x78\x41\xb1\ \xd8\x75\x1e\x17\x0f\x95\xc2\x44\x59\xc6\xc3\xe2\x83\x44\x3e\x8c\ \x02\xe3\x1a\x84\xc5\xbc\x72\x02\x40\x14\xcd\xe8\x36\x81\xe3\x4d\ \x88\x45\xae\x17\x92\x2d\x1c\x1f\x1b\x70\x90\x77\x98\xa1\x43\xa0\ \xd2\x02\x08\x41\x30\x8e\x3d\xa3\x17\x86\x4a\xf9\x24\xc8\x8f\x31\ \x29\xc6\x4b\x90\x27\x13\xa6\x07\x4c\x9c\xb7\x0a\x09\xe0\x24\x5b\ \xbe\xd4\x95\x5f\x03\x94\xff\xac\x42\x0f\x8b\xf5\x03\xa9\x51\x94\ \x34\x43\xb7\x89\x57\x38\x04\x2c\x18\x05\x0f\x57\x9e\x4c\x91\x6b\ \x28\xa8\x26\xc5\x45\x8d\x1d\x2e\x4f\x1e\xc8\x2f\x93\xe1\x14\xa0\ \x12\x65\xd0\x41\xb6\x10\x45\x32\x36\x6c\xa2\xb9\x7e\x10\x98\x75\ \x0e\x6e\x9d\x13\x60\xf7\x4d\x9a\x10\xcb\xcf\xbc\x33\x09\x02\x36\ \x44\x25\x04\x40\xc9\x44\x35\xb9\x10\xb0\x88\xb1\x63\x24\x6e\xc2\ \x3e\xb6\xbf\x27\x6a\xce\xfc\x08\x8e\xd5\x04\xd7\x2d\xe2\x16\x2a\ \xe4\x01\x65\x56\x7a\x0e\x22\xc5\x88\x95\x12\xc3\xea\x73\x0a\x87\ \x58\x5f\x01\xf9\xb2\x66\x38\xca\x60\x25\x05\x28\x1f\xdb\x4e\x21\ \x9c\x64\x0a\x3d\xc2\x26\x6e\x0b\x64\x58\xe0\x40\x9c\xc8\x67\x88\ \xbc\x54\xe4\x7d\xb5\x74\x15\x70\xa0\xd2\x2b\xc1\x82\x38\xb7\x60\ \x93\x13\xff\xdb\x0b\x2c\x62\xc2\xe1\xe6\x36\x59\x82\xe3\x38\x7e\ \x88\xc8\x0f\x03\xb2\x35\x54\x58\xe0\x28\x67\xf6\x3a\xc0\xf6\x82\ \x0a\xaf\x04\x3d\x55\x40\xfd\x09\xf9\xa7\xd1\xd3\x40\x26\x0c\x24\ \x8f\x02\x5a\xd2\x99\xe8\xec\x58\x2e\x14\x88\x39\x12\xa3\x53\xa8\ \x78\x6f\x9e\xbc\x64\x3d\x3d\xb3\x45\xb0\xfd\xba\x74\x15\xb0\xcb\ \x60\xe5\xd6\x01\xb6\x08\xfe\x29\xc0\xdc\x4b\xe1\x34\x91\x17\x61\ \x6c\x2f\x10\xfa\x28\xe7\xbe\x85\xee\x4f\x10\x13\xfa\x84\xc3\xe5\ \xf3\x6d\xe2\x90\x93\xbc\x4d\xd6\xd9\xf2\x12\xcc\xac\x24\x58\xe9\ \x75\x80\x23\xbb\x17\x1a\x03\x82\x2d\x79\xb4\x5f\x98\x17\xe0\xe0\ \x6b\xc0\x48\xa7\x33\x1c\x18\x01\x36\x79\xb3\xb5\xc9\x9b\x33\x7f\ \xd4\x72\xfb\x32\x02\xc0\x1e\x53\x72\x1d\x20\x08\x15\x4d\x82\xb0\ \x50\xce\x6a\x3a\x80\xd3\x6e\x05\xce\xb8\x17\xa8\x9e\x3e\x21\xce\ \xed\x7c\x60\x9f\x5b\xe4\xb3\x16\x79\x09\xd4\x5a\x90\xca\x80\xa1\ \xf8\xcb\x90\xa8\x64\x15\xc0\x24\x19\xdf\x50\xca\xaf\x32\xea\xe7\ \x01\xe7\x2c\x07\x3a\x2e\x73\x84\x84\x0d\x93\xfc\x41\x22\x1f\xb2\ \x49\x95\x03\x2b\x2d\x82\x30\xf4\xca\x57\x01\x22\x6a\x27\xaa\x48\ \x0f\xb0\xee\x6e\x40\xe8\xf9\x73\x6f\x35\x10\x6c\x26\xb2\x27\x02\ \xd3\x96\xd1\x79\x7d\xc1\x76\x22\x4e\xba\x01\xa8\x9b\x03\xec\x5c\ \x09\x18\x9a\x95\x00\x09\x89\x03\x80\x62\x91\x17\x93\x00\x8e\x44\ \x68\x1b\xb7\xa7\xad\x20\x1c\xb8\xe6\x8c\x16\x51\xe9\x32\x88\x89\ \xe5\x4f\x07\xb2\x61\xc2\x30\x30\xba\x1d\xe8\x79\x16\x68\x5c\x04\ \xcc\xfe\x33\xa0\xba\x1d\x0e\x6b\x39\x17\xf0\x90\x58\x9d\x14\x16\ \x9a\x0a\x24\x7b\xec\x99\x17\x25\x92\x9c\x70\x10\x76\x92\x66\x13\ \x20\x9c\x1e\x90\xfb\x55\xb1\x10\x60\x02\xce\x9a\x3f\x59\x19\xb3\ \xb6\xba\x47\xb6\x00\x9b\x7f\x00\x7c\xb2\x8a\xba\xb2\x70\xd8\x94\ \xc5\xc0\x92\xfb\x81\x74\x9f\x49\xbe\x78\xcc\xdb\xfd\xc7\x17\x1a\ \xa6\xd9\x65\x90\x50\xa9\x24\x08\x51\x58\xd7\x6d\xf2\x85\xab\x3e\ \x53\x88\x81\x35\x24\xc4\x1d\x40\x6a\x10\x0e\x6b\x3a\x13\x38\xf5\ \xfb\x05\x64\xcb\x82\x4d\x1a\xff\xce\x7e\xf6\x3b\x5d\x09\x5a\x04\ \xfd\x8d\x40\xfb\x05\x80\xbb\x2a\x17\x6f\x48\x0f\x01\xf1\x83\xc0\ \x78\x17\x60\xa8\x13\x44\xa0\x36\x75\x18\xd8\x4a\x22\x2c\x79\x10\ \xa8\x99\x8b\x4f\x6d\xfe\xdf\x00\xa3\x1f\x00\x87\x9e\x01\x50\x26\ \xfe\x51\xc2\xf5\x25\x47\x9e\xc8\x83\xeb\xf6\xed\xa2\x32\xeb\x00\ \xe7\xcc\xfb\xea\x80\xd6\xb3\x60\xdb\x52\x02\xf2\x2b\xc1\xa1\x77\ \x80\xbe\xd5\x74\x1c\xb1\x17\x3b\x5a\x14\xd8\x7e\x17\x89\xf0\xcf\ \x4e\x11\xce\x7c\x04\x18\x79\xd7\xac\xfd\xc5\xe3\x9f\x17\xf5\x4f\ \x27\x69\xc9\x3e\x17\x10\x16\xf1\x8a\x87\x80\xed\xee\x93\x9a\x3b\ \x08\xb4\x5f\x05\x9c\xf5\x53\xa0\x71\xa9\xf3\xe5\x66\x7c\x2b\xb0\ \xfe\x72\x40\x8b\xd9\xe3\x3d\x0d\xa4\xdd\x4f\xca\xd7\x7c\x66\xb7\ \x36\x8a\x84\x06\x9b\xc4\xa1\x2a\x23\x80\x73\x25\x58\xd2\x3c\xf5\ \xc0\xe2\xfb\x80\xb6\x2b\xf2\x5e\x90\xd8\x07\x28\x47\x80\x54\x0f\ \xb0\xfd\x56\x38\xac\xfd\x5a\xa0\xe1\xb4\xcf\x50\xfb\x4b\xc2\xb1\ \x12\x14\xa2\x62\x02\x70\x0b\x02\x50\x62\x40\x78\x17\x30\xb2\x0d\ \x48\x0e\x4e\xf2\x2d\x0c\x98\xfb\x5d\xa0\xf1\x4c\x20\x3b\x68\x3f\ \x78\xff\x53\x74\xcf\x3b\x13\x86\x51\xe7\x29\xf7\x1d\x67\x22\x2c\ \x71\xcc\x9c\xc4\x05\x2a\x97\x03\xec\xfa\x3f\xbe\x17\xd8\x70\x1b\ \x00\xdd\x0a\x09\xeb\x05\xa9\xe3\x4a\x60\xc6\xc5\xce\xa5\xd9\xc2\ \x1f\x11\xe1\xdf\x02\x91\x4e\xfb\x41\x77\xdf\x05\x5c\xb8\xd5\x1e\ \xd7\x4a\x61\x13\x6c\x03\x92\xfd\xce\xd8\x67\x36\x0a\x63\xbd\x04\ \x80\xcf\xb6\x27\xf8\xe0\x7d\x37\x2d\xdc\xf2\xf6\x4f\xa5\xd2\x55\ \x80\xc0\x55\xe7\x92\x18\x84\x4c\x08\xd8\xfb\x18\xb0\xfd\x87\x80\ \x91\x99\xf0\xc9\x6e\xe0\x0b\xbf\x06\x5c\x2e\x7b\x16\xe3\xdb\x80\ \xd1\x89\x5e\x20\x03\xed\xdf\x2c\x3b\xf3\x4e\x14\xef\x17\xec\x33\ \xe6\x80\xb7\x37\xf7\xae\x7e\x6b\xc3\xbe\x5f\x90\x08\xac\x68\x0e\ \x28\xdc\xf3\x73\x2e\x90\xc6\x3a\x81\x0f\x6f\xb4\xfa\x2c\xab\x9e\ \x0f\xb4\x5d\xe7\x8c\xe3\xfe\x5f\xc2\x61\xd3\xaf\x2e\x41\xba\x4c\ \xdc\xa3\xe0\xdc\x0e\x83\xe3\xc9\x01\xe3\x8a\x9e\xed\xdc\x35\x38\ \x7f\xc7\xee\xc1\x7f\x25\x11\x4a\x6f\x89\x81\x3b\x84\xb0\x77\x6f\ \xf7\x00\x87\x9f\x03\xf6\xac\x84\xc3\xe6\xdd\xe5\x24\x37\xba\x06\ \x30\xd2\xf6\xf5\xda\xc5\x80\x7f\x6a\x01\xe9\xe3\x24\x6e\x0b\x20\ \x3e\x83\x07\x24\x33\x19\x43\x81\xfb\xce\xd7\xdf\xec\xba\xe6\x50\ \xff\xd8\x43\xc5\xdf\x06\x09\x81\x16\xe0\x8c\x1f\x03\x17\x3d\x4f\ \xed\x0a\x20\x38\x33\x4f\x3e\x3d\x80\x9c\xed\xa5\x9a\xaf\xc5\x27\ \x78\xc1\xc9\x40\xcd\x7c\x9b\x94\x20\xf2\xd1\x0f\x9d\x49\x73\xca\ \xd9\x85\xa4\x51\x36\xde\x0b\xc9\x33\x27\x71\x21\xb9\xe5\x63\x12\ \x20\x95\xc9\x1a\x29\xdd\xc8\x8e\x45\x92\xb7\x3c\xbb\x7a\xeb\x3d\ \x6b\x5f\x78\xf0\x9e\xc2\x3f\x8d\xf1\x7c\xe6\x5e\x72\x27\x50\x6f\ \x12\x72\x01\x75\xd4\x9e\xbe\xc2\x76\x7b\x86\xfc\xe2\xe7\xc8\xab\ \x70\xd8\xd4\x8b\x9d\x33\x1b\xdb\x0c\x87\xd5\x2e\x3a\x0e\xa2\x65\ \x44\x80\x05\xfa\xb5\xcb\x77\xfa\x2f\x96\x3f\x70\xeb\xeb\x8f\x3d\ \xfc\xc3\xef\xfc\xec\x27\xf7\x4e\x2f\x5a\x05\x32\x8a\xa2\x27\xd2\ \x19\xff\xf6\x4d\x9b\x5e\x5a\xba\x74\xe9\x6b\xcf\xbc\xbc\xf9\xa1\ \x0f\xff\x7b\xe5\xc8\xd9\x97\xfc\xc3\x2a\x47\x12\xac\x99\x0d\x54\ \xb5\xc0\x61\xee\x1a\xe0\xe4\xef\x01\xdb\xbf\x6f\xf7\x8d\x6e\x00\ \x3a\xbe\x39\xc1\x0b\x4e\x71\xba\x77\x66\x1f\x1c\x56\x75\xc2\xf1\ \x91\x47\x89\xbe\x09\x25\x70\xe3\xa6\x2e\xcf\x86\xa1\xfd\x97\x37\ \xd4\xd7\x5e\x3e\x73\x66\x8b\xf8\xea\xd5\x57\xec\x9a\x36\x6d\xda\ \x7b\x55\x55\x35\xeb\x33\x59\xf5\x83\x7f\x7b\xe4\xe7\xa3\x39\x01\ \x14\x4d\xe3\x14\x06\x7e\x90\x71\xce\xff\x76\x67\x77\xff\xb9\x2f\ \xbd\xb1\xed\x71\xca\x07\xc3\x38\xfc\xa4\x2d\x80\x96\x29\xb2\xf9\ \x71\x0a\x1c\x96\x19\x80\xc3\x7c\xcd\xce\x87\x56\x87\xe0\x30\x6f\ \x4b\x59\x82\xe5\xc9\x3b\x63\x9f\x83\x61\x6a\x9d\xf7\xad\xda\x54\ \xed\x02\x26\xb9\x5a\x87\x47\xa2\x6c\x6c\x3c\xb9\xa8\xb7\x6f\x68\ \x91\x2c\xcb\xb7\xa9\xaa\xca\xe7\xcc\x99\x73\x7b\x4e\x00\x5d\xd7\ \x59\x3a\x9b\x0d\x80\x6c\xc7\x8e\x1d\x83\x0b\x16\x2c\xf8\xbb\x35\ \x6f\xef\x7c\xba\x65\x5a\xed\x73\x27\x9d\x30\x53\x0e\x72\xc3\xda\ \xc1\xe9\x07\xd2\x47\x81\x40\x33\x1c\x96\x3c\x0c\xe7\x02\x5c\x86\ \xc3\x5c\xb5\xce\x35\xbf\x91\x82\xc3\xe4\x2a\x1c\x97\xb1\xc9\xfb\ \x46\xb2\x3e\xbc\x1f\xa9\xc3\xc1\x4c\x2d\x0e\x67\x6b\x30\x1e\x4b\ \x5f\xa4\xeb\x49\xc4\x62\x31\x28\xe4\xe5\x84\x7d\xc4\xb5\x95\x73\ \x5e\x6f\xf9\xe2\x2c\xf3\x17\xb8\x10\x8c\xf2\x40\x10\x96\x75\x77\ \x77\x3f\x63\x18\xc6\xd3\xff\xf9\xf4\xba\xc0\x6b\x91\xb9\x72\x5a\ \x78\x00\x6e\xfd\xe3\xc8\xf5\xb7\xe5\x57\x83\xb0\x2c\x3b\x0a\xec\ \x7c\xc8\x49\xb0\xaa\x03\x0e\xd3\xe3\x70\xee\xef\x7b\x50\x60\xf6\ \xfd\xc7\x65\xe3\x59\x37\x7e\xb5\xb7\x19\xd7\xbf\xbd\x00\xcb\xfb\ \xcf\xc5\x7b\xb1\x99\xd8\xdc\xaf\xe0\xc0\xde\x2e\xd4\x25\xba\x51\ \xa7\xf4\x3f\x5a\x53\x53\x73\xe1\xca\x95\x2b\x67\x90\x00\x4b\x67\ \xcf\x9e\xdd\x23\x49\x12\xac\x6f\x7a\xcb\x05\xb2\x80\xcf\xd3\x94\ \x55\x95\x46\x4c\x30\x12\xe0\x26\x55\x35\x4e\x5e\xfe\xd8\xda\xd3\ \x3c\xb7\x5c\x86\xcb\x9b\xfa\xe0\x33\x5f\x7b\x93\x7d\x24\xf5\x26\ \x60\xee\xd7\xf3\x1a\xf6\x3c\x01\xa8\x24\x82\x3c\xe1\xe1\x5b\x2e\ \x83\xc3\x52\xbd\x36\x79\x46\x90\xeb\xe1\x30\x6d\x1c\x10\xc7\x21\ \x82\x99\xe0\x46\xaa\xf0\xec\xee\xa9\xd8\x12\x9e\x06\x4d\xd7\x10\ \x8f\x8f\x43\x44\xdf\xc3\xe5\x73\x0d\xcc\x59\xe4\xc3\x89\xb3\xda\ \xe0\xad\x6d\xa6\x3c\x7d\x41\x5f\xfb\x95\xf7\x0c\x03\x10\x0f\x3f\ \xfc\x30\x23\x5b\x2c\x44\x2e\x6b\x5f\x4d\x78\xc3\x75\xcf\xdf\x5f\ \x83\xc7\xd6\xee\x6c\x4a\xa6\xd5\x16\xcb\x2d\x38\x01\x07\x0f\x1e\ \x4c\xb7\xb5\xb5\x7d\x25\x1a\x49\x6c\x5d\xf1\xcb\xdf\x36\xc9\x37\ \x7e\x11\x97\x64\x87\xe0\x96\x00\x16\xeb\x07\xdb\xfe\x2f\x80\x79\ \x2c\xe3\xd3\xed\x6c\xc6\xac\x87\xdf\xf9\x03\xe0\xc0\xa3\x66\xc9\ \xcc\x23\xfc\x2e\xc0\x27\xb8\xaf\x6f\x0e\x1c\xa6\x5a\x02\x38\x45\ \x98\xb4\x6f\xf3\x60\x10\xab\xb6\x35\x63\xd3\x61\x2f\xa2\xd1\x08\ \x62\x91\x8f\xf1\xa5\x39\x0a\x7e\x74\x9e\x84\xf3\x17\xce\x04\xab\ \x9b\x87\x3d\x83\x40\x64\xe8\x10\xa2\x07\x3b\x11\xee\xdd\x79\xf0\ \x9d\x70\xf3\x01\x00\x7c\xc5\x8a\x15\xcb\xc8\x1b\x3c\x24\xc0\xeb\ \x00\x72\xa5\xca\xd5\xd8\x58\x23\x65\x15\xad\xdf\xd0\x35\x0e\xa0\ \x86\x90\x26\x68\x04\x31\xbb\xbf\xff\x70\xf4\x84\xa6\xeb\x87\x8e\ \x8c\xac\x59\xf1\xe4\x26\x96\xb9\xfa\x6a\x9c\x6f\xbc\x08\x8f\xac\ \x41\x96\xcd\x4a\x48\xa0\x56\xa6\x96\x59\xe7\x8c\x13\xc2\x5d\x60\ \x11\x82\x9c\xaf\x9c\x29\x5d\xc6\xa1\xb1\x00\x8e\xc4\x3c\x18\x8a\ \x7a\x10\x7a\xf5\xbf\x10\xd3\xd7\x21\xcd\xa6\x23\x65\xd4\x01\x24\ \x6c\x2d\xef\x40\x8d\xcf\xc0\xd4\x6a\x0d\x73\x9b\x32\x58\x36\x23\ \x85\x29\x7e\x1d\xa6\x0d\x27\xdc\xd8\x70\xb0\x1a\x2f\x75\x4d\xc1\ \xc7\x83\x12\xc2\xe1\x30\x22\xe3\xe3\xf8\x8b\xa5\xc0\x03\x37\x07\ \x70\xe2\xbc\x2f\xe4\x12\xb1\x88\x1d\x81\x31\xb4\x1d\x91\x7d\x31\ \xa4\x14\x91\x4f\x37\x6e\xb7\x35\x45\x60\x2d\x2d\x2d\x17\x9b\xf9\ \x80\xec\x79\x58\xe6\xba\xfd\xde\x55\x1c\x5e\xff\x12\xa8\x59\x93\ \xfc\x14\x42\x15\x21\x46\xc8\x10\xf8\x99\xd3\x47\xd7\x6d\x3c\x5c\ \xf7\x60\x6f\xdf\x91\xfb\x1f\x7e\x49\x42\xf4\x4f\xaf\xc2\x32\x75\ \x35\x3c\x2e\x1d\x2e\x57\x9e\xbc\xcb\x12\x81\x13\xdb\x50\xda\x8b\ \xc1\xb8\x17\xfd\x51\x1f\x8e\x24\x83\xd8\x3f\xec\x42\x6f\x48\x43\ \x3a\x93\x45\x36\x9b\x85\xaa\x66\x20\x44\x1a\x3e\x5f\x06\x81\xc0\ \x28\x82\xf2\x18\x3c\x48\x23\x6f\x12\x09\xe4\x42\x46\xf7\xc0\xef\ \xaf\xc7\xec\x66\x2f\x3d\x5a\x35\x14\xe1\x43\x86\xee\x1f\x0a\x8d\ \x20\x3c\x36\x86\xa0\x17\x78\xed\x8e\x7a\x5c\xf2\x27\xe7\x03\xb5\ \x27\x43\x28\x29\x18\x07\xd7\xe6\x04\x10\x06\xc0\x49\x79\xc1\x04\ \x84\xe0\x74\xec\xca\x15\x5f\xf3\xbb\xeb\xeb\xeb\xaf\xef\xeb\xeb\ \xcb\x80\x6e\x77\xbe\x0d\x2a\xf4\xe9\x00\xb7\x50\x47\xf0\x13\xa2\ \x9b\x81\x44\xbb\x0e\x76\x61\x7b\xf4\xb9\xf7\x0e\xd7\xce\x3e\xd4\ \x37\xf0\x97\x4f\xbc\xc9\xb0\xff\xa4\xf3\x35\x79\x74\x4b\xca\x60\ \xae\xa0\xaf\xaa\xc6\xe5\xae\x9e\x82\x81\xa8\x84\x81\x31\x8e\x68\ \x3c\x8d\x54\x2a\x83\x44\x32\x8d\x80\x34\x88\x93\x5a\x75\x5c\xbb\ \x54\xc2\xbc\x19\x40\x5b\xb3\x84\xf6\xd6\x20\x9a\xbf\xf4\x22\x24\ \x33\x51\xba\x48\xf3\x9d\x37\x83\x99\x9b\x26\xba\x02\x28\x49\x30\ \x35\x85\xa7\xd6\xeb\xb8\xf1\x3f\x52\x18\x19\xe1\x85\xc9\x9e\x01\ \xab\x6f\x0b\xe0\xbc\x2b\xbe\x05\xe1\x69\x82\x48\x0e\x43\xdb\xf7\ \x12\x90\x49\x12\x61\x19\x0c\xc8\x91\xe7\xd6\x96\x92\x90\x68\xa6\ \x00\xf6\xca\x2b\xaf\xdc\x10\x08\x04\x66\x47\xa3\xd1\x55\x20\x5e\ \xc5\x0a\x8a\x8b\x10\x24\x34\x10\xbc\x84\x64\x73\x10\x89\xf3\xe7\ \x81\x35\x04\x51\xfb\x9b\xfd\x0d\x77\x29\xdc\xfd\xdd\xd6\xd6\x56\ \xf4\xf7\xf7\xa1\x2a\xe0\x05\x37\x34\x84\x86\x23\x30\x0c\x8e\x69\ \xb5\x14\x87\xf3\x25\x9c\x3b\x8f\xe1\x82\xa5\x4d\x68\x9f\x3d\x8b\ \x2a\x5c\x13\x98\xbf\x01\xcc\x5b\x0b\xe6\x0e\x82\x41\x03\xb8\x92\ \x03\x33\xb2\x10\x6a\x14\x2c\x3d\x08\xa4\x87\x73\xdb\xec\x4c\xcb\ \xe2\xd0\x51\x81\xb3\x97\xd7\x62\x24\x1c\x01\x59\x6e\xc6\x3b\x1a\ \x25\xec\x09\x01\xa7\xb5\x09\x7c\xf0\xb3\x0b\x20\xd1\xeb\x37\x4f\ \x47\xa0\xed\x79\x06\x22\x9b\xb4\x37\xaa\x75\x81\x4d\x07\x38\x14\ \x8d\x83\x09\xae\x27\x1b\x16\x2f\x7c\xba\xa7\x4e\x27\xf2\x5b\x3e\ \xfa\xe8\x23\xcf\xc0\xc0\xc0\xa9\x00\x7a\x8b\xed\x07\xe8\x84\x38\ \x41\xb5\x44\xa8\x1d\x4e\x22\xf0\x7a\x17\xa2\x27\x35\x23\x7c\xde\ \xac\xc8\x9d\xef\xf6\x35\xb3\xde\xde\xde\x9b\xcd\x58\x22\x6f\xb4\ \x66\x85\xe1\x9c\x39\xae\xc8\xbd\x5f\x9f\xe5\x9f\xb5\xe8\x42\x6f\ \xb0\x75\x21\x73\xfb\x82\x48\x0b\x05\xc4\x90\xa0\x10\x31\x82\xaa\ \xd0\x61\x14\x3c\xd9\x9f\xdb\x2c\x91\x94\x10\x24\x3d\x01\x99\x09\ \xc8\x42\x40\x12\x66\xcb\xd0\x3d\x5c\x0d\x0e\x39\x37\xdb\x37\x9e\ \x03\x7c\xeb\x6c\x50\x68\x00\x7f\xfd\x42\x2d\x66\x34\x24\x10\x97\ \xdb\xe0\x4a\x2b\x48\xed\x5a\x0d\x91\xce\xd0\x7d\x66\xfc\x09\x08\ \x9d\x23\x95\x11\x54\x1a\x01\xb3\x27\x65\xf8\x1e\x79\x64\x7d\xba\ \xba\x75\x7a\xfd\xbf\xf7\xf4\xf4\xd4\x11\xf9\x1b\x4c\xf2\xe5\x36\ \x44\xb8\x15\xff\x23\x04\x45\x00\x8d\x29\x15\x53\x3b\xfb\x11\xdb\ \xd6\x2f\xc6\x5b\x1b\x95\xef\x69\x9a\x36\x04\xe0\xdb\x84\x36\x02\ \xbc\x6e\xb9\x77\xd9\x89\x35\xf7\xb6\x5f\xf9\xe8\x75\x35\x53\x5a\ \xda\x54\x25\x2d\xa5\x33\x09\xb7\xa6\xa6\x5d\x4a\x72\x14\xa3\xfd\ \xbd\x99\x70\xff\xc7\x6e\x23\xbe\xbf\x5a\x36\xe2\xbe\x80\x57\x54\ \x79\x3d\xc2\x13\xf0\x08\x29\xe0\x61\xb9\xca\xe2\x22\xb8\x19\xc0\ \x0d\xe0\xdd\x81\x39\x48\x24\xba\x30\xb3\x1e\x5b\x82\x6e\xec\x79\ \x6d\x07\x6a\x3d\x2e\x51\x27\x04\x3f\xef\x70\x18\xfa\xc7\x3d\x11\ \xc9\x88\xbf\x2a\xf3\x78\x04\x01\xb7\xcc\x3c\x4c\x80\x71\x01\x45\ \x15\x62\xdf\x30\xd4\xa3\x09\x36\x7a\x28\xea\xde\xf8\xe1\xa0\xdf\ \x35\xeb\xc4\xa6\xd5\x54\xd1\x9a\xf7\xee\xdd\x7b\x37\x80\x5f\x1d\ \xeb\x8e\x90\xb0\xbc\x60\xdc\x6a\x1b\x09\x0d\x02\x08\x1c\x09\x8f\ \x87\x01\xac\x90\x65\xf9\x9f\x7c\x3e\xdf\xf6\x54\x2a\xb5\xd0\xe3\ \xf5\xbe\xdc\x71\xfa\xd5\xef\xcf\x3e\xe5\xec\xaf\x09\x2e\x06\x0c\ \x43\x53\xe2\x91\x70\xf7\xde\x1d\x1b\x77\x6f\xfc\xcd\x93\xa3\xaa\ \x9a\xf6\x41\x57\x7d\x86\x11\x0c\x08\xdd\x5b\x25\xb8\x56\x45\xa1\ \x13\x64\x42\xaf\x97\x99\xde\xe0\x96\x8c\xda\x6a\x9f\x41\x2d\x0f\ \xc6\xa4\x99\xf3\x3b\xfb\xa4\x2a\x55\x51\xe2\x0b\xe6\xe0\x0e\x83\ \x23\xab\xab\xf0\x65\x54\xe1\xf3\xbb\xb8\xa7\xfb\x88\xb1\x64\xcd\ \x3b\x9d\xcf\xca\x2e\xd6\x00\x78\x83\x0c\xc2\xc7\x60\xb8\x05\x87\ \x94\x48\xc3\x08\xa7\xb8\x72\x24\x2a\xbc\x9a\x67\xda\x17\x3b\xe6\ \xcc\x98\xd1\xd5\xd5\x95\x08\x85\x42\xf7\x00\x78\xf4\xb3\x6c\x89\ \x19\x84\x84\x25\xc2\x14\x0b\x33\x08\x11\xc3\x30\xc6\x1a\x1a\x1a\ \xb6\x64\x32\x99\x85\xfe\x40\x70\xd7\x57\x6e\xbc\x77\x9a\xcb\xed\ \x35\xb3\xed\xfb\x5d\xbb\xf7\xbc\xb1\xa3\x73\x6b\x94\x43\x97\x1a\ \x4f\xfa\x32\xe3\x5c\x65\xa4\x89\xc4\xf5\x2c\x33\xd4\xb4\xa4\x2b\ \x29\x49\x57\x93\x32\x65\x6f\x59\xa3\x96\x67\x53\xee\x31\x2d\xed\ \x19\x1c\x63\x0b\xdd\xcd\xcb\x1e\xdd\xd9\xf5\x3a\x24\x86\x07\x3b\ \xa6\x62\x9b\x00\x1d\x6a\x90\xb8\x4c\xe9\xc4\xa5\xde\x3e\x2c\xd8\ \x5b\x4f\xae\x1f\x9b\x75\xe1\xb2\x59\xcf\xb7\x34\xf8\xd3\xe3\xb1\ \xd4\xb4\xd1\x68\xfa\x84\x70\x4c\x9f\x6f\x48\xfe\x99\x9e\x40\x5d\ \xa3\xab\xc6\x1f\x8c\x86\xc3\xea\xce\xee\xf7\x5e\xd6\x75\x7d\x39\ \x80\x5d\x04\xed\xf3\xfc\xaf\x31\x66\x89\x55\x4b\x98\x6a\x95\xca\ \x24\xd5\xd5\x9b\xa8\x26\xdf\xd6\xdc\xdc\xfc\x0d\x7a\x87\x50\xd2\ \xe9\x74\xe2\x8d\x37\xde\xd8\x3d\xc9\x96\x86\x80\x05\xd3\x98\x10\ \x9c\xc3\xe0\x42\x37\xe8\x48\xe5\x86\x9a\x11\xdb\xb6\xed\xa8\x86\ \xb7\x7a\xed\xde\xbd\x9f\xcc\xeb\xec\xec\xdc\x0e\xe0\x4c\x82\xfe\ \x8f\x00\xd6\x2d\x06\x4b\x8d\x83\x45\x63\x90\x7b\x13\xec\x2c\xba\ \xf3\x79\xb7\xdb\xdd\xec\xf5\x7a\x55\x6a\x99\xcb\xe5\x72\x93\x81\ \xc8\x1a\xf1\x78\x7c\xbf\xa2\x28\x6b\x01\xfc\x5a\x08\xd1\x5d\x40\ \xbc\x9c\x07\x94\x08\x09\x8d\x10\x21\x28\x84\x26\xc2\x14\x55\x55\ \xe3\xe6\xba\x9a\xda\xa6\x97\xc9\xc8\x2b\x38\x00\x97\x53\x00\xe7\ \x9f\x3d\x18\x63\x1c\x8c\x41\xa2\x1f\x78\xdc\x02\xf0\xf1\x77\x37\ \x7c\xd4\xee\xf7\x57\x3d\x91\x88\xc6\xe6\x6d\xdb\xb6\x6d\x14\xc0\ \x35\xd6\x78\x99\x04\x90\xf0\x31\x64\xab\x2a\xd5\xe4\x77\x54\x70\ \x0b\xe5\xa1\xb3\x08\xb5\xd6\x73\x85\x09\xfb\x09\xa6\x70\x7d\xd6\ \x62\x4e\x54\x66\x57\xb8\x30\x24\x92\xd6\x97\x66\x69\xc6\x37\x92\ \x00\x4a\x22\x91\x38\xe3\xc0\x81\x03\xaf\x51\x79\xe4\x74\x2e\x13\ \x49\x13\x92\x55\x21\x72\xe4\xf3\x13\x2f\x0c\xab\x95\x48\x2c\xb1\ \x6e\xdd\xba\x36\xba\x7e\x3d\x2d\x4f\xbf\x73\xe8\xd0\x21\xff\xa6\ \x4d\x9b\xc6\xe9\xda\x5f\x01\xc8\x12\xda\x26\x7c\xa7\x36\xc1\x0b\ \x93\x84\xdd\x84\x4e\x42\x8a\x90\xb1\x26\x45\x2f\x47\xba\x74\x08\ \x1c\xff\x7d\x32\x21\xe0\xf1\x78\xbe\x4d\x1e\xb0\x9c\xc2\x60\xe5\ \xa9\xa7\x9e\xba\x9e\x92\xa3\x9b\x5c\x93\x51\x82\xe4\xe4\x9a\x3a\ \x09\xa2\x72\xce\x0d\x1a\x23\x28\x5f\xc8\xe3\xe3\xe3\x33\xfc\x7e\ \xff\x29\x34\xe6\x22\x6a\x97\x51\x82\x62\x94\xa1\x0d\xea\xff\x10\ \xc0\x2a\xc2\x51\x8b\x50\xc2\x2a\xc9\xb1\x1c\x51\x27\x41\x6e\x41\ \xe0\x73\x1a\xab\xc0\xfd\x26\xae\x63\x8c\x3d\x4c\xa4\x6a\xab\xaa\ \xaa\x86\x89\x58\x8a\xda\x0c\x09\x20\x3c\x79\xf3\xd1\xf5\x06\x42\ \x8d\x39\xfb\xe4\x39\x88\x44\x22\xc6\xd0\xd0\x50\x2f\x79\xc2\x06\ \x6b\x69\x3a\x60\x11\x4d\x12\xd2\x96\x08\x9a\x4d\xf6\x77\x63\x0c\ \x95\xb3\x2a\xc2\x97\x09\xa7\x13\xda\x2c\xc2\x75\x04\x37\xe7\x5c\ \xb2\x5e\x41\x23\x84\x83\x84\x6e\xc2\xfb\x84\x7e\x6b\xa6\x8d\x72\ \x7f\xd6\xfb\x03\x10\xa0\xf0\xf3\x1c\xff\x0a\xc0\xf9\x17\x56\x81\ \xdf\x13\xfb\x1f\x84\xaf\xe2\x02\x22\xe6\xe9\x93\x00\x00\x00\x00\ \x49\x45\x4e\x44\xae\x42\x60\x82\ " qt_resource_name = b"\ \x00\x10\ \x0f\xad\xca\x47\ \x00\x68\ \x00\x65\x00\x6c\x00\x70\x00\x2d\x00\x62\x00\x72\x00\x6f\x00\x77\x00\x73\x00\x65\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0a\ \x08\x99\x64\x87\ \x00\x6b\ \x00\x63\x00\x68\x00\x61\x00\x72\x00\x74\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0b\ \x01\xad\xab\x47\ \x00\x64\ \x00\x69\x00\x67\x00\x69\x00\x6b\x00\x61\x00\x6d\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x1a\ \x08\xdd\xe1\xa7\ \x00\x61\ \x00\x63\x00\x63\x00\x65\x00\x73\x00\x73\x00\x6f\x00\x72\x00\x69\x00\x65\x00\x73\x00\x2d\x00\x64\x00\x69\x00\x63\x00\x74\x00\x69\ \x00\x6f\x00\x6e\x00\x61\x00\x72\x00\x79\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x07\ \x0e\x95\x57\x87\ \x00\x6b\ \x00\x33\x00\x62\x00\x2e\x00\x70\x00\x6e\x00\x67\ \x00\x0d\ \x0b\x34\x2d\xe7\ \x00\x61\ \x00\x6b\x00\x72\x00\x65\x00\x67\x00\x61\x00\x74\x00\x6f\x00\x72\x00\x2e\x00\x70\x00\x6e\x00\x67\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x06\x00\x00\x00\x01\ \x00\x00\x00\x40\x00\x00\x00\x00\x00\x01\x00\x00\x2e\x67\ \x00\x00\x00\x26\x00\x00\x00\x00\x00\x01\x00\x00\x1b\x4c\ \x00\x00\x00\x5c\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x71\ \x00\x00\x00\xaa\x00\x00\x00\x00\x00\x01\x00\x00\x70\xa9\ \x00\x00\x00\x96\x00\x00\x00\x00\x00\x01\x00\x00\x50\x89\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() examples/widgets/codeeditor/000077500000000000000000000000001376617013100164705ustar00rootroot00000000000000examples/widgets/codeeditor/codeeditor.py000066400000000000000000000125411376617013100211660ustar00rootroot00000000000000############################################################################# ## ## 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) examples/widgets/codeeditor/main.py000066400000000000000000000043671376617013100200000ustar00rootroot00000000000000############################################################################# ## ## 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_()) examples/widgets/dialogs/000077500000000000000000000000001376617013100157715ustar00rootroot00000000000000examples/widgets/dialogs/classwizard/000077500000000000000000000000001376617013100203175ustar00rootroot00000000000000examples/widgets/dialogs/classwizard/classwizard.py000066400000000000000000000371011376617013100232210ustar00rootroot00000000000000# -*- 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) self.addPage(IntroPage()) self.addPage(ClassInfoPage()) self.addPage(CodeStylePage()) self.addPage(OutputFilesPage()) self.addPage(ConclusionPage()) self.setPixmap(QtWidgets.QWizard.BannerPixmap, QtGui.QPixmap(':/images/banner.png')) self.setPixmap(QtWidgets.QWizard.BackgroundPixmap, QtGui.QPixmap(':/images/background.png')) self.setWindowTitle("Class Wizard") def accept(self): className = self.field('className') baseClass = self.field('baseClass') macroName = self.field('macroName') baseInclude = self.field('baseInclude') outputDir = self.field('outputDir') header = self.field('header') implementation = self.field('implementation') block = '' 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' if self.field('includeBase'): block += '#include ' + baseInclude + '\n' block += '\n' block += 'class ' + className if baseClass: block += ' : public ' + baseClass block += '\n' block += '{\n' if self.field('qobjectMacro'): block += ' Q_OBJECT\n' block += '\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' if self.field('copyCtor'): block += ' ' + className + '(const ' + className + ' &other);\n' block += '\n' block += ' ' + className + ' &operator=' + '(const ' + className + ' &other);\n' block += '};\n' if self.field('protect'): block += '\n' block += '#endif\n' headerFile = QtCore.QFile(outputDir + '/' + header) 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 headerFile.write(QtCore.QByteArray(block.encode("utf-8"))) block = '' if self.field('comment'): block += '/*\n' block += ' ' + implementation + '\n' block += '*/\n' block += '\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())) return implementationFile.write(QtCore.QByteArray(block.encode("utf-8"))) super(ClassWizard, self).accept() class IntroPage(QtWidgets.QWizardPage): def __init__(self, parent=None): super(IntroPage, self).__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.") label.setWordWrap(True) layout = QtWidgets.QVBoxLayout() layout.addWidget(label) self.setLayout(layout) class ClassInfoPage(QtWidgets.QWizardPage): def __init__(self, parent=None): super(ClassInfoPage, self).__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')) classNameLabel = QtWidgets.QLabel("&Class name:") classNameLineEdit = QtWidgets.QLineEdit() classNameLabel.setBuddy(classNameLineEdit) baseClassLabel = QtWidgets.QLabel("B&ase class:") baseClassLineEdit = QtWidgets.QLineEdit() baseClassLabel.setBuddy(baseClassLineEdit) qobjectMacroCheckBox = QtWidgets.QCheckBox("Generate Q_OBJECT ¯o") groupBox = QtWidgets.QGroupBox("C&onstructor") 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=") defaultCtorRadioButton.setChecked(True) defaultCtorRadioButton.toggled.connect(copyCtorCheckBox.setEnabled) 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) 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 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) def initializePage(self): className = self.field('className') self.macroNameLineEdit.setText(className.upper() + "_H") baseClass = self.field('baseClass') is_baseClass = bool(baseClass) self.includeBaseCheckBox.setChecked(is_baseClass) self.includeBaseCheckBox.setEnabled(is_baseClass) self.baseIncludeLabel.setEnabled(is_baseClass) self.baseIncludeLineEdit.setEnabled(is_baseClass) if not is_baseClass: self.baseIncludeLineEdit.clear() elif QtCore.QRegularExpression('^Q[A-Z].*$').match(baseClass).hasMatch(): self.baseIncludeLineEdit.setText('<' + baseClass + '>') else: self.baseIncludeLineEdit.setText('"' + baseClass.lower() + '.h"') class OutputFilesPage(QtWidgets.QWizardPage): def __init__(self, parent=None): super(OutputFilesPage, self).__init__(parent) 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 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())) class ConclusionPage(QtWidgets.QWizardPage): def __init__(self, parent=None): super(ConclusionPage, self).__init__(parent) self.setTitle("Conclusion") self.setPixmap(QtWidgets.QWizard.WatermarkPixmap, QtGui.QPixmap(':/images/watermark2.png')) self.label = QtWidgets.QLabel() self.label.setWordWrap(True) layout = QtWidgets.QVBoxLayout() layout.addWidget(self.label) self.setLayout(layout) def initializePage(self): finishText = self.wizard().buttonText(QtWidgets.QWizard.FinishButton) finishText.replace('&', '') self.label.setText("Click %s to generate the class skeleton." % finishText) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) wizard = ClassWizard() wizard.show() sys.exit(app.exec_()) examples/widgets/dialogs/classwizard/classwizard.pyproject000066400000000000000000000001601376617013100246030ustar00rootroot00000000000000{ "files": ["classwizard.qrc", "classwizard.py", "classwizard_rc.py", "classwizard_rc.pyc"] } examples/widgets/dialogs/classwizard/classwizard.qrc000066400000000000000000000005001376617013100233470ustar00rootroot00000000000000 images/background.png images/banner.png images/logo1.png images/logo2.png images/logo3.png images/watermark1.png images/watermark2.png examples/widgets/dialogs/classwizard/classwizard_rc.py000066400000000000000000005622171376617013100237200ustar00rootroot00000000000000# 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:@\ \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\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\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 \xbfl 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\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\ 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\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\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\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\xb0ehM0\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\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\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\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~\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\xeaAX\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}.\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\x91-n\x93p\xfdL[\xd0\xb4\xc7\ \xea\x18\x0c\x96O\xeb\xf96 \xc0\x92J{\xd4\xed\x8f\ \x84\x88\xa1,\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\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}\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&\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\xa8TV\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\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\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\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\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\ \xf28~\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\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\x0aZ\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\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}\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<}\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\xc4hI\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\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\xf9\x95\xf1x<\x1a\xe5\x83\x94\x90\ NK\xe8\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\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\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\ \xb4j\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\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\x09Y5\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\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\ \xf8z5MQ]\ >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\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\ \x00\x01\xf4\x00\x00\x00K\x08\x03\x00\x00\x00\xb1\xe3\x85\xac\ \x00\x00\x00BPLTE\xd5\xd5\xff\xf6\xf7\xff\xda\xdb\ \xff\xef\xef\xff\xdf\xe0\xff\xe7\xe7\xff\xea\xea\xff\xea\xeb\xff\ \xeb\xeb\xff\xdf\xdf\xff\xf7\xf7\xff\xfa\xfb\xff\xf3\xf3\xff\xd7\ \xd7\xff\xff\xff\xff\xe6\xe7\xff\xdb\xdb\xff\xe3\xe3\xff\xd5\xd6\ \xff\xf2\xf3\xff\xee\xef\xff\xe5\xe6\xff\x96\xf6\xba\x85\x00\x00\ \x0e\xe4IDATx^\xed]\xd9\x92$7\x08\x1c\ \xa4:\x8f\xbefv\xff\xffW\x0d$\x14R\xd7N\xd8\ \x0f#Gl\x84R\x05\xd5\xf6\x9b\x9d\x83\x0e U\x1f\ \xf7\x1fE\xc7~\xdfwv\xf7\xedN\xf7m\xdf\xb7;\ \x0f\xc1.\x8e\xb6c;\x88\x87\x812-\x94\xf9\xf9\xca\ \x05\x96\xf0\ 0~\x94\x80\x8e\x1d\x9e\x84\xf5\x8d\xf9\xdf\x95m\xf1\x02\ \x12S\xde\xc1\xbcr\x9e)3\xc0\xfb\xaf\x99\xc9\x16\xd6\ \xf3\x22\x98\x95r\xc6\xfc\x98\x9d\xf4QY\x07\xedA\xbd\ \x93\x9e\xd6\xf5)\x8e\xc9\x06\xe97\x19\xcf\xf4q\xbb\x81\ \xf0\x06\xa4\xf70\x87\x17\xe3X\xdf\xc5\xf1k3\x10\xf3\ m\xd1.\xc8\x94\xd9\xd3B\xcb\x97\xc5\xfa\xfcK\x1c\xa2\ \xfc\x8f\x91\xfe\x1aeT\x94\xaf\xaf\xd7`\xd1\x9eV\x01\ \x07yZ\x11\xe97\xe6;\xdd\xf0\xdc>8\xda\xd9\xb5\ !\xbd\xc7\xfa.A.\xb1\xce\xcf\xae\xe3\xee\x91~\x90\ qN\x94e\x1cY\xc3=0\xcf\x12\xe72\x9c\xf4I\ I\x9f\x10\xe9\xc6\xbb\xd1\xbe\xca30\xe9\x80Dzz\ \x1a\xe1n\xe9y\xbb\xd9\x14\xaf\x9c7 \xbd\x83\x84m\ !\x9f\xd8\x8c\xf3=\xd6t\xe7\x1c\x91\x9e\x17:\x98\xf8\ \xaf\xe0\x9c\x1f\xb0\xee\xd3;\xc6\xc8\xcc\x0b\xe9U\xa4\xaf\ l\x03H\x1f\xd8V]\xd3\x95x~@\xba2\xfe\x94\ \x18g(\xeb\xb7\x9f&\xbdc\x87\xdb\x09;8Y\xd5\ \x85y\x00k:\x06\xf6ql\xf9\xf05=8\x9fu\ v\x8fH\x9fFy\xc6\xc7\x0b\xacW\x91\xce\x9c\x8b\x07\ \xf1\xe0\x5c\xe7wL\xef)\xdd\x94\xf7`\x9d\x9f\x1f&\ \xa0S\xbe\xcb \x9d\xde9\xdei3\xec\x14kz\xec\ \xde%\xdacM7\xcc\xc5\xee\x1d\xd0\xa9]M\xf6q\ :\x04`\xdd\xa6\xf7\x97\xd0\xad\x900\x07\x12fw\x9b\ \xdf\x99\xef&kz\xe7\x1c&^(g\xf3u\xdd\xd7\ t\x1e\x94m\x8e\x97 \xc7\x16\x1e\x98\x84p~b\xf7\ \xcex\xf03\x8a\x8d\x16\xe9\xfc\xc4\xee]#}x\xad\ \x80\xed\xde\x13;\x90\xce\xb4K\x98\xa7\x9b \xf9\x9a>\ \x01\xf3\xbc\x00Y\xc7\x9c'\xfb\xb5\xe4\x1a\xf8glA\ \xf8\xb1]\xe8\xc2\xe3Plx\x9d\xabW>\xb6\x12\x98\ \xf3\xf8\xa1\x8d\xa3\x00\xefM\xd7@q\x9b\x9cq\xe5\x8d\ \xb5\xb1\x0d:\x0a\xd2\x033?\xe0\x5c\x80?\x82\x80\x10\ ,>\xfb_*\xce\x1e\x01a\x1b\x9e\x0e\xda\xc1\xfev\ \xc1]l\x07\xe5L6i:\x83\xdf\x08\x16b\x93\x7f\ \xe3Sf\x03t\xd2\xa7\xe0;\xcb[\xa9\xce\xf3\xac\xaf\ \x12\x87\xbdA\xb8\xc47X?\x00\xda\xd8\xf0\xd6A\x1b\ Ple\xee\xf8g\xb8\xfb\x1d&\xf1M\xf8MN\xb9\ \x1fy\xf1j\x86N\xfa$\x9c\xcfY\xdf\xba\xb60\xa6\ \xe0]~!u(\xac\xf3\x0f~\x1f\xfa\xeb\x08\xe4c\ \xf3A\xf8M\x94\x83te\x9b0\x9bk\xc4\x13)\xf5\ 2$\xb4\xf5\x07\xf1`\xd7\x82\xec\x8e\x9f\xdd\xc8u\xec\ \x18\xd8\x98`\xc7\xe2;\xb9\xcc\xbfb\xa7\xa3 ,\x95\ \xb4,l\x88/\xc6\x82\xcd\xdcT\xec\xde\x1f#6r\ \x91\x9by\xd8\xde]s\xefvF_\x93=)y\xee\ \xfd\xa6\xc7\xb6'\xdb\xc7\xf3#5M\xc3v\xea\xc9l\ C6.V8\x9c\xd3\xe9\xf0\xdd;a\x8fT\x16[\ ,3c\xa43\xcf\xecAz\x9c\xd3\x1d\xab\xda\xc0v\ \xee\xde\x93\xbat\xe6\xde\x8dy\x1c\xd9Zd\xe4:4\ -c\xb9w\xecO\xad\xe6B\x1b\xc3\xcf\xe9\x9e{\x17\ OL\xbdc\x0e\xe2\x05s\x04\xfaX\xe5\xde\x03^e\ Ss\xe2S\xe4\xde\xc5\xf00\x9a\xe4\xde;\x88\x0d\xe7\ \x0eu\x98\xd9\xebsz\x99{\xb7\xf3O\xce\x14\xbck\ \x8dm.H\x7fHr\xa6\xce\xbd?\xcaD,X/\ \xcf\xe9L8\x22]\x89\xe7\xa3:\xd0\x22\xf7\xde\xb1\xbb\ '\xf1\x1b\xdb\xbf\xd4\xd3\x17\x1e_\x19\x83\xf1\xeb-\x0f\ ;\xcfsD\xfa\x03iX\xb1\xd7\xeb\xf7oK\xcc\xac\ /\xa7|\x18\x12\xc2\xbcZ\xd3Q]\xfdcv\xcff^c\x8b\x19~\xc1\xbc\x8e_\xf2\ \xdbjl\x19\xb3<;\xab\xad\x09\xeb\xa8\xb1\xedy\xdb\ H<\x83H\x1c\xaalb\xcc\xb5\xfe\xc2\xec\xce\xcf.\ oy)\xf9\xf4W1\xde\xabl\xbd\xfb\x1d\x7f\xcd\xf6\ 7\xee\xbb\x9a\x834\x122\x91\xac\x89\x1a%\xb4,\xe7\ >n\x16o;9\x17;\xa8cXrFS\xb0\xfc\ \x00\xb1uO+\x80\x8c\x1c\x12\xb1\xc8\xbd'm\x8c\xc4\ \xd6\x1d\xfe\xa7\x09\xe8\xe75\x14]L\xd1\x84\x07Y\xb9\ \xb2\xe2\xa2\xf8\xbe\xef}^\xea\x1e9~\x81t\x10.\ \xa3\xca\xbd\xaf\xea\xa2\xd8\xa2\xa7\xf4\x905\x99\xb4)\xb5\ \xca\xbdw\xf8\x1e\x14\xbb\xd2m\x8f\xce\xc8\xa8\xa7\x1b\xbe\ \xeb{\xaf\xb5l(\xaf\x22\xc8\xd5\xd5\x0a\x17\x88[\xd8\ \xa2\x9e\x1eZ6a?\xa1\xbe&hXe\xeb}\xef\ B<\x1ed\xe3.}\xef`\xfe\xda\xf7\xbe\xe4\xfc\xa7\ n\xd8\xc7\xe4-\xd0L\xf7Xt\xc3\xae\xa7\x94m\xb8\ \xd4\xd3C\xdd\xf2,\xfb\xde?\x7f\x9a\xf4\x9e\x9cq\x1d\ \x9b\x982NE=\x9d\xa2\x9e\x0e\xfc\xb1\xef\xdd\xa2\xbc\ \x100\x22#\xe7\xd9\x19p\xee\xb8\x94\xd3\x8b\x1e\xe8\xf4\ 4-[\xd9\xf7\xde\x86\xf4\x1e\xeaZe\xd3s\xc9\xf7\ \xf5t\xf0\x1e}\xefE\xe7\xf1\x82\x11yXa\x1c\x91\ \xfe\xe2\x17[\x10\x0e\xc7\xf6M=\xfd\xc6?\xa2\x87\xa2\ Y\xa4w\xd2#\xd7\xe4\xeb\xb9\x81\xe8@\xfe\xdd8\xcf\ Y\x1d1\xc3\x91{w\xc1C1\xbd\x83t\x8btM\ \xc5~\xafOO\xb5>\x1d\xcdR\x1f\x09\xe2\xf4Vk\ z_\xd1IM\x13\xcc\xf7M](\x18}=\x07\xe7\ \xe2\xa1#\x10\x03B\x9d^\xd6\xd3\x99yDzt\xce\ \x5c\xf5\xe9kz\xaf\xa7\x0bp`\x0b\xce\x9b\x91\xde\xbb\ gx\xa0\x96\xee\x1d\xfex\xd9\xba\xee\x9bw!\x9b4\ \xb3\xe9\x98\x8b\x1e\xb9\xd9T\xab\xde#\x87\xc3\xfak\xbc\ \xe8\xd3\x11\xed\x86\xd7YO\xf7\x9eH\xb86\xfa\xf4\x0e\ Wf\x10\x8a\x07\xbb\x86zqN\xcf\x16\xe5\xfa\xc61\ ]\x94\x03\xba\x94\x13\xb4l\xfa{B9}:1Z\ \xe3\xcc\xf8\xba4\xc3\x96|\x87j\x15\xe2E\xc6\x13\xe9\ \x19}<7S\x15\x5c&\xcb\xbd\x87\x96m\xae\x94\x0e\ S\xf6.\xbe\x85,\x0bK\x8b\xe9\x1b\xe4\x8d_P6\ e6}\x18Y=@\xa1p!\x8aS\xec\xeeU6\ y!L\x5c\xec\xb0\xc3\xfd\x18:.\xa43r\xa1e\ \x9b\xc5\x09\xf9\x05\x0e\xa9\xc0\xa1\xd6Bxe\xdf\x8c\xea\ \x1bu5+\xb8\xf0oOC\xd6@Q\x8d\x1dfA\ qb\xca/\x89\xc3\xef\xff\x05\xbd\xca\x16Z6\xb6w\ |\xd9\xfaCG\xc6\xc8\x11\xdf\xa8\xa3\x97*F\xd4\xd0\ \x0f\x04u\x09!\xd9\xb5l\xc4\x86\xcbY\xc4\xe07\x17\ /\xb6\x976u\xd2\x01h\xd90\xecU\x01Z6\x0c\ S*\x1f\x00e\xe5\x9b\x0eDx\xde\xf3\x81\xdc\xa3\x91\ N\xae\xf3a\xb8\x96Ml'\xaf\xa7\x8b\xe9\x10ll\ \x7f\x89n\xb5W\xd9\xfa\xfe\x9d\xde{\xe4\xbcm\x08\x19\ \xb9L\xe79=\x17\x19\xb9_\x93\x9f\xd3\x97\x8b\xc2\xc5\ \x1b\xe4\x90zg\xe7\xb0\xbc;\xbfyX\xdf\xbbo\xe6\ \x90\x8e\x93\xf4\xbb\x0b\x9b\xc4Z\x90\xde\x13r\xea\xd0\x08\ v\x07\xeb@\xd9\xf3^\x9f\xd3\x81_\x9e{\xcf\xf5\xe5\ \x81\xd1\xf7~\xd9\xbd\x0f\xc3K\x86\xe6\xe2\xe2\x1e9\x88\ [@\xba\xeb[\x8c\xf5V\xa4\xf7\xbew\xbb]j\xdb\ \x91\x9c\x8b\xdc\xbb\xf1\xfevN\xbf\xf4\xbd\xcf\xcb\x9ck\ Y\x93\x0b\x18\x85w\xa8V\x1d\xab\x8f\xb8s\x86\xf3q\ H\xc3*n\xb8h\xa8u\x95\xad\xe7\xde7?\xa7\xa3\ \xfb\xd9s\xef\xbe\xc3)\xce\xe998\x8f\xbew\xf6\x0a\ P\xcef}\xef<\xca\xc2\xea\xea\xc9w\xc7y\x8f\x5c\ :\xef\x9c\xb9\xdd\xd8\xb7\xd3\xb2u\xec0r\x95\x0bi\ \x8cW\x0a\x97J\xcf&[b\xfaS\xdf\xfb\x8c\x84\x5c\ \x5c4\xe4U6I\xc1V\xb4\xf3\x03}:\xac\xae\xa7\ C\xbc(\x9c\xabB]\xa2\xbd\xcb\x9a\x9a\xb0\x8e{S\ 8\xca\xd9aM\xc7\xa8\x14.^V\xfd\x22\xebz\x0f\ \xe6\x17\x10\xef\xa4?f\xb6\xa8\xb2]r\xefC\xe8\xd3\ \x87\xa1\xca\xbd;\xe9\x89M\xa8\x17\xba?\x1b\x92\xde\xa7\ w5\xe5\x1a>\x04\x8c\x88r1\x88\x17+\xc6\xab\xdd\ \xbbGz\x90.\x0e\x1b96`\x88\x82\xfa\x90\xde\xeb\ \xe9\xb0\xe4\x8a\xd5g+\x01c\xa7\x9c\xe4\xb5\xfb\x9a\x8e\ \x19\x1e\xe63;\x19\xe7\xf4\xc5\x00\xe7b\xe0<\xd6\xf4\ \xe9\x84W\xd9\x94pq\x8e\xe1\x1b}\xba\x13\x0e\xf9\x22\ \xc7\xfbSXo\xd4\x18\xd9IG\x05\xc1\xef{g\xaa\ \xb5\xcd\xfb\x04\xf2V'LA\xe0\x88\xce\x99z#\xe7\ \xdd\xb0\xa5\xa4\xc9\xf5\xe9u\xebLJ\xa5>\xfd]\xa9\ \xdcj#\xd7\xa7\xf6\xb8\xef\x9dL\xcb\xb6m\xea\xf7|\ \x88\xa1\x0f\x9a\xb4\xf9\x99\xc4\x84h\x8d\xf4I\x09W5\ \xdb<\x95\xc9\x196$g\xae\x0au\xe1=y\x0ft\ \xac\xe9\x02\xbb\x94\x80\x17s\xa3\xdd\x0a\xeaU\x1aV\x9c\ k\x1eP\xe1Ce\xad\xf4K\x16g56\xbbK\x8e\ 2eT\xd9\x16h\xd8\x8e\x83\xd8#\xf7\xb4ol\xc8\ \xc2\x8b\xdd\xed\xbf\xff\xd4\xb2m\xa4\xe9+\xcf\xbb\xb3\xdb\ \xed\xb4\xcb\x1e\xef\x86\xe8\xb9\xf7\xa9\xa8\xb9T\xb9\xf79\ \x97 \x1e\xd9UM\xae\xb1\xa6#@\xa1d\xb3\x93)\ \xbd_\x22\xe8\x1a6~\xe3\x89*\x1b?tv\xa0\xec\ \x1eB-\xd0K\xab\xc0\x1c|\x9b<>\xc3;H-\ \xda\xf4\x85t3R\x03\xe2\xc6Hc}\xab\x81<\x15\ \xf8\xd6A\xe2,\xd6\xd1KJ\xec\x83\xfb\x06\xe8\xa4#\ \xd61\xc3\xcf\xa8\xb3\x99\xcaF\xcd\xfd\x22\xb6\xe0\xd7q\ ,\xaab[\xec\xc6H\xb1\x83\xb2\xdf\x03Lj\x1b\xd4\ l\x0a\xbc\xa1c\x9373\x0e-[\xa8\x95w6\xd0\ .\xa0\xbf\x81\xed^e\xeb\xd81\xb0{g\xc3.\x86\ G\xde7\xca;\x99\x92\x0dZ6\xb1B\xcb\x06[\xf2\ l\x11\x08 %\xf7P\x03^'\x92\x9f\xd8\x8a\xdc;\ v\xef\xb0\xdb\x99}o\xaap\xe9\xa4\x17\x97\x0dm\xdb\ {\x95m\x0b\xad\x03\xf2\xee\x97\xbe\xf7E]4F\x8a\ \xb1\x03\xe9/<\xd7z\x8b!\xc9\x03\x97\xe2\xc8&\x8f\ \xa2\xe9\x8d\x91\xbd\xef\x1d7\x99\xdb^\xf5\x92{7D\ \xffQ\xd5\xf7~\xd5\xb2\x8d\xd6\x19\xf9:/\x0fT\x0c\ \xe6\xd0\x04\xeba^\xdd.e\xcaU\xb4E\xb6\x8e\xf4\ \xde\xf7\xce\x5c\xbbm\x97\xdc;\xa2]\xb7E\xc2\xf9\xa5\ \xef=\xbf\xabVGA|\x96\x8d=\x08\x1f\xcaH\x8f\ z:\x90T\xe2\x82\xc1\x87\xf5v\xc9\x99\x9e\x9c\x11\xd0\ \xeeyX\xda\xdfr\xef1\xbfS\x16\xa3j~\x9f\xdf\ \xb5l\xe3$\x0ex\x08\xe3\x9a\x88\xf5P\xff\x8dF\x0a\ \xe3}\x88z:H\x7fZ\xd3\xccg\xfaLm\xd7\xf4\ \xfe\xe5\x1e\xbbG\xaeT\xb7\xa8\x95QN\xc67F^\ \xa8\xe0\xfc\xa2e\x1b-\xd2yD\xa0\x87\x98\x0dd\xa7\ a\x88z\xba\x91\x8e\xa2*\x87\xfc\xfa\xe9q\xde\x88\xf4\ \xbew\x8f\xc6\xee\xcd9\xb7H\x0f\xce\x11\xe9\xc6yf\ \xbb\xce\xef\xbe\xa6\x8f\xe7\x8d\x91\xf2D\xa0_\xd4\x0e\xd7\ z:\xae\x92\xfb\xe4P\x17\xdf>\xd2{y\x15\x92e\ \x0c\xdf\xbdWZ\xb6|x\xb4W\xf7\xbd\x97\xdfec\ \xaa\xc5\xf3\x1b\xbb\xf7\xd0\xa7\x03\xab\x8d\xaa\xcafMr\ \xc8\xbeK\xa43\xeb\xb7\xf4\xd92\xd2\xfb}\xef\xe8\x93\ \xb3\x1b\xd3\xaa\xdd;\x86!\xfbp\xcc\xd5w\xd9\xae\xf7\ \xbd\xbf4\xd2\xe5\x16\xe8\xd7\xb5\x9e\x9e\xd6\xe1\xaaO\xc7\ N\x8e)W|\xf2\xf8y\xd2\xfb\x17\x1d\x00f\x1b\xba\ \x0d!\x9e\xde;ba\xc0\xe5\xbe\xf7\xea&\x0a\xc1X\ \xde\xf7>b\xfb\x0e\x0cU==\xbe\xaa\x0c\xc2\x15\xd0\ \xa7\xcb\xec\x0e\xd6/Z\xb6\xf2\xbbl\xfa\xf6\x17\x0f\x87\ \x7f\x82B\xdfK>\xb5l\x8e\x0d/\xa2\xd0\xb2\x1d<\ \x02\xa5\xce\x01\xfa>\xfc\xf0\x0a\x1b\xf2\xb0<\x14\xbb=\ \xcd\xd0\x0b.\xf5w\xd9\xa0\x8e\xbf\x02\xb57\x5c\x14\xe9\ Z\xb6\x12\xae\xba\x87\x96\x8d0\xaf\x01\xd1/\x86\x14e\ |\x97\xedN _\xa3\x034o\xffW\xee\xbd\xcb\x9a\ .Z\xb6w\xdeC\xcbF\xf2\xdb\xdb\xf6\x05T}\x97\ \x0dZ\xb6\xe3\xd4\xb2\xed\x88q\xc0\xd6\xba\x1de\xd5\xb8\ 1\x92Gh\xd9L\xb9\xda\x94\xf9N\xfa\x5c}\x97\x8d\ mb\xe7\xd56\xab\xadUZ\xb6\xc5\xbf\xbai\xdc\xe7\ \xf8.\x1b\xb4l[h\xd9r\x11\xed\xe4\xbf\xfc\xbbl\ \x88p\x92\xf8\x0f\x9a\xb7\xbf%\xd2{\x95\xad\x0b\xd9\xd8\ a\xdeRI[,o\x94\x91{\x8f\xef\xb2\xe9}\xef\ \x84buh\xd9\xe2\xbblQq\x81\x96\x0d\x1fw\xb8\ \x1e\xd9\xce\xf6gl\xe4\xd2\x93=\xa4\x0e\xa8\xb4}@\ \xdd\xf4\xd1D\xd6\xd4\xb1cG\xaa\xe9\x19\x14\x5c\xc2h\ \xb7\x9d;\x1d\xe57\x5c\x16\xca\xecK-\x9b\x7f\x97-\ \xee\x0e\xf4Oty\xcd\xa5\xbe~\xc4S\xb0\xcey\x9c\ \xd3q\xdd\xfb\x07?\xad\xabl\x9dx\xcf\xbd\x13\xfbo\ s\xef8\x05\xb9\xd2AI\xff\xd3w\xd9Fe\x1dU\ 6\x8b\xf4\xf1\x22kz\xc5\x05\xff\xea\x93g\xe4 X\ \x85k\x15\xe9=\xf5\x1e}\xef\xdb\xbf\xe6\xde\xe3kM\ j\x904\xa9\x03\xe9\xd5\x97\x1d\xe2\x9c~\xf9Z\x13[\ \x80Y\x8f*[\xd9\x03\xfd\xf1L\xcd2r]\xcb&\ ^\x0bl\xca9\xbe$\x1d\xb9\xf7\xc8\xc9\xa1\xb4Z\xde\ \x0d;cx\xeb\xfb\xc99;\xdc\x22g\xa3\x84~\xc6\ \xe3%nMj\x18\xa8\xacj\xc9\xa5\x90\xa77\x8b\xf4\ \x1e\xedh\xf0\xd4\x04\x84g\xa2\xea\xdc\xfb!\x86\xd4;\ ?\x8c\x9a\xf7\xc5?\xd1e`\xc2\xdd\x5c\xe5\x02\xac\x1e\ \xe9\xf8\x16\x9fs\xfeL\xd61%yw\x95\xb7\xa4\x96\ \xaa\xd5N\xb8\x184.\xec\x91y\x02\xeb\x00sM\xca\ \xb8\x07\xfbB\x84c\xb1`\xae\xd7\xf4\xd0\xb2\xd9\xb7\xd9\ 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\ \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\ " qt_resource_name = b"\ \x00\x06\ \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\x0e\ \x07\x04\x9f\x87\ \x00b\ \x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x00.\x00p\x00n\x00g\ \x00\x0e\ \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\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\ " 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() examples/widgets/dialogs/classwizard/images/000077500000000000000000000000001376617013100215645ustar00rootroot00000000000000examples/widgets/dialogs/classwizard/images/background.png000066400000000000000000000540621376617013100244200ustar00rootroot00000000000000PNG  IHDR|1WIDATx^KUi߹ a:$PP qV!%H-lQBjF`P( rq!\6ʹr#b7RȂllHYi~? ~8Cy1}_E_ZRzhҞnJOL<0s0IK:O$&껻j[[JӢgL6^CR"H}G,69|x̂+dE!r;R7YOi߹ѳfv+J4IF uiAvЛM47_0]^q_ Yg2[B1vLIsfv«VRͩT^lN73V~H}S ]tc`߾3K(/YQ=.۴ś\.q&Y\zࠤBoV,DZT0jo,[_А9>`|ۼ}RGW~bnzÆ$EQ&# R0 &jzH,)ݼԺu%QigT[k)2R:H]"gZٕ?,\ۿ(HR|h*`c9c؍baXXb") ?]uיYYa>y]#zGzׯkբ?:jhy`y\Qѯ^{[ZV.Z6nKF,gB`ą5.S敲:{G۶tA[[=j*1^m"DO`V[شA\]gUԛ5JZ-[z0)fmhxPci/ v|"Wv}l?u⚧X|K꺹DD:&3fl1#oɒq1aa_MD)^LhJut= {r1#GV:놂߳D3o`^Y04d`p<5iJw_?O> b+WVY cE`hE6 aŰUX'*5%K|M+U G8 pљ3Da.06}/g-(֥Áq3D1;bwpO` /W.-_meB7 -RDz O:_ڵ`d&`+Pg!^)㯬j}0Y`Tɳ ի?H)5q2Ԃx /D`mN)ڸJ *xZ.Vfʧa@xY=4ˑ#O߂Oݩ5r-:qHm!LSnú o 0:r|slݻ{I<. Ε+66_+^8099ۀ5#tX)3?g0[p&&b8U-͖wclyϡyXAX߿`0Y-ڷFN%C!zkQ'\47GagVa`ʩiӎY'`?>qb#ns@QlV=~<!u }M/dv/W$$݌We/9FM3ƾncv-,НEcp *UE`0yxD3 g;r*ȍp?UfęeYzkZS ^?}cmwO׮Q@};x6qo Ř}` `0貃KbLjQzZ+*Ѥ-˃v楡,kw|׭ۙXL9ЧI$K׎uم w`+C}xQ8*֟r28ExT5}` (Sp/R%.Icc[B䠔0X;ӛ nVomܱdel&(X|H3+d%M%D9_2?<ܺGUٲU̡w85hpyPBNk<ʺ\l䞳Reɒ٪"E#eС-"$4*ށr`a$5)HTY|Zz~4d*TVVf6bu}{V}.=u*9\UаU+7:th^Tzzg)b7eubKqo,D%`u_1 q*r:UaK.*Wu[PƢ6*46,l sLS<,q~Bb(!s[JyowJeemT޷o%c0 5ۮ?9cP=9>eNm0Ba[u@kOw}B9VҎ[ йsW1GGXmd^);!F[ގ֭.7H^OVKׯY,k򨃊R ƍ;{ A{lW@*/U}ﻸlT)+'nJvwtR18te5|g_F’D< )Egy|D`N g_ `cdچ ȈԊMŋ{xHg[<ĪKnVˮ.ie끹kn[٧nѤɝu+ѣLRãF $ cs߱cVϟ֮6).n Ie/׏jUuf0\v1gKQm0ZZ͋]J2>\Zn7Y D\HI t:fx% ^KP_7WfvzLZnZ8@-CCuxh<$S`C,OK̿aċ+VxMf9rӻ6ʅ">"tgvi˺T)C`0 kOZV \03Jr #s/p8z0Ԧ/`?bwǎW]S6}Syz}l-S|Ӗ``vogW;ɟ>)g><2Be7 ܋͠O_lϭ[/`,{Fe70p -'kAO-npL[д O6 J{폄,5nkjzY?ox|]{{mi2g_Jm3 m62Q*(ˀڼx J7;! c"Zlh03AV Ӄ۷$IܦN=GĽB!JrKÆwe_w챒^}@L0g0 Cv0wooO?#sߛouı=EzE(i۸/($|׭@dtٌg5.s?7'KYYP8P,Iy3 M䊥ZSSEglo&%uXjb+-8 DL⭸Fa{͛6ѭVE0|CFCz ޔ_<ؒc2`ل8ɸ _cWI۽{w33gE]0؊(+^7o.w6,T|J K9ؿd! M3m/ON| Fh ʻLMc0%HNvd wCop$G9em5cX)w,f" ZV&<>(_ XIv'tKc0(`\J@c,ȗ{ Y{%C2Aphl%a;z\w*'6£CթP.,[v'^HٺlY{Ҩqa܆Jdp(` ,޽vo i@/jB߅1CZ9ylO.H jHjnd'^f )=aê0$T?>}z6nML$椱gU[[dT!WSp5׳I0"{SYڵ}Up]l, q?K EаII3ez9Y,:P[N%ҩ_sN4~~Jƻ u/.]Z ʙ?|(2(ğL/_,Z a0ΣR '2 ƽʑsIEy7fHUD\Q._!`kmb V d).tų`KXL2mec0^M[dPJ=g-thCKw?=ƪgy.A3piD{t$[1%s'=J Ǔsf׫w>˕[J" ` 7mڌ]C+JC o4ĸONTa+8X YJnlJW2;SJK`AO`p,KVT trۙ@J/}}h|y 8pL{lC-zo'z_*.+M@p3(\Jdv"UZk+@`CH2C֔(JҁIו|]&GHg0:|&1J.8Y{w )si[OaSņ%7|Ѕ m At@R2^[g]儘 z؏rX݈Cʖ}b؊KkJ&K70+U$ rdhHFWW>"B ?.Yr;2\<~$ c^OὌDa9tŹE7HeK` Dp441AZ56pZ1.Hf~Vsݢ`= Cw5˰aSyB&=$lET=5ipCCW~]LWu4c^?Rkwz❳ru.K FR2ŶBȼk-"%9 gPN ^Yحy qUHc4d*ҟӺur8jM޺no{+5)bsPU2}Z霋;Q"zː!Ŭ.Qb7i]𞹻⾠P䆪ɸυx-\/>r ;:nB~dp{0-Vmt/WvW^`pK8 9s I̔SG?Wp ȉ~AlUi|f]ѢpWGǎ=}zLN;w)"A%-PQ@eI'L4dHȼyc+hiBdH֭d"b쇷\' 荬2ϕ+BV9I!4"vށ$[f:ƙm….gGd (1EI7$ڵAh@G"xeɒPq^?&+re{SiO2y3aP[ep?XQZS*tr?"$'&Gn5>(z6mq8f79Y{h v]Ak]k&ø-䉀rZB_0FF8jU_=<}Z<c|=lA&Bn)-"`+N$P1(/X"`x4_P]ttt\q.V22,D WmM+; B}3%YeQ2,I@B64S'_L6e@ϛztXnsap8tK8%;x*%1h- 2͛/U23`P4Wk~!|&N $(pgTn_+78J2*-,P\ ӳ+eBa#aHhْ4m1NjPLgl4+]S?Ѷ&#CJ>@3u@[gk~xDz"H0*FeAnwǎT[J!p=(ml˗xx( ߲bD(}G*}#+Ljg VAq'-oIڂVTmGm"]7wXQ?8A>7YZap e]@@=i"Y_Hlך;n}]6,G Y\c8\,U%߿CG+JMh|'1v Ż>\᪏3e2ċVVATu|" @gE:xb `/ņWwkNȴp8R+׈O w>;eAq +):.,ٹs'KcFyoeV^0:![+ɓ.Z ^u|=CKUҧT{uRlXH1Qko#.zQR WTHv-8:]>A"$1Œ{QB\d lA2텄 Bq^zA+y lVs`qϯXĀVe /.%},0_0y4sp>D9rPVjzH$K>2.,dp8+&J]sQA`+Xt%RXU.SMh J2 ށ%F\6)T)z ħɫK;$ΫѪk}(oc*Noo뱛Fա8&SLھ$Ã̅3??I^P~sWh/bQ'UXRFZ_6ir'879iN6c%I!Yͬ ga0{IHm`:]8hܠ^: / y8Oaһ#U[ ?꠪IFOeRV*gW܏pu+;}YΜ}*eT::ءUW֭kLA/%ϫˁ\ZpPlHW/wjC(HDΥ43VE"F-f&ҲVdH^C&B4 +{g+ϵnbK3ݣMhbӒMON^\ vJ:`0d|khٟ\ƖOTG6'&3Я`q{,5t@%k6p&NJG:bNZݴJjI9B5WtzJz,g̐ew2[ܦLCHz-s(|dC&h˖ņgg%Bp%DliFB7h5d Mf0T[O\vyrNڭ|n-S8U'lY#U?#um.Uғ'VOy)E&tΣZ=G(SZ-D!eJNiBJeZj͌nlL7t*im+}6:6TQ`_&'2l|C^bz򦦰ՅU@ْ~xKl:8xv<⤒D[ȩ-A񜂓%`Ail )~#ɐM{@1L^6VHZБ 9P\`pѾ{b F,Ww!}µ_B||l–+(I]BtL#4fVGV`WNrlR fGQztIk偼=)ULbU&oZ[zł'3[*xG3ex:4 jHUEZ:= ?`Lu1q俩?TZ4%dUC` G{c-ϥz$E6U+/B*-Z@opVZR2sszC3N(Sh[BN a!C>CgCTV5'./ n!.fQy*-I1C=`r(H ̙rxyF=TŽZ[2+kP RGL}.]j2NWO38RW8/!1 &smK; &Ih*^-ѳ˖HrmA"R!r u13pr\#{SJ8mGeeˬHG]030 [SA|܇j;b͏:NnKk|RV)NU[~+|a H6sJy\^wNDPa1`+l, \ TFw0;۷_L}R KCi`LLL1 wql"痉?>NNz̆TF&`TQo|zUͱ4д-hxcw,Hl:w~y}ݻwrdҬ)8A=D11d<$w2*oĈ,H26_bs=^{8~xx9H<gjtπ2yOϞ]OL!% |RLG)-{ՐZ7Zz3!f FvG)N2)2%~WN[puоW8z=oe@2⿄C1QqQQiQ hx<VDN°FR XޣN]O? =**yop,ECo5hj$;E',8]Wj>hc̘=d;~x,p5B+p.h˗ؖum&^\h-PCkJBvT)Fq>3?' -Q [ꏆoEBi ժ`w ."jbeUᨿ()sɕm i%ʃ*Y6C8GnJ@28=322:M6 L^fm_X6=۷M)d{wc67hpuYdp(dF=W- $'hWciJIլwerBgY4h`*M'ʑ#VE)TpGv$*:~A(8$[ {Dhk}-o9VHtY㳚$PC``V6edb;O&57DH 5ulH!M8szYX4|n!Q`ëN>PS@5t;q .SY)zƬ-[ހܦN24Ys!'f~6Ӎ-[;`}o3|k9 pN_P"1psF:ԑsƑg Xnҷ!ʁF-p? s:K] gdrP_\ u,u/|!:Қ a%S҉Gyĉ)SFJ/fTᔡ(*- ^lZh 2 \^I}\*[);;} CKN"YClR>+HQ%^)s-)*2+hOjR|qfvyXQ4D毓[~[p{؎6n%ʹ}[ӦOLpce5_YzZ9dp~;Vh{okL2Lt0Ly--)]JݤFаO?5ϕ댢5\ڨ24V)RF:QϛXL@=/PֿipS$@~_.zn)BkzȺ9?-o;q*'LU/ơ~۷OAc+L5,CpO)7/b+φDւ}'%aPw5MP#`ëw2d.&iʙS^,L5ˀ>EGA\KiLYO 8BM ֆ;1VBgdX駨(J^MPE3QAcse^nSj֨c- vU )S&p=ZM9l4@Jx]*VJp4O]G3+??kFc|7m* L!)v1CJ5匑Nrk"3Ku.Km $)2liI3fXK+At}Hb[  ,VQ SpFXId8[sT߅Km`h+t `v{JUX;k ^ A  -LO/Q[+ZS#I=]\Zewte0/m%ֽ5WxcdM@Þb|efmMs8!H; +G.T;IRpze2pc08meÇS>F?g[vt&K^3Fl,S=ndDZx;@J9 Q&cdKĤ3ڰ!/XZي jW*.F"9i+]`tNWЗ %Co7U-C*6jwT/M+0 ϐDOI[]BAƍUblH8ݥVOX[ټ| FKأG<.tI]>`kJ*Z&lr68ƌ.VXdIwwըLqt3˙sߛ{yu:  lcm٠ 8 c@=knnLs/SӴD3 ƒEqfA{2ﲠr/A^]v7 ߈/ɬ* ] W 5k_c:n@_0E6%3\3OuxR*bgX 0\% W# MFgULG -+As[({xG`LZh_8Y[.XqZeJtpCXBl"+ ^% aFB% ^fCg@Ƿog`5|MD5kbH  H$'&cL?DYxP㉫ޖ =WSo;`*ι\SiEށ!>%>?uw_O2r`p83`-Lrs>C 7 -;\ˋ`GD@$Gߡq2("s9ɂ~+m DrHǻ0X#5"M&cR׊HFM^0={},اś/6Ɩ:ikU;wzv޼1T)N!I5!cǁdlx">5gKg"#WMeV(C4r*Z+3S`|"V?6p &ҭ `x-]: xe<R^%%$̣;/0A˱rX BH-ޣJNOO/I {BL𹹍AGW;Oɒ1*HmR}zCE*uw^ϖ-[*UH0aCTB4ԥr*Kx6 D v"=FX2ر- n`ܸkx~q--{Ao_s+ccW~%9'͹ףB炗 {tZaxޔnL&tO,^ݶMҷ;Vhpĕ M{}ǻAW< 4 * xLM5%J\ѡ &b6)Ν(թ躲`'+勆NcR-&o XP'؁FC~/r{ѯ_CY$D)R×^*yyA͑ { 0ʸvWY`0)o9 C[:X+#^t1><|&L{ 84줝[oL7T8ùWv.^}qМ%uh׷lS`㍫4ݼ׬)2 PfӳgcCwfE%4oS @YE ŊI9,OpIpwG9<9o65KɢUm7e q:2!Wo߾}KF{v R}ɩSO`l$B xާ.,yvچ$\V d[$laI*=@>i)oq%+'ӊ rd9͕ՍhUȑ 5 n497%ܸXH 6 -^ȂKAk 3ﬤ{I f+XQz%$%%5L1pfҍ/E]C]\!vUZ뙼gT23»9!0y`lAٳBg.92:ϐطj(19^ p h$$8G8hxk޵24lOw&ۇ'OVc` Odmu d%4@)&ߘ߲h' KiA }A*)$E9sBz|9R|7OPǂF9?9iҖtlnc6pΰ#Y gPZsf͇d<==(kBV-R ر8{_;)ӏS042.m;M66{+wWޗvv*U>\j[ۆ R$@yuVLΈӍ~{n__UDՇd4[;A8~X0&m >>Է&6mlr+CUWq=pAth芛۷o!ݻ2*P!cr*`V=2 `P A'0:?0#Ej y8FIDƂ`+??ao+$ gQu`0$T dB3ߌ!2S/T2 }D da{ρ'<^ĵׁAHNyKU JT X#C >ĵr0n#͉-_89u HG >X"K^w08\>="8lST>) NxaIƄ)D.`J`ϟ?OuhHI3f@=7P=`\u885.=]9ۊõC3CX?,ϗ/&իx/L@gDR>EFc%ݹU<3OE -$%%5Bgs "X9@mK \1f <9{v)'jdxN]p\SU,td ^FCuHIsg*s uojh܀"x5#iҶ5kKӖk4jt/2 Z옏{X??}ϋ|{0we\6e ZEq"m]hҥ_|Y*Z!)4'NtóO D[ئ d3RhBZZfPĤ9 MC2 `4a,o5O`Wc26C o7&U2yͱC gۯnnA%ABgibbѣ0AՅY 6WڏjґuY[HIFʷJ;Fdhh=*efRu.%9,JnZOz g|{-n*BW.]zD*^\GY =2$d%:np w]'Ox,K1Vͨd+ˀx"eŏ獍 H}C[Kǥ4֟ koʊ4]kZ՜y}! ZhgZQ  <_*y:uV ,1%Eq˄pÊ'$*B,Lk% V1===kǎ= +wz~{ښ*]gic nQMؖN j*[(qe!X`0 3y6tNܾ^7zWyE )sC;nc:WSqkU@m ݻ0СeKjߥZDm \zi[w5%YE(Y۷8뱶*JuY+ޙ ~P{.: )crSvbJ Ϩɋ9azz<}d3VV e0T zp=5!S*pG5ygQc;y޷)W!͘RMP'ō`0d3wUhaOgNϙA9hj-sӤ^ZRv ʿqcMBl|٨`hq [H{w^e I庽NMhGQcǾ`J*8,GNxdP :)}ќI0,LѪ_7g0誁ӽ̜V*A#W+??-pv>1ϕ+ů .;ؒ::־ TP&)kw>` O8m4*$}AS+ l4N5wV'φ wZ[!+*V"֭;8! Q"`0Dt<߅&)Q"}i gX McJ#+8a_gذE*UzZ_&{#e*Tmf,ݠA3yR<`0xYoe}Y:6DjwZ| 6۷o{99KꃄĆ֭R8j{ (wSѣ_Z j r.]#.È xq}׶mnt;?Q _k!`0^gB/".,l)5$Y?76K+  ^rrr?Gs^/+EFyʆ5Ņ[<<~| i.^Jq2r,xXO$$-X|H3+xC-TB7(T(ãGKqoϞ޶9ϟ&at m>VeqJ| 6¸kOrZz&001#8xmm1E#, xm\-`0ژZi6 qz 08b}\~G*==tDP0 Rg$-#ɾǏ*4a0JRMڙ( _ `0f:IENDB`examples/widgets/dialogs/classwizard/images/banner.png000066400000000000000000000075531376617013100235510ustar00rootroot00000000000000PNG  IHDRKㅬBPLTEIDATx^]ْ$7:fvW $RN#GlR UE~wvNm߷;.c;2-0~ߕmSr)3"rQYA)7q0Xk3m.ȔB˗KeT`ўVyZ7;>8ٵ!.A.Ϯ~qNeY=02IIƻѾ30Dzzny7 m!،=t:; UlHV]ӕx~@2g(뷟&c ;8YՅyk:ql5=8uvHFy WΜ\wL)ݔ`&S 9i3kz%cM7Щ]Mq:`ݦЭ0fwߙ&kz&^(gutm p~bx3]#}x;δK >Yǜ'glA]PlxW>M@qq卵 : 3?\?,>_*av]lL6i:bSftҧ;[A7X?APleg&MMNyjN$Yߺ0]~!u(~cAMte0k)2$`ׂ쎟uؘ`;̿b ,,l/ƂT#6ry]svF_=)yǶ'#5MvlC6.V8;aT[,3c3AzvޓtލyZd:4-cwOB{OLcsX^eSsS0; usz{Okm.HHrν?D,X/L8"]:"ޱ'ۿ_-;sDiXoK̬/|¼ZQ]cvf^c~_jl<; 먱yHno;9;cXrFSuO+Ƚ'm 5]LфY}^9~t.ʽآ5)ʽwmȨ{l(" [آZ6a?&hXe}B<d.}`n-LXtîmC,?q2NE=ݢ0"#pӋ4-[ކZest}EyXa[M=?Yw#빁@8Y1Ñ{wC1ttM~OO>R Vkz_IMM](}=#B^әyDzt\kz p` Λ޻gxxٺw!4阋T#kYOH6WfzqN1]l{B9}:1Z4Ö|jE}<7S\&˽mS., K_P6e6}Y=@p!SU6y!L\:.3re Bxeߌu5+oOC@QfAqb/Z6w|CGߨ*Fu !ٵlĆY7/6uh0UZ6 S*eDxܣNaMl'llnW{mL9=_ӗzg簼;yX߻o搎 Zrv@^Ӂ_{~ٽK9[@[Vw]jۑܻvN˜kY wVsqH*nhu7?s)98w Pf}r1+ƫݻGz.96`g+c3;b]j#קL˶m|ĄhI W5<6$g u=yts UVkPCeKg56K2eTh؎#ol‹Բm+ϻT9 UM#@d)_"6~*?tvB-K|<>;H-t3RHc}<A,KJ#1ϨF"q,b[HLjl c73-[w6.^e1{g.G7; Z6B[l %P^'؊;vۙ}op m{m E]4F/{ye ߽WZ|xWecЧfMrȾK32}蓳Ӫ;!pwٮ4׵ON)W|yf !;ba& X>b U== Ч/ZlBK>l /в<> <= .w٠7\Z0/e|N _4oW˚.ZwCFT} ZԲqֺeո1GhLڔN\}mb6UZſi.l[hrlp%{ aRI[,o{}buhlQq wglғ=}@DԱcG\h;7\K--Otyͥ~Syq?lxϽos8AIwFeU6"kzg Xk=}ۿkMj4՗~Z[Y*[L2r]&^ l9$ɡZ ;cx9;"g~%nMjjɥ7hg!;??e`\sL1%ywN4.ysMʸBc`вٷL謯p.pOR^ N2IENDB`examples/widgets/dialogs/classwizard/images/logo1.png000066400000000000000000000031231376617013100233120ustar00rootroot00000000000000PNG  IHDR@@PLTEfqsuwxyz{||GG|}88}}~~~pp~~Ō~uu~QQ~ز~~qq''~Ç$$~~\\ cc~~mm~֮޽~""ZZċ""22HH۷LL&&''3355;;>>DDOORRWWXXYYaabbffjjttuu{{~~ǏΞϟТԪիװرٴ ޾ gtRNS !$%''*+,-./2669;<=@ADEHKLMNOPTTUZ\]]`acegghkllmpqsx|~aIDATx^UpQR(B^[( E{p)^$P٤*#=wf}ȜRR9](ĕA&60xNr`%e3p6 F^hP}h^}fE 8ay?n.%G/9*4 4}2h*"\u< -sf` )6 )k|7,.+>h3 7ɻ߾Gq@BbZ9*7 (PpmX<ʢ,'聲! ol0`'Ǫ0.q]`pFYUr92j(&4c^NlQtQj:";םA,5RoHcVNmڮ. *RyjNN@0@n-|o%L㚟 P9e&r'" q kwPƂgsߪ[5qZBGPE7Fa0%PGODē?ڀ9se׌ŞrfO\GfkMqp % 99auIENDB`examples/widgets/dialogs/classwizard/images/logo2.png000066400000000000000000000031231376617013100233130ustar00rootroot00000000000000PNG  IHDR@@PLTEGG88ppڌuuQQ沲qq''ه$$\\ ccmm殮꽽""ZZڋ""22HH跷LL&&''3355;;>>DDOORRWWXXYYaabbffjjttuu{{~~ׁ܏ឞ៟⢢䪪嫫氰籱紴 뾾 ܗ< tRNS !$%''*+,-./2669;<=@ADEHKLMNOPTTUZ\]]`acegghkllmpqsx|~aIDATx^UpQR(B^[( E{p)^$P٤*#=wf}ȜRR9](ĕA&60xNr`%e3p6 F^hP}h^}fE 8ay?n.%G/9*4 4}2h*"\u< -sf` )6 )k|7,.+>h3 7ɻ߾Gq@BbZ9*7 (PpmX<ʢ,'聲! ol0`'Ǫ0.q]`pFYUr92j(&4c^NlQtQj:";םA,5RoHcVNmڮ. *RyjNN@0@n-|o%L㚟 P9e&r'" q kwPƂgsߪ[5qZBGPE7Fa0%PGODē?ڀ9se׌ŞrfO\GfkMqp % 99auIENDB`examples/widgets/dialogs/classwizard/images/logo3.png000066400000000000000000000031231376617013100233140ustar00rootroot00000000000000PNG  IHDR@@PLTEGG88ppuuQQqq''$$\\ ccmm""ZZ""22HHLL&&''3355;;>>DDOORRWWXXYYaabbffjjttuu{{~~ fr`tRNS !$%''*+,-./2669;<=@ADEHKLMNOPTTUZ\]]`acegghkllmpqsx|~aIDATx^UpQR(B^[( E{p)^$P٤*#=wf}ȜRR9](ĕA&60xNr`%e3p6 F^hP}h^}fE 8ay?n.%G/9*4 4}2h*"\u< -sf` )6 )k|7,.+>h3 7ɻ߾Gq@BbZ9*7 (PpmX<ʢ,'聲! ol0`'Ǫ0.q]`pFYUr92j(&4c^NlQtQj:";םA,5RoHcVNmڮ. *RyjNN@0@n-|o%L㚟 P9e&r'" q kwPƂgsߪ[5qZBGPE7Fa0%PGODē?ڀ9se׌ŞrfO\GfkMqp % 99auIENDB`examples/widgets/dialogs/classwizard/images/watermark1.png000066400000000000000000000342641376617013100243610ustar00rootroot00000000000000PNG  IHDRwPLTEmuл˝୬b{{{1=PPSS,,@S̛SmܹZ{ppAB컃 !լΠӲlrװv",jssvx̟h˼ۜ::qđźƺJi01˪llͣՋТZ[Ѭ^bdmV}33FY=Dد``۳J\cc&2,;"P\ٳC\Ta´ⰞۙCRǨƲӥLLhs|۴LbEbոնxWxڧ`pћd0D8RĹ˩Ë'9`.;򻚾5IEMIdDDǡMVr4Cj,4 RfċÜԱ鵫ɔnԞXsռ̿îUsx#ˤrl{rĩɒ=SܱǑz㺜ʱ̺;L\͕9FYmϻ״cљOmx$$o)5 *p5IDATx^]S,Ͳrmm۶c۶mڶmYQQ=NveV=gDd^r,Of(u-iʫ,Ju5=e2 ĥ~:Vge|W\WXf/ f9CQaY A42pP]'# 34 R"0iF38,Ez<444JK A4%:==YxX-`0Į9(Sf;Q(opF_iE - D (C) '2Z!%(ڥMY&BBŘ S \IH8a%# 5Ԍ9O"M1A bOe'D\(R ,%%%iRvΫ[G  wINf4<& z7e!ҚADbe0K`\@o'zӕKl~9JKqnPbHMӦ&zFx<僔NK(t?{x~XRrEA9nZ}㉗V_Y F^o9̀J#]î~spJ?д$ F;jQrȨ7qA0n.yۑ~Sx";"q16tqU F䬁(2|&=]m۶!UR᧦}ns:ZR WB`= }° &=|֏~eEEQa詽UYz<TTd Vv}h@Ӆyb(woD-Np]Z)KP+2h"'JJ~f,OI}넾g g-:ʔ]$cۑ3|O֫y2 Wo/p6͙Q5UtѣIVkw.qiPIT]đԵÆblL JnLu@ 5&@nx[?J UL لwbsa>q$65ΫqZ Ů^IQȩa&CMysODh`T(vh[mjCkZl8 Fx{FTTE;VW[ "3v<6Lcl:>JI2-l> >-~_<[P!s:%{偰Ny2}O0wdZa.`&'7ƎRY1LKWDno@Zşİ@׆ şmjv%heT9ai1^^}BX r%@|ok}kJp"-`|L@RbD ZLo*yf* >Tْv9;==R݈\I QWrJOЧҦ@+[' ~n(%Sԙ^=S#s{yհI^o0ʝiv*# R͟0Q1_O:34(TJ~_l`zSz+x)57\{s0*xJ;q ow/Q,iҩX5툂gwb*0[7s9|RA)F=Aֻ#|= Ucf6&,ػz~Cޅѯ NJM ;*O}_T6h4 h;KZ)L땰 _JZ/E^wcAQ[3;zT|ֈ.u+<+D(MZl6k^ R_q,Q_.[|=̓Rl{z:=1F󋴎BF}̬?}0^I8Lm5wl6uxD+6N2[ihR( ㋿&3(K)VߞGKtCPWʄk?iF]qBL9*:zlFk EM)8+S_l԰^^R@E*d:JɋPhLJ~vi\Jj2PY uPx({j#gPQw'r}h=4#_B M UlNL ,aGS9 H)zr" G.5{ BS(/ܼ2 D4Zޛ(@"$!PQi\fmwό奦탼4Fz&F8. 7PS6 U@l(*LByYKiYhkQ=Y_j{s^nsASd2qGTר2L`Ćyl}e+eԧ 1)ZS&4aɇ#T&O}d ֬81)(4J1 t䍽L 8 NOJ"U )RQwZ E}!/5=.ݞ?7'E->%!]C$ttn"E1#lf%G=E2R=M!5ڈ\"jLH(.EVwOi~ymҳS(D$|i0Qzr0o8- ']<:^L<3.S" gq(nټz8+ |L-]B|.((9'qeF]ivu-͏Gs$KyZAd<=o!cP{'\!.Sg^{U"7%ϟV"̒bZ?B ˑ#_QɔT<~\šQް~<{Jm !j^o N?f #K $ uR<ȧFO_| ph_ Ք!Nx8,^_6 sJF\Ac+MPlJ"3za*o`# ifי|u C)^*wW%>l6N8ӯ z %$}/)֙֫z}m27PBOe'e5,k!u&_t8(7]YzTqbTsԸ´)+"oޥ›'Re=qFζ̺""&Qho: :&F55Qfy&wbcr}O~$Eʹq暴 ҋw}y-*121BjKk7Y>wbcov' pܚ;+"Qo ~\ݬǖ HlOДOӄ: j ߸/,."HTnV㠐iD?x޷a?t<3%7f4Zs:jYG vx uw" Zy{`%mRh~'^4_5&癰hƭa>=&/ p^ (ӉGݾ ̌'ms"EzH NKBZ}|ta/fe&8JI,p \l3SPT >ݼ5jT}Oɨ~p>C,&7^`DRep<3QQ5U 80ֺ yT/g@REjI[XxOPԅ+cgh?fth1BjN%vy(AB)JS7F*K_c&3eziG7BP)BՐQ2l8$O3? oX׫ X>EZeb>12[jj`y@%%t},ƅ(  oXXioD_6)p>!=jNF'}=lI3$_WQᛮq47gzż!Mr^42c=;^^ ICҝMl`vN׌{;k/fpfڣw޾a@wކ[v})ȒӥRS4 Y5޼@^D;p_Q^P/*(iTqF$ T n E^h 7#!y)<=iwWKOVlC::)5x!P-ҋ e.G?{73J/DIKk$a#gje{YW(5~1u}KU΄^wKqy+Lå].+v#~kzk&zEJj*D-醑nx||M9b7AmUg5:y9|rr0YԐtXRR= %߳^(M(vEVWCn?Vn v")70Mi,w/>;yXLk2}~%g:*$?K ]vAJbF;GPU/-UT\D"ve,5qWXN'(z@02VzwAKgA¸kOCw-m(MR-ZۨUԔ:@ɏELazM`f9]4ˣqז->kG1[(>"-E 򥏍b?.{q'$󄪍{Mhӌ^ztJ哼t~Rҝѕ&]k4zOT~OO4<1.e|<'L,}AF ]2."d}V⮥~b\a4(ӴirgPӑ[Sۭa9OBjmά]&  ]}yt DxPs0_1)׈'Gm^ץ4n#A)DeH`D&rHc{ٰvrUPrQD?J N6jQ:?Gvx6ewM~b"QK]㶶 Rov4>PjTڔBL-"Z& EZciODdIo",k*0,\Sz{Q-=z'O^HB瑦!XvT~r1FpO^S,~A 靧zPˉem~𝞢qXWѫ$ՌԏZM;wgo ^P9bNudMC%uѡ#3ٯ1)IK3𠲲u*K_0rY\|xjs kRC{GQ5WN 0R(Ds^FqT]Jn]z/5؛g)֟cy:D7v6EѫkY׻P^AI@t 8'Dk )q`8'8S48 A2Pt^OWUk>{sEwWu}o mp1-Y BݰJA YNa,[MgslG+Q\ˣ]Q+ՃB4E[(;*Hk),?r*Uces^*^WL,*NDHu!b {f LBn –9Vi7Y_>[,fGOw' >yJLBF܎rrvG<9a(=ˆ}/ ڲ ~ !! ՠ; [AM}څ#<0wvhÔsI5E\VI$Վʓ)󲅠'T_MўWb*9tI>̆ 0]*g!g)ou| 2OB>"R >,a/ya)ߓK"`BJD코l41"/4.C|=hKM2Q]>eh¢L&_bk1kRZ+Eaje m?Dnn?lnaAu {y=mPG[&yq %I 1¹O1e(!j*> .I=|9ɆgreDZoPQN\gҚqB`cyP6*FQ }crG)1&z&31MJc姴9(EQ ^HŋrBQ)h$ۣXSb&-pQz8r#рQS{ҸJV-GBRqsurP(Sg Hi_؃Aأ4ـ  TjpGX/( yc&QѮl t=ѝIL71DjOe+w=g9-ybR?n;2~Sk< EXO X&G޿q8s,z%s#EFuOIV?l:8O(3%jm9_釙2$ wi1R#'c?}[̯7xdGUCyd|Wc1HQ;WF/za{j:Hj/?zzwH{:Zg+ X؀X'f%>̹ f-4òkML"P cƎȪ;~Rdz< sH$'0JlECѶX=NS>R xXuP;*pKWkEpid|7{gu&o=t>aFfrǞz$X w&uM31l /) ֈ2|1q~j :`͍J!AG7A,2\AwGm57]$,ѢBNӣ22E&S+.9Q59WeR1¢gz=lCq'T#&VƇo~*ᴲ|BSK%S扊m`@}hE=:^7BrH(+/-w|͗&͒K6q#?߫#yyET|awML0~|vMŅQQ%TNSnWӂ!cq-^%t3̫3f6fvLT83'ۅl|RB?]X2^F+a]_ZCLk)+ǢKWp7}ݞ_:/zQ#KlO{?i [llKg#g(Ʈ"fI-F1VPj)>2wnDжzB)1FF \;nG?}d)rV\b\-4aD.*{eD˩ʱ ΄FG!a di_b} FZ,~2\=;J+[aB>r{^?p˚?Ժ_:JaB` Px&]cX6SƠ3 Q1qT<GEw?yK]c;a 8zi"r$ 7w_.p$b,@T]|\=NPQ]Q%ܒꃋrID EX2Ikl3vEsu·-_4;j/aưso.>wcu4/B:HpyȋߚqF:>J9vKxTN ;yLgQcx{񎝼K|^bTg(J{r?Oڷ=oO,_mNZ_'XpQS[i^/iuy׳1^&6M&dU,.;Jcz׫So.TJ6|~W;uD>ىYgX(+Jc+Q%~ѪՂgʰ"x/k+-=)u33Qcy'svzԞ 0([2 4g枷~)!IJaZ )KGiچ .Sj^z1P̷3כZZ3VP[ȓ @쩙:f_-i~6|ÏL@,S:BzUn|"PWWiw&ari*"&P2>WeRޛWeON?Rƫĭdn) $P;q)HBZϕ=EXH{; T@o(dN8%/Bv':$~1"c/ǍNż,YtaBJ<[zbS8GZIENDB`examples/widgets/dialogs/classwizard/images/watermark2.png000066400000000000000000000351001376617013100243500ustar00rootroot00000000000000PNG  IHDRwPLTEĐZc霧", ZZ ޻##22::ABSSllrr{{ҁ,,cc+<-;FXV{%14CBRm%u1=Rd"ۅī̋JiP^07Z{͡q䪽9T@[Ϻ_~EELLЭotVqzī҉vxŃD\Sm5IKbi b{Ƚե'7I]Zsʆt9L΀a͚ߨӚzyNg@Ts|ĺjpf^`脌s͒Ͱ뭷Ŋ׵ͬŠͺUv\ȒYmȳه)5›\mKZЦd:F¢ޘэһҝ̥ޱtfT>>YbO/50c*f4먊z@L g|!4&ye{F+q#QB0]䘔M%'S򙣌P-K(PgޚrS>Y>b)XC!O \{pCB,Ig#֗2GaQR:ja*Om)G[tY)+>}Hpovˎö0_WaP 9|&0EIIOs æ|5A2zM>%6Ne 5G%(Q \Y=F;>75h,=[G ^1s#yO~r x˂+0 :I{.{ Jdc?a'8ZŎyzFd1s^xYYvZ$sgwlGqp [0oݿT` #Ʊlx>'FH/|t=?jg^r϶rw%'c dG ?_|< l LʳfI)9G $ naa`Ҫ*[ {PZ:Yj=3 RLA%s7~zpa< ~UׯeM{!s-@M%cJţQiuc2<̡!U:~lY{o;ym;v1AqUg@D_RYP&<8daqً~ELTuO n 'p963F-^r;JJNF\NF^0w^J*z/c茳a큱QOIUlP+іO^ 6d%Dk'l=]{rsLAi_͞%Ry-< `zaJO.|캽FռDuYEH蛆^F^<)!m:{`Ie WO7sݼuaWpD7]zy}UATuOѓ{ej6zΜ}|a;VT%G2R4S0=),9ӻ :piB˺ϼs-O(A?B|Z[}aPo} 'F_;b3vsH!WH}MLk(GhoLӸ/TEA>m[֯q}\ƫUBT2eN,8eM# ]-ytHi^~jʍ~e@X0*7(GS;&N]4_g&OOh\avtR 3&`_^I5g83;:d?2(켃v[֦'߶nO&UJLAK.t!nXw 2Raof點eu@gZ:FO*zuIG*wB3xH BB.?)gufnjְFT J$`0Q08ځ">'=pH: ]#eE +VR(@h kw`˶H=?e?0O&"w6%x1 cidEr 4ԁzŶY#y %P:h %0*(SYS*e#nAo{MwjR:ʘ4@! 7QR[tƤ53ș hҲgp*EI,{̗XxJ~\)D*JjN6Re jF{GGQ{笩E Ia%{ ̤NRL*_4ꨪ:5%EBG9hN@y-ru7:=QlG1YI5xsڤvli\PCpuvbk/e(dRsTYSQ0O FKEQ-Lq6Ldjw,._(&Zބ@Olt^ѹ0 FY(ĩW ;%Ou[Q}D WQx+K7c3dBUatt4JdƋJE) |N|IH 9UP7ժWS*]Jrn1JHI3{[Vz&It 8+2O7~S~=.଎E$ߌ PgQEPʗrVP䎬^XpŞۅږ0" E8W*^EhꨞҺZxwPSIv' 6$pBR=NLS<}ҕNc=HOJ,*P5Nir{FȔPQR{fpHJ䠞COc H{@eoqbTNՎSEATe2RdM^rW{kX9L^N ģ1/Ehg8 cQrޒN(/+'G/RTDhEI^&N~O_MOg4I^/KhEK'[%y18:X+x}qhLdL1Gɐ*¯Z/*Sk=(2Ѳ}~T%uW̋0BI)w*xK>UrY?Q lqS%X5WfLN* uƜR J*' Vb b)&DP"\Jz> +ɢ8cdL+'ˁ+Pd"O$?*teTڸ:ʇѐ`H2&8jWy -=H1I.O)Q v`LoJo(C͟|R 1:|5)[9kA@ 7#RMT$[9FxڲB/̻UXl>z%vȜ XB.#-Ǯ )64iJz9"LN8(^yAx;hsӾDsjì,u;D??bodwu_I)7*^*lUƤؖ"|V6mmʁ> ) S"|x[:b$aNd&M =JIy=_ cB&TjwJ螩 ډW3&*έVx)BG*)_y6p]d+SX&IqNTA"~(: |@:*8Gȥ. QA_b08rDܹtbG9<ޱ*Kj-BA[(ڔQTc*>|ؠd@HT@CK&yq_< vZ86&'bN2@/%< tnp0XY} *,>(7Z D):VlMIֲ#:{=enq`҅'_)': y}s8OԐb#:HdFr,7b;Sؔd.{Զ|zp^*,8}!kBS"ïT,>2BŮz-^h[nE<*КX"g*#wÛn~t>u5%:.d!tyq{0n%9T .TSH-JG#dLw&hQD-Z e'r~GeA%E^U>_((W(vQҘLQP]4w1%~iv*=U-ށZ5PIG;~;C-˨u|ij(1 =8Cf[lDij*yStUǣqhjhN8aw4ELq4.S!~hA `O7-g ې'؏k+7Tyn [KԀ7h3x6yXV(&@C,SN ;n{?:l5Lq$P9t"fxT#ig1Gq7n{xۖd Jbf9xGc1Js';c"~N%JڽpTw;x-SLk}|_z4w<mIGႛrKK5WR%x䊢@S AeVA^"qةfsO2U2 5sKt *>ɆV/wj1y0Uֻ 4-۫ sO`p6lYFH0 㼦a z7 &d'Yꠒ*ge@.;޸}a1h 6mz@2/L T@ k6k3ϒ5R*< n'C7U^A* en8L'3R֦6{{]qf;і"ӽRbphï&LFUX*: HpGéï(Gɓ-g)dP<"RCZ187g+r gL7[%fF7QRjէt4xU+N[z=̋ Fc=aEP%D]PaISkjFdkyD{GNIkR&ung=a%M&>{YJxR{KO "}:Q~fv,PBz*iOSR+_`s HJRbrqC|DM*t{:TRiӶ\{}SRYAA,8]iҨUcÇ6LUZc gꞣK='\$sEmעgOO1O*C~ 87NXZx9=. / MMӘR5Iڰ}JV 4CάNpɩHO4рlx|Ѕz>}NQ˜ 0PŔIn1 ن&Jj%mUxyo2G.*dDsDvn|=o!xO$Pb@3<e$k Ne#}o喎XǃU9 ]# sa oD޼V(v8H_*JJZ `N87^xxX/y9_BpI~%.^}χ۶?SdDP %$іl~4E-O e }Ruos¼΁;veT)Kj,)Ow>~TCPܷ &t0.QJ%$ ٓ"Kcmyɲ0(9v%*s¼ <J$GZDM')ǣf<cԖ^S?pfSmɟEpu*W|׊u.<iQ箞k}B;yl$kџ/Moߌ=CƳ'jKR5;hLK•'CFfcS,p׻1+t,:oW$|TҀx'F'*=XC,qPG=yHeJJ fV)N*i L۳`?揪/ew{ʕݾ0:9;˰qc{J^|>h Ez26(ݝwf*>ko}Q#Z b 'Q*,f}D\-3 0rNQE3&3,bƨe95)o6S6kIې><0ev{j<"UK>+a$m--%4KE:cU퇲9J؎y9^Wܔ<·T WWf)_h2gjDJj=(Gs$QǗM&z͎=G+Ddm3Eb'2lNݏѨQh%y3w%E! VOT4G! })%ݠjds@2Z}8C8Ā mGCJgnZ;(4:nGC@QdC1Ks{tM&U |iIWk@y^NW4\v22ΝkscJ=AXyiehM0Kbn$קkXقt'xyOM2qC|d1jj9΂uYEa8 oj]te0Z[ Eȴ1 ,&T֏âq·Dž)yn@ϒ⤄ a-WG"f$Mz GC9\@Ȓg72IaednŠ%p1r7e+mgͧܦMtF"`y%L>6:R~Jv~u'PezX n4M6Ũ'9Pns`̓B:f34IݫQ?/(K[-6ӄj殣̶fgͻ]*:30zDu& J:Cd/&֏_wMFE" 7w7պ|ӣ7-g[ -/ԋ: -=/A[SϾC})OWI!A:*3Mw-p:tt܅` Gt 5^$^M5řPHǧv&ŇGG<|y0(dm0%i,ic5%o>Wse~cIǙ"5ӛr.3agdgP!dU:  oi#R“r,5e*Ud7 RH{Ztm>~h?oЛgZ4M I$bǵбU5op|Ie-”(F̑2(zǼ8hX bq6 ,{#a?YsY7a,`["睉Kv Yj|2*#YZ4RYS&7%Db[MRӓG*z~ Wz}(!jj,3qrKd6}PE$bD#)E*uIG.]K^5EҨzےHՖ{MOc4R1]/-=9h`q=&d tI_ŧ> ¤;%JE9:3aq=$F\Хq[4󼟄LLHD O%&c[OG#|{VMPauxՖ'/wc+j"\ik4ܶ=C٥(g܂(e.m/ 'tozVmM|ZYr4Dn &H- /!hY_n2Y+j +̆z3m&\iΝ(5D7yJ$LIjQi$RUڦ\OM9eV$cIz#G-O ABt~ Q^UT7J=Kf8OBKc#oG+Ij2o!Hq46ŊeL%52KԓDiaCzR?:Ցoz$H0Of囡"u`ġtF~”=>/*dSf;/F@E?#a6l5śH,Qkaw+̷iGJ0_'n%BO:t\6⒦,>YZU uɗO3vbټh.=|_:A(A +fEINc#?3^n5D,"/^W|lP:zN{vLMh"?Ohuy"pH=἞fAT0 'uLIA348ig4xCQQ m/ L,-lЪ'mXıg s10nheZIqw{+M?(eL!;-yF.K㫅w zTĜ֠rplu2\=ͱe*z 8ROچ扫j@OCL8@ѪI<A$IBʐ*m6cz={_Z iRA@OuP 2dN}٧[6dۆCVmwmΌB cBd홭qٳ ʹCAL}(`^*p L U;ՓD @w:ZN6v&)&7>9'K: ]e!8Y:G މ\2UKJ$Br`&BFtYW>'YR߈J 0J_Oĭg}3Mʅ 8,/Kޜ_{ksbԳr=C}ؤz=T&}c$,%O㞎?4z%.bft24eg} pW8 'R/e7z}޻9O&2~9'Tf_ϸ7>蠿|xFR/7x~!tQJ^ߖd]ݽw3- .W!ѻwy*ޚ-y奫Ͱڝ h(S%}[:oi>g>Z{WhOxcD,YZp m  øIto+K*;ܱ'H RLL2Ngx匘YxVl͈FZygV&+DOPr?<.c9*Q&tE .τC'$ LVԢb$O})Eq}  q~p-yG͆N9 K9Ph{cBNh|Rbt"RUn0ݰ L(1I6Q]VPǘ <})Qw*/9_*ؠQIENDB`examples/widgets/dialogs/dialogs.pyproject000066400000000000000000000001521376617013100213520ustar00rootroot00000000000000{ "files": ["findfiles.py", "standarddialogs.py", "extension.py", "trivialwizard.py"] } examples/widgets/dialogs/extension.py000066400000000000000000000105721376617013100203640ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/dialogs/findfiles.py000066400000000000000000000177141376617013100203200ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/dialogs/standarddialogs.py000066400000000000000000000340201376617013100215050ustar00rootroot00000000000000 ############################################################################# ## ## 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 = "

Message boxes have a caption, a text, and up to three " \ "buttons, each with standard or custom texts.

" \ "

Click a button to close the message box. Pressing the Esc " \ "button will activate the detected escape button (if any).

" 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_()) examples/widgets/dialogs/trivialwizard.py000066400000000000000000000072001376617013100212350ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/draganddrop/000077500000000000000000000000001376617013100166345ustar00rootroot00000000000000examples/widgets/draganddrop/draggabletext/000077500000000000000000000000001376617013100214515ustar00rootroot00000000000000examples/widgets/draganddrop/draggabletext/draggabletext.py000066400000000000000000000123721376617013100246450ustar00rootroot00000000000000 ############################################################################# ## ## 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 class DragLabel(QLabel): def __init__(self, text, parent): super(DragLabel, self).__init__(text, parent) self.setAutoFillBackground(True) self.setFrameShape(QFrame.Panel) self.setFrameShadow(QFrame.Raised) def mousePressEvent(self, event): hotSpot = event.pos() mimeData = QMimeData() mimeData.setText(self.text()) mimeData.setData('application/x-hotspot', b'%d %d' % (hotSpot.x(), hotSpot.y())) pixmap = QPixmap(self.size()) self.render(pixmap) drag = QDrag(self) drag.setMimeData(mimeData) drag.setPixmap(pixmap) drag.setHotSpot(hotSpot) dropAction = drag.exec_(Qt.CopyAction | Qt.MoveAction, Qt.CopyAction) if dropAction == Qt.MoveAction: self.close() self.update() class DragWidget(QWidget): def __init__(self, parent=None): super(DragWidget, self).__init__(parent) dictionaryFile = QFile(':/dictionary/words.txt') dictionaryFile.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 if x >= 195: x = 5 y += wordLabel.height() + 2 newPalette = self.palette() newPalette.setColor(QPalette.Window, Qt.white) self.setPalette(newPalette) self.setAcceptDrops(True) self.setMinimumSize(400, max(200, y)) self.setWindowTitle("Draggable Text") def dragEnterEvent(self, event): if event.mimeData().hasText(): if event.source() in self.children(): event.setDropAction(Qt.MoveAction) event.accept() else: event.acceptProposedAction() else: event.ignore() def dropEvent(self, event): if event.mimeData().hasText(): mime = event.mimeData() pieces = mime.text().split() position = event.pos() hotSpot = QPoint() hotSpotPos = mime.data('application/x-hotspot').split(' ') if len(hotSpotPos) == 2: hotSpot.setX(hotSpotPos[0].toInt()[0]) hotSpot.setY(hotSpotPos[1].toInt()[0]) for piece in pieces: newLabel = DragLabel(piece, self) newLabel.move(position - hotSpot) newLabel.show() position += QPoint(newLabel.width(), 0) if event.source() in self.children(): event.setDropAction(Qt.MoveAction) event.accept() else: event.acceptProposedAction() else: event.ignore() if __name__ == '__main__': import sys app = QApplication(sys.argv) window = DragWidget() window.show() sys.exit(app.exec_()) examples/widgets/draganddrop/draggabletext/draggabletext.pyproject000066400000000000000000000001551376617013100262300ustar00rootroot00000000000000{ "files": ["draggabletext_rc.py", "words.txt", "draggabletext.qrc", "draggabletext.py"] } examples/widgets/draganddrop/draggabletext/draggabletext.qrc000066400000000000000000000001611376617013100247730ustar00rootroot00000000000000 words.txt examples/widgets/draganddrop/draggabletext/draggabletext_rc.py000066400000000000000000000025571376617013100253350ustar00rootroot00000000000000# 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\x00\xf7\ Q\ t\x0aQuarterly\x0ais\x0aa\ \x0apaper\x0abased\x0anew\ sletter\x0aexclusiv\ ely\x0aavailable\x0ato\ \x0aQt\x0acustomers\x0aEv\ ery\x0aquarter\x0awe\x0am\ ail\x0aout\x0aan\x0aissue\ \x0athat\x0awe\x0ahope\x0awi\ ll\x0abring\x0aadded\x0ai\ nsight\x0aand\x0apleas\ ure\x0ato\x0ayour\x0aQt\x0ap\ rogramming\x0awith\x0a\ high\x0aquality\x0atec\ hnical\x0aarticles\x0a\ written\x0aby\x0aQt\x0aex\ perts\x0a\ " qt_resource_name = b"\ \x00\x0a\ \x0b\x0b\x17\xd9\ \x00d\ \x00i\x00c\x00t\x00i\x00o\x00n\x00a\x00r\x00y\ \x00\x09\ \x08\xb6\xa74\ \x00w\ \x00o\x00r\x00d\x00s\x00.\x00t\x00x\x00t\ " 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\x1a\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ \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() examples/widgets/draganddrop/draggabletext/words.txt000066400000000000000000000003671376617013100233560ustar00rootroot00000000000000Qt Quarterly is a paper based newsletter exclusively available to Qt customers Every quarter we mail out an issue that we hope will bring added insight and pleasure to your Qt programming with high quality technical articles written by Qt experts examples/widgets/effects/000077500000000000000000000000001376617013100157665ustar00rootroot00000000000000examples/widgets/effects/effects.pyproject000066400000000000000000000000411376617013100213410ustar00rootroot00000000000000{ "files": ["lighting.py"] } examples/widgets/effects/lighting.py000066400000000000000000000120671376617013100201530ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/gallery/000077500000000000000000000000001376617013100160065ustar00rootroot00000000000000examples/widgets/gallery/gallery.pyproject000066400000000000000000000000611376617013100214030ustar00rootroot00000000000000{ "files": ["main.py", "widgetgallery.py"] } examples/widgets/gallery/main.py000066400000000000000000000045741376617013100173160ustar00rootroot00000000000000############################################################################# ## ## 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_()) examples/widgets/gallery/widgetgallery.py000066400000000000000000000375431376617013100212370ustar00rootroot00000000000000############################################################################# ## ## 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 * 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) POEM = """Twinkle, twinkle, little star, How I wonder what you are. Up above the world so high, Like a diamond in the sky. Twinkle, twinkle, little star, How I wonder what you arenot""" DIR_OPEN_ICON = ":/qt-project.org/styles/commonstyle/images/diropen-128.png" COMPUTER_ICON = ":/qt-project.org/styles/commonstyle/images/computer-32.png" SYSTEMINFO = """

Python

{}

Qt Build

{}

Operating System

{}

Screens

{} """ def class_name(o): return o.metaObject().className() 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) def launch_help(widget): """Launch a widget's help page""" url = help_url(class_name(widget).lower()) QDesktopServices.openUrl(url) def launch_module_help(): QDesktopServices.openUrl(help_url("qtwidgets-index")) def init_widget(w, name): """Init a widget for the gallery, give it a tooltip showing the class name""" w.setObjectName(name) w.setToolTip(class_name(w)) def style_names(): """Return a list of styles, default platform style first""" default_style_name = QApplication.style().objectName().lower() result = [] for style in QStyleFactory.keys(): if style.lower() == default_style_name: result.insert(0, style) else: result.append(style) return result def embed_into_hbox_layout(w, margin=5): """Embed a widget into a layout to give it a frame""" result = QWidget() layout = QHBoxLayout(result) layout.setContentsMargins(margin, margin, margin, margin) layout.addWidget(w) return result 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()) def screen_info(widget): """Format information on the screens""" policy = QGuiApplication.highDpiScaleFactorRoundingPolicy() policy_string = str(policy).split('.')[-1] result = "

High DPI scale factor rounding policy: {}

    ".format(policy_string) for screen in QGuiApplication.screens(): current = screen == widget.screen() result += "
  1. " if current: result += "" result += '"{}" {} {}DPI, DPR={}'.format(screen.name(), format_geometry(screen.geometry()), int(screen.logicalDotsPerInchX()), screen.devicePixelRatio()) if current: result += "" result += "
  2. " result += "
" return result class WidgetGallery(QDialog): """Dialog displaying a gallery of Qt Widgets""" def __init__(self): super(WidgetGallery, self).__init__() self._progress_bar = self.create_progress_bar() self._style_combobox = QComboBox() init_widget(self._style_combobox, "styleComboBox") self._style_combobox.addItems(style_names()) style_label = QLabel("Style:") init_widget(style_label, "style_label") style_label.setBuddy(self._style_combobox) help_label = QLabel("Press F1 over a widget to see Documentation") init_widget(help_label, "help_label") disable_widgets_checkbox = QCheckBox("Disable widgets") init_widget(disable_widgets_checkbox, "disable_widgets_checkbox") buttons_groupbox = self.create_buttons_groupbox() itemview_tabwidget = self.create_itemview_tabwidget() simple_input_widgets_groupbox = self.create_simple_inputwidgets_groupbox() text_toolbox = self.create_text_toolbox() self._style_combobox.textActivated.connect(self.change_style) disable_widgets_checkbox.toggled.connect(buttons_groupbox.setDisabled) disable_widgets_checkbox.toggled.connect(text_toolbox.setDisabled) disable_widgets_checkbox.toggled.connect(itemview_tabwidget.setDisabled) disable_widgets_checkbox.toggled.connect(simple_input_widgets_groupbox.setDisabled) help_shortcut = QShortcut(self) help_shortcut.setKey(QKeySequence.HelpContents) help_shortcut.activated.connect(self.help_on_current_widget) top_layout = QHBoxLayout() top_layout.addWidget(style_label) top_layout.addWidget(self._style_combobox) top_layout.addStretch(1) top_layout.addWidget(help_label) top_layout.addStretch(1) top_layout.addWidget(disable_widgets_checkbox) 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) main_layout = QGridLayout(self) main_layout.addLayout(top_layout, 0, 0, 1, 2) main_layout.addWidget(buttons_groupbox, 1, 0) main_layout.addWidget(simple_input_widgets_groupbox, 1, 1) main_layout.addWidget(itemview_tabwidget, 2, 0) main_layout.addWidget(text_toolbox, 2, 1) 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())) def setVisible(self, visible): super(WidgetGallery, self).setVisible(visible) if visible: self.windowHandle().screenChanged.connect(self.update_systeminfo) self.update_systeminfo() def change_style(self, style_name): QApplication.setStyle(QStyleFactory.create(style_name)) def advance_progressbar(self): cur_val = self._progress_bar.value() max_val = self._progress_bar.maximum() self._progress_bar.setValue(cur_val + (max_val - cur_val) / 100) def create_buttons_groupbox(self): result = QGroupBox("Buttons") init_widget(result, "buttons_groupbox") default_pushbutton = QPushButton("Default Push Button") init_widget(default_pushbutton, "default_pushbutton") default_pushbutton.setDefault(True) toggle_pushbutton = QPushButton("Toggle Push Button") init_widget(toggle_pushbutton, "toggle_pushbutton") toggle_pushbutton.setCheckable(True) toggle_pushbutton.setChecked(True) flat_pushbutton = QPushButton("Flat Push Button") init_widget(flat_pushbutton, "flat_pushbutton") flat_pushbutton.setFlat(True) toolbutton = QToolButton() init_widget(toolbutton, "toolButton") toolbutton.setText("Tool Button") menu_toolbutton = QToolButton() init_widget(menu_toolbutton, "menuButton") menu_toolbutton.setText("Menu Button") tool_menu = QMenu(menu_toolbutton) menu_toolbutton.setPopupMode(QToolButton.InstantPopup) tool_menu.addAction("Option") tool_menu.addSeparator() action = tool_menu.addAction("Checkable Option") action.setCheckable(True) menu_toolbutton.setMenu(tool_menu) tool_layout = QHBoxLayout() tool_layout.addWidget(toolbutton) tool_layout.addWidget(menu_toolbutton) commandlinkbutton = QCommandLinkButton("Command Link Button") init_widget(commandlinkbutton, "commandLinkButton") commandlinkbutton.setDescription("Description") button_layout = QVBoxLayout() button_layout.addWidget(default_pushbutton) button_layout.addWidget(toggle_pushbutton) button_layout.addWidget(flat_pushbutton) button_layout.addLayout(tool_layout) button_layout.addWidget(commandlinkbutton) button_layout.addStretch(1) radiobutton_1 = QRadioButton("Radio button 1") init_widget(radiobutton_1, "radioButton1") radiobutton_2 = QRadioButton("Radio button 2") init_widget(radiobutton_2, "radioButton2") radiobutton_3 = QRadioButton("Radio button 3") init_widget(radiobutton_3, "radioButton3") radiobutton_1.setChecked(True) checkbox = QCheckBox("Tri-state check box") init_widget(checkbox, "checkBox") 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) main_layout = QHBoxLayout(result) main_layout.addLayout(button_layout) main_layout.addLayout(checkableLayout) main_layout.addStretch() return result def create_text_toolbox(self): result = QToolBox() init_widget(result, "toolBox") # Create centered/italic HTML rich text rich_text = "" for line in POEM.split('\n'): rich_text += "
" + line + "
" rich_text += "
" text_edit = QTextEdit(rich_text) init_widget(text_edit, "textEdit") plain_textedit = QPlainTextEdit(POEM) init_widget(plain_textedit, "plainTextEdit") self._systeminfo_textbrowser = QTextBrowser() init_widget(self._systeminfo_textbrowser, "systemInfoTextBrowser") result.addItem(embed_into_hbox_layout(text_edit), "Text Edit") result.addItem(embed_into_hbox_layout(plain_textedit), "Plain Text Edit") result.addItem(embed_into_hbox_layout(self._systeminfo_textbrowser), "Text Browser") return result def create_itemview_tabwidget(self): result = QTabWidget() init_widget(result, "bottomLeftTabWidget") result.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Ignored) tree_view = QTreeView() init_widget(tree_view, "treeView") filesystem_model = QFileSystemModel(tree_view) filesystem_model.setRootPath(QDir.rootPath()) tree_view.setModel(filesystem_model) table_widget = QTableWidget() init_widget(table_widget, "tableWidget") table_widget.setRowCount(10) table_widget.setColumnCount(10) list_model = QStandardItemModel(0, 1, result) list_model.appendRow(QStandardItem(QIcon(DIR_OPEN_ICON), "Directory")) list_model.appendRow(QStandardItem(QIcon(COMPUTER_ICON), "Computer")) list_view = QListView() init_widget(list_view, "listView") list_view.setModel(list_model) icon_mode_listview = QListView() init_widget(icon_mode_listview, "iconModeListView") icon_mode_listview.setViewMode(QListView.IconMode) icon_mode_listview.setModel(list_model) result.addTab(embed_into_hbox_layout(tree_view), "Tree View") result.addTab(embed_into_hbox_layout(table_widget), "Table") result.addTab(embed_into_hbox_layout(list_view), "List") result.addTab(embed_into_hbox_layout(icon_mode_listview), "Icon Mode List") return result def create_simple_inputwidgets_groupbox(self): result = QGroupBox("Simple Input Widgets") init_widget(result, "bottomRightGroupBox") result.setCheckable(True) result.setChecked(True) lineedit = QLineEdit("s3cRe7") init_widget(lineedit, "lineEdit") lineedit.setClearButtonEnabled(True) lineedit.setEchoMode(QLineEdit.Password) spin_box = QSpinBox() init_widget(spin_box, "spinBox") spin_box.setValue(50) date_timeedit = QDateTimeEdit() init_widget(date_timeedit, "dateTimeEdit") date_timeedit.setDateTime(QDateTime.currentDateTime()) slider = QSlider() init_widget(slider, "slider") slider.setOrientation(Qt.Horizontal) slider.setValue(40) scrollbar = QScrollBar() init_widget(scrollbar, "scrollBar") scrollbar.setOrientation(Qt.Horizontal) scrollbar.setValue(60) dial = QDial() init_widget(dial, "dial") dial.setValue(30) dial.setNotchesVisible(True) layout = QGridLayout(result) layout.addWidget(lineedit, 0, 0, 1, 2) layout.addWidget(spin_box, 1, 0, 1, 2) layout.addWidget(date_timeedit, 2, 0, 1, 2) layout.addWidget(slider, 3, 0) layout.addWidget(scrollbar, 4, 0) layout.addWidget(dial, 3, 1, 2, 1) layout.setRowStretch(5, 1) return result def create_progress_bar(self): result = QProgressBar() init_widget(result, "progressBar") result.setRange(0, 10000) result.setValue(0) timer = QTimer(self) timer.timeout.connect(self.advance_progressbar) timer.start(1000) return result def update_systeminfo(self): """Display system information""" system_info = SYSTEMINFO.format(sys.version, QLibraryInfo.build(), QSysInfo.prettyProductName(), screen_info(self)) self._systeminfo_textbrowser.setHtml(system_info) def help_on_current_widget(self): """Display help on widget under mouse""" w = QApplication.widgetAt(QCursor.pos(self.screen())) while w: # Skip over internal widgets name = w.objectName() if name and not name.startswith("qt_"): launch_help(w) break w = w.parentWidget() examples/widgets/graphicsview/000077500000000000000000000000001376617013100170425ustar00rootroot00000000000000examples/widgets/graphicsview/anchorlayout.py000066400000000000000000000116231376617013100221270ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/graphicsview/collidingmice/000077500000000000000000000000001376617013100216445ustar00rootroot00000000000000examples/widgets/graphicsview/collidingmice/collidingmice.py000066400000000000000000000177171376617013100250350ustar00rootroot00000000000000 ############################################################################# ## ## 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 import mice_rc def random(boundary): return QtCore.QRandomGenerator.global_().bounded(boundary) class Mouse(QtWidgets.QGraphicsItem): Pi = math.pi TwoPi = 2.0 * Pi # Create the bounding rectangle once. adjust = 0.5 BoundingRect = QtCore.QRectF(-20 - adjust, -22 - adjust, 40 + adjust, 83 + adjust) def __init__(self): super(Mouse, self).__init__() self.angle = 0.0 self.speed = 0.0 self.mouseEyeDirection = 0.0 self.color = QtGui.QColor(random(256), random(256), random(256)) self.setTransform(QtGui.QTransform().rotate(random(360 * 16))) # 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) @staticmethod def normalizeAngle(angle): while angle < 0: angle += Mouse.TwoPi while angle > Mouse.TwoPi: angle -= Mouse.TwoPi return angle def boundingRect(self): return Mouse.BoundingRect def shape(self): path = QtGui.QPainterPath() path.addRect(-10, -20, 20, 40) return path def paint(self, painter, option, widget): # Body. painter.setBrush(self.color) painter.drawEllipse(-10, -20, 20, 40) # Eyes. painter.setBrush(QtCore.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)) # Pupils. painter.drawEllipse(QtCore.QRectF(-8.0 + self.mouseEyeDirection, -17, 4, 4)) painter.drawEllipse(QtCore.QRectF(4.0 + self.mouseEyeDirection, -17, 4, 4)) # Ears. if self.scene().collidingItems(self): painter.setBrush(QtCore.Qt.red) else: painter.setBrush(QtCore.Qt.darkYellow) painter.drawEllipse(-17, -12, 16, 16) painter.drawEllipse(1, -12, 16, 16) # Tail. path = QtGui.QPainterPath(QtCore.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.drawPath(path) def timerEvent(self): # 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: # 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): # Rotate right. 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)])) for item in dangerMice: 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) if angleToMouse >= 0 and angleToMouse < Mouse.Pi / 2: # Rotate right. self.angle += 0.5 elif angleToMouse <= Mouse.TwoPi and angleToMouse > (Mouse.TwoPi - 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 += random(100) / 500.0 else: self.angle -= random(100) / 500.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.setPos(self.mapToParent(0, -(3 + math.sin(self.speed) * 3))) if __name__ == '__main__': import sys MouseCount = 7 app = QtWidgets.QApplication(sys.argv) scene = QtWidgets.QGraphicsScene() scene.setSceneRect(-300, -300, 600, 600) scene.setItemIndexMethod(QtWidgets.QGraphicsScene.NoIndex) for i in range(MouseCount): mouse = Mouse() mouse.setPos(math.sin((i * 6.28) / MouseCount) * 200, math.cos((i * 6.28) / MouseCount) * 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.setWindowTitle("Colliding Mice") view.resize(400, 300) view.show() sys.exit(app.exec_()) examples/widgets/graphicsview/collidingmice/collidingmice.pyproject000066400000000000000000000000641376617013100264070ustar00rootroot00000000000000{ "files": ["collidingmice.py", "mice_rc.py"] } examples/widgets/graphicsview/collidingmice/mice_rc.py000066400000000000000000000361551376617013100236310ustar00rootroot00000000000000# -*- 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$ ## ############################################################################# # Resource object code # # Created: Fri Jul 30 17:52:15 2010 # by: The Resource Compiler for PySide (Qt v4.6.2) # # WARNING! All changes made in this file will be lost! from PySide2 import QtCore qt_resource_data = b"\ \x00\x00\x0b\xd5\ \xff\ \xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x02\x01\x00\x48\x00\ \x48\x00\x00\xff\xee\x00\x0e\x41\x64\x6f\x62\x65\x00\x64\x40\x00\ \x00\x00\x01\xff\xdb\x00\x84\x00\x02\x02\x02\x02\x02\x02\x02\x02\ \x02\x02\x03\x02\x02\x02\x03\x04\x03\x02\x02\x03\x04\x05\x04\x04\ \x04\x04\x04\x05\x06\x05\x05\x05\x05\x05\x05\x06\x06\x07\x07\x08\ \x07\x07\x06\x09\x09\x0a\x0a\x09\x09\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ \x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x01\x03\x03\x03\x05\x04\x05\x09\ \x06\x06\x09\x0d\x0a\x09\x0a\x0d\x0f\x0e\x0e\x0e\x0e\x0f\x0f\x0c\ \x0c\x0c\x0c\x0c\x0f\x0f\x0c\x0c\x0c\x0c\x0c\x0c\x0f\x0c\x0c\x0c\ \x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\ \x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\xff\xc0\x00\x11\x08\x00\x5e\ \x00\x5e\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01\xff\xdd\x00\x04\ \x00\x0c\xff\xc4\x01\xa2\x00\x00\x00\x07\x01\x01\x01\x01\x01\x00\ \x00\x00\x00\x00\x00\x00\x00\x04\x05\x03\x02\x06\x01\x00\x07\x08\ \x09\x0a\x0b\x01\x00\x02\x02\x03\x01\x01\x01\x01\x01\x00\x00\x00\ \x00\x00\x00\x00\x01\x00\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\ \x10\x00\x02\x01\x03\x03\x02\x04\x02\x06\x07\x03\x04\x02\x06\x02\ \x73\x01\x02\x03\x11\x04\x00\x05\x21\x12\x31\x41\x51\x06\x13\x61\ \x22\x71\x81\x14\x32\x91\xa1\x07\x15\xb1\x42\x23\xc1\x52\xd1\xe1\ \x33\x16\x62\xf0\x24\x72\x82\xf1\x25\x43\x34\x53\x92\xa2\xb2\x63\ \x73\xc2\x35\x44\x27\x93\xa3\xb3\x36\x17\x54\x64\x74\xc3\xd2\xe2\ \x08\x26\x83\x09\x0a\x18\x19\x84\x94\x45\x46\xa4\xb4\x56\xd3\x55\ \x28\x1a\xf2\xe3\xf3\xc4\xd4\xe4\xf4\x65\x75\x85\x95\xa5\xb5\xc5\ \xd5\xe5\xf5\x66\x76\x86\x96\xa6\xb6\xc6\xd6\xe6\xf6\x37\x47\x57\ \x67\x77\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x38\x48\x58\x68\x78\x88\ \x98\xa8\xb8\xc8\xd8\xe8\xf8\x29\x39\x49\x59\x69\x79\x89\x99\xa9\ \xb9\xc9\xd9\xe9\xf9\x2a\x3a\x4a\x5a\x6a\x7a\x8a\x9a\xaa\xba\xca\ \xda\xea\xfa\x11\x00\x02\x02\x01\x02\x03\x05\x05\x04\x05\x06\x04\ \x08\x03\x03\x6d\x01\x00\x02\x11\x03\x04\x21\x12\x31\x41\x05\x51\ \x13\x61\x22\x06\x71\x81\x91\x32\xa1\xb1\xf0\x14\xc1\xd1\xe1\x23\ \x42\x15\x52\x62\x72\xf1\x33\x24\x34\x43\x82\x16\x92\x53\x25\xa2\ \x63\xb2\xc2\x07\x73\xd2\x35\xe2\x44\x83\x17\x54\x93\x08\x09\x0a\ \x18\x19\x26\x36\x45\x1a\x27\x64\x74\x55\x37\xf2\xa3\xb3\xc3\x28\ \x29\xd3\xe3\xf3\x84\x94\xa4\xb4\xc4\xd4\xe4\xf4\x65\x75\x85\x95\ \xa5\xb5\xc5\xd5\xe5\xf5\x46\x56\x66\x76\x86\x96\xa6\xb6\xc6\xd6\ \xe6\xf6\x47\x57\x67\x77\x87\x97\xa7\xb7\xc7\xd7\xe7\xf7\x38\x48\ \x58\x68\x78\x88\x98\xa8\xb8\xc8\xd8\xe8\xf8\x39\x49\x59\x69\x79\ \x89\x99\xa9\xb9\xc9\xd9\xe9\xf9\x2a\x3a\x4a\x5a\x6a\x7a\x8a\x9a\ \xaa\xba\xca\xda\xea\xfa\xff\xda\x00\x0c\x03\x01\x00\x02\x11\x03\ \x11\x00\x3f\x00\xfb\x41\xd3\x6f\xa2\x87\xc7\x3c\x37\x89\xe9\xd4\ \xe9\xe2\x6b\x90\x29\x6e\xa3\x72\x4d\x0d\x0f\x8f\xf0\xc8\x82\xa5\ \xb2\x41\x5a\x86\xfa\x46\xf9\x22\x37\x50\xa6\x63\xe5\xe2\x76\xf9\ \x60\xe4\x95\xc1\x48\xd8\x74\x3d\x46\x0b\x56\xa4\x9a\x18\x14\x31\ \x60\xa4\xec\x6b\xe3\x92\x1b\xa0\xac\x49\x92\x51\x1b\x02\xad\xc8\ \x91\xb7\xea\xc2\x84\x34\xaf\xc5\x8e\xfb\x77\xc9\x81\x6c\x49\x62\ \x3a\xaf\x9e\x3c\xbf\xa3\xcc\x6d\xee\xef\x2b\x38\x34\x68\x61\x1e\ \xa3\x03\xfe\x55\x36\x1f\x7e\x3c\x51\x09\x11\x94\x91\xfa\x47\x9a\ \xb4\x9d\x6e\xa9\x61\x75\xce\x50\x2a\x60\x70\x51\xe9\xec\x0f\x5f\ \xa3\x11\x38\xc8\xd2\x0c\x65\x16\x48\x25\x3c\x5b\x7f\x0c\x4c\x37\ \x5e\x2d\x9f\xff\xd0\xfb\x3a\xfb\x0a\xee\x4d\x6b\x4c\xf0\xb0\x1e\ \xa1\x6f\x2d\xfa\x6e\x71\x21\x34\xb8\x11\x5e\x9b\xe4\x50\xd3\x53\ \xa7\x8e\xe7\x25\x6a\xda\xd0\xee\x48\x03\xc7\x04\x95\x4e\x59\x12\ \x15\x2e\xce\x02\x81\x52\x7e\x59\x00\x2d\x2f\x9c\xbf\x36\xbc\xc7\ \xa8\x98\xa5\x5d\x1f\xce\x9a\x7e\x8f\x67\x14\x6c\xb7\x36\xf1\xd5\ \xef\x5d\xc8\x20\x08\xe8\x0f\x1a\xd7\xae\xc4\x65\xb8\xf2\x00\x6a\ \x89\xfb\x99\xc6\x16\x37\x67\x9f\x93\xcf\xa8\xdc\xf9\x2a\xda\xe2\ \xfe\x49\xa6\x9d\xee\x65\x58\xee\x2e\x09\x77\x68\xd4\x2d\x0d\x4e\ \xf5\xa9\x3d\x72\x73\x02\xb8\xbb\xda\xe5\xb4\xa9\x96\xf9\xa2\x6b\ \x8b\x2d\x12\xfa\xea\xdc\x11\x3d\x38\x44\x47\x50\x5b\x6a\xfd\x19\ \x5c\xe5\x51\xd9\x61\x1e\x29\x51\x7c\xdf\x17\x97\xda\xf2\x43\x35\ \xc2\x16\x66\x35\x24\xd4\xd0\x93\x95\x44\x97\x22\x42\x99\x5e\x9b\ \xa3\x5c\xe9\x77\x56\xd7\x56\xfc\x97\x83\x06\x53\x4e\x84\x65\x73\ \xca\x8e\x0b\x7b\xbf\xac\x46\x9e\x2f\x3d\x3d\xcc\x3e\xa7\xa7\xef\ \x4e\x9f\x7e\x65\xf8\x9e\x9e\x2f\x27\x13\x87\x7a\x7f\xff\xd1\xfb\ \x3f\x4a\xed\xd4\xf6\xcf\x0b\xa7\xa8\x51\x79\x15\x3f\xd6\x3d\xb0\ \x88\x71\x2d\xd2\x81\x9a\x84\x16\x6a\x7b\x64\xbc\x26\x06\x61\xc6\ \x70\x4a\x91\x4a\x74\x22\x98\xf8\x74\x8e\x30\x55\xd4\x87\x07\x6e\ \xdb\x8c\x8f\x0b\x3b\x40\xde\xda\x0b\x88\x9a\x16\x62\x12\x4a\x83\ \xc4\xd1\xa8\x7c\x0e\xf9\x20\x05\xee\xac\x15\xbf\x2b\x7c\xb5\x3d\ \xe0\xbb\x9e\x59\x1b\xe2\xe4\xc8\x62\x42\xff\x00\x21\x25\x4f\xdf\ \xc7\x2c\x88\xc5\xd6\xfd\xcc\xbc\x49\x8e\x54\xf4\x6b\x2b\x5b\x2d\ \x3a\xd6\x1b\x2b\x0b\x65\xb6\xb4\x80\x11\x1c\x29\xfe\x51\xab\x13\ \xee\x4e\xe7\x21\x96\x7c\x67\x95\x00\xc0\x0e\xa7\x9a\xdd\x4e\xca\ \x3d\x4e\xc2\xe6\xcd\xb6\x12\x80\x50\x9e\xcc\x37\x15\xca\xc4\x44\ \xbd\x27\xab\x21\x23\x13\x61\x85\x69\xbe\x5c\x92\xdd\xbd\x3b\x8b\ \x76\x4a\x1d\xd5\xc6\xff\x00\xdb\x98\xd9\x23\x2c\x47\x84\xb9\x3c\ \x42\x7b\xb2\xdf\xd0\x29\x38\x58\x91\x15\x55\x57\x76\x3f\x65\x47\ \x72\x4f\xb6\x47\x06\x9a\x59\x32\xd0\x3b\x75\x3d\xc1\xae\x79\xc4\ \x42\x61\xe9\xdb\x95\x16\xf4\xff\x00\x47\x54\xf4\xf9\x53\xf6\x69\ \xc7\x95\x3f\x1c\xd8\xdc\x38\xab\xf8\x7f\x43\x8b\x52\xab\xea\xff\ \x00\xff\xd2\xfb\x3e\x0f\x2d\x80\xa9\xcf\x0a\xb7\xa8\x4a\x2f\xe7\ \x8e\xda\x39\xee\x66\x71\x1c\x50\x21\x79\x1c\xf4\x01\x45\x49\x39\ \x7c\x48\x02\xcb\x59\xb2\x68\x3e\x52\xf3\x27\xe6\x7f\x9a\xf5\x4b\ \xe9\x62\xd0\x49\xd3\x6c\x51\x88\x8d\xd2\x9e\xab\x81\xdd\x9c\x83\ \xd7\xc0\x65\x3e\x29\x9f\x5a\x72\x23\x86\x31\xe7\xba\x71\xe5\x5f\ \x3e\x79\xa2\xd6\xee\x08\xf5\x8b\x87\xbe\xb5\x94\x81\x22\x4c\x01\ \x60\x0f\x52\xac\x05\x76\xf7\xc8\x1c\x86\x06\xed\x12\xc4\x25\xc8\ \x53\xe9\x9b\x49\x96\x45\x8a\x68\xdb\x9c\x52\x85\x64\x61\xd0\xa9\ \x1b\x66\x41\x20\x8b\x0e\x3c\x6c\x1a\x4c\x4d\x08\x3b\x74\x39\x53\ \x6a\xd0\xb4\xad\x0d\x3d\xb0\x5a\xb7\xb8\x20\x56\x83\x1b\x55\xe2\ \x4e\x3d\x45\x6a\x30\x91\x6a\xa1\x15\xed\xd4\x44\x8a\x2c\xb1\x8f\ \xb0\x8e\xa1\xa9\xf2\xae\xf9\x31\x9a\x63\x6d\x8f\xbc\x02\xd6\x60\ \x3d\xcb\xa4\xbc\xbc\xb9\xf8\x5d\xb8\x45\xfc\x8a\x02\x83\xf3\x00\ \x63\x3c\xb2\x90\xa3\xb0\xee\x00\x01\xf6\x2c\x71\x81\xc9\xc6\x36\ \xe2\x14\x1d\x89\xf8\xbe\xef\xeb\x95\x58\x6c\xa7\xff\xd3\xfb\x3c\ \xa4\x0e\x9b\x30\xf0\xcf\x07\xb7\xa9\x48\xfc\xc9\x66\xf7\xbe\x5f\ \xd6\xe0\x88\x16\x96\x58\x1b\x8a\x8e\xa4\x0a\x13\xf8\x64\xc8\x33\ \x89\x01\x61\xb4\xc1\x2f\x9e\x34\x6f\x29\x2b\x86\x01\x0a\x90\x76\ \x04\x6f\x53\x98\xd0\x90\xe4\x79\xb9\x99\x3c\x99\xef\xf8\x20\x08\ \x22\x67\x00\x48\xa7\x96\xc3\x31\x67\x9a\xe7\xc3\xd1\x63\x10\x05\ \xbd\x3f\x46\xb2\x7b\x4d\x26\xc6\x19\x3e\xd8\x5a\xa8\x3d\x81\x35\ \x19\xb5\x84\x0c\x31\x80\x7b\x9d\x7c\x88\x33\x34\x9b\x00\x6a\x7a\ \xef\x4e\x4d\xef\xed\x90\x3c\x99\x86\xb8\x35\x09\x00\x91\x5a\x57\ \xb7\xcb\x10\x0f\x35\xb5\x8c\xac\x0d\x6b\x81\x2d\xa9\xad\x01\xf0\ \x39\x24\x2e\xe3\x4e\x84\x0f\x0e\xf8\x15\x7d\x48\x1e\x07\x25\x41\ \x5d\xc8\xd4\xf8\xf8\xd7\x23\x4a\xff\x00\xff\xd4\xfb\x43\xc9\x29\ \xd8\x1c\xf0\x7a\x7a\x85\x1e\x7f\x1f\x7a\x74\x20\xf4\xc9\xc4\xf0\ \x9b\x1c\xd4\x8b\x4b\xad\xb4\x7d\x14\x4e\xed\x0c\xbf\x55\x94\xb1\ \x66\x8e\x5a\x94\xff\x00\x60\xc0\x7e\x07\x27\x9b\x06\x3c\xfb\xc6\ \x5c\x27\xb8\xdd\x7c\x08\xfd\x2b\x1c\xd2\x86\xc4\x5a\x7f\x27\xe8\ \xab\x60\xbe\xa4\xab\x78\xca\x28\x21\x8c\x1a\x13\xdb\x93\x35\x36\ \xc4\x69\xf1\x42\x62\x52\x90\xc9\x5d\x22\x0e\xfe\xf2\x40\x6a\xf1\ \x72\x4f\x90\xaf\x34\x2a\xb3\xdc\xb9\x9d\xf8\xaa\xb1\x3c\x40\xd8\ \x7c\x80\xf0\x18\x72\xe4\x96\x42\x65\x2e\x65\x94\x00\x88\xa0\xaa\ \x40\x3f\x3e\x94\xca\x3a\x33\x73\x31\x20\x06\xdc\x2e\xca\xb5\xfd\ \x58\x6c\xf5\x45\x21\xdc\x6f\xb0\x26\xa7\x14\xac\x0a\x7a\xd7\xe5\ \x8a\x55\x14\x13\xd0\xf6\xeb\x8d\xa1\x7d\x09\x34\x1d\xf0\xda\xb8\ \xc4\x79\xaa\x72\x52\x4f\x5d\xf6\x1f\x4f\x4c\x3c\x3b\xd5\xa3\x89\ \xff\xd5\xfb\x38\xc0\xd6\xa3\xae\x78\x5d\xbd\x42\x93\x47\x5e\x84\ \xd7\xb9\xc4\x2a\x80\xb7\x5d\xd9\xb6\x35\xdb\xc4\xe2\x00\x28\x56\ \x48\xa0\x5f\x89\xba\xf8\x9d\xf2\x44\x1e\x8c\x78\x82\x36\xaa\x63\ \xa2\x80\x05\x36\x23\x23\xcd\x92\x9f\xa8\x54\x7c\x40\x9d\xfa\xe2\ \x60\x96\xea\x5c\xf1\x14\x1f\x3d\xce\x42\x92\xba\xaa\x2a\xa4\xd7\ \xdf\x0f\x0a\x16\x54\x03\x4a\x54\x7b\x63\x4a\xbb\x9d\x77\x51\xb7\ \x6c\x95\x2a\xe0\x6b\xfe\x4b\x78\x64\x24\x15\xdb\xd4\x6f\xf4\x60\ \x57\xff\xd6\xfb\x3d\x51\xd7\x7f\x96\x78\x53\xd4\x2f\x24\x71\x24\ \x6c\x69\xd3\x01\xd9\x52\x8d\x6e\x4b\x8b\x7d\x1b\x51\xbb\xb3\xa1\ \xba\x86\x12\x6d\xc1\x1b\x06\x62\x00\x34\xf6\xad\x72\x32\x91\x11\ \x24\x26\x31\x12\x90\x05\xe2\xba\x66\x87\xe6\x68\xee\x06\xaa\x35\ \x3b\xc9\xae\x39\x09\x24\x32\x48\xc5\x18\x1e\xa2\x84\xd2\x9e\xd8\ \x80\x40\x07\xab\x74\xa2\x39\x3d\xe2\xd4\xb9\x86\x27\x91\x78\x34\ \x88\xae\xc9\xe0\x58\x54\x8c\xc8\xc9\xb5\x17\x16\x2a\xc6\x87\xae\ \xf4\x34\xca\xec\xb3\x52\x63\xc7\x7a\x6e\x7b\xe2\x16\xd4\x4c\xbd\ \x87\x5c\xb0\x06\x04\xb4\x26\x00\xd0\xb6\xfe\x03\x1e\x04\x71\xaf\ \xf5\x96\x94\xaf\xd1\x80\xc1\x22\x6a\xab\x29\x24\x50\x8e\xbb\xe4\ \x08\xa6\x56\xa6\x25\x23\x9a\x92\x79\x12\x29\x91\xa5\x7f\xff\xd7\ \xfb\x3b\xd0\x50\x1a\x0f\xc7\x3c\x2a\xde\xa1\x50\x50\xfb\xf5\xc4\ \xab\xa4\x55\x28\x41\x5e\x4a\xc0\x86\x53\xd0\x82\x28\x41\xc6\x04\ \x83\x61\x05\x0f\x6e\xf6\xd1\x47\xe9\xc3\x61\x46\xaf\xd9\x67\xe4\ \x83\xe8\xa5\x4f\xdf\x99\x7e\x2e\x21\xbf\x0e\xfe\xfd\xbf\x1f\x16\ \x24\x4c\xf5\x54\x53\x23\x33\x99\x00\x24\xb6\xd4\x1e\xd9\x8b\x93\ \x27\x19\xbe\xac\x80\xa6\x85\x6a\x46\xd5\x34\x60\xbd\xc7\xcf\x01\ \xe4\x94\x35\xc1\x22\x83\xb9\xe9\x92\xc7\xbb\x19\x30\x2f\x38\xf9\ \xc2\xc7\xca\x76\x42\x7b\xa0\xd3\x5c\x4b\x51\x6d\x6a\x86\x8d\x21\ \x1d\x6a\x7f\x65\x45\x7a\xe5\xb2\x98\x80\xf3\x63\x08\x19\x97\xcf\ \xf2\xfe\x73\xf9\xa6\xe6\xea\x96\x91\x43\x6b\x6b\x5f\x86\x31\x0f\ \x30\x07\xbb\x31\xa9\xca\x8c\xe6\x7a\xb7\x8c\x31\x0f\x52\xf2\x6f\ \xe6\x3c\xfa\xc4\xf1\x58\xea\xf0\xa4\x72\xcc\x42\xc5\x73\x10\x2a\ \x39\x1e\x81\x94\x93\x4a\xf8\x8c\x11\xcc\x41\xa9\x35\xcf\x10\xab\ \x0f\x64\x8d\x8a\xb0\x27\xa5\x77\x19\x74\xe3\xb3\x54\x64\x8d\xf4\ \x96\xb5\xed\x4e\x99\x8e\xdc\xff\x00\xff\xd0\xfb\x34\xca\xdb\x1e\ \xfd\xc6\x78\x43\xd4\xb6\x8c\x41\x5a\x91\xd6\xa7\x24\x82\xa8\x4f\ \x26\x00\x12\x40\xaf\xb0\xdb\x02\xaf\xf8\x54\x6f\x40\x72\x2a\xb4\ \x02\xcd\x55\x0d\x41\xd4\xf8\x7b\xe2\x02\x57\x15\xa7\x41\xd7\xae\ \x1e\x88\x43\xbc\x6d\x2b\x2d\x0d\x46\xe3\x6c\xb3\x19\x63\x37\xcb\ \xbf\x99\xb6\x37\x3a\x8f\x9a\x65\x88\x82\xd6\xd6\xa1\x62\x44\xeb\ \x40\x00\x3f\x89\x39\x8b\x92\x77\x37\x37\x0c\x00\xc6\x12\x4b\x1f\ \x2c\x8a\x46\x1a\x1d\x9b\x75\xf0\xcb\x2c\xc4\x30\x20\x5b\x21\x87\ \xcb\x32\x59\xdc\x45\x3c\x51\xb2\x0d\x89\xa7\x6a\x66\x2c\xf3\x71\ \x36\x08\x3e\x85\xd2\x7d\x5b\x8d\x2e\xd2\x69\x7f\xbd\x31\x81\x21\ \xf1\x23\xbe\x6c\x71\x4a\xf1\x82\x5d\x7c\xc5\x4a\x93\x7e\x27\xd3\ \xfa\x32\xbe\xad\x8f\xff\xd1\xfb\x39\x2d\x06\xfc\x4e\x78\x43\xd4\ \x30\x2f\x32\x6b\x5e\x65\xb0\xd4\xf4\xfb\x2d\x0b\x46\x8b\x51\x8a\ \x78\xda\x7b\xb9\xa6\x76\x50\x15\x5b\x8f\x08\xf8\xfe\xd6\xd5\xa9\ \xf6\xc6\x79\x04\x06\xec\xa3\x8c\xcb\xab\x3f\xb5\x76\x78\x91\x9d\ \x0a\x3d\x01\x74\x3d\x41\x22\xb4\x3e\xe3\x24\x46\xec\x02\xb9\x41\ \xb9\x1d\x70\x14\xb6\xa0\x70\x55\x0c\x76\xdf\x7f\xd7\x86\x90\xef\ \x87\xa7\x8f\x51\x80\xec\x97\x72\xe2\x00\x34\xc3\x19\x20\x87\x99\ \x79\xc3\xcb\x6b\x75\xa8\x26\xab\x14\x6c\xde\xb5\x04\xe5\x77\x2a\ \xe0\x01\x53\xec\x72\x59\xf4\xfc\x51\xe3\x8f\xc7\xcb\xf6\x16\xec\ \x19\xab\xd2\x51\x5a\x46\x86\x84\xa7\xab\x0e\xe2\x82\x94\xa8\xda\ \x9e\x1f\x2c\xc0\xe3\x32\x3c\x37\xbb\x71\xa1\xbb\x27\x6d\x01\xae\ \x5c\x45\x14\x7c\x98\xec\x06\xd4\x1f\x4f\x86\x43\x49\xa3\x9e\x4c\ \xfc\x11\xde\xcf\xf6\xb0\xc9\xa9\x88\x8d\x94\xcf\xd2\x8a\x08\xe2\ \xb4\x82\x8f\x1d\xba\x88\xc3\xff\x00\x37\x11\xc4\x9f\xa6\x99\xb8\ \xcd\xc1\x13\xc3\x0e\x43\x6f\x96\xdf\x6f\x37\x06\x16\x77\x3d\x55\ \x39\x1a\xd3\x8f\x4d\xa9\x98\xf6\xdd\x4f\xff\xd2\xfb\x3c\x69\xc8\ \xf5\x23\xbe\x78\x4e\xcf\x50\xd0\xe4\x5c\x7a\x5e\xa2\xb5\x0e\xc9\ \xe1\xf4\x54\xe4\xa3\x7d\x11\x2a\xea\xbd\x00\xe3\x50\x41\xf6\xc8\ \xa5\x78\xe7\xe1\x51\xf4\x62\x50\xb8\xd6\x83\xae\x05\x51\x25\xb9\ \x8a\x83\xf3\xed\x85\x2b\x8f\x2a\x0c\x21\x0e\x53\x74\x18\x9b\x55\ \xe4\xc3\xed\x03\x4e\x05\x7b\xf2\xe5\xb5\x3e\x79\x93\xa7\x39\x2f\ \xd1\xf1\xee\xf8\xf4\x61\x3e\x1a\xdd\x5e\xda\xea\xdc\x90\x65\xd3\ \x14\x4c\x2b\xc8\x24\xd4\x42\x7c\x77\xe4\x47\xdf\x95\x9c\xda\x7e\ \x2b\x9e\x3b\x3b\xdd\x48\x81\xfa\x7e\xc2\x89\x47\x2d\x7d\x5b\x7b\ \x95\x27\x9f\x50\x96\x29\xbe\xa9\x64\x96\xd6\xe1\x7f\x7d\xe9\xba\ \xbb\xf1\xef\x53\xca\xb4\xf1\xa0\xc9\xe3\x99\x9c\x25\xe1\x44\x46\ \x35\xbd\x6f\x2a\xeb\x77\xbf\xbe\x80\x0d\x62\x20\x11\xc4\x49\x3e\ \x69\x64\x03\xe2\x1c\x8f\xc5\xe1\x94\x1a\xa7\x21\x19\xf0\xd4\x65\ \x69\x7f\xff\xd9\ " qt_resource_name = b"\ \x00\x06\ \x07\x03\x7d\xc3\ \x00\x69\ \x00\x6d\x00\x61\x00\x67\x00\x65\x00\x73\ \x00\x0a\ \x0c\x9d\x6c\x07\ \x00\x63\ \x00\x68\x00\x65\x00\x65\x00\x73\x00\x65\x00\x2e\x00\x6a\x00\x70\x00\x67\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x02\ \x00\x00\x00\x12\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ " def qInitResources(): QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() examples/widgets/graphicsview/diagramscene/000077500000000000000000000000001376617013100214645ustar00rootroot00000000000000examples/widgets/graphicsview/diagramscene/diagramscene.py000066400000000000000000000766161376617013100245000ustar00rootroot00000000000000 ############################################################################# ## ## 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 import diagramscene_rc class Arrow(QtWidgets.QGraphicsLineItem): def __init__(self, startItem, endItem, parent=None, scene=None): super(Arrow, self).__init__(parent, scene) self.arrowHead = QtGui.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)) def setColor(self, color): self.myColor = color def startItem(self): return self.myStartItem def endItem(self): return self.myEndItem 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) def shape(self): path = super(Arrow, self).shape() path.addPolygon(self.arrowHead) return path def updatePosition(self): line = QtCore.QLineF(self.mapFromItem(self.myStartItem, 0, 0), self.mapFromItem(self.myEndItem, 0, 0)) self.setLine(line) def paint(self, painter, option, widget=None): if (self.myStartItem.collidesWithItem(self.myEndItem)): 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: break p1 = p2 self.setLine(QtCore.QLineF(intersectPoint, myStartItem.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) self.arrowHead.clear() for point in [line.p1(), arrowP1, arrowP2]: self.arrowHead.append(point) painter.drawLine(line) painter.drawPolygon(self.arrowHead) 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) class DiagramTextItem(QtWidgets.QGraphicsTextItem): lostFocus = QtCore.Signal(QtWidgets.QGraphicsTextItem) selectedChange = QtCore.Signal(QtWidgets.QGraphicsItem) def __init__(self, parent=None, scene=None): super(DiagramTextItem, self).__init__(parent, scene) self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable) self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable) def itemChange(self, change, value): if change == QtWidgets.QGraphicsItem.ItemSelectedChange: self.selectedChange.emit(self) return value def focusOutEvent(self, event): self.setTextInteractionFlags(QtCore.Qt.NoTextInteraction) self.lostFocus.emit(self) super(DiagramTextItem, self).focusOutEvent(event) def mouseDoubleClickEvent(self, event): if self.textInteractionFlags() == QtCore.Qt.NoTextInteraction: self.setTextInteractionFlags(QtCore.Qt.TextEditorInteraction) super(DiagramTextItem, self).mouseDoubleClickEvent(event) class DiagramItem(QtWidgets.QGraphicsPolygonItem): Step, Conditional, StartEnd, Io = range(4) def __init__(self, diagramType, contextMenu, parent=None, scene=None): super(DiagramItem, self).__init__(parent, scene) self.arrows = [] self.diagramType = diagramType self.myContextMenu = contextMenu path = QtGui.QPainterPath() if self.diagramType == 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)]) 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.setPolygon(self.myPolygon) self.setFlag(QtWidgets.QGraphicsItem.ItemIsMovable, True) self.setFlag(QtWidgets.QGraphicsItem.ItemIsSelectable, True) def removeArrow(self, arrow): try: self.arrows.remove(arrow) except ValueError: pass def removeArrows(self): for arrow in self.arrows[:]: arrow.startItem().removeArrow(arrow) arrow.endItem().removeArrow(arrow) self.scene().removeItem(arrow) def addArrow(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) return pixmap def contextMenuEvent(self, event): self.scene().clearSelection() self.setSelected(True) self.myContextMenu.exec_(event.screenPos()) def itemChange(self, change, value): if change == QtWidgets.QGraphicsItem.ItemPositionChange: for arrow in self.arrows: arrow.updatePosition() return value class DiagramScene(QtWidgets.QGraphicsScene): InsertItem, InsertLine, InsertText, MoveItem = range(4) itemInserted = QtCore.Signal(DiagramItem) textInserted = QtCore.Signal(QtWidgets.QGraphicsTextItem) itemSelected = QtCore.Signal(QtWidgets.QGraphicsItem) def __init__(self, itemMenu, parent=None): super(DiagramScene, self).__init__(parent) self.myItemMenu = itemMenu self.myMode = self.MoveItem self.myItemType = 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): item = self.selectedItems()[0] item.setColor(self.myLineColor) self.update() def setTextColor(self, color): self.myTextColor = color if self.isItemChange(DiagramTextItem): item = self.selectedItems()[0] item.setDefaultTextColor(self.myTextColor) def setItemColor(self, color): self.myItemColor = color if self.isItemChange(DiagramItem): item = self.selectedItems()[0] item.setBrush(self.myItemColor) def setFont(self, font): self.myFont = font if self.isItemChange(DiagramTextItem): item = self.selectedItems()[0] item.setFont(self.myFont) def setMode(self, mode): self.myMode = mode def setItemType(self, type): self.myItemType = type def editorLostFocus(self, item): cursor = item.textCursor() cursor.clearSelection() item.setTextCursor(cursor) if not item.toPlainText(): self.removeItem(item) item.deleteLater() def mousePressEvent(self, mouseEvent): if (mouseEvent.button() != QtCore.Qt.LeftButton): return if self.myMode == self.InsertItem: item = DiagramItem(self.myItemType, self.myItemMenu) item.setBrush(self.myItemColor) 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.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) 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: 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) 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) arrow.setZValue(-1000.0) self.addItem(arrow) arrow.updatePosition() self.line = None super(DiagramScene, self).mouseReleaseEvent(mouseEvent) def isItemChange(self, type): for item in self.selectedItems(): if isinstance(item, type): return True return False class MainWindow(QtWidgets.QMainWindow): InsertTextButton = 10 def __init__(self): super(MainWindow, self).__init__() self.createActions() self.createMenus() self.createToolBox() 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.createToolbars() layout = QtWidgets.QHBoxLayout() layout.addWidget(self.toolBox) self.view = QtWidgets.QGraphicsView(self.scene) layout.addWidget(self.view) self.widget = QtWidgets.QWidget() self.widget.setLayout(layout) self.setCentralWidget(self.widget) self.setWindowTitle("Diagramscene") def backgroundButtonGroupClicked(self, button): buttons = self.backgroundButtonGroup.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'))) elif text == "White Grid": self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background2.png'))) elif text == "Gray Grid": self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background3.png'))) else: self.scene.setBackgroundBrush(QtGui.QBrush(QtGui.QPixmap(':/images/background4.png'))) self.scene.update() self.view.update() def buttonGroupClicked(self, id): buttons = self.buttonGroup.buttons() for button in buttons: if self.buttonGroup.button(id) != button: button.setChecked(False) if id == self.InsertTextButton: self.scene.setMode(DiagramScene.InsertText) else: self.scene.setItemType(id) self.scene.setMode(DiagramScene.InsertItem) def deleteItem(self): for item in self.scene.selectedItems(): if isinstance(item, DiagramItem): item.removeArrows() self.scene.removeItem(item) def pointerGroupClicked(self, i): self.scene.setMode(self.pointerTypeGroup.checkedId()) def bringToFront(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 sendToBack(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) else: font.setWeight(QtGui.QFont.Normal) font.setItalic(self.italicAction.isChecked()) font.setUnderline(self.underlineAction.isChecked()) self.scene.setFont(font) def itemSelected(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()) def about(self): QtWidgets.QMessageBox.about(self, "About Diagram Scene", "The Diagram Scene 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') .scaled(30, 30))) textButton.setIconSize(QtCore.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) 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) 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() button.setText(text) button.setIcon(QtGui.QIcon(image)) button.setIconSize(QtCore.QSize(50, 50)) button.setCheckable(True) self.backgroundButtonGroup.addButton(button) layout = QtWidgets.QGridLayout() layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter) layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter) widget = QtWidgets.QWidget() widget.setLayout(layout) return widget def createCellWidget(self, text, diagramType): item = DiagramItem(diagramType, self.itemMenu) icon = QtGui.QIcon(item.image()) button = QtWidgets.QToolButton() button.setIcon(icon) button.setIconSize(QtCore.QSize(50, 50)) button.setCheckable(True) self.buttonGroup.addButton(button, diagramType) layout = QtWidgets.QGridLayout() layout.addWidget(button, 0, 0, QtCore.Qt.AlignHCenter) layout.addWidget(QtWidgets.QLabel(text), 1, 0, QtCore.Qt.AlignCenter) widget = QtWidgets.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] names = ["black", "white", "red", "blue", "yellow"] colorMenu = QtWidgets.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) if color == defaultColor: colorMenu.setDefaultAction(action) return colorMenu 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() return QtGui.QIcon(pixmap) 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 QtGui.QIcon(pixmap) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) mainWindow = MainWindow() mainWindow.setGeometry(100, 100, 800, 500) mainWindow.show() sys.exit(app.exec_()) examples/widgets/graphicsview/diagramscene/diagramscene.pyproject000066400000000000000000000001171376617013100260460ustar00rootroot00000000000000{ "files": ["diagramscene.qrc", "diagramscene.py", "diagramscene_rc.py"] } examples/widgets/graphicsview/diagramscene/diagramscene.qrc000066400000000000000000000011771376617013100246230ustar00rootroot00000000000000 images/pointer.png images/linepointer.png images/textpointer.png images/bold.png images/italic.png images/underline.png images/floodfill.png images/bringtofront.png images/delete.png images/sendtoback.png images/linecolor.png images/background1.png images/background2.png images/background3.png images/background4.png examples/widgets/graphicsview/diagramscene/diagramscene_rc.py000066400000000000000000000400161376617013100251450ustar00rootroot00000000000000# 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\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\ \x00\x00\x0f\x00\x00\x00\x18\x02\x03\x00\x00\x00XkO\xfa\ \x00\x00\x00\x09PLTE\xff\xff\xff\xff\xff\xff\x00\x00\ \x00\x8e\xf4\xc3\xec\x00\x00\x00\x01tRNS\x00@\xe6\ \xd8f\x00\x00\x00RIDAT\x08\x1d\x05\xc1\xb1\x0d\ \xc20\x14\x05\xc0\x8b\x04\x1b\xd0g\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`\ \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\x03?\ \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\x04gAMA\x00\x00\xd6\xd8\xd4OX2\ \x00\x00\x00\x19tEXtSoftware\ \x00Adobe ImageRead\ yq\xc9e<\x00\x00\x02\xd1IDAT8\xcb}\ \x95KhSA\x14\x86\x93\xe6\xd1\x08I(\x04[\x17\ \x055\xeeZ\xbbP\xb2\xb1\xda\x85\x8f]\xb5\xbe\x16v\ )-BIW\xed\xce\x8d\x0a\xa2\xe0\xba\xab\x14\x84\x8a\ +QDE\x17\x0a\x8aU\xf1\x01\x1a\xb0V#\xad\xa2\ \xc5\xb6\x92j\x95\xbe4\xcd\xc3\xe3\x7fn\xced\xe6N\ \xd2\x16>\xe6\xde\xce?\x7ff\xcec\xae\x87\x88<&\ \xf8\xf3\x01~\xa8\x07\x01Pgk\x0cm\x9d\xa1\x0d\xf2\ \xda\xca\x9c!\xf2\x8a\x11Q\x7f\x7f^\x16l\x04a\xe0\ \xafa\xeaw\xb4\x03\x03J\xdb\x08\x22\xe2\xe15\x85\x8e\ \xe9\xbf\xa1!*uwS\xa1,f6\x83(\xcfW\ iS)*\xf5\xf4P)\x18T\xda8hp\xe6\xcd\ \xe3\x97`Z\xec\xed\xa5BK\x0b\xe5\xf0\xfe]\x9bo\ U\xe6\xca\xb44R\xbex\xe8\xa0\xd6\ \x1e\x05\x09\xf3\x12\xf2I\xd0\xb7\xb1\xe0\xa4>R\x97\xb4\ \xa9}mV:\xf4\x94\xd6\xb2\xe9\x1e\xf1\x88\xda\xa5\xd6\ \xa0\xcc\xe5H;\xc1\x965.\xfa\xa8\xcc)mB\xd6\ \xea\x8b\xde\xfa4\xf1\x82MN\x9c\xca\xe1\x89\xac\xf3i\ \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\ \x00\x00\x7f\x00\x00\x00\x7f\x01\x03\x00\x00\x00\xfcs\x8fP\ \x00\x00\x00\x06PLTE\xc0\xc0\xc0\xff\xff\xff+i\ \x87\xb4\x00\x00\x00)IDATHKc\xf8\x0f\x05\ \x0d\x0cP0*0*0*0*@\xa4\x00\x0c\xd8\ 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\ " qt_resource_name = b"\ \x00\x06\ \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\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\ \x00\x0f\ \x00P\xdb\xa7\ \x00b\ \x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x001\x00.\x00p\x00n\x00g\ \x00\x0d\ \x05l\x22\xc7\ \x00l\ \x00i\x00n\x00e\x00c\x00o\x00l\x00o\x00r\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\ \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\ \x00\x0f\ \x00J\xdb\xa7\ \x00b\ \x00a\x00c\x00k\x00g\x00r\x00o\x00u\x00n\x00d\x003\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\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\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\ " 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() examples/widgets/graphicsview/diagramscene/images/000077500000000000000000000000001376617013100227315ustar00rootroot00000000000000examples/widgets/graphicsview/diagramscene/images/background1.png000066400000000000000000000001601376617013100256340ustar00rootroot00000000000000PNG  IHDRsPPLTE^%IDATx^!A4du/nj @8IENDB`examples/widgets/graphicsview/diagramscene/images/background2.png000066400000000000000000000001621376617013100256370ustar00rootroot00000000000000PNG  IHDRsPPLTEU~'IDATHc`40*0*0*0** QQQ";NsoIENDB`examples/widgets/graphicsview/diagramscene/images/background3.png000066400000000000000000000001641376617013100256420ustar00rootroot00000000000000PNG  IHDRsPPLTE+i)IDATHKc P0*0*0*0*@ C `?x0_IENDB`examples/widgets/graphicsview/diagramscene/images/background4.png000066400000000000000000000001401376617013100256350ustar00rootroot00000000000000PNG  IHDRsPPLTEIDATx^1 6>X o>1IENDB`examples/widgets/graphicsview/diagramscene/images/bold.png000066400000000000000000000004221376617013100243550ustar00rootroot00000000000000PNG  IHDR ;IDAT(S}1E@G$$ "Qpm\@<! GqNx3fvgv0 fY&Iľ;i2$QX5U]vsmY DQ b۶jO|(}g!àL@ 4Yu%y6c!co$dXEF]^AMӠgYv9{p]mH,K(IENDB`examples/widgets/graphicsview/diagramscene/images/bringtofront.png000066400000000000000000000004451376617013100261570ustar00rootroot00000000000000PNG  IHDRĴl;bKGDIDATHA0EF8w^@t\Ig,;Lx UUMmXio30U 7u b`\6fB ,h)&~d`99A~>g\njCHO-W펇!KI1)Vk TG5MV Ǫ>W:fjaf]IENDB`examples/widgets/graphicsview/diagramscene/images/delete.png000066400000000000000000000014771376617013100247120ustar00rootroot00000000000000PNG  IHDRĴl;gAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDAT8}KhSAI([5ZPڅ]v)-BIW΍ ຫ+QDE UV#Ŷj4ndN>?fc<&~Pgk m ʜ!Q^laawJ"5鿡!*uwS,f6(WiS)*P)T8hp`ZBK ]oUʴ4Rx Iз>R}mV:ֲڥ֠H;5.)mB4MNቬiY֨SykuO>ڠhM=+IENDB`examples/widgets/graphicsview/diagramscene/images/floodfill.png000066400000000000000000000004321376617013100254100ustar00rootroot00000000000000PNG  IHDR*+sm PLTEEJK8tRNS@fIDATx^M˽1 aU8܏& N.2[UG?3V!BFA4A`$ϝ8~xO~d0hW2t" P D 3q `.@*{P> xl]f4B $7P$W+܀ $7sop_[v>>###MMM000 999---;;;CCC¤UUUhhhZZZPPPttt]]]!!!666ہuuu%%%HHHcccSSS888䢢JJJ___itRNS@fmIDATx^Ւv0E=f攙SNvmY+0[X7<ƵBښom @,q { л MA+3n.59廩ۧGdG'~1;q,~ È]մn66钐 ۄaϻgC`]SӸ敏ZM 2 and random(3) == 0: image = QtGui.QImage(':/images/head.png') mime.setImageData(image) drag.setPixmap(QtGui.QPixmap.fromImage(image).scaled(30,40)) drag.setHotSpot(QtCore.QPoint(15, 30)) else: mime.setColorData(self.color) mime.setText("#%02x%02x%02x" % (self.color.red(), self.color.green(), self.color.blue())) pixmap = QtGui.QPixmap(34, 34) pixmap.fill(QtCore.Qt.white) painter = QtGui.QPainter(pixmap) painter.translate(15, 15) painter.setRenderHint(QtGui.QPainter.Antialiasing) self.paint(painter, None, None) painter.end() pixmap.setMask(pixmap.createHeuristicMask()) drag.setPixmap(pixmap) drag.setHotSpot(QtCore.QPoint(15, 20)) drag.exec_() self.setCursor(QtCore.Qt.OpenHandCursor) def mouseReleaseEvent(self, event): self.setCursor(QtCore.Qt.OpenHandCursor) class RobotPart(QtWidgets.QGraphicsItem): def __init__(self, parent=None): super(RobotPart, self).__init__(parent) self.color = QtGui.QColor(QtCore.Qt.lightGray) self.pixmap = None self.dragOver = False self.setAcceptDrops(True) def dragEnterEvent(self, event): if event.mimeData().hasColor() or \ (isinstance(self, RobotHead) and event.mimeData().hasImage()): event.setAccepted(True) self.dragOver = True self.update() else: event.setAccepted(False) def dragLeaveEvent(self, event): self.dragOver = False self.update() def dropEvent(self, event): self.dragOver = False if event.mimeData().hasColor(): self.color = QtGui.QColor(event.mimeData().colorData()) elif event.mimeData().hasImage(): self.pixmap = QtGui.QPixmap(event.mimeData().imageData()) self.update() class RobotHead(RobotPart): def boundingRect(self): return QtCore.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.drawEllipse(-7, -3 - 20, 7, 7) painter.drawEllipse(0, -3 - 20, 7, 7) painter.setBrush(QtCore.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.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) class RobotTorso(RobotPart): def boundingRect(self): return QtCore.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.drawEllipse(-25, -20, 20, 20) painter.drawEllipse(5, -20, 20, 20) painter.drawEllipse(-20, 22, 20, 20) painter.drawEllipse(0, 22, 20, 20) class RobotLimb(RobotPart): def boundingRect(self): return QtCore.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.drawRoundedRect(self.boundingRect(), 50, 50, QtCore.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() 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 ) ] self.animations = [] for item, pos_x, pos_y, rotation1, rotation2 in settings: item.setPos(pos_x,pos_y) animation = QtWidgets.QGraphicsItemAnimation() animation.setItem(item) animation.setTimeLine(self.timeline) animation.setRotationAt(0, rotation1) animation.setRotationAt(1, rotation2) self.animations.append(animation) self.animations[0].setScaleAt(1, 1.1, 1.1) self.timeline.setUpdateInterval(1000 / 25) self.timeline.setCurveShape(QtCore.QTimeLine.SineCurve) self.timeline.setLoopCount(0) self.timeline.setDuration(2000) self.timeline.start() def boundingRect(self): return QtCore.QRectF() def paint(self, painter, option, widget=None): pass if __name__== '__main__': import sys import math app = QtWidgets.QApplication(sys.argv) scene = QtWidgets.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) scene.addItem(item) robot = Robot() robot.setTransform(QtGui.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.setWindowTitle("Drag and Drop Robot") view.show() sys.exit(app.exec_()) examples/widgets/graphicsview/dragdroprobot/dragdroprobot.pyproject000066400000000000000000000001221376617013100265160ustar00rootroot00000000000000{ "files": ["dragdroprobot.qrc", "dragdroprobot_rc.py", "dragdroprobot.py"] } examples/widgets/graphicsview/dragdroprobot/dragdroprobot.qrc000066400000000000000000000001371376617013100252720ustar00rootroot00000000000000 images/head.png examples/widgets/graphicsview/dragdroprobot/dragdroprobot_rc.py000066400000000000000000001314561376617013100256320ustar00rootroot00000000000000# 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:|\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x00\x84\x00\x00\x00\xb1\x08\x04\x00\x00\x00\xaf\xfa\xdd2\ \x00\x00\x00\x09pHYs\x00\x00\x0b\x13\x00\x00\x0b\x13\ \x01\x00\x9a\x9c\x18\x00\x00\x00\x07tIME\x07\xd6\x03\ \x10\x0a1\x18\xc7\xacb\xef\x00\x00\x00\x1dtEXt\ Comment\x00Created \ with The GIMP\xefd%\ n\x00\x00\x00\x02bKGD\x00\xff\x87\x8f\xcc\xbf\x00\ \x009\xe4IDATx\xda\xd5\xbd\xd9\xb2]\xc7\xb5\ \x9e\xf9e\xe6lW\xbb\xf7\x066\x00\xf6$\xa8\xc6u\ \x8e\x1daY\xf2E\xd5E]T\xd1\xe1\x8b\xba&\x1f\ \x81z\x04\xea\x11\xc8G\x10\x1fAz\x041\xea\xae\xae\ |\x8e\xe3\xd4)GX\x16M\x1cQ\x02\x89nw\xab\ \x9d}\xa6/r\xcc\x5cs-l\x10\x0dI\x85\x0b\x0c\ \x92\x00v\xb7\xd6\x98\x99\xa3\xf9\xc7?\xfe\xa1V\xfc\xb8\ \xbf\xdc\xe0\xf7*\xfc\x9d\x02,J~?\xfcSK\x07\ \xc4\x18*\xda\x8f\xdb\xdfr\x19\xfd&\xfe\x9b\xfc\xa6\xa1\ \xc3\xde\x8d\xee\xc5h\xc0\xe1\x00\x15\xbe\x9b\xda3\xf9\xff\ \xd4\x86\xf0/\xdb\xc9[wh\x1c\x96N\x8c\xd2|z\ \xf1IAM\xca\x98\x88\x925[\x1c\x09\x19\x0aKB\ N\x8d\x05R&\xe4*\x12\xf3)\xf9\x09\xea\xe0'\xbd\ \xbc!\x22\xfef\xbf\xfa\x0b\x01\x1a\xb0h:\xca\x8f\xb7\ \xbf\xad\xb1T\x94lQ\xa4(\x1a6\x5c\xb2$&\xa7\ \xe2\x8a\x0a\x03\xb4\x14hbr\xe6\x1c\xbb9\xb9\xca\xe4\ \xad*9\x1d\xdf\xef\xd7\xdf\xd0\x10jp\x84-\x0d\xd5\ \xdd\xf2\xabK.\xa8\xe8h\xd8r\xcc1s\x1c\x0b\xce\ \xd8b\xd1\x94\x14\xc2{\x85\x9a\x0e(\xdd\x8a\xfbl8\xa3`\xc2)\ 34\x11[V\xac(\xa9)i8c\x83\xe1\x981\ -\x96\x0c\x87\x01j\x1a\x14\x19)w\x98s\xca\x09\xe3\ \xf7\xd3{\xe6{;\xcb\xe8\xd5\xdf\x9cz\xea\x8d\xf6\xb7\ \xbfC\xc9S\xe2\xc0U\xb64\x1f\x17\xbf\xdd\xb2\xa1\xe4\ >\x1d\x96\x11c\x124\x86+6\x5c\xb1f\xcb\x96%\ %WL\x99\xd3\xf0\x98\x16ML\xd3\xc7\x16\x22fL\ \x80\x05k\xd6\xcc\xbf\x9a1W\x99D!\xff\x1a\xa0\xc5\ \x1c8\xd3\x1f\xe1D\xb8gX\xdcI6\xe0\x7f\xf5A\ N\x0dND\xcd\x85[Rr\xceC.\xb0\x8c\xb8\xc1\ \x18G\x83C\xb3\xe1\x82\x15\x1bJ\xb6T(\x12b4\ \x1d-\x00\xe7\x00\xc4\xa4\xa4\xc4\x18nb\xd1Dd\x9c\ \xf0&\xb7xS\xc5\x98\xf0\xca\xdc\xde\xef\x86\xa1[\xfd\ \x18>b\xdf$>\x18j\x1c\x0d\xb5\xb3\xe8\xcb\xf4\xa4\ \xf7\xed\x0d\x06G\xf5\xe99\xe7\x94<\xe0K\x22r\xc6\ (\xd6,hHI\xb9\xe2!\x17\x944X,s:\ :\xac\x18\xb8\xa3\xa6E\xa1\x18\x13c\xd9\xb2\x92\x8fk\ \xe6\x9c\xf1\x0e\xb8\x19\xe3_\xeb\xcf\x15\x86\x18\xb5\xf7P\ \x86g\xf7zc|\xcf\x131\xbc\x97\xed .\x94w\ \xb7_\xadQ\xc4\x8c/''\x11\x8e\x0eC\xc9c\xf7\ 5\x8f\xd9\xf0\x98\x87$\xdc\xe6\x84\x96K\x1a&\xcc\xf8\ \x86%\x17\xac\xb0D$\xc4\xa4(\x8c\x98\x01\xa0\xa2\xa2\ !fLLK\xcd\x82\x88\x84\x08H\xb9\xcd\x1d\xde\xe1\ \x84\x13r\x12r\x95`\xb0rU\x86y\x86\x1b\xc4\xaf\ \x1f%j\xa8p\x19,\x0eMzO\xab\x09kw\xc1\ \xf9\xf1\xc8\x1d3U1\x9b\x0f\x1e\xfd\xe1k\xce\xb9\xe2\ \x9c\x0d\x13@\xb1\xe015\xc78\x9e\xf0\xdfh\xb1@\ B\x8cO\xa93r\xa0\xa2A\x11ai\xa9\xd9\xb0\xc1\ \x88\x07\xf2\x97\xa7\xa5\xe6\x9c\x86)-\x1d\xc7\x1c\x01\x8e\ n\xcf\x87\xb9\xe7\x86\xd8\xe8\x87\x88\x07Jn\xaf\xa5\xb8\ \xbb\xf8\xaa\xc6\xa0h\xb9\xf1Y\xc5\x9a\x05\x09%\x85\xcb\ x\xcc=\xee\xd3\xb2\xe1\x09\x969\x8e+\xb6l\x99\x10\ q\xce_)1$h\x1c%\x0bZ&\x8c\xa8\xb1l\ (\x81\x08GMEA\x87&#F\xd1\xe1Hq@\ \x89\xe1K&\x9c\xf2:\x11c\x0cJ.\xd5\xbe\xb3\xfe\ Q\x9c\xa5\x93<\xb1/\x86b*\xce\xdd7\xacpT\ ,\xb9C\xc1\x8a\x12HH1\xacy\xc2\x0aE\xc1\x05\ 59\x19\x1d\x90\x12Qp\xc9\x92\x11\x96\x96\x8a\x92\x9a\ \x0e\xcb\x1c\x83\xa6\xa5\xa4\x06\x14)\x96\x8e\x0e\x87&\xc2\ \xe0\x80\x84\x8c\x94\x88\x8c\x9c-\x19G\xbc\xc5\xff\xc2O\ 9Q\xd1\xc0G\xb8\xa7j\x11\xf5C\x9e\x08\x9f\xda\xb6\ t\x1f\xb7\x9f\xdac\xc7DU\xff\xe0\x1d]\xc7\x15\xdf\ r\xc1\x96\x05+j\x1411\x13\x1c\xd0Qa\xa9\xd8\ p\x8c\xe2\x84#\x9e\xf0gj\x8eh\xd8\xb2dCC\ L\xce\x88\x86\x8a\x8e\x16\x8b\x95$\xcc\x07h\x034T\ \xf2\xd2c:\x1c-%\x13\xa0\xe4\x9c\xc7\xdc \xfd\x87\ \xd1\xaf\x8cD,\xf7}\xf3\x88\xa7\x13\x94\x0e'_\xe0\ \xd0@Mq\xd1\x1c\xb7\x94\x94t\x94n\xc9#\x1eq\ \xc6\x86\x0a\xcb)\x96\x92\x92\x05\x1bj\x1c7\x982\xa1\ e\xc9\x96\x88\x11\x0d\xff\x9a\x9c\xff\x8f\x7f!bB\xc9\ _h\xa8Qd\x8c\xa4\xe6\xachhH\xc8\xb0Tt\ \xe4D8\x222\xa0d\x89\xc2\xe2\xe8\x980\x22aL\ DF\xc4\x92\xc7\x8c~\x19\xdd\xcd\xef\xa9g\x84J\xf5\ \xaa>B\x85\xcc\xc0\xed\xfdM{ws\x5cR\xb3a\ A\xc1\x92K\x1e\xb3\xa2\x15\xff\xfc\x98\x96\x825\x05\x9a\ 1cFh6\xacY\xd11\x22\xe5\x94oYr\x81\ \xa6fIA\x81\xc3a)\xe9\xa8I\xd8b\xe9\xd0\x18\ q\x93q@,*\x14\x8e\x1b\xf2\xd1\x0cCK\x87\x22\ ''!\xf1\xce\xf4\x9e\x1b\xbca\xf5}N\x84\xba\xa6\ zT\xc1\x03\xb7Tw/\xbfz\xcc\x9a\x8a+\xceX\ \xe0\xb8bAK\x8c\xa2\xa4\xa0\xc0\xd2\xd0\x00)3f\ ,\xe9\xc4\x03$\xa4\xe48\xfe\xcac\x14\x8a\x15k\xc9\ \x0b\x15\x96\x9a\x96\x96\x94\x0c|\x00&\xa1@\x01\x11)\ \xd0b\xe9\xb0\x92\xbe\xa5\x80\xc6\xd2\xb1e*\xaf;%\ \xa5qwTD\xf4\xc2\xb9e\xf42.R\x85\xff\xd6\ \xac\xddC.9gK\xc1%gl\x18Q\xca]\xae\ Y\xb1!E3\x22!&B\xb1a%?\xd0G\xff\ \x8eoY\xd2\xe1(Y\xe2\xc8\x05\xab\xf0~@\x039\ \xa0\x88\xc8\x18\x91\x92\xb0\xc0\x90\x12S\xb1\xa1\xc5R\xd3\ \xa1p$\xc4@K\xcd\x16E\xc1\x15W\x5cr\x83\xad\ \x9b2#W&\xa4\xdd\xdf\xdb\x10\xee\xe0O\x1dK\xf7\ \x90\xaf\xd8RR\xb3\xe6\x92\x15\x0d\x1bj\x1a\x1a\xc9\x03\ \x0d\xa7(bF\xc4\x94\x5c\xb0\x22\xc6\x04\xef]\xd3\xb0\ %f\xcc\x86Fp\x06EC\x85!&\xc6\xa0Y\x89\ \xd9\xb7\x8c\x88\xe9\xe8\xd8\xd2\x90\xd1R\xe1\xe4\xcd\xbbA\ M3%\x92\xef\xdc\xd0p\xc9\x827x\x8f\xd3\xdf\xe5\ \x1f\x99k\x11\xac\x974\x84\x1b\xfc\xd7\x07\xca\x8e\xb5{\ \xc8}.\xe4G\xaeYQ`\xb9\xa0\x91\x808bD\ \xca-*\x1a\xf1\xf0\x15%\x11\x84\x97\xad1\x01l\xcb\ \xc8P8R\xa0\xc3\x11\xcb\x19\x8aPr\x99Z\xc9\x1a\ |D\x89\x80\x8c)[y(-V\xaa\x92\xfe\x12X\ 6\xb4\x8ci1\xc4\x1fE\xa8\x83*\xe8\x15\x0c\xe1\x06\ \xa6\xd0\x929l.\x1e\xf1\x0d\x17t\x14l(\xd9\xb0\ \xa1\xa0\xa5\xc4a\x18q\xcc\x9c\x1cC\x22a\xb2\xa4\xa6\ %\xa1#&#\x0e`\x9d\xa6\xc0\x91`\x80\x8eN\xae\ \x81\xcf\x12\x224\xb7H\x81\x15+Z4\x8a\x86\x9a\x82\ \x98\x04\x85\xa6\xa6\xa1\x93\xbc\xc21&a+>%\xc3\ Q\xb2\xe5&\xed\xc0\xaf}\xef\xf0\xe9\xc2\xbfJ\xfe_\ \x1c\x9fqA\x85\xa5\xe0R`\x12\xff\xec\x0d#nq\ \x9b\x9c\x92\x15\x1d\x0d-%k\x1a\x22R\x14cNH\ \xa8YS\xd2bh\x80\x8c\x9a\x12\xc5\x98\x92\x98D\x0a\ 70lI\x18\x01\x8e\x06\x85\xa1\xc6`\x88\x89\xe8\xa8\ X3\xa1\xa1\xa2eCGMJ\x07\x82Xu4T\ |I\xc4)S\xa7\xd5\xee\xb4\xbcr\xd4\xd8A\xe5\xfe\ \xd0m\xef^~\xf5\x84\x82H\xea\x8a\x8a\x85\xd4\x80-\ \x0d\xb7x\x93c4K\xceXp\x8b\x86\x92\x12\xc8\x99\ 0f\xc6\x881\xb0A\x13\xd3\xb1\x06\x1a\x1a49\xe0\ \x88P\x18\x22\xa9^[\x14[JZ**\x09\xdd\xb7\ \xd8\xe0\xc8X\xb1%e\x83\x96\x1cSq\xc5\x869\x9a\ D\xa2\x86\x22Bs\xc1=2\x227W\xec]\x8d\xeb\ `\x84\xe8\xc5\xa2\x857H\xc3\xfa\xabs\x9ep\xc9\x9a\ \x86BR\xe1\x1a\x87!\xe7\x16\xb7\xb8\x85b-)\x8e\ \xcf\x04cb\xc6\x9cp\xc4)\x19\x09\x0dK\xb4\x9c\x06\ \x0dT8I\xd5T\x00cA\xa1q(24\x19\x05\ \x15-s\x22\x0c\x15\x1111\xd0a\xe9h\xd1\x82P\ t8j\x898\xb1\xc0\xbdK.9\x11,\xfc{E\ \x0d5\xb8\x1a\x96\xea\xd35+\x96\x5c\xb1\xa6\xa1\xa3\x0e\ \xb9\x7fJ\xc2\x0d\xa6\xf2,\xbdc\xad%\xce'\xdc\xe0\ 5\x8e\x99\x13\x11QKG\xa3\x22\x95:\xa3\xa3\xa5\x93\ \xd4\xbb\xa3\x13\x5c\xa3\xa3 e\xca\x98\x94D\x12\xa6\x8c\ \x84\x05\x8e\x91\x9cO%\x91C\x912f\x85\xa5\xa5\xc0\ \xd2\x92\x12I\x0ds\xc6\x9c\xd4E*\xf9\xbeQC\x0d\ \xf0\x06\xdf~\x89\x80\x92\x92\x88\x9a\x1aH\xc9\xc8\x89I\ \xa9\xa9\xe4+6\x5c\x91cHI\x98r\x93\x1b\x1ca\ 0\x18\x14S \xa3aCJLAECM\x87\x91\ S\xd6\xd2a\xb1h\x1aZ\xa9B3\x14\x1b4\x19\x15\ \x0d\x19\x8e\x82X\xaa\xd5\x92N\xea\x93\x86Zj\x9d\x96\ \x18\x83\xe3\x82\x87\x8cH\x88\xdcL\x99W/\xba\xdcA\ \x87\xaa\xa1\xa4\x09]\x84\x86\x82\x0a\x183%\xc21\x01\ \x1a6T\x94l\xa8\xc9I\x98s\xc4\x11'\x1c3\xa6\ \x22\x12\x18%\xa7\xa6\xe31cr\xc1(\x155\x11%\ m\xf8\xfe\x8a1\x8a\x08G\x85\x0d~C\x03\x1d\x86T\ J9\x0f\xf0W\xb4\x94\x8cp\xe1\xba\xb4\x186T(\ rRbR\xa2\xdfM?z\xc5Z\xc3\xed\xfd\xde\xd1\ |\xbc\xe6\x9cK\x96\x14\xb4h)\xa5R&Lq\xd2\ ~qlyLM\xca\x11\x13f\xdc\xe1\x94\x19SF\ $\x18\x01T\x1c\x09\xad<\xf1\x92\x15\x0b\x96\xac\xa9(\ qt@\x14 :\x1f#\x1c%\x96\x96\x88\x0d1\x8e\ \x92\x08C\x22\xd7(\x17\x8f\xe3B\x81\xee0h\xe9\xa3\ \xb5l\xb8`\xc4\x09\xb3\x0f'\xdf\x99hG\xcf\xf3\x0f\ H)dY\xfc\xf6\x8c3\x96\x14l\xd8\xd2Qc\x18\ 3f\xce\x98\x06\xcbC`\xcb%\x15\x19GL8\xe5\ \x88\x9b\x1c\xf9\xa3\x89&\x0b\xd8v,\x00}GK\xc1\ \x8a%k\x1a\xbe\xa5\xa5\xa1\xa6\xa6\xa0\xa0\xa2BI8\ \xf4\x10m\xcb\x8a\x12\xcd\x86\x98)\x09\x0d-[R\x0c\ \xbe\x01\xe8\xaf\xad\xc1JD\xf3\x0es\xcb%\x19\x0bN\ \xbf\x8f\xb3\xec\x9bi\xdey]r\xc9\x06+\xdf\xbe\x22\ %!f\xca\x84\x14\x03\xfc\x99\x0dk4\xa7\xbc\xc1\x14\ \xcb\xebb\xa4Hz\xdc\xb9T\x11J\x92p\x1f\x8d&\ L\x98\x0b\x1c\xe7k\xcb\x82+.\xd9\xd2\xa01tX\ \x0c\x13F\x5c\xd0\xd1\xa1\xa9p8\x12\x14[j:\x12\ \xc0\xa0\xb1h)\xbf\xac\xb8P_\x9a\xd5\x18.X\x7f\ \xbf\xa8\xe1\xb0\x18\x0cW\xee\x1b\x16X\x12\xd6<\xe2\x9c\ \x0a\x85b\xc61)\x1b\x1ep\xce\x9aK \xe1\x98\xdb\ \xdc\xe6\x98\x84#f\xcc\x88h\xb1D\xc4\x12\xe3\xfb\x80\ \xec\xdf\xa2\xc2\x90K\x1a\x95SQ\xd0`\xa9)(\xb9\ \x92\xe4\xbc\x93@\x1b\xf1:5%\x9a\x92Kr\x14\x11\ 1\x06CB\x84a-\x10NC#\xc5yBGM\ N\xc9}r^ws\xa5\xf6J\xc7\x97\x0a\x9f\x1aG\ \xc5\x15\x0f\xd8\xd2P\xb2\xe6\x9c+\x22f\xdc\xa6\xe4[\ *J*J\x1a\x0c\x09\x13nr\x9bS\x8eH\xc9H\ B\xd3WK^\xe0\x06\x08\xb2\x1ep\x1a\x14\x9a\x13j\ *\x81ZJ\xc1\xacJ\x0aJZ:\x1c\x09[\xb6$\ \x18\x22 &\x11\x88\xd6\x10\x91b\xa4[\xdeIn\xea\ A\xc4\x1e\xff~B\xca;p1;Q\x07\xdd\x96\x17\ 0\x84\x95c\xdc\xb2vO\xf86@d5\x96\x9c\x9b\ d\xac\xb9`%WH\x913\xe56o\xf2\x1a7\x98\ \x08\x9a\xe0?\xa21!7\xdd\xfd\xab\xa5\x14Rh,\ \x0eED\x22e]C\xc3\x11\x96\x9a-[\xd6\x14\x12\ \xa8c\x0a\x22\x12:\x14\xa9d1\x8aX\x8a\xfb\xde\x9b\ \xb5t\xb4lqt\x8c\x04\x1b\x1dq\xc1\xcd\xe3\xe93\ \x0b\xf2\xe7\xe6\x11\x96\xfa\xe3\xad`\xc7\x0d[Z\x12f\ L\xc9\xb9`\x8bf$!\xad%\xe7&os\x87c\ \xc6\xe4$\xb4by\x1f-vgL\x1d\x9c\xb8\xde`\ \xde\xe7\xf7m\x01E\x8e\xa3c\xcc\x96\x945U\xc0 \ \x0c\xb1t@\x8dT%\xbe\xfb\x11\x0bn\xddR\xd1\xd2\ RH\xd7]3\xe6\x84\xdb\x9c2\xfe\xcc\xbc\x8a\x8f\xd0\ \xf2\x8d\xca\xdf\x96\xc0\x845W,h\x18\xe1\xd0,y\ \x82\x22\x11\x1f`\x88x\x9b\x9b\xbc\xce1\xa9'~\xd0\ \x02\x9a\x98H^\xa8\x0a\xff\xf4&\xde\xb1]\xf4\xa0\xa8\ sRv94Z\xcc\x18S\xb1\xa4\x91\xaa$\x93\x0b\ \xa9\x89\x04\xcc\xdd\x99\xcfI\xf5\xd1\xe7\x14\x8a5\x09'\ \xfc\x8c7?\x9b\xfe\x86\xd0\xf6yig\xd9}\x5cR\ H\x82\xe2\xf1\x80\x11\x0d\x1bV\x820T\x94hf\xcc\ \xb8\xcb\x8c99\x0aGM#/Ic\xa4\x80\xd7\x03\ <\xa2\x0f\xcb\xc3\xeeS\xffF\xfa|\xa0\x09\x9eE\x11\ \xd3\x08\x16\xb5\xa1\x95\xccvA$\xa7\xa1O\xcd;\x81\ \xed\x1aq\xf2-\x8d<\x14MF\xf2\x1b\x7f^\xa2k\ M\xf1|`\xe6n\xc3\x92s\x16\x9c\xe3\x181\xc2R\ R\xb0\x05j*J,\xc7\xbc\xc9\xdb\xbcIB\x86\x91\ \x00\xe6\xdf\x9a\xde3\x02\x03Z\x87;\x00\x82\xa1\x93\x0b\ \xd4\x17]\xf1\x80\x1e\xa4\xa5\xab1bI#x\x83\x0e\ \xde\xa5\x95\xb3\xd3I u\x18,\x8e\x8a\x12\xe5[\x8d\ <\xe0=w\xa4\xcc n\xbdd\xd4P\xf7Z|F\ y\xce\x9499+6\xac\xa9I\xa8\xa9h\xc8\xb9\xc5\ Oy\x8fL\xb2\x84\xfe\xc6\xabp{\xad\xfc\xee\x90P\ \xb6\x9f\xf2\xba\x80-\x1ay\xb2\xfd\xdf\xfa\x0e\xc5H\xfa\ ]\x05V\x80|\x8fO5\xf2=\xbc\xe1|F\xd1_\ N\x7f\xb1\x1a\x1es\x8f\xbf#\xffx\xfc\xf9\xb3\xe0\xdc\ \xef\xe8t\xf9O\xae\xb9\xef\xfe\x89/)x\xc4\x09\xc7\ 8\xcex\xc2\x96\x8eR\x90\xe5\xd7\xf97\xbc\xcf\x8c4\ \xf8\x00\x7f\xe8\xe3\x90\xf31\xb8\x14J|\x82\x12\x1c\xba\ o\xdf\x80\x198\xe8\xbe\xf0\xeaBBg\xa5\xe4/\xd8\ J\xc5\xb3\x11\xc4\xbb\xa1\xa4\x12\xa6\x95\x93\xf0\xdb\x08~\ \xf5\x10\xcb\xeb\xb4t\xbc\xcb\x7f\xe4\xdfs\xaa\x90\xcc\xf3\ %3\xcb!`\xabhX\xd3\xb2\xa5Ea\x98`\x88\ \x19\xf3\x0ew\x98\x92\x0d\x0erO\xd8\xd0r\xf3\x19\xb8\ \xc9\xde\x0cC\x0e\xc3!\x1dl\x98_\xf4W\xcc\xcaS\ \xb7Xi\x09\xfb\xfb^\x0b$\xac\xa9q\x12\xf2}-\ \xe2H)9\xa7$\xa6\xe5\x09\xf7\xf8\x197\x9f\x09\xef\ \xbf@_\xa3\x7f\xca1\x1d[Z)q=\xe9o<\ \x88\x14Qx;z\xf0vw}rs`\x90>p\ \xdap\x86v\x89\x8e\x0ao]\x853\xe4\xb3\x0e\x8d&\ \x16(\xbf\xa3!\x11@\xb7\xe6R~r\x84!\x07\x1a\ \x8eXq%\xc8G\xc5W\x9c\xf16\xf1\xab`\x96}\ \xc1\x93\x90H\x09\xdd\x81\xa0\xce\x8a\x15\x09#N8\x22\ \x0d\xb4\x8c\x9d)\xf4\x81\xd5\xd5\x9e\x11\xd8\x0byVn\ \xf5\xfeg\x0f\x197}b\xe6\x82\x89}O4\xa2\x95\ \xd8\x14\xb1\x91\xd8\xa1\x89\x84V`\x980\xc1b\xc9\x18\ \xd1\xd2\xd2=\xf3\x0dG\xcfo\xe9\x18a,\xf4\x81\xac\ '\xf5\xf9\xca\xe2\x881i\xe8\x88\x0e\x9f\xe9\xae\x05\xa0\ \x0f(\x86\x87\x94\x82>\x03u\x83|CK\xb7\xb5\xaf\ xl\xc8<41V\x12\xa8\xfe\xc4Y \x97\xaeJ\ o\xaa\x9c\x8e\x11\xb79c\xc1\x8c\x9b\x1c\x93\x85\xcb\xf3\ t\xdcx\x01\x84J\xcb\x97v\x18\x22\xb1\xbf\xffA\x19\ S\xa6\xa4 \x8c\xb7\xdd\xdb\xfanf\xb4\x1b\x98\xf9Y\ mZ\xff\xfc\x87\x0cl-\xdc\x19\x9f\xb2\xfb\x9a\xb6\xbf\ b\x16\x18\xd3P\xd2\x06\xbf4\xa7dNJ\xc9\x19\x96\ 9o\x09A\xf1\x15\xf1\x08'\x00G-f\xf0\x07\xd9\ `\x88\xc8\x980\x22\x96\x00\xe9_\xaa\x93\xecah\x8e\ \xa1\x83\xd4\x07<&5h.\xab=j\x8f\x0b'\x03\ \x81\x8f\x11\xc2\xb2\x22\x96\xb3\xd1\xc9u\x00%<\xba:\ \x5c\xcc\x88\x889\x9a\x05O\xe8$+\x1eF\xaf\x97\x8e\ \x1a\xde\x0c\x95\xf8\x09'\x04\x1fCL\xce\x84\x09)N\ :W\xfd[\xe8\xa9=z`\x06-OO\xedqY\ \xf4\xe0Y_G\xe5\xd8w\xad\x8e\x88.T\x16}U\ \xdb\x9f\x94J\xc0\x98\xfe\xf07(F\xe4\xdc\xe2\x8c\x15\ -\xe7\x14\xc1\xb0\xaf\xe4#4\x0999\x8dT\x0d\x11\ \x9a\x84\x98\x9c7\xb8\x81\xc1\x92\xa2\xa9I\x06\x1d\xf3\x9d\ \xb3S!T\xea\x01\xbd`\xc7k\xda\xfd3\xf4&\xfe\ \xabZ\xc9#\x08\xd9\x86\x96\xef\xea\xe1\xb9\xfemE\x02\ \xdfDt\x81z\xe6\xb0\x82l\xbe\x86\xe2\x1e\x8fQ\x94\ \xb4\x1f\xa4_t\xa1\x5c{\xc9\xbe\x86\xa5\x11\x04)f\ \x84\xa2\xc5\x11\x11\x0b\xd0\x1e\x85\xb2\xc8=\x15\x1f\x86f\ \xe1\xa9\xa2\xeb\xbaK\xe0\xf6:l\x87\x83\x0dn\xef\xcf\ &P\x09\xd8\xfbs\xef3\x1a4-c2,\x05\x8a\ \x98\x96\xf6\x0fN\xbd\xa2\xb3tXjjJ\x22\xc6\xe4\ \xd2\x7f\x82\x88\x91t\xad\xd5 \xee\xef\x07?u`\x98\ }3\xec\xa2\x8b\xba\xa6\x02=t\xb1\xea \xf5\xea\x83\ (!\xec\x1a\xb9\xba]0eM+L\xefJ\x1a\xcc\ \x0d6D8\xf5r>\xc2\x09@n1dL\xb0\x94\ \xf2\xe3#q\x8e\x96v/\xe2\xab\x80L\xeeg\x92O\ g\x11\xbb\xe6\xf2\xf0I\x0e\xa3\xca\xae\xed\xf84\xb3\xd3\ `1\x82Y{\xaa\xa1#\x11\x9e\x96\xa6#\x92\x14\xdc\ \xa2\x89\x89I%\x0e\xbd2?\xa2G\x8f\x8e8fF\ \xcbF\xf2\xb7h\x8fq\xab\x0f\x12\xec\xc3t\xfa\xe9\xf4\ \xf9\xba\xc2K\x85\xb9\x9c\xde\x99v\xe1\x9a\xa8k\xd2p\ '\xa0\xad\xa1E\x13\x85A\x986`\xd9=.\x12\xc9\ \xe9\xed\xd3>\xfd\xf2\x86\xf0\x00kGN\x82\xa1\xa2\x96\ \xaa.\x92&\xec\x0e\xdb<\xac\x13\xfah\xc1A\x03\xf6\ \xbah\xee\x0eH\xc2\x87y\x86\x1ad\xaf\x87Y\x8e\x7f\ \x1d\xadd\x98\x0c.\x97\x12\xd2J\xcc\x88\x9a\x86\xfa\x99\ \xd4\xd3\x172D\xcc\x18C\x1c0K'\x00\xaa\x0b\xd4\ s\x06\xfc\xaa\xdd\x91\x1f\xbaJ7\xf8\xa8;\xe0F\xbb\ \xa78\x9b\xbb\xb3\xa1\xf6\xd0\xad]r\xd5\x0dLa\x88\ $\xae\xf4\xf1\xc0\x05<\x149\x119%\x1b\xd64\xa4\ \xd7\x9aB\xbf\x88!\x22\x12r\xb2\x10\xa5=\x0f\xd2\x06\ \xb0\xcd\xc9\x8bP{o\xfa\xb0\xbe\xd8\xb5\x93\xdd5\xc3\ Gn\x10\xf8^\x84\xda\xa6\x0e\x9c\xa8\x1e\x94{\xc3\xbc\ \xc5\xd2\xd1\x08\xbe\xbdfC\xf3\x01/\x8bPY\xf9f\ \x11c&l\x89\x85\x1a\x94a\xc8\xc9\xc9HB\xc6\xa7\ \xc2\xad\x1b\xbe\xf1\xc3\xcc\x80\x01[F\xc9\xedwRN\ ij1\x96\x1e\x9c\x10\x04\x01\xdfuC\xfa\xf6\x90\x95\ \x9c\xa1\xa5\x95\xd75$\xb0;i4;\xc9\x83#b\ \xe68\xd6T\x7f\x98\xa8W\xa2\x17z2NBA#\ \x00\x98\x96\xbe\xb6\x13\x94H\xbd\xf0\xac\x8c;\xf0\x08.\ \x14R\xee\x9a\xabr\xf8\xa7\x1e\xacw!\xc7\xf0\x81\xbd\ \x0e\xfd\x8b\xdd\xd5\xdae\x90V\x00\x1e+\xae\xb3\x09\x90\ \xe0K\x1aB\x13_f\xc7\x09J\x9c\xa4\x15B\xb1\x11\ \x0c\xc9\xed\x11;\xaeK\x8f\x87oi??\x19^\x14\ \xb7g\x9eCC8q\x966T\x16\x86\x8e\x8eZZ\ \xd1Z \xba\x9d\xd7pr\xeaZ\xaa`\x8aV\x98W\ \xd7=:\xfd\xddO\xd0\x01\xd1G\x89\xdc\xb5\x96F\x0a\ .5x6\xfb\x07\xdf\x1d R\xd7\x99\xc1\xed\x99\xc0\ \x0e\x00;+\x7f\xe3\xa4\x1e\xd97\x95\x0b\xe0\x1d\x82\x88\ :ZZ\xc1&\x5c8+*\xb4\x8f\x9d4\x96[\xb9\ L\xdd3\xc9\xa7/\xc0\x8f\xd0_h,\x15H\xac\xde\ \xa59\x1c`X\xea\xa9\x13\xa5\x9e\x82g\x0e\xcd\xe2\x0e\ \x80\xfd\xe1\xef\xd53\xdaB\x04:\xba\x11lB\x07\xcf\ B\xc0\xcc;\xb4\xf4H\x9c4\xa1\xf4^\xd7\xed\x15\x08\ \xa7\x96\x86\x92H\xea\xffXR)\xbd\x973\xee\xa7\xad\ \xea\x19f\xd8\x9f\xad\xeaa:up\x1d\xd8\xab6\x86\ \x95\xcb\xae\x9d\xe3$\x9b\xcc\xa5\xdf\x89\x10\x0d\xf5\xe0\xea\ \xf5\xb5\xb3\x91\xb7\xaf\xbf\x83\x97\xfdB\xe0m'\xd8O\ \x0b\xc2\x80\x8f\x9eB\x1d\x9e\x9e\xa1R\xd7\xfcY\xed\xa5\ \xd6}l\xb2RJ\xbbA\x0e\xa1\xf6\xfa`\x9e\xff\xa0\ \x03|g\xe5m\xfb\x8eg\x89\xa5\x19D\xb0]3\xc0\ \x8a\x89zD\xbd'%\xbd\xa2!z'\xd5\x84\xe7\x12\ \x89\x85\xf5S\x9e\xe0\xe9\xa2\x8a\xa7N\x89\xdb\xcb\x00\x86\ 9\x81\xdb#\xa8\xec\x17m6T\xa8}\x8f\xb3\xef|\ j,\xed\x00\x96U\x03\xe7\xb7\xc3P#9\x1f\xf6e\ 3K\x1b\x92\x14K\xc3Hj\xceX|q,cG\ ]\xc87\xfc\x8b\xeahe\xd6\x8a\x81/Q2\xdf\xed\ \xf9\x8fV.\x96\x0d\x1fi\xa8\xa9B\xfe!NZz\ \x97J\xee\x7fG#\x90\xa0\x05\x19\x93\xf6\xf0@BK\ #\x8e<\x06i\x15#|=#\x8c\xfe)-\x15k\ !\xa8\xbc4\x9c\xef\xe8\xee\xfa\x16J'-]=\x80\ \xdc\x875j\x86\x13\x9a\xb8\x91\x82W\x87\xca\xd0\xec\xc1\ v\xfe,\xb5\xa1\xe5\xdb3j\x86\x10\xcd.g\xd0\xf2\ \xffH`9#(Y)\x83\xb6\xbe\xac\x8a\x83ct\ \x12#\x08\xdf\xadgb\x9b\x80\xbf\xaa\x97\xcd#\x1c\x96\ \xf6w\x95\xb4\xe1=!\xa3\x0b\x17d\x97R\xfb\xe3\xd6\ \xca3\x89\xe8\x84\x14\xe0\x065C,/\xc7\x0e\xfc\x87\ \x09\xc77\x92\xd6\x9d\x0d\x9f_\x87\xf8\xa1\xa4s\xa6\x06\ n\xd6\x9b<\x09\x0dg-o\xbd\x1b\xc4\x1d\x1b\xfc\x89\ \x11\xfc:z\xf52\xdc\xe1~\xe9ogJL$\xbd\ \x81\xec\xe0\x9b:,k\x10\xdf\xd1HsX\x87RY\ cHP\xd2\x1a\xea\xf1\x84\xde#4\x92Xw\x83H\ \xafB\xbe\xb8\xff{'\xcc(- \x0c\xf4:$Z\ Jp'\xa7\xb5\x16#(1BC>\x98\xfe{\x89\ \xab\xe1\x06\x18c\xc2X\x80\x8d\x8aV\xa6\xfbM\xf8\x11\ J\xe0\x90\x84\x14-\x94A?\xd4\xac\x85\x11\x97\x91P\ \x910b,\x06\x88\x04i\xd6t\x94\x01\x05\xb7\x83\xe8\ a\x07\xa9\xb4\x15\xb2\x80\x91\xb3\x86\xd0\xd4}\xc7+\x0e\ Mg\xa4'\xee\x06s>\x04\x94\xdb\x8f>\xb8\x97G\ \xa8v\x9f\x94\xc9E\xf0\xe0WJN&\x13\x176p\ \xe23\xe1\xc1\x9e\xf1\x90+\xc1\xb1z\xb7\x97\x92\xf2\x90\ \x11sfD\x92\xa6\xcf\x88\x992\x16'\xaa\x07Y\x9f\ \xdb\x8b\x19\xfb%{+\x97\xae\x939\xd0F\x1e\x94\xa1\ \x0c\xaf\xb7\xa3\x91\xecb\xe7\xaa}\xf8M\xbe\x0fB\x85\ \xf45[q]\x09S\xa6\x8c0\x02\xec#.q\x8d\ \xa3\xe4\x82oyB%-|?\x01\xe8i^k\x12\ \xc6\x8c\x85\xd5\x92s\x87\x9c\xdb\xdc\xc4P\xa1\x19\xc9t\ \xe7!\xb6\xb9\x03d\x94p}\x15\x9a\xad\x0c\xcb\xf8A\ \x05?\xf5\xd3\x08\xc8\xbf3\x87\x0d\xd7\xc4\xb3&\x22a\ |^\x97\xa9>\xc7Y\x0eYo\x9d\x1c\xe6\x8c1\xb9\ \xb8.\x1b\xfa\x97\x8a{\x14\x5c\xf0\x80sj\x91\xc5\xf0\ \xdc\x99\xad0\xac3\x1aa69\x12\xc6(F\xe2\xea\ \xae\xe8\x980\x93.k*\xa0\xb0\x1d\xe4\x95\x08;n\ )\xfd\x95%\x0fx\x80\xc2\xb2e\x0b\x8c\x19q\x84!\ \x13\x98\x06\x14\xd5 \x87\xf0EZ\x14b\xdewF\x0d\ {\x00\x91:\xc9\xd9{\xbeA$\x938S2\x0c\x11\ \x0d-9\x9a\x9a\x98\x96?s\x9f\x0b.\xa8\x889\xe6\ \x84\x09\xb0\xa5\xa1\xe1\xb1\xd0JR eJ\xc1\x9a\x88\ \x91P\xda\xad(DLyD\xc6\x9c\x13\xe1\xca8\x1c\ 5)F\x98\x96%\x9a\x15\x8fY\x12c8\xe3\x01\x8f\ he\x84\xa5\x22a\xca\x9c\x88)\xb78\x0a\x19\x8a\x1b\ \xcc\x00+\xa6\xd4$\xcc\x07\x19\xed3\x0c\xa1\x0f\xda}\ Z2\xb1\x86:8\x9d($R\x9e#\xe1\x7f\xe0\x92\ K\x1e\x00\x093\x12N\xb8\xc9\x94\x94\x8a\x9a-\x0do\ \xf03\x1e\xf2\x84+,\x8a\x8c\x09)\x96%\xaf\xb1\xe2\ B2\xbe\x9a\x05\x05s\x8ct\xaf\xad\xa4\xf0\xc3\xb3\xb9\ \xe2\x8co\xb9@\xa1Yq\x8e\x9f*\xae\xa8(\xd8\xb0\ bI\xc4\x98%\x13Rr\xc6\x02\xf472\xc6\xc0\xc1\ \x95x\xc1\xab\xe1d0\xa1gO\x1b\x0c\x85p\x99\x12\ \xe9\x80\x1a\x8c\xf4\x1b\xcf\xf9\x92\x0b\x12\x22nr\x83[\ \xcc\x89\xe8\x18\x13QS\x11\xa1y\xc4=\xbe\xe2\x9cs\ \x96\xdc\xe0\x98\x88\x965%1%\x11%\x15\x0dk2\ \x89#;j\x88\x0d\xdd\xae\x96\x15W<\xe1\x02E\xc4\ \x96\x0d-uh6UTl\x88\x18\xb3%#c\xc2\ \x94\x19c\x22\x0a\xac\xc8\xf4\xc8I\xbf\xd4\xcf3\x84=\ \xf8\xb0\xc5\x12\xe3X\xf3-\x8fPL%\x06\x18\xa9?\ \x95\xcc\xdfD\xacy\x02\x8c\x18s\xc2\x9c)\x09--\ 9\x193\xe9,\xdcb\xc41\x0f\xf9\x9a+ fD\ \xc7\xa58\xcf\x86\x0eKLJN\x8e\xc1I\xc1\xdc\xe7\ \x14%\x86\x8e\x82\x0b\xae(\xe80\xc2t\xd8\xd2\xe2H\ \x980bC\xc9E\x80\xf2K\x0aV\xb4\x18&Dt\ 2\xf3#\xc8\xea\xbdW\xe0Yj\x14\x9b\x0f\xbe\xe4?\ \xb3!\xe5\xef$\x19v\x18\x91<\xb1BQ\xb7\x8c\x19\ \xf1.S\xc6\x92<\xf9c\xbd\x95\xb4gK\xcb\x94\xb7\ \xb9\xc3\xbb<\xa1 &\xc7\x90\x01\x19))\x96\x12\xc8\ \x18\x13aiB\xeam\x05\x95t\xb4ly\xc0\x05%\ \x0eG\xc5\x8a\xb58\xc3X\x94\x03\x1c\x09\x0d\x05-9\ )\x85$\xe4\xa7\x81u\xe9\x06\x88\x85\xbb\x06=\x89\x9e\ \xcd`\xf0\xb5D\xf9\x87\x07\x14\xcc\x98\x852\xa6\xc7\x05\ \x1d\x13*\ \x0c9\x9a\x86\x94\x9c-OX\xf3:\x7f\xcf\xfbL\xa8\ )iI1\xccI\xa8\xe8P\xd4t\x94\x94\xf2\xaaV\ \xac\xf9\x0b\x97\xacd\x22P\x93p,\x95\x8bg\xeag\ R^\x95\xacY\xb0\x16\xbd\x02\xc3\x1b\xfc\x8c\xb7\xb9\xcd\ \x9c\x12\xcb{\xfcD\xe6\xfd\xbe\xf3D(\x1c\xd5\x87\x97\ \xac\x99\x93H\x17#bJC\xc1\x96\x0c\x87\x0aHv\ \xce\x7f\xe6\x92\x9c\xbb\xccXpNK\xce\x96\x9a\x8a%\ \x0bR\x12\x0a\x19Yy\x8d\x11\x8a\x07\x94l\x04r\xdb\ \xa29\x22\xa6\xe2Oly\x9b9\xd01\x95!\xc7\xad\ \xa8\x0c,)Y\xd3\x01\x15W,\xd8PP\x86\xa6p\ \xcb\x8a-\x17\xa1$\x1c1\xc1\x900\xe7\x06W<\x94\ \xc1\x5c\x9f\xd9Z\x22\x22\xe2P\xca?\x07\xc5\xf6\xb7~\ \xcb\x05[\x92\xe0\x05\x22&X\x19#2\xe4\x8c\x88%\ e\xfdg\xbe\xe6\x94\xd7\x98s\x9f\x7f\xa2\xa6!\x16\x81\ \x9c\x9a\x04#\x91{\xca\x84\x88\x88\x1c\xcb%[Z\xb6\ \x14Lx\x8d\x9cK\x1e\xb3\xc5\xf2\x1e9\xd0J\x92\xa6\ E\x84\xab\x95r\xbee\xc39\x0b9\xf4.\x10\x83Z\ \x09\xe4\x86\x96\x8dP\xd6\xa7\xdc`\xc6\x84c\x0cJ&\ \x00\x17\x94\x81\xec\x94\xbeH\xd1\xe5\xa4n\xeb$\xdbk\ \xc4!A\x82\xa1eE\xce1\xb79\x92*\xf4&\x17\ \xc4\xb4\xacx\xc8\xd7\x14\xb6\xc4!\x0f\xeb\ \xe1\x8e\x941\x13*r2\x01ObR2Fl\xa9\ i\xb8C\xc6\x8a\x88\x09\xc7\xe4\xd4\x5cp\xc6\x9a%7\ \xb8b\xcb\x98w\xd8p\x9f\x0d\x11gL8\xe5\x94\x9c\ \x88\x96\x11)\x965\x97T\x9c\xf3W\x14\x0f\xd8\xf0s\ \x12\xfe\x85{<\x14\x91\xcf\x15\x8d\x88\xae%\x8cIP\ t\xd4\xd4\xa4D\xe4L\xc8PT\xd4B]i\xa4K\ \x1b\x09\xf0;\x22\x97\xaa\xb9D\x13\xfd^\x89T\x97}\ vB\xe5p\xd8_v\xa2\xfb\x93\xc9\x13\x81\x9c\x88\x88\ N\x9e\x87\xcf\xcf\x0c)\x1br4\x1b\x19|N\xb9\xc9\ \x94\x89\xa4;\x055Sn\xb0\x22g\xc6\x98%%w\ \xa8\xe4\xc7\x97hRZZ\x22n\x93\xb0a\xc3},\ \x8a\x96\x8a\x02\xc3\x88\x13\xd6\xacXp\xc5Vr\xd9X\ \x0e\xb7\x17\xee\xebd\xc27%\xa2\x1d\x00\xc6\x95\x8c\xee\ [\x16\x182\xc6L\xa4\xf3\xd1\xa1\x89>z\x01g\xd9\ \xc9)P\xc2\x7f\xa8h\xa9e\xc2\xb2\x11\x18\xafsD\x8aa\xc4[\x18jN\x19\ \xd31gE\xc4\x11Y\x98\xddT\xe4\xcc\x19IO-\ b\x84b\xcb\x05\x17l\xb02y:\x95WQ\xb3\xa0\ \xa2\xa1\x0aY\xe5Z\x06\x16<\xbcW\xb2\xe6\xbfsI\ \xf7\xa9\x83\x01\x0d\xe5\x19\xd5\xa7\xc7\x12\xdb\xc0\xb7N\xc8\ \xa4\xe4\xed0d\x8cd\xb6\xd2\x05\xaaq\xff\xdf\x11\xad\ \x8c\xcb\xfb\x03\xb8\xa6\x22e\xc4\x9c9\xef\xb1\x024[\ \x8ex\x8f\x9c\x0a\xc5\x11)\xf0:W4\xccY\xa0x\ \x0b\xc3M^\x93\xe2\xc8\x8a\xa0\xeb\x11\x89\x88\xbce\xa4\ \x94\xd4d\x1cs\xcc9\x05G\xcc\xb9\xa4\x12D+!\ \xa6\xa3\x10\x0d#M!\xe7\xe1\x8a\x11\x11sR,\x0d\ \xabO.>\xd9r\xc4\x0d\x15\x7f\x97\x8f\xb0\xe8\x7fL\ \x7fi$\xe0x\xe0}+>\xbac\xca(\x08f\xea\ @\xf3\xf1\x0d9?\xc2>F\x93\xcaA+\xb8\x8d\x22\ \xe1\x06\xef\xb1fE)\x99\xdd\x92\x15%#\x8e)%\ \xc9ih8&g\xc2\xcfy\x8d4P\xd5bf\xdc\ &\xa7\xa6%bJ\xcd\x9a\x96\x1b\xfc=o\xf0G.\ iX\xb1\xc5\x91\x92a\x98s\x835O\xd8\x023\x14\ \x1d%\x8e\x9a%\x86\x8a\x8a)\x1b.y\xc4\x13\x9e\xf0\ 6\xa9;Q\xee\xd9\xe1S\x13\xff*v6\xa4\xd1\xbe\ \xd5\x87\x94-\x99\x88'2P\xb4U\x01\xaa\xc9Y\x09\ \x0c\x97\xd1\xe1\x18\x91\x0a\xc2\xe5\xb9\xbb\x8d\xa8:$R\ S\xae\x98\xb1`\xcc\x11O(\xf9\x09\x0b~\xca\xfbL\ \x84\x13\xe9\x95(F\xbc\xcb\x1b<\xa0\x22%\x13$\xc4\ \xa00\x9c\xf06_\xb2\x02f\x9c\x10\xe3\xc8\xb8IJ\ %\x91\xc9I;\xd03;\x1e\xb0%\xa6\xe2\x18E\xc1\ \x8a\x95\x0cp>\x13\xb3\xecY(^\x83pM\xc5\x16\ \xcb\x14-\xe5\xae\x09\x83\x08CB\xb0\x95\xce\xe3)\x8e\ %#\xd2\xa0`;\x22\xc7\xb0\xa6&eBMA\x1b\ \x84|k\xa0\xe0\x989gt\xbc\xcf\x92\x9f3\x17\x08\ 0\xc2\x91p\x8ef\xc6[\xfc\x15\x87\xa2\x91\xeb\xa4\xf8\ \x9a\x86#~A\xce}\xb9\xb4\x8e)'\xc4\x8c\xb8E\ J\x11\xf8\x94)\x13rj\x12F\xc4\x14l\xf8&\xf4\ F\xddw#T>\xcd\xf6\xddD\x0f\x7f\xa4LD\x04\ \xab\x0b\xf4\x9e\xbe\x17\xa9\x03/\xd7\x90\xf0\x0b\xfe\xcc\x9a\ \x96\xa9\xa0\xdd\x0d\x19\x19\x8e\x9cDx\xd3\x1b\xd6\xb4X\ \x81\xe4\x96$LPT\x18\x8e8\xe1\x88H\x5cqM\ IMLI\xc3\x88\xdbh\x0a\x0a\xa9\x14\x12JV\xdc\ \xe0\x94\x8c\x8c\x19k\x16d\xbc\xcd\x11\x8d8\xdb%W\ bN\xcd\x88cb&\xdc\xe6\x04\xc5\x96%5\xb3\xbd\ \xf9\xe1k\x13\xaa.p'U\xa0g)\x99\x90\xea\x02\ S\xc9\x86\xa4j\x9fZ\xfaSV,i\xc3\x90\xe3\x09\ \x9a\x96\x8e\x94\x88\x8a%\x05\x8e\x94Q8\xb8\xdf\xf2\x06\ \x89t(\x157\xe4\xda\xf9\xe2k\xc3\x86c\x1eS\x01\ sb\x96<\xa1@\x91J\x16aY\xd10\xe3\x16\x15\ _\x93qG\x94\xf0\x0c9%\x8aD\x86/-\x8a\x84\ 9o\xf361_r\x0e\xcc\x99_3\xe2\xb6g\x88\ \x9e][\xcb\xb7\x84\x96\x84\x1cE-\x9d\x22\x85\x15\xe2\ \xd0\x8e\xb2\xd3\xf7\x13\x97\xbcK\xc2\x9f\xb8\xcf\xbb\x9c\xd2\ \xb0$\x92\xf9\xbb--\x1a\xc7\x98LZ:\x1d[^\ GS\x921c\xccH\x8c\xa7\x02\xfb!\x91V\x8eb\ B\x22\xd5\xa6\xa3eMBFL\x8d\x16\xbd\x02G\xc5\ #\x22.\xa4\x8d\xec\xd5n\xc01!'#\xa7\xe2\x09\ '\xe4\xc4\xdcb\x8ba\xc6\xe4\xfd\xf6\xc0\x18{>\xa2\ \x07\xcf\xbd?h\xc88\x22\x13\xe1\x94r\x8fK{]\ ?\xb9\xc61\xe3]\xcex\xc4\x82\x113\xc1\x0a\x12i\ \xca{\xca\xea\x15\x17\x94 \xc2L#F\xa2-`\xf6\ \xc0\x80\xbe\xfb\x19\x8bZ\x89!c\x83\x96t\xde\x1b\xad\ $!\xe7\x84\x82\x96\x9a\xf5\x80\x9e\x10K~3\x165\ \xe5\x98\x11c\xc1\xb1\xbc\x19\xf5=\xf3\xdd>\xa2\xfbx\ 7\xa8\xd4\x0a\xfa\x90\xd2\xd2\xb0\x0d3v\xea\x19\xed\xc1\ \x84\x9a\x093\xe6\xdcc\x89\xe3\x98\x8a\x86B\xe6\xc5k\ \x0c-\x05\x8f9Gs\xc4L\x847Fdr\xa6\xa2\ \x019\xd4\xc90\xdd\x8811\x05\x86T\x84?\x9d\xa0\ \x14\xbd d\xca\x84\x92\x15\xad\xe4\xb8\xad\xcc%\x1af\ \x8c0h\x12\x22\xc6\x8c\x04\x97\xcf\x18\x93]\xc3\x938\ H\xa8\xb8\xa7\x05\x91\x8cI\x18\xcb\x19\xe8\x84\x98\xe3\x06\ \xbd\xa2\xa7\xf9\xd4\x095\x96\x8c[\xb4<\xa6\xe3\x01\x05\ [\xea0\xc8\xf0\xae\x08~F\xcc\xb8\xc5LD[{\ \xd1>'\x1d\x8d^\x86OI\xcd3\x16q\x8d\x98\x89\ \x08\x80Ul\x88%\xd3l\xa5\xfb\x922b-\xf5\x8f\ \xef\xa0\xc6r1\xf5\x80\xbf\xefU2'd\xd7P\x0c\ \xa3\xfd\xb9\x0c\xf3E\x8c\x96\x14fB\x8e\x15\x03\xf4s\ \xbe\xee\xda\x86\x99\x12l\x19\x81\xe1f\xa2B\xd9I\xfe\ \xd03\xa7|\xf9\x1e1a\x12\xc6\x1ct\x98\xf3\xeb\x82\ FY\xaf\x03\xe1\x03\xe0\x98\x05\xe0\xb8\xc5ZN\x85W\ \xa4\xf2=\x95&D\xbbJF_SrR\x226\x22\ \xd8\xd53{\xfc\xe4W\xca\x8c\xe4yM`\x87\x22\xba\ L\x8e\xb5\xa8\xce&\x82){\xee\xd4n\xc0L=5\ \xee\xea\xbb\xcf9\xb0\xa5$\xe2\x88\x19[\x22\x22!&\ \xf6}h\x07\xa4\x22\xb5\x91\x1cL\x89n\xe5'\xec\x8f\ \xa5\x8c9\x92~EB\x22m\xc0\x9a\x0d\xb14\x00l\ `a\xdd\x1e\xcc\x18:,9cQ\xca\xb4\xf2\xf3-\ \x8e\x11\x13\x92\xff\xc0w\xe5\x11\x86\x9a\xee\xae\xfe\x22\xfd\ p$\xc2\xbb.\x8c\x86 \x8aa\xc3Y\xbb\xc3\x19\xd1\ X\xe4\xf2\xb4\xccV\xa5r\xdfw\xf4\xe0X\x14\x0a=\ \xcf-:\x18g\xd9]\x89>s\xf5\xc5\xde\x09K\x96\ \x14\x22\xeb\x92\xd1\xb2e\x8b#\x97\x11%\x83b\x22=\ \xf9JH\xea\x8e\x96[L\x85\xea\xd4Ia\x8e`-\ \xc95M\x9e\x83\x06O\xf3\x0f^t\xbb\x91y(\x82\ \x97(\x06\xa3\xc9\xd7\x83\x1bI\xd0\xb6\xd744\xd2G\ \xf0\xd5l+ET$\xe9:a\xb0\xdaI/\xc5\x86\ \xb1\x84\xa1\xac\x82#f\xcc\x8c\x0cC\x8db\xcc\x5cb\ X\xcd\xa5\x0c\xec\xa7L\x98\xa0\xd9\x08\xa1TI\xdd9\ e\x22\x17\x89\x81\xb4W2\x88P\xcf\xbc\x1a\x11\xe6\xf3\ \xe5'\x96\x09\x19\x1b:\x1e\x10q,z\xb3\x06E\x8d\ \x22\x0d,}\x0e&lj\x8c\xa0\xc4}\x08NCH\ \xd3\xe4\xe2\x15bY\x13\xa1\xa4\xcd\xdb\x89o\xb0\xc2\xaa\ &\xf8\x8d\x9e\x91\x9f0\xe7\x98\x05+\xd1\xc7\x9eq\x07\ K\xc9#\x1e\xf3\x95l\xdb8f\xc49\x15\x0d\x11'\ \xbc\xc9\x1b\xccY\x90\xb3\xa0\x90\x86\x94\xe7\x5clQ\x8c\ \xdf7\xd7\x080\x1d\x14]\xfas\xfd\x89\x95\x09O\x0f\ \xb8\xd5\x1c\xcb\x88\xa0g,\xf9\xb7\x13]\xe3,M\xf0\ 3\xbd\x12\x90f(\x0d\xea\xbb\x1c\x1a%\xc0H+\x14\ \x94N\xbeJ\x0fX\xffJ\x1a7~\x9et\xcc\x8cc\ \xd1\xcb6T\xc4d\xcc\xb8\xc1\x86%+*\x1ck6\ \xe4\x8c\xc8\x99q\xc4\x18\xc5\x86\x0aD\x92\xa7W\xd8\xed\ \x06\x93\x1d\xea\xbb\xae\x86\xc2\xdc\x8bdX)\xa1\x10\xd7\ g\x84-w\xc6\x88\xa9\xbc\xdcN\xc6\x8f\x87Tc\x13\ F\x9aL\x18\x91v\xe1\xb0\x9b\xa0\x13\xd5\xb3!\x1bZ\ \x1aZ\xf9\x0a\x13\x92\xfafo\x14\xbe#\x22a\xcc\x94\ \x0b\xd6T(2\x1arf\xcc\x83\xc2\x88Wc\xd6\xe4\ \xcc\x99\x93cYS\xa2\xa8\xe4\xf5g\xd2\xb2n|\xc2\ x\x97{\xcf\xa5\x05D\xa4\xbf\xe7CC\xf4\x99\xfe|\ \xf6\x95'\x0b*\xb9\xe7\x0b\xe9]I\xa0}&\xe7J\ \x07\xa5\x97\xdd\xfc\x84\x11ZI+\xd5\x8a\x17\xdc#\x8c\ 7\xf7\x1c]+$4+\xd4\xe1\x9d\x86DD\xca\x15\ [\x22\xc6\x924y1\xe1#Zi\x19n\x03\xe5\xd0\ ;M/:\xef\x0d\x14\x0b\xaabQ\xa8{\xd7\xcd\x19\ F\xfb\xdckC\xfa\x11\xbfsw\xd5=}o\xfa\xeb\ )\xa3\xdf\xae$\x11\xf1\x14\xcf^R\xd5\x8b\x9b\xb0\x97\ l\xbb@\xcf\xd1\x81\x1d\xb9S\x18\xf1,\x89:\xa0\x05\ \x9dh\x8cE\x81j\xeeg\xc6b\xd9\xd5U\xc2\x80o\ \xd9\x9f\xa8Z4\x95\xbdf\x9d\x92\x04\xca\xb3\xabgA\ \x18\xb4\x15\xd2P\x1df\xba\xb4(mj\x12\xf4=\x9e\ ?\xaf\xa1\x88\xb0\x1f\xb5\x9f\xda\x0f@}\x11\xdf\xe3\x1e\ \x7f\xf0\x92\xae:0\x18]\x80s\x87S\xdf\xc3I`\ B[\xc5\x89\x1cF\x07\xf2\x06\x1a\xc9\x1d-\x91\xac\x84\ \xb0\x81P\xda\xd1\x89z\x89\x8fSCSF\x02\xc1\x95\ ,1$$$\xb42\xf9\xab\xf1\xa3V\x08\x9e\xe2\xc7\ \x96|\xa9\x88\xc4\xbe-\x0bYH`\x9e\xef#\xc2D\ \xe6]\xfb\x81\xfd\x80\xe3\xee\xf7\xed\x87\xfe\x09\x1a&\xd4\ \x02\x89\xc6R\x0dF\x83Etj\x8f\x89\xbf?\xc7\xdd\ \xcf\xe29\x19\x80\xe9\xf5\x08\xc7B\xf4\xe8\xbf\xce\x8b\xf8\ \xb80\xe7\xdd\x086\xe6k\x8b\x02\xcb\x98\x8a5\xe7\xc0\ $\x08A\xea0\xaa\xf0h0\xaf\xe1\x85@[\x09\xdd\ \x1d\x1d\x1b\x964\x02\x15\xf1<\xa2H\x98\xa2\xba\xeb\x8e\ \xa1\xc1~\xd8J\xd9\x1d3\xa3\x94\x9e\xe7\x88Lx\xb2\ n\xf0f\x87\x03k:p\xe2\x94\x98\xa1\x92\xc3n\xe5\ \xd8&\xc4\x92n\xa9\x103\x96@\x22\xacY\x1b\xe4\xc8\ [*\xb6,\xb8\x92U4K\xb6\xa44\x83\x8c\xd4\x8a\ \xf6\xd8F|\x91\xbfFH\x03I\x89\x8c\x9f7e\x1c\ \x14\xd5\x9fC\x14\x11H\xffW\xcd?\xd8_\xee\x18\xab\ \x1d9oPI\xc9\xachEzG\x0d8\xfcJn\ \xb3\x158\xc4Jk\xad\x13U\xca\xde9\xf6\xfau\x11\ \x0d\x95\xe8\x9e\xf6\x18DC!\xaa\xd9~\xed\x80\x1fH\ X\xf2\x0d\xf79\xa7%\x13~\xe6\x8a3&(4\xb9\ \xcc\xff\xa80\xc6\xe0I\xa8\xad@<\x15\x19\x19#`\ C\x8d\xe5\x16\xf30\xde\xaf\xbe\xdbG\xf8\xab\xe1~\xd9\ J>\x80Hx\xb6ldl\xc5\x1d\x0c\xb23\x18y\ \xb4a\xc8D\x85<\xd4I\xba\xdc\x05\xef\x1f\xe1h\x18\ \x03\x9a\x8a\x0dW\x94(Q\xaf\x8d\x84\x9e\xa6e\x98\xf1\ \x09\xdf\xf2\x80+\x11\x1a\xf6\xb3\xc8%\x0b\x9e0\x96\x82\ \xae\x7fCGA\xa7\xdb\x0a\xa3\xc7\xbb\xe5\x94\x18GA\ G\x16<\xc4s\xc2\xe7!\xf3\xb6\xa7\x9c\x1bR&\x81\ \xffx8\xdbMP\x88\xda]/\x7f[\x1b\xc1\xb1{\ \xce\xb4\xe7D\xe6D\xa2\xa1\xdeQp\xc6\x9f\xf8\x8a+\ :\xc6\xdc\xe1\xe7\xbc\xcb\x11Hs\xb9\xe6\x82\xfb|\xcd\ \x19\x05\x8eZ\xd6\x0b@\xcd\x8a\x0bN\xc9(\x84\x18k\ \x80)\x95D\x8dZ\x94f<\xf9\xcd\xf7\xef7(\x8e\ 9!\xf9\xb5\xbevh7\xbaNe\xc8\xdc3\xbfw\ \x1fva\x8e\xd6\xffm\xb2G\xf8\xe6\xa9\x89\xbd\xc3\xa1\ \xd5\xdd<\xa7\x0fz\x06M*P\xae\xc6p\xc1\x86G\ |\xc9\x7f\xe5>%\x86\x9c\x85<\xf3\x84B\xf4\xf0\xae\ 8\xe3\x9c\xc7Th\x0c\x95h\xe9\xf7\x8b\xaaRr\xf9\ \x0a\x17vz\xb5\xb2Xb7\xa5\x9e\xc8\xfe\xd0\x13\xee\ p\x93\xe4s\xf5\x22>\xa2\x97\xe0R\x1fE\x94\xceO\ \xe0\xd9\xa0\xda\xb1\x1b#\xd8e\x96\xfd\x84\x94\x1aL\xe6\ \xb8`,M\xcdV\x18+~\xcf\x8a\xef\x9f&\xb2'\ \xa3d\x03\xdc`\xce)\xb7iP\x9c\xd1\x92c\xa9x\ \xc2\x9a\x0b\x1e\xf1\x0d\xe74\x02\xbc\x19\xaa\x90\x94\x17\x94\ \xb2\xf7\xb1\xd7\x0fh\x04\xd9\xf4\xf9E%r\x1a\x19\x0d\ k\x11\x17\x9c\xffc4\x08\xf5\xcf!\x9c*\xf1\xbc\xf5\ \x9e>\x90\x12N\x15\x073\xbf;Q\x83\xee\x80\xd3\xdf\ \x0a\x93\xa1\xa0\x09z\x03Y\x88\x121\xc7T\xe4\x8c\xb8\ \xc9\x88\x9f\xf0\x1e7Ys\xc5\x96\x8as.XRr\ \xc1\x19\xe7\x5c\xb0\xc5I\x85c\xa5\x83\xb5+\xed;\xc9\ D}p\xeeB\xb2o(\x04\xe3\x8cXq\x85\xc20\ %\xff\x95z\xbe\x8f\x18\x1e\x19\x8d#~\x1f\xcc\xa7\xd1\ \x87N\x9ef!#\xe6\xfb\xcf}\x98W\xee\x8fD\xd7\ \xa2\xad\xee\x88\x85a\xbbC\xaa;Q\x9a\xbc\xc1]n\ \x91p\x9b)\x1dcF\x94<\xe6\x09\xf79\xa3c!\ S\x19\xfd\xd5\xf3\x1d8\x15\x0a\xbfH\xc2%\xe2\x8e\xdb\ \xb0\xd9\xa1o\xe1h2\x0c\xe7,\xb8I\x17\x84\xdb^\ h\x12x\x07\xc6\x8d\xee\x81\xfbh7O{\xee\xf4\xc0\ c\xa8\xa7t@\xf4@\x92Q\x05\xde\x84W\x17\xedq\ \xea^\xbb\xba\x11\xec\xeb\x16\xa7\x82U\xc4\x94\x02\xd3\x97\ ,\xd9PsEAK\x02h\x09\xd8=\xb5\xd9\x08\xd6\ \x19I\xab\xc6\x84\xb8\xe4'\xc5k\x01\xf0z\x95\xcb-\ \x85\xcc1\xf7\xa3W/0\xe5w\xa8$gB\x9d\x91\ \x0d\x86\x81\x5c\xc0\x13v\x9a\x0evO\xa8\xc0\xdfaO\ F\xcdH\xc3\xbcV\x9fox\x86\x85O\x81\x0d\x95(\ \xa6:\x147x\x0f\xc3\x05g\x5c\xb1\x09\x13z\xa9L\ \x89\xf8\x81\x83)sN\xc9\x85\x9a\xd6\x05\xf9\xd7\xbe\xd2\ \xb0\xe23\xeep\x0bG\xc21\x11\xb1h\xa9\xbf\xf4\xb8\ \xe3\xd3\x9f\xda\xf7\xbe\xdc0\x0b=\xc8,\xfb\xa3\xd9\x0a\ \x8c\x13I\xd3h(\xed\xe8\x02\x03\xa6\xc7=\xbd\xea\x99\ \x0f\xb3\x8e\x19wy\x9d\x87<\xe1L\x96\x18ZRi\ \xf8e\x18\x8cH\x8f\x0f\x05\x7fz\xd1\xdf\xdd\x03\xf1\xe0\ \xaf\x91Nl|\xc0'\xfd\x1e\xdb\x1d\xa3\xcf\xcc'&\ LY\xed\x9c\xe5\xae\x05\xd8\x0a\x94\xdaJ\x17=\x91\x9e\ \x05\xb2\x10D\x0d\xc6g\x9d\xb8\xbeNh\x00Z\x06\x9d\ *:\x09\x8bcr\x0cWB\x15\xf5\x13@\x91x\x9b\ \x89pg\xfa\xael'\x86p\x83\xa1\xe7R\xe4`\xda\ \xd0\xb1\xbf^\xef\xe8\x855f\x82!~\x13\x07\x85\x80\ \xa1\xf4\x81;\x80\xd8\x90&\x8c\xa7\x96\x8c\x06\x94>\xf5\ \x94<\x06\x82ED\xa2g\xd4\xc85\xd4\x228>c\ \xce\x0979\xe5&\x13\xc6\xe4dL\x983\x11\x9a\x92\ \x09\xc5]'\x8f\xa0\x96\x1e\x8c\x15\x10'\x91\x93h\x18\ \x87\xa7\xee^U6\xa1\xffT=P\x12\x1anrw\ \xe1\x87\xb9\x90\xdc\x18Y3\xa6\x02S!\x0aC\xd4\xfb\ J\x97f/\x18k\xa9c\xc01\xe6\x88HZ\x8e\xc8\ 8c$0\xbe\xde\xd3\xa2\xe8\xa4\xf4\xaaCd\xd3\xe4\ B<\xdc\xd00b\xc4\x0d\xd2W[+q\xdd \xcb\ ~\xa6\xd0_\x92\x9d\xcam$\x82\x15\xb1\xec\xe4$\xcc\ wG\x03!`\xbb\xa7\xfd\xd1\xbf\x0d#\xfa@~9\ \x88\xa6c\xc4\x14EFMM#\xacY'\x88\x85o\ \x08t\x81\x9a\xe0D\x14\xb8\x0dM\x81)\xb9\xa0\x990\ a\xceMr\xf5\xb4\xb0\xe8+\x18b\xe7 \xf7\xc7\xdd\ \xbb\x10)\x8b\x06]\x15-\xc5\xf7\x84\x09\xe6\xf3\ \x97I\x17_\xea\x97\x1e\x5c\x0dwM\xb6n\x07\x93\xa3\ Q\xd8\xd7\xebOJ\xca\x9c\x98\x93\xa0/\xe8\x04\xafX\ \xb3\xa1\x92E\xca\x95\xc0p\xbd>m\x8f>\x18\xf9\x0a\ #s\xe0\x89\xb4\xf4\xac\xd4/\x914\x95{\xc3L8\ a\x8e\xf9|\xa8\xb8\xfc\x03_\x8dg\x7fC\x13B\xa1\ \x8f\xf3>\x90%\x12I\x12\x19_P\xb2o\xcfk\x90\ \xcc\x89\xb1\x94\xb25g\xc5\x13\xceYJS\xf7\xb10\ a*i\x0c\xf7\xd4\xa3\x96\x9a\x0c\xcb\x8d\x80O\xf89\ \xafB\xb2M\x88\xc8\x85Jv\x9d>\xd6+\x19b_\ oP\x13\xbf\xaf\xbfR\xe1\x12\xa8\x00\xc6\xd8 |\xb1\ \x13f\xb2\x82*\xf5\xbb\x9d:\xd9\x84\xd0\x85\x5c\xb4\xa2\ \x22e\xcc\x94\x115[@s*\xcb/K\x16X\x96\ \x9c\xb3\x92E\xec\x17T\x92+(&h\x96\x1c\x91\xcb\ 8S\xc7Z\xf2\x0c\xef\x80s\x8e8Qj\xa0\xa5\xf5\ E.d\x02\xdc\ k\x0f\xd8\xb0\xdcr#'\xa6\x14\xbe^*Sf^\ \x0c\xccW(\x06G\xc5\x96-\x85\xd0\x0a'\xdc\xe6\x0e\ \x93_\xeb\x17H\xab_\xd9\x10\xa0\xd0_\xe8\x0f\x87m\ _\x06p\x8d\x0a\xb3=n\x0f(u\x83\xc9R\x17\xe6\ ~\xa64\xa2IP\xe1hX\xb1bI-\x0c\xbcZ\ \xd2m+J21#\x19u\x8e$\xaa \x1f\xf3\xaa\ C\x05#\xc00\xe6\x989\xe9\xe7j\x0fH|\x81k\ \xbfz)X\xc6R\xb1rW,D\xb9#\x0aD\x9c\ ~!\x95\x19d\x8d*8W\x7f\xf8\xfbU\xb8\x8dl\ }\xeed\xf2\xb7\xa4\xa4e\xcd\x8as\x16\xa2Z\xecD\ \xe6\xb9\xef\xc7\xfb\xb9\xb1\xa9\xc8\x05&a\xbd\x89\x1fr\ )iH\x898\xe2_\xf1\x0b\xde}\x7ft\xefE\xa3\ \xc5+F\x0dpw{\xe7\xd8Jq\xa5\x06\xad x\ z\x99\x04\xa1&\x1c\xeeOqTr\xae\x22i\xff\xb4\ 4\x8c\xa4\x87\xea\xcb)B\x87\xd3\xc9(\xa6\x9f2\xac\ \xe9h\xc8$\x1d/E\xba/A\x91s\xcc\x8c\xe4\xde\ \xcb]\x8bW2\xc4\xae\xd6\xace=\x91\x1e\x90\xc9z\ \xfd\x07\x0d\x07{\xba\x86\x86\xf0\x90Y#\xe6t\x03\xfc\ 3\x91S\xd6\x0d\xb8\x15\x9d,.H\x05\xa1\xb4\xd2\x0f\ \x89\x84\x13\xb3\x116DB\xe47\x94\xff:~\x85\xf7\ \xf3\xca\x86 L\xd8\xc5\xc2\xabi\x05L\xd1\xb2\x1fg\ \xa8\x83\xbc\xaf\xda\xe0\xeb\xc5~YT+yE$\x9a\ \xc6\x99\xd0\x8az0\xcfg\x13\x0d\x0c\xba\xf3\x0a\x84\x5c\ \x5c\xc9\xd0\x82\x01&\xbc\xc6-\xf2\xcfy\xe6\xce\x84\x1f\ \xd0\x10\xea\x9e\x0ac\x91v\x80Q\xf6\xfb\x90\x5c\x80\xd2\ \xf6+T\xb5W\x07j`6h\xc9\xb4t\xc4\x8c\x85\ \xdejdgC\xbf\x97/aD+\xe3k;1\xd8\ *\x84\xc8\x9e\xf1\x7f\x837\x99\x7f\xa6\x9fA\x88\xfdA\ \xa3\x06\x83\x89p_!\xf4\xe9\xb2G\x9a\xfb\xb3a\x07\ {\x9a\x14\xfb\x8b\xca\x5c(\xd9\xd5\x8e\xdbIG\x1a\xea\ R\x9f8\xf5\xcc\xcb:@2=\x89\xb8'&9\xd9\ \xe9\xe7\xab\xdb\x9c;\xdc\x22\xfd\x8d\xbbF\xda\xf7\x07?\ \x11*\xd8?\x96\xa1\x14\xff\xc4\xa2A\xa6a\xd9WB\ \x1cn\xe3s\x831\x07\xcbP\xf8K\x09\xf3\xba\x11\xfe\ m,\x86h\xc2\xf9JC\xfb\xc6\x89C\xed\x04\xe2Q\ Dd\x9cH\x22E\xd82\xfa\xe3^\x8d\xa0bl\xc4\ Y52^\x9c\x0d\xea\x8f\xe1\xdaJ\xbd\xa7\x8d\xbb\xe3\ \xe0E\xec\xd6\xa1)\x81\xd9l``\xf7*\xc9\xdd\x01\ \x19\xd9\xc9\x89\xb2b\x8eZ\x96\x1a\xa6\xcc\x99\x91\xa8\x97\ l\xe8\xbej\xad\xb1\x93\xe8\x8fI\xc8D\x12)bJ\ N!\xf9^?<\xdd+\x9f\xfa^D$)\xd8\xae\ \x8b\xd1'eV\xc0|'\xe4\x0fG%\xd8c\xaft\ \xec\xf9\xd4\x1b\x09\xd8\x08\xb8W\x07f\xb7#\xe1\x94\x9f\ \xf2\x9a\x0cM\x1f.\xb0P?^\xd4\xe8g2b\xd2\ @/\xadE\x97\xb8\x17\xedK\x84\xd5\xdfK\xf1\x9ap\ 6\x5c\xd0\xadf\xb0CA\x05\xb2\xea\x90Lbe\xdd\ M3\x18si\x82x[?\xf48b\xc2\x9c\xec3\ 3\xd8\xdc\xe3~\xec\xf0\xd9\x17\xd811\x19\x994\xde\ J*\x12)\x85\xfd\xbf\xb9d\x85;>n\xb4\xb7\x9a\ F\x0fL\xd1_\xa96\x0c\xadt\xe2\x10+\xa97\x1a\ i\x05\xb7\xf2\x7f#T\xf9\x88\x88\x11G\x9cpL\xfa\ \x9bg\x13A~PC\xb8=\xb4\xb8Ou;Jy\ ym\xd0\xd47\x18\xe9\xf1I\x05\xa1V\x02\xed+a44\ r\xe3\x9dt*k\xd9\x93P\x00\xa5\xb0\xf2=\xacW\ \x0b`\xe7EG\x8d\xf8\xa2\xa7\x89\xf2\xee`\x01\xef\x0f\ `\x88\xa1{\xdc)\x9b\xfaC\x5c\xa2ei\xba\x95\xb2\ \xa7\xa6F\xcb\x0cv#\x8a\xb7\x1eH\xa9eT5\x15\ x5!a\x11\xbe\xd6\xca\x89h\xd1\x82Hy\xde\xe4\ \x15Kj\x99\xfc\xed\xb3X\x9f\x95\xf4\xdb\x04sQ\xcc\ \xcd\xb8-C\x94Jh\xa6\xee\x87\x86\xeaT\xc0y\xf4\ `%%\x03\x8e\xad!\x16\xf5(\x1dj\x91.PG\ T\x98\xea\xf3\x12I}\x83\xb6\x1f;\xb0\x92\x84iY\ km%Dv\xa2k\xeb\x85\x9e\x0b:\xe9\x86\xd90\ .\xe1/R'.;\xe6\xfb\xfd\x8a\x9e\xe7\x16\x9f>\ !\x84\xbdk=\x01<\x95&\x8dw\x8d\xad\x88&\xfa\ \x99,\x8fGUat\xc0aD\xbf\xce\x0f\x92 j\ D\x91\x9c&\xa4\xcd\xd7p\xc9\x8a\x95\xccsUX\xaa\ \x81\xe9\xbdw\xf0\x17\xc9\xf3q\xd3\xff\xf0\xa3\x19\xe2\x90\ \x8c,\x9c\xa8O{\x9c@\xef}\x9e\x16\xf9\x95\xbe*\ 0R#tAr~+%\x92\xe7M\x8c8\x0a\xfb\ \xc2\xbd!\x12\xa0\xa4a\xc5\x15+ja\xdd\xd6\x92R\ 9i\xfb\x1bQ+\x8d\xa5WR\x13{\x1d\x8a/~\ 4C\xec\x17\xdf\x04\xd2F\xdf\xb9\xe8\x8f\xb5\x92\xcc1\ \x91P\xd8Osi1\xc2\x8eQ\xe9'4:\xb6l\ \x89)\x88Ej\xd3W%3Z\xb6,\xb9d\xc1F\ \xb6\xceV\x92\xa5\xd8\xa03a\x84Kg\xa4mh\x84\ M\xa1\xf9\x91\x0d\xc1`\x8f\x96\x0e=\x8d\xbe\xba\xec\xd9\ )\xb1\xf44\xfb\x1bo\x05J\xab\x83\x06\x80\x966~\ +\xca\xd6J\x9a\xbe\xb1x\x0e\xc7\x94\x8a%KVl\ \xc4]6ar\x18\xd1>\xd2\x03\x95\x81&\x94v\xd9\ \x8fk\x08\xb7G\x1e\xb3\xd4\x1fd_@\xf7I#G\ \xd4\x0d\x1at~\x9b\xa2~Jp\xa5\x0e\x07\x1aa\xcb\ \x1a\x99\xd6\xeaX\x8b\x98x\x22\x18e*\x02{\xb5\xb0\ _\x90<\x03!\x94\xf5\x1a\xecJ\xce\x99\xef\x8d\xf8z\ '\x82\x1f\xd3\x10}\x82\xe2k\xbe\xd5\x1f\xdcg\xe67\ =\x10\x12S\x85\xd0\xba[E\xd9\xc9t\xae?\x07\xad\ \x9c\x1f#\x88U_\xbeW(\xa9\x1a*Y\x8eW\x0d\ V\x0f\xda\xbd\x15D\xbb,\xf6\xb0\xb3\xe6\x13\xb0^n\ \xf4G3\x84\x93\x14\xd8\xa0\xa9\xf9\x8b\xfb\x9a-\xff\xee\ \x93c\xa9\xf9Z\xd9\xba\xaa\x84A\xe7$zk\x12*\ \xb6(Q\x83K$\x1cZ:\xe2\xa0 \x13\xcbFV\ \xbf\x18\xc2\xcaI\xe8\x85v\x86\xab\xb6u\xc0\xc34=\ O\xbb\x0f\xd2\x9dD'\xaf\xaa\xa8\x9f\x8ak\xdf\xcd\xf6\ x\xce\x98\x82{j\x99m\xcd\xa5\xfb3\x7f\xe2[~\ JE\xf5\x89\x0d\x9e\x82\x01\x04\xa7C6iD\xf0\xa6\ \x8f4\xdd\x80\x07\xd9ObyDa&\xe2\xbd\x9d\x90\ \xc8uX&\xc1\x80N`\x0et\xafv%{&\x84\ \xb3^\xdcuX\xb6\xbd\xc2\x89\xd8\x0f\x90;\xce\x91\xc3\ \xb2p\x0b.\xf8g\xfe\x09\xc5\xbb\xfc\x9c\xe3\x01\xbcF\ \xc8\xe4z\xb3\xf4\xb1!\x11\xd8-\x92\x1a@\xc9\x8a\xed\ \xed \xb86\x02\xb3\x19r\xb9.]\xd8\xe5\xea\x06h\ \xa6\x19\x0c\x1e\xa9\xbd\xde;B'\x88H\x19\xc9\xc6\xa8\ \xe1\x93\xfe\x1e\x99\xe5.?\xef(>\xa8\xfep\xc9\x1f\ \xf9\x923\xfe\xcc%\xbf\xe0\x7f\xe5]R\xb6\x942\x82\ \x14\x0dXl\x04i\x1c_\x1a\xa7\x02\xca'\xc2\xa0\xf4\ \xdc\x88\x9d\x80\x8fO\xd5\x1fa\x84y]\xcb\xa2\x80\xbe\ \xfepb\xd8\xe1\xe2\xc4C\x05,G%\x9ae\x89\x08\ \xba\xb8\x01\x14|\x1d\xf3\xef\xa5\xa8C\x16G\xc5\xa5{\ \xc89_\xf2W\xbe\xe6\x9c\x98\x9f\xf3\xbf\xf1&\x0d-\ \x0bY\xe6\xa0\x83~\x84\x0a\xab\xb2u\xc84z\x8az\ \x22\x99BD\xc4V\x8a\xea*\xc8\xff\xf5\x88\xb4\xa7y\ X\xe9|1p\xc1\xc3\x85sz\xeft \x9a\xa7\x8a\ \x8aR\xe8\xa6\xfa\x80\xc0\xf2\xca'Bc\xd9~\xb0\xfe\ \xc3\x05\xdf\xf0\x15\x0f\xb8\xa4\xe2\x92K~\xc2\xff\xc9\xbf\ %f\x032\x97\xa3e4i\x08\xe92\xe8}\xba\xc0\ \x911Rv\xc5\x14\xc2\x89i\xc2\x10Z<\x10W\xf1\ \x9a\xa8*L\x10\xab\xc1\xe2k\xb5\x17:w\xff\xa4\xd2\ \xf4k\xf6\xb6R?\x8b)\xfe\x12\x86\xa8Y\xb8o\xf8\ \x0b\x8f8\xe3\x9c\x0d5O\xd8\xf0&\xff;?\x93\x8d\ \xcb\x88\xcc\x8a\xf7\xd6\xf1\xc1\x8f\x8c\xf7\xdc\xd9\xee)j\ \xf9hGA*\x93\xfa\x8d4\xfd\xeb\x80^\xec\xc8$\ \xf6)\xb2\xda\xee<\x0cw\x91\x97r6[\x16<\xa4\ p7\xdfO\xee\xc5\x83\xc7\xfa\xca\x08\xd5c\xf7\x0d\xff\ \xcc\x1fE\x16Ss\xc1\x97\x8c\xf8?\xf8\xbfH\xb8\x12\ <\xb0\x92/1\xd2\x89:\xfcV6`\x01;I\x0c\ +\xd2\x1b7\xa9\x990f\xcc9\x89,\x1c\xd1\xa28\ \xd5\x84\xb0i\xaf\xd9\xd8\xd6\xb7\x15\xf7O\xc4VF\xe7\ \xd6\xdc\xe3\x02\xf8\x8f_M\x98\xaah\xaf\x0ez\x09C\ \xf86ks\xd7~\xfc\xff\xf0G\xfe,\xd4\xe0F\xda\ \xefo\xf3\xafp\xac\x83\xb0\xa7\xefSDhj\xb1\xe1\ n?g;\x98\xc1\xe8\x84\x89\xb9;\x11\x09\x15#f\ \x1c\xb3\xe4\x88\x05[\x1e\xb3d\x1b\xe4\xc5\xd5\xdeNz\ \xb5\xa7M\xa0D!d_F2\xa6\xa6`N\xc6\x82\ \xff\xca7\xac\xf97\xfc\x9d\xbb\xa1z\xe5U-*\xb9\ *\xd0\xd2w[g\xaf\xc9#*V\xcek\xdd?f\ AI\x1b\x10$\x98s*\xea>&\x88\xa3 \xd9\xc2\ ~W\x0bI\x88m \x07\x0cW\xd2\xfa)\x8d,4\ \xf0\xfc\xc0Z\xce\x82\x95\x88g\x94\xc1Y\xda\xf0=v\ m\xc2af\xa9B\xaeY\x0b\xeb\xaa\xa5\xe1\x82\xc7\xfc\ \xdf\x9ccy\xdf\xcd\x19\xa9\xdd\xf03\xd2^\xec\x88\x04\ @\xba\xbe\x17\xf6?\x00\xe1\x00\x14\x01\xde&\x16\xb2\x00\ \x00\x00\x00IEND\xaeB`\x82\ " qt_resource_name = b"\ \x00\x06\ \x07\x03}\xc3\ \x00i\ \x00m\x00a\x00g\x00e\x00s\ \x00\x08\ \x0bwZ\x87\ \x00h\ \x00e\x00a\x00d\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\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() examples/widgets/graphicsview/dragdroprobot/images/000077500000000000000000000000001376617013100231575ustar00rootroot00000000000000examples/widgets/graphicsview/dragdroprobot/images/head.png000066400000000000000000000351741376617013100246000ustar00rootroot00000000000000PNG  IHDR2 pHYs  tIME 1ǬbtEXtCommentCreated with The GIMPd%nbKGD̿9IDATxսٲ]ǵelW6$uaYEE]Tዺ&zGAz1ꮮ|)GXMQnw}/r\s-l I v֘?V*,J~?SK*ڏr&ލh3Ԇ/[whN|zIAMʘ5[  KBNR&*) '!"f h:ʏTlQ(6\$& hbr9*9jp- K.hr1s bє{(݊l8`)34[V()i8c1- j)ws {{;ߜzCSU4ݲ>c4+6\f˖%%WLML"fLk̿1WD!8DgXI6AN NDͅ[RrC.GCJT(b4-ĤnbDd&xSŘ[>b$>j G9BM{ws\RaAK51cFh6Y1"oYrfIAa)Ibqq@,* CK"''!a}NzTTw/z̚+XbAK)3f,$8ck  |&@)b鰒ұe*;%qwTD¹e2.R֬C.9gK%glQ]Y!E3"!&Ba%?GoY(Y~@9SRӡp$@KEW\r2#W&OKRR j (bFĔ\"]Ӱ%f̆FpEC!&ƠYٷҐRͻAM3%pɂ7xk4ʎ{}.GYQ`8bD-*%1lP8RPrZ|D)[y(-VX6i1E* В9l. tl(ٰaq̜C"a%#&#``N"4H+Z41&a+>%Q&}¿J_qAR` #nq -%k"RcNHYSbhŘD 70lI`X3eCGMJXu4T|I)SrAm^~HꊊԀ- xc4KXpș0fƈ1Aӱ49P"^[[JZ** ݷX%eSqņ9D"Bs=2"7W]`Ţ7HspɚBR!b-)cbƜp) K T8ITcAq(24-s" 11ahтPt8j8K.9,{E 55+\J ,c%'5QKG":Ի\ eʘDO%C2fҒI sƜE*QC ~HȉI+6\cHIra0S aCJLAECMSahZB34 XՒN꓆ZjょHLW/A ] 3%16TlIs'3"%1cr(5%m1G ~CTJ9WpẴ6T(rRbRM?zZ|Kh)R&Lq~qlyLMfSF$T < (qt@ :#% 1C"(B0h飵l` 'ߙhGH)dY3lQc3fΘC`%GL8创& v,}GK%kBI8mˊ͆) -[R 语JDs% Niy]r+߾"%!fʄ k4bHzܹTJp&L k˂+.Ҡ1tX F\ѡp8[j:h)P_.X WX< b1)pΚK 昄#f̈hDߢKSQ`)(伓@:5%Kr1CBa-NC#yBGMN}r^wsJǗ GP+"fܦ[*J*J nrSHHBWK^pj*ZJJ JZ: [$" &b[InA~B;p1;Qݖ0cܲvO6@d5d`%WH36o7?1!7Rh,ED"e]C-[c ":d1Xޛtlqtq3 ` [ZfLɹ`f$!%&osc$by-vgL`mEc̖5U t@T% nRRH]3ۜ2̼ߖ5W,h,y"`x1'~H^ &ޱ]sRv94ZS$ ݙI5 '7?yig}\RH V0Thf̸ˌ99 GM#/Ic<SF| EvA$O;q-<MF^kM|`nÒs1RRj*J,ǼۼIBߚ3Z; ]1bI#xޥI u,[<=w ndPZ|FyΔ99+6IhȹOyLƫp{P-yH]V|O5=|F_Ns#xtO/)x 8x–R7ό41J|o߀8BBg/JųĻ~ts%3!`hXӲEa`w rOr C!l_WSXi ^ $q}-H)9$ 7 @_1[Z)q=o<Qx;zvw}rs`>ppv o]3&(!@R~r!Xq%GW6`}H ݁Ί #N8" )՞ yVng7}b悉}O4ءV`0b= Goa,'1i(>u|CKxl<41VY Jo9ctxJ˗v"AS nfYmZ l-bP4dNJ9o A'G-f`Ș0"_ah<&5h.=j '²"u%<:\̈9O$+F 'CL΄ )N:W[=z`-OOqYY_Gw.T}U۟J7(F-#4 99T 7IS!T`k3&Z#نmEDtz氂lQ_t\{ɾ)f =fᩢK:l n&P s34-c2,NtXjjJ"t ?u`}3좋=t (!]0eM+LJ 6D8r> @n1dL#qv/⫀LgOgIʮ4`1Y{##ܢI%2?G8fFFhqtKޙvᚨkp'EA6`=.>kGN.&<hAhH‡ydYd .J̈2DC0K' sݑJ7;F8Э]r La$<99%4ךB!"r=ɋP{oص5Gn^ڦ{üfC/PYfc&laHBƧ­̀[FwRNij1uC5$;i4;Ƀ#b8TWz2NBA#H;.Rrw!eV+ KB_f JB ;Koi??^gCC8q6TZZZ prZ`VW=:OGܵF .5x6 Rי;+7 :ZZ&\8+*4[L3ɧ/_h,Hޥ9`Xg3B:lBB;H4^HXR)3f؟a:upث6ˮ$̥߉ Bm'O €BRY}lRJA`|gmgD]3zD'%!z'ՄS颊N9#m6T}|j,UP#9e3KKHjX|q,cG]7he֊/Q2V. iB!NZzJG#@BK#<i#|=#)-k!4J'-]=܇5jWv,3j.gH`9#(Y)ct#߭gb#w=! dR35C,/ 7֝ _sn֛< g-o:z2~ogJL$:,kHsXRYcHP#4XwHB{'(- :$ZJp'#(1BC>{cXVMJ-A?ԬP0b,ita}+Mg's>ۏ>GvEWJN&6p3+zsfDψ2'Yۋ%{+9F b}MB5[q] S0#.qoyB%-|?i^kƌՒsPt!dp} A?ȿ3 ij&"a|^>YYo1.{\sjܙ03a69(F0.k*;n)%x²e q! EZbwF {:{A$8S2  -9?s .9 JR eJPڭ(DLyDƜ85)F%Yc8he"aʜ)8 +$3 }Z2:8($R#K 3Nɔ- o3+, )%B2stóo@Yq*(ذbIĘ%Rr72xd0gO p "nr[̉QSy=s5%1%% k2#;j ݮW<EĖ -uh6UTl%#c”c" I3=X-PL%?Dysœ) --93,b1+ fDǥ8φKLJNI% (0tH0bCEK V&Dt2#WYj?!$v* 9-OX:L)iI1IPtV d"Pp,ggR^Y͜{DD(ՇH#bJC Hv撜XpNKΖ% R Yylrۢ9"Oly91!ǭ ,)YW,PPpˊ-$10W<\Z""P?~["&X#2䌈%egטs!#{ʄ%[ZLxK9JEre9 9.Z 䆖P֧`Ƅc J&씾Hn$k!AeE19*&Ĵx!᎔1*r2ObR2FliCƊ \pƚ%7b˘wp gL8唜)5TWs{<%IPtԤDLPTB]iK ;"D^T}vBp_vN )r4|Nɔ;5Sn"gƘ%%wǗhRZZ"na},È֬XpVrXd7%ƕ[2Lѡ>zg)Phe²sDa[jN1gEYTIO-bbl2y:WQ YZr Li$x}+>c(f@ 9?>FA+"fE)ݒ%#)%ih8&gy4Pbf&%bJ͚=oG.iXőas5O3%%).y6;QS*v6ѾՇ-'2PUY  幻:$RS`O( ~L(F<"%$Ġ06_fȸIJ%I;3;%E p>Y(^pM- CB)%#Ҡ`;"ǰ&eBMA|k9gtϒ30‘pf[#~A})'ČEJ)rjFl&Fw#T>DLD /א ̚ DxִX$LPT8H\qMIMLIÈh JVkd8%WbN͈cb&Ŗ%5k.p'Ug)SɆjZSV,iÐ %Q8t(7kÆcSsb<@JaY0_qG 9%D/-9o61_r̙_3g][˷E-"ЎKŸϻҰ$--ǘLZ:[^GS1cH!VbB"զeMBFLG#".n1!'# 'ba{>Ͻ?h8"rK{]?1]xĂ3 i{ L#F-`Z!ct$!焂K~35c=>x7 Ұ 3v 3c㘊Bk -9GsL7Fdr90݈11T? dʄ中%f0h"ƌ]Ó8HI脘 5[<[0~F̸LD[{>'^OI3qUl%l2b-r1U2'dP EfBsچlfBI3|1atFYZNW=&DJF_SrR"6"3{WʌyM`"L&){nL=59$[""!&}h"Ln'쏥9~EB"m 4l`a:,9cQʴ-w"p$». aYXVrwX =-:g]>s K"Ѳe#%b"=JHꎖ[LIa`-5MO^ty((׃Iж44Gl+ET$:aI/ņ#f̌ Cb\bXͥ LTI9e"W2Pϼ' :q,zE" ,}&lj}NCHbYۉoª&0+ǞqK#l8f9 'Y\lQ70]s Oˈg,],M3f( %H+NJXJ7~ťc6Td̸%+*k6șqņ DW껮܋dX)g-wƈNƏTcFLvᰛճ!ZZ fo#"a̔ T(2rf̃ˆWc̙cYSgҲn|x{ϥDCC|' * ]I}&JZI+Պ#7]+$4+ᝆDD["ƒ4y1#Zin;M/:  bQ{FkCsw=}o)߮$^RՋl@сS,:hEjgbU€oٟZ4fʳgAPf(mj=?@}:0]sSI`B[ʼnF-PщzSCSF,1$$$2Vǖ|ľ- YH`#D] &R FEtj?9B΋06k˘5$A0h0@[ 4Hxldl 3yaD%REO٠ڱ#eL`,MV+~ϊ&'d`)iPђcxš  4hE%r kc4!*>N3;Q zY1T䌸Ɉ7YsŖs.XRr\Ic+;D}pBo(Xq0%z#~̧чNf!#}WDעaC;Q]np)cF< 9c!S8 H%۰١oh2 ,I^hxƍh7O{ct@@QބWq^UĔӗ,PsEAKh =IƄ'kz-1W/0w$gB \vvOaOFHüVoxO (:7xg\ zL)sNɅ׾Ұ3p G1hӟ0 =, Ih(=wy<EDg5"8>c 79&dL3 ]''h^U6T=PnrwᇹY3S! CJf/kc1HZ8c$0ӢCdB<0b W[+q ~_m$$wG!`ѿ #@~9cEFMM#Y'otD M)0aMr+b ݻ)]- I_\ wMnQOJʜ/XEʕp>m> #s/4{L8a|_gCB>%I_Pok̉5gYJS0a*i ԣ ˍO9BMȅJv>+b_oPR |f*:لЅ\"e̔5[@s*/KXET+(&h8SZ s8QjE.dkذr#'^*Sf^ W(GŖ- '_H__m_p =n(uR~4IPhXbI- Zm+J21#u$ C#09jH|kz)XRrW,D# D~!d*8WUl}d򷤤e͊sZD&ar)iH8_ }tE+F pw{Jq xz&OqTr"i4)B(2h$/E/Aš]W2Į֬e=z {Y#t3S ,.H6DB7:~ʆ L«iLѲg~YT+yE$ƙЊz0g \\Ђ&-y΄ cvQ\+TWj`6hɴtČjdgC/aD+k;1*Ȟ7AAp_!Ga{\(ՎIGR8:@2='&9ۜ;"F?*?ĢAaWBns1PK m,hJCƉCQDdH"E2^blY52^ JE֡)l``*ɉbZ̙ljID)bJN!^?<+^D$)خ'eV|'G%ct Wf#ᔟ M.P?^g2b@/EKKp6\ЭfCALbeM3six[?8bœ33~114J*)d;>nFL_6 t+7i#TGpLgA~PC=Ou;Jyym7IV+a44rt*kٓP=W `EG``{)C\eiF v#HeT5x5!aʉhтHyKjXsQ͸-CJhTy`%%!(j.PGTI};iYkm%Dvk녞 :0./R'.;>!k=<&w&,GUataD jD&pɊsUXwq␌,O{@}*0R#tAr~+%M8 ½!a+ja֒R9iQ+WR{/~4CF߹菵1POsi1ŽQ'4:l)EjW%3Z,dFVؠ3aKgmhM `=)4oJ6~+Jxǔ%KVl]6ar>&vُkGd_@I#G t~~JpaXx"e*{_<!JΙz'}kg7=Sк[Et?#U_W(*YW VڽD,^nG3ؠ-cZٺA$zk*(QK$Z: FVIvu4=OҝD'kxΘ{jmͥ3[~JE C6iD4݀ObyDa&⽝uX&N`tv%{&^uX‰;Αòp .g ŻFz!-@Ɋ 6r.]h ;B'Hƨ.?(>p3%]R2 Xli_' ܈Oay]ˢpbC,G%e|泌CGť{9_W朘& - Y栃~ u4zz"BDV*yX|1pÅszt R'Bc~K~ɿ%f2e4i2}1Rv‰iZ<W*Lk:wkR?)Yo 8 5O&;?ˈ̊)jhGA*4^$)< wr6[& ~W Im  W),4Z΂gY=vmafBY 몥ߜcy3^@?&IENDB`examples/widgets/graphicsview/elasticnodes.py000066400000000000000000000354461376617013100221050ustar00rootroot00000000000000 ############################################################################# ## ## 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 def random(boundary): return QtCore.QRandomGenerator.global_().bounded(boundary) 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 + random(300), -150 + random(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) widget = GraphWidget() widget.show() sys.exit(app.exec_()) examples/widgets/graphicsview/graphicsview.pyproject000066400000000000000000000000701376617013100234730ustar00rootroot00000000000000{ "files": ["elasticnodes.py", "anchorlayout.py"] } examples/widgets/itemviews/000077500000000000000000000000001376617013100163635ustar00rootroot00000000000000examples/widgets/itemviews/addressbook/000077500000000000000000000000001376617013100206635ustar00rootroot00000000000000examples/widgets/itemviews/addressbook/adddialogwidget.py000066400000000000000000000074521376617013100243610ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2011 Arun Srinivasan ## 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) examples/widgets/itemviews/addressbook/addressbook.py000066400000000000000000000116501376617013100235400ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2011 Arun Srinivasan ## 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_()) examples/widgets/itemviews/addressbook/addressbook.pyproject000066400000000000000000000002011376617013100251150ustar00rootroot00000000000000{ "files": ["tablemodel.py", "addressbook.py", "adddialogwidget.py", "addresswidget.py", "newaddresstab.py"] } examples/widgets/itemviews/addressbook/addresswidget.py000066400000000000000000000241161376617013100240720ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2011 Arun Srinivasan ## 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, QRegularExpression, 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. re = QRegularExpression("^[{}].*".format(group)) assert re.isValid() re.setPatternOptions(QRegularExpression.CaseInsensitiveOption) proxyModel.setFilterRegularExpression(re) 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_()) examples/widgets/itemviews/addressbook/newaddresstab.py000066400000000000000000000066261376617013100240750ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2011 Arun Srinivasan ## 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_()) examples/widgets/itemviews/addressbook/tablemodel.py000066400000000000000000000124011376617013100233430ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2011 Arun Srinivasan ## 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) if addresses is None: self.addresses = [] else: self.addresses = addresses def rowCount(self, index=QModelIndex()): """ Returns the number of rows the model holds. """ return len(self.addresses) def columnCount(self, index=QModelIndex()): """ Returns the number of columns the model holds. """ return 2 def data(self, index, role=Qt.DisplayRole): """ Depending on the index and role given, return data. If not returning data, return None (PySide equivalent of QT's "invalid QVariant"). """ if not index.isValid(): return None if not 0 <= index.row() < len(self.addresses): return None if role == Qt.DisplayRole: name = self.addresses[index.row()]["name"] address = self.addresses[index.row()]["address"] if index.column() == 0: return name elif index.column() == 1: return address return None def headerData(self, section, orientation, role=Qt.DisplayRole): """ Set the headers to be displayed. """ if role != Qt.DisplayRole: return None if orientation == Qt.Horizontal: if section == 0: return "Name" elif section == 1: return "Address" return None def insertRows(self, position, rows=1, index=QModelIndex()): """ Insert a row into the model. """ self.beginInsertRows(QModelIndex(), position, position + rows - 1) for row in range(rows): self.addresses.insert(position + row, {"name":"", "address":""}) self.endInsertRows() return True def removeRows(self, position, rows=1, index=QModelIndex()): """ Remove a row from the model. """ self.beginRemoveRows(QModelIndex(), position, position + rows - 1) del self.addresses[position:position+rows] self.endRemoveRows() return True def setData(self, index, value, role=Qt.EditRole): """ Adjust the data (set it to ) depending on the given index and role. """ if role != Qt.EditRole: return False if index.isValid() and 0 <= index.row() < len(self.addresses): address = self.addresses[index.row()] if index.column() == 0: address["name"] = value elif index.column() == 1: address["address"] = value else: return False self.dataChanged.emit(index, index, 0) return True return False def flags(self, index): """ Set the item flags at the given index. Seems like we're implementing this function just to see how it's done, as we manually adjust each tableView to have NoEditTriggers. """ if not index.isValid(): return Qt.ItemIsEnabled return Qt.ItemFlags(QAbstractTableModel.flags(self, index) | Qt.ItemIsEditable) examples/widgets/itemviews/basicsortfiltermodel.py000066400000000000000000000220701376617013100231560ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2013 Riverbank Computing Limited. ## 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.QtCore import (QDate, QDateTime, QRegularExpression, QSortFilterProxyModel, QTime, Qt) from PySide2.QtGui import QStandardItemModel from PySide2.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(Window, self).__init__() self.proxyModel = QSortFilterProxyModel() self.proxyModel.setDynamicSortFilter(True) self.sourceGroupBox = QGroupBox("Original Model") self.proxyGroupBox = QGroupBox("Sorted/Filtered Model") self.sourceView = QTreeView() self.sourceView.setRootIsDecorated(False) self.sourceView.setAlternatingRowColors(True) self.proxyView = QTreeView() self.proxyView.setRootIsDecorated(False) self.proxyView.setAlternatingRowColors(True) self.proxyView.setModel(self.proxyModel) self.proxyView.setSortingEnabled(True) self.sortCaseSensitivityCheckBox = QCheckBox("Case sensitive sorting") self.filterCaseSensitivityCheckBox = QCheckBox("Case sensitive filter") self.filterPatternLineEdit = QLineEdit() self.filterPatternLineEdit.setClearButtonEnabled(True) self.filterPatternLabel = QLabel("&Filter pattern:") self.filterPatternLabel.setBuddy(self.filterPatternLineEdit) self.filterSyntaxComboBox = QComboBox() self.filterSyntaxComboBox.addItem("Regular expression", REGULAR_EXPRESSION) self.filterSyntaxComboBox.addItem("Wildcard", WILDCARD) self.filterSyntaxComboBox.addItem("Fixed string", FIXED_STRING) self.filterSyntaxLabel = QLabel("Filter &syntax:") self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox) self.filterColumnComboBox = QComboBox() self.filterColumnComboBox.addItem("Subject") self.filterColumnComboBox.addItem("Sender") self.filterColumnComboBox.addItem("Date") self.filterColumnLabel = 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 = QHBoxLayout() sourceLayout.addWidget(self.sourceView) self.sourceGroupBox.setLayout(sourceLayout) proxyLayout = 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 = 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, 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.currentData() pattern = self.filterPatternLineEdit.text() if syntax_nr == WILDCARD: pattern = QRegularExpression.wildcardToRegularExpression(pattern) elif syntax_nr == FIXED_STRING: pattern = QRegularExpression.escape(pattern) regExp = QRegularExpression(pattern) if not self.filterCaseSensitivityCheckBox.isChecked(): options = regExp.patternOptions() options |= QRegularExpression.CaseInsensitiveOption regExp.setPatternOptions(options) self.proxyModel.setFilterRegularExpression(regExp) def filterColumnChanged(self): self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex()) def sortChanged(self): if self.sortCaseSensitivityCheckBox.isChecked(): caseSensitivity = Qt.CaseSensitive else: caseSensitivity = 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 = QStandardItemModel(0, 3, parent) model.setHeaderData(0, Qt.Horizontal, "Subject") model.setHeaderData(1, Qt.Horizontal, "Sender") model.setHeaderData(2, Qt.Horizontal, "Date") addMail(model, "Happy New Year!", "Grace K. ", QDateTime(QDate(2006, 12, 31), QTime(17, 3))) addMail(model, "Radically new concept", "Grace K. ", QDateTime(QDate(2006, 12, 22), QTime(9, 44))) addMail(model, "Accounts", "pascale@nospam.com", QDateTime(QDate(2006, 12, 31), QTime(12, 50))) addMail(model, "Expenses", "Joe Bloggs ", QDateTime(QDate(2006, 12, 25), QTime(11, 39))) addMail(model, "Re: Expenses", "Andy ", QDateTime(QDate(2007, 1, 2), QTime(16, 5))) addMail(model, "Re: Accounts", "Joe Bloggs ", QDateTime(QDate(2007, 1, 3), QTime(14, 18))) addMail(model, "Re: Accounts", "Andy ", QDateTime(QDate(2007, 1, 3), QTime(14, 26))) addMail(model, "Sports", "Linda Smith ", QDateTime(QDate(2007, 1, 5), QTime(11, 33))) addMail(model, "AW: Sports", "Rolf Newschweinstein ", QDateTime(QDate(2007, 1, 5), QTime(12, 0))) addMail(model, "RE: Sports", "Petra Schmidt ", QDateTime(QDate(2007, 1, 5), QTime(12, 1))) return model if __name__ == '__main__': app = QApplication(sys.argv) window = Window() window.setSourceModel(createMailModel(window)) window.show() sys.exit(app.exec_()) examples/widgets/itemviews/fetchmore.py000066400000000000000000000115771376617013100207240ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2009 Darryl Wallace, 2009 ## 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_()) examples/widgets/itemviews/itemviews.pyproject000066400000000000000000000000751376617013100223420ustar00rootroot00000000000000{ "files": ["basicsortfiltermodel.py", "fetchmore.py"] } examples/widgets/itemviews/stardelegate/000077500000000000000000000000001376617013100210275ustar00rootroot00000000000000examples/widgets/itemviews/stardelegate/stardelegate.py000066400000000000000000000164641376617013100240600ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 Hans-Peter Jansen ## Copyright (C) 2011 Arun Srinivasan ## 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 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) def paint(self, painter, option, index): """ Paint the items in the table. If the item referred to by is a StarRating, we handle the painting ourselves. For the other items, we let the base class handle the painting as usual. In a polished application, we'd use a better check than the column number to find out if we needed to paint the stars, but it works for the purposes of this example. """ if index.column() == 3: starRating = StarRating(index.data()) # If the row is currently selected, we need to make sure we # paint the background accordingly. if option.state & QStyle.State_Selected: # The original C++ example used option.palette.foreground() to # get the brush for painting, but there are a couple of # problems with that: # - foreground() is obsolete now, use windowText() instead # - more importantly, windowText() just returns a brush # containing a flat color, where sometimes the style # would have a nice subtle gradient or something. # Here we just use the brush of the painter object that's # passed in to us, which keeps the row highlighting nice # and consistent. painter.fillRect(option.rect, painter.brush()) # Now that we've painted the background, call starRating.paint() # to paint the stars. starRating.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() else: return QStyledItemDelegate.sizeHint(self, option, index) # The next 4 methods handle the custom editing that we need to do. # If this were just a display delegate, paint() and sizeHint() would # be all we needed. def createEditor(self, parent, option, index): """ Creates and returns the custom StarEditor object we'll use to edit the StarRating. """ if index.column() == 3: editor = StarEditor(parent) editor.editingFinished.connect(self.commitAndCloseEditor) return editor else: return QStyledItemDelegate.createEditor(self, parent, option, index) 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()) else: QStyledItemDelegate.setEditorData(self, editor, index) def setModelData(self, editor, model, index): """ Get the data from our custom editor and stuffs it into the model. """ if index.column() == 3: model.setData(index, editor.starRating.starCount) else: QStyledItemDelegate.setModelData(self, editor, model, index) def commitAndCloseEditor(self): """ Erm... commits the data and closes the editor. :) """ editor = self.sender() # The commitData signal must be emitted when we've finished editing # and need to write our changed back to the model. self.commitData.emit(editor) self.closeEditor.emit(editor, QStyledItemDelegate.NoHint) if __name__ == "__main__": """ Run the application. """ from PySide2.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] ] 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])) item = QTableWidgetItem() item.setData(0, StarRating(data[r][3]).starCount) tableWidget.setItem(r, 3, item) tableWidget.resizeColumnsToContents() tableWidget.resize(500, 300) tableWidget.show() sys.exit(app.exec_()) examples/widgets/itemviews/stardelegate/stardelegate.pyproject000066400000000000000000000001071376617013100254320ustar00rootroot00000000000000{ "files": ["stardelegate.py", "stareditor.py", "starrating.py"] } examples/widgets/itemviews/stardelegate/stareditor.py000066400000000000000000000076531376617013100235740ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 Hans-Peter Jansen ## Copyright (C) 2011 Arun Srinivasan ## 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 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() def __init__(self, parent=None): """ Initialize the editor object, making sure we can watch mouse events. """ super(StarEditor, self).__init__(parent) self.setMouseTracking(True) self.setAutoFillBackground(True) self.starRating = StarRating() def sizeHint(self): """ Tell the caller how big we are. """ return self.starRating.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) 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()) if (star != self.starRating.starCount) and (star != -1): self.starRating.starCount = 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() def starAtPosition(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): return -1 return star examples/widgets/itemviews/stardelegate/starrating.py000066400000000000000000000100551376617013100235600ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 Hans-Peter Jansen ## Copyright (C) 2011 Arun Srinivasan ## 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 math import (cos, sin, pi) from PySide2.QtGui import (QPainter, QPolygonF) from PySide2.QtCore import (QPointF, QSize, Qt) PAINTING_SCALE_FACTOR = 20 class StarRating(object): """ Handle the actual painting of the stars themselves. """ def __init__(self, starCount=1, maxStarCount=5): self.starCount = starCount self.maxStarCount = maxStarCount # Create the star shape we'll be drawing. self.starPolygon = QPolygonF() self.starPolygon.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))) # 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) def sizeHint(self): """ Tell the caller how big we are. """ return PAINTING_SCALE_FACTOR * QSize(self.maxStarCount, 1) def paint(self, painter, rect, palette, isEditable=False): """ Paint the stars (and/or diamonds if we're in editing mode). """ painter.save() painter.setRenderHint(QPainter.Antialiasing, True) painter.setPen(Qt.NoPen) if isEditable: painter.setBrush(palette.highlight()) else: painter.setBrush(palette.windowText()) yOffset = (rect.height() - PAINTING_SCALE_FACTOR) / 2 painter.translate(rect.x(), rect.y() + yOffset) painter.scale(PAINTING_SCALE_FACTOR, PAINTING_SCALE_FACTOR) for i in range(self.maxStarCount): if i < self.starCount: painter.drawPolygon(self.starPolygon, Qt.WindingFill) elif isEditable: painter.drawPolygon(self.diamondPolygon, Qt.WindingFill) painter.translate(1.0, 0.0) painter.restore() examples/widgets/layouts/000077500000000000000000000000001376617013100160475ustar00rootroot00000000000000examples/widgets/layouts/basiclayouts.py000066400000000000000000000117611376617013100211310ustar00rootroot00000000000000 ############################################################################ ## ## 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_()) examples/widgets/layouts/dynamiclayouts.py000066400000000000000000000152211376617013100214670ustar00rootroot00000000000000 ############################################################################ ## ## 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_() examples/widgets/layouts/flowlayout.py000066400000000000000000000130241376617013100206260ustar00rootroot00000000000000 ############################################################################ ## ## Copyright (C) 2013 Riverbank Computing Limited. ## 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/layouts/flowlayout example from Qt v5.x""" import sys from PySide2.QtCore import Qt, QMargins, QPoint, QRect, QSize from PySide2.QtWidgets import (QApplication, QLayout, QPushButton, QSizePolicy, QWidget) class Window(QWidget): def __init__(self): super(Window, self).__init__() flowLayout = FlowLayout(self) flowLayout.addWidget(QPushButton("Short")) flowLayout.addWidget(QPushButton("Longer")) flowLayout.addWidget(QPushButton("Different text")) flowLayout.addWidget(QPushButton("More text")) flowLayout.addWidget(QPushButton("Even longer button text")) self.setWindowTitle("Flow Layout") class FlowLayout(QLayout): def __init__(self, parent=None): super(FlowLayout, self).__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 index >= 0 and index < len(self._item_list): return self._item_list[index] return None def takeAt(self, index): if index >= 0 and index < len(self._item_list): return self._item_list.pop(index) return None def expandingDirections(self): return Qt.Orientations(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) mainWin = Window() mainWin.show() sys.exit(app.exec_()) examples/widgets/layouts/layouts.pyproject000066400000000000000000000001131376617013100215030ustar00rootroot00000000000000{ "files": ["basiclayouts.py", "dynamiclayouts.py", "flowlayout.py"] } examples/widgets/mainwindows/000077500000000000000000000000001376617013100167065ustar00rootroot00000000000000examples/widgets/mainwindows/application/000077500000000000000000000000001376617013100212115ustar00rootroot00000000000000examples/widgets/mainwindows/application/application.py000066400000000000000000000244571376617013100241020ustar00rootroot00000000000000 ############################################################################# ## ## 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): def __init__(self): super(MainWindow, self).__init__() self.curFile = '' self.textEdit = QtWidgets.QTextEdit() self.setCentralWidget(self.textEdit) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.readSettings() self.textEdit.document().contentsChanged.connect(self.documentWasModified) self.setCurrentFile('') self.setUnifiedTitleAndToolBarOnMac(True) def closeEvent(self, event): if self.maybeSave(): self.writeSettings() event.accept() else: event.ignore() def newFile(self): if self.maybeSave(): self.textEdit.clear() self.setCurrentFile('') def open(self): if self.maybeSave(): fileName, filtr = QtWidgets.QFileDialog.getOpenFileName(self) if fileName: self.loadFile(fileName) def save(self): if self.curFile: return self.saveFile(self.curFile) return self.saveAs() def saveAs(self): fileName, filtr = QtWidgets.QFileDialog.getSaveFileName(self) if fileName: return self.saveFile(fileName) return False def about(self): QtWidgets.QMessageBox.about(self, "About Application", "The Application 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) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(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: return self.save() elif ret == QtWidgets.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())) return inf = QtCore.QTextStream(file) QtWidgets.QApplication.setOverrideCursor(QtCore.Qt.WaitCursor) self.textEdit.setPlainText(inf.readAll()) QtWidgets.QApplication.restoreOverrideCursor() self.setCurrentFile(fileName) self.statusBar().showMessage("File loaded", 2000) def saveFile(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() if error: QtWidgets.QMessageBox.warning(self, "Application", error) return False self.setCurrentFile(fileName) self.statusBar().showMessage("File saved", 2000) return True def setCurrentFile(self, fileName): self.curFile = fileName self.textEdit.document().setModified(False) self.setWindowModified(False) if self.curFile: shownName = self.strippedName(self.curFile) else: shownName = 'untitled.txt' self.setWindowTitle("%s[*] - Application" % shownName) def strippedName(self, fullFileName): return QtCore.QFileInfo(fullFileName).fileName() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/widgets/mainwindows/application/application.pyproject000066400000000000000000000001141376617013100254510ustar00rootroot00000000000000{ "files": ["application.qrc", "application.py", "application_rc.py"] } examples/widgets/mainwindows/application/application.qrc000066400000000000000000000004071376617013100242240ustar00rootroot00000000000000 images/copy.png images/cut.png images/new.png images/open.png images/paste.png images/save.png examples/widgets/mainwindows/application/application_rc.py000066400000000000000000000651371376617013100245660ustar00rootroot00000000000000# 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\ \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\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\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\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\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;\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() examples/widgets/mainwindows/application/images/000077500000000000000000000000001376617013100224565ustar00rootroot00000000000000examples/widgets/mainwindows/application/images/copy.png000066400000000000000000000024721376617013100241430ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXõ]L[ewoI q&NpхDP+.&J'Тl9@lC +(іJ{*<9o!,/zc@}}P2Ff dn:~E"+*0@mWڪ4|S5@f:eCբcw*wڻeyBgg'zzz8PIiniog%3 @(cmm | =@A677vVUG;%$3O$(+6Z0'<=MIɩJ=0|qɘPzHk朙WdSjF< fd(;dH=sӹ@ eU-:c}iv]=&rJ*pW=~g.@DqL+++X__'Yt POe24XdNi)9D@|[O~uqq,~Nm7d,m72%#'hf[O5xGJ.7RR:)"E\---n`җ `}iiC ͲТRNxT;5`Zy `0$g@SS[gJO"7@GGG#mmm|A'@ss3JGT?U???h4:ô]L0xGRv:bJJo>ޙ#gSuVnłHmm377WVFLAnC9VpIENDB`examples/widgets/mainwindows/application/images/cut.png000066400000000000000000000024531376617013100237630ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXWkLW>#q2Te82f,[p0`.:N1[ X^f 1F-ܨji ܸ aٲ<}^J t (Dq+Fdf"LċGȡȎ;82a+A 0H.݀@2yMrhd^QGнM @t/2= ?H,1yK&B+6F\N 9c6 +A )*7G{̉@DT+, 6FHd*{.T74*TbR,XtzEUȠmts!sQ唃.ݯ˰>`y>^/'g`^3vshG .7wsaؽ^/fߩ6Bϥ-~mTk__sbrVNćԌ08@1~m%[ . $6{B o<ѽVw\Rz0L u5QdQD>v̴@O_~2 D"T*Jh K[9Sy,"džS)⠠ x`X@[^& -Sg L[{` b̄"P`ɹۧu.K)pjx)>+![cG&ؒrdo-- 8b\iF&2,3;3zb<{fO[5XCC=4442e<(6]*2x}.Zl1 %q/'_D Lh>u Ɩ1 f6m8h*>]XGZY Cɑ8 9!\ ϳ7ODIENDB`examples/widgets/mainwindows/application/images/new.png000066400000000000000000000015241376617013100237570ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATX՗Na5{q\\0&bXX ѝRHECey{QJ!Iޜ3MN"SsՐn==d 12<S(CfIkR׾TUNK޷’=Oޣqnl4kZS YoK|mu5e<7ɺx&oFh?B~Ql% wIENDB`examples/widgets/mainwindows/application/images/open.png000066400000000000000000000040311376617013100241230ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXíW[Pgb/nٛκ;{z:vTpuֶT mQB!@Hs$!grB GTx~0X}g/>ߗ]v uH W*e`[ '3">vH~Y2ϭB9DQ臆={XSR,::NI1>I,`]YSMM4 1y`Ż?ū)LOϮ׼tCO3@{=.4W S2^5C`\&K|H$8As''H׻ "U77N,V>V:q,k,'6?F}oY1~ Z{?0L(CF&e-,!4{Z;~m$~CF=5iu?PZlY]/sq 1% cbjC'ݼ-Ӱ;3&SXO!,CPF BBsZ*tȼE lϛ'Ào%Q(/bM$"R-BySt < ] /yƪԳs LŔbK˫#7G<<b~/=/-:C(QNܿ}3i 3Th58 X\3>GelAC'b ER$nPD΋J~ m['Ѡe")(Ȑx5 >c f]KcNzI1N[;|%jJ0("3 t.| J*qQF@7 jH7'@L{RE qAAͷ]lC(N#KQWHoXQG `4QɫgA@?noiқ*/ru)S)+vQŕky8n3cjs@"mDžPt +4X$ |J8aVU;:!z/]&o8=cn*F׃H:381 ^QO`+] 9g=JUmCeS@%`+njǩD9|6ZZ8/95j'zLIdnFڍv9,9=NrG ;Fc9=pOJnX,P(@!F.[! o<<5iEX?7Ǎ: !p5U!4[7*4nI:rsm$Jesp)>|c.2*\"]~M 6tvw䈶"I m2JxLKIõ.|me6Y\Q{ %&6ǝՂ^NEXx]\UPuTA/ rjQCO-H/5z-Wxܯ\u˯Ev2g`§ҩ;P 9 /"mak^2/f_=IENDB`examples/widgets/mainwindows/application/images/paste.png000066400000000000000000000031551376617013100243040ustar00rootroot00000000000000PNG  IHDR szz4IDATx^[lTsًic$BJ!"-b/Kh+U`UڴV U')ċRy9iӄcj;z޳ghrl'}~sJ)$xxkH)w(' ChRcdY@9&`]DDnΉ+WP]S@Pe(A)fi^/Nl;G|[CL;D2Ķ!!p>Sl;D*@P4`Hi$N8!҇g em(AXW%DBs\=AX\$}-ZܱcGYUU~ХKܮ֪DU,s1O(Ja Aرlr?+ M"fxGuuPKի(ZA-ڶ8XŒL{;76|/g2f>v&.A,٩:l!Y-BPDz8`Yx555 rȑbmt0f#6,2cy.Er<,A65fm8Xt SˍӲ}: /s$$IR躬3Νѣ>|^,Ok/&7|k.-dk{N^VsogwMܝvrugk?x<8%8#%A:߽Mծ(bBYlArfOfrad^g2ƅ퇡ʹ755 FqolH;L^Éy[Iy%c fܝ2 L'ط+%3{=ku*2J+Zpc(,R{}$eLM|`ƸP#Sxv}hL aXx!B-iC#jc! s߃ʣ2G(akK!%0*\@X*#plYD\ϓ=RPjYVL v_=gӺ2y_hίp%x LO3DŗY\N`S(%mR}[tjWo7SpSx3i %Ղ)3u3}r7oDT_p =?~Bv;su]pW@2 ~*ӽi9thӶ}%XXX'O>Iʭ*;nLRYt= АӓNΞ.)055U/"SN%/g~쮸 KvO&@@aZ`;ߊ$^saw3n`pt___̙3ťЏxc!DxOis*_IENDB`examples/widgets/mainwindows/application/images/save.png000066400000000000000000000022431376617013100241230ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<5IDATX͏TE{n@FM4DHČL\.M\kXÎč΂htA\ =`PQ` ^` QVR{:ԩz~6>>]vN5ػ」;v<:̗7XSڠkg|p?0x.ory #ӟd}k@E@xp,#˲m00aP|#%"+Օs΃* ,I Iw:琷Ղv+m(r8 㯼IkFؽ{k놮ZVmQg5 ,# /#&|#!Я'aa%% 4M:ólc V_)Fara-р: TIO4/!g iXvj#wPE x:Tx3x$wh6h߱R^DM_ 8ňKvRPZ0}@Ű&WU.2p}Ʉ-Jsf+7QW?תd~')Ü wl 55Y1{X0+WVU!ѐS,-޸Wj'WڣU<_o|w__sl}5ځ?MKFIENDB`examples/widgets/mainwindows/dockwidgets/000077500000000000000000000000001376617013100212155ustar00rootroot00000000000000examples/widgets/mainwindows/dockwidgets/dockwidgets.py000066400000000000000000000276021376617013100241050ustar00rootroot00000000000000 ############################################################################# ## ## 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 class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.textEdit = QTextEdit() self.setCentralWidget(self.textEdit) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.createDockWindows() self.setWindowTitle("Dock Widgets") self.newLetter() def newLetter(self): self.textEdit.clear() cursor = self.textEdit.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) cursor.insertBlock() cursor.insertText("321 City Street", textFormat) 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.insertBlock() cursor.insertBlock() cursor.insertText("Dear ", textFormat) cursor.insertText("NAME", italicFormat) cursor.insertText(",", textFormat) for i in range(3): cursor.insertBlock() cursor.insertText("Yours sincerely,", textFormat) for i in range(3): cursor.insertBlock() cursor.insertText("The Boss", textFormat) cursor.insertBlock() cursor.insertText("ADDRESS", italicFormat) def print_(self): document = self.textEdit.document() printer = QPrinter() dlg = QPrintDialog(printer, self) if dlg.exec_() != QDialog.Accepted: return document.print_(printer) self.statusBar().showMessage("Ready", 2000) def save(self): filename, _ = QFileDialog.getSaveFileName(self, "Choose a file name", '.', "HTML (*.html *.htm)") if not filename: return file = QFile(filename) if not file.open(QFile.WriteOnly | QFile.Text): QMessageBox.warning(self, "Dock Widgets", "Cannot write file %s:\n%s." % (filename, file.errorString())) return out = QTextStream(file) QApplication.setOverrideCursor(Qt.WaitCursor) out << self.textEdit.toHtml() QApplication.restoreOverrideCursor() self.statusBar().showMessage("Saved '%s'" % filename, 2000) def undo(self): document = self.textEdit.document() document.undo() def insertCustomer(self, customer): if not customer: return customerList = customer.split(', ') document = self.textEdit.document() cursor = document.find('NAME') if not cursor.isNull(): cursor.beginEditBlock() cursor.insertText(customerList[0]) oldcursor = cursor cursor = document.find('ADDRESS') if not cursor.isNull(): for i in customerList[1:]: cursor.insertBlock() cursor.insertText(i) cursor.endEditBlock() else: oldcursor.endEditBlock() def addParagraph(self, paragraph): if not paragraph: return document = self.textEdit.document() cursor = document.find("Yours sincerely,") if cursor.isNull(): return cursor.beginEditBlock() cursor.movePosition(QTextCursor.PreviousBlock, QTextCursor.MoveAnchor, 2) cursor.insertBlock() cursor.insertText(paragraph) cursor.insertBlock() cursor.endEditBlock() def about(self): QMessageBox.about(self, "About Dock Widgets", "The Dock Widgets 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") self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newLetterAct) self.fileToolBar.addAction(self.saveAct) self.fileToolBar.addAction(self.printAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.undoAct) def createStatusBar(self): self.statusBar().showMessage("Ready") def createDockWindows(self): dock = QDockWidget("Customers", self) dock.setAllowedAreas(Qt.LeftDockWidgetArea | Qt.RightDockWidgetArea) self.customerList = QListWidget(dock) self.customerList.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) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) dock = QDockWidget("Paragraphs", self) self.paragraphsList = QListWidget(dock) self.paragraphsList.addItems(( "Thank you for your payment which we have received today.", "Your order has been dispatched and should be with you within " "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.", "You made a small overpayment (less than $5) which we will keep " "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.", "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.", "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) self.addDockWidget(Qt.RightDockWidgetArea, dock) self.viewMenu.addAction(dock.toggleViewAction()) self.customerList.currentTextChanged.connect(self.insertCustomer) self.paragraphsList.currentTextChanged.connect(self.addParagraph) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/widgets/mainwindows/dockwidgets/dockwidgets.pyproject000066400000000000000000000001141376617013100254610ustar00rootroot00000000000000{ "files": ["dockwidgets.qrc", "dockwidgets.py", "dockwidgets_rc.py"] } examples/widgets/mainwindows/dockwidgets/dockwidgets.qrc000066400000000000000000000003061376617013100242320ustar00rootroot00000000000000 images/new.png images/print.png images/save.png images/undo.png examples/widgets/mainwindows/dockwidgets/dockwidgets_rc.py000066400000000000000000000504561376617013100245740ustar00rootroot00000000000000# 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\xc4\ \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\xd9\x04\xdc\xb2\xda\x02\ \x00\x00\x06{IDATX\xc3\xadWiLTW\ \x14v!b\x95\x04\x97\xa8%\x18R\x1b\x0d\x11E\x04\ \xaa\xa4I\xb5VMli\xb0h\xa3\xb6\xc5\xb2F\xfd\ \xa3,aQH$\x08d\xc2\x12\xd0\x22B\x11YD\ @@\xf6\x91}S6\x09\xb2\xa9\x08\x0e$\x0cb\x01\ \x83\x02\x82\x0b\x08\xa9_\xcf\xb9\x991\xa3\x80\x9d\xb4\xf3\ \x92/\xf3\xde\xbc{\xce\xf7\xdds\xce=\xf7\xbey\xf3\ T.;\xbb\xe8/\x1c\x1d#\x1d\x1d\x1d#\x02\x1d\x1c\ .H\xd2\xd3\xab%\x97.\x15VGF\xde\xacML\ \xac\xa8\xad\xaaj\xbf/\x956A\x89+WJ\xdb\x8d\ \x8d\xf7|I\xa6\xf3\xe7i\xe8Zho\xffG\xa1\xfc\ \xf1sL\xff\x0d\xb5\x10\x10\x98\xd3\x88\x82\xed\ \xdb\x0f\xac=\xeb\x97\x89\xde\x17P\x0b\xf9\xe52\x18\x18\ \x18\xc7\x91\xe9\xe7\x1a\x8b\x82\xadmXyc\xf78d\ \xcf\xf1\xaf\xe0q\x16\x16\x07[\xc8\xee+\x82\x96F\x14\ \xd8\xd8\x04\xfb\xa4\x15\xc9\xd0:\x08\xb5`\xe7\x18\xf4\x9c\ \xcc~!,\xd1\x88\x00KK\xaf\x8d\xa1\x97\xaa\xd0\xf0\ \x17\xd4B\x08\x8d%3\x7f\xc2\x0a\x8d-I\x17\xf7\xa4\ \xfeJ9\xa0\x0e\x22\x92\x9a\xa0\xa7g(\xd5\xe4j\x98\ G\xcd\xa8(\xbf\xfd-\x8a\xba1'\x0a\xba\x80\xdcN\ \xb6t\x00\x86\x86;\xea\xc9\xccTcu`g\x17\ \x1e\xc4\x8e\xb3:\x80\x8c6 \xad\x09Hi\x00\x92\xea\ \x80\x84j \xa6\x1c\xc8l\x04J\x1e\x00\xf5\xed\xe3h\ j\xea\x80\xaf\xaf\xef+25\xf8\xdf\xe4\x12\x89D.\ \x95\x96 \xabp\x00\xa9R\x08\x94\x101qP\xf3\x01\ z\x9e\x8cahh\x08\xbd\xbd\xbdx\xf8\xf0!\x1e<\ x ~\x13\x13\x13\xb1{\xf7\xee\xdaC\x87\x0e\x05X\ ZZn\xe4T\xfe'\x01\xa1\xa1\xa1}\x13\x13\x13\x98\ \x9c\x9c\xc4\xd4\xd4\x14\xba\xba\xbap\xe7\xce\x1d\xdc\xbe}\ \x1b\xf9\xf9\xf9())AUU\x15\xea\xeb\xeb\xd1\xdc\ \xdc,\x040\x92\x92\x92p\xe3\xc6\x0d\xe4\xe5\xe5\x89\xfb\ \x13'N\xdc\xdd\xb1c\x87\x99\xdaB\xec\xec\xec\x96\xd9\ \xda\xda~\x17\x12\x12\xd2\xce3T\xa2\xb0\xb0P8V\ %\xcf\xca\xcaBBB\x02\xc2\xc3\xc3\x11\x17\x17\x87\xab\ W\xaf\x0a\x81}}}\xe8\xe9\xe9\x116uuu8\ }\xfa\xf4\x84\xb9\xb9\xf9o\xe4^\xfb\x93\xe4G\x8f\x1e\ \xb5\xa7\xc1/\xa2\xa2\xa2\x10\x1d\x1d\x8d\x8c\x8c\x0c\xc4\xc6\ \xc6\x2277\x17999\x88\x8c\x8c\x04\x09\x03\xbf\xbf\ v\xed\x1a***D\xd8GFF0<<\x8cg\ \xcf\x9e\x09\xb1O\x9f>\xc5\xe0\xe0 \x06\x06\x06PP\ P\x80\x86\x86\x06xxxLn\xda\xb4\xc9i\xcev\ mcc\xb3+,,L\x84\xba\xa3\xa3\x03\xf7\xee\xdd\ \x13\xbfr\xb9\x5c\x08\xb8|\xf9\xb2\xf8\xef\xd5\xabW\x18\ \x1f\x1f\xc7\xd8\xd8\x18FGG?I\xde\xdd\xdd\x8d\xca\ \xcaJ\x11\xb9\xb6\xb66\x1c8p`\x88\xa8\xbe\x99u\ \x95\x1c9r$O&\x93\x89\xd0\xa9\x8a`C&\xe2\ \xfc\x96\x95\x95}\x92\x9c\xc5666\x8a\xd0s\x0d0\ ykk\xab(T\xf6\x1b\x14\x14\x04\x13\x13\x93\xbcY\ {\x05Um\x0d\xabV\xe6OU\x04;aB\xbe\xe7\ \x9c*\xc9y\xb6\xf7\xef\xdf\x17\xa9\xe0\xda`\x81--\ -\x82\xf0\xc9\x93'x\xfc\xf81\x1e=z$\x8a\xb4\ \xa6\xa6\x06\xc1\xc1\xc1\xa0Z\xe8 \xba\xefg\xa4\x82\xc2\ S\xdb\xd9\xd9\x89\xb9D\xb4\xb7\xb7\x8b\x99s\xf1q\x11\ J\xa5R\x14\x17\x17\x8bwL\xa6\x0c;\x93\xb2`&\ \xe4H0n\xde\xbc)\x0a\xd4\xdd\xdd\x1d[\xb7n\x95\ \x11\xdd\xef\x04\x9d\x0f\x04\xec\xdf\xbf\xbf\x96\x0aP8\x9d\ K\x04?\xf3\xcc\xf9\x9dj\xce\x95K\x94\x0b\x8eW\x06\ \xd7Lvv\xb6(d???899\xe1\xd8\xb1\ c\xf0\xf6\xf6\xe6\x14\xb0\x00\xfb\x19\x02\xa8i\x14\x14\x15\ \x15!&&\x06\xce\xce\xceHII\x11\x8eUEp\ \x1d01\xcf\x92C\xcdb\xd3\xd2\xd2p\xfd\xfau\xb1\ b\x92\x93\x93q\xfe\xfcy\xaex\xb8\xba\xba\x82z\x09\ 233\xe1\x1b\xef\x0c\xef\xaa\xc3B\x84\xb1\xb1\xf1\xec\ \x02\xf6\xed\xdb\x17t\xf7\xee]Qd\xfd\xfd\xfdHO\ O\x87\x97\x97\x97XzL\xa6\x14\xc1\xa1\x8f\x8f\x8f\x17\ M\x86\x09yu\x04\x04\x04\x88\xf021\x17\x1a\x0b\xe2\ 4\x95\x97\x97\x8b\x94\xf9%\xba\xc2+\xe7W\xee\x07\xd8\ \xbcy\xf3\xec\x02\xf6\xee\xdd+a\xa27o\xde\x08\x11\ \x1cj\x9e);c!\x11\x11\x11\x22\xaf\x1cb\x9e\xe5\ \xb9s\xe7D\xa4\x98\x98\x9fy\x1c\x8b\xe3\x9c\xab\x92\xb3\ \x0d\xe7\x9f{\x01\x17\xa1\x91\x91\xd1\xec\x02\xa8\x7fKx\ \xc9MOO\x7f \x82\xf3\xcc5\xc1\x85\xe4\xe9\xe9\x89\ \xe3\xc7\x8f\xc3\xc7\xc7G\x84\x97\xa3\xa0\xcc\xb9*9\xa7\ \x92\xdf]\xb8p\x01T[\x5c\xf9\xe2\xff3g\xce\xd0\ \x8ei8\xbb\x80\x9d;wJX\xe9\xbbw\xef\xe6\x14\ \xc1\xc5\xc7ME\x99\xf3\x8f\xc9\xb9~\x02\x03\x03\x85P\ \xda\x15\xdf\xb7h\x1e\xcfM\xce\xcd\xcd\x0d\xa6\xa6\xa6}\ D\xe74C\xc0\x86\x0d\x1b\xf4i\x89dP?x\xcb\ a\x9bK\x04\x13\xa9\x92s$N\x9d:\x05jd\xa0\ }\x04...\x1f\x90s\x0b\xe7\x0d\x8bmyS\xa3\ 1\xc3D\xe7F\xd0\x9dq\x10\xe5}\x5cWW\xd7c\ \xcb\x96-rv\xcaE\xf7\xb1\x88\xd2\xd2\xd2\xf7\xe4\x1c\ \x0d\xda\xe9`mm=+97-\xb6\xe1\xab\xa9\xa9\ \x09'O\x9e\x1c%\xff|h\xf1\x98\xeb\xe86_\xa1\ \xcc|\xcd\x9a5\xd1fff#\xfe\xfe\xfe\xc2\x89R\ \x04w=e\xd8\xb3\xb3\xcb \x91dQ\x04|\xde\x93\ \xf3\xe6\xc5\xdd\xf1\xe5\xcb\x97\xc2&55\x15\x94\xde\xc1\ \xa5K\x97\xd6\x92\xdfT\xc2Y\xc5~\xb0\xe8\x93\xe7A\ \xc2j\xc2\x9eu\xeb\xd6\x95\xec\xda\xb5k\x8aw@v\ x\xeb\xd6-\xb1\x13\xf2\x0a\xb0\xb2\xb2\xa6\xa2\xf4\xc3\xc5\ \x8b\xd5\xb4J\x8a\xa9[v\x89\xd9r\xb8I\xcc4E\ \xb2o\xf1\xe2\xc5\x95\xe4\xe7*\xc1\x95\xf0\xb5\xc2\xef\x22\ u\xcf%<\xd0@[[\xdbq\xfd\xfa\xf5mVV\ V\xa0-\x1b\xdb\xb6m\x03=\x0f\xaeZ\xb5\xaaYG\ G\xa7\xd2\xc4\xc4|\x88\x85\xa4\xa6\xe6\xc2\xc1\xc1aB\ OOO\xa6\xa5\xa5U@\xb6\x7f\x12N(\xce\x89+\ \xfe\xcfY\x91+\xd6h\xf9\xf2\xe5\x81\xfa\xfa\xfa\x8d\x0b\ \x16,(\xa2\xe7D\x82;\xe1\x07\x8e\xd4\xca\x95+\xe3\ V\xaf^\xdd@\xf7Y\x84p\xc57\x82\xa1\x22\xa5\x0b\ 5\xf2\xb5\xa4\x98\x05\x87\xf1 \x0b\x22,S\x9cr\xb4\ \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\ \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\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$\x9a7k\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\x03\xd1\ \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\x03cIDATX\xc3\xc5\ \x97\xcdo\x1bU\x14\xc5\x7fwf\x92\x89\xd3|\xd4\xad\ \x17\x09 \xd2MUQ\x10\x08Q\x84\xca\x0a\x09\xd8 \ \xc4\xa2R\x17,*$(k6,\x90\xfa\x1f\xc0\x82\ \x0d\xa8;\x04,\xd8\x82\x10\xaa\xdaE\x05d\x07\x08\x04\ \xa14@\x85\x11n!\xb5\x13\x9c\xe6\xc3\xb5\xd3y\xef\ ]\x16\xf3\xec\x8c\x9d\xc4\xa6\xf5T\x1d\xe9J\x1ei<\ \xe7\xdcs\xce\xbb\xef\x8d\xa8*\xf7\xf2\x0a\xb8\xc7W\xf4\ \x7f\x1ez\xff5y\xf2\xe6\x16\x91U\xa40\xca\x13\xc6\ \x12\xaa\x22\x00Q\xc0L\x180\xeb\x94\xc0:\x1a\xd55\ >{\xfbs\xe6\x81\xa6\xaa\xbaA\xef\x96A\x16\x9c}\ ]\xce<\xf8\xc8\x0b\xaf:\xa7\xa1\xaa\x06\x0f\x1c}v\ \xdc9\x15T\x05`\xaa4\x17\x8d\x17\xef\x1f\x09\xc2\x82\ \x98\xad\x86~\xf1\xde\x89\xeaw\x8b\xff\xbe\xfb\xe1W|\ \x02\xd4U\xd5\xf6\x05P\xd5\xbeu\xf64?\xaa\xaa\xaa\ :_\xb6\xab\x9cZm\xb5nj\xb5\xba\xa4\xc6\x18\xbd\ \xb2\xf0u\xf2\xe6\x8b|\xfb\xfc\xa3\xbc\x02\x14\xdbM\xee\ U\x033\xe0\x94\x10,`|9\xd2\xfb\xb4\x04\x8b1\ \xb7X^\xae\x11\x86!\x87\x1ez::\xf9\xc6\x07\x8f\ \x1d\x9e\xe1\xe5\x97\x8e\xf1\x1c0!\x22r\xc7!L\xbd\ \xd6.\xd0\xb4\x1c\xe0P,\xaa\x09\xcdf#\x0dU\x14\ \xf1\xf0\xf1\x93\xa3\xa7\xdf\xfa\xf8\x99\xb9\x12\xa7\x80C@\ a\xc8U\x90\x02\x81E1\x9e@\x02\x18\xc4\x93\xc9\xe6\ m\xdf\xbe\x09\x8e\x96\xd2\x09\xa7\xcd\xdf\x82\xde^\ \xa5\x13\xc6\x14z\xfby\xbd\x1b\x0a$;\xe4\xee\xf6\x5c\ \xbb\x16g\xce\x0a\xec\x9c\x84\xba\xebs\xd9\xddC\xf3\x1f\ D\x83b\xd7\xfd\xfb.\x0c\xa2\xac\xf3\xfd\x94h\x0f\xec\ \x5c\x97a\xba\x15\x0f:\xe1\xc7\xc08Pdm%p\ \x1bMZ\xb9mF;-\x80\xf4H9\x860\x8dR\ \xa4VY\xb1\x95\xc5\xcb\xf6\xa7/?J\xae,\xfe\xd0\ \xb8t\x95?\x80U`kH\x05\xd4\x1f@\x15%\x04\ \x0a\x08S(\x07\xa8UV\xed\xc2\xfc\xb9\xe4\xd7o>\ 5\xe5ry\xfd\xef:\xcb\xdf\xff\xc9o\xe5*e\xe0\ \x1ap\x19X\x1f2\x03\xa0\x8c\xa1L\x03\x07=\xe8\x85\ \x0e\xe8/\xd7\xa8\x5c\xaa\xf0\xfb\xd2\x0d\xfe\x02j\xc0\x12\ \xf0\x8f?\x86\xd5\x81\xcd!\x158B\xad\xb2l\x17\xe6\ \xcf\xef\x05z\x1d\xb8\xeaA\xeb\xc0\x86\x07\xdd\xd2\x01_\ >\x03\x09\xac79\xf7\xce\xa9\xc2\xf4\xf5\x1b\xd8\x9f+\ ,\xed\x01\xba\xe2en\x00\x89\xde\xc6\x17\xef\xc0O3\ \x11)\x01\xc7\x80\xc3\xc0-\x0f8\x14\xe8\xed\x12\x18\x01\ \xa6\xfd\xd1\xdazi\x87\x02\xcd^\xff\x01\xf9h\x10\x8e\ \x11Wv$\x00\x00\x00\x00IEND\xaeB`\x82\ \ " qt_resource_name = b"\ \x00\x06\ \x07\x03}\xc3\ \x00i\ \x00m\x00a\x00g\x00e\x00s\ \x00\x09\ \x00W\xb8g\ \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\ \x00\x07\ \x04\xcaW\xa7\ \x00n\ \x00e\x00w\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\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\x00*\x00\x00\x00\x00\x00\x01\x00\x00\x06\xc8\ \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() examples/widgets/mainwindows/dockwidgets/images/000077500000000000000000000000001376617013100224625ustar00rootroot00000000000000examples/widgets/mainwindows/dockwidgets/images/new.png000066400000000000000000000017211376617013100237620ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<cIDATXŗoUwf|ԭ MUQQ ĢR,*$(k6, ;,؂Ed4@n!õy]쌝ĦTJi{s恦AA}]< :}v9T`4 ‚~މwW|UPվu4?:_Zmnju|MU3,`|91X^!z::嗎0!"r!L.дP, f# U񓣧C@aUE1@ēm߾ ߂^zy $;\g 위sCDb. h\a:8Pdm%pMZmF;-H90RVY/?J,иt?U`kH@% S(UVo>5ry:o*epX2L=/ר\ j?Ձ!8BlzA_> 79Ω؟+,enO3)ǀ-8zi^hWv$IENDB`examples/widgets/mainwindows/dockwidgets/images/print.png000066400000000000000000000033041376617013100243240ustar00rootroot00000000000000PNG  IHDR szzgAMAܲ{IDATXíWiLTWv!b%R EIVMlihŲF,aQH$d"BYD@@}S6 $ b _Ϲ1/޼{s=yT.;/##.Hӫ%.VGFެMLj/6A+WJۍ|IiZhoGsL ӈ=뗉P 2ǑmXyc8dq[+F:`~!,шKKB%3 -IJ9"g(jGͨ(-1' N t;Tcu`gĎ:6 Hiꀄj lJhjꀯ+25D. pR1qPzahhx! PPPxxxLnڴivmcc+,,Lr\|իWFGG?IݍJ68p`u9r$O&Щ`C&}666s 0ykk(TY{Um VOU;aB*y`---ɓ'x1=z$Z gSىDsqJRwL ;`&H0n޼) [n߿ P8K?jΕK WLvv(d???899رci!&&HIIUEp01ϒCbpubqyxz 233 Bt]QdHOOXzLM yu21 4%+Wؼy+a7oj);c!"bsDy㜫 {KxMOO 5ǏG̹*9]pT[\3gЎi8;wJXwMEɹ~P߷hM }D4C idP?xaKs$N:jd}...s myS1DFНq}\WWc˖-rvE `mm=+97-᫩ 'O%|h6_|͚5fff#‰Rw=eس dQ|ޓ˗&55K֒TY~Ajžu֕ڵkw@vx- ŋմJ[vrI4Eoŕ*"u%<@[[qmVVV-۶m=ZYGG|aBOOOU@N(Ή+Y+h ,(D;ʕ+V^@Yp7" 5򵤘 ",Sre~TJGcIENDB`examples/widgets/mainwindows/dockwidgets/images/save.png000066400000000000000000000035461376617013100241360ustar00rootroot00000000000000PNG  IHDR szz-IDATx^V]oW~|n8ƉI&M!@%+AHH !!7\p Q"7 Ѡ泭S+I㏵;Y9-+:X9?yu]m Th]tZ1hz|M \·S@Ycu? kBzUVPcZY 14+=K*' _O8<_/eSyQ;7b}^ 0! E^V`N_2l2*bWs{c?$~T@=j0 R@ γ\'W;xx{ ϛw\ >!`7ɳ7ok :זS_װ~G BYȇChaq,1̉>N:(W#+^Tǔq/GOcx*6Q# %eODТoPCф@!V!@k_$Z d 2'DHٍA98\? @~Ap_pms9$+E1Yn~6v9TB*/2':`Aܾ }܉ⱽAPDyY~F@ ؁HIa#Pc7ȱq2!;"#Q#YQCJQ@gd}0GYP yFD{Khw{.s<?!=9@7semW9H)sy=dٙs89~5~2J N4B!j@%06!Tg0 yn6dAwiѷ?4zCblAgin \:f5)|;;Wv0[%y9JcP8`.osJ$sjpJoа`BBsp`9=#ݍ0E(SGOb T|#05?7(&EzI$jԘInVqN7p43ot|WMF1 4;BSC 5mbv ƜsSuT+kR) &@ 'Zc;j?w͍uZ-D68s80t$˩1ƌFa@=G: fJW}/_`0p#vjj N|́O[Dе c̑Awe}}ݗ͜.&`&ECq!3(}]}a߉qHVG`hQ>S'igڍV,z>jB 2]4> i%kSbqrou֭HH{}0g !3h1;;K.aaah4?c){\ K<}v w=>y|Nl G3Q MqK8KC)f"Ibq(JvWmm ~iV{u`eߢoWKOqac 1mJEQߒ&&vN'ʺݝ~8މvN^DEoZ,6i?&OGk?/~&Yˮ~~?FF{ggm{8d O,2ម[Ixoz'/V}0"KR'!|:zNdLp_G|;Q&Y|HO1h>#"' wNmIENDB`examples/widgets/mainwindows/dockwidgets/images/undo.png000066400000000000000000000033501376617013100241360ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<zIDATXW LTWjMii. (* ("0nl#BqAvq (Z Z`hԪZ. ?R)6id23s9G@_B6efR4Xfof>~ޓ%D3ɛ~ җÜ{,|9`ۡ+˯<)vlo`1]#Ŗ$M47YPv7 I$L=)fK9"urIɪIp ,PVlL d {=]Nc] `~6VVpNE>|b#,<*<fs[G8&qP_` ̥ENw-q5&]SM#p~:|/T$o+^^]Z 'Ēu$ c$Em"l t{*TՄQ{,{.OgP ^kLkF*E,#K1z^rϘ i75S`IY4b`W)@U3#A_ӉW;ZӮN6ڱJ4$}TcU:Բ -gmb(X Ԋ-Z/%A+i Ha9@1 ZYGyv9Ec<2O>Lq|ȤO9kJ 0u電e陹ȹE\Wno;nw$@ ,i˞pߡI !< s3Y^!)wHS1ZEBh긛׸ Vˀ+xz붔˄r ]-)p+>oc_Ukhڲ dXtqW+0Xܮ\`N(;p\T]BRbUJfmBu*+-S;QoD)3!D놫UdXΤ8iԚ;o:?mعrMSUX}Փn);<眺Q#J~Xu ❆K` f+gz$gO>,3AY'$yn`$1h Eh* 0/rZTMHܖnrٝlvLOxyӳFVpF Rn<6 ?YU p*ҭDW^H\H NJ1LU8fk wT ֊ٿr &PMMy%ɣ>Ʌ~/(Dq\Ale\ܵlRN>=dQ<}`9qEJ*4βZ#Lt$7k_ 1*Wyk&&FlC&jꖋDҒx%I&Əm_Q$IENDB`examples/widgets/mainwindows/mdi/000077500000000000000000000000001376617013100174575ustar00rootroot00000000000000examples/widgets/mainwindows/mdi/images/000077500000000000000000000000001376617013100207245ustar00rootroot00000000000000examples/widgets/mainwindows/mdi/images/copy.png000066400000000000000000000024721376617013100224110ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXõ]L[ewoI q&NpхDP+.&J'Тl9@lC +(іJ{*<9o!,/zc@}}P2Ff dn:~E"+*0@mWڪ4|S5@f:eCբcw*wڻeyBgg'zzz8PIiniog%3 @(cmm | =@A677vVUG;%$3O$(+6Z0'<=MIɩJ=0|qɘPzHk朙WdSjF< fd(;dH=sӹ@ eU-:c}iv]=&rJ*pW=~g.@DqL+++X__'Yt POe24XdNi)9D@|[O~uqq,~Nm7d,m72%#'hf[O5xGJ.7RR:)"E\---n`җ `}iiC ͲТRNxT;5`Zy `0$g@SS[gJO"7@GGG#mmm|A'@ss3JGT?U???h4:ô]L0xGRv:bJJo>ޙ#gSuVnłHmm377WVFLAnC9VpIENDB`examples/widgets/mainwindows/mdi/images/cut.png000066400000000000000000000024531376617013100222310ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXWkLW>#q2Te82f,[p0`.:N1[ X^f 1F-ܨji ܸ aٲ<}^J t (Dq+Fdf"LċGȡȎ;82a+A 0H.݀@2yMrhd^QGнM @t/2= ?H,1yK&B+6F\N 9c6 +A )*7G{̉@DT+, 6FHd*{.T74*TbR,XtzEUȠmts!sQ唃.ݯ˰>`y>^/'g`^3vshG .7wsaؽ^/fߩ6Bϥ-~mTk__sbrVNćԌ08@1~m%[ . $6{B o<ѽVw\Rz0L u5QdQD>v̴@O_~2 D"T*Jh K[9Sy,"džS)⠠ x`X@[^& -Sg L[{` b̄"P`ɹۧu.K)pjx)>+![cG&ؒrdo-- 8b\iF&2,3;3zb<{fO[5XCC=4442e<(6]*2x}.Zl1 %q/'_D Lh>u Ɩ1 f6m8h*>]XGZY Cɑ8 9!\ ϳ7ODIENDB`examples/widgets/mainwindows/mdi/images/new.png000066400000000000000000000015241376617013100222250ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATX՗Na5{q\\0&bXX ѝRHECey{QJ!Iޜ3MN"SsՐn==d 12<S(CfIkR׾TUNK޷’=Oޣqnl4kZS YoK|mu5e<7ɺx&oFh?B~Ql% wIENDB`examples/widgets/mainwindows/mdi/images/open.png000066400000000000000000000040311376617013100223710ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATXíW[Pgb/nٛκ;{z:vTpuֶT mQB!@Hs$!grB GTx~0X}g/>ߗ]v uH W*e`[ '3">vH~Y2ϭB9DQ臆={XSR,::NI1>I,`]YSMM4 1y`Ż?ū)LOϮ׼tCO3@{=.4W S2^5C`\&K|H$8As''H׻ "U77N,V>V:q,k,'6?F}oY1~ Z{?0L(CF&e-,!4{Z;~m$~CF=5iu?PZlY]/sq 1% cbjC'ݼ-Ӱ;3&SXO!,CPF BBsZ*tȼE lϛ'Ào%Q(/bM$"R-BySt < ] /yƪԳs LŔbK˫#7G<<b~/=/-:C(QNܿ}3i 3Th58 X\3>GelAC'b ER$nPD΋J~ m['Ѡe")(Ȑx5 >c f]KcNzI1N[;|%jJ0("3 t.| J*qQF@7 jH7'@L{RE qAAͷ]lC(N#KQWHoXQG `4QɫgA@?noiқ*/ru)S)+vQŕky8n3cjs@"mDžPt +4X$ |J8aVU;:!z/]&o8=cn*F׃H:381 ^QO`+] 9g=JUmCeS@%`+njǩD9|6ZZ8/95j'zLIdnFڍv9,9=NrG ;Fc9=pOJnX,P(@!F.[! o<<5iEX?7Ǎ: !p5U!4[7*4nI:rsm$Jesp)>|c.2*\"]~M 6tvw䈶"I m2JxLKIõ.|me6Y\Q{ %&6ǝՂ^NEXx]\UPuTA/ rjQCO-H/5z-Wxܯ\u˯Ev2g`§ҩ;P 9 /"mak^2/f_=IENDB`examples/widgets/mainwindows/mdi/images/paste.png000066400000000000000000000031551376617013100225520ustar00rootroot00000000000000PNG  IHDR szz4IDATx^[lTsًic$BJ!"-b/Kh+U`UڴV U')ċRy9iӄcj;z޳ghrl'}~sJ)$xxkH)w(' ChRcdY@9&`]DDnΉ+WP]S@Pe(A)fi^/Nl;G|[CL;D2Ķ!!p>Sl;D*@P4`Hi$N8!҇g em(AXW%DBs\=AX\$}-ZܱcGYUU~ХKܮ֪DU,s1O(Ja Aرlr?+ M"fxGuuPKի(ZA-ڶ8XŒL{;76|/g2f>v&.A,٩:l!Y-BPDz8`Yx555 rȑbmt0f#6,2cy.Er<,A65fm8Xt SˍӲ}: /s$$IR躬3Νѣ>|^,Ok/&7|k.-dk{N^VsogwMܝvrugk?x<8%8#%A:߽Mծ(bBYlArfOfrad^g2ƅ퇡ʹ755 FqolH;L^Éy[Iy%c fܝ2 L'ط+%3{=ku*2J+Zpc(,R{}$eLM|`ƸP#Sxv}hL aXx!B-iC#jc! s߃ʣ2G(akK!%0*\@X*#plYD\ϓ=RPjYVL v_=gӺ2y_hίp%x LO3DŗY\N`S(%mR}[tjWo7SpSx3i %Ղ)3u3}r7oDT_p =?~Bv;su]pW@2 ~*ӽi9thӶ}%XXX'O>Iʭ*;nLRYt= АӓNΞ.)055U/"SN%/g~쮸 KvO&@@aZ`;ߊ$^saw3n`pt___̙3ťЏxc!DxOis*_IENDB`examples/widgets/mainwindows/mdi/images/save.png000066400000000000000000000022431376617013100223710ustar00rootroot00000000000000PNG  IHDR szzgAMAOX2tEXtSoftwareAdobe ImageReadyqe<5IDATX͏TE{n@FM4DHČL\.M\kXÎč΂htA\ =`PQ` ^` QVR{:ԩz~6>>]vN5ػ」;v<:̗7XSڠkg|p?0x.ory #ӟd}k@E@xp,#˲m00aP|#%"+Օs΃* ,I Iw:琷Ղv+m(r8 㯼IkFؽ{k놮ZVmQg5 ,# /#&|#!Я'aa%% 4M:ólc V_)Fara-р: TIO4/!g iXvj#wPE x:Tx3x$wh6h߱R^DM_ 8ňKvRPZ0}@Ű&WU.2p}Ʉ-Jsf+7QW?תd~')Ü wl 55Y1{X0+WVU!ѐS,-޸Wj'WڣU<_o|w__sl}5ځ?MKFIENDB`examples/widgets/mainwindows/mdi/mdi.py000066400000000000000000000402101376617013100205770ustar00rootroot00000000000000 ############################################################################# ## ## 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 class MdiChild(QTextEdit): sequenceNumber = 1 def __init__(self): super(MdiChild, self).__init__() self.setAttribute(Qt.WA_DeleteOnClose) self.isUntitled = True def newFile(self): self.isUntitled = True self.curFile = "document%d.txt" % MdiChild.sequenceNumber MdiChild.sequenceNumber += 1 self.setWindowTitle(self.curFile + '[*]') self.document().contentsChanged.connect(self.documentWasModified) def loadFile(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())) return False instr = QTextStream(file) QApplication.setOverrideCursor(Qt.WaitCursor) self.setPlainText(instr.readAll()) QApplication.restoreOverrideCursor() self.setCurrentFile(fileName) self.document().contentsChanged.connect(self.documentWasModified) return True def save(self): if self.isUntitled: return self.saveAs() else: return self.saveFile(self.curFile) def saveAs(self): fileName, _ = QFileDialog.getSaveFileName(self, "Save As", self.curFile) if not fileName: return False return self.saveFile(fileName) def saveFile(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() if error: QMessageBox.warning(self, "MDI", error) return False self.setCurrentFile(fileName) return True def userFriendlyCurrentFile(self): return self.strippedName(self.curFile) def currentFile(self): return self.curFile def closeEvent(self, event): if self.maybeSave(): event.accept() else: event.ignore() def documentWasModified(self): self.setWindowModified(self.document().isModified()) def maybeSave(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) if ret == QMessageBox.Save: return self.save() if ret == QMessageBox.Cancel: return False return True def setCurrentFile(self, fileName): self.curFile = QFileInfo(fileName).canonicalFilePath() self.isUntitled = False self.document().setModified(False) self.setWindowModified(False) self.setWindowTitle(self.userFriendlyCurrentFile() + "[*]") def strippedName(self, fullFileName): return QFileInfo(fullFileName).fileName() class MainWindow(QMainWindow): def __init__(self): super(MainWindow, self).__init__() self.mdiArea = QMdiArea() self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded) self.setCentralWidget(self.mdiArea) self.mdiArea.subWindowActivated.connect(self.updateMenus) self.windowMapper = QSignalMapper(self) self.windowMapper.mapped[QWidget].connect(self.setActiveSubWindow) self.createActions() self.createMenus() self.createToolBars() self.createStatusBar() self.updateMenus() self.readSettings() self.setWindowTitle("MDI") def closeEvent(self, event): self.mdiArea.closeAllSubWindows() if self.mdiArea.currentSubWindow(): event.ignore() else: self.writeSettings() event.accept() def newFile(self): child = self.createMdiChild() child.newFile() child.show() def open(self): fileName, _ = QFileDialog.getOpenFileName(self) if fileName: existing = self.findMdiChild(fileName) if existing: self.mdiArea.setActiveSubWindow(existing) return child = self.createMdiChild() if child.loadFile(fileName): self.statusBar().showMessage("File loaded", 2000) child.show() else: child.close() def save(self): if self.activeMdiChild() and self.activeMdiChild().save(): self.statusBar().showMessage("File saved", 2000) def saveAs(self): if self.activeMdiChild() and self.activeMdiChild().saveAs(): self.statusBar().showMessage("File saved", 2000) def cut(self): if self.activeMdiChild(): self.activeMdiChild().cut() def copy(self): if self.activeMdiChild(): self.activeMdiChild().copy() def paste(self): if self.activeMdiChild(): self.activeMdiChild().paste() def about(self): QMessageBox.about(self, "About MDI", "The MDI 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) for i, window in enumerate(windows): child = window.widget() text = "%d %s" % (i + 1, child.userFriendlyCurrentFile()) if i < 9: text = '&' + text action = self.windowMenu.addAction(text) action.setCheckable(True) action.setChecked(child is self.activeMdiChild()) action.triggered.connect(self.windowMapper.map) self.windowMapper.setMapping(action, window) def createMdiChild(self): child = MdiChild() self.mdiArea.addSubWindow(child) child.copyAvailable.connect(self.cutAct.setEnabled) child.copyAvailable.connect(self.copyAct.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) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) def createToolBars(self): self.fileToolBar = self.addToolBar("File") self.fileToolBar.addAction(self.newAct) self.fileToolBar.addAction(self.openAct) self.fileToolBar.addAction(self.saveAct) self.editToolBar = self.addToolBar("Edit") self.editToolBar.addAction(self.cutAct) self.editToolBar.addAction(self.copyAct) self.editToolBar.addAction(self.pasteAct) def createStatusBar(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() return None def findMdiChild(self, fileName): canonicalFilePath = QFileInfo(fileName).canonicalFilePath() for window in self.mdiArea.subWindowList(): if window.widget().currentFile() == canonicalFilePath: return window return None def switchLayoutDirection(self): if self.layoutDirection() == Qt.LeftToRight: QApplication.setLayoutDirection(Qt.RightToLeft) else: QApplication.setLayoutDirection(Qt.LeftToRight) def setActiveSubWindow(self, window): if window: self.mdiArea.setActiveSubWindow(window) if __name__ == '__main__': import sys app = QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_()) examples/widgets/mainwindows/mdi/mdi.pyproject000066400000000000000000000000641376617013100221710ustar00rootroot00000000000000{ "files": ["mdi_rc.py", "mdi.py", "mdi.qrc"] } examples/widgets/mainwindows/mdi/mdi.qrc000066400000000000000000000004071376617013100207400ustar00rootroot00000000000000 images/copy.png images/cut.png images/new.png images/open.png images/paste.png images/save.png examples/widgets/mainwindows/mdi/mdi_rc.py000066400000000000000000000651371376617013100213020ustar00rootroot00000000000000# 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\ \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\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\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\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\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;\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() examples/widgets/painting/000077500000000000000000000000001376617013100161605ustar00rootroot00000000000000examples/widgets/painting/basicdrawing/000077500000000000000000000000001376617013100206155ustar00rootroot00000000000000examples/widgets/painting/basicdrawing/basicdrawing.py000066400000000000000000000346251376617013100236360ustar00rootroot00000000000000 ############################################################################# ## ## 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 class RenderArea(QWidget): points = QPolygon([ QPoint(10, 80), QPoint(20, 10), QPoint(80, 30), QPoint(90, 70) ]) 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) self.pen = QPen() self.brush = QBrush() self.pixmap = QPixmap() self.shape = RenderArea.Polygon self.antialiased = False self.transformed = False self.pixmap.load(':/images/qt-logo.png') self.setBackgroundRole(QPalette.Base) self.setAutoFillBackground(True) def minimumSizeHint(self): return QSize(100, 100) def sizeHint(self): return QSize(400, 200) def setShape(self, shape): self.shape = shape self.update() def setPen(self, pen): self.pen = pen self.update() def setBrush(self, brush): self.brush = brush self.update() def setAntialiased(self, antialiased): self.antialiased = antialiased self.update() def setTransformed(self, transformed): self.transformed = transformed self.update() def paintEvent(self, event): rect = QRect(10, 20, 80, 60) path = QPainterPath() path.moveTo(20, 80) 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 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) self.setWindowTitle("Basic Drawing") def shapeChanged(self): shape = self.shapeComboBox.itemData(self.shapeComboBox.currentIndex(), IdRole) self.renderArea.setShape(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)) self.renderArea.setPen(QPen(Qt.blue, width, style, cap, join)) def brushChanged(self): style = Qt.BrushStyle(self.brushStyleComboBox.itemData( self.brushStyleComboBox.currentIndex(), IdRole)) 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)) 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)) 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)) elif style == Qt.TexturePattern: self.renderArea.setBrush(QBrush(QPixmap(':/images/brick.png'))) else: self.renderArea.setBrush(QBrush(Qt.green, style)) if __name__ == '__main__': import sys app = QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) examples/widgets/painting/basicdrawing/basicdrawing.pyproject000066400000000000000000000001171376617013100252120ustar00rootroot00000000000000{ "files": ["basicdrawing_rc.py", "basicdrawing.qrc", "basicdrawing.py"] } examples/widgets/painting/basicdrawing/basicdrawing.qrc000066400000000000000000000002101376617013100237520ustar00rootroot00000000000000 images/brick.png images/qt-logo.png examples/widgets/painting/basicdrawing/basicdrawing_rc.py000066400000000000000000000124221376617013100243110ustar00rootroot00000000000000# 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\x03X\ \x89\ PNG\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\ \x00\x00 \x00\x00\x00\x10\x08\x02\x00\x00\x00\xf8b\xea\x0e\ \x00\x00\x00\x04gAMA\x00\x00\xb1\x8e|\xfbQ\x93\ \x00\x00\x00 cHRM\x00\x00z%\x00\x00\x80\x83\ \x00\x00\xf9\xff\x00\x00\x80\xe8\x00\x00u0\x00\x00\xea`\ \x00\x00:\x97\x00\x00\x17o\x97\xa9\x99\xd4\x00\x00\x02\xe3\ IDAT8\xcbE\x94\xcb\x8d\x1eE\x10\xc7\x7fU\ \xd53\xb3\xf6j\x9d\x09I\x90\x04\x0e\x05\x09\x99x\xe0\ \xc4\xc1\x12\x07B \x04\x08\xc1\x96\xd7\xcb\xb7\xf3\xcd\xf4\ \xa3\xaa8L[\xees\xbd\xfa\xff\x92\xcf\xff\xfc\xa6\x86\ \x1a(* dB\x92A\x048\x1e\xa4\x93A89\ @\x11A\x94\x8cY\x93WABb+e\xc3\x16\xac\ \x85\xf7?\xbd/\x08\xf5\xf6o\xd9P%\x0c5\xc4\ H\xc7;1\x18\x8d\x18\xa4\x13Nt| \x82\x16\x80\ t\xdc\xf1F\x0c\xc2\x11\x00\xa4\xb0\xbc\xe1\xe1\x09\xdb\xf8\ \xf5\xc3\x87\x0c\x8a\x1a\xaa\xd4\x97\xbf\xcb\x82.\xf3\x04\x9c\ \xa8\xd4\x9d~\xa7\x9f\xf3\xd8\xd1\xf0\x93p\xb4 \x82w\ \xfa\xc1h\x10D\x02\xa8b\x0b\xeb#\xfd\x1d\x7f\xfe\xf5\ 1\x02Q\x8a\x16\xd4\x10\xa5\xdd>ja{\x22 \x06\ }\xe7\xfc\xc2\xf9\x1f\xc73\xf5u\x82\xd0vFE\x94\ \x18x\xa7\xef\x8c\x8e*\xde\xc9\xc4\x0a\xdb;\x1e\x9eX\ \x1e\xf1\x0e\x01PD\x10\xc3\x0aa\x94\x07\xca\x86.\x84\ \x93\x01L2\xc6\x81\x0f\xd2i\x07^\x01\xc4\x88\x81\x18\ \x0c\xbc3\x1a\xd1\xf1B\xd9h\x85Lb\x90I\x06\xe5\ \xc2T\x0cQlE\x0b\x19d\xe2\x83v\xe7\xf8J\xdb\ Ihw\xc6\x9d\xd1\x89A\x06\xb6 J?!\x18\x8d\ \xbe\x93I\x11\xbca\x1b\xfd\xa0\xef\x8c\x13\xef\x17\x07\x05\ QD\x11!\x9cQ\xa97\xce\x17\x8e\xaf\xd4\xdb\xe4`\ \x9c\xdc\xbf\x90\x17\xb7\x83\xf5\x11Q\xfa}v\x89\x92\x8e\ \x08\x11x\x87\xa4\x9f\xf4\x93Q/\x88\x14\xb9x\x1b\x8c\ \xca\xf9\xc2\xf1\xc2\xf1<\xfb\xc9\x89\xd5hx\xbb\xb4B\ \x0c\x80QQ\xa3l,o!'n^Q\x9d\xda\x8d\ \xa0D\x00\x98\x12+\x80W\xfaI\xbbQo\xb4W2\ \x09g\x1cd\xa0\x85~\xc7;Z\xe8\x8a\x15\xc89\xb7\ \xac\x08\x88R\x1e\xa6\x823A )\x17\x99b\xa8\x11\ \x8ew\xbc\x11A8u\xa7\x1fS\x91\xa3~\xf7\x97w\ 2\x88\x95p`\xee6\xc3\x16\x96G2\xbeA\xa7 \ \x14Q\x08b\xd0\x0eT\x19\x95\xe8Lb\x8cLFe\ \x1c\xd4\x1d?I\x07!\x83\x14\xa2\x91I\xef\xa0\xaco\ \x91\x85d\xb2}\xad\xbc\x0e*\x99x\xa7\xed\xec\x9f\xb0\ \x85\x18\x93\x0f5\xcaJ7\x86S_i\xfb4\xd4%\ A5\x10F#\x1d5\xfa\x1d5\xb2\x93\x81(j\x13\ \x15[(1\xe8\x07\xf7g\xf6O\xacO\xa8\xe1\x8dQ\ !\xb0\x82\x95\xefn\xb8\xac$B\x0f`\xc6Cy\x83\ m\x84\xd3O\x00\xdb\xe6\xee\xebD+\x94p|\xf0\xc7\ \xef\x1f#\xd8\x9e\xa6K\x11\xa2\xd1v\xda\x9d\xfaJ\xbb\ 1*\x97\xf5/Ef\x80 \x8a\x1eX\xc5\xf6\xc9\xa2\ \x1a\xba\x00\x94o\x9bJ8\xbf\xfc\xfc\xe12\x9e\xad\x88\ \xccT\xf1A\xdd\x89+\xf2\xeaL\xba\xab\x87+h\xa1\ \xac\xe8\x82tTA\xd0\x05U\x00QtA\x8dL\xe4\ \xc7\x1f@g\x16^\xc0]\xef\x92S\xe6\x84>\x06\x04\ 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"\ \x00\x06\ \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\ " 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\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\ " 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() examples/widgets/painting/basicdrawing/images/000077500000000000000000000000001376617013100220625ustar00rootroot00000000000000examples/widgets/painting/basicdrawing/images/brick.png000066400000000000000000000015301376617013100236610ustar00rootroot00000000000000PNG  IHDR bgAMA|Q cHRMz%u0`:oIDAT8EˍEU3j I xB ˷8L[s(* dBA8A89@AYWABb+e ?/oP% 5H;1Nt| tF  Ç ԗ˂.ԝ~p whDb #1Q>ja{" }3uvFEx* ;XPD aʆ.L2Ɓi^Ĉ 3BhLbIT QlE dvJIhwƝщA J?!IaQD!Q7`ܿQ}vxQ/x<ɉhxB QQl,o!'n^QڍD+WIQoW2 gd~;Z9R3A )bwA8uS~w2p`6G2A QbTLbLFe?I!Iod}*x쟰5J7S_i4%A5F#55(j[(1gOOQ!n$B`CymOD+p|#؞KvڝJ1*/Ef XɢoJ82TA݉+L+htTAUQtAL@g^]S>W]AYWn9$\OIENDB`examples/widgets/painting/basicdrawing/images/qt-logo.png000066400000000000000000000010251376617013100241500ustar00rootroot00000000000000PNG  IHDRPP|?PLTEኡ ?Gp"9 pHYsHHFk>IDATHVKn0 Ef9I5"kHsT?B Lu ۱SUok/s l :Ba㋸$$ S`[6$EB cYdSbj+٤Vd9='?'ɽzn57~uVJF`ɚtr"KkDhRDr [mlQ=%\x~0v94vauP#kƶ ̔73j#>詞x ~3x5(q׸T6RYSRGp(Bd=wK<뙣 asL{*O)QPFU{:R{v)-=5P{6Qs攒x1Oפ zadNjF6Aڒ=b~Y?ݑIENDB`examples/widgets/painting/concentriccircles.py000066400000000000000000000120311376617013100222230ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/painting/painting.pyproject000066400000000000000000000000521376617013100217270ustar00rootroot00000000000000{ "files": ["concentriccircles.py"] } examples/widgets/richtext/000077500000000000000000000000001376617013100162015ustar00rootroot00000000000000examples/widgets/richtext/orderform.py000066400000000000000000000255601376617013100205620ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/richtext/richtext.pyproject000066400000000000000000000000721376617013100217730ustar00rootroot00000000000000{ "files": ["syntaxhighlighter.py", "orderform.py"] } examples/widgets/richtext/syntaxhighlighter.py000066400000000000000000000203401376617013100223170ustar00rootroot00000000000000 ############################################################################# ## ## 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", "

The Syntax Highlighter example shows how to " \ "perform simple syntax highlighting by subclassing the " \ "QSyntaxHighlighter class and describing highlighting " \ "rules using regular expressions.

") 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.QRegularExpression(pattern), keywordFormat) for pattern in keywordPatterns] classFormat = QtGui.QTextCharFormat() classFormat.setFontWeight(QtGui.QFont.Bold) classFormat.setForeground(QtCore.Qt.darkMagenta) pattern = QtCore.QRegularExpression(r'\bQ[A-Za-z]+\b') assert pattern.isValid() self.highlightingRules.append((pattern, classFormat)) singleLineCommentFormat = QtGui.QTextCharFormat() singleLineCommentFormat.setForeground(QtCore.Qt.red) pattern = QtCore.QRegularExpression('//[^\n]*') assert pattern.isValid() self.highlightingRules.append((pattern, singleLineCommentFormat)) self.multiLineCommentFormat = QtGui.QTextCharFormat() self.multiLineCommentFormat.setForeground(QtCore.Qt.red) quotationFormat = QtGui.QTextCharFormat() quotationFormat.setForeground(QtCore.Qt.darkGreen) pattern = QtCore.QRegularExpression('".*"') assert pattern.isValid() self.highlightingRules.append((pattern, quotationFormat)) functionFormat = QtGui.QTextCharFormat() functionFormat.setFontItalic(True) functionFormat.setForeground(QtCore.Qt.blue) pattern = QtCore.QRegularExpression(r'\b[A-Za-z0-9_]+(?=\()') assert pattern.isValid() self.highlightingRules.append((pattern, functionFormat)) self.commentStartExpression = QtCore.QRegularExpression(r'/\*') assert self.commentStartExpression.isValid() self.commentEndExpression = QtCore.QRegularExpression(r'\*/') assert self.commentEndExpression.isValid() def highlightBlock(self, text): for pattern, format in self.highlightingRules: match = pattern.match(text) while match.hasMatch(): index = match.capturedStart(0) length = match.capturedLength(0) self.setFormat(index, length, format) match = pattern.match(text, index + length) self.setCurrentBlockState(0) startIndex = 0 if self.previousBlockState() != 1: match = self.commentStartExpression.match(text) startIndex = match.capturedStart(0) if match.hasMatch() else -1 while startIndex >= 0: match = self.commentEndExpression.match(text, startIndex) if match.hasMatch(): endIndex = match.capturedStart(0) length = match.capturedLength(0) commentLength = endIndex - startIndex + length else: self.setCurrentBlockState(1) commentLength = len(text) - startIndex self.setFormat(startIndex, commentLength, self.multiLineCommentFormat) match = self.commentStartExpression.match(text, startIndex + commentLength) startIndex = match.capturedStart(0) if match.hasMatch() else -1 if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.resize(640, 512) window.show() sys.exit(app.exec_()) examples/widgets/richtext/syntaxhighlighter/000077500000000000000000000000001376617013100217465ustar00rootroot00000000000000examples/widgets/richtext/syntaxhighlighter/examples/000077500000000000000000000000001376617013100235645ustar00rootroot00000000000000examples/widgets/richtext/syntaxhighlighter/examples/example000066400000000000000000000031731376617013100251460ustar00rootroot00000000000000TEMPLATE = app LANGUAGE = C++ TARGET = assistant CONFIG += qt warn_on QT += xml network PROJECTNAME = Assistant DESTDIR = ../../bin FORMS += finddialog.ui \ helpdialog.ui \ mainwindow.ui \ settingsdialog.ui \ tabbedbrowser.ui \ topicchooser.ui SOURCES += main.cpp \ helpwindow.cpp \ topicchooser.cpp \ docuparser.cpp \ settingsdialog.cpp \ index.cpp \ profile.cpp \ config.cpp \ finddialog.cpp \ helpdialog.cpp \ mainwindow.cpp \ tabbedbrowser.cpp HEADERS += helpwindow.h \ topicchooser.h \ docuparser.h \ settingsdialog.h \ index.h \ profile.h \ finddialog.h \ helpdialog.h \ mainwindow.h \ tabbedbrowser.h \ config.h RESOURCES += assistant.qrc DEFINES += QT_KEYWORDS #DEFINES += QT_PALMTOPCENTER_DOCS !network:DEFINES += QT_INTERNAL_NETWORK else:QT += network !xml: DEFINES += QT_INTERNAL_XML else:QT += xml include( ../../src/qt_professional.pri ) win32 { LIBS += -lshell32 RC_FILE = assistant.rc } macos { ICON = assistant.icns TARGET = assistant # QMAKE_INFO_PLIST = Info_mac.plist } #target.path = $$[QT_INSTALL_BINS] #INSTALLS += target #assistanttranslations.files = *.qm #assistanttranslations.path = $$[QT_INSTALL_TRANSLATIONS] #INSTALLS += assistanttranslations TRANSLATIONS = assistant_de.ts \ assistant_fr.ts unix:!contains(QT_CONFIG, zlib):LIBS += -lz target.path=$$[QT_INSTALL_BINS] INSTALLS += target examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.py000066400000000000000000000132661376617013100260750ustar00rootroot00000000000000 ############################################################################ ## ## Copyright (C) 2013 Riverbank Computing Limited. ## 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/richtext/syntaxhighlighter example from Qt v5.x""" 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 class MainWindow(QMainWindow): def __init__(self, parent=None): QMainWindow.__init__(self, parent) self._highlighter = Highlighter() self.setup_file_menu() self.setup_editor() self.setCentralWidget(self._editor) self.setWindowTitle(self.tr("Syntax Highlighter")) def new_file(self): self._editor.clear() def open_file(self, path=""): file_name = path if not file_name: file_name, _ = QFileDialog.getOpenFileName(self, self.tr("Open File"), "", "qmake Files (*.pro *.prf *.pri)") if file_name: inFile = QFile(file_name) if inFile.open(QFile.ReadOnly | QFile.Text): stream = QTextStream(inFile) self._editor.setPlainText(stream.readAll()) def setup_editor(self): variable_format = QTextCharFormat() variable_format.setFontWeight(QFont.Bold) variable_format.setForeground(Qt.blue) self._highlighter.add_mapping("\\b[A-Z_]+\\b", variable_format) single_line_comment_format = QTextCharFormat() single_line_comment_format.setBackground(QColor("#77ff77")) self._highlighter.add_mapping("#[^\n]*", single_line_comment_format) quotation_format = QTextCharFormat() quotation_format.setBackground(Qt.cyan) quotation_format.setForeground(Qt.blue) self._highlighter.add_mapping("\".*\"", quotation_format) function_format = QTextCharFormat() function_format.setFontItalic(True) function_format.setForeground(Qt.blue) self._highlighter.add_mapping("\\b[a-z0-9_]+\\(.*\\)", function_format) font = QFont() font.setFamily("Courier") font.setFixedPitch(True) font.setPointSize(10) 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")) new_file_act = file_menu.addAction(self.tr("&New...")) new_file_act.setShortcut(QKeySequence(QKeySequence.New)) new_file_act.triggered.connect(self.new_file) open_file_act = file_menu.addAction(self.tr("&Open...")) open_file_act.setShortcut(QKeySequence(QKeySequence.Open)) open_file_act.triggered.connect(self.open_file) quit_act = file_menu.addAction(self.tr("E&xit")) quit_act.setShortcut(QKeySequence(QKeySequence.Quit)) quit_act.triggered.connect(self.close) help_menu = self.menuBar().addMenu("&Help") help_menu.addAction("About &Qt", qApp.aboutQt) class Highlighter(QSyntaxHighlighter): def __init__(self, parent=None): QSyntaxHighlighter.__init__(self, parent) self._mappings = {} def add_mapping(self, pattern, format): self._mappings[pattern] = format def highlightBlock(self, text): 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.open_file(":/examples/example") sys.exit(app.exec_()) examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.pyproject000066400000000000000000000001541376617013100274540ustar00rootroot00000000000000{ "files": ["syntaxhighlighter_rc.py", "syntaxhighlighter.py", "syntaxhighlighter.qrc"] } examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter.qrc000066400000000000000000000001571376617013100262250ustar00rootroot00000000000000 examples/example examples/widgets/richtext/syntaxhighlighter/syntaxhighlighter_rc.py000066400000000000000000000061141376617013100265530ustar00rootroot00000000000000# 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() examples/widgets/richtext/textobject/000077500000000000000000000000001376617013100203545ustar00rootroot00000000000000examples/widgets/richtext/textobject/files/000077500000000000000000000000001376617013100214565ustar00rootroot00000000000000examples/widgets/richtext/textobject/files/heart.svg000066400000000000000000000074411376617013100233100ustar00rootroot00000000000000 Heart Left-Highlight This is a normal valentines day heart. holiday valentines valentine hash(0x8a091c0) hash(0x8a0916c) signs_and_symbols hash(0x8a091f0) day Jon Phillips Jon Phillips Jon Phillips image/svg+xml en examples/widgets/richtext/textobject/textobject.py000066400000000000000000000112671376617013100231100ustar00rootroot00000000000000 ############################################################################# ## ## 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): def intrinsicSize(self, doc, posInDocument, format): renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray()) size = renderer.defaultSize() if size.height() > 25: size *= 25.0 / size.height() return QtCore.QSizeF(size) def drawObject(self, painter, rect, doc, posInDocument, format): renderer = QtSvg.QSvgRenderer(format.property(Window.SvgData).toByteArray()) renderer.render(painter, rect) class Window(QtWidgets.QWidget): SvgTextFormat = QtGui.QTextFormat.UserObject + 1 SvgData = 1 def __init__(self): super(Window, self).__init__() self.setupGui() self.setupTextObject() self.setWindowTitle(self.tr("Text Object Example")) def insertTextObject(self): fileName = self.fileNameLineEdit.text() file = QtCore.QFile(fileName) if not file.open(QtCore.QIODevice.ReadOnly): QtWidgets.QMessageBox.warning(self, self.tr("Error Opening File"), self.tr("Could not open '%1'").arg(fileName)) svgData = file.readAll() svgCharFormat = QtGui.QTextCharFormat() svgCharFormat.setObjectType(Window.SvgTextFormat) svgCharFormat.setProperty(Window.SvgData, svgData) cursor = self.textEdit.textCursor() cursor.insertText(u"\uFFFD", svgCharFormat) self.textEdit.setTextCursor(cursor) def setupTextObject(self): svgInterface = SvgTextObject(self) self.textEdit.document().documentLayout().registerHandler(Window.SvgTextFormat, svgInterface) def setupGui(self): fileNameLabel = QtWidgets.QLabel(self.tr("Svg File Name:")) self.fileNameLineEdit = QtWidgets.QLineEdit() insertTextObjectButton = QtWidgets.QPushButton(self.tr("Insert Image")) self.fileNameLineEdit.setText('./files/heart.svg') QtCore.QObject.connect(insertTextObjectButton, QtCore.SIGNAL('clicked()'), self.insertTextObject) bottomLayout = QtWidgets.QHBoxLayout() bottomLayout.addWidget(fileNameLabel) bottomLayout.addWidget(self.fileNameLineEdit) bottomLayout.addWidget(insertTextObjectButton) self.textEdit = QtWidgets.QTextEdit() mainLayout = QtWidgets.QVBoxLayout() mainLayout.addWidget(self.textEdit) mainLayout.addLayout(bottomLayout) self.setLayout(mainLayout) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = Window() window.show() sys.exit(app.exec_()) examples/widgets/richtext/textobject/textobject.pyproject000066400000000000000000000000431376617013100244650ustar00rootroot00000000000000{ "files": ["textobject.py"] } examples/widgets/state-machine/000077500000000000000000000000001376617013100170715ustar00rootroot00000000000000examples/widgets/state-machine/eventtrans.py000066400000000000000000000067041376617013100216430ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/state-machine/factstates.py000066400000000000000000000100421376617013100216010ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/state-machine/pingpong.py000066400000000000000000000067261376617013100212770ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/state-machine/rogue.py000066400000000000000000000163771376617013100206020ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/state-machine/state-machine.pyproject000066400000000000000000000002031376617013100235470ustar00rootroot00000000000000{ "files": ["pingpong.py", "trafficlight.py", "twowaybutton.py", "eventtrans.py", "rogue.py", "factstates.py"] } examples/widgets/state-machine/trafficlight.py000066400000000000000000000125431376617013100221160ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/state-machine/twowaybutton.py000066400000000000000000000052721376617013100222370ustar00rootroot00000000000000 ############################################################################# ## ## Copyright (C) 2010 velociraptor Genjix ## 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_()) examples/widgets/systray/000077500000000000000000000000001376617013100160655ustar00rootroot00000000000000examples/widgets/systray/images/000077500000000000000000000000001376617013100173325ustar00rootroot00000000000000examples/widgets/systray/images/bad.png000066400000000000000000000047001376617013100205670ustar00rootroot00000000000000PNG  IHDRV9sRGB pHYs B(xtIME 0D&NPLTE              !"#$%&'()*+,-./012345 6 7!8"9":#;#<$=%>%?&@&A'B(C(D)E)F*G+I,J,K-L.M.N/O/P0Q1R1S2U3W4X5Y5Z6[7\7]8^8_9`:a:c;e=g>h>i?j@k@lAmAnBoCpCqDsEtFuFvGwGyIzI{J|J|K}K~LLMMNOOPQRSSUVWXYYZ[\^^__`aabbcddfghijjkklmmnppqqrssttuvwxyyzz||}}~Հրׁ؂قڃۃ܄݅ޅ߆stRNS (=\ru#bKGD5TRIDATx_UƭfmTPąE P\Z$44JRJ4L DS@MFa!֘]r0Ϝ~ys_?...........Wwݩrn)dc@.ҧ*p]0GuBTSlY;U͐3DlTUun~{w 6{kv?͖I`W_~OЗpMViy,TЗpsm.T dи6h+ 휇mmp7qHXz؇>ck}L$v1tI+qhX7ڞ(E|N} yBAR /ʔq~9l'ҡ1:z8alwI-I+UG B <$q|ZJ7 t$~YM}06_-Q:n'pM JhX1.D%-4cdc(Ўk jhP>~5mTdvXGwM yt ;@;]9G"ƄKԨ05;35nxp:{Ń3._"=0AQyb #`~Z K.{>=gXgVqcf7٢lPsLPe--l!tKYՍ3%vDCV #~p0 f0ryX=Iz} Sfd0LV$ x&Ie8 && lLs%V4Q6^Pm mTbM"\QDl[3=lۜ3 )pM1dܛNkzaN75!czZg'S:J#p3h]ƅO05 LધdOU@7p*(ÕꃠpeAÀp>0`4G xDkL\WͷplQ0s&Qe#ўϴ=I3q_~栟ٳ@_j0>*\\y nX#¥{ ϰXy$c¥9Ӽ<+t;~6,8jFd`fasz|2{o0oLU؈ʹ8RI^/0nVxz }>؊A!eX n)S&a1WʁH/4(P6 ϕ&0I/8_Ӎ/4>uؕ5vixlS,ch Ȳ}QT'}!D֨ʸ9`S%-U0ͫ$GMTl,H| g%*)^my0OtB$]Sq(xuڣz-RM֖՛~աۻ;k9jē*Bx?ߋo7;,qc)ıq[n(~@][~#B[VuX BDzh^]|/w |CTljW?_?P]Jkřⱉ/H8EB _ʰZ qx.+K|L&eD} J}(>#;PAxxx JHψϝ[ݭϯ;賌ŧⳉOXLuA)sC:u?Kϴ_ vϏ/I-ѝ؟qwt`$Q ݹu¸ky .A#׭6/Yq8 Ad P~U"Z`__V]D #VC CƮ_uz'0@f\G4<6DаDߘבW׏)udhE7YީΔ3$\P?I/5dz,K6?čt H%j3w}GK8[,`@Hb+NIǂx:G3#c tk_SX1>&4CQˤm eNgC}1:~ӷ11;\[2U8@ kݚr[kVٯnݻ_=IB\+.Ob> :D8 鉇(_8D!p/DW_%1nkL:~3(1^s~^p|[į.H xe\ SC<,>(^gC+\&qK-3O3_|x:A;FH"RǁvDlu\|7Ǎ)+Ujǃn8]h]|AOPXr)w{?yU+d>aw˗Ӧ5>ݭ؍`7箍,6Ǹ;{FaJծRM*m[t릒)gv$L)S3kLqF=$ӫrvMmX9őu?ہ^ ?O{Ӳw񠫣>J]_,՝ΣIM֨}p\9GA3~rfVҥٲE9W\a֭Y\9+gT=ӬrJJs{)cb !'g, M+g` mWVLt{>}6:uөӾ̙px7*ӻ+E V͊n9gb<Q\Vr3wսGEƔѯ)JD0)sg ys++bž}oqPLfOuO }_Y>xL/M )CqZ"adr4QURBjjq/$gaÔsv}stga?QRÌXH8r`yd.v{]h]UJ_\@%[ʑ/1NÆF?+}iX_5I_҆8B(zvwҧltGR t{VT4HϟR;w:fJ˧vJF9Xś9 'VBG|:Q(kByʹBBuP^vrN9E9-[C0~Xcu(|6w Snͱ`t; #n[.\I6fjjF%X M[ ?V1DRm@h"h->i8[ Ι]6 /w6OG+܍+m'~T3bb@i+g쾢_< vWQtI `&F1K=ſoץ#WUۡc$]_3Q9ΝUs8]K/U]t<.gߖeQm{붉1$'?AHȌnl-L#UΚ5݈ܺ5GzY'v/v;v΃Ew+غʳ {5TjHڰp;U3T2˗Jg<~u4ʯ ?u._O;'.C[ƉDO53arm#݊ >]9Mdu ?]"Xk׈uK@ Z9Z^ ծ' !)S=KMw~H/aӠw`f#bN :Gmhv|'>LPm++UJw~i0g@ڹ%GFX?l5G>;5' ' P)gHlB0ů{O>{wV3RgHUo zq[YceDS-&鷂XKC9kD]_?>e. rϰJ/ZuA}I8-L.=QqMxePM,]JD]_֯WN/wU;b߈եtdkF0^v".=jY]0FM\q@SVyr>^p_Eԥ2)6 qsﰳgbq r|v& ^;) *YXXx} b^uIAǦx#sA}}uv&qoMYPfJvP18˾pcu[E7=d"b2.0+*-cYYvB]Ze˿M5q׸-_SogƉ0\PC3K/%4Y/ʻ?KY %1X&_^_p]vmSG8_؆v`6 >|)\p6- N=tkK]=C(C?S&v!Al`Y@5REњNV'nF,uK 6v'!GԥK(NXNlwj]9_N(^MmؠUrB̙3P3nܾn.#3|r TzyD0mtglwD)Ę.ݕHw4߶aBf2)H[{*5{rt`yJ6jT ߰[F=lO]ZA(s  sńK׻\ 6L9Wvg#Y 'e.oÿөnKwdbDCOÞDdsԉ#-x0k0~K9Md~~d\ ÿP38ĎؑQ^ؓG·'[/M g+gHm[.*6X _KP1%swy yuoؓfLvkPμyQLcӺr";7c1auI_/#f.gG]'l9_P9۶)[RN߾*UvN/X̠.-{;爁.& |`r['~6ټp&nM?_̑]r!Q]r!1ЮSK툁`#ķÜ }#U={;oTsӡKt+Mo+D/a:"]*~]zZ,"m|7̉]>t(Asʊ&#ЦŰCCԤ<0{:0fuuiql0'D[70TS˄ \ ;v(3UJebaC< uivu}6"<ܺ{ tZ k24Ij8Ov5;hrJJX̲bp?Kmďj)@ Z֥:ЭkTd.(P̙85++9XlWE}%e PA,.HD0YoNb}p\l/}rJ6hWy.WϡV.'! %o2/M*笳q 'ZX 0܅Obceu2U~+ܺ;H".i~֠ q9nrJKYBP9&a` Z~`xu "{>DϜs`{`^& uge!"Dk}Ml^}"AW00zRZ)NBs(qc!|RC\|j N|a[t8:@-RfXx,60y [#w½~9dxX U6Y6nTNg979#riԛ݈c hOʡC q8g;T"Cb'#Fb#; YeQfU&d^ʩ$F9{rgqKh`u->_H[peU&`yr6o&FQʩQ$&.Q@ WG+!K }3Mݨ]]-9n: |bRpjDMȄ9abIN,7:N"S_p۱kSc7uWK[^lQN., uy!©1%x|0 R5g7*\MY r\ݡ{p>+Ĝ6)Zs2;&g 7N QqL'YKM #bzOCB*ɤ#ھFRN^ ~s,|sҳ©9p0?Gg2TKur:v}Glna8i]B|yM, 7BL'_۽2Λ!޲p'炘VSC:={>:ÉjF9`X (Ɂ |F{YtLD6$WT۹s |@, y s1|K=8_69g:i&L Y*YXHqGΰ /s@d=L$9/di: lˠtj կu 1Ka9 ~>\5\zKJ?^d׽Zͤb׮aGn.}7"޹ܤHLhGeKV&ۦnuIտ4PFDK_ &F[+^Ʉ8X°m~:ZЈ ԥ;#כE?{aC^F lL 9sT2?"F|MT]jI]BĜـ~5q58L۔D8@lɅ ӽ)hKWE \d6([sUWk4h]ƶlrW0c(ԥV#b0ܠ@|( 0e ׭S:u('x5rـ,57ajPU_;˕SQA0m۔sc },u.WDfCzgkԀ6`lCsԉBVxNҥ=1 h6o$ƛb&Slh_0$ [G5>'e._Y'fDxs4$>plI;EzmNB]:#"fNfCzObl|tU&g++ at)Jb167cIA ~ Ov8lPStZǚxs}GM}˛hKYJA@ӊ ЁV{{oMן8.z?lGp}!Qh1͠.M#}'q6^01xzEE*i9̎-d~>#-l 2)6 dm; $֭iЀ"t,/D E&MLz /[FHSzug1`~L^B4- a:s&#r{57+D*66zBrH&׮UNI E#5;ѐ 蟊gS]|`..VI}]RP1?HM c.&>rj@BrXNN1X 5 >hhSlb߁',wF唖RH1_1"bU]a.&F&~u?iSrXCX5i-D 'Ͷ[D̍.L ~~I'øzYP/%գz]1$[ 1RW&0vvԯOX:gz"YhR] ۢa9 Gpbl}=jWq;D,{$F&HDσw²i׬QNQcDw犿";tiC!9q7z,218N3pn){pw[ bk.O&FM k V̦]bhеz%q7z>Q F{T-)}\@-ڙK.!4<‹Xn&!!F&4?^=BAS;wS${]Ġ`0lr|$ $""bH2/"F_Os >J]?7o$rA?*u+ٔSCtwX?t.F&3P۶%4=O֬IqDDD پfb5g"3HO8lʱc)81N_1m~gCNi)E4O'wM W<d~~:8(k?XuA#Ά^ u5 """ZtQL@k?z 3@ !<{~YCDDDh&E&~JgpΜI6C!DDDʓur) KoL]Kxڋ/"""ZrsЛTW^(B޾})}s}1^=ķ A{)*"""Z4b\hg`JrI@DDDKc*bg`NB"""Zl33b8ǀL-YBҋ.!""Zn3!b=: UjBtOCDDSvR%M^~Ւ۷+‡hOvD@ԉ(""2ɥ8l}L|{=>x0!:H:d. lj&> Au+#1a_ >{6A:(O!""Fߚ #(t)A: S]R#D%v }og@nL-[T!k qu|O[W'H{NDDL@_MۂGxIzgϞ:DDĈy^A_u lIJ唕Q#03z}?@҅0^HCDDc?y^b> ="A' 7AyÆ Q#fax>~ׁ8v,:궕9DD:L@8l//:O?@m̡!""F9fax+~AW7:&;Q5'Ǟ?u^%Tsy q>RA{s)(!""F%f ap7{=2>:[.!""F szQJuGqCDD G\";Akŋ ]R#3 }@\`Mkצ!""Fyf#ax%~ׁl:Q郞zy1~);=< ""bĝi&8l/:/`-O9†q4A/fKkد 1N6 As=$mg6DDĈ;L@8l u >:VV*†q5Я'O'x=Kq:""b i&$ǍA#s!\g .!""fea2~׀>{6:NFQCDD%aKS5DDXL@KAIٰo_""b f&O%AMq7p ۶!""Fw̄s8} /:G"\g)l7ad`:pWD )lz7} 5?e0 Us6""b \@oL.&> nUu""b b&!}/D۴!`W%K(j1pG_=vy*:\""b Q^Xe05DD8L@51^z2SQAȮBQCDD=X$1i!*CQCDD`{i|9!*'S#Ο#F ܙ8k1n1$FkL 3ۙ8>1N3Џ&F&ōtr %K(pp \ű&^iǎL\ gѢ>@][P#o==0Zy ܙtr^B1W s㮠F~L,/!""Fzonz LlߞB1 矉%1D@?ٻ71B>nnn4ikbxzQD9ngG!""FuDh'%R&eЮXAI;DDy>]11H2hL!pA?""b<\@oG̍.L ^nZECDD pOJ@DebeꖁnVTda!E13Lč6u/(z酎KG q&=^inлv!""Znq~ 6\ob2%tu0 ""a.C,"F9&0/A_O?‡h wm&LΡpjjB/‡h8>mxR&͏ ɓ ~ܾ]9yy?DDDK}\8v&Ƈ4 Ν trADD̅$ \T&x{6ٽ;R{ iEKS?`7DZc)X`.Ao< !C~ee ^2hafSl15N2pe%PΛGDDD ͶV'AWC|˄=~v;w*zu'""bl69sj/U+BV'""b F,4WIa75xPDDĀi6KlL$i$~fj^奣&-[SXHEDD̲/%fp ~jjv29 seCsЁBe >DQ8L;L rd )""b -j OCз250ARժpѡ_< *""btwϧC`\dj0y9~qCٮ1 ,4 A`4H52(O2YE?.:\|kM "I/ Sїj)URj6M&DOB?z4*u+A`vHqEDDs_M?.g8 nB&orN2kĿɳ΢"""p b&dJmCg2%SŊ Yb[͇sqL ;L ^&n'b<|8x U{ȠwρjB:u"_LEDD잟@lpɁ;J{.a<0 /""A|Klb>?IlAjxߙkk>0(A$dwѷ{9Rrm#eѣ#""%NBar sao{hCaDDD;*>L8J>dOw.!JlԈb͇/ w5LVR;>~<pvo#>B0>ě:PݴI% )ʈ>,V3?7yWrl!w0#"bN;ug|;LFhlw{GqFDĜvc8b]b#;e^&a^r'("">_З4-yԎ= 4""'E])^'/,jDD)'kO'&BX4?0=o0!7%CBFD%A81a?L|l\**v}6""# 纉ƑC{'\t]R1^і+` MOB^G].p\EQxm 9'MO./qc忶hAGD:*yDB◦'Rvp̜IGDX-pX@(K ]ScbY8s;1l\F|[W97е&P16{81$>h¹,urJJ(ꈈ //Ckvߚ =N}g :.[HxDaL^&sqJ\e STDqGDȪ.l^8Ø,g{ԭZʨ>ү#b3Dau2vr )9wεg , c4_:M,z߾zDDG"ILgI^\s,S1 fG.$A ~$Zu+G]c#"b$іD; ˜D5ćN=r;_(hu1:xm4)CznDD{p&A(~Ƥ:/(P΢EЗ.eUY糈rWkbZUMrhN,hIqxD83eaGk1h^9,h  K{?nj]6mX H?Bb@?ΰ&E!/O%O͐`""CbpD6%jo5x-ժ)sseKDD R":R$kUK9]{! X 1Dž%$A)H|k8plNGDDD.7k ѯq=$`G|*+s+/[F_tDD4O<":UÚ3|ȑwԥG DD4>~Z-p.FD34gmy~WLX/p #|šOV??B,߱E(u51Oz-&*zu\]^tIDD̲B ~/KrE:؄pp9Q=6mcGn/WN,&5uD/CS : ;ϥѮ]U"7B1,(P]KзoWɚ5YXJޖHr8GL\]8nSpN8!7B) "b>Hr8SMȌaN`?G׸;Ӡ ""5C\?؉P9[Yd~r΍H:};p8xPu$B쏮'*gxJjł#?+y=ďÜ'{-Fի+/VN^ ""eq1H]&=Ov Tr֬uHOv⃈u( W=ޤJmߐjUH ""vPQ(>d_@ƍ #F!"\cG8cpaN:?Ôysx0 "b֎p88`GHS*2>]|/)aBDϋS acIwBQNcBD/ Sm({=sE"Т"b }E<Ҟp"P8-|q K('/ 1F)'?%{Cuq /ٽ{|B,h1Qw*aO8^MMwm($£G ͛U 1bsK+1eCANQG#q"b}GhO8kzk @"5좒'[;wh˖,r9lO8kyWb @|8^4R ^@vꤜ;җ.UN~>"boz'KA&,葞AHO!("bvΏ'WBcE6"!khwټY9\ED݉ {<6Ppq~Cz6ٲ%!3Y-s׮p臌苣#PM{am[ADDKy" @nQ nKHݥqc[͐|r X -{]:wC r36 8 C ""Z[bb5b @R_|Ŗ~Ϥ׮\i6daDD YYUW ѯ:M~ lir.0z矯<HDĐ|]iW8L,#i#&m)RKڒ,Z>}X$C%]!q?GqjՔs^&%"A_ΟC%~`KH_IH7/R!=9u* &"sΜ(6 ~(~dKZ+ӣޥ '"b>/+*;+ĿRfI?X_=::k*1 +$6$n_?M-C_BP?dQDp ;PFRNw-νz)g."Ѳ%)"bSeW8[@\hSH>/P/v&6)&,:}W1/.Vsα7o߮ ""zBV8s%~aK1P<淨 "A#j_8׭ ,ٴD|o4:p 0"bl_8 6 )~I:WGuv "~7#` ҫfR{Tnsh[H_./ /`l Lٺվ޿? 3"Om !QN [(~jKg4mj߃F!U 4"F,`;'ҵE~bG]-.}bC} VIN]JKh]!1Ǽm`Y8Zlrwcݶ\ε-}f]EsZ,UN?Hi "b};D?l*G/eј1^X1r/[oY .jSmp`lCtQÆ,+ysb!9č?Tpf+}˖CϢPhg82qMĽ{1iD%׮ ?Ž5| K7MW׬)M,(,]n@ߵK9͛#bd}Flo_0R<%r 픜R\yB K/UNQ ="F· _sX #>j[H?UR>>yr;'#bX۾p %{m!}v&mGVNee8]y$>"FkjY!nBzҒO0Bu)-eGD%?G$jl 3Y:tP֭3h|/b?bm C,DMwC@D+~6 ̤ c:Y|@߲E# +3&6gJ yu,N%%9|!}U"bo;bC[L?s2YtٳGgyG& ZYLHrZ/"b O3;LcX:m ALR\p=(1=O7Ȓ `DMU B5.YXȲ _{,c0nu ZC.?_%'M >ڥ-X%wY"źWGsCӗ:zJUN@ČXng8A}עѣ ;Q|Dlfg8_}m6c73Y@ W>FO@Aaiow,ibQ"}ȪE|& in*D' 7evg,cdmOkw1Mln;avxX l"T[=aCZݐnr-9r1p]e 7Hgj1&^[r.nH7/})ѺWö-JzLtfH6SG?d]śl=ʤWzRw`9]ϹfcKb;q,MBhcH?+}„+UzuB bL|Zlgg8+veI9/aaFb& qeW̙x=_[ /ӶūXҝlJ<:b]jI|#}?ڶ5danV9[T9**Ӻ5A1^v0ߚH8$m[j7dQӦY菞?:b\gDW,7⣶-jzݐB]rVzH_@9[  _&w~2xm $ET9U=pbϴ3.UE?3} "xWVtw B<@Ǐı,)Ml8@|-8jF7mRN:"D|Afo.,#'۶uAѣxr F[6y ~l[#da5jK8B {Vsz1߳m1,߳rve&_7,)guDB (eKz7ٶf+]]ݴI9u}m1 J:݆qU #Ā\iD3(G {_ҏϠWzj!}4!<]c)g& Up?5b !woB7:p'7ergbA|oC9vy /զ q?W Ŏk%߳mQ>B|oY9;vx4aJթC0C_ΟP  ೶-uŻv픳mŋU9b7;Cb32_ضHA}Wn'O&ap~K" Ͷ->5SB59ί )EJ_eۢ1_74i=]u49bm  8(VJ_(&r[wK7*KXi_8\G84''{|…)( al9J q3$a,.IK5BQK~HHOy 0VvqX6[S^2m!RrV:Ѷm v ϱSsbc*@mom?﫣2!B:F1& &.@(+m[`jRI_T9EE={3 7(ʶſ3?;5k:OFH8p~d/B@x@#!=y%?2x0#nq|%#Ŀī|t`!KcgP&sq2,[vK A-u}\6W- Xx:5jԒ%4V@Vξp8>s9n9]vqtdB!Z,C->Bnw OG !b>-/wDg }Vjc[H.TErڵ#$bh>(6/NlBoz B)g_Kvln=&֥Dt5kD/녧@;Yspi zp~XJďm ]ŗr>z4.}ۉ}0}Ŀ2:UjÆJA@Ν{&:{l { LM*gwvٱC9͚(1*ְ+)Kl 0;3,1 ,?RKSBz_SjB9[~=/ZLιgROKBz-B ժrmzH:{XdW8x w(dSH;x T;+g׮ /K(S|M!=f)XuR_4 SrݲmM!]k/6lHCmp7XHr"tנ5j/XB(Fi-gZ"5š~5aw:K9yyQ߱/JM(Ap N?)Wz ]:O>f w O(=p0+|̞Հ^Yc!>o/?"֦%ŠpWCiޜȾBkRjD2aNN/azu,]K׫T:F]D-ߴwxdɲ2N.ŋUc 'odL[q-_}pVr.]<КC)s7`l$p!c 9]bM@ѭ~cK{ kکΝ v#r!Ԡ׋:c ](!UQ#l ]aW8($m /:Æ}DZRB ׊ 0AxM!Ӌ'~5{n#m}@kW829F_xͦPA./믍t7>(ַ+<@Xo߱%.WzymtѢ} I]| eF˦~ա]iJ\߀crZ Fs/]aKP*o9Tk@97 S7"&v+ mu&LJ z͛kc;oڟhKD-msͺFTƦĔ*k+62f,dٖ1AX!nHQAsf*_ߝN[soӜ=ɳi~Ӧ ث>@ή%W^)3WA(Muhtz1ណ&8Gh%7Rkpyyh-gK.A5;v0_=hF]emBqIo+oZ{cGsO۷YDr]W4 H_x,A8gNY۱~wud[0nzrwo37n vc^q'vt].uNUǟfhM'?VЖ6ǎ^K2/^֖.;c?+|stkrLJŮPu=n2;9I~?H_xBO^>f_w]Y2ELs[ @R,2b ;w6#}&A={448'6To/2& ˗wKڵzvqQ&q~wl%UdMUduK#XQ|4Gfie0A_Gc+~+8(6xٜm@*4Iܕñ9>~ۙCUpPq9sfYf_~ߌ`x;rCE@_R=yTxĺb}NMߤψPre3+Iv }N]?!g*:/yms !/d~?vE9DY/ '-[ߤ~4}66?8ث}N_Иs,@/kv5#V]-#M)ћ7H_`!򗗵f_x8oJc&rg ^r 7o{c]]emfWgϘѱ~Cq~4vQ˞2z,#oR/xQmϞf[Qq|:0qΌ=:AF]<}޲dIGؼ}lYS-@Grѹ,1|5e-dbG]/u_{A#}j!@9ꔝ.KΖ􅱇]c GbrbO&^.CU\H}S8:vԖġZ2ޓ>?W ڗ2X>>Aq~G+m+%p&Msc_8Llf8Ql S1#"F8zly[6$ @4}\^9?I8$}rip;*hψ7Fq~K_rI0ZLc'bS[`Ԫ]>2"7Q%.#Rukƣ)#4/};\>dT;)v`q` bSi.ە |eۧW^R`;iJө+Cbs>)/Y' ٱ'iT\TA| oMߏ FMI8إ@.nObK~{%@N>_$h8hrVpÉ\d3:$ΟܽCFo56bYCm߉-jΏ:|V}V&q~p9m`js-?-V.Ύ}2o!u#-]j826@GbsU2ݹEGM*:E;RLb˽=t3b_0Su~Q-ӽ%8vlѢ % ̋=0^; Ο/m/; z8 ]^r޹~;pWsq0* 8-8aEQ[['"!u+H @ǀ!̐WHn[u~_^?>˹@Y2PB_,uQNEX4B 5ǵ֗鿣WjMni<;ѿ(ws v rqwq*‚Z+6LsK^wR=LQ0P1jf)bfZ諒'/70/ Gk3WX)c8b^6Jp;[z0-|*dOi츤й3 htJfkS0Sw+̀Ch\1(3{V3Yg(}oG?`3]4{:9fh݀pZx!a(b^rKOiz06K8@t_c.VC)̪ԥH5aisf;aV:f" ?Δbndh  j g`D\t) XExQ/a LҴ#f௰8`mADov,N􂶘2`(P3j4N:.b' y4P FpEJXV0 |L[iu8{ &ZK4ӽ pu-i(V uYh=V%t3e !=qb{3G: c5[B @ :dP]l|,pȂV)`j;s76GKƫҢy+-Խ%Ԍ%3m{g.Y ^Q9[9QzCQe읯>xbB-= 9&{"S|v8}Kh;r!l"%AwU@}_r4yWf$gSC.с61*aNe$ں0@V'jMS^}ReZlUVxFk_qF?eBlxhL sGKoOÔ[c3maFF~^ޏuaL-×R(G(jAтe/mT"%ndmx/hqf3[KpD}hP5LlRnՅX5PS9' ,etθ̨J\ FZ-(0)Թ=\^d /!.0 2j? r͘PKu3jwUjE#]xXH/bH`h)Cqhz0HIjSgMK3V8ƿTp? V|3_=<[mw>4kWHtH+ti&;r!g'D0ZY ^Q941*읯>xnS_ Wh])jҪ71M54ު*s>=8> o٤m :q*bчt/G5/ݷIQ-4%+&ШyQMjwա+BՓcÆSL>(&\%uԺ ꄴh*m*IhR3'qM:$mnTk_}?|e뷬RS*m n?K"VBo𵺾 n|c漇(6ZTNyQllxr>'E\oJfrjby?+-^VtO0=J_$j>l\JknX9#{B&EPxg)`O1=IC-1nעC9z%W+/1uvvz_U .ܳZ8 |5wkZ 즂 NB?1+/yEJ5)>S\mo3Rnv5&íSmE{r31?=k)ܴZE $R,?5ļLz FLj н}c.zjkRLvuԞH)gjjncz`wL./#w-(HabطM)˂3ăI#1<]Up_2pVaJ wn@ dS!!Q`la&RJ蘦p\oEŠRNTWE[5ayWNo"I5' ơ }ǥv+$I)˯@J'$K5D@PEJ5@P٭0/ ry>V˗i1/љ"^_َY 0_Z3ԯҦ@I}^8M9o F㶆7{e(PM//J^Ǎļއč1oPUלBOHV%o:Bܤ-Anu/1I7?>['77Lwj,3SҋcvdzGf\- Sgݮۂ5T_slem{j[* X>Ƒ /ݤ7u YO9Cvvuͦ Ӌ]'^Pf-Z#==ջ E`ퟲDJ=}Q]k޺@7 ^.}+܍n{& e8 3g0ǷܘéXS%"+E@[L5&n 2OlV "'OWra{Km:nzn+Bhku6nL5"C#܌5uS+]uznK#\f9XcuM~ŷDugjyInZPqr7jF_NԎz[^n`ieZp:qa_唯jлsZ .XeX7c_Q]NV1F"5 2Wfh[Ize,AYgI5cwGS\?Z[&YV.>Aj2CF >nt$9' AtU?*Rsuӑt,[c>f>L<(;[3NAI]'vƪ_V~K~;BsymW3ۉPoJ| ? 5ܖͩ3j~EZG]V'[ۮiRib_X9!jUS5[Aw[yeJ=5=)w~u͓WW}b{jծsh6 t#.PNEVͶ|s)1O8yxc*k9mhvpIBt͈\knkêq ,㵝ev%9t~˜.l?xe60w[qO%UepM:K"0ev|dr7|ce"3+B&A&͌-e;ce}K,6|8v~*s9WGcmXQ<Ϣ|[`,כ،܍3 U<|%OA6-X"ěםBg-*B,OAK|u7`LzꮫH13[~)F U^GH ڰn{ f#Hy M̃I#Mcg cqV̳ #543tl#ߥςz,f=šj|f39R.Ehl'wf+ }y DepD8ZyxXX9L/XYc3ۈx 'pE|!o}xdwa4Erf6g oxv8A,Zcj,|Wz$.'Qc@  bƒvw WêqOT5* Ŭk6l[k8P h{^\58؟8Ӎ9GͶ~[@Vm3^35E{E0Ufo =h6#"y`..Xl1&} wݴ#qnz9"4RF|fVvo 9rZ6cM`vٞmi~m V{$na g"\ o*>XN۷۱5ڐah:P,;~5m.XԱop !P*$X̵ ʢ[`> !ϥÙIL̵j_}7[ Ҽ҇^8ܴ=d c};"4)8A_C[f?nZc9/̵~&!+ iZgjj+"CL]܎35c0u«(N *Gvp;4ga~kêépJpʹkJY2ҝ#1=t)O RL_cr=TZO%tC/)HlN&5-fzgD])_"kx c>͓L62gЛ \ϗ [G?'M>JDC3ێ=~=|%OixmK̼ѴG˼wS}mjb`ͯ-,vKx ֮ e+y֣ū2LOE{2y, 3V^`OL[5gJ)yS{5i_ɞ#i8fW;cf^{SV?>$ (7:XƥU1[MX~saZ}oNG]:`KB ls3W)\RU8_ڪ.y絲-fRy 51[w鳸^My =3kP0P/;۰'O)`GLΕnִ8#xMs0}E)1ϗ/濆!snq^pP:a *( o}϶4w#Gܘ#K9 vE K)J>{n:%3'l9d"O[vjԾDh3YݔZ75ܧMEcXLhљ7vokPC7EÍ%D]^~$hnrj%Q:xD{ޅ6(k T>sRj"sp3۵vM#)h3vD#>Ul]A8xƮ$ XFg"٭6>3fRAw5 d'Xܿp՟omgz0)F;xQZ8i30rGhF&2-x}WElWem^ lp&:f¨63Tgv*hѥV?oyIkA˞V-|7mr&g#d i9ܵ2n4 8r7#d"-R;Nn|zV?]\-}6|vNi$rf3^<2V?39*W(3Lf">/N[2؂ABS5Fv pFxe|}ݕ8a̧幛ZҢy1pӦvЕ*%FF>}77L|Ѫg$]s`W.`d8j#1H9gK3ͨkGWaWm&ܑz!O&6z2@E7̯*OWya^G.ڲ̄|_Wl~C>{ޯҦ[bN𼽯庥7-,mi'BA}Gy›O)^Gu NEdI@ '1k 3iDKK5Eu\tXKrY=?眗RvUg[ǫN9a% y@V<M6YZ@_4s#-o(J%?yN+lI'ȵ6+>ǘͩmLt95l߃K/vNZhFW-H_sjcZ>Ѧrךex aqBPPg=jLjitsjiq'nF{t'ш=DVj&w,?R̬kNQpi"\ѨmT g81!e3rN>:1oF~,~,Na@_Ӎs O,9Eiu M9Ncmr|u s2- k53sei=]rj {7 2tE( j|&?Z;6vN {V.;Зm`7-sӒ7@t?ư2QڳE?ΐcH=϶j;%9zh~ea+%,.{1tg44)E& v͡]m"JswZ-X0Z?NPad"PFxv︧$w, ngÍ RmI3ǽX: %36Y X,{OBI}Su.gt7>qF+(1t`DXBO}Ś"΄T; -̴ġmq~;!VsCxEޖF3zu}秓"=cp_d}p)fȒ1~D/ٮmO4:Tۗ|ZE| .YjT{kPe"D쉷mEθYxZB7b&԰poF֊m,mky|w#d/!+La:t,@[eRuk5vc5Kg[m31I+⮥u Qb'-9VXWERkT~ PI@[FK㙆3l ?wV)ݯKJ%g F-axhk(J͖vGN{X5 dC"ś {%ml@_Q#uɰ̔zO͂ϚO9p%{g(UZRnnh]^پzc@uMnp]ka"fҪkWl7#F~~l+=ci,[ 6plXiS&re@ERKL5Ҷ6T㑂"<>f=[5v)x3[RRs|ףytPkn$}@J~wݰqM8ǡk>hITd.O,G.wP7 ,{͜iGsg ӾFꭇƧFX:ߌRKs6rdۺyJXup6'#;R[TΈ.SZSYe? +\4ѬۭNxn~MX4bm WE@Gĉ⁠fJor)D,$jhC5LWMXTTONYx.|6N`qA*sR9mn7hlih7 Cx6fcA*@bh 8o€b/" .*P&zs\a#dWQ[gDuX^Xf~m\2- %w݃E LM𰪁e2p‚~E0A[xybB,};X= qjM,d&{v4_jۦ+ 5dL] ,7@?E2Y lz+ݣMT,vȏ(wa5C}eaK3! }w\7gk, UJ \{)Aw)R$ _gP6L)ݯ*TC[$av% hG0 ReTj hBC/ bJ@ (y!{Q`,OxR0,v-(Z%&ƒL}~#-. P\1/$G oʢ18*j;FHOVĬ"<-$(Ta 9{%:AP|0KmvNE|vRSN%Kچ l[jW(h`'YU:Έ4Q{+T,R%]8ph<1M7҃nS\xe2q\xe2(\xf1x\xf7\xbf\xd6\xf6u\xff\xe7\xda\xa3\ \xdc\xff\x9dz\xee\xff-\x00\x80\xaaRM\xac\xef\xd6\x96\ \xee\xfb\xd5\x9b~\xfb\xd5\xa1\xd1\xe2\x08\xf7\xbf\xee\xed\xfe\ \xcf\xdb\xbb\xff;\x8d\xf7\xabk\xf9\xfc9\x01\x00\xc0\x06\ j\x8a\xdd\xc4\x93\xc4\x05\xe2*\xb1B\xfc\x81x\x8f\xf8\ \x94\xf8\x8e\xf8\x81\xa8\xb2\xec?\xc5\xdf\x8bo\x8a\x0f\x8a\ 7\x89;\xc5\xe5\xe2,q\x8c\xbb\x90\xd6\xe3c\x02\xc8\ )\x1a\x89\xbd\xc4\xb1\xe2\x1cq\x85[\x97n\x13\x1f\x16\ \xdf\x12\xff(~\x1c@]\xfa\x8b[\x93~#\xfeB\ \xfc\xbe[\x97V\x8a\xe7\xbau\xa9\x93X\x83\x8f\x09\x00\ \x00\xaaB\xb3Dz\xf7h\xb6\xb8^\xbc\xd9]|\xfe\ \x14\xc0\xe2\x16\x94\x1f\x8a/\x88w\x8a\xbb\xc4\x0b\xc4\x13\ \xc4\xe6|\xbc\x00\x91C\xefT\xb7\x16\xc7\x89\x17\x8aW\ \x88?\x17_\x16?\x8aP]J\x89\x8f\xbb\x1b\x1ak\ \xc5\x99\xe2\xb1\x89\xf4/\x8c\x00\x00\x00\xfb\xa8\x9eH\xef\ 8\xebEB\xef\xf8<\x90H\xef\x06\xa9\x98\xfb\x81\xbb\ H^\x93H\xff\x0a\xa0\x7f\xc6\xae\xc3p\x00\xb0\x82\x86\ \x89\xf4\xd1\xb7E\xe2\xf5\x89\xf4\xafr\xff\xc8\x81\xba\xa4\ w\xf8\x7f%^.N\x15\xbb\x8aE\x0c\x07\x00\x80x\ \x93\x97H\xff\xcc\xaaw\xc5\xbf#\xbe$~\x96\x03\x8b\ \x9eW\xbf\x14_\x17otC\xbb>\x0b_\xca\xb0\x01\ \x08\x94Z\xe2 q\xb1x\x8b\xf8.\xb5\xe8+\xfeK\ |\xde\xddL\x98&\xb6e\xc8\x00\x00D\x1b}\x09J\ \x9f}\xdc(>\x9a#;PA\xf8\xb6x\xb5x\xa6\ x\x04\xc3\x0a\xa0J\xb4H\xa4\xcf\x88\x7f\xcf\x9d[\xd4\ \x18\xff\xfe\xdd\xad\xe9\x1b\xdd\x1a\xcf\xaf\x7f\x00\x00\x16\xa3\ ;\x13\xe8\xb3\x8c\x9b\xc5\xa7\x13\xec\x8e\x07\xe1\xe7\xe2\xb3\ \x89\xf4O\xd0\xfaXLu\x86\x1d\xc0A)sC\xa4\ \xbe\xb0\xa9\x7f\xb5\xfb\x92:\x92u?\x11\x1fK\xa4\xcf\ \xb4\xeb_\xfe\x0a\x18v\x00\x00\xe1\xa2\xcf\x8f/I\xa4\ \xcf-\x06\xd1\x9d\x00\x0f\x1d\xd8\x9fqw\xb2t`\xa7\ \x15$\xb0Q\x90\x9e\x0b\x1b\xdd\xb9\xf1\x05u\xc2\xb8\x1f\ \xb9k\xc2y\x09.\xc5\x03\x00\x18A\x9f#\xd7\xad\xc4\ 6\x89/\xb2\x10Y\xe7\x1eq\x878 A\x7fd\xc8\ \x1d\x0a\xddP~U\x22\xdd\x06\x95Z`\x8f_\xb8_\ \x94V\x8b]\x18\xaa\x00\x00\xd9\xe5\x98D\xfa\xe8\x0a\x17\ \xa8\xa2\xa3#V\x8aC\x13\xfc\xe4\x0c\xf1C\xef\x94\xeb\ \x07\xc6\xae\x15\xff\x97\xf9\x1e\x19_u\xc3z'\x860\ \x00@f\xe8\x17\xee\xf4\xcf\xc4\x5c\xa4\x8aG\xfb4\x1d\ \xd6\xf5\xf9\xd0<\x866D\x14\xfd\xab\xd0\xb0D\xba\xf5\ \xe1\xdf\x98\xd7\x91W\xf7\x90\xd7\x8f)udh\x03\x00\ \x1c\x9c\x96\x89\xf4E\x9f7Y\ \x7f\xde\xa9\ \xef\xce\x943\x1d\x01\xc0$\xba\xe8\x5c\xe1\xee\x16P\x8c\ \xd1\x06?I\xa4/\xfe5dz\xe6,\xfaK\xda\xf5\ \xee\x976\xe6\x04\xda\xe0?\xc4\x8d\x89t\xc7 \x00\x80\ \xc0\xa8\x96H\xb7%\xe3\x11\x0f\xb4\xf9\xd2\xd6j\xb1\x8c\ \xe9\x9a3\xd4w\xbf\x9c}\xc2\xf8GK\xfd\xbd8[\ ,`\xba\x02@\xb6\x19\x9fH\xf7\xa6\xa6\xd8b\x14\xdc\ +NI\xa4\x1f\xc7\x82x\xa2\x1f\x18:G\xfc3\xe3\ \x1d#\xe2\xef\xc4c\x99\xba\x00\x90\x0dtk\xb2_S\ X1\xa2>&\x1e\xc34\x8e\x1dC\xc5\x17\x18\xdf\x18\ Q\xf5\xcb\xa4m\x99\xc6\x00\x90\x09\xfa\x9c\xb9\xeeeN\ g\x16\x8cC\xc7\x17}\x99\xb91\xd3:\xf2\xe8~\xd3\ \xb71\xa61\x06\xea;\x5c[\x13\xb82\xb8U\x03\xb1\xbd8@\x9c \xce\x16\x97\ \x89\xdb\xc5k\xdd\x9ar\xb7\xf8\xa8[k\x0eV\x8b\x9e\ \xd9\xafn\xdd\xbb_=\xbbI\xbcB\x5c+.\x14\xcf\ \x14O\x10\xfb\x88\xad\xc5b>\x0b\xaf:\xe2D\xa68\ \x00\x1c\x0c\xa9\xe9\x89\x87(\x98_\xb5\x898D\x9c!\ \xaep\xc3\xf2/\xc4\x17D\xc7\x12\xdf\x16\xef\x17\xaf\x17\ W\xba_\x14\x06\x89\x87\xf1\xf9\x1d\xc8\x07\x12\xfc\xbc\x1c\ %\xba\x8b\xcf1n\xffk\xbe\xd8L:~\x8b\xa1\x9e3\xe3(\x1f\x811^\xfcs\ \x9c~\xc1\xeb\xeb^p|\x95\xba\x10\xba\xbf\x16\xcf\x13\ [\xc4\xaf.\xbd\x9fH\xbf\xa4\x0b\x00\x11\xa6\x9axe\ \x5c\x0aSC\xf7<\xf4\x83,>\xd6\xfa\x98\xb8(^\ gC\xbf\x14+\x13\x5c\xd4\xca&\xa5q\xaaK-\xdd\ 3\xe5O3\xff\xad\xf5\x1e\xb7_|\xedx\xbd\x8e\xbc\ :A;F\x80H\xa2\x7f\x9e\x7f\x22\x0e\xbbR\x83\xdc\ \xc7\x81v\xb3\xd0D\xeal\xa8\xbe\xc8u\x5c|\xda7\ \xea\xc7\x8d\xca)+U\xa6\x83\xf8j\xd4\xc7\x83n\x87\ 8\xd6\xed\xe3\xcd]\x97h]|\xd7\xefA\xf4\x8aO\ P\xff\x99X\x97\xb2\x02\x10\x1d\x86\x88\x7f\x88r\xe1)\ w{\x01?\xc1\xa2\x12y\xf5\xce\xe2\x05\xf1\xd8U\xdf\ +\xf6\xa3\xbcd\x8c>\xd2\xf2a\xd4w\xcb\x97\xd3\xa6\ 5\x16>\xe8\xb6\xdd\xad\x1b\xfd\xba\xf4\x96\xd8\x8d\xf2\x02\ `7\xfa\xe7\xae\x8d\x89\xf4\xcf\xf2\x91,6\xc7\xb8;\ \xaf{\xa3\xfc\xd8Fa\xa1J\xd5\xae\xadRM\x9b*\ \xa7m[\xe5t\xeb\xa6\x92\xfd\xfa)g\xc4\x08\xe5\x8c\ \x1b\x97v\xd2$\xe5L\x9e\xac\x9c)S\x943k\xd6\ \xd7L\x9dqF\xfa\x7f\xae=\xe9$\xe5\x8c\x1c\xa9\x9c\ \xc1\x83\x95\xd3\xab\x97r\xbavM\xff\xdfm\xdcX9\ \xc5\xc5\x91\xf9\xbb\xecu?\xdb\x81\xd1^\x0c?O\xa4\ {\x13\xf3\xd3\xb2w\xf4\xf1\xa0\xab\xa3\xfa\x99\xe7\xb9\x17\ >\x7fJ\xa8\x8d\xa5\xbb\xdd]\xf5\x88_,\xd5\x9d\xd9\ \xce\xa3\xd4\x00\xd8IM\xf1\xd6\xa8\x16\x18}\x8c\xe5\xe6\ \x08\x05p\xa7\xbc\x5c9G\x1e\xa9\x9cA\x83\x943~\ \xbcrf\xcfV\xce\xd2\xa5\xca\xd9\xb2E9W\x5ca\ \xd4\xe4\xd6\xad\xcaY\xbe\x5c9\xf3\xe7+g\xeaT\xe5\ \x8c\x1a\xa5\x9c\x1e=\x94\xd3\xac\x99rJJ\xac\xfc\x1b\ \xea\xb0s\xbc{\x84)\xa2c\xf6\x87b\x0d\xca\xce!\ \xd1\x1d'\xee\x8e\xe2g\xac\x8f\xb1\x9c,\xfe\x92\x10\x9b\ \x13\xea\x0d\x84\xeb\xdcM\xa2\x08\x07\xf5+\x12\xe9\xbbg\ \x00`\x09m\xc4W\xa2VLt{>\xfd\x9c\xf3}\ 6\x17\xee:u\x94\xd3\xa9\xd3\xbe\xdd\xef\xd4\xcc\x99\xfb\ \x82p\xaa\xa2\xc2x\x08\xaf\x92\x1b7*\xe7\xfc\xf3\xd3\ \xbb\xf6\xfd\xfb+\xa7E\x0b\x95\xaaV\xcd\x8a\xbf\xef\xc3\ n\x08\x8a\xe89\xf5g\x13\xb4b<\x18\xfa\xbc\xf9\x9b\ Q\xfb\x5c\xab\xb9\xafVr\xe93w\xd5\xbd\xd5GE\ \xf7\xbd\x87\xc7\xc5\xc6\x94\x1f\x80\xf0\xd1\xaf\x82\xfe)J\ \x05D\xef\x9a\x8e\x17\x1f\xb5\xad0\x97\x95)\xa7sg\ \xe5\x8c\x19\xa3\x9c\x05\x0b\x94\xb3ys\xb4\x82\xb8\x1f+\ +\x95\xb3b\xc5\xbe\x1d\xf7}\xc7o\xf4q\x99\xbc\xbc\ P\xbb\xbfL\x8afOu\xf9\xc7O\xf4\xa2\x0c}\x8d\ \x91\xe2_\xa3\xf4Y\x16\xbb\x9d>xL\x08\xff\xed/\ \xdd\xe3M\x11\x0c\xe9\xef\x89\x9d)C\x00\xe1qZ\x22\ \xfd\xf2ad\xcer\x9e\xe0\xf6\xa7\xb5\xa1\xf8\xa6\x9a4\ Q\xa9\x81\x03URBjj\xe5\xca\xf8\x86q\xaf\xea\ /$g\x9f\xad\x9ca\xc3\x94s\xc4\x11\xa1\x04v\xdd\ \xd7\xfe\xa4\xe8\x1d}\xd1s\xf0t\xca\xd1\x7f\xd0ga\ ?\x8f\xd2Q\x96\xa9\xe2\xf3\x04R\xfc\x06\x7f\xe6\x1e\xc3\ \x8cXH\xff\x9b8\x9cr\x04`\x1e\xfd\x1cyd.\ \x83\xeav{\xf7\x86]h\xf5\xb1\x8e\xae]UJ_\ \xbc\x5c\xbb\x96@\xee%\xb0\x7f\xeb[\xca\x91/1N\ \xc3\x86F?+}\xeciX\xf4\xfa\xa5_\x9a\xe35\ I_\x9c\xad\x88\xd2\x86\xc18\xf7\xd7\x1bB(z\xf1\ v\xb1w\xb4\xea\xd2\xa7\xe2l\xe2\x12\x80\x19tG\x84\ \xeb\xa3R \x8et{\x05\x87VT\x1b4H\xef\x08\ \xcf\x9f\xafR;w\x12\xba\xab\xa2\xbe\x88:f\x8cJ\ \xea\xcb\xa7\x86v\xd7\x7f\x12\xbd\x17J\xf5\xa3F\x059\ X\x97\x8a\xc5\x9b\xa3\xf29\x0d\xe0\xf2'V\xc1\xeb\xa2\ \xf7B\xa9\xee\xee\x96G|\x02\x08\x8e:\xe2\xfdQ(\ \x08\xfa\xd5\xcf\xcb\xdd\x07kB\xb9\xd8y\xec\xb1\xca\xb9\ \xf0BBuP^v\x99rN9E9-[\x06\ \x1e\xd6\xf5C0\x15\xd1\xea\xa3~\xbbX\x92cu\xe9\ \x81(|6\xba\x8f\xf9w\x09\x98\x98\xa5\xf6\x8c\x97\x8a\ \xb5\xa2S\x97n\xcd\xb1\xba\x04`\x8c\xfa\x89t\xd7\x08\ \xeb; \x9c#\xben\xba\xf5\xa1\xbe\xe0\xa9[\x1e.\ \x5c\x98\xbe\x00I\x886fj\xf5j\xe5\x8c\x1e\xad\x9c\ F\x8d\x02\xfd\x8c\xdf\x16\x17\x89%\xd1X\x0c\x1fM\xa4\ [\x0c\xc6\x1d\xdd\xc5\xe6\x05\xdb?\x0f\x1d\xa2V\xf1\x1a\ 1\x06\xe0\x8b\xe2\x99\xd1\xe9D\xa5\xebRm\xe2\x14@\ \xf6h\x22\xbeh\xfb\xe4\x1f->i\xb28\xe6\xe7\xa7\ [ \xce\x99\xa3\x9c]\xbb\x08\xcb6\x84\xf5\x0b/\xdc\ w\xf16\xc8\xfe\xebOG\xa7\xb3\xc2+\xee\xdc\x8d+\ \xed\xc5\xf7m\xff\x1c\xc6\xf3\xf2'\x1a\xf0~\xf7\xe8T\ \x04\xea\xd23b\x03b\x15@\xd5i+\xee\xb6\xfdg\ \xe3\x1f\x9b\xec\xbe\xa2_\xe8<\xe5\x14\x95\xd2\xfd\xbd\x09\ \xc5v\xaa\xcf\xfb\xebWQ\xbbtI\x7f\x91\x0a`\x1c\ \xdc&\xb6\x8aF\xbb\xb3\xd61\xacK=\xc5\xbf\xd8\xfc\ \xb7o\xcf\xeb\x9f\x18\x82\xfa\xb5\xe4\xc6\xf6\xd7\xa5\xd7\xc4\ #\x88W\x00U\xdb\xa1\xdac\xeb$\xd7]\x10\xce\x10\ _3Q\xf8\xf49\xe7\xce\x9dU\xea\x9cs8\xc2\x12\ \xb5]\xf5K/U\xa9\xc1\x83\xd3]t\xb2<.\xde\ \x10g\xd9\xdf\x96\xf1\x1d\xb1e\x8c\xea\xd2Q\xe2\x1fm\ \xfd{\xeb\xb6\x89\xe7\x89\xef\x10\x161$\x7f'\x8e\xb5\ ?\xa4\xbfAH\x07\xc8\x8cn\xe2\x1fl\x9d\xdc-\xdc\ \x1dL#\xad\x11\x87\x0eU\xce\x9a5\x84\xdd\x88\x9b\xdc\ \xba5\xfd\xcbG\xbdzY\x1f'\xfa\x17\x9c\xe6v/\ \x86\xfa\x8bv;v\xce\x83\xef\x1aEw\x16\xb4\xc5\xef\ \x88\xe5\xfc\xc2\x07\x10+\xfa\xd8\xba\x08\xea\x9d\xca\xb3\xdc\ \x0b{\x81\x16\xb7\x1a5Tj\xe4H\x95\xda\xb0\x81p\ \x1b\xb7\x1d\xf5\x9d;U\xea\x8c3T2\xcb\x97J\xdf\ \x12g\xd8\xfd<\xb7~u4\xca\xaf\xfb\x0d\x10?\xb0\ u\xd7\xfc\x02.\x81\xa2\x85\xea_\x98O\xb5;\xa4'\ \xc5\x0e\xc4.\x80C\xd3[\xfc\xd0\xc6\x89\xdc\xd8DO\ \xf3\x9a5\x953a\x82r\xb6m#\xcc\xc6\xdd\x8a\x0a\ \x95\x9c>]9M\x9adu\x0c\xfd\xc8\xee\xdd\xf4?\ \x89]\x22X\x97\x06\x89\x1f\xb1k\x8e\x98\x99\xd7\x88u\ \xec\xadK\xef\xc7\xec\x18\x1e@ \xc7Z\xac\xdc9\xd7\ \x1dZ^\x09\xb2\x80\xd5\xae\xad\x1c\xfd\xc2'\x8f\x09\xe5\ \xa6\xfa!)\xddS=K\xe3\xe9M\xbbw\xad~\x9f\ H\xdf/a\xd3\xa0\x8aw`\xcef\xd7\x1c#\xe4\xb3\ b\x7f\xbb\xef\xca\x1cN\x0c\x03\xf8:G\x8b\x7f\xb5m\ \xd2\xd6\x16\xaf\x0e\xb2h\xe9v|'\x9e\x98>\x9fL\ P\xcdm++UJw~i\xd80\xabg@\xeb\ \xda\xb9\x18\xea\xfb%GF\xe4X\xcb?l\xfc5\xef\ G\x04>\x8c\xa0\xfa\xe1\xb5\xcd\xf6\xbe\xe7\xa0;\xc65\ '\x8e\x01\xfc\x97\x16\x09\x0b\xfb\x09\xeb'\xd6\x1f\x0b\xaa\ P\x15\x15)g\xe4H\xe5l\xd9B0\xc5\xaf\xaa{\ \xdaO\x9a\x94>\xee\x94\x85\xb1\xa6{\xf3w\xb7\xf7\x82\ V3\x8b\xebRg\xf7H\x8eU\x7f\xb7\xc1\xe2o\x09\ z\x18q\xef\x16[\xdbY\x97\xf4\xc3c\xf5\x89e\x00\ \x89DS\xf1-\xdb&\xe9\xb7\x82\xfa\xe9X\xb7K\xec\ \xd1C9k\xd7\x12D\xf1\xd0]_\x8e?>\xfde\ .\x0b\xcfr\xcf\xb0\xb7\x1f\xb1\x8d\x8f\x86\xb4J\xa4/\ \xb5ZuA}\xb1\xbb\x03I\xc0\xc38\xa8\x9b-L\ \xb0\xb3.=\x9d\xe0\xc5Q\xc8q\xf4\xc2\xfc\xb2M\x13\ \xb3\x86xeP\x05\xa9M\x1b\xe5,]J\xf8D\x7f\ ]_\xd6\xafWN\xef\xde\xe9/wU\x1c\x83;\xc5\ b\xfb\x16\xc3\xdf\x88\xa5\x16\xd5\xa5\x86\x89t\x8fdk\ \xfeF\xb5\xc4\xef\x11\xe80\xa6^\xe6v\x22\xb2\xac.\ =jY]\x020F\x89\xf8\x84M\x13\xb2\xa5\xfb\x5c\ q\x10\x17@\x93S\xa7\xf2\xc0\x10V\xcdy\xf3\xb2r\ >\xfd^\xf1p\xfb\x16\xc3_\x88E\x16\xd4\xa52\xf1\ )\x9b\xfe6\x1d\xc4\xc7\x09q\x18s\xef\xb0\xb3g\xfa\ \x9db\x01q\x0dr\x89|\xf1v\x9b&\xe2\x88 ^\ \x04\xd5;\x9e\x83\x06)\x87\x0b\xa0\x98\xc5\x1e\xea\xce\xe8\ \xd1*YXX\xa5\xb1\xf9\x92x\xac}\x8b\xe1\x0db\ ^\x88uI\x7fA\xb8\xc7\xa6\xbf\xc9x\xb7#\x0f\x01\ \x0esA}\xb7\xa2\x8f}u\xa9\x92\xc8\x06\xb9\xc4v\ \x9b&\xe0\x1cqo\xb6\x8bM\xf3\xe6\xcaY\xb6\x8cP\ \x89\xc1\xb8f\x8dJv\xe8P\xa51\xfa\xbe8\xcb\xbe\ \xc5pc\x88u\xe9\x06[\xfe\x0e\xba\x85\xe2E\x9c7\ \xc7\x1c\xf4=\xf1d\xfb\xea\xd2\x22b\x1b\xe4\x02\x17\xda\ 2\xe9\xf4\x99\xb7\xed\xd9.0\xc5\xc5\xe9\xe7\xdc+*\ \x08\x91\x18\xbc\xba-cYY\x95\xc6\xecv\xfb\xce\x7f\ \x9e\x13B]Ze\xcb\xbf\x7fM\xf1\xfb\x045\xccq\ \xd7\xb8\x17\xa3-\x99\x97_\x8aS\x89o\x10g\xc6\x89\ \x9f\xdb0\xe1\xca\xc4\x1b\xb3\x5cP\xf4C3\xa9K/\ %4\xa2Y/\xbb\xac\xca\xbb\xe9?\x10K\xedY\x0c\ \xff%\x0e1X\x97&\x88_\xd8\xf0\xef^_\xbc\x8b\ p\x86\xb8\xcf]vm\x1e\xfcS\xecG\x8c\x838\xd2\ _\xfc\xd8\x86\x89v\x84\xf8`6\x0b\x89>\x0f|\xca\ )\x5c\x02\xc5p\x9d6-\xfd\x0bN\x86\xe3\xf8\x01\xb1\ \xa9=\x8b\xe1\x07\x89t\x1f\xf2\xa0\xe9kK]\xd2=\ \xa1\x7fC(C\xfc\x8a?\x13\x1b\xdaS\x97\xfe&v\ !\xceA\x9c\xd0\xcf\xe7\xa6l\x98`\x9d\xc4\xe7\xb2Y\ @\x1a5R\xceE\x17\x11\x0e\xd1\x9a\xb3\xe9N\xabV\ \x19\x8f\xe7'\xdcnF\x96,\x86\xaf\x8au\x02\xacK\ \xfa\x0d\x86\xbd6\xfc\xbbv\x14\x9f'\x8c!\x1e\xd0G\ \xc4\x16\xf6\xd4\xa5\xd7\x03\xaeK\x00\xc6(NX\xd2N\ \xf1\x98lwj\xe9\xde]9\x97_N(\xc4\xc0^\ \x14Mm\xd8\xa0\x9c\xe5\xcbUr\xe1B\xe5\xcc\x99\xa3\ \x9c3\xceP\xa9\xf1\xe3\x953n\xdc\xben.\xa9\x11\ #\x943|\xb8r\x06\x0c\xf8\xaf\x03\x07\xaaT\xf5\xea\ \x19\x8f\xeb\x17\xedzy\xf4\xdeD0m\xcet\x9b\xd7\ gl\xf8w\xec\x1bD\x07)\xc4\x98\xa9\xbf\xc0\xb6\xb3\ \xa7.\xdd\x95Hw\xa3\x03\x884\xdf\xb6aB\xf5\xcf\ f\xbb2\xfd\xb2\xe3\x94)\x04H\xac\x9a[\xb6\xec{\ \xb8*5{\xb6rt\xe8\x96`\xed\x1cy\xa4J6\ jT\xa5\x80\x9d\x0d\xdf\xb0\xab\xdd\xd9\xfa\x00\xea\x92\x15\ \x1d[F\x89\xef\x12\xbe\x10=\xb7\x87\xedlO]Z\ A\xbc\x83(s\xb6\x0d\x13\xe9\x04\xf7\xa9\xf3\xac\x14\x89\ \x06\x0d\x94s\xf1\xc5\x84K\xf4\xd7\xbb\x5c\xbf \xab\x1f\ \xab\x1a6L9\xed\xdbW\xb9\xf3\x8a\xa9vg#\xed\ Y\x0c'e\xb1.\x9do\xc3\xbf\xd3\xa9n\xabK\x82\ \x17\xa2w\xdf\x12\x07\xd8\xd3\xd9\xe5db\x1eD\x11\x99\ C\x89O\xc3\x9eD\xa7ds\x11\xec\xd4\x89#-x\ \xf00\xae\xdbk\xea0~\xea\xa9\xca\xe9\xd5K9M\ \x9a\xa8d~~d\x17\xc3\xdd\xee\x17\x5c\x0b\x16\xc3\xbf\ \x8b\x9d\xb2P\x97\x06\x89\x9f\x85\xfd\xef3\x83\x1e\xe7\x88\ \x19\xfb\xb68\xc4\x8e\xba\xf4\xa1\xd8\x91\xb8\x07Q\xa2\xbe\ \xf8^\xd8\x93G\xbf\xc2\xb7'[/\x82\x8e\x1eM\x97\ \x16\xfc\xba\xfa\x0b\xdb\xd9g+g\xe4H\xe5\xb4m[\ \xa5.*6\x87\xf4\xe3\xedX\x0c_\x14K\xabP\x97\ \x1a\x89\xef\x87\xfd\xef1%\x88\x87\xd1\x10s\xccw\xec\ y\x0d\xf9y\xb1\x06\xb1\x0f\xa2\x80\xbe\xd0uo\xd8\x93\ fL\xb6v\xcek\xd4P\xce\xbcy\x04QL\xab\xbf\ \xa4\xe9\x1d\xf2\xb1c\x95\xd3\xba\xb5r\x22\xbc;\xee7\ \xa4\x8f\xb2c1\xfca\x86uI_\xe8\xba/\xec\x7f\ \xfe\xa9\xec\x9c#f\xb5.\x1dgG]\xfa\x1e\xd1\x0f\ \xa2\xc0\xea\xb0'\xcb\xf0l\x9d9\xaf_\x9f\x87\x87P\ 9\xdb\xb6)\xe7[\xdfRN\xdf\xbe*U\xbbvN\ /\x86\x96\xecX\xcd\xcc\xa0.-\x0f\xfb\x9f{\x12;\ \xe7\x88\x81\xec\xa4\xf7\xb7\xa3.\xcd&\xfe\x81\xcd\xf4\x0b\ \xfb|\xe7`\xf7r[\x95'~\x9b6\xca\xd9\xbc\x99\ p\x9a\xa3&\xb7nM?\xfc\xa3_\xe8\xcc\x91]r\ \xaf\x8b\xa1\x05\x17\xb4\xfe!\xb6\xf7Q\x97\x06\x86]\x97\ \xc6r!\x141\xd0\xaeS\xdd\xed\xa8K\xed\x88\x81`\ #\xb5\xc4\xb7\xc3\x9c }\xdc\xcb#U\x9e\xf0={\ \xa6;o\x10Ts\xcb\xed\xdb\xd3\xa1\xbcK\x97t+\ M\x16\xbeo\xec\xa2\xd0+\xfc\xc5\xf0\xb9D\xfa\x8d\x05\ /\xf7a\xf6\x84\xf9\xcf:\x22\x9b]\xa4\x10\xf1\x80\xbe\ *\x1e\x19~]zZ,\x22\x0e\x82m|7\xcc\x89\ \xd1\xc3\xfd\x16]\xe5\x89>t(\x97As\xad\xf3\xca\ \x8a\x15\xfb\xda\x1f&#\xd0\xfa\xd0\xa6\xc5\xb0C\xf8\x8b\ \xe1\xb6C\xd4\xa4<\xf1\xce0\xff\x19{\xb9\xbf:0\ f\x10\x83\xf7\x05\xb1u\xf8ui\x1dq\x10l\xe2\x94\ 0'D[70T\xb9S\xcb\x84\x09\x04\xd6\x5c\x09\ \xe5;v(\xe7\xcc3UJ\x1feba\xcb\xc8\xe7\ \xc4\xc3\xc2\xefC<\xea uiv\x98u\xa9}6\ \xea\x12\x22\xfa\xf2\x19\xb1<\xdc\xba\xf4\xb9{\xac\x0e \ tZ\x88\x7f\x0bk24I\xa4\x9f\x00\xaej8O\ \x9dv\x1a\xc15\x17\x82\xb9\xbe\xf4;h\x90rJJ\ X\xcc\xb2\xe0\xe3b\xa3p\x17\xc3?\x8a\xe5\x07\xa8K\ m\xc4\x8f\xc2\xfa\xe7j)\xbe\xc8\xf8@\x0c\xc5\x07\xc5\ Z\xe1\xd6\xa5\xbd\xee\xf1:\x80\xd0\xd0\xad\xcb\xee\x0fk\ \x12T\x17\xef\xaa\xead.(P\xce\xcc\x99\x84\xd78\ \xab\x1f\x0f\x9a5+\xdd\x16\x91\xc5+\xeb\xea9Xl\ W\xebE}\xb4%\xb4\x96\x8ae\xe2\xfd\x8c\x0b\xc4P\ \xbdA,\x08\xb7.\xddHD\x840Y\x10\xd6\xe0\x97\ o\x06\xea\xea\xaaNb}\x11p\xee\x5c\x02l\x9c/\ }\x9er\x8aJ6h\xc0\x82\x15\xb0W\x8ay\xe1.\ \x86\xa7\xecW\x97\xe6\x86\xf5\xcf\xa1\x03\xc1\xf7\x18\x0f\x88\ V\xb8.\xfc\xf3\xe8'\x12\x13!\x0c\x9a%\xd2\xcfo\ \x872\xf0/\xa9\xe2\xc4M\x16\x16*\xe7\xac\xb3\x08\xb1\ q\x0d\xe6'\x9d\xa4\x9cZ\xb5X\xa4\x0c\xba0\xdc\x85\ \xf0Obc\xb1e\x98u\xe92\xc6\x01\xa2U~+\ \xdc\xba\xa4;H\xd5\x22.\x82i~\x1e\xd6\xa0\x9f\x9c\ \x8d\x9d\xf3\xf9\xf3\x09\xb2q\xbc\xf89n\x9crJK\ Y\x98BP\xbf\x909&\xdc\xc5\xf0\x16\xf1\xd7a\xfd\ \xe7\xcf`\x0c Z\xa7~\x7f`x\xb8u\xe9\x0a\xe2\ \x22\x98\xe4\xf4\xb0\x06{\xf7\xaa>D\xa4\xcf\x9c\xb3s\ \x1e\xaf`\xae{\xd6\xeb`^\xb3&\x0b\x92\x05\x0f\x19\ u\x0e\xffge\xe3\x0e\xe4!\x22Dk}Ml\x11\ ^}\xf8\x22AW\x170\x84\xbe\x99\xfc\x870\x06z\ \x03\xb7\x85R\x95Z)N\x99B\xa8\x8d\x93s\xe6(\ \xa7qc\x16!\x8b|R\xac\x93C\xe1\x5c\xb7\x9a|\ \x89\xcf\x1d\xd1j\xf5\xc5\xed\x1a\xe1\xd5\x09\xf9\x8e\x90\xa8\ N|\x84\xa0\xf9a\x18\x03\xbc\xa8\xaa\x1d[t8\x9f\ :\x95@\x1b\x17\x17-R\xc9f\xcdXx,\xf56\ \xb10\x07\xc2y\x09\x1d[\x10#\xe3w\xc2\xbd\xcc~\ 9\xf1\x11\x82dxX\x0b\xe1\xa5U\x9d\x9c\xfa\x08\x04\ \xc16\xfa\xc7Y6nTN\xff\xfe\xca\xc9\xcfg\xc1\ \xb1\xdc\xc59\x10\xd07\xf39#ri\xd4\x9b\x9f\x8a\ \xdd\x88\x91\x10\x04\xd5\xc4\xd7\xc3\x18\xd8c\xdc\x0bh\x19\ O\xca\xa1C\x09\xb7q8g\xae;\xb3T\xaf\xce\x22\ \x13\x11\xf7\x8aCb\x1c\xce'\xf1\x19#F\xce\xddb\ \xef\xf0\xea\xc6#\x89\xf4;\x0d\x00YeQ\x18\x03\xba\ \x8d\xf8fU&d\xaf^\xca\xa9\xac$\xe4F9\x9c\ \x9f{\xaer\xea\xd7gq\x89\xa0\xbfK\x84\xfe\xd2h\ `u\xe9->_\xc4H\xfa[\xb1<\xbc\xfaq\x1a\ q\x12\xb2\x89\xac\xb1\x89\xbf\x85q\xee\xfc\xde\xaaL\xc4\ v\xed\x94\xa3w^\x09\xb9\xd1\x0c\xe6\x9b6)\xa7{\ w\x16\x94\x88{K\x22\xfd\xb0X\x5c\xc2y1\xe7\xce\ \x11#\xef\x0f\xc3;\x8f\xbe[,!VB\xb6\xb8>\ \x8c\x85peU&`y\xb9r6o&\xe8FQ\ \xfd\x8b\xc7\xe4\xc9\xca\xa9Q\x83\x85$&.\x8aQ@\ \xdf\xca\xe7\x89\x18\x0b\xe7\x86WG\xd6\x12+!\x1b\xe8\ K\x0d\x9f\x9b\x1e\xc0}\xdd3\xac\x19M<\xfdP\xcd\ \x8a\x15\x04\xdd(\xba~\xbdr\xbave\xf1\x88\x99{\ \xc4\x1e1\x08\xe7#\xf8,\x11c\xe3\xbbb\x87pj\ \xc9G\xe2\xe1\xc4K\xa8*\x0f\x98\x1e\xbc\xb5\xc4\xa73\ \x9dt\xba\xbb\xc7\x82\x05\x04\xdd(:w\xaeJ\x96\x95\ \xb1p\xc4\xd4G\xdd\xb6\x84Q\x0d\xe7\xf5\xdc\xb3\xab|\ \x96\x88\xf1\xea\x8f^-\x9c\x9a\xf2\x03\xe2%T\x85\x93\ \xc3X\x08\xaf\xac\xca\x84\x9b8\x91\xa0\x1b5\xb7mS\ N\xef\xde,\x169\xe0\xba\x08\x07\xf4\xab\xf8\xfc\x10c\ \xe9\xaapj\xca\x97b?b&dB\x91\xf8\x96\xe9\ A{RU&Z\x9f>\x84\xdd\xa8]\x04]\xbc\x98\ \x0e-9\xa4n\x97: \x82\xe1|\x1c\x9f\x1db\xac\ \xebR\xffpj\xcb\x13DM\xc8\x849a\xfc\x84\xfc\ b\xa6\x93\xacI\x93\xf4N,\xa17:N\x9a\xa4\x9c\ \xa2\x22\x16\x88\x1cS\x1f_\xab\x19\xa1p\xae\xdb\xb1\xbd\ \xcc\xe7\x86\x18k\x1f\x13\xab\x87Sc\xc6\x107\xc1\x0f\ \xc5\xe2\x1e\xd3\x03uW\xa6\x93K\x9f[^\xbb\x96\xc0\ \x1b\x15\xb7lQN\x97.,\x0a\x1cu\x89\x84\xd7\xf0\ y!\xe6\x84\xcb\xc2\xa91\xcf%x\xbc\x08|0\xdf\ \xf4 \x1dR\x95\x895g\x0e\xa17*\xae\x5c\xa9\x9c\ \xa6MY\x0cr\x5c\xdd\xa1\xa9{\x04\xc2\xf9p>+\ \xc4\x9c\xea6\xd5)\x9cZs2\xb1\x13\xbc\xa0\x1b\xe8\ ;&\x07g\x0d\xf17\x99N\xaa\xc1\x83\x09\xbdQq\ \xe6L\xe5\x14\x17\xb3\x10\xe0\x7f\xba'\x14Y\x1c\xceK\ \xab\xd2M\x0a\x11#\xe9\xddb\x81\xf9z\xf3\xa2\x98O\ \xfc\x84C\xb1\xc8\xf4B\xb8*\xd3\xc9\xa4\x1f#\xda\xbe\ \x9d\xe0\x1b\x85\x87\x87F\x8dRN^\x1e\x0b\x00~\xc5\ s,\x0e\xe8\xab\xf9|\x10s\xd2\xb3\xc2\xa99\x93\x89\ \x9fp0\xca\xc4?\x9a\x1c\x94G\x8a\xefg2\x89\x8a\ \x8aT\xf2\x92K\x08\xbf\xb6\xbbu\xabr:v\xa4\xe8\ \xe3\x01}Glna8\xef\x9ai]B\xc4\xc8\xfb\ \x96\xd8\xc4|\xddyM, \x86\xc27\xb1\xd4\xf4B\ \xf8\xa3L'\xd1\xf8\xf1\x84_\xdb\xbd\xec2\xce\x9b\xe3\ !\xbd\xde\xb2p\x9e'\xde\xc5\xe7\x82\x98\xd3V\x86S\ \x7f\xa6\x11C\xe1\x9b:\xb7\x18={>:\xc3\x89\x93\ j\xd3F9\x15\x15\x04`\x9b\xfb\x9b\xafX\xa1\x9c\x06\ \x0d(\xf4\xe8\xc9\x81\x16\x05\xf4\x09|\x1e\x88\xf4F\x17\ {\x84\xb3\x8b\xceYt\xf8\x1a\xb3L\x0eD\xf96\xa0\ \x9e\xcc$\x9cW\xaf\xae\x92\xb4T\xb4\xdb\xb9s\xb9\x0c\ \x8a\xbe|@,\xb4 \x9c\xeb\x0b\xeb\xcf\xf1y \xa2\ \xf8s1\xdf|\x1d\x1aK\x1c\x85\xfd\xd1=8_6\ 9\x08\xe7g:i&L \x00\xdb\xec\xacY*Y\ XHqG\xdf\xce\xb0 \xa0/\xe1s@\xc4\xfd\x9c\ d\xbe\x0e=L$\x85\xfd9\xd1\xe4\x00\xd4/\xf3\xbd\ \x91\xc9di\xdd:\xdd\x11\x84 l\xef\xcb\xa0tj\ \xc1\x0c\xd5\xafu\xd6\x0a1\x9c\xebKa\xef\xf29 \ \xe2~>\xef\xb6\x5c5\x5c\x8fz\x11K\xe1\xdfJ\x94\xe4\ \xef\x8e\x88\x89\x83?^d\xf8\xd7\xbd\xbf\x8b\xb5\x89\xa9\ \xb9\xcbZ\x93\xdf\x08\xaf\xcd\xa4\xadb\xd7\xae\x04a\x1b\ \xfb\x9c\x8f\x1bG\xd1\xc6\xc0\xdcn\xb0.}\x8f\xbf7\ \x22\xda\xf9\xeb\xde\xb9\xc4\xd4\xdc\xa4HL\x99\x1ahG\ e\xb0K\xa5\xdb\xf5\xa5V\xaf&\x10\xdb\xa6nuI\ \xb1\xc6\x00\xd5\xbf\xb4\xb54P\x97\xba\xf1\xb7FDK\ \x7f\xdd\x13_ \xaa\xe6&F[+^\x97\xc9\x848\ \xf6X\xc2\xb0m\x9e~:\xddZ\xd0\x88\x1b\x0d\xd4\xa5\ \xab\xf9;#\xa2\x0f\xd7\x9b\xdfE?\x86\xb8\x9a{\xdc\ a\xb2C\xc2^\xbf\x13\xa1F\x0d\xe5l\xdeL \xb6\ \xc99sT2?\x9f\x22\x8dF|\xcf\xedM\x1eT\ ]j\x97I]B\xc4\x9c\xf6\x1d\xb1\xbe\xd9\x80~5\ q5\xb78L\xfc\xcc\xd4\x00\xdb\x94\xc9D\x988\x91\ @l\x91\xc9\x85\x0b\xd3\xbd\xe8)\xd0h\xd0\xcb\x02\xac\ KW\xf0\xf7E\xc4\x0c\x5cd6\xa0\x7f(\x96\x11[\ s\x87U\xa6\x06W\xb9\xbb\x13\xe6k\x024h\xa0\x9c\ ]\xbb\x08\xc6\xb6\xb8l\x99r\xaaW\xa70c(\xbb\ \xe8\xe5\x01\xd4\xa5V\xec\x9e#b\x86\xbe\x920\xfe\xba\ \xe8\xd9\xc4\xd6\xdc\xa0@|\xdf\xd4\xc0\xba(\x93\x090\ e\x0a\xa1\xd8\x16\xd7\xadS\xa9:u(\xca\x18\x9a\x17\ 'x5\x14\x11\xedr\x86\xd9\x80\xfe,\xd157\x18\ ajPU\x17_\xf4;\xf0\xcb\xcb\x95SQA0\ \xb6\xc1m\xdb\x94s\xc4\x11\x14c\x0c}\xb7\xaa,\x8b\ u\xa9\x91\xf8.\x7fWD\xac\x82\x8f\x8a\xf9fCz\ g\xe2k\xfc\xb9\xd1\xd4\x80\x9a\x91\xc9\xc0\x9f6\x8d`\ lC\x9fs\xf9\x92\x94\xea\xd4\x89B\x8cVxN\x16\ \xeb\xd2\xa5\xfc=\x111\x0b\x9eh6\xa0o$\xbe\xc6\ \x9bb\xf1\xaf&\x06S\x9e\xf8\x88\xcf\xc1\x9el\xd4h\ _0$ [\x10\xd0G\x8e\xa4\x00\xa35>'\x16\ e\xa1.\xd5\x12_\xe3\xef\x89\x88Y\xf0'f\x03\xfa\ \x9bD\xd8xs\x92\xa9\xc14$\x83\xc1\x9e\x9c>\x9d\ plI;Ez\x9d\xa3mN\xcdB]:\x9f\xbf\ #\x22f\xd1NfCzObl|\xf9\xbe\xa9\x81\ tU&g\xcf++\x09\xc7a\xbbt)\xed\x14\xd1\ J\x1f\xa9\xe2\x99\xcfb\xf1\xb7\xfc\x1d\x111\x8b\xae6\ \x1b\xd07\x11c\xe3I\xa9\xf8\x91\x89A\xd4 \x91~\ \x12\xd7\xcf O\x9dv\x1a\xe18l\xf5\xc3P\xf5\xeb\ St\xd1Z\xc7\x9a\xbe\x13\x83\x88x\x10\xf5\x91\xb9\x12\ s\x01}\x8f\x98G\x9c\x8d\x1f\x13M}\xcb\x9b\xe7\xf7\ hKY\x99J\xed\xd8A@\x0e\xd3\x8a\x0a\x95\xec\xd0\ \x81\x82\x8bV{\x9f{\xbf\xc5oM\xd2\xe7\xd7\x9f\xe1\ \xef\x87\x88\x018\xc1\xec.z?\xe2l\xfc\xb8\xcd\xd4\ \xe5\xd0G\xfd\x0ep}!\x91\x90\x1c\xae\xe3\xc6Qh\ 1\x12\x0e\xcd\xa0.M\xe4\xef\x86\x88\x01\xf9#\xb3\x01\ }'q6^\x94\x88\xff01xz\xf9\x1d\xdcE\ E*\xb5i\x13\x019\xcc\x8e-\x8b\x17\xabd~>\ \x85\x16#\xe1-\x19l\x1a\xdc\xc7\xdf\x0d\x11\x032)\ 6\xe7\x98\x0bd\xc8\xf1\xa6\xbe\xddm\xf5;\xb8\x07\x0c\ $\x87\xe9\xd6\xad\xcai\xd0\x80\x22\x8b\x91\xb2\x9b\x8f\ \x9at,\x7f/D\x0c\xd8\x0b\xcd\xee\xa2\x1fE\xac\x8d\ \x0f\x15&\x06M\xb5Lz\x0c/[FH\x0eS\xfd\ \x05\x89\xe2\x8a\x11\xf3z\x1fu\xe9g\xfc\xbd\x101`\ \x9f\xc8\xf0~L\x86^B\xac\x8d\x0f\xef\x98\x184\xc3\ \xfd\x0e\xea\x96-\x09\xc8a:s&\x85\x15#\xfb\x93\ r{\x0f5\xa97\x7f+D\xb4\xf0\x97\xbd*\xfa\x08\ \xb16\x1e\xb46\xf5\xb3\xcb\x0e\xbf\x03z\xca\x14Br\ H&\xd7\xaeUNI\x09E\x15#\xeb\x16\x0f5\xe9\ ;\xfc\x9d\x10\xd1\x90\x97\x98\x0b\xe8\x9f\x8a\xb5\x88\xb7\xd1\ g\x81\x89\x01S]|\xc3\xcf`..VI}\xfe\ \x99\xb0\x1c\x8e]\xbbRP1\xd2\xea\xb7\x16\x0e?H\ M\xea\xcc\xdf\x08\x11\x0d\xfa\x8c\xd9c.\x13\x89\xb7\xd1\ \xe7\x17&\x06\xcb\xf1>\x07rj\xe0@BrXN\ \x9fN1\xc5X\xb8\xe6 5\xe9\x0a\xfe>\x88h\xd8\ \x1e\xe6\x02\xfa\xb5\xc4\xdbhSl\xaa\xbdb\xa5\xdf\x81\ \xac\x9f\x94',\x9bw\xe3F\xe5\x94\x96RH1\x16\ \xea_\xed\xea\x1c\xa0\x1e\x1d\x9e\xf0\xff\x9a1\x22bU\ ]a.\xa0\xef&\xe2F\x9b\xe1&\x06\x8a~\xa5\xef\ u?\x83\xb8iS\x82rX\xf6\xe9C\x11\xc5X\xb9\ \xf0\x005i-\x7f\x17D\x0c\xc1'\xcd\xb6[\xecD\ \xcc\x8d.\x1bL\x0c\x92~~\x07\xf1I'\x11\x94\xc3\ \xb8\x18z\xd6Y\x14P\x8c\x9d/\x8a%\xfb\xd5\xa3z\ \xe2\xdb\xfc]\x101$[\x9b\x0b\xe8\xf3\x89\xb9\xd1\xe5\ 1\x13\x83\xe4R\xbf\xe7\xcfW\xaf&0\x9bv\xfbv\ \xe5\xd4\xafO\xf1\xc4X:g\xbfz\xb4\x94\xbf\x07\x22\ \x86\xe8Y\xe6\x02\xfa\xad\xc4\xdchR]\xfc\xc4\xc4 \ \xf9\xb5\x9f\xc1\xdb\xa2\x05a9\x0cG\x8e\xa4pbl\ }\xd6=jW\xcb\xefq;D\xc4,{\xb3\xb9\x80\ \x9e$\xeaF\x93\xbe&\x06H\xe3D\xfa\xd1\x10\xcf\x83\ w\xc2\x04\xc2\xb2i\xd7\xacQNQ\x11\x85\x13c\xed\ Dw\xe7\x8a\xbf\x05\x22\x86\xe9;\x89t\xebiC!\ \xbd9q7z,218N\xf33p\xf3\xf2\x94\ \xb3n\x1d\x81\xd9\xf4\xd9\xf3\xee\xdd)\x9a\x18{\x1fp\ w\xd2\xf9[ b\xd8\x1ek.\xa0O&\xeeF\x8f\ \xdbM\x0c\x8ek\xfc\x0c\xdaV\xad\x08\xcc\xa6]\xb8\x90\ b\x89\x88\x88h\xd0\xb5\xe6\x02z%q7z\xfc>\ \xe8\x81Q \xbeF\xf7\x16{\xad\xacT\xa9\x96-)\ \x96\x88\x88\x88\x06}\xc4\x5c@\x7f\x9e\xb8\x1b-\xda\x99\ \x18\x18\x9d\xfc\x0e\xdaK.!4\x9b<\xda\xc2\x8b\xa1\ \x88\x88\x88\xa1Xn&\xa0\x7f!\xd6!\xf6F\x87\xa9\ &\x02\xfa4?\x83\xb5^=B\xb3AS;w\xaa\ \x94\xfe\x9bS$\x11\x11\x11\x8d{\xbc\xb9]\xf4\xe1\xc4\ \xde\xe8\xb0\xcd\xc4\xa0\xb8\xd2\xcf`\x1d0\x80\xe0lr\ \xf7|\xd2$\x0a$\x22\x22bH\xae2\x17\xd0/\x22\ \xf6F\x87_\x99\x18\x14O\xfb\x19\xacs\xe6\x10\x9c\x0d\ >J\x94\xaa]\x9b\x02\x89\x88\x88\x18\x92?7\x17\xd0\ o$\xf6rA\xf4?\x96\xfb\x19\xa8\x85\x85*\xb9u\ +\xc1\xd9\x94\xe3\xc7S\x1c\x11\x11\x11Ctw\xc2X\ ?t.\x8aF\x84\xc6&\xbe\xb1\x8d\xf53P\xdb\xb6\ %4\x1b\xdc=O\xd6\xacIqDDD\x0c\xd9\xbe\ f\x02\xfa\xa7b5\xe2\xaf\xfd\x1cg\x22\xa0\xaf\xf23\ HO8\x81\xe0l\xca\xb1c)\x8a\x88\x88\x88\x168\ \xcf\xdc1\x97N\xc4_\xfb1\xf2\x82\xe8m~\x06\xe9\ \x82\x05\x04gC\xbb\xe7Ni)E\x11\x11\x11\xd1\x02\ \xaf4\x17\xd0O'\xfe\xda\xcfwM\x0c\x86W<\x0e\ \xced~~:8\x12\xa0\x83\xf7\xb4\xd3(\x88\x88\x88\ \x88\x96\xf8\x80\xb9\x80\xbe\x81\xf8k?\xcfXuA\xf4\ \x88#\x08\xce\x86^\x0du\x1a5\xa2 \x22\x22\x22Z\ tQ\xb4\xc8L@\xbf\x8b\xf8k?\x7f\x0fz \x0c\ \xf63@\x87\x0c!<\x9b\xe8{~\xd6Y\x14CD\ DD\xcb\xech&\xa0\xbfE\xfc\xb5\x9b\x86&~J\ \x99\xebgp\xce\x9cI\x806\xa1\xee\x94C!DD\ D\xb4\xca\x93\xcdur) \x06\xdbKo\x13\x01\xbd\ \xc2\xc7\xc0L\xae]Kx\x0e\xda\x8b/\xa6\x08\x22\x22\ \x22Z\xe8rs\xe7\xd0\x9b\x13\x83\xed\xe5T\x13\x83\xe0\ W^\x07\xa6\xee(B\x80\x0e\xde\xbe})\x82\x88\x88\ \x88\x16\xfa}s\x01}\x101\xd8^\x96\x04=\x00\xf2\ \xc4\xb7\xbd\x0e\xcc\xf6\xed\x09\xcfA{\xf9\xe5\xca)*\ \xa2\x08\x22\x22\x22Z\xe8\x93\xe6\x02\xfa4b\xb0\xbd\x5c\ \x1d\xf4\x00h\xe4g`\x0e\x1dJ\x80\x0e\xfar\xe8\xa4\ I\x14@DDDK\xddc\xae\x93\xcb*b\xb0\xbd\ \xdc\x1b\xf4\x00\xe8\xe1g`N\x99B\x88\x0e\xda\xc3\x0e\ \xa3\x00\x22\x22\x22Zl33\x01\xfd\x06b\xb0\xbd\xbc\ \x11\xf4\x008\xc9\xc7\x80L-YB\x80\x0e\xd2\x8b.\ \xa2\xf0!\x22\x22Zn\x7f3\x01\xfd!b\xb0\x9d\xe4\ \x89\x1f\x07=\x00\xce\xf5: \xf3\xf3Uj\xc7\x0eB\ t\x90\xf6\xefO\xe1CDD\xb4\xdcS\xcd\x04\xf4\xf7\ \x88\xc2vR\xd7\xc4%\x84M^\x07\xa4~\xd5\x92\x10\ \x1d\x9c\xdb\xb7+\xa7\xa4\x84\xc2\x87\x88\x88h\xb9\x8b\xcd\ \x04\xf4O\x88\xc2v\xd2\xc6D@\xbf\xc9\xeb\x80\xec\xd4\ \x89\x10\x1d\xa4\xfa\x01(\x8a\x1e\x22\x22\xa2\xf5\xee2\xd7\ \xc9\xa5\x8c8l\x1f}L|\xf8\x0f{=\x7f>x\ 0!:H\x8f:\x8a\xa2\x87\x88\x88\x18\x01\x7fd.\ \xa0\xb7 \x0e\xdb\xc7\x89&>\xfc\x97\xbd\x0e\xc8\xf1\xe3\ \x09\xd1A\xb9u+\xbd\xcf\x11\x11\x11#\xe2\x03\xe6\x02\ \xfa1\xc4a\xfb\x98\x16\xf4\x07_ \xee\xf5\xba\x83>\ {6A:(\xa7O\xa7\xe0!\x22\x22F\xc4\xdf\x9a\ \x0b\xe8#\x89\xc3\xf6\xb1(\xe8\x0f\xbe\x9e\x9f\x01\xb9t\ )A: S]\xbbR\xf0\x10\x11\x11#\xe2\xeeD\ \xfa%v\x03\x01\xfd\x0c\xe2\xb0}\xac\x0f\xfa\x83o\xed\ g@n\xdeL\x98\x0e\xc2-[T\xb2\xb0\x90\x82\x87\ \x88\x88\x18!k\x99\x09\xe8\x0b\x88\xc3\xf6qu\xd0\x1f\ |O\xaf\xc7[\xaaW'H\x07\xb5{N\xf7\x16D\ D\xc4\xc8\xd9\xc2L@_M\x1c\xb6\x8f\xdb\x82\xfe\xe0\ Gx\x1c\x84Iz\xa0\x07g\xcf\x9e\x14:DD\xc4\ \x88y\xb4\x99\x80^A\x1c\xb6\x8f_\x04\xfd\xc1\x9f\xea\ u \xb6lI\x90\x0e\xc2\xcaJ\xe5\x94\x95Q\xe8\x10\ \x11\x11#\xe603\x01\xfdz\xe2\xb0}\xdc\x17\xf4\x07\ ?\xcb\xeb@\xec\xd2\x850\x1d\x84\x17^H\x91CD\ D\x8c\xa0c\xcd\x04\xf4\x1f\x10\x87\xed\xe3\xe1\xa0?\xf8\ y^\x07b\x9f>\x84\xe9 \x1c=\x9a\x22\x87\x88\x88\ \x18A'\x9a\x09\xe8\xb7\x11\x87\xed\xe37A\x7f\xf0\xe7\ y\x1d\x88\xc3\x86\x11\xa6\x83\xb8 \xaa\x8f\x0eQ\xe4\x10\ \x11\x11#\xe7\xe9f\x02\xfa\x9d\xc4a\xfbx>\xe8\x0f\ ~\xb1\xd7\x818v,\x81:\xdb\xea\xb6\x95\xf9\xf9\x14\ 9DD\xc4\x08:\xc3L@\xbf\x978l\x1f/\x07\ \xfd\xc1/\xf3:\x10O?\x9d@\x9dm\xe7\xcc\xa1\xc0\ !\x22\x22F\xd49f\x02\xfa\x03\xc4a\xfbx+\xe8\ \x0f~\x95\xc7A\xb8\xafW7\xa1:\xab&\x8f;\x8e\ \x02\x87\x88\x88\x18Q\xcf5\x13\xd0\x1f'\x0e\xdb\xc7\x9e\ \xa0?\xf8u^\x07\xa2\xde\xed%Ts\xfe\x1c\x11\x11\ \x11\xf7y\x81\x99\x80\xfe\x0cq\xd8>RA\x7f\xf0\x97\ {\x1d\x88s\xe7\x12\xaa\xb3\xe9\xf6\xed\xca)(\xa0\xc0\ !\x22\x22F\xd4%f\x02\xfa\x0b\xc4a\xfbp\x82\xfe\ \xe07{=\xe22\x7f>\xa1:\x9b\xc7[\x16.\xa4\ \xb8!\x22\x22F\xd8\x0b\xcd\x04\xf4\xdf\x12\x87s\xf0\x88\ \xcbz\xaf\x03Q\x07J\x82u\xf6\x8e\xb7\x8c\x1bGq\ CDD\xe4\x88\x0bG\x5c\x22\xc8;A\x7f\xf0k\xbd\ \x0e\xc4\xc5\x8b\x09\xd6\xd9\x0c\xe8]\xbbR\xdc\x10\x11\x11\ #\xec\x023\x01\xfd\x09\xe2\xb0}\xbc\x11\xf4\x07\xbf\xd2\ \xeb@\x5c\xba\x94`\x9dMk\xd7\xa6\xb8!\x22\x22F\ \xd8yf\x02\xfa#\xc4a\xfbx%\xe8\x0f~\xb9\xd7\ \x81\xb8l\x19\xa1:\x9b\x0f\x14Q\xd8\x10\x11\x11\xe9\x83\ \x9e\xa0\x0fz\x14y1\xe8\x0f~);\xe8\xe6=\xef\ <\x0a\x1b\x22\x22b\xc4\x9di&\xa0\xff\x928l\x1f\ \xcf\x07\xfd\xc1/\xf6:\x10/\xba\x88`\x9d-O9\ \x85\xc2\x86\x88\x88\x18q\xcf4\x13\xd0\x7fA\x1c\xb6\x8f\ \xa7\x83\xfe\xe0/\xf0\xdaf\x91K\xa2\xd9k\xb1\xd8\xaf\ \x1f\x85\x0d\x11\x111\xe2N6\x13\xd0\xef \x0e\xdb\xc7\ \xe3A\x7f\xf0s=\x0e\xc2$m\x16\xb3g\x8b\x16\x14\ 6DD\xc4\x88;\xd6L@\xbf\x8d8l\x1f\xbf\x0a\ \xfa\x83\x9f\xeau \x9e\x7f>\xc1:\x1bVV*\xa7\ \xb8\x98\xc2\x86\x88\x88\x18q\x8f5\x13\xd0\xaf'\x0e\xdb\ \xc7O\x82\xfe\xe0'x=\xe2\xc2K\xa2\xd9q\xdd:\ \x8a\x1a\x22\x22b\x0c\xeci&\xa0\xef$\x0e\xdb\xc7\x8d\ A\x7f\xf0#\xbc\x06\xf4s\xce!\x5cg\xc3\x0b.\xa0\ \xa8!\x22\x22\xc6\xc0\x8ef\x02\xfae\xc4a\xfb\xb82\ \xe8\x0f~\x80\xd7\x80>{6\xe1:\x1bN\x9bFQ\ CDD\x8c\x81\xcd\xcc\x04\xf4%\xc4a\xfb\xd8\x1c\xf4\ \x07\x7f\xb4\xd7K\xa2S\xa7\x12\xae\xb3\xe1\xe8\xd1\x145\ DD\xc4\x18X\xcfL@\x9fK\x1c\xb6\x8f\x15A\x7f\ \xf0\xed\xbc\x0e\xc4I\x93\x08\xd7\xd9\xb0o_\x8a\x1a\x22\ \x22b\x0c\xacf&\xa0O%\x0e\xdb\xc7\x05A\x7f\xf0\ M\xbd\x1eq\x197\x8ep\x9d\x0d\xdb\xb6\xa5\xa8!\x22\ \x22F\xdcw\xcc\x84s\xed8\xe2\xb0}\xcc\x09\xfa\x83\ /\xf1:\x18G\x8d\x22\x5cg\xc3\xfa\xf5)l\x88\x88\ \x88\x11\xf77\xe6\x02\xfa\xb1\xc4a\xfb\x98d\xe2\xc3\x7f\ \xdb\xcb`\x1c:\x94p\x9d\x8dWD\x0b\x0b)l\x88\ \x88\x88\x11\xf7\xe7\xe6\x02z7\xe2\xb0}\x0c5\xf1\xe1\ ?\xe5e0\xea\xe7\xe9\x09\xd8Us\xdb6\x8a\x1a\x22\ \x22b\x0c\xbc\xc1\x5c@oL\x1c\xb6\x8f.&>\xfc\ \xbb\xbd\x0c\xc6n\xdd\x08\xd8Uu\xcd\x1a\x8a\x1a\x22\x22\ b\x0c\xdcb&\x9c\x7f!\x16\x10\x87\xed\xa3\xb1\x89\x80\ \xfe}/\x97D\xdb\xb4!`W\xd5%K(j\x88\ \x88\x881p\xa9\x99\x80\xfeG\xa2\xb0\x9d\x14\x89_\x06\ =\x00vy\x19\x8c\xe5\xe5\x04\xec*\x9a:\xf7\x5c\x8a\ \x1a\x22\x22b\x0c\xfc\x96\x99\x80\xfe\x12Q\xd8^\xfe\x1a\ \xf4\x00X\xe5e0\x96\x96\x12\xb2\xab\xea\xf4\xe9\x145\ DD\xc4\x188\xceL@\xff51\xd8^\xde\x08z\ \x00\xcc\xf32\x18\xf3\xf2\x94SQA\xc8\xae\x8a\xa7\x9c\ BQCDD\x8c\x81=\xcd\x04\xf4\x9b\x89\xc1\xf6\xf2\ X\xd0\x03\xe0$\x8f\x831\xb5i\x13!\xbb*\x8e\x19\ CQCDD\x8c\x81\x8d\xcd\x04\xf4\x9d\xc4`{\xf9\ i\xd0\x03\xa0\x97\xd7\x01\xb9|9!\xbb*\x1e\x7f<\ E\x0d\x11\x111\xe2\xee\x16\xf3\xcd\x04\xf4\xa5\xc4`{\ \xb9\x22\xe8\x01\xd0\xd4\xeb\xa0\x5c\xb0\x80\x90]\x95K\xa2\ #FP\xd8\x10\x11\x11#\xee\xe3\x09c=\xd0O#\ \x06\xdb\xcb\xd2\xa0\x07@\x81\xb8\xc7\xcb\xa0\x9c:\x95\xa0\ ]\x15\x8f=\x96\xc2\x86\x88\x88\x18qo5\x17\xd0\xfb\ \x10\x83\xed\xe5t\x13\x83\xe0\x19/\x83r\xf4hBv\ Uv\xd0\x07\x0f\xa6\xb0!\x22\x22F\xdcm\xe6\x02z\ \x13b\xb0\xbd\x0c21\x08\xee\xf20 \x93\xfd\xfa\x11\ \xb4\xab\xe0\xbe\xbf\x1f\x85\x0d\x11\x111\xd2^`&\x9c\ \x7f\x22\xe6\x13\x83\xed\xa5\x85\x89\x80~\x95\x97A\xd9\xb1\ #A\xbb*\xf6\xeeMaCDD\x8c\xb8c\xcd\x04\ \xf47\x89\xc0v\xa3_\x13\xfd\x22\xe8\x81p\x91\x97A\ \xd9\xa4\x09!\xbb*G\x5cz\xf6\xa4\xb0!\x22\x22F\ \xdc\x8ef\x02\xfa}D`\xfb\xd9\x1b\xf4@\x98\xe8a\ @\xa6\xaaW'h\xb3\x83\x8e\x88\x88\x98\xb3\xbe/\x16\ \x9b\x09\xe8\xd7\x11\x7f\xed\xe7\xf1\xa0\x07Bw\xaf\x83s\ \xe3F\x826g\xd0\x11\x11\x11i\xb1\x18\xac\x97\x10\x7f\ \xed\xe7\x07A\x0f\x84\xda^\x07\xe7\x05\x17\x10\xb63u\ \xd0 \x8a\x1b\x22\x22b\x84\xbd\xc1\x5c@?\x99\xf8k\ ?+L\x0c\x86\x17\xbc\x0c\xce3\xce hg\xea\xd0\ \xa1\x147DD\xc4\x08\xbb\xdc\x5c@\xefH\xfc\xb5\x9f\ \xc9&\x06\xc3\x1d^\xce\xa1\xeb\xd70\x09\xdb\x99\x1dq\ 9\xee8\x8a\x1b\x22\x22b\x84=\xcdL8\xffL\xac\ F\xfc\xb5\x9f\x1e&\x02\xfav/\x83\xb3[7\xc2v\ \xa6\x8e\x1cIqCDD\x8c\xb0\x9d\xcd\x04\xf4\xd7\x88\ \xbe\xd1\xa0\xa6\xf8e\xd0\x03\xe2,/;\xe8\xb4Z\xcc\ \xdcq\xe3(n\x88\x88\x88\x11u\xb7Xd&\xa0\xff\ \x84\xe8K\xab\xc5\xff8\xc0\xcb\x00-*RNE\x05\ a;\x93>\xe8\x93'S\xe0\x10\x11\x11#\xea\xdd\xe6\ \xce\x9f\xaf#\xf6F\x87\x07\x83\x1e\x10\xf5\xbc\x0e\xd2\xe5\ \xcb\x09\xdc\x998k\x16\x05\x0e\x11\x111\xa2n1\x17\ \xd0\xcf$\xf6F\x87kL\x0c\x8a\xe7\xbc\x0c\xd2\x193\ \x08\xdb\x998\x7f>\x05\x0e\x11\x111\xa2N3\x17\xd0\ \x8f&\xf6F\x87\x85&\x06\xc5\x8dtr\x09\xce%K\ (p\x88\x88\x88\x11\xb5\xbb\x99p\xfe\x09\x1d\x5c\xa2\xc5\ \xb1&\x02\xfa\xc5^\x06i\xc7\x8e\x84\xedL\x5c\xbd\x9a\ \x02\x87\x88\x88\x18\xd1\x0b\xa2\xd5\xcd\x04\xf4g\x88\xbc\xd1\ \xa2\xbe\x89\x80>\xd6\xcb@\xad]\x9b\xb0\x9d\x89[\xb6\ P\xe4\x10\x11\x11#\xe8\xcf\xcd\x1do\xb9\x86\xc8\x1b=\ \xf6\x04=0Zy\x1c\xa8\xa9\x8d\x1b\x09\xdc\x99tr\ \xa9^\x9dB\x87\x88\x88\x181W\x99\x0b\xe8s\x89\xbb\ \xd1\xe3\xae\xa0\x07F\x9e\xf8\xb2\x97\x80~\xee\xb9\x04\xee\ L,/\xa7\xd0!\x22\x22F\xcc\xd1\xe6\x02zo\xe2\ n\xf4\xb8\xcc\xc4\xe0\xf8\x9e\x97\xc1z\xc2\x09\x84\xedL\ l\xdf\x9eB\x87\x88\x88\x181\x1b\x99\x09\xe7\x9f\x89%\ \xc4\xdd\xe81\xd1D@?\x8f\x8b\xa2\xc1\xd9\xbb7\x85\ \x0e\x11\x111B>nn\xf7\xfc\x05\xa2n4ik\ b\x80xzQ\xb4\xa4D9\x95\x95\x04n\xbfg\xd0\ G\x8e\xa4\xd8!\x22\x22F\xc8\x1d\xe6\x02\xfauD\xdd\ h\x92'\xfe%\xe8\x01R&\xbe\xefe\xd0\xaeXA\ \xe8\xf6\xeb\xa4I\x14;DD\xc4\x08y\x9a\xb9\x80>\ \x93\xa8\x1b]\xee11H\xee\xf32h\xa7L!p\ \xfb\xddA?\xe7\x1c\x8a\x1d\x22\x22b\x84<\xcc\x5c@\ oG\xcc\x8d.\xabL\x0c\x92\xf5^\x06\xed\xc0\x81\x84\ n\xbf\xaeZE\xb1CDD\x8c\x88\x8f\x98\x0b\xe7\x7f\ pOJ@D\x19eb\xa0\x9c\xe8e\xe0\xea\x96\x81\ \x84n\x7fVT\xa8da!E\x0f\x11\x111\x02\xae\ 3\x17\xd0\x7fL\xc4\x8d6u\xc5/\x83\x1e(\xf2\x1f\ \xa2\xf6z\x19\xbc\xeb\xd6\x11\xba\xe9\x85\x8e\x88\x88\x18K\ G\x9a\x0b\xe8\x17\x10q\xa3\xcf\xcb&\x06\xcb=^\x06\ \xef\xb4i\x04n\xbf\xe7\xd0\xbbv\xa5\xe8!\x22\x22Z\ \xeen\xb7q\x86\xa1\x80~\x0c\xf16\xfa\x5cob\xb0\ \xac\xf02\x80\xfb\xf6%t\xfbu\xd80\x0a\x1f\x22\x22\ \xa2\xe5\xdea.\x9c\xffC,\x22\xdeF\x9f9&\x06\ \xcc0/\x03\xb8A\x03\x02\xb7_O?\x9d\xc2\x87\x88\ \x88h\xb9\xe7\x99\x0b\xe8w\x13m\xe3\xc1\x91&\x06L\ \xa9\xfb\xf3\xce\xa1\x06pj\xf5jB\xb7\x1f/\xba\x88\ \xc2\x87\x88\x88h\xb9\x1d8\x7f\x0e>\xd1mxR&\ \x06\xcd\x8f\xbd\x0c\xe2\xc9\x93\x09\xdd~\xdc\xbe]9y\ y\x14?DDDK}\xdc\x5c8\xd7v&\xda\xc6\ \x87\x1f\x98\x184\xf3\xbc\x0c\xe4\xce\x9d\x09\xddtrA\ DD\x8c\x8d\xab\xcc\x85\xf3$\xfd\xcf\xe3\xc5\x0c\x13\x03\ \xa7\x8d\x97\x81\x5cT\x94\xde\x15&x{6\xd9\xbd;\ \x05\x10\x11\x11\xd1R{\x99\x0b\xe8\xd7\x13i\xe3EK\ S?\xbd\xfc\xc6\xcb`\x9e7\x8f\xe0\xed\xc7\xb1c)\ \x80\x88\x88\x88\x16\xfa\xb2X`.\xa0\x9fA\xa4\x8d\x1f\ o\x9b\x18<\xeb\xbc\x0c\xe8!C\x08\xdd~<\xfbl\ \x8a \x22\x22\xa2\x85n7\x17\xce\xf5\xc3\x93\xe5\xc4\xd9\ \xf8\xf1?\xb6\xb4[L\xd5\xabG\xe8\xf6\xe3\xc6\x8d\x14\ ADDD\x0b\x1dd.\xa0?G\x94\x8d'\x93M\ \x0c\xa0\xea\xe2\x9b^\x06\xf5\xf2\xe5\x04o?\xd6\xafO\ !DDD\xb4\xc8\xdf\x89\x85\xe6\x02\xfaJ\xa2l<\ \xa9'~nb\x10Uz\x19\xd8\xc7\x1fO\xe8\xf6a\ \xaagO\x8a!\x22\x22\xa2E\xae5\xdb^\xb1\x0bQ\ 6\xbee\xd5e\xd1\xf1\xe3\x09\xdf^\x1c2\x84\xa2\x89\ \x88\x88h\xc0af\x03\xfa\xcd\xc4S\xd0l15\xe8\ N\xf72\x11\xf4\xcepe%\x01\xfcP\xce\x9bG\xd1\ DDD\x0c\xd8\xfb\xcd\xb6V\xd4\x0e'\x9a\x82\xa6\xab\ \xa9AWC|\xcd\xcb\x84\x98=\x9b\x00~\xa8v\x8b\ ;w*\xa7zu\x8a'\x22\x22b\x80\x9el6\x9c\ \xbf\x97\xa0\xf79\xec\xc7s\xa6\x06\xdfj/\x13\xa2U\ +B\xb8\x07\x93\xfa\x05V\x8a'\x22\x22b \xfeF\ ,4\x1b\xd0W\x12Ia\x7f\xce75\xf8\x8e\x10\xf7\ x\x99\x18\x8b\x17\x13\xc2\x0f\xe5\x8c\x19\x14PDD\xc4\ \x80\x9ci6\x9c\xffKlL$\x85\xfdi$~f\ j\x10^\xe5\xa5\xa3\x8b\xde\x1d&\x84\x1f\xdc-[\x94\ SXH\x11EDD\xcc\xb2/\x8a%f\x03\xfa\xf7\ \x89\xa3p ~jj\x10v\xf729\x0a\x0a\x94s\ \xd9e\x84\xf0C\x1ds\xe9\xd0\x81B\x8a\x88\x88\x98e\ \x17\x9a\x0d\xe7\xda>DQ8\x10\xa3L\x0e\xc4;\xbc\ L\x90\xc1\x83\x09\xe1\x87r\xf2d\x0a)\x22\x22b\x16\ \xd5\x0d-j\x99\x0d\xe7O\x11C\xe1\x9b\xd0\xb7\x86\xdf\ 25\x18\x8f\xf70AR\xd5\xaa\xf1p\xd1\xa1\xba\xb9\ \xac_\xaf\x9c\xbc<\x0a*\x22\x22btw\xcf\xa7\x12\ C\xe1`\x5cdj0\x16\x88\x8fy9\x8b~\xdcq\ \x04\xf1C\xd9\xae\x1d\x05\x15\x11\x111\x0b\xbe,\xd64\ \x1b\xce\xff \x16\x13A\xe1`4H\xa4\x9f\x9852\ (O\xf52Y\xd8E?\xf4.:\xc7\x5c\x10\x11\x11\ \xb3\xe2|\xf3\xbb\xe7k\x89\x9f\xe0\x85\x1bM\x0d\xca\x22\ \xf1I/\x13\xe6\xf8\xe3\x09\xe2\x07S\x7f\x81\xd1\x97j\ )\xac\x88\x88\x88U\xea\xdcRj6\x9c\xebM\xd1&\ DO\xf0B?\x93\xdf\x1c\xa7z\x994\xa5\xa5*\xb9\ u+A\xfc`v\xecHqEDD\xac\x82s\xcd\ \xef\x9e_M\xec\x04?\xbd\xdf\xed.g8\xa0\xf7 nB\ &\x9cor\xa0N\xf62\x89\xf4\xb3\xf6k\xd6\x10\xc4\ \xbf\xc9\xb3\xce\xa2\xd0\x22\x22\x22\xfa\xb4\xbf\xf9p\xfe\x0b\ b&dJm\xf1C\x93g\xd1\x1f\xf72\x91\xfa\xf6\ %\x88\x7fS\xbb\xc5\x8a\x0a\x95\xacY\x93b\x8b\x88\x88\ \xe8\xd1[\xcd\x87s\xedq\xc4L\xa8\x0a;L\x0e\xd8\ \x09^&\x93n'\xb8b\x05\x81\xfc\x9b\x1c<\x98\x82\ \x8b\x88\x88\xe8\xc1\xa4\xd8\xd5|8\x7f\x8ax\x09U\xa5\ \x95{\xcb\xd8\xc8\xa0\xcdw\xcf\x81\x1djB\xa5:u\ \x22\x88\x7f\x93\x17_L\xd1EDD\xf4\xe0\x15\xe1\xec\ \x9e\x9f@\xbc\x84lp\x83\xc9\x81;\xd2\xe3\xa4J\x9d\ {.a\xfc\x9b<\xec0\x0a/\x22\x22\xe2A|K\ lb>\x9c?I\xac\x84l\xd1A\xfc\xc2\xe4\x00\xbe\ \xc3\xcb\xe4j\xdcx\xdf\x99k\x02\xf9\x01<\xf9d\x8a\ /\x22\x22\xe2A\x05\x18\x11\x11\xf1k>\x9a0\xfe\ (\x91\xf6A\xe2$d\x9b\x8e\xa6w\xd1\xb7{9\xe6\ R\xbb\xb6r\xb6m#\x94\x1f\xe8e\xd1\xa3\x8e\xa2\x08\ #\x22\x22\x1e\xc0\x11\xe1\xec\x9e\x0f%NB\x10\xdca\ r \xebsao{\x99hC\x87\x12\xc8\x0f\xe4\x82\ \x05\x14aDDD;\xda*>L\x8c\x84\xa08J\ \xfc\xd2\xe4\x80>\xdf\xcbd\xcb\xcfOw.!\x94\x7f\ \xd5\xcaJ\x95l\xd4\x88b\x8c\x88\x88\xb8\xdf\xc5\xd0\xc3\ \xcd\x87\xf3/\xdc\x0c\x05\x10\x18w\x9b\x1c\xd45\xc4\xe7\ \xbcL\xbaV\xad\xf6\x05R\x82\xf9\xff;\x8b>~<\ \x05\x19\x11\x11\xd1\xf5\x82pv\xcfo#>B\xd0\xf4\ 0\xbd\x8b>\xc9\xeb\xc4\x9b:\x95P\xfe\xff\xdd\xb4I\ %\x0b\x0b)\xca\x88\x88\x98\xf3>,V3\x1f\xce?\ \x15\xdb\x12\x1f\xc1\x047\x99\xfe\xf6y\x9b\x97\xc9W\xab\ \x96r\xb6l!\x94\xff\x7f\xbbw\xa70#\x22bN\ \xab;\xc3u\x0fg\xf7|;\xb1\x11L\xd1\xd6\xfdF\ hl\x80\xb7\x13w{\x99\x84\x83\x06\x11\xc8\xff\xbf\xe7\ \x9dGqFD\xc4\x9cvc8\xe1\xfc\xcfb]b\ #\x98\xe4;\xa6\x07\xfae^&a^\x9er\xe6\xcf\ '\x94\xf3\xb2(\x22\x22\xe2>_\x10\xeb\x86\x13\xd0\x97\ \x13\x17\xc14-\xc4\x7f\x99\x1c\xe8\xb5\xc4\xdfy\x99\x8c\ \x8d\x1a\xa9\xd4\x8e\x1d\x84\xf2\xfd=\xe3\x0c\x8a4\x22\x22\ \xe6\xa4'\x86\x13\xce\xf7\x8a\xa5\xc4E\x08\x83]\xa6\x07\ \xfc)^'\xe4\x88\x11\x84\xf2\xfd\xbb\xb9\xe8/,\xa5\ \xa5\x14jDD\xcc)\xaf\x0e'\x9ckO'&B\ X4\x12?0=\xe8o\xf60!\x93\xba7\xfa\x92\ %\x84\xf3\xfdC\xba\xfe\xd2B\xb1FD\xc4\x1c\xf1%\ \xb1A8\xe1\xfc\x111\x8f\x98\x08a\xb2\xd8\xf4\xc0?\ L|\xc3\xcb\xe4l\xde\x5c\xa5**\x08\xe7\xffv\xf5\ \xea\xf4\x19}\x8a6\x22\x22\xe6\x80#\xc2\x09\xe7\xba\x89\ \xc6\x91\xc4C\x08\x9b\xea\xe2{\xa6'\xc0\x5c\xaf\x13t\ \xcc\x18\x82\xf9\xfe\xbb\xe8]\xbbR\xb4\x11\x111\xf6^\ \x1f\xde\xd1\x96+\x89\x86`\x0b\x93MO\x80B\xf1^\ \xafG].\xba\x88p\xee\x9a\x5c\xb8\x90\xc2\x8d\x88\x88\ \xb1\xf6E\xb1Qxm\x15\xeb\x13\x0b\xc1\x16\xf49\xab\ 'MO\x84.\xe2\x1e/\x93\xb5qc\xe5\xd0\xd5\xe5\ \xbf\xb6hA\x01GD\xc4\xd8:*\xbc\xdd\xf3yD\ B\xb0\x8d\xfe\xe2\x97\xa6'\xc3R\xaf\x13v\xf8p\x82\ \xf9\xbf\x8f\xb9\xcc\x9cI\x01GD\xc4X\xba-\xbcp\ \xfe\x94X@\x1c\x04\x1b\xb9\xd9\xf4\x84(\x12\x7f\xe5\xf1\ \xa8K\xea\xc2\x0b\x09\xe8\xda]\xbb\x94S\xa7\x0e\x85\x1c\ \x11\x11c\xe5\x13bY8\xe1\xfcs\xb1;1\x10l\ \xa5\x5c\xfc\xab\xe9\x89\xd1F|\xc7\xcb\xe4\xad[W9\ \x9b7\x13\xd0\xb5\x13&P\xcc\x11\x1116\xee\x16\xbb\ \x86\xb7{\xbe\x99\x08\x08\xb6\xb38\x8c\xc91\xdf\xeb$\ >\xfah\xc2\xb9\xbe,\xbau\xabrJJ(\xea\x88\ \x88\x18\x0b/\x0e/\x9c\xeb\x17Ck\x12\xff\xc0v\xf4\ \xf9\xab\xdf\x9a\x9e \xf9\xe2\x8f=N\xe2}g\xb0\x09\ \xe9\xca\x19:\x94\xa2\x8e\x88\x88\x91\xf7.\xb7\xbb[H\ \x01\xfdx\xa2\x1fD\x85\xa1aL\x92\xd6\xe2\xdb^&\ sq\xb1J\xad\x5c\xc9e\xd1\x0d\x1b\x94STDq\ GD\xc4\xc8\xaa\x1f.l\x19^8\xff\x19\x91\x0f\xa2\ \xc6\x0f\xc3\x98,g{\x9d\xd4\xadZ\xf1\xca\xa8>\xea\ \xd2\xaf\x1f\x05\x1e\x11\x11#\xeb\xc4\xf0\xc2\xf9\x07b3\ \xe2\x1eD\x8d\xa6\xe2\x87a\x1cu\xb9\xcd\xeb\xc4\x1e2\ \x84\x80\xbev\xadr\x0a\x0b)\xf2\x88\x88\x189w\x86\ \x17\xce\xb5g\x11\xf5 \xaa,\x0ac\xd24\x11_\xf1\ :\xc1\xa7M\xe3,z\xdf\xbe\x14zDD\x8c\x94\x8f\ \x8a\xa5\xe1\x85\xf3\xfb\x12\xe9G\x1a\x01\x22I\xa1\xf8L\ \x18\x93g\xb4\xd7I^\x5c\xac\x9c\xe5\xcbs\xfb,\xfa\ \xea\xd5\xfb\xfa\xc4S\xf0\x11\x111\x0a\xea\xfbfG\x86\ \x17\xce\xff.\xb6$\xe2A\xd4\xe9 ~\x12\xc6$Z\ \xefu\xb2\x97\x97+G\xb7\x1d\xcc\xe5]\xf4c\x8e\xa1\ \xe8#\x22b$\x1c\x1b\xee\xd1\x96\xd9D;\x88\x0b\xeb\ \xc2\x98D5\xc4\x87\xbdN\xf8\x1e=r;\xa0\xeb_\ \x11\xf2\xf2(\xfc\x88\x88h\xb5\x97\x87\x1b\xce\x1f\x14\xf3\ \x89u\x10\x17\xaa\x8b\xaf\x851\x99:xm\xbd\xa8\x9d\ 4)\xb7Cz\xb7n\x14\x7fDD\xb4\xd6{\xc5\xe2\ p\x8f\xb6\xb4&\xd2A\xdc\x18(~\x11\xc6\xa4:\xd5\ \xeb\xe4/(P\xce\xa2E\xb9\x1b\xd0\x97.e\x17\x1d\ \x11\x11\xad\xf4U\xb1Y\xb8\xbb\xe7\xb3\x88r\x10W\xae\ \x08kb\xed\xf4Z\x04\xea\xd6U\xa9M\x9br\xf7\xc2\ h\xa7N,\x04\x88\x88h\x95Iqx\xb8\xe1\xfc\xa7\ D8\x883e\xe2\xdba\x9dG\x7f\xd0k1h\xdf\ ^9\xb9\xfa\x88\xd1\xe2\xc5,\x06\x88\x88h\x95\x8b\xc3\ \x0d\xe7\xbf\x17\x1b\x12\xe1 \xee\x0c\x0e\xeb\xa8K{?\ \xe7\xd1\xc7\x8c\xc9\xdd]\xf46mX\x10\x10\x11\xd1\x0a\ \xbf\x9bH?B\x18b@?\x91\xe8\x06\xb9\xc2\xce\xb0\ &\xda\x04\xafE!/O%\xa7O\xcf\xcd\x90\xbe`\ \x01\x8b\x02\x22\x22\x86\xeeCb\xcdp\xc3\xf9\xd5D6\ \xc8%j\x88o\x845\xe1\xd6x-\x0e\xd5\xaa)\xe7\ \xe2\x8bss\x17\xbdeK\x16\x07DD\x0c\xcd\xd7\xc4\ \xd6\xe1\x86\xf3\xb7\xc4R\x22\x1b\xe4\x1a\xfd\xc3:\xeaR\ $\xfe\xc4k\x91\xa8UK9\x97]\x96{!\xfd\x82\ \x0bX \x10\x111\x14\xf7\x8a\xc7\x85\x1b\xce\xff%\xf6\ $\xaaA\xae\xb2)\xac\xc9\xd7H|\xdek\xb18\xfc\ p\xe5l\xdfNG\x17DDD\x03.\x087\x9ck\ \x17\x13\xd1 \x97\xd1\xafq=\x10\xd6\x04\xec$\xbe\xe3\ \xb5`\xe8G|*+s+\xa4/[F_tD\ D4\xea\xc6\xf0\xc3\xf9O\xc4<\x22\x1a\xe4:\xfaU\ \xae\x0f\xc3\x9a\x883|\x14\x8d\xd4\xc8\x91\xb9w\xd4\xa5\ G\x0f\x16\x0cDD4\xa2>~Z-\xdcp.\xff\ \x18\x89FD3\x804g\x86\xf9my\x87\x9f\x90~\ \xc6\x19\xb9\x15\xd0W\xaeL\xbf\xb0\xca\xc2\x81\x88\x88\x01\ \xfa\xb8X/\xdcp\xae\xef\xc5\x0d#\x92\x01|\x95\x9b\ \xc2\x9a\x94\xfa\xdb\xfaO\xbd\x16\x11\x1dV\xcf??\xb7\ B\xfa\x80\x01,\x1e\x88\x88\x18\x98\xaf\x84\xdf\xb1E\xbb\ \x9e(\x06\xf0u\xea\x88\xef\x8551\xeb\x8bOz-\ &\xa5\xa5*\xb5zu\xee\x5c\x16]\xbf^\xa5t\xcb\ I\x16\x11DD\xcc\xb2\xbb\xc5\xfe\xe1\x87\xf3\x87\xc4B\ \xa2\x18\xc0\x81\x19 ~\x1e\xd6\x04\xd5/\x8d\xbe\xee\xa3\ \xb3Kr\xeb\xd6\xdc\xd9E\x1f:\x94\x85\x04\x11\x11\xb3\ \xee\xa9\xe1\x87\xf3\x94\xd8\x84\x08\x06pp\x96\x879Q\ \xfb\xb8\xdf\xe6=\x15\x966m\x94\xb3cGn\x04\xf4\ \xcb/WN\x8d\x1a,&\x88\x88\x985\x17\x85\x1f\xce\ u\xbf\xf3\xdeD/\x80CS \xfe:\xcc\x09;\xcb\ \xcf\xa5\xd1\xae]U\xaa\xa2\x227B\xfa\x981,(\ \x88\x88\x98\x15\xaf\x11\xf3\xc3\x0f\xe8\x17\x11\xbb\x00\xbc\xd3\ P\xdc\x1b\xe6\xa4]\xe3\xa7\xd0\xe8K\x94\xb9\x10\xd0\xb7\ oW\xc9\x9a5YX\x10\x11\xb1J\xde\x96H\xbf\xea\ \x1dr8\xbf\x91\xb8\x05\xe0\x9f\xe3\x12\xe9\x96G\xa1L\ \x5c]8n\xf1SpN8!7B\xfa)\xa7\xb0\ \xb8 \x22b\xc6>\x95H\xbf\xe6\x1dr8\x7fS\xac\ M\xd4\x02\xc8\x8c\xd5aN`\x99\xb9\xea\x11?\x85G\ \x87\xd7\xb8\x07\xf4\x9d;\x95\xd3\xa0\x01\x8b\x0c\x22\x22\xfa\ \xf65\xb1C\xf8\xe1\x5c?\x8e\xd8\x89\x88\x05P\xb5\xf3\ \xe8\xf7\x879\x91[\xba\xfdY\xbd\x14\x9ed~\xber\ \xe6\xce\x8d\x7fH\x9f:\x95\x85\x06\x11\x11}\xf9\x8e\xd8\ ;\xfcp\xfe\xa58\x9ex\x05Pu\x1a$B\xec\x8f\ \xae\xed'\xbe\xeb\xb5\x08\x15\x16*g\xfe\xfcx\x07\xf4\ \xcaJ\xe5\xb4j\xc5\x82\x83\x88\x88\x9e\xdc#\x0e\x0f?\ \x9c+\xf7\x97y\x00\xc8\x12=\xc4\x8f\xc3\x9c\xd4'\x88\ \xef{-F\xd5\xab+\xe7\xe2\x8b\xe3\x1d\xd2\x17/V\ N^\x1e\x0b\x0f\x22\x22\x1e\xfc\xd7eq\x92\x1d\xe1\xfc\ \x0e1\x9fH\x05\x90]&\x87=\xb9Ov\x0b\x8d\xa7\ \xa2T\xbb\xb6r\xd6\xac\x89uHOv\xef\xce\xe2\x83\ \x88\x88\x07u\x9a\x1d\xe1\xfc\x05\xb1\x8c(\x05\x10\x0cW\ \x85=\xc9\x17\xf9\xe9\x91\xde\xa4\x89Jm\xda\x14\xdf\x90\ \xbejU\xfaH\x0f\x0b\x10\x22\x22\x1e\xc0\xe5v\x84\xf3\ \xbf\x88\xed\x89P\x00\xc1Q(>\x14\xf6d_\xe5\xa7\ @\x95\x97\xab\xd4\xc6\x8d\xf1\x0d\xe9#F\xb0\x08!\x22\ \xe2\xd7\x5ccG8\xd7\xc7c\xfb\x13\x9f\x00\x82\xe7p\ \xf1\x0faN\xf8\x02\xf1:?\x85\xea\xb0\xc3\x94\xb3y\ s<\x8f\xb9l\xdd\xaa\x9cZ\xb5X\x8c\x10\x11\xf1?\ ^/\x16\xda\x11\xd0g\x10\x9b\x00\xcc1D\xfcW\x98\ \x93\xbeX\xfc\x89\x9f\x82u\xc4\x11\xca\xb9\xfc\xf2x\xee\ \xa2O\x9e\xcc\x82\x84\x88\x88\xfb\xfc\xb1\xbbFZ\x10\xce\ 7\x10\x97\x00\xcc3)\x91\xeeg\x1a\xda\xe4/\x13\xef\ \xf5S\xb8Z\xb6T\xce\xb6m\xf1\x0b\xe8\x15\x15\xcai\ \xda\x94\x85\x09\x111\xc7\xbdS,\xb1#\x9c\x7fO\xcc\ #*\x01\x84\xc3\xba\xb0\x8b@}\xf1Q?\x05\xac}\ {\x95\xda\xb1#~!}\xc1\x02\x16'D\xc4\x1c\xf6\ !\xb1\xae\x1d\xe1\xfc\xd7b5\x22\x12@x\xe8\x97F\ \xef\x0c\xbb\x18\xb4\x11_\xf6S\xc8:vT\xa9\x9d;\ \xe3\x17\xd2;wf\x91BD\xccA\x9f\x15\x9b\xd9\x11\ \xce\xdf\x13\x1b\x13\x8f\x00\xc2\xa7D\xfcM\xd8E\xa1\xab\ \xf8\x86\x9f\x82\xd6\xad\x9brv\xed\x8aU@O\xadX\ \xa1\x9c\x82\x02\x16+D\xc4\x1cR\x16`u\x18\xed\x14\ \x01\xe0\x004\x17\x7f\x1fvq8.\x91~\xce\xd8s\ a;\xfah\x95\xd2\xe7\xb7\xe3\xb4\x8b>x0\x0b\x16\ \x22b\x8e\xf8\x82\xd8\xd6\x8ep\xfe\x998\x8a8\x04`\ \x1fG\x8b\xff\x08\xbbH\x8c\xf2\x19\xd2S\x03\x07*\xa7\ \xb22>\x01]\xf7|/)a\xe1BD\x8c\xb9\xcf\ \x8b\xad\xec\x08\xe7\xb4S\x04\xb0\x9c\x09\xe2\x17a\x17\x8a\ \x13\xc5\xf7\xfd\x14\xbac\x8eIwB\x89\xcbQ\x97\xd3\ Nc\xf1BD\x8c\xb1/\x89\x1d\xed\x09\xe7\xb4S\x04\ \x88\x00\xcbm(\x18\xa7\x8a{\xfd\x14\xbc\x1e=\xe2s\ \xdcE\xff\x22\xd0\xa2\x05\x8b\x18\x22b\x0c}E<\xd2\ \x9ep\xfe\xc3\x04\xed\x14\x01\x22\x81\x9e\xa8\xb7\xdaP8\ \xe6\xf9-|q\x0a\xe9K\x96('/\x8f\xc5\x0c\x11\ 1F\xbe)\xf6\xb4'\x9c?%\x96\x11{\x00\xa2C\ u\xf1q\x1b\x0a\xc8\x1c\x9f\xc5/\xd9\xbd{|B\xfa\ \x80\x01,h\x88\x881Qw*\xebaO8\x7f^\ \xacM\xdc\x01\x88\x1eM\xc5wm($\xcb\xfd\x16\xc2\ \xa3\x8f\x8eG\x0b\xc6\xcd\x9bU\xb2\xac\x8c\x85\x0d\x111\ \xe2\xcab\xaa\x06\xd9\x13\xce\xdf\x17\x9b\x11s\x00\xa2K\ +1eCA\xb9\xc4\xefN\xfaQG\xc5#\xa4\x9f\ q\x06\x8b\x1b\x22b\x84}G\x1chO8\xd7kz\ k\xe2\x0d@\xf4\xe9\x22\xfe5\xec\xa2\x92'\xae\xf7[\ \x18;w\x8e\xfe\x8b\xa3\xfa\xc2h\xcb\x96,r\x88\x88\ \x11\xdd9\x1flO8\xd7kyWb\x0d@|8\ ^\xfc4\xec\xe2R ^\xe1\xb7@v\xea\xa4\x9c\x1d\ ;\xa2\x1d\xd2\x97.UN~>\x8b\x1d\x22b\x84\xd4\ oz\x8c\xb5'\x9c\xffK\x1cA\x9c\x01\x88\x1f\xa7&\ ,\xe8\x91\x9e\x9fAHO\xc5!\xa4\xf3\xc2(\x22b\ \xa4v\xce\x8f\xb5'\x9c\xebWB\xc7\x12c\x00\xe2\xcb\ E6\x14\x9b\x22\xf1\x1a\xbf!\xbdk\xd7h\x1fw\xd9\ \xbcY9\x5c\x18ED\xb4\xde\xdd\x89\xf4\xab\xd8\x09{\ <\x87\xf8\x02\x10\x7f6\xd8Pp\xf4q\x97\xed~C\ z\x9b6\xca\xd9\xb2%\xba!\xfd\xcc3Y\xfc\x10\x11\ -\xefs\xde\xd7\xaep\xbe\x94\xd8\x02\x90\x1b\xe8\x87\x8c\ \xae\xb5\xa1\xf0\xe8\x8b\xa3\x1b\xfc\x16\xd0#\x8eP\xa9M\ \x9b\xa2{a\xb4m[\x16ADDK\xc3y\x1f\xbb\ \xc2\xf9\x16\x22\x0b@nQ \xdenKH\xf7\xdd\xdd\ \xa5qc\xe5\xac[\x17\xcd\x90\xbe|\xb9r\x0a\x0aX\ \x0c\x11\x11-{\x84\xa8\x97]\xe1\xfc:wC\x0d\x00\ r\x8c\x9a\xe236\x14\xa2\xfc\x0c\x8e\xbb8\xe5\xe5\xd1\ \x0d\xe9C\x87\xb2 \x22\x22Z\xe2[b\x7f\xbb\xc2\xf9\ \xbdb5b\x0a@\xeeR_|\xc5\x96\x9d\xf4\xb5~\ \xcf\xa4\xd7\xae\xad\x92\x97\x5c\x12\xb9\x80\x9e\xd2\x1di\x1a\ 6daDD\x0cYY\x00UW\xbb\xc2\xf9\xcf\x09\ \xe7\x00\xa0\xd1\xaf\x8d:\xb6\x84\xf4M~\x0bli\xa9\ r.\xbc0z\xbb\xe8\xe7\x9f\xaf\x9c\xbc<\x16HD\ \xc4\x90|]\xeciW8\x7fL,#\x96\x00\xc0\xbf\ i#&m)RK\xfd\x16\xda\x92\x12\xe5,Z\x14\ \xbd\x9d\xf4>}X$\x11\x11C\xf0%\xb1\x93]\xe1\ \xfc!\xb1\x06q\x04\x00\xfe?G\x89\x7f\x89\xecq\x97\ j\xd5\x94s\xee\xb9\xd1\xeb\x8d^\xb3&\x8b%\x22\xa2\ A_\x15\xbb\xd9\x15\xce\x9f\x17\xeb\x12C\x00\xe0\x9b\xe8\ %~`KH_\x95IH\x9f7/R!=9\ u*\x0b&\x22\xa2\xc1\x9ds\xcb\xce\x9c\xbf(6 \ ~\x00\xc0\xa1\x18(~dK\xf1Z\xee\xb7\x00\xe7\xe7\ +\xe7\xf4\xd3\xa3\xb5\x93\xde\xa5\x0b\x0b'\x22b\xc0>\ /\xb6\xb3+\x9c\xbf*\x96\x13;\x00\xc0+\xfd\xc4\xbf\ \xdbR\xc4f\x88I?\x85X_\xbe\x1c=::\xbb\ \xe8k\xd7*\xa7\xb8\x98\x05\x14\x111 \x1f\x11\x0f\xb3\ +\x9c\xbf$6$n\x00\x80_\x8e\x13?\xb6\xa5\x98\ M\x11\xf7\xfa-\xcaC\x86\xa4_\xef\x8cBP?\xf9\ d\x16QD\xc4\x00\xfc\x95\xd8\xc0\xaep\xfe\x0a;\xe7\ \x00P\x15F\x89\x9f\xd8R\xd4N\x12w\xfb-\xce\xbd\ z)g\xd7.\xfb\x03\xba\xfe\x22\xd1\xb2%\x8b)\x22\ b\x16\xbdS\xaceW8\x7f[<\x9cx\x01\x00U\ e\x82\xf8\x99-\xc5m\xb8\xf8\xae\xdf\x22\xdd\xb9\xb3r\ \xb6o\xb7?\xa4\xebG\x97\x0a\x0aXT\x11\x11\xb3\xe0\ Mb\x0d\xbb\xc2\xb9,_\x89f\xc4\x0a\x00\xc8\x16s\ \xc4/m)r#\xc4\xf7\xfc\x16\xeb\x16-\xd2m\x0d\ m\x0f\xe9#F\xb0\xb0\x22\x22V\xd1\x1f\x88%v\x85\ \xf3?\x88\x1d\x89\x13\x00\x90m\xce\xb3\xa8\xd0\xa9\x81\xe2\ [~\x8bv\x93&\xcaY\xb7\xce\xee\xc7\x8bv\xeeT\ Ny9\x0b,\x22b\x86^#\x16\xd9\x15\xce\xffW\ \xecN\x8c\x00\x80\xa0\xb8\xd8\xa6\x90\xae\x9fh~\xcdg\ \xe1N6j\xa4\x9c5k\xec\xdeE\xd7\x0f.\xe9N\ 4,\xb4\x88\x88\xbe\xdc.\x16\xd8\x15\xce\xff(v#\ >\x00@\xd0\x5chSH\xef\xe2><\xe1\xebA\xa3\ :uTR\x9f\xf7\xb6\xb9\xf5b\xbf~,\xb6\x88\x88\ >\xd4/P\xe7\xd9\x15\xce\x7f/v&6\x00\x80)\ \x16&,:\x93\xde\xce}\x80\xc2W1/.V\xa9\ s\xce\xb17\xa4o\xdf\xae\x92\x0d\x1a\xb0\xe8\x22\x22z\ \xf0B\xbb\x82\xb9V\xfe\xb18s\x0e\x00\xe6\x99%~\ aK1\xd4\x0fP<\xe6\xb7\xa8\x17\x16\xaa\xe4\xf4\xe9\ \xf6\x86\xf4\xf3\xce\xe3\xa8\x0b\x22\xe2A\xdc#\x9ej_\ 8\xd7\xad\x14\x9b\x13\x13\x00 ,\xe6\xd9\xb4\x93\xdeD\ |\xd8o\x81\xd7\x01\xf8\xa4\x93\xec\xbd4:p \x8b\ 0\x22\xe2\x01\xd4\xefb\x9cl_8\x97\xef\x0c\x896\ \xc4\x03\x00\x08\x9b\xc9\x09\x8b\xfa\xa4\xeb\x07)~\x92I\ \xb1\x1f:\xd4\xceWGu\xffv\x8e\xba \x22~\xc5\ \xd7\xc5\xfe\xf6\x85\xf37\xc5#\x88\x05\x00`\x0b\xa7\xda\ \x14\xd2\xab\x89\xd7fR\xf4{\xf6T\x8ensh[\ H_\xb0\x80\xa3.\x88\x88\xae/\x8a\xdd\xec\x0b\xe7/\ \x8b\x8d\x89\x03\x00`\x1b\x93l\x0a\xe9\xba\xcd\xd6\xd6L\ \x8a\x7f\xfb\xf6\xca\xd9\xba\xd5\xbe\x90\xde\xbf?\x0b3\x22\ \xe6\xbcO\x8bm\xec\x0b\xe7\xf2\x9d!QN\x0c\x00\x00\ [\x99(~jK\xd1\xd4\xed\xb6\x96g\xb2\x084m\ j\xdf\x83F\xf2\xa5!U\xaf\x1e\x0b4\x22\xe6\xac\xf7\ \x8b\xe5\xf6\x85\xf3\x17\xc4F,\xff\x00`;'\xdb\x14\ \xd2\xb5\xb3\xf4\x03E~\x17\x83\xfa\xf5\x95\xb3b\x05G\ ]\x10\x11-\xf0.\xb1\x8e}\xe1\xfc\xb7bC\x96}\ \x00\x88\x0aV\x9dI\xd7N\x17\xf7\xfa]\x14JK\x95\ \xb3h\x91]!\x9d\x07\x8c\x101\xc7\xbc\xddm\x00`\ Y8\x7fZl\xc0r\x0f\x00\x1cw\xa9\xa2c\xdd\xb6\ \x5c\xbe\x16\x87\x92\x92\xf4\xce\xb5-\x01}\xf3f\x95\xaa\ ]\x9bE\x1b\x11s\xc2\x1b\xc4\xea\xf6\x85\xf3\x87\xc5Z\ ,\xf3\x00\x10UN\x12?\xb1\xa9\xb0\x0e\x12\xdf\xf4\xbb\ H\xe4\xe7\xab\xd4i\xa7\xd9\x13\xd2\xe7\xcf\xe7\xa8\x0b\x22\ \xc6\xde\x1db\xa1}\xe1\xfc\x1e\xb1\x06\xcb;\x00D\x9d\ \xe1\xe2?l*\xb0G\x89/e\xf2\xa0\xd1\x981\xf6\ \x84\xf4^\xbdX\xc0\x111\xb6\xaer/\xfa[\x16\xce\ o\x17\x8bY\xd6\x01 .\xf4\x17\xffjS\xa1m\xe3\ \xb6\xeb\xf2\xbdp\xe8`lC\xaft\xfd\x80Q\xc3\x86\ ,\xe4\x88\x18+\xf5\x85\xfey\xf6\x05s\xed\x8db!\ \xcb9\x00\xc4\x8d\xa3\xc5?\xdaTp\x1b\x8a\xf7f\xda\ +}\xcb\x96\xf0C\xba\xbe\xc0\x9a\x9f\xcf\xa2\x8e\x88\xb1\ P\xdf\x11\x9ahg8\xff\xb6\x98\xcf2\x0e\x00q\xa5\ \xa5\xf8\x96M\x85\xb7\xc4\xbd\x84\xe4{1i\xd2D%\ \xd7\xae\x0d?\xa4\x8f\x18\xc1\xc2\x8e\x88\x91\xf75\xb1\x9f\ \x9d\xe1|\x09K7\x00\xe4\x02M\x12\xe9W\xd7\xac)\ \xc0\xfa\xd5\xd1M\x19,(\xfb\xba\xa9,]\x1an@\ \xdf\xb5K9\xcd\x9b\xb3\xc0#bd}Flo_\ 0\xffR<\x97%\x1b\x00r\x09\xfd\xea\xda\xf3\xb6\xed\ \x94\x9c\x93\xc9\xe2R\x5c\xac\x9cy\xf3B\x0d\xe9\xa9K\ /UNQ\x11\x0b=\x22F\xce\x87\xc5\xc3\xed\x0b\xe7\ _\x88sX\xaa\x01 \x17\xa9#>j[H?U\ \xdc\xe3\xf7R\x93>\x07>yr\xb8;\xe9\x13'\xb2\ \xd8#b\xa4\xfc\xa9X\xdb\xbep\xae\xdf\xef\x98\xcc\x12\ \x0d\x00\xb9\x8c\xee%{\xafm!}\x84\xf8v&m\ \x18G\x8fVNee8\x01]\xff\xe7\x1ey$\x8b\ >\x22F\xc2k\xc4j\xf6\x85\xf3\x8f\xc5\x13Y\x9a\x01\ \x00\xd2!\xfdn\xdbBz\x7f\xf7\xd2\x92\xef\x85\xa7O\ \x9f\xf4\xb9\xf00B\xfa\xbau\xca)-e\xf1GD\ \xab\xdd%\x16\xd9\x17\xce?\x12G\xb3$\x03\x00\xfc\x97\ j\xe2\x8fl\x0b\xe9\x1d\xc5\xe73Y\x80:tP\xce\ \xd6\xad\xe1\x84\xf4\x193\x08\x00\x88h\xad\xcb\xed|\x80\ \xe8/b?\x96b\x00\x80\x03\x87\xf4\x9bm\x0b\xe9\xfa\ \xf2\xd2C\x99,DM\x9b\xa6w\xb4\xc3\x08\xe9\xc7\x1c\ C\x10@D\xab\xdc+~\xcb\xce6\x8a\xf2\x8f\x96\xe8\ \xcc\x12\x0c\x00\xf0\xcd\xe8\x87 \xae\xb0\xad\x80\xd7\x15\xef\ \xcc\xa4\x0dc\x9d:\xcaY\xb6\xcc|@\xdf\xb2E\xa5\ \xea\xd5#\x14 \xa2\x15\xbe+\x8e\xb13\x9c\xbf&6\ g\xe9\x05\x00\xf0\xc6J\xdb\x0ayu\xf1\xbb\x99,N\ %%\xca9\xff|\xf3!}\xc1\x82\xf4\xc5U\xc2\x01\ \x22\x86\xe8\xabbo;\xc3\xf9\xd3bC\x96[\x00\x00\ \x7fL\x15?\xb3\xa9\xa0\xebs\x93\x8b2Y\xa4t\x8f\ \xf2\xd9\xb3\xcd\xf7G\x1f<\x98\x80\x80\x88\xa1\xf9\xa8\xd8\ \xdc\xcep\xfe\xb3D\xbaA\x01\x00\x00d\xc0\x18\xf1\x9f\ \xb6\x15\xf7Y\xeey\xca\x8c\xda0\x9a\x0c\xe8;w*\ \xe7\x88#\x08\x0a\x88h\xdc;\xdd\xe3\x81\x16\x86\xf3k\ \xc5\x02\x96W\x00\x80\xaa1H\xfc\x9bmE~T&\ \xbd\xd2\xb5}\xfb\xaaTE\x85\xd1WFS\xd5\xaa\x11\ \x18\x10\xd1\x987\x885\xec\x0c\xe7\x9b\xc4<\x96U\x00\ \x80\xec\xd0)\x91\xbeioU\xb1\xef.\xbe\x90\xc9\x02\ \xd6\xb1\xa3J\x1al\xc3\x98\xd2\xaf\x9c\x12\x1a\x10\xd1\x80\ \x92\x80U\x81}\xc1\xfcK\xf1<\x96R\x00\x80\xec\xd3\ R|\xc3\xb6\x90\xde\xdc=g\xe9{!k\xd5J9\ \x9b7\x9b{e\xb4S'\xc2\x03\x22\x06\xea9v\xee\ \x9a\xeb\xbbLg\xb2\x84\x02\x00\x04G\xb9\xf8\x9cm\x0b\ \x80>gyG&\x0bZ\xfd\xfa\xcaY\xb1\xc2LH\ \xbf\xfcrZ/\x22b \xee\x16O\xb53\x9c\xeb;\ LcX:\x01\x00\x82\xa7\x9e\xf8\x84m\x0bA\x99\xf8\ \x83L\x16\xb7\xd2R\xe5\x5cp\x81\x99\x90\xae\xdb=\xe6\ \xe7\x13(\x101\xab=\xceO\xb07\x9c\x9f\xc8\x92\x09\ \x00`\x8e\xd2D\xbaM\x96U\x0bB\xa1\xb85\x83\x05\ .YX\xa8\x9cY\xb3\xcc\x84\xf4\xe1\xc3\x09\x15\x88\x98\ \x15_\x11{\xd9\x19\xce\xff,\xf6c\xa9\x04\x000\x8f\ n\x93u\xb5\x85\x0b\x83Z\xa8C\xb7\xdf\xc5.?_\ %'M\x0a>\xa0\xef\xda\xa5\x9c\x16-\x08\x17\x88X\ %\x9f\x12\xdb\xda\x19\xcew\x8b\x1dY\x22\x01\x00\xc2\xc5\ \xbaWG\xb5\x93\xdcs\x99\xbe\x17\xbe\xa1C\xd3\x97:\ \x83\xec\xea\xb2z\xb5JU\xafN\xc8@\xc4\x8c\xfc\x95\ Xng8\x7fA<\x8ce\x11\x00\xc0\x0e\xa6\x88\x9f\ \xda\xb6X\xf4\x10_\xcad\x01<\xfah\xe5\xec\xd8\x11\ \xecN\xfa\x94)\x04\x0dD\x8cS\x8f\xf3_$\xd2\xc7\ \x1f\x01\x00\xc0\x22\x86\x89\x1f\xd8\xb6h\xb4\x10\x1f\xcfd\ !l\xdf^9[\xb6\x04\x1b\xd2{\xf4 p \xa2\ g7\xda\xd9\xe3\xfc\xdf\xaf\x83\x16\xb2\x0c\x02\x00\xd8I\ \x97\x84\x85\x0f\x1a5\x12\xef\xc9\xe4\xf2h\xb3f*\xb5\ qcp\x01}\xd3&\xe5\xd4\xaeM\xf0@\xc4\x83\xd7\ \x22{{\x9ckW%x\x1d\x14\x00\xc0z\xf4\x83F\ \xaf\xd9\xb6\x88\xd4p\x7f\x1a\xf6\xbd8\xea\x00\xbdlY\ p\xe7\xd1/\xbcP9\x05\x05\x84\x10D\x8cZ\x8f\xf3\ /\xc4\x05,y\x00\x00\xd1A\xf7J\x7f\xcc\xb6\x05E\ \xff4\xbc!\x93E\xb2\xa4$\xdd\xc3<\xa8\x9d\xf4\xb1\ c\x09\x22\x88\xf85\xdf\x10\x07\xd9\x19\xce?\x16'\xb0\ \xd4\x01\x00D\x0f+{\xa5kg\x89{\xfd.\x96\x85\ \x85*9}z0\x01]w\x8d\xe9\xd8\x91@\x82\x88\ \xff\xf1wb7;\xc3\xf9\xdf\xc4\xa1,q\x00\x00\xd1\ E\xf7J\xbf\xc6\xc6\x90>\xc6}\x81\xcf\xd7\xa2\x99\x97\ \xa7\x9c\xd1\xa3\x83\x09\xe9\xfa\xac;\xe7\xd1\x11Q|D\ lfg8\x7f_\xec\xcc\xd2\x06\x00\x10}\xf2\xc5m\ 6\x86\xf4c\xc573Y@\x87\x0c\x09\xa6W\xba>\ F\x93\x9fO@A\xcca\x7fio\x8f\xf3w\xc4\xf6\ ,i\x00\x00\xf1bQ\x22}\xa9\xc8\xaaE\xa7\x8b\xf8\ |&\x0bi\xb7n*\x15D\xaf\xf4\xe3\x8f'\xa4 \ \xe6\xa87\x8bev\x86\xf3g\xc5\xc6,c\x00\x00\xf1\ d\xac\xf8\x91m\x8bO\xb9\xbbk\xe5w1M\xb5l\ \x99n\x95\x98\xed\xf3\xe8\xba\x07;a\x05\x91\x1e\xe7v\ x\xa7X\x83\xe5\x0b\x00 \xde\x0c\x14\xffl\xdb\x22T\ [\xbc=\x93\x85\xb5aC\xe5\xacZ\x95\xdd\x90\xben\ \x9dr\xca\xca\x08-\x889\xe2r1\xcf\xcep\xfe]\ \xb1\x88e\x0b\x00 7\xe8\x90H\x9fg\xb4j1\xaa\ &^\x9b\xc9\x02[\xab\x96r\x96.\xcdnH\x9f7\ /})\x95\xf0\x82\x18\xeb\x07\x88\xe6\xda\xfb\x00\xd1\xba\ \x04\x0f\x10\x01\x00\xe4\x1c\xbaW\xfa\xc3\xb6-Jz\x17\ \xeb\x92L\x16\xdb\xe2\xe2t\xa8\xcefH\x1f6\x8c\x10\ \x83\x18S\xdf\x11G\xd9\x19\xcc?\x15\xcfd\x89\x02\x00\ \xc8]\x8a\xc5\x9bl\xdc=\xca\xa4WzRw`9\ \xfd\xf4\xec\x05\xf4]\xbb\x94\xa3\xcf\xb9\x13f\x10c\xe5\ Kb\x0f;\xc3\xf9\x07\xe2q,M\x00\x00\xa0\x7fB\ \xddhcH?\xde\xdd\xe5\xf2\xdd+}\xc2\x84\xec\x85\ \xf4\x95+U\xaazuB\x0dbL|Zlgg\ 8\xdf+veI\x02\x00\x80\xfd9/aa\x1bF\ \xbd\xcb\xf5b&\x0b\xf1q\xc7e\xafW\xfa\xcc\x99\x04\ \x1b\xc4\x18x\x9f\xbd=\xce_\x15[\xb2\x0c\x01\x00\xc0\ \x81\x18/\xfe\xd3\xb6\xc5\xab\x85\xf8X\x86\xbd\xd2\x9dl\ \xf5J\xe7<:b\xa4\xd5]\xa2j\xd9\x19\xce\x1fI\ \xa4\xef\x04\x01\x00\x00|#}\xc4?\xda\xb6\x885\x14\ \xef\xcedan\xdbV9[\xb6T9\xa0\xa7**\ \x94\xd3\xba5A\x071\x82^\xe5v\x89\xb20\x9c\xdf\ \x9aH\xdf\x05\x02\x00\x008$\xad\xc5\xd7m[\xccj\ \x887d\xf2\xa0Q\xd3\xa6\xe9\xde\xe6Y\xe8\x8f\x9e\xa4\ ?:b\xa4\x5cg\xef\x03DW\x88\x05,7\x00\x00\ \xe0\x87\xfa\xe2\xa3\xb6-jz\xa1\xdd\x90\xc9B]\xbf\ \xberV\xac\xa8zH_\xb0@9\xba[\x0c\xc1\x07\ \xd1\xfa\x1e\xe7\xb3\xec\x0c\xe6_&\xd2w~\x00\x00\x00\ 2\xa2\xa6x\xafm\x0b\x9c\xee\x95\xbe$\x93E\xbb\xb4\ T9\x8b\x16U=\xa4\x9fp\x02\x01\x08\xd1b\xdf\x17\ \xcf\xb43\x9c\x7f.\x9e\xc5\xd2\x02\x00\x00UE?3\ }\xbd\x85\x0b\x9d\x9a\x22\xee\xf1\xbbxW\xabV\xf5\x07\ \x8dtw\x98\x8e\x1d\x09B\x88<@\xe4\xc7\x8f\xc4\xb1\ ,)\x00\x00\x90M\xacl\xc38@|-\x93\x07\x8d\ \xce8\xa3j\x97F7mRN\x9d:\x04\x22D\x8b\ |A\xecfo\x8f\xf3.,#\x00\x00\x10\x04'\x8b\ \x1f\xdb\xb6\xf8u\x10\x9f\xc9\xe4A\xa3\xd1\xa3\xab\xb6\x93\ \xbex\xb1r\x0a\x0b\x09F\x88\x16\xa8[\xb16\xb7\xb7\ \xc7y\x0b\x96\x0f\x00\x00\x08\x92~\xe2\x9fl[\x04\xf5\ \xe3#\xbf\xcada\x1f5\xaaj\x0f\x1a\x8d\x1dK8\ B\x0c\xd9{\xdcV\xac\x16\x86sz\x9c\x03\x00\x801\ \x8e\x14\xdf\xb3m1,\x13\x7f\x98\xc9\x02\xdf\xb3\xa7r\ v\xed\xca\xfc<\xfaQG\x11\x92\x10C\xf2\xfbn\x0b\ V\x0b\xc39=\xce\x01\x00\xc08\x8d\xc5gl[\x14\ \x8b\xc4\x8aL\x16\xfa\xa3\x8fV\xa9\x9d;3\x0b\xe9\x9b\ 7+\xa7^=\xc2\x12\xa2a\xb7\x8a\x85v\x86\xf3\xca\ \x04=\xce\x01\x00 $J\xc5\x9f\xd9\xb68\xea6\x8c\ \x8b2y\xd0\xa8M\x9b\xcc_\x1d]\xb6L\xa5t\x87\ \x18B\x13\xa2\x11\x17\xb9s\xdd\xb2\xfa\xa3/\xd2\xd3\xe3\ \x1c\x00\x00BG\xef\x12}\xdb\xc2\x1d,59\x836\ \x8c\xfa\xd5\xd1\xd4\xfa\xf5\x99\x85\xf4\xe9\xd3\x09N\x88\x01\ \xbbW\x9ci\xe7\xae\xf9\xa7\xe2T\x96\x04\x00\x00\xb0\x85\ e\xdb\xe2\xaa\xfb&_\xe17,\ \xe4\xe5)g\xc2\x04\xff\x8f\x18u\xeaD\xd0B\xcc\xc0\ \x1f\x8b\xb5\xec\x0c\xe7\xdf\x13\x8b(\xef\x00\x00\x10e\xf4\ Kz7\xd9\xb6\xc8f\xd4+]\x87\xf4\xf1\xe3\xfd]\ \x1a\xdd\xb4I9u\xeb\x12\xb8\x10}\xf8m\xf7\xd11\ \x0b\xc3\xf9\x12J:\x00\x00\xc4\x05\xdd\x86q\x93\x85\x8b\ \xad\x9a\xe1\xf6U\xf6\x15 \x86\x0f\xe7\x11#\xc4\x80\x5c\ i\xe7\x03D\x9f\x893(\xe5\x00\x00\x10G\xf4\x0b{\ _\xd8\x16\xd2\x8f\xcf\xa0Wzj\xe0\xc0\xf4\x11\x16\xaf\ !}\xda4\xc2\x17\xe2!<\xc7\xce]\xf3\x7f\x8ac\ )\xdf\x00\x00\x10g&\xb8\x0b\x9eU\x8bp?\xf15\ \xbf\x81b\xd0 \x7f!\xbdwoB\x18\xe27\xbc\x0e\ :\xcd\xcep\xfe'\xb17e\x1b\x00\x00r\x81\xbe\xee\ \xc2g\xd5b\xdcA|\xceo\xb8\xe8\xd1C9\xbbv\ y\x0b\xe8\xf2\xff/\xd5\xa6\x0d\x81\x0cq?\xf5\xafW\ \xa3\xec\x0c\xe7\xbb\xc5\x8e\x94k\x00\x00\xc8%\x8e\x14\xdf\ \xb3mQ>B|\xd4o\xc8\xe8\xdcY9;vx\ \xbb4\xbaa\x83J\xd5\xa9C0C\x14_\x17\xfb\xdb\ \x19\xce\x9f\x17\x9bP\xa6\x01\x00 \x17\xd1\x0b\xe0\xb3\xb6\ -\xceu\xc5\xbb\xfc\x86\x8dv\xed\x94\xb3m\x9b\xb7\x9d\ \xf4\xc5\x8bU\xb2\xb0\x90\x80\x869\xed\x8bb7;\xc3\ \xf9Cb\x1d\xca3\x00\x00\xe42\xfa\xb1\x8f_\xd8\xb6\ H\xd7\xc8\xe0A\xa3}\xc7W\xb6n\xf5\x16\xd2'O\ &\xa4a\xce\xfa\xb4\xd8\xc6\xcep~K\x22\xdd\x1a\x16\ \x00\x00 \xe7\xd1\x0b\xe2\xcd\xb6-\xd6\xd5\xc4\xff\xf1\x1b\ >\x9a5S\xce\xe6\xcd\xdeB\xfa\x80\x01\x845\xcc9\ \x1f\x13\x9b\xd9\x19\xce\xaf\x13\x0b)\xc7\x00\x00\x00\xffE\ \xf7J_e\xdb\xa2\xad\xfb1_\xe27\x844i\xa2\ \x9c\xf5\xeb=]\x1au\xb84\x8a9\xe4\x1dbm\xfb\ \x82\xf9\x97\x09\x1e \x02\x00\x008(V\xf6J_(\ &\xfd\x84\x91\xf2r\xe5\xac[w\xe8K\xa3\x1b7*\ \x87K\xa3\x98\x03\xfeX\xaci_8\xff\x5c\x9cG\xd9\ \x05\x00\x0084'\x8b\x1f\xdb\x16\xd2'\x89{|\x86\ \xf4\x94\x87\x9d\xf4\xe4\xc2\x85\xca)( \xc4al\xd5\ \xf79J\xec\x0b\xe7\x1f\xbb\xb5\x06\x00\x00\x00<\xd2S\ \xfc\xbdm!}\x80\xf8\x86\x9fpR\xaf\x9erV\xaf\ >\xf4q\x973\xcf$\xc8a,\xdd.\x16\xd8\x17\xce\ \xff\xe8\xd6\x18\x00\x00\x00\xf0IK\xf15\xdbB\xfaQ\ \xe2K~\xba\xbbHHOy\x09\xe9\x03\x07\x12\xe80\ V\xaev\xefqX6\x87\xdf\x14[S^\x01\x00\x00\ 2\xa7\x9e\xf8\x88m!\xbd\xad\xf8\xac\x9f\xb0R\xb7\xae\ rV\xad:\xf4\xa5\xd1\xb6m\x09v\x18\x0b\xcf\xb1\xb3\ S\xcbsbc\xca*\x00\x00@\xd5\xd1m\x18o\xb1\ m\xb1?\xdc\xef\xab\xa3\xfa2\xe8!B:\x97F1\ \xea&\xed\x0d\xe7\xf7&\xd2\xef.\x00\x00\x00@\x96(\ \x10+m[\xf4\x1b\x8a\xbf\xf4\x13`j\xd5R\xce\xf2\ \xe5\x07\xdfI_\xbaT9EE\x84=\x8c\x9c{\xc5\ 3\xed\x0c\xe77\x89\xd5(\xa3\x00\x00\x00\xc1\xb0\xca\xb6\ \xc5\xbf\x8e\xf83?;\x8c5k\x1e:\xa4O\x9bF\ \xe0\xc3H\xf9\xbe8\xd9\xcep~\xa5\xfb\x05\x1f\x00\x00\ \x00\x02d\xaa\xf8/\x9bB@\xa9x\x93\x9f@#!\ =y\xc9%\x07?\xee2x0\xc1\x0f#\xe1nq\ \xac\x9d\xe1|%\xe5\x12\x00\x00\xc0\x1c#\xc4\xbf\xdb\x14\ \x06\x8a\xc4\xab|\x86t\xe7`!\x9dK\xa3\x18\x01\xdf\ \x11\x87\xd9\x17\xcc\xf5cg\xe7P&\x01\x00\x00\xccs\ \x8c\xf8\x07\x9b\x82\x81\xee\xf7\xbc\xc9\xcfq\x97\xb22\xe5\ ,[v\xf0K\xa3\xba\x03\x0cA\x10-\xf4u\xb1\xaf\ }\xe1\x5c\xff\xba6\x99\xf2\x08\x00\x00\x10\x1e\xcd\xc5W\ -\x0b\x08\xfb\xbaXx\x0e:5j\xa8\xd4\x92%\x07\ \xbd4\x9a\xaaV\x8d@\x88V\xf9\xbc\xd8\xce\xbep\xfe\ \x818\x98\xb2\x08\x00\x00\x10>\xba\xaf\xf1s\xb6\x85\xf4\ 9n\xcb9\xcf\xc7]\x0evqt\xf2dB!Z\ \x15\xce\xdb\xdb\x17\xce\xff,\xf6\xa5\x1c\x02\x00\x00\xd8C\ -\xf1>\xdbB\xfa\xa9nw\x0bO\xc1\xa7\xac\xec\xe0\ \x17G\x87\x0c!\x1cb\xe8>-\xb6\xb0/\x9c\xcbw\ \xe1Dg\xca \x00\x00\x80}\xe8Vj\xffc[H\ \x1f.\xbe\x9b\x85\x9d\xf4TE\x85r\xda\xb5#$b\ h>(6\xb2/\x9c\xffNlB\xf9\x03\x00\x00\xb0\ \x97\xbc\x84\x85\xbd\xd2\xfb\x89oz\x0dB\xf5\xea)g\ \xed\xda\x03\xef\xa2\xaf_\xcfK\xa3\x18\x8a\xbfv\x1f\xe6\ \xb2ln=&\xd6\xa5\xec\x01\x00\x00D\x83\xf9\x89t\ \xab5k\xc2D/\xb7\xeb\x85\xa7@\xa4;\xb7\xacY\ s\xe0\x90\xae\xbb\xbepi\x14\x0dz\xbf\xd8\xc0\xbep\ ~\xb7XJ\xa9\x03\x00\x00\x88\x16\x13\xc4\x8fm\x0a\x15\ ]\xc5\x97<\x86\xa2\xd4\xc1v\xd2\xe7\xccQN^\x1e\ \xe1\x11\x03\xf7\xe7bm\xfb\xc2\xf9\xcdb5J\x1c\x00\ \x00@4\x19\x9aH\xb7^\xb3&\x5c\xb4s\xbb`x\ \x0aH\x8d\x1a\xa9\x94>\xd6r\xa0\x90>z4\x01\x12\ \x03\xf5.\xb1\x96}\xe1\xfc\xdb\x89\xf4}\x13\x00\x00\x00\ \x880}\xc4\xbf\xd8\x142:\x88\xbf\xf5\x1a\x94\xca\xcb\ Uj\xc3\x86\xaf\x07\xf4\xcaJ\xe5\xf4\xe8A\x90\xc4@\ \xbc\xdb\xce\x9d\xf3\xcb\x13\xe9{&\x00\x00\x00\x10\x03:\ \x8a{l\x0a\x1b\x87\x8b\x8f{\x0dLM\x9b*g\xf3\ \xe6\xafwv\xd9\xb1C9\xcd\x9a\x11(1\xab\xde*\ \xd6\xb0+\x98\x7f)\x9eK\x19\x03\x00\x00\x88\x1f\xcd\xc4\ \xd7l\x0a\xe9\x8d\xdc\xee\x18\x9e\x82\xd3\xe1\x87\x1f0\xa4\ \xef;\xa7\xae\xdb3\x12,1\x0b\xde,\x96\xd8\x15\xce\ ?\x13\xa7R\xbe\x00\x00\x00\xe2KS\xf1\x05\x9bBz\ \xb9\xdb_\xdaS\x80j\xd1B9[\xb7~=\xa4/\ Z\xa4\x92\x85\x85\x04L\x8c\xdb\xce\xb9\x0e\xe7gR\xb6\ \x00\x00\x00\xe2O\x99\xf8K\x9bBz-\xf7B\x9e\xa7\ \xd5\xaa\x95r\xb6m\xfbzH\x9f:\x95\x90\x89\x19\ {\x9dXdW8\xff\xa7x\x02\xe5\x0a\x00\x00 w\ (\x16\x7fdSH\xd7;\x97\xb7x\x0dT\x9d;+\ g\xd7\xae\xaf\x87\xf4\xfe\xfd\x09\x9b\xe8\xdb\xff\xb1/\x9c\ \xeb\xceK\x83(S\x00\x00\x00\xb9\x87\xee\xa3|\x93M\ !\xbd\xd4=f\xe0)Xu\xeb\xa6R\x15\x15_\xbd\ 4\xaa\xff\xfb\xf6\xed\x09\x9d\xe8\xd9\xeb\xed\x0b\xe7\x7f\x15\ \xfbS\x9e\x00\x00\x00r\x17\xdd\xb2m\xb3M!]\x87\ \xa5k\xbd\x06\xac\x01\x03\xbe\xbe\x8b\xae/\x926lH\ \xf8\xc4C\xfam\xb1\xc0\xaep\xbe7\x91\xee\xb8\x04\x00\ \x00\x00\x90X\x92H\xb7r\xb3\x22\xa8\xe8\xd0t\xa5\xd7\ \xa05j\xd4\xd7\xdb/\xaeX\xa1\x9c\x92\x12B(F\ i\xe7\xfc-\xb1\x05\xa5\x08\x00\x00\x00\xf6gZ\x22\xdd\ 5\xc2\x9a\x90~\x85\xd7\xc05a\xc2\xd7w\xd2\xcf:\ K9yy\x84Q\xfc\x9a\xdf\xb1/\x9c\xeb\xceJM\ (A\x00\x00\x00p N\x12?\xb6)\xa4Wz\x09\ ]:\x88O\x99\xf2\xf5\x90>f\x0c\x81\x14\xbf\xe2w\ \xed\x0b\xe7O\x8a\xf5(=\x00\x00\x00p0\x86\x8a\x1f\ \xda\x14\xd2+\xbc\x84\xaf\xfc|\xe5\xcc\x9e\xfd\xd5\x80^\ Y\xa9\x9cc\x8e!\x98\xe2>o\xb0/\x9c?\x22\xd6\ \xa6\xe4\x00\x00\x00\x80\x17\x06\x8a\x7f\xb3%\xc8\x14\xb9\xad\ \xf0\x0e\x19\xc2\x8a\x8a\x94\xb3p\xe1WC\xfa\x8e\x1d\xca\ i\xde\x9c\x80\x9a\xe3\xfe\xc8\xbe\x17B\x1f\x12kRj\ \x00\x00\x00\xc0\x0f\xba\x9bD2a\xd1N\xfaN/a\ \xaczu\xe5,]\xfa\xd5K\xa3\xeb\xd7\xabT\x9d:\ \x04\xd5\x1c\xf5F\xb1\x9a]\xe1\xfc\x8eD\xfa-\x02\x00\ \x00\x00\x00\xdf\xb4\x13\xf7\xd8\x14\xd2wx\x08d\xc9\xb2\ 2\xe5\xe8N.\xfb\x87\xf4\xc5\x8bU\xb2\xb0\x90\xc0\x9a\ c\xea\xbe\xfa\xd5\xed\x0a\xe7\xb7'\xd2o\x10\x00\x00\x00\ \x00dL[q\xb7-\x01\xa7\xd0\xed_}\xc8pV\ \xb7\xaer.\xbb\xec\xab\xc7]\xce<\x93\xd0\x9aC\xde\ )\x96\xd9\x15\xce\xe5\x1f\x89\x9ds\x00\x00\x00\xc8\x0e\xcd\ \xc47\x12\x89\x88\xb5`l\xd2$\xfdp\xd1\xfe!\xfd\ \xd8c\x09\xaf9\xe0]bM\xbb\xc2\xf9\x8f\x13\xec\x9c\ \x03\x00\x00@\x96\xd1\xad\xe0~cK\xe0\xc9\x13\xd7{\ \x09k\xed\xda\xa9\xd4\xce\x9d\xff\x0d\xe8\xbbv\xed\xfb\x7f\ #\xc4r!\xd4\xa0\xd7\x8b\x05\x94\x10\x00\x00\x00\x08\x82\ :\xe2c\x91\x0b\xe9]\xba(\xa7\xa2\xe2\xbf!\xfd\xf2\ \xcbU\xb2Q#\xc2l\x0c\xbd]\xacaW8\xaf\x14\ \xf3(\x1d\x00\x00\x00\x10$\xb5m\x0a\xe9\xf9\x1e/\x8e\ :\xc3\x86}\xf5\xa8\x8b\xbeDZRB\xa8\x8d\x91\xf7\ \x8a\xb5\xed\x0a\xe7\xd7\x8a\xf9\x94\x0c\x00\x00\x000A\xa9\ x\x9fM!\xdd\xd3\x8b\xa3\x13'~5\xa4\x9f{n\ \xfa\x81#\xc2m\xe4}@\xackW8\xbf2\xc1\xce\ 9\x00\x00\x00\x18F_x\xbb\xcd\xa6\x90\xbe\xebPA\ ./\xef\xeb\xaf\x8d\x9et\x12\x017\xe2>(\xd6\xb7\ +\x9c\xaf\xa1<\x00\x00\x00@X\xe8\x8bo\xdf\xb1%\ \x18\xe9\xee.Wzymt\xd1\xa2\xaf\x86\xf4\xbe}\ \x09\xba\x11\xf5I\xb1\xb1]\xe1|\x09e\x01\x00\x00\x00\ \xc2F\xff\x8c\xbf\xcb\xa6\x90~\xd5\xa1\x82]i\xa9J\ \xad\x5c\xf9\xdf\x80\xbec\x87rZ\xb4 \xf0F\xcc\xe7\ \xc5\x16\x84s\x00\x00\x00\x80\x03\xa2/\xc2]aKP\ *\x16o9T\xc0k\xd0@9\x1b7\xfe\xf7\xa5\xd1\ \x0d\x1b\x94S\xa7\x0e\xc17\x22\xbe&v\xb6+\x9c\xaf\ \xa6\x0c\x00\x00\x00\x80m\xe8\x9d\xf4u\xb6\x04&\xdd\x07\ \xfb\xc7\x87\x0az\xcd\x9b\xab\xffk\xef\xfec\xed\xae\xeb\ ;\x8e\x7fo\x7f\xd1\xd6\xda\x9f\x16\x1a\x1bhK\xaf\xa6\ \x19\xb8D\xaa-m\x88s\xcd\xbaF\x94\x15\x9dT\xc6\ \xa6\x80\xa3\xb9\x13\x7f\xc4\x94\x8b\xd8\xc9\xc0\x16*k\xb5\ +\xed\xed6\xdc2\xe6\xb6f,\xe0d\xd9\x961A\ \x13\xc1X\x7f!n\xc8HQA\x84\xdes\x8d\x1a\xa3\ \x9bf*\xb4_\xdf\xdf\x9d\xe3N[\xee\xbd\xed\xed\xfd\ \xf1\xf9\x9cs\x1e\x8f\xe4\xf5o\xd3\x9c\xf3=\xc9\xb3\xa7\ \xdf\xf3\xf9\xd6\xf6\xeci~\x93\xfe\xfe\xf7\x97\x03\xd3\xa6\ \x09\xe0\xcc\xf7\xcd\xd8\xab\xf3\x8a\xf3\x9d>\xfe\x00@\xce\ \xae\xcf%\x9c\xa6\xc7\xee\x19\xe9\x19\xe9W^)\x823\ \x8f\xf3W\xf9A(\x00\xc0\x88\xf5\x16\xad\xf4M\xfa\xba\ u\xc7\xffht\xfdz1\x9c\xe1\x9e\x8e\xbd&\xaf8\ \xbf\xd5G\x1d\x00h%7\xe5\x12R\xd5\xc3k\xee\x1f\ \xc9\x19\xe9\xfb\xf7\x97\xb5\xf3\xcf\x17\xc5\x19\xedp\xec\xcd\ y\xc5y\xf5\xc3h\xe7\x9c\x03\x00-gK.A5\ ;v\xdf0\x01\xd8_=\xb0\xe8\x1d\xefhF\xfa\xae\ ]em\xe1Bq\x9cI\x9co\xca+\xceo\xf3\xd1\ \x06\x00Z\xd9{cGs\x89\xf4O\x9e\xec\x8c\xf4\xf7\ \xbd\xaf\x19\xe9\xdb\xb7\x97\xb5Y\xb3Dr\xe2]\x9dW\ \x9c\xff\xb1\x8f4\x00\xd0\x0e\xfe \x97H_\xd0x,\ \xfc\x90A8gNY\xdb\xb1\xa3\x19\xe9\xef~w\xfd\ \xdbu\xa1\x9cd[\xdc\xd6\x02\x000nzr\x89\xf4\ \x85\xb1\x07\x87\x89\xc2\x81\xee\xee\xb2\xb6wo3\xd27\ n\x14\xcb\x09vc^q\xde'\xce\x01\x80vt]\ .\xc1uN\xec\xcb\xc3\x05\xe2\xaaU\xc7\x9f\xec\xb2f\ \x8dh\x9e\xc0\xed\x8fM\xca'\xce?V\xd4\x1f\xc6\x05\ \x00\xd0\x966\xc7\x8e\xe4\x10^K\x1a\x8f\x8b\x1f2\x14\ /\xbd\xb4\x19\xe8\xb7\xdf^\xd6\x96.\x15\xcf\x13\xb0;\ c\x93\xf3\x89\xf3?+|s\x0e\x00t\x80kr\x89\ \xf4\x15\xb1\xc7\x87\x8a\xc5\xae\xae\xb2\xbf\xa7\xa7\x19\xe9\x1f\ \xfaP\xfd\x1eu\x11=n\xfb\xe7\xc6\x03\xa62\x89\xf3\ ;\xc49\x00\xd0I~?\x97H_\xd9xB\xe5\xa0\ \xf7\xa3O\x9f^\xd6>\xf0\x81f\xa4_w]Y\x9b\ 2EL\x8f\xc3\x1e\x8a\xcds[\x0b\x00@R\xef,\ 2\xf9\xe1\xe8\xebb\xcf\x0e\x15\x8f\x0b\x16\x94\x03;w\ 6#}\xd3&A=\xc6{4\xb64\x9f8\xbf'\ 6\xc5\xc7\x13\x00\xe8To/2\xf9&\xfd\x8d\x8d\x87\ \xe2\x0c\x1a\x91\xcb\x97\x1fw\xb2K\xff\xda\xb5\xc2z\x8c\ v\xa8q\xabQ&q~wl\xb2\x8f%\x00\xd0\xe9\ \xdeUd\xf2M\xfaU\xc3\xc5du\x92K#\xd0\x07\ \xaaX\xf7\xa3\xd1Q\xef\xe9\xd8\xda|\xe2\xfc\xbe\xd84\ \x1fG\x00\x80\xba\xf7f\x12ie\xef0A\xd9_\xdd\ \xde\xe2G\xa3c\xb2\xea\x7f+~+\x9f8\x7f(6\ \xd3\xc7\x10\x00\xe0x\xd9\x9c\x93\xbem\xa8@\xaf\x9e*\ \xfa\x9e\xf74\xbfI\xef\xed\xf5\xa3\xd1\xd3\xdc\x95\xf9\xc4\ \xf9\xc3\xb19>~\x00\x00\x83\xdb\x99C\xb4U\xe7p\ \xff\xd5Pq9sfY\xbb\xf9\xe6f\xa4_~\xb9\ \xe0\x1e\xe1\xb6\xe7\x13\xe7\xdf\x8c\xbd\xd4\xc7\x0e\x00`x\ ;r\x88\xb7\xa9\xb1\x03CE\xe6\xe2\xc5\xe5@\xf5\xf0\ \xa2_\xde\xeeR=yTx\x9f\xd2\xf6\xc4\xba\xf2\x88\ \xf3\xa7b\x8b}\xdc\x00\x00NM\x16\xdf\xa4\xcf\x88\xfd\ \xd3P\xb1\xb9re3\xd0\xf7\xed+\x07\xba\xbb\x05\xf8\ Iv\xa0\xf1\x0f\x9f\x0c\xde\xdb\xf8\xeb\x14\xcb}\xcc\x00\ \x00N]\xf5\x04\xc7?\xcd!\xd2g\xc7\x1e\x18*:\ /\xbb\xacy\xab\xcbm\xb7\x95\x03s\xe7\x0a\xf1!\xf6\ /\x8d\x7f\xf0d\xf0\x9e~?v\xbe\x8f\x18\x00\xc0\xe9\ E\xfa\x1d9D\xfaY\xb1/\x0c\x16\x9e\x93'\x97\xb5\ -[\x9a\xdf\xa4\xf7\xf6\x96\xfd~4\xfa\x82}66\ ?\x8f8\xff\xef\xd8\xab}\xb4\x00\x00N_\xf5\xd0\x98\ \xbbs\x88\xf4\x97\xc5\x1e\x1f,@\xe7\xcf/k\xbbv\ 5#\xbd\xfaV]\x94\xff\xff\x1e\x8b-\xcf#\xce\x7f\ \x1a\xfbM\x1f)\x00\x80\xd1\x9b\x1a\xbb7\x87H_\x1d\ \xfb\xd6`!\xfa\xf2\x97\x97\xb5\xbe\xbef\xa4_x\xa1\ 8o<\x88hU\x1eq\xfe\x5c\xec\x8d>J\x00\x00\ c\xa7\xfa&\xfd\x1fr\x88\xf4\xf5\xb1g\x07\x0b\xd2\x0d\ \x1b\x9a\x81^\x9d\xf0r\xf6\xd9\x1d\xff \xa27\xe4\x13\ \xe7o\xf2\x11\x02\x00\x18{\xd3c\x0f\xe4\x10\xe9\xd7\x0e\ \x16\xa5]]em\xf3\xe6f\xa4Wg\xa5\xcf\x98\xd1\ \xb1\x81~C\x1eq~4v\xad\x8f\x0e\x00\xc0\xf8\x99\ Q\xd4\x1f\xcb\x9e<\xfen\x1e,L#\xc8\x07\xb6m\ kFzOO=\xdc;,\xce\xf7\xe5s\xd6\xf9u\ >2\x00\x00\xe3\xafz,\xfb#\xa9\xe3oR\xec/\ \x86x\x88Qm\xcf\x9ef\xa4\xaf[\xd7Qq\xfe\xf1\ |\xce:\xdf\xed\xa3\x02\x000q\xce\x8c=\x91:\x02\ \xcf\x18\xeaAF\x17]\xd4<\x1f}\xef\xde\xb2\xb6d\ IG\xc4\xf9\xc1\xd8\xbc<\xe2\xfco\x8b\xfa1\x9d\x00\ \x00L\xa0s\x8b\xfa\x13!\x93\xc6\xe0\xbc\xc69\xdf/\ \x08\xd6+\xaeh~\x8b~\xeb\xade\xedE/j\xeb\ 8?\x14\xeb\xce#\xce\xef/\xea'\xff\x00\x00\x90\xc0\ +b?H\x1d\x85\xe7\xc4\xfe\xf3\x84`\xad\x1eX4\ p\xc3\x0d\xcdo\xd2\xab\x1f\x90\xb6i\x9c?\x13{M\ \x1eq\xfe\xd5\xd8l\x1f\x0b\x00\x80\xb4\xd6\x15\xf5\x87\xd0\ $\x8d\xc3U\x83\x9d\x91\xbepaY\xfb\xc8G\x9a\xdf\ \xa4\xaf^\xdd\x96\x81\xbe9\x8f8?\x1c;\xc7\xc7\x01\ \x00 \x0f\xaf\x8f\xfd}l\x08\xafYS\x0f\xf4\xb7\xbd\ -\xbb@\xef\xcd\xe3G\xa1\xefr\xd9\x02\x00\xb4\xb7\xde\ \xd4\xd1\xb9,\xf6\xf8\xb11|\xcd5e\xff-\xb7d\ \x15\xe7\x07b\x93\xd3\xc7\xf9G]\xae\x00\x00\x9d\xa1/\ u\xa4_\x14{\xe6\x97A#}j\xe3!\ @9\x04\xfa\x1f\xa6\x8f\xf3\xea\x94\x9d\x95.K\x00\x80\ \xce\x96\xfc\x8c\xf4\x85\xb1\x87\x13\xc7\xf9]\x8dc \x13\ \xbe\x0eGb\xbf\xedr\x04\x00\xa0\x92\xfc\x8c\xf4\xf3b\ O&\x8a\xf3\xaf\xc4^\x92\xfe\xdb\xf3\xad.C\x00\x00\ \x8eU\x9d\x91\xfe\x5c\xcaH}S\x828\x7f:v\x81\ \xe3\x14\x01\x00\xc8\xd4\x96\xc4\xa1Z\xde2\xc1\x81\xde\x93\ >\xce?W\xd4\x7f\xb0\x0b\x00\x00\x83\xda\x972X\xa7\ \xc4>>Aq~G\xac+m\x9c\x7f+\xb6\xd0%\ \x07\x00\xc0p&\xc5\xeeM\x19\xe9sc_\x18\xe78\ \xffLlf\xda8\xffQl\x85\xcb\x0d\x00\x80S1\ #\xf6\xa5\x22\xf1\x8fF\x9f\x1a\xa78\xffzly\xfa\ \x13[6\xba\xcc\x00\x00\x18\x89\x97\x16\xf5\x87\xe6$\x0b\ \xd9\xdf\x1d\xa7@\xbf4\xfd}\xe7\xdb\x5c^\x00\x00\x9c\ \x8e\xea\xa19?I\x19\xb3\xbb\xc78\xce\xff$}\x9c\ \xdf\x13\xebri\x01\x00p\xba\xde\x1c;\x9a*h\xcf\ \x88\xdd7Fq~\x7f\xe3\xcfK\x18\xe7_\x8b\xcdr\ I\x01\x000Z\x1fL\x18\xb5\xe5\xe2\xd8c\xa3\x8c\xf3\ 'b\xcb\xd2\xc6\xf9\xf7\x8a\xfaS[\x01\x00`\xd4\xaa\ \x93]>\x912\xd2\xd7\xc7\x0e\x8f\x22\xd07\xa5\xffQ\ \xe8%.#\x00\x00\xc6Ruk\xc6\xa3)#\xbd\xf7\ 4\xe3\xbc/\xfd}\xe7;\x5c>\x00\x00\x8c\x87\xead\ \x97\xfeT\xa1;)v`\x84q\xfe`\xfa\xf3\xce\xff\ \xb5\xa8\xff\x0f\x04\x00\x00\x8c\x8b\xb5\xb1\x9f\x16\x09\x1fb\ \xf4\xc5S\x8c\xf3\xea\x1c\xf5\x15i\xe3\xfc\x1b\xb1\xb9.\ \x19\x00\x00\xc6\xdb\x95\x09\xa3\xb7|e\xec\xdb\xa7\x10\xe8\ W\xa7\x8d\xf3\x1f\xc7^\xe1R\x01\x00`\xa2\xf4\xa5\x8c\ \xf4\x9e\x93\xc4\xf9\x9d\xe9\xef;\xff\x1d\x97\x08\x00\x00\x13\ iJ\xec\xd3\xa9\x02\xb8+\xf6\x97C\xc4\xf9\x97bs\ \xd2\xc6\xf9>\x97\x07\x00\x00)\xcc/\xea\xf7Y'\x09\ \xe1\xd9\xb1\x83'\xc4\xf9\xb3\xb1\xd5i\xe3\xfc\xc1\xd8T\ \x97\x06\x00\x00\xa9\x5c\x10\xfb\xdfTA|\xc1\x09\xf7\xa3\ oM\x1b\xe7\xdf\x8f\x9d\xed\x92\x00\x00 \xb5\xab\x13F\ \xf1\xff\xfd\x18\xb4\x8a\xf3\x7f\x8fMI\xf7\xf78\x1a\xbb\ \xd8\xa5\x00\x00@.nO\x19\xe9\xbbbK\xd2~{\ \xbe\xcd%\x00\x00@N\xa6\xc5>_$\xfc\xd1h\xc2\ 8\x7f\xa8\xa8\xffh\x16\x00\x00\xb2rV\xecp\x91\xfe\ \x88\xc3\x89\x5c\xf5d\xd53\xbd\xf5\x00\x00\xe4\xea\xc2\xd8\ \xcf:$\xce\x9f\x8f\xfd\x9a\xb7\x1c\x00\x80\xdc\xbd\xb3C\ \x02\xfdFo5\x00\x00\xad\xe2\xce6\x8f\xf3\xfbb\x93\ \xbc\xcd\x00\x00\xb4\x8aY\xb1Cm\x1a\xe7\xdf\x89-\xf2\ \x16\x03\x00\xd0j\xce\x8f\xfd\xa4\xcd\xe2\xbc:\xef|\x83\ \xb7\x16\x00\x80V\xb5\xa9\xcd\x02}\x87\xb7\x14\x00\x80V\ \xd7\xd7&q~\xb0p\xde9\x00\x00m`j\xecs\ -\x1e\xe7?\x8c-\xf3V\x02\x00\xd0.\xce\x8e}\xaf\ \x85\x03\xfd2o!\x00\x00\xed\xe6u\xb1#-\x18\xe7\ \x7f\xed\xad\x03\x00\xa0]\xedj\xb18\x7f26\xc7\xdb\ \x06\x00@\xbb\xaa\xeeG\xffb\x8b\xc4\xf9s\xb1U\xde\ 2\x00\x00\xda\xdd\xb9E\xfdG\x97\xb9\x07\xfaM\xde*\ \x00\x00:E\xee\xe7\xa3;R\x11\x00\x80\x8e\xf3\xd1L\ \xe3\xfc\x7fb\xcb\xbd=\x00\x00t\x9a3b_\xc90\ \xd0\xdf\xea\xad\x01\x00\xa0Su\xc7~\x94Q\x9c\xdf\xe5\ -\x01\x00\xa0\xd3\xbd%\x938\xffvl\xae\xb7\x03\x00\ \x00\x8a\xe2\xef\x13\xc7\xf9\xd1\xa2\xfe %\x00\x00 \xcc\ \x8b=\x930\xd0\xef\xf0\x16\x00\x00\xc0\xf1^\x1b;\x92\ \xce\x9f\x8a\xbd\xd8\xcb\x0f\x00\x00/\xb4m\x82\xe3\xfc\ \xf9\xd8\x1a/;\x00\x00\x0c\xaez8\xd0\xc1\x09\x0c\xf4\ ]^r\x00\x00\x18\xde\xb9\xc5\xc4\x1c\xbd\xf8\xb5\xa2~\ \x16;\x00\x00p\x12W\x8ds\x9c\xff<\xf6J/3\ \x00\x00\x9c\xba\xbb\xc61\xd0\xb7{y\x01\x00`d^\ \x12\xeb\x1f\x878\x7f\xacpk\x0b\x00\x00\x9c\x96\xea\xe1\ AG\x8b\xb1=\xb5e\x95\x97\x15\x00\x00N\xdf\xde1\ \x0c\xf4[\xbc\x9c\x00\x000:\xd5\xed(\x8f\x8eA\x9c\ W\x7f\xc64/'\x00\x00\x8c^u\xe2\xca\xcf\x0a\xa7\ \xb6\x00\x00@6\xb6\x8e\x22\xd0o\xf3\xf2\x01\x00\xc0\xd8\ \x9a\x14\xfbL\xe1\xd4\x16\x00\x00\xc8\xc6\xb2bdO\x19\ \xadNmY\xede\x03\x00\x80\xf1\xf3\xf6\x11\x04\xfa.\ /\x17\x00\x00\x8c\xbf\xbbO!\xce\xff\xabpk\x0b\x00\ \x00L\x88\xea)\xa3\x03\xc5\xf0\xb7\xb6\x5c\xe8e\x02\x00\ \x80\x89\xb3\xa1\x18\xfa)\xa3\xbb\xbd<\x00\x000\xf1\xfe\ |\x908\xffzl\x86\x97\x06\x00\x00&\xde\xcc\xd8\xa1\ \xe2\xf8[[\xd6xY\x00\x00 \x9d\x95E\xfdI\xa1\ U\xa0\xef\xf5r\x00\x00@z\x1f\x8c}\xa3\xa8\x7f\xa3\ \x0e\x00\x00$6-v\x81\x97\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\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\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\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\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\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\ \x00\x01[\x00\x00\x01\x5c\x08\x06\x00\x00\x00f\xca\x1dU\ \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\x1f\ %\x1b\xcd\xc8\xcf\x00\x00\x00\x06bKGD\x00\xff\x00\ \xff\x00\xff\xa0\xbd\xa7\x93\x00\x00.\xe0IDATx\ \xda\xed\x9d\x09t\x15U\xb6\xfe\xaf\xb6C\xdb-\xdc\x9b\ \x00b\xdb\xb4\xa2\xb6\xf6\xa0\xdd\xb6\xa2>q\xa0\xaa\x92\ 0*\x8a \xa2\x88\x8a8\xb7-\x88\xa08a\xa7E\ Q[[\x14'\x22!u+\x84\x00\x81\x10H \x10\ \xa6@\x98\xc7\x80!\xcc\x90\x90\x89\x84\x04\x12\x12\x12\x12\ \x02\xa9W\xbb\x82\x1aHn\x86\x9b[u\xeb\xd4\xf9~\ \xff\xf5\xad\xf7_\xbd^?\xaa\xce>\xe7\xcb\xb9\xa7\xf6\ \xd9\xdb\xe1\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\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\x18@\x07Y\xbc2P\x11\xba\x06\xc8B_\x97,\ \x0eu\xb9\xc5QNE\xfcX\xfb\x9f\xe1\x9a\xe24\xa5\ \xb8\xdcB\xba\xa6\x03\xb5\x12\x0b5\x1d\xd3\xfe\xff\xc7\xb5\ \xff\xa9\xd6\x97\xfe\x9f\x1f\xab\xfd\xdf\xfb\xe9\xbf\xa3\xff\xf7\ Wj\xff\xd9\x1cM\x93\x9dni<\xfd;\xf4\xef\xd1\ \xbf\x1b(\x8bw\xd1s \x1a\x00\x00v\x09\xebrq\ \x80\x12\xfcw\xcd\xe0\x06\xe8\x06\xe7\x16\xbfq*\xc2\x82\ Z\x03\x14+\x1a6L\xbf\xa9\xe2\xecs\xcd\xd7\xf4\xb5\ K\x91^w\xc9R\xff\x00\xb9\xdb\xdf\xe8=\x10L\x00\ \x80\xffQ\x1d\x17\x04\xba\xa5\x9b\x9c\xb20P\xdb1\x86\ jf\x95\xa0)\xcfbf\xdaZ\xe5\xe9\xef\xa5\xbd\x1f\ \xbd'\xbd/\xbd7\x82\x0f\x000\x8e\x89\xbd/\x0d\x8c\ \x08\xba\xdb\xe9\x16Gk\xe63W\xdb\x11\xe6\xda\xccX\ \x9b)\xfd\xbd\xe9\xb8c\x14\x1d\x878b\x06^\x82\xc9\ \x01\x00\xf0\x9a6Jp;\x97[z0\xc0-|\xaa\ \x19\xcb*\xcddO\xf2i\xae\x8d\xeb\xec\xb8\xa4\xd0\xb9\ 3\x9d\x07\xb7\x0d\xef\x19\x88\xd9\x03\x00ht\xe7Jf\ \xa1\x99k\xd8\xd9\x0fS0S\xefw\xbf\xf4\x91\xee+\ \xcd\x80Ch\x5c1\xb9\x00\xe0\x9c\xc0(\xb1\x93\xb63\ {V3\x88Yg\xbf\xe8\xc3(}o\xbcG\xb5?\ `3]\xb24\xac\x9d\x12\xf4{\xcc:\x00\xf89\x1e\ \xb8\xb1\xf6\x83\x96\xfe\x15\x1efh\xbe\xf9\xa6\xd3\xf8\xb7\ \x95\xbb\xdd\x80\xd9\x08\x80\xcdp\xba\x83\xae\x87\xc1Z\xd7\ x\x9d\x11!\xd7a\x96\x02\xc0(\x9db\xba^\xe6r\ KOi\x8bz\xa9\xa6\xd306K\x8b\xe2\xb38@\ \x11\x87t\x96\xc5_c\xf6\x02\xc0\xc2.V\x11C\x02\ \x14)\x06\xd9\x03\xcc\xaa\xd4\xa5H\x91\xfa\xc75\x00\x80\ \xe5\xcea\xdbi\x8bs\x8cf\xb0;aV\xf6:f\ \xa0\xb8\x22\x9d\x0c\x00?\xe3\x92\xc5\xce\x94b\xe4\xb9n\ \x00d\x13\x95h\x9a\xe0\x0a\x0f\xba\x06\xb3\x1e\x00\x93\x8f\ \x0aj\xaf\xc7\x0ag`D\x5c\xedt)\xde\x09\x01\x91\ \xe2\xbdX\x05\x00\x18E\xb2xQ\xed\x07/a\x0bL\ \x07\xd2\xb4\x99\xe6\x83#f\xe0\xaf\xb08\x00\xf0\x05\xa1\ \xa1\x17\x06\xc8\xd2`\xa4mA\x1e\x94\xa6\xfd\xd2\x19D\ \xf3\x04\x8b\x05\x00o\xd0v,N\xb7\xf4\x82\xb6\x982\ `(P3j4\xec\xc2N\x17\x80\x96\xa0:.\xd0\ \xcb\x16b'\x0by\xa7\x1d4\x7fP\x0a\x12\x80Fp\ EJ\x82\xb6XV\xc30 \x1f|L[\x89\x0fi\ \x00\x9c\x07u\x068{\xd3\x0b&\x01\xf9ZK4\xd3\ \xbd\x19\xab\x0cp\xcd\xe5\x11\xf7u\xa8-i(V\xc3\ \x14 \x03u\x8a\xe6Y\x9bh\xb1=V\x1d\xe0\xed\xe3\ \xd7%t3\x08e\x0d!\xb3\xcb=\xba\x14q\x04\xa5\ \x11b\x11\x02\xfb\x1f\x19\xb8\xa5{\xb4\x89\x9f\x8a\x85\x0f\ \xf93G\x97:\x0cc5\x02[B\xf5\x0b\xa8@\x0c\ \x16:d\x11\xd5P\xc1\x1b\xd4]\x00\xb6\xe2l\xa9\xc3\ |,p\xc8\x82\xf9\xb9\x87\x9d\x8a\xf8\x08V)`\x1a\ j;s\xb6\xc57\x166\xc3\xfaG\xec\xe3\xeaK\xab\ \xc6\xab\x13\xd2\xa2\xd5y\x99+\xd5-\x85\xbb\xd4\xbd%\ \x87\xd4\x8c\xd2\xad\x06\xb8\ %\xd6\xde3\x01m{\x00\xa3g\xb3\xc2\xe3\xda\x04.\ \x84Y\xb1\xa9\xee\x0b^Q\xbf\xdf9[\xcd9Q\xa0\ zCQe\x89\xaa\xec\x9d\xaf>\xbcx\xb4\x1a\xa8\xb0\ b\xbcB\x81\xd3-=\x8a\xd5\x0b\x989\x9b\xd5&\xee\ \x1c\x18\x16{\x22S|v\xe58}\xa7\xeaKh\xf7\ ;r\xdd\x17\xea\x15\x91!l\x8c\x85\x22\xc4\xd2<\xc6\ j\x06\xd6\xdd\xcd\xcaR\x1f\x9c\xcd\xb2\xa9\x9e\x89\xff\xf2\ \xb9\xc9\x9e\xcf~\xcdt\x07-}\x9b\x99\xb3\xdc@Y\ \xec\x85U\x0d\xac\xc5\xc4\xde\x97\xd6\x16\xf1\x16k`\x5c\ l\xa9\xe3\xd4\xee\xea\xa4\x9d\xb1j\x8d\xf6\xff\xcc\x82\xce\ };G\xf7e#cA\x9b\xd7\x94\x17\x8eE\x0e\xfc\ \x0e\xb5\xa4\xd6&\xe4\x06\x18\x17{\xbaqf\x7fuC\ \xc1\x0e\xd5\x1f\xd0\x07\xb6\xdb\xe7\x0cae\x97\xbb\x16\x1d\ \x80\x81_q)\xe2\xd3h\xac\xc8\xa6\xba\xce}F\xcd\ \xf6\xf2\xe3\x97\xaf(\xae*U\xfb.\x1a\xc9\xca\x98\x95\ \xe9\xd5\xc4\x000\x95\xb0.\x17\x9f\xadi\x00\xe3bP\ \xdd\xe2\x9fWK\xaa\xcaT+Pu\xa6Z\x1d\xb0\xe4\ Mv.B\xd0\xb1\x02\xae\xfb\x023\xf8\xed\xe4\xe0\x8e\ T\xbe\x0e\xa6\xc5\xea\xd1\xc1\xc3^\xa7s\x19E\xe9\xa9\ r\xf5\xce\xb8\xa7Y\x1a\xc7\xe4\xcb#{\x5c\x017\x00\ \xc6\x9d\xcf*Awj\x13-\x1b\xa6\xc5\xa6\xda+\xc1\ \xea\xea\xfcm\xaa\x15\xa13\xdc?L\xeb\xc3\xd2xf\ \xb5\x95\x85;\xe0\x0a\xc0\xe7P\xb2\xb76\xc1N\xc0\xb4\ \xd8\xd5'\xdb\xdc\xaa\x95\x99\xb6o!kcZ\xe6\x92\ \xa5\xfep\x07\xe0\x1bBC/<\x9b\xd6\x05\xc3bX\ \xf4\xe5\xbf\xf2t\x95\xa5\xcd\x96\xd2\xcf\xee_8\x82\xbd\ \x826\xb2\x18\x8a6<\xa0Ut\x8a\xe9z\x19*u\ \xd9C\x0b\xb2V\xab,\x90~\xec\x00C\xd7{\xebH\ \x16\xdd\xc8\xc7\x05^A]\x14(\xbf\x10F\xc5\xbe\xee\ \x8b\x7f\xce\xd4K\x0b\xade\xc8\xf2\xb1\xac\x8e\xf5jt\ \x83\x00-\xa2\xcd\x14\xe9O\xda\xc4\xd9\x0f\xa3\xb2\x87\xe8\ ,\x94%\xd6\xe4ogy\xbc\xf7\xd1E\x1f\xb8\x08h\ \x12\x97\xd2\xedV\xba\x17\x0e\x93\xb2\x87~\x1f\xd5[-\ ;U\xce\x94\xd9\xd2.\xfc\x96\xd9\x8f\xb3\xdc~'7\ @\x09\xfe;\xdc\x04x\xce8\x88\x08\x0aB\xc6\x81\xbd\ D?\xc9Y\xe4\xbdM\xdf\xb1>\xf6%\x81\x11Aw\ \xc3U@}\xa3\x95\x85\xee\xda_\xe4r\x18\x94\xbd4\ yW\x1c\x93f\xbb$g\xbd\x1d\xc6\xff\x84S\x11C\ \xe0.\xa0\xce\xd1\x81\xf4\x9061*aN\xf6\x93\xd1\ e\x13\x8d\x82\xae\x13\xdb$\x06\xda\xba\x92\x1e\x84\xcb\x00\ \xba\xac0@\xdb\xd1V\xc1\x98\xec'jMS^}\ Re\x15\xbaZl\x93\x16\xeaU\xb8\xfc\xc0\xfd\x8eV\ x\x18Fk_\xfdqF?\x95eB\xe6\xbfl\xa3\ xh\xebL\xfb\x05\x09\xd7\xe1sGK\xd7oO\xc3\ \x94\xec\xab[c\x073m\xb6\x03\x16\xbfa\xb7\x98\x9c\ F\x99F\xce\xd0~^\xde\x8f\x1d\xad\xfdu\xf7\xbca\ L\x9b-\xc3\x97\x1b\x1a\xdd\xe1R\xfb(\xb8\x10\x0fG\ \x07\xb2(jA\xaf\x80\x19\xf1\xd1\x82\x9ce\xfa/\x1e\ m\xd7\xd8T\xb8\x22%\x01nd\xe7\x1dm\xa4x/\ \xf2hqf\x8b3[K\xecp\x8f\xa3D\xa3}\xcf\ h\xbbP\xa25L\x88\xafl\x84R\xc6n\x8f\xd5\x85\ \xfeX\xd8\x88\x895\x98\x9cPS\ \xa2\x82\xdc9'\x0a,e\xb4t\xa5\xf8\xce\xb8\xa7\x11\ \x1f\x0f\x1f\xcc\xa8J\x1f\x5c\xce\x0aF\x1b\xd9\xedZ-\ (\xc70)\xa1\x96\xd4\xb9=\x5c^d\x09\xa3\xa5\x1c\ \xe0\xe0\xf9/!.\x8d\xab0 2\xe4j\xb8\x9d?\ \x09\xebr\xb1\x16\x88\xcd\x98\x8cPK\xd5u\xee3j\ \xb6\x9fw\xb8\xc5U\xa5j\xdfE#\x11\x8f\xe6]x\ X\xe3H\x16/\x82\xe9\xe1\x9c\x16b\xf2H\xa1\xbf\xba\ \xa1`\x87\xdf\xceh)C\x02qh\x89\xa4\xf7\xe1z\ \xfe0\xdaHI\xc0\xc5\x05\xa8\xb5j\xa7\x04\xa9\xa1\x9b\ \xc3\xd4Sg\xaaMK\xef\x9a\xb43V\xed8\xb5\x07\ \xc6\xbf\xe5\xaa\x0eT\x84\xaep?\x13\x09\x8c\xea\xddV\ \x1b\xf8\x83\x98|\x90\xaf\xd43\xf1_\x86\xb7=\xdf\x7f\ <[\x1d\xb4\xf4m\x8cw\xeb>\x98\x1d\xa0\xf5\x0f\x17\ 4kW\xabH\x91\x98t\x90\xaf\x15\xa8H\xea\xb3+\ \xc7\xf9\xdct\xf7i&;r\xdd\x17\xea\x15\x91!\x18\ g\xdf\x1c'D\xc0\x05\xcd0ZY\xec\x87\xc9\x06\x19\ \xad\xee\x0b^Q\xbf\xdf9\xdb\xeb41*\xfe\xad\xec\ \x9d\xaf>\xbcx\xb4n\xe2\x18S_\x17\xac\x11\xfa\xc2\ \x0d\x0d\xe4\xf2\xc8\x1eWh\x03]\x84\xc9\x06\x99)j\ \x1c\xf9\xd2\xaa\xf1\xea7\xe91\xea\xb2\xdcM\xea\x81\xd2\ \x1c5\xa34\xef\x1c\xa5\x1c\xde\xaa\x17*\x1f\xb1\xf6s\ \xf5\xff\xe6>\xad\xb7\xe4\xc1\xd8\x19\xaa\xfc\xb6\xe1=\x03\ \xe1\x8a8>\x80 \x08\xf5o\xd9\xa4m\xa4\xd4\x13\x13\ \x0c\x82\xa0:\xaaq*b\x08\xdc\xd1\x87t\x88\x11/\ G5/\xa8\xb5\xea\x1c\xdd\xb7IQ\xee-\x1d\x1b4\ %\xaa\x91+&\xbc\xd0\xa8\xa8\x15y\xbf\xa4QMj\ \xf0\xb2w\xd5\xa1+B\x1b\xd5\x93\xc9c\x11\xc3\x86\xb5\ \xafSL\xd7\xcb\xe0\x92>\xfb(&\xfc\x0f\x93\xea\x5c\ \xfd%\xe6\x11u\xd4\xba\x09\xea\x84\xb4h\x8f\xfa*m\ \xba*\xefIhR3\xf6'\xa9q\x19\xc9M\x8a:\ \x08$\xe7mnTk\xf2\xb7\xeb_\xf3\x9b\x12}\xa1\ ?\xff\xdc\xf3|e\x95\xe5\xeb\xb7\xac\x9aR\xe5\xe9S\ *\x0f\xfcm\xf6 \xcc\xfd\x06\xa4\xedn?\x86K\xfa\ \x22\xa7V\x11\xba\xe2\xf2B\xe3\x1fo\xde\xda\xf0\xb5\xba\ \xbe \x8d\xa9n\x04\xa0\xe5|\xf1c\x14\xe6\xbc\x87\xcb\ \x0e(6\xdeZT\xc7\x05N\xb7\xb8\x0e\x93\xa9y\xa2\ \xcaQ\x1fl\x99lxr>\xf0\x0f\x85'\x8b\xd5\xdf\ E\xf5\xc4\x5co\xf8\xb2\xc3J\x18f\xebrj\x87b\ \x12y\xa7\xeb\xa6?\xa8\xa7+-\xca^\xabV\x99t\ \x15\x15\x18O\xe8\x96\x1f0\xbf=\xe6\xdeJ\x83\xe1\x9a\ \xde_\xc9\xcd\xc7$j\xbd\xae\x8a\xea\xa5>\xb6\xec\x1d\ \xfdl\x96\xb5\xb6\xde\xe0\x5cJ\xaa\xca\xd4k\xa2\x1f\xc0\ \xbcnX9\x1d#{\xfc\x16\xee\xd9B\x9c\xb2\xf0\x11\ &\x8f\xefE\x05P\xc8x\xe9\xc3\xd8\x11\xedg)`\ \x8fO\xb6\xb91\x97=I\x16C\xe1\x9e-1\xda\xc8\ n\xd7\xa2C\xae9\x15\xafz%\xbe\xaaW\xa1\xca+\ /\x84\x8b1\x02uv\xb8vz_\xcc\xe1\x86U\xe1\ \x0a\x0f\xba\x06.\xda\xdc\xb3Z\xb78\x0b\x93\xc6|\xdd\ 5w\xa8\xbek\xa2Z\xab\x00\x99\x09\xec\xa6\x82\x09\xd3\ \xe0\xa2\xcdN\xf5B?1+\x18/\xd5yEJ\x99\ 5)\xaf>\xa9\xf7S\xc3\x5cm\xb8o\x993R\xbc\ \x1dn\xda\xf4\xaev5&\x8b\xf5\x8c\xf7\xc3\xadS\xd4\ mE{\xe1r\x16\xe2\xeb\x1d31?=k)\xdc\ \xb4\xb1\xb3ZE\x0c\xc1$\xb1\xb6\xae\x9f\xfe\x10R\xca\ ,\x02\x8d?5\xaf\xc4\xbc\xf4\xf8\xb1L\x84\xabz\xb8\ \xc0\xa0\x0d\xd0FL\x12\xb6j\x0d\xd0\xbd}\xa4\x94\xf9\ \x8f\x99\x07\x16c.z\xd6j\x18k\x03\x04\xc8R\x1f\ L\x0evu\xe5\xd4\x9eH)\xf3\x03gjj\xd4n\ \xf1\xcfc\x0ez\xae\x9b\x80\xaa`\xf5w\xb5\xc2\x16L\ \x0e\xfb\xa5\x94\x1d./\x82#\x1a\xcc\xe2\xec\xf5\x98w\ \x9e\xcc\xd6-\xae\x85\xc1\xd6\xfd(\xa6H\x0fab\xd8\ \xb7\xaf\x17\x95\x1b\xacM)\xcb\x823\x1a\xc4\x83I#\ 1\xdf<]\xe3U\x84\xdep\xd9_2\x10pV\xcb\ aJ\x19\xf0\x1d\x9b\x0bw\xa1\x15\x0f\xcen\x9b\xc8@\ \x88\x08\x0a\xc2d\xe0S\x7f\x9f\xfd\xd8\xcf\xe5!\xe9\xec\ \x11\xb4\x8e!\xcbQ`\xbc\x91\x06\x91\xf7\xc1l\x15a\ \x01&\x03\xf4\xc7\x19\xfd\x90R\xd6J\xe8\x98\xa6\xbd\x12\ \x8c\xf9\xd4p\x1a\xd8\x5c\xbeo\x8bE\x04\xff\x15\xb7\xc5\ \xa0\xc6R\xcaNTW\xc0E[\xc0\xf05\x9fa\x0e\ y\xe8W\xd6N\x16\xff\xcco\xba\x97\x22\xfd\x80I\x00\ 5'\xa5\x8c\x8c\x97\xca\x0b\x82\xc6\xa1\xec\x0f\x14\x18\xf7\ \x94\x99 }\xc7\xa5\xd1v\x90\xc5+\xb5\x01\xa8\xc4$\ \x80\xbcI)\xcb\xaf@J\x99'\xe8\x03$\xe6K\x83\ 5\x13\xca\xdbD\x8b\xed\xf9\xcb@\x90\xc5P\x04\x1f\xf2\ EJ\x195\x8f\x04\xbf@\xbf\x00P\x82\xd1\xd3\xd9\xad\ 0\x96/\xa7\x0d\xebr\xb1\xf6\xe2y\x08>\xe4\xeb\xf2\ \x90\xe8\xbfV\xcb\x97i\xd31/\ \xa4\xd1\x99\xb5\x94\xf0\x22\xe2^_\xd9\x8e\x98\x81\xbf\xb2\ \xf1Y\xad\xf4 \x82\xec\x1b\xdd0\xa3_\xa3\xd7Z3\ \xcb\xf2\xd4\xaf\xd2\xa6\xab\xc1\x9a\xf1\xa2@I}\xf5^\ 8\x9c\x9b\xdd\xed\xb2\xdcM\x889o\xd5\xc0\xb4\x17\x9c\ \x8d \xfbF\xe3\xb6\x867{\xb1e\x9f(P\xbfM\ \x8f\xd1/\x04\xe0\xee\xfc/J\xca^\xc7\x8d\xe1\xd2\x1f\ \x17\xc4\xbc\xde\x87\xb2\xe9\xf6\xbc\x9a\x1b\x16\xe2\xc4\x8d1\ \xdf\xe8\x8a\xc8\x10\xafoPU\xd7\x9c\xd6\x7fBOH\ \x8bV\xfb%\x8d\xd2\xffo\xf1:\x8eB\xc2\xf3\xdc\xa4\ \x86-\xc9A\x81\xf1\x86n\x94u\x88\x11/\xb7\xe1\x8d\ 1\xe1I\x04\xd77\x1a\xb6\xe2?>[\x84\x85'\x8b\ \xf5\xb3\xdf77L\xd4w\xbe\x9d\xa6\xf5\xe1j,\xe3\ 3S\xb8\xd9\xdd\xf6\xc1\xee\xb6\x81\xd2\x8b\xe2cv<\ B\x88Gp}\xf3qgk\xd1nC?\xa8\x1c(\ \xcdQ\xe32\x92\xd5\xffl\x99\xac>\xb2d\x8cz\xf3\ \xacG\xf5\xba\x04f\x5c\xc1\xbd-\xf6\x09S\xc7\xf3\xde\ \xf8g\xb9\xd9\xdd\xae\xc8\xdb\x825T_sle\xb4\ m\xc3{\x06j[\xf6*\x04\xb6\xf5\xa2\x0aX\xfe\x80\ >\xc6\x91\x09/\xcf\xdd\xa47u\x0c\xdd\xf2\x83\xbe\xc3\ \x0eY\xf0O\xf5\xf69C\x9a\x9dvvu\xf4\xfd\xfa\ \xcd\xa6\xbb\xe7\x0d\xd3\x8b]\x8f\xdd\xf4\xbd\x1a\xb1'^\ \xddP\xb0\xe3\xe7\x0e\xbdf\xa7\xb0-\xc8Z\xcd\xcd\xee\ \xf6\xfe\x85#\xb0\x8e\xce=\xb7=\x19\x18\xd5\xbb\xad\x9d\ \x8a\xce\x0cE`\xed\x9f\xb2D\xdd\x16\x8a\xabJ=\xaa\ \xb9\x98}Q\x83\xba\xd3\xf2\xb2\xbb]\x99\xb7\x15k\xa9\ \xde\xba\x12\x9f@7\x06\xe8\x1c\x0d^\xf6.\x17\x86\xd0\ }\xc1+\xa6\x8f\xed\xd2\xdc\x8d\xdc\xecn{&\xfe\x0b\ \xeb\xe9\xdc\x0fe\xf3\x90\x85\x00\x9d\x93\x81\xb0\xbb8\x93\ \x0b3\xb8g\xde0\xd3\xc7\xb7\xef\xa2\x91\xdc\x98\xed\xaa\ \xc3\xa9XS\xe7\x1d%\xd8\x22+\xc1\xe9\x96\x1eE@\ [\xaf\x0f\xb6L\xe6\xe6\xc6\xd35\xd1\x0f\xf8\xe5\x88&\ \xfd\xd8\x01n\x0c\x972O\xb0\xaelV\x09\xcc\xe5\x96\ \x22\x10\xcc\xd6\xe9\x1f\xb1\x8f\xab'OWra\x02{\ K\x0e\xf9m\x9c\xa9:\x18n\x95\xf1zn+\x84\xb1\ \xed\xb4\xaa\xe3\x02\xd4Bh\xfd\x8eku\xfe6nL\ \x80\xb2\x1c\xfc5\xd6\x1d\x22C\xd4\xdc\xf2#\xdc\x8c5\ u\xba\xc0\x1a\xabS+\x81\xe9]\xed\x14\xe9\x16\x04\xb1\ uz\x91\xa3\xdd\x16\xddn\xfbK\xcc#\xcc\x5c\x83f\ \x9d9\x19\xc9Xcu\xf3\xbc\xdd\xd2M\xec~\x1c\x93\ \xc5\xb7\x10D\xefug\xdc\xd3jy\xf5In\x16\xbf\ \x15Z\xb9P\xb1q\xear\xc0\xcb\x1f7\xeaj\x81\xb5\ \xf6\xb3F\xb1\x9c_\xbb\x02\x01\xf4N\xd4\x8ez[\xd1\ ^n\x8c\xf6`i\xaeeZp\xcf:\xb0\x94\x9bq\ \xffa\xd7\x1c\xac\xb7_\xb4\x84\xe5\x94\xafj\x04\xd0\xbb\ sZ\xfa\x89\xc7\x0b\xd4\x0d\x96.\x16Xe\xfc\x1fX\ \xf4\x1a7c_Q]\x89N\xbc\xbf\xe4\xdbV1\x99\ \x02F\xb5\x22\x11<\xefD\x15\xb9x\x81\x8eIz$\ \xbeb\xb9?vt5\x99\x17\xde\xd9\xf8-\xd6\xddO\ 9\xb7\x8a\x18\xc2^~\xad,|\x84\xe0\xb5\x5cTw\ \x96\x17\xe8\xcb\xff\xdd~\xb8\xc0\x80\x0fe\xf5\x8fp\xa8\ \x08\x10\xd6\x9f\xbe\xbb\xfd\x0f\xcek98:\xe0iG\ K;G+7#\xa4\xac\x88\xd35g\xb8\x89\xc7\xc0\ \xa5c\xb0\x0ek\xb5\x94-\xa7\x8d\x19x\x89\xf6\xd0\x15\ \x08\x5c\xf3\xf3;\xa7\xefO\xe2faG\xef_\xc4D\ \xdd\x5c\x9e\xea%\xcc\xcb\x5c\x89\xb5X\xab\x13\x8ed\xf1\ \x22vJ**Aw\x22h\xcd\xbf\x1d\xc6K\xd6A\ A\xc5Q\xbd#0+\xb1y!\xe5#n\xcc\x96\xd2\ \xdd\xfcqM\xda\x9a\xb5\x12\xa4.\x0c]\xd1\x15F\x22\ hM\xeb\xd1\xa5o\xe9\x9d\x12x\x80n\xc1Q\x1d[\ \x96\xe2C\xb5w\x1bk\xaai7^[\xfb9\xd6\xa5\ .i8\x1a;\xdaD\x94H\xceK\xb3AJ-\xa2\ E\xccj\x87\xdf\xe4\xbc\xcd\xdc\x98\xed\x9a\xfc\xedX\x9f\ \xb5u\x12f\xb2d\xb69\x08Z\xc3\xb7\x93\xe8#\xd8\ \x89\xea\x0a.\x16\xef\x9e\x92LK\xe5\xcfz#J\x8b\ \xe2\x05*\xfe~\x836G\xb1V\x85CL\x18\xed\xe5\ \x91=\xae@\xb0\xce\x15u\x1e\xa0\x9b:\xbc\x5c\xbd\xa5\ 2\x89\x93w\xc5\xa9WN\xed\xc9|\xec(5\x8d'\ \xa8\x16\x07\xd6\xac\xa8\xb6Q\x82\xdb\xb1P\xbf6\x18\xc1\ \xfa%\xcb`S\xe1N\xae\x16+\x1d\x1b<\x95\xfc\xbe\ \xadR\xf2\x8a*K\xb8\x89\xdf\x8c\xfdIX\xbb$Y\ \x14\xf1q\x8c1Q3C^\xa0l\x03)\xe1E\xdb\ \xc5\x90\xa7\x86\x90y\xe5\x85X\xb7\xba\xd9\x0a\xaf\xa2X\ 8c\xa26\xe0\xb4\xdb\xb3;\xb4\xfb\xbbk\xeeP[\ \xc6\xf0\xb3\xed\x91\x5c\xfd:\xa1,\x0c\xee?\x92)\xd2\ \x0f,|\x1c\xdb\x0c\x93=W\xd4\xae\xdb\xde9\x9a\xa7\ l]\x88\xfa\xb9\x94q\x5c\x99\xadU\xafP\x9bj\xb6\ \xb2\xb8\xde\xdaN\x9b,^D\xcd\xd3`\xb0\xe7\xaa\xbd\ \x12\xac\xae\xcd\xdfn\xdb\xc59>5\xc2\xd6\xf1\x0b\x99\ \xff2Wf\xdb\x7f\xf1h\xac[\xbaI\x16\x1az\xa1\ e\xbd\xb6\x9d,\xfe\x19A\xf2\x9c\xf6\x95Y\x96g\xbb\ \x85I5\x0e\xa8\xf3\xaf\x9dcwG\xdcS\x5c\x99\xad\ ?Z\xc9[\xf3&Y\xd0\xf5V.>\xd3\x0fAj\ \xfc2CF\xa9\xbd\x0c\xf7\xed\x8d\xdf\xd8>nt\xf3\ \xcd\xee\x19$9'\x0a\xd4\x1f\x8f\xee\xd3\xebAt\x9c\ \xda\x1d\xebU?\xb7\x15\x1f\xb0\xae\xd9*\xd2\xeb\x08R\ \xe3\xfas\xcc\x00u\xd3\x91t\xdb,\xd4[c\x07\xdb\ >f\xb7\xc5>\xc1L<(\x97;[3N\xaa\xb7\ A\xc6I]'\xc2v\xc6\xaa\x1f\xa7\xca\xea\xe8\xf5_\ \xaa\xc3V~\xa0\xf6K\x1a\xa5\xe7~\xd3\x1f\x11;\xe4\ BsymW3\xdb\x89\x08P\xf3\xf2o\xbfJ\x9b\ \xce|\x09?\xba\x09\xc7\xea5\xdc\x96\x88\x8a\xe7\x98\xcd\ \xa93\xd5j~E\x91\x9aZ\xb4G]\x94\xbdV\xcf\ \x7f\x9d\xa4\x99\xe6'\xdb\xdc\xea[\x1b\xbe\xd6\xdb\xae\x93\ iR\x06\x08\xfd\x01\x87i\x1ab\xb6_X9\x13!\ \x1e\x01j\xbe\x84\x84\xe7\xd5U\x87S\x995[\xdaA\ \xf1\x10\xa7w[ye\xf7\xe4\xe9J=\x7f5\xfd\xd8\ \x01=\xde\xf1\x99)\xaa\xb2w\xbe~u\xfb\xfd\xcd\x93\ \xd4W\xd7\xfcW}b\xf9{j\x9f\x85\xc3\xd5\xaes\ \x9f\xd1\xcd\xd3\xee\xe7\xe0\x8ch\x8e\x95\xcd6\x0d\x01\xf2\ \xcet#\xf7.P\xcbN\x95\xfb\xd5\x95\xbb\xb1\xfd\x83\x81E\x8b\x18V\xa9\x15\xcd\xb6\ \x1a\x95\x9f\x80\xd1|\xbfs\xb6)1O8\x94\xc2\xd9\ yx\x15\x8c\xb5\xe1c\x84*k9mh\xe8\x85v\ \x1ep\xaaI\xca\xdb\xc7\x12\xabB\xb5t\xcd\x88\xf9\xbe\ \xe3\xd9\x5c\x8dkn\xf9\x11\x18k\xc3\xaaq\xa8\x8e\x0b\ ,\xe3\xb5\x9de\xf1\xd7v\x1f\xf4%9\xeb\xe1t~\ \x86\x8a\xc2\x98\xd1.\x86\xea\x08\xb3\xde\x1f\xae\xa5l?\ \x8a\xba\x08\x9e\xe4\x88\x19x\x89e\xcc60\xaaw[\ \xbb\x0f\xf8\x1dqO\xa9%Uep\ \x90\x9dM\xfd:\xc5K\x00\xa8\xf1\x220\x07\xea\x8fe\ v|\xf7\x94dr7\xce\xc3\xd7|\x06ce\x22\xf5\ \xcb\xe6\x97\x1a\xce\xd73+B\xe1\x82&A\x1f&\xcd\ \x8c-e;\xf8\xaa\x85\x01ce\xa7\x10\x8d}K,6\xa4\ \xac\xb2|\xb8\xa1\xc1\xec8v\xc0\xf4\xb8~\x9c*s\ 9\xd6WG\xdf\x0fcmX\x07Q<\xdc\xcf\xa2|\ [`,\x8b\xb3\xd7\x9b\x1e\xd7\xd8\x8c\xe5\xdc\x8d3\xd5\ \x09\x86\xa9\xb2U<|%OA\xa06-\xc0X\x22\ \xf6\xc4\x9b\x1e\xd7\x9d\xc5\x07\xb9\x1b\xe7\xbc\xf2B\x98\xaa\ g-\xb7\x9e\xd9*B,OA\x18\xbd\xfeK\xb8\xa1\ \xc1|\xb8u\x8a\xb97\x85\x94`\xb5\x8a\xc3L\x84\x1f\ \x8f\xee\x83\xa9z\xea\xae\xabH1\x963[\xed\xa1~\ \xe0)\x08\xfd\x92F\xc1\x0d\x0d\xe6\xe5U\x1f\x9b^\xff\ \x82G\xe8H\x0c\xc6\xda\xb0\x9cn\xf1{\x0bf#H\ \xe3y\x0a\xc2M\xb3\x1e\x85\x1b\x1a\xcc\x83I#M\x8d\ \xe9\x93\xc9c\xb9\x1cg\xba\x11\x09c\xf5\xa8qV\xcc\ \xb3\x1d\xc5\xd5\xcf\x0b\xb7\xa4\x9e\xa8\xae\x80#\x1a\x085\ \xda43\xa6tl\xc1#\xdf\xa5\xcf\x82\xa9z\x92,\ \xbef=\xb3\x95\xc5\xa1\xbc\x05\x82j\x80\x02\xe3\xa0|\ f3\xe39\xeb\xc0R.\xc7\xf9\x03\xd4Eh\xc4l\ \x85'\xadwf+\x0b}y\x0bD\xec\xc1epD\ \x838Zy\xdc\xf4x\xa6\x1d\xdd\xcf\xe5X\x8fX\xfb\ 9L\xd5\xd3/XY\xeac\xbd3\xdb\x88\xa0\xdbx\ \x0b\xc4'\xdb\xdcpE\x9b|!o\xa7\x04\xe9}\xb8\ xd\xf0\xb2wa\xac\x9e4E\xba\xc5rf\xdb6\ \xbcg o\x81xv\xe58\xb8\xa2A,\xccZc\ j,\xe9|\x98Wz$\xa2.\x82'Qc\x04\x87\ \x15\xd1\x1e\xae\x84\xa7@\x08\x09\xcf\xc3\x15\x0db\xca\xee\ \xb9\xa6\xc6\x92vw\xf8\x10\x09\x9dW\x17\xe1\xa8\xc3\xaa\ \xb8\x14q\x1bO\xc1\xa0\x8aT5*\x0a\xd2\x18\x81\xd9\ \xc5\xac\xe9\xdf\xe3\x95k\xa2\x1f\x80\xb16l\xb6[\xac\ k\xb6\xb28\x97\xb7\x80P\x0bh\xe0{^\x5c5\xde\ \xd48\xce\xd8\x9f\xc4\xe58\xd3\x8d9\x98\xaaG\xcd\xb6\ \xb2\xd9~\xc9[@V\xe4m\x813\x1a\xc0\x03\x8b^\ 35\x8e\xa9E{\xb8\x1c\xe7\xc3\xe5E0U\xcf\xfa\ \xdc\xcaf\xfb\x1ao\x01\x09\xdf=\x17\xceh\x00\xb7\xc6\ \x0e6\xef#\x88\x22\xe9\xad\xd2y\x84\xd2\xdd`\xaa\x9e\ ..\x89\xafX\xd9l\xfb\xf1\x16\x901\x1b&\xc2\x19\ }\x0c\x9d\x83w\x9c\xda\xdd\xb4\x18\xfe#\xf6qn\xc7\ z9\xea\x224R\x84F|\xc0\xb2f\xdbV\xeev\ \x03o\x01\x19\xb0\xf8\x0d\xb8\xa3\x8f9r\xb2\xd8\xd4\x18\ \x0eZ\xfa6\xb7cM\xb7\xe6`\xac\x1e\xaf\xeav\xb6\ \xac\xd9\x9emi~\x82\xa7\x80\xfcm\xf6 \xb8\xa3\x8f\ \xd9V\xb4\xd7\xd4\x18\xfe{\xf3$n\xc7\xfa\xfb\x9d\xb3\ a\xaa\x0dg\x22\x1c\xb7\x5c\x0b\xf3\x06\x8a\x88o\xe0*\ \xe9\x99\xe3\xf3>\xa3X\x90\xb5\xda\xd4\x18N\xdb\xb7\x90\ \xdb\xb1\x1e\xb75\x1c\xc6\xda\x90\x14a\x8d\xc3\xeah\x0f\ :\x99\xb7\xc0P\xaf,\xe0;~\xd85\xc7\xd4\xf8m\ .\xdc\xc5\xedX\xbf\x86\xba\x08\xec\xd4\xb1\xado\xb6\xd2\ p\xde\x02\x13\x97\x91\x0c\x87\xf4!\xa1\x9b\xc3P*\xd3\ $\x9eX\xfe\x1e\xcc\xb5\xe1\x0e\x0d\xff\xb4\xbe\xd9\xca\xa2\ \xc8[`>\xdb\x1e\x09\x87\xf4!\xcf\xa5\x8c\xc3\x99\xbb\ I\xf4L\xfc\x17\xcc\xb5\xc1j_\xc2}\x967[\x1e\ \x0b\xd2\xbc\x90\xf2\x11\x1c\xd2\x87\xf4^8\xdc\xb4\xd8=\ \xb2d\x0c\xd7c};\xea\x224\xa4\x9a\x80\xb0\x10\xa7\ \x83\x05\xb4\x87\xcd\xe1)8A\xf3_\x82C\xfa\x90[\ f?nZ\xec\xde\xdb\xf4\x1d\xd7c\xdd9\xba/\xcc\ \xb5~&\xc2!\x07+\x04\xc8\xe2\x0c\x9e\x82\xd3iZ\ \x1f\x14\xa4\xf1\x11gjj\xd4+\x22CL\x8b]\xe4\ \xde\x05\xdc\x8e\xf5\xa93\xd5\xfa\x995\xcc\xf5\xbc\x8fc\ \x8a0\x8d\x19\xb3u\xc9\xc2\xab\xbc\x05(\xbf\xa2\x08N\ \xe9\x03\x0a*\x8e\x9a\x1a\xb7\x8dGvp;\xd64g\ a\xae\x8c~\x1c\xe3\xb9k\xc3\xaa\xc3\xa9pJ\x1f\xb0\ \xa5p\x97\xa9\x99\x08\xa5\xa7\xca\xb9\x1dkJY\x84\xb9\ 2\xd2\x9d\xc1#1\x03\x7f\xa5=t)O\x01\x8a\xd8\ \x13\x0f\xa7\xf4\x01\x09\x87RL\x8b\xd9_c\x06r=\ \xd6T\xb1\x0e\xe6ZO%t\x13\xd6\xc1\x12\xdaC/\ \xe5)H\xefl\xfc\x16N\xe9\x03&\xed\x8c5-f\ \xfd\x17\x8f\xe6z\xacg\x1fD]\x84\xfa)_\xe2\x22\ \x07k\xb8\xdc\xc2\x7fx\x0a\xd2\xc0\xa5c\xe0\x94>\xe0\ \xfd\xcd\x93L\x8b\xd9\xdb\x1b\xbf\xc1\x1f6\x18\xec\xf9\xad\ \xcb\xc72g\xb6\x01\x8a\xd0\x9b\xa7 \xf1\x5c\xa6\xcf\x97\ \x0c[\xf9\x01\xb7G?\x85'\x8bM\xfd\xf7>J\x8d\ \x80\xb9\xd6\xcbD\x10C\x983\xdb\x8e\x91=~\xab=\ |%O\x05ixm\x85\xedK\xcc\xbc\xd1\xb4\xae\xe0\ G\xcb\xbcw\xe5\xe9S\xea}\xf1\xcf\xe9mj\xccb\ \xe4\xda\xff\xc1`\xcf\xcd\xaf-\xef,\x8b\xbfv\xb0\x88\ \xf6\x02Kx\x0a\xd6\xae\xe2\x0c\xb8e+\xb9y\xd6\xa3\ \xa6\xc5\xab\xb8\xaa\xd42\xef\xfd\xbf\x1f\xa3LOE{\ 2y,\x0c\xf6\xdc\xe23\x89\x0eV\xd1^`\x14O\ \xc1\x8a\xcfL\x81[\xb6\x82\xd35g\xd4\xf6J\xb0)\ \xb1\xfa\xd3\xcc\x01\x96y\xef\x83\xa5\xb9\xea\x95S{\xea\ \xcf5\xe1\xc7i\xa6\xfd\xbb\xbd\x12_\x85\xc9\x9e#i\ 8\xb3f\x1b\x18\x11\xfcW\x9e\x82\xf5\x85\xb6;\x01\xde\ cf\xf3\xc1\x87\x92^\xb7\xcc{SV\x84?>\xb4\ \xde\x11\xf7$\x0c\xb6\x8e\xda(\xc17:X\xc6\xa5\x88\ \x99\xbc\x04\xeb\xe5U\x1f\xc31[\xc1\xa6\xc2\x9d\xa6\xc5\ \xeaM\x8b\xf4\x8e\x8b\xcdX~\xces\xfdaZ\x1f}\ \x87o\x06\xd7NG]\x84:\xda\xef`\x9d\x00\xb7\x10\ \xc6K\xc0B\xe6\xbf\x0c\xc7l\x05s3W\x98\x16\xab\ )\x16\xe8\x8a\x5cRU\xa6\xde8\xb3\xbf_\xda\xaa\xa3\ .\xc2y\xe7\xb5\xb2\xf0-\xf3f\xebR\x84\x87y\x09\ \xd85\xd1\x0f\xc01[\xc1w\xe9\xb3\xb8\xba^My\ \xbe\x0d=\x1b\xf5\x053\x1a\xb3kP0P\xbf\xb6/\ \xfb;\xdb\xb0\x10'O)`GL\xce\x95\xb4\x13\xef\ n\xfc\xd6\xb48\x1d\xad<\xee\xd7w\xa5\xac\x03J\x17\ l\xe8\xd9\xa8{\x82\xd1\xa4\xa3.B\xdd,\x84\x93\x1d\ b\xc4\xcb\x1dv@{\xa18^\x02\xb76\x7f;\x5c\ \xd3K\x86\xae\x085%F\x7f\x9c\xd1\xcf\xefY\x17T\ \x03\xb9\xb1\xe73\xbad\xe7\xca\xbc\xad0\xda_4\xcb\ a\x17\x02di0/\x81S\xf6\xce\x87kzI\xf7\ \x05\xaf\x98\x12\xa3\xbe\x8bF\xfa\xf5=\xbfM\x8fi\xf2\ \x19\xd3\x0dn\x22\x1a{p\x19L\xf6\x97\xf3\xda\x81\xb6\ 1[\xda\xa2k/U\xc1C\xe0\xc6n\xfa\x1e\xae\xe9\ %T\x85\xcb\x8c\x18\x8d^\xff\xa5\xdf\xde\xf1P\xd9a\ \xf5wQ=\x9b|\xc6\xc9\xbb\xe2\x0c}\x0e\xd4E\xf8\ YeW\x85\xf5\xfd\x8d\xc3N\xb8\x14!\x96\x87\xe0\x0d\ Z\xfa6\x5c\xd3\x0b\xaakN\xab\xed\x94 Sb\x14\ \xee\xc7L\x84\xe6v\xb3}fE\xa8\xa1\xcf\xf1\xe1\xd6\ )0\xda\xda*_3\x1cv\xc3\xa9\x88\x83x\x08^\ \x979C\xe0\x9c^\x90s\xa2\xc0\xb4\x18\xad\xce\xdf\xe6\ \x97w\x5c\x90\xb5\xba\xd9\xcfH)aF\xf2\xda\xda\xcf\ a\xb6\xfa\xc71i\x80\xed\xcc\x96\xb6\xea\xda\xcb\x9d\xb0\ {\xf0\xe8\xba\xa9\x99\xc5D\xec\x02}\x9d7+FE\ \x95%\xa6\xbf\xdf\x89\xea\x0a\xf5\xa6\x16\xd6}\xd8w<\ \xdb\xb0\xe7\x19\xb2\x1cu\x11\x5cn\xe18\xb3\x85g\x9a\ \x91\x950\x9b\x87 \xee-9\x04\xf7l!s2\x92\ M\x89\xcd\x0d~\xcaD\xa0.\xbe-}V\xf7\x9e\x04\ \xc3\x9e\xc7\xcc\xeaj\x16N\xf9\x9a\xee\xb0+m#\xa5\ \x9e<\x04\x91~.\x82\x96\xf1\xf5\x8e\x99\xa6\xc4\xe6\x81\ E\xaf\x99\xfen\xdb\x8f\xee\xf5\xaa\xc0\xce\x0b)\x1f\x19\ \xf6Lt\xdc\xc5\xbd\xd9F\x04\x05\xd9\xd6l\xa9\xb7\x8f\ \xf6\x92\x19v\x0f\xe2\x97i\xd3\xe1\x9e-\xc4\xd3m*\ \xd63\x11\x9a\xca\xa9\xf5W\x8f\xb4\xab\xa3\xef\xe7\xddl\ \xf79T\xc7\x05\x0e;Cm'\xec\x1e\xc8\x7f\xad\xf9\ \x14\xee\xd9B\x9eJ~\xdf\x96\x99\x08T\x83\xa15\xcf\ K\xa9b\xbe\x86\x0a\x95s\x9f\x85\xe0\x16\xdev\xd8\x9d\ vJ\xd0\xef\xb5\x97=m\xe7@\xf6H|\x05\xee\xd9\ B\x82\xbd\xdc\xfdY9\x13\x81JFR\x15\xaf\xd6<\ \xef\xf4\xfdI>\x7f\xae\xdc\xf2#\xbc\x9b\xed\xa9\x0e\xb2\ x\xa5\x83\x07\xb4\x97M\xb0s0\xfd}\x1d\x94E\xfe\ \x12\xf3\x88)\xb11\xb3\xcf\x97/\xfa\xa9\xbd\xba\xe6\xbf\ \x86\x9c!sn\xb6q\x0e^p\xb9\xa5\x07\xed\x1eP\ \x7f\x17:a\x09*\xf7\xe7\xa9(\x0b\xab\x7f\x04\x93\xb2\ \xd7\xf9\xe4\x99o\x8b}\xc2\xe7\xcf\xb64w#\xe7G\ \x08\xd2\xfd\xdc\x98\xad#\xac\xcb\xc5\xdaK\xe7\xd99\xa0\ \x1b\x0av\xc0E\x9b\x09\x9dK\xda)\x13\xe1\xe4\xe9J\ \xf5\xd6\xd8\xc1>{n:\x8e\xf0%3\xf6'\xf1l\ \xb69\x8ed\xf1\x22\x07O\x04\xc8\xe2[v\x0ej\xd4\ \xbeD\xb8h3Y\x93\xbf\xdd\x94\x98\x8cZ7\xc1\x94\ \xf7\x19\xb75\xdc\xa7\xcfMEcXL\xb3\xb3h\xd1\ \x997\x1c\xbc\xe1\x9cvo\x00\x15\x81\xb0kPC7\ \x87\xc1E\x9bI\xcc\x81%\xb6\xc9D\xd8]\x9c\xa9^\ \x11\x19\xe2\xd3\xe7~\xdd\xc7\x7f$hnrj\xb6%\ \x81Q\xbd\xdb:xD{\xf9\xaf\xed\x1a\xd8\xc1\xcb\xde\ \x85\x8b6\x13\xea(k\x87\xee\x0cT\x83\xb6\xf7\xc2\xe1\ >\x7f\xee\xbb\xe6\x0e\xf5\xe9sRj\x22\xa7\xdds\xbf\ p\xf0\x8a3\xb2\xdb\xb5vM\x03\xbb#\xee)\xb8h\ 3\xa1\x9f\xf7v\xc8D\xa0\xa3#\x83>\xe8\xf8\xb4\x03\ \x08U\xa6\xe3\xd0l\xab]\xe1A\xd78x\xc6\xae\xa5\ \x17\xe9\xa7$\x95\x0d\x04\xd6X\xfcFg\x22\x90\x91\x1b\ \xd9\xad6>3\x85\xb9\x9cf\x94R\xb4\x18\x81\x11A\ w\xdb5\xc0\xfb\x0d\xac\xdad'\xee\x8d\x7f\xd6\xf0X\ \xdc\xbfp\x84\xa1\xef\xf0\xcf\xd5\x9f\x18\xfa\xfcom\xf8\ \xdag\xcfz\xcb\xec\xc7\xf9\xfb0\x16)\xde\xee\x00\xfa\ \xd9\xedF;\x06xQ\xf6Z8i30rGh\ F&\x02\xf5\xf32\xba-x\xb7\xf8\xe7}\xf6\xbcW\ E\xf5\xe2\xcdlW\xc3em^\x0dl\xe2\x8e\x19p\ \xd2&\xa0:\xaff\xc4\xc2\xa863Tg\xe0v\x13\ *h\xd1\xa5\x8f\x92\xaa\xb2V?oy\xf5I\xfe\xce\ k\x15A\x82\xcb\x9e\xb3\xbb\x15V\xda-\xc8\xc3\xd7|\ \x067m\x02\xaa\xfd\xcbr&\xc2g\xdb#\x99\xfa\xa5\ d\xd6\x05\x12\x0bi9\xdc\xb5\xfe\x872\xc9n\x81\xa6\ 4 \xd08\xcbr7\x99\x12\x8b#\x06d\x22\xec-\ \xc9R;N\xedn\xda|z\x7f\xf3\xa4V?\xf3\xe6\ \xc2]\x5c\x99-}\x13\x82\xbb6|v\xbb\xdcN\x81\ \xbe\x01\x05i\x9a$r\xef\x02f3\x11\x1e^<\xda\ \xd4\xf9\x142\xff\xe5V?3\xed\x8e9*\xa3\x98\x04\ W\xe5(3\xa1\xb8\xaa\x14\x8e\xda\x08\x1f\xa7\xcaLf\ \x22\xcc>\xb8\xd4/\xfd\xed\xcaN\x95[2\x17\xd8\x82\ \xaaA\x06BS5\x13\xb4\xbfFv\x0a\xfa\xa6\xc2\x9d\ p\xd4Fxe\xb5\xf1\xb7\x99|}\xdd\x95\xfe\x80\xde\ 8\xf3a\xbf\xcc\xa7\xe5\xb9\x9bZ\xf5\xec\x13\xd2\xa2y\ 1\xdb\xf9p\xd3\xa6v\xb7\x8a\xd0\x95\xfe*\xd9%\xe8\ F\x14\x7f\xb6\x13\xfd\x92F\x19\x1e\x83\xb0\x9d\xb1>}\ \xe677L\xf4\xdb|\x1a\x9f\x1a\xd1\xaag\xf7\xa6\xf1\ $\x83]s\xcf`W\xdb\xfc\xcc\x04\xc5.\x81\xff`\ \xcbd8j#\xdc\x11\xf7\xa4\xe11H9\xbc\xd5g\ \xcfK\xa53\xcd\xa8\xbdk\xd4G\xd7\x17W\x8d\xe7a\ W\x1b\x0e\x17m&\xbf\x9d\x1c\xdc\x91z\xba\xdb!\xf0\ O&\x8f\x85\xa36\xc2\xef\xa2z2\x93\x89@E\xce\ \xef\x9e7\xcc\xaf\xf3\x89\xb2\x1f*OWy\xfd\x0e\x03\ \x16\xbfa\xfb\xca^\x97G\xf6\xb8\x02.\xda\xb2\xcc\x84\ \xf7\xec\x10|_Wl\xb2\x13\xd4\xcd\xc2\xe8\xf1\xbf~\ \xfaC>{\xde\xaf\xd2\xa6[bN\xb5\xa6\x8f\x9a\x90\ \xf0\xbc\xbd\xaf\xe5\xba\xa57\xe1\x9e-\xa4\xb3,\xfe\xda\ \x0em\xcfi'B\xed\xacA}\xcc\xe8\x85\xd5\xc7G\ \xb9\xce\x19\xa5y\xa6\xec\xc2\x9b\xa3O\xb7)^\xbf\x07\ \xb5G\xb7\xb1\xd9\xeeu\xc4\x0c\xbc\x04\xee\xe9\x05NE\ \x1cd\x87I@\x0b\x15\xd4'1k\x0d3\x99\x08\x03\ \x96\xbci\x99\xf9D\x1f\x15\xbd\xc5\xccK\x18\xa6K\x16\ \xfb\xc15\xbdEu\x5c\xe0t\x8b\xebX\x9f\x04Kr\ \xd6\xc3Y\x1b\x80\xea\x15\x18=\xf6?\xec\x9a\xd3\xea\xe7\ \x9c\x97\xb9\xd2R\xf3\x89v\xd8Ug\xaa[\xfc\x1e\xc7\ \xabN\xd89\x03a%\x0c\xb3\xb5y\xb7\x91\xe2\xcd\xda\ @V\xb1<\x11\xbeM\x8f\x81\xb36\x80\x19\xedYZ\ \x9b\x89@\xc5_\xfe4s\x80\xe5\xe6\xd4\xc6#-o\ (J%?\xedyN+\x9el\xa3\x04\xdf\x08\xb7\xf4\ I\xdd\x04\xe9\x03\x96'\xc3\xc8\xb5\xff\x83\xb36\xc0\xb3\ +\xc7\x19>\xf6\x05\x15\xc7\x98\xcd\xa9mLt9\xc1\ \x9b\xb45\x9b\xeel\xdf\x83K\xfa\x8a\x89\xbd/\xd5v\ \xb7\xe9\xacN\x06\xb3Zh\xb3F\xaf\xc4W-\x9d\x89\ \xb0\xe9H\xba_sj\x1b\xd3\xc0\xa5cZ\xfc>\xf3\ \x0f\xad\xb2\xa3\xd1\xa6r\xd7\x9a\xdc\xf0\x9be\xb2x\x17\ \xdd\x0caqB\xd0\xcfPP\x9f\x9bg=j\xd9L\ \x04jit\x8f\x9fsj\x1b\xd3\x1f\xa6\xf5iq\x96\ \x8b\xbc'\xc1nF{\xba\xad\x12t'\xdc\xd1\x88\xec\ \x04\xb7\xf8=\xab\x13\xa3\xb4\x95\x05D\xec\x06\x19\x05\x15\ V\xb1j&\xc2w\xe9\xb3,?\xa7R\x8b\xf6\xb4\xe8\ \x9d\xcc\xac\xbdkNQpi\x22\x5c\xd1\xa8\xddmT\ \xef\xb6\xda g\xb381\xb6\x16\xed\x86\xc3\xd6!\xb7\ \xfc\x88e3\x11rN\x14\xa8\x9d\xb4\x9d\xa3\xdd>\xbc\ \x8e\xb1\xe8\xf9\xb3\x97:\xd81\xb2\xc7o\xe1\x8aF~\ ,\x93\xc5~,N\x8e\x99\x07\x16\xc3a\xeb@_\xd3\ \x8d\x1es\xea\x0d\xe6\x0dO,\x7f\x8f\x899E\xcfi\ \xb5\x0f\x92\xe6u\xcb\x15\xfa\xc2\x0dM9N\x90\xbec\ mr|\xb8u\x0a\x1c\xb6\x0es2\x92-\x99\x89\xb0\ k53s\x8a\x1ae\x9e\xa9\xa9i\xf6\xbb=\x94\ \xf4\xba]rj\xbf\x82\x0b\x9a{\x957\x8d\xa5\x092\ tE(\x1c\xb6\x0e\xd4\x0c\xd3j\x99\x08\xd4|\xf2&\ \x83?\xda\xf9Z;\x8b\x0f6\xfb\xfd\xee\xb6\xf0\x07\xbf\ \x16\x18\xedv\xcaN\x82\x0b\x9a\x9a{\xdb\xedV\x96.\ ;\xd0\x97m`\xde\xf9\xa17\xa5\x08\xdf\xdd\xf8-s\ \xe6\xd3\x92\xae\xc17\xce\xec\xcf\xfc\xe5\x85@\xb7t\x13\ \xdc\xcf?\xb5\x13\xc6\xb02Q\xae\x9c\xda\xb3E?\xf9\ \xec\xce\x90\xe5c\x8d\xbdH\xb2\xee\x8b\x16=\xcf\xb6\xa2\ \xbdj;%\x889\x03z\xa6\x99\xbf\x98h\xee\xb1\xf8\ ~\xe7e\x1f\xbc\x0e\xd7\xf3\x17\xa1\xa1\x17\xba\x14a\x19\ +\x93%\xab,\x1f.{\x161\xe1\x05\xcbtg\xa0\ 44)\xe1E&\x0d\x88v\xab\xcd\xa1\xa8\xb2\x84\xf5\ ]m\x22\xd5J\x81\xe9\xf9sw\x1b\xd9\xedZ-\x18\ \xc7X\x980\xcbZ\xd9?\xcaNP\xe7a\xabd\x22\ P\x8a\x18\xcbF\xb4\xefxv\x93\xef\xb8\xa7$\x93\xe5\ w,\x0c\x88\x0c\xb9\x1ang\x05\xc3\x8d\x08\x0a\xd2\x02\ Rm\xf5I3\xc9\xc7\xbd\xb0X\x85:\x0d\x04\xb8%\ \x833\x11\x8e6\xebY\xf2\xca\x0b\xf5\xdbX,\x9b\xad\ {OB\x93\xefI\x05\xc7\x19}\xbfS\xd4u\x1b.\ g\xadt\xb07\xad>qF\xf9\xb8\xcb+\xab\x1c(\ \xcd1t\x9c\xaf\x9b\xfe`\xb3\x9f\x85\xb2DX\xffB\ O}\xc5\x9a\x22\xce\x84T;\x9c\xd3\xf2\x82\xea\xb8 \ \xc0-\xcc\xb4\xf2\xc4\xa1\xc5m\xa7\x8a\x7f\x84\ \x9b\xb1q~;\xc0\xaa\xe5\x18\xa9\xc9!\xef\xbc\xb6\xf6\ sC\xc7xE\xde\x96F\xff\xfd\x1f\x8f\xee3\xbc\xe2\ \x98\xd9zu\xcd\x7f\x1b}\xe7\xa7\x93\xff\xcd\xca\xd1\xc1\ \x19\x97\x22=\x04\x17c\xcbp_\xb0\xe2d\x9a}p\ )\xf7f\xfb\xc8\x921~\xcbD\xa0\xe4\xfe\xe0\xf9/\ \xd9\xae\x88\xf6m\xb1O4:\xe6T\xdb\x97\x89|Z\ E|\x0e\xee\xc5 .Y\xfc\xd2j\x93\xe9\xe3T\x99\ {\xb3\xbdk\xeeP\xbfe\x22D\xec\x89\xb7m\xd3\xc3\ \xc3\xe5E\x1e\xdf\xfb\xce\xb8\xa7Yx\x87\xcf\xe1Z\xac\ B7\xcc\xdcb\x9c\x95&\xd4\xb0\x95\x1fpo\xb6F\ \xd6\x8am,\x13\x81\xcc\xe8\xea\xe8\xfbmk\xb6\xb1\x07\ \x97y|w\xfa#d\xed\x14/!\x96\xd6+L\x8b\ a:\xc5t\xbd,@\x16\xd7[eRu\x8b\x7f\x9e\ k\xa35\xba\x9dvc\xcd5\x9fK\x19g[\xa3m\ \xac3\x05\xb5\xf81\xfa\x12I+\xaf\xe2\xae\xa5u\x0a\ \xb7\xb2\x01\x81Qb'-\xa89V\x98XWE\xf5\ RkT~\x0b\xd2PI@\x7f\xdc\xd2[\x9c\xbd\xde\ \xd6FK\xa2\xe3\x99\x86\xa03l\x0b?wV\xfb)\ \xdd\xaf\x82K\xd9\x08J%\xd1\x02\x9bg\x85\x09F-\ ax\xc5h\xd3k(\x13\xe1\xe4\xe9J\xfd\x03\x92\xdd\ \xcd\x96v\xafGN\x16\xd7{\xff\x1d\xc7\x0eX5\xf3\ \xd7\xe9\x0e\xba\x1e\xeedC\x02\x22\xc5\x9b\xb5 \x17\ \xf9{\x92%\xe7m\xe6\xd6l\x8d\xfe@\x95_Q\xff\ #\x11u\xc9\xb0\xbb\xd1\xfe\xa4\xf8\xcc\x94z\xefO\xf3\ \xcd\x82\xcf\x9aO9\xf1p%{g(\xfc\xc3\xdfU\ \xc2ZR\xf0\xd9n\x8c\xdb\x1anh\x9b\x98\xf3\xd9]\ \x9c\xa9^\x11\x19\xc2\x8d\xd9\xbe\xb5\xe1\xebzc@\xe9\ \x86\x16\xdb\xd1\x1euM\x91n\x81\x1b\xf1p\x86\xab\x08\ ]\xb5\xa0\x97\xf9k\xb2\xbd\xb9a\x22\xb7f\xfb\xd2\xaa\ \xf1\x86\x8dk\xaf\xc4W\xcf\xf9\xb7\xe8l\xbc7#\xf9\ \xa5F~\x80\xfd~\xe7l+=ci\xa0,\xde\x05\ \x17\xe2\x08\xa7[\x0a\xa66\x1b\xfe\x98p\xfd\x17\x8f\xe6\ \xd6l\x1fX\xf4\x9ai\x99\x08S\xf7&re\xb4\xa4\ @ERK\xaa\xcaL\xfb5\xd1\xd2\xb66T\x0e\x15\ \xee\xc3\xe3\x91\x82\x22<\xec\x8f>f\x7f\x9b=\x88[\ \xb3\xbd5v\xb0)\x99\x08\xf4\xa1\x88\x8e\x15x3[\ RR\xf6\xbas\xc6|\x84\xc1\xd7\xa3\x9bytP\x85\ k\xb8\xbc\x1bn\xa4$\x98}\xa4@\xbb\x8f\x8a\xeaJ\ \xee\x8c\x96~\xd6w\x9c\xda\xdd\xb0qM8\xf4\xcb\xc7\ \xa1\xe1k>\xe3\xd2hITd\xa7.O,\x7f\xcf\ \xefG\x07.wP7\xb8\x0d\xa0,\x85{\xb5\xbf\xbc\ \xc7\xcd\x9c\x80iG\xf7sg\xb6\x05\x15\xc7\x0c\x1d\xd3\ \xbe\x8bF\xea\xad\x87\xc6\xa7FX:\x89\xdf\x8cR\x9e\ Ks6\xe8\xedr\x16d\xad\xd6\xdb\xba\xfb\xf1yJ\ \xb4X\xdc\x03\x97\x01u\xcfp\xbb\x98\x99\x166'#\ \x99;\xb3\xddR\xb8\x8b[\x03\xe4T\x85\xce\x88\xa0\xdb\ \xe0.\xc0SZ\xd8\x11\xb3\xaa\xebS\x87Y\x9e\xd4e\ \xce\x10\x18\x10?\xca\x0b\x8c\x08\xfe+\x5c\x054\xf2\xd1\ \xac\xdb\xadN\xb7x\x18\x8b\x05\x82\xbc\xbf\x19\x16\xa0\x04\ \xff\x1dn\x02\x9a\xa4\xfd\xd4\xfb~\xa7M\x9a\xcdX4\ \x10\xd4bm\xec \x8bW\xc2E@\xb3\xa1\xfeG\xda\ \xc4\x89\xc7\xe2\x81\xa0fJ\x16\xe7\xa2o\x18\xf0\x8e\x98\ \x81\xbfr)\xd2D,$\x08j\xd2hC\xa9\xc35\ L\x03\xb4\xf2\x1cW\x1c\xa1M\xa8\xd3XT\x10TO\ \xd5NYx\x1e.\x01|\x99\x1a\xf6\xa86\xb1N`\ qA\xd0\xcf*s\xc9R\x7f\xb8\x03\xf09m\xe5n\ 7h\x13l\x07\x16\x19\x04\x89ih7\x0e\x0c\xa5C\ \x8cx\xb96\xd1fc\xb1A\xbc*@\x91bh\x1d\ \xc0\x0d\x80\xf1\xa8\x8e\x0b\x9c\x8a8\x06\xe7\xb8\x10o\xe7\ \xb3\xf4\xfd\x02\x1f\xc2\x80\xe9\x04\xcab/\x7f\x17\x22\x87\ \x93.*\x14P\xd1&\xacz\xe0\xe7s\x5ca\x03\ \x16#dWQ\xf7[gD\xc8uX\xed\xc0\xff\x84\ \x86^X\x9b\x1ef~m\x5c\x082\xb6\x06-\x8e\x0d\ \x80%w\xb9\xc2\x1d\xda\x04\xdd\x83E\x0a\xb1\xff\x11L\ \xdcM\x95\xf0\xb0\xaa\x81e\xe9\x14\xd3\xf52\xcdp\xbf\ \xc2\x82\x85\x18\xde\xd1~E\xf3\x18\xab\x190A\x80[\ x\x9c\xeayb\xe1B,}\x04\xa3\xcb;X\xbd\x80\ =\xc3\x0d\x0bqj\xa6\x1b\xa6M\xe4\x1a,d\xc8\xc2\ &{\x86v\xb34_\xb1j\x01\xdb\xa6+\x0b\xf7\xd1\ \x19\x18\x165d\xc1L\x83]\xd4\x16\x0a\xab\x14\xd8\xea\ ,7@\x16?\xc1E\x08\xc82\x99\x06\xb2\x18\xdaY\ \x16\x7f\x8d\xd5\x09lz\x96+\xdd\xa3M\xf6T,v\ \xc8\x8f\xda\x1c(\x8bwa5\x02\xfbC\xd7}ea\ \xa0K\x113\xb1\xf0!\x13\x95\x11 \x0b}\xb1\x00\x01\ w\x5c\x15\xd6\xf77gk,\x94\xc1\x08 \x03UJ\ \xf3\x0c\xe9\x5c\x80{\xda)A\xbfw)R$\xb2\x16\ _g\x19P6L\xfb)\xdd\xaf\xc2*\x03\xa0\x0e\ T\xe8C[$\xaba\x12\x90\x0f\x8cv%\xb2\x0c\x00\ h\xdeG\xb4\xe50\x0c\xa8\xc5R\x84e\x81\x8a\xd0\x15\ \xab\x08\x80\x16\xe0T\xc4\x10j\x0d\x0d\x13\x81\xb0\x93\x05\ \xc0hBC/\x0c\x90\xa5\xc1\xdabJ\x87\xa1@\x0d\ \xb5\xa7\xd1\xfe(\x0f\xa2y\x82\xc5\x02\x80\xaf\x8e\x17\xb4\ \x9d\x8b\xb6\xb8\x12\xf0!\x8d{Q\xfc\x13\xb0\x93\x05\xc0\ `\xce\x16,\xff\xca\xe9\x16O\xc2x\xb8R\x05\xc5\x1d\ \x8d\x16\x010\x19\x97,v\xae-\xe7(\x1c\x87\x11\xd9\ Z%\x9a&\xb8\xc2\x83\xae\xc1\xac\x07\xc0\x9fL\xec}\ \xa9~#\xcd-.\xc1\x11\x83\xad\x8e\x0a\x96P\x5c\x1d\ 1\x03/\xc1$\x07\xc0\x82G\x0c\xb5\x05o\x84\x02\x18\ \x16\x93\xca\xa2\x0218*\x00\x80\x11j;FHO\ \x9d\xdd\xedV\xc3\xc4\xac\xdd\x22<\xc0-$\x05(\xe2\ \x10T\xe1\x02\x80a\xa8\x06\x03\x15 9{%\xf8\x04\ \xcc\xcd\x12:A\xf1\xa0\xb8P|0K\x01\xb0\x19m\ \x94\xe0vNE|\x8evR\xd8\xf1\x9a\xaeSN\xb7\ \xb8\xd0%K\xc3\xda\x86\xf7\x0c\xc4l\x04\x80\xa3\xa3\x86\ \xda[j\xc2W(\xf7h`'\x04Y\xfc\x84\xc6\x19\ U\xb7\x00\x00:\xce\x88\x90\xeb4\xd3\x1dQ{\xce+\ T\xc1,\xbdR%]8p\xba\xa5\x17h<1\xab\ \x00\x00M\x1e7\xb8\xdc\xd2\x83\x01n\xe1S\xcd\x00\x00\x00\x00\x00\x01\x00\x00n|\ \x00\x00\x01r\x0e\xc2\x8cW\ " 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() examples/widgets/systray/systray.pyproject000066400000000000000000000000711376617013100215420ustar00rootroot00000000000000{ "files": ["main.py", "window.py", "systray.qrc"] } examples/widgets/systray/systray.qrc000066400000000000000000000002561376617013100203150ustar00rootroot00000000000000 images/bad.png images/heart.png images/trash.png examples/widgets/systray/window.py000066400000000000000000000250471376617013100177560ustar00rootroot00000000000000############################################################################# ## ## 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 Quit 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) examples/widgets/threads/000077500000000000000000000000001376617013100160015ustar00rootroot00000000000000examples/widgets/threads/thread_signals.py000066400000000000000000000072211376617013100213440ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/tutorials/000077500000000000000000000000001376617013100163755ustar00rootroot00000000000000examples/widgets/tutorials/addressbook/000077500000000000000000000000001376617013100206755ustar00rootroot00000000000000examples/widgets/tutorials/addressbook/addressbook.pyproject000066400000000000000000000001641376617013100251370ustar00rootroot00000000000000{ "files": ["part3.py", "part1.py", "part5.py", "part2.py", "part7.py", "part6.py", "part4.py"] } examples/widgets/tutorials/addressbook/part1.py000066400000000000000000000055301376617013100223010ustar00rootroot00000000000000 ############################################################################# ## ## 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 AddressBook(QtWidgets.QWidget): def __init__(self, parent=None): super(AddressBook, self).__init__(parent) nameLabel = QtWidgets.QLabel("Name:") self.nameLine = QtWidgets.QLineEdit() addressLabel = QtWidgets.QLabel("Address:") self.addressText = QtWidgets.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) self.setLayout(mainLayout) self.setWindowTitle("Simple Address Book") if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part2.py000066400000000000000000000141071376617013100223020ustar00rootroot00000000000000 ############################################################################# ## ## 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 SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): def __init__(self, parent=None): super(AddressBook, self).__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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.setEnabled(True) self.submitButton.hide() self.cancelButton.hide() def cancel(self): self.nameLine.setText(self.oldName) self.nameLine.setReadOnly(True) self.addressText.setText(self.oldAddress) self.addressText.setReadOnly(True) self.addButton.setEnabled(True) self.submitButton.hide() self.cancelButton.hide() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part3.py000066400000000000000000000201051376617013100222760ustar00rootroot00000000000000 ############################################################################# ## ## 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 SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): def __init__(self, parent=None): super(AddressBook, self).__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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.setEnabled(True) number = len(self.contacts) self.nextButton.setEnabled(number > 1) self.previousButton.setEnabled(number > 1) self.submitButton.hide() self.cancelButton.hide() def cancel(self): self.nameLine.setText(self.oldName) self.addressText.setText(self.oldAddress) if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.setEnabled(True) number = len(self.contacts) self.nextButton.setEnabled(number > 1) self.previousButton.setEnabled(number > 1) self.submitButton.hide() self.cancelButton.hide() def next(self): name = self.nameLine.text() it = iter(self.contacts) try: while True: this_name, _ = it.next() if this_name == name: next_name, next_address = it.next() break except StopIteration: next_name, next_address = iter(self.contacts).next() self.nameLine.setText(next_name) self.addressText.setText(next_address) def previous(self): name = self.nameLine.text() prev_name = prev_address = None for this_name, this_address in self.contacts: if this_name == name: break prev_name = this_name prev_address = this_address else: self.nameLine.clear() self.addressText.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) if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part4.py000066400000000000000000000250451376617013100223070ustar00rootroot00000000000000 ############################################################################# ## ## 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 SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(AddressBook, self).__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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.updateInterface(self.EditingMode) def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name and address.") return if self.currentMode == 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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.currentMode == self.EditingMode: if self.oldName != 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] self.contacts[name] = address else: QtWidgets.QMessageBox.information(self, "Edit Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.oldAddress != address: QtWidgets.QMessageBox.information(self, "Edit Successful", "\"%s\" has been edited in your address book." % name) self.contacts[name] = address self.updateInterface(self.NavigationMode) def cancel(self): self.nameLine.setText(self.oldName) self.addressText.setText(self.oldAddress) self.updateInterface(self.NavigationMode) def removeContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() 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) if button == QtWidgets.QMessageBox.Yes: self.previous() del self.contacts[name] QtWidgets.QMessageBox.information(self, "Remove Successful", "\"%s\" has been removed from your address book." % name) self.updateInterface(self.NavigationMode) def next(self): name = self.nameLine.text() it = iter(self.contacts) try: while True: this_name, _ = it.next() if this_name == name: next_name, next_address = it.next() break except StopIteration: next_name, next_address = iter(self.contacts).next() self.nameLine.setText(next_name) self.addressText.setText(next_address) def previous(self): name = self.nameLine.text() prev_name = prev_address = None for this_name, this_address in self.contacts: if this_name == name: break prev_name = this_name prev_address = this_address else: self.nameLine.clear() self.addressText.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) def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() elif self.currentMode == self.NavigationMode: if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.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.submitButton.hide() self.cancelButton.hide() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part5.py000066400000000000000000000306651376617013100223140ustar00rootroot00000000000000 ############################################################################# ## ## 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 SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(AddressBook, self).__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.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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.updateInterface(self.EditingMode) def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name and address.") return if self.currentMode == 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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.currentMode == self.EditingMode: if self.oldName != 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] self.contacts[name] = address else: QtWidgets.QMessageBox.information(self, "Edit Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.oldAddress != address: QtWidgets.QMessageBox.information(self, "Edit Successful", "\"%s\" has been edited in your address book." % name) self.contacts[name] = address self.updateInterface(self.NavigationMode) def cancel(self): self.nameLine.setText(self.oldName) self.addressText.setText(self.oldAddress) self.updateInterface(self.NavigationMode) def removeContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() 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) if button == QtWidgets.QMessageBox.Yes: self.previous() del self.contacts[name] QtWidgets.QMessageBox.information(self, "Remove Successful", "\"%s\" has been removed from your address book." % name) self.updateInterface(self.NavigationMode) def next(self): name = self.nameLine.text() it = iter(self.contacts) try: while True: this_name, _ = it.next() if this_name == name: next_name, next_address = it.next() break except StopIteration: next_name, next_address = iter(self.contacts).next() self.nameLine.setText(next_name) self.addressText.setText(next_address) def previous(self): name = self.nameLine.text() prev_name = prev_address = None for this_name, this_address in self.contacts: if this_name == name: break prev_name = this_name prev_address = this_address else: self.nameLine.clear() self.addressText.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) def findContact(self): self.dialog.show() if self.dialog.exec_() == QtWidgets.QDialog.Accepted: contactName = self.dialog.getFindText() if contactName in self.contacts: self.nameLine.setText(contactName) self.addressText.setText(self.contacts[contactName]) else: QtWidgets.QMessageBox.information(self, "Contact Not Found", "Sorry, \"%s\" is not in your address book." % contactName) return self.updateInterface(self.NavigationMode) def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() elif self.currentMode == self.NavigationMode: if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.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.submitButton.hide() self.cancelButton.hide() class FindDialog(QtWidgets.QDialog): def __init__(self, parent=None): super(FindDialog, self).__init__(parent) findLabel = QtWidgets.QLabel("Enter the name of a contact:") self.lineEdit = QtWidgets.QLineEdit() self.findButton = QtWidgets.QPushButton("&Find") self.findText = '' layout = QtWidgets.QHBoxLayout() layout.addWidget(findLabel) layout.addWidget(self.lineEdit) layout.addWidget(self.findButton) self.setLayout(layout) self.setWindowTitle("Find a Contact") self.findButton.clicked.connect(self.findClicked) self.findButton.clicked.connect(self.accept) def findClicked(self): text = self.lineEdit.text() if not text: QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name.") return else: self.findText = text self.lineEdit.clear() self.hide() def getFindText(self): return self.findText if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part6.py000066400000000000000000000351321376617013100223070ustar00rootroot00000000000000 ############################################################################# ## ## 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 pickle from PySide2 import QtCore, QtWidgets class SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(AddressBook, self).__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.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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.updateInterface(self.EditingMode) def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name and address.") return if self.currentMode == 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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.currentMode == self.EditingMode: if self.oldName != 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] self.contacts[name] = address else: QtWidgets.QMessageBox.information(self, "Edit Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.oldAddress != address: QtWidgets.QMessageBox.information(self, "Edit Successful", "\"%s\" has been edited in your address book." % name) self.contacts[name] = address self.updateInterface(self.NavigationMode) def cancel(self): self.nameLine.setText(self.oldName) self.addressText.setText(self.oldAddress) self.updateInterface(self.NavigationMode) def removeContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() 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) if button == QtWidgets.QMessageBox.Yes: self.previous() del self.contacts[name] QtWidgets.QMessageBox.information(self, "Remove Successful", "\"%s\" has been removed from your address book." % name) self.updateInterface(self.NavigationMode) def next(self): name = self.nameLine.text() it = iter(self.contacts) try: while True: this_name, _ = it.next() if this_name == name: next_name, next_address = it.next() break except StopIteration: next_name, next_address = iter(self.contacts).next() self.nameLine.setText(next_name) self.addressText.setText(next_address) def previous(self): name = self.nameLine.text() prev_name = prev_address = None for this_name, this_address in self.contacts: if this_name == name: break prev_name = this_name prev_address = this_address else: self.nameLine.clear() self.addressText.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) def findContact(self): self.dialog.show() if self.dialog.exec_() == QtWidgets.QDialog.Accepted: contactName = self.dialog.getFindText() if contactName in self.contacts: self.nameLine.setText(contactName) self.addressText.setText(self.contacts[contactName]) else: QtWidgets.QMessageBox.information(self, "Contact Not Found", "Sorry, \"%s\" is not in your address book." % contactName) return self.updateInterface(self.NavigationMode) def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() self.loadButton.setEnabled(False) self.saveButton.setEnabled(False) elif self.currentMode == self.NavigationMode: if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.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.submitButton.hide() self.cancelButton.hide() self.loadButton.setEnabled(True) self.saveButton.setEnabled(number >= 1) def saveToFile(self): fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self, "Save Address Book", '', "Address Book (*.abk);;All Files (*)") if not fileName: return try: out_file = open(str(fileName), 'wb') except IOError: QtWidgets.QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % 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 (*)") if not fileName: return try: in_file = open(str(fileName), 'rb') except IOError: QtWidgets.QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % 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.") else: for name, address in self.contacts: self.nameLine.setText(name) self.addressText.setText(address) self.updateInterface(self.NavigationMode) class FindDialog(QtWidgets.QDialog): def __init__(self, parent=None): super(FindDialog, self).__init__(parent) findLabel = QtWidgets.QLabel("Enter the name of a contact:") self.lineEdit = QtWidgets.QLineEdit() self.findButton = QtWidgets.QPushButton("&Find") self.findText = '' layout = QtWidgets.QHBoxLayout() layout.addWidget(findLabel) layout.addWidget(self.lineEdit) layout.addWidget(self.findButton) self.setLayout(layout) self.setWindowTitle("Find a Contact") self.findButton.clicked.connect(self.findClicked) self.findButton.clicked.connect(self.accept) def findClicked(self): text = self.lineEdit.text() if not text: QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name.") return self.findText = text self.lineEdit.clear() self.hide() def getFindText(self): return self.findText if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/tutorials/addressbook/part7.py000066400000000000000000000403731376617013100223130ustar00rootroot00000000000000 ############################################################################# ## ## 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 pickle from PySide2 import QtCore, QtWidgets class SortedDict(dict): class Iterator(object): def __init__(self, sorted_dict): self._dict = sorted_dict self._keys = sorted(self._dict.keys()) self._nr_items = len(self._keys) self._idx = 0 def __iter__(self): return self def next(self): if self._idx >= self._nr_items: raise StopIteration key = self._keys[self._idx] value = self._dict[key] self._idx += 1 return key, value __next__ = next def __iter__(self): return SortedDict.Iterator(self) iterkeys = __iter__ class AddressBook(QtWidgets.QWidget): NavigationMode, AddingMode, EditingMode = range(3) def __init__(self, parent=None): super(AddressBook, self).__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.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.setWindowTitle("Simple Address Book") def addContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.nameLine.clear() self.addressText.clear() self.updateInterface(self.AddingMode) def editContact(self): self.oldName = self.nameLine.text() self.oldAddress = self.addressText.toPlainText() self.updateInterface(self.EditingMode) def submitContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() if name == "" or address == "": QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name and address.") return if self.currentMode == 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) else: QtWidgets.QMessageBox.information(self, "Add Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.currentMode == self.EditingMode: if self.oldName != 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] self.contacts[name] = address else: QtWidgets.QMessageBox.information(self, "Edit Unsuccessful", "Sorry, \"%s\" is already in your address book." % name) return elif self.oldAddress != address: QtWidgets.QMessageBox.information(self, "Edit Successful", "\"%s\" has been edited in your address book." % name) self.contacts[name] = address self.updateInterface(self.NavigationMode) def cancel(self): self.nameLine.setText(self.oldName) self.addressText.setText(self.oldAddress) self.updateInterface(self.NavigationMode) def removeContact(self): name = self.nameLine.text() address = self.addressText.toPlainText() 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) if button == QtWidgets.QMessageBox.Yes: self.previous() del self.contacts[name] QtWidgets.QMessageBox.information(self, "Remove Successful", "\"%s\" has been removed from your address book." % name) self.updateInterface(self.NavigationMode) def next(self): name = self.nameLine.text() it = iter(self.contacts) try: while True: this_name, _ = it.next() if this_name == name: next_name, next_address = it.next() break except StopIteration: next_name, next_address = iter(self.contacts).next() self.nameLine.setText(next_name) self.addressText.setText(next_address) def previous(self): name = self.nameLine.text() prev_name = prev_address = None for this_name, this_address in self.contacts: if this_name == name: break prev_name = this_name prev_address = this_address else: self.nameLine.clear() self.addressText.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) def findContact(self): self.dialog.show() if self.dialog.exec_() == QtWidgets.QDialog.Accepted: contactName = self.dialog.getFindText() if contactName in self.contacts: self.nameLine.setText(contactName) self.addressText.setText(self.contacts[contactName]) else: QtWidgets.QMessageBox.information(self, "Contact Not Found", "Sorry, \"%s\" is not in your address book." % contactName) return self.updateInterface(self.NavigationMode) def updateInterface(self, mode): self.currentMode = mode if self.currentMode in (self.AddingMode, self.EditingMode): self.nameLine.setReadOnly(False) self.nameLine.setFocus(QtCore.Qt.OtherFocusReason) self.addressText.setReadOnly(False) self.addButton.setEnabled(False) self.editButton.setEnabled(False) self.removeButton.setEnabled(False) self.nextButton.setEnabled(False) self.previousButton.setEnabled(False) self.submitButton.show() self.cancelButton.show() self.loadButton.setEnabled(False) self.saveButton.setEnabled(False) self.exportButton.setEnabled(False) elif self.currentMode == self.NavigationMode: if not self.contacts: self.nameLine.clear() self.addressText.clear() self.nameLine.setReadOnly(True) self.addressText.setReadOnly(True) self.addButton.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.submitButton.hide() self.cancelButton.hide() self.exportButton.setEnabled(number >= 1) self.loadButton.setEnabled(True) self.saveButton.setEnabled(number >= 1) def saveToFile(self): fileName,_ = QtWidgets.QFileDialog.getSaveFileName(self, "Save Address Book", '', "Address Book (*.abk);;All Files (*)") if not fileName: return try: out_file = open(str(fileName), 'wb') except IOError: QtWidgets.QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % 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 (*)") if not fileName: return try: in_file = open(str(fileName), 'rb') except IOError: QtWidgets.QMessageBox.information(self, "Unable to open file", "There was an error opening \"%s\"" % 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.") else: for name, address in self.contacts: self.nameLine.setText(name) self.addressText.setText(address) self.updateInterface(self.NavigationMode) def exportAsVCard(self): name = str(self.nameLine.text()) address = self.addressText.toPlainText() nameList = name.split() if len(nameList) > 1: firstName = nameList[0] lastName = nameList[-1] else: firstName = name lastName = '' fileName = QtWidgets.QFileDialog.getSaveFileName(self, "Export Contact", '', "vCard Files (*.vcf);;All Files (*)")[0] if not fileName: return out_file = QtCore.QFile(fileName) if not out_file.open(QtCore.QIODevice.WriteOnly): QtWidgets.QMessageBox.information(self, "Unable to open file", out_file.errorString()) return out_s = QtCore.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' address.replace(';', '\\;') address.replace('\n', ';') address.replace(',', ' ') 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) class FindDialog(QtWidgets.QDialog): def __init__(self, parent=None): super(FindDialog, self).__init__(parent) findLabel = QtWidgets.QLabel("Enter the name of a contact:") self.lineEdit = QtWidgets.QLineEdit() self.findButton = QtWidgets.QPushButton("&Find") self.findText = '' layout = QtWidgets.QHBoxLayout() layout.addWidget(findLabel) layout.addWidget(self.lineEdit) layout.addWidget(self.findButton) self.setLayout(layout) self.setWindowTitle("Find a Contact") self.findButton.clicked.connect(self.findClicked) self.findButton.clicked.connect(self.accept) def findClicked(self): text = self.lineEdit.text() if not text: QtWidgets.QMessageBox.information(self, "Empty Field", "Please enter a name.") return self.findText = text self.lineEdit.clear() self.hide() def getFindText(self): return self.findText if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) addressBook = AddressBook() addressBook.show() sys.exit(app.exec_()) examples/widgets/widgets/000077500000000000000000000000001376617013100160155ustar00rootroot00000000000000examples/widgets/widgets/hellogl_openglwidget_legacy.py000066400000000000000000000235741376617013100241240ustar00rootroot00000000000000 ############################################################################ ## ## 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) examples/widgets/widgets/tetrix.py000066400000000000000000000405471376617013100177200ustar00rootroot00000000000000 ############################################################################# ## ## 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_()) examples/widgets/widgets/widgets.pyproject000066400000000000000000000001011376617013100214140ustar00rootroot00000000000000{ "files": ["tetrix.py", "hellogl_openglwidget_legacy.py"] } examples/xml/000077500000000000000000000000001376617013100135015ustar00rootroot00000000000000examples/xml/dombookmarks/000077500000000000000000000000001376617013100161715ustar00rootroot00000000000000examples/xml/dombookmarks/dombookmarks.py000066400000000000000000000231221376617013100212330ustar00rootroot00000000000000 ############################################################################# ## ## 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 xml/dombookmarks example from Qt v5.x""" from PySide2 import QtCore, QtGui, QtWidgets, QtXml class MainWindow(QtWidgets.QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.xbelTree = XbelTree() self.setCentralWidget(self.xbelTree) self.createActions() self.createMenus() self.statusBar().showMessage("Ready") self.setWindowTitle("DOM Bookmarks") self.resize(480, 320) def open(self): fileName = QtWidgets.QFileDialog.getOpenFileName(self, "Open Bookmark File", QtCore.QDir.currentPath(), "XBEL Files (*.xbel *.xml)")[0] if not fileName: return inFile = QtCore.QFile(fileName) if not inFile.open(QtCore.QFile.ReadOnly | QtCore.QFile.Text): QtWidgets.QMessageBox.warning(self, "DOM Bookmarks", "Cannot read file %s:\n%s." % (fileName, inFile.errorString())) return if self.xbelTree.read(inFile): self.statusBar().showMessage("File loaded", 2000) def saveAs(self): fileName = QtWidgets.QFileDialog.getSaveFileName(self, "Save Bookmark File", QtCore.QDir.currentPath(), "XBEL Files (*.xbel *.xml)")[0] if not fileName: return outFile = QtCore.QFile(fileName) if not outFile.open(QtCore.QFile.WriteOnly | QtCore.QFile.Text): QtWidgets.QMessageBox.warning(self, "DOM Bookmarks", "Cannot write file %s:\n%s." % (fileName, outFile.errorString())) return if self.xbelTree.write(outFile): self.statusBar().showMessage("File saved", 2000) def about(self): QtWidgets.QMessageBox.about(self, "About DOM Bookmarks", "The DOM Bookmarks example demonstrates how to use Qt's " "DOM classes to read and write XML documents.") def createActions(self): self.openAct = QtWidgets.QAction("&Open...", self, shortcut="Ctrl+O", triggered=self.open) self.saveAsAct = QtWidgets.QAction("&Save As...", self, shortcut="Ctrl+S", triggered=self.saveAs) self.exitAct = QtWidgets.QAction("E&xit", self, shortcut="Ctrl+Q", triggered=self.close) self.aboutAct = QtWidgets.QAction("&About", self, triggered=self.about) self.aboutQtAct = QtWidgets.QAction("About &Qt", self, triggered=qApp.aboutQt) def createMenus(self): self.fileMenu = self.menuBar().addMenu("&File") self.fileMenu.addAction(self.openAct) self.fileMenu.addAction(self.saveAsAct) self.fileMenu.addAction(self.exitAct) self.menuBar().addSeparator() self.helpMenu = self.menuBar().addMenu("&Help") self.helpMenu.addAction(self.aboutAct) self.helpMenu.addAction(self.aboutQtAct) class XbelTree(QtWidgets.QTreeWidget): def __init__(self, parent=None): super(XbelTree, self).__init__(parent) self.header().setSectionResizeMode(QtWidgets.QHeaderView.Stretch) self.setHeaderLabels(("Title", "Location")) self.domDocument = QtXml.QDomDocument() self.domElementForItem = {} self.folderIcon = QtGui.QIcon() self.bookmarkIcon = QtGui.QIcon() self.folderIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirClosedIcon), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.folderIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_DirOpenIcon), QtGui.QIcon.Normal, QtGui.QIcon.On) self.bookmarkIcon.addPixmap(self.style().standardPixmap(QtWidgets.QStyle.SP_FileIcon)) def read(self, device): ok, errorStr, errorLine, errorColumn = self.domDocument.setContent(device, True) if not ok: QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks", "Parse error at line %d, column %d:\n%s" % (errorLine, errorColumn, errorStr)) return False root = self.domDocument.documentElement() if root.tagName() != 'xbel': QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks", "The file is not an XBEL file.") return False elif root.hasAttribute('version') and root.attribute('version') != '1.0': QtWidgets.QMessageBox.information(self.window(), "DOM Bookmarks", "The file is not an XBEL version 1.0 file.") return False self.clear() # It might not be connected. try: self.itemChanged.disconnect(self.updateDomElement) except: pass child = root.firstChildElement('folder') while not child.isNull(): self.parseFolderElement(child) child = child.nextSiblingElement('folder') self.itemChanged.connect(self.updateDomElement) return True def write(self, device): indentSize = 4 out = QtCore.QTextStream(device) self.domDocument.save(out, indentSize) return True def updateDomElement(self, item, column): element = self.domElementForItem.get(id(item)) if not element.isNull(): if column == 0: oldTitleElement = element.firstChildElement('title') newTitleElement = self.domDocument.createElement('title') newTitleText = self.domDocument.createTextNode(item.text(0)) newTitleElement.appendChild(newTitleText) element.replaceChild(newTitleElement, oldTitleElement) else: if element.tagName() == 'bookmark': element.setAttribute('href', item.text(1)) def parseFolderElement(self, element, parentItem=None): item = self.createItem(element, parentItem) title = element.firstChildElement('title').text() if not title: title = "Folder" item.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) item.setIcon(0, self.folderIcon) item.setText(0, title) folded = (element.attribute('folded') != 'no') self.setItemExpanded(item, not folded) child = element.firstChildElement() while not child.isNull(): if child.tagName() == 'folder': self.parseFolderElement(child, item) elif child.tagName() == 'bookmark': childItem = self.createItem(child, item) title = child.firstChildElement('title').text() if not title: title = "Folder" childItem.setFlags(item.flags() | QtCore.Qt.ItemIsEditable) childItem.setIcon(0, self.bookmarkIcon) childItem.setText(0, title) childItem.setText(1, child.attribute('href')) elif child.tagName() == 'separator': childItem = self.createItem(child, item) childItem.setFlags(item.flags() & ~(QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsEditable)) childItem.setText(0, 30 * "\xb7") child = child.nextSiblingElement() def createItem(self, element, parentItem=None): item = QtWidgets.QTreeWidgetItem() if parentItem is not None: item = QtWidgets.QTreeWidgetItem(parentItem) else: item = QtWidgets.QTreeWidgetItem(self) self.domElementForItem[id(item)] = element return item if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() mainWin.open() sys.exit(app.exec_()) examples/xml/dombookmarks/dombookmarks.pyproject000066400000000000000000000001041376617013100226150ustar00rootroot00000000000000{ "files": ["jennifer.xbel", "frank.xbel", "dombookmarks.py"] } examples/xml/dombookmarks/frank.xbel000066400000000000000000000247671376617013100201660ustar00rootroot00000000000000 Literate Programming Synopsis of Literate Programming Literate Programming: Propaganda and Tools Literate Programming by Henrik Turbell Literate Programming Library Literate Programming Basics Literate Programming Overview POD is not Literate Programming Computers That We Can Count On Literate Programming - Issues and Problems Literate Programming - Wiki Pages What is well-commented code? Bibliography on literate programming - A searchable bibliography Program comprehension and code reading bibliography Elucidative Programming AVL Trees (TexiWeb) Literate Programming on Wikiverse Physically Based Rendering: From Theory to Implementation Useful C++ Links STL STL Reference Documentation STL Tutorial STL Reference Qt Qt 2.3 Reference Qt 3.3 Reference Qt 4.0 Reference Trolltech Home Page IOStreams IO Stream Library Binary I/O I/O Stream FAQ gdb GDB Tutorial Debugging with GDB GDB Quick Reference Page (PDF) (Handy) Classes and Constructors Constructor FAQ Organizing Classes Software Documentation or System Documentation The Almighty Thud Microsoft Coding Techniques and Programming Practices Software and Documentation The Source Code is the Design What is Software Design? How To Write Unmaintainable Code Self Documenting Program Code Remains a Distant Goal Place Tab A in Slot B UML Reference Card TeX Resources The TeX User's Group MikTeX website MetaPost website HEVEA is a quite complete and fast LATEX to HTML translator Portable Document Format (PDF) Adobe - The postscript and PDF standards Reference Manual Portable Document Format Adobe Acrobat Software Development Kit Literature Sites Guide to Special Collections (Columbia University) Literary Criticism on the Web from the Internet Public Library Victorian Web. Voice of the Shuttle. Modernist Journals Project Museum of American Poetics Modern American Poetry FindArticles.com Literary History Literary Encyclopedia The University of California Press Wright American Fiction, 1851-1875 Documenting the American South: Beginnings to 1920 Electronic Text Center at the University of Virginia The Schomburg Center for Research in Black Culture Alex Catalog of Electronic Texts. examples/xml/dombookmarks/jennifer.xbel000066400000000000000000000075421376617013100206550ustar00rootroot00000000000000 Qt Resources Trolltech Partners Training Partners Consultants and System Integrators Technology Partners Value Added Resellers (VARs) Community Resources QtForum.org The Independent Qt Tutorial French PROG.Qt German Qt Forum Korean Qt Community Site Russian Qt Forum Digitalfanatics: The QT 4 Resource Center QtQuestions Qt Quarterly Trolltech's home page Qt 4.0 documentation Frequently Asked Questions Online Dictionaries Dictionary.com Merriam-Webster Online Cambridge Dictionaries Online OneLook Dictionary Search The New English-German Dictionary TU Chemnitz German-English Dictionary Trésor de la Langue Française informatisé Dictionnaire de l'Académie Française Dictionnaire des synonymes examples/xmlpatterns/000077500000000000000000000000001376617013100152625ustar00rootroot00000000000000examples/xmlpatterns/schema/000077500000000000000000000000001376617013100165225ustar00rootroot00000000000000examples/xmlpatterns/schema/files/000077500000000000000000000000001376617013100176245ustar00rootroot00000000000000examples/xmlpatterns/schema/files/contact.xsd000066400000000000000000000016731376617013100220060ustar00rootroot00000000000000 examples/xmlpatterns/schema/files/invalid_contact.xml000066400000000000000000000004351376617013100235110ustar00rootroot00000000000000 John Doe Prof. Sandakerveien 116 N-0550 Oslo Norway examples/xmlpatterns/schema/files/invalid_order.xml000066400000000000000000000004561376617013100231740ustar00rootroot00000000000000 234219
21692 3
24749 9
2009-01-23 yes
examples/xmlpatterns/schema/files/invalid_recipe.xml000066400000000000000000000011251376617013100233220ustar00rootroot00000000000000 Cheese on Toast examples/xmlpatterns/schema/files/order.xsd000066400000000000000000000015471376617013100214660ustar00rootroot00000000000000 examples/xmlpatterns/schema/files/recipe.xsd000066400000000000000000000030051376617013100216110ustar00rootroot00000000000000 examples/xmlpatterns/schema/files/valid_contact.xml000066400000000000000000000004521376617013100231610ustar00rootroot00000000000000 John Doe 1977-12-25 Sandakerveien 116 N-0550 Oslo Norway examples/xmlpatterns/schema/files/valid_order.xml000066400000000000000000000006661376617013100226500ustar00rootroot00000000000000 194223
22242 5
32372 12 without stripes
23649 2
2009-01-23 true
examples/xmlpatterns/schema/files/valid_recipe.xml000066400000000000000000000010451376617013100227740ustar00rootroot00000000000000 Cheese on Toast examples/xmlpatterns/schema/schema.py000066400000000000000000000242571376617013100203460ustar00rootroot00000000000000 ############################################################################# ## ## 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, QtXmlPatterns import schema_rc from ui_schema import Ui_SchemaMainWindow try: # Python v2. unicode def encode_utf8(ba): return unicode(ba, encoding='utf8') def decode_utf8(qs): return QtCore.QByteArray(str(qs)) except NameError: # Python v3. def encode_utf8(ba): return str(ba.data(), encoding='utf8') def decode_utf8(qs): return QtCore.QByteArray(bytes(qs, encoding='utf8')) class XmlSyntaxHighlighter(QtGui.QSyntaxHighlighter): def __init__(self, parent=None): super(XmlSyntaxHighlighter, self).__init__(parent) self.highlightingRules = [] # Tag format. format = QtGui.QTextCharFormat() format.setForeground(QtCore.Qt.darkBlue) format.setFontWeight(QtGui.QFont.Bold) pattern = QtCore.QRegularExpression(r'(<[a-zA-Z:]+\b|<\?[a-zA-Z:]+\b|\?>|>|/>|)') assert pattern.isValid() self.highlightingRules.append((pattern, format)) # Attribute format. format = QtGui.QTextCharFormat() format.setForeground(QtCore.Qt.darkGreen) pattern = QtCore.QRegularExpression('[a-zA-Z:]+=') assert pattern.isValid() self.highlightingRules.append((pattern, format)) # Attribute content format. format = QtGui.QTextCharFormat() format.setForeground(QtCore.Qt.red) pattern = QtCore.QRegularExpression("(\"[^\"]*\"|'[^']*')") assert pattern.isValid() self.highlightingRules.append((pattern, format)) # Comment format. self.commentFormat = QtGui.QTextCharFormat() self.commentFormat.setForeground(QtCore.Qt.lightGray) self.commentFormat.setFontItalic(True) self.commentStartExpression = QtCore.QRegularExpression("") assert self.commentEndExpression.isValid() def highlightBlock(self, text): for pattern, format in self.highlightingRules: match = pattern.match(text) while match.hasMatch(): index = match.capturedStart() length = match.capturedLength(0) self.setFormat(index, length, format) match = pattern.match(text, index + length) self.setCurrentBlockState(0) startIndex = 0 if self.previousBlockState() != 1: match = self.commentStartExpression.match(text) startIndex = match.capturedStart(0) if match.hasMatch() else -1 while startIndex >= 0: match = self.commentEndExpression.match(text, startIndex) endIndex = match.capturedStart(0) if match.hasMatch() else -1 if match.hasMatch(): endIndex = match.capturedStart(0) length = match.capturedLength(0) commentLength = endIndex - startIndex + length else: self.setCurrentBlockState(1) commentLength = text.length() - startIndex self.setFormat(startIndex, commentLength, self.commentFormat) match = self.commentStartExpression.match(text, startIndex + commentLength) startIndex = match.capturedStart(0) if match.hasMatch() else -1 class MessageHandler(QtXmlPatterns.QAbstractMessageHandler): def __init__(self): super(MessageHandler, self).__init__() self.m_description = "" self.m_sourceLocation = QtXmlPatterns.QSourceLocation() def statusMessage(self): return self.m_description def line(self): return self.m_sourceLocation.line() def column(self): return self.m_sourceLocation.column() def handleMessage(self, type, description, identifier, sourceLocation): self.m_description = description self.m_sourceLocation = sourceLocation class MainWindow(QtWidgets.QMainWindow, Ui_SchemaMainWindow): def __init__(self): QtWidgets.QMainWindow.__init__(self) self.setupUi(self) XmlSyntaxHighlighter(self.schemaView.document()) XmlSyntaxHighlighter(self.instanceEdit.document()) self.schemaSelection.addItem("Contact Schema") self.schemaSelection.addItem("Recipe Schema") self.schemaSelection.addItem("Order Schema") self.instanceSelection.addItem("Valid Contact Instance") self.instanceSelection.addItem("Invalid Contact Instance") self.schemaSelection.currentIndexChanged[int].connect(self.schemaSelected) self.instanceSelection.currentIndexChanged[int].connect(self.instanceSelected) self.validateButton.clicked.connect(self.validate) self.instanceEdit.textChanged.connect(self.textChanged) self.validationStatus.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter) self.schemaSelected(0) self.instanceSelected(0) def schemaSelected(self, index): self.instanceSelection.clear() if index == 0: self.instanceSelection.addItem("Valid Contact Instance") self.instanceSelection.addItem("Invalid Contact Instance") elif index == 1: self.instanceSelection.addItem("Valid Recipe Instance") self.instanceSelection.addItem("Invalid Recipe Instance") elif index == 2: self.instanceSelection.addItem("Valid Order Instance") self.instanceSelection.addItem("Invalid Order Instance") self.textChanged() schemaFile = QtCore.QFile(':/schema_%d.xsd' % index) schemaFile.open(QtCore.QIODevice.ReadOnly) schemaData = schemaFile.readAll() self.schemaView.setPlainText(encode_utf8(schemaData)) self.validate() def instanceSelected(self, index): if index == -1: return index += 2 * self.schemaSelection.currentIndex() instanceFile = QtCore.QFile(':/instance_%d.xml' % index) instanceFile.open(QtCore.QIODevice.ReadOnly) instanceData = instanceFile.readAll() self.instanceEdit.setPlainText(encode_utf8(instanceData)) self.validate() def validate(self): schemaData = decode_utf8(self.schemaView.toPlainText()) instanceData = decode_utf8(self.instanceEdit.toPlainText()) messageHandler = MessageHandler() schema = QtXmlPatterns.QXmlSchema() schema.setMessageHandler(messageHandler) schema.load(schemaData, QtCore.QUrl()) errorOccurred = False if not schema.isValid(): errorOccurred = True else: validator = QtXmlPatterns.QXmlSchemaValidator(schema) if not validator.validate(instanceData): errorOccurred = True if errorOccurred: self.validationStatus.setText(messageHandler.statusMessage()) self.moveCursor(messageHandler.line(), messageHandler.column()) background = QtCore.Qt.red else: self.validationStatus.setText("validation successful") background = QtCore.Qt.green styleSheet = 'QLabel {background: %s; padding: 3px}' % QtGui.QColor(background).lighter(160).name() self.validationStatus.setStyleSheet(styleSheet) def textChanged(self): self.instanceEdit.setExtraSelections([]) def moveCursor(self, line, column): self.instanceEdit.moveCursor(QtGui.QTextCursor.Start) for i in range(1, line): self.instanceEdit.moveCursor(QtGui.QTextCursor.Down) for i in range(1, column): self.instanceEdit.moveCursor(QtGui.QTextCursor.Right) extraSelections = [] selection = QtWidgets.QTextEdit.ExtraSelection() lineColor = QtGui.QColor(QtCore.Qt.red).lighter(160) selection.format.setBackground(lineColor) selection.format.setProperty(QtGui.QTextFormat.FullWidthSelection, True) selection.cursor = self.instanceEdit.textCursor() selection.cursor.clearSelection() extraSelections.append(selection) self.instanceEdit.setExtraSelections(extraSelections) self.instanceEdit.setFocus() if __name__ == '__main__': import sys app = QtWidgets.QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_()) examples/xmlpatterns/schema/schema.pyproject000066400000000000000000000001501376617013100217170ustar00rootroot00000000000000{ "files": ["schema.qrc", "schema.py", "schema.ui", "ui_schema.py", "schema_rc.py"] } examples/xmlpatterns/schema/schema.qrc000066400000000000000000000011471376617013100204740ustar00rootroot00000000000000 files/contact.xsd files/recipe.xsd files/order.xsd files/valid_contact.xml files/invalid_contact.xml files/valid_recipe.xml files/invalid_recipe.xml files/valid_order.xml files/invalid_order.xml examples/xmlpatterns/schema/schema.ui000066400000000000000000000037521376617013100203300ustar00rootroot00000000000000 SchemaMainWindow 0 0 417 594 XML Schema Validation XML Schema Document: XML Instance Document: Status: not validated Validate examples/xmlpatterns/schema/schema_rc.py000066400000000000000000000217771376617013100210360ustar00rootroot00000000000000# 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\x01\x81\ \x00\ \x00\x06\x05x\x9c\xbdT\xc1r\xc2 \x10\xbd\xfb\x15\x0c\ \x1f`\xb4\xbd9F\xcf\x9di\xa7\x87\xf6\xd0+\x92\x1d\ \xc3L\x80\x08\x8b\x89\x7f_\x82\x1am\x0cI\xbc\x94C\ &\xc3\xbe\xf7\xd8]\x1e\xbb\xde\xd6\xb2 G0Vh\ \x95\xd2\xe5|A\xb7\x9b\xd9\xba\xb6\xd9\xca\xf2\x1c$#\ >\xae\xec\xcao\xa44G,WIRU\xd5\xbcz\ \x9dk\xb3O^\x16\x8be\xf2\xf3\xf1\xfe\x15\xb0t3\ \x9b\x11\xbf\x02\x1d\x0a\x90\xa0\x90(&!\xa5\x06\xb8(\ \xc1\x03\xc8e\x05\x0c\xd7\xb2,\xa0\xfe>\x95p\x8b\xb4\ Q\x0b\x07\x07\x8awB\x91\x03P`\x01\x94\xa0\x97J\ i`\xa3\x11jO\x93Il\x8f4\x90\x09\xbfq\x95\ \xb8\xed4\xd9Q\x22Y\xfd\xc9\xb936\xa5N\xed\xb4\ S\x19d\x13\xc5Q\xc86\xb3\xe6?\x08N\xa3J\xc0\ \x5cg\xf4\x11;\xde\xc2'\xda9\x92\x84E({:\ ;\xb9%\xadt2\x9e\xc6\x193X\xd4\x19rI\xb1\ c\x9b\xc8\x09\x11\xd5\x8e\xd2\xcd\xbbw\xc8\x07\x83\x84\xdb\ \xeb\xf8\x98\xa1o\xc9\xce\xe1\x15\xdd|\x87\xbd\xd8K;\ 8\xa6\xbc\x8fO\xf7\xd4R[\x81\xe2\x08o\x0aa\x0f\ fT\xc3)\x81\xf1\xa3{\x1a1Tu\xeb\xd6\xffJ\ \xbco\x0a\x88&\xab\x88\x15\x1a\x80\x81\xa6F\x8e~\x80\ \x91\x1d\xb3\x7f\xeb\x1ex9\xa0\x9c\x04\xc3\x02\xef\xc8\x0a\ \xd78\x1d\xb8V\x99\x8d\x998F\x93B\xf9:\x9e\xa6\ \xe5\xda\xbf\x9d\xdeA\x90t\xea\xeauyO_\xce\x91\ \xb6\xb3\xf1;\xbfH\x84\xa9\xbd\x99\xfd\x02,\xd8\xc0\x1d\ \ \x00\x00\x02U\ <\ recipe>\x0a Cheese on Toa\ st\x0a <\ ingredient name=\ \x22Bread\x22 quantity\ =\x222\x22 unit=\x22slice\ s\x22/>\x0a \x0a\
\x0a Tell your fr\ iends about it!<\ /comment>\x0a\x0a\ \x00\x00\x03\xbb\ <\ ?xml version=\x221.\ 0\x22?>\x0a\x0a\x0a\ \ \x0a \x0a \ \x0a \ \x0a \ \x0a \ \x0a \ \x0a \ \x0a \ \x0a \x0a\ \x0a\x0a \x0a \ \x0a\ \x0a \ \x0a \ \x0a\ \x0a \ \x0a \x0a\x0a\x0a\ \x00\x00\x02%\ <\ recipe>\x0a Cheese on Toa\ st\x0a <\ ingredient name=\ \x22Bread\x22 quantity\ =\x222\x22 unit=\x22slice\ s\x22/>\x0a \x0a\