pax_global_header00006660000000000000000000000064147625553760014536gustar00rootroot0000000000000052 comment=4fd78781603a973dddb23121c369713899d9918a tetzle-3.0.3/000077500000000000000000000000001476255537600130505ustar00rootroot00000000000000tetzle-3.0.3/.gitignore000066400000000000000000000000361476255537600150370ustar00rootroot00000000000000Makefile build tetzle *.qm *~ tetzle-3.0.3/CMakeLists.txt000066400000000000000000000102741476255537600156140ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2021-2025 Graeme Gott # # SPDX-License-Identifier: GPL-3.0-or-later cmake_minimum_required(VERSION 3.16) # Configure project project(tetzle VERSION 3.0.3 LANGUAGES CXX) set(project_copyright "2008-2025 Graeme Gott") set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) find_package(Qt6 REQUIRED COMPONENTS Core Gui LinguistTools Widgets) include(GNUInstallDirs) add_compile_definitions( QT_NO_KEYWORDS $<$:QT_STRICT_ITERATORS> $<$:QT_NO_NARROWING_CONVERSIONS_IN_CONNECT> $<$:QT_DISABLE_DEPRECATED_BEFORE=0x060800> ) # Version number include(cmake/AddVersionCompileDefinition.cmake) add_version_compile_definition(src/main.cpp VERSIONSTR) # Create program qt_add_executable(tetzle # Headers src/add_image.h src/appearance_dialog.h src/board.h src/choose_game_dialog.h src/color_button.h src/dancing_links.h src/edge_scroller.h src/fragment_list.h src/generator.h src/image_properties_dialog.h src/locale_dialog.h src/message.h src/new_game_tab.h src/open_game_tab.h src/overview.h src/path.h src/piece.h src/tag_manager.h src/thumbnail_delegate.h src/thumbnail_item.h src/thumbnail_loader.h src/tile.h src/toolbar_list.h src/window.h src/zoom_slider.h # Sources src/add_image.cpp src/appearance_dialog.cpp src/board.cpp src/choose_game_dialog.cpp src/color_button.cpp src/dancing_links.cpp src/edge_scroller.cpp src/fragment_list.cpp src/generator.cpp src/image_properties_dialog.cpp src/locale_dialog.cpp src/main.cpp src/message.cpp src/new_game_tab.cpp src/open_game_tab.cpp src/overview.cpp src/path.cpp src/piece.cpp src/tag_manager.cpp src/thumbnail_delegate.cpp src/thumbnail_loader.cpp src/tile.cpp src/toolbar_list.cpp src/window.cpp src/zoom_slider.cpp # Resources data/data.qrc ${translations_QM} ) target_link_libraries(tetzle PRIVATE Qt6::Core Qt6::Gui Qt6::Widgets ) # Create translations file(GLOB translations_SRCS translations/*.ts) qt_add_translations(tetzle TS_FILES ${translations_SRCS} QM_FILES_OUTPUT_VARIABLE translations_QM LUPDATE_OPTIONS -no-obsolete -locations none ) # Optimize build option(ENABLE_LINK_TIME_OPTIMIZATION "Enable link time optimization" OFF) if(ENABLE_LINK_TIME_OPTIMIZATION) include(CheckIPOSupported) check_ipo_supported(RESULT result) if(result) set_target_properties(tetzle PROPERTIES INTERPROCEDURAL_OPTIMIZATION TRUE) endif() endif() option(ENABLE_STRIP "Enable automatic stripping of builds" OFF) if(ENABLE_STRIP) add_custom_command(TARGET tetzle POST_BUILD COMMAND ${CMAKE_STRIP} $ ) endif() # Install if(APPLE) set(datadir "../Resources") set_target_properties(tetzle PROPERTIES OUTPUT_NAME Tetzle MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST ${CMAKE_SOURCE_DIR}/data/mac/Info.plist.in ) include(cmake/BundleResources.cmake) bundle_data(tetzle ${CMAKE_SOURCE_DIR}/icons/tetzle.icns Resources) bundle_translations(tetzle "${translations_QM}") elseif(WIN32) set(datadir ".") # Use Qt6 macro until CMake provides something # https://bugreports.qt.io/browse/QTBUG-87618 set_target_properties(tetzle PROPERTIES OUTPUT_NAME Tetzle WIN32_EXECUTABLE TRUE QT_TARGET_VERSION "${PROJECT_VERSION}" QT_TARGET_COMPANY_NAME "Graeme Gott" QT_TARGET_DESCRIPTION "Jigsaw puzzle game" QT_TARGET_COPYRIGHT "\\xA9 ${project_copyright}" QT_TARGET_PRODUCT_NAME "Tetzle" QT_TARGET_RC_ICONS ${CMAKE_SOURCE_DIR}/icons/tetzle.ico ) _qt_internal_generate_win32_rc_file(tetzle) else() file(RELATIVE_PATH datadir ${CMAKE_INSTALL_FULL_BINDIR} ${CMAKE_INSTALL_FULL_DATADIR}/tetzle) target_sources(tetzle PRIVATE icons/icon.qrc) install(TARGETS tetzle RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) install(FILES ${translations_QM} DESTINATION ${CMAKE_INSTALL_DATADIR}/tetzle/translations) install(FILES doc/tetzle.6 DESTINATION ${CMAKE_INSTALL_MANDIR}/man6 COMPONENT doc) install(DIRECTORY icons/hicolor DESTINATION ${CMAKE_INSTALL_DATADIR}/icons) include(cmake/TranslateMetainfo.cmake) process_and_install_metainfo(PO_DIR ${CMAKE_SOURCE_DIR}/data/unix/po) endif() set_property(SOURCE src/main.cpp APPEND PROPERTY COMPILE_DEFINITIONS TETZLE_DATADIR="${datadir}") tetzle-3.0.3/COPYING000066400000000000000000001045131476255537600141070ustar00rootroot00000000000000 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 . tetzle-3.0.3/CREDITS000066400000000000000000000011751476255537600140740ustar00rootroot00000000000000Developers ---------- * Graeme Gott Contributors ------------ * Frank Tetzel * Ulrik Mikaelsson Translations ------------ Catalan: Innocent De Marchi Czech: * Jan Nekvasil Dutch: * Robert Borst German: * Markus Enzenberger * Michał Trzebiatowski Esperanto: * Michael Moroni French: * Stéphane Aulery Lithuanian: * Moo Malay: * abuyop Polish: * Michał Trzebiatowski Portuguese (Brazil): * Filipe Oliveira Romanian: * Jaff (Oprea Nicolae) Russian: * Artem Krosheninnikov Spanish: * Adolfo Jayme Barrientos * josema Turkish: * Cüneyt Oktay Ukrainian: * Sergiy Gavrylov Libraries --------- * Qt, https://www.qt.io/ tetzle-3.0.3/ChangeLog000066400000000000000000000111511476255537600146210ustar00rootroot000000000000003.0.3 ----- * FIXED: Alt-tab broke interaction with board. * FIXED: Did not fetch cursor position for using keyboard. * FIXED: Magnetic attaching only happened when moving mouse. * FIXED: Scrolling with keyboard and mouse could get stuck. * FIXED: Selection rectangle could get stuck. * FIXED: Sometimes lost scrolling cursor image. 3.0.2 ----- * Improved code for building translations. * FIXED: Crash when attaching multiple pieces. * Translation updates: Ukrainian. 3.0.1 ----- * Improved deployment. * Translation updates: Romanian. 3.0.0 ----- * Added scrolling at window edges. * Added removing multiple images at once. * Added centering on cursor when zooming. * Improved layout of new game tab. * Improved layout of statusbar. * Replaced OpenGL rendering with QPainter. * Refactored code. * Use native icons in Windows. * Updated AppData. * FIXED: Overview did not stay hidden when closed. * FIXED: Sometimes added image had preview of removed image. * FIXED: Removing an image did not remove its details. * Translation updates: Dutch, German, Lithuanian, Romanian. 2.2.3 ----- * Replaced deprecated code. 2.2.2 ----- * Added portable mode. * Improved Linux deployment. * Replaced deprecated code. * Translation updates: Esperanto, Romanian. 2.2.1 ----- * Switched to Qt 6. * Translation updates: Dutch, German, Lithuanian, Ukrainian, Ukrainian (Ukraine). 2.2.0 ----- * Added support for Qt 6. * Refactored code. * Removed XPM icon. * Translation updates: Dutch, Turkish, Ukrainian, Ukrainian (Ukraine). 2.1.6 ----- * FIXED: Did not load locales with underscores. * Improved Windows deployment. * Replaced deprecated code. 2.1.5 ----- * Replaced deprecated code. 2.1.4 ----- * FIXED: Automatic high DPI support. * FIXED: Unsigned integer conversion warnings in graphics layer. * FIXED: Could not add images with Qt 5.12 * FIXED: Window icon didn't work in Wayland. * Added support for OpenGL ES. * Improved loading locales. * Require Qt 5.9 * Translation updates: Polish. 2.1.3 ----- * Replaced jhead with image auto-rotation in Qt 5.5. * Replaced deprecated code. * Extra warnings only shown in debug build. * Improved Linux deployment. * Improved macOS deployment. * Improved Windows deployment. * Translation updates: Catalan, Chinese, Dutch, Greek, Norwegian Bokmål, Portuguese, Spanish. 2.1.2 ----- * FIXED: Could not compile with Qt 5.10. * Translation updates: Catalan. 2.1.1 ----- * FIXED: Did not always install translations in Linux * Translation updates: German. 2.1.0 ----- * Added support for HiDPI displays. * Fade success message after two seconds. * Generate binary translations at build time. * Improved Linux integration. * Replace application icon. * Rewrite OpenGL code. * Switched to C++11. * FIXED: Lad when dragging pieces. * FIXED: Did not change background color on the Mac. * FIXED: Colors were not saved on the Mac. * FIXED: Could not interact with interface on the Mac. * FIXED: Application layout did not respect RTL languages. * FIXED: Was not properly loading Qt translations. * Translation updates: Dutch, Esperanto, German, Hebrew, Lithuanian, Malay, Polish, Portuguese (Brazil), Russian, Spanish. 2.0.3 ----- * Fixed OpenGL shaders not working in Windows 7. * Fixed build failure on ARM. * Translation updates: Malay, Polish. 2.0.2.1 ------- * Fixed compile error. 2.0.2 ----- * Added support for Qt 5. * Bug fixes. * Translation updates: Esperanto, French, Romanian. 2.0.1 ----- * Bug fixes. * Translation updates: German, Russian. 2.0.0 ----- * Redesigned game visuals. * Merged new and open game dialogs. * Rewrote collision detection. * Rewrote OpenGL render code. * Translation updates: Ukrainian. 1.2.1 ----- * Fixed: Tile borders were not correctly scaled. * Fixed: Mouse cursor drifted off pieces when moving. 1.2.0 ----- * Real collision detection added by Ulrik Mikaelsson. * Complete keyboard shortcuts added by Frank Tetzel. * Toggling borders added by Frank Tetzel. * Added zooming and panning to overview. * Added retrieving pieces. * Added option to use entire image. 1.1.0 ----- * Added rectangle selecting multiple pieces. * Support for grabbing multiple pieces added by Ulrik Mikaelsson. * Algorithm for pushing pieces replaced by Ulrik Mikaelsson. * Improved mouse cursor handling. * Code cleanups. * Bug fixes. 1.0.2 ----- * Added image plugins for the Mac and Windows. * Minor bug fixes. 1.0.1 ----- * Fullscreen mode added by Ulrik Mikaelsson. * Bug fixes. 1.0.0 ----- * Added label system for images. * Improved zooming. * Minor bug fixes. 0.7.0 ----- * Added puzzle overview. * Improved saving games. * Added keyboard commands. * Added thumbnails to dialogs. * Added help menu. * Added zooming options. * Bug fixes. tetzle-3.0.3/INSTALL000066400000000000000000000057171476255537600141130ustar00rootroot00000000000000Installation ============ Open a terminal and browse into the extracted folder. Linux: 1. `cmake -B build -S . -DCMAKE_INSTALL_PREFIX=/usr' to create a location for the build and then configure the program. There are more options you can pass to CMake, see below for details. 2. `cmake --build build' to compile the program. 3. `cmake --install build' to install the program. This has to be done with root privileges if installing to system directories, but the rest of the build should be done with regular user privileges. For packaging you can optionally install the program into a temporary directory by setting the DESTDIR environment variable. For example, `DESTDIR="alternate/directory" cmake --install build' will prepend 'alternate/directory' before all installation names. macOS: 1. `cmake -B build -S .' to create a location for the build and then configure the program. There are more options you can pass to CMake, see below for details. 2. `cmake --build build' to compile the program. 3. Run `mac_deploy.sh' from inside the build directory to create a disk image of the program. Windows: 1. `cmake -B ..\build -S .' to create a location for the build and then configure the program. There are more options you can pass to CMake, see below for details. 2. `cmake --build ..\build' to compile the program. 3. Run `windows_deploy.bat' from inside the build directory to create an installer of the program. Note that you must have the NSIS executable from nsis.sourceforge.io and the 7z executable from 7-zip.org in your %PATH% for this to work. Release Builds ============== CMake does not specify any compiler optimizations by default; this is useful if you want to inherit CFLAGS and CXXFLAGS from the environment. You may want to add "-DCMAKE_BUILD_TYPE=Release" during configuration to get an optimized build. Debug Builds ============ You should create different directories for each type of build: 1. `cmake -B debug -S . -DCMAKE_BUILD_TYPE=Debug' to configure the sources. 2. `cmake --build debug' to compile the program. More CMake Options ================== -DCMAKE_BUILD_TYPE= Choose the type of build. Possible values are: 'None' 'Debug' 'Release' 'RelWithDebInfo' 'MinSizeRel' -DENABLE_LINK_TIME_OPTIMIZATION=[OFF] Reduce size by optimizing entire program at link time. -DENABLE_STRIP=[OFF] Reduce size by removing symbols. Linux CMake Options =================== -DCMAKE_INSTALL_PREFIX= Choose the base location where the program is installed (defaults to /usr/local). -DCMAKE_INSTALL_BINDIR= Choose where binaries are installed (defaults to $CMAKE_INSTALL_PREFIX/bin). -DCMAKE_INSTALL_DATADIR= Choose where the data files are installed (defaults to $CMAKE_INSTALL_PREFIX/share). -DCMAKE_INSTALL_MANDIR= Choose where manual pages are installed (defaults to $CMAKE_INSTALL_DATADIR/man). tetzle-3.0.3/README000066400000000000000000000003721476255537600137320ustar00rootroot00000000000000About ===== Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any image can be imported and used to create puzzles with a wide range of sizes. Games are saved automatically, and you can select between currently in progress games. tetzle-3.0.3/cmake/000077500000000000000000000000001476255537600141305ustar00rootroot00000000000000tetzle-3.0.3/cmake/AddVersionCompileDefinition.cmake000066400000000000000000000024671476255537600225230ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Graeme Gott # # SPDX-License-Identifier: GPL-3.0-or-later function(add_version_compile_definition versionstr_file versionstr_def) find_package(Git QUIET) if(Git_FOUND) # Find git repository execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --absolute-git-dir WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} RESULT_VARIABLE git_dir_result OUTPUT_VARIABLE git_dir ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) if (git_dir_result EQUAL 0) # Find version number from git execute_process( COMMAND ${GIT_EXECUTABLE} describe --tags --match "v*" WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE versionstr ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE ) string(REGEX REPLACE "^v" "" versionstr "${versionstr}") # Rerun CMake when git repository changes if (EXISTS ${git_dir}/logs/HEAD) set_property( DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${git_dir}/logs/HEAD ) endif() endif() endif() # Fall back to project's VERSION if ("${versionstr}" STREQUAL "") set(versionstr ${PROJECT_VERSION}) endif() # Pass version as compile definition to file set_property( SOURCE ${versionstr_file} APPEND PROPERTY COMPILE_DEFINITIONS ${versionstr_def}="${versionstr}" ) endfunction() tetzle-3.0.3/cmake/BundleResources.cmake000066400000000000000000000027731476255537600202470ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2022 Graeme Gott # # SPDX-License-Identifier: GPL-3.0-or-later # Add files to a macOS bundle. function(bundle_data target source destination) if(IS_DIRECTORY ${source}) # Recursively find files under source file(GLOB_RECURSE files RELATIVE ${source} ${source}/*) set(parent ${source}) else() # Handle single file get_filename_component(files ${source} NAME) get_filename_component(parent ${source} DIRECTORY) endif() # Set each file to be located under destination foreach(resource ${files}) get_filename_component(path ${resource} DIRECTORY) set_property( SOURCE ${parent}/${resource} PROPERTY MACOSX_PACKAGE_LOCATION ${destination}/${path} ) endforeach() # Make target depend on resources list(TRANSFORM files PREPEND "${parent}/") target_sources(${target} PRIVATE ${files}) endfunction() # Add translations to a macOS bundle. function(bundle_translations target translations) foreach(file ${translations}) # Set each translation to be located under Resources set_property( SOURCE ${file} PROPERTY MACOSX_PACKAGE_LOCATION Resources/translations ) # Inform macOS about translation for native dialogs get_filename_component(resource ${file} NAME) string(REGEX REPLACE "[^_]*_([^\\.]*)\\..*" "\\1.lproj" lang ${resource}) add_custom_command( TARGET ${target} POST_BUILD COMMAND ${CMAKE_COMMAND} ARGS -E make_directory $/Resources/${lang} ) endforeach() endfunction() tetzle-3.0.3/cmake/TranslateMetainfo.cmake000066400000000000000000000051731476255537600205600ustar00rootroot00000000000000# SPDX-FileCopyrightText: 2025 Graeme Gott # # SPDX-License-Identifier: GPL-3.0-or-later function(process_and_install_metainfo) cmake_parse_arguments(PARSE_ARGV 0 arg "" "PO_DIR" "MIMETYPES") find_package(Gettext 0.19.8 REQUIRED) # Generate LINGUAS file file(GLOB po_files ${arg_PO_DIR}/*.po) foreach(po_file ${po_files}) get_filename_component(lang ${po_file} NAME_WE) list(APPEND linguas ${lang}) endforeach() add_custom_command( OUTPUT ${arg_PO_DIR}/LINGUAS COMMAND ${CMAKE_COMMAND} -E echo "${linguas}" > ${arg_PO_DIR}/LINGUAS COMMAND_EXPAND_LISTS COMMENT "Generating LINGUAS" ) # Generate desktop file set(desktop_file "${PROJECT_NAME}.desktop") add_custom_command( OUTPUT ${desktop_file} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --desktop --template=${arg_PO_DIR}/../${desktop_file}.in -d ${arg_PO_DIR} -o ${desktop_file} DEPENDS ${arg_PO_DIR}/../${desktop_file}.in ${po_files} ${arg_PO_DIR}/LINGUAS ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${desktop_file} DESTINATION ${CMAKE_INSTALL_DATADIR}/applications ) list(APPEND metainfo_files ${desktop_file}) # Generate AppData file set(appdata_file "${PROJECT_NAME}.appdata.xml") add_custom_command( OUTPUT ${appdata_file} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --xml --template=${arg_PO_DIR}/../${appdata_file}.in -d ${arg_PO_DIR} -o ${appdata_file} DEPENDS ${arg_PO_DIR}/../${appdata_file}.in ${po_files} ${arg_PO_DIR}/LINGUAS ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${appdata_file} DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo ) list(APPEND metainfo_files ${appdata_file}) # Generate mimetype files foreach(mimetype_file ${arg_MIMETYPES}) add_custom_command( OUTPUT ${mimetype_file} COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} --xml --template=${arg_PO_DIR}/../${mimetype_file}.in -d ${arg_PO_DIR} -o ${mimetype_file} DEPENDS ${arg_PO_DIR}/../${mimetype_file}.in ${po_files} ${arg_PO_DIR}/LINGUAS ) install( FILES ${CMAKE_CURRENT_BINARY_DIR}/${mimetype_file} DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages ) list(APPEND metainfo_files ${mimetype_file}) endforeach() # Generate description template find_program(XGETTEXT_EXECUTABLE xgettext) if(XGETTEXT_EXECUTABLE) add_custom_target(update_description_template COMMAND ${XGETTEXT_EXECUTABLE} --output=description.pot --from-code=UTF-8 --package-name='${PROJECT_NAME}' --copyright-holder='Graeme Gott' ../*.in WORKING_DIRECTORY ${arg_PO_DIR} COMMENT "Generating description.pot" ) endif() # Translate metainfo files add_custom_target(metainfo ALL DEPENDS ${metainfo_files}) endfunction() tetzle-3.0.3/data/000077500000000000000000000000001476255537600137615ustar00rootroot00000000000000tetzle-3.0.3/data/bumpmap.png000066400000000000000000000074231476255537600161360ustar00rootroot00000000000000PNG  IHDRæ$PLTE;D^tRNS !!#'')+--//1355799=??AACMQSYikmmosu{{}\ JIDATxnHGX$y8Dq^hAϜ]XT8eRJٟsqi&4cYmܽNNmy g6uCq}q|N[QO6?~})]ӷe^:21(@iK֦;=~|6ww_;?ᱛE+שv'98w'9ު_|s|>:g3H^CKǟ9M?B_<~?tL:J߃Lc<||s8,N483tаdqǗ~` a0z/ op^4 :h>+r'x:^`,R;eFNTk VPO P&;eiym= S=;''&ݞoJYKXu毣ߧ l|ٽswЍ&P yY%lWݡˈSx]ӵRt:1וvX2t?7vu;Pw&j/ԛAh'Ofgb61ӋߺUǟmy g60닫pߊ ti'ȷKQj-J_e_*|Pɷg^*)t G6?QNv2ݹigrc7ׯuv6s-Az}h;ŀ]=+@M 5}{*u 8'.sTvsz'sE X:~~4Vxy;@fR&֚tt,@7v㇯~9wP׀d ,?`ށh=~_tCXs=@3 ^zEn@ @ƭx @~Cwz]ܯ `|/?,\!=]l;CwKpoށ`Я}&wP` ѧ-;t? L݁>',o7R cFcO }S 'ѽSض4S ( w9֧Aūm2UIϫR.Lz&(~֙;yz}|TOkR*\j6/nd6{L/snml?HD`H5ĆA_WﻺiS7];QύtNۃýb}~MQƴ{XV'/.mWz ! l_Ëbv1<9uRcB˷:+lelzsлn(/ڛ/_݊x$?'ȷӢ:ˤTw@i?NϷig;?ᱛ48='~؉x̪ioկ)3> ໥ީrLj $'1>c;e?tX/Éw;@?!A_0O’ >81frku[nS;;yz;O98 dͭӳ{\a`e)~Bau8'wꦕeFHOӏ?ύ]xcYmܽz2H?$oIŸ! l_Óbv'Ó\Lp.ߖw묰yYkinp Cﺡjov+ ï/EuIm4 oϼ81.hfk`s=lhcYg9akQ\#o1zUoV6wtHcwJTvs:3| \s o`㓩zETdIROǘHsӰR"VE2;vaD-d??PGyxU5N{pap^:iw5[H4tB<@_" ́7/ U>bst^P}S<(qz cw;Mj{;31BI^o'2~̳cJ){-OS{e)}/r[k=ιC7Z1hgyQ'Fh徫Vֿ5 s*.pc__Sť?_׀6N bumpmap.png shadow.png tetzle-3.0.3/data/mac/000077500000000000000000000000001476255537600145215ustar00rootroot00000000000000tetzle-3.0.3/data/mac/Info.plist.in000066400000000000000000000062221476255537600171000ustar00rootroot00000000000000 CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleDevelopmentRegion en CFBundleName Tetzle CFBundleIdentifier org.gottcode.Tetzle CFBundleIconFile tetzle.icns CFBundleExecutable ${MACOSX_BUNDLE_EXECUTABLE_NAME} CFBundleVersion ${PROJECT_VERSION} CFBundleShortVersionString ${PROJECT_VERSION} NSHumanReadableCopyright © ${project_copyright} LSMinimumSystemVersion ${CMAKE_OSX_DEPLOYMENT_TARGET} NSPrincipalClass NSApplication NSSupportsAutomaticGraphicsSwitching CFBundleDocumentTypes CFBundleTypeIconFile tiff.icns CFBundleTypeRole Viewer LSItemContentTypes public.tiff NSDocumentClass PVImageDocument CFBundleTypeIconFile XBM.icns CFBundleTypeRole Viewer LSItemContentTypes public.xbitmap-image NSDocumentClass PVImageDocument CFBundleTypeIconFile bmp.icns CFBundleTypeRole Viewer LSItemContentTypes com.microsoft.bmp NSDocumentClass PVImageDocument CFBundleTypeIconFile gif.icns CFBundleTypeRole Viewer LSItemContentTypes com.compuserve.gif NSDocumentClass PVImageDocument CFBundleTypeIconFile ico.icns CFBundleTypeRole Viewer LSItemContentTypes com.microsoft.ico NSDocumentClass PVImageDocument CFBundleTypeIconFile jpeg.icns CFBundleTypeRole Viewer LSItemContentTypes public.jpeg NSDocumentClass PVImageDocument CFBundleTypeIconFile png.icns CFBundleTypeRole Viewer LSItemContentTypes public.png NSDocumentClass PVImageDocument tetzle-3.0.3/data/mac/background.tiff000066400000000000000000004457301476255537600175270ustar00rootroot00000000000000MM*@4& !p|JC3PyZ?$r4zYdRcәD5/cT)a&Nf]3AQ 2ENI*5ֹ_XlV;$A9ee  v¬4&}\RˎႨKٱW;+xW\>vfNOߴֽW]yl\؝MVo%RJƢ59ͮ<=[Sq+cϤ9W{Xk -j>OֹO3w+oMD 5 K2/MA:ڳ,-+-T' ?pi 5! Ep%3TπJOL&oJ(rRlȲڶJo-)"'OC+K0,?M3q|B@XNMb20[>@3aΏC4B4\m/LHRoWJQL $.yZux|oC׼IhZ4=쾓^qPW$}צN,77PerL5e|ȳV[io,JkUD\JoxJ94y q%r٬GK lb3.q/Mn%&riZnqNxQlCZ}wv7^O5Fl9Ĺ5Ăs['fCc9+˶/7c'ޱtv}n^v--E.d 4et0JmMuj#N.XAыȅ y|PGU1Vp,V^}?T8qI>US[G(ΒqgN{P?_֓+V+QG (er|F0]4y>Mnj`:T8"ҦYSaRL#rm~GMǎ :Vu]MBdwr#ҁՙT:ZIm,UR(d*/:q-r֐RK Z=#6NȆn RJcb͌RB6# E6c@fpJASt{6kXmjDKh%;*]ԉv>KU.Er_ܩ+5jKxvʛ] .OYwM5ެqz^ۆf5ewjWg(E}T,Ƌalk+]- ]aK]m?"8:_ZQB6X_if*ƙd' |y68ѯȶxlN"rƦxOV&SoVLۗS:o8FJPs rF8Qq َvMW+dz" hl}diޑwH']@iU, SSRo G޺-']{#sٳXfSڥh/ﶥA(?傂ab6%ҘAǦ/?,~Fryr(Yq+Ҕ@`"JxJսb8">eŽ;7ٱ8ocl۳3BLnvj/Ewm+ 6o2=F܃ oj&PR &Y_PjWyޙD7Չ*=DpcՠHa(s-וȍ6>~Qn^9r<'3&Gy_@3ub{˨B[8>:KzX~|_HmWʼrO{| oP5HϫhZOTx.pm뺧ƤBE@ f,\(Z;LȰp On,*H4πm0kjVLjo(o*9Zwn6o (20z-S kX缩/T1,ގ# 0Кn KfJy J'lЭХ)*BtvZiE̅pL0Nvܦ/#No&f|?[ ? |ԯ. KN>Q -|= /AP4hRC#%,gu1nmO r!i_ bM>qSOvnq'gc t:)qap 1n!JSR& 1$"2@ǯۏTݍPb2b7/?B&ʙKW(G/e(oQ=' f*$.)+) m++$q,A.mo-R<$/ko52a+lB3 226cА18Iqh1S:H)]:n 0 rqm'ΪnpBď,'q6G-I6;1 $S`[  ﯴ2^ 7(K@V3Qp'/VOF.%DE q+ RXM\Oo>4y>j7- >23flHW5"@094-%@)@W$A8Nq%T "5CyD|ֳ1] 9ӿFQFTRoq<=RwP ȵ40NtɕSsLAs4pYмS}8rF BLb-GKNNPf~SruM3TWr{23;2jqFH^ҥRUh8S4jeD#,{TtQ]Vc82tTѸrQ/W4>BJoTGtKNgEFu')W(\ Yw(2 [a&QMԉvh;\ےR]7+u*5E?ϹB @ @`LGUT//-q/T4sWO lWv 6%OW[Yg ;3 QNZ9 RZ ~\sTvbDŔXTSQ#UII4B2hRS2LxQ_ceVt$]56c6ZvGEv:#(QcT|4 6NIZrT~3)s׎#*%Z"y(PoTTJtPE-lOUUml.K488e8 7jKj+OX`/5'Vc?cKw÷/ōڛzO{׽_KZØŵ=1[`UsQsKռjP Z34^}P^vA>ė*ׂ{<-q:9s}H[[žվ\ (_^j}a~\/V%tY>>DûtvtAxooY^M+or+zќu5Ags] 9y4_?!_ouSX1(<_+I<+?6~ C}f(I?#>={L  PXT" ?D(6+B9 :Gɤ-$|K2H1(bM8S V7[u*j|SUjhB[ª5{._٬_Z+mnuTֳ ,Wmcnu5,dar9< Uf/ 5躊W.ܤZT_aӧm@`ȧ c4C'[Mֲ7Ӯ'Fm?w>Cp8s˲+F+аK0+ )kC4>o164,  $\F2os).Ȕ/ bHּۤn(9 \8{y)ԥ.od;sa$I{%lcбdQ #0BStp2ДWAF$F,kr5k6,rum+ a# [JW06\Hc^HrĞHo|e1o[63< t<2,AMNRtO1< SSSFUEStZXakRR[œ5c'֙&K\yD&XWL!X|ؒ5(R涍aNLƇkY\uןf-~a+WH-݄kf7R PNU[_V&dT>Q?B S[am"wT d5Lreѕhz\yKs ƕjW&Zѣ^:fyqaXړlؽ]r}ݞW:[nU0rDPҙb9Utmd\O-LA=!&Klp պ@xL d[1=vQPRBB}a^;OgLݬζ5tn9wC@{z)-*dm}y~WSxm}=fz4_Fe2.uq͖WY{ ZiUOf뙭{w\zvNuʯk`:8cOj5OJFgfPZ^sx5һ~b> Y뼯)SG)vjCgk?T`vPV<񩜒5[2~F'51+- rkׯ.0u8$QF* K?J ;̩iྡྷ־#r@"i>k0& 9#C0ᬤ2[43^ pJ5;>C܀G̱dzOEE ʬ8#k.1RB ˙ÄYA NNč(F$`NيjvC{?$C<1Iƌ>Ϝσ<G 5;CěL Ą@^1ʔBlO1:ckwٴ4B/DKS< | K,7R7@r6θ~QЁNR%",!BDrAqãE"ts63VQeRV#4=hP޻k>g<]G+DZ$ N8a0HMWYUP|| `-pwhtdzxa a6S6S6NUaU>^R@~) ZT95]VlZ;'ٺOelMa lS[C5\'t ./UMe|B?GcKCK}EV>מ84CȴKwMRSNh N؜˱μ ܆z`xH*1*jXlc(@e@0h6X]X6YY} M!iZnc3Yo %f3q;Ƥ--^Lj+ھeL^SaM$~q4\-M?37[FP]9e4F<ŖFYa5m=SR̒V-jN%޴Bj j~knIݠF,VS6H2f˝\VأyXKU O_ |ʽyMuԄ}pKN}chRU=S NoU' XJX|\yyp+(= qjcVi`mmmfVWav]Yu &<Iu^S-gb̦%ꍣjݪּIjG3͜Z]o(hoNE4g^w7xg~8#&6A.{Wf6)~N}vN~#VFItVM ɇQ0w6!dgpi`8Tma!$݅&6$ydfcfBlfu-F\gnbVd^vAF+6En]s[Q6mKT_F_S[2=CtW#l1줎pT UL+p}^XՎ{zw;r2`t eY0OO>S] ,尥7# ,jrfRr),fڠfe2ew-2զfo,mha+Suegvp$Wd$.sH[m@g#r} Dy_O} tN1 MmS6Rhω{ܖIܝXptnh6N/hg/&XqO_%p%ՕVmr_=&E!5r)]ǫ^<5.j<0+ļe؃{w8gCoNs_80B|F AbP/c(.7dx6Ge1IBY2g"$s({?~S_{{>_W|鏪[Ҭ;-& 5iR]{TgtrKI^7-u9@P4 6X `@ h-&G@  $=sзqkD7<eˁn8|{nnOv;Gz= gmw~nw7w}>'s}O@-FHs$RK'6p w $  A)t) APPCviG )UEqRBkzGڹR   *Ҽ,L)ny\ @+8L F BS`팄 #?oc?89tu HO}Q/AQ]9@.LSUHO+Cԭ ] E8,@<_CtFHqՃWѝ0l[cG,UaCV|kgE%p#[7dױ|Bh5ʕ?- 2i9# #>+ɜc' j32L43tN;Fd46WmNՎ;H>O啥RO]%K[>SN9ՃW< 9kFW0mnzSWu[IZ{b]VkX m"Wqm_7tXqE[zQr[lQ[vm_ȫ<.aʡxg%N]v'!`j3l2 S{Bc#Ny+b"ޙ;ZjtE/SWjM"iNnCi]cShnJz~V{T}Cy]r0_+Hг&1"p׃xo y"[CZ 8 DLs7K9A>0yotC?Ʋ`*vIri@(d&Fx=羨+Cjqe=&\WqXQkgr1GC2}/ūaKy/썛yC(M@!ЄoEGob vlqx_\SRJIac> wBrSdLaLjbvʙ@bgؙbDH`D"-+YzQgeOwXt_}ɨOʥ2|OZjwO=艻r@D'%D 1$lmbi$d{wl!8FM%YԺBB#I%l$r)bxW&=1#) 2Una2LHMWfSy;DUg1A@OF*'B:oDiCTLZ54׷`}j.Xd಴1YFE2'ڟJHE(i0bZ8 -$R:SQAGsҲS))*`:AӥmH@r JN/w:dZ]Ɛp e& I8ha$As9Χlah4P D5rc)"gMxoWA{>OFf]&Z nZ=6L-hK;kb;ˊBPBRjNJu yY_,0a;81W6.Lc;V9Mug5:|7GCzO7_f|zBgmZ>0Mps;l?.[[K%ӺZHFiTDlkJ's$8 d 'k-<~B+.J̎;GHV ,흴 cPr e13 %6;LˬIJv@ԉ5h?P-Gj JPp -P ' n' Xpڧئ0儓lEKyoO.~+r&ؐbR.n `qYAhLvȃ>dwuSiـl?ًu \ 'AY%zB58l/R9 Img?}SlL#)3VI%bg90#U'DsnϠ Z$33N)Iq!2-4#^ՀɢJ  a2agI341@5s#X6%j&5:O475vn62%[(bSh6sssaO/S~ނuHkhİ8oEW/8+rӧ :$.gJ7˖-;&.L=E-> X9R*¤8 f jHI LM͇8vOM}e[?ə{k{0NZ{ kyUz迷4!5ɧmأ$7; 4!{34pԷ7w~*[ͽ~d#4A.-b.,ː JOØ7dK -Va_\./ʚh$2|KLcC>wNNxI#8u4 1Ƿ};lGtwtjsGC9{m nKʠ| |7XZh"]͝ԍ3GUtwoyd{ʨ7= ď7yI)h)lVnm$ ÜAAAw\vGhM8O)×x {myC}|sq~MSE2R&|C6 ڂFײ*xe]+ӍκqP=ΕGj}b"Q];+-j|,+A0 "6!~2vլMi[$6*`ƙ~"k64ҷ1{y|wuQ<;[mA~nyt?U!1}@ ;9:ͅ{Ȩ׭|$rt},;dtH\ $IIr*²t`rj P0 @ؘ@`( d2)0#J\DRg9Nw6N(4 މCz5"B4Y^KU'Tba֪fV%D_m+Ճyo~/QaPX<. CЈdRDQ.!y&-&d\z1'#2I [4LD+!e3Z;"N1*4J%ӊ}:VVh*VfE/M `Y&u h?֋~|]{= ,` q,< bx 7h1z9Rmlhխl5}~gmWw;M+{kimvlKC ox:{o^|}GvT\jT5I2Ī&Ikbl J|@֚A**^ZbjuCk\/A:EMF)Ro3*QBڢK^,I |" cL̩*JBJKP:=s;?3t!̳{oL|OjO4ͳOTC4&Nl8Q+EI)0D3G1Tn@`U _m]mgWWռ5qSa,; BVLb؊XrZսu>U aO73.4~#I2(rԾű=-M+@ 7\mkm3җ%%?3:5QϻvJ`=;JL8Xv;S=X[2%qEA\cT cB0 X+P[jÐښUSWk9guMTGٙDrHts N42I!0MraWˇaef3'rx Ls#Ha/v%>7SQm91f纺>/Yj6Uz^S[1>=eo1l%k[irκn "/—izu'0͙{TuvB,vN59wJN1uB \Y.@p}YTb}54a,q0arciaXvLCJB a+hJ0!pZ1W{Fj n)bLl16/ۙ5HrC3,pG͝4-P:-LP)he \}:@o2rNAduLB(Q+-*@N> Љ*ĆЕUh=wޫW1acE8h{oY1:ie)霵SU-p2NHI)B>´(|鑩+%j"{ΘKs$'lе`bftCD~\Qi,&*T'&nȇNZKPIW&sM g\UEG\]H+MI]=5c`"\h| KUE,yZSJa0e` {'S-DUe=h Uu]#u̢}։;V#{dJ0wGmHJ+g)|T!!rK)8j:_MD%kWL#e*"c x# ՌboWJUioe\1FW<pmnv~: [ aag2\(S BB]Z0۸2ڱSH&.ǃ[3¼4`Y:ZYg5Lǧ#Q婑idZkDčͼVN. [3{g Km#hYaiX]7Z3u|9r`< l?Z'%pgܮz+ngsh/mR ,~ʚ.ϰ֍dn,iohGIxD+䏘J-LːnZُ Obe ݮ+} P+QDϦwYi? ih֮ <.όN^r0glXM? 4fM@𐺩20:POeBڬe8Z{ ; 20Ȏ OY6̣.)p $(N&F,Q ̰nl,̌Eа)BQJ/0qͿO 1BhqZڍP0 YOp둄hHqrC p,{#L+F|̷%pi//˭ ҆| rPo[*)\r : !n"N*MBC#mI:pǑ%-ϙ$J@fܙ2j¸lrq+vq+Q_,R{0 O*qTP1]++Q!C,%Rξ$N7>˲KRoEm ӗpHr2%m3O s<,M"S&+O,FBR 3/ 2*2ҥ QA5SgK+Z6S6o77I7G7=.ӆQ$!B2i8P/Bw![n""/0eE,G1S,,oc2LWR(T88)Ow.#QwM$˳1#s!< TPj_FP#= u$(/ËTsVU=356h_TTS[Jb2(nyUK}L1VBTtN4#/`758RO+aNc-ZK';7[S αؓI{=Ua r)HR lP?p*_A?Q_p5t@uhUm77CM43bP6#aObLDYjrb?;6G&Rseq%?+5_9 HuREIC\f153G7 ڢi+hIjaj`bNkv6M@tPv=Wcd7g-iwW%Z5owp1\5rpQpi*^t47]#^3{W:׽APecK6s t6VMKX0wsXVZ_.Wum3Nrd7YrU0Qbxvy3exz`o t }qi+[׻U7T7'Ru;Wg)t 2$7Et 8l!fPWuVvA}aE5l'm$lZ5 mx%;Q}ro5G7JV`snF3XY],{)T4 ^!5]j7|22 b/(kVǑ~4X+Y;.OB/Ls -.È}WaA,gWT2[ܚ9jU>7WW֝xļb{-V93m1l]Q] d}"4|kSSOU"1R+oXIJKiLo*U5Ô̳3m`G20ז3Y_m$6dL-bM4jImlT:+BK0 3GPpE@AT\ w,{NlBߵQxX%AO5X WbqTָmVVԭKeu^utH+*VGeSZ?h͒|1ӵ=rq58̽7u+= y]~I%AO=`zk0?\x&t|WnQ[׊o{S qT}eZX{W<6qaGmWrJr[-c9yݩe3n*Q`WCrjߔC]x]nΤQ?oT_Nn#︴etOJ%V<չW9[YZsɲvv#ỏҲ@J4#ҝj.ʹn}] zsCڏ,B+llU_m| +SR=Ğ|,Q>f)U&ķbq.U^$X_H鉝2E e,@eK)ɺᣱn RyMz'=kbs&@X&GFXc"؋3kDk|\#h-_2XE߆GV!SyC!O xiB"+jp7ښfq P{C'd/)D{AI8$wh:֖g3Y12uo, Ձ[.hjnY3fyj;ɩK$vVhNv#8^9 ),9H[;dCI3>jQ6>눬2X95?SKޒVu1;nU?.&-3J&dtr;% &΄*EԙN,|ۧmƙ{5:RzH\؋Ց&}UdETF-UgVm`ƭfCKu#Hbn7@H]+uWKՁ#xS[%e=s55$EA,0 WeOVn Y;9j} ZTyLyV^='kbuy`櫨R^et"Sa69n8rQ@0Ż K5Z _‰k|7j]yi1׆S{ ؽxpdw!>CjR:/2 xKʣMH`Vb}67)n <W}Ei.g\EHs`V~9#l Wcu=7H %.T)5~9嬋v(kuU4^jN2ܼ;E6.rgrnc;Rt9cRut> ޜ/c(nMQ|/&X;ە%Z90~rZMp$k Uw"$l,Ps,ط^C_To@ۗ1fr=Mx\^ݓ?M 4;+(Yu\[.iu/Ii>riZo\R6arOck⎶autկn!VQ\-9^:xΩ%ldP0xn"B nWO}gKzj゚xwK,ɿ[U4^\7*43bV"z9:,[h>49" &L K(qш{<ҜqIx4N345sz9:嵄B=2d,11)[6lY+5A7.C=AȬ295S?3$!T/R+EdBCdT[;B69":F$pJLe<-$4Hc+<ɁnCY9 D[IqG+I|P{Qª=^ELV1$}G;'6E!)CD`=gE<$FHCuƒAdG#8 8K) DDk-yCBlhA'}DL!:Yɳʄԛ2)#dܭlBl,;J/1kkCVIlUH$ AJI2{FKf9쏦,I[z2{A|c\KӧR֢DrGTL"Ѿ)£6|LEJV0=mnjLJnDaNȘCKĉ̕D9ݧwAMTƤ:S6?Q@S9̉|CsHr3!MMD#T&Ĝm 9m ](SUL;3Q3EU5L"2*>3ϔ2=7ѴE^4 S"_J>L}OR$%zFDVjTRӧէlУ):}0I«}@D- {W5]=ŋӌSM,U^Õ:.V ?,sH-ԌԼt?MKK4,ңVˁӮR1Ot׵4$'\)M 7]@T6U ;ʍ|+{ћLosMոo[\cP[=FGD,%R3A;4M$"?mP=,NMwYۮS8WBĨYWb;:_̽āXT{erUUAZӎ!gUHkmOX$Xܱ]AKR}YR]C\#~$I3r}`׻;ylzU9=fC|5Z]f_mV-F_[T\nmŹѸɕtW\ w8^N ?&`D5׭ǝ`^^ Lz4GH=J eQ4]Jߜ[KųBWٷK'+`YeK>&Ԥ@Х:d& ^]-2fQba601T%tVuf=c%_գT]SU^RHXL=%%/Cf%b P(}4ubٶq\ `sb4B@;_Wc]܅+B8lX%\faJpi<=ed3&aZuuj˥VFK:f|bt&nCPO).P^.(i5\k2&x3N_ѽ32ZBZ5E@ZeT)(hUHC( pTUG/Fj]jƌK^FU`4Yż>!b.LfI8NY Pi~&vUUN7kԂӴ5]|cc{evh+o( :N&Tj_sN6GI:~EjfzH:ߴ5/[xiN*Ζ뮙\Vk 6Υ:5l+"ElDE"lue&.쮉v[|AhtD}n/.kD2fӭBLk8-mskqSvi{՞|kn<JNa~]_V cTcZ߆j1/nܕ?>duHfiRV-nbN݆dM7oDr={k%̆wNhZ%GnQ~pżmXѣO,8د kVdYu]Ɗomk["'fLEkFs6oT1۵}w%׳\Dc;Ke~zaE`9.j-@ 6^n'^qaHjh%Itof&R mmVmtct. LwUG|NZUnE_ZhXG-No1j'S=Yd.qޫ]P:nghbfGtiwoCϛvFR'#p/tf>L^3}o)kQQ]7 l70)6(7us.sUDbm mαUK~u8Vf^fOX0x[ޅ_ v&nfy7jetkm\]B(f:t܄Q@RQVmt|wwYWN]uCkvb]B5$xg@/f36ty.gr.NVSrcw?p {gT;9yƽDase"GZqvysjqvMwfx෧>O'qvxLze/hO|wcϵ}m#Ywf߾}a罈@0X$" A\:!CpZ.D`rE $Xl~U%I|51MfRILu;Ob%>Bht#?R4*}R*4]BZT"aRV!GYjedիjխ-g,u EoIrcNbw3r٤7?,㢒M(M4tI#x?U 6ZɴEQx{˦^p\]Ҿ*妿osy:vOnt+}ߗ[-ڽ l+/űC*l 2Д-ko$A5%-w DQ b8pXELtBq;r lGѬ~G*r3)2z&s<,ʒ'J$+ $Вn/l.+S<ߣ"ɷe>7̃cFL3MF tkETJ(8UNC1>r%YVΌUi5Jj3)HKl:l]>bA :V OK 5Y#1fAJM4SPipU^ ]3ہ{74-c~ ${RԸ$9!~!umXW27I9vU5J6hO9-iګͻ/6N5DO ,`FR6w1hD]!{_SKfU& O9>%չKvn;9UbW\d={fpgc4b֖dq8 ^M@x39'YeSf{<PB=)PEʭ[Kl>W{gkAfAk%Bv_scA˫'ao,?m*p|?7O&p̵$ñ~],QzvelDQn:] " #R9j+!Ie"uT-jZFr򧢇C V ;K!fW|g;t _l"Ż˟!ջANf,}C;V)(NƲA;ħR+owL̎گǘqi=?~oksuetޗ bYf,#^SWTfU숺go7/hcߎ@uODWe-{g\=v_Swj廎 i;490qru֝nkEN*z/X{a>vQ+AkvIRwkK˽?yNs-Ί8ם֐~O9~⷏QW3oQNk}Wˮ(MP=_OV-%rVBL X koNwp*ʏ6lVIjjސ2}<ÊҰC&&nόkDpq,ό7NࠩbHmɮ0 ǥW^/ҦLЮ&Ͼ%xnŢ   P & CtJ DmD290 YEB%ѺtR&* :5S'>6ޱ]êzoQr^~Cuf~1޼ǫBſLk+ =H A,8mkP*.ZD ҩʖEN> z'nO:#与Z-JH.Tgjh6t'pAk @/Pk4/5*B.D4L̽;R';L/@X}='8/ W[ݓ*Z&S 3-yks\ۜ?@~?PAmx`چʣwtQ%HO_F̍wr{Q]br{4Yփ+fY7hdӿdK^z7K-'{ 9Brd}hL4rO?5;GNvԛjA#T؛s`$ &+<\ ȰCn1BnǞ7%G+{e*%^|,> i_{E>7 Z- De$bz`_&ɨqŕ \j^vyB]tpR축C w2'od;sd+P{ΣʤeH j؍PJhȗ) VZɘ0:#Y[浱Gk:gpc9>Mgm<7DHb,IR'iyRӹ`,m>|8L&E+:,֔?ڵnee-_{[]mfʸQhZ)J}ד/qBR2~Ũ$Mۜ@,XZ')!yb}^Dx,Պi%_+ɟ_KG/ 2L hw:d[yHٛr+]4ƚ'vowkŒ̎XLWJ<,x^_Cnm(aI8wT}ViT:ʻىrW,ΙxQL}ۮC9'-Y7CӑRSHh]@L-hP$^vΌ;5ᪧN~:zv>l=6^7[04ym /i%hq}4z3N8[7VbR4iζ(fX~_gEeVo/F~tF4\C^ ؍WnOB젴J/lm: (Oh{?)|$p/uKNz !ڀߊiN06/"n0JI൏ lrیt쌎e P*@ܜVW$` RO(/ p ΂TF. o+0[mPQضo ?W0`ҿ7"L$h N|q f9:yO 3qPqXƪOL~lpl~^g-Z ޅ vi2ѱ({J"j)wZbꎍ+bЄm/ChNprhjZlQqt=1 p,-P֣菧*'ѲPa g k"9$J$$ʭ %j/T޴WrR11NP_qQipb)/+er g#RO+-2)+4qDG2 /$U%J0ymq(2qJ'1Lf^M5(ZS" 9)N4"*P0P?;Rr8+?455s%Tذ6g.;0͛'pq7Sm.R%3 =)Q;W) 1+R13T&IJ:[4S M=*lC=rPRQgp6/Ik0Qsc4tg@pL sIL%:ө3nv1JT;9;s<*D.4ğF/4PH8mSZ S(*)EeR@s u/g/I1O{;гB2kK0 6Դ!Ii,KNuH*a19M^fKeyF?qؐ?y2 "&Ԁ Ӗ†:Ֆ2V(琻GlQ*˗0T>atESUGLKTT46ڵa.G>}&Fo?Us^q7 '`/щ8,uZ;RKm,#!S~6F9d4d=U37YE>{>TgXU<.%P_O a*v?QT/bNqRQT%Z:M\-7){cEt٩ ,mF%.9DǹŲv[ 7X`])AZi,)b9uXNzSˠ9ctMˡϰ8M {mO%5 5~@;/'6M}\/E.ݻ~6\yw7zq3eU{ۻ eٵ9[|ќykH#`<{܃V˜u#x|Zяg;M/<)Tw9imWE; <ݹ[(+M፛GGF}- 5c[V\~]yx[SI؃¶BZt:5}%Ř<_l]?\}]Ke3q1c1fs4êS \$A!yZlQ8Y I7J PV<[zi*E>5wuKGy=|mj}JNUgry(;?d}R T-=#AѷJ˼]ƦGMIoLY[t[Nٱvun"}-SBʾ-|Pׇۦ;,<<~7x?tv[{}UvR}W{)]2B .K}A~'ڛ̲kޟ:\I^tc[ۣumw |>>蛻*}9~。\4C+Q;=ݓn'?3!7xMXvqh}\!OMOӷ+q@+7cڍ  AOD.C@,J! E":1#y EbhJO*JarL'1MbryԊy%eĂ_(qa4چ@]JA*n!P+u\X4j]Y)վ3^Uq{YKn+eX/<=cl%(У1L75?yZK]&-<t=r\ >[L_qWʭ k_2:Wk =>_ռ;> ^G^?еLXݴP:}AFA*L$5jS9; C= S)֦=K;ћJd=ϴxΤsȯK ># I(?IJ<@#+2 30q<ı;Z467;6/ТU? $Tδ,i%QJ*EƻJ)0J6ITH>O1\-T}cVT 1=31m97rI3m %8Mb3-oaMD͆ie dʜ=XHe,Tq&SCp9sEוK _5eS)ɯ[}֘& 0^̻AWլjaMM'bLf69֓1Z?B)-l7ڿ\e!ݯ5$]XzޙQUMx:6E+f5f V8RSԱlmY1yL°}9DgVXѳTg{ݎe|6zփtr<>xG2N*j||[޽כ3ibu9VۭY)=wyيP]l7D;ujsrWz~jW晪Rѯ; VoQk_ZG?EZx쁲efKlQ CW/ t:R+y_u Htnö|&CT~m.CZutṱb#y' <'؟/@3`N)7GCP%3]tBhBQsf$ltc"lKl:'k06FDYBsnM,3q§ i|rƸnE}a;NfALtZ6Hɠ՝\C OI&)Zn@W ,,dxWw<|M%BhNeQ|/Lu/' &c.fȑTM9<כ@ g쨣rvj9J" *+ygcSJi@h˙HRaԹsn;L:PDzp)#T@*-YweS<$'.K@b{P Iڥ*Jc[dtFyyU)ɍh H*4ښ*ƪ(^j='b mJC5iLnSgl)mXӦsDSKd݂+J &|g2[C7e}B !Ygl<º>Ȱ;'u>%h/ՀziZ2:9[_orSkg;mi#GpnVu,5͖*~j]]{1w LAE3Q7"cyWZ]% 4xʒ_0܊krd#kПuò:e|C40ĵWjA٪sKy صvuU]&~d eə;+hjɶ2VYvM!m\ bsmVZMW+rlzVn9D4/hQ9z{fgT&W4Iua =vd9Ws0jVlySIg8$loN]8ql㮳:Yw͛UΔ`kN~c]p)xcka %^e#SZ[nOcػ{ĽrS|,)*tØS:Atђ!񊇒(?pj(Y} QgQ NiNp"r'cҍ׫y^j_4\xkի>^KF𾳸F}?^z׈wVTnW^Z{a#&wGy<:newk^Se5yb_SN5hӴӚ;?Ѷcoo_ÑNܮOuv>K{G S[xox5AK#* b]<ۦS漊#.ϲS>м.=Z?"!?*?c+ حX-s〓+A'#~C+29@+å.,#;E84E9 m3M8&:A;Q.3)"C+z=WC#ۥ"B8WK;3»pDCI۬ *>I@+s?!=A#<9S2;Z8{;܉CUt;sy|>4@!s)Cd#&, 8d 4Č*<|MBtL)DQ Oql&D+*AC_"E.[qs=C][2!>;DDlHF2'ML'D> $L&si5ATnTRp-4?%cⶫ,$%FǴ|J<)FKD ¬k@4Bl;"ȫ=D=5N peJSC;޿Ail{|^\~,g1~gJ"J,DÃ$d3V!JvACLrG|ԋGLJ9SK?tKL$::,F <;4#E<Ĵ@ӫD<䌫 LrIE[HË{LuLD%,O1M,2GBD0جf,BȴMB ݶTJDJ=Ó?dvϦ7lۖCL̒G.G|"itS¬fσMϴOkNLL05SKP3rsJ۔&K ͵l_*R|4J7 m0VdKF5 GKESQӖI07C\5%@JuY vU=1|C.YU.4bWE|fTC0ӍYGԴY <͙Š`5 ׿$Lc"NI6~#8 =PU)TSE}|~<ܚ4DibQR mʳO~]]Iy\\.(W$YA]ӰF6U%^%#e]ۆ!]` :YUMQ GΤe;l,ɕNIL K<eL-֕eT.f8h楂ȤZ-ݖ].=bUcĎ[v>]_VJFOGMu)f(` ^84Ji7 }ckeM?S?=^X]UMN݃RNCM$`@ *m (1:=S$s HJ=HH?4%?tbackground.pngtiffutil v301.1 HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Km  L2CbxN ¢Ѹv9ģ1~E!CRG,9|'5F$q=Liށ9%LMd]J\"ieSEBmKW΅t^oW07 `x,27fV2Jdlu1gu}.!sk5u2{M&']ƯykUx>FN0w~=uM|H JJt B Bu' '0.2/IJNsum_k܆/۷znX$pDM;5b_˓pn,[7,$ L \΀  G 45>JY=rՕB.2^Ӡ&"&c $=hYCA ^Q=P⻴*!7B2!" U%eDkm=#j'k~p Fc3kj >0 M-?r5+VNCyrx i3_ ddl~(iBbg/ ;i+X60LK"|JP]Kb,Mq"OKؖ^bҜRRVX2(faq/I #Zrr69or Fik}R!>KM6'i DxChIAHcrjN2g'C'cTiarvVEG/řt^Zâ.)thq)I)ǥ L\ԘJgb4Bqr͙SXr=etq~ʅH"!Ýt g3рNckJjeeUDIgUunp@k~ZSȴ麋3B BX҆wJ$R֜u)K%5MԟjgSji4D;CO%2ȘJ6-EBAZbjk:˜ZMZNܻ`EϬrFq8LZQ7\כbXfUK蔨mvn_b*=(A?\:o}ORKi Zխb[upbtSN̮?m:I-ΝOgefћƲ ϰB$Z vop}4_nE?Tko(1~e)G\m\띭uWZ".]oؐq ]i>R9ϲT.Oor5^cnm=\{JD7CbKalҎSwkqZ#| eTXx.훡Ez[cc"婸uE7 w Ǒ\>P9kvՓy=_<ǖ|Ȧ]} 9>X_ASdΣ;:Ӝ={Ӷ}/Fx դ0{|Q}E|ZC~NOLY r [V׉h*.R匪PPp^oL oꮏd"JΎ.؈0!l.XP"oF`nOFn$:v⎸ybB&|jPvԎY} oOq 'Z f0̐rF+ɬõONٰi8-,C(7 N5 A0΋&ϒϩ&B$?lp :Vϖw5 nwCʐgbkH% xpN1-5| rE 1Zl#Ѡ85*Rǰ pL1 Jqf/?205 Jtߍ4WPY-(Q!-;4Q?kV1ZXp0 Бw%YPq&i" } LQҊr )HПp% r]}i+P.K V2>ґ6Qp+( %SL_.q%R&Qk}?23Lo4 AA%BY+GANoFq8܏(5uOTP6r~oE}QRr1Oj 2 #@Hf->T!f Q= 2aJijWS? E@3r_W0T/9&!؛3dr4kG DB-o0,̯r2?*4ZKS{^2l*N,3y,l L9bISBeM1e.5!Nsat4“/5JTJX5.S; t?Ms3@T2SZvqEˋt[/(*7NP-|,AQg!P/O5F6S6_O_98Reho,K8i`Esݖ)3mĵ]LdGm{fScpTԕaGkKv=I3qWWWYg&P\/g75N/ NP[TPC[E7q]VlWC\֩5QuCp ,?\o_^5w?R֭(t9vM" UnVEomNaU^S#-;ci!uo0ՔRw { 쵁q-c2ye<Dƻf7iv Z t6)6olj4\w)xYQV֧O MD#i 9ΗP"|LG1r=jwmm eW2^zxV՛b(b5=rs6sZGD|xtOc%t )OehUv^s+vrvPv3e+mii^/]^j]r "{v.ecV0Undr 4<؀Xcpt1n18v'd,:XYi_:kU檲Ռ ۀ/lC68pl_ه^)CowqU!k\ FǚE`b|W϶yUonN{bS2:Lg}Xrz+~om#7qØyAH_Yv[ͧ<9 5ٹxyVP58vֳ8U uA>*4~iacUUI~}y߾Kz0]]θõ]i^̸ER#c˞X ^-Z͙ఝ_Γ["8f>U5uX͸ AhD, Ȕ>!ChdFcPX.I#YDvO"Kdp4W3ҩSQJMCҙIKDj}UϪjuf\W`Yd6{M+[-7t]׈evQw#yq;j/؛t.ُc+7<\ij;^ItA9F Rtis=&'l3l5E5S*n:Bk7;s?Jݚ)4^r89Jz^7Ƈ&L{4ه?'O>Cʲ,O>pB { 0PA:tN^ĊKF. ۊ7LS͸hnHs7IɱvJKe$Ƴ/ 3W)Jͳj쾼8L)CL/ <,4ONL0Ol QO+=x-!bӝO]_$}O$vccy~0cYVk pi5탧^ߋmbD^k. pඖ{sۂ^%\S9pk{v[}7nysAf\#f;ijM\L}aEb9Njg<ICh)WDsYIt5DbxoMNZvu5 ;=XhjOˏz]ƭ{_kG_/!/ˮJᄇ#xpw 6f{~}N=@djmq |#Py5 2pr`rNtAK:O+z(q' 3(еB;F~[h.} |VolBt)v+7")'ˑ N_(#c#Rne6$ g6A3 b8?[od:HDx{}F87 o 0iAK:[ ,Zr*xr(DqxvBT,'OW,gj.Cɕ&f-dwe4YWȯ&ܚkNh:CoA9(#\GxӓJrFG< 쓲JcS\(I7Wt4@}fR~H$e脄)h6DbS  *{ [U0b{'ΙG8{K3X2aM-N#E8 y Y8sҚ*dӪ4Dd,nk/PاQ΃\}K@`$3CHBzzD&r5a#ZX+%Icb1ɲ~)Zz;S,#p7cT丫hr- 0k]l[6[wUj9ue\xYk{Ub5kOZof/~X;Ǵ |1aku]=l/ѫCI#/ڑ٪}<Xel| MtmlKrMNԶښ)Й MQ:Jqٻ5aLVKM4MX+!ŗA[ڝw&Ŷ<(dd/>={/N=Ѿ`C HB/Gcnъ,eoBK1dzW2_zg0,:h(e{MM9w~2r3k1 6 d?sU#\U|"e'qd\ϲqYgglۙknWht?߆S4`\նIj{\'.5 3 HߙhWvrd2'kIMU5,bdYmf`yVFwS"-{{qyv`ڹalzїjm͵m{s(;]}0/7l}.;ftf -#x}uŧp%9&sn8=CT gyI L! }hp7w*7j䈃]h[vwx>酡GհqW۳ow:߰Ӯ=E}m`!~O]{5P71ӸR枊}e_G/1S[;{쪃?ֵӸ+%i9[=r05=3Q:3|A |0c{ v[6i);>7+wꀰ k@[K;qAJ )]< Ӽ4ʱ9R[@R[C!{Pbr51R@36=89ɿd2j%CBBI8D$)$aD+I7ɃlnC*ܸMIԥyGd4$P8KWbCy@dMNһ̻'E䕜`O O# P,%;BJģ%J{1lSXҔ мݡ޼1̯NiN" G|GmNn2B,Bet=] NF˵ ${: σ\R;lOTOc>H) :="̭,ȵ1HB.HD#t?#oF3j 9+ 1R@?K-Š9B$G%DdzYHx;/MX5'N1];-3St\7UEՙĮQVUXM:_ά3eDZu;mvMg}`pW p,+*RbYF1#1u-5ѬM ]&ewP\)8+{v|.O/en;\8x4 i]mJ冽]oT'/斦A*‚IgBE-)A+9Bʂ ?O /s°NFjDsDz HrȒ Zͺt{I):*;{һ5R;+ J|;.lLһ/d༎:rI 5Q;25\N45=,.hFKTCQ*tM\CW?p )q2CBTdhDqAg+IXYgelٱչo E0UqKGsϷUMnC]D7ԍ IM3-'~M@Or;85 a/SyMlvnEtи.#~aaثя^*63u%idGم/ecqecSV5cb&U=mMiWgyƟֱD'hg/ř_k{ӱ#W$mM!wܷ]3l%`$˟܆Qq-71X/`!zԜQ-'-\^O?G9^lG\9ywx镬#P陸Y=n6G>zkchT?ooݸ?uos7&L5BqvJCdvz$d9d-+rΊ XXuZ \,*}tԃf σ~*6&Y?H^+&;֦'VMjQQ;ۄ`|I>6{qER9S!aJ^D as} rj07 !tY6I^a~Ԓ C U+$G[.a E?&-vuWTifڸ+tfݹ6dA&Xn&Z=t]e`[g}Ӕn Ўs\.q2 v?+FngG+.^5' ӜT)nΘB|'m,ooɦ/ U 됵1ⱘ/ P9 o.f0bON/(qcNTD-TP;Q pE/s ,`h>5O5aOV2{FCAG5Fu# S8O1)d ' bC+5KUPFu;F9LMbPTSTV:;1IPyK/ tKSY.LI?)e#Mls(fHZO]61t%grbjh OJ =C7,m_I_u_ a4`_.]UVVVs4uVlVGv9l27$dM&Y"J0[/QqJ3g5;&t/0e71s0SZeh4د3U3svIirM%jnO(r)lE^W l`C_u+lm 17n*Hx R%DU)7cVcDVB71+WtfE!V[}Xa0350u1svxT4U#OWT{@S/uaMw3 %X7J˃Tw *  UU)BO p5W)+_1P[EP3TwaaSp37 |a3b5WW58`8~Ww$Tr//WmVcutfsǵg8'Mi&fxEuSGwAu015VC~Is|kw{myqY}l._bZծiVXGB27-=`xȼnWe7u՛"UO8mhWC&qAtY9!?J[iÀt!SGT #BQ WE6%߄ב)'SU{tl*FRGQ}oTecQ#׳_BpFޘ6KrcY|xRX2hT={/4t$ǜXwcKߘ=M8㞹3Y ؖ8a65Skof5W7k8x{`3VxYU+0#dߥT,fTuWoA=\}*յs}驸v N݂$c[zڪI{Gx1ߴ?k-Y9QZQ;hmVmk_:Z9:8j؉Z `]їMmaDN?YM#[YfGIV[=sMw]vۺX<3Z[k~oMWsNhcĕҐ䡚V1xD[%{( }In[*+>OM|!7Oq6\9y.YDU:ip  `Ј4 ap|>hƣ n9##)4~CIɄbS3f\m ̧Z F>Jӊ,uCJzFoJiѸ=Wk2eY;Il[Q;q\.{y@Ѽ A7"6o|ay<.Kt܅9hs7&Q-w[[,UiQ|wGlw]:{wlɽ:ܫSS8͗ZV< .sz5mOc/z>Jn(< =b]oc;b+0PCT8I8$BdUCR 'p3NpFG ,!Lsֵ {j2#:봒S-L۞Ҕ.lġ$M2LĿ#G{V^c,#ypuxQ |;yB3oV?n7Wԣo@FW 1(ݒJfuFWLq&-{/ /.9 ꋔ"sLIѧoP]B4ra!dA(C Omۮ2TEg@i`y<[ {3_"<2iA"ũ劯՜ 9$C·W9Uh5@2(d@W_t}]5 !ztAhխ Q+5CۻeԂN(@e4Za/tM:l&t39,]Nu8ڇ1_ċ $]s.Um](nȣӥH+`I[++]+󢍓F]絠gkpk2OLzX| Y[DkСs5>0ZEoei\9o4h'naʻ4Mt VkS|G:#!4M@xDp;Yv*1ez_h*F`:T)cNl )~pvlx<;%j&ာZ թV1f}TJZ9{"7=dCim7f4~(O02GNN,tH]Fz|[-[9T..j7>X2o-l{.G|Ν7-źbPCי5?U=}56 ok>m3bVVg ã=yƏ׽`${p>ibPȿħ^,> O W|;ӍoA\ %#k CC2[,K:S9=(AӘa::ZR,;B0' 2ż3+!4Y7c m/º4J>Ej%Ϳ=1/B4;|> 7;7}Cs(8Zl.46kDD,HB- |@ (Dt3I1{KԹc2b=\f57#ޱa2ijCU)\T=4VEK$-g"$[7!F<> $6L2 -t?TEFC;cJF,l\bGyDxICH8$sƻ4lh}4LƜvDl ;Jtz+7Dܯs/B3W4,N8J 9C$-G͔+ˤT<@~uYKROE3&dRυB=. [3T>s|Hc#̙LP4Dʢlt]|M 4HbP9m?3#YD}HpB}K#QSҭJU 5ʢUu?J`?"U4$aK[$E#GDcURV UM~KS].OJOМHc2 IM4䙒RvTW7SU6Sn@DCO*B&T=u•iYtTIM{ClY4XV΂+044KQ͍UNu:8,p?b\GJRk-(AVC5+dWO10։/VX<5Oե-p۽DEd̼%HwP]zɽ@PWմ}^u/e[33X+żM҂D?R;Xԯ^KcXyRX[Ŋ\U\Ν`%Z]Iݝ]-g%Iu}^tLev"mZI\7%(-S]%B,EolLޝ-|S a *C1d.%1H,*/Bd+㱩LZU-d;6)ĒY;(R٬}Fhz:htC%ʻ9Ji ¯_finVj\i{2}]8 & N30㰙(.R$9l%A SIN|G QW[mUnGypeOؾ7xgv:\/Yrv'[x?5(%䯦T%pj/­$PԱƉ <0.ܭ,D20 - %qL`AQBrPt-F|Gqċ ?#J,Dh;rM4>.13+:n4MsMӺM \Mn|LNSP>\6P{yK@5mTS8rr-+t- òL W o'k]V,)őaI%Yg%YFVyG ֝fݖĩwEtcx^iկ.tߘ ]7%+902STĺH5] MUVO3R FLx;F. QKS#SE,oW.gNwPӳ7=^9cF?k"YnX^k=e&갎wWzBn<]Z֧r^׻nQзi{Wڗ xjZ^/i_=q=-`-7ʳt~~t:lL ۊ9~Mezs;~&-b]{Om34D[\Ӯmbk e8_\s鱷W.ȫy~ R@7#Pa\X!aA4s.YͰf(_SKf)p;i/;n󌻺x.lL}N#E"؊:F74_e>^Ev/2<'{j|eMF_VбsY2I/9R1 DLX: YPM?W \r~I.Y\KBx7\R9m"䚆L8ra䀇# LuĘfsf 5akM4vOMc7TQFtq^ӝ3dqp)f (z4/ +eqJgEf$(BVܷtF\ɪ2 Z*tI"X% ԰nW_%® 얄U R [.K)ja%1=Q, LvYv*D7YA)v#cUZ&1vO'ubd%F U'TT+VJc5jyVE-~qڇ)ݥ^z{3Iݜ\*+hCQkT%Ҋ-*wh56[47ʉ'mBEI~RM`MU2c1rPDjϯ*f~yydUaP*:^mdӂWb9L^Sf]dQQvURK1FL#n)ӻe, V~J{j)-JmQ+q5#gn"_B pzb4㻢K.VcL5tёY$ݽYw-v4홯.2g!XcVqSWȢ=-Xa}d9L*ZaI>M[=A$B\2KX!Q~'K}Fmc)hQl7"H}H2n,ʕk1uv؛k,۵`cf|4^hA2}`էKn\VXt:c7WbL,nC/܇ta[Ͻ4vRw'ijϗ/䒧孷Yϻ|pۄ<|p]}KVm3޾|6w O}+Wwgk|Dϣ;7}CpK4Aݍq>كMĜ(?\=y~~}lڭguYt(ʺar=qЮwZ{r=[bn>%gc:{ג͔3opҽxeWά{ xSt}C $&OO JfO؟j# BkNO; @20v`QBpb>;.q0ةm#Ro zL,͡G/2ąӘs 8鳛",13s1.s]%?O,Ч4soqrwҠRe4022gOi1{p 6CM7S,C1_/A:u+_31,;,}F> @%,_.<-"*gH=0Ϯ4dEIS"ө>tA4 CqB) 6K?5 i@)S4.o*2C5)c'l Af6T' T,T5NnQC pN8-}tkg,NETZ(Z4.R)-,sT--470iJ*8-Gu_NtB=T'//5Қ3D 5Nէter5OAU ?(\'ynvsKq[ 5GrRa;\pSc.2`/R3`eW1Uf/)mbq %Ic@%/Uy,?J v'>Sr^=N (.O-ZCPzii oCTLC'3Z)vYOM`a_oi"|Г8Mlb=v:s<:naG/ISMnИE5StY9RUJ6 Sa`W%e0m?RMhu?|2USi%hQCNk 4A\jWL KW>i^?]wTL j{8GG@S".[{ p3{z,H>&KacwXicHTֱYalTwU 5'U6}'`TwkqxqQ]fS\V6EYh2t}pfַKU2O /amW;roXt@;pqWv5n_'`CTa؊wya8q81Tw8rz~x$xoSv7Zs%f/g+t(sfw3sxi^wm'w֓l1xS]kM5o)Bv  8q{SG9qDث{Fw9|{qu}YuGet~~Wsq}ٍW0r5|VU٢(2Lj 6SYu7GOvg6h|0Y vqu#;wŅ7k,.ްx  YQ_GUmwzx80t/].Q91XTך#:6-EkcˏV4m6_QSE5KxuaYC9yipڇx xv݆f7S7y[3iב4.6Vc -1y)Mxv &8 !smNyN;nR1`zYc+m8͗6X3:'VkSX0{E"5:MWGCpV\N2C%k swAI6ڦTSNT&yuYV{fQ:Zhgi3i9:^wQ L/fGYyF[#%{x/;4o ZoG{X_F7QOT1Mn[t֛{t|8BA[i2ysɁ%D;rm4uhgɫ5C{h#BiGYӷ ŵ'{}?8wԫY3@z И9\܃ؼ$UٻA' v3tp#:!`!} Cn/\ ڌw|k?m{$ /,y uU=>vΝ㔜3ݧVC>h#a~1 #_ľ1e}eY䙵T;=Q)EgXY=Pcw<>,֯86xQP(z>鯕 {m/6r=4Um9Svzgݿ=Ŗ!p:3+OߓXXt  ?OC~CotI? G@@8~E#dѨjU+F`ti5MZs=M so< L锊|^wBjtjVWUESJelXQ=K׬Xe{Q-=ι/8+ |r5Zј1ӊىL& |e8-g?n=O|yߕ2n^uV~7kN{|Gxv~fYy_m>Nk>* +Ao; )J Gi:JOq?E DPHQ ")52"#/<%HT-r\J63ξԏ,+)2/+kƻ &8MRK':,ڨK,r:,3E;B/L*@ϴ' SPSHAqSM?GQ8cPVVUғ3NXʉE Y$eL,Qy//P٢-F?9 şǫz՜RY?z:w*tIR-pٶS[;i<qVJ{YV%~6cmoCѵ>pRU𐅹_<{7)E[pnDA)ڂZ)z"fq@0 (v `XF4e[Gu뭘Y^Q.Ϧhy։&!\@m7>[}-T1ӼKTk-21w)1j_&VSI6M[i\ιѡCoΜ,7umQoB [rΈڹ!ۍhDTga3OJj9˷LIy/ŤBf S|Y30d̀iy(hA0TqQ)]FHޡgpK(F7;T47Ѫ|JB~:l>R.APJ)G ###*Khers3Oh_@ 4!>]4wP cPf q1&II&4ye= HXdbPKkWJƈlSvhW$:mMA:MiZOqWBlEx>L&h-6, 8#a$4ʬQx M#şeç=G T|ŋz4PÚqod-sJWtn]з湺Nhk\vS*Mu( )tV$*m! J˕1d.$>w{Q<Lj !T3?3@bt9\ go~,EU/Zڸ8<>LnSE7Sk|l~bC ^Ky<`M A!5h~3 ^OQmtXq##CkZ0خ8b뭍PIe -8׌fj;$nϭ 6A)f d>( >;kvZal, \7t yQc(pQpN5Pa%WcaD$ZU;Uo恋 [. _l{o>,V@WdV7\/\io+`xD4k$dg]wP9s@;Qo }/ѪWz#-Ð};ywjW>.(ĥ8#~5ҡ@ypxhu1*`t eYXy0*0iYЏ1ҳ3)-ӬKy]8R\< K77!B * %&+={>C<(7; 8[2=B,cв> k'7>C:sG9?ikzۜBD:0=4QC"a]GD3๹h?D땕7>11%:\H.@PWaw{z@w8t2LJkxbXb$AR 0Yji)RE*2C{skB{2s&+7=+8ᠽ#13ȥѸ C*ǫ9Jg8L4, r&d #<33=ùi>kD>Q(SKH'.>F:霃dO?H4Q>qS?ӗ:JDU\c5$:DcE4RɱE D82*S8:Ű;+YڠAytb2U zeu@q6@6Ce0HMAy mAD:=N3JҎNAuE]5yۯӳ @ v@+8>Hnf8AKd= FJƪMCmD2+dsH/s>ޭTz”3zQɼQ#B ڽ̼Bl~&G|< ȓի̈Gd$|89cM翃ACIO&I\}3/S>ΌD26NJTN\cʵ=k JR#LJE  ;H\EJ;[PPt4 ~g8\meˣei« A67ŲG;uHU*L~Q"ǒԲ 3M0!֕*7ҧTK*҅!elW]+CW=wH0d<3r.$53'=OlNcNF(}CS4DXTӣO4=-ԵD]A;O8TɘO(J*t5 Z\A`A@ƍ bM邶l m1(s$zLjRel[yRm'QR)=MҬ|WUj։5Mw̚ ץ})M&4&rWm}ې-/ٹ9*}58qnՎDCΔE:U >L#N.]MCX\ٜ)UNu;J5C8S]:LK)ErE%5쯹i;<@ t6\e kpb[e<6ka 1+o [tۅq}M t\+]M`GԲѲRZ\`\m#LkW%W֥Hp&%m=SXeD^#>u*3]L OݜO-:E??>T47I,) D횾śgaِ ?"O?d5[VK @/CߨXxhYpp0Ce;ۿ$HMK3̏1:q(-2Ya)LUۦ"7Ϳz),}|\L۸\kavf&\RRfr>%wW5 "b4࿴V&-T|(cv*t݄<ӐD5NKԝ2N3?-^%.gc>E[Ͻ@4=h@si*39^J=  PV%KeeE١Mak{VݽSf=~ׄR\Uv[R^fBAhej\(e &qzu־:w9ݭỤ;HxAT,M-?9O8l&5Bcih~NG\=* ;ũڝJ}/xxu(;E];iUceaiV;×3ūBSveLr^ܑS`ȎjƺGnM kFp卞. {aj&LF\j k͎7.tlKyfl)O>YN{gkC9͐0@g5烬^Tg%.6g4Ke\\#|hEH'QrmiYyUa~$ [h5Ln}`td.C Z #iFQ,nFfd ꦹp. O +.f]ѕLk Ffvm\Yu'CRFtu kAFlfwbI3l4bvcF,h^bE'l>6_$N(hZM'?uN`6GU6^ןp:N*v547:'^n>ylG"tNe8ŏil_{OqŝgfƭI]9+&/@b=, E| p}@ccmf-.+/zPչy/=Yg7dKOI̾t H9ߗ;WFGXFpt`yw̗YyFpW)1~Tfu?az$ azvq_cA@$" ¡0<ĢxOzĂKap|F'p*`l 3p&t`0ZFUT*6?7M.܏?{}?> ?HcpD@pCp=nhF*LE)jʄJn(B+jGQuŪ~(qh蒄rʬH ]%*Qz#Jjt R~2lH.j|4LI2MH $Ǔtrֶr޸y# #F}!HIe|1rqF0PLKH4uP m[R5-pַ-h71wΫ @/B CZ.1XE~Du/`0լ$+YwMpL5v]a>0]Pn_rð.m>};(Q  0<. áP#ĢQLn3G!'Ad?,%Ԧ/1F$9)$ȧxGh9DAQY"/UZVGSg5ʭv&Z":֥V=e?P[`}/xY`^fsYw=F%{@pP0  @ m{&[ DT2 %=.R֘!r)w7"_9ǃz<'lܪ?30[@o*<0S/&B1C0 <<-Bq iJ&˲G"q↕ȩT*r|'KbhI ָro,K̏3L1(+1Jԓ4Ļ4JL5+"'r\>Oȿ/~ь+ğ i{2GuӔ=O <yk  kdx  +l܀ ހ` 8KIEZ?l i?ŧB{j=lķ ]Bj=ݐqSr1m^]]omu\ea-ܑ^S߆X;{ho1)D2rn?JӄՎlTK|} wz^oOi#ޟQјnOZ}sIvҙDdY_gHQI9\PTڙ0'MW]mC`Qclc5Cxvo"DX8bdYq 3jlW.Q'0T`Xe,\+9#c[c.-&|Qz'py^:ڍq^ЎW#]diw&r3iX t^rU/h]{d1AX CG>h- ea˔ DkҹA=1T2@W3!T b&Vǖ9{4RjMqMS %P'E?{ce km5CGTPR? Pp H 5d@ `܀S~X(rf}=$nwr# %7kA#)Q4m y; (dӺeJ>uڈRѝ.BMikԪj+=26OI{p%;wJz[Po3ޭlMr2_݋"c_*H~ bJХ_[lVOYt$Xu<.p?r-w g=m=2c+pp3FiQR Qp)XUh"ʫW[>EO .c7ƤߗCX0бUi 5ٻkOuZ9gqjy{鮜]MH,yyաGZL6X& Zv$h )`>"[33&RcFcÌ g=pl45mS=]C `LsPG J}0E ͥU8p8@ݽR.Z5S MW޺~LhyڵJ9 9<7h̤ϫZ!k9W^Xtyz"n [~!L["lĒ%Fnove6mG1x'.1Ҁkt0a^ـțl̝irjZ}=w]ݿXz;` >]1,bd\IYj=FU㑺^^"t_Iš uT}7FhyOt-VJ}p,v/a[դ>V~ u_/S]tz>auǛ?Vd4ڌ|D.~,_/"H-Еۯ,+ON)0*MɓP<ۏ6& #POX0p"!r! +CpGWN<Ϯ>姐`O.q ϜLrʼO u̩K.N ,({-6+b hKliWލGMki6 ,8p?Qe Nxbf0,0Ao$ Ћ!!5L6eb%f'&D!h󥖫 ?%+篯N / AQ)!.ӥʫ'Hr0- wM7"od +Y$D*&E&LftPpZͺf|-q}Qv*nM'MR:I<Qѣqf1-ͬ4n6%b67nOX%XRDD 0HޕNN1|1iW3K3Gf>l(/'!E95'!{S̡2Z2k(S& N%у(H2-&q)k1*2yҒk- RU;O6 &qQ.?\ᡘaja"5 .Vej6R8%j0$ǖ1B֒ s 33s6pDI)7G"03#%5k)-6_.3x&}3=2S&H#;4*$Mܯ2@(Li<fݰE;=(t5O|iԹ)s_RNSЮnpAo)m҇+O9d+,2ajC--V+c9szRaT/%llXeNHsugVPZ,uOifs/Cuz4[WE3N~mFa "Xt mG5VZzNԷr)>jf-+k;Įs)ҎٔKmqVnlvR|i`o: 0>VL[a+'`,`fa-bW3bsEj/Aa +(vRs5H#*f6fq5nUg2IU WWV׵z2H jvNQwL%g5|ݐ<\2LWZo~Tj]MCnn3տt8uO'O %O.-r3rx6G58IyH1ARaqCreV| Oe-jwcJV{ط6|4WWvfnvՁz#2?Xiwxuu]x4$Na8[XՀ3ҫ\X ~2W}7~onː|`wo q:  &Wiym氝r/>A?12۔EeBR!!e)ںH3v'2k YfcfNa9uٵ 7UyVi:wiy}FJY5GZ0$Y+k:7l E|l}s Ϣn3pK{^/_KXKW:*ɐ2%o=7>7,;Q'?zC= c8ZV_BÍ9k33CUlh7xbiyY{ݨ[yJhɛ:WWX;eyZYùہl=ZǠ!չIӠs}X7ҡwYD߁ԭo-MNsܷ[+Zk[&85o19QA<4!!AH1wOu(ukrB %oryUwsv{UgeFw-qYXi:ڿ7[pl׽,k؜{՟:x˫IƘJ:]T٬l5OX#<$=w7})<>6=dEAJl8u@s;_vT3qR=yt:փh|_iڀXy{!}{Xu|z<@<L<<ϻղ5ۗX';se]  Mܙ#^z]͋q|`P'<-}+8ER5'R 6Dc\n*/=F8uD$[v]ֲU:o[f}{X\}u:u;0s%"}giR7ޏ=׹6ݭZqYk}0c~omQ/~6š9k?߼NP5E_!Q@ A4qҹg6+h>.P;w13{J1I}}ͭ(\|?A~[| !$CaT2#Ţ09?I"~?_S{=ޯ7v9&by=OEQqb5 ` `T@p  c@0 mA. tb1@`ؘq6^rZ&G'frW RL^!iuVpuu_Y;A"~_2XP]~}y Ay KQ>_[*/'>, #l"P h ' p BP4 EQBN1VF([#$L%GX& h' ҕ'I)JrId꺲,kbе-ܸ!b9i R1N"|8[OYA9Ô2>NuTCwKP ?Ѵ+yBR(J-?7C:nEQL8Խ;є} WueT5gMQ1T!^t ïj1]dVeGpOeh\O<F5eYQt^5pCqƐ]kvްͿrt$QE HIJVxY, 쭓dFSei|)ppF J0j3j6P N3ނ3u;_9ãC׵nCX3z63֚/HǬZ~vR3mFqu\e}o--GUHvW8]t}>\F.UsGO۝v%yC7gw_E?Esu8݅x&OȸܑdI}~hnrxPWJh,VZZ#G-i9414Mƶl վ)em!oAP!!m=+Fܡ.捼B|aU)WQ~YJktKFmЁ9] ^%> x(Y7^Q](k4 eXC̎L ݽd:6uS\:FX$BzhbAvZqRHQČAJe#{%<+p%ԣʑ2!@ |J>*L!ii9؝fyp  Rmq:% l1n͙ՌReziovH)aҧ.xNi!j;&ӌpQ #IDX<ů%ޕaV2Q:c\zsѪ7oV!qSaL`;hh]v$dM(Fź5Q[bvOJ D?%$vA0{ՖVyhGNz>X:fU a|0`ilY=t*32+i[5:7챖f[\wn]k ubթcy2B#dAMnK{rr^S :w[>mVےo|P;8M4q Ei 1.4#;u\J_{{9Jѵ)/=v]'-wF~to5+덼K5A M^^RrQgu)$R~ǐ):;,@ x`au0q8B_1 @Ze S{p8[&,m *H3@".[CC߾s4v>5[> >:[JC?"*F3J>3)ʇ$}?{:ux.|E@9C#IԇC;đ>슝E/|C>B#5\>S,VK0,K뫇Rh%4LJ8qP`૦pE63 Ji6٦r06GLuBkA-',,hAdzFrF,PF@ַí *#3 ۼ{Kq!WGxFds-} ߸¢d/II䯪>GãDQxA?s|<4$܍>MS*lc9C򯜌N4IkT͛Xɨ~C5x"0JDOb9HY2T@16Y8t1aA$+/ACqKB<"LkF!Ƥ%.K| $P83$=e z{lvP놽YL1"kD8 b$ĀLND>CkCʕM9ȓ9dHCHDR{,A;M>{E5SD)\G 0IZP;0Xz@@*%l}&$҄QNIQkMhRR(kV3+Tք n׻$ N A#?ӓh| H}%ɲNPǰN%:Ta$K):zyI<"\a.Pt%J`@f 41T `@F 0 Tw\,c,Ks1UQaGuQ%XQ=V˒zTyTռ)[JGE P-KA\cCCc=erC P9@:j9EkHlD$WSF$amfYb}^*LɭԤc CP dgXEwX2H!|UŨJLKDjiܑ8!dmVQ&He56mlYڕL}嫽NHA<'ۆVUǨVle]Qf\` [f_(`[gC~bCJN%#G$ W ιlt4@-qfoARu[BbV[wW/cF4 ]V|9 ϳ=;4* XC:˭9S۴?+į,1d@ΛiFZUߣ2+sԬK 6F|U.U\KXgNVum&\\~ak|Hdӛ*Nkg"UzѬ:n#o4x]|Xf(ݻ&!Dλb׉5vH/xC@D8qOPe٪eKtoe5ZdoM`j[cm6dis&`! " GnV[oYKee>^` >`| NojHQfgLefMž5oWfaE' SBEpU lR&dRZM?BulUq-6x!\֯GSzQ k]B6"^}Bخ^^ i5D6ɨ&>W.sn9Ksx=7fnEs j@w6C5e} rWAOBj(?FG?oetjf~&֏GP?\y}Q\̈RQ_OHZuOu[M"bI$^)"5SNُ5w@,H@, e=JoctY7_m6+/Ppxzw\w|Bo3BZx6nwߎRxLgʡnLsg';[>e꿍t=olkYyQ}aDy'zWdl\GTuI,.?Zϯoס.slzE_5 MaL⋩:N{vjig.&P @4:" @,\ FQ 0+L_+e97瓩T.ڝ> >/=<k+ #|Ի* [(î% ,'~~'{zGqv">C2Yn)s@ PJ0`2D2J$)TД%#޽+ȵ7̫,91&5>PM1LgB4+PPJ DٰT?S9cEm8 ENՔ}=Q4͵JV,g\4mY)N Ӎ>q+dA(YO:pMOYV]lgoEd =n$hPgEQMr<NZ]v^Ven=vܑ%~>׌Mwx]}C婄5`'y⨰F[dGq'{e'!i*Ԗ`gQq,6:)F3TИM Q7ҍQ?BR]_VusKT;>,=3` 鶯UM$k{vͰbbQו?VF]sZ\NM^_.<~Xno9d.v#yCJQdk{ATJ*['&?8g!S@F=#nUйA <\*1-*Zs^)bcΆENXB;x>/=dv?!Luك>WxHǗ!yɅ\M2^bU&wg YNOc~@uRd#@Pxu#A0cćĨșe.q!%)TOo=hgc_37C"S`RKKMLKTh ^SAmɈ@!#l e6R1?jZ<ؒkpB'3Gp3b[9 mCB6 ڔ͵GvtPZoi8>\0Ѯ40t_Rnf,ebYFYz>T~Of>1Ww.섎opH ݒ0ώlRK$dt{FIʩ,ϣz-eD\h YTgm05?K§:PЙh"BbB=DUߛQF.4jвvLx\`p,n¨1,ř:F0~7o:7Ucc~hæ8lgBq5r_Q J|%~>DK:OfBc3GMQ82 :N;@QɈ1,Ʃ YmExN38qMo"\/lTj*.@TUzTXIZqZ"u>ݻ̍4~2rOV!L]ث;0Q]'WHJKUDJRh̲ 4k 83d" VN<r@8Kcp3Gfms\0G!8k+ϻ^,kI)F@T1>w;TaԜ mRJPojZ0(ѻ3ʩss̻OZ|%-~F[RzzU*srQ]h#Sf Ռ_6Y^4Di8d^X:N;v Y~VI%V 9u}]y뭜pD n0kóYCZxADTdJor4^Wv{ٜn 8g;mnїUCϛzS1>;&Vзrfh:/EhOw|m櫫jft42zJ NX#$KSj}YnJo+r{[V|E4N2IX$5@ {NU2C u*0:0.v2)o(ї6.lZ4u9Iq<έ YGQQ'+4-AHl&-2<ҝ/-ޔ)BħT>ICS!2e!M1o!M)!:cT0Mqj>̯i#M5TOs+B+4>@=bhm9ҩJSt,3;t70|~IN0TTSJ,PְN 4sT_TsqSqFX.b/T:1KYSY'@MN-0MC/{E42+.& O4M # rS!0N?u[03I[1[ B%ZA 1K(!ԡT7KTk- bv..dUб8T s <Vf8XԗSuXqUYqg6uRs/K!Z Qu?%MU U@x \uԤi y!OVt-&gOGhMPSXo `w2nX-SFsWsfWf/\66ʯ4{ HUUyJu,STpwtwIYUitt]0 cwVQ4;DQpAWug!p+O_cA]^5s-"P 3Nmk׌ !O`YKw( [EПHNF/tn bAYwKVPVFڒFӳ|Ww;<#}vMb c*Чu!_KwIv'Z#66^+n?uU0T'RJrY"8*u yt)1 wQ˕jxc WUU1o3o-=IX03Ym75 3's6K|tVnSiWꟘ׷!|'oHoX8q8gt P֣xiLֳN˭[W]my8L]gN:E+w@ui6z+vxˇ*g\%Q A;ryf(RRQ/} 0zΝy>Ҿ=˫|{jbV'f)S{8({e >C upK׿ )Wv/Xˁ?#щY ;*y\K=eҽ$Y gZ~i\7ފ%A~A%y^=%H].&NQ]1~*= TV5_wS?%?P{>QvAb AH<.aPlFE"xJ9ãX|ɤRI Q,@IlB_#fxnk/#^EQe41JiʅFUSUj}fW֫ d,%hڮ*;M]ntu_ZX.i+>i:@sؤ>K\DP ?B\PDZ+ cW4. 4M>[0R}2 GSZG Jj'32rݫlvJnF2d*;O/E3.ƍT67b5S,1KS3Nkh8n,,?0COET :Ԃ'E42KIDjNRnNh T}J'IZ|1T%X?ãFDu\AWWUVE[C&oygXrDÖm32D3$6Q{93Ow$nF4 S ˲%Io^,1w~ oL}\4aU_8]|]NxNsKmT%+KXukWpL<ϕg։SW(7cVyAѺ{fe9T5:oYVŋԪ.VEkaE;Gv:麝Q4gnYnqEXn;pطM'rdn\avU-=LqܤSQȶMv}==tvOxK.V廆_lzglRVDrYogUhͺl iwŴYӫ?Cν;=GJfLv܅3z{MG`co .yT\+u).7x*LF4Xq0m§N0)2]iw1v](u!u*h }i!)!_cx^Dx)̣R$.>gTt:\9o,K.IdKyS2Zy!dJ1Ml$ӕp@Gk"E2#42~?!v(cc͝WIsIGmel.y }s (Co7%d k/֌JuGT攴DhnJٕinNRS[LSɇbWU0i]Q)>1:e})PTP\؛sX)ާ9-η(hYE=TU?Ϸ]Mv=L7;#bT*Qh{(rjJI c||tX@6#TjT5(l6 ٚ_l`i\1m5ʾ)6 B`幽yK-ڽU]J޷U:S<=t0 КҮ۩aS .jgkKѺÄq$kޮQ$k,f5ZZ%IXkѬLz2Z;QBo٪&9H"읏g:pj[FalkR-{ݧ8Jpe@*欼Ork Iȗ>2HݴBUk4i7VƮ乷"MPW#_ QjG7,'A(aҹלLxuljqrZjz2%o:l1^[V/kpEx JpX#\՘Mf7 \7W*2nv({̎Vbpe I.cݛ]x:mqYpH&sX7 8 n H =YCR{E_x#aZQW}?Itu!? q qbֶ$kͮ|;KcۜPjGذt\e番] ?yfs:ΕZ6]Ss4vPr1?vn#wksU=1Vejg0e+ { Y?zC0?oGiEOA\/(nIT<>B8ưK;9?A;#Ÿs̿28[C\!DL"pŌ,TĜKwxS5{Q?<90T0#1C|;C34$5+$PCyǃQ<.%,,J Ŭģ2sbE\Qڵ^[H9gEE| ["3{h2,E2I'$_: OD)\+7,eqt? /0ǪGFu;)pGT6;L,|Gt>;ZʄASnj62d:"E]:DĘI[ IT#|e3fIF~M?/2F̥I,\1$J4MCy0̴>K VdНv;APT^[- ̰5F]XͼCM>8A[UWXGRR\|]%cҕĺ>uD\LLLL5;{]\L<.eBjrB]]Bu=,cщH%3^EU^T}Vm谽G=-MbIM|G)4F>mBhZ(4 3MdڡRZJbu De1HP\ GMgT庿K5W^([Tv"jJ%_VTn*&ai,3RN/܎dM$,`9>5l\]rHlETV^q2nI7f1gRrV:N>QHr Jö|,g/dX&%[agb1[͇N[CQhlJ_& .^.1eul߲dftYS18Đj}qjFnݍjdRdp]gcjjTM Ba ,*"0x>%B1Xf9C#2Z?!#x2Y$!r|J)NsNqCCy:=ѤTiHfZ2Vv>)%[fVʝekv`pX<&b.&2d08+j1XxF;Y>[E;>붚-{oڽZpN'k6o9{g8uWzU s$«$ZAP\; Pd"/ Dғe5ᔖӓc^U5H5R};>8EEfT>duF qo( CYzMqfBZNj"" Y5XEΙj=Ͳ%pD2!Tݣs66hi݁{&VU]^\Occ'aa\z;M2+v){噧5ٷ/eɔvW+dW-ݻ'aF kdMɲ9lSjfI6RvN~ջj޶[歳\$ev_2:lOqߕ|鹾_I+7ד_,RH)Ĭz,Z"DfPLŸ0C@Ĩm}L7-LJAtZ5*lwFsF$_,eKWd{]R*!d2o4&}x y#QId0JOI ((䡛m&B.f3bcK)[4*^Ӹo4LYӽ>1K$ɍUI)y'E˾e[ *n9cmj4֡kwTś W[RcaQ;"ͻqF97^e[k2kpYxVLvgIiˠ ,Ԃ<`v PkpTY P%t N3k uV+*,+h}%YmrSTg9Ր:Oy%.I7 -7*\usmź6]n:3i-ջQRӇwv̏4ߧn[w9V*1PZ'+, Ep0yO27}{<=ZjVg.G!UW+8V[ U1c_bd-vebnp,Ude3%ȧ4ǨlmbfoSN\r͛:](f%Ћh&GO8Nq~TRU,o"i¯'ѩo*#~5įW)CIyY@&w*'e}ج#U{+RѐB /'BË><oIn9PdjnLnv#D.VnNg&*c({9PL"=H:(1jwNۭR\θ݅ kM "C P0Cn  K6 Og// H00qpH%8X1o` m/JPĠs3̌.% /-w 1ڑRVP \Qo+Α*OD l2AQ / / 1h FO 5 Gr0kK ?հP^,ἠ*.g!6qD找o+ekc˃ OtrQ!R{"[#q_#ihKm*rE j[ 'l9 '␭0A(p(-2})uo*g/,'p',2njYJ*7-O.2˲=Q04x*܋%S #Qg&#)/ %μ1у?O341?.4I6sTp4W#)Bp3!$6k)SwD0Dh.1ƺҙӫ+oA8+.Q/+"g-:M͚'O!-lLQprګ</y=d9r>?>.$HLC$Aq4p-22Vn ( 8Tc%6t?>lQPEQr}G Y8+oEtsQZc䢻03GDHTsʭJs-qsEɞM;BG/EG>ܫK2oQ.5sXf 54@s7& t #4PoO4*}ѨsPSFR6/7/QTNfsR,]EU֕,KFgFQtkq;,rRR eHCZE.M9Ntx k/sGWuJ KuKY GA u Ny&u]m)Zfpc'ճ?MReMO>dTг_PU [y%5⳩C^U57K/iCS +ְ'=7$m2teg Z/hvh-6T\ ]4#\Bb6]of,Uk7VH)SR3"o*6 U1,TL.O9bwb;SI .idzwofX5XW!jϝ>-Ot?rsvoM=K4pU@euqA't ֛1KlIw# U~r! Wl5{U7<_yǵ9I}nxxj6}T-6%I;ҵMVOn2˖=_wpqh;~W~hrh-1m>X[4&xNgatOA3AчhrMmgU 8xuxO^QyolL_˅Ǒ v 9n3_P V'c47}.d.\UK}/}Q~vT vGˌ9qel eNMyXu*<3XvuhVak1[y\wGkWńo!4a9y+l*yU9^?f~գz:܊IXӽ<tet v2ႫS%4y\7EI<72׍³Ѫ&|[k`A,7a׷-|zm9s'yW/:+IY2Ї$˷ue|s'Ws|$[ʘLտv_Y4!}"X#Q7\qY_ŝakcE:U7Fy/9W[wS:ΕzŕXM] f%\VP-b+[YXXA!O7Qsߴہ󌹷o{5N|uWJ| i\ձ ټry9MN5*EMaݹ5"Zaw7zz~]8=B[rw¥"g]U[PA#YLSKw>GH}A7 tEܹ=*k%cg1c:ĘWnQ_=VnP;'s Q#  ^5ǽ^M~ZOٕ͜i;V͒^ݛXc;{cFѝ  ?D ¡|.!ш4B-c/ԂC8^O,JQIW)D9-̧sDf (IiTjLޟ TM}%DV k5t.֋} j^o7%|vˌ/>+]`sk r|u+h28M-k}Nr6ze#o{ q+qsgQCSP;9پS?_wkj[*siBT㪽)OjδoLЊ*0@/cjn L41[H1;v7<7NЈkoaE\FѼG"8 JGszȲmI5KQܱ%I4̳f̳3lMΌg Қ9Л Ot,0>ЉK:/F i Mpʋ ҉==UEQ/$=XCUGZ>T+R-X1v/4rtJ#7-te!̭;#SEIvlvcvąnWc[̛(YN*vҤ.N0Yw{o,]6_s;axf:G4+?Et?P5uj8V5ND)cC,eP5VCM[OzeiT?vF (ٺi|`,FY:_N8EZ~ZF]zĤnUl j\>ѦLF5^:a3;fS-y^AC}/EiNt+eYhqR4ۗS=7b>>wwׇgϥi}p?7bVZgf7e_cr0:m{0h ˩Ƕ(#rA\#D˞[t,^=΅óV3H^u2Cן^3ym4nJN sS3vD%oaEu  g`w}ˁڵZNJ3h#"1kA<ܤ+ ' `w! E8t$+(땓>BiQ*NKNLN'4kyLle*[I_# jQVZa1"#cg.bl'jm(řyOI臯N1F(^F5^U26Ʃ##W^rV<ILOće!T" Ց& FA\# 475E 9@6@eU+4T3͗32QTpZ S!~zZDTe>>'̒,5@Ae`1, JT4Ut8#(z@c8ȚGgN@Y5bmsMzlaȭ2Ү(nJU*m',M fUVw:V! C5bԊlڦ~uE Zx-_h]BݪpJP!`홱mvAKg=w&ak4f0 I-[Xf?Z]Kjӫ=w:* ֌u{3mwe˛xo$z\y+4yz3ѭ~nm-ѽ 0&eI٭,׈5u{7g%V&Z*j(V JR٤}$F,t{,iZK 14Z?xE\*|z.5X1ƣR%qƭ;ܣZZU/D=RJji(W .<ۢ+3t7f{0nXc?'p,hmCǝ#}s(>7׊U 2ƺqۧNuimșޮ\lyr2ʈs 7YKeݖKiPl8տGdnwls_طVsa=OB@^xWg|a}席 3O@lIpvWhi+|_x}wo %Yu5,:= wwڗ%IỎ.;sW='->9%Շd¢:fۙP&j_Iu߃F{Ӿ>{4o̴kwNt_=Iֳ ĸ[IL?.9e<=9I"5 9{Ϲ5d+"-K&Sc@{2 8k& e*.:h:{:/ 3@7rѠc3yۉ8s@1?d<$8zOL?J>CcC V ?ȝkǡɐ_@J.Ó̹<㖵,Ct 1 =1 [6Z3ٹ:)ض=xD+.֢ @/Po4kz> 3\N? $+vS'h7$$$0;[¡arH>QGE`M?[qAw¼[1F$;%597*[2*C\HA>+#[ѽ "22)CD 6C*C QDk y@oA3Vb mDSOEPdQF#8ECutVAh;V;L"ýA)/WEKg-*#(络ɢ(ƢGK354*UrA$ Fq4$FRdHӸU>ǯ?+0lһ#Ft+u0D ,$SPTMҘ} @lC:+ӫJ<6M5t8%1GI=9=M9фͬ:%DMNQ.TUNL=1= ;%'|Ȥ$ɩqvӀº+L;>OO/:m6R1;6A7ӄ˓k=SCУU,Jj5CǜGБ6 OML<\)GN"&CάЪ(Aii@04 /pz P/? 9#,sEocDq|oFq} #깑%<2;'p @7҄)2/3r$r#W5IC2399.js:Kk,M:;t6El:0 9>HGS/t/nA\,pP* %C܂pD8׼tpC(;$*c J9\S0>(OcNCVd9ieq=(j̉rK{:"hc F6w"V ^NvlS^:Myn~S;6匜~r a\ Fe(G?,RqtB'Ęa1);HP^\/.jVi*atvZ¯;s-,/;w@D=8o$YR-gF98ќ\-OWg'9NSq:$WI2zz#>[e2CWtIhw5>ԌRVGCM$tRQ ("v5ٷšm|qPW*xU?jD6U*HLginҭMNzNICpwmb")VV]oE鏵-J`S]wyP*^l%63/,-՛g섓trYS<%|,b*BX`>^;khŬU6k0g; ܆Yۺu+S].jU9Q_ivqN}-:o62LEޙWQ^;y_PYo-s)<7``khַ8h吥gCcQ>p&8ngK!s7>L1EHb܌#,Kwia++.mA5!ꖫ:V9Yt|y"8E߰\ysffL*gfɥMHkT[Ch.vܬp R~:Mh?5Ajy~*Lq7jzfhwxeU"߳\֭9:,kTu!*|Vbs<]ܷn&+d~Wqf3&歳 x&58ygO؆:ޚ*H=bp[;A z[ 'ZWpu.+O:R4X7djY#.xbx}71w@]N_X2<#[>kN=>~G#Q{Q!t ={_w ߛуg;dO${kζg7G:lԆsv~p)>{Sћ>opo\wʈ؇nKVgvZO3,\U tEɥwٛt wglLY`#jvɽyś/K>5-KEz|˔9'MvKX]2':>CEqüQN Ϻ7'Mڹ5^Y]\2Tt#5Sy2>A~yۧS>1F 5-5K>wzi"A!]_Hn1gY *PCm/զwK(?+B7!͚ǹ~9sZۡwx]}Ik[Pޙ_ܹ;_ɥ_AU APHD. P<#Bb1X> n%I!9DU%y6aiD(oepZAhM&(C) ]QT*jXիrJJMXkEGZzo.{=H^-wWpUU6&L_z6kD<{I4ڝLރk:ίgL96q#ΤymCK7/U"?ѣ2Gfq{\s[̛z<ȷSI鼶"Ͳc(,K3CJ4@/l @4+2P92,0l?1#-ElKJ ƫ,d4L$A)MS'ƑHRTI҂m"c)J)?5N73.T܁lol89S{C39P*s5r5yt1DGpAOaREEN 8bR;GэY# 5 ejXՍ1]DZgMLVmHݷo[*wvLĐO{V]#fN.GocEX >K/wO<|[ꇹ=h'A[UuXTv;U$d6ASMX_eu]fټ!dB6}lVYh9GyMjkZU\ñlm\K{WFنL3)RM}8n!{^21;Jώ1Qϓc<`?b'Tf_{\w's|^ޔ R;^B ahZ΃]:.Icv ٬[lwOvYiv헩EO'36nhZ{ðo=l<<]!$_$Ϲ 9='(;.¿uJ#** ;ϥD HP4L"iؼ>^{ BD!Yg,";zace- 3 ӥWC#YJ&=DmIMm_[u>c`_RIM(5ܣT%:w.bI e`Dm`ԉqFqoE?KdP#÷ax0HXKJO؎YBF+m ǖJRRTr\IZbB"Ӛ&7H"TlI(Fxs̰\S~3x,ڃ3):c`2G*`flA%I,ӈIHh4Pi̝|feT+(IX&$K(p΍Lr&(3/^OKls^ PIgk)jG( [LUy%XjMθ: lR:t3H1Yy炄ךm[삕q'b%6c,D**]l&h쫢)-ixdS+mJ61|5%Q F&Tˁ6DݎuJFwַ`W6ըcs_sF*4_}1 u4-7rs7F)$*VNZD-ue;+c& бPY[R,Ѥvb2PN'_CnHmv(ۉj&sBݭpnީ{7N4¸jx^'dRwϏpMՐ/dWBۯuV^N['[%dn#hp>(e{aH귦,O ,ahPf&L\WK4DEKR1eMLkt3%ànq s];o.HڳߘmҨelq#=G3&YGT787ao酌GTnh(%R[}g*Y%J1itHYvtz{J̝xk-=w. rXʺQd8yNpݾ7Wq3뜟r\R;9}.c t+=!6 GhO:"(6$s*:+v}Z`M0"XFoG~t҅o8O oUn6$e'OYqkS_>s{YeP{6rM3PZ<(y=bvMNt#*uXD.AoJt-̿yvm}P}D(8P3t }l"m<[n\KLO6^U=go2ddV~Kǧry[+gB82\ :=Rؖ =ťk 3{q0]:{;!;Z;{z=:2=c>ckD!#̛ @:s?G8k< ?s"+J5R?۽2>r?4Cr2cq<64 \ JRpc &\?aC9m0- D4+v>Bs>3 ;P>{# "ِ? >1DTxDMǫG>-~ECgU>y;TV[% TZۻ[YE<^F# XT46 [lŌi9;9dI21+bt)?[;JHDܯ7O!;TRdS˃&\$#*F;?E=#PH<LJ|K qHLo}L˓stஜ@DNN L]#I#ŲkILcȗy.cN5㌿̻@zɘ B`ЈT6A8B)xr5cШ̊GGt.xW iLzy-OpMEJTIME N%HG+vON2,V9UdVKw+_,a|V# 24ܞ2<ܱ773+t:,u[#gm]D+7sH6]k Ki'jMᴻω}>vǥt8x,\k)hK,_lXk 7̾#obot@zT ژA .PC? t?DpLGLTZø1r0mtː/q4*GȎKG2j&92y)7T%rt4o1.d#6Mc9Cp³ )L.0販 L-0;ooCte(F+C R CR/=FOUEIXu&DrV`ͲY^JYr ܯmg27̖i eXM8s=:\}\cgRN.4NU_S8#B•[ U*5Q(]løF3- <&A<^Lk[dx;09]Xq1y~w{s6aź ld]-4Zr[,&h5wk-/ؗM6m33vzȗš}j`uUᙦ+fYU!UmtU -tXWCC]a/?i}y{8X[{/鲿mk l0:>n:rN's)ꞥsxۯ||#/:Q?IQ9WY/.$.> ;#uYR$}]?A`u͙9 .u CAy#Cj]Od|tko$=֍޳Lmn&?Q{}7%Xo9f:~.Ɔk2(N},p(U{r9ǓDsBS'eWuW |P B>͘+iJ7Eҩ+H9p%4R}xk.r҈E1c]EE0_bjO<ˋɎ5D٠fٮzq\h \}+LA H7:R.O] I$qɩ옠PO%d0nIy %dIOI gAQE<|:ty<9߄pyM#h&LNcK("l]ĺGy2т!EXl/Js4 +"9F 9L>~G%F INKܥgNԥmI[s޺8hg6X ]*UkO촚rK`NE!>_yU->65HS:XQO-+խC+1I^1 Q ۽2:joWNjRm%*Y-?>mh. 5L3\EḾ,\n+*-ÑٺiEHxc(Mԫ"*9 jH;Fr]'JXȬL%_u$<͙aF/_)njfFyY]qJBZK'n, ¸[#.MU߇{s60@VUsYuܫϐnLzHQidP-vYE̮taf,sP`,44V_~Ojb,tx>g:Y-.9a 3/-54V`LPΆno=FSDu]ZOܯ atFS)c3@xM_7ˌkͮc_q*v9MS_Zk6S#΂x;l6Џϩꮑ'FGk:Wwv]A4 :_%3f exFNϑ[ȔԔ oU;.W;$Rw˾Ίǟn:~zM~?}?S&JlGjD~^)ݽ{z|];eH^^x%'~.wӻ޸=$j(v`-, y'kQlOx\w*.EMNOA+lꦢE.Z\jjG&o~F|P,H)-.,:!OO/ LMP$od毰cN8ll nhALbRrNB /5gwLGKp>ήlt*-,[iĉ![.1C}nP -^$,ի6 /OǤ p0"Sl/0 0FOQ'| ν#]OLk8nk8 o!3[xFr2PSA+: 5/Qt55,Rgn5'E5O`l7W?sU!V37Ai*L#44 YUM4'Ҋmԗ3-bqcm(߭{R\P F -r[ I'Q!9ufbJEU3RO;t[[N|Sw(;[W_Րc3sy:o@;?N<4:UF;YD9M9#rgkXguu+Z<\=5/½{X[}<\Q|?|C ;yVjEmxH>kQq@-yx={ ϳY}=Mv#;eE{^Տr]%W!z;ᾱ^~'_ՠZ/^EHb>[_U^!_W%R'}ރuT6{={AK2  AH4 tBH,j"1>-c2iG)I)_3E%щu9\5L(tY.8Sh 7;*LNYQ՚"Pi{ElX_Rs][xo{01`P}T Ltҩ۝Qi6n+ZT{jot|gV;=s>Ҥ>Ȼ:NP+AD P+ A .CNJ «>5?6;E.XEJklw73Gmo 5t~n<2R"GCҷ32dF幯г*?)kΊ /t6> $H 4p={IAP}AI3 8SBUIq1SÍlE1dI+s"2-ƱW"]&֕ܫ_H=xV՛$Y{*XM_6JH|/9*>\B3+sr7@ 9ӷCO\L)Ԅ,^ԽQWҗJz`XSӞ1OITACTNVP[bGU,W.]]pe{f5X66Xcp>iəuov{cWeR6qhZğ/S\Վ_>O:17wm.CvSBkp[sad!9d^-QhWD6=.6Ց˺Uiguuݧ>zn0v:;_6`}mE;P$~{?5XpX7تC9B;yr гdC`xfӮ"|ѕD[\XqquA}\lpMsp8H'`N Axz!R vr&<6d[ n#Hx?jɘxRK× dNI,!8nAP]~V 3bF6IS F⋒G4{xѽGW $R*g;8<1w9 #]rƮ2ݦvt { lGg,]RP#Ը9{k\]5J F=avv\P[#RoVǛP zIyqqV+T0O,-A%+e]yx~ď/%ޯz^QzB]EW|Dj6lOeR:|ٗ4g#6Lj?amO6ۛk8O!q3JJY 9x]:{m;t˙"RcIaAǹ(=O-۱2·D{H_d9#΅δ誃 M8sr`gͳk΍5IE(%^ޒΠ;)Q6HܷB5[U C茪\:4o]ȼ_}&G:lKpg=fm1Q1&gg9KI3vt)]j׫BM5|viG$:1Zk^jF|7aeMY,'_xk(]_ckvܖr{!7>_U#8m//3[JhǠB{[8mofᇹ9[O']^rw1pZػޟeX^ƍ=|g$5㸝Z&kϫaG'O9g?P!z=30{cڦKxBὡLӻ@ y( *KTÇ,K8Y/K8|(Ӿ#\,;#;Yk?;ɩSs*[9B9ж4D(*4jj#3q9=oL,= *KsBGت&c4l:=9>49$گ@;3N8 $Ak粫~]!n><3';k2/DJA  8 A0\& !Ј2'"QXtƢ9CId3H*vߟ\9Dʺ>{}7Rc̰t%xSw0r-!T,\Zi(D0p-~C4QT)5WXR=fE^2őIZeekf]QmofUͅYu쯑ۙmזr؆-ux}\lzޘ]twvlm3Otw Pn뗆Bs{ |5\o:!wz~kV竟+jx% Gf6t29Mhm}6iWxf*j̛e=>>f+<Nrl~_hfy`GQp_ _L59S3<ó.2SE!g`ü6R;hHxn T뙳0 4NKƂewrzm< PŽ=Ca.1?~I} P@H[zS I?Dic5+r2.@+Cı)%}gDJ\T}WoTrF+$$ӬH{ŤֻZ녔q:RFR`\B$Jecq$jόExIGDU=mysJjF5AX8Rd#*J;mH9dHSH8'zU<9&ajKH*r+J"k%C>:[KG0tƤ ]0Kt}V0GJi\r,l^+=~ &ej콱+Mh&_@X b3wҐ5rbj\mm O`|u Bu=~WU氢Rm$rDe~wp;7P(KlIbqV #!LN(^N6QQХ !GF ')!# ,BeΒ+(¬" #=iRXH&pM p亱&Q.莒1nVzMҳ)1mAOSϵ*o r*ܾ5I, B2p3q*5#4e3%m1I0N@3r9y%N&Q<rNcm;W"0.\1Ƣ*+S{/'u+7m}6 uG/8'!C 93e[.J#$1Q:rCD3=iVro&;Fγ%03P=2S ` '3 +6R2*GA>n* 67++QEO5#BB!CL%Mљ-tO s3 aDQ}:0@I0Q%O$ ;EPPuEb- sFMHIJҚ5qhnK~VWt!SXtX09\L[Nՠc\9E[IHgeU[vs;O:c 5&Ե*jjr4'U-aA^e34 oo t&6iWMVQc6O5tNO{FNtnZΓePIeNb%'RW& 2wq^j)w^ԝL7pU?U?uVV@A_Bu0W-*5iA87kW7#jw#xJxTKvQr6QE TmoTU:x(:Eζ/}X&: SRYJx5\wJ;}[zؓi5KLͱzw {6: Ǹa:w}լ-:)#yf|8]m{'0ݹy޺Q{ve1 Bg[{VEĐ{&{zy[݁{iu>o{A_BM8bcXNoʓs<'qy˸=]Efm÷̜1Cgs9Y=beWZuNF1(sƐn{uڧ܁cǝ%Z7;[MMɇ!yv;<u|+oWy5ͻ˘c};0操]7ԇ/w}_SֵZى[ގ黍}sѯ/"^'Iw^.彗6O^lz>[戲 /ҧkm e]똼Y[ͼ;pVM Q>}_Q4[0!?QI y-* `HL. @ؔ&Dh27c8D$<+K!2Exs:ϧ-}3Qi)5MS NUU\Wo^YD0}nsڬ3봢u_d*ŚM`!= !xc8fv_4<^gIehsu44tj/JR1&G̪cExFSsjT)jdz}^̲r;{{s}4L/ Jl00{60c4Al*@pSK/CHδ- 11K!m[Zz(6k81lJv2`4y$;D'H.dҵ&RuasYݞuVtN73ZٖccNS6Y{(TjLybLvoNe!6߫kl*b7CC])Rۀ^Px-EBm D8+]FGp9'ӿ>TWsdI9gZ丛\9:dƇ`sDu /)^xV볷ķUOܿn[~Ǽ鄯OtOw<[Uſ|?_S}ƽOuNm@ 0u.| eּX IvpQp;e`Wsj:!j}4AT1<0=n|[44zA?W|5>hE|1wvXCE'\Cu10 "XJ1w*c"45 F!:gUrL{)Ax5WvvPFxM$f߀+5bw.{XT۵bn*7vuرbkh."8-L\lU8Ek 9Ci5S D`cʓgjn2neϨ;m]`|8^z!&R?^7К#h=wnd'WɌYyQys ӭ PD2 Cap|F- Ģј,r7#7%G \~MHe $AM1lc3gPp CQ*NMU RFU9j\Wkv%EYVekm;svK׋U~0[alL:y6|Y2Hf9gwSr׫!l"}+"`-~Cn"(%fOIbzl^bҹq;%cQP9=N_̙K,һ?jI4M߼e֮ޱ ش@P, m4ҷ3(2TB0o BqCg;&0N 5L[ 1s~D[z2 8FQ{Gnoԛ'*/9{;i?O"J)9ˮ.@s0ϊy4Kr8K +:6M ϔ=.1CrEt H1r,CO9ьE%#0=T)Uq UTiTHQOQS-7X s`WlUXM&P+=]ڪkٓBqK5]‚[k*s@۳KPݷ%mN7s `KAE]t!$TՍ\Vtx}S,#dV%AZEGQ5XY\Ӫic ~7]7%US9Pg)s@ȟڎ7]Vvjk2Z~;6O߭|/ Wd]t_WrO`g̩J.Y:4<` rՉv-ﴥZ` 5i]kp/%^wRB[l-d@Љ=AnD؝#oE(p_Nj,m1@fM("rO)( +FHs(K󲃰g'U!c_prGwrȈa$#͈ô d|l>)CnGFeDPR+g $u?*1 zģSN&+K_g1=># }g1bGäiF#4&V@$4h"OG$OL!E!!JW\$!?28Ǐ;Hj*T& toKJ-E |/ lTk@5X=r}iwgCj& ζA nTF$@*TB%U$9-dk]c|*ъHU,P2lj(zFP|tޢT'A3歁thkqeޗSgQ*Tv?hRJ{U9R4:y)CNY&MU8s-\B[x-_HarJ⸖t-<8U]uo%OS"]=w2phU^+Eo .%}1݊EJY!@k/Iy5Ӫ3K/y3We іnh6Jzдjl f#leWRԽ*7,}t҅PyRaN/g(AHewy=J_{ק﵇*&eCM+SMC9n(vgSs~ƚ?H(qUaJcGnQ!u}-@(2涞 ,q ǫֿNMԷq*~xx>F $v%ۭ7 y//7C(m (6s CUAv힊b<}#zi%j h5OߜYM:vR{em-iW.n#WwVW6L !.}zxh<+m+^c%1wls>'ѼwP}=ooݮz]?/zrbJk;7ֲ ]{ڰ%uw>˓lȤγj ~:Rz":6[˧'_7)LΏZ-.OXKDDa ,OxՎKlz8{ lnI $.m!PdðH@O2Q\m k %N0&NR`oh, pܛp2 n#LM`zBF~~+D&FaĢۑ-O`I

CHү??9T4е+s?ԡ8m"qu5y9KQA8p#Cqh$#Cu=1%zP]6Ge}Hd\ѹ6 iTj |U2Vv]Qjs_9g4TJbTAhUkeq,ʹ[YvSYdZU_'wiOeu[pwzw4j5gT5!^6ȑMTv v`3ks40gUQhA8j7k9rvV#BwZIuV&&$.ntY:W d4^)pPK)olCf Cg(r|Q Tq;r8]};5iJ4PU{i+u+WtEQtp̖jM'w7w0QWsNx*NynP}cyjԺ83USx_usR~qu{rT WiKK8mUuA6m#+!u4wH98Skgvd xio99Y*&7mC KYO1Z<]81ooy=oX6w\qTsf1dxqr f s-m91i1~Bdgv:9<!o[s1ޡ5k67ˁ1ykwXy yy:yxe8SKyryyuwc-|~iI Ob5lvYX Yx7cPcc2yX18۟ӌڝU]W9xS7sM =@QBv4/B0ZIU\q)~9S؂aueG:Ds-tRM n8H7Q&*Dz=r[O|ɪڱףz{t:͆ ypqYWuBpVkY"cٜFw)m{w[!9鹹Z[Ղ:H[Ǫ[K2+1N˵|a[xs}!++'wAwm BYK.[z;G7Š;{9ƹS蛴.U)ewΉd| };_ZɆ]k5< 2ǚ[:;C4ӎh5z8".X!t; /{N5={wg2{YI-be3x0];?ڿ_q4}~IqX]ܟcwKT7~} PFޓ<єɕ)מݖpQ3؟Bk#ݩ>8  A@D. "N)hn9GI%Io\Q- ]1&iw-Of)QbD"KSh|JD*(:`f8W"6*zf*)6ڈFcCdW ǰ M4!ob`3<,^zK A=.MtKixT~%°GkәʢP=3vsFY{{3{<&~Ns%O>2"LKf۵-V($L 6PBBAУyA#4 E$TN3R'%]DitgDqӕD!Hr$<3>nɏ/;J-IO Nܝ+Jr3M'.L,6Jڶ.9@0P!2 ϱ}̵TQF- QDE%E9Bme!F MEծ57N.U+ZVs$]toT?M`Gҭ{16Y;ٶL:+vU>r|򮦹u8_-=[YY.Ϋ;uZ'/}7_WW\v]GEeݩ?ΐ=o ѴwDU՗!^Gp^ V[ }3nٳF?p usf.:v;]Ft:y`3xy s.T }%*F!<טCnl9>_ 0HϿ'Hp/1߄;uPbUs IQq!K 8 SkW;¸S3NpGy3j9b'6zh/%TZ1J)ŃuQo*"4 P1IЬ{/C'"^,h&\db|9*BzI=DI*cAHR$;iǹ4frԞuҺK5!LLPeeBlӉcHi|ڛBSL3x?gZ}Q6N) fzEZ=;{Nd "tfZ,"Hjit֧ԗ8&́X4I,*ݑTM*؊c#g|,MqZcT$`~Uj)ŶÈmrj= 2>] XrqL5Pu]uodrE[AKז^gd*[N 6$bW+D:m|T:M @0d6 C(VF"1XZ/GM%ȡM/J9\a-M#456JgtuD"{AӤJ>UmriUTņgZmVeɮ6{uC/x`/˭iܫ81LNNu7Ȯk5vgiX6W^r@%BOҸ:t xɔəqsDP;TSEWm5nUֻ^mcv?g}_ SJ6{ ZcT5BA* C0|*C) %t<شC!$(QT'$,o6ѬSҔ .|ȳz24Jk#KC.08#s:+?R580$ʷM;oO1Eϱa@FJij @+ 6R44Eұ/DS44H5u-U%;EtCU_͏7#V(}ZHnZIHQrff2MnX>yf~TÜ|;J7f`;9~^XzǗ]B>^G씬]aGtүl-RUYUl;dcVJ]Vd.fVqjhy-7ziݥb8vHֲfE3a bdgwtR;Js8c@=n|t-3Ջwf:gD}C5.ZKz[~U-" 3?w_vH[j˫T5s][r03kvΖlvnlqݺ5iw5ko49[$'Z7G}C0{cbH4'/:wMZzq)Ӏ 3Wήq-ۛ7bɮh)3>{ϰ{{Y-l5\}֝D>O,eR;exVu%E<DePkLՄb`aWgqQW/gB]|wO~V_.\C$[K }<{ß?GɲFު?z(mX3tMN X.&*nzKoO!&ot+Oۭ<oʲrfw8R 8ӮzGj%0n}n$3r駠&:-,~PS :n PC 0,ϫY.. d|, K- .) Ѐ ?/ȍP q8l}/  I"0)0HI.8p h.Ew] 0|p~gNi wp-1  8T. nǏI<PRzVLA$U(OJj9q/niQ i & 1.j0ɢ 11-U~Qp&p6MZ0%[ #2qp2(z҃\125Ϟ(j;!P$U"0KUC-3"WW& %R0k*  M ҎQ06raq-1qK 172d2p*IL_-qnlLgC,Q$RA*MR0+. e&ѹ//&ˏ;( 19xQ[;3qI/&Q3R)2v31Q 3 m SCH Np\"%"26>ؘi!27-dz{D-8Pw@4/<20w9:0C'=Sڪԫ3<k3a.D۲sM@]( @$"Y@$NtT-c$T)?CtLD;&([%}$lTU1419N-Eo/E52iMSl9Ehu3H 5+#TpYR15u*pQSeOK R5U/L4/LtV4MCӓ)[M;A;QNs: tOq!NnF uEfbQ5.U4E+'55--t;@%J-/ IS\cRU!(8B)VUJ_WPLDRGQ4DYs3# XEY;s7X/=T<`5u>KUW^UY2euS"O6 \]R8TkT5a6gc_5uh 9/MmQOUn{[iU3GD+Y6+j%(lV;G~ Gԇ"t-Q{?2!mQѐVf=5-AAUYg4KquU֓8 r,Ww(|VBx6`;cv PY4L#XsOP'in#W,%zv!pwqrΖW6ZMǓ6w^WAmTf,^ r,׹'{cmwbs11cV}_~ wl7]v|Z/q6krwrB6Ug5ωpYo2o5\wfwIqtwzKބ4I|T"V?Lm/Dt7Տ}} 朷k+F5чG9&)@x neeReO8@X?6SezO]Crt!qC$QՅaX趿ukmFai)RFTS=b~ω oPa-㷟YY?pwxryJxhX_aTE[ٓXᎹyt39w|mXqusCWVs%:jcWXtwvֹؖB@wYSYafIPژ/,pwA7ϚQ*055hRokT>MUyMؽܛպEYc=O8=SYwal5g~~Z.Y`޵ٗA'F>ŜUAJH훃ܣޙ \K+}ߞ<ֹ?<'/C\~e_v׉B^ߟɵ7> ApT. pH2%EXb9BPy zI$ǤXA*Gei5My=N%GhLzEB t"ϪjfYSU]oݬ(|_4)*W&FvJ,#%KfS&{eY$_Gyocbzso4qqW/s:BR.KMSo@/'cZ+ߢ| 5O.!kģnKnL~KgBp.8p$p,0>ǧP1 ]BͪrAʛvFp %lHGQ˟$#H댊'҄Ij)L-K-I.4P2;0+̹AIGͤm14,B- ]!UI&ti1EIqbPtkPU$SuJyVcXKΝe:=,[@O۽W36=6 웽R:سzf֓~Y639KҬm:3ӻ>S _?6Tru]57T=QxUw"Eu!QxXvR5WѥwwbX~%VVyn9Ғ[ccyJevm3ZfefpmcW恑gVq8=ɥCL1B_4z^Q6J"xix^F^|_p sa^:{Wɋ{&KXک{pg3L9g͜|[9esϤfS7OSѫ۔#u{jѵ'w}]jvRuQ9ئ{Y?N]?p0?~IV\=[8DT޻"m( z<|cl,<! #(O91Xz7OzhqYL:7 V;e xcJ? kQBD_W}mLA(0)W3QKKW;t NRzܯycԧ)w2ȢzS^<È8]$Aܒ:|jw=O^<ߧ~bzJf?8 V2BX*L?L4A0J@[4Ф Eqk!M9o\fƎ8J;ѻ>NHjDr;2/Tҫ"Ib-*ܯ 4KS<5͓l0 #_8>t΋|E+C1Q>(00>4EC?A4єLuK.7$4<2O!T]kT2e]TUWNyTKol2+j4[W|aYkLlLSv?;tdQBt+p4-LtYOD-w Sn[+EД~=Edؖ_U׎կ!͍G]+ZL5Bʏ}a9U/׍a_cag` &̓>lqޔKi ևP4^_z6%㦨Q?k9ݷ4nWW>eY/Zf>9*yKfQq Y{{_1V2YDFyg$Q/i3+Y>.fq?(b[LjHc…QZF/l_Q]F ZS2B{"!̨dR1QUiuqUv3;Yku|`&D*N¹YzUrt=WZ#4d۫e;7-stKQY.XN!&=ç4}Uw]IEkJ'מڨj}W{WUTLׁſs2^ \Qhj:IEM v'8[,Ƹ2be2=Slfj`+09WA % kMӺ2]ymqxb=^bH{/Uj#brwz+{ B,,˝fhey2^Pzk)dlk'`MK5Cwa- dƷ8jIH-/ꎫ֞Cw',;l7]-v Im<꣟'O_˙w:ʖɫ:?&v;\j߼lۺk7.hĶ灖m}qŔK>-*ܙ.U|{pfS6#ڀdɛs\>+:[̷V՗Komue̶֏Stsԣ cIe )ͣiK@f6xL>}֗usiRmo~(ϓ-MF.ro6Oo$pB3E8L4B-<.W,2=ESH-A62r3G@9H7i@-&ABEhH*B*1qw'wB =!c!?tK31E4G[ET-G2sb>tYNDSJ0H P@mK&) jME9790OJ6MB:-HbACL *qMQ44=pJcP11G%UNjYCH]PՌ\Qk(!R4N{R&3ߴYAKᔒ=MX5PT=TMtqwN3n]^mOu>?X uU5:s@QVԡ&)0(U0C9Krb%S@PP\]2'WT{3yU UEvWT]V[,_]uUG_g`g8i4acu?IIեboJMoJ1T5(+\f>h24Teȫ.%UTe=m=1hQH1 WѿWxm$vO`um_5c&U\QCԉ0'-9IA)ӥS W#lVvTufQAn5fogW,e6wwPma6jjW@]r0v)ikS//@-[[6!3S35c7WwvTfِwhv{jf4w}_W78lvZkvdHӵs5GLWK9y||[}4u-pt_xv߀i~x7ux]A}xwwW!es.yad/07Zx eTLl5i7ba$b񋎑tiMVہW]qR-iiK+npYFVYW4knM8{nqpQW87zC%R mzԗXOVCc8ƣ˄h8+PHo%w^v7y<5XFxpUO؁~wq/bUzx-1W[hAc}r dW8˹PVg6T=co2~Yi4 F},YyۙzRY7/hy%ױ6/wH1uQ}CZo"˝4|X[5T~8Z+Yw٦ق 9:r'rGDG-r9kz ?d3'JQU"vGgMc#Z~uVxYr6r_XZmzS9=%嬄78?J͓ty;:cZE1{l{4Zb}:aI:i箹Dz_/_fgy:%:D qZS[@qGK[ =Z/)s&i>ՙ V0 韧lռmWϚ)}}HZi)ۛ?=[7J;Io  ? ?n ?86 ?>>(1?=S?hs H?"$,2k&#b!@,\"dMtGsW*background@2x.pngtiffutil v301.1 HLinomntrRGB XYZ  1acspMSFTIEC sRGB-HP cprtP3desclwtptbkptrXYZgXYZ,bXYZ@dmndTpdmddvuedLview$lumimeas $tech0 rTRC< gTRC< bTRC< textCopyright (c) 1998 Hewlett-Packard CompanydescsRGB IEC61966-2.1sRGB IEC61966-2.1XYZ QXYZ XYZ o8XYZ bXYZ $descIEC http://www.iec.chIEC http://www.iec.chdesc.IEC 61966-2.1 Default RGB colour space - sRGB.IEC 61966-2.1 Default RGB colour space - sRGBdesc,Reference Viewing Condition in IEC61966-2.1,Reference Viewing Condition in IEC61966-2.1view_. \XYZ L VPWmeassig CRT curv #(-27;@EJOTY^chmrw| %+28>ELRY`gnu| &/8AKT]gqz !-8COZfr~ -;HUcq~ +:IXgw'7HYj{+=Oat 2FZn  % : O d y  ' = T j " 9 Q i  * C \ u & @ Z t .Id %A^z &Ca~1Om&Ed#Cc'Ij4Vx&IlAe@e Ek*Qw;c*R{Gp@j>i  A l !!H!u!!!"'"U"""# #8#f###$$M$|$$% %8%h%%%&'&W&&&''I'z''( (?(q(())8)k))**5*h**++6+i++,,9,n,,- -A-v--..L.../$/Z///050l0011J1112*2c223 3F3334+4e4455M555676r667$7`7788P8899B999:6:t::;-;k;;<' >`>>?!?a??@#@d@@A)AjAAB0BrBBC:C}CDDGDDEEUEEF"FgFFG5G{GHHKHHIIcIIJ7J}JK KSKKL*LrLMMJMMN%NnNOOIOOP'PqPQQPQQR1R|RSS_SSTBTTU(UuUVV\VVWDWWX/X}XYYiYZZVZZ[E[[\5\\]']x]^^l^__a_``W``aOaabIbbcCccd@dde=eef=ffg=ggh?hhiCiijHjjkOkklWlmm`mnnknooxop+ppq:qqrKrss]sttptu(uuv>vvwVwxxnxy*yyzFz{{c{|!||}A}~~b~#G k͂0WGrׇ;iΉ3dʋ0cʍ1fΏ6n֑?zM _ɖ4 uL$h՛BdҞ@iءG&vVǥ8nRĩ7u\ЭD-u`ֲK³8%yhYѹJº;.! zpg_XQKFAǿ=ȼ:ɹ8ʷ6˶5̵5͵6ζ7ϸ9к<Ѿ?DINU\dlvۀ܊ݖޢ)߯6DScs 2F[p(@Xr4Pm8Ww)Kmtetzle-3.0.3/data/shadow.png000066400000000000000000000052721476255537600157620ustar00rootroot00000000000000PNG  IHDRsRGB pHYs  tIME ,;-iTXtCommentCreated with GIMPd.ePLTE:tRNS  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~qbKGDHIDATxݒ F O&!?D;; E+ ^W +/=#8zWLs=ds|%9ő˔A^ ˗3ʑ-x[|4o)6Bn b0\w(Qcp;-vҙ ԙ|'Y _,'\ÓAع4Ad]. uSpwƳ\m4\m #tDž-  `n뚸8rgnqrq ,V_8  ?8 !DvXp_U,bCW7oFz Ž?Uْ ,d6@bvg8I|馏|P?&B₀PЃD 9yNVFP8-5p"@mP K 7 0K]. hC3a"0@, hC3aA @@|Aח y&H  K@sȉ< {g&NwP9@P%x&@ |4 , (P|a M1r5ai |N)qE%F -q 8><P_/v@xj%EzU MU,b 1_PsQ6(r.<SLtAlІ]/%Jb=5O @ X~xX<&rR/@pѐ"Ak%BM3ksK4H6;@\m+A.2^ g "x qp/iLֱW ]E` 9U">yl@KҪM{ZQ@SaYlmRb( #_"ZI恥!'搤u#.xk5.@]p `h,08 07K z9%$ @6@BM z p 1jQj.}@jI-0 |ԚvKPZ0t J@I< $#DcffS=F4&TTZ jx\.,ؕ _^{\`BXX.d\̈́4N^Ԋzya3/?pO<#̇?tZ=xޭc7/. sqq'w]IENDB`tetzle-3.0.3/data/unix/000077500000000000000000000000001476255537600147445ustar00rootroot00000000000000tetzle-3.0.3/data/unix/po/000077500000000000000000000000001476255537600153625ustar00rootroot00000000000000tetzle-3.0.3/data/unix/po/LINGUAS000066400000000000000000000001131476255537600164020ustar00rootroot00000000000000ca cs de el eo es fr he lt lv ms nb_NO nl pl pt pt_BR ro ru tr uk uk_UA zh tetzle-3.0.3/data/unix/po/ca.po000066400000000000000000000031001476255537600162770ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Innocent De Marchi , 2017 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Innocent De Marchi , 2017\n" "Language-Team: Catalan (http://app.transifex.com/gottcode/tetzle/language/ca/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ca\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Trencaclosques Jigsaw amb peces de tetròmino" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle és un trencaclosques jigsaw que fa servir tetròminos com a peces. Qualsevol imatge pot ésser importada i feta servir per a generar un trencaclosques de un ample ventall de tamany. Els jocs es desan automàticament i es poden tornar a carregar seleccionant un d'entre tots els disponibles." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Joc de trencaclosques Jigsaw" tetzle-3.0.3/data/unix/po/cs.po000066400000000000000000000023741476255537600163350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Czech (http://app.transifex.com/gottcode/tetzle/language/cs/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: cs\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Skládanka s díly ve tvaru tetromina" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Skládanka" tetzle-3.0.3/data/unix/po/de.po000066400000000000000000000027631476255537600163220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Markus Enzenberger , 2014 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Markus Enzenberger , 2014\n" "Language-Team: German (http://app.transifex.com/gottcode/tetzle/language/de/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Puzzlespiel mit Tetromino-Puzzleteilen" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle ist ein Puzzlespiel mit Tetromino-Puzzleteilen. Beliebige Bilder können importiert werden, um Puzzles verschiedener Größe zu erzeugen. Spiele werden automatisch gespeichert und Sie können zwischen mehreren aktiven Spielen wechseln." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Puzzlespiel" tetzle-3.0.3/data/unix/po/description.pot000066400000000000000000000021151476255537600204300ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the Tetzle package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 20:57+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: ../tetzle.appdata.xml.in:6 ../tetzle.desktop.in:4 msgid "Tetzle" msgstr "" #: ../tetzle.appdata.xml.in:7 ../tetzle.desktop.in:6 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in:10 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes. " "Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in:5 msgid "Jigsaw Puzzle Game" msgstr "" tetzle-3.0.3/data/unix/po/el.po000066400000000000000000000034731476255537600163310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # 38b991705053a11862912edec5d4fc15_99319de , 2018 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: 38b991705053a11862912edec5d4fc15_99319de , 2018\n" "Language-Team: Greek (http://app.transifex.com/gottcode/tetzle/language/el/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: el\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Παζλ με κομμάτια tetromino" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Το Tetzle είναι ένα παιχνίδι παζλ που χρησιμοποιεί tetromino για κομμάτια. Κάθε εικόνα μπορεί να εισαχθεί και να χρησιμοποιηθεί για δημιουργία παζλ με ένα ευρύ φάσμα μεγεθών. Τα παιχνίδια αποθηκεύονται αυτόματα, και μπορείτε να επιλέξετε ανάμεσα σε εξέλιγμένα παιχνίδια." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Παιχνίδι Παζλ" tetzle-3.0.3/data/unix/po/eo.po000066400000000000000000000022211476255537600163220ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 20:57+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Esperanto (http://www.transifex.com/projects/p/tetzle/" "language/eo/)\n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in:6 ../tetzle.desktop.in:4 msgid "Tetzle" msgstr "" #: ../tetzle.appdata.xml.in:7 ../tetzle.desktop.in:6 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in:10 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes. " "Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in:5 msgid "Jigsaw Puzzle Game" msgstr "" tetzle-3.0.3/data/unix/po/es.po000066400000000000000000000024361476255537600163360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Adolfo Jayme-Barrientos, 2014 # Adolfo Jayme-Barrientos, 2014 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Adolfo Jayme-Barrientos, 2014\n" "Language-Team: Spanish (http://app.transifex.com/gottcode/tetzle/language/es/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Puzzle con piezas tetromino" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Juego Rompecabezas Puzzle" tetzle-3.0.3/data/unix/po/fr.po000066400000000000000000000022151476255537600163310ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 20:57+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: French (http://www.transifex.com/projects/p/tetzle/language/" "fr/)\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../tetzle.appdata.xml.in:6 ../tetzle.desktop.in:4 msgid "Tetzle" msgstr "" #: ../tetzle.appdata.xml.in:7 ../tetzle.desktop.in:6 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in:10 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes. " "Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in:5 msgid "Jigsaw Puzzle Game" msgstr "" tetzle-3.0.3/data/unix/po/he.po000066400000000000000000000023521476255537600163200ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # gk , 2015 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: gk , 2015\n" "Language-Team: Hebrew (http://app.transifex.com/gottcode/tetzle/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=3; plural=(n == 1 && n % 1 == 0) ? 0 : (n == 2 && n % 1 == 0) ? 1: 2;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "משחק פאזל משונן" tetzle-3.0.3/data/unix/po/lt.po000066400000000000000000000031021476255537600163350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Moo, 2014,2016 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Moo, 2014,2016\n" "Language-Team: Lithuanian (http://app.transifex.com/gottcode/tetzle/language/lt/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: lt\n" "Plural-Forms: nplurals=4; plural=(n % 10 == 1 && (n % 100 > 19 || n % 100 < 11) ? 0 : (n % 10 >= 2 && n % 10 <=9) && (n % 100 > 19 || n % 100 < 11) ? 1 : n % 1 != 0 ? 2: 3);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Dėlionė su tetromino figūromis" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle yra dėlionės žaidimas, kuris naudoja tetromino figūras. Bet kuris paveikslas gali būti importuotas ir naudojamas įvairių dydžių dėlionei sukurti. Žaidimai yra automatiškai įrašomi, ir galima rinktis iš šiuo metu žaidžiamų žaidimų." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Dėlionės žaidimas" tetzle-3.0.3/data/unix/po/lv.po000066400000000000000000000022651476255537600163500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 20:57+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Latvian (http://www.transifex.com/projects/p/tetzle/language/" "lv/)\n" "Language: lv\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : " "2);\n" #: ../tetzle.appdata.xml.in:6 ../tetzle.desktop.in:4 msgid "Tetzle" msgstr "" #: ../tetzle.appdata.xml.in:7 ../tetzle.desktop.in:6 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in:10 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes. " "Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in:5 msgid "Jigsaw Puzzle Game" msgstr "" tetzle-3.0.3/data/unix/po/ms.po000066400000000000000000000030521476255537600163410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # abuyop , 2014 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: abuyop , 2014\n" "Language-Team: Malay (Malaysia) (http://app.transifex.com/gottcode/tetzle/language/ms_MY/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ms\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Teka-teki susun suai gambar dengan cebisan tetromino" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle merupakan permainan teka-teki susun suai gambar yang menggunakan tetromino sebagai cebisannya. Mana-mana imej boleh diimport dan digunakan untuk menghasilkan teka-teki dengan pelbagai julat saiz. Permainan disimpan secara automatik, dan anda boleh pilih permainan yang sedang dimainkan." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Permainan Teka-teki Susun Suai Gambar" tetzle-3.0.3/data/unix/po/nb_NO.po000066400000000000000000000027471476255537600167270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Allan Nordhøy , 2018 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Allan Nordhøy , 2018\n" "Language-Team: Norwegian Bokmål (Norway) (http://app.transifex.com/gottcode/tetzle/language/nb_NO/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nb_NO\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Puslespill med tetromino-brikker" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle er et puslespill som bruker tetromino-brukker. Ethvert bilde kan importeres og brukes til å opprette puslespill i mange forskjellige størrelser. Spill lagres automatisk, og du kan velge mellom spill som er underveis." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Puslespill" tetzle-3.0.3/data/unix/po/nl.po000066400000000000000000000030771476255537600163420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Heimen Stoffels , 2021 # Heimen Stoffels , 2018 # RobertBorst , 2016 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Heimen Stoffels , 2021\n" "Language-Team: Dutch (http://app.transifex.com/gottcode/tetzle/language/nl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: nl\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Legpuzzel met tetrominostukken" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle is een legpuzzel spel met tetromino als stukken. Elke afbeelding kan worden geïmporteerd en gebruikt om puzzels van verschillende maten mee te maken. De spellen worden automatisch opgeslagen en je kunt tussen actieve spellen schakelen." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Legpuzzelspel" tetzle-3.0.3/data/unix/po/pl.po000066400000000000000000000031761476255537600163440ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Michał Trzebiatowski , 2015 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Michał Trzebiatowski , 2015\n" "Language-Team: Polish (http://app.transifex.com/gottcode/tetzle/language/pl/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Gra puzzle z części o kształcie tetromina" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle to gra puzzle, która składa się z części o kształcie tetromina. Możesz importować każdy obraz i użyć go do tworzenia puzzli w rożnych rozmiarach. Gry są zapisywane automatycznie i możesz wybrać obecne postępy w grach." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Gra puzzle" tetzle-3.0.3/data/unix/po/pt.po000066400000000000000000000030561476255537600163510ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Rui , 2018 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Rui , 2018\n" "Language-Team: Portuguese (Portugal) (http://app.transifex.com/gottcode/tetzle/language/pt_PT/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Um quebra-cabeça com peças tetraminós" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "O Tetzle é um jogo de quebra-cabeça que usa tetraminós como peças. Pode ser importada e utilizada qualquer imagem nos quebra-cabeças com uma vasta gama de tamanhos. Os jogos são gravados automaticamente e podem-se selecionar entre vários jogos gravados." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Jogo de Quebra-Cabeças" tetzle-3.0.3/data/unix/po/pt_BR.po000066400000000000000000000024121476255537600167270ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: FULL NAME \n" "Language-Team: Portuguese (Brazil) (http://app.transifex.com/gottcode/tetzle/language/pt_BR/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: pt_BR\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Quebra-cabeças com peças em formato de tetris" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Jogo de quebra-cabeças" tetzle-3.0.3/data/unix/po/ro.po000066400000000000000000000030241476255537600163410ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Oprea Nicolae , 2014 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Oprea Nicolae , 2014\n" "Language-Team: Romanian (http://app.transifex.com/gottcode/tetzle/language/ro/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ro\n" "Plural-Forms: nplurals=3; plural=(n==1?0:(((n%100>19)||((n%100==0)&&(n!=0)))?2:1));\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Joc puzzle cu piese teromino" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle este un joc de puzzle care utilizează tetromino pentru piesel. Orice imagine poate fi importată şi utilizată pentru a crea puzzle-uri cu o gamă largă de dimensiuni. Jocurile sînt salvate automat, şi puteţi alege între jocrile curente şi în progres." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Joc puzzle" tetzle-3.0.3/data/unix/po/ru.po000066400000000000000000000034361476255537600163560ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # Artem Krosheninnikov , 2015 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: Artem Krosheninnikov , 2015\n" "Language-Team: Russian (http://app.transifex.com/gottcode/tetzle/language/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: ru\n" "Plural-Forms: nplurals=4; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Игра-головоломка с тетрамино" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle - игра-головоломка с тетрамино. Любое изображение может быть загружено и разбито на паззлы с различными настройками размера паззла. Игры сохраняются автоматически, и вы можете выбирать между ними." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Игра-головоломка" tetzle-3.0.3/data/unix/po/tr.po000066400000000000000000000030351476255537600163500ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # abc Def , 2020 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: abc Def , 2020\n" "Language-Team: Turkish (http://app.transifex.com/gottcode/tetzle/language/tr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Tetris benzeri parçalı bir yap-boz oyunu" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle tetrominoes parçaları kullanan bir bir parçalı bulmaca oyunudur. Herhangi bir görüntü içe aktarılabilir ve çok çeşitli boyutlarda bulmacalar oluşturmak için kullanılabilir. Oyunlar otomatik olarak kaydedilir ve şu anda devam etmekte olan oyunlar arasından seçim yapabilirsiniz." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Yap-Boz Bulmaca Oyunu" tetzle-3.0.3/data/unix/po/uk.po000066400000000000000000000037101476255537600163420ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # dsafsadf , 2021 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: dsafsadf , 2021\n" "Language-Team: Ukrainian (http://app.transifex.com/gottcode/tetzle/language/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Головоломка з шматочками тетраміно" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle - це гра-головоломка, яка використовує тетраміно для шматочків. Будь-яке зображення можна імпортувати та використовувати для створення головоломок із широким діапазоном розмірів. Ігри зберігаються автоматично, і ви можете вибирати між іграми, що тривають." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Гра-головоломка" tetzle-3.0.3/data/unix/po/uk_UA.po000066400000000000000000000037531476255537600167360ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # dsafsadf , 2021 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: dsafsadf , 2021\n" "Language-Team: Ukrainian (Ukraine) (http://app.transifex.com/gottcode/tetzle/language/uk_UA/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: uk_UA\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "Головоломка з шматочками тетроміно" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "Tetzle - це гра-головоломка, яка використовує тетроміно для шматочків. Будь-яке зображення можна імпортувати та використовувати для створення головоломок із широким діапазоном розмірів. Ігри зберігаються автоматично, і ви можете вибирати між іграми, які зараз виконуються." #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "Гра-головоломка" tetzle-3.0.3/data/unix/po/zh.po000066400000000000000000000022001476255537600163350ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Graeme Gott # This file is distributed under the same license as the PACKAGE package. # # Translators: # 高垚鑫, 2018 msgid "" msgstr "" "Project-Id-Version: Tetzle\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-11-14 18:21+0000\n" "PO-Revision-Date: 2014-11-14 18:22+0000\n" "Last-Translator: 高垚鑫, 2018\n" "Language-Team: Chinese (http://app.transifex.com/gottcode/tetzle/language/zh/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: zh\n" "Plural-Forms: nplurals=1; plural=0;\n" #: ../tetzle.appdata.xml.in.h:1 ../tetzle.desktop.in.h:3 msgid "Jigsaw puzzle with tetromino pieces" msgstr "" #: ../tetzle.appdata.xml.in.h:2 msgid "" "Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any " "image can be imported and used to create puzzles with a wide range of sizes." " Games are saved automatically, and you can select between currently in " "progress games." msgstr "" #: ../tetzle.desktop.in.h:1 msgid "Tetzle" msgstr "Tetzle" #: ../tetzle.desktop.in.h:2 msgid "Jigsaw Puzzle Game" msgstr "" tetzle-3.0.3/data/unix/tetzle.appdata.xml.in000066400000000000000000000135421476255537600210200ustar00rootroot00000000000000 tetzle.desktop CC0-1.0 GPL-3.0+ Tetzle

Jigsaw puzzle with tetromino pieces

Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any image can be imported and used to create puzzles with a wide range of sizes. Games are saved automatically, and you can select between currently in progress games.

https://gottcode.org/tetzle/screenshots/appdata.png https://gottcode.org/tetzle/ https://gottcode.org/tetzle/bugs/ https://gottcode.org/tip/ https://www.transifex.com/gottcode/tetzle/ Graeme Gott graeme@gottcode.org tetzle tetzle.desktop ModernToolkit
  • FIXED: Alt-tab broke interaction with board
  • FIXED: Did not fetch cursor position for using keyboard
  • FIXED: Magnetic attaching only happened when moving mouse
  • FIXED: Scrolling with keyboard and mouse could get stuck
  • FIXED: Selection rectangle could get stuck
  • FIXED: Sometimes lost scrolling cursor image
  • Improved code for building translations
  • FIXED: Crash when attaching multiple pieces
  • Translation updates: Ukrainian
  • Improved deployment
  • Translation updates: Dutch, German, Lithuanian, Romanian
  • Added scrolling at window edges
  • Added removing multiple images at once
  • Added centering on cursor when zooming
  • Improved layout of new game tab
  • Improved layout of statusbar
  • Replaced OpenGL rendering with QPainter
  • Refactored code
  • Use native icons in Windows
  • Updated AppData
  • FIXED: Overview did not stay hidden when closed
  • FIXED: Sometimes added image had preview of removed image
  • FIXED: Removing an image did not remove its details
  • Translation updates: Dutch, German, Lithuanian, Romanian
  • Replaced deprecated code
  • Added portable mode
  • Improved Linux deployment
  • Replaced deprecated code
  • Translation updates: Esperanto, Romanian
  • Switched to Qt 6
  • Translation updates: Dutch, German, Lithuanian, Ukrainian, Ukrainian (Ukraine)
  • Added support for Qt 6
  • Refactored code
  • Removed XPM icon
  • Translation updates: Dutch, Turkish, Ukrainian, Ukrainian (Ukraine)
  • FIXED: Did not load locales with underscores
  • Improved Windows deployment
  • Replaced deprecated code
  • Replaced deprecated code
  • FIXED: Automatic high DPI support
  • FIXED: Unsigned integer conversion warnings in graphics layer
  • FIXED: Could not add images with Qt 5.12
  • FIXED: Window icon didn't work in Wayland
  • Added support for OpenGL ES
  • Improved loading locales
  • Require Qt 5.9
  • Translation updates: Polish
  • Replaced jhead with image auto-rotation in Qt 5.5
  • Replaced deprecated code
  • Extra warnings only shown in debug build
  • Improved Linux deployment
  • Improved macOS deployment
  • Improved Windows deployment
  • Translation updates: Catalan, Chinese, Dutch, Greek, Norwegian Bokmål, Portuguese, Spanish
tetzle-3.0.3/data/unix/tetzle.desktop.in000066400000000000000000000007241476255537600202560ustar00rootroot00000000000000[Desktop Entry] Type=Application Name=Tetzle GenericName=Jigsaw Puzzle Game Comment=Jigsaw puzzle with tetromino pieces Icon=tetzle TryExec=tetzle Exec=tetzle %F Terminal=false MimeType=image/bmp;image/gif;image/jpg;image/jpeg;image/png;image/x-png;image/x-ico;image/tiff;image/x-portable-bitmap;image/x-portable-graymap;image/x-portable-pixmap;image/x-xbitmap;image/x-xpixmap;image/svg+xml;image/svg+xml-compressed; Categories=Qt;Game;LogicGame; Keywords=game;logic; tetzle-3.0.3/doc/000077500000000000000000000000001476255537600136155ustar00rootroot00000000000000tetzle-3.0.3/doc/tetzle.6000066400000000000000000000020151476255537600152110ustar00rootroot00000000000000.TH TETZLE 6 "March 2025" "Tetzle 3.0.3" "Games Manual" .SH "NAME" tetzle \- tetromino jigsaw puzzle game .SH "SYNOPSIS" .B tetzle [options] .RI [ files ] .SH "DESCRIPTION" Tetzle is a jigsaw puzzle game that uses tetrominoes for the pieces. Any image can be imported and used to create puzzles with a wide range of sizes. Games are saved automatically, and you can select between currently in progress games. .SH "OPTIONS" .TP .BR \-h ", " \-\-help Displays help on commandline options. .TP .B \-\-help-all Displays help including Qt specific options. .TP .BR \-v ", " \-\-version Displays version information. .TP .I files Images to add to the choose game dialog. .SH "SEE ALSO" .BR qt6options (7) .SH "REPORTING BUGS" Report bugs to . .SH "COPYRIGHT" Copyright \(co 2008-2025 Graeme Gott .PP Free use of this software is granted under the terms of the GNU General Public License version 3 (GPLv3). There is NO WARRANTY, to the extent permitted by law. .SH "AUTHOR" Graeme Gott . tetzle-3.0.3/icons/000077500000000000000000000000001476255537600141635ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/000077500000000000000000000000001476255537600156225ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/1024x1024/000077500000000000000000000000001476255537600167075ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/1024x1024/apps/000077500000000000000000000000001476255537600176525ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/1024x1024/apps/tetzle.png000066400000000000000000003660321476255537600217010ustar00rootroot00000000000000PNG  IHDR+ pHYs B(xtIME  % ;<ޱݕ}?{>ܽ}EF']sc>55/Cq.t8_ >ē+k\up@ HY,pc d~ @H`F gAT  @ .@Ȍ+ @ Z+@@h(@ r d@R d @ IY @ @p)2 V dt@ 3q)R $I@- 3p@ !R d @ n@ @H@%gC)R Y@ @HgH gCIt@ I@R $)R<'@ $I7 $))R dm  @0 #]@ )H@Et@ @%@ )H@ @ @f)\,@@~R @ )H dKn}@| )K@H $pY@@HgR rR d@݆ @H@W @  @~/@f:\@ȬG@Ȭ @ IY ?&@f=\!w4@ dUw @ K|'@@kyRzS d Ei2pp/2আMp#/ 2UdPѦZxY=ϵdCWM{O /wwh'4|@ k' m6S6Ӷn%C;CBע5A3+=& Ljh]YNm&gST9t9t.Lߚ-w=#&}Kws|gmt~}4ߐL軖l ݓ gP TѧJw @ O]mM_NYIC;κI@ kTh[ OyW&< 7~ğ@0m@umnh n3 (@`ZM ,{K ̺mK X)8u@ S7e,6~uLzyv w>@ Mm.ؖLUz9B͡ϿO6Y+!9[CCY;BCB m'o/} @vn}u@f=+Σ/ NOh1nMc;fUxkrILlQCߌ4K8>lQkCVO^47t@/(-RهbߙI3 sU=E'6qSsݧۭ(w&GNJ|kdOwOҞ4.Ɏc+|ØrۏUnڎ6}{X2ً}r[ 9(z|Z91NS6;yv)wSbiNݦܜ=ysKs>>V7vv?g[i&nOTsT<Xzpkߧo{8Qnz&gƽ'=/so{,䖏 Tn_*[&\ne9\/un {${~}?^*>hQS@t3BP FӍ oοiФd|Ӱ%r¶C5q{ ;c{E2SY '}fH_ Wݏ=u{?~a'aO7F&lb–-_C#ys4H@$ iɚ:d.my?,~X|%r~taYaَr@|G+2r{r~|v/yvcL7Pi'v~l[I_  <}M|7qަ7rÂ-.̹(b6$tGrFsƊS=P Dal3B d@L鬵] s*wCޭlC8s^1r |Pa5nE>w񶏒%?f cliާ am;ɬ2zL6WpZa%g-wCFbֺ蟳h;' 9K7|?=0/:`kyMUġlvG fh5xF9'-ۛ8yyE+%NY©$N[{0qz)J@;cݻ3ח;k{7fGabaK7~Pm{NXy @pbg*2{YzK2Y;q=aܒ=aؽax?|_b(Zy t;/4|@<(POc2[d}%Yx|Pæ bCxͻ$r{- O#Z $ x]@ӎbCa2ɳ^SV d#&'3^5 Ƹ"<=mmxD,bԒd$Yx7_P`@~g}J6B -ƬHGgW_t-G,שּׂYh&YIEOp{y{I! ]$Iz h.M@C {v$I@ @dA{RH@H@ IM RH@H@ IR  $y{)$Im)d!bܚƄt@ dXՄ) ) w?/H@ cWl5a]JcD R )LHdcVlM5F@H@ 0a2eh@ H֒p@ 4a7^5FdV@@ ) @ iZR @ 0rY6:1"|m@ )ds @oF|LZY @v4ehҟ1"@ )%@ Yؾ1|IJt@ H: @8eS#R  aR @H@ 5jpʁ:1":@ Y:1"@ )&a@6OH @ $kuxC @=,9R#R  YmM5F@H@ $HR @ )q@ ))PRv#S d3 @ @ @f9o4 )  S51"@ aL>Ѥ?_cD @ $kUx] @OvR nsR;Z5FK)@V)dTq)R  I @M|)R t )R  I @F21e[R#2;V@ )d)dR&#R  w&9csJcD R )LHdS(ٜ@ ̀u+J)Y RH@ @H@ OI=k[@ R026>5eS#2CQ@ YGqnѤ?_cD R YP}gqn74F@H@ (,H@ 9LK#2;G)dOH @ $@ Y+@]u9_cD R Y RȂI)2@ Y`f.śR#2[@ R  ž3Sv)ޘ ,H@ їJ) RH@ !$H@ 3NyƔƈ)@R Ȍ)da);E|p@ R  進lLiȬ) Y<$H@ 3 ,K1Z5F@H@ 3+H @ $kyY @h& qƈZh"H@ WO١hCJcDf,4 @f> 5]o &Mf҆Щxs>s{5&j@L! Rv#2cj(X/t-=9Bi[BR!H $OOxPp`=[jZ-/3i#׆.L)7 N2 _Nq6)<)uыw B;LH@Rp6KBMHaR dwȑId  :-ݢ' ̑SH ~W?-=fH$eIS#RP0kz*^4#I gMtb2$5#l^pz'gc&;R )tg#lM5Fd@c1RRY4ϷMkl v}tw*lG`0svHp=>6 faGSCѲ0jyx 6Z}ѺB}CV]Co2񱖝³WF|B7/- -1R yv*|Zi5kQ'b/ν6쑧*,^8[ 0ۤIxYD۞΃ =ƆMMnoX4>l~şCšI Qa?Yj|̪'KiȬgG1W ==%~> Sf/(9p{O?ozx}( tPH+]U4Y O R3N{o<{a^usn2#OEX,(XF-;ׇsH @f;*Y/9脏p8koUk;طlIY`١d0eZ>Nrf@|EVl5amJcDf/\/8]0u> [ W1omxg֭H@ь Uܟںg)wcM;"\~wUNv3@FC 9>z_h}FxXҘyR"06 &:8ޛyL~ߋ/Wo{}@2&O܅`1 9xYh49x$I B't[;㞝ռ `YS`ہ*i#3boڐR$k %U~^{Dž=oԺkwxYc`*!'~pMGz߯4\#@|^Dd O)uw^r?z֥LȚ alј }U4ɿ : 臕n 4F1{o97ZhdV5w &LRN8ƿ*76Zۼw5 ' |^&yE?E!3+P$n=T3cxM=g2}y*5q@6?Z/\woNx_Y?DxF"]=\젒$p] R?p 7{q믿*ܿ(8@o{~w?vm uϭ?LpCkO{sX$3<]Fwk*oZOtq=àB+6; /h|W;) 8`8#p=&7/]t+9Pi5j$IguSfVU9Թ*_=zm*o2pдSf^X~{Myga0`xc@й[U&ᵖƯ<3(\Ug?+ 5n< `0I>\yG#@y`֢U =uGGU>~7>s / _?ӪbIGŸnl~sep_ ? %[_-;<^mP nқyMD;sSt)-'譡ݒ,GdWJ=nhRpWP ynCo=j ^~> U;\]'wV{ Dg9:+IHb̊vt-Iy@@>{>{EV:gT 07ZVia&@ yᱷU?2?V.VyW}kKn,\QtdnQKR3@WZhR@|܃k5~]W$Z^z.tXn}(3~~sѷjp5 Km^yH2d!bؼkuQ@}U;=fh'|^a J۾^wPJ8%z _c:)OȄw]xO+ vI,[- J d- 6G`_lI?W2cVw׵čYzOW? k׆YfC* (e_K~j+n|d,rȬ0l J`OÊ* m :ǀ_ץ: >kF,S y%PpýOW@YfϟfL #' Gtw>xYfW#Wk{?78/\pOȿxK7&f3Ez gaݕV|c]ШUnZOXg2Ȃݡ Uy">x`u7}viE/ZMXW-n{cūV@O;{?I|39?a|o>Gp tOrE6 f=  y@pTXz]qCC*} ^W^:/^h;ycW|l# &̷˴'.\ug+M wI_~'|'?<5OEկ_={NHͶT6ȌKn.]Z|ǀlKp_Ⱦen3%x_̀~e&'3hŲ$<ҳ?{[oį~}77w~{~;|{ZLr9=w8sÏp%7\YsZdqb>5<}J݊}grgFvt FN8':)xQب k3ܷ%GZ)p˜C-|@bC÷%>,m}}+}㟑yן}-{&7Nq0797{{?rO^޷7~s{n9[^e'Tn-o`n[~@*ٺ+prɸJ^S:U+[UVfqI'݈r@.ӷT{M]yYM *M^9~=ǷD1k'Я|㟓]ג>ן~=>#~;,¹<#v&kw$@_nWP],̜[&NrJeLzq]֞վ³]'w&r: | +߿_OU(/߾/߿~M+'5f"|%O]O "@o@v`P2{\y=T9Qmǯ8+cE5ofDhuP` E몽;+@|o__ruz":_vUXr~X]4,YQ}aYj^XfI4~+1<)׭v0?OuHn3!ֱ};69'mm_91NS6;yv)wSbiNݦܜ=y3Ϭ]n<ٖr@liځ}s!8?&#}sb_{{9c?ƹq~(/ #/C2[ʖ#xY-zno}x(|=97LnyMӀI֜{?{qunoذ}gXm{XeKXysbnߎa-{ |w]->}=þOm^Xa}(5%]4= cOYFxݗ[n}^rokX?NCʭA㧪R9 ]/qXG?XvZr(wic*qrG,85h;z0yrW[tSV|©9?}s?GN:‰++Nw0.y qV6#TđI/KCt0½_#8/y{>wnG~Όm'ß44L>)̙?5̚;F3oj([P.V.-/,[+6nN&d䩴㠉 No&>'}M0N&kz賰yaͶaڵa%'u?kuaŦ-autƽV?| Ӱ%|WmZփ{ 7oK~-\w~j:`ѤpwvZ "N!NdO~ߌ4/$_RQ3ƄiƆ3>(BȼɍUNy+V5?L&edM~@ /7qsO̚=F<[ u{?Nwf/(;cj eK‚Uk¢5+{a=X5w:blw^ͧ= Ex_u#~lNӶW_ #dk`0j€S#c'  S"N6 !Yz8 v  }:M|K>Wo?0'dKawN#acz$u|c&cF'8N?gEc)9aCɤT`0{0}0,L9#L,)GL g ֆycENNG YD_g;lE.~XEe?GaΏ]U? 3%e;>Fuq#F=iHt|:":6Sx{[ߖwA`^B./k&7۪d1+=#jj+D'b=fH>m;iC7c;Ӷ1Y#svE{ڑ,g }-;{MEh=q}/?'cyv.s+>gh=cg" !)'h7 7, ?(}?ʯex0dLJ_DZW2#m8Lj٫wyK˜)Y2vڴ0}{-<}8J,%Wy2oӻaly?,'Q8(XŃQf̡nBAB]_>#hBhڼQxk4\{EUF-6U4A}rOUg'u=zqh?v 㱞DӤO;FۓN8>˯uLÞu ?y2>JnR2g ZwjlΔ{6KNC:Q{  d~Ɖ{Pc^4%X/S'OF ?a&i˷jMp{Guek坹3}ۡ1IBH(XJR$ "s0c㜰qn۷ݷoM3~ڥ*U89T*ϯiꜣ^Yk=\zKo}wַ'o ArݿGuy>d)>ي_>1\͇cSk3n%' f<}xS]+绤S^g}E #/5Xoo>t8oӿ[Děx?'ogIa#| ?>0 wĕ с}Ȉg>{Hr1恓c߽x~]|;0oYf@Iӷ>h$;vp}O6U1q` ?ӿ7%PE\E@K6\HnnĆ 4zɞcȞҁҿC;l۷>Gֵ8 Z?I^Wrȡse}|ŽǢl _^+ DK?>oo+ſq{_K+ w;=@j7nN~;;?[!~/>O"a|qЯ߾@0~Dw|y"iqud #v{o|-egP`ΒF2O#6TMD,>x*̻@-9VT3NB) 46.NfCX; wy/,&J=лm>ٲO5x\x)Mq坯wȎc= eN}Z$`%p_OlOepÍ~%7>͏b˟>vDǫ5͊/Fn?7;< 9a=$: kдfOQ܇xc8K4:I0]F8 tPC DCn?v5qmF#'I"fo{tXIV|Er:E8g:y usYL@k# W4[7~ÆvnzEXC;Ċ]}^8l"}G߮sԢwfr4Id>^~iKG{H2^XBoc4[IQ̻bl3jJXZs%~ѻ%>8]#WP/!7"w8B GD^j_Ӊ@K:wiBf0mA%[+-+RbRtJEXm~;W=ҟ=<>#`%py _/_ȭw)rNj| qҘ MU1Rj7Mϧ@q}d`%Sܿgm!xu]dN'W?D'yJ&:3n6&iҒ9; S6Kf+i99nV;9:[KL뙪~t o m]y1t.h90{~& Ez"`%pb-4t\on8/~s♤aj☷O5$WՓߢꬖLݺM>&3ZDnfYs!8v? BG<n2tpDYc))*&}O]giI+G#t-~nM{)彖҆8 -Tݏ8:Hˬ0=/Iuv$ygd;4Ad n| 6w|@|n8xIc$sSWMYy q&[ w?,;r~L_O]޼Hvkセk2Y{MCEptO)r$@Q$0nȳ&%ᚡvwTM) 3uHViT_^P7TuL~gl9t& [㼑0aqDοW*~wICW+w5W(1M1^1l#L5c9s*%]@ "4xCҽ\* }ʹ2mZ_J u6ڗ 8(#玑  `ZqI. *>rYaCUGM?*"%_%*XHYS2\Z-yadӋ@OF00eWo9ֽ;ƜZGac,sYzE`q߼`kh]}7(zfߢ{LUPK";N냣| EWd'/P6 @WEhVDp(\uHbwM@ph B~3|f˺1AV-g|Evm!r\rrwX3a%OVpܗRaN'Mϰ:0Ѫy Ѻh>rޛuN K>ƶޑ7aF" * o^$y\ڀjDwTw*Z8-Yi& JJhݲ0k9&g5;P'M^룡_<*(b*xAw^dYS.'v}ߑ/{aNj'ځ73?^׮sWcgT9pM6DB~ViUMZƗSn\&h2hi׍Q54o:mZ4m–&lBq l?V*.cˁ(R!gY e ):vݣ(v@őɖOO ?Dov[wɵOhB&z{E?_Tڡ^ 4TY †E*΁l(b̫ 0;הV 6wgv~@^z<909~n9xr*JHK&p&BzzZu)IjR Ò*C  lTLnW,```[ ʰ~>EšI~BJu{1-ϤHQgn0EC,TG ` Q+cҦ$("_YK:J@/*ҖOIr767J@AgOp.Fp辱Og7E@J ;o$_9G cgwAl۷QFdij\aqRAgݻ"l sD[@\J`B?'4T!})`ݔ2ooXtv3% w;W1LuIbXkq5ODßq#b3F%PE X kU{Ď2z,_c'u3 1u 1׿3/h(#,J1}зg96_젖h.ǦR\;*s"+&ƻ'76$5}d)9,~OM}%W2d; +p:.lKX?[ '|`FFθ!]a9ʭSID*n?bbt@?RM!NЬGH n#FŎa#$iojx`G G<%lGVl.:6B V2ߨLO$ NF &V;:T\k,4Ќ_\-F(| \qHIs₋p-\ş C8 gPG$R :qI| v+@|/!o?'H,^;&(m.$ #{29;Ԉ eypl(ɌҦDVb,J^0Gss=ws]paWYgu;e sjEXKcEJ'tsnPEN:&, ܒK\\-Ad{ 6:P\\,_{8Οp__y~,/`Ed "Bǹt`y1F?LĽu`«XFI~slCEov1ۉ-z@o*asIٳKX?[ ߐ}+8c+gQ4ķ4w#&8 (+PSR>0^ }adcm,QaE@+b笅/(ӷWCȏI<{JrErqrr7`Β&24@O:nLq3$ UQUN-4 z7s`qdcdVE&\ɿb؄N r#ҊÜG@TL.՜qXfp@DN]:V9Z(kw=@7)ܶZnھ/G޽C߸LΜ?NCvL_B49K%%ƭJ{ KԊڡ(7BD%,```럭Xoc'ZBe%]ܣ@ps]0'xKP &+\m,@G@s.~_A|6yхXy%ٴk0{4 4 x 60 SD*XmpU;?2? "y]e Kg럁A6z RB y@KpҚL+9SI߭Dϡ? dDȘ@ȃ_w#z7 7tU@AuĠN/Ϧw7hqm4-@Mԯ0E +y%,```럭 EZIpDFIt!ʴQ;F$P,Nj<1qLo  !jH!@翝LXj>s%pFP;`:%g&]si{ƛrKt{% Wz%,```럭X|2o|^QC9d?^-Ȗ Z  .K{{ѻYt|; S$OVnP#J` ɻjPk/vQOE Ԡl/v(m5+m}~00?YeIQ NЇP>r)P3#eK@ ;vwKo|:; bl+̓`>,up{j;^DV[MotAM$r>-0%,```럭iڸ b5|HwȖOw.kx H GxrV ѩDH }D+4'P״J'Һ!tٞzn3s? |JllEkz0K{;|l&Ue TGz%GBWx^ :Ir8Dٵ.00?l v`Mgeˡx#w,?v=w/:>{ьPH`, AD{+0K:]|f?ۧxދ̅N=v+[D HKT7TȳnxdX5 D.n sK糛z-KX?[ 1LVҲ`v?I& =ϑ'_!ߕ$M,yb OdG;nPyZQ'.m SmXMEǏ/]ClH`_} %n߿N8CGv##}{ k[E ?Ew֨<П6'k,Afo00?L_Iȭ`Zi7t\I;L֞`b`ގü^P/G 'dwȨc|xnEiYs7-bYSDnxG%>3_9G_=LE`'N FI$.+$%&ts\u]b\-_jH @V--|vf KgA&P?aNof޳j,>xx9ٲMuɜČ$8922$ A~KH4 uʴ@--a`,L>W+lx{o?8-B4C W7ˆ?gfhC`dȤ@"ЪĉCK@ tݺ.R[MX9"q-?v%,```럭*>4$֬#fou!-N"B>O;⚘Ӗq{::φQ7 w߼F;űeZ&"1G:,+yW0X;ן"bR+Nǃ/*K@"b *z$! u0ӛɦ런% l "=lq!kYM:J$ʱ]n ˗Ouޢ=EN 18vsI b9F%Z^?kdP8 ux"''!'t M$1C(K~;'PPLIꬑ'h׈FmKBdykhDw+R7'U]K2 r$mU9 !a\!czUm刂'cܜW"WI@icP8ˤb黂ˡ?y8tAs +&PC셉0DV{2.qK9Q QsvZJZ/!5/E=~?ۡI21s$P 0>0:Ca ݐ!3QP|ŸNFb!ͯ(chN]q(kNb:s+" \0] =!3G [0`?qSb {maRČyciWlעRQ*MZ$zHmJ,` [lvqWR}1yl8{D=G"/ UQB5YJL"p] E(fpz5.Pa # 3N'22|aښ68O>?N|C7ЩdסUdE@t&ff3xf0q &aY<XϽag cm-MzTL.=ˏYg݋iAa=: Nɽ\})9 Z+AJc Ojbq4GW<8/}e,avcp߳H8+gG Hߞd͖ydکd&2cQ%T IE[*e 6:d]a s {ls$t&,SƸkԑ׬0 $%Nk-o' 1W3>auɮ׿#;_l~}ϭKȔeK\]SW&\O qǤ摱iH|@ @9F J9P P٫) OІ,C{ښ^#Xļm;HG?Z̉ xOuQ"h%]Ohk8~@r@z%!5N6M⢀Y\Pϕ m$)\zQ TYM^DtwWZGco]{]Rs ڏwZCFqft &AHO {o0@40LX~l3L8 [ܾFl3 NJ#7=Au~_JmzT|y@ԎkocF%=M/Z @l Z][WuTEUE& )u!,za:gkmr c?#oBX7$Q~2w~{;jIddpDg_Z o2LDѰ?PUuuR)DIJb8K?^@.Swrc> j?m"8LVҖ(^,*V.?n8 %Y}s:5m]4l}&VE =a 0=*882§ʞ RZ)aʹF}%l3ތNzR UH P֜l'B!`ĹmWKnGOrZa' Cu,fqw)-~H1ǭ\-N.#3{e["M"K]r'HdL04`uFhޟ6R/ $D_k@-OEandÂcX??1p=C>]"#< ś ^adVĎH @H^bM"bh1vvdXQʺE(~*-%`߭ V£ d~W޴SS▋k<,9a㓇>P5ח1; .FC\4[|ˎ\g KgС~s>S7(R]8tt .Y/ G&ʌHUlJ5$8AI ]|H&$zh<6'lA5{>@i@ĢZauWqEj _\?TM+V^ - ._J:3,$&)p`V%凍(l@fne,` [l3jhdLؕV|.N. 4.@kQn>V|VѡL{A\zA-"‹q(Y1|Ysv}`7Y1pɢzjCj9Sɂ@1ߺlɭ%qx ʯzi5UjR!>/~009D{sKH=MJm&Pq I0?HpDYcJ?~Zz+Xx]T\?4TRR-WW+K"B]iWa¿pI2eRRh&P^= hs70@֑UԵ{U;HuW7N HbN :B l`ZmȮ}< dj1jЌ:FϠ+E V?@_;A0Dw 7388•|48Vi# et5G Ś.X<`99:G?H.uMpVsV%ɀd'y9Q |Č4*~tp:^ XyG"cä1NГ8ArS+a{ yzuӠΥ+9XŽsK\D78.ο׫o ˎl;&j*$SI:3 bN&EDvZE6^DVoIWUiz#\t9\`砄ԗ(tM_%,```럭AYv MsiCA{#Aݐ@B6z>`boGY,6=!~G#bb!tXo6 [)uF'cc F.Y 瘹n+C ] JG9m Ȃ]3wiWbЍtL[NQş s:!QL=JUot'jĬ  lN嗎sWA@t&[vu[v2y-4Oς5h:\$wE~Ktm00A׆maikI>gGcgōqgoFGM̑>ϣm<6uJE˚Ɲ5/ VL` JI\ Hʈv%6`QS8de_Oq gEai/v,( Шq~܇1c{*,0);N^$@|V 75@F>J-t|9h-Hl5[͡nf,ܧ,` [~10ch𝋨Mۏ#hkmXAF8ə s8௱ɃzV :7G(@5^ݾ<:uJUڙ-L-*s'R \KWnd!QUQQܜЎmXP_ȟ?oXn耖 {{%Ym=ӯ>{m3z3lм_!EYq} ăk5ډIp>A Њ:2`ho5 E4,*y;Ea;J{UG%Wޒ3׏wR8)bXsK:gb'+Ckrd߲pW%=FOIxO4!P](`;1c_? .d՛T3?M+%i dmdˍ ̶|B[FϛIV;hޱ='KҠz<$qñc@Zľ9OD? @jv hޞ&Ȥ51̕`3+vb}uEʚ ;p BsK=6npQSys]uuE׍dXIC#qQ1 #ys(rI ֞{mb=c =ɜkcrhECgMѧhR gf$S # y={F|A&ҽaZ3z7O[vZݖr^)9 Xh:Iy! -g0>ׂ\DLmO[2%_˜De\IVi+ (kQXU8Is G{M6RLYDKck16J6L|{\P2& GS l\39WgwC'7"6C=qG6OKկ>@AOK.FW7q@WHͻ,e)xC  }V;W"^3@1cIlf# o~3;](i. 4߃{M>wl?mtB"*I`e*lbouTIyQ,BV~5XjBPY0Q@X"bJ 1~ec@=:J:-\0)L xx@k?=N^%z{ )z6ʪٛC'ouеRΞɼIT ?\6ho@.@ظ```#ҷ(URHW˗yU;E!( LIxtTZ܅ <8.jIfԭ-XN/ @\ 8;r Q;9o)C[+U*&x)(@<+%M+2.B#Eݼl9}TI9AċQPǎz,coXR&H dF000wpNY=VlYgbvSJydӀ߹\(NV"'8(([a3EA볧UB*>/fib@ ```w(]\I3 I%*sR@i!j{8 jz_)i힯 Tytc!SDI6 ŵ)IT9o`A)$ ЋN8Zax1h{*0UB?#.qBո_JLϕwB% 4oV?5X8[&{q/ ߺo]v! =dfE0flj!{AA<%@+6|8fDQDE]gXBـN ~Ur6 F000w=qPpRZբ$€hOIS"$;sVvR*w"E=%]LJk7%GkG[JrY鑂*M_Q=vvnNգi Ĩ x͋V#m 8g RlmORQX?jY -t)ޟT{Nvz_fM$&)0 PE\@ICї$%z)R'Ov_AM<繏,ZIk5˪ X $bjIv ,8 L[Pka$IVĀcBH$2AERć.eUuV9wXQ:"X\7^ӽfKijW7M]ΨUQ],CF }ӺD;&R7TV8D 3FʰS _ೳAP/XzEZ)W/buMA@@f(2n"#ogis6NV|[ >cy@Km\*t+z\ )SJ| *JZl¸ :)֫8-:g8Υc$,RFɞ"m&&) H>!CF  #5J+?s͹[L$qL+!G0"xcCr p @ô\'Х@e\V=b NuHu?zrAazAu"i :U!QJ+i[<å ϭqɹE DF000s:cS=g}sj_X2`wR[|6Jqk0 : 4oga+&aqhƑKqZTP3Dv\{ClշC ~Uʡ8bƢRAt:^չc*̘S`a8KALhnNU^F-mtx( H/e{ ~f7xr)?!7wWΑ ׎W- m 8/yޮR1|BFlwb-cB[~~c' C]G,Cz!u•H̆@0 4-R{_Ug\q^ [Q&gER;Y qdtT"i R٩* @gt->ZarZ+/\(R(洄…#h`.ݱ9H(k8d'xb Ri10YKȼ]dk TqacSYR$w=bD%wghwHU!dk@OU{Fz3ٛvj%=v$?809~v9y >bZ#ut.RL58tY l%|'Dkۛ_zъ6~T},ƥ49G6{D0hKsJ`Ud7@wmhLbo-rWWWdl\V~ VwcqdqJ [+ld8BA*"@j~(%"bCQ5OW=[-{Dۖ36sP{@102 `QMrs[3)Gwh'}8KX4b-ENЛGVű jj(Je^uzvfJhO.ਸhGUin$\\м%{f{H&L@g"xJ|CN` dϱ@[4!@nZpLZf61H+XxfҔ C:.UTWI$$[ 9F000wqSby"W+9 s:s{7͛!(+6~]&jjNC}WfAyI4@sj`Fij`Mc)\Z@~U]CWD@{PףRi-ɢbDNkx/Q;TI93H-uޒ|NiSvTغw`PQ`q̤ )Pa+.U# 8V`QOy{c`cHd}|Q 2vd0F00 >ͧ#.%PYhQVE MJ>VZâ0H|u6-2*6]@t*E(E9?E;.H0L \]r? %Is`c'`l"* f1 k_7AJBei;W%6.2 ۖ6nGړx#w"(6tF5d('ǨzV}uX*Ц[4a%,ݻAƞpcYd *!u-=2PJh/ʽLg |j_]dDOR~hls(O| \s*F⥌bxl 9cb{`.t$\79Ll oƨ1 V1*)$X~&k# )tbQ :)Ur 0#'pG@ug=R|tғb2}F4Ws;k%*O%sD]BFGm%ݽK@icGuNh`i+b8Z,B$dtbCָvh.4͝&xl9iY8GF$ne sKIQ8#Lwn T< VAVdФw- xP`b5N1 D^;VVpR|PTgMM1M!TAg k\A*>'7E q$T)mThJ*} +@y%?ȅD 4vUu6ΙJ\6\aJ+ \?YqG^T7ˊw ԦƩ#F=D9Bs^ ݽKz-&Vw:nhAwd_#\G}qDDcJN!-7V&tY J '^r"4`Z$}t?#cuyj'#6sVHI&D}bʫ܏lY~cM$T 3Ⱥ\ 'IYk$ >P}2kfR' sVH%k >B;r9X -yn#e'Bt4rh5ɴ>Py=}kcfYd.YY\$L!j 3s}OxVMł(v1}.}X3d\K AJ>kOUrNC~K~?^?@aț$^B.xt\0hDUy7܏MJE%gNjj{bp.[ɎG9J{BΙVN)8`Sy ɸg U]µ;lS FD'L$Ug*Ya]Ll&JlӛA_o-zlkډshQB~[[ChaIªUm9UJWދ\*o5 'e͹ CeYѨP'$oQCi, c࿣ղc!Nv~byB'_'=#[k K`]nWQFeJCUlFƫ*Cn~IaWV )7DD~I~I q&~r{杗ɕ @Ny j =THzP$k 6ow%X`k; WK0XHL Eg% ڴ83 uJog F$dۀy޹M\wW{gxO^)љN-d ~oH]G 'cfYw?'kD![%ĩ\!ۉ Ƃu+ڱ.}ĄZfs6Z@~Te3 *Xuvw8(dlЪ. C2[{>gcPyto#r;D O~gګ7$#lyO_30o%w-q#ЕD %_һiΐk'E$(9C_₝d$@iz  %K@)RHw T%汎7`{AIDz![r:@2KCAF0|+qSλP>hd+Wϧۤl6 ߁#q  W+[􅥤uf6(ǃ/eĠIt¢I< ^^@fO1Y(JMH]"qaA3toD܊(^,@Bn!ɪtO~#_Oъ@\ ^"ϒ;筜e/ԢQo DYz EK;#|WqCL_h2֯Rmvp}bH2F.1ϖ6[9ZQrPPo}0"z&Gud# z:U0 S ':nuPխuEG(70L˾w9ꝡ~Q E6oy35j').(g ;ȆKܥդ}T>AGtUQT ^NDlMDIEuQ+|s>S A!odGy5K "K !cƂ0HyD@$sg  ?Xu"B`&`|F 萔;ڟ&M;";0!⺖ MΊ\3wtb:KX(kR6V .Yk.1ʿNK|GI U DQ9_!1t7D>j'\K<4OjhWDڵG)0zB"7p}7ͻCD:斓ƩҒb mSP"yl͗Js.A@؈4H!H9V'I!"cHp2*"  CGSI4ъ r(dUR{,c` O?K^ϧ6G5R{έg3.+tm'XEq 庖y]xWE=Q#bf" 8mTЧ V(pyh۹UZ.XqK/%"{n }{E`Թ''H!x'I.ؒtHq%8KU@ǤQ10AAo5Hvvt ˷.StDٶo)Y,m':U|!+ϚB_~%w :%+6β$j~TՊf#-@l$"{ֵnf럊>GTsy^h*ňrۮѣ&FFp9 ERd%i]EƋ]i%ҝQP$ZQa!h^I!xR-V)?!tS=06>'<%wJn*yra%ڼi,DnXwUs!'0ڱ* ']ֵ:\E;l00Ʃf|y ŗOsW{juo*΂} g!r Kt"%a#$wKHe~@( X\o.$9G,aX&[n|awq;qP2mm>)7sN][Eی" Xs$ ~Gn3]?-VaEE|(GO㌁ y-I&>i.(sŽO+D>ND0F["yo~@ l?y)}3"pl!\B,7 Z V:hj꿼+ %BVEFF |oo$޽H: `kkR*龺6lc N@dl]GwufY~_5Ơ32;D5\LL9ȍ .U!)JpnUGNZy9kLur t {@A$*a/,D!anN~GP{|)'ä9,)7Al[rMc ʲb '"cȊE4 P7)|܏cW) Вnh@;p  b~WJ|8{9w!L )_ ̍ [*>޵k )${=!&MH&eUPEE?|ܛ{3sfnzX%sgμ^׳>568D 1"V9$*k%Ae0pCk*dfJ̠)h:6ߺir)[ZWu %+ x>Kfo@hl(8 P.lW:N?VT܇ǯ~Ǥ b&C&ZGuYhJb_@Hсe ] w {蠪Bڴ8baԛaWR~ܜɦ}] e/!t)?Yia~ȟ&] 7hQD}q ROm2c'M~ +s/8Pe@ fȏxEIJd6^5+ @CO71keHD:O%&d9(8NkF#'J":'g/<|w\K5bt Zro otn4Fkg`wi{@Od]L{/:AC>bg`:?Ȳw[+;(UfE3tЇH;n̋l2Ppe\G~e;yHUj k<)̗ Ԙ;V0tF|8P Yߦ ,Dy3Syy7eXГw-%(r,VWrZ9|d50#q:_~p'əgGm3 [Ej2K̋0E3ycC HQ5=hdRmL7I?Lx|49I#XQo+@Nii ȅ/3a6q}l`-5zb, Iz,Ԇ#'Q $Km4Ko$ɦQ{$оm[ ]IDb=]CwΕ So»d5u6F@@bZ }H1iɦs%&X}^n,=!p9+ c`{G:5tZfZisa5*74 JH0'"?@ J0 +m\e ч&EKu,f u%TZR\D +Ldz(o?$P\Ry ͦJQ_IKˢYբdpV^7cWgl:yjqj_j?b0͟,a1Nd78pUI;'a5 1w3 ;($K24`Q]3B>UYWdf(%u-2aKj$M~+t2s7}w-;"^JSC%kòFYi;qRڥV&&(x/(-n:O+"cJ6㚖1&*|AA9"t`rG1RLy hv 'A;M2GFyqo+ΰP7_d ?sАn)u6 ThP_vZ,ǧdtv:p(mwH\Ԟ_55.&ԫ:.|lc}n6 1@/0bR֓|LTuQ]ToP9iý1&0\yb tgecPd+SF=~[S`͆2t5*@C?En13`= 1ô-Z ݉f_ꅄPDKVJQJM&ڜ@ܱX94Cq@;m4 Ww+l&[kOȩlehr=Y%ң;hv~׺W y_5#܋%X3c`XY%)@HbԧFU8uXU/NRnm/%6ŀ >A:t+nȧ^^+u]ir}t2K@orբw,7ƀ"˄lڳd ɹdPƙ=. VE@)07{ 4ew䳯>zA)hTkh«KۤA`/ZOFQ0{\{m%3P _-޼uH"L9_|Q3bFfo' =r$XN/L[+Ln0 iA%g(D50C ;|?;5{2 1c7>5.)Yg ȐhX%6Ѱ$z_#w?|\z0`dӎda)K " ƾ8FvaTҵè_!ojF7nul v<\6&'V<" ` ̵dD,Ë/WJ)S0|qvG4!2'Q+o+1x5@,O1|r kYs|n4\( TˆL>=0C66Tf5vr{Ѕ} g0,~^#똳3Tx7[b] (&Mt^1R4Yk H +X̪Fq'fڈQ, 6V4y¬OL@nQW:̦.^y 1.2}28bNZ `U{  =g4:QwzPPU |ݏ_%qN_qW_UvA0mc[-FCD ? 6=wUjhq.hYj#B . 3D6=)L0z*&-s!`k:Tu董zJE|so3si(6` Mc|SgR@tm?˸eHj2"i1,V2u{lEҗJ#ZPo ;)@&BBhX~ 2?Z9?*7QmQÿ`q+i7hmx`n붷;0Y&ʫ,>c5WLu<È 5l߿D60(vއ:?nׂ)@"sfK{a}W'dD jBU_ oZId&˔.Ih}GWI@BY@:t/~]5 ɈQz/ό}Lh t/OO{\,{e{N@Q6Jhboeئ{pl.:|(jN>S զt΍w]e~ :sOoX\QBtX:r߼A+0W=K?I yOǽb5ziPA+4z;lD0HeëbK)C4vk0 ls SõgB?0@~_;zT6e 9~i;"1e5F,8ijDe+djF}ISHΡOѕNJ}43c7& ({gFaYzղEthʲh.ҠуTc$b6f{?z7z&@Ub]_hg7ž p؉ 0HuֳHTc5_ʨJ*J@lȣ?; 馵nA h\qNc/XeIK147Z+IFͿ o f [%[bQN7b?v[]OD6-A1f*U¨Ger5dY5J:MFiEl48DbӜA2LCqfDfHhIo@0#rD5pPrɠidH@,<I[bLpHv Ы`sp2i6Y6J3c)">4z5wX}5ڸ}S?1> mcDk$k2ޱ]4fmXgoD+s_ޛt+daJ.#'! VVl-r!A7$=L?w19LvsdML"'KcIܡ`C?ʪ/9v ǖ,]I][a3X=Hdy+z<5wah%9! '=g/{ϭSO ;'M1 :U~MFa#w"5%xIᄑ \Xat *fdzàW`,oEG` 3nM^#Y#"[c dм@6FCsiI9U)X2d*J=X>;]d,Cgk+Z$ }8z"mIM٩#z ^ $+/bXaL~K0u,Ea!yB:N#(óU0L4>'%ho"7ZS hfW4Ck qdH{[o tU 껏T?b ,4bUqF@t47nRv:| XrPH281hլs7\|g; ~&v6 ~bXRu!X0m:FFR wr _<#bIL6Ɇ0A,ǼtnZ6Xp&cNCA@dQ[%ci6f#0 5+/ ]RLX|Z7 v\+cjn9 i\? *\m^L\~>f]> ^yWP?=O-l.ƾ5jdUYGJ{.asba׀ ='4ShI塲;@bPڜ#Ef(3:p+ *Oq8kjI`1i_@ς|Pi@@DϠEU/C%-Lk3-Tl%hzNc9^\xQL@LϿV/uƑB< hYQ08!gHT7D) â\L M\S|X52LSi1PdMbk332a[F@u[){]'BK=κ0IJF+LEѱX0VAwˌa}K100#YVI@IAk-meyAc CìݴV2/7M?:U 31 06 2sA +{WkfO&?6~"9ܓ@4Rdp{h 5p0Rw_!WoR$*xѫ[ɥ3=O&GLYE6'64;`cҹ4o+ZZ53n>r\09uy  7i *QpN1 Cx sΧO9ss&AyM@OcX N0]ʢ(mln8*7 JqcҌ.̬0+@/?lw0*5 2r Y 1ђOc%ӳIkT7=chaL J_?#nK]?仩,"h/㕊l2:梍E HP{WwR ]w,)fF,}0U; IhǿCtp ;Lo, 2x?a ]Ev"wu(ZAseb.YQH? ^y(PXSNI SxyB s e# g.K kI={eɍag}0Jm4!,3ntdh3C}C9ԙ2M#aMg^5ffgYK3'w0\V&j3v&vῗUV fF׀%d4@( eee^JT6b<+>6 8z\uQdorDb}cK`8X@T"pE/Ȓ}Wv!W)Q;"]TM̀a^:FAZ,{quv3F.VH '^+M`!1u̙ 6 KA!AeI˝NYBL׊ZTK߭ `j _ KX_E,ecwkL ! bǰI)pakҢ\A /4jFv!*7vx^\[z@m(f%O\yE-lt/U!qE:AeyɠIU}QW*]`0=ǽJ-s{ >lݢ;`(cyFUL3&1 ؐX@)@( [F3@}~Pԃ.MYdʳ #H6ӴS&RCCar 3-Z$l_&c'5Ŗτd_ψH[Zf/m9\7pG#6=zXGRtk ِ(Ї>$6ˌ0q99ސոWSi~? o*3h9@~ݮ[ϴMD@X(Gh2#>,c- )`?m7n /vkW>r2_|` iDT |ыc@Mt_]} c}El[+[ly?@Kv;oQ6K5ߩ (Mbn0ƈA,*~۟a<"/}($@-k1dL al7$z5M`fҔ W@Uk1\eׅv⤨9UJdGئ"!Q}m:Pfp0@p!<&>57 hU4@)l!U`W00HZ1gO}CR>7&5t0@JB I񻛠LN ~!r99Z++5C.!10k769PQhw>[lE+1 -޼7(z5nj`rP 咖/9X#BX˼l0ܕm 1 8b12[|8*)G.s Cʭ}sdP ([ɰT Qc @Mvoivh EzFi9~~"Nd=ԙfS;j PzJ4Wbrp6ťa$L$9X# Hkc `,ezEoPj\[ªE:1@PS$=ԕ?jڪ@ u/Zf2C4zn[+fTwO 2)?]a8JFLzUUE?*3vsiDd,KW25 RǼ3 }.WWKðYap:t~yl};r/M[+O^>IN;DN>:>.u \uu8 a1L)zӟ,i&Vq3i`pM&pXYKEN7,z5 e ҳ<&2v\E65N-̷!Tkk.L7ԭ-j%@i-vu\WkM )}+ (:?;%l]aZ^%e{(&ϨcGz"S>n +MM3_HH5g dV,nH8;{Yx0#\Ȳubi5T'M} Z@霈7޽ 8A@Gw֓u;`(Eaްո{ *0 dIij5w"ќU}cRuWd& 4m{%bXc%H6*c =ȳ: &ޖEd+z; VLHfd b/%:r6@j|#9AʔHS GK i \Z赫F>ї z)@_D\#z - u9N2umd[XM_鉷~38cȎvm!v#7-cl .0F |VrxWXIU `O=W޸ ,YCVntDtvjod@v$J@-&S h`>HZ1τW$P3X^< *gۿ7BOYeC+[V  @%'cg~Z>B7V'ׇՒ;@V6p孫ORH3BK(iir`k/2YF/w0CE Q@eZ~Y$[IT”;'>o&5- -ΏF 0p^jX̙F_|<~dغ.y r<+-R2#) 8C]g ns.2Я{OvEcW%FYrP)/#E mw7iNb5h)`XjXo`j-Sԙ_P'9FN<os؉ܜ) ԥ&HCi`GL3% ]jϱv@XX7`?=36=Ws#]D͊  !kߒm!=L;{[,w}T DL"-ۏ",kmsǻ+tfT :N ).B`Ê@m?&"1FѓᲑpR`YW#L. ke؃ރAB $px$Q`%cbk I ر`?0g^:w_ 6ghȖ۪'cձ2hɨ Bg(縬̐e'I`]N!X%lZkmfZn >:=4Z^#`Xw` p{ϽA6.WM7ze X}?h2f$$#懏c@'1A:-wi`vьW6u>oD:DJ|}t02$Ʌu @>4 ī,J6)h;e_],%bZA&+}5h#Ȣȁa㟃@f3"?țBd艣`t嵎H^<1@|;O#47XHJ^YccH{#&,ٵH$_2iq!& !ci1 HhNm9L[$07&cBߧGS݌F 蟑Gl>&]\j}Ƭ,l\0hQSC,&衞UXnA *([5;B&O>@Q]ۊ!9-d莱!' ^?CfKL*ys,Ɯl>]T=F)Áu6hZ@b( [P).f"@$(0DhTT@pYP0!IwHYu?uµ I^@T+D H }c )}o3hNGӘ2tPT0jAtѪ>^1gW9zQI(TE[{K9#ו3 ӽH[z\:my o'{r[E^y^k 5D N(FylUb7Gwe Nb@R\7E wU=ڷ/.CvWUq$BeXPq}zc螋1s}~i~9z8qpao< ɒsVFB dyѬsb`}7;w;G5:4?H(>>1u1B?qNtn]3ƨ/9 Xy&BodxJ4q9.ko@^?4S&{t,lA +\Đ4i{悩ⴒJo ֮{Te=GV}W61G4I{s'A3hs hisy*r;:Lsuw`>3d6 |Q0 Nca c%H:{ ~ .EGf;FЈk??{P7dns0  @3אtxr{` ՖשCz4j\c3YpOHaG_|Lxeri?6WJLx$]$Z("n;S4yaNC FJ_$l9%o81sOR#0-o8 ʗJߝRRӳYX2XM>CFd f- <+tfs1&MeH_}IT*@SxDmXQ͈Cln\^ff&V[+223Ig{Tѻ]&,]Olݖ:y_/e;#nw{$m#]R^&^?C 3=s^8O pAA IR#a0etfN LznIc}e9ׄͧ^^%$lLPeP/:se,#]0-̣ ';s/(lxa[#>VhQt~*bB- ? Ֆ*7a-?3֔PR/4l19޲'B9Aa[Ädӵam7l)= n7`븾w~Bm{,5k @ w1>uD`hDɫ!_YV3`3ƞJ@Kvs\G7W}O5`Ly Es' [vE6n_NH P@K18Sb3RǾd i坯i1B61 <gj\keD mqؓjИɇ=;&wmu 9_yùctz̈́/C߉{)Pڔ Լ!9ӑ:Uyeچo O U$2[YHP5mԠmGvС_YYXxY쁺Us=/tJ<@LjyE`iU?nTDCN™p ?q!fY:Pp3Z^#1 ERY߹rR)$ZF- 0ۄK&Їy'5x_*JG %`(wCsRΓtk?xlYg;'ӿK23ɾCrw_a43@>Iϝ `Hţ1ҕ"E&JVcQC+=lZR6 Z$ b (KȎCZ !0bӶ)₥3B ,=x0O0?s03\Z{Ɠqz_&:pX[ IKϒǞuF2Hn0)Xy5iIZzhWebP[#x;4T?/`vt-euP &: 330 2.N&P_#ReӾttX;xCq !\%2``aiͫk8ڷAYl/0,2o7264ܺV|~},/%(nH04ۜw2;4 <߼63#= nK.^`IAk ? Hiel0,2ca;E׹Ĺ 3U @M;p:H}k)i,q`;b۾9?_3w͍_uV@_!fH@ փJ1?w4"?g8":}j/}047`ܳ˱aȒwIZ>KN\l=$Y}3Jĵ0lPaKΐ!:Z{>G%LKmT_~<x6@e?ũ0* 4/6dlsE'~AI6/,limMUզ{GeZ$M?}-—e=L#Do ͠whkǪv5@"?UN-&4tjUl (Cc"Kisov @ZkXL7,R/eJ}tQr1c@,`@3CGGK5Laޖ?3Ys#k?T&׊FkOH`Թ2P0I&'Usa m=338T]RNzunyM ݿ"jizv|΅PksI[a(|adm}6"edQgGb#M܈I?aLFl5M*8g$3=i T \:gZj.ӽQ`  ,tuy+[hPO8Rl+αgU sy\m z6P?P'RФH v9:TLXC3*ژy^`75qw ]+}»`eq+So69ѫj>O=@]ZM5l% A9O06j* uLk; \ࢹa*f_z#UhNQwh%'"aĪU 2$X0H/FRQm}yc-޿Ҧ̛S EdO$)T͋,'=} C{E(az 3.jhp,eo=aҊ5A$>{h.7ldv:pH.aMϛ*)R'4ha 4sٴ KSþx+)/^bT*6wmcv>I}V|[w+[%=/;p4SΥ\VP`;d|'󹊞E,|˹YcŐ)nȶ;^gjPT& ~fPob31beKq0w%Ac듖75v3$ q`@ o^2gzC$,W  L,lAi^^ǀ(ojcA#z\ 8RCQh>d Hϛ{@ØIsKgњCEO>9 *wNȣbqBznw0={Ú5r: ~<^qvS† ppˉX}v`:ɷ?~B>&7:P@6[Olp+J'Z[}E<=ný˚aFVӡ`z4+g},0[wv \0\ zwl13'JfjxaaES",hzy$ʠ!Bd0ŵ_l_dALzsM!̙Nxh~.tc#L&l7l". +рVX p) P40V /|Ǻ,j}lY۩C>֟dO1͹[ÿjȫ_`#8;SpWyG  h{~U3|"de,JLIf&M"Sio|khIܢxLu\=R},*ϔY$W?PYE=,+>SJ249rA">+`i C?UѝnU4݄"60+c!>S))dI2ݜ|!%% &| y,h`}@;B/G˯$'*_4R1 v/ ށdžVɑA `ȡpɌhwΛ qav_~p-~".M)'{l}ŒjFEK߹>Y3kHT Z/Jiy6 aѓ6@j-#ŵ٤$Y Y3ΛLcCρ;LX\@Z!4 #UWiˣ;Q1cF4 5jTΥ%*iϢ6|f R*{v[xz6qzW'#VD=趥8;~y`Q}"P 7ABV2a6o,;e5gxTR6#5~ >x!) ߀Ƽg8=97'eB%`H >tɑWQaV.Pbxϕ!W'wZüZunH@F9{kԚ%4`15>ߥl0{k?I:/ <~]'͊?tLZZ #Me2sIRr@k Ϯ_pԔۙ Ӆ*}/a5>\mkrDAh555Dl~$zB4Nrdf?C66ӸV(8CੴY㙡xJb=3og}_sImGk159_7+IgF75sF; :t =C-jpGTە`[x&dkRYQr='oѳ#~Mu409H=T9tS+ (_5zrn:vD?KCŤ6s@~,sR 1> C9K'ȩ'- M\3La*'|jgm21{JPW{bNҒg@~ u=@v h˯7ZKI` k"o|GQ'іQ'Q7QLfP@@FC Yhv ,jZhP˩|< nzZfBF y6ש b戣7ٱv)3x0C&&F<5P1+5`l~Q:7 DG9RIrljQjO\Dr s1F&bJVI;ZJH\]K:tSc鷯Wtg7X b@_z>Mv .,pjyU=2wS 絏,0.Xh,0|Hb/*?MN!j0@ikr)mb`/bM,y0@ke)zbgdT9 ,IWxn"CT @dޔrя X0&v !z#<0Kfw<"{l?1@ה'3ϣ``ؓo~бil!kfcs'nS7m/-P75s:v9*ZH!JYaJ w.W^>YwY =t0+iildý2Ih_^l'eʆ1Q ecN!FabgJ>Re ~#e45>ǃW x`>TMuĜdJ0|?{KȚdF ju2?fCOvDHA`7yyȩ!G;F8@v60vXN,jӱZEu:KduаCr@ES kZ l1Sc70AYųptC_Oo2sW4KrlQ/ >&X{}L)1BUdpM YD|rA\qLo}ٽR\0},`t3o~oh;@v_cx5>Qfܟvۧ;lnCs#gȓhv#Cwsr,Z Ƙ?̱:@Pbhh\P{ I`_ӄOO&sRVĭĀm7Юz.h4QN^$*2k5X0p\x%4$ 4_bt+7q*"jZn6ϑ`4ꁅȫ̹WCڿNā&?#q/1{F48Te)ph0L=r!o%pwtՠ AǮn}w=?6YnѕbxէȹK7- ۡMۑ:))~c}2-kmn骃Ʈ2 \!SR-%QJ(EJ ,tfO|?/m7KbM7ST6K^t. }^X_TneEBVd`x)>~D.oEezƠ(dvo&zFhd)|™> XF(߲ OwV<@d:* =I\Qp+!dQŜ3u7؈m?HtHafAHV%@Y_"&I P(z߱ =;#qv<,xdmù Hb=SN̘W̒~{(w L?mޔ*}IaXDlLY ʧ?݊hW4@8k'?ڦRfFv D3 kg˯_Tdž`L_es@Pc,詷}0s1qa=T\'J6hUB:gLǢs̈*ZJMqޤsCy)3} mK!ɂ7@bB 9eeٻgI g `"É[yC >zKPXvE"W;"X&)xw2] |M0@G}񝢦YN:%_ܳ> PQt*4lm Qc Tew &,i35K#KxK)27Þݤ!80D;+|gI. IoJ eYVVA|E̝sPNa g _ }o˹1ug2ORj̞<|{Ϡ c N^FATΦk 5@LȵGC Fej[9@=ɟ~]Bq h(-9b 8ct<6'-bu?jF 0hw\t: l٨W #Pg7+q;)Xɖ>0m-ө#Q b |xd]xΝb^ճZπe4%w_7ߍ* 3zld-u.d:hՉ+= `|n7r/OPw򀓴?`NL3TLhCГɆ(1~9hrhS\B g#WQ&Rچ^9rK =#^1 5 CO#E"3I>b\at,N.V;&H}1KWM!rdQg4E4sbhDB:G}r8JـC%@޵bKLZG:@:}жfb5XZq#ONe!1, 앸`v{`|U:= Tk`ATl)2c~RF vS0/r8N/ҶTňyYJ*eV'0C@uSR swYX!mI L 2`vcӻSɶK69ÿ(j܏(930p'v𲄋56K g5#QJ{RXYE-[`4s7}7݇ד6{֐ۖ}Yqek;/z_HC@zoP}{픖#'!b)S+lU,]kL}$_}/cH η=I L̴~H#m( n[{NSQo#E`(D0|`BoED^V3@uQ[Yji{mC}!XB32I 1#xx=<=#W 3pϡRιBm 4G7F'3QmFQ]}ibWE(*vXeϦ T]]$^fhq =7D6 +7ב5%sI.x5Ը2 ۪go5ԍ?|"K#e4Zd`-F L5]cv7eDfe19J(v`؈JJL3c,rJf;}SYK44,U+L"-xtg% 3'ϼ|fl84v-6a ~ qs#-&u4JѪK^Ue |Q`̸ݰWsQw׾椆g1߈hhJAޫ)(4Q3C-K{@mj܋w[ |!\?a8 'zsʔ7o.k]<@O]1`78l+*14Un!nU404ыIkپm0 bk?{D]]kDWD_x6!r|F>t7sjU97jTC1Oxl4s`!>0dGXg!f[hc4pFMc ZNK^zr3rxFv@;^fXmoІh )ihlH>xCk٫4`Zinś;$t74ȱWK|p8.s>7`LGYe^JrKgF3U8="wELX(X 7&30f#Uk W7${6?ӜSFI@E ʴ.T'C5 `я[H oH\z.#Y;ZJ\WK!23㞴!#[4#meA@g5` lhcQH,Hݤc)5=@)G^[x@⻕#on]!#wu;C9cdX拽Ud?4fljCY V6Np]2zmXFVolYrYȫ_G0gH;l#@§Hb_0zsس |oH2 QbQQlc}UPA;Qsx0#q 04z5S{[L=hcfsvX^?p[0<N ^# 2qjv٣SWE'R8J1p37@A`@S׊q j<< o^IVI69Av>~19֟Qx]cS83wی2ZT:ͥ:o2I <gШY+Ff[c^εwb7[qwfiJxF] P`K(Em%P`Aq:)( := n%4ŒK[Cu=چ bCBzv$W1 ̸C8.8TkH {Y? v% 3Bh0 `vH+f2懏j4ޔQ޴_x;jMs QBBPٴг g%)@(@Ę6F ucϣcbDF 2;)y;a(}$Lwixϡ?R0\9-IPuY郕.-~Do0y@`+mɭ&أ᥈!.B|_AiӪ!< SwC(*e R,¦ P>~. 1EldS#3" 2ʦϐrXS+ u_@C*;Q<Ph\E6.HxwzP0u}i!3c ALݾ7CEi~I}X 5 ONg`yLd3-9\rc m5O}c5h6xs}iXpjab&# |VrX{~߲rsfF`m^z $RHMPORXD_j&۳yl PVJu`Vhȸpc4Hl㭙=7'A~H5&CD#`ay3RCJ,R:5Cz9PR7{N3`B MQv*_*9Gr60TAgs@h_#EZR\ f  hymsj6ӯc0;K@hن[p^=;"y> D;  Z7 ![ 8^XH\Q}7f璃^3m(7p.Rr& Iz *.U?Q8i I= `j#z8 `4E)BhhU4:NM22˨aE$$(Z2/j;2-7UksS#?)(<@_X4#)]^GO%PTE7T[Mr)89Kx楇ȩ'iL˥e$=xٖzH’\qtN\yFevSlOtoIh[O HH+4mؔnM. HR:\-s+ۨKm$}oGuY$AcĶW̳[lݿ~}kz>@) o(p-6^y @hE dU.xҼZ3ytӟ(I&p2q 3+4|mΑ^y6r7 pm$LIKɞǟg\挹BNv D¸U2MG9XFY-D8#)@Z*+ٺlyqrwѳd5?o-`FC؀j7G]@ d; >6PRHϙo {X^BB~Oy yL2  אAgA6N>7*D3uݏoZnCIb򠿱ᕾMhHB4g`'5!S|gx# QAy^nk W&4v9Yl/y*-$I F $>˟,L9c6-neԂĂ2K+F8bxQ&ͣSC\$GGL#:VN _y*B.,{6L 92aݒ0j>**sZ4$iU(Rn?૊/n!E@ $BU;{N30i@|YVq6W7--RؙR$Fڎ= J患qDDfyhj/"W \оSQoO,T &:Zj2 s98C%J"@_a%5CXCt=<; Dh]J]C5]Li+HuQ#Ůw̾xP\-ھW[ۥ,g0҄%$ 0ߩ/p_ь#60Vd*ID bQNUٰ垇"pJ:Et]%'n%f&r(Wd={ν 0h0JEd(FtSq{LkZk4 pc*X+`krSp?_~*mϿ /[Dsgl'u6JH zn(Z4R )ɦ-rj&V|oZD`ph*$ #j 2C+r6u1pfI{0;P4lr_cn$ЩU5~%No9(.zApDlO?t2 <%\PLk 80Ïuh7E\ [%H47UlNhF@v% H%K7Kč?L*z2h6 0Hyz~TX_$bkǘ6;KjX`I w{DyiB+#䛠ڇfwȸ:#ɢ#nDn@sS:)P#*f(%8Fs1H l̙[1n" -!=%EKId6 mTQOr6|nuJ՘gLxҨ!oZ.bQX5Iq.1g0ҁw ɦh!`6e+9Hxme$խ rql8Sr4Nj{;Ī^ ßFAD}!5u."$ T#M3d$@70(yFV^h:J(&̣-~4(c<%v66/Q"> F}U!n ~jJsؠbwKD`5Pȝ9ѥJ׆iHl.qc5k>dN0SIfk**5``eug]-XdTn"3X]ݪߴ)cO;(_JX #ǧ >`jOi*3YlM6C,C2Z'>K#jr0'TP08W;:isok)$^Cu8%O3 t'`28Yٺ38pf@JgEb*1 !@u+\?ix## Ⱬd*F!&ZX`I.~fnW,q9vH?4]41G*rUD=M 0k>4 릏z&"(S4iVW S;\GMƤ"'Kdf&|7YA .C*HfaQX*૿~%7apI?ҒR\)oטykФ[$)X0~ ޥF]Uݲ] @br?h?8V]v"PK"t@F 1)CXGgCz4MJ`&:>{?&co/LRaba03T^a+yJ%Ǧ U/>~a?'-(C%fdKMG-DHH:)a|inz$6m߿Eу{ԁ1w<`A:'eiU- iHl 6 xMݮo)7j`2)%H١u *|`J}c!> ~ !6; i:@͘)O?X<5 .u]ƛN;4C9`704BBVh/҉I b[T:v2FF1]L嚴ZQ5"v:+@#~y_ O܉q)ڑatԌ9l _90"T\~^OloF Z(5)ZEgȈujݪv~ S`d/@&|,ь4.{]u^׮AX$fD #T]<]|jG &I*pv׸{u!v1@GV-PXU|}$?֛lx0Cbjhj"ᤸo!vkZɵ+Y,m}J`0?s*އ7OGm̬Մr,dd"vYQ [.N%`6[iWnylp}wׄDp ^8@,Tv A#nzS]ۏaW6m#>T/֒jLF6lbx)WIc'8> J/?R褏bro4 FH?FR~/F8OۖD@sv۪ APvh.1ſ46ܫCg O%>^Hft^34?b3dƬ>)f$Elڶk#lx0[!8U8%3_ <ð.X+F«QLP r&p6M;Υ-@DH@(mymt^c+VBk7#…أ}5D ;0@F9y:|~=:? ?_!lV :wq{ψ2a0|!$r̽Ժ{uhNs hg)62J࡚L7Y!/H@K !<|43'~:.Be6_z%Or.T Rw9hg~v)σ*lNهg;gq9E{ L| e蠂f׮e F_:v~v҃D@@hYFU5{^NL?z WM^(!sJ w2 'ާUzyXZErA` kt(>'K2ʚi=4>b~(H|.Z9fKb?$/ bb%JIll# I)2=$K&W}X9OJj7ˇC"づ9`^BJ"pmos`x^vMnM@`Y6c0ґ%c+L.Zȕ;rڭC#-10\- ^SE ,gTnE 0_NPQ{m t=8]5kRZW}6X. ظgT\CtO`J | G@n^_/e@5oҗ`0`xݵ  Ys". pc1'IeF*A3֎̡a4L|O=a1wl!,I%Ȍ2 )pDl=SJQˇ20WsAn~Eq+H4 N߅8'F"Ai!ۉ4 ;ֳu<3V/+&dm.Li P@|÷Ne.(X6;:)NI<4hXU:OP=\VMCqtNKX96!/($j8Fi ̈6m*[:A>W|@KN'tx]Д5aB{DЕccb`51 CM`bKi fQx}S)ܷ9 Gi Ų9S/7Woi18tތy+Eųo\]SX}-'p~>@ wvC p[%<ڂA&6;| }ov/hz…p&4'-`j[1j8+<12y7w0"V+K@v;A.Ol':x7#&,&v}atz> $1d|ōI&L""}o%y FL@dHNIĤ*  v=G\{sN' Α2u~d(CXtQk$XG0AG,E{"(hυCE;ޥh b39nG5l28 l-Z9 (=Tb5XtDcx cqO8'ػ&NG?@*D Lk`Db0 b.fb4„YD#bDUS+EeWg ?)h;)@.V2QYTΎ,v;hwb6z9{p}}zޓz`>w>K=(/POĶ$D6vh93n?l[splSMov]gzMd_RF?"=&F*h`rAh1:TdOtI OtJLw%V!Ş˄F1Oqw'8p"'z=#8޷Sb9o`XVBfpIb>CFك kNbz>JJ5]kU쩔SAdK(fIS?)q~] _|g>w_|/9—_& ?_W3g|> f{kN'ϙuL`[^"dĮڗ6Iu-"Ub+lPKD]KHTT4In/M@KWhhYEhﭓ諗o]݃EPDp__8V618.14ޱ_l칣~{>{=>O-=?z*zޢ4z~q=z^N:5u.qFk9z]^B'2/Gkhh(RtT9& p5 sD=!l]_9GP?{wҾQzR9u1`-y&`  ,V !GSX<(ԵKf'X8q8z2dX9w 0b!>@c{AnJ#'o8~/ɵ)7_oW_}ό[>xW6?8o*tKXA߀Q`/v a"ЕC@n:q7;_yi kOM]oWx׏5)գ>ˋ<ų?/ אo|>,_I_ht,co>.zx5ѓ1Ω5d0y`xpWi5|\{[g0E"85ȿqg I3^ ZǤT5Pb"zr)*rܽM""ĩE<^yDssO>w~;M_[=swڪqcH[~_:?y|Fv;=qҝ+ׂ>~Zu5>}kS-X>`{-\ЍB\AI&L$.KVșސQʍ>C:h衂SF(dxCCvD~nȄ8rr==^' kS׿z8{=?#:]ŸKؕ \eq9nreK]E˲_{ӥN:6Zuѧo!O/_%D,Aq/; SJ:Oˇú1V K9S| QS A.my,Ud7\;tv" vC]cl&rl\Zqܼgw@G/;8E(= -O͂m}Kĝ^Jf'>h3|YkMyTkn@*qUm~+?s0_{k:>u9;.J:.Xk~ qQ3x(&ߣ_yIBc.SD$y8[{N1P']1v l g$ E#K ,97к:մow:`p6@4;69h)V7 ݒ.y8?*;ܜyry7w,nWvTZ |m+dwURn ]W35#4l&~j끛tc]:_@g"lx!RxJg8WnE#ʙFbDQ`P8u8iq)O'&q]<<]e0_}YwlġqD.Ko<";+oDw}?rTJ0Fd O<#ESW(LI /. L@t\EeSBP!YP,^1Y{=)]ㅾ롌/['ָ֙?{];GxFw \ :<׵;};^I?dn _cavA-k˜? ~#X\zsRZw_- J9.`BzMk5󇚨oMdXK$6ƗłיZi}\.u-Ermd0蝨~l,ɊXTH_uwYnR`:J8}DUcmC@BYN;rWi $rŋ}V<@Wo+ ]}ѭu<)`\Sb1 }QeY?U[EPaJ1s[,{}J0{txujr֎;"1xOeџCU'ﵥNJ6z2n# Y`6U~/]`X<3+=bjOkyjvCs:9fǀ`^ vY1RbD@>l>!tӘFrkR`ċc9`.Csk;v ?b<֌B0t;y^>{2 ߹ WZe1\Mo\Ojq7n1,oIH0!~ <`0*D ߾xģ{ ؋d(E2 !jZ>TnZ<`FŻt`{I\"sF(l<H߻k̻rÚq<,T VӚus4αfW۰VcJLx!\MIK<@RO4QMZ.@eӶGݾ,?GVL06r]&0d Гt&:-%02C?݅H[dP 9:G3oI5y6 0{- iN"8JIf#!]*I ~$wtAx bd`db(Yv|n1w|QyL1df5- 3GϾz_Ϋ `& &(y N2A,KPzv]RBڏW/!7#!Hp2aU4 lα~1Pٴ  9Ut2r.3Öb'L:V`K+ʬ=b7?0Ϙ`hڪPsj{-^{w ұ@/7?ҩ(tM=M kKl70AO,gbe9"[Ɉ{c =E}DD+Z}y:4I/JhT"J x uQasYgds&Qb0^tC3ܪ7-GDd[Xݶݓ F5NL,aY~{8?ǤmU6>D7?8?`i7N:9HI#NRItJ~[I;9E||FN:;31H6"u-g3 K^o5+~'փT=IdWE._ &uԴ \܀^Da1_ e'i3yhLPı=%фV%V?c]u/(Gd`!]wYtg"L0LwHmBm1HzփP\5[o3!LsZz>YZmx~OGhYE~WԨLmk 2wHD4:UiTofՋI7\v oҚ| FA&Mr<")y$// 'Q0 Gj1wtto?)ٌt` =72#p=AE(*a=,2f:n#$X%>=ֻ9oHuQ l8mˮ)\aPiʁ ?~p2YF*׾4YWi1fYY+蛭Tjc?L3Qt`g\^zh 6TFm`PJ5جC>=NdfH>:8+mIFڛ/(T-m5UX1URY4K|٫#mҽǫz͑ ]pmgVE#ax^n]>"F=M>i3mrB/fTv [ځʱįՄr\Mi2E'(v7pM-"ǻ>:ݘtRlm̒7y$JӪ dWeH-Wo@#vb`y%ZW4@w;cT,H؞u`Vu]~,p`(< Հ X'6Sz5FJb ._qN<`⧒L>Z,.5w0Ƅ-r !m`(;d7\ƖC#]qV w@K-jy~d["4RPǎLp/GR 0os0#mG e ,W|ȳt kV[pG(u;ÃikZhv4S׹T<)- ⱫdcB4QU+읪n:K O=g~x1 hA!J6;DL57 {bb_fG;kXf\|`ԉ7tTΗ#tc4JKg⻙ʈ2TBo^5ەTHbboUT p=W'gk&`3'6 ̟C.M[mvly\)0w|:2ԏ8!vRa`T2IAl?Ң{O50>.2l #XO@?0W\zCy0dCj>@v@ uJ a<o'0]́^ !>>LdBs-⽓֌I#A*}#k=,` T%xP@5J?W9>' ʶāwORp>_ lPJIItW @$PX)RAT+R2bQDO#N\mzONӏs 8Dc2p u}pC`Y̔X*ϞNQ?dRc!Z{sY6ۮ4 <hylHQVj⠚*D`Vpn@+ǺBo# 1sMGT2fK(R ̖lsLW8+{UE_,o O&O@KJ:gz?̒>oڸd#h}pERFy`Sꦨӓ%#vqv쐾P) \6T&9O Ɏ j9j2se\w<@VJ5Ff5ICSk8(l7t7PQc 8wtV&$*F.BBv2n%vnUMԴmW?ܬ֘&'chїAR >L+9 6:647-N?:od!hӕyɱlϓ1WN޳%AGQ-RZ c~M>ɞ+7$ĵ(PT5|<*/'(fl6~V7[`ZsZe*񽍲ᶐA!k/ug""n'b|Q7>>JJ>&QA}op>3ҋLc,hCɩ[I `8 @I{M;}#<\620A '6hPrq?x@q81 Øm)C b|T;RŪm0o@Q$`o$,s،LTEQXZ(~h5z?žf$4WBdr_=U̱2G+rfh_o90-\?.0LCIB'*q,'+#@I8Xxt*B2ùy_>(ler bҳloC7' 1OM=l;] }mtm/93ߣ(=Q D*5`ֻZZ}'\/H PFot"B#*7ېoU_X ֍J3 b.VFLZ#Z|L`0Gh C:qk ;ZQ[yDsCF!wU((>[S?w 1~; ] V"Rh/L ]Խ9<~=2韶QuuC _ N5ND7+"ͤP%۹렢MD[hc @*>lFRL-n^!},+gAМ;5fG>6d0n@XvA9s\gC.KNc"bx$>[ʮ'ua^H7[k }4&0;6Tz.*A8&bȉ[`6|nj8UL~Ǣf'( ^/l}q3A)f!{xAnS]pL,!T  EEKjG7'-HY'`,菅C]ñ.RZ-Ozgt 힍I.zӍu檩P)3kߡVyg4M&XiQs sEl:_?#zBq "!n?I=EbVq:N{cQ4(ƸZFP}-ཏ_/+[ @QVYt9Q#g :' Bm\QG6_M2`hwc{U&"$+LT0`x#}g<>*bWDm@R+BsPdmqf-I>nn卣u/Z=|bGR>*Qt_ch~n&[-XhÚdH;!&{9G y ReFHIBS΢28/t.cDFu:V'f*`)꒺}464_"{*a`X#jrvp6SaEx T6:XQP;7,4u9i7+sVt%+&^Q$ +/YȀGrCҫ"?bh`Д'Jф=u4'VO ZCL_OXho N uRvbcwu LڨPWՍAAn?P2 ~b!TejJI|9:<ȣ6_\⁞xayh"jfW`8Z1H5lgvJu4z# ,0,Swi- {|y*4  I l^kD(N0^sk Bf=)Qt;"MFH[6-ʈ42d&\)^Eu% Pda4Z PqaI;\Rcݬ'Uqs0j %saH-ҰYEYmn4tE.ƗԹ[tFzuH#EO-0c[n 9zѮn)Y2JPn*Ī]GjLӱrb#C1ܴbDy oW *y9ﴱKqW$t\3lгko Rh%n\BŃX U{3=a$upQ(ˋ3³&S՛l_d{%+z /Zr*6l͞*{4ԦH=b}|uX"crԅ/*3SC9.` x_KI(Z~Nm.*CD@&J<˯gM:h@cOcCAm+rFX(ҝJ$[ʾKϩ>ĉԃ6k U3I.^.%7L(euGNi$~CZXT]߱т5r~ %^͖4!9HToPF{yTU%je  g4dj.Z-`@Wq_eB1Jׁ* ]q+ҍmԉl~(4"*U`j(=b0)wsA @}'|[_mq4&bvMEi@8A+ c;E"k  (?? ^ ZqO";N)>ۓ7Ul{ƏRUfl<3jƄ,:|iwݺC6odn "6Ȕ)gA?{bjk%,.{V\xkEyTSA:8DiF8sdJgN_#i]mc[dAqߣ(#fsT`bEn1sR<_C,/*3i)`2H9 CwoogîҴz_DMO^z3@MQ4_pIDJEEzEJ?UK,9'%DCs![bx[@pk>wc f^^!ff0TGķ:+U q0W󭓾:IwM u)cVe/p`*9} YE`tM-čZN߃[nxPi@Ԅkĩ+UF!EbVPcS?( t٤׋ƞ$tP/,-לHil, 7ᐽTldgQ);e0]NZ8+2J֓|g:53#[nC߳l`X&KόWH^6?-Y= c4oR3h}U=(s8/I3ͭ[ *= L'J\Ho`glh1eN-y },Ɨw!c0XԵ1 RdM`Cx1cv== `^X@FRL/6~60u/n_۩3'3Q^- M)#&4!_6d0q}ȡPv;i8Dl*P laxc;| צ3T*ID%`lJ VR)IU20?8q֐!G䟝c?0S?#oe5y V}*D4瑫(ˤՙ!Iܙ3}S@'>#B.(iL(!熗nbֆ FqXc"N QqĂG RY9֋s+7LR6:w*DrxW@PӶb 7{}UA*#x0g$GhXLPN,2C83 mqHNv׆ݔ JɷG)>ꀆ=TCh <#vn' :6}ElUe4}f(5`t2rNG$QT_;w~+E A+Q\3RCk k|!+8Cg~…&9^+-qRW 6 hl+C}~5ϒd<[R(~Hv}1/Me\+d LA&$HXB$|36zH),s,6?@-bhZQA|N >,w=6 %)v #T]x($a΂$,|ˆm3PP)# (yco$-sB@#u7_v!^0uAl ʉ ITc$ n4$`ŠP|qh9( T/b;ș@čqն-4s#y`xED藖nl "䗭x$8d!F60Z{I1-]UqȚS1&C{ԥ넠|J&b⧶cL*sTG؛H?Yt\IF=*cșF&(`Nގhj|ȗs2e{2pw ? x~c7 \Da(=L$)fLFtIX+[_h^C6+ +6xn3F˘E`' ƇU5@׸-#F"\x얔Z]f`8|x*on@XB![98OQ|F&CIArqERVd xHf0S+}2 =q0#H(z6<: +$|128?w[8o0QI6ʓ Drґ3n0[`zA<]c=2k欥z'Ho>.  GZ.x=ݙ0BM`@]$ rٽo aǁ22( wE뤓̾Mzdu3"J/ݼ8څFWO?,|SʹCb40FpZLU%N$]cj"1HK^K"[t l«Zq_RN錚6këY̱)!#F=}k3(̝&2I#e4 蝮}3gDY߾=mǸ)jbg<(UB) ,6-TϽxhĩkĹ'zK(TlXT9lRq^+3~!^~W)yEw5 3v&X몥c;t7ȰUo0eU 56%lHs7n&`>8"/'ah>,z&ۈ z"FeQߒTvSX3kļtS +RuhbkTyWDt qX 5[/[sdXNR䠍ؕkw I:,|\ "d$>Ij[Yu iiSsAV !}x߈߾g@R[HPbn-x0 ;L)ʛ-1g7L) fvF d34V0ݱ!$̴.JMTC' we5NLȼBd둧IUxP.y.2 }<`sC<H\* S_%`^?5&#F\gXh#) p óxEmeLG@fH-RB TEy[QLf`sB9}E1*H^ydID8`f;ō .7nzP\vũ._C/Mf1Α-bwn YOsQO`qSq,^Ā -cY\ G RwvooXP<|`T=zQ # j!  p5;RJD@F~VGP<0kvkI8wC#I/|hHDǮQojֺ)x#12)O 6n ]epֆ$h0 =dCxGţ t K۲ ^vADzA# 2PiC^<1Si6  #=lXpR~+F\q%{oq{^cBz12ZO]Z0"54W"AR8al?Rd S5yZk;}BTU߲5bj l(-2xl ܡt+Y+ 7 qn gfLB>/fI1?2' ìK%)E&٘4v\--l>3+ YI|o 7tL~^i P֐ʼnqa߱u~Aϔ|vX9aKmzM"!pu1@_Ndc,oÿ'g1eL9==Z21Svc\}Ugn71`/WPf ey>%R. մwiuM~7sgd>{e3L4Gh{4 D ԰ AWC"}Z^A9rةlZeilզgC) F&DZƉ:SVb |*QJfqɉK ~g1<XZS0CΤ}QljO@ڂeACDHߔ5mZNUS:E9ZU @S?.&>QC*zNtЄâLx/ |Gz?|J{aҟ>-/>d @1Alf\q" ~*~d9*RN[XȜ(Lwr,E?)N?*!~{A"~V͌LUn]&u=ѣ?wȓ? Pg) 8i{5gr)ݜfʺ/Ù|2[|[ | |n /|[e> dp*o*$g7v^[$AWU=ЙJ6hd"|M>v C ) % _Ƨ˲tpIJ|bf (^.-}mH.4 /9l7OЛ_=w)`;e!H;/cmMT ָ{s$PSr=U>5T_Ux#-zON(yHcZMriDI:m'%bGQDZ;R\@Kr _ؗ8p}ʸQ"8o?/}@`!LJgC.RXÆfcpk.=uE(]p=K}RڏS,аz(Sz sQ.*GǦ|G?32׃ÿv8h 伬kq5_yZ G3jA0dOA iЂod7ljܽ/A݂ÄJ()TnI 5>=Sp%Ͽ+=иLB[~l`ͽ(oZ\ [7e$' 5i?u%EA%}3/Ӵ&7:Yz vڽu{W+'{gʹ^Bd +Y'flaHWI>JKx;w[Am.!T:C wc:WB=|D9G,%!x ' P;;7&VWg3!`xU 8MONi-h9|sw/t[o ZK ;vg7|1\=P{6i# 90'3]8z8d)d_<?/G% z;nVUA q*lGuax&%@s!JZbUδ(w'05n .YHP^* Z lk *R>t'Y`8e4CR|Jvz8;J<w.\jjuc,ڤd Yj8yJ5:z"@fPHthKŽ>.+>O~⃿Qufr)L:hg,Nq dvPej'A#1c:bњ8 nBe.Mof?/wė@ Pݤ\Cm8 43;U7z6LT޽yy>r=>Zj!4,G;o}0{6 jOq2 cłέE[ ~=VV("xm= _G葮`kޞ.9 Z޺'+Gd@?x6GM;IY*~RZU3lAiV{{Ե[ǩ`X P~0gr7j%Zp-F);!RZ|k A@뾩pl.l2 _^pdЧ?jltH\e P/WR< ^.ֶbfq b帏Em2[S,g>&> AIFddsj5{=-i5ˊ>Po0 NNEzPÊWZ, am p3d SK>}<-Dj߇i9Jn>9W*cXVVNL5Ճ#~)RckVrs{ճ`h_Xd+4s"`)4[ ef&~y .)"|co|F 2NPF~Ϡ,:A02 ̬]r\yy2߹ߩzSm 5J Ni*)ዻ]Mo'ZGbST8iZ5fI a=%Q8?f@ F1(6WZ^Dj(Fl33s9 vnێ`b=?Q2QA(kCRx'y\uԂƖ*P@r饑tZG_N(k:òNwnO2f=` kvS.yn5vn8ˠI5qΔ;@l- $ r'k&ʩj#r3C1ڱ&~= \3x Dc͏%7w&B.LNvhFgA[X!#; Lai48+p'EJP܇s\+Hs?C x=oݮ(<Ǘb|.R[E RL5vԅA 3٤Ru뎃Ç;ډ?al \ZH SSȍuw9L 76cD1PؾH3i-Zx3 JBҌz,Tt@j|hA'ٜKMyUA%Jd\88}w_:{Pq`4B*`ZJMug [V jO^>r;?S[\(l+?>O)́9eqb~zaa]Bu[=s&Y20~K2c+rΙMA܍g)\dI }U.SwܙlHU H des "c5ʡ[#I+ 764\,(⪭4枡=ĩ ހ^\Sk{;~V[JS8?YQR3iPL8Nۀaz庙/X45Kz$Z΍)j*{>5΀f}%vL30 ovap')óZhu8YI"3$7dyߩx摆 pk:Rۭ[J?ǻ`#`Xȓ #ܘIe)XՃjN]L;7rA{]|Meۿӗ>O~3l  e/deNpDϳuAKBUljf ^\0r˓!rzyl@<$$pZ(M]gwJ`xs;<{O(RŔ >yȔ91#R5R GYmW,'BjX :ߠ?|n\P\r3hXLo`mF08c F1E/ڼYAf=ewjC4(=hG &\$7O.>|u0 _޼ WBzfL۰,ژ]ްvOeXW~wzpjAwow|_;t_ɝ]aNٺo6 '[y>0hX8^O\쨊5㑄KcOa@;2\wiqq5̹}Tm/>.AJRAڽً_0t,"缼C GLπ#Ak='DZbOP\鍄/nkU}4|ug Pp um{aQ\eB0恌S+IkӸ ~3Л~nOŋbޝsja`׹AZK?`@WoПuMVF~jnUjYb]L- #hR-<C*0R(32 5hYI/Q@O N0T@j;(WhJAKB6ORZsok2u&L]9FV81ĩ 60i w31=V,x0pEX97!$L7J=}(@9W5r<8 y@\{ks,}f7& @4̉/0Tعa ]T0  dJ0+,s(ARp0#kFEp L1  MO@$E3M[ro곰kL0.ˢUI\@?UN6 &hcM1nV i@ggAz 5@6rM (P @Y\8ͼhg n,{#^ИH։!{f &Ϻa}z Q Ko9]NT@ / r c.U_ۺ7NnJ+#)anlE pk[ 7 ؽ6=x, TB^-Oj!բg;**ϵy4q!3*3qRDEa@ 3N~|Jnxw/֏V'Onւ"w:&@j' $#yæԪN4MHu[*Y'[sdf<3Dd Z Ժs )z*p ^X#+`.J?uGJ ?.ng4d8 gס"CBjK@gW!a->_x'NNlrOHQXڸ~ƞa j8Y.N)e#@ܟC&bbHy(ݛ)}¦<:QK3ބ 7 T3JY/ejJ'|+|7oQO>o|x}'bX|fB es&ctgb&0 Ĩz>|H_\~5$@xZ-3įD!ɱP T3uI#ܬK_7K_̉Q׫|@6Irrܫ\ydıv&D"X +ܣօL;$T"]{x,"&@Wx+SToFRbQ XX)5`JO<2শF~݃IMuݐX7AspizNoR܇@G9NjL;) _/ؚ Gp:%]:^CB7R#i֒tKXX.6F+h'҈Ag$^H7]tTZ?0PM;х`3JZl}QP@w-E.B lmeG3ۧieۖ +Ț/]s$!Mx)gh7ZB9ԝFřZ=n̩uDw=I$`'`V2,B/@D$~yV : m!q-=Vs RojڬDՓR@g5&^rYGDŌܮ˽tJ'!@(kdϊ. n]ޓЌj}mkaLmX+4``@A32YbZuf0$«K!qft5fXT-%xnKx鵽 nEJ_fm9iAeKP=Hw|>30?e p  񉈾G^u`\p~mU/n!!Es0$M2Խ1V{UZ+1'3T48LgSBBxXA)e`B扸3Btv6^!*a@ !2O)txjhAQ3@ ._j$QqpSKǮd{ޑF嵤sKfneͬ5J| m"ƹI(B(rBoelS;5"< ]pf 9e%` L?i T2 HWC35+~f P$%_ @K%tB8)D5\呡@QY OjQ/u؜r>CH\5ǟ{vk+ҧ{XI@?!X:j:lO6KU"5\3/!ތ1msPpɢ,'HŦͰ]: fzmpE oS7fly`Jq辰sX1m=[li L:BH(D}*ҵ?LhRTK0~'V~8yCy22^Zoڎ5B(pOHTQh4q~-}NMN* wf 9S2;9kl#D FVdI{uڿ,!=E  ` ;yqGl[J 3 =TN~yV?!'Z֋RsC pOZY ֶ8F$*Q7ŽWs ?!wN,_ј7s(pHd((?/>,)3 !' #[99]`}gEBhSg֖͎l./7 7k@DB(pO.'`ȖEh1 ~֌֨Dŝ~ǚŝ'ƆP \NpubR0K p>"b!F)ftj-^) N@=r̷,ifBB" oh֬L4,ys`΀[]xB)B0SnNO`w8&":Gg*'yBBh`zaLj@L쫾=t!z"Ē@BK!8S--F:DPC> ;**S!! \01"]=/Hi R@gɕZ̈́'l CӭbtJ\j2sm@@ 09ocDVn&m Dj})ZM7#dpviPi"ߝ-!!!Ql"Aff8h*b~.?\Hr/@BHhP v& pHUr0ڶKHw`g kA^bF5LT? - @@ >#Ri髚!JY͚zU2mJ<0 3qg&@8!, P 75OȀI-=~f}]K1e @a!$X6mcD*E\̇9ռٕ2!`|X䅌 @@@z;n7'؅D\՛͝K+n0sQ]LBB8= ?@H&7zfR8FtKS?& \}bN1-ZpKow1y}B BH^#<޺}6Yb&1^Yg(ηs~@@DJ{ $QSLIh SqdLq!EP &`dLj.~գ\BKUփL-(GS}?F@\#PtR P ]61"f|s3VsHe}c@1GH锥,05g@T P@@ҽ{0} wG:6t$iH* -|)f6!!bXLj]g ^{K Qa lu_"-eieEl(Rx)70zeeݑ O6Fȝd xy﹭.1#i] IND !Hͤw ԇv 2U*(0%֏z`Z'n~Oٿ|O* 6]JIGOBBH0)7;!ZW^@='#ܼg$K@G` vfK@ \1"{ [B=bj += J Ltz!RUzGJx'@ۓR Bc4ncD*Lpx-0S6*2׳yZw5B(p  X pH6H$d"1c U6 8}nV~q?!!!HʹF=# bHk%[}g>SBegvu !!$4@HxMmQL:l 82׮eDI xA[Y,>TI4BP !(:ھf1"k/Ǵ:[ bm|<}Ua,K^51!4 :BBBBl!HpB(B(B#31!J7~! δrB(B(B!Q&tr<)\+WP@!B"XV'2sm"{i3}'!Bvjp3"B(0B!eyYeu!!B!`tR=C 'FB!;{ԊB!]R49|? ̶Q P B!$PȖ2l.!Í߯wLPJ6%B!8ExEtk#@L mk]Tpp!vD^B!A&7l[j+bJC xv3a`f#.&d q`Y Hi#%pOHu:] =-/&B /18"Ɨbbj-v4 Ƿ#'$8To$BB! `l`YZw9ix.0ᆪ~J <*" hB!$(Ӑf{%n- {2pjzH77x&'${BWBB!`P >C2(:薥 "Q~G?l,I {^$/I_YO63G4{"k>g]ӳ Wm濩pt[{!S.zzd;h57u?v`z{ ~{I!F@3rE;u5 bkv@ g?!Bpzk_AB!js\OB+21#{USӶˢ^]X0σzb=W|Z򵝲@{} ು} 5o)BpBť+g8~z"Mm@n:;lCP* kg-43k9Cft;ra,(d^o LAm!T,89"n&7M`_n,ۀ ;(-gmd\& ̏+gu0'̃ y^^9ϕ.$h",Rju >f^9T(pOHmCY/jB_4&i=sQuW4g}I͏b10\0o\՟_tih>i<~یǦKڜ:2]9+#U$!ja7, d)?orI7q%LϞ%Qm>V*hϧRIŜ˥J 5=o̩`x@"X 0ƃʻRQ ш3d lߤFc+X1cƸcJS^V@ #S.g,7~lG k(ȣ( $* _ҾXUQ\O $M3/6PIENDB`tetzle-3.0.3/icons/hicolor/128x128/000077500000000000000000000000001476255537600165575ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/128x128/apps/000077500000000000000000000000001476255537600175225ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/128x128/apps/tetzle.png000066400000000000000000000256341476255537600215510ustar00rootroot00000000000000PNG  IHDR>a pHYs B(xtIME  p~bKGD+)IDATx]xUUFgtT {!~Soz%(vEE^PA@{(c9Λy߬>ܛ@Bx}Kr97>_/܍۴wоToN~W:m~/f۔S1swHwmu/C_n]w{p==V?1gl{v_O|JU<p  Oз@_@}rc<?<<?<<',<@_OEPE;=E}?)=|sz/i틿 +I !y61 }<|w?誇P~ wOvK ݼMqktW /u'蚵O+gY|5pU;ߡZ0 :t{t^osܹ{>}L't}F9r}w>gY|5p-\=.g;ݶf齯B}O>?C4>S෺}>on}"r?>.'=OluU_r N7W;ޠ r.N6}F?tNO8hߟfP9`zLwW_=&eK g*s%\Įs ({ Vz6@{ ahCD%> LB(B01TC(7t{@o#<@I$(F^ӛWZ=W@vq@<B}\ '<s=o =%aXSyn`;d2{xt/dQd2'T;xSاt>fsoOLo+ָwHKynm믠Ѵ˨e"innOwce5O%<Ka,Z3VG??{^"*nH6ʧQj]KUji{y~"SM ΁'z޸l5T5_H0g8xlNKn iYɼ2ZVHK#ia06΅Sʎ]vU#٪#rf]Vk{uxF9}>y^@#C| wKhd SI x ޕk+cSxGhr;[Hm۟-=vSn'>|HVݹ5Z5s=oнC}|5?z<9=W r^FfS#;tX+}a⟭;O-wЪ6q>7uq>k9'ۜ38o_/Ёc{~ h>y9 ʦ{gyo{C c_h=@{y{om󏴍7-'|Kkp5|HK$g%ѴE2/-+/-6QZN 7,差-\w9-f&-vݽYwUc[^1eN8ۛCapNtr l=m+_ю7G4̳ьˊy,Kec-c>/GPT?y@-ݰᨐ}Ɩm&oHTHmxzI9/־u&,g xgUӄ@i%l/&D ucֱ144*1T1׵t{OgrqsL@o]CwCk>p$16n(Uͮ[ %fxVEQ ~ v doΧ%w?FqUάڹSh}OUl+~$VO董m:3oǞtR;OhOt,{8Ԍ1F˶GPYsҦT{L3K;eSRbZ!44"6z0R)*MQF0B`J- h*db1O͖zv=%ʧ2H9b+F`j{'PXq6e4,L&4;bxk+i/~*2㳘ٳq"ħV eq-jO T\ M5gҲ70Dyfe?rνM~-S}#)9'h  Z13Zv Ϟ64.˟|7D5,&P,l1sx(`9,ʘGaŋ-p05s ")(:sW_CwT&}5%sj5Ӣ_n&y S9QlG% lV>O5sjeՇ* 5[ -~b$hOqRr< rhWe)DYEuTԐ0t[̹&ZGfnp Y(.9epEtZA VhKPuډP'wP\0ZZMb`=WTsxnLm3\QZRhZKDxIu,?GyAxgD14xW(Oz|+g30'BsJ1U.ﶝX3#BJ+S:@&O`$#0,W:w 66 @02h%p,[m$U(v V :&'zo0u9-qjfRO/T0u XŴ#R BV&zοW':!;J\Ȅu]0m@x?[fi8 P%YdsFp  wn.V sv41Bmv 쒕g̯4' h)c6FOP|j/jWBMyTP;QBe|:u 1nhXX {,s1l;"e+Y.O`$ep7BzZ~U@ FtHPuST¿P&μ$P#PYdt$>ʦŰ))O8:'O Z6~_h)ؒ$Q:b< <1)gc]AְpLRN8l#gأʯgu^\2ޒ-D.qsDXBP]Dv+'.ma*xLDY B毘" 0$]X 8"֧q*} xCA6Hɤd*CltSE/-a ^gʴQeLLw˦dеk\#Zx%Hb)G:&YJ^X9+ /kNkZἪq3e<*xb@.'Es̻i{Dgrv L6o_K- Qʞ8+fNôC,i ⚰#ˀCr+'Ћ:DpA]:`LFxͼ9/O\D9Vȭ0hok}IwUJ1tXܪ,[,:"u4 ea'I[)4> (Cvy}XQL~>k/Xd"OWC:Uo)<8PaTyhL:Y֜RTⷭa"~7Jtz@#ȯVPlq-Xne,꒸5gNdBz&Q z|*S@f2pEqbVQUN/K>6]>,+O4Xi=u/ XH7mz_{߯d@8r+XŊ/ќؖ5ɵEahD0\B2 q8Ət¸RL@cgS0|BT0FIQWLɡ"M:i`HI'g`@ E+閭((dߡW*Ibn\ŗfQ5N&lyU׌V$ i|j>PP2&qbNX8q7{˦ 6#qx"y"Ws3ɦ,쪆lt-c"E >ab D {G (\vg$P; {k:f/*U2(|G@+;W}(xf#嗤 Bp(uCd9aDA1I*vE)m}df&a dQ`QNp9g r+ʅ;y<19a%ᚨ$j@`blN= ZT>'P: juܡf)ТqbSW=NYnXH%だ7t-nUvK@+V%ߵn{wЈᴓ] b $P ˜@Z~ OPT4DSҔܠ-̖٪VEGêrF$* mFX0*h^Ǧ A6p N 2g%@7p"{ ĮF By} l$|B:;h\$cH۝-[_:fwrgNלvmGFPN2 Eb qL+?=їq6^6K,% BD3cXpXFV8 HkPI`^\ Sx Һ+?˙rc7RLF+1-Yc*Y´<:DV@H ]+0.\uO$N.¸qq)B ~R'Vq2PPz4eMI!^N+\OkNw9,C,_B p|Qd3A,`΂DDnU|+%~!}d)DH~e$G=[ƒ$&1c%^JZQRܘ. kb@22/.>Ea+^bʌFUwˤAFHk7P>L=lHgBWT.JkMaNI>afg=H VRb=D[X?^|~&ɍ}ԪvJc}yr.tjYX.| 2YX!rz'B* wױ* -uD -'&.&G`*utJƃɄԂ d<Zv/y",H!,*殐$edءٹ=k{4Y 7VlkXILipqJ,Xu]M 4ɰI&X'2&+e$Z0Zr0bj#dVʬ#ɤ| GKEBkF, ̀x+Dfk W"ltnGq 1,x&+p53=:kچK9DI,;+t3N*8a# nFAXE 6U,?C 0|,=YH#df1A;VD"8Ci7;LV;V XXw ֑z1K2B@jHȿ.E1yzAN5yI)x*1LUR,i8#$V Ysřsc1B~`]}f+CG\hY4yJmH r7xa^7 Cg1/]bXM32m&ުgamCU5G'G0"X}\RȾIPġ UepC=R0H.̭0BL~EDBxD+\vٔlP?Lߓ[^\E . s9r{D.(dEQeZ1I#:!ݚ \wRTP.nc ׂڊrANw`׾21v^2qFJ/ӓ IjpB;&fvWâG/xgkڅiJ g /wgtvр~4mn9'%RG~ G\'?yƘ?gY|5p-?#JiMRYm$CQ1 G%2ĔP*SQj1s&,΂t._KxJN 33gM\3MM7q]ACX!3טg>ʚ:S<v~{#,k;vm]k[7ʵ ;is: GP쮽[|]{˚~%U<9 a~2\"ؑ=ƟF%Q\[pJERb(9=&eSZv4>;. kNɠT&:Pk3餃f,4,scc67N2˯L$t L[X$>щ8cl*(M}~q LW^?f˒>lWs( > jYО ~|&rgl߽A* BͺLP&Y;U>_N2̤m1=@a-^DP/~G"QCxoDha2^nLX>~s|N1.ԑd܄$8E0|wgk@eET7ˣ6J& 9U ձ=& X0P5V3։#<ع(±:ZP8mu,; M'8HUM͢)b=;9N  \֊!FE&$IFҫg8f:ӤweaD7I Tkwaրe!txxt4n_#/8~.aħހ~<͌#$3BIk!pHFD Xhfg ӛ_jUIX㲕~< L6@,BIeäȽɬH-ӊ8(ڃs qejKy0,V;̪>:P$Ze EUƘ23UƧq2Hu:!5 r^MҝLBG 5s0Wt]ĺBu\+x^us|ԂmCV}D} E]bg;C @Q@ Ӌ#LuR*C$㉃;Qq UT3MܻA*bb}̌U%D1#筶#GON?X x'<ta"{LX:E'BڱZA[ m+j&Rj$]-3%G ,@S뚌Ai#v 1 j)o Q{P"zXaX]>@~]&d1CD$s#l1P|7id=Ep©6&UF . k$68`8'Svm$CڨJ3wVV{+wYf7&>(.1]k%Y!2ś[|(ʅ?NY XdVaB39 HlB,$UԖkt6% qN'E 6͸_@i$:Lz@-@oùI6GDgBt:rErPOqVOk~OUs/!0TMzUY>p=p%:`q4W6fzkuqz֧XAxAdQ*ȵmm\?>Fu$L.'rNB7%T8 @ApN:`ǹT¥*ohuj§(V 7KlbSv6+V20N(QHųz^LY mV>B$ 2s!L8څ:Ec` K3OLP2A1v1ueU,QF/&S'3"t+ކ @t5Z ZUtv"1klIiIɩHBPsݏ{)$np&]um,\BU-A53Y3[.Sm\:^ HzaA1t 1#Ʋ})<=#:"K.NhkezgHݩLZs]^63~'԰3b;p)(,N[& oG;0HPb:3K E#;'3mX^~ M" :p}>HFwQq;ti7c@0c-20B#:WJU(IN0mV#SڨHA!':!FM6-t)]f?{tI޴*ʬ6:kĎtP="%ԑ?YёJUu<e{D5.1L>pz8@4gp3zUI{KkGw(9 ಬQ/ {d`\cX~$ "ܯWg x 0.pmܵWۿxϥ:7@" /݆^$ v1q{ q!>k >{{qR*h?V?wu.E| ,Qs.F.0_3ېm`G5HpyIENDB`tetzle-3.0.3/icons/hicolor/16x16/000077500000000000000000000000001476255537600164075ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/16x16/apps/000077500000000000000000000000001476255537600173525ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/16x16/apps/tetzle.png000066400000000000000000000012571476255537600213740ustar00rootroot00000000000000PNG  IHDRabKGD pHYs B(xtIME  :ĈqR]T7M9i4(R ,?X'JLi| R~T6LG"aQLҵGltodL07|`3]R := dvvưmEOkp:+UJ" bQ01Q؉$?>KDfn~v,SO4]0F걋(eS$Sv2S$Su4t00 v'5J E }4n'Gnk Fqu{0q cC¶бFkA GAD9CzIENDB`tetzle-3.0.3/icons/hicolor/22x22/000077500000000000000000000000001476255537600164015ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/22x22/apps/000077500000000000000000000000001476255537600173445ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/22x22/apps/tetzle.png000066400000000000000000000020521476255537600213600ustar00rootroot00000000000000PNG  IHDRĴl;bKGD pHYs B(xtIME  0IDAT8˵ϋE?3&٤omP[ ڋeAzf= cބ ZZ"*T k&55a)>s'(o~o_ /6/ZZ1 chyqazJǘg"_v /oܗ7A! /ڑ՛"Ewo}_[[ J(دUqfө $SZoFnvO QOe=XdB5S>{) sƉ"ihM sDrejcit;|9_6Kq+KZ\Fl\_:^{=*diւ,βl}K8Ӝ{AҠErރWkē4"hьV'K-X! ,k'\l&[)_8 hQYʱ}YwЏ9rfZAhs?H@a $>v,N*$$G?{߹%΀y8!۝qVNBb $Ό13ΊB9ΊXh D4?[?SmD`. df !9C7ۻS;*j$xXA7f0~iIpQ,NBhhK$8XI8%ƧcTMO|Ly ax30D Kq ~D2h1pLε|xsiヌXRDU5T$2cq 㛶7E~\E ~ggx Y_cIyIwew#nGtʳc{['wnryj؟ y6>.ټ :U.LG_܀dniJHu O*Ĺ󒐃8A nj%nE2$$!DhĒ|4aQBSa'ԁhph^9QU39MeX8!6 gMMnIENDB`tetzle-3.0.3/icons/hicolor/256x256/000077500000000000000000000000001476255537600165635ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/256x256/apps/000077500000000000000000000000001476255537600175265ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/256x256/apps/tetzle.png000066400000000000000000000657511476255537600215610ustar00rootroot00000000000000PNG  IHDR\rf pHYs B(xtIME  bKGDkvIDATxxVU6s8H= $B JBB`G7((ػ i Qmf89纾~^]{{%H}] $oe{=~g-}3h|5 Ǘ.κQqGҵ[Œ5E O̿n7~5x-ރ3YL|6߅wp.8'sƹAH/B-Ҙ[8)V?I|_<"6Ҹ& mu'v/`׽o|-oVw;8 sĹq\~4%ӿķo~|7~>q㧿qcO8QMs'ϵ=a?_;H^qX׎k?}/-}|g?,xxۿÿ0!<>Ϡs|ӿmcr ܛHV xbC?5Mi?;?0Ae C1 y8”a 0k@uP11 D 0 B1X`#\FJB @K A4PVk0X AX$h"yŠ.d Bb,`4@ `LZ :@ib A8 00` ]x!D2` ݇Ѐ$@ 8|-ЅX !ZAn@>fjGhJj%Ggb ̿nnOn 0.@l0 0AXq& i: (v@ *p S 0@1\ d)r% A\l{FFr dkkAb4@ǗxOV+ gEiԋso7[_m"xT\i ݀%fa=]|5fŴ57z§gT.0?xr4Z(kƲy|m߿oAxnX*UYtƉ9yzAh<{170,//k/ugi jlm{wk7^)f--Eu|#MT$`(敉Evq7k#c}T_!&mO=0F5 jx~ϻB $l`ņm?\;H.lWY,*gS*H +WH̘,gOeDic8w̬k-g>(:|GOEa㍎z4Dp8\|bl^hGY4."d>0yT#0KLkMcuwSyp|j9qQilV̞d[gΆf~=Vht>8rD,[X ".xtCC ٿ&Ə#LjiE4.`icjYb0<&;>EK>C>sҕ9JL4o):a4 sW.%׌l]/@`l; oo|+C>҇Pu 7 .%_NC;qjǓDοqO{vq]~IE$ѱ=it埝w=E"etvFO./AD(d&W!AF\T$Ơ3Q(CvЀ]Њ єў7{^|> wns9\q8w\@1?]+_Y Q0m/},n}9"=sHl|GM e?#.)q-6=*VP0xF\q{^!Xkbû.|'s9ݱSq+G=!6V<;3cq{DFQ=*A78now}W1k~[O}|$O??_BD?xMs?nHǓ 8 -0P< BCK"PQPaȍZ!#1ڒ?O9Ͼ'N|7ĻYQ:/߉me`l^>! A XgQR bˣ)pUl{oe&O-b_k)z5ȳ3;YYoX:A\smCO%V_?\,ޢ6e|W7~7qw}>`ﵟQwOß\&=آ*-in}~Nwc>'][n7߹J\|  P5 D{ߊ;w}Y6y|vZJSGy=N|G9~|d)`oy g)F}I7S`Xqמ^(隥;4_N=b&ķkn7!pJT_0`peF62?<J@Mܠ9DݼtQZ?V3c0ײ7p1 Бɞ_?Z@s{un78\=Ro{&=yAˮ XR VAIPZ%s.d =kI;=4TEM[hݴFr*S6Wk(Jgt6|bQ^5ȂMvE&B^Z47T{R2ŏH ]O*#+ysċ Aցb%dsʽ*n|҂'\(##{aK_01&!a^~ؽ~}c.`GSB(!0oi* X#2z]Yd*uuaBT ^UN (qn$W_[ŸQ&f A2o\ϿC@Yd_~A`bh DҠ.<}6ShY bg)KȞπe]xv&dHM}^%F -.ORۿ#* TAp!NYi ,vč&^z֚9]>s"Y4orhL!y弸a%,&97fGQDݳnq=-x1wM9?M90679[9'u@{9ܦN 1UL(XI&Q?~@'1ajbcC o$}XA%>uKgr5 {6Lg=&'^ ۓ-!]EAEbjg҉%#PނZUj eYcsiэx/oAr:m~GaJ)Tdi:pJ-F$(V~V <}o 5'YPeωmZcrqA܇ y$,׬WGj*[a@Dt7I }Y(x!\pU׉Uv2ez98iu#ڽeh.=`XWJ$ zU:P@3'8 ӗ1Њ;׬a=(vEX",H/o/AIZSZvsRIm6X3 ԕ8M[vU eU"<c X@e;~yS|!9V(T*o@+~kK|'AzIӗwe7`~h9%@ .xRr 59[@9j׳h *˜4ݚp پAzZ%mb5MA`JP392=X8`e=FȽ5N [0qW>*w&z= J@+3ʹW1XL_2KeHqo6yi.L`TZXc( 8RfV'~{@PKhGuԿHu ,RV6*.j~ y=ۚx Ptauz+Xx{&+@41-@o*S{N=PSw/~XN\wz_ +H.^M /``yHH`#HPl┡#D>`7]˚_`ْ :8=ҧ,&50jNG#زnƄ gi 4uF} 2pƛ?eQ9;SdW.b+Q c )*M.7b*S?a}X p_&sߦ+ gg7y_1t`T x72:`BV SXc<02{8Ht*Cm^Vi^b W'5+Af'%ҬjSI!};%GalV N1}A S$!ب quwxٸ,K`MӴȦ/ iF% JB?@Ej._Fs\p饶k}*˼1=-yuq\Bsی dƢ. TԞ},6!`7. θ@?LO Μ:2Aoah2&>uwbco۲ŪD9  [߽eޡԬW0m+ܳ[ʻ:j9~.RAgF-;_ЇO%mj35>;$e$)Ni1K\ adU`YAuY,C"!|Vzʂ Wq0\wz w?<󨸞Yb*P{`$1g͓~SqE e!Rb+P7  Z'iKhf酥 ?ū>^_x,*m~f S&KU.-;Xu.*`Um3/0?}q.,`' lf,2.' |lU!*ǵͧEk(mh~£󃅢4c+#ُm =::Ekw( )03,+:r*yC(T dbίN2 * FL '0"I?D5[Oʭ+BZ5#4*[zG\,\DYU-+Ь}惈P"Gɯ,$hpH,͟ [ ),O\Arx^ S,rײ W>\cKTFeuX%w8*ŠPς5Bg0S>Gs._ڐMQ:Z+9rFK nv17Y4_S1 ,@qO6fW\ɺnYq(֣G2 i8݈VYh]NAlr?l7$e(oYȺg0k/@q$C:/9Tn(IDN.Zxy*Ûl*줚~wpsOAoY` p(W;Q,``9"8 4)o (')rcS"YZ;7mN\p\Q6û4H2<~A:/L}B~tb4QY5s" T*7[wtx !+W=Z0!{OHC psQL.);2.as QlZRݪp{#Q EhZXe SyUDB"sx)m,Vm~%Q9M _CJ<Wd:ԽuC^VVZ s0:);1YV5VNH]8N6UV;Uy<&%wp&o>pZK&hJ#pl- ՐFWo8 JeTC-J]zu.m {A&s# ;ɠ .m;SmPq h($M!蹕}Ֆ|",>rĵ7%U . k)m6U DZ.I@Okx=V{Å;RnW5`n")-/^']0ˣ0܂!6Qvfa"Y¯I# ;: noM; ]Ȼba!H __trݗlPF_>oNYr23ah;"lզ/p+wοL]e'οg+,五;9vwRDߋ9+]̘9܌ vk:ԑNN17f JSO;`_(?rA}xe-48ёioIGN\hֻ #4 n0,&9^J@vZz \-nܴZ-HZ_9z38'qB| A3[U &Hy8]w6S dpPɵsŸLpYz[@" `?ǀaݼ[ę c"S5]_f^RLxϯűt%B@1(۵_ _Ta(-H.>v `w#HpSN &kc1 `- j^YYPeiI%s]bzͫ% p/|S2KX]3z{x<п.^:SڒXo5朩E۰>"~X pwՂSGScm\ƥvj}\u C Ar/)鮑Q)U} =VzzFA~Ngz_!H=T4jHKVP!&jeR t0}1 82r2!Xηb elVVQ7bcv^|*dXuJ1B*E6uL2٪QF .-Zkq8@U.>!rMHD=x+lLPcD p܂- W-慧mc7. IY8Xf@iB@B}x fxB6>I‰]I}$ ~AУ3rE"n]5cNz%լ5N -\sZTe^ Ā^tzhw ޻Fqe\+J 6E9PRq5l%p9t]šQp=BBJ6>[~i0.kSWEZVjdjY J3zTY;4e(柗(&ņk2xV}G{mG Tp^:Z =YxU}'R8 FBapё̅CH6O;(}@tLHD?j/ 0$Xp+/'[ [l&!{q$ZH9".wg2tمldAR HuD:!>u,*t0|W>0eUY(5d''Lp0xJ9 צ \~ NYRpes紐 Րy\ MՐ.2F *J37 @eJ =R3ImMx8C݃ϼ@E J~ ?"|5.6"V8E(MsnYrjCl*W|xʷ; @ât^?!},;UZ,].jFeՀKN*  0&[4jH/PڐAT 9g u}y ys(M#[pv\̅9Mu(. x9ڬd <&.[04^"RIAw:)%;&!M>l7+_=JG{<vɑ/x @ Ngsb ]K=9&A`X*6Pf`lQq^. "nU`)u夃DjfjL:^,. Jme>ZC|16 pS-PUx^(}ڙ5p@' .f=Ω`RMB:'34*Q#ɗ<=!AY jq?h ? h5Hǻ5,x- OdvO7֓J;(ڹ`"/ U5w< Q*[NߏJwUu"| P1-f]1~VTrV:vl8 >^V ƝRN*^.<2tD ;ZRΛPկ"IPM"%L[i"L|2z>׃4B@?fQFҧnp)ɷ@5|t s.8K!xY.C%qTԻq'K&P1q8מ3rlOXaǘz^U7GO7Hj\:WŏI  Ɓ Cɫ 9""IZ~ 6r:~"A kϫ$dU U_ -QВ<0*eWVI&lˍ5I4bnPkv=Nhx@HEP`ZSdUFb E.xdUϯ`2""FS), yqd $8RP:Emn+>/xESoWv`B Nd*/ -R&R(/4!+@A~& ' *B [4xF[ K;C5T~[rⓩon@ XI꼕,2:\p<!w5{"M<1Ɣ ogu3r%ɎCN"PQ< c.D O~ā='ĸ&8gup0\CsxILJ8bĴcwv `>*-a/Mb? w6Y HA^%'B\br<#iWMJɩc;ͯHrkSz =;3ٓH.9d䒯G1Bd5VMՠRU]M\{"qF1 Z.e;^l<~юH^{_܎Mt}1/Sҩq'ٿk:=$q-g;GF:#%W@a[τDT9zu99Ú~_a^wp.|Ns9{Dt8_A$ >- YD KWGT5ȼiO * NjR7/G,"痈e++Ws.%z1gP̕⬋yfeEJQ?B6"QU[ *릊Tg9ˊً+Oʧgd$jk!/NscFI7R[Cl=>D35@erp-*qX  ś^cSE݃߳)ݯƞ;޷(0k=D>j&sM߳{wv5c;1g: !,nL[a}Z1H*sɣDvX[0^L)NSKIY"[T)<111O3vgl| ߉9\pN87#s5Z|=;\K1S<422Pm'n'u9s|qc:؞P4igg[BH2Ҍ:yKĶoB }ܷm7 Aw1QԸa7p(ugDiW5ܹ=pYi5Gtn~+%neQ}nv7o?NSFйv\As94{N;G{x 7w;Eº oASY/ܷ8GPC'`ٲ^ú:kSaW a\q3J'ESJl.ő[NZ.^Ͽ.WE{|oc9$rlF;!eU#{KϟυY܊ڛ!1ֵ<.f ߜw]/_|6wqC };@#- SA:&91s=WWs{#OHӆY2fOT_@yL(FiL1"+,w=.yy#y.d礋{Yb=fYO=VL*l{v`W`*5`Pk#<7 sl8 rS,<$͂@TMgH$AcrVb[`Բ@vV䪩p߿~ *E "A)t}m &,` 7h?X ,"bҳ)t!|Fj*bWr^r-%~.;R@a@V.t,#{W٩Brs&諁mzlJU}ZQu4+hoXv(aEs,Bs`M. 2 af(8lhHʡz0am"7m иn@YP |$58VHE櫚Dja@1>H\hn \=:U d{^N-dZ+LFje!2 {} xt"(ݍ%v{ RJsd]4;֨ J#]R }(e˚M*c>qM F)E L<9ש+ ;\BYqA2-\b(ܤ\ ~4r][9 c$ =jd8 #_d8$ka8rp);ŵ<!D;n#R\Rpir툴gZ/ͳAczk azj] `X 4uHtU Q ۡ^Kа =$p9ԸV #U,,t`4)1V[lIspKўb,SkR@'=3kGGkچw@pdGg\},-r{Q7 ]P$z0"#Xv0xP[CLv_/pT*8.~9g;2*PA58s~.aO%/ŜeuzBʕ{R] g'{,ctjKS aw1]N W>.)Ih/%0mɒLj]` A, =&3EnḨ+5*ƭ4{gxP /m*Fo-Ľrm3Pe˜G߇ `/_,8F X0l'I|4,\\⌅6p'w @U$NIkdi@˅3\A#ꊤ,[|~ R(7T/ ʁ7aGx DjɮzNzi6_ (Hq/0a%'l,M w+U0Mxx#MSoےe[K !fLsϮ W5YHRBW;x~D4{ҹYp ͽq Eâ, xw֛(MʊsA26{0}{g]ǜm?گD[[d&<5p B}X^MGUmyk13(%yȵ+a F5&b(EZ,Z $9,n@4jv. .$k03HCtՇrW |Qˊ ;Ym*C13dmw| -40q JL( '_ % 8AT֓JN\tܛ-1Gg"~v>fDJt"AHtrxD-T7$4x}Y0\~-߼x4',{nLvE;\{.T%YdYj^%օ0@{d!Gj~ƬXMMAeRo.q߉˷|w-GGJRSa$MEIm bG\7pEZ&hty͵~-N>]:! 8Hڐ^<]9Ŝm.Q;= ]' U*" ȉ{.tUݖ]`u* ,.N `gg@t?fд 0ZkN- RJU✍O^$k r7W&xʊK?HHCsUtNU]B/TKPYa|`U9{ɍo1zV9q}D .ڡJ :dFGd6v*kW'IL¢@_%R9-_3+vѶgKO"P.j-?{(]̵19UV+wa PK_X:ki-pV+XZCxg[DgTlbݍׄebԒʸ\SRf61!E>'|7&K~U 66&Etr?pbOڨQ bypKKz\쥢V7?C_EcJDgr`Ru"߰RHN(H KNP*"4>ӑ# ,3N_TLwd+m4nAkӤLrYMu(`KnLIq;Fu}M0J9iU^!]W2YW4Un$s"]* ~fFk\=_&E '08 Bd7G$>ABbvA^ɋ_Mt%jo|TrN97ePE YєQ@dXghy"5Aƽ5z{u Ϊ6Y3e)?8˻yz )UZ"kuCH[S؉ԑM橉RF '{V/BP-BXe33-PqN7gh[N4'GXMi1jRbW_g7B4{m>.:.@W)~Zpu]x^.^h8/?p*":}E9|g49"-" d0FsANF!Yzӣ=u(P=ʵGDFpIHYyǯg-Ua{f"x* F(V5`Ac@` Ho.[+P}FZwnO>Vs%T/I ?6)g$=Jr`FNNhkIfkk p4"pV6ծ? IC.9d{lњ9@ C..`f$GDx6* |jY$ fnRe6=RI#MTِc/.κr}]hU-kR$$ h8:5vH{뺄'pF0GW"kj": -"՜oj\ 8d*-RP()\Y/RFvS'7WҲ4UXVgb{_u`0{_fZrrW@'kl[AFΫ꺱蚳ZdG@ьNKWn0{Uoڹt0EP$}V5pL7:)[ c'k>|fę+fqg,7w/ GawBf] b ],Y^CMTW@sBA`hA@nQ{{6(%b,q&XO:8NҰ359{W'!R쌣\ܵ)z ˣ+'Tj]uЍtMhb)& p@mX*;)(8H"mL.4a&/%ڍGtZM$j5En LhE`7=S>UUdۂ G[xɭPjqAk"h 1P5&GF) XT14TqO^oLLY^Vd1`x݀hvRߝ[%[Rު@ދ9zbo2 +*^o5.VthA~,:80p gè@7((Z,*!i0`@ -뫖M)CNx8 Nw]yx,7vi4b(7pxߖ}֤>!T>rSKy/-lLm Pd a)CIۿf; \Cz%] WY0` p3R;Gsu_ kDD_~(tn׉[ 06L,&N\0z3[HfԔ@_AD1TS /YP'aF/Rc:^qOnp% ׮WѢ f4_ݪ5;PT0HJc'QWx7Ԁ|"zu:?5;_}ATL+;̿4؎]Tι Fx뀩?pxwh#JבFN BDD\ί#Ľֻu`[bv3_4G'S?mzt's~%N:A\Ԙ":w?=i0a NNދϰ?ޠst]KVum5Y҉έKSн7k}-]﹞{~AHC#?S]Av)Ĺ˗S:? :l9cװoǚ#x[h{o\wv4طMv 'ڬs?b,}r\37dƎcT0eX'X=o>tV3`~`%lz%+O~S&lKk4u.d9,_>Bs!4uXw=M6[O]GٟWw(n3w `vBEhiCX5uĶ_X4_hyn{a0Ѿ K5 K7Ē۰_[>޿F'̹R*H{vq&WU6sih:c5 f)v)2T(dv6rrC9|誟)SH$dT3baV7c4wC}^6$/¬f!Q˜*Fr&QXiAC*X i I gHP6+JCH$!(x$/`+!!Ӧ 4| B#X8p(*b`PN=[ա! =4/bVE(QRncQ9#ddW k(90DDPGPF *ԯ@EM>DR#R=ChL‰Yᶖ}(J:=j: "Se*,pUYas ]DqiD)\,;גDvfn%4$JA !)N"[{AT!%O΁G1/Q LN$I$c4}a5 G;f&f&Rup@}4h‘᎔\9AHn!"@Oz)7M&fC }njXbHw5eO#^8b$J0oS%f ̭ҹf vo(aG c;*2ՙdAB2hzOX!ߑ 9ɂIENDB`tetzle-3.0.3/icons/hicolor/48x48/000077500000000000000000000000001476255537600164215ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/48x48/apps/000077500000000000000000000000001476255537600173645ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/48x48/apps/tetzle.png000066400000000000000000000060601476255537600214030ustar00rootroot00000000000000PNG  IHDR00WbKGD pHYs B(xtIME  +^; IDAThُWZgo7/q;N ?kzY]tZ@٠Y T"b8$C,,r44%Yo>6nx򪻶6@kD $QXp,k=w9aC2 #ȪϪg5W?x?z7n -|Хw~Tm>ZK\YPR:GT )A*yH.d P|A' =^3>ڟ5D%\ֹ')CHO B":RW`,Kut=}{{ApROm҇/ @_pݷ'‘_FJBL58k04/!R*?K|Ι_B+MQ(tռ)W_eo 7i4<_(_yRHr'!IKK]׏*/"'$aKo faǮno!dyBkrfIQGA ,˫wI"/bf#TH捋\}m~5_:'}s=҂,^LcjY"{(Dʃݍ9kL1轁z$A9OzZE8إ4up$J9uϱT!=cc ?D!$K?`4ݝ$}8vYxs(g]ty3u0C2[ vY<9E<\!S8gp&ZWyʏl\5}Us,.JƬ-'IT}o%A`=3 yp8-<ќ z3Gdmj6cE"sZf(kNZ} g AN~,7/Qd*;FtoМcsO~MW7hgMP:GzV58xXފ0'hdlo^%il`|o'c!|p}ψ{ s^Y¿xMgaG CkrFB :)Jj1>1KأH4.Q:`jvOn%eaI,.ўcЍ'Me9~zx%AY R3#sߦ]fw1%r4~7D{YZ0GhXiΐ%MOkSZ{es BbN93$Qs e#xzc00,3dqB9Ҭo1[  yb%Yjw817Z<3IX`glb] TLi|a$d)du=>F-`q!,ynŠ%B 3'deg}@QXpn qr<(uCG=c X#/52D+N%!ϟXG4qai(%% sL=V7+*O0ls '6H@ICGHc Yp<1 !I#OKwb݊6}tϴwBk}~!G΁_ 3y aGQ='}T; b;ϝrhSXLa~h6=zS:aq@޴WGYR<߫y 9 $Lc-s ;R(L&k~ |ˉkK}uJ$rܰYZʓEVMJ'k(-Y89}S ALs"@)IPS RpY^ҟОI(M"OMkФx3;9_S*!FaTtR01YC*q(i8yWxk ~_W<'IӒN7͈9iTə:RB]U ?)2@/( l SFJI,Sn 9uvk쁡BV7|n-\9hoE11\V401gtBįi<`EgIfyiI?qSZa™st:VrZWaW,#`HrDgPpT> ,)9[K1RomD%BVrsk\IILeU畤50覘BK)ATJ|I) qzE*hZRZ $ͻBq}R`yb:IX5:c-q<_=d(%"Iќ8~ ;iEA7J yntדZuH++kdcϹxb6tvlMxV;Y([僕/=YubIENDB`tetzle-3.0.3/icons/hicolor/512x512/000077500000000000000000000000001476255537600165515ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/512x512/apps/000077500000000000000000000000001476255537600175145ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/512x512/apps/tetzle.png000066400000000000000000002026001476255537600215310ustar00rootroot00000000000000PNG  IHDRx pHYs B(xtIME  sPbKGD IDATxt׶9;{{;D3@D19D!"A$ gg9WuD\soF^9}}@wFz$g?ayc9k: AdMItOt}!.?|oN7JI˶P 5AV?q[:3O~OfMDPAVEJs:t8dt^}ᯔA5C[R AVIJg~/s:qG:?Ѣgu1Լ}_@k HZ{ ~ӝv!G=-sz]@m@ 8w.gb\ugK/ p/K'N#R;Ax==6CfRB߱ `%Hdhk4 X Z V#AjmEv@ȮAjм0~ Z09ArS AI@V `AH@^ jA  AЉAX  5@ @A=A1 XA A[!A A  A  v@+A`@7AAX A DB@Ak@A A@'@ @ A(    0    ! 0    A  v@|wA A@' [!  A8 @A @Am=A 4AXH @6A zO@A- 4kAX 3D@.)}_A`)A D  EQA~0yu1@A)o(OfOyEseѬi4rV=aA^uZg>{?ݣiQFGҒciGcZq :Ň2iچ4"y M/r'/3?V {ig +  @>== X3vVs `@Ayށ,A^a XѩOArR˹ X <L]G'  @~( ,s3% u IL@ADp.H=دbA=뺶Aȷ 0k55sgҸ ilA0 ?P;?P 3C=n̤  M۷̽˳޻ײryѠ{hЂ40y'})NnsP[wF3czO_GҨ״sVSI+T:a9u,1Xy9rN9s%L?r.ʹs,Zι{r-ȵq^}Ev@`49tV˹_wiȒQP 9ym`ȝtJ翍JlTܛ;^I{NK܁wΟ3N.RyR|f]&'sZA>v p@}F 9s!D΍#9Wr'RΩ+9Ȯ)<7ՏHr,e/k*qOLySvetgyKY6ޫyξ;4WcĴ2)Y9RK ߥE6/>rޣe)J=y+*ꓚלz4' _ڬMyl믧ȱ1ʱ1˱gϢ.Y-@΅97r\9sG9i8r 3hו*7lNsWl'?7=$?S_bz?ݶ0!=ٞ#@6SМ^pPkڼ_HwYT|.-KmN6=Z^yBt.^sR}Zw)N?ʏl;%?wu|^ǧG'h𥇺VH/tE*~Wfc?kyt7P~#A/Mw~+n a4rV]}ʇe?t :K)|VONoOw4dә\?ҙ~?33CgJ)QxHG9=y. )kӮ5_9g?~ŧ;ŗ.i紇77^/ 1o(eij@!sNBw~2gDvq,"aʺ#um'-SNPQ Y-$xiKs?RS6Ļ3_)n\ߢȹ+H -K/i١ v+ vw%l=OvkQQ9 F  3Z{9/W=iD [9 9g$ېoe;iN`0ЉЈaVLU"Ĺ@`)vu:e aPΉ`Wl; lo+s@;/+X 6]/Lg,, u @,+yYΖXܼܺi,{^KX |vV0gb`34fi  AG9Es3XDVѫO*c0VӨ4&K4=@&C%`4rqJ H=F×eȢdQ#r(d؎@X/;BÖ@&@:K,36 Yr@k4dZ`X,OX  `m}=,US8p?(e/- u`=40e-9zo?bX2,X `ed/;v, t (]"XsS S(1K@[ߜ ,Xl~ r:pwf`8$D+Rqe?ό `0mV|H+OuV)XsN@@@49-M*)ik5#Zs@ =>e5=>y)2@D `e}OZE]'2+,+VO(2K@eB*]',.u@` :[J~B]- +X+V$B X@pܨ `UCZqYM `WXޢ `ʼnz )sP?,@0w+Rmgئ`5y;h<pɣ0@ `Xz$ 0hn^z- dX% VX/GR-: @!`1b0+,:|M `mCK҃4dAZ@AÖf8̝]Zp`h `# Re,2H=J×E 'c G)@%gy@0rq8@& Zy! JgH?XZ@0zIy<6`̚4z)0*0igCo= `.XbKZrM}7Խ4ۉG+@ 1|vVyZy=W%Gmveв Gn}S?e GB' ƭƲhdמJ_ɯ_ =t89Cu ֟_J/:-_pAY`n\g@ ßs 6^@d3lﺅ27^,≛.D9D 'Wn`6%;*z^[p~;7Rӹ DvzpN LAmG{Q!4y:|YswiӮ-trp6]Ƞz$>8zҖ+d]=S^2zCmz[8nz?xo~קh T7@!=!_Ri54j~^:v;jmhK4a9 I/=Yv"֫R# `hERz?eJJNSPun<-(@~ӡ [0x|ޒ;1!h+hnճu MdCB&xRHsb!*ȦCٻ?Ҳu+MSҶY}K9|o~wѝ0rk.9D=eui;o*XPuۿ+8v%YjwI U(]c6$UT6Vy`kZNןEZ@3΅@D{OuG&-KR6XY`V!p'ɠ}72ls|c>My`uCHHHcԒ.ܬr PD \ m?ϼ[+:2p3\}`z@QLPX`N @zMiJ0 M 2o6i;r3;4iYev@_{Ll_"9a`WchwP;%), 7E%4|8"06ks.{i:l-ʱߣ;E: i̚&;D jp!@ mK -Z=HzSTJ^:gPؼmCN V#>6u)80:譒hp@S`pC` \]wn;  yo\I#)(lҶ ] lMї՚>ۘ*G%($v~^pT1jҪ00u.4z1F5qlN^Ⱦ 9h`65]r{ܺ.-9Sן>ڿRTf#.1;6/68:R&E^Xrpt mAqM]2zN^LW =pn…fŴam gtaN}#ʛNv;ɥۂCu{;ܗ:~ۏ_#gujTaW7~V;ߣ2ޥrUU^ZB T/2"eS74G.?no94l~*h\0(ʼnA n- M9r_uӃל}qL3tN4}J3>+֤M)'郂 ]waS"pE~OK"ςΏɍ { *ť/\0AeҨUk25s[ Q2Mt.Wp[5}vVy3V4^}FJQ+OȕiD1Q [v.=HC!9t>qѠ{h'%LI_S[-;k3@}Q49$=5uB8t_F]ioy|L3g,]΁ 9'rnɹs?9 ˹stk B7@zЉ>@O) SK[rX.އ+Qʾ}Bv^;.Ӝh4ky,|oz&8HVd>.9F9V9f9v Y3g(U>|v9r.ȹs$j} PoѢCwMΤ%./=z~@ˏ?G#-+l?5h!OBoCo_CN=-TL8T%l#e<4W ƭ?Oc SL`q;z,9a?W$Qc0=W:moVȗM/u=QKω]'WP erV.c9\y y-u{ @S[AEIMQA@ |Av8>|Vȹs"FΑ+9gs)T@#^@o Kݻ{/иEq";2|_^uf:%BswJ/;|o::i6ԃ}P>*e;N|63wZ?dF<{= NY~)0I=V3Bvh'C.0fnXx VI\ISY]>4g@>9rN( $P^ҷfCgS`oWؼ2ثOj^sӚg77~-~j7i^#Ǧ}1cc E\[΁ 9'rnɹs&N?ysy'>rnɹϛ\wF@ r^~\ڢJc:r8'jsG5]oӏJ?aCtq:v򱳧$/ϻJyRZuOSЃ-*pLsx6:6o~+w۸IG$/u}|)wѾ~1.>>pSAߔ1l{Mw_}i.񕗴Cǻ 5oy[.PM>you9yn?OlNg lt)Kq] T1GMhEͣkmyުj)9Ĕ9oK岓T Wٸ#Menr-=)Nuh;s:|}v=B[T!nٳv>H^2?-uUjr9ނ<%s`)yp&$W(g=q%{l<'D+~+ W (? SǮfqr&[E_ujGݲe~Jڸsj6̯_#VoLVmeSiVWsM[WsIlxwL K?rRӟpRCJ$es 8 }w449_ܡȠl$qP:z 랻?K }4Y4V=^eN%kZ2;Mvy7kpt|k^s,^#L{ޤ۶5K\/]^'͗o/Ջ"ߌe._:W{i>$ /RcG3^1^QrVON9~{:>ݧ3{P_݃C Gm`-rOڝyo<6{;N+#h}:b6'.>!Z9@}&q:d)$%k:iWEQ2Л#ʨsW6;Ґn͎n[Y=6"DfW'=۸}@{$Pσmϭ`9<~}}CuS]{ٽ߼=#Y]Ov?mCUm zVQ-(+}O4iEmi⭔'o ':˹}?C }Pie^GUo;IłvG@ ʹthlIucJPTq!oܢ\dmS:Ԝny\Pkm<|T%9MxEӄU/;^Eb)y׫,KtkZ$+f#! 7QLXn{yVm[;vqh>m#EuWz͊zl&q46W[?1P9YKd:fj: |nmܾhjG>ȳ@G5t~'S~NSBlXmgܼmCusEy#Mm|N6(a/bYL^;է`!7k\רiKvBfqafYPkOlpVkZTqƁK-($fha@s;tq^kvWKw8Dm1a׊֖-ڪdi c~nu%x{X[U8x|OAkVk-/yrgXO `s3 |ݦE| {"ۇyZj v4q>.|VEݞÅ]џIggo?6- Lsf=qvvKq?V<(*1B hXU{è.ߣ7M͖pXbF3KibV>3SS1fɁX+?^*mp%&OS U!|H%OOғ0|X\Yۅo5+r9Ү+EӢ~WMunx<|E^B$ ʗ7Shy [nBbE[;@2̧YE/;4@Qn>iyOQ wkQ5J@mֶ2jyȁOvH݀@|U]TH=) )rCe뻳1$I%"3SDz@VٸE~pqHJTZFnޮ!݌7Zj~YZƵ%Q[ϯj?K@"(۶svS@Mn %ģ¶vmy (9CkV%7ϷM=ȀLg2fK[-ћ@N(`'Jv8,۸r\HI>]KAENӗiM:N,3^hhiuq![RAtj>rEGzW_^q$p: lo/ *M\WU|lO^LiWAo̓˨VV)%2ҌkjVks"76}ox倲!+3i4g~4Aಒ-]~DuD 2wk ٗR8{K/_Fp!ճ$6ඡӰ"U^n7CHz\pAŕ}m-%905Ho5(04o[zMfMZf>z\NX }Pޓ=ղy,|ؖr3 ;9ȹӣ4G?FY2mg:MֆU;+-Ɲnʾ>ϘmfqT?@oP@(CL U8t.mgp)Jې 2wX+U?Z-7LѴ:t9S̉WsUC8 w }NI h54bNJ ~}!A@[oϚnPYIe_3nO@ZILEp/M;gzE3eZ501i$@7Ʋ|Tѡ~.ܟrdA{%;oG8\#tH/H0du7 ,aK|jnr|$nί$vr}QT }j.wI}y}:hv.ܿp9U#&pY)PJRޣT$in㗹{ `h\ފ3ge Pir\It0 =un֎3 HPwR d^m*, rùPCcNr 7#6)cUM ܶToa̗]jƱZIzcdr#8\äx jUu%q|HZV[ L++4%5bzvи>G. UJ2i.lY96jR6Pk% 0t]A^ 2,S p?;jFK שM8vqvQ >V#xCM yKЖv[2psBbq(g^`U:%x-pYKsu('yT_FrUzx Hh(U];-şQ^c_[d`\7@7:f$d^ݕ1N4lomyB0'm\UU;mnOsyucx孂[RȐTq?蒽?+j8(T8ja(K,Dsܮ_9T3F{46)†(- iU4- ]ˏ}L,t W7q<Iِ]^֍,mjS٥zhY 3kq^}&o7OD mqܬsD`<Nd?k;L]ݟW)\(a syuM`ȗL|OޥZ>Lsn6uUhnXrw* 0FpJ Lwl}R}?]} {ue1EcT+d/B`\7>-_}zEﴴ-Z1omRA9c#Q@cU^qSϣu ط-U]x}fyiV] F?-;mS^Gs *Ɲmz ^q) 'b'@oP^n a~,dK YI7b@YI%*ri%*GNYB-q*F>v&C:R@P'늴 ]CeKڄ>]"UzO¥Wg' R1G,^8Pߥڟzሀ˼ZsίgN&p(4{_f?~f o0K >+YѾIiΖ8?(QI[/q [w*{yGtVW"FT#nH?PUSBʽÛYuKI 1Mhi&G5Mu 4W*'@.+HԺ r9U۱λfGb~a'l ,ϛ/L(8gUӬ14w7<R'G 0qZn3پ9N{Na{*[\^o aVAn椪D= #Cɮ_GjG<.aw/>'ʭhQSKX?U K"5+hҲrN@NlTnݬ8@$Kl9lV(x@**oyȭlx5;.$iU!RŸmG.=7ej7@. NZPO5M : S1bqo_-{(QjVZ攺go;흣 ~d0wg PIq wWz*+ rPmfCαNpjm`y-WV T# Hq%`_ᾙ#(/;Odl7}-1} K +dG NUdW.%/^Gv_OFdY»j+}-[[jV'$3;@o_2fcʻlh H]"Cǫ6$Pz[U*>g%mA2KycnB: DZ Jx,Ou(fޥY{bn_},%HDQ_ymajՃJWLXH%ӦRa)rþ}aIF@=VÕ'n`'ggѿvDFClψ:ja#M?SrL~gH[=in' LvmTnw XeЖ9ԃ0qYJCm=*vlV' *BH"dP[Xs,'TŁ$i dc<'F3͡q_-j/#j: >ph{@| S-^xaU[ <:+?\z ܩ7Ʈxpr/GH(e{eL$Ӥ5f{40٦=GRX'RxW)UMCMO oߏJU(MEJe0eoZ}PnL{ h_U]Q0Dˎg'MQ DdU@-[nT:qNJfmY[>&4% \@>G%NxU >1XJ7/vqY)0i]lĔ|%yOdDO@sB_eICnx?LJ>' >,"jMH)W-oV#[u 5B1-r`L +6Զ@Nk9\~ve8?\:22Bo]s$c[**T:׬TT+ g.xU[N¿xvzFPWL+ѓ;MpoUYm1{r'ߙ3{MřcU%I_Fq'[ۓ+J_֠Ewͫ?װͻjKG#K#͛ &`?rقƬ> ЦO{'ҔttxK^'xJV|7G 5QSew ˪%!PEįrLXPf@9PC9پ}hNK 0PaujqЧ5juQMneo7j5@5wikKpUM|dm$m=^?"=WhST:aj bh9WU~Ljt7f!I(Ŵu|qBvv%*q-iZPA5Uq&W UkeUU4JݏyY^y*|* 24! {K"`Mg>)Ҡ@@TANG!DWDU6 /axmEo;'TaH-~w%UD7@Pm_:9y9_Ub`XB ua|k\ rHF:&K`V},!TcU7ZvvC<[%u:E=Mqt,|"7)%) dLkb+=WrLMu'R.c*Iߗ6@? *r|}3 H TR `/K9ڒgĺ#MK-x%iZ߅y SptP;<'']@@A9^_L1)0Ph}W5+sRTA8"'i/ 9&]ŠV }{fjj ͲoUjj1VYr b< #yTזJmqNҨTAARi)q$jw(EvOah! D#^Q^ gJl䁨V9y|[ʧ;c>o5K Zn;x K+K] TuAO 2+ӏ uӨy܉7kS˱3d-ݭw7f+|3䨒-@],Ɩ)#Gr7*T/H+ؖjp1 pErnFPSoZ87uoSYc*?%CTP} 9I jr\*\CNUÜ]GtfM}5A_Y)M[- *ƚ%0}5eSAKBUa{oknsn}Zgi$ݼc$y] =r\ ${B/-i&|"A*| pD=WoX*>.GJp^]M\8n `*d 媿w$sr'm$cuW_*!gT IqS(GD:Q;vS0Dh\3JP\ 0^7^R4r$Cs.tt.`߻Kc%w]ݴ4]WKy —lԠ,C> x1#+s;% s2ZV>RҬwr(bX'kM 9eަIe)uhq]IKv9ĵ )  p֫>Eƭ;e߿/C%r\6p ǻr`Vh0 ?Du2U;^ Wnb7FܮSm܈jI4S>$:1+R* 5JPһw4kI24DdD# FZzεQvc5ںo75*.br4DAʄX'QYVUГм:$qDwy9. d-3߻ձM)kUKqw֤ kU.[$ 9% Z/t;/ D/@[)@Reߓj g$.}Z3~sYnZ77?n $ޯοv97]=S Xݤ_ xriH ^AK'} @6d|OpZUXi; 78̳KCmUۨ#d>gRH[<T@T!X_%hTCjsgvAfmLm`Ӏwګ:P WkFO[ 4O|E$vȗf/L:) Di'Wрmlup iاشtQ(ceX[ g\=TmPCV_WҴ4=e vr _̷˗~B*Qr?w,K<ЕmqUֱc=/d6pzeO8 ˫+ct> iv7E:{.Bֲk=o<⒩8_{M;Yv^R%:Lu`ȦyhY%mCP04tה{#U9c.C-kVU ;́o#qo:IHǥCc gxmRNym~}y2nZKdW~ =c.IrI/.OR]6mKRI@FM_*$âE뉆}I&Bcm% !6i |(i[XhB/8r읲@?ro{5 Sb<ƒaqe=νt\nU Fի)wdQ\=M= fYdSnW!ǫ* 䶶fspKD#o-UD1zE>}[_U/k%P[4o55\h7-P07.!/jٽ7p*). rHeeT ʖ|}mhy rjA쥘F2/Yxyd57Q;_4 nxCp"%!(w;_B!%%'9@3.؆iJHl~b̲Wمb$aad qO΀Ʒb,\>v 䴖 0|wY]U=mBҖ6Ve_OV5:ƫ:ڇPT7 Icuh鵽XmL)8V+6#qDD݂CO=U `X{(оw]ƌsxlfop-p}J)#d,{-Fu0T[eW6W!h)gz'olKUI07f$+^! ¸–#xZ"6YRIU KKU<}LdؚE<ъ0.5`luz&2'+^PڼFFUfiW5T F`Z>g>8 i! }cD N%Z$V&|$ފWIDSu8\灥ԨQ%`O$kI^w%V0w_F u S\Q*%O`qk*LiHie}6qi '; #9-)a &'ri+KFrfEٔ9>)`e*V|Gmzwt[)u7W]F)|mmm^Ṓ M`F+ *F1zJs1Qs丂s;LU;`O66:qRkϻH_Euw]Q㨿WFLjKf}9! 3 w^!F^Q&9{8wT$㻷P'֭ҞtdEL.g-z)3)n`Kh .:BίYa;ZiLNU>2j9/ Qq!)SjB&C$EF e,͙=ׂgN JݧBVܨ~s콟(uZHM0jmeͿ^dIJ]$djrhb;Phu/b=!*LwEwNRns` ;'Bͳ J3 !&Ke2.DUc⟴F+PV1%lc|.,kUUWnD0Ψq ǿ<ׯҮU e<PfF;2/zyIIP8M崀OhlIM6a|!xΌͦZidP=AP%EP!F}d/_f5PAugҌGۨj9y(rǯeKMk]K[{=ؿ7R%!HwI,%.l\E5j4ޭh֔< o\j OhyA1\IR |]M󙝡/Enh4(cZCEc%[;s:Y_m%R)KV XeWe4 AKV?\~r5+qGC^Mф+R?vF> kl)<:$yп2Rwfu2SGbF\_OiH dZkC_24ZF>s h"8R "6Q9-t h 9uFptUĖ>o8TSUdhЋe:ڬnes9ˎV'0Gg,o-bSjP@N( wmeiۡwNeru吡,UZp$L!ߓS+Rn%~k}JI^Z8OFuMlQIELVr ,ఉ:\0/+u)Zue^{?:w6mH;K%b3,q4_"hiz>,k`QdFÊsm 3X5 &lXK1*7>ap/ˆ+^ Ȏ`Ix68"[vRy% ]P(.䏿o*8 Lz~p DpS1EZLWpB+$B&{H?q$yA7i[O׭Ld%?_m{ϊg{9Jr&1NS˶5352g"G'n7ު|e6J$k/XDk\dE]˱;g1@eӿoy ' 劭 U79Z%jI3}$uGTw.'_K"iP9 D yMqRjjC]qbo\h;Tn\L/ @7cxOl"NLIܸ$ͶBlbRWͼL|:g{VH.GzY3w CڔxpQzc?XlbQ"]0[ 6Ĭ[SH /sf;k˓63[+ב@-ϼ!N8~; fo4t-Yᙝzm4=+v|``ҿx8u8 >h Ӹ!f36pKFKE31A]=N'SJ^Y-VT.E#g\&_ĕ t#z p`fJSk58 QOϾL6m,#Igg) !V\xul6#òĨ~ ո0DK-dic,杛,t|B}6ڂK97Qh,ỉ->ϳȨ(1K]ivU>/r3~ž0tR5Pp0x}1t&t"v$e bmF| d(ï #]7GvШ8s9N9j)žɬ c PF i/.RTn".`H; gA ߯:v=ns4(rX%q@.zxpo3"G]}p{PZ4#st噧9id!hgQ@+62Nn]n >PԼソZ>(8LaJLQl+<|>[,":^5x), Բb ^?|f`.8[Ykl@9&|W@ġv._as>Qn wjX`ITdšjݺ1)䋣,XFV*r³9pMtA*Q1w9D`BX qO @kP*iTyb^psLkTZdo;4V'WZwQR;G@]TMN0gj)ч.%1pa83]d"ZZ equA Ԩ@*ؽk d~ շ}GD]K(Y`.X nG]8IM $zɅ ar3j62n6``l% ^zrۚw^I'aogl @z&qcI2_SjWg[Cu`w/K7t/-D3Q Y@SN~ӹ>AKv3k~5Y3S]8_\/+~s |'sjr$w 70j6FdLm#GD+}O^µv M۪/^SeAċkZSww@JRAG;?(V, 1t :d:1[4V@je>ӳPf5N3T~x[A4DƈHe}*uفu2R~ P=M  1(.n}|Tb-  PAKj xS rوK^)7rK/+mpt<L+xm8~˷q=TX̋5uZjLpټf+ w'LXyM`otMra[6&Qs ߇gc8%:{72 ϝ>MOJpT3%;AGVq.` ΊQsd6HeV ]Q Ϛj^vϒ#q5*7q0W{b@0}ȁf2Rq8hZ#Z$El3K X8=mA9LDibBr61 1byӯeP} 3)qiTxn`$B/)j56Lzso\F$;Hw?xO"sueƏ3 \75^9vtyE X&ew3x kǤ__p๗Kl=}bb---llW?c;Z,Q`{U)h#+} Om%( kgIl ߾ӹD|܆ݯwJk̀2Ya@jk  ce#K(e0nf0/-&CC4`]TfFO]f*v FyJmk+x24}lۚyA8SQᲓipiځ`1{)$`&ۀVdqou'ǂ+g8a.Qv;L_g&p>!lq%KRAB@}PL`-=J(̮ZƑ ~, [HYi3Hf,([(5c_i°qLQgCh)3 mLO(_ "02ǝ \0? PpB4wQSStO>~c){>*iD,˙<@d-cp+kJ|ROUA5 YA0`q,^cxcXf D@-/>;u$ڢCrS0GQC| G-̣aܯ5lͣ:>D9&V"NGX;!A&1yP"?P/4 DX-7qwGl)ڴlS7^a^4ؤ; nbj/]Fnsh`% 2Cj>yiIGpѰLk`ӢViXfmnB'QUL~ h/ >pm\%`1 0ux[ roȓ &})v&ؽaw0[c?gyK5L1qԣ?AD6^jneW{f$sqtٞqlh+ܨ]'lK= w `=I ܗ  I60pC]r_Bn_|PO W83ySpف&kZfE]*x=v1 _"N0OB3bRpGLGd=A_=1pլR'PR,6叅8*I7`y`SakqZ玔(_udGnzd3`/ہn t:2,%VM*e j; >t9 oԮe ?;Bvۛ 3E$g wȎ)DevUFTnKY>PZs\j+/ 0c7YC)NhRuS.Z~w0ldM@ "5l^Jf:XPEʙ*ϕJ-Y%֦ :&da6`l>y΂^eGdFen'S(BHcKo#fn\*1{bդm u8T~Nqqn(?4}Q]0`@%~8c? ?hL`]8Q_yBmĩk!M/1sU]|VE dT)c¡ۆmnl/ d~kks$p#$9@ί\ :4,6sIЂ": $Nyej d[Y?6K oFf@O^ fGV`i22^X|Nb@@08ޒNV=`ҽt7YL,=#(kx]vl. ~,Kg%_}59 ߷e^yiv8={rϽ+vpTa[e"UY̹3?t:`hA.,B<ַ& M2gÝ+ŭ{>״2e*<C 3`36QiΑ2k}E:lR6AǰklS}ag/06\Eߕep~wy= @ ɵ& $OA5҄2>vHDY }d<NvQСзZ;ޢxjuhoiu拨S1gv#ot[,:)bsg?=o>v?ɩBk;ɴ*3?#n :+/怼,hMz!jx"8]8;c/ fzG SewKIow19gocC#-J}{k6j#!kU}- thˈDy@$U|c@? \s%N+~j32V*3 P\+bޢ+Ev gǔ]*>q0fMaD{\-CmRNS%~k(Ewb j :I? `U΄v]c~E M w}툓؄E6ڵf%5Pg$#h,5Zܛ (F.Tp"h#a/q;z`wmv e\FiVHWc"A$p"<6}pz!mwcե1JN١e+Y@$~߱Ͻ ˾Pxw,{ *asVr10Vd kX%̀2>?b */5Z'N?' Ό,ExX)ny>x]CbC;_l<҉mЮ‚ذ3gq).~-^} ๪SpǢE */N萡Py!kX\"H hiHqge9 R6lGmf@dy(u^)6k٬kB pb/@.iq]҄Uv;n$(+o>O%d Sa1R Hq+Ϩ"1, v=݄Ygz<] Rhя1ECo p4AK`۱.`ȣ}~tH )U]eT YiϚԕͩeY;LNx.^E2]3[ upO$JW@U׳JNC#hz};oC9XD)?Mֿ5uY1=lCLR%ByzmL*gn*)@6@xq|HE].+adnn@hHK(+[%qC u)1X9 madLqNEꪍVv,P5Z@-T*)`)&8.R9i TaXJ hP$ d NuCk9K~.wM%wiTJؾxD,OӭAu X(@*q;5?.m3 WO6 j.U/K"?Fw7Yi 0r+LMY LKCi~a.WA%\Um#L9hsiEt XVyq,CFaQF7FQrVϋY)\A@_Nj(gᇯ;:WZѕ59\9myF\kwCa |q`Y՞䫕4? t׃^NU2% ^EO2F{4S6Dk2N3CR?/kQZQY'Í\Zy<ҽ1yOW Zb:F> 2tr-kX[fTsqiZ*}Slf1b>JV:z+!XٲᎪO4,]:kܘ 5[u<.&K,Q(mϐ]yFp )P %icBx!,I)@?&d[xt\j1nq`/^5?0CM kR71!]B/en[O;}}o#}rƨ3M1SQOJλ &!\k\1w:w @"dhLQkXE6ԝ(\A?K_#~36@]͊CG$a{O( X%R/ӵu {w}1@s*<7`XݑXKPw.Y1H}Ϫ$ڜuA%?313^ jy:Zvh/`Mtr#ջZv&}|nҤZrʪš@V^\t%X% 맃my͹MiUZKf ۲, }FLQ_`C7Q>  0QlաsT`{9?bB=bH;uPt{ yg /m~ddJB{hB7$Hr?L3zi 3={ -ZDE)+9AՀ Z8WIxS ^z{ jP=4d(Cw7i-Wd"\݌n] rD.e)aYәl?iQ3:9 &1su4$Lo{I_H v5 ,o=w^pOJfנb@HlhM DBDZ/Uߟxaosd$ILLfd 5dʁkL>\Tm3-`[ 9Q$j"OyKsĮ/!?OY|v "XmجeDAN?(WH DgỤxsT(G{%Әk`[)? 3EMnlB,QZ.tJ,l@ۮIJ;j-YToU`I!3] j4 Z8 q̹Q+ ) #)߈>z_|\hoӱMS `/.0y{cq wD:yx!3-חU[kzOpx㷈Ivdgy'@]z3IR7;2ҩ zdtX&k#ZT@6id_0@RfE joX/tWBJ0䲋_A? 3 5&,1[ P؞>9Uu  I=]'(|dnW0FA( p܅&O$^|j^99rH EA1#疾 é[o%cڤyC Q)TebQc%n$o:[6kd0)B̕C*Tgt?:(Gzͫ-,;\jH:\]JpaM*) OY tJVXrq&I ~Z6Tx9 fG|[Ӎұōgp?: /x`ԔߕZ|#Q}W >7Adԛ,,ٴ4pz h{1ML~{V@!0݄drFEe;dsoNbj-HڂZL.O\{4 ̽۩\dN;abDUn”@Fx"n`=ܒ4ZC/Ϸ F'v= `W, ~dlnK*pB|HQ&:عv L@ـhߩ,MZ@ͫtZF B@,M^Oxo\ X`X  0oRm+[\T)\U>w(^ i ]/& p?Qc hfMf -Uq zW93=v8i8ݓҝNN@2#1"3]jAr&4uP/Hx ]&c|ˇH"x )E~##n2[e^OA(] JwDufwLCLm\ o\sa@Q2dX5@[nX NA5tp"ZlH+I{RV-eaacn]qysQ HԗNp/  RFIө٩zIZqnں,_-m76,^jC&`q0!ye{^&LqY9 EcE%ٖ 8}~/n'Z?RIiS/iX N^lI* I0dy쏹 ^rx(KD<B䥚_}+kO( U+ S1ke\6g P"ϩ @$5Bߴ>Ժvm_FHޠ&jfh t~[@,S8ŇLm%+wF{|Nk ٷ,ϋ#Vh_"Y/ gW8f3a`y($K 0vic}ؔʧޮTr y.ukp@_\znU][gbuN;RhÀ`$WdxAdGRxO|3K'=+gްΏm:9<>Iy{g.7OI*f^ZM nLh] ]Llxȇ%|BDӒQ_[OTbv<:*9}LSes̬z? glYQlEvnd3BAUBZN> d5\@f)dۄxs/=&}6q}b۾͢oNn2)44c+Kw0"%  9ivUY<ڗW:u[V̘p(/ޛ4`6܏]I]PPKP7bػeVLi3,p)PFnf0={@\`ut^+SݝJl)CRTׁ +a2\&Z,U.˜;]-<@2`#֬Jh\@:T A ٵY3g_Q+ɧw}8pdJQ2ۓ{E5:0*.at97a)[ D+Rz (D Kow ȗV-~$<of*jK:pO6 z{ R`3 m^5`TLA\9(;Js@0jyom\Y ұ2uN &3ZK@H fϋ/A  36R‘$hLn}S( :e;W,%~~*rfLu=D.P--jza$-->kdVeUm`A iJ:- ԻveE١-vlg)VAݮj΃xImde1OG2.I ( xH2(5]'m I16Q q)cR}ĥLdͥ%Zsq߹`σk3\̒@6JT.TT=/k]s U5.:,Lz╂9RnT;Zn\QE-f^ AH[Z& MrU1IjR"%Ҝ5Mf~tMvJRs'^L+MbMݰxY٦k|/2|-URˍ8[2:7^ bM:|8UbT dWsKQz!XatF*]e$0}W93d* @lD0NWK'.4q)0#S/ C{_oMe)S r Pjj1g!y ty%=8+$X3tT2 f` o_7yE| pͱaQR$uݤ`U s5\LjaN*PGlyscsF`RQ5DJ&B#hcҁ 2Q}$HVHxW5s5Ȱa1Qy|0N25Ոg:)+Zh:S}ҫOB ;{c5 yxyU  fbwAlY1[ߧ`|KpZ;d(ٹI`ptAFG^@'3 >9& 0\=t4\h<}fqe]@U$hN!mZ@ ߜo[ 8.&/8t'ނ~Dm@0R(%e5fH^xD)qU^;379J֤Fݏn+vkr~w3Xkd;9\^aψsP]ǒ J'dSAbc#(:.kzܳ9Hbcw^\Ioޘ2Yf2}<x (2)!X#[ Z#IhNkN-@t[09DQp2 2 k>ҿ Cg9msSdܲ;\]t*#4'gp/6tpz ]wf~{/sR$[_@qZmvPBi:npoqkmgDgR"GxLJ#Z)OV,Yu80Y>૿U%ހ"'Z,fU[n@ECF*xߦWyr)v穼 n 5JbD`K]c/2]t zJDuahlO.:d-r*BԈ|UU㫡$?O?z.8f>R; 2\8Џ{/׿w1@C,??@RޛH:, ]󷛺eWSw3s//1IV\[ JzV&(l0i)Mȍ xڪ 8tӘh_;z7X^:vmnU$lTatJk䃀j\=/|FVX9dvCz8@d˟s\! mt_Kyχbnb%XLDͿʌ4Me 3s7 B xuN\M֚2=v95 Mq5ep@TRevwwDPv'AsXk5x-ZSs_Ɏء/ɛ 6>\Qz^xuPMƘ=v ݽ~1`_8*֒Yc}l@Y{g*XJ@XK C `st 90T Zװ  6wqփ[J\'vcQ i[u~iT^4&3,U=H?w" @ڍۨ'@E[EWd*$Qt'@r,1= 1{:iѿ)_JF_2ѥ1em⺛iò֐rÃDdKE"^t ;ǚׯ ЗgG}*4b*͢,J1 0D'c%) &⨇!ѻu" շ{{9d` bk }:LP[]Lfᕴ\zEdS 9;[E'ZQ@D}O2c2ǂ%3,*d#(ہwlp&em B0ADtX$]#$Ѕ02q ELdi{lҿ}Fi>L?Cnvr8,GzW>0L5Fv :r0y%sc"J:Td<N|1!ϜkLpE:g|(*+ ڿgzzu18+-5CM>ez_q\LޣEWISnH;:t`D,#MY!rzj{tFSUY'uch-nyk t|D$CߨozӁ|Q-ƿba\5Ep J/$f 'D&$MɣH_eShl~QKcy:f@rLzdIFJD.m'f7qDȺJdѽY%sށ'6q,߽ޯ;p0yb̹';"8pi1fF @߾_,}'~1YdȘLu1 Ymqo?9$4`y,#ձ nѶ5k{v:6OZƮWC I@zmPht3'iZ߲TkQ!GCXKGD8i@8 %9 1 zO Fk M' XnuW /sy\\iMc+(@$¢cb~y8f>v:K#@oX&Z16?>@[: t IPebh0 =[5;]Ljb&Hx+v?ޯ3ۗq@Sׄu2+LD~q~qq!q#8NN=|[߲^U8>.v^3,wl1mݺIL~ƺDhn}Cmb`hZĞ#bu=bn`Dl?%v1Xq8vezO}Bk;5mĶkVԉ-7 ZٽA ^OצR Dcyjѷu]Õd4SC |%Ip3\NpnzOןq:[5>? yڿs_$>gO9?Z^9a}S|*O,D~yctp?;~~nm[~Ǡ>o. 2{߃̘g^R#z> k5χ>E>1w€,r_D9s}`GP,jyM @k& LQt7@@ ڍ5k9tr|S F9ppp< sهnmpE@%<5.?`ب>]ĢQ4;r{TwPMxĆ]7/W+VI j4QZ|( >xg_k):PEtM%w\ ڣk`lqQΏ_osw4 ⵯy +o>m}{o_d3ex^w. ~s\'y}A5iSϜs@/?w\|秜 ϾEuΣ|spX]|`dkO,5_=f*ձjZ=fXKb#g=z~pB&cu-T^Z;O 2S]ZK鼯%BױǧK.cއ.HYCemޫ9ΊG=Ësw /xZ8Os,Ϻ6x; ,?䝮ȅ;5x~Ff,>w罐3cxӱ?&^xhz#.ASo"&^NGWa'o߿iVl05nyvԷ&Ky>1P͝~T쟨9[đ7#+7kb ADd ` _5.bf/c-`es SQ7mX`We(U` ધ\tzdy\#x_V1| yb㯋,Gdtw{ȁw&]Z}e:KyAlX$T ݥe9i?ƺN;Vb=b޻r/_^g/1 Pz*] e2:}-Iϣc>L`<K![ŞC_IPQ`f ڤ/6] 6БP}o!*H7n2bynи}0踧`#͇19HrWSDy Gxgeb @PGw ڌGVjqK$>WXk/de~v!nI!fddJ¼(0T,kQ`r,v8vQBPU|!l`An`x -FPpEdAP;?;A^[(,du)YXLC7k.9v$Gbc NJ|,(^Eޗ}/lc`!e U˿C V8,n<[6/{Z.'#e \5`ss6bz j t~d߄Kb AAl@ b*!ǘYTl#O&tx P߶*6zL7зʴK/uٞnA:)^kxU%kf@Z3_H¸ [[B ֺ CQ_\t},vlZE =Fl7-vO7fҽNils).f%PZgSHc>۲V9\Zx{1} 80*& vW?I%>֩(C$:8 0`o֒al X/_>,Ue 8hr;QIA}B;-Dj~SQ&/d=#ARdS`{EڼNtٹfIFP(`O>mt}`.1Q5^(jUa'Rn`-q(%E,sLH$Բ$׷Y0I x 0 l5!Pm %@GZ)?O<Ss@CMG\wwū'̛FX)SxhZc[Trv 5Io{)1kat?&6pX#Y@|"SQhV5=hݻG%w''pnhI0gǶ8;y2 yVVJ`rTRZ_p4=dQV?R]w& ru\ I@H1\?َK@+(0Q&_휗EIȒu g־L!556M ͵v-LlǺhyΜsy/uKL˦mqS4w I- {Yn5vh!MjV䈨~b'k"핚2h7K5\ l)LCG|O^DRϬLIU =(F2A;0@f]$ܙ7yXؗcp&`BLl`l$@Zk6D_$&Fb`WG^ L\ hT'9tO?{E,A?VH^O`P=ɽy-Z~y3ybۼm5]B7U\dX+czcS?@`p#w_@Yͅ,\a(Ym>m&f(Mͱn\ Nض>g̅\Gflq~BZ* HI?` 0jcrS^}4K H׵:+"%{3uD+rNtR[c|0ѯo]  "ZzK9eUK\2M9?@" 5):6< aM#=KygKeԙd>S :! @}j4@^v[ #?_MlkPPݞ+ i[o_i8]Os.V2}T;b3Y3I~ rpvޭmb`XS %6$|{zIh0ک4Wr87=SG$N3w20@/hMDF;uR{]9s.=RO}"&:b  ,@RW:vƫjoj4'"vFlhgZ)*Xaf))b\w,NPg߷gP&3\ > ]3lR[JP,, Guo 2lY}GnnS_>7/{UQB_t (peH}GT xs%;쮑h0^>Y{G]S5s`wW!N#G7[9hNzc%I|75>{WcbjԾWtʪ%Z6HRyeWP*/{$ZCևAHMOVZXPR!5}G잀/xUk#/5ɋdz ԰2lEF6g+t˯?%~qి/3N;av!!b9]0ppk,9nӱUۜ"AX% 8}JS\賐ț)V_þPbN}Q)3٠k قWn\$ AY Z'ޏL²USz܎/ fyZ){PXg>l6 dm JsN<2q}挸blGkpH%J 4w @* a6ݮ nQjıR[O :~뚗uY# ;d|O3102m VHtmc晔y6-8F{{Xz2K >cu dF~P՞y/O#fve{^*;h>9km1&6d/d5d)*kJy$ 6S@d#ql_%}[RQhum-[A *wR3@gf 3O,%H!k^'ܚ-Q[QwIDEJo:N<15fjU/y @E2˓g#-4吊IqQAw Һ~U郀/CSw#<5& O[S 3P! N9{X_W.Ֆӳ53v Gwٓ V4$'`MFO4(4 MȬ l̈́SeŀT{T^|]i= F^v  C=pbC j-z1>-֢g#͌:-[Eux8L6A-Rqm;tZU"l@L~)Kmc{Z^c/tQOâ(2ڲ@eд-}CۺI@Vb%y@ ihK# C#/v=v(tGPp;,\wpjL&n^@U:e)eeJ_S p~K}Al̹H8x0}<$@ЮֆXe~#W[c?;OhVvH0~ ]^Y0UƲF  I7 :Ak]MݏY<)s=t{ PO"|1 &3Hg^acM`Ml."I5WM6ʼn?94#?EDdNn=[[|+'﹠&Ȁ_Ot }mvx:n:k!Hd &m/GNS;}ǺWYS$ A uPu?^~ BIk^hm@ b, xCkl+xA˯lks LhBC.W,laDQ%CLp^͒n%׮^IkĎzcيcUy 1)`]/F,SQ 8n.~7X g.jS@ @K&5%f#é(-G?,ʦ` b H& |A_ _ hTEC 7bk bmή@];;bԳjb@oʟ亪s̾O=,ͮY{hVh$˶dyvl0[J  )*l6**6bUI%7;ݞׯ{~~j^v{Ru)Ae06کUn,K(ԓO?-tSn@moS ^QXMy49Ngq^{߸;v;|7wMg_2+ xGw{,] h 2x<O~f\R0ڸEn>wLv񘛚8ݚ <kҨmX+ry0#;Z lȸmhCl]{vdڼ$?EغgWl^ +ϥZώh2"'t*ߕjN "*Pre7./rޣvjg ya8B ~+DוN!ǒ沋Ÿ`K8@VP!Ch Ty`PܳEU/!nx?tVT>@$JN0 |77T%d>f%eܶ5%o$k`<VRgkPo$],WDڂ`i41 VwX,'XdcpšʦbL|ne?B, [֯xAW|7_q%ݥ@RD߫s-oYV k/-=^Y.\mtXqıApTw23bq؆v^x_Q ۯ[ d ƍY@˩>*^E{<ߝC4N, @^x]>E@~O~_]?7M">w[K+?$/?מ~s2A<<0c|8ҡDmkYUqn咩Id & (8(01)79<ޖ' &dN7{Tm*$G^4F_z֯F4!RPD`XZݥƘZ0NK|e-jhe5сo_ZC2x??] p19%P1fdI^Iٱ$K } |>l\oDAYVؘ"+8rq\5B`PfTc@ K{*jlLuD*Ч=S r&_bVFF }35YHkaMۿx?ߒ GW1!ϒK@?;|;oUI0+aXXцr<._0C+{AKOK 96833D]ꠋ*Yʇ4[GZ]Е8/LC/"=o}_IſN;ZH%WUzs+`a {*= -0xvP`)[]<%+>akN`2f \U> vqȖPVVxK**%(b@1/q.!o@.j-JiM#g.I}v=AHY"QoWbV)p1T%F~nUH㑾 pxy!>v[z~(o'_3gkzZCĨgϦ"lT=JhxjeJe@]S@_\"/A?EF@9j1F̀^%n-V? n05Bj5WF?fEYٵ>qKqiaXۚ# D6.UUB6g]N6xPiV@LgKJhX#I h朇,FRAZ{O?Ln]1^H1.<c40᧋! -+P<^؂X)@G]^/}3oh\шC([# @%/:6ʭDl~줞 {~ПzJ< tY$ss=x ƥRom*/a0nzBZ%xU֌mY5$EυN(4oe+U Y0 17s@K4#+W1#]}n( @U}#'*AHGoCOJ'֮,cNR g7 rCH+2O庆"'Bj HE9m@}ݷ6@ @k-1ǜnYn᬴O|)q[L'D76^T̄_1Tö"7)aX9lzd߈5^RE6vƹ(FzZ]+ώˍK̩fNrMGEŗ4F1tz;KƗ8/CR-oV<' s?#BaO$/k{S] \޻ x4} ^Ix ȓI}q5D%*Ǣ@ Mn>tUl.Kqte[9aܬv#atԍ+9bfז,]geŖ}׿E"{K*dRfnN*D6e"M'ET:Z&M>!ɲ)g>}AZAS /U$ grY,_sh᭴pT?5D=(HH{&F8};4eZsFȦr`p0% ڸ;sL5;E{6dI"P+ފؒmŻ]T+*PBp0^nRj ݕ+UU =X%n=yB~݃q?ەEM^WK:5mIFYH&%<ຍoTcnؚuxGQt#̤ faiIOy/h鉈37\8C$I:8T3ܫ39W~&=*WېU&.ݳ.ϯ֢$  ~!11$܇ɇA4xd;FnwmjLHé=Fv<6]G(/|2,:wWzt.h()tQ>@ #U#Nq꺸xm]Ş#VQ'rX*:{<%)--Qm_$uV^>E^]wNGң͐@ g8P@Jqp#(iH==o 7&H$@l\[g. PE0< = TȰ2nģ,y8%XWc 9z"^GJζKcup:!ծWUc^xja5!l0r4P Y,GEj4u2$.Z,Hڴ$r?K+j&~Pna͆ D nҨwЯ^ s9r"kb7 Y-Q`\HD]KLk#&d\jND; dfK_ Γ|  Iӑfd x̓ BEN֠8{X:-)64w,C-%UNF BSR2[,`d<\G8ժ>W8sLpVXݚV(͈2˨ֽPe}ZtX J%q"LPHacLLܮ15kM;w,)+by@ٛ.rA]a $e6I;LtMCܩꉅ n0Gu'00BZC+$ .1 YH؃ >,KkS_@if!ܝJd n}? |}LIR7& /hFn4| c/ps1iO1*ڂ-hLP]~Ҝ5G$f[LLBS$MB@3Upݰ2 g $[WiS/M+ LLVMsRQ!Tq1Zskm3M$]7=Hb @~-wELiF=cu(H?&G* b;L6H JqEqf("P1&L@ԭ9 A*pKly+?4 śֶx;^Tn.7"5F;Li-7tV/.7O0oLOyxvדgPfiaEC&AkwJm@";VsO7J"0H r2Zӝ$}ngYu8 # @f:ҐuOUyB'g3Dr>棿+mmbP@LLyDZhD7z'R[/oͭʍ ii^H!xܐ#^@fU@& &ЁQ!vLX>0`0`d81A`ʘ8-~1O'&\k' d08(V n Qc+ BR+$ě1`aKćn$'D@#,% bg *8N& o /$ql( Kjb><&U7PX:/wN8$B ^BT`Ts ?8 XoHY;P"0>[0!o˻2L-϶km~x'8/0$pcIJt<0`L,h&0u2ȂO!DA"`X' [vdfaHzl:x "_2 '=}M>DEkaycíY(LU`魌#GQ[7thK tӫ֮ ^\`9 ߺ7$PZVz_dq} + sA1++ МƟ #7 @1 @~ $ ESIdzcubtC:Őcnq) LL9L:7Q4z\l= }D'1`0`䴁mf &<ecy 2֏<00Yd`ȃbcsSIc^οFJe0`0`d)wxLr?&L8h& yZ䛡͞Z& 0 F!)I ##`04hl$g 5& #;KQ q!P&n쫶N @A×pܠd5,c0@"EkDZjJXD#)2RoF=uo-%؝۠l=P8Z!!oؾ"'`0E pN mޡPޭ@k `ǭɞ E $[ E#/+2ѪN <&BT'eamdciN7^iSuU5qj܃5n>5 F7ɮZQRc&y<}#58 @ܘ9~Ghb |^A('|?AW(.?@, _QsXdu@fTw6hu[+ݛ \pWZy(~G\+<b F!gQb8⮨=,jd:mhh ]̮D"~ ϑ|IMu}#^fVwdy\F\T?sƋK5C(%(>s xF]?;8\tQ(v[ T fai()30 *5U2qE~->"*"Qzy06DW" @0>JL+kG}UB3?>k@6Q&:gGlļ9<5FsU~(#(K gJኔ8=/Qs?Zk%IENDB`tetzle-3.0.3/icons/hicolor/64x64/000077500000000000000000000000001476255537600164155ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/64x64/apps/000077500000000000000000000000001476255537600173605ustar00rootroot00000000000000tetzle-3.0.3/icons/hicolor/64x64/apps/tetzle.png000066400000000000000000000104251476255537600213770ustar00rootroot00000000000000PNG  IHDR@@iq pHYs B(xtIME  5nQXbKGDIDATxZiTgƞ9# PE;",/n1[qÝE1jdM&ˉmm:Ktc$LOO̙gsBDT@NSU>}፫;_þh|\+{_g 8S_>y5+_ȂG70h=p{U q#̮k~Clѳ8Wb_igԾovڹ?cw ໟޒ GN`"HF;6]cƲt^ Og׶La0cwfyHCOv`_aAλE"4}@q `ydG` >S`p˚spPp ;N\׮I{zk/K~7yO_`>OtvӖ` Kڧv<b;}Q83m}` X\` uU>Ó1e#(^Em oiێ]a2gԞ|z7cq'8x#Ut&7^}5;t IK«f9؈ē ׹GΜ3/7.\+_ _|/l=y(\X;|}n}fwjv;\3lmx-sx'Vl}nUn|=_}#gp-+}K;tS6vC@'bRAr*P+Er/ҋQ2'sVK[d&Zcd'\Tuڣ\۩V&kADYrʭ(9s2 ]5nYםO.Ex{{=s|b@?Tba%̘RtU ;7 |^~2:-g6YgbέJe&[&<ŏ %]Dy+<0V8,Ip<.4Ӓ\f"},\XbIYSñCRw--bHCTc?t\T=PwGxi/ΛǨ4 r?2Beڧ<<[$|AT@ٔ8YsvE8R,:^4F# 5Ob%drEQ%ꚬ$m02{Qf(qu$r+xiF\)/M ]+I92~$vۂ7LJH*H:h@EO]1p] TTIR~indX#SIA)Bh3M-l7 Ҿl!,ivh~mfh-OaNL4,5 &蠟35Hi0W-ѼN$L6iS y3J㺝5<ͅl{^wJobA, [ !䤛(EE6烺AecR^DK&JH4o_)k^#y߰`»gh9 QpX߰jhþ:]Da먢ձ\1V@ 'N ÎF6,a4LFm7 BZqFO/0+{pݰ aI\Bd9 fgx0*WX I 9}G-0A:Z W-ݍ;lԘ~0ճKyW}#u=gz+y.f8+(^&'xGIۿ'u?C%r(DXiL4ITP:+3QX*B&4{YA獚Ϗ߂{6aSj4mGCZlزJlغMuh|t"P}cZ;M~= [[׉r!>xH }Z3ic(ͭU1{TWkL#%- D U_+Di248K $;6.ncn>/B:vIrK%^Y"\5?U E@5I[-5A*+/r#!rݧK}"e+1V˖٪;[$%/\:z=ٰ$ 77f8Kɖ]kw`:Q0:/,`t+ , Hulq iҴC]ܟ b}Ė6Y'5bZ4iEEU)}~MBoB"Mf[eŶF6Y(ovs[^V{\݊+3G`#G`Sj=(I7j"+;9 ֶՈ0hT6N_(ͻĺIx!<ި bu`6eĽo`fdK.~`%ɏ("~Av W^ae lgc@KA`봄DL`{`iB|5eHg.=C19U4ut,_`5Еnd L$/ ta9ݵwqR(LNUKaomxGMs`zdΐ=BXItaerE994#y-"_y>^qcXi5=3(X=ۯv=wn`-wf6FH˜ kgjXnCmq6)!]Q ͂9@lQ/͖`]k(>PfAQ_poF1ryR ߻ yi1z `oMv\=#γ|QK-iڥV ;nm&C0@vS~*9nHv"x:SiZHQxX3d T.zg[h[#ܴO2ʣy@]1x yL2{{5n$n; Tetzle Icon image/svg+xml Tetzle Icon Graeme Gott 2016-10-16 tetzle-3.0.3/icons/icon.qrc000066400000000000000000000002031476255537600156150ustar00rootroot00000000000000 hicolor/256x256/apps/tetzle.png tetzle-3.0.3/icons/tetzle.icns000066400000000000000000016510121476255537600163560ustar00rootroot00000000000000icnsR ic08=PNG  IHDR\rf iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxiluߗ]]]{ۗy/lR iR"H*lmh:B;7/-ALʤHJMB"`f0_wuW7nݮuߛu-דkz3 2d@R g@R gH1܁dA 2@C d )@j@&볦w ZЁ@vA @;?kzd8A @;?kz2L 23dp. ? @!Z)@q?k Zi2 R0d4rRLl 嘟5 . ?2gA^wpnPOz9ޏn Wij?g~x8 :/hE~jh"k)@SA 8 /ZQ}5ksAPL5ﭵY z p(@Ө!@AP0Kk^&3 AXE-RvΌ@_52;ÍYChovWJn\u͍y }q욛{O->VDBD]Bcn#Wdyѹ E+K}͖*<:`NaK6 i@zK#f{Z-ou-ז=Օ\Ғ4g{ !D!EN9}\8vNiypH/NZ3`Ksc_W) 2熆]Vu={џCTfh3Z3<)}^T{7ֳ1`ٍý^s0䧛Xǿ;U㟣7mx ?P_~nj ~fj֕Ulc_QC_ NImC/FH&dlϱ>w-) ?s?~'b撟*D[g!Rw}уbg_z (=ۋ&| e${ >W} 忧WR :)\r_Qo`S=E1z "e໐v`}`zK/gyZĿLRZA~2'Q</JTG9wEʗv8Fp_:M wܗ###{̬wwJ]xm(=P>~ Rkz&P. l >,qz>jj! $/GYszO*;eMѼ`ژZO L5`+n>J&fvP n `\~P:-gT3 (}|҈N1@:83!3G6 ǴcAB @J06$4X##SP I.R2v.)mSⴵ_T3%1  Tc? RkVT32&x Sͻ62 OFTfvDH1 ϳf@w-4tzLcOtb?0$8@3akzz`*@ZP=kg?jf$ Y V`!P:>Ngonu$ᡔ!RB*t$L!JA0@ x ށ@dn2$'irOs@d*m_bnP,8Ej%NN`3%!V2F-,Ø2Xˀt wͦk錈d`pX\$_gcCR/xi2aSuQ=#J֐ߒoo}5)ǨLP6?oh{:S Φsݽ}Exr3Gt|Z_wł++ט [ܸZ)W8E4@ \q?qɭnFVvPڵ5K+7zUvwv7;߰\kçonhCQ^*˷L!ߴZU#8_l. elqյ]~ݞۛ aHK{\WzwSt.f#nn~#ն[ ֻ_р7nn|@(>QidK Xʥ%]{UDƂ5,dAsų.?2kOm7{Y;q sY ΙYYaD ͺՅv&V ::꾱r+媖>7L s/^r75?y%$Vλ\~ҍ⯻ϻOt-q_zMMr;%*ti%7]Im1%7^s(p@獛b`%o06wyGFz}a [nd%` h` w܍S/룮$p?s?}wgY>0>v(CO$DݟoĿXRu28sv ex75(/^i@KHo[ (5j?f=]ncw?~cRJ;[Xď!ĐUVdG755!wQI㊚s7h-U"hqMΝyc ɟp{-'ц`KſImj˜Jq*%=i:>iw[ PXB&ó8E=W=+]?cX8;WQ(ӎ-MF }WIMQ`Kw$!4F[8~ķ%-X_w[ f& 6 y'\+C_kym>Twt7 v[WR>YzDBt?Y'N) 婆O}BS)hGBX'x=b=|>~7}?|gy[0!)9\Um`k{g;$%B~!3ɘ P^ D/{iڥ[(Ƀ1f}m0wIg_Օt't/Hب.:aE#*26f=gNZ |kk>-mxpOJ-^i'Xn{ zh꽒I%1j(gV2>CDVDG'l{[ZzCҔyW,A~Jq7_B>s(z[؜'_"Sp'}VN(RGbUV^67OA>p tPpƆ' Alŭ./t61w3Oje[-Wo5Bh01崖 lenb p} ^0lLEwT]0%,yǽGRIc$_ƺ3rFR$/!t23J b@ qd}̛!EZWqE oX$ncah@rUr[ Ce)SSHE4M'd~\xR9ݹgP861zF|&v98bzˉGт`+QCѱYq+ܤݾN?9#Q$m32 Q O`Xz ߐ)܅oOs]t"+ݰےϺK[wSG$zK.E$hqg_oA΋Y--^;̳h<ZˆKXy I^bğt@\G"-FochSICChCbvs-R 0f p2]"yx_"~pE@rD\jjc IEYir;uè䪀g":dXF@٨]b "¬8׵\s?%-ǧ!wTֽA`": ħK1 uXT @-ީ$V"nLj`GhAQbц!!b4k8k(/v@˅Y8US7K hFxѣ-WZ[᎟w'N}x2U@/t}G%Γ_ČJT1LOB҇r!4m"~Ƀ?l 0XO !NklB3K:X6ob(ڨ$zb6c@b95/QM-`FpDlOWL*hJ{7ri>U{!$֐rbm憔̒V_^uO}Dpqj8ȉ"ެxʲ `u)D^&Fƺsy3@Qhp!,-3bY+'l{VTk[7c<*Z:88`j@۶޽MˉNkoĜ2A\$h (7~ZoO4[U1SS T_yE-ĵԔhkz!2oeҬHRl?/%(iweIi$ ?W4 qޠQtSy˘Ӂ$PlvFY@%N]Y)[\-%l5z~mDVt//xXy`25함f {~W͌ vKM =_ Lk}6HHH ıP! ,< 2'75zق+h~/+Qҽf[Z枈g`CmmiʫUW.c3;Clɗ D5yFa`> r25>4oLoږؿFZ'UwGS\BTckµW+YwǞV8b}Vgoa$>ce)P4Ʊm_qyIH( -˄l20$qUnQfmsw!F\pcӚphCOUD_-5ǵ4$L4!4tb]k;eQQTO ~c,{lF~ص&Q}X8}@kUR9|c|}+l!;JyC;_rZ69|`o̳;1ME`}5I7Kw%kmT7 98C͐dA&H졒@}R,S%28@"thA6ӱi/ X-̱D i˹]yGNNxve ۔JwHU^*w+87{U*u}&wqFAZPX# Zƥ#3Q,a[W嫠a ( HD[aEeE8.= `<_tVA\KLƢ:Y㍡0`eKR$ P2*9R6WvAG5.ݑHɲװ&3R3vB@FdsI=0xÝV1ԝ G? DbzvIUj=FI,gJn4g1dCє؍/Y,C 讴v[QV$ k pH2nYiƶeՔx245={ڈTi: I|O~o`u^b3 ~G~?O%XM[%%3DKuUج ֜$iW &l@kރ4,Y(a I :řS<9qdMHDMQQɚcğ-/iv>VJ+Kë۲Hp+rSgǿHL,~_E+_o/͠w0Ii;Z8N?vJ+S -i;(:KL[ҌVfIxH5)%hp ]C޽LN)VdѺtS.sF>Kx#cUU{WmL[`BK O)|ǍO-/G~x%휥؀T]Rf;4VQ5Nݽ^J 7(`~^eiURtz;\BVV>4!Grb&uP,‚ڐCF|ez茷ʚJ)/t} eR5:tGqw?1-?l[BNA8`_qq<:C~0Fj8G],ݑc/M%<;U93!(rf4%cL@ر8S߫6#rdcO1{T_IgThƧQs5G;lIcO& P;ZbaI%Mola  ehD}CTy)Ҁ3ɩek7%N}_"UCr0Ɵk8s{feHK[_\3 5{ v=,/f-@Lf繓/l Y!jDQwK~MMQ*72KWdbq7+,z$V, |/!Qv'a|͕}k!((A)iC;^uEr4ǘk .lj. ҫ讽g Y[BNSae|C!G ƞ8;9Sb507qT"nbiSf7Tci0ˀ| wN~y/9|Hp[aC^t ap{A`(H&vX0޷f`Aq?k;:2~n½鳒Nf _P=Ѻ9ML8ePv똻鏺c !ss݉?ꎝx;aw܉OYIłH?\rq~Gեm9moA_PK`]V3%髷ݧ`~)]e0qLM7A'!5$\kSDR^%@-hg^@hOyMf0 &3Oh^ƿFBJEQJo!i)?mYV+UI~lSBnqp%u*5}AL %ʼnyƎvK&|HFֵD[U"E^mgOP4hTWdDL{_{t_6%n| jv!|'lf$BnwȂy(W"PQOZө59){o^rdKFIkfVJrJc@S[)8\DUW\ywk/&V7 4#-M+CMubUw7Xr ω>!6rA263SJIM88 0 `@CpLT-M1) n1WK_`o?#E&5u8X%a+r W-߱o{,.^-e^``t c:_`d |@( \Y@BX#m28vzR !͝ਏ7ݤ/aL>7OnWWZNdYqL6b(ġqYU4wڲ8rEmwV'}ٽw]I#ΥoO~=񿭲[ptf wf.K _~a>li}ZܵNU+g1\5VhǎAx|へPWTGrI JI h%åcO˹2Ow ']rL?q2OTڍ[9>~HH0ң붒BWs0Vk`*^_$n*+(poAbُ ]tM{% A(FRV"Aq p۠HsVXO=5Aķcztɋ9~F ffݓP~f6L,K1-oDr!s,:'N\q~ԓeloI|zÖ Yli;*Фn9OHŷ~:PvT ݏ֯CWi;ߧ"ޟx9ߐuUİ%~+wNی8]]n:B8wFdH;_3ZiF2siy赑A㗽 ޛe6 NݴMO-Kr8cV@z@$Y67W};QfKPVx0 t DMVYqqK`%ZZKqz] 6K/0]d\ٍ ,*b!0n*%pPQp%iv 0()ލ޲ފ|P ;|D!W :$UhypVD=rM,6R(ڋa īo,!da)ˇ iiUI ho0ы *ui ߘ$u wF3q:$ΏqǴ#2SS=漯#g^C!,CCoc7@*Vmhc ҖPSg;l2-%olܰ%\%7f7TT^.W?cyxS>RVq$%ɩ=6hH0p<MyBWc KԃCVq 74jaf6{G'VTnyHRg*[ vKl!mᄯn:Жƫ[oO(-I&hjmׇY r[0^!Ά/$`Qx>QYlB0S0 8l<F:;Q\N|e~fȝ88TWdX x 'Wՙ*EU8Fl4349RQXE-J>cp ucGns~>57竈8%mg`ٕK)Ɩh|jRrÊ|cȅ^̻GǦe 1IiGF屗~VqIqcߖt`F;QU14AщK:=B8Y= 8ShJ B \#*JU*B>!I$Y1A>Rp"l/!Du *f8V*rDR#:m~Wi@Rt͛Ю(H ;VmOA4~ ql/YbEV6\՘:(eOQƨz s'ݍw +O܃ ;~8MkX[3FA<-q4pcʖ2X\"Y67"m{-$M:CD~t?Ș1ܑ,N?[VW+^8LJRե!"1\dTȤmԚ#YX7@Qd}vH@L0ѦVޓݨ$^ekjG}(bGk7YHB0Bbc0>QwS/Oyl|p SjW3ӖFI| N*s؆HkJ<KϚxaM5JF@W5H*GMޒ4V714TQk>av<vO8N}r3nlގ3/m[A2iʻP(C7jKN&ȷ1cJG[ Mq)掎ۺ~`lCCq<#/Fq1b7a/q0_0m+3L~Ռ^(}D*d&umb)ϯ6%TNb݄-̗F{F[HiQ)Fv 7@h}DZJ4siE}n=7e4%)^aZ+ebq8K4"ݭ9#vQpڜYpZ}nx\75Wi}. 1{De#QIu$訕1O\Ge%Y_'u28f})WBDeƝ!LY B&v,iB7=;Aahb(څ>A {p׏<N.Zf'JcMK'xw-T1Cu.@!3kBH' D /m`R,إk4-;WARȚN;N"3~ 9iDbZ>NүG}3&`9*fꃜyOI=ҳw #n<3ŀ@V/ ̅{xUPb +Dk"ο0Et]`: J]unju8 <UM!&~U2e;l0jJbF9OWTh\ux\^Xȱ.ҰՉi.nC ܔ]){48Qe[ xa6e0"'K&^'ƎpU)2 1AeQ'KdŸ+ lHbV㎬Vϛ<GVY>>:!ret6iB0,>%X+`0goWܢ0BeKQaecz2U1_/eI.HGCr 9#xz(<aQnyIqt(cva|T,BHQq䏘6IHU|_[nHg E%B0Q`=5nmXzsޣ l\db;~|ApVT ^A275ҳי:\'HfJb?!^Av$ı<;aɦZaߔ́ 9 =z4%/b[l$ `9T& a (z'gBY5A' h茸ܸˆHT*PJk+R jEO jI'XC6LQ霖FQ #(:=>}>^٩3`bK?[VH6JzO=tfyށo2.iMʶgY o_.񖓧dTD{VShԏ˝ZE3.ZtaK`sZg]$F40B/w<|y>%472FbODsVmj/7+sUSYxm0m4~Ύbguא܎fD_ck'LΡ"DȏƓ+f'6~=l)&ݪ4IL~1:3况#B3H q! |}ND! cZHg>/kC e#)VoP nyUJqB$`m`;q0!8=h@jYi^ RQ\~aK4[8žӰGnjr˅ayQHk)\'32Gg7 2khI9֥ kfg: I'LK4q e`M !X-p{i3!-0NȶߺO[s},yGq ,3'lS9nOkWfoeN0E9|ݓ#g>즏=iyRw۲zqe]Xf#Q$dnJpTVt~eB_/JWֺe3Ze2*G6m1Yyv>ԗ5I}~)%6i~D#!lk;C >V%xHKtA!RY*=jڻiwl. Sˊpڎ(SDO.u))WtO8p[jDRΘxcҗج'9,ʏ܄wȚ-NOn8uk)c)zx!@PJq2S :f# 1Fd4`| P{3 ? u#8z6`Y*4Tcq "b>+&5}~êj^AifF?si`D?8n ++$ɸLs{UU)8"?M>qcU? ?l &Ue2 mmD\Uuܜ]Ro^P&C $#,>+z=%&@aVq`H!}PRVp\+ij-?(36bX&;P7$g_uCξ hBDnQD+D'š/Rn;*ZEssĘCri<srh|31#R_6NAGFFlxI߯lz{#8FuFNq ̓-f%<9jS[idl_>Rv5z)ffΚ,sM- iԴ/6b=g( l3ds ^d2)ֵcnt1KJ3s^pW,J]IM i-׺ j!+t褗T[_a{σz[e+ &e#4Dv;aZTn"Մ٨/$%-c 0xbʦw^ka < ^Aa{m`ܖ/rV8ZHN mQUaH7e1UzhAZeX"7AR<mBget"Ba秊#s"_:!>XfIΜ5`yhu /u 5iiI-3ZcdemWF4Q>l]x0\Izo #?e˪Ԉi`jӽ1dh]1S׶vUJ#"c7^uOfHdG=#Z8蜦7m~$yg_n/o\Yɋ~˼"@׮jSl8$=bPgb74{b*'5*=$Hg0CJb~^(Ж6ﰂM+80]yYH&-/+Gla L|H{ pb[$L$m!z-C5 "|̃6"ǥS( n 'sՂB$koIXxX4۞HF>.&\Ab5Nq9!!hˠϘ[.s1Q&ݲpeZ4z3fܑ3bsla507ՠZ{f4(<5CVߕ)}$ʠQ|;R:j֧(Sji}NLgϭ֘Qm{1 \{b% +g`LիKf -?LHL#D$-.Ҹd!KJVM-˰C H҄N#v+ f,ܱOϱ( 3gAջطpC8rZӣy]x=)1C[ot-y qr9e ;d| ?eJyg%BR jz(cI`FVΪ!1L%ͤI}chϯ"WY'(:).WNdց a3rPfcRȃ}hka -vQnI'OIde }Y9vh ϩLh}6j҉pz82-;}N' 2!%yٕ发;o=Z!`cY (x|xLvघm˫6ݿ;iCi()ݕtFa% bDcDhprr) u]^keRSarRqo[zyS+"_ϝS'ǰ?~+'4/пLR "w1dzN0۪;ĠP~B l)񀅥"vR2³.~BBIƏǤeFR_pC,/^&IԒVSHS|nJD 32Q7墓 PwFY|}Hڒll7ܱTν[E\,o`NY$#B $QH#"13sZO Sh# 2L\R.ޑ@`L3>LdG47/. N2ㄼc\}lK% D L{%?ˀ惦a b|QX_%A)YlOaHD{8l3VaIg%H,=%4F>6&?1 0ZI>X J<3?%F 4w||+ ѱ#Si=H!;ؠ|k793&C̅s Ft21s-h#_'mCCcDKbM U=Knl46Ð?W6G Ia˰ [J ||>bS3NF괏y__!hpE (9"όA1d<ǷQq-=sTsqqY#f[%"Ltx͝8`|m3s~FDvKU m` *maAh db6숞4kID3ASJK` tB@|OIhh)yx֔sBK}o/7XPC`f;:)?چ1c-0Ww6DxBalBqC Θu(QP\߱JV "s51i9?.9gM y5"V -;H/;\Ob{o8:-R60俫EIs3p&/ _:dL Ed=%[|J,ګ6oyE=xNH˃;LbFB!uP&SNOB>Wؽ 8"Q 1ZW~`P|È,XttN2$CCI׋<` dz"hNa :~SeĠN ,Byd%cE{MA AǦ 9Vg q% BǑo@r{M<AKXj@:5 1Wfv2 3f;rLCxS Lj o߁ HO `ƑS,w~>;=d;fr/S$8AѻonG( $;g;)N<Ô_LDY.b#j| V0iEd{̓ԃQ70&͙{2dYQ~ْZ4dyh#0b̷Zji` k?* l1?!qhi3&k1)< `B83%$.Pʈ²+QbW,bY ;Zڞ}K7 axd(z`ʃKFWK=:">(^R(mIKW/Gޝ<媲v pDŋM'W($'O!7n|vX[ʇt, iMA)KF;1s MDMy`.ݦ1S{i@`)6P:A]IXN'#tO8E ھuˈG’j4ȓs,融05#TKNJ`iϩ-U!=͞ܯ}o[Q&ߨ]lE`!f͖"VfMI-(kfדLl lP+]B^m7%|S+Ac,T{:z?DڥGpCriwQ/{3 Ѡ@G?[1s [K&XW뇣N<}A'mT |ם!K-(30SZqrrLD q $ŭ^ hP}#T%Ύ5Z _td탢2NNӉ8Xt`" GoKJ<q1~R ζw[I*FIo%z__ja@mU{!UbVW;(㜤 ٦$`9Y. 0_YVƓ9)a/] qs܍҅ y)?hCyڂqo7m?`g_{,n">:l{>:ƺN+2Bra1E}AG%# G",5ݢ4*هgg\_YO½V_uzA'Lc/ND<1^#+gl;pYM !8JoaFL}FU-6-| &0Bry,쐌p_+?6VtL ŕzqIg>s2Ijc[{I4~I50 wc}G+^Ѿf lZ(ô1D:&KGO院P.2_t< "%~\3^p_|yĹoX B]5PD>jb-{Q!HMc%YOA+̈́& Hf~V]gzD0wɌOTe{0{NC-Rp` h f}+'`j)՝%e}KRQ d-ʀuXhĴ\W vRl`]"+sDHz8cg%4̸]y3\B !`H,υ8Dq@;?~A?O]LM tu`rFQW0Pvdd E; oni$dYgvkwe\bV.A)F;_ S mwm1N(~7鴇WhNyla lc-"QMt4F8(f F>3-/-&!NR-o0€ a0hB,N$$KLVHE961Zcx0;$/ˈM(/ޖ@1<'3ZON?8ԃ8KCv]/y !9g}V 2TXk7!`3iW< ÙψI3<'Kg~o}.롘B 7lz$ peF8݄o!b8٧婦N*$Dx0%qͼwٍ%Y҉}"K>Fu!x3iŖ1>ZE=Я0h LM`A$߅o+pĜ,~DlX-T{;YN(@3|+oJ黿}բjwя^mS1 g7rp7ߢO6`B|g  ϗO@Ȃzg?pR!cD(C) &/t ^[ !yӚZ0/juCRпAŎDH~wG7_5HZJf a#p'&'}D>H<)˂W4e-5|U=@\4i\B۩r,Hb& ~O /J2ZӔuDnHG1dH>&?stXr91VXxf3ޖ_@8a4<7 Ycq Z;u! w%|G*r:_#gѓ϶ݶH{ @1rb"S`R=i۔D8n0eKj@ Gv*oo~&C̬H{F[oQRyO&ҁ5.oe=Wi8Wcw\_06l 3YOX%3 Dͣ `~۷X^9 ;nj:3&!^;5Po?H2! p͗~,x̝${nRS/"&6ai.ǴHbO{*+a!Q// }h i͢S/w{T`>$W0(^.#ZA[<_=s '`s13Oy|, D4s!ZIʾ~g8L5v2CPRs^@0`PDZOQ殭ܐ( ;fQԵ e~{IvԐLNT/ԂiÛzo\ײ0~˙?eNaZ>ȼQh\' aes_QGwb< a$Qt1SE/X5Y-Eaep2PW-W @p `}2.^rEžA-?/ACH$J宦l,߂тJ%yyyZ1`I|`٥؁*nA$0p \{HsGI%>Ri gF32fKwgDPsAMP^DmιsϻMm6XE-!;wn ه$/~.H"fJa+xtۛ_i!E "(bY|`a\smiLYpVaP]HÖ񰓓GY˹rԕozYe1#M B5ÀuG _# n???9Ids+Jl8]b IpST*Je@c_nN9NB% q Ĝ(( ;pJHN|ڻ~7CH/h+LlS3OV@JDtA˦qsg&Jṙ9-RUO? BD$0nj\t+UEWv*æJ8pu'ÒN(YR<7K >fU/6c Ws FE@r:Dd;c{JW!/$QdCt( H0EwZbPA 8D036r?_uߍƙ'#̐`;5;}2 `=1ĂIyllt#"V v7rLjk,Bon1g졺(1"`_SKԔ2gﵞ9Pj'E霼 "[Zee8vHŏ>SWϺ_A*9<n0rGNtFA^`p\[r Y=&x_`okf.LZCTEiRKZczK0| 5i%yR6/UtVBʕ(x e.{@»G1v O\%wšnj8DHѓ?x4>h FOC 2{! 3N(?0ghnwF[KMafu~AL,1ݦx`tQGZ%|!0i픡4鹒׏uܿH)*&wfqGICEmF9  {-- %@'-HlQrl]%R$EjI$zjwvfwvǐ 3;GuWuUuUyEӆݤYq;:_ a(.-x?GO1mQsdy/lkBqC6qE$h~l(puj=@n4 ܀Pl׉9b% &uv`G0v@@f6ܞv!tQh3B4^BCȲ!uU2(#ǘ2,>VrHe4y3@~Ɗu{\ --'CDT?mIu(FT K=[(ۨi$҅]j \lzP~~(RmlF"rȣ !@%NQb`6 Qń$Nv|Y7~dXVڀyk8CўY%"lnKν~ >T(+!4Ia\VX7,aaL[e`oz c&Ì]&B[Z&41i3ms9ز R/m27 /"mN6{*\%N0AS Azc1l8<7 =A.CI7+m+׃r(atg Pb?Hԟ6el$m]$]WtE~|a]E0~WFc^be\=߷عG$QYhV ':͇+){n.g6 8-$ X<}w㺗9&*Ǎ`?-`:͉Wt,TR"ca 6, e̽G?;/2ȉ@ `߇-6iqum N >n;ű`Ŷ΃LcN3L]Ks=ٯCMjH?7w-M*j8gwxX.WrзbvHK ťpF=yL2vaGp N|!uV~X{!-k_0O3*I$6G,4-/](μÓm~5Kqu9tf~,QgI۾J}V&Mp u4L,OF' {?xm{TDBmF4Wo'?}{q3ᢁT RBT8l2}XD7ɧi<|¿8%j-Z: !X7-y |๵Qc“‚kyZh(y_hk1ط:e7Eu96q&|ol1;bR\1+ 8u;'@Q I5 t3;XVI|"fkRV̽(źq_M?ѕ!2`<}FcRoPo*2F4ZZCTl􎾃 \b`RzO[ZJ.Ͽ:B8NE7`DSޖw|&O+#l$`dnM=kڲyT2^r(9rU4@<<=ΕZEC㸚A6d1YcչX=@ iؖ!A,({,>Lˋh>V bI K5>isMZ_cЉ>Ra=y'_LF*$T67'wĽ,&7Ϻ[( $+!>m-,;4Edu%dڶ3!+$IƔ2 nӶe'"8L MA^?vDPPX^>%(m/LpƬ$?b́rkCA6 $4v,dR^Ʉg`bQvi $MFgd~2rhי 6  ',0DL,xy0ʚW$5B|^PLNx<՟S e9,a\- `(:>Yz2[ٓK*Ǫᗨ4 j-;!J*{lˀ U/^V~OrhT: `܇}|bɿ7b-QPv)-d랴jPm˂nĴSZ$b1?Y;!pR־X_7mC=1e Ăkv+*Or?/>~d ,]hl`X=/9cD]UuS򋼩oM.-Dg.y.3o0PFD_D@;[[|qW& bpKpazaE&[$@14aS`~'*FOs?inRA4 5@Lٸ|OyLF:E?<\'jbCv`U cwL刟S,RX}vGܢVב %LҬ?ߪ\Da$B psyț(8"z&SU) !X\[K޶ɐUJa9n>q)á>f!@+a۝ %IDATN2e)ۉ'B?Nu s nD` '% `]Հ#/l9f.`hH`5{@DKW/wd tb 鄇5%XFaec1B)ˮ VcOty8'*'懔y8~OJ3C}iL4bÞ+QGÊQ?<7:h{iR ]!Liơ0%Vkd>D-꒿kT'rpDyBǐ ciYD|HfGQr#5G: Ep^܀o +9'Ff؁LԈ-XF'N%NLltf'=4$8pm&~rwlIaŁ6f ƝIJ'_=:-~zs~_^A0GAb*O4fP^`Π7 ы]{Twq N$.rz?fWwjYX,tq5"ҋ t2gʔs<&&#tQ|1G.s퓐x;j@`n8#o[֘ټm/UnO}dG V 'lS ljA[)B2)봀 e<ʰbsN(22W8Pԁ2׫ hLQzPZ{z= 9~ 2 +/tWmpRF5/kbg,`nFN`;O}Ld@`l@Oi{*#'\L󪒏8!"}@N xGa^Bl҄s t{إsgAOgfWS{DpM;ԏ> + *M|dhWYq#,hg^"X{_1ieەz C r\K^jo lD ޟ+L"@5';GLD#,CD7[0GѢ=+|P$GnOa"^:&ۀA3R(;;"$DdY3+HNEm5DU̞,#v(c9*!0ERZL4˭@xf3J2" Bk͑_ ?%K~8Qob--7pŗSܿIo~{X3ЗU}p퀬}DOץ@\44wl?n5QQ+\ )DP*ܔ@!U'H ^ ML^5X}pvBLo?npBPz~WDgTU<1V e nM @^O!Fq?1aeP6׵-IR:Ǖ`+؊;="H.]uODܘ/?;)-<^7{]q,xOddnׄbNܑ'Xe8 ghĻ):UN;/ 9ee0 lՁD byJӍX+` M @"Y?ȿ#oS^N?հ@BHuCm 4D;UdG:1A&kavG`qGjClC|Ff,m]u:)$z"L\y}w.似`LS|WKTgd(pUcѥȷ}$Sb7Szm&o7L|7_ A9ll!6UB2͓ri }|i0.m}W![mBp&|ɟBpB쬾(/Z2v z֔s EVK! 2kG]V-q.K3qD{>=Sg3K:l}J@%x,A? ն%/=C5:43KƤ%g<%R)G ߷]ԈY|٧U?>4maKCJQi͟0|Sf~W2.$-;IENDB`ic09^PNG  IHDRx iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxidu/LO4ff/Iq(iAdRK!rv!;aRa")J]D b/{7_ͪ[nm{]u˙uoe<'O<9µl4F  j3̌i>) u ttR5lKmE EB@G C⿹W6sY1ڛtf2UZoS__(" ! @pO⿕lzd4_ h~w~dggEWB@$l$@ & Dxz~.kJzjS)7i>OyS.MB@!Lrc#r@F0x̗dlL_zBZj ! h2>cv3qBJ'ϗ_= VW^5=I{]p|d䄀B`:`, `$`:1Vx.c_Y_#\7/_6){b@! 4!䰲*q<WMJS)̽ {\p<[Z ! @+ʐWGŧ̅YS@CJ>^~! @TCj(_okGB@!1}j_\B@q@@ 8u~P2 ! h! D=I 0Q} !  1CԅR}8f*-:n&@&Ta! }F@ }m=mHB@Lb e'&! *c4>ŲYZ,nwLRb $8B HB/P4`\KS,U{ XzB@L1b'US% D&3P=p ! $DB@1S6 'B@ J 'Ӎ)Y Ws]z;@"%1"x3; 1}! c7)6dvj-%bFB@!0!U5/ T>B@E@ ݁k.KN A@ @br,EB@$1מjq=RB` 0m"w! ! `\-B@!`h! BLa TZB@bZXL͓t*芀$7*>vZ&1(B@! @&@0)B Hpvk7d/LO_Z*S)x5[! 1jB@L)b ` {]MB@#  !  LE7B@! ЎTTt)艀(P! @2~UB@D@ @Ox(B HfnzP!  ` :3:0B`0enۘVB@!B@ @y`zZ-B@#   ! H4bݽjB@xh_m${8! @E`T-B@ aR\!  A@ @B:RB@!0 bA+)qT;F@ RSՅA@ hpT.B@! & 1]B@ `48*! .UV! h0B@B@ Du*+B`4 E! D! `KB@!0ljE'Ta! H0R8B@@@ dj)B`)L! d `2i]@#S ! &1mB@! p)B@D@ Dv*-Bp8~zFZqB`tI!  `bJB@!0:K$B`b01]5J`tX*'! " `R{NB@!p<%B@!0Ԟ;Dgt )B HF?B@! B@ Pp)B@d  V!  1CHHGB@# MlʙV]B@! `D@NR6V &`LuB@1#t2) $UQ!p8Z|2#`,;FB@#bl%B`\0.=q!c[E ! 1c1GY-m%[!0~m-0Z<B`0v*KpX^!0>7J͘4VtMje5v`v*U!  1miإdR&N}:_(`gKÏiS7L6y71уB@#`F\g3&˿Ln߻Žw> B@d# `w]{cTIUE! ǨI<*B@!0IR/sc-B n]5ưkT%! @b0] =S(UQTcruY)! HbƸfc[Jl!/PPN! 1J1;7C "''#!? !  >>l$b %3͚Y\)뮀=Z&[/B@E@ 2 X7pS` AfӸ&8 KρY o3\Ɔ&UU! !p @@rF|jC]}֓kj ?<{Fa^]#t נlc729S­f!tA= ! Gh4'+V3Ü~XiR΅3HpkCx Eg23>7GWN4o_~+˕߬A%Q1)3t݇q ~O1.x2yA>њ阯2hrxLx g6Cu gfmLt 3 ! @"j pD`m4#ʦvd \|zZ$n>3HQdؖg YGj7oIig s Ҹ<&> Ww ? Zf1&x&Ag?VTi3ܖ]\ֳ?r]gS.!1AoT!6L@:#ߎ&@7\5f3P&>tn`?34Э@3~Ռ)%řkzC¹cU<}q-``̸AdwOIR[=wUgGIb]8>m 3K]_F 6 3c3,`T*7a~'rfk/"l XLsj0[x8hoՕMwVP"wF!d2iǟOǔ#@⿓B_ +cctxٖlGG7= H 81^C=W3G>#fj4xx^Qm@[(qnn>t:e>/4ss[SRdZ)E#sG&ة1sܺbY25?>f>\h ;6bJйیDV/˦38,]oaK"gm.T1#McO?oپaJ`"ؒ|SB+|Ƿu|>dn>|{"F2դT,C0{Fp<\wL! .ډx͗ld ' ϕkQ[^&${:1ߵP࣏=a.]zĿ?bL6a>-1ӫo]5/(9! < \H7&ϟGȯ^j{َ_P5&-8s9}^"cB0\x7ejIhpxTXntpss\RE$aﳳsfnn+ k3e@/-AS@0׈HG#0c*咹'Fj, H^gRi(u_uTxduд7Wbb[_i~qh  B@ uq4E8Pel!ph:?FUL@'B@! FQ#:!YsZNHoB@# `NHu܊Pz ! ,bt 8[H05@]=5] ~H BI RRуvpvIy C@sↁ  Af !0'Ň%@: #u*z" '< < ܎nkؽ68"L I@ 0@tZ)C@pJ^,nHa֩EыEB`J`J; G”5[iF@)z` AMkTC@~%5 ..[L%bhKA `JFe=bL!1}!J^:V4lMk yܭEݐ:0u]4:~ @J:zJ:Z! `8%,֌]; @` (a-Tsb?y E@ }0Wӎ)@GL oZNPPR0O??ҁf !0H0]o (t tZ)A@ (%0$k{6I(PLb[%j%O${8!0,$'!m@*A! @@ `%+uɅյZ#^: SVcçZzJ<bj1"xN)iA@iiSE@ @_e@V=)$708r/@r{Z-B@#   ! H4Htvo\KMam wGJ!B@d"  ڿU [1B aHXd䄀B`0]l-5ЃB`0u]?iXIq t !0:0L 0)~'jNJ|E@ѫb$ mLO_Bb!p$c,! E Va5H!1=In %ٽa||~B H 0=ۧ] oCпI G@g&U}!0B$!LTwF2I՟;?h؁@D~S @,g9*yxC t0͠8 P@AoJ0= Q! `THNZ>^Oa'^_SJ!4$Gm4 ! @1DuIA8x2B@ @B:rfPo?0ljB@IG@ AM>(J'dLrV#CQIU|pFx,PN!  1߮=G13j臀~%4ܩQrL1KL'b߃g0u] .Lҽ ߚNz>ȿ1)u =0e-WsBq2U uu*z# 7> m m/QHh?w6K]݉|"i DkZ!Ick 7QD#_Lz}B`p Ub: H n  iC@ x^Jfp-$L Pj0O*OPzLL8 O P_OO_BPBí!  f5K!1]IvO:V쵰So #l0_hlBLX_`CQ?nK%+jf gi07ktxtӡk!Nfn @J{8C7I#v^bjB˕ f/_4VM&#IIC֟7%;$J.@ AsA.#)+:Ѥxa=iо7ո"}Z^ǁB`/W8dr@i<0rI@PhVB`Xd#P,WJダcIK &šg]T PLJ"n &1g#1Ɨ? Fe!`zhP|ᴹӖґb2?X!@o;;t0b8N-0JT:Ixh,{`PXc s/jj,TKU8r[ȑUwʐWqԯϘݻͭ\7ZdʩK2A` 6&LV6ViY7;==8:y!Z7LNVS 'IFG=SH ewll]S,Vm\57_yOf~T48/D SwWػЉvs[fOY4E'XFJ US}$+2hvaն!{=R+'{۾i֯|ӎ;^~rxD7hL .q޸n%Mn5h\)% *Pb 2gNӏmN_|/I uuxz#`)H]"='/5[yqyHLZXx1lټٸI}{y6@Z0l~?<2מ9zyq.'0rWL&{ڤf@o}\z_>,-辀KL`C Aj_5ސ9(hg(6^X=^Tm`Lr]y&l{[NTb;XvA7Pz /ZeZ1a̯[/"asQ"@ @K pܔ~b:rN.}( l|ۜ{ןHǭB4#<'t@M):Va~nHTz͟biNɏh_ OyIC|8!3c*\g` M:hAؑq͙똿K*jg pwХzd +\ZyJ=u؁wy{ᾥxG^n5_$@!BUVjur;!|"{-=}F Lt=:l:c_ʿeJ&,˅&mx:@~a7 vw_77"7! As$$ȵ*f?>HPz] b^]/2zHerŒϗ`I3<;" nyV롡ѿA*9RrJ&`I4 .n?ͻ?w8=ގYh\ Yyր0*eˉDTΘ3T@-l!l`lcF;KkC`p^1 6]߽kf2Y '~,z$&ȹ9{͂S)$!]N/Y Jgf xP;ӹ=mG2^2=%;Z#PCҥ^g| N"^;:`G. { B[<έJxkX^ ~٬i[{ 6W7#S1O͘b*UX:IaW[vOv` PeƏ̻񏠓Wk{p.Z'p*, fAJBk1yXINJ9#c[teLbTh_X ɘgç@SP є}2GbܱLL"H'YY=6r![" PT3@["x?i|.)xwGϧ7QkmU/6v3Iے T q(a6LƜz߽@Ƽ=ABh1 w7 >..Sˆ۶j |ok!fbmm/Fޚ1;"1+.12fl@踊 rT ;U.XAb8AKul̙Tfh>w4߃5-K%c>1f$`l ̘(H/lY.0ǜ ‘"3}D~.iցa6;}Lt0>$nÙfI>њ阯2hrxLx g6?Ƶ|tJ<.mDj=5(J HL+ᅧfʒF=4 ]|[uc6V+˛`H32xG|3|nOmߞ~m ǧo&7o?F7?[~0i\ ϐ?\Axs>`9Q .5z-W)Ab~P0v53#Amih,L=i_#p,Qӕ ?OO.IŶ7:+wa6 .ʦ~6<ȣYWO[Y K-*i}^.^h^Bho ["qğ͗pms$__4.ˊpDeRYpNϓbxV}%әNt}2[~n|_$~.qn7 LG<I\ztcbg ic\Rrue>N"e?` sWsH#|q]~.F`2q,kցёȭ]\}~>v JoxYBGG'D\_+l(y`WiU5b;gY= D in^4-bi؎l) O|i++vYVp0߾Dmų̃' x`Hn>-ykIhO/~wLdq^o~͸tߠDgpwE hwW+ `ۙHc3Ntcv]d"_y,,,[1I\¦Hj3| ^IĆREDeS#[ԅwcpq5C67?""%N+}ӟ5?o6v|47{?~5>᪄8_z0U} i=W|ӎ4gaי~}n;\J 6"~>A%(?1rHW f )5e3?9_}! T` -.DqXe.cxqϖ) <_At m3>~-'ޖa:il6n5uqUAl 8 by{@'eeoj,u & ,֭+cŃ7zOH 1HB>&azLh+ʐGمtF~b2_WκY;`ݜX]3W]@.6uwOLLTz)xP_1%ud2kv{ Z_s~~?Vr֏;VlUEajhD?udҾoO~pcIɈ6X'Qf=ʼ׺#Ho/_wڻ >+@(pe'z7gc}|/x,2t-TG/'}hi[lyէ^ uǮ!e߈}J4,VGbz׺Zb(Gťe EqCePP@QGE4sk.h3y||:F@4>m2rۜdf ;c ueW޷#]H}n$ʱ9X;/76oC4* zZ P:9ŅΞB_1j^ j`b2QfR0+A؜~}CĄGUCkU]q?{3Aڹ;=>K/| x\;8)q&|~똠{za'Կل1ҕ'l2B( Jipjmebe!i2h>BiO`(R֊ ʟ-Bjڻqok/iPâ=?4^by:h4hp b < #qw$dv;uDu'r[;cQ/x`^ʼMGMمHpgy`t`98k9ؑޑͺYXGҭnt P& Z԰U5ȍ:ݨMڹs`xٯy=uh<Љ74dʌ%-0KF8WΖ!sȝd1kJ8Zg݌ٸ{l8_JoVËp(h|YͷnsK3?qϐ` 1u/!ZpɩxckXgu%9CJ9餏su(X#w$[y,{k{rHRv!ity@jOؙf4nOü / O\Ml?:]JD{vqX)]Uw񷁺qѸ`:k 2}О{+f pJTĒ;2Kfy'V 1uW<{w֚"P׮78ljye0ND޻퍁s{~<+,/Y̱;믛3{A X8<u]3;WVw{ǖGܻ;%("ڟ' pi>NKmdZ]Gr))rRLPd|2 ٚK=lq-ܫUD1heh.V^Yw~ho:sd6$犥kc#@[ 30l:iGM'T[Q@AnGӹՇ0~.:x ;z[N҄{[Mf(^:$Ԫ$>ms<47yQ(_[O-6-RE(a7ukxaU.}l]]?wlh9wuA bKR;AK8ɰ`pNpYVlSPLRF۪q0Uq A^8c\e]>sfa, 0ءUo3 G}8hqVn퐿ӇqUme{Ob9y%/u\`႓WΣP ϱ9?9?2J.;hw$Ь^\~l-"Ä?S7mamN{͏qs6Ko~1 l+zG\ &%<{^]yr_cuA!@+£!-Y'In RjpF Ŀ|+dqI5?c#M˅kfYrg$]}(22jC'_~><j9o6"#κί1Yspښ)懼|" .TK G! lqn~T1-;)_ig%(rs^iz\xy2Ƨa*;k!nl`nŅD/].8߾2S?f̝Oo|J|NV`o> #qsq6h1K vh^gav~,`/O>d_ggA7H8*瘐Q6x>v9\*FJl©P(Aw10_J*[g2+`.D2m `v"?R8ctm@'SPA.Bvu^^jrQfn{aYiBۭ¸ȁn!oECL>eο$ذp~zB`-wέ<:MHs7 ,d"°_)*h5݄3n+|كn"aQM*ddO(/ƴ-d((& 0Z[crEM+J ~&Fi ƅ* t! _"RfF%WRtk>Z'FfFcs,rs?_'C -37xDh;15T {w5 a@"Ng! *-䶷D}[6.Py0?_s:6wx R=;;C~uc "V<R]q"slKG5˘pBVЉY Σ\|Kˎm->P|dqd:r۷̷?O?@"g2_18N=eues0eO"iqO)uf~bx?SV`@IDAT >*w~9pvWcÎ/{8Dl(AxS YnW%ҳh 4 (7yZ \8HΛ߄; ! .h>n-E_%Y/`'[J/8]Yiź|jٜ)V@Z~b<0+pmJؿ3EH$T#yg?/e*;..tf:U/1~_d̝ :.8AY&dcTZce 9ӻ- B`<ww~6wpWBuؑH-B:P6g/,ptx,:Rz|KŅW~9,Nat(6Db&V1x⍧ʘ.܅w4dZ|0۷:i"Nq8H("8 "'d^‚{%@#ys+%طWOJs{h0 >2a)rޔҠwpa>B@88s-cu>sr85k͸s0|ϰaW,rڑMxUvJjF4eX(з32׿jiV! l>G7A"2;XSZ뻟+i}k[g8,'8bCb\쀑H.O8L'W1C`ܮtOzR%L$ViW" ~' x{shwJ-mBvy߅蒢70.Qw3pmԆgexAN =E`xTt\ CS3XMScm e3s Q{Įo TwINʊ4bO&!͚6%ص|䀃 !plZKpl{,o~Z;i3ҷt|\Ao.lFͫ׊OZdU$ڪ'wݪ9cvlcF6L%p=lv[:PbS1K6=~\ Vfq HΞGt$Et*ܩ*Q=$UpJuXl0Es$K]M#Cgy8i,B`<ؽw eXR9KCĞ'90  pPXe.Wp-#>C% ଞ7խ J$j3l)|BG%/-AG 6|#9@Cw?9rD•nDJ~I׊DBFǕo5l8-"[(s8k>M9F;? (ܱkf~ťٹ:*/;%jV/Ǽ"o儀?xWT1j}onfڹ')tw#~9\ky@lH|o]3=ֱpk&y6p1wxs N3a+G{9H\HjijOM 856)v".i喎 æ'_:h%˓DJ 7D$.$5MSkݏo']Xǵ´8#$i\_|loij_}Gij7>ƿ2n?ϔ:.opOɊKZmν5KKwAe@ak7ZCOd^6o\2+ۊrgfa'ޭ;ysڋm.?9ÊΚSz0a7Ʒ-/x:{G1;-v:y2`/`P C*nGCC|n UuZRޖOlAC?ˀh{Y\9yawAZRLkus"8u~ G3fgDG h:m 0:"ރA Lt8ΝU?[nA"b-}LS8L s{r7'跻%ȁ*ؖvԆUu+h t~ fyu(7GI8uvSZҜA7d~VC R|[Z%ُ?.8~(v y};J~pN$@i/A|'-D,i9yj~-}՜9 KPxrrha̗}@(c;r%OZu+6m~]" өΒz u&l@3 ~yt%vqPf^~)ty4p ?&vq8NY0yl /;QdY}p]e7f8>Fn`𪐓-A\u4#+`d&΃~ߘw1%+F1a.p"2!e(9l$`P_-<>}vޜ>ϻE^0'_\}sIyY#qҺ0Viz7Sԥ`ea-<[FD 22^v\b g$0r8R`8#췐5{_':fr3D*qO )㷈$x%nA1[Fqq\7^Bͺv։%? #bn)}f1_g0=XgW6"2;0'2xܗĮx+,y]@^W6 HsĪ氁 Eǿa?l?"Oes J5h ~(PvJLg/؛]yrX~&mcӍlhnln>f%<r̮nl@JTqC0un jf?AWKWO?b@_S*a9DBZ~X]2m DuPN3| ؾ[2X)^W`1=o1\]Ր^ɁO}nJ1n Q }9֯|FpҿB~!νATDr4Mt^$ßBe"ws\3rݫ.37C7>lq3OFY(՞-+@+!tJ:-Z#@K:*j${06PEBQ'w3<Z &޵*pFBf ğGst r+gx"Tm\~ t.m;9^B@¶gvKEg[;n]moâxHJh3ÔzJqyJ Qn#d%%0aQ5x(S&2EO1wXƱѪT8jٽkϵ e>ek:T歗_ ƕ Bo7elmv =;#eƎy2?vGF᠒ v>bm/$.B1)I|'?D'd[[M'pϯ. 3o)>o'CD]Isnz4lPqůy~ڗTJ8J@3tt 6u$`n>hjM%~P˂mNx]~Oq8@B@ 68y?<:|2'pxI2#z\e Jm;sXMnܻm660y-3{\‰-jwϑ Ds 8D1(T"S:D=!!g6m.JiyL *s?{|[i| V.y$ID}U4/og>kf n s뵯w:ˤttߺO9(p0#BfלAy+.@k [n\4ޅ rx͉2nsIl1. 'Ξp/f`u+whr ĈL?:yzK\4m\ȖX=4`W9z^ h1ZP_~9;ggRiwwR8Lw -)kanFus)q$LQ ~nyGˮ$si 09?&B:Yw}nX|?-Ӝ{e^'DpdDB 30aC>S. =CM\ęذȽK4B3tAH{|&i &'!`(YI^ʗᣮ㜿w$t4w~3 :0Àגr[ĕfy-9}[J|Q~%c 4FE5EB+m#ƦҼ9z:\H8L~Ңۻ&=qӶfo^gARp OX-<`azހ?6`uh!4@9DaC_mKӮyL9EDj`り[7_20QgebYNfޅXNs : 4->|V={al`q˅ 3I"<-{8D).,y{֟iFIYB]Zl}A( D숹ǐy׀k2x&UR0bBAKPoZu< sŲc_G3LFns %@;6S\݈#9: 蕝kMA -'N꼀h"#pF!0 l #윥ⲐH(Lc_W Y"3^ZwcʁM4$YZMlDcfPqS0uv3>4 SK+tQG1"wǺP"Nh s%q|^ (?ދ[ɡ-A2t)zzM4**nlf9"q{s&ݪ$̓{Wܓ#/@n|*^a<kWu/G hfRVN]VW ~K߬couE<.wW_K֨ /ZԨAƾ"̝1W." ͝ʞղZCnDkGĩhvCyX\:e\{Ayna9!ƓcLVT D}R8,b[{g70Π3OA9<;#N[`ㆶ yuˇǓ?7̷>A03%wWr8s>1;$~DA?r{ u˧eEGq@",vm%"`p [;8&?w4!pnfkgMu>w@̍Wd'wJr۷̫͓?,kT/%s Z{;:W:p{$ln ƪ*3 ̗28W5(V`Oa&yq Zo]O1 ƵwTfيKk{X:R=G:Z5tf G0HaJtʁא fٺל/i xVKOiXL'2ҩ1yɿln%ێo#%`B}wiN>n„rST@RDqPDշMK,݅<4X}?1%ϣqΡ_aUfpqlқLΜDN4&] R۴5\BQ,2!@^J_y(n;XZB—|.CDZb "5;n3έpm/N^qYw{HB]Gӻ9BljGq1NA8?և/x\<9׹Q߫>Vg,y e+~sڹEc+ǐ(2$s2*(!ʛеT qpv3!}%$X{Ӥދ10Ge]xYBʲ aס Z)bm 2[eZxaOS<'Ϸ2q{J1}rXsP{<фTlBx[w73fn(4'yr<u kkĽ|rnK#J-ק#S=پ**'WyZky k0!D15Y]w/Y`XҙYl()ϳ8KWM][o~'꫘Usƕ6ɮ qs8C0Fty!چPR .zf9t~qo)^%8~穕/o)s]1E̩0={dOB|9F`؉CCNMhͰ~A6>=%L^'pظ>_| .jYNB@ 2`@F@ys{Qx v!a S4ܻ`Sj[?^a?(+-Ʉ"R@LN.SE[4sԌj/EVqaTS_LG 75?Ъf4ާJ,ppO1V6`Ąד{ٖME;WdV {`r8 9|PH*;Pmr;})̙eH.=Q$͸^ݞ9!,n ;ފG”Ŋ|+8.tmdAоL2`,J>9he9*!Ӻ%8) ;^Ck:˃mw-]aN=.Ká<Iv/jòm'֕9mvz bM;͗Y_i+ot E@ÚDeͫpK"\)j}h_{OS@2RÃor.|Ș{,Ays|.9sG24[0;[)S܏"V(2,\VQ7' -Bv)TwbVW-%̍L0'N=n]9y9 ' 1%g^pu<#plk ^ @ L/ \@XڭuH( +S8FKS6^׾7˴Xiaˋ hLg#ː,nqk(]Cu̗ u @+ OȲ8Hw 0\b(9TksҊW#9pHXv}vΕG+;s{(@\r;ϣC`'`&t7SINjڣ.A'~3aAkrB#B91'Ӱ0Nf J|ր椓߽M݃}GH^&$RLG@ru(;3,N77n߀hg+UO~^Al^uV-B9{|/n  1-S9oq}?7Pi/=nAq=5uDĉyzo Ie%5b[P];]̽OmvS#3v=#2aGL NB/zZ܀!&O>y/``]Bc [Ŀ̞&zkyM CANCB#2G~}0;sP$&z5;<̛W?N0>1w4jۙp.>q&. }tIa$4 cJDwx<ˏ*2y#^ex6af{8&k(y#&Clhj-4c9~?C|e}E韝+F9aD.,#ޜX1w9s y` {zIZPDO 4 v b+YЀT{lVƙm|9&A s<&Y.v^C;zMjuX](߸mUf@?fGE;:?\vnv;B G{}SL<;41NX^#,-,Ȟ;g_qrosq+RqqUhh`υ>.զpa}~КXspPXڌɕ9(WH$CNofks߮G̢"M-]5륇#1[I:d߂w߼Uc[F{Xhs?'oju`> nJ>a~KE'C-%0q b1 nVpnLNcÕù&y!^X~'٭E`.I R D'@]HJG?:GoqTV[F?.EyTv`Q[+C o, *=F2C0 xoTph0gp8н<}‚n}ܸ yzol+/o+i"{k>?vUrR[_0Ym9ޔd @f?a-dkMyo|Ow(Qۗ7}U_Ytao>QQD )&Cs 0Nx+d)9Tܶm|2-}2[r2iTfܜ:GjHgu"hۢElqFB9YSWk'e* 0h8?blQP1X$3L;wcp9,3*5Q=?^(1E Fawia/λZQ0- q~5{%9+jS=<ag =|^ 8zB`yl^pAO;],Sc'RWZ*ṟGY呾[/Ac϶"#m&MfLSvI0%+ &zpOsy7w/ c.:9L 3qor( }"crJ㜓Қ|j;М~ݖ\_n,6Y DK* zv<1yL6NqߵeD#[!XPlRds{7=jSLLyx^ Q:EBՂIͺ9Dg$I>3gg,+J) "H A~!A$tV V)- JKrpvs_}WU]weUWyanqdUMO.7{ٻzֆfe@@ITt|i[FOhe .=1R+@Yi *Wԋmv H)lYνMK AfJ·a臿gj]!MǙ91O%s |[5}d03;۱Q<ϊv qn췮  k]= 0\TpcEڡ,@Wˏ?U|)_^49[ԦiAi3;@>n J?-sD>&v0ބp,xˉqU#wKExߧ*MIGXXEhIMyv~1.coI{QjÛ?I-BN-&RZo`[a)AS_ڹ/8` 2 wnlI5\05 \P@ U}%ʫ q"S٩RWl0@&ܨlSLobr7iXZxY|ad3Q4&Ғ_nJM@ht~-+ CB9 #'eLM3}Aq\N'R@uH?VBk;*w׿,X,nwpOI7:3tDaC@gZW$Cᗉt4⼧qT@"@U6>}U3*:MW#m A\Vo:!~cNlo=R8.e2`$y=zC :kʒJ}eHPt]<4њid`|*=f?=۟EAu(et>Զe?!9/V1(3_rFvͬ VZJ/ aET7{.t!) eҳBFvG}kYr֔D@ wވP̑CƎFN)Ƶsma2TO|:@Ɲd\k@*|]^?~fft ǸxM'̗Û˅pMHE ˯:}I\c5Y5-aHg]p~K[!7rGo7ob|ۊ-"anhFjZ.#Q,['?׾ok#e~2{/\RYxmtkn0BZtmNq K{˥G',Uzrү+wٔK6ꟴε o@C ء35#v^s=|ܒڤ[|zKzJY1ViKؔvMǺB+=FE p.(cp CYu'I;=I "xp281,ʭʒallKV$Z {ѣ"ԋ^|\n-8-0)/(07g(_$,ۅ p㌸M-a&T!xy3Y8g:?nz׊踶(weuP3Avv p5߰*uJFX_+1ƫ!OS-s?pft/7 `琬$'bgO7o*.l(3WtƢ.=h'!z"dɌn/Q4$m VXtl${ɭ?}?K:A2|qbDߣW1s)}mܒ*9ͽ|#'6s.",d;O~= eWSdL̸eIdG `bD=#>H.IʉDۏj6tգ^`诳oy?~bJ::ƪ3>Ȥ=M+L~Kk}]haO )1vǫ7LLjbv#,Js`fR|5`R.]AUwA4r=qsT{z?H'D>Q,4peɻ"TkHQ*t :p"\}ڐ %0-c)E e#—Vj:7uU(S+T>̂*.MݓS髖}>o" (Y@Nm #Daܻ^v%l<3 b!=Ԩml]5v:ZѪ}[/5o`(Ĥu^VH5C\Kwޱډ%R>-SZrJ~/ 4e=:UC@IDATn< H^XsVLYIؘ#IDz)_=p Ĉ6?6sWXTFy ZIorU$QAPK R˚?oh\VHϒOcwY sį*Jfq~19WJu">nho3K'v"t.:haN =;5k;$G]ЮcE,l*C}J@o4M)8h }pA@pUs]"%ÍI}C 0JDfb(;cT.f' l:up ¨5̈77_HEKKOѵL8^+CN[ Rk nJ3<ǝ^tG$M)~Ƅ~,N$L\䗅P: ª3@L ;Y /\ޗ|59)K8"}eC8.!| U?+<~.m6Ĭu=6&bh&D̍7~wWg@skye*.dq3 wb[󄶊.뜇=/H>Cav6U}EHra7! gV"]V[lgQl(N”ř O2Sm̐4|]U-+=w\&6Xl IPT6wL+'0翮z"3nH=a/jp AG=sGU \>q*fw ;RE=DսvH%BN^{P$f2DMHZ۟gD %}cPxEJ~XI۸Xε?-5 >Nt=qt_[?ܯ Hޑh :!0uG  VfQp e{SGO1RwhkG?f/>MW,y p!?T<M@ùPp/k^:e2]Ymb(%R_|CO!oIhҢ"9 ]b+AӡuAM-yyFܹ.6+A!mEQeK8۟$][crBSWeLHCQR@jԔM Њs^Q QP ?>!o T`$}҂{ĩ_ӎS7\ϜPU>%W"UbTCd`:mW>!%='q|Ssg!aNlj\1ڭ=qknK#7N>f 5`GcIA`r9ə.'%^DX^o3l},ݣbR6&+g,A 21f}llJs_mBv_0&H#e;ML,|;iOEeʝn~ /_0!|G+@SPxE&er-P#$ai t4].Qj=Fq lWd%m},07" -']ny:qMơa#w<b#Tkz5D5jbd¢Xt]_1]S"V qO_L]:o[R_݋1?Qcہ~|^~;O~/+1 =Nxd=@j_TR[ I;aӹE-ӝ8.Dnv_)N_+-,]~O4T̄6~^qJZuqݷsi~QALW?n* |y?Dh1(A?Coy*};)֧?WƧ/5̪l&wN, }berق& *L:8:%?ʭa۸Q!~޷1B[]Юn@h+Fn' B/%Yg5ʩyS2^Tk {>'Spdy+i.,ſ:5 .=Od/\fvNO#~ocd颬õO_zJˁ8w\4wagcC~Tِɤ9{Qd)*LQ&s bA ;,1&`) §=I>wMcqher0ڣ U(T~GpFsg.epj_ H!~j ^<}mLFMR_p XR'Lر M7D"9Ҭ5Bn$X#/a\OGr]Hlal>u &8#(R\Nԏ5O "&eE9 >yI 1Z$~F$/f֋B* 설2Q_b/+N&4/˹ cb C䚌]|K+oUᜧ[qہo\- Wf5̔H PA4TggdP1HW(@elo'\Mug?jJlY1GqQP!q|"ͱlc/)/W q9Nb4f~]Oyavd nX/w73rzXcYtk^˘LLG@ 0i1}~Ny>:ӟgOi+E˜ά-o4)'tB"Pc9cJV4϶u+;B6LlT5VUj&ς o'? Ü.Yj1CXVG;\֬>C#9k*Pcx`'Ӗ\ήQDO+(KcCQsyȴSWә&S"6R[U2wcT-p]$44Kp>3K< pO.η_z]엥W06S/M &Vf )C `"dE!%Ճ ߲nWH%$ \c:e"q؝4|w=ˏui+G@FFnI4{Si1 * WvT )5wbN􍋒 UB߿+ Їp<ԁ5ˑLGxD 17rkcK_I~i j"E:ؿj,XS'O'fm6qx$~Y2~SWqEH<3prKU+ qj^<П b&6pCTV:gRl'_iڎIF p u26.zfVJ$TG[zM˝[|MÒ8czNL i)GDC$5 c_E$J0] mj5@Z_l^bNں6r4 XRb`D; VIhȅ;49eN@O#QCgȏV#vim@,ՙf B9⼧l> 9@(&Q0'5 ZPT}1j羬1'v+gPIF`ʂ eiK\S $ 0Yc0x4w/hLOrRSF80]hKAXgdŢ B%t!#悈I: z͌ VSXj녍\y+Yᅗ`[5 z$ؘlTZ)iS-0d9;$l?>ctbLL _GKnJdA51?0=0}5€! 8!,-k2f ."*IʓR\ZѧKw.i`Pye.HJ 0EG(C%E-nާM.7븀F=c±?m p,OhO8%6bOLY65'?wpM.lUjooo^Rf1+\Is9MohN{|Q>HW*1'WE)-#q7p{P\TArd3kg{V9Ap$EƓaеT5O7[&l&)A}-\1R5Ig]PN.6 Z{2 <+)0GBP}]5̝„\UX0Ww+gR^ E f.V(d!=U. Oy9M"y̗mcI19; n_MMK3*GgN*C|YA%<WZGqSgѓ/'c΂Tn aV7vtƴv"fԝhKr;xIiN҄S‘R:DeeqUd1Y2,õ f8PL?,CCz!U"jPNc麣9JI Ǐfwc] Q9QC)yFݼf 1<-X$FTl qXnCe>:kGͼ ,)g27|_<>F{.:#1`g tF}CE$3;8qp“1|/ofWZߓ;@df?|hI(akAl`8I/ߍ͕P8724P.4kg=aO P,&SgsXOֵY ILڙ͖a$ ]5OTZfP]Pm]o 8ysXc/ZcBoJ Kbvkaq#*eFvsɹl.vEV40:OnH/NkaUcd95m78'9K!= ^:β1I>4%93@̠j&FB.8ܑԥ~Sցw{`W1\sIp0˩w\s}ZllXXߗ~[[?#ר.V̋2|{ |x2ĕE=ݲ T9{RQ#tB;1!1vIM6$ [7'\B`>My0X!82%!;;מHbNz40S"~[JHT1BP G#$PlFgK s.(ns2(29ETI̽-I\_(6q,kE%! ѻ> z;(>E@?_zy^n;br8)1S|鑘xZnzrR@S:GGa 9}4 `m@2dE"!/%(~h*s뢇u-rjƝ-EʉU>C3"ȝcb-le53LMDPׂid7sFerKx=p IFj .15%q'p"W-Kb.ŕwMn/E>bGeUr:n }BBrb"!*F\T^2A1]o_{d/KM&nvG]x["^ń.,z=>sH^-VDPBͮީ*_kT Jyb{!&aXY{;ɕ@KmvdjG9!pJo]D˶!,]Req~QN\֠L3aëcB9 ~xon9v]:ƂOQKHC40g/$kR(LRptk* 9nwmU&nu]L(iAK:cYl,9?Z/8c@bǛ]ۆ r53BgmCϯkNfI_uW{ 'igAW*%1Zxi1^KV0e/Wg˵I#EIJ:N`;g; dvq{fU38$ɠJ;|ebCsWٓ<pDVp\ᚲIJU.ںv! ԩak%%?iJLwHl!d1xq;l$?Au@r ?Hqp7^,BKU޽Lh<-B{̙ ˑ.K#cRgOn=kVe[*8A/"yS Iqs*CVQ3UEwh" 9Y˹=0$B#0.ceHzGse…1.a'_8%[>;O_kRRB~'yd-8~7hl0hqx0]Na4Òoc>).fBN$Q-#i+.&)õ(σm yu]}a廩 f]y*/H:;QkdkoD踫i~{]:*L ɳӹ!:DDTAHoM:Y"zj9@M.[;v+}{}C #u A2y<8*: ׄsښM!vD K7օS_޼ +/'KGHB&L_E iv"L]C(+Wa|&5`.՚bhnj>W1o>+,&.wU4nd^@l^nǢ#U3+[;|G'Heo6F-f'jYoϱihe6Z/5Kߌc hūx5Т)E :ѹ.O/1pDWHΛ^ߔ\}sb"1.d E|Î@"UH(#bpŝ! ;u O'_ ]ZI` ΌS X@!~%/|C,-'lB{$!?dPW)fcAFtX(x+: -@ګ_ ]>anx>KH"ѷ2 "w`;)q{jHLg.s`]n}3hzشXmwS{ڎt WG7P խM&'hHŗW Le[{`@H=߳,Oxyo=W>F~ 2$8J=?ӲBy7!-|4{?v9m VY8|]xLecE0HYxng:oAF+z$H1 _c{-Hɴv^WR!p%:Bϱ老 wcd߇7""u-jYY὏-yi. Xb36HъkDYDPIz"U E8\Iy隝xG@ qN{Kuo(#f1D@rzd^R5O2U3^S9xcKz.)QHidٸH4QnAi"xOgִEc)8_x, b( ",#a\{o ˠ^vK( OPO`cB *<R ɂ~At{:#`b5ԉy~Idps[o5td{v-SΜhn.%bP~aH_cXClˠXZ=vpt~1W⏎782 L^݌+nusX]E#Eu c|q?"uv^gꆨ1@R"{Ix4L٤;|b28k@Z/%hAu!`Ą@C@솲|2=&-*~ࡘs/PE){iJ!Q;AHQ5ύsաZ眐wg+{@b TXCm@Q> ħe2ӖA4+NںvE[ W HQpF+{XaBV|$Swbv?0fxNԬ,^K~<%$J_]l򞚫q{A hkS~bZ e^ܫHL@8]w;~[T`s7L@Phbk}&aY各.dy$  !IDFk5 &+ڼ{(mM2#Lnhcƫ$ ,Fa:jg}B/ Rj0+`uR1uc"5eV| xB0[OE`,m_OfW ܬܨ ӱ2HWPtT3c&@* 6EV-`  [F"('?GJX$!C?α-<]'M>ZӛDwמ,~ќ蚫 )?tN:nh]qʀ1R?җh(ϽW+N񛑧oJm0È򗥎 Plؚ>)wm+#E<苋7WH 0IHMRtA^ĥS}|g]2M|ټq{鉶D'M0c+:MZ@Bdt*}WM-*Og8j8OvjWL"PQ0Q$BayG1Y}(_J(I4JzⴛyكiJ8' a<`Ljj[e!p]> <:,e@-HWggK!}ʗ~,{ {ߺ.jHBnəvKL)bVL8M1g5h˷_U;>ӯ++r_XK>{$WW5q6yW eW}" @lq*e Ƥ^s Rjyrh]WS,baNKഢ8=)_k"?ju\8`&|XȚ$j 1MBCe1}iDP(Ls0g A&)dS[$. ,[gTR'/^愳Gr>6qVcdžCذOI><l %CcNEdYF%D!ӊ&N{|vg9˘0꺆:ԢL zi̽H?;ߖkRr4'ĵ :9~[ 6F/akJp9yFF,'q=_97`ZW>4xxMF30˜Hb}ڿhg nXo, _?{;ũOpBKwI|'}/ϛMb1B-jݖ$n@Tt4>ds+?;]Ӆ%X޸GG/:_?\}Ez;ʺHi"@Et/>2$)*wu`R89srb|\g_5U6v:MS _i/ WY5%EZw!yPT%}mEĢs-z7"jgʰS :<6iP\fOq{껟ɘO/I<&X˨+@[ځNs%ee^!fU J.%L& Ri\WB);\vM,??vn+a`A]=@x?w+yylb\#l90\µrnDAE+IN'cEaccƇ-%@}/|/g?xbF,oJOҚbQfu[YؕZL$ QM_%)_n_ڻ ),"gfJܿ4lYYz0 pMSb x@h@m,>n;X Y6|8 M\څŤ >uYsw kF9AgsV#9$,@5p;E] /UФx}pE+0P`A7J?66PEuwm|[~wNp]%XpJE8lEek.?ZꔼR{F\iլ mZ}2;֪IqYJ D8طݢn+B=R>E dDEpBmsƩ@G];giSDɺF wEm3yG^|෰!E /{X'L￟,{Ƒb$61k={=42q29+&@"Gv?7dIn0{(3aMQ"qDQ/Y_8?3NJH:-n1d8g+ |fGj%Q93 ڸ(/s?D  JĐ>lY7q4;ǵId{f={stS\)΍G!d;%c6eOd&&iIZ}F҂Y1QHioxV}45򀼛@|qAzWdBM&_ d~fA$z``|-B38W=טeeU9)~?o:S mD]':^q88v5SfHW%1V8͒\FaWk#"|B@FY{ J0 Ϡg5O EeۯԨ s;$¼Pt@D#5D6*xly9}-)R$/;J pmy4lO1Ǧ^Hf+lf_""rR⽫pz-}kZ>_mb8.kmvXTVKwɭHH16 sxPNDPH+4}ˆ &jm֎9ֹ] _DQB 9jxZ;wQ Шv3䊖y;&*`wrbIL1cQV&iW}ÆEIŴq mpΆ9KZaЋԔv}:`[} :a =h5ɋ)Cv֥t4Jbj} {C`dTg;| /ל`yQ?VeH':|S{UduBJܷERX}]NLƞ+h\zG7#'dk@ۉjLI@S2BZVT>.hxE 9,Kp+Yΐ.5t j <":4.+P)_C=ppNsGeM֬Gg/8#>hhlC=ƥDut"@IDAT=/du&?|w wO]6?wz"(hs#eyw'6LI՗>~wg쾱{` wFUTU>˂}Ow Zq$4"ӊ @S/$?|ʁXvl\8Yq# Q(cum$0FUp2H .V_pznZ!S \vZy*_=M{ن`A5nr? Wmi<|C+hR1`;p"`շtgss:7$㼬c! QxUyeJK判Wsɽk>Zʈ Lj$+- HiFDs^dgH·͈ʫ|AJ94-H.L+1vE׼/B['q(Js 7Mr[f r+ DYJ,v^ʉq`S!Jb(v;P?9_Ig_-Exa8.eui%/aT._%\龙;=[6o_#ɜ 'Ű?9t[ W8it!p ߕ]?":63\ywHL)T繂DӐ.~=:s ck`bgGu[SuQ@Z!n쎢ik~@m…hcu9]DCXt/LYHL;򱰐脘hf[;;38Ӽs:w@Az]1j7Soi"JS>y++0^c#`cz?o酋]S8w%EqGni~4KǬ<z𳨖 }&=!D5R6Yiw6TͻW^vf]erkw3ܖ <8GNV\w>)EA X,#]DG@\‰vO`0̃nEh#m̮J1?Fѓ'ae= hU? V55тytsn >!|cw.{)0ŪSPNMP񍩸'G B L(¼* F@` 8!&T [&P0 Bpyi }[o+L$4#Rl.ɋ_ކ6q$j H108$(3asp$8H 80*z'# S͏%u_fNzHx~T@%8"]\K﩯p JwVG]~[{kҭɓ$~BG0$&p҄6=`ݶD;b O }+# ?iܴd_\_ɟhY^O3Mcz c=٪&Uy iy1j\B 1T܆Iw>?(.vqz{q 뉯Q î?REȢ%0V`Fb=$(RvBTqE^|aE2NR:Ndt+u*/%_@LVV衆qcvmyr$qKB5/-(TQOhNH_ v++Ԅ\3jpN ӁƍG7΂xꂑB!\~NlhZ^[3\A!~Ǽ,qЕ}x}oCcoMYCM (JX9\u.%YBX#Z6HظXP 5CWd᧏W(:6h?dYX;xtrC.=pcaPlBWP{;Gg$95ҤpќDSؕZ4Ôg0l]_"oFcGPT/FI"Npa>š|] ; i˳[mY;㢂F9;0?[7Jx"t鱁 _׼1[ϔνr|yߪ~Y;~]M Dʈ*w}_,iѡ,L?UGs$-BZR1MBB[K.q3 c #an2Đ9Ҝqp 9(#Fpi |CB¹'Pq"bMNo^gwy~F#kI8boWҕ\%g<bF̮0!JTL/;"8]AY>{;:aT(e*g]b_!vBiYL6Sa\.^I?b% RT$ڎ(wǺ7҃MbQNx8UPSzL,-rrT0g A?u$&6$p8B(',EW8Mt8`tȥK:MĀ0^bEpnXghO:-s[5oJw({jWQ|W>÷9yZI[R# !Es~ Q>6«]HD؏+ᖢΗ6u)'O )5&RK$͐OXW?t5s xT2?dRƀY,z ,\Njr{ XϿ0kH5~f<01PR ,d.)89}cxe@%^M FYyo% !5WIRQ;7.Ѿ3,*=IWȠ|clV'AOEs~Q-q\P,sn}7ytg:NdKx}A8P6(h'j67~(Q;D9 6.KvO{3,H\Q4ɴ~,c59jjR2_ oӵ¯ЧĆ?'z9NhO9_/}d՘tц6PgQq0'`"3=~]9y8I5lO}±!<=i`'QH cC2}sgA*,ӝKFAAy.A<)\wД߉$03 @(&F@ouʀeR Pgcјȁy}xw|_7϶ujnvP0&>O|418Q`8?`wEXqOsNYjݨSb8c6*Sc$EsUe)>!#HoGϼ T̛L {I%fa;C9:4Y#&Bq {֤AG{J\@ 5i,O҅7 @qY-}j۝wNlhȬ.-f~G5cgGc]zh 0p΢w&ɝ_ r<~zN @AgP/p C4!>IS *,Qi?G"SO٪ՎiY>ku^w)UPxUjoba`xUθv֯6r*pِt} -ڑj'jjQ%Isb~+ypɢ(R߀~r#_hJo:ő)x욹v,A]yB%+mT:sM*F@Cwz1v$#]Gƒ)dX#v~ c[_@gN H:r Y1t#z({@ AnD_U(UCy%E8s17j  LtܨX'̆ہM-0}I|t,,,~:á[_2Ʀp4 ۳3X*Ҿ}f \;ᨔz/FIđX1@#R>cdcGin5Ya?jxS:{.}عĴI&D{Yp 鎊Գh-sAvk&OռūPG3g_б#Nׂ13׃}1l*̝,|9zbps\,e l-9-OI#cCcZE]"8= `zރ2Xx紮QmrlOI=qCe:;tN ώ0*+;GP(Tn'@ -QYuZ7q1;Yj#.7 L1$U;YTNC|2n BB a@[VՏHWkjmJwB[J{|:+qov E}=ΟyϽ.)6<e}cgheBZԿlb1ygԢhbKD,E!s@6EB4H|ED uB,Bd+2)'8E("xAot,"v[ӐTo!Șݍ IwECmQ%(Qe3廬-ɀ>x@;;Z4em≯ LSJ\";<oaF@雗՞Qy_P8hƳv2+Zn^|?u1!pS 0ɍ{LePk{Ll\!0nHIq~MOD? Eş0RE)41)NI&x誔!jA06/R^v*!6gBc((*Ą8,+FpY-~&L Qc:aczFa>< ͚ce%S{0]G,νo((xx&O3_p@<]3`J" qAfMӣOcQ)Lm&t1МƁ(#qgIEy ӁׇW},"?̟*FX4E'62}JgOB'kN%Ĉ-O7.K%3.4p=(z@J:Kgpѡcy.)'",(?]M:|7i!g笪:yAB,{mTtGƌ?yFn1F[]6ȟ0[lfQ(0.e~=@(rfNzGt1:NÊ_tGP`a4_לr B07Y__;3oȕkݭOa8*z}H31L[Q+ DGCH(N|_vҦ'ێ$~bBH` !X>O/0w}Xy#J/3W7=+%1Vkb›".Tãʂ"_޳z{6ΦgCœDX[}_>S؁hXύn/ԃ%tm䔵 q 1!20#|nl$3pd&$ Ď2L$ UX MPgx'PbyC/@j :QQEXJw#4ߐMbqͽde68ָ̢{2B 5B =vϖK,bGD?V3C 2Q^YNA:pi*N("` OUmr 5۰B2ljXΉzx9\8;$sBh櫭2v{߃]%/>p3.e y闲oϵ&Psc #r%X%wB :L)C'cJ_<5!s]Y&D` }Heo7R5qz .F'4ᗧjU{Y %Nb;3ܱ<BfvJ}>Hfy I^YL=UcENT6ju~;?w!X+n];Ip~X bXGp8_}ƛ! 2"q}%Z"r7 ^db V\ƏY$`PN5B#€3+3~ß1`0H`Ptk+66,j{1@OfG<ʏ4_50#D!ew Avd/[TiXǶ'sЪPXe _̂ZPtl=<s'FiCL|A B @-õƵa$ag5~OZp9 _nWpj >`7G 1 U4Uq9큚ߕD~@`$dB0O{=E{:E(Gϣv ,GO%v"uf7?Ζ{7q"Z}3,I[YZi O+Bdw8$)7dHMbL*or}$XeLL_nY 7 v6(z@BScpiҒ R:Dpt_@$=!d套{7O?_kGaYw^Y|7Kx z/Gac>$?Cbr8b%C-Ş6px:RIG8]'ņ1 %ܟP SayOvwVI.K0w&Г'F| vOrfg×Q-`^`<0b$T>pz@h `ua~ɰLSlbe}|}t=KP\@(ZrDH#?ԈC^kZ6_32Td|iP%`1+,ᄋ61y-{yi9Xݸ2}ZT &0*$#,iSc}Չ 6ޱqҙ/>ץ_8֮\r1bF ~9[ɽ{Acˎ OkrN ,DԴacfdHxk;38[2d1y勁|hOO_-=Éf,=*E$Itv6mg>K̬\A[%ix[STRf`="/(dŕLP*VDޛ !R^XJwkbG"F*}ĕoٲ hK!RANniQ3M>W21uJ-N*(_03̀Mh{%׮})F L\6ݶphz{7OFd+V@#M+@l8+vF? sv yw$cAl*:[1bFh7%AZrEoƑM+ln{jq 煇 T@؁Iđ/Jqol['9|\U´E@2n~#?`FŃ#uQ-\RH4څq ޫzNyS9{;+VXkF\U ([u(IԳe׬K-%~mΒ2J՜(|o0Uó MwD^ A!?QO~c-5w 2L7FD,T_Df?Zyz{ b&0c5&SU6ܙjtJm|I`@uwL@I~&0'NĻ C\ |CDIˋ/&{j.:M}1#^cW9 \p ӻ#y{ :xDr'熦&d[qnr0iѶǠ!Mf)@b: +KsZFJ Gd3rPRBm20%Y~`> ZO`7PmԤ %uD$s01g3` W.垑L}U 煁GgFM{d^RYsDF}>{ ۤ~?CIt=s*qc q*f01BI~B8x~~/y[eubۓ·`ZF" ?ϭ7"EiFPX RWBm&ns b׽6rS /Ti*[`YR`&@7gt&Y+Ou@ izٗ֜NT:YPFĿmMi ]vC}.5U8P&9 4:QctB9+u(Igg@H=YJg!⟿{-'DBřJHN%4jᄡ1G]"ޯ=&eyy]/ou0?BjE'D.VS4z4, khLM{6V̏'7aMX6Y|"HQayXjhYl)SensaЌ ^bq3U"!C)Uޓ'*o;;}(lYBbLN ]l#y$Xd0A3XXYP/?xtpl G|N.@UF,¨_Jjy Dܯɍ֧Vq]E0:%MUbGAu .~ iI+ETB? ӷR$@;/5h&3Pt?'z\om=FwJʻuC 8za׾5ܘsB' ֌z}(/ waev P'pFj83~@[VE".~bd).8qbMLqi3:<8_^c<]|pى5utEK\:\{l[:gKV6iYUuI_&\&xL<׶U:.t_Jׯ{e1JT1ѯ0̎ i͹_A>4qR/0O#_7఩м4whca4WS-=˩L0+KA'/=kkHo|A7=(MUϲ 8`s*y!mbl ;~l(h?hNO [EëYQڽ?]-]+@ީ:'=Ӕvy}e9/ed]%˯$T_x\bI4kt^'%ڙ_6};)[V@ Y*Gl ԧS3\WHWΨ],8vF,[d CG`#0\>}I63.&:>s㢏JDpr|.wT˹?zWg?'?JPx4zcTMc7ԌW2ݦضRO969v[#b)mҬ4Dtrq#{ G@R\bNĤ y,}H߅Yof3_=3rxtfeY-ѝ" m#OBS40_%-ܼ0rmgGE\^H%,Ontd^^58<| LFG)|J#'S7dBJ‰`Hq$zbN@Y#T:wҭdY 3O鶔OӛnZm?m\F.ISPG 8?t:JJl6UzGV3Jj% 7rÛf=PeEyz";X 嶳=i7WHhsmH }L^r<|rB- 2eҧb!y26N;r!kُ03ިl6$^3?˼1nOwXѷgC7/%}8hvr[m@e[4*ߠ2k擝#s|8kXUiz$>^4px P{7(]Plkh6F)Lx8 c?ù6F7rhZ_Lʇ/:ᣞoܐgLZ%?O^~ɽg-qbQFkr1?D$$dZHlG&^= c Ňs;72py$Q_/zb@8|r1nyd:9<M%F@Wx%*/u.zT1ޑ$xD/hI*dk]#yބv@P=lW{3%,w:pOg+r'7?Xf'o[.G$w"FD"b-&s(^LLcB"c3=SW_6nwLsy3ildb*Ӌ_DsC_x"WF WWt"]Tr?SRoX |s'Q֢_@3{Hm"ݞvҏkeՇn.'[TdB0+ϓ Yᡘ~m\lnz)Vk9Wu4I޾Y=C}Cf0*0,Lf*eB[tr֌2NpV< PC\,0.>qLHMv>1 @Fon.#HVbXƄnB(mndg!^92uȥ0Q /6w$ \}4[0>.nj 2˅,8KV^,VSu$'Gxzב%I0oke"xڀh%-I$#^R"mԶ\aoDY9c?1h@7wv~1Ԙ1/>]2& ۘt 2>-`ǿõ 31,ؚ_ "/lWk(IcXze?n݅\oߎQbq%O$Z9ch\B!CB1vkjA{m5P6"7Es3jY972fignP&q1.d񅞟hDbd2<;;) Qs]bRLa}Eth\lX N9jltØ1"n@߳ :^6=N"^Hө/$"L~J<"@H\zR0+:``As~ v`b"}AԃwamEy>N٘MlZ|#m@[? @%7p$u-z}ø+&zbMMC"c^6׎) ^(?b5J5r1 K2ENB`w.(P7ޅdZfY@ t`sW (δ,>=pAcL\݆EC/?_DC~lj|=b)nV]Zq`z9@IDAT4' /d|rQfrs)? K,81 ~u5x)PI%k  Yvdv՗<˞?Spo_ ts.1f@O4I1z .LDL+QD"[ݏ'ʓl'W0,v]aYYTi[`40NLvN3Nv:+_&ˏAcq(̢hS( ݲLNGPd[e`t^VגAg諓DbM!:Qe~Yߌ&&kOgIZIPbx!eiP'{ɂƲ#9Y#!AхBAc@E{fK P nWc6n`ć@!D0Ri,{ x}k:vC/_ǗKd^98UjLpRA%f/7Pƪڜ<l K6?g) E.Ù# ,7fjZ C:$⬒%X _7|YFde6ɩ.;Jb@#*4H/喾Np q,7*}c"B@r{_ ;o ~θ;h)sOJk0 (p<-; 3],sWQiK:CQW<\;.ebl5O1Kn3w,N0/I~`.HWH4M?1OjcyeԌsO988B$2*L3]"`!oՉkD kvz)-|(WԢQBv!Q9"uqm3kqxEl;x>3uL &႘h(Sз~֞oR!!ܱ81dyј%ƹϸ' Q-(EC`|a9N+#EA{i…ݓn[i-b}65y@*mU2e]Rzy.){1nS2L;/*S 4cD}L7G?ۑ[}h'?B w8ޠ|OOՒeq- 2oꬬſQ[=0)nr@pA[KSRȲU^D?E hxKWt܎sDȋn;oz]\ۋ*9de +is~6?scl 3kmZF 8eqo9dz<HTs-)7;Rc2M76%~ cOLq+t`5S栎Kc!~/?4H"bc(C.}%DTveey;љzހrǼ/7D g^ gw,nFO(2nұY evm$v}k1 ޏv9t}jjL"_k,ЅccrNӟj$dKQG.B7 LnE՞};Yz zB^oԐ7GNS3/$ލY V S\P㋣%ߜzV;vn N72ąsRmWŤ*d}߲G3=ûWw:chTo)5D&Ȟ;\s'CwF>wks#`6h4,MHeCq?{2fN'A[qo).d_1 HO΍'0H >قD}Yv)׈BbQ' p$PL7+pY %86WNS&H i(kOB(-:]K\|5 JՃ|@ fpܮXQ K;cѡkw:z/hKZ\=y'LiV[aJ՞dOvCH >qZN4IΩE[N傽q664c~MO .~$gL=XWOˣ6׍(z゙+ آRqLx :s WB?aϲmNg:I NH-_h4&xѶ}(trߡ$0R77\c)W~G:vAܰ:5-S/I$-$eRU6iI}Y(te>Hw0߃psK:<GS4acvRщԟGra?3̠k0m?S/<,WֿH*3ߡ۸G_ D+}d(lN~*7ӟI 3鶅6,a)S0Cy@%ň|;y-1cM ryLjLQFсOu;2#?,OK9g4m/#_K|7 Գv^d,o9a;Db/ f@&x'k){FwI^&jK@W.? 5gŰ-``b^ĸ<.d)ѷenǒ߈&b`E|eF3Q u~}zwMBSp̹r0Cpl6 "tKgwˎEDfl{o,03@}c?Mf)ևCv8c#T]SY;f6&"U;>V!8)e츀i| Gd2۟"t nļ1v9kԉ͋ˢ2ÃƁ9 ~R+u{?. cg Rγ@ ^8>f= W(cIu HucnRYY"Y,sƇzikspz4a Mf!Ï n‰3hKJ/KK3Ҷ~Ҍu;K ˞N S_~7/Ň78B,}?L[4@\#i;~M95vw j]sm1~ =v|=wOיm4& Ϋ/ln`6H?qj Ih GgffwP('O q|@ȩ:sc¡Cy-+6݇aE@mxhe[~'2g9QOn<|D*;U%:&Mmq/ 3ŰxWF(8Dz^iWf^W*n0@r! D֯zp2~tH+{4|+Y{$Sv` (g!śS"[6cn|_&s^r+fcžLohaa% puƼf(wm=mv%k}'߅yZ4} Frv+!!(2^^╩2ѸM 3~`r̸W 7%9W>e1`tj;w̙w^0MY @Y8(&QaBdP\ŀ%0vyM6QDp|羽tANV0+/'w 0h9 EuK[ZDY/v^?{WFu7Sz@Y؇Œ)ubMS hN1.;T{7Z cWwbXDsN oX8c)x`>xof:؉eGR'euGL<\EIwgq?.&u/~CgEx0zgs?1#Lb@%!\B/Ǻ C$O"̏g m‚#d74x6t?=ŵ;ӧ-Kk6p[J{7Q|rȟŝ{Ns'Չh 'RIqw_ T1_볖_X9[+Մ +/tFܥGO3=G&/_-.Aq|Q*<寈!ų"8uw{RBI[pc0b8n$7 2F ݈"hVS.E+#[PD΁Pkdrzt !MŁ#-Ox)R%пP6U뉳"56ZXzy?yBp8/Õ;\_ڑ _oF},p$iʊFeqSW8 է-v!n A0m9?3pi1s\NJ ژ9 d}"{mz 3x+vPG@[tJԷbLfhKT=f=W̹/Zͅwb8B9SP Fg|H9SRӆ'/DpA\1164өG;Fpgw(s-y T% "&ߊ1u~\  WeWn3qA"PLόqq!eNzyI@OaX'>Tt. \A~/`pу Wt1h6n16j#}2E婪MYI2fMd0}xxJ56accR2 6qsNJ@-FhcSKHLя0%VFbI,2$/* =?7=ދiݪ'ÁÃi>b7eq=?ќl;+ྑt k 4I$;nD񔉴ZH@N}I˪'G:0YN|qeb gpo i 2c\*FC@':]yOՀD@gagG."~ d^؂^rJxsT#AWh71]~~n >qKHPE/^ju}.Û+6?<u>5qDoLjeǷ&A y|hc $uD?%H_:Dp>j_sD2ՔBv,r) rhdNFAE6"SӺ\8/ +v꺕u-d6*e5r vBdI=}l-%DxVGyaS`|s c U0$]:W~m`1&wr"^#p8) QYMAS*tX~Zn!\-;n `;yyZۙt2u}䵼+c8g-9a⢨o's'M|sOJQJ5qI=%kk}7 0VD8 7k:f38cPyOݩ̹65W͕J~+3Xfq5\¾I3G82 I˖o^\K+s T? W4p斳k~9 [q߈Ob:0 ЛXMלc}],UF}kC&6ѕUspRxi{bBXw7y)^ߒ@>dpZ7V{|BC`vt+VLFvІL7ۘ` g (1i}f:9S]¾ 0Tu;'.gКh1>~0~ q_B_n@0)ڌ%o]3=y0)~POsq:-  t[Fܯ{")0\y& ht Pk~W[ەۚwvnKgu`L o]J;.cŖ}Eܹgؾq{&}<Ǩ}t >~߽+WuҌ` Jm)˖P 15}\+%~7Y}-]굦h< htX8fG'`kI;GCS3~Z0giӚ;B!R0n0 ^Ѕ¶Rz彥q^ߠ],@8@†jvakǰ~! &SmBjv7D*88׽h* KӷIDW܋0`I}c̍b_ ,b}) [oqG[~#_Y_MĤlgϖ&vvaٮZ,Xl D2(oL֎nwk#gL4(Kz<֮o$sZ(Wa.xb.-XpVǙ겴1zs`1%F`8(!TR$Ґ xcƱwp}+ٯ]K8Ac'_ط7AƻmL?dSǯ&k9F:S^D#p&ds{3ܨZc$"i)g+7' mfcTyqA5U>4ˆhppG^_|LHPHGg<0&i\ "QaCdBN&yEfO|>ä_v L3VևzaOO& ӷ>l`P|[{M9].`s=oS@Cvڊ4S ir.ie{ױ T,*/=ezO׵ [Ɏsnw#q`5yKo$CKt.ou۶Y܆jد,/fwʙ3mӑ*k6N~6ƴ8"VᦽAawDUǓ$yЀ9Sy /A dІ5Ieϩ0te7HJ7( m ѼlzuBGT'u$q2ʎ2I@@7ʂGćGD1_X戮O:Mfz%W집|G(*qnZ|y6eo +P2`CW63-[8j>ߑpM{'!)Üd,$옧tȊ&(Oa}˞r{U旺uiuax xfD}< 2\>s@]u^rX`ဣMo;@EJ Sb4Nϴ58F˴s5?;Lczim!×͍XYl^8Gp]=6hJg0\4n 1#bFDnJ5@i3f\/tCr8XZE,Ik?. ޛz[z?T@ <`7樎,3vE.ץPw~mu!.Ep{"m$Vʂ'ځM'o~dbcUdUJ[CQGl1Dw(;&vV…:]43 GW/>_}# PFb]!޸ o@RdG nl:y,>- ?xD+b2IBKbiau\w]0 6 LB_Nwq>F,6FꋈXc!gԡdE#mYS&M6\3>5n9> >gsl U h5Muq,KͤbљǨH bNg>sDrfT9 G͵k"ݎoBwI;D :19Re4ci|Ί֩])>?HXw$#'n'SqQi=KDTGni:A̹,{6{I-_ɳ-9bF"wv4s״Da_uR]X*XmrA#8ғy̅ 陭l<Y{wan4~ND;?ec.27w؏f&7 3o<&5)5k 1`Tn{Wot 'ȔogEY!_]IG o\lL3kգE# B~e' Dw3ϣ?`o%Oe8##2Q=Vk6!VͶmYGGr*]5'U'5l L9 wCBUP}œvt?cFAׯ[csEqz/CW{_yǎ (עzV(!0J_ ׂE pR/4ܠZk̘ eki;Lncv'Lx0zY "3Pe`a @x7PYycqܝcD 7⅋DjqCqvк$8[ZG R/%9 .]I\>w107!LK ؛oQwk"Q!1\0o,ꏥ!bnYC'?:HY_@||d`J D-q:rwg;7I"^Y7c,N@2>$ ^NxM6KD`2@ \Mp`)&y|G0h_'@:pxZ穘N؅UǮ v awtsikFX{v2Cj6H6ԑeF]EtA]^rk!CHit0tp0UZr_uL@,=4lQ65?18M&r2;Y曍%qwsJ b]]i21 $G.8FW6~261`.wA g?qɛDL)SӃ,dgD'R.8>y5JR(k{"g(g9p?r'bp/΂ OϿ/ecx.Jh4 k9zҧ|&GGɮv0q:X9wI70kC?7‰67;{.Kys%?a &bD)]0;'neVQM:+Lq?1[~R,HYbKӝN;I.Y/ucG.\I@5쓃3G0$1O)8gx-}bh:hZ}Emi%o@S@N&(FBFc` cr1z}x-(vx`NGb9q<|jn-&s(1eoz~W?կ<1cտ@p =X%,#~+Lzw ɥfЧwzQfx:|n->oP:]ؾa~4(C`B|ct^[fa S*j?v+,@AZ xCY0K y/(/.e|}:40RE".:̯gU\ Y&-4f3ēKs[P? $񈇹.co:ؙy7aLi}_gs%*`$0X567ێ^wEvJ<1)!18 h<(}** bu&|cb@]Ddj5M^q G?8| iG3?h[Sݔ9:. z" 1J™!xQ!1T^Y0*0v ṬJgɕw]8w8s&?ϝ3 m~kr>`Qձk 3ʖWb83& gPa<ՙ.)" \&Ŕcڅ c mL Vf@a>w^xu1+~uPOW[}]{ECS~AQ2PLю}d$g~Zݯekp[hc]ksgЬ㬜 pb<( };~L;"2+Ҥ/tq#݆Mk/@kBPڣ~2F,BML{ _ iXa~fa"sx I0Mx#!@}L gL1S! 㰮a"pQv[:L\EY WHs9ඳi]Tj85s!€׬7_",]ʋ<_a}`Y,k:#}Ub[k{'WP`0?Y>`SwΈGpz:7敎Ȣ@fbv4/iN"Fw]lfu:UjݤDgB?1N"ӨD.. yE-?zy%1+F$?neթ|;]0IN6S4 J3%e&}eѸ|<rIְI.jFt~UvQ;}O+kBtva&{>1 î|nV_ =Ak7Ơ淟4W[bڜS[XjFnu@ũ/-R/xH"vUl19=鮻(DaW׉s%*T?;kZHzX]>WW#Dl\{81 M0O[#nshK}>o*Ɏc !|;Xa__g(̅_i8T/|0hQSQ6'K\a1бW[|X.>m_7È/H(G*Fsވ T*Xxp኿~?b_ْ?\L8,݀mI #' BRʼn1̅o)]0f9+CV1thqEʶcҫk9J9HqO$]F!o:UyU& tF r2~!"믵;=1l1T*Mh]oe9}cVJLgs}[XFRG x & m/یN_w{\38Z=wpO\Wzcd Ǝgm@Ew  nOJooi BLZ 3UF,pIDATΙ91`#k ;,NWxX;ps`O[NE^hFg7o)4nkGJܒ乎bA&?įD[|Y>19!G@R5S`\so/a]8ؑ=g֨&Ĝ?+Y;["0^%ygLV;,:>F2u+^ _;Of$ T`:MBuGɑ㧿: v  G61KS.(3zoֳ3  A.Tn96@,nQxt< ICM9~-R ,Tw1vZm:"hD3m7 <ɯ&}w-y1{Z*dAWQ5NoeVO|+Yg"6b[0mrw?iOcK`bBt7qMKGh;0"y&N3u'k6Nv%Ϡ\^p:p8/ɮ^0 zPƔ{m`p"\2`: Lsy(Nɻ, v}y<8 YУ\##E S>:LT=`MΆ|}c-2/_E5gwؙwfRY=3;⋀§Gci.#C}5R vB!pU0*`F8:_ϒ?Mx+G?_''ϘSK4+$-Hа6*F0ɼ $Wl*pح~a@+jo #=>aRS:3$K[㠺hW@'hK{>u<;4B>(K(k!_p//5wާk;r<. )|'zH˝ ?@8Ca`lSѸ\h\AΛMn st[ 91=2aMP%MqGN>ϕ/!.t"&5yY~)D*~ (=`ƍw vr_^1 3J{ 1w>}a[I~V5|>N|ҕP?#vKzڂڌmqMIm>3DIxXD2wc";,Ť3 R-{rV=ʖWW0P{]'lt"E E(Tgּh.!8qD?a2`Bz)!pe1 cnПH*Tm)M6U $ٓPY,%1 28T(o,;`P$ "eADf7옒TS?Fd #YǀLc8_Ғ/;'W _@,ܽ8Σ:ׇjR*m{{}@/EvX@Dߋq/#Z3܄ؔ_1\89-\[s;huK &a4LRa {#e]IDvN4XC;ʿ"ץ"j k]+ m[:/ M!U,<3gܼP * Tx03uGBhnˤrpS#~a)[G[_/ y15P_* TJ>C x$캶U6^) [r2b8%LLKۼ>)u[ԍoSePԏK?T0Pa< ,pa}"TT4k3 @ an]ԍqx܏x}o}>c5[6Ҋt,Ϊ2+ T Pv Ri BFO *&ow !Ub ^z7MO45okyK?+Oi`q+* " ;ubJ dUa ,o;},PL! ~})O*& |[cNb* TP؜3Q2Y$woZ? :>*.*{a9_U00Z꯾1>^D' jc|sɏP@vQP.34U` #oE!"En۹vETU`&~3#0a>EPA pUf\FtjW K)-e+tފi0Lv`&+πe\ū00RF_~,.{M92;5ɀyclTK.R.7Ş@)O* 3*`{V7d1k HX3)Ei:Nt90 ZXCYxkzulPf{0^՜.P9~jsF41~w|,8gYw|Y0X`)| E˛_ecaX༮W_WcL8ST_+ t^ IgU"ڦ9Xb) vSL x@=1-p-;~Ünl4(vs * uV :ZI!wsؘ5Ʋ/`鰪r3sw!EE1R'nhe{lQ-_øe`CWEsv^ w`R.A#AUVbr1^dbhδ(r!J,X,\ES9 0j./= èB@<P%^fu},yyS+gao@k[þ(_/bZ7OWrג{#ɥJSa]l3#BDqɋo}X0YM%vW}X+}]GG͗ηKv7Uw[%Y0PIQWR챣0Î^,F"w(wZ j?yrHDf]@׿90?ɫO* 1*`;gU3@2ݯp Z֙j2S.z9)}~qCe'Ɯ3;.>PgW*+RV05*kݏvQ/&3'zpLMr~ -cÏ~<;-Ni0'@تDTP\¼* =*`h}Y>K.Ů-m_ˢWa`0P\,Vؠ<3 M@`[a~aܯ,(ፘ`XTߪS}000vaAvw/fAYU  uhiw\Uo{g :UЫ˗tg>}[aW ԼoU+ T ِ;^%wSԲjNj -n˧nT* `*m! I]jbgsƬj 8 {1Ԁ򯲭0Pa@& 8aP$GLysn0P)v*M =c E=Qryqem|+K Og危{2 "WA_J1(Z)TU0 6r8;?Kj٥E ϔ\|rtsSџp6j C0C|O;g@%k(kju+_H>1<7mom̋B#* PV&3 GwО<b13bf^geZw0 2 yi+ o-f믿Nolh!zjd1zͯj\a ŀv:y]]i['g h?,vA-h\(EM~Yph `;=ԯHIQ4!1g@h1uWsIJ&IDTob'ɗJRvʼn|#֪"[J'e,>I2; ?]U2bM~ } jw~BYǓ;3]*U?|Pj:PՒ??JٟDmBiٔz00Ѐ|1!n3 ..Ӳ{g8_ k;{\oIa7pх|LZ_!8ע/!%ӵn K΍g906YK~T\VU A>qP:Y)V1!δt~awaik$wI;>Ģp p! y bxu \>;6.=%[6鯕cX2uGZ:zdSO[c=$!?|*\>r[~_\|7>,s8cII+v<#Ogq`}`>_3K?n6pHppJ`^G8LܷȧDžՉ,,֣V5ҚHz&LMCϠDR~,8bϺ91?T>IENDB`ic10&PNG  IHDR+ iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATx{|}5{ݗ!4PPPHJ?ZUUUZUBSD!@H G7}}m1g]k̙9gf?>;{u汿{_ֽS7zgxIijɇИؐV&Ͻb&~?ecc#lş_ן ??5.ڟ @r l;­j:-@#FFAeԩn7t/O|*f @ l nuV?HxU>@K 3Z>τ%=F&@ @3tnnVjG*}: 95 |ӟ ?f&(_2 @X8rH'ڶ %L"x򿳕/ >_ @@g:kvvl!@`UiFF//Oɪ?d @ P(STt;[j-k;q\~b/~W~韇k#n#@ P3^*PSU P`tr蜘W;|W?%NS>xFq0`@ @@ V7ND |ڊ'㛹w׾>OIlfs @ Pm VA#nw#:9>TJ @R@*u:OAM] و URx9n7W^ /|+%EQl @%0S eNa  \݉qW_7x@ @@f @ ThiBͭή;w+ObR!@ @rsRS*čn9]Qx󭷮Z @ P$ (@ BT1w4f{s;S @TKJ FڬF`ܺw{ @\&p@L98z@vwB/ua馞8 @ 1>v!@ 'k[!Mh!@ @V-.Z n׺*O @g/ lo-4ꦆbL @@^yIJ  @C@`$@ @+X1-홵jO @`}볗s :5* @ P"2Fj~B @U Z\~t{ *O @`Mkm} @$ &xW9 @kX L.pjã3? @+X!L <>lã& @Xh%Lx3G6)%R&@ @ %Aq:A8h @ 0LLv"L~ pĉc@B @e,CU p'wzv @.dzV*p~hp2#@ P::J'@ (U), @ llFQn\7v1FCЁ}l%@ @ @xV؏w ;;gk3l46|xxp@nkh @K@`]%0@d?u;ЉCFKZo6C FX&@ @ 3 PAV`T @ \Q /vBp· @XJZ> ` $@ PHB6BG@|B @ TՁ9&^fR!@ PvDKlVU"@ 0d @ @(_)1L87 @TN@rMBN 6 @@K @et[/ @SHl P=w^ @y?2 PVSf @ )1T @V) Jmy @ @5  ^V)`Ujˋ @@1.JE WS)1 @(e)49t @' P6U# @ pJ@ '`@T @+ 0 Q22 @U@ WN(l"@ JUjˋzI^ @# PP @ 4J @G@8m$ @ @`iK08m$ @% .yX*E @l"@ޢ#@ P6+9 @@*֠C @8K6PVU% @ neO @ PZ6 @ @f'R PSx @ ,L(e0 @YZJ9  @,C@`$@ @(X(e ,Y @(@9I) $ @V@Mp?'  @TK@Z6 @ @L3Yl$P=צjD @`yK @J* P҆Sl @ 0 @ @r @,$  HmJXJ @ MHbK @XjB @F/c+bq @(@Ca @ @r*U0H @V& 2j @ @ ^V*JeF @pk"@ @ o*ET @V$ "hX  @:֩/o @ "Aˆ X{( @u S_V(ز"@ P@6" @ @ @(@E @ @@yJ@aPئQ0 @+X,CQb( @kX L C@u˓ @@QA @( D\I(j!@ jUˏL.y @(@!A! @ @r+u @ PB4B @ @ ,W @ @h @ @X  @ @@! A` ey @(@Q[F @ @@9bJ @U@-\ @ @ G1%EbO @XRy%N @! PvP  @ TJ@H, @V- jq @ @5] @ @` @XeI`fX<  @G@8m$*_j'@ @Eo!#@ @9( e0  @' <[) @ @)r\_ @(@[H$0 'I @(@9M -`n3 @@ZS]\ 8"@ P4*D! @@_  @ @.uii$@ @Z ԺU @" PVO @@_  @ @.uii$@ @Z ԺUNXVW @NB !j6Z @M@`6'{ @ @R  @& 0 @ @@J| O @f^ @ @n>'0@# Z$@ P=굩8[?{ @B@ͬ @Y@έ @ P4]? @@ @ P Z4J @ @@0>m @8&Uh @U @, 03 \_+> @ ,`%0D @T @ @pk"*U @e(KK)' @X@@`<(@CR @Y@ gP @ @" U @, 3Ur @XjBBhE @ 6˘jj3 @(Ts( e L]i @(@[H%?/I @(@)M 'gfo @UZ3b# @ ԨU m|5'@ 0@ @j PFVE @ o@ ԠU @x@%LPfT  @ ,`%$  @' <[)(i !@ 6˘tX @U@-\r WN @(@ M +b'@ P=굩8%zB @@j[S5mx&@ p, pla@eTmU @Jُ@6JzN @ |B < G @`%+a u L7 @"6ʗ+i @pjPRRW0Jl"@ P95 8)hx @@=ԳպFרU @x@56̫ђjA @`1g9@N0mh @V'D*6f?l"Wy @ PtD`kc34vvc7Chm7a?4K4 @uSkkiҭ66iL:ߊCZGyO/u]/m#+8 @% ,XLOqqm8Sf;qO @ @`&D|4V#lmnxu~3>ވXto!@ @JP"tU~g{+oOGWKT E%@ @5ltUO`4V؎'.go @! PvP O޸+N @D @\sqٹ.igo?MW:' @8zj[\(p ' y @ Ŕwi4B @* T5% @ @jUkQYX`cbaD  @ P8g:kZ@"( @[Tzhwz  @ @`Z@`Z  @ @zkS5ZPãւ8 @(V{(MA)`.4b @ @@ v*F @V@M 6CkB˜nw4s1K@ @nukq]X };~p˕+  @F~C h?? G.o^,ýЌRڝ22 @(])p__NoWxp"a"(  @  (ͣx}K⟺XmF @Urc8-N7`k;zh,7ƶlq(ٽ@UG#NB @@A Q^{(nЈ嵤4^EGx @ TeիVH?v؍h\=tdVO>& @ @ ; 4C  ۱gfl?qxo?8y};㎗i @/ P6T SV[a+6cO&K]ĿOW]{ ̛  @(@9M+$N[nw@_`!@ @@X X@ۍ Xk#Ȝ @@AV`0$d|[2>1n'wvlFcOVҮ;6mbub7>^9YTSu83͉1فe߉ǫqe>6Ha0)@p~s'MO%H=';fă 4'0x4E80[><ޚҜ|4Huz~{x}6ƨWZjn`cǎj#@t ??uP(0|'4`b:W~Ψ#PTtҟ&l;?*|lgA8=NIVHħ__+ !Nt]7 FF[ك@lɟhhwz3ku$ d@=32xn,'Efd|S $ .NvAXT`_`QM( 1яzgCЛ@" k @:kvµm7 L,pYR1Ï /$O7 5LFQ =F+GQax2B1m˯#k3!%@& [5irլY+ YU Nԟ ? \/J 40ܦ¨ Ez< &׏O;Nc12: ? @:?AMAEKH} OcPIR`G DZh:kQNL;֮"/}9/j&N1%PW* \/PW'C CE^-ST@ v0wHph}8 S6oOVl%@`NAѻ #k$pXDȏM%Ɓq  wF LB\Fәw5Jfhv}᳟ؓCtl %_D f~8|`#Ppq R pq}6Kz)|7P)EH'GEn"e#pJŗ^ _Nm 0-1 |w@Ϙw^~%/n}> 0!:,8*xJ&0C}x{Zf/G)%^{ҋR͑VRj+zB@A^7Q`%(;gxgu/A[)"޹ݗ cX#@`t8:2޹^yeLf@ ~p-PG` = o扔{=||뭹%pp5,JC`%y6 8Ãg|ϐ Hv!PTͭx W@E`898?FrȆ ȁR$uᕎM \΁/nPu;d}O @낍F>WS55 @f#*\T@'_5EPm @`J)  @@@  @e Ui(+݄]5,h) @XP @ @z@~S]\ϏVJ @. PR>9 o & @[b @17 @@-E3$%C8 P!z @<SSZ @ @za2S=4  @(@1E,G`*0=r2*85 ? @Y, [@ϡ @zTiUiSӂ5ONq:[(r I  @VN.Ck0`&@ ^C/w JTB@J4JM]fs L){}G@|B #@aBA @@(Ts( e <-85ಳ> @kX ^՛ˑ @@Q (JK(K`y%+ @z\zeg0m @`z,W @`}P'(o#%$4K0 ZeN* PԖQ.KpUp $PDtA"2 @ V~ @ @g(.Y@zN*A P=Њ@&!E, @z@NPV9 @ T] S @N p PrCJހO"RX%JnXvQ* @X<E``͋2A @`,X @ @`z `e2"@ P8= $ DXb&@*#@eRE 63 م@m @`P& @AF,09u @e0- @<]ΓZ@Z7O q=NQg$@.R"; @r G @Xd QEle"@#=/+E PnrK`hg%p_RL bCV .; |!ˁO@X@IIt( @ "XDϱ$`2 @U *i @ leDZ@B7Y`j@S+9E(Rk( (h @ EhDU 09f PFT @R#PpgPR< @9 # @@a (LS((Ei 9cV. 8g=e+ P(=  C @#r\JS]\/f3)\ȅQ" @JUjMu!p@?L\"ip򶝒 @e ,Y @u LYy @V#`jB @zQ,. R @Z6.OpgO @ P)J5LI/< @PT 0) 7aAj$pz5NdU_  @SHl Pa  @0` C PЊ@ _O(@?LPR8xy/X PM=ٮjE58𫹇 @&7@V9jUy%@ PsCj5 "\Wݚ x׬U\*`Dv @ @mf0`f*; @kR"@I`P @ P?uh4s; @@j[sCj^ @`Cf@ (>k2&@`'P$,Rk( \_ @ UӓBxUJ @(!k2&@ @ 0#W򶝒 @XP@N @ @ZI $69AJ @@ JhL /F,yYJ@h-< @`  @,]@ˀ@q (N[(  @U jq @ @5tYX^V-`Uˏ_@mr臩Ssf+!E.Z(X!o% @ @K`2 P- @X @ XA @.@[H)0uF`p"P0/5 @  cV/#sˏ(!k%"@ 4DGjO!pxy@NK\E'@KR:J .%h$E$_n"@0"  @ @!ீ@ft~PW LkW&@N p @ P==צjD\~Lsk%"@`r'RFJeF @`ԗ7U p#@ PC  B @'lLp&,\( @ 2j @ cز"@";CX D @R @`ԗ7 bpX:M )`@!E @ @@z)5pbS@<5E*!@%Q% @ @<$@7@F)\!Q* @@0^w=8C3Pl"@(W@|=FnXQ8 J*1 Pz7 @ IN>JG!`:I,|K&<(k2&puCnH @e- @ @`=f@  `eRE @+ 0 X7 @XPN @ @ZI $p& IV2']6Q" n='@X4  @@(u)<9L8'  @TG@:m&.:Dx) @TD4j @ @Hs*'8Q'<< @ Pe*h0TG@:m& @ Cq (?+ @k` $6%dL`}|.X @lzŔ @\A@+9@YaK.emJ&pF @5Yn  @Y: @@tpWbsr LupPΖTj @ 0# @@ D HV.eH`'';CXgcțRɗR8 P|ⷑMqz @niK @b PQ: @ 0J@IzPvSL @9$ @@QQ ~=J@`eX@@4" @B 9NN ᲽO`B;(!Ek!@ @K` $PT9c1],j[)\tɅQ" @*UiI 09f@ U1U `@ @(f(Xq+5 pM%@ v= @ @/@0(LS(g @@.SpnDVkM` @`-] @ @`z[n*'' .=dN`^7(i+%%@s eg Pu=G`RTg<  @TY@ʭn` C @50F P/}|jK.2!V5Յ B3 مF@6MBI PeUn]u#@s M PT̯VJ,~Zvv{o7{6ag{3lcޡ"Y@έ0~mr~3<>lo.)B7tpFn\ qB@qJB8=ߴF@mvxwfx_`Q 'n\7c0`zbmT@` 8@IDAT)M,3/i ~J@@IA3y1ahTyӲ?(OɟRVB @`/$)j$GK w>iuM,(  @TM`/vo.9-)A81` 唛 @@NGq¿4Q*tkqNU:ʋ@"C`&\" P6"(@//{ytzyON@9J @@ZN,jO6ۡ$ ,M@`i&P@8NI?," /Tl 2nVy;!+ \_(OqQU Zr($|x|̱f"@,S~G־ @e(Sk)+ yB?Qkms7 l`|W{acvx?>ˉ= @\`* xWQU@v{w7?z;> Ahǟw?+΍pMq[O#I}+G nggJN[ B@J`^>/Fy:4i˵' x;oG&%>qrqf%@`f'춛?n#<;N< P\m%#n4E MW_}s[߉37C'^韥o}韅{~5=a>㄀ `f0;C ۷bWg{^w^FSqMN`µW<_OEcbv<:\~ FDhw; .D ;OwzMӺ+YV|An|gzS 78Ʀx"@+n1핗MWw7}b >|p/`J7[3kّY{fܜxkB6(Evno>'x6l_$ gkz '-f<.vcͺu:G~v=ƴ؈#6ͰKZ]1=/ aOV(EBlY(@}Vn~~R׿~̽<'R#Qu^|<7O߼b* ;oǠ3gn?}WqtAS]|^yٛ@:O~qbvbܽ~eQ+Q7.`\$@ K?uz3(Q.O/^?%s'?X\ϝ7~nI;qNft/Ҙ@@u~++؝ Sk5!@ Hi/)ƹt>><B OS`#OՋ/z_&?_2PګZ xqײUEQE\u7^=WsD/??;&Q ;vLԨJ#'g<4_?\ [Y~]/V~#{pr`TǻrVhmTV p5ծB^<@_xK@ l:GK- B}/_'{_;[?:|9z7f$'_7?ljH, @Bn_#@7w"ֽxӁ^wҴ~7PߛZځ[xʼn>z;tt7;0y#l<Cg-s.IH^/?{X-:%B $pGrJ(Aݺ}Nn_6 :|;wq`A ;[9fsm[?@7i4 @Ht-R )ljwZ8\ǀ2 `aٽ& QM`!Ti `xpʳ}VHsz-Z{ /|o&x P S,!@`q%IW<_-l_v 0@m?SeH~hOowqoݩ b&[tn,qq74Dsnx!!`hL ۉK`u[,O xX.{E Gz !}eg9>j'?qfZog[|o )h='1gmū⭣}aةۡLaz@bn=ZwB+>M,8jc=_>{>G5A&_[1dL@&س,e]Gt;Fq} ~ IH'a3w1`։?) Њ[cct4?ݲo2b0cۋAU]ZIJ\'c⭰u| \M"G}d 0،é!'>'JD:f0j>s1Pts1^Jp3ۉN G?^MM?3n {gg^9w+0d|^3{lӓމW2- .˃c}ؼ<:wM> {&7t(cx9ll ;3Sr"o|׳7ݛO{Lvz*\~-v'v8*LJ 0+(%ŕuNg<׋6nMo὿? [O?9ZsQx/ʟ[gcc#8v~Νݻgݽu<gCv.^4]wnxdqO{L6|֭[5C6(*J,xe .t K{f= Ľ~;<0n'7ѕ w$ zYf8=^}kod vo棰8AVK2]5sv$PumN s#F_{\QO]g,^ ̳ܟ!tv[}%Ptx?]eٌW7wPg0I|+>_'bov[a{ycbgãݔbB?wn5hmU@@̺jͪ>Ho {eH4xcc]98EKEBQ?^e ;9S` {66o|=|/ΒOIݙگqIⰀ4$`oF?x#<'ޒY1 \MnWs +f@xu8}w2^3ރWÓ^ݺ-6(@ ƃzSk;jci6FeG9z>| dm7v~}.@1{+~OϽGݜ/`G~4|߯jB`y&X T/ӊ'9ot;N۳ߍѝ\h/͡.H{5{9vUw/)0c3Hh#N_ݽ~~:|syaafyшc],1"B[ Y2Xhn};ɹSzַ]^ Oቧg@??~~P6rC` sfW"pNau?:z}t{O\uynGl!P؍=m0E8_rMU;ߎ͏#vD-^,`bNDo񖃷.S/~O@^ H=,`t[M;z܋=ҥY?xmmnQYj߾OvwkZ|CV/_ ]<{z}l\?0Y_φ&vʫĀO{fn O^ow' 8`I,&SτG\_ %`B5(@s|{N)bĖ&hfXzv8:xvoܾp2z/<;Ws'ύI~10 /ddEx1}@~7 ]s .uO$o>+ϝdFc3Ӌ`,3g=m4%qH3aa;ۻOOcZ*'iU ?~#^~,01$O@:t~t~![3Rͽ4 ߼La=><,#| nݼ12Q(8P7a);>x>hF|B7|/N؈ \WbfdLt{Y4K= [0'4/_ ?,n>~Ǖlz7Qs{}dXߣ+錞L Im7Hh_:f"L7y_h8TQ!K3~~'&sfRYy;GÍus:lO':z~ ,0 Ns\SDFN>?kxp۠L)t`(ceyo>*V|ߨZ- @@5`^r%%F{dd?Q/ʸߏcz؉o2FV!FFxؐW)`£;ߍͧۻ\1 G?tϗUj #0rX)kh+$2}uwo"b/(ҋƏR3zD_T47BEi{<9nRP󅸶n<=aL68zƀ'Cqу)@&ɎIA_.ո2^uTS:mM44>J'?p&Ǖu8mTо⚰b&pR ͝n[ii}:z|.nfsk8YFڈCCG ٥l'p4u/޵W_ 7o@x'|4FuJɍ>en7u{\ѱqo̞&18R'vg;gDVJTmÍ>G;O9ޒ o=6eĵpxm8nGg~&vX>;6xx]~Qhş4~:_dIͭ8N6WTZOD1P0 N҉45z|jÇY`"MHN߾Zk:ɥ<;ΰbyg]>lzd~MO;<!2I)74 ]k8_"\d$(kcZRh䙧noԭ箒ǹǤ7 HwHEW=1>7"> [ λ4^n=y? >τ=3?`w?f޼ ~vi8lb^xrjs"~3@"w|$O#{Xz=+n=x畭7ȌwȾov_ bxn)לK>wjκ6߈AԻ҂{neM0#[;7v8b&) go_{?ҥ2Xo=7''wN镖n?~xǖqq۸_̺Ǎ߃Y|J %1k/dW'Oӭ❰c}k)Ngʾ5ҕ4 %Bڋ=-ݿ0t&K/oA=?~l i}+XZ +p䒾D/_ĞcuCH76ş\^*OGK:OCQҐx;"0}\g ! R{݋AؓFIY:' X ~vdԙ] 9ՎO ;[r@za\q]+vO7\x794<{=nwoa<1+16:=ͷ߈'ݮcN܈_y#vz24I~}:%7gal'i#RPjηR"+aJ&x=7pR_?_i2#@'J]d_b80bt"X~Oe~p#ORlLutURfg}R?2}V-;]K83 ͆~%|p~R0|NWӰt֒Nǯ߹!̳i(@I[WfI)F#1{/7[j^\m'ۍy^xڵ8c,2gW JӤ,-ekw0/ijس ήdқx‘wsV8~X`cwq9SWgy;Npdޭ8>M%n<;Gپ`5^oȏcswfx֋qUyZxIϾ$ܱ 7%$[_}!|_Bʒ$@/T,XNF_A-ږȎv18:}?_R2^n=N Kk %a|vZ_O'g.*=B Obo؋4*0Vnuix@ia t!N'^3͉cVw5pzy36ݱ`y?o d'k Hbſs7*]'+ lposQ"Oօp~F N+|Ձvg39Fdj< l'Խ+FkW4w7sJ r *%yb_P_uFk2Q1͉2@OD͂^ z"HJx'EYJ lCܣh|`߭g-|1WXoG"w;(p߈'Pf,MyfD A&CxF@'K}č^\?9O9760KPoahAEyB6'-ZчdoT^^Iӽ{( CG 6 f"-Vv#eM}VM%O_MQ^9{إr213 3%O#K! ?98A?)Ĩ'F!o\6X?І",ehG)_)hhn7qUd#ՆF h8y, \~"L;$b{]Q!t4=e=;^9:ulomǏNӁ,(|if||h:5Km taI4*uh&1F^o|l¦}BuX[l¨uno9~tħ~[笎=ZZ#ބaIS 0xIY`UP*!ni%"d˹K5jKƑ)7t”@LR {,_y 3UG|gTE#B:ܥkp5VuM' 㚫xp H-o\@oh˘xbc:V    m0 cӊes,9w\`HiQC )1(kW-4k+d6 ihL#}oSQ&AuxrOR.澬m5i?oEee>pWkcȈRaP.p<,=?[<&Pݦ^.%L$d7V q)Ln>tÁ^ uMuTAV;#ʥ0Kzi`,ЋOpx]|3z~7{@DQX_5e%ȁ&ƕu va200@ƌC'6Ra|DqA]@0P f|6␅7 XISt*BC7hh CO|ƪ/Cq3wD@g]DBj:ڢPY%^=;޷<o[Q^TTȋ >T tbzFr7i=8t7-O%P콂d)R2 [pA"M2\3Yَ Aj?$ :_ N&nD0:D9:D`?jZ;#5agvAkUq}JSIp^7RDc Á (SdN9&ѽe_l撯KgK<MxPC]xRz!^~Qc)܃>GI# 6qboXqNL}uz>oKoc_=v6oS??w6tY$Z> X(#r,Ź p&.cݾΉo"Hj5PuAdhT#EHa=@w8?=~ag̗. k?-ɽX  /?TdhLe+Ӄvڐ97`8Yg8ā&6w))D"PgD}Ԑĺu^ftJg0OU"g gyFb2 aڥn@U {Ȑw*#ض[z+!G0(f5Bw nZ2 +<yTǂY3)| X@ӑzHBzJ^zw),S ޓ/0Mo?ؾ&_驺n)c8`8`8`8`8`8`8@AB?%`^[:oovf*PT9j\^X h ATbPe\ e/ʏS'F6<%X6>;n22ɠl=o~_ q; n"`яJOsm~]\xS]hR0+%zpf 5Dô9We\OϸK+y.vg7ָ?ZJ㋻vZw˿ڃwC萹yQSj@(DMp~ MMXJp#֕4ׯƾ 9Spppppp` ם/SDȬXڕfYF'L\-od;=9=Q}we*}+??s?q\|ڋӑnZ8Gr_7PZ)1lJrИ 9c*II#M]*5܆mQQ[otbkM0Xܲ`&I h(kF%% J0"̀1L>2ScJVƧm^joõhJDwKĘe[ St S=&M0AF,F ܠaRpߚEH e;we RNvcH-x yvK>Fj:q.V‡s}d9VbCpK#!|Й. "mSu1PNd#؝}GЀ/H%LԀQQ絲RL]yqj@&2uw'L82Vc7 Q^\$rX-g|qIrdv1ÁLC0˼cT`ܳpm@ؠ[Oj@/Zw@^/ޯh7a?S,2k#Yd,e_od PCթpA=7M2Ǥ2\~ZIz"Q{!1'h<)ub+sFLaMе+._T0 oj #Xd.;ȇD^ 9UW15 ?Ğ*,\J5Q^ a0d8`8`8`8`8`8`8;WTKwkP1YŸ 1Lncokk;VPudvЎM'FLc c3]l<]eky3Zk8{շ?}:=(sÖ;=Wp7fpoPCL9r]:XbaxGj-QXOMLHSl75|F?zp'Oٔv r#-RO.UL yHH5Ovi! `6;?2j>@so"m!W n䇡P,"z'V%g=鉀x/|AMpD\]X"V_aG'/=ǜQerP̕9|]cajXiQU7dkm}i [h( YPhi mvEsVU$sC[ge˹BEx&7=kY 1<9U!^l?~W~*+ŵr=lDL#OTLrhIDApӭBmVFڮQ6\/$qaz&alO -I1w: %hE(5R!ttjTohE/>zYXYI-ټqhSZtZ8?vdB]Σn>+ D!D:Wx hIۧ3a Oʠ=lxwۻKCkb')*0܀ ގσe=pO=gT{&n}w:W>+P*V[,ጌ0ozP 9QGHe5`3)b%ɵI~6GEtG|l3DF8A0Kpv MJiS. Ĝ8P`|1`1_q+X߉!W$hJi|X@@ U møEAˏv)Ԏ1~)d>m] Eēw,d2Z xR?i|xN)]ig۽4q2FgW{gxxr!Z-MC/&B,Q)=);+h;c# +Z0eY1T<è9U:BW,*dQ~.4ո'pw{6\jc,xƨO*>F %PeS67r:~i!Zl@syV1E;Diwm ,՝G[hp}      qȡf]q*t8Pw}VXT!p񆱮Kg ;Q`z s}#h=:redh .1,7\HѯFNn@IDATg[)0<ŋΡn?@Z?z締tG;!-1* O $>1qm"Tp1wڍGpi"E~[!w m%Cی G-q6SEʓ&x8(j3vq,`@I͍+n_      ^28l-bA~wj>S.!Sͺ:DTZMȦsTLdFNq݇'1?3'v{ Ic6n^9?3(NFAS u Sk P/*i'M0=A3tD\(S֕80֪XYׁ9ZаT:Lwnl|0bRJA?W2\ƈN*t?yOt;@" 0/]7B\~xxb40000x808[lN)Df9\d6B'xbm J9?gdK٣jF,䀱5D7řW)!0.ģw1q RY1iHIȘ֓)HZ# Jׯ炢3]eֈW%QP@ L-9%n1m_\8|B oGspLT 0ne ㋌ ?I^P"f87{vM nM 7yZtaʖ#      ^NPB{-qo.Oㅗh52e&?f䤷hijwq߃pXK~waf 0P0'\Fg]\yUC9A Γ@LFԛzO0F# 0 @z [&n]X /ɐʆrDq ha34\J.R$Hߤu Ky{`_:V3Uުa8`8`8`8`8`8p9PE-R0 [/.3azB7,33a6nX{iߕ+dWvPIy'NT^>BlHO`2w+ dRo@pX4G/ \} _B ڼ͟ LMCac 7)U.-,ga{*dY؆Ŗ+q@gBp`0  .3OI@T m?@f+;aܪ6-QU$:J=8{³w73v&v6*5NCz ιY}SMP4$NR[GN:ou¿3?@N*>+T59}o?ayEXZ j* 6L+;@tM`^li 4v؄\/ɵn>0-= AI4}?Wϰ7!qTU휆cH6.'"St!uֹ2C?(l_J?\;j@:B&L)Á멱8'bhqVB"c%I;T'(%S vZxv/:[|H/yTP9A$x)h/ᒝuҘdJi!( /8NqjZm,FVhXgTf*,=#П ߈$tJZDt1z_saÁK/~JcS( rwyE* e1W|>BP¿U镚zv0' @@bal_t) 蘟lw҃:<]Rf`>-МE^y!/Ѐ4=)컈04j#s[@ |Pd[=':0Z#/ rF?˗{FT:Bi]m8`8`8`8`8`8{/> YR_mfmK~T!ų>'v?z:}Rr|4vp_8oQӦOA\ii}vdQP2gvه'I$z{wPҽ;3)s*ҳնmCu[H)Ws"؛>d R0᧐Q#jw*X-'jCJQ:"tF/"4Dן拊 *J΃b 0200000lxic5EG/P^ZKrI," g^G kٔ鋹gYX΋31Yak93 `e tg52"9hy@szY[&N6?[5Uǹ-тp_OEi +m;r^zlb~t9gFI8\>t~YN}w{Dn4+Zh*nchVU/4ų=pl,>gD!@@mնj`ꠂgg/U$֖iWMO6  y$0Lƫg$݃v/f"aR*vPx=U6MlsX۝xt;ӪΓE[ @?isfH5͚ZЃ*Yrxd:g xVK@>TK*Eiu_3Zmxj$Ad2RyD_Py{tO"nl4:?]т8{2uߙH>шeE}inpJm + A*ddG+Ф~d"Ց_r×uČfLS9c);SðYu}`EjܧwPB\ ӡ4:d5hGDxE ;D(D+aj֟#7jl?Х~ąaR?n|u}Vhz&Mv;;):IOYm.P֣7FޖJQpiѬnjGt{9QBIZ}Dw?-a_@'h]to)/MSW<u[U {{N; `؞NU{-2Zg  eŦ aqwy"L >v tWޖ drnc}L2Hb P0wft^92?iہ(q,FL{Wdhbc[[kL~1Kx9"I;`S\SS @5 IN3Iص`pppppp 4t2UlhmM E( v4'o%9t(X},|$Hٕ~IOf<*@ waQ֞K78Ǜ] pi #Avgkg6VICq'WRSyqzds~))]+4'r@T_(wŸ?blϯs7d.7N[M ]C *aҙ;߆Ӣ"hEqI/E0Ȑ@xDYgnRXh➀ENH% ^(H!cG&,2EeXT@F}FRp+=˾ŠSqSMmsxsX^+z&f{ldM/ U~s˘0!Óf{fq]o`M.̯Nm>(ehȩDkPPm#17m%V.@qC%aQ,I JEU٠4t>.OVϗ܇eNo*c8/(_OGY@OcX=*x~2>ZGi]pQZMNqAh!#͋|"%* %w}(q.!M>EsCbZ9d] ,qia 3Tg*&;P&Py V>'qqKJ:6    N77*'LF 1AZtI*[J , MQ;>/5QY ae/|s*gejAM+2B\Pw 8,C`&@aI/soc~"gq!]{WXRa]]9*Ak!1Hz>Yt:@  q,SkG.7{p# qVK4NLco9٬bg.^ N#,]~:7 fmO(} h1;ؼb;@guі1ʂx (?(WVMmA}y(%%g]a!,-_ts )v:}ki6 n *iGf/>Hg+mspϮCG[X+":P8x\$skQuG7RQ]ʾV:# @/fFB2RD 0MJ~~wwk__700008i#kSuOd$ܖJ@O$@ ,o0p!%wZ* %s;ϠWzf #Cu65.뵁${E(k] OԆqʴxx#R,f~ d`3h׶|O ۟FwXc rֳzo5j;5@]1fM|V"e> i٨O8?200000Ps@g'FH}D' H=`E'p/GW$Q-;Րq}vuqAȬnΚ.MyBQi(0 SmmNk68R]< q=ֲW 9TTy,^-Wıj&16 :zBDjB<]Cls/iFQeP,e#JwR ~V}ɲ攙ݷ3u=QǪvS@lC0m`nxAЂ h":@v,+FePM]b) XB(D(5kp7t K(S"\ !qJ'Z9 .Zy?oS>c o<w_ (=i}fNpw`wMd)zd GF`ez.)XXfw;sИ{Df;砳o `v0*`@ WPX24  `l"ȭ2@y( dP,11¯yṠ8@tC"kP*ƾ/a@,.QGr-CY kLlwwTlݗlbiXX){5=2]n;i<2[F6]X7_EMvRz|tq,pќ;} $3T*E-!~+L(L;'f; ƹ[VsL&|[o~춤4t5\݁=”S2.FͰ8 wתG+*xo@CΗ BaЍ_RǞ6@& %)ۄʘqTZFl}F`NI>n]w^}G;,'_^eX1iY`jPnUte&g^X֖QiA ݍO .4eVs-(b֬9s2D<5h+NK[p(A QXk)Zv~ @!sppppe@urD`.Buo9MOE4ahՏEr!\>.;gQ@u%M|Ё S['V6stgZ*^A%0 zNa-E2w*)NYdBН 1$3Awo"́'8$P`9ugMPq헡T{P-_G}3#=O}ܗYGw݅Kh 5˧T8 Jз\qS 0tk2iu( kmW -^0V/x1kK[m3c?{뿻AJ`|[|sfS)ijץEcmG;{8);Oo_ҜH9@x2:EpIVC<_@I,1)}[Rបu9^8CN>î])sD-鴲P@PECe^VWe8@"^Nc/.6EK;.QH*3v6ܥ3aG9u/]gc %6_F")3Ck 8d2}9-:]C:C>!Li+Q Ke'Zuo\?wOe咸/kO wTMhh _kUKڈ}2}1'V֊Ҋ?^$]inZaI,fODy╾v(@c_=nxY--db|qKd.@9G4;tSw qM#:@p&\hȱ ;0H*F Lƃ2bO:uUS8FNu[XڰnvS179TB8/. ̥0 E ƾn?0/+Xrϫ'-W.@dnܓġ&^as* ?aIB2 pG| 5Or'uSS ACI}lhkNlxp?v{^ }hoʜ?w}yo~1IΛ̘42TE.+S06N]}d0sKP7of'{*S?_L&qB|'El?I(%nBNaA9P&h9f;!-u8BR{?fSңDj̓w 9n8`8`8`8`8p9PUJEriHhJKwZ dƏWY5E Kf|!D@ՠ$pҽd.MZ s^Z^4ޡ+p_{M,]BQk-ӧ!:VXY< Ia8('=N-ZmPw? [OޅRNu?)_s 0LA#ɻI t6l\KfHNٜ~LI_dvLMÁʁfuS9rwԤVΖE%qߗ͌H-V2尿$0hn`,}TܧuYNߦq(En>ghto?gU'HCk|cTџ5 m41nu;bDL(ps*[8༓1KS,-#kDneC Ia"o&h>؆     ^XRHWݍ|OB1Ѭu`oR:ޙWE; wP-c(Ǻ촑iO2#pOyi0=@@e*<{-_c߷*Plk/F= χja]n,Oޖ)3Ee~* c;V]m $]0X*=vE]8{s o5=v,nѭ'Q\g>6!»PV};d%^L^\'D/"y'L%gNʏ^qP~¿XI )v    rTpaLHfQ9,WB lZP@ kM &i!?C |a|&IAG,K&%%4;q,K>%> S&P 2θף{l[ 2`kNXEiMqܳ4G⭟P3|ZX`yx<X:w#";t0R8)T!>+l(G;^P:JPlx?)"k˪,3IuX;T,nZ~m6Ijl@ 5m5ah@{݁uoYeQ >3h;aӖ38,#T)u "O4ذGQD7W+mZar!tD~ zA:2<<_)phK0^99N܏m2TȪkMxK S&3<{\Cb5oBEUclk?/ć=O$*C`+=|]6 {c&45{k*O&.J'ԏ)rNg]k8`8`8`8`8p8`5!N {$4 ?ISBu)&>c tuC5{ݼ(Қ1:{JjPKwF݄,*]qS./%CsG] J~rB@%[L)8_]4Zobg}x>XƧP9uqHp8B)yr!0/@cy}ɹ{?y ݰps,"{?#      ^t Y $=]M3ũtwBynh$z@8mϳe@_z+ .@ᓟQƀ;v %j/)8辟A +kRQR1Y ^7*$q| 2z?3 bawťԺ\op'Z*֙a*tБ4 T; d9/JZøfQ!T4U7ռ'*=)UټJ+*i|@ҩHw3f0xK%1ܥ<ϲߓ=ܟIOofJtmID xbL DBvf׀)TΗFnm"7i+ :G}J>Gh艮YzYt%ϋ+q%u;\AyHE}hBQ"{_럒h8W41'꼻Ly,\kpv7# pAv.K|E06x(%ր7P&ʼqxx\DY6Ȑ S,DLe4=d̾R~-]i[ Ū߃@adVspiw?ą_̊X#܉4# kexT|ɁXHOaRHDT^6.Qq3.ɐ"}K  DpW4;GoQ+HCf*n卪v\OTfMLH*pһza ៱(2&+2FLB-(dtmS-V+bnJL3`K69Z8ʃVN/.kpsxmQ@M'YU0 .[ABh k`pppp8xiGBKpN*xG";[\ h|c %0?{n3=Kظj5 <\a$XEW|`k%m^D.*,r2UI_P[MSBt%θx2e89f600x8X֝{Hq+7ڥ\=;y~.ODM9&u׮"L6(螻XOjcٙ*0wl`twe;{'i&;ja1[t:>tcۨʰ^$T<x&"z 7~>R(N^:ƘVcz˯xx/NZ2Fa#l7h5lqۂ?*A"#ʤUZ?G. 'Arp)Sf^DK.~6]ƅz<(֤"TvrGR m:tZzv~՝GbgÉEii_j^Aab!ٝyvK~b6"_Kȗ`is˯!~Jȼ|+{k3CLW^8 Oֵc `zBKr<>k0AY҂Q(@1CE&!gCHGxZ~?}2{J7`;E) q4}'Vn=x{x;B~K/_~(-Ծw7y&^[NG4Ihokwuw9&{YPQ;Pa7F-ZG/7^sfr RFLSɑLYxLLρvc_|-m= ׿,ߔ?b៌ 5ȩ](A(˗L,tAv5u$ g `6xυiKH U%"3"=$ڰxa+Q=qmg3%2 =L }mۣLF{иS*ڗͭb"[ dwkΒ&T„7PĔRAd^"Ŋ gi'J# `VQ.[ۅ%dz1|vp%Pa aEDBnYO:Isl *H^2kbHPYO]"d=,/]MsÁv@{?Zmꋽeqa-O~j-7jg|^\̯⽢ )6Mq̥ Q,]=LT>m0{9kNb~oF9& ғS ;.qǏʙC P'ѓtƤ4BqW;x HJWsy((Gj S{x1?y(@I?#*A E kx'W.?;xC?9*=Wy8iSw*kG-BӲlm~g.9"b D ƣϹC/B&xdw&~gX7;3 '߀u 5cq~ Qt\|E^H`\@ (BO֥U~be'[B8Za=O'"3_=(2\VQ+ǽ//a'?9J{ogyZ*k")mfKgݤ14Tyc ĕ}qޙ,6mFVkKeKR]] o$5X\/ƪGsfcno@鎇8t=p{B![jRZj`Yk;L 蘸WGk 7tW[W?:QIm4ƙYb1|_ Q;P2ʕ 5B:-/ jĴv}۶\2 2xx~m[vi1LH('h&N:;P+WmeIS5[=Q<" Xw"'ؓ1DO~貔T\j C}9 GQAM(R렲8oY-OW7F$3ĭ=ZO WOſ om~[uIJ0$A |ǕPcxϝe8`8`8]P4zɪ[݁|oM/Dm喝Jxqd ,!'*ee!Q%T&S0;߷ LR&pg!`  %6(Aً`v R.t VQRBi{Шkm;Kѿ^v{0nQVS.<x5Rѐ2NR,;厖ت߇u\¥!+R"qӅW,> 1!(e>8T)jaS86f FB8Q(݄ /qxc׽e梾iQё¿<`{HF_xa E@CNI%qyJ0 @"f!f Ρ`?"ܷ ط`ɇO6cpppFf| VK*>#!j~iC'zcxGl7/ v^1LX{W"QSj" +g zZi)(8^ _**Lf\cq*J~4Mg:2yi]{%yO>NCvנ Z/5 2x*CC~xrD<b@;6hkf8`8pLhA`"H׮B؁NRy!_o1 />;z] nAp,. 2; VOzӨ1.($(6*:CDOK IMr6yOW i['9J^F8Q :LR oFj9'ؓqo>ܴd׭თBH@nX qFSQ|" ows1Tjd5 ׽v9&bj^37Wm|>|*>ʧsJ#%_Đ4'MK 0{Ųr*ۼƏ8ʢ+A:80O09)f@erSg@X"pCi)dt5'[SܓqSA;z  fɁ0%}76֣!6k[oF ,PO-QTeՈq(6HIW%ݤo6ٱhQX*X%n On]*'ܹ8@_^{{{0<,zHuť+K^in8VB~½wb7s P@@򭟿TParq8o` c} lBTf¸w Klo6GC[WF`rz&gv2e@(-Hw Da)K ]Spp@O whIwnC `lm0-:+PY܂ |̤RnxqY~ Pqƅ]=W k܂yLr]ӨcLϩO)XE#xݬLDLef+7Q@)lC 7=(~֯\yPozl+wwX (LKxO= u?. T" 0&G}vte6+o~ ߠq2J+瀪 .q JPQK^#;e'DצM.Ikpwj>q/wOȜ10Ha„QvOԀaI?a-lAEvͷZ8/+ڋߓ)O9N;K3o\aJ#+XSέ ?BiM,dĉ':yWc*S*ro CO 7y& R^,VEa'B4L= F*#2H}+;gw>!=Bī!ݯGU}|!^4nvYnb0LbIRX!‡5E'{bPtv !vg?dIM+Nt %ܥ}#Z jv6:2]@4*m5 PapAFmL,',5)+l%̖ H]Ekto*,80 aދ).D5$4׮̟/! &V(3i<ŧ~C? E1 JB9`IW ^Ko3H 1:|~Q/70., !me̙L ,] m5*n@)yJ6Wr󸷲"W\,,k]t^n/P8?n42Еi &F{(D7R $y? pFn!>u>!E?NL/4({cjXfplv)*鵢a̺\cBt` f'/j&q.(DUt:+%6Ս4J:|h9ii#u<6ݩ1.qIpάCa΋+E*ĝ`zD& ")ꔋM*AUviCA{.*p[s_Ribf̦@Ù,pFpTtښ仾X_S/48wE *6v~яXq %.N Wo鹴:_*-Ai?6Z%E$)m1 x 'ܒ(!$ "}-S_|(X\y8Ox 2 W"8{Yj {7ң}.ߩ\eC\ YV_ֵC`19Q"uD*(5FP'd<*D&R LWޛ;ap}#Ԯ={:SƫbJ-0ӕL9#l$ O[ 頀EtyNxyEE˛\wǴOލZu @xب\!@8[Yמ9g8`8pz8#>=> mx53ѷJrgUv)6qޚOO) /-t.tqDD(,(/aIdCjpֶt/U^GH0F<s~x ,5\k]8b9QZzKz@y@"@RBMEE7XdIP/$U?\'{ ,sn?A"6lw^r/#M1HHy.͉+J;JA'KfKE ]6jl(r&pD{ZT4P.+еIE4;-7A2\Q)xh.s-"_~/-HEl7V =%t½<7n9f C|'ِညvpA+ޕa첪c'@߂!P4ГGJs#U[3(lhpR fyĿm,rI$ "G"_XL:*0FFGdlO|G!1,‡{ ȏhb=QaAd.^2ͯ^2#$q/eysc`?Nzf(ȖRp%SG(!ȓ ^|M'tC]{snL,x ?"::6f=ECu֩a+Z]Cs[UM& |/lЧ U'Kօej_l& gW0p'EKkt5:&EφPӣE>)"a;-ѨCxhM]W2pI Vc} F?P|p57 `!u{n*q 5*<6ø[ʼn:去;Ly#OQu9`8`8rrFloRװ (qNZ},o|7!ߨzm?J9KT;?Qx,2!$IIV:f(U^ M}?̿jOֿgGp ptY[kh>3"qH gF;(Ǥy j>B /C(g -tQ$ T%ޡký]Ӌq<8L !#7ע'׻D>BRmx&72q lwu߭zr(pM?8`70U>\d!<#‘gLRXӈ1$)|cY\$^".\]< PĶdJ:~acn2)WJ>-?YO(ֳxhG7y@*6;=f=8PD9MeP=spp@lb60$CCf n|w Ӆ's<Ve֦wC CEoGP~W1*>w«$:4\n!<=tErJE+;m侁͋tzEܷW^J1oee=v&I` c\瘺y`trw@ Ku lXP^ޛ=d}؁\U]]!)JQ(I3A471ғd$Q&ncᰛ3wWw^w_2oĎH@N.gNvxl7yGQ'Ո(iErfK6+rj'#g #}!¡ܡ;ˉ;*4FN۵ǴF]Q\լs{IB1.E0JY%Bճp]ΗpϥyH\SO7k:M N[X\f%uZ8%"2:7kҚl:_Ҋ֧,Gq]JƳ*rht)-^$yc((:XcC+Jx*%g?j4 Z替&=n?v).Ӹ׺ Ay7_bO&XBɘgs&)]*TueȤQ4q$hxDFpl\ؗw{i jIb1I[k  sᖓ;~ͻ$$Ee:(FL߉c5$PdTw'gAt?3$Ylh}ŕ"'b%R227ݶ3%+RcK@o~]|j~5=@.bZ\KWE]R% p c.Xr##Qce-#/d1g1%ns ɯ<=%d={Uek+ͷ~-!'Si.$Ľx GC8Msf$ @.<}'P*_o%yg~˫}(*.FHB}=0&MMG*pD3$\n9ȄGu/ Y rNsS<n؏u T(?5pt޶z(0 Q&7qqq'{%H% Q#jz_ݞ}Ab0F;hjD,t&Վr@_5wyzbI-JP nI[7nN,-G`90#@dZ@.,;8Umo2]:G aL coB5s_MJ*>@=5VqKq^ЩdOsajJ@v ׭ "ωnZN Oھxm_p0z{>HtG֣ޣh?^F >j(Whdohýx .# 0=/,֖J n^rx?'ާ?{Ni=$\Eo&d$J^,2S,}mlߋޥOm&w;cB>=VLf?S)"{zI$<[|(WOd^(+ޔ+ YԍID쿍ZG=oIShZNjBQE+l{|'#C2"~\ _g:\g@l|Rb 4f ?yЩۯ{{-)0 e5hke1.ߨ-4c8u1/X;w^4&hAo' zSm>0ǐ6_s~u !>GOҺ MR--{c h@ ,QJuDЉ_Z +#͢wk T<*rm\'p2Cor#p#ex? Li Y}2g_JPk+޵WnBW?sq+@BZU?^HC֜'ߑ[{?E;y?!E;jK _1٥nQC9f߾".V[yC৾yֲx/_6qaw v #]1J[RGe0=OTxA/ *yIÿNձ/l])+]O.E2Z/ |kS]c6$dw+7&E^;>DKf_Ce]~Rm[bgOp=Z'AMBb16A &=, ^6UW"%ye醴G&?()'ozpXZ~H0+L(+xgWH={'m{+黮M֗~ӫcq{98h7w$Q??YW%8@hwmHvz{O? 5iҪi2V mFrpLXV~5W|K; d&GC ,ȺP!1-^ [_ Sύ-T+D懽9W,2e0#&w7?~o{[p?<[.6fPvwgL_qPn+T|C@Q]ֆܓB%P-6 7f m@ύ "2 (FNk ˥b>^vX!l*"MZ.t>E $ʔU3;4Bz,GS9wA7{U0^EF濩g8#{V<<0QF#|(lXaXk ׵Q={C0H: =S7ջ?)cX|G4zTWQf?>?4gYb1+WLxjEyg_ I`I2 +v/p&K75'q})}fmH*=†"`O׿ 9WU$}~GYwc)0J %){ }MePf[Xf@Z(IwrBвvj=8WYd J*up Tq:kQ8,:$Q`}@Z瘴|M5_We W>Kp=#_0zy=m. Y0B0RŻbGމ\!.g__c"ߖ58p]ʃT)!B ȣ~ JzhJ Ώ3ti:^UxM]5-M1{)iJ͏3'GUJzuy9T(v禵HAO,;O fO) tr#K>zTqO(W)4>B3[Io?%aJ~q/+'y6&c}I3IVg渧Vs}Go>֟z5oN ^sWeKZ|]5ZV;ߖGSX})s\92욀; l x$_@?Ppo[C %G:wf!B͡R"J4 !2c`ƤwQR~ pNW^\^|K{Ex?]oOm3 =waD ecrV;m=4/&a =ֆ#qjwd ˍlεHR^(?&ۀ4P{~` 4c,FzJIpd8 1q sab]+<gب׽9[mcuo\z-zXm sO!([z‹p(zٿӚdXԠ/Y@h:XC5MšXH O@iqi)IFx(D׾. ":v {З TRq|C{$/.{Bv>>#B udd '==C?._V&ᠾz[ڷ_g'Tux=P5}puN߼Ι1>GX}~<;D-}Ռ &.-!Jqӎw5. 5YBA4>̹8OQVYFD <=C7/->گg?ǒܔiGٖ_{S@JԙA8.4֦c3)qRkZo_ [~جܬ06 bx|0ɽʨţ릅W*fM8BFT|q Vy ʦͧgDl s`A"&@}S A]>@\ɑǂnw_jտ_hyf9}@->+:fKS,Ձ|n]2rjb4[͏i})$Upm\LnHkΗϽ;NOJ| ^-e!Wn*=A?j 0}jnɓ%񝴜/(c~﹔RoH[?C^a*WnNi.>I" q'@]iBI:zGPE]_KsE|+i[E`HerCZnu|i9kgp ^U0L(s:Q>u(IO]>ſvIYAO`sVZNj{"]mmā ;c\%j4U xY^9RJoݞnEQ }'N 4p=o>zB?C1` ۿ9~k9@ة, \輦;*ށ)K.eM+XquKk \^yw_ rDޫ_-|RqT;:TiL_U-|x]@}?: DJiTA&H|[9.#RS"W4W)r׉m: ͡y<=UP5) ]en,qIaQ<*M֊(36dLp~3-kK<skf抐>?Zk~wZޖRa?5g/ÝDy&ή$ܲ -Knzi7RG&!ܹyf'M_@3 n7R]Ғk:@[tE6<н^ׂH#q\$@|Og9#d޳Qݱ@_!wFwޤ;ֆ2N:\&6kE 2K\z_xJ}y#0L9'Y,?AHH^MMN.$B4b6tH5Hz?rJbq%1(Q:6{/K6 Ē]1+=sny5@IYuQ!- Նޛvab$Ҝr2o:_F ?K]d j(Eai~.O"y65ƔvKdd#,-g2KoUSJUdklxfX nTS'?y;♛z;!yaT._gR.Ƭ A AiḅڏF5 V6 .HlrqdΒưȐӔ֓FOs/1<2FDVKZL*1a"@#^lGa|=-B=4^<ĀB?uנZ?`Mnw-F*No^̸ lX@v%PM<\2q͓A8+ŸQJYqm\˵V1.E/ jfIWXWYI7ǮfZ#~38VL#>o/>Jx%[m *I> Lb^qu/(& nS &l>7%^qH|R~ٛg)@XS 4>:-yԿ9WX̳sx{vyGPT)NZApx _0@,5j{ zH1!Ѹ1d ճ"'(ȻKB9B5O.D*IB! (eEfhj X[%{z[̸~ݎP h)&=:۹Bɟ%_) pfkh.ܹ ~}kJjO.N$XOSԚu>R,"Ui sx* Je#b2^cv}lv9_[,^/.k>rf_h$~ch7?U,[pHvh[_ź^:ݶA>]ߏ۬! #'b㈂aR>|!~Wbؤ+B.I`KΓƕ%U$4RWn]e@ @IDATV6jwzT~j/8SKvCy L*Tسz^],BV 1Ek0:ǟN vd4`]IIu'\W`~7/y'GrOaAԇG㲖Yc/{R2|($Y)&#Ji=®L\2*RRLKYֳiۈ^G8nVxvNc~FIbyclB~p)J%MEum Ju ¤}Oӓk`.U'lZo*ߣ\NCrqu.6%ⱑwj|G>bxv3q 4#[hn~ktpU'$"շk&;@R,G}u]ͷL7ifJ[ C֡Wt"M:޹ Nh:tP|\1a_'?HϸﵽR{&iZ7fOsLa[OyĐS_߬z[-<^illX`?yTvSͣ U)0cI v81Cc$<? {I|5GaFR4 SOG'ׯi1<(t65C"u'3 Қ0yaL%ȞPb o+kntCyCȻq7XQ%9Vk/2# q1I]U<56.i):$? gg?e%*恻14+E:ڸɓQѾy],S hagb6ABJu#>7?ޗEX8PN(]?OF[ 75[XF7fQ߄w2. u%z-{OgA=;غ+A(4H)[+eͽG .(+u;R1 >t]}'|_>Li7S7իoȳBq#a pWYjEaNz-1;01# R@#%ЪxD:l",P&\Pt!CVUU@lp+Y!`Fl75Ci@ߙ!$R+TFk @A5h~˪nBaS}L׵${N)#(2K^qKY||䯎Cɓ Je|w$MxLVfq- ҍ/<*~GѹȯGC_4 k>" o~5 Sv_&2Κ\Iim-9<(80qM>Ĥ%ƃ}h׍|g?\<~o\~ǻ.LYZjBV&+xP8*Gv[$!_mr6v}DZŖV/`| T,T^1& Wƈ<EMoёީ9y8:G7gXe{~  LׅсE K@}_SցV:"k//ڛ -c!,VGR~$LM3բarcm_Mu-La8u )45!i]G~^cCk}!̀qouU^ݽj{'uq+CWh.1ɚÅwt 2}==R" ZR>f0M4sv@)f;^[ز|GR"Qvl&6lK.O)S%it!xժ|ޒE&@$JRkM# ۈU01 ֯BoxWHH7t.qe+u~.x;\nCF"k%Vr n!5C 462úk!)`Ss֤XԘ.,[{3+>/`rr gck?YJAq̋\u#4SCaR9rCsJ: YMxf)뼛/1b9)M p+&mŴuwT6&,icgD͂hwOe35|@F;|:f^IgdR".idžPuzۄ^>ֆ2zт0u&ΐZILN汝q .j .#)}W*&xw'{wrI5Yn@v!u)a ̥?iePZ): 6vẃa|@PfS@Y[Aq߯|巼/o{o{_?J Zle)I< j i%zL,vSn,)sFf,0l[9@+:{5׫qh5?=C\+ME8T/ͻ 7l}7:T\pJFjT}&+E'1B聭1G`F@9)e !1u+7*,ȡ=$F@hג,DAMٮ锊۹R u1(: gc)ҸfC^98I\Yw $EA(#Hh)Ch:  xuXPK{5*G){@R&$ bdI7<%A|4%I]S oUzJoЁF0l+Pf#y!#'qB%yN#E@Cg*$6Дld<7Kb,,׶izlu ʟDS[Q5Huc4CÐj+Zx"E,V29Qúf‰(% B^,Ɩ͉pᲙ~ᓩLc҉%w ӎ hHKw砬D (?]߇w ^.h /_{nY* MAǠKrJzb[r%Q^%FqDFnz›Xk_S_mǵ7にV_`ϫ, :Z>;xԃ6477'U~9y|1!B(@BQ/0F4m?ИJ`_Ɯ]^rF ZclkN5{fΎ hoM'ؒЈWԞ٬m"c 4<Jv4dM>= ̸z@x_ߟhwR>q}}a)s{_!>+O )OpE1.+ּ~#|IOS 55oYP]Z_H{@П{NAa H,-G`9hwC%<pt!B PBaܚmL8VbnG(*(dV?8ucץZ?}Z  %rp $ B<{)`㒏BjޏGһv[nS?' ;øHKX _ {0]=+^{Bh p~_>U5{š++lhDF]j"i5yQү4u:Y)}ǽ5ʍ3Nߘ(LXV$t͵_#>OKU}*zY1,,?(m;v?='x\4-ͤװ\P98{B4Z>R%Z֊-ځNp|;Tg$/K23$R4? y+ɳf ڥ-_xX-`r4 V0XC)Onm*Cha^n=>E3e(/eS 1zgRHZ48}OjC<<4PPչ):$lsޙ4 ` 1 _zEyHhHQRb=!y t0i 3mG~^2^>"5 45%5΢ ikR+I?i[)""{'1UѳϿ~75D[_8IFa'NutHP]Ns-3 2zAiK=9kaE)D|GV}yyof\Qx Q:T(tvzQ?</R&߅G}aHg!P{ӪuGS qaeg/w77ߑº]W #=Uk~9JZҹ-='4/bMJ0d,ؔmL?' U9 o=/}e ⍵R+6牷z!(Yq7LKm{|:τrK<ŶK#%mYeJW"md$rsɓʠJp_ʏ ;FqU > a|@#~@\\)7)|Κɍk@\^v6|6W[@"Σ:av OLxp}oLN鳋?#wc$؇ոFQIgn-AMN""1{s#%(τC.# :b_^. *jAr)ЪFJ#^}d[_:ޖb̃E<^hP0ƳϪyk^CJjq`>#hci!mKH pM?jXu\Xݳ7PtIĘ""Bi}OzQ\ b=RHH^mquіG@+Uoh/܍lIoXC0pGAEmx{y3!O,*f?Z!QS"/z/ӿ8Řgмz %MQΤ g78hcB[;)'mxѵ TnW֥$ںCȋeIXu1!_ѽ hӃ'@8) RFGj+CA5-(jR[SEgp)?8Y`|X;RN /7V<*y6MPgX GA摰OլG!FSUrKz%'l0J~Ha֢f;x.ɭhwŤanl|S6T{˭9T4T6$7%2Ěj(d;Gf7Q4yrpxΑY}M0?k\. %y #Tqt1e,y겔M pg^(R)5[$6@;V)Y^wS.`Xؗ+,0Iۧ|G .(&ۋ#~3D0LLYa %YS*ECX):Nz3kƮ5K:+vBo&  ay_J2$~߮)5DA.hW G !'ȓg>GEj6awԠPp#s"$|ߤs&V|B~~T,hY.ɄP }9`]2fxI'֞4&q!tP|$'^Yx)%aoB̺n'Fc:^{3~SΗ=-j]naYf9_JDӻg4&X+5гybipinlk ~,qCk) mSPlc5 &s%Zk_ Hv5q8~7y6M q4ʳ`ʲ~VAGО;y|he3J{"z~&p}PRlҊW6AgGU֐keɪ{)"tg0O/=!5T<sQNyƳXgOޯ:]1kz QQ'&\XeMJ`hrɧ9:Y\\DEmd*%y$]6`=$O/hPboijk_,Uk흹c @WǮJ4SYKTUY,Bk*R{4]qszx=1xZ F./ jݭsT(MIV*3}ޗLmfY`9_+ݳZҝd5r r_&Ψp9dYg`6PHvQ!+i8+V&ES6/; 0Bۇd;2(#pvh]Y؃w4w<隸sH=SۓXîSQdmVERjl7;a­.Qb ;Oh;H=VS8T;5k|C]X)/١w6KkU)EFbfj/zqE8emyص|w,Gt ;@+|,h}"( EW5B{ƊR,i~3Jf 2 (!=#,fmc1%5`#^E#h7gְ0@G)`20|V$ S>?1Ma.%b;&\p4wx$¢|utHTO!^b)4/iZ˂xBy /xszmcд>/8|Q&ťBC\cԌ5B b@c4tR()8٪hm}K:D_4b  ¢?[JR{?%j Īnhl:#bbA o-*JU+ #s.0J=8>C䤢M cV-r푽SmVoN <{AJ>yX,i9@`/;+Z1qdgOr+ӟE=9AN[ҖfM=r~kṗƺYjuM IJh[I !u)Lb#XfPi숛庢@=yaոcyXײ; +HjmM7.]x㦵~~*jf/%~f( .usӑ# ~Ѝ/?ƞO]L"B>>MZ輈u^ z˕tw*Ir%4{`C%e5\hÇHV d<{pz-m`R}Th-{]dysyRj}Ay_'RB=`4 S|+%1Rmh?]x9A僂 8)`c)Hǁ ;NS{|A,|>gR=tO7t22/e@+ưG+;e2<;[lǖ#n{28N@F͸XK`M4և "vLd@u/Wbk䨞cGGK}XpeG1G94dJ꼠pվu)JFqP5)I`L?@c\[SyFogY< I-oR+wH7˜/S jIR>$ӊq5dMӳ潝xziu\[#B!(d:k2uyK=Xӵ2Ea=b_w8,VK-@7yuXx#s_Jp[k ivQ Z,Av[ڭ3ظ Fx(`H!C1_l%H"r[.'.o8#6E^/K jIMP"Iy_Γv|/ʫnE鞋fu'f6RP@gBs;;O^,)Wy}ʼnkspu];~PPsO% 3R^rA=wUs Ѽ L~]j</*s^dlZn<Ӫ t|zأf9~1rKqII,Q8Ԥ5onkgz<5B7S8A_V{ǝgi]Q J6vY.֖mΫ< 6i魍f SK0WK{N^7Jje#ҍ@E q2rp4% yB%O" (?0I#z/'៶P BM3 =k7c|x_ĭˤyN&]?:_̍c I`c;mq8("UܓX}6e )(!=P'H8Ri aZ0f~J)KJo;]<$PQYC ha:Z4AiYV,ʟWnԽ*4!:{>lmrug U"#U@L u(sUmXDgz a*-=_b]U'p8х7C _^ !f&X]M>mv@YeUSsV }m4{=;]oPͫ*8^g|5g۪&[ }W*0ʩY6Pƙm 9F|9}GngNSAސ,Eb[ 2H ؁_nS/pP'!cъh1'3HʕuDP$AydN?Rg ӌ2,$XTԑ+鹯)+UW7(dbf'_vUu{mRw“QQ9O wӂ; .]$ak_ÄW{= w8"l>ؙtț `\ gs!@#%L`ZwUoCױ4lp4ЫEť4/={Хe#iYo -Pw}!TOO m73gpe"ZI"Bbȅ?GZ[}G*6T|yYhO@wЇaCkzCe f +EQ}~/eP`eA \cbU [nr<nhYd9@HJ+}r ӧ!kҋHY]V]qa4UQ^ ec\cy̼ G8PZ9ܸQn oE[4t(;"{L#jW0>'2AUM",ň ]!g%<;/N=bN>+_z4]A$m!#<5,L@Mo;ԁe{Mԙs^$gܔINL\G 2j&Ɛ dI>{x$嶷-Դ:6{"Z׿*7ECyQVwgn|~mQP|/tAwN!6$Y]~ICOyShd"X$)ŃZysŒ _D$/EV{@mKn?or΁BӼRnwS,o.b&{MfU+!0^OEyrcz.<=]D,Y9cVp[d +SdP_?#n ~R 5RzW:ڋC mo)᨞gRl!BdᬔM 2ڀQEA IBՙOYΚ)A\nf_H,m~wЕ⣒68_!!9d}kT]#Pϓ^ ؑO?,@3v/Gࢍ@p+K S%}L6fWv:5s~Waצ})ݕH)=MSM Gl,4yސ?OcE'oC@:AuZrh08~e$W"~C5 ]SN|L[a^ӪL1+|ILJȅ0XZ/ro?z]Y 5̈́/R(>u_vم8oBɶ!q{f)8I\pȸ'MzoX]+qI.V#? F(d~b@}Jec >g49!i|uVt[pg ^ a)e8$!9 M5Z?듆T-q@ G~ ãdS)q\=?zz|t[[6:@IDATItq76a,-$Z@^, < &5*1R(E^Vb s]Z_G+|GL36Fu%/#q&5ײ]^>44m> 0@m.0FN 8p,)bPCcR83B\?Ǐ{< vc-ZK3x$yGk G*=?y)yԞNΝgpӑpi= 7iF2tʷʌ~S)XSXA+ xًHYPNEIu}1(kF@rbxLVƙ2~o<ۣMLBzTIo{;g @'Ů, ;E9י DE .,`SK|fxI 2ZɁQwZW* 3{u# Ӧ4rBXm~Yq@yl%xtpX* 6ILR U_QԢ0f_¢snV"h\y^#4l*`l=>4aŋ?d5 l/Uij)l ɰoғR,LGe†C5.  VB^ABo'es}!1fIgX|Vߌ!] fR؜ N.RN(V 6L|UץkuXEW\YXR 3wV@v51bbE"<_~^ t&fY`]F_C0KqvG{}[sUPm\{û7P-v. g6\xO xt]P9|#͸/flʹΣ pN@X|V2LKjR,= # BZ={II@ƉC Zqm*̈wHԜ2a2bhLW`B%u%)0oN랞\Ӄ> Wo'!aO]요xEP rcD!^E!|s™_ Lٮv:NǠQ.>*WUleB+Ƶ,hM<+ \(~E%֋6 Ȋ܂"f'ł r\RyevZ05Kv`OG]#|5 \w87ԡEgV֧iBA(nbj ~^Ud'|[yK#%=ߺC{oKiĒ#mŰI F(V .i]eTӴku$&+I@_$'klr\3: ln'Jm?6y]]!7|z׎yݲYčgvh8di p`%r<`WKu_g4ŷc!dMȓQ'դv}Wj T=°n Z1L[[! ʵȺ^K:ǫ`hݼљPc텬aB)((Eo:|a7v(I4#xUԑp~ٮ j7% Zc.M=9R1^v},7zE/ zD;dC(Qe1Тj}AO%ұMBGܠN AZ*7KTCBԎ$]w.SUB) X){)i" nsDh̫əAP@kz?7eB7S'P#}KP8'޹ȓ 7g}X<}DPd ǽV/!{ (KL̀(q۷k '$ цuNaLud/Kˎ!-} S-R,)&la;CS?4(!^uɱ>"&K0yWʤq40a_l%pS{zeE0̻}\߇9țΩDLO$&; Pn&ƕSW|ڄ֥lxC ڎH\5W=F(;5)ۂP!"scr0wyQzMnrTisgAa3O>naz A(*ww5cYm{'@+RQJ9~0:brZ"О,O>5{Cc1Fy=^.>Wn+q풛=y6x*u=g`(9OK,3kyv(CpӶ^R_s.N>bWWu͞/O!.DI 2"dͧo yp O&D?4DP R v{\A!y?t|1kyIO'Q)d ;ם_ _Mf@COni4[xo~\8(Fnϰn֑NFI %E,>< 5 p+cĘb/Mi DAK&]Dhy[ZTްXV5ir53 VV{3횴g)h. i3HB+Oy2ĄOZ(ޫ_KR\\?}Z3UG?wE%-Gev4gx)JI̕uͫ<)ZZϱp"oMx.OV_^jA }luXb="DD'@q $ooʣqd( ڂ/7!!:W;%h̗O $$vw[&h(VQ֢ӑ^D *Jc F7# ; 쯑%vxٞdI#`R7My}]YQ ߽W%o7".ͫ~P7lsw`":룃 qAptL2@:@/63=Hܭ/:pVV\s 56<~eN.?T=)jPndr)}R~lĚ.l87^1p+X 3@.jtͻ?g;1x2˿#4wIy<`5z|H)K>l{z]T,8VX@^n&õoO轡P{~Eh s?vu!@հ h,wo<' ϗOǓWWM|?ޞ>_X?ဵwT!ZYI11{b肰;,vE5}~Tti(+- *|9Y:ݷ1gZ0A< Pwi"C:ʶ #R?€V!L\uRFn͵\^rk,"Mir;&ggTpiSE)@+tqBa4^Gbd=2}1ŜnԶVdϛ،,(lDJaV>P։ 0hU~k}sۄoney|9f/ o`T3`UwF\1"ɇXeC {3 >bU_$1 LPf]~:.nj9EcOowPQqRԠ<ч5Kk~xŕU XN,inSu)RAՕv~Yġ+Õ-uUW?Ǘ~Xa:h14$o+>F(к3y)wGY`=RjAyR_g4z |'D03k$r\.:qYMEm  \XCf1\P>IxSYYͬhQpQ^kHR;Eًɺ\4bZݎ{);oZ̕JD,T(K1tHt6Ai~z~ZAw?-ċfeF`g@@Yt)2e3 b!7cK2<%{:{nm .\:L{f:oo}g)Xk+rGCg0 R ě*WCj-=u5J(V ar(c9<.WϑY1㚆$cWY8zlQ^6!sǺÞ e}f>őUZ(P-xwy#&3;oB)Ozy)Y7|P@Q F/6^Jӧ#+d_Jkk2@/-<.40x(;g ㉀6fji P*[2- Jtj6x}.颢/BA*ɤNpCl;-m:Ja7#ۭo$̝I6VUwuՒH̓-z1`A Old dH@[Œgg,wZUEY\r_H? ##cψd&X~[;S[>=AWY[փw0Q+j\5aW?;a|+ uL (M{ҏ:)̠(v;7/ύPFqxEb ބ@wyflE 4lHyhѡܳRidIJR7&Y2Q|_V9G>nj6%lVpz-~nM%\3J?M=qA p#Ns @6_O3@\8jm ,KcDڌD+/OX YǷ&#m3iMhɀl iFHe,G2HCg[V,v}T#1jY+A\"W r<:*|' Vjv9y6._]`& 7|^Z?TE|~(TM Fk=?Uy+{l|b}_ .D,/~k>_3~W=f[_(n/b0g|p0 20? r2grvS_HY Jsaɧ(?EKyeanpБT0(5Ҿg q$Zǣ#H3${˺z6SHB9^}'m~/1ܴ^|mBq`QJ[ ¿~d}gJYgB%dE]P\#ˁY W9!缭q@}Ccu1)luX>¿ x2&q 8~-8斊ϱ߾k`^"[IC 'aZ~#m"-m ÈУ]?iPW~Q4Vㄉޯ=p4ƭs).K9Q Oh=T *'1 Yڰ'K7A0D ޘe;(g6V$!HQS:0`b–%tHJl@((ߵ1yKYѫ4gO?t/nV/>x_ K^|5\#o~>'^zO/~oOrS }3t]q|G(Pp,}5zvtPԴA P/aO~@af4lR6ݟ~I; G;͸3%Bş-\7 ɸ1"8c :RS8k\>/o>Eg}\>_EYһ)(8^ ɂ>^LH%r -,\ٕu?_̱+ܦ|g]C_Vj-= G8g|:9xxBDI#5',(J%!Wcew lؤrk'FR(.Z& H @I737Uy)~Us.'XjJ¿}ZO F`,_7  ފ@ ￧9+S~gRkbr!v$֨L(, v` %!XN'xFA:WFy&o_;^I{hc^~8c0H~EIr8s` `[3swZ%i+U#pv2 ڔQ,]L2m]vSuy߽TjIO&o͔l&u} in2`&&;-e.TJ"@ +: ? xR}8Of[NQo.eґ-K((2 TU/$SQCmcct]٬Xduey^r-̺GӖ.K&]z_(T}&C- /-1^$i Fc HgsiqH#`-YPg~>lIPo~ͪN+gzCt!l(Gʠt!iKYF qc`H9vtxZ҆^f9}KkGzTLi?4qJ(}|OR+EQO~ZI&~Ty7uWDP-Umq;!m鍮#+ȗ\̽ХO.mvO]J(@\ H޷j"_(]gU0Ar,: >ǏhWOk4n?C @sSf '/^ eˏz muuw݇_ڪ@At߾:_(jWb@e$&_ݿ^)'?햐^dK{C izAHr{"v F\MSqڿ8s#"h\z|8Dw6Մw~ju:Wı"c_Ƃ۔Q^r6A5쒕a^ХI β.(a"1ݯ[ ϥs?Q{ ևVOg/FMdqC4Z7?:JR7$ܶk?;'O (YEw>gmuO`|9L4/_w؁;;~,7wc!c^|[/ﶬgW234a-K3}Z8~wp ŌAI6hNKwݶouv0: A0~/ɨQv auQ׻'AC{w<1 c} ^ĺn#TϒL%֋m)vw֞>;7e}C=+R<R Yl7:>zݍ_]ũz-qz;i{ #"MOR 8N4+zp&{;΄B-(SkM}~|r_vpD|!&2 6oQKxmpM| kſ*iJ=}d*؉ZȒeEiMzF(*ɹ yGF$#|N[?Y1fs|[qvb*u 1Gl%|r5,.x I7¿˂MI Xmce*PujBe~cX_|{W HuXq~,փg ^5 Ja#.wK^Wko˒X{Oߤǿk sw4;Ȳ N,Qh/OV7+޾b,8q6 laQԿdPbg?,p_]AEt]E\qP}g]r`2PfYj@@y_@&!(Ƈ-TZ`AC{c$Ja361GFc 7TϨw-i V>qD.;A}:l*K$yx1lD݇rK*1Lgs.YE|ޭZoK()kQb=y)Þ!(Qޔn:dV89gbdbjlmk+/!1%Ș<ؠ3s.o>BM7DO&g6s!.vU8aJ!Ǽ%%7;XaB0 nqƄqihc6ӘH9XճT-G'AXi &xԜvic}In)n~u^LbbWdij`524 >F~[֛/}8w,l5(߲`2{'>k(@oފaItAgn#Lڎ⫝̸w-kulE:H ćadYΊZ܄PBj \ݑ`bGGÿ,ڻ5!3`1 \,x#A f_Bn2.GlӁ (85 C`}|)L.dKuS11')z.%̃Gۆ7+'cF wOKƙS Vh=dnAlqe&+Rj\bta4T:u'U&=Vs}A(pX5>H <ǐ7`hHFP|XO2TsE5N@⫲;m aT~{~DMr @6`qruS¿ӗ!/{. + H**dw/,ǚ ?kHTߏJ'-ir5ABJw "`z5o 8c&u-=4ͭ8Y&2%U:dC'B ~KLi*ÅMY Kli)50<ڦ?mp>@쁉56a8;tY<&(,3yf)-CK}$E ULbϲ$ /…>r%$ۡчLbrsU|_:kwr΅Fiߖgg J6?{ՙqE<8]iSE_*i4% ΑE[<lYZHYH?1TZsѓYQk/i3; ŴC}I} sF?2q6G^ugsfQ<uutQCCbv9_[g,J<J^[NX/]%P*{co^v^wSƒ/dX}m5KTˮ~ʗS$pu1qAr{28r1( 0KyEq-t‰w~=~=dكȌ$cxLB m:>-e2R[; n?KA8 73_PsawÁ?Té~&8t.蜚NMfr}/}˾mvErČ יvɼtEǯ hDE(Hk{r 3;c;)(H@/4syX'mݾٿ̶i!DzA4wl<{z.nBŚp~u' b9WՅ"0+b ?ռcf+2?u5~nnk oS_QIŒUa⾪̠@35d/9$$llKVρ`¹"hf¿ Xb꘣8胳~]𥭀yUZT^@| y$HoU8!',w&XmU#a`Q^3U$n +v%\J y7َo.E.y)Zd1E! $i,?ZճFi >S'ԆF9LW%BܕyfJfӼ "/:$:XW\K< TrWeH[A&) $Ro  RR6Bac\df #*A#|ձmU\RcLse&Jr\وXYPEXeKh<=E/̪XJF@ZpVẂ5֢M8gCַ\,Ա&ʈ1m.sYlDQvso%y; DgA^gz;u5+_D8zk:BAAd흌vūic%u@R8+L4B]@X [i?h)oKEeiLL7XQ^D폼0X[Xe҃-KE8nC51uy]]vXs:Ogf! OA#Ę9b}BA_Rx#@VJmA >kbK7 Ẳ-+lU)q >?`G# e#x(b}2AQo{9Fq`a,y5Xe MRD|kA#TYvDA[Pg  %R--PmQ<&gnY=cx w TST6̩XRzL sYO\SZRzr<;{5m*\+IYwZac2II|d3y:vդ,6T+Iq_WJ;55f΂*'n[pKy<0KPK,#)PCJg |_Q)A&TCRY\'iM vVi;ʟXv+c̐) {E6qۇ$ +*pEATLlxhnYGa>͆1f$jUm`7y mJ>K͉1@!T@c|\@ZR淔M,߿)kO)eA¦zlyµ5Ի]˼:,p;є'??m)fB ȵPZ [谠@ƏYO`(h9%X1P,i*Mk+ȅޣv}s/Mϴ'n7:O!zt,rTJ[ oobVnǎ"k9<_y!Şy{m"?J=GEhȩsm4)0'kuL̫C< b*x]* }O<b? m> WG@I.xURvCZA _qѤy,hhmt`n4[a0bXha%)j`=)/ ySSaS<3h*m ҅ >*}7|O~||VC#JiqJGH'hUP>+@Џք}Y"94 |׭?Ǚ/dhe=g-Ȋ]1\b*HZ&UT%|eo׏Xڎ 0:>5W=52 ~1\h<V[J0ˮQ(V9Zx%;} {4{ݿ*c“;(@9\#%trA=3F.r+SyX<* &j #4J4FG偏WFp|q7 ݐN$ ^k dȚȊ\EEƆ@IDAT-)@,Gtظi11%@C\ RIʟRa%UUt>j@,=iۿٙx$tŀ`Om9  2@'{O2=v*az]0b82?J3J0< eR_&ގ&$H{x6!xvi #,%>;kѫk3Cl J6Fѩ[Lh 64WUB'\_@Gaj AVM `4DjklMTi`9`aM6?u174i8ϕ(@ڌ(鹲T[b]hX 염;L-0϶;[P6Gp#72zM*c1X3+ZNt>"벞Fv\@*E[9(HC#\ ("|Ͼb wERL J=!o$)s$,&qS96+j^7< >qʲSd1gu: p # vmsHآ 9g?P܉@l灒1!9!Ht\ƨ-IEzgCbzu$~K^~{>o CA$24G)ޫwNڎGt DɊfɈ(*yl'ELU%EzvSDzI6l%F{7xP~ Z-&2̚6*0ffurJBa|Lb|+݂EHI&ce~:Bm NFl> O|h2>^Z&7t=j?|_׽n=w~wߵ*GR@5h۪}Ck{D׮\RP[(\BJ1Ec),ƣ =-c9io}yrH>=[#2酣oI2Dmy+=^6-6e-cKAYIC$p_)*U7,/cF~kjmjzq?]%_ g~^H,܎$X`l57%>PR,T!F@hm8i!^m F//{"\'Q9d AXTPM)},$tO3D&o A0J,B NlPfY _>8VWmF!G*(a cc@w>iS@@h;FQ'Xޫ4+Q{w[~^D@ړI|Mَ*ih~+Ea(O㈠uML^Y烙qrNLWj_ u6 <5 hkf?=T@s\:?Qp0F6nAw:͍&[$ ZرDgjI#-9qpASU 毫z͚E0al=]MaD4;}dUܝEiDG`fڰ ~Ya '`2!BK0,e67n* 3ʥ"a$DWpɔ₸'bf\CY?47QP7;t!Unf2>I1\!J(ʽ RFd؁$~٨koM+\{2찠Zo7b8f7po/N .)c4*pJ#c'~"$YP9z' bTVþA,FΟڀȏfDRb7yDʦ,Y^4bPem&X{ϰ/#`;)ZkKSZJ#  5RMzr! mxMNb 2)8?IBpMyQ/߲>B(t|.XlUA2+J!u+r- d/ !kGj9PsEz6W~bcA1UeK~1qs[1)*8J(@a\8P{wq(?$Bq6fu:*k (%g{ﻉ.o %J >:wA8/^eW{>i?&OZwd=,2X/O&dC I(ZmhsyeW,K 3˅~wn2PKlYޏATsiܑ-,2{FеrxͼRCq+K%$'% QI L 1Q08*"2^`yQOK&RX]\(0,&jzHAlab;qefxXAf8?ƣ D PAD6YFCw\$w2q,v]{,b!QлaȚ۲^}~fY"@)'1KCuUztTT{ޚ_$5Ũi Cz1a@6ŷ~vzdw;l8IU$?&kGU֮ R6;ZOR=*\$r $9G=i ^L&φkr{~!KvJU0ƮQHMRfz?m"`@wvƠoqΪva" wKX| AFv=&%)tDl} `G ;-iIŒ. Vwy)wWt[b5ɼa5 ak|4&6Xa5Mm+ݍ* {D$Ԑ3ʗ&]|:"%1I%aϤtIn4q}TOˢD݈مāgRx)Mlpw $4C>]M=;wZݒ 3vX~eVsO;͛ {XkΡ[VV:nFsIbJ 0׶+th>bmR& vTפ3s<~fXoESϞx3ﶭ_K.d:AHFHLG+A_Ť%U*dQPd݅W=tnMrtr8|] +ls~l+񾂨$7{"Y2偝P^<ȸ[^+b#ଋ$.W$-}/t- Hͫ >&pͮ%-|V { Ic1|ϗGn7/R mFY%I-W%2=Ps LURQ9= I:5%-Yp'YŜuZ B#u/>~g/41~MX[DYBլHH5LhY{ #+8 oB%I)~k :|pT@-QZkUh,k?;ٯ {@05s}]6m dSڕ@Y.ixa`wLJ7;{ ޒvԻ˙*zuYv?|)3 O,1LzԼ*m "T1bX֐-KCAlt $eVҴBתh$!,N,UiU)S듿w))Uu"E=KYp׉X@9ahK0A_E5-ܖ*~Y1EM#wu { 2CDd< ZbOo:c_4nN1ʬp*[F 1qy%mҺ ]!vN6z:+F@܆QOY~?AMa6u|}YP1a#P,*qEL3M1L: l:1@vr 4F' Gg􇕏+X.dxÔO. +H4FYy6(UF "vL;,7BjV ^w]! M1N^l_dqǣ&PM rh] r,TˊѲAMlKtO㗂9AnDJ52k?JU9NnR殊@bDɖPБ#j݉utCn=oI{`ݛAtk\AG_Azyx|֙puYVm.Yn b.(QnyZ#,K4حY Iz@Ql@y6a 5LxEVH}(xto=4N჏&6z%x}-”Q,quβSTUzVRlA5.ai̛˫&,Y|C".Ȣz3o~|?|Xz~iZ=Q^gӣ|K1{t)AǸx^Qu5R`(*@z8fp;ϑPfJA0e?\k 䗔 ݒV>(G@ # !πNzփ3:ښZ0=|/d1 =*3R4 =v??6oBvy'|Y_#.oޝہ7 Bcɍ_]I 6[KAըRJB7/4羭źU9yV~ILkZ}R9!)ㄔ*  ^ Ќ^;7dp2<&r񟠀/>=`?v!FUk$n|}93; ceBZA[&KCN|hꉎmMh4pa'NJV[,X4."(5oXY䇕(~ w-u!Blg^ LLҬ{0)T1BL(/%͇ ԑ^?WsN}|u OӋCwc]"ʙ~ynY7Ϲ-Q S2H@%y닡oٙq go/P~{" Lf!-Q%ш๸אDm[tk{J1x܋u~8-*WV@ʀ}y{Gޕ5q_4Bɸc{n_rM9񃠛oӎ;.cɩKR9Չk7S;7 vu>nOgBŒ7qH{ˀDb{ms__+9-y+XMrdZo cݏ45v4wCǾlbR]#;A$婈ƽT*9skwQ z?!)LвPu_yM%n@qƪXI95\ہfq!: 6j 5%i?PA-͌{xI :} &J`p7}5儔BȻϭVCtzǝ/M4v7 ﭂."qlVE483,XDw6ZYK#OPV66RWS@n%; @ @'sYF>q 4@2àzgx~auk@WD*!yEjFAYs WPyX|֒[Ӯ'֎ .Gg]L" P|N R"Js6%RU#,ʋO2Y_{Q̒uh=߳5b;}剂%PAie?%2/WCܐ"ϬzcUKF\^FJ7l 5uqCrmsL㮖dť"`AۮnyuJq~25Xy׶4xSxg8"%o|i#&QlmMCPX>0IN_J'T_k]48;jI]\D*3L/,՜Ov~u4tVW?ZdJ$pU& i' HK F00ןJCEUZڂ\V0~g;YZ#ԯ}yzeYנ{d}zɟZ_,eY|:'^8^/MRJd>wYy}GYR-XMe%)i0 c]^JKYIjUe!DSB^%Ω>x=bԸ8,~wvO? vD(m@jfރJECY pm?hx2; ƴa2d b;&k׸}9GZXCYڻOu đ(D#F"T Mf#0_u]dV~}t۶Է[ q]7y*,}l`tx|UB#J~(r3b)ʊTJ ('x_ق@$!oϱhamq<,qR@ZM/M_fL2yMg݉8k߫"]~M8U$ިT9ZP{y\' w։Q^:`G^İ.P##鹼QBa^ s[$ Aʕ\[;3,׺ ?y٣ųSE୘w#a9ړ1ѺaF& d"QM@L,,JWNliqIX~x% /&[eDeu{J=e jxEY}j[@vȔf |*JFR:,vwe6,3~Ž7o9y,Ya!#s}Hi,qA0M!`l~tK4 ʰ?5L/Lʜ`˽\d̽^oMXaso@glb:M6"LbK?E&w,xxC k2ijS/0%vV0 o/`GC*& wӄ?m>NI!=cR'ix|5}ӺAeı/a!u!KS퀟xV/6rM‚WdÃ?x8WhwF5O"zϢ9r!d:Vt[.gE&`OI#*G;Z "0 1uP`j% 5ibvW'xodwb䣈$HIRa;:KU; .b:keڗ?%۲@I{OSpla//(=kzs έ/:%+]ҜN2Y*UѶ4εn;?ȕ;w }'Dk;go u{,+mJ!k+m⭯ 3{sV(Lc& PL>Y+|0UV c$ZTP1ye4g A6XtZ,;mۂe", w1 ` RvݖV1PhrybBk6}>‚ ntD^ 6hNYPYvB)ie?Rȷc h*W|"dS1V7Vu:^(U.blsq󣡢lKw֠k[*aD-擄T2sǸL)iMeM PPcLd: ^^5(匵=_z+If{.!oxf=)t^v tIK H, P(LX_2@p%m'? [McIk Sm8ֱx޺l+r1YlHz`X,A nՐ5s"fW,JJlդoqse6 DI)xI۱47c5r*zɧFT l^O{|r ϴr+^smLW{e@#6ĤQxLZ-#럔Fmg,jeiGH8,^ ݭ؁9EF, 1=eA)SS! &^!41{D12(asZ?qDU3P "*LZBJ%걢V~uQ A%eM[' f2AƇ!xx(FkHzr9DڄdA}EH7GD%vEKA̢擾߃-;9A|dW7X?7Tv້֖\ zX5ci3Y W&g\:VuOwz* ?¨1m4QD`) 6$5Rl3` *^cF;G_F0/@ZBQ}>RbŎ{V2Q&9}TP1y|‚g.xuq mЦ729Jѥˎ5eҪ"ړ TDOJx*_`'p<*M~kU/ u,(6M8R] >E˳[u; ߡd#5K *&MYt~º $VD}kTXb%ۍ 73B*+iGsTv9.ٵ\o}0(:x(+_CJm U]I`b5D됄+kM[I͊c*H2VXx|?>%n(yGJB#cXxT2 b [=c֢spW ~\rX_nfaRx;/)~X|"J Ɠg;ryIu@`F[6m<ceAΤLh1MﺼABIZJe9uUFCk佶݋vSP]z T%-ےͺ?Ze{8tс˽=J~+AL_5%UGJ~M+@?_)u8M"5_u"֠N]n|9v4 yc%G>0  \/]N4(F` G@<.!G?xJaĵKJ(AT0"ݴ󁂮]Yh P%$sM߭_3HQi[@Wp*s]}4(;&[b%': N _$zS]E?)2B}"61/r,X)V)M 4{)atBa(kώkQx~%=KkS?۶?tv $κAy7ZkGV{u=ضR_@n0@/ޠ $< kd`h} F1Y a1iX?4Dv !.8Qdr)rYA| L_SUQ p]>0k᭭ #5bDV&aBot>ø&E,&1(Q QDq.]*߈:F b>"ܘHsEy\i uFA>PH $ܡۃ*'Oޔudh(,n k{b$ό¤qjTXϦcMG'ޣtU@ԣ `Oi^]#PP =}(C_{ޓE_ A֘ (q z4 lnR,A'JVP12qCiX ޺<5@Jwl?x*OˤA)ΚD L 2vD*P)`#HFA6 A΁M `ccY!ߨ|RXA$禓6khhN3T`<僽HdP@-'35zd ֦鴧9%rCh)fPϾe[x?m-%~=x(Pq V~ˣtΏP\&܇g4A{0`( BZI”iˌsmg f8!}-)ih:BLP! n#}pAl%{/p)#P i-xw[֑^wG Nێ RX0odx,7v}sNJ`]ԉ : V`XUO47Z\H8`"2VPWr,BRBM5QS(<H^+?=(.rdwQAt's M0Ņf1Zb ʲ[ҀLri 5pՀ:9=7D޳((Xx=0Y=k1aAdJVMWFn {oh{d GE$7Xoq G JGJ޴(SͰEQ#\^+uB$E^b i^`|0Bԉ59)Qr|0QY150}񅬄ᖳ85XqNk&߹I؀l.B^ėEb&`uDY6UU7] 4]&O,y-䧘xI?ɻ9K1ˁP~WׇnY"`X T J)o /uPk\qN?0] ]6iƐrG˿rYA#Q{J-/tv4gZiq=j-%K[`q_1d:W&(M`z`HfP&ZPQ{ڱ,A  sV6wR~ESrJs/ϭ{:=}}@ܑohۭ͡.wM483>D w¯I ߐ[}=Ֆ&"a5G\W9E+`Oȣb9ɷ^CZޭ-X((8@ی;6j#-I/LJTCa~͟s- RL%Iqo)LҺ~Hw%VEF\/F`#pRdS/ώW_TW@1!#}>,xf'sD]iɣ}Da5ʂug,xQ 0h8aD(Pҫ/H0005R16`mfb6})6^j^t>aPA W0B1ij=oSzR ߔ>jb8"XEe}B "n) iJ( THfrudj2eWɜxWG+HbwjLF(u #;ˡP]/:Aіb\)Mal9 fXkdZ`)p,UKw}TZz a |Cwbi +V{ T\?"U_]I} w1\t`"9|YJ؁Li+SA3Tb X1 @OVv[񳧵"owҁ=XQ6"~XkȬ1{{(mVuDO6d, \=Lj$vD0&lG Jt}|/;isoiP9߷ݎzk{OY=u!cbXЖuLs}2ܫ窃)0mlAl V &_0J!$6Y;͙7HatVLfC31+Ύq(U֧b+ rLi%%Z $+HbX֠گeŘ`= Bzku d[Ř *Km& qvd[\ⶏTY JS4# UwոTwA=P!$dkqQ?=Eq-t4o?Q͞i>&>ۮ._}moX}ޭ[B '42 i{miT@13=]4!! x`_Pv-s_Ezr#zBUu% Lv Z*2)ju߽x۸q]vhʟ̐cG T!|#NA9_3OE!||f4rMa;4tcœ <ޓu+.(ͺ[ wNF)eDiw zzI#LеZgK@}}]Mţ VO&k: pnUcl795wώ) hnv< rddI&xQE\Ȳ9EY#0p!d^ГОDsB/!v,IU.PAI !7Zu`6'\J *&3xy^@hlu"]&HC[@ X1"V܉vr0CnCe;lXC?V"ʙ~d@IDAT|񹍇֨h-2b$V@G_mE>i5w ҋK,  ZÅ3R2IjKq76-Źb`\i U隒vfAj6kOR**f6 CpE U=nyQ}RJwĤ-3?& 3ޠ iȔ#%OX pyA嬞Dߑf4 bu/C22r}E:Pia(rؚs΁/AF7OuZ雁QbprUp!S1_8eXH(;Rk#L7Vt\hi!8fw~@*6CҷOώ.bu2(zXhqob jn+=R('w=U\jp̮sW2~{؃ruWw:I(Y|Q"bi@hA`kIvlS.][F5 w} %R#I=iE 0E04 wT]y (#eڰ kÇߵU'ZTxQ\ YpqK(jIeߴt H`&$/1Le{(K1: F<`]ʄe~)ܡ)X}pЍw8>ȹ2e;wW󽀂`m$I`e j ]#Wջ##`LٓgIH=0% b4E%B9 Z\Bb#8r`lla`H9WIX䓿/Hzbv`_-! I %ћ{UwB!!ѱ48ks**đ y^>~zDƞ! Ai,$nk&.>iW &1nJXH2wpՙ ]m[yyzzzQ<w)gHTtegXe Y+ MP~rluhd[clb!u ~smKƢy6zoo׬q'ǡ}JFf S@,!(Iʱϭ+7MRTVˋm_AL0 (!7'Aߙ/jr ObA\7YQl Q{R\e|RBOn;{ ,ng/y3mk8V~Oz3< |S6wy,wJqӭ-.FF^ e$x뼛snڲYy(u!sYo:f28HX@I?_QM֞  |D]cRR";3(%_+iG )1`:\H*2&GxUH*y E!xA`I`ΈOI !;B%X8]%kdeo{w/kDSʮ\֒9E̅seyŹggfOU즑Nq?$qA)##RmV=&,QA#7Ӊ\.P( L0W0aޯ\EJ[]maDH{ToIS&){]e?XsO겎ĻҾ_uiϩL&O 2I0"4BaP0S?e|"dW#l['ڽPL eM *FF@ih\r aҮ6[IׄaBOX? x{aKJx # r,k;AVM1aBWɈ"PdfAL_xWQl7l)JM["H?.mŝb+%xqA̔YG$qbN74PCA))ñ\wN,mR[ڵݰ.*`\X!9Յ{e].1 <ǛwKnIqE1ُ@Tʾx%o*~Ym(FwIȐѶ4Ct+p\Af'F#l򻧥,8‚>ymR[޿J1W2:l2eLr%z~| k?B /Xgҕt!I)W%ί(V>6jt})ЋBBmׅZ $FQ^Ee>$uq#|M0Pjޚq4]"][fl{6{@CPe7;ľmbmT#z# b9$?Wܑnv$ HW).\n~/!#@ <2(9u Kca) E0t2l2*`\FD[o">PB\"&e]B> \W)3bA-Bjh Mrkn&rP!8`^B]5+׎>-Ȣda3t@Cu $} m+#Ts]#`]NѮ0%oKR;DceG)v7k%H[7!;%ZJ3H mba=YfXcR?b>t5(?M P͵ l&0~6 (e:>G̭~.(|:zg\D%YwRXDZW>֕*"D׵Ecd D _ضRI"V"}XAHwJ,vg&P WY((kr%dZj ד|ld@{>+1( PRm1&U>BJ0+uu:<$TޱnGL$c+Q~b?Ig_\b #c]iu]d1m;?!~~D@"6 N-+:ݑ-m*H8n]jbE@-@k@ @h=m ߷!Ne a4,YN m(;_50 杘}~HI, 9I\GG(sl 8cWHUEȭ5Ej8;k 7gvisXc|urd!u-xXIP7~;T@10WڹNdiY2A }ﵭW=9=k} V-$֤J|m=G Vw,òd,S & 5RDgn,8Rf$Eb4){ )uZ[p%X_||4'PED ƅz$(r.EB%.W:PQRۆ'M`'xZcV{tlUo1ڬڎkA#H6`Y#ƅKశro2Ս,!wbbV,1Y۹7w2gAE!b i=,s)tPMAB;2,~m"œI,=.o߾ffg@p@I*|E)4R>(gIh!H"]kf\ӷ];ٝ>;SҜss^(y=idepˎsu1r.>h 3w)iEEa9jK4$rc\4+rwØǬP7"x,!/:A/UmTL4 ʩ%V< >O)}^xQZ {pz̆p@E8O56QrT/$kIr nAB1ӶxxI BëQp*IGXeȘtJR[4s*rjפv=M?/e}.ޏQ;w&`Jpž8TڹNwWFfM5IyBB!̳X@4JQD4G/k CFo{D")̒[)~Z U:@pLQo%E .)vvt\K*mvd4dv&ϤKQ@&דplr؎`K*Ezo4QHg.K1R{DKRC)T*`H|lZQ\QS~ͨd}->z@PS|[f'#)̒&"kcr)qRi>{QǪz3;wQ){@&{݉`>7y5dE:=9EoJ$.oa}# ' 7ԣTmXn y֔vGµV]B0{U47 [eqiVu%x3&J)*} SۡP{ Gc!j_!J @ ְPw!q `V,?|ss]pmYixtҺIn/;/^>OgcCFkΖv}tw^@42 v'^s[Ozj҅] ~r5}}GL^} ˶2K$k?WJLHqT?[Poa<!E|`X+;Ox؟TIWÉ%Viy>™%BMr3Fv4cHb5z63o"!s/,A:pnL57+RG}߶ik9P4rau>g!9iES)Nu+O=ˁi)/O:Y]vMͣˣy:[xͺ0u/%5t({cHxe:9`/z_։,Qdt~vپ,VaS[9z?ƀw+OCt!`@gxJ ﶄ.PRzo PR-ג(Ԥ?3)vL( aEœ;WU {(iٱ;(ZX*5G_sܟO=dS*%ˁG:ݢ6?lD?zvZݚs&|%Z<4?ͳLuߓg?~-yFa - Z]3m߻iHs(1z|[<(.2lro޳ߍX٩E?bG}9 psqsx9(xSJP Z8<=SJ$"_)Q-% 8MMj#k։C,)eXm\,BXE |t=~64qƿK  p(}~Yn F{!\,(ں7qDP?Uuشi]lx$xJmlFP"al5%44Y)-@i'mg{O3?=[x:4к:7%D9S=[*P̟?L%%|)E OLW~+')$ bϒVx՗U={VMP{n9`9 NhN|,smKPLBxAl5I/1׳+gxB?T^ `">ݪl ͙,s?Q~0oJ1/n>#!{Nf\ϋ.{5=ōնGÿ_g֚͵ oL2n0r`؇!%@Ͽ{2F\vؿ FK!Pp/ ms>[=ǙOv=c86,msϥu糣]PzvL?ѾiGۺ݆ -ﶱ}w=VGv̶cﶙv3ݿ:m$w,O?aGҕ}MRz sr'֓QF l͛XOs%?v;P3x'cyğw(bN8~ctƤpύ; _u6.ތߧwwEO%ˁ#-HpLJSro7;'gqB J%˩+9.cBJ`c{0GA0*]AG&x[uLvѿ N+qGpSմt穬'L3mu:4ڑml90%#_G:9?N"0[@kBh­&Rח&Βq-M՟~S:l9`9Pj@ihf@Óu/CKE8[QOē ђW} /~V/&|hrv%T {XWH^F:k<0)7Ë.DOF'&R?/ )/wxJ@зB uE$mRmMɮ=iS͙(Y瘤jCEx4Bq*kֆp8){8O.[U(<|D"-h#XS ՝bE?8'I!+N.9ˁrs~&SM#8򟡌H~.Vģ~8IMq:, %W! xy>rs>jn ^L= O~oIŚ~F˚=7K/8)!gU@[SB}uiiH>rE2Hw^gt6U򌧈q6QDd櫺"y&}QA(B\,x/W2 >,&,,JŁɝM=)S 0n_XBj0>tJ -j@a(IB Ŏ>N8.˦#`Z~l G _PI\S2I_tag< ~ާ,!Xe Qc#:1TnC…lxҍRcNa7KscU%e\e=\,wp`j*uo~?M_w){B(WOHLyq6e]4 +c?J!d|1`Rj2δ>:V*AW :cUdW!RqzWe@īwl/_Łk{8,'SgT)\=r`^MpS! A^ AcQ*sm\1MPhwZ@suhHe#ua)pY?a?|}J=%R^3=OQM ƀ_,Oʛųe#%Ir@IW={$+E)NZr#<@F5 m(1o[]I8ʁ}^W}Ӻ=5Tv35)pmtO_&uJRfmC8v 5>ێVp@ XF ##BHa &܎yv/O%!MYdQtʍ#K"p:crE9G0D_!f%.nS! nr>_< g p(<Ļ Cp<}  e9Ks1\*֔y+u-T *qEr<׷m(uP "Uڕ{aV?SgS Y;>׺4 LDhL5m"c)wW;{2f-dF ^|c 7:ӕj99vaGh‘RTI'-0AA7gy]8m!քV\ =0Vf}>^՛ƄDc)-*cԵB{G'~6q."a||!w3cAl- e?"szC]^^gUR]nDF%ˁq`4: 2))F>)ᒷG?_gݼu:?SJkM^s(4s|U:}X jrHyp}p?,d@ɷ lWima(2ykzZgK .Tҋ''}2h^,4U̇sPzS:f&&6AxgT$Ѫ9>:f m泞s dDc2PT1ςK<oݧK|yZR&ϻ~_yE䪙龣wg?@^=P9e,8d{#Xx2OG2j=(EK~gA@VN}>*Fi.YQsEf-]ݐȚǺmׯo}3ge35%sc1$Xrs!m|NTqk70 i*Q|TOdѼnUK;o[97"6N]^R֠G,{-y1= (gTsw_J Hqkg,+4 n[Ww?Wss(E7VAyOc"<ߖ rW47Syd͍p_ˁ s`·;̑`I?0nvULtw:톢˺NuM9K$՘RcbѠʁg;6tҌ2_slCKi({ź}jW+Yů2#dHpM] iF6;UXwm6w11UxQSqSW13xG2Ft{+D.WMrSރ7|9y{73E>x їzŅܹE.,`Ah +!4MMH girAQ^Pb٫Vik7JRQԋW:c?j !J@b+`H !ACxSV"! _6ZMQdzSMLh^[d,^V]|k_5ݶ(iϥN?롃"k=zGa|?mNX=ls5KO{?̸<9JD R5ad!Rk(2 ?(4Hrˁ^A!NK`nvAūUxGjxɚZ8ٮ 4=(`j > ў~}.'D,`AJu5\W<143 l`V!SG@E(>5⹽RKO%F<&ZK35.qyBS0|yr&vWLu[ߨ埛GPa yK".=g*\f?6rmo Jt&IX%E;P!R@S9!,YX$@N7IÈl好qFӚ)cx;\!RW=y:a}َ'xSvs6K8@$`!w*P#Ex 3iQ ED^dA)PKJ<%x_'({q[ُg|=7g/:EarρhNx2t3ڒvNd|kEȆQ;t/ z۴sopp)96?trcRwhcrd9`9RD.T!Z&`\ȚO*y^ȱC) L26Lqa0! @+/i;(- [ߤ jmEW2ZR$ NJQ="?c-**m-g>=D*<:;h&LwTn4:߭A9ިQ%MjP* 'E0ΙFbj5fk99poX%Z |/𒗟*l J󏻦xxf)H xi%&%ykR"{ y;aWBe C@-MD1-D 'n )FnV :NԀq>"}(cjG{K\E跔YOхI-g-I9 4!zJ|~<&gdgmgۼDOWcMka)M-d&,5ؾ-r X{JzvRX>|",D.){[&?jQ,~xA1c,ykw S-faQcXt d2 b cIZPȳg{cT1cHc?Ob( KT 7S|MyL:G9GHn2ĐJy'X'9ДIҢI/n0o1BnB3\\ZG9߬{(ɍirs3xG! nU!!m0b {N?QC S\t4r _Iv/Cg1 Ž]7 x\PJWX{v{zqaxu8\ѮG\=Sꏒ+'j_"-ܰ2F-pXF}3Pi}BBH2S<&t=/. ! 3 #j-0tq][Oړ1+1Ibh5TSq'ҁP$Ǟ*o6~6хyN} ڜ'`t,82rՖop:0t )]((TwjEAӻem߲zy.r"hCiƅOeOEx|zwB;(;P_iA0@6E0q@Y=htK^<<|VNꋒ9oW^Ka(?y 6v:w~~*& b1K>fZ,Rt=x4omm7$Ԭ* ]Qcr 0VWTPQX6`8>Z])j1Żّ Ryc|ZJ^fK2iV" -kT~x!vEΥ0ԛ֬˙13攙#?!0NKxs.3*_a.ו\&:{3XiXF)k]MGDCb˧۝ P@ߚT Hڦ=rr 9w⎼P]Qڍ}A淪VH;7⋀vByJljuqL$!EE_Gu fg^Jyg *U' `@nz8*psyZ<*ٯ)QLZYQD?=SU59UtKhNdrKkd1߭+`DH&#ɽE6"C~.۫ˮ1AQyAr`܁`e߳y;z1uR+~SZ䟽:Mz(䀁J`YBu)b,݂ˆe#s6v#׀%yo/MY)/ Gdҧ/r m XЍiiH#XUܭw VNPg4/rpj=/?]`eĒܰCи[R4&gr,ml6\ _c8&DQ+QTi!E6);uFGT1"QVOL)o%/ =EJUf11'v_\ߧm9In!j^+^ 9OTƋ@g!ANjB*$P1 %% P07x?($a 5ԋE࢔>#=?y5UEbt3=W_d)[>Pk*4O:Z0{-]_EI8Bi mk_a]X4 Q֐cGx-Kl<j"J%bFYX܃ sy(* u 9ܽC,Vvwܕ#O`lԈE0y0H^ц -"8PP|݈J !b<90nH:l<#E]/K0itۇ"# ȢAYo["xl.\9k?D*@3A~Q}b8HjO`1Ymr`8z;=*7{1ߕZWd ́VΨZg k!*X?7wRӔ 9J%{4qb 6-1B/*ZDɻp%\TUKeE1:E^Gtz/Ȅ.מ ATI%s<,{ʯNb@HǦ! S&މm؇2b@=|x"kZMS~sX?E\mrp7kM_(/U7hсISvIps^('>vVo>~C{s}DӶZrJ!^2lqNǰk=8n+mUK d^@ÆoTP- g[l$yAфF~o]2!f.!z&LOz@=ÚG)$xLnah"@c]Y&#dh0TAf@x/M%K_``}Hw~M7߲(h{*O۾lx_cL lF4T4659%Bd:6^h0}WXVAq;K j Б 56XZÔ, ^p%u*i459VX:`F C(ݦ  {ᙶd9DJHs_Ͷ)ZP`eɠ{}693[*0 b6\9"gTNJ9 uКvC"TõƑvd -6W&&>MykN6$ZاB .@q7IwG^iqp ++{|: p9Dƣ+g4N&`P;WEy6Ur%OoUPOY+`Mz$v~SQUTۏn`#ʰ~b,V39o tfh 0)L?Zª7B:'Bq C m;-zjk1x+ܫNx5Od^ET_8O/~SVV)5jU}2''Np:'ۋ-ڨ=)~ kK90:.͓[zvؖB=Kl:"=;F*I ]+cׄ|08ܟKy"C[D01^t.k2D ex(׼thE;XIE%岑o}Xg=*WzߖR"\.Ho9V Sg u֛E(}y?jj>Po!``|ޒO_UͬF yU DH*hCuk,hl %»`H.G6M)2<w޿]) f[#A&v}33! LXtk]'f O'ŗL9e LK[[2>FYɔԖ^46C=G~E1Tl6 q쯷>Qx^MP Lqe9R'kn4: ob^DŽ2m~f1}D铎7qhbQ@ 1@/3e@iˎWCOxưc[:PSR'tݱMMi`vO^էm6=V;h2r|[םRWǟwO8hxVQchRF_c0዁3 x&dq4r"ynYvіx BĴZѵeRS@`F0="|Wrhvh컨\KA1QOVt*=mqϼ棬Y* mYDz ; pP.rt8͍ eo"GP1a4f;/FC^j>Rs*ŰzSU/l$;SDIAc^ǶR$8$vttZ蚓W5[8 8ځh})v$$UjfreF/h@%"]bTVqٶJtwxqwZ3R>c#g/dpǾD< Xxʬ ].zp;!@uA>1AG)31by̺T+*@Dt\Xⰶ;>5)+!L奥pj(ѐd,<[IFiy]{|@\+ogJⳞBbm87R?aqOu[y09A=@#Is>uHVx r͗Rws7Yܥ[;5H-H~Yn5 ~Y$ 7T \cxzM,^$=yy"Sy)ïcv`[BϹ(H2(H^PK)(@FP4vYmxV-X5w`Bc Rg6#b~`7Zl!뺈 X#4 .aOk@Q19 $QiҬ{?|^ Ϭg&Ch?j3T%AHov3$ij6>﮼^> loIFQ~괺Լ UJKG iQqQ`YP\%C`[z ePB.t(O&VAmOvG"lb'ƅ X},D4C^WNtH^ 35]/5zo46Bv}e;E^19N(^A#a(aris%>iͲ<Ly8k֦ws""3bOh,&xYAEwђ0)'PL1NvOfxi o_^y߃p50Nk̋ɀh# Q Y7'yDhn.RN%8e 0w%̫T/0HZM4wz Ӧx9bGq>8 oGPne &!B~Ga q.Ep %PkB9ǂiR/Y*4{πK%Λ7aC sn+d1(YTFGřHڻv!(b&$D6$f(3{KpA5rC΄cL5γ uo܂w2 1MxRwشLT3+"7#)ߒ7q4.dnvj&g;J"zDd X>&DLK g^ơ"ϟ==ٙ14"Ԫ9rj:8nO}xDwbv_|iW}c콢J.&)+SY #$"\]*WR*&T<nnr\OtsMDcRY \{#%b qqo*}y cSɢI;j#={5HG=H8}0|3KOӱw(#l&'9_DD jxaog#9,Y$倛ngB ?Jژ~J֩0E6a/^y6rr =08DJ[ʉ1?-K]"@ p׺rO]f4dh0?~#xZ#PM['n~%4w(,*lۿ8(N(T  |qB_o> ~wUޅG^-ɿ05rL述>|u(Ȑy;Ȼ<-`Qc d9rW.y ^s!_  bTmp(DNpBϿqi#Id0C:D7`$l8_vB9Gw#Ȉij!Cxe>tt%P1k_l_DZԞ73\rk[̒.ܚ8 vwԽwHIv_ 6fp(U3(p2AzX9>g U0)Hh{(! MBϷ;Rsڮ+r}U%X,YX瀿tPKa(^J4~ `%yw Am8xpM4 ¯%ˁ|`M S-gOSxu:69@xa~K)-4k'uaiCyoiˏa▝c{XSgg_JٮJ6U\,z@aQSD,T-&J +㜛H;E4 sRAK$%Q! }-7lɿP1puJ |ؒyQB\.~ߩ$`e-TxQ9QmFݽf& ;~b"xJXZ@>sJ,zy*8qT-ю5۝Ӝ0§z6w1wTu9!(&fnd'KddR.18KQ'1ǔ ^۶v(tv(/ƟI7D0'"!a(2OĥMА3n8" 'iYoE8q@؂'K=͊Ċj3YLp~ղ2KO7 , ziS%0ygWz cjT2¤ @!"z8cYdypok3Ҥ)U)EFk`s#J:7 Jv:r=}ʦGF`Q6{ihZWa* 8' )y)w- W2 @,'Z戇X@9MgSh|8byT܏QjxYN[qj]g#2/RvixXǜOԴ~RY"^v򔑱Sgo3Q6!z–yPtFZM4ĩmX#qSABk]Ypsf&ҠpQ.ShW)bf&!UuYIq6A7ԊU$%Y1fcdis1UP;̩N3J$vܾ, k̰V{!a$  a9/? .2Cusscgٌܡ$.6skJ5>YZ0{]9Qh*?VqCa #j ԓ\h ,,x߾)<} $R|4NU]'v%hU0ʬ@Te 7!{;NEX/mo8>gصk vVvî!x"b*"!ќ~1 nn L]w|0*LORU<oѡ]nK}$Ƃ-)fzSxrsK>cúH_rE潮#"׎ݟE)[Jde=}g0'1Cl gHN7bnd옒d#GXXMI8?P>njPT(oS;Ovv6$x xšᙒ2Dp%b4 Zy 1RX]^4|/F2$dsE45rP?刦(}8pfͲ :YL,LRRQT%ˁ`x^}3 7"|Fu|Z FYs*HO?xdgK%>@ /fTf9&D N0u%¤8O}a()+=rT?epcp%?O/>oXMNDŽɥ†]|;sꙢ>P&Z½AeVݣnRRQ,ᵉP_Z` ^q}2 ]u wGEgp6 phQkȋ^]^)jǥH {SlnူԬ <_y = S!"Y܀>MVw9a5jSkªp>JEA72RHl3?(@8 oCik,  j Kئ`|ve0v *ei|1O_j(ੌ@O*V/f6hlήNG.=(a8 3 Kܛfh*ễs{%Un$pVH%ʿ;Ub5&PkEV55 f^]VL*],0>~&ʶO$Tp8r,,< t5[)DS+yJ+"!: E|J=\_f{sSsFJ4"ޟ?]Δ߾Ȟ*iQ:-5ueH cK8ƺ לVPps3Tق\UqPE&RѶ$==od*^n3:&u\P>\FB+xWA2\Ɣ<')ixu!D9 ȫ`Vc׿ /=Wxbhk; ,Nc>:TR`ᷟ J:u D.~_Sz;-Uj)t.r!x%Hr i)Yh^6:˙=_ T6tvg=(NR#xu$sX:0|D! `B`n@?C*,W{0qE`}oyK\h]=cm|R%׸cAG؎yM㽎=)8el Ie{R-n':ֲb%Px@o׵'*=*kSZRC!:_:/\m<$уW])juĔ BZھcJ/+Y)mK~GjE`8K}&RiOƟ;;2dcQε{ gH;&.;vH18JXX7L $Exл@6A,$KRXV芢?T>#JM\3jΕA.|׸7_/lˁMs`X 똄 9M?[w )PG:N 9S|?e (h=CxyF%)i,W_׳Q> g/ERe?jw$<HvC`LyDu]xB[{:1SV2F 8>pd/ 14|eLo?۲yi_ jT/F” 4g(Xĺhr`9w!+ECDL$uECMP9Bn5vkkiGUS1L&ʟbjDP%;r} %Or}xtsv1O[϶sjBv?x⮝ ]{Rwg8Z;8^q5׊R$Z P"ht[~ +#  Q?n#{[nT* M 5-h)`(P,dwS JYX,2~RVˮ2-ZxQ߽;KSo)>ꤐ}]vU(BNHd[5(! 0pҔl9P:d钆zo,ǭ(eh}*Jrh⢬rtS)IYvGur*oaXD6BK/"I匸d\}\'5$,X$Q#YaI.`(NkU ڞ01Τ}'eu_t us{wJJnѷ_"PB&j4+@>iOܑ$ sHQ@JedL^^=̇T,B*.ŕG(|0aH mx%v iwi@IDATh?OTQClh" LJ9A#9 "4-YIO(ʯ*HjpIS!dqcO[k<g3jQ)gP_w>.Iy2}!<0+wC!iZfsV;]k/i|XxL5;?YEαfP`p1mp҄7?{I5.\G$ :SN:yۄUcZp4H3+O#g&Pla-lDA/⇩"`=tC:DSc*  @eYcdpy2w-l*xeǙ +G4xhOƵHisʇ $(#G& =~PCvHuG*Ue1ΤR0' D^e>c̓ |{9!y&M>Z)n)3+nnv# (vA<ʠ"Deo] ;~dꆢzγħZT4]k-4dGV<{Z9`$jMS, }Cp0yA҆Rؑa {E<7{8m~oVͰx.SD@jNJ`"ƙvR nsQ9J:φ{k9P6dsgtV^6>ōg@Ϲ j%-)^1>ۺgؿp5'ӵ&R_C)g3 P}jFn2*𼣵R2@Xt`?X٣FO̖,-@\5ͅ|}}I,wGiWߵ1,m!b|0z]:W g!H# C$7 }QF~m @G.ynh()eк%kj)~)s9s)۬{(Nnkw5oѠ4ZrT[d>-Þ֥ <3?Y#olx"l|KT1oRN"x&OݨVjcii AмI<۪*If( H--*IM&!]߬ J/ E2u(q,XK k@c]<9t ׉*2@DM,O._S3E  [lEFtSkmcSh݅jk_*Rw|nne(xu5QȞ3EREO9Y͖\$csl^Ž^9po`T¨B|gK Eʏ URR9[X4.˞"]5KQw!Eqk!PtH;@ 8wY_\1n}?KKWF1f75`n iZ滅6QY[7!kYs5ޙp(XWI}a]kEޗנe{Vy}]$"P=E;w,Dx:A"$:Ycϱ*;aa[RsUt{::i+2)"r~2`,rq]+5J=?)C֧ ,~ӓ8#p@𝿎O`%,DH1֓|SuU^+;++CUeV߹u*sVfooQDxY! ac𳏴P(:1>elG .@ȺI@! b ߱~$骲ދ_ u'UCBtC)A|#mПuWІ:g ΐQcޒ@K) rV @%]/BoL`կ7- \_4;m|y^K=utkrq(HoiᇓQml2I[s½g^Own'GA4O뷼q̿F '(@?2:}f`@sflaE7znIP"! nEb3j4FN$lߝ A-~Ԙ/p`MM23eRzfq}&2!ysf  ozc_'S(i; oΑ^wW,vN47]i>W ^wͧ%}1?FXw8j ?.f; ' nRɹlIftj{aI1nDr_w4uT27 "Яz n=aLBSKYR-vOv0_9&:C ʺɆFAA32F.A׉#CK6mH;Ah Kd) `.xe(T`0ڥP:^>Uk b/ åcؼ`nFk?{B&7`?=?BƏ< sI~81]]- &Lìƃ/pyl=s8+wh9 bݟ?`Zsb@Q0 by?^ZC= %_O 9/u]C0ΝglMESCzX-xz)?~dxBggP/%JLl!]G<Ħ+ Gװx~i&b@ -bFZ &P#sh:!Vc ç]AϗZc4oX )G-f]$f8hEA44RlIh&gDh\ǎ1ya-w7nlJ-O٧mq4ru]g N>ddIcp .Tf|D4x龔&J+&|O]oY 7FSBF^F@SyǢG$C.֍Fʹ#h#Hh|@~v!9ΓQ,2qw"S} G1y/N{\sZ3?s'>@O'**ypm@fZ`D:l aCp% b S @fIPӜ )0 Q5tSsq/kUA?xP``H9G1jKUUiNw*9Uc}VB X>u8˛lu&z%|q eLv3|4K6&.=?nYw>8Rj3Hy>1;6].cWL7'潦h4yoai·zu-T^bU|C"!P^|2 Wv5Egp_t0a烔j?ov7͏ϛu|Oik2,h.#/wH`< 6Ȫvaf@~ p5$\~ǻߛ[/\|QrEr}I;w,UPH724Yyïņ #Xшqvf ÞI~{[Ċ8GHJ6yQ[J -k8 PN(X1`Qp ֖Wƈ.)WxuZIײ C&\C@Hpyw&3kUhhYBj- 8o:OoEq/ :; ΆW`fr$c* %H笍 ͟0&p+b dhٷ/ͻ_' vO0_V#-E$s]*Bn.a=(rJ0LlI%K6M>G]a0"̢C&5_ r7k\>jI2TB'sW:gfMt>qmh]*@ѱ(j *uqsz2-є>Op42(0^EsC_G"*iM,_q$7 X'7*Q܃wQZfT8oo fƉ<)?Ƞ-3{މ=@QF&&[]b$<x?nd݉Z*oz~ ]:!hE -dX`ѝ6*KlԸu%"9gិuTVJ7{nu:E^ ;5y;/V/s5s e R燩H~f}CƽB~y:MqW%%dT_8RX' ToL9'Jms¼K4yrIхėba Ņ+Md P+\o{I~j)@Wͽ=,i,l."cvTU<9;z]{!Js{Gs7mRxL3 ŀgs?h9]KssΌFW m/ԏ\`,d9>}F@Df{G&}YS8H3%Pĝ97A\ǰSXCUĀ$]XCP}O+?S5(-A}e&/4a] `bU}p|pW"ٯ73P"HJ3g15ۯ:" &KQ9t7*ByіF]AuqqB7IiCC>̿m%q3ȐxQhB4G$z)77Ȱw;6^bsw)oBdƀo 7 ZŸ$b'(Gg%rT$lXX(9L! VrY\~na@37ARֱU!B0~-Cf~|\ڤn'.3/P)$Oc;:뿂8X{Mk>e(֧L>A]j'jO5|ǘTG8(rFf%A)^5!$eJ" =Si̹θ; XU}Khd?|K9gs4"Sy1X>oNV썹YUKQP,L+-.\T覐$AAXd/gf2g>3@GkqrSEf ↕[2xXlm_ó^!ڳ\m{r|aDz}͆߱4t[?rۘqU܋]~ ~T-^! ͅ29Dz3;u&n? 7rVJ1kۯ ~Icc]iv">2{Y)F-n] 3(<=gnnؓ2axyVE_KGx"?t4%+ԵpݣF$TsW5ggy__v#SII:sNp <1O M5dBIkB^I^D¿3DL 813Mn1h"n͵{<~{p(^66_Ujʃɦ} haAo?>,u4o_e=G=$ 7*b(EA2Qg 0} w (SG_8=g>#D@i5ڦGB OqSQllgq'x](WRLkDARH`6-pZH`/X~ P闆kEC4ifd ^2jCe ظnS|8)T1U X꟔NxhAoiv_{ o#oi w]XTNF R۫mГ1kG&6s]Ha{ t&v7'x'~KKǶ H_7 } Bq& XoD%GdW(*hfeFO 44HMXKړm[V׍Н+Ek EXD]v& WGL{VmבW &±qhacE uL~_M UgOnԘ{?6Lcua)Vf>ChZ㽫Z2;gJ)GG ac=cHW շi^ CyôqH{#SKw_! cc"ӷ08.Ef:&HTR0ݨlWG onW?ay&\,YU -nDB .2DkLp}%ϼ-dk : xЏ|MeF)I,34:#7LQ_㢵rͼ.U$4`z` ?%;IYjNZ~-yS5Ĵ=s9HmITAcO˜Tp`$>44+CDU󶵉|#Yt}=2xc<!Av11`V2QnWt;i`c9 }Oe#KFE#F;cdRX% +{Ur]Vd3 qN*0w21#7nSxp%$կ\/!猭ߩt3#Qv=NI4+?IVzj0%L*?c!Zӄ44g]w]rkުXȴqbUmm4aDlɨ:u. =%lVJgsݫ/8a$^I2XO` wk`F;.w s s ՘F`lZ& 6?7_ǵ'1q-ɷ3i8r=ծ ކ*=kVz/g}noW}ſCa"CMQ#)4DZ15NZ&s3 Ɔa8Qϳ$mv 6Nޭ䥝ZڛF7a0k`F֌  / g&yFjgᘯ ~K:(2xk=BROS0yLu .)E'Zot4.b vL2/+`f?f܈$:#g\.N:/!AtUB@,R: g=/L w16r2)sfKF؞i{LI74ttROzg[0M[W fS socp 9 %cp :J#~6X)8Vc$%>LuQ;׀ͥ2nF/?}y6&_jWնW;̢!*?XSBuwEB@lw0K^MI|&i7~\}/.*p 2ddiq|?1e QDs;'gqc@frn=`s+_Rú+4)Μ0|2Zzl,1f-:c]IעBޛiݪcҪM3e#iTN}SV$ Pc*9 0e%mztY|˹o&7O ~5#clZ`F eˉcޮScQŘ N7 |GZ&?`5a_AĢK?82QM7wG`pZ~y6:ДUz(h9HoyGR5煿1=DE\_Ĉj/9Gh&nV^|+lxlS"Ʈ D]sB@*]db2ZYiba曵$DDmwlTѴ` g :v20WN3XYُ_÷WY^ Ff@aw!fR|+6hIrįb\:-}=_]9;kX1EA1j0әZo^3&B۰ҶAk"qҁr! ULSkGaMcAEA_8ۙi3%q & @79䗴T{1ONjqL;[!jNx?Qep}|Szcߙ1>K)}ȫhf}nJ\[WAw/\E{yi4MO…qׯ|A-7GȮ i-ZN]hK+\QN썓tB45B@D#PJ )pV0-GB83'@|_)\dhr{3'enpc(w۬˾œ]:sh4!)e?xz>I+@3.RUxBOLH5g)Έ[St}dǼ|ťӭ-!}Y{Ɉ1 v#-ҹ{eG !4ץU h)y -q[z(@Z pCwS?զ%6[DO_{A׼A|йjjdǎo'7lѴާ~.qiw;֑B,&86A鿹wkEGic9I?Eh0!T~sqEk@u\\$K\}yý2i##(B@C 7W,&[8 0씾s3&%5]i?i,jkGsFZܗ&X$􍼃)!|HJ]tregHWH<D hE_?pAyUדٯEBZ0FŌM'5wE#D!؇$ Q`];i;}Owg*e{eP.2_}mǺf cJ!q6 >+eeп~pޢ+@:VRJՆB`LqCaR`6b y޸A7_?rӑTc|Vx s0bQE ˉ9zOQnʢ4!Dzo9!(P(Tu>oNz/ǸWPTQm}3zp4WW@+0LGn?f ;`6ۥNRdx8:Z5-uVb|&,(kHn'IVY! XdNs19֜aGl#=jt#hD+nRFgv'm, .L!N?c$#7Hݢ&_6S53  mbߩojIuc+9L_!@@?>&:}B`B1jTuUSs-z&JZMeюs=.Zk|w|o<]k.ZB`{Pg<-~+*u?4{@_K@V_m/(`44}Oa N0:Y VǃT>.Rc+ "G?Hjt DWuusXE9Yi*,B8p=z#'NGK?{K6پD*^ A)t2hWV8s)׈B`W0nn?|u]~.,a@<u8bD${~=™@H1(_.a[\ XȐOjEW{?arÝ6EXy h qS/5O*'DB@!ֽ!#}( r!0n<y(YФZowmYSFÍa 4]RgP1:3-]f:"ϢԮ)2>(%aG&vX tv}yՕGʀkIw")Q Bɿ(HB\>*Üަ ۶ ױnN\{|,)fԺqm0*XDRp!^,_Y]/p!qmZPW>}u'(OCK,4! (&+XaWd/`vg` wHW`r*M&E!@y)[1musjN~>F /ٺ}8)|! W?0g!s)繅SR&*<עoB@dE`2/uiJ+ɵK٤>'ZŃ ~ȀENh;B@dH K'Z׌"e-["umGgt976DJnhN(AojFw ?s#fݜzo^:ƓsΉLYcxƹ+P@F=ʌ'pdpPb%B`p4DBOO~p&+È{ X$c&ѣB?n},5 ww#ӂ55hAux6ݨ5TIDATER}t8`^{S廅h5W|2љ!Lbl#wZ(X5&}3-݄RV7:>2Cˈ,,ε\Y8LI! r@`c1rVUAj4A}x''%Qh:^vп{i38U4a||X3hg@߫bcDZlS~6O78X.Y! ʂz3E F`p( HCxzW73S7Y c1B;`:K]a yz^؏`GFjdDCę2t8<„?4Wm:m38׬!5ԴLg!R6`U$vj]v:.!X 0͍&V׽ F^x8_""t"A{=D,x#Pg|v DB -| %oJ@if*a DU{k˷m/ƷX _3B@ xWЧۑCףFDG*;׿Nz5D\ ZpsigBJ< UG-Q(˗rkܭ\a]5Ew /E'x+(4U!P*T\8*482$( I\gt|ڶ6E_Gv px]?$85#`ȹY'3 Zy`]YV f%`tΙ/v2n|oSCA؝&-i!JQu̗ybco_}ZL@]NRŰ ODŽX-m̵3Z/S]d] .Eys4n!?uS3⹸ow|vmn>E2Z$:M'CL%i`ZUcKd޻-.YQ=&IA0뻯X>|]j}=B(sAZb_t"iuB@䋀giʷbՖ/]hH+&fca GA3RO߮:6DK{\/Ҍw:˘Zǹƍୠǔ| 6̋A$"0~V+t ovx7.c0 M 9FW<)-S?;D; CFvow̕~u-:w+xټԱ!@Im|=ߛOQŞO ϕ3t!^cdS0"!cF>_;lK6]}?>RC: }DvTE#dtqZtwU" 9TkX94J " 6D.#~>hk7qЋ5/\dlgfж%2s&{4#.-\{6]]D|FnMI O^u|_ShJJ K}k\8 d{K~wpapY,TB@ծ+*8j"Af)T3i6[d#27x6"? }pL㩳ȓw?~:s~^!v$&go)J\.)Ih 2o~0ިތ@_ok˪BHf.,‰.蚼I@^|\B`8n(ž]w׾vB O HٸJьFDDuGoyRW->LMXݣѭ9'{s(M\=_$ռyA!oo>ph%Ch >xgn#F] 4̫h 1CAKY\%{xu B2 ZI'Yj Z*.9q)3ul* `F`ub l뛏Q40K:fQ[6M.& /pݛ0f=drgƓ mMTS-LjUMc>dFnimE6(dFf|i ih5Dp%kQ/"-wVE=!אJz3u mT.}C~wdz}fxbF0Vp8v`puPB@! @*%8qT$SU47Ƶ'B9{;ޅ1Ȯ/lyZ}QxNbA&, nƍD?w qʁ\7*iO`V 6 U 95\1bLΔ^SIsIQS yb ~o azLQmjTH0" tR_5K3MG"@vg+5`] vs ,Ye#VIsL#'tUU0J #,;ڶT|qpuŕc ?,SDB@! 6nڌԞ$J6I9 y章|Y1y}Oqb.*ij<~ !h7G?}|2?}( #; :?%NBz HJ\ދ㓴NB@!`PD7hBt KG_lܱ[i_Bqf"ME4FcL_$4ۊy$2YQqߖ䌹mrI_!աH! `Sglc08nTDBBo1xyh, c Fukmfe<=Cƣ9k8nY>ʍ.r@$B`SH)3]HJIfO3ޠ^~M@*6(a[Σ%@Yv5`eiM, >[/pIĞk6ۖm!ݺeĮ`4\ fD}W)OmR9! XuT{Tk̿$~$PA7ݟ?2kQl4BڡIwƣ܂)#ju-.R hgKruc/S_S=a1eڴK"! F@;M߁ fXf,5 dO 10 =nn|OqG3 An/Ri,$dB}Mͬ),e<]%wEÆnJ ~ʴ/hȶm)"Zm]~[Q5B@'ޖjX7CXuVF3 ?xe *3 @FC֑iי2s 1O:ƿĜF踙],zw5 ~s|G1fZn5x Cl"w'kQI/8 ?W\k/! ե67W}r[?%gX 5jEA^~с){ћgrjl [y)vyUR6a%tm~T&8&HFؤEej<(z\7}/Ծ(TL7 U#s@dF$B@d;wFޱ8z2}3AFAðd]b>0A\C G 7JDs0Lk8gn;w?$y)jDB@G .iaٞ4Sh9o-`V`DQ^ͲeVU:+B@ tS$՗DP4/t+c1_! V3kj2.n<o?~ԫӟڠL/>`Z@B@!PFjx۶ P9׿n{3;x0` $4$5Җ@A8?dqSR_U՜b4tdy'@tB@"PFW<щHBUaj.=okdQiPV7 B@! ʅ@E r0V! Rƃrh3QQٲ ! EB ,R! ք7`Zmf@)=:SO c-W! B`MToS5#Bt} :k?Z[_EAjU@:B@ -+V #EXѩx`hЍ:]]`K~Q\t N- !  3@߳2z zLC6<tz CCyt O7A_B@ ~=!JbVG-x0?e^0^_znl~_1 yH?^꛱<ꋎ ! rZ[Y! +F-WCӻQӴu`ǣ{8Cr"0& #B&TB@! V,V *F@ž?]:fЄSp{DW}C3M8t/33LM 4b @ kϯMB@!f'@EB@9݉9򬟸Z"! Bh.mR'@^,r~jE[hˎDOgQ(P6{qdi@Wqh^4z2&*ׅNc.X+B@! H>B@!8?R5oCdNǗ>jCVFd6 ! G@.ſGX !U,|P yI"'M5Ġ{t xAۯL稱6 ZIahqzB@!`v\ԲB@l!̋f`/1- &! 8' S^O. ͗⧞`]U;B@! @2HvJ !PZ|@$֌%FI|. @ .jw·(S Fp؟8ҾK]UT~j~5 !9(B! yԫ:(^tW]./ c4ߗ x85yj,85[Us匝u3G00OlN{xpX7߬=;<7Z0H! ( r(ʝP?;ifԄn oL )iםlvoc| $?1*N_&WwnJ3!a?3AZ)T977#PPZ! y @(!PR\ `InF'-5ȏ^WI4a)`}'B7[]7 0)b>F\Z0GNP05<'M$ 2]|1! B0U! V@,lz>~ #(N&7y&Z(@Àxd!0B"e xFU߄B@D!8Tu !` nbɆ@,Ԁ72=Cӂ7Ia ~-Ll@-o |9/bkn4! (~!`@(LHb;*2V =^}>_ ڦYDB`Mi)wSeXP{B@$B #ffTX! 1WJV YN{}n/.6JάyCÿ /C$(0wb&Zz> +B 1`pnL2ӁOve}-j`u\"{֯ʅ(0[பk[}N |\׊*]km31wF;|y[HqxcI}?y!@??aCKB(@&2f ֆmYfQurggaLAݮF{N4|)r.״H ;yn4WuuG! R! @*t u"@氝˼b^u#K[Wg}2<y:T\ !*^ #X7:,][㙼Up :* Q! ؜jG>—Wt:uB/KU3cXdex==DM ?8QSBM+@$H -C@-% &9< ^lYUjo0 7'λ%QC 3cj-Z3i2D-?uxjra?*^ M /t?A8ջ)]DB@ @In)@ o >C4[UgXzd'3 *qJG>C044}Ӡ6m~DB@"TѨB@!Px>u찿?&ZOf{G`!pg>~k=]b:/B dOW R#@ SB~ II&@ājMw?5t23|h0&Z@߁)Ԅ ! )`5]"BSCPVT DL3G&n0mtg|qz)W=D7HiS/zbPsB@! Z|~1 !"F^B ODnٷyZ;mǴ;+C⥼Fǖ B̿-Z*'B _/M=+v;!" "՟'d0g f\5@&B@""5C`[:(B@ @ Aw_5ը{1tjtOB@]B@]!  ) R8 =|4{@ W/Fc$~jIԾ.usppV6 MV1FʼnE@B@!  @nlijk/q *Uc, LGfnsB@!Hw^@ X !}GéG$B@ wc!i:xBzSsU}*dUB@"Pc*!B@!9__zo/?! B@D:]& @ C@6褉/{`w_yB@ y_+! w{=hjv_! B  U(KD,}S' Lk`FR]zc3TLxb! eD@25YE mMN#;wL ! (>j[=B@!Pzf2^@`tP! HӅB(XFP~n>1T=B@! ʃWB@l!n #̽,0! B ;C JR֩[Tk{_wF. V1\@Uu ! (6wB`X)\#a*Պ v 0xTb;؃k6iiXy5*!  B@!6Ȑ^֞m>l&`Λ{kς+vZivM]! Bp7_z9UVq쬄e+BP$B@! x@_1}B@l+bm%B@!4[^ 0fu* ~;7[#B@! ."2.b1 !T$;Q ! B@8 P$f8B`@oNBзGB@! Ȋ@nb5gff:GqB(!JQr3! B`sPKȇA-c>}|x'㙹E(=:ӪV!?Q,ںJEB@"@ިz}T`*-Efx:7SAgf<Ī⍎Zތ ?YZZUs ºY6w[ EL&XEB@! (M]7-j7 [͖Jb4im  1_ac"g V{h=:d}!X^z>zssc}B@! @aZrt@?iw U8:iB[3W0uhGpF߀6AِlwL$8??7W7B@! 65'-ڟomJzV1/Sl ۺ2q??_VPd/Qvʹ.u?tvkB@! @`D-G?s{ `*̷*@>``)hb9E]tw 2d܀c f-p5׽>AYKoVۈW L`.J*|_!StB@.p]oVttozwUF*VFyؓNFf5|]Q ب! cZ0hw'A&GƢ+o\kE;ٌJM}*#DChhCI}D=rs903*oU!@ ~nf>!aCEvlh ?_]! 2#D`:6~fBLAVBݩ{1oxh_'PC@rի5oͫ[J>*M'k 2GLmi >],6Ž/_'O745+$_}d&㡄HYs?C ,뛝׸f{0w[r#q2`gӽkjSg&M)Pt\!  ӒQ2>T~7Q-3Dnu 2mO@+%G~:330: hw!@k@m|/dO @µ8(<5\TB+ \y~EB@y`s~8wDo'-B@!PT4 | jB?*%i}&"6`\ܽL@#H$?Z0lj_M7&К;ߺ䆛B֢cR`7^iJ @柖@Z%?G.! ([ogs:sn/0U`P`D/k3`D l ,B7wVEQTO5''[ CZY7B·׮3eCBl}EB!1][4j E!pcfɶp'sJ*/ 5h<켍, Hf1FW(|' X8x+yfS])?Pw+BJ`[ʅAGĥFYh ᵀA/. yBؚ9=?l׈5! @Ipwa1-0 ugGF$[{AmK1U?'dL})n.%C̿w;}Ɇ ! ֈ33 8~<NnbIW[2c ? +h䘵b~58%q=s6ߣ|u!y WEsLP8wıt \WyqǪTcZx_({Bl}LE?o|x=oo [TN|{=ύMa {{g~4G&"]3 i?]=,ᅃjiUn_NRkwkhB S|xU 9[rGKޯM[t/7ptxqj񘷢߹f)9hdr݄oG54a?wwcyߝ܋Vg߬gV? "O6|0͵?-LKΡs^Tg[ۆ__( BQ.޻BIȥS,l:/; 9R7 =R<}ܲߨsnyy豿 BY<_{,=Uy}~` [X.ta~8Xwq 2lV*oVe56*q:Ԋ-jQQ,JY=Sv}paUsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`opIDATX VKoY~8NxkHh رAf?@b3aЀ`1i@ @(L@x%xqv~UuUWuUrzlHdv\٪{y|Q~ݨqv)pCWrj\( (ca^ ?sPz`?X,BaEE6Fj,q(l%օ說A=6 h L?%O7O]| 1rpbi[}jO-`d%-…Or @8 7J N2FSUfT0{qs=VpA27#%Q?[}T``E˟> u5];7q<<w&Vi:g j)4. t2mC>0r_(񫼛+KwqyS,4;6<֟"a0*5Tʃwm|Adlq(l>'c2lƷ_{uI{!ӄd(݇8eEUP{o%+hVqñBcix<&~PޛHAn" ;>{X] oke`,~Fjl ~/?EMQ0pudƧSе˨Wr 4jOG.W>"qqz̦Ai'y%TPH Xiz#<}wƇ#c2p4m S|4m2 3LEM3gz߉zI I\-P`S>AϿC? 蘟jihҁDal{_~ ͦVJ\Q톋0HnMZT0>9VÂ< A$Х~?DHg3q./ԡRonb 6d%\x478bqk[ *,fg!upfv ֻ(iPdz| a 6<Q!#'/@@RΦ`iyfݡ1rRWβ4_oX~ґ%_bkL j2AHh2ɸd_4%e i9H|4gKa-\F5Kex> !۱Ym1^" կ K.X&JÉ\CfJWkԺ{>@Eɏe;3q$q> 2|MetB"OOaqyFR#rN\nj9)6N.]nzHe Rdb hV}IAKgh.cId)tzF/ve$Œ Px#<:/z.M̗=2K kC/+ FIa$GëYRcL25<:IǃTsg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`oIDATx[Yl\yf>Dj_-];}I_(@C_ڇ}+>@д)#kISuۑ%KLIIqpr}H ɡm̹w;gM$۹r{7#: pO~+nl>9:r91<'M!Rj!GxİnEm4h4vįѽ i?;=  gǒJ EJ_x,xy~v{Wm,x~~.XP I A&РNV,tر5:.s\kQP,W2׮϶m[W0}ma6Mh\pТZ:\6xoDQk}arH+Njg ܾg9|Yv?NjvzE~]l@KJE8~ 9nLء-Ƕ~t'`~k59v2mx~RCPePyJ^v<JE `pvh0k]P8p||?B.COcCpX? @s%Eo>@X v]Ϲxg@JA&}6NYcA3!p>E,Qw]CkxG߃ۋpi\x 7 ]Aݶx;c <ԺwpUUn\/ s0Q]*S\/:2{?m?aDݪj9V3ũ}x= UkuX pI=tVہ|_MW?Y2'V* TY f/6ntl6|`j*;* LaӤ"h︃GuB` D٨/ۯ@2 :d&<#Cgbv%xWtO0?SLkS]OʭM M=H. ;Z5S"_7qb؈ J Otj1({BBn?ܺ@4۟o4=[DI; ~ou"8cV>zDLk;_^a޿Ri#8vMÙA;D@P:*jDh{h@5o>`"C9?!^1q/SV!Lli#^a>1)ky@vzϗyw*XwsP'=I]Y*мtNR 0F6c.>{Y:VHckU­T=)rT^ CO `uTZIoPʥU} iz3s;= | 7xgp{_ 9{N;эMg<;G}FܚPʕ$ %|S ݑt+t6>xOѨWO1s7L+rz @@(=; " ST(墁hLyz7 khTؓH/g= -}2Э6N]8 dtmaemM;zM3مdNT )q wB9 əAWO j<4p = <3ڟWU2sXGKJaB0>|Q^F"c݅as)zQ*9Hs?T ]cUQg9eܽy̼IQ~TѬאNN`eV$ {Nc)v w 5/@Lpa&Qҋg1wD fLu,ΤEzbmlfFr~4 YW'XZ0!.p@ %CI q%E e%N,{^/oGV@j~p16<~桕4K9 Eƅskj7d铅 J"zDdc^[761W4pȍP(ÞQNKYeb/xNV*'t#~xQ.JUB,(bn-->\rӵW%o ed Kr KsYV=ɘ#c9 sFht+qc'{Ux<~4[I^V=W&IJJVu$5,7" L>⑓H?u (2$rXO&<ǿ0MC3c7$'fvcgLx{<hdRI.| E#]?J祢LtЋpfXER6Uj+,+櫰zz&St>1Bhd@@bq? c^Ɨ?hA;d]|kt '?{ gacN;;Md\.P0zAƌ"6Z1yav+5Hm *,tS[cLeTV!dg(S/Gg-G .$vJ2JnMMch3UcZ5Ebijg-&N l&pW>Ijh&؈+DP:AP.z82O[^XgT0IF2u%c#M;ҫ$ x/ {kcXu&2\jJ&덜 TpEZwO0Hy^!RI +J{5g )Q3_"mvs\$)p,O(Ӳ j2@{S C,y9V M'~T\'V>[A|6KWL\2uBv:EKȉfɾʬrE&yR Y!Zr[5<~}€kzz}Y]I)c5'6j7<%5~1W (uT oFBLf"qtlY8m8EPf&q}>T5Җ܅62+ZyK4Mk;%ڴQjs^1y[zjto-꿚[}5uSʤ[+?%='aN\ƍFO <ܸiL#?Sy9uϯUa3Q(h?J.LD"/-g2&׏[2 B=G\1rǀS-DO#"k+%C쩜s<1PĄhȰ,~i3&-j\,pGJIf_Ɉqs-vBgU/e{c Ca My'>{!Xɚ26|Lc}i9͝M/M ҕG((!mN SXI WF: <3Q  z gQr2 5e{1Ȁa~PQN4^)#E '] O\yKL0gLOv6G8R15?8KϾB/HXP\}~b\ ֖JU AZ)|RU01HX;X^&ƽ%%$c7\3y C>m7m;)>LKMTf-G0DIYT]Ns=Qq.5# &d6 s[^\ -NZ\gcL:b|.ﱉS,sen#Yj3~ *\ܜX_)suRu ?5e,7)~o\QFN?}C LFi*rjÏ81Hhk 5%h2V+n2kQD^"vk 8pQ \X8?Ñw=RNUmKo ==Ɲ"KRyZY35Šդfv(0Z()_5~~uMMn"9%kuKo_M\ 0%kJ\-#~􀝳*o Z6/9*S}g=ƽJ{5%%h[ATr2\W;n*Rw5nfXp=}6٫onKxRA*%MloML КD jݑ?ΠfUͶ޶7²a%HqSt۟Is$jZm/ln滸+[6v]IENDB`ic13=PNG  IHDR\rf iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxiluߗ]]]{ۗy/lR iR"H*lmh:B;7/-ALʤHJMB"`f0_wuW7nݮuߛu-דkz3 2d@R g@R gH1܁dA 2@C d )@j@&볦w ZЁ@vA @;?kzd8A @;?kz2L 23dp. ? @!Z)@q?k Zi2 R0d4rRLl 嘟5 . ?2gA^wpnPOz9ޏn Wij?g~x8 :/hE~jh"k)@SA 8 /ZQ}5ksAPL5ﭵY z p(@Ө!@AP0Kk^&3 AXE-RvΌ@_52;ÍYChovWJn\u͍y }q욛{O->VDBD]Bcn#Wdyѹ E+K}͖*<:`NaK6 i@zK#f{Z-ou-ז=Օ\Ғ4g{ !D!EN9}\8vNiypH/NZ3`Ksc_W) 2熆]Vu={џCTfh3Z3<)}^T{7ֳ1`ٍý^s0䧛Xǿ;U㟣7mx ?P_~nj ~fj֕Ulc_QC_ NImC/FH&dlϱ>w-) ?s?~'b撟*D[g!Rw}уbg_z (=ۋ&| e${ >W} 忧WR :)\r_Qo`S=E1z "e໐v`}`zK/gyZĿLRZA~2'Q</JTG9wEʗv8Fp_:M wܗ###{̬wwJ]xm(=P>~ Rkz&P. l >,qz>jj! $/GYszO*;eMѼ`ژZO L5`+n>J&fvP n `\~P:-gT3 (}|҈N1@:83!3G6 ǴcAB @J06$4X##SP I.R2v.)mSⴵ_T3%1  Tc? RkVT32&x Sͻ62 OFTfvDH1 ϳf@w-4tzLcOtb?0$8@3akzz`*@ZP=kg?jf$ Y V`!P:>Ngonu$ᡔ!RB*t$L!JA0@ x ށ@dn2$'irOs@d*m_bnP,8Ej%NN`3%!V2F-,Ø2Xˀt wͦk錈d`pX\$_gcCR/xi2aSuQ=#J֐ߒoo}5)ǨLP6?oh{:S Φsݽ}Exr3Gt|Z_wł++ט [ܸZ)W8E4@ \q?qɭnFVvPڵ5K+7zUvwv7;߰\kçonhCQ^*˷L!ߴZU#8_l. elqյ]~ݞۛ aHK{\WzwSt.f#nn~#ն[ ֻ_р7nn|@(>QidK Xʥ%]{UDƂ5,dAsų.?2kOm7{Y;q sY ΙYYaD ͺՅv&V ::꾱r+媖>7L s/^r75?y%$Vλ\~ҍ⯻ϻOt-q_zMMr;%*ti%7]Im1%7^s(p@獛b`%o06wyGFz}a [nd%` h` w܍S/룮$p?s?}wgY>0>v(CO$DݟoĿXRu28sv ex75(/^i@KHo[ (5j?f=]ncw?~cRJ;[Xď!ĐUVdG755!wQI㊚s7h-U"hqMΝyc ɟp{-'ц`KſImj˜Jq*%=i:>iw[ PXB&ó8E=W=+]?cX8;WQ(ӎ-MF }WIMQ`Kw$!4F[8~ķ%-X_w[ f& 6 y'\+C_kym>Twt7 v[WR>YzDBt?Y'N) 婆O}BS)hGBX'x=b=|>~7}?|gy[0!)9\Um`k{g;$%B~!3ɘ P^ D/{iڥ[(Ƀ1f}m0wIg_Օt't/Hب.:aE#*26f=gNZ |kk>-mxpOJ-^i'Xn{ zh꽒I%1j(gV2>CDVDG'l{[ZzCҔyW,A~Jq7_B>s(z[؜'_"Sp'}VN(RGbUV^67OA>p tPpƆ' Alŭ./t61w3Oje[-Wo5Bh01崖 lenb p} ^0lLEwT]0%,yǽGRIc$_ƺ3rFR$/!t23J b@ qd}̛!EZWqE oX$ncah@rUr[ Ce)SSHE4M'd~\xR9ݹgP861zF|&v98bzˉGт`+QCѱYq+ܤݾN?9#Q$m32 Q O`Xz ߐ)܅oOs]t"+ݰےϺK[wSG$zK.E$hqg_oA΋Y--^;̳h<ZˆKXy I^bğt@\G"-FochSICChCbvs-R 0f p2]"yx_"~pE@rD\jjc IEYir;uè䪀g":dXF@٨]b "¬8׵\s?%-ǧ!wTֽA`": ħK1 uXT @-ީ$V"nLj`GhAQbц!!b4k8k(/v@˅Y8US7K hFxѣ-WZ[᎟w'N}x2U@/t}G%Γ_ČJT1LOB҇r!4m"~Ƀ?l 0XO !NklB3K:X6ob(ڨ$zb6c@b95/QM-`FpDlOWL*hJ{7ri>U{!$֐rbm憔̒V_^uO}Dpqj8ȉ"ެxʲ `u)D^&Fƺsy3@Qhp!,-3bY+'l{VTk[7c<*Z:88`j@۶޽MˉNkoĜ2A\$h (7~ZoO4[U1SS T_yE-ĵԔhkz!2oeҬHRl?/%(iweIi$ ?W4 qޠQtSy˘Ӂ$PlvFY@%N]Y)[\-%l5z~mDVt//xXy`25함f {~W͌ vKM =_ Lk}6HHH ıP! ,< 2'75zق+h~/+Qҽf[Z枈g`CmmiʫUW.c3;Clɗ D5yFa`> r25>4oLoږؿFZ'UwGS\BTckµW+YwǞV8b}Vgoa$>ce)P4Ʊm_qyIH( -˄l20$qUnQfmsw!F\pcӚphCOUD_-5ǵ4$L4!4tb]k;eQQTO ~c,{lF~ص&Q}X8}@kUR9|c|}+l!;JyC;_rZ69|`o̳;1ME`}5I7Kw%kmT7 98C͐dA&H졒@}R,S%28@"thA6ӱi/ X-̱D i˹]yGNNxve ۔JwHU^*w+87{U*u}&wqFAZPX# Zƥ#3Q,a[W嫠a ( HD[aEeE8.= `<_tVA\KLƢ:Y㍡0`eKR$ P2*9R6WvAG5.ݑHɲװ&3R3vB@FdsI=0xÝV1ԝ G? DbzvIUj=FI,gJn4g1dCє؍/Y,C 讴v[QV$ k pH2nYiƶeՔx245={ڈTi: I|O~o`u^b3 ~G~?O%XM[%%3DKuUج ֜$iW &l@kރ4,Y(a I :řS<9qdMHDMQQɚcğ-/iv>VJ+Kë۲Hp+rSgǿHL,~_E+_o/͠w0Ii;Z8N?vJ+S -i;(:KL[ҌVfIxH5)%hp ]C޽LN)VdѺtS.sF>Kx#cUU{WmL[`BK O)|ǍO-/G~x%휥؀T]Rf;4VQ5Nݽ^J 7(`~^eiURtz;\BVV>4!Grb&uP,‚ڐCF|ez茷ʚJ)/t} eR5:tGqw?1-?l[BNA8`_qq<:C~0Fj8G],ݑc/M%<;U93!(rf4%cL@ر8S߫6#rdcO1{T_IgThƧQs5G;lIcO& P;ZbaI%Mola  ehD}CTy)Ҁ3ɩek7%N}_"UCr0Ɵk8s{feHK[_\3 5{ v=,/f-@Lf繓/l Y!jDQwK~MMQ*72KWdbq7+,z$V, |/!Qv'a|͕}k!((A)iC;^uEr4ǘk .lj. ҫ讽g Y[BNSae|C!G ƞ8;9Sb507qT"nbiSf7Tci0ˀ| wN~y/9|Hp[aC^t ap{A`(H&vX0޷f`Aq?k;:2~n½鳒Nf _P=Ѻ9ML8ePv똻鏺c !ss݉?ꎝx;aw܉OYIłH?\rq~Gեm9moA_PK`]V3%髷ݧ`~)]e0qLM7A'!5$\kSDR^%@-hg^@hOyMf0 &3Oh^ƿFBJEQJo!i)?mYV+UI~lSBnqp%u*5}AL %ʼnyƎvK&|HFֵD[U"E^mgOP4hTWdDL{_{t_6%n| jv!|'lf$BnwȂy(W"PQOZө59){o^rdKFIkfVJrJc@S[)8\DUW\ywk/&V7 4#-M+CMubUw7Xr ω>!6rA263SJIM88 0 `@CpLT-M1) n1WK_`o?#E&5u8X%a+r W-߱o{,.^-e^``t c:_`d |@( \Y@BX#m28vzR !͝ਏ7ݤ/aL>7OnWWZNdYqL6b(ġqYU4wڲ8rEmwV'}ٽw]I#ΥoO~=񿭲[ptf wf.K _~a>li}ZܵNU+g1\5VhǎAx|へPWTGrI JI h%åcO˹2Ow ']rL?q2OTڍ[9>~HH0ң붒BWs0Vk`*^_$n*+(poAbُ ]tM{% A(FRV"Aq p۠HsVXO=5Aķcztɋ9~F ffݓP~f6L,K1-oDr!s,:'N\q~ԓeloI|zÖ Yli;*Фn9OHŷ~:PvT ݏ֯CWi;ߧ"ޟx9ߐuUİ%~+wNی8]]n:B8wFdH;_3ZiF2siy赑A㗽 ޛe6 NݴMO-Kr8cV@z@$Y67W};QfKPVx0 t DMVYqqK`%ZZKqz] 6K/0]d\ٍ ,*b!0n*%pPQp%iv 0()ލ޲ފ|P ;|D!W :$UhypVD=rM,6R(ڋa īo,!da)ˇ iiUI ho0ы *ui ߘ$u wF3q:$ΏqǴ#2SS=漯#g^C!,CCoc7@*Vmhc ҖPSg;l2-%olܰ%\%7f7TT^.W?cyxS>RVq$%ɩ=6hH0p<MyBWc KԃCVq 74jaf6{G'VTnyHRg*[ vKl!mᄯn:Жƫ[oO(-I&hjmׇY r[0^!Ά/$`Qx>QYlB0S0 8l<F:;Q\N|e~fȝ88TWdX x 'Wՙ*EU8Fl4349RQXE-J>cp ucGns~>57竈8%mg`ٕK)Ɩh|jRrÊ|cȅ^̻GǦe 1IiGF屗~VqIqcߖt`F;QU14AщK:=B8Y= 8ShJ B \#*JU*B>!I$Y1A>Rp"l/!Du *f8V*rDR#:m~Wi@Rt͛Ю(H ;VmOA4~ ql/YbEV6\՘:(eOQƨz s'ݍw +O܃ ;~8MkX[3FA<-q4pcʖ2X\"Y67"m{-$M:CD~t?Ș1ܑ,N?[VW+^8LJRե!"1\dTȤmԚ#YX7@Qd}vH@L0ѦVޓݨ$^ekjG}(bGk7YHB0Bbc0>QwS/Oyl|p SjW3ӖFI| N*s؆HkJ<KϚxaM5JF@W5H*GMޒ4V714TQk>av<vO8N}r3nlގ3/m[A2iʻP(C7jKN&ȷ1cJG[ Mq)掎ۺ~`lCCq<#/Fq1b7a/q0_0m+3L~Ռ^(}D*d&umb)ϯ6%TNb݄-̗F{F[HiQ)Fv 7@h}DZJ4siE}n=7e4%)^aZ+ebq8K4"ݭ9#vQpڜYpZ}nx\75Wi}. 1{De#QIu$訕1O\Ge%Y_'u28f})WBDeƝ!LY B&v,iB7=;Aahb(څ>A {p׏<N.Zf'JcMK'xw-T1Cu.@!3kBH' D /m`R,إk4-;WARȚN;N"3~ 9iDbZ>NүG}3&`9*fꃜyOI=ҳw #n<3ŀ@V/ ̅{xUPb +Dk"ο0Et]`: J]unju8 <UM!&~U2e;l0jJbF9OWTh\ux\^Xȱ.ҰՉi.nC ܔ]){48Qe[ xa6e0"'K&^'ƎpU)2 1AeQ'KdŸ+ lHbV㎬Vϛ<GVY>>:!ret6iB0,>%X+`0goWܢ0BeKQaecz2U1_/eI.HGCr 9#xz(<aQnyIqt(cva|T,BHQq䏘6IHU|_[nHg E%B0Q`=5nmXzsޣ l\db;~|ApVT ^A275ҳי:\'HfJb?!^Av$ı<;aɦZaߔ́ 9 =z4%/b[l$ `9T& a (z'gBY5A' h茸ܸˆHT*PJk+R jEO jI'XC6LQ霖FQ #(:=>}>^٩3`bK?[VH6JzO=tfyށo2.iMʶgY o_.񖓧dTD{VShԏ˝ZE3.ZtaK`sZg]$F40B/w<|y>%472FbODsVmj/7+sUSYxm0m4~Ύbguא܎fD_ck'LΡ"DȏƓ+f'6~=l)&ݪ4IL~1:3况#B3H q! |}ND! cZHg>/kC e#)VoP nyUJqB$`m`;q0!8=h@jYi^ RQ\~aK4[8žӰGnjr˅ayQHk)\'32Gg7 2khI9֥ kfg: I'LK4q e`M !X-p{i3!-0NȶߺO[s},yGq ,3'lS9nOkWfoeN0E9|ݓ#g>즏=iyRw۲zqe]Xf#Q$dnJpTVt~eB_/JWֺe3Ze2*G6m1Yyv>ԗ5I}~)%6i~D#!lk;C >V%xHKtA!RY*=jڻiwl. Sˊpڎ(SDO.u))WtO8p[jDRΘxcҗج'9,ʏ܄wȚ-NOn8uk)c)zx!@PJq2S :f# 1Fd4`| P{3 ? u#8z6`Y*4Tcq "b>+&5}~êj^AifF?si`D?8n ++$ɸLs{UU)8"?M>qcU? ?l &Ue2 mmD\Uuܜ]Ro^P&C $#,>+z=%&@aVq`H!}PRVp\+ij-?(36bX&;P7$g_uCξ hBDnQD+D'š/Rn;*ZEssĘCri<srh|31#R_6NAGFFlxI߯lz{#8FuFNq ̓-f%<9jS[idl_>Rv5z)ffΚ,sM- iԴ/6b=g( l3ds ^d2)ֵcnt1KJ3s^pW,J]IM i-׺ j!+t褗T[_a{σz[e+ &e#4Dv;aZTn"Մ٨/$%-c 0xbʦw^ka < ^Aa{m`ܖ/rV8ZHN mQUaH7e1UzhAZeX"7AR<mBget"Ba秊#s"_:!>XfIΜ5`yhu /u 5iiI-3ZcdemWF4Q>l]x0\Izo #?e˪Ԉi`jӽ1dh]1S׶vUJ#"c7^uOfHdG=#Z8蜦7m~$yg_n/o\Yɋ~˼"@׮jSl8$=bPgb74{b*'5*=$Hg0CJb~^(Ж6ﰂM+80]yYH&-/+Gla L|H{ pb[$L$m!z-C5 "|̃6"ǥS( n 'sՂB$koIXxX4۞HF>.&\Ab5Nq9!!hˠϘ[.s1Q&ݲpeZ4z3fܑ3bsla507ՠZ{f4(<5CVߕ)}$ʠQ|;R:j֧(Sji}NLgϭ֘Qm{1 \{b% +g`LիKf -?LHL#D$-.Ҹd!KJVM-˰C H҄N#v+ f,ܱOϱ( 3gAջطpC8rZӣy]x=)1C[ot-y qr9e ;d| ?eJyg%BR jz(cI`FVΪ!1L%ͤI}chϯ"WY'(:).WNdց a3rPfcRȃ}hka -vQnI'OIde }Y9vh ϩLh}6j҉pz82-;}N' 2!%yٕ发;o=Z!`cY (x|xLvघm˫6ݿ;iCi()ݕtFa% bDcDhprr) u]^keRSarRqo[zyS+"_ϝS'ǰ?~+'4/пLR "w1dzN0۪;ĠP~B l)񀅥"vR2³.~BBIƏǤeFR_pC,/^&IԒVSHS|nJD 32Q7墓 PwFY|}Hڒll7ܱTν[E\,o`NY$#B $QH#"13sZO Sh# 2L\R.ޑ@`L3>LdG47/. N2ㄼc\}lK% D L{%?ˀ惦a b|QX_%A)YlOaHD{8l3VaIg%H,=%4F>6&?1 0ZI>X J<3?%F 4w||+ ѱ#Si=H!;ؠ|k793&C̅s Ft21s-h#_'mCCcDKbM U=Knl46Ð?W6G Ia˰ [J ||>bS3NF괏y__!hpE (9"όA1d<ǷQq-=sTsqqY#f[%"Ltx͝8`|m3s~FDvKU m` *maAh db6숞4kID3ASJK` tB@|OIhh)yx֔sBK}o/7XPC`f;:)?چ1c-0Ww6DxBalBqC Θu(QP\߱JV "s51i9?.9gM y5"V -;H/;\Ob{o8:-R60俫EIs3p&/ _:dL Ed=%[|J,ګ6oyE=xNH˃;LbFB!uP&SNOB>Wؽ 8"Q 1ZW~`P|È,XttN2$CCI׋<` dz"hNa :~SeĠN ,Byd%cE{MA AǦ 9Vg q% BǑo@r{M<AKXj@:5 1Wfv2 3f;rLCxS Lj o߁ HO `ƑS,w~>;=d;fr/S$8AѻonG( $;g;)N<Ô_LDY.b#j| V0iEd{̓ԃQ70&͙{2dYQ~ْZ4dyh#0b̷Zji` k?* l1?!qhi3&k1)< `B83%$.Pʈ²+QbW,bY ;Zڞ}K7 axd(z`ʃKFWK=:">(^R(mIKW/Gޝ<媲v pDŋM'W($'O!7n|vX[ʇt, iMA)KF;1s MDMy`.ݦ1S{i@`)6P:A]IXN'#tO8E ھuˈG’j4ȓs,融05#TKNJ`iϩ-U!=͞ܯ}o[Q&ߨ]lE`!f͖"VfMI-(kfדLl lP+]B^m7%|S+Ac,T{:z?DڥGpCriwQ/{3 Ѡ@G?[1s [K&XW뇣N<}A'mT |ם!K-(30SZqrrLD q $ŭ^ hP}#T%Ύ5Z _td탢2NNӉ8Xt`" GoKJ<q1~R ζw[I*FIo%z__ja@mU{!UbVW;(㜤 ٦$`9Y. 0_YVƓ9)a/] qs܍҅ y)?hCyڂqo7m?`g_{,n">:l{>:ƺN+2Bra1E}AG%# G",5ݢ4*هgg\_YO½V_uzA'Lc/ND<1^#+gl;pYM !8JoaFL}FU-6-| &0Bry,쐌p_+?6VtL ŕzqIg>s2Ijc[{I4~I50 wc}G+^Ѿf lZ(ô1D:&KGO院P.2_t< "%~\3^p_|yĹoX B]5PD>jb-{Q!HMc%YOA+̈́& Hf~V]gzD0wɌOTe{0{NC-Rp` h f}+'`j)՝%e}KRQ d-ʀuXhĴ\W vRl`]"+sDHz8cg%4̸]y3\B !`H,υ8Dq@;?~A?O]LM tu`rFQW0Pvdd E; oni$dYgvkwe\bV.A)F;_ S mwm1N(~7鴇WhNyla lc-"QMt4F8(f F>3-/-&!NR-o0€ a0hB,N$$KLVHE961Zcx0;$/ˈM(/ޖ@1<'3ZON?8ԃ8KCv]/y !9g}V 2TXk7!`3iW< ÙψI3<'Kg~o}.롘B 7lz$ peF8݄o!b8٧婦N*$Dx0%qͼwٍ%Y҉}"K>Fu!x3iŖ1>ZE=Я0h LM`A$߅o+pĜ,~DlX-T{;YN(@3|+oJ黿}բjwя^mS1 g7rp7ߢO6`B|g  ϗO@Ȃzg?pR!cD(C) &/t ^[ !yӚZ0/juCRпAŎDH~wG7_5HZJf a#p'&'}D>H<)˂W4e-5|U=@\4i\B۩r,Hb& ~O /J2ZӔuDnHG1dH>&?stXr91VXxf3ޖ_@8a4<7 Ycq Z;u! w%|G*r:_#gѓ϶ݶH{ @1rb"S`R=i۔D8n0eKj@ Gv*oo~&C̬H{F[oQRyO&ҁ5.oe=Wi8Wcw\_06l 3YOX%3 Dͣ `~۷X^9 ;nj:3&!^;5Po?H2! p͗~,x̝${nRS/"&6ai.ǴHbO{*+a!Q// }h i͢S/w{T`>$W0(^.#ZA[<_=s '`s13Oy|, D4s!ZIʾ~g8L5v2CPRs^@0`PDZOQ殭ܐ( ;fQԵ e~{IvԐLNT/ԂiÛzo\ײ0~˙?eNaZ>ȼQh\' aes_QGwb< a$Qt1SE/X5Y-Eaep2PW-W @p `}2.^rEžA-?/ACH$J宦l,߂тJ%yyyZ1`I|`٥؁*nA$0p \{HsGI%>Ri gF32fKwgDPsAMP^DmιsϻMm6XE-!;wn ه$/~.H"fJa+xtۛ_i!E "(bY|`a\smiLYpVaP]HÖ񰓓GY˹rԕozYe1#M B5ÀuG _# n???9Ids+Jl8]b IpST*Je@c_nN9NB% q Ĝ(( ;pJHN|ڻ~7CH/h+LlS3OV@JDtA˦qsg&Jṙ9-RUO? BD$0nj\t+UEWv*æJ8pu'ÒN(YR<7K >fU/6c Ws FE@r:Dd;c{JW!/$QdCt( H0EwZbPA 8D036r?_uߍƙ'#̐`;5;}2 `=1ĂIyllt#"V v7rLjk,Bon1g졺(1"`_SKԔ2gﵞ9Pj'E霼 "[Zee8vHŏ>SWϺ_A*9<n0rGNtFA^`p\[r Y=&x_`okf.LZCTEiRKZczK0| 5i%yR6/UtVBʕ(x e.{@»G1v O\%wšnj8DHѓ?x4>h FOC 2{! 3N(?0ghnwF[KMafu~AL,1ݦx`tQGZ%|!0i픡4鹒׏uܿH)*&wfqGICEmF9  {-- %@'-HlQrl]%R$EjI$zjwvfwvǐ 3;GuWuUuUyEӆݤYq;:_ a(.-x?GO1mQsdy/lkBqC6qE$h~l(puj=@n4 ܀Pl׉9b% &uv`G0v@@f6ܞv!tQh3B4^BCȲ!uU2(#ǘ2,>VrHe4y3@~Ɗu{\ --'CDT?mIu(FT K=[(ۨi$҅]j \lzP~~(RmlF"rȣ !@%NQb`6 Qń$Nv|Y7~dXVڀyk8CўY%"lnKν~ >T(+!4Ia\VX7,aaL[e`oz c&Ì]&B[Z&41i3ms9ز R/m27 /"mN6{*\%N0AS Azc1l8<7 =A.CI7+m+׃r(atg Pb?Hԟ6el$m]$]WtE~|a]E0~WFc^be\=߷عG$QYhV ':͇+){n.g6 8-$ X<}w㺗9&*Ǎ`?-`:͉Wt,TR"ca 6, e̽G?;/2ȉ@ `߇-6iqum N >n;ű`Ŷ΃LcN3L]Ks=ٯCMjH?7w-M*j8gwxX.WrзbvHK ťpF=yL2vaGp N|!uV~X{!-k_0O3*I$6G,4-/](μÓm~5Kqu9tf~,QgI۾J}V&Mp u4L,OF' {?xm{TDBmF4Wo'?}{q3ᢁT RBT8l2}XD7ɧi<|¿8%j-Z: !X7-y |๵Qc“‚kyZh(y_hk1ط:e7Eu96q&|ol1;bR\1+ 8u;'@Q I5 t3;XVI|"fkRV̽(źq_M?ѕ!2`<}FcRoPo*2F4ZZCTl􎾃 \b`RzO[ZJ.Ͽ:B8NE7`DSޖw|&O+#l$`dnM=kڲyT2^r(9rU4@<<=ΕZEC㸚A6d1YcչX=@ iؖ!A,({,>Lˋh>V bI K5>isMZ_cЉ>Ra=y'_LF*$T67'wĽ,&7Ϻ[( $+!>m-,;4Edu%dڶ3!+$IƔ2 nӶe'"8L MA^?vDPPX^>%(m/LpƬ$?b́rkCA6 $4v,dR^Ʉg`bQvi $MFgd~2rhי 6  ',0DL,xy0ʚW$5B|^PLNx<՟S e9,a\- `(:>Yz2[ٓK*Ǫᗨ4 j-;!J*{lˀ U/^V~OrhT: `܇}|bɿ7b-QPv)-d랴jPm˂nĴSZ$b1?Y;!pR־X_7mC=1e Ăkv+*Or?/>~d ,]hl`X=/9cD]UuS򋼩oM.-Dg.y.3o0PFD_D@;[[|qW& bpKpazaE&[$@14aS`~'*FOs?inRA4 5@Lٸ|OyLF:E?<\'jbCv`U cwL刟S,RX}vGܢVב %LҬ?ߪ\Da$B psyț(8"z&SU) !X\[K޶ɐUJa9n>q)á>f!@+a۝ %IDATN2e)ۉ'B?Nu s nD` '% `]Հ#/l9f.`hH`5{@DKW/wd tb 鄇5%XFaec1B)ˮ VcOty8'*'懔y8~OJ3C}iL4bÞ+QGÊQ?<7:h{iR ]!Liơ0%Vkd>D-꒿kT'rpDyBǐ ciYD|HfGQr#5G: Ep^܀o +9'Ff؁LԈ-XF'N%NLltf'=4$8pm&~rwlIaŁ6f ƝIJ'_=:-~zs~_^A0GAb*O4fP^`Π7 ы]{Twq N$.rz?fWwjYX,tq5"ҋ t2gʔs<&&#tQ|1G.s퓐x;j@`n8#o[֘ټm/UnO}dG V 'lS ljA[)B2)봀 e<ʰbsN(22W8Pԁ2׫ hLQzPZ{z= 9~ 2 +/tWmpRF5/kbg,`nFN`;O}Ld@`l@Oi{*#'\L󪒏8!"}@N xGa^Bl҄s t{إsgAOgfWS{DpM;ԏ> + *M|dhWYq#,hg^"X{_1ieەz C r\K^jo lD ޟ+L"@5';GLD#,CD7[0GѢ=+|P$GnOa"^:&ۀA3R(;;"$DdY3+HNEm5DU̞,#v(c9*!0ERZL4˭@xf3J2" Bk͑_ ?%K~8Qob--7pŗSܿIo~{X3ЗU}p퀬}DOץ@\44wl?n5QQ+\ )DP*ܔ@!U'H ^ ML^5X}pvBLo?npBPz~WDgTU<1V e nM @^O!Fq?1aeP6׵-IR:Ǖ`+؊;="H.]uODܘ/?;)-<^7{]q,xOddnׄbNܑ'Xe8 ghĻ):UN;/ 9ee0 lՁD byJӍX+` M @"Y?ȿ#oS^N?հ@BHuCm 4D;UdG:1A&kavG`qGjClC|Ff,m]u:)$z"L\y}w.似`LS|WKTgd(pUcѥȷ}$Sb7Szm&o7L|7_ A9ll!6UB2͓ri }|i0.m}W![mBp&|ɟBpB쬾(/Z2v z֔s EVK! 2kG]V-q.K3qD{>=Sg3K:l}J@%x,A? ն%/=C5:43KƤ%g<%R)G ߷]ԈY|٧U?>4maKCJQi͟0|Sf~W2.$-;IENDB`ic14^PNG  IHDRx iCCPICC Profile8U]hU>sg#$Sl4t? % V46nI6"dΘ83OEP|1Ŀ (>/ % (>P苦;3ie|{g蹪X-2s=+WQ+]L6O w[C{_F qb Uvz?Zb1@/zcs>~if,ӈUSjF 1_Mjbuݠpamhmçϙ>a\+5%QKFkm}ۖ?ޚD\!~6,-7SثŜvķ5Z;[rmS5{yDyH}r9|-ăFAJjI.[/]mK 7KRDrYQO-Q||6 (0 MXd(@h2_f<:”_δ*d>e\c?~,7?& ك^2Iq2"y@g|UP`o@IDATxidu/LO4ff/Iq(iAdRK!rv!;aRa")J]D b/{7_ͪ[nm{]u˙uoe<'O<9µl4F  j3̌i>) u ttR5lKmE EB@G C⿹W6sY1ڛtf2UZoS__(" ! @pO⿕lzd4_ h~w~dggEWB@$l$@ & Dxz~.kJzjS)7i>OyS.MB@!Lrc#r@F0x̗dlL_zBZj ! h2>cv3qBJ'ϗ_= VW^5=I{]p|d䄀B`:`, `$`:1Vx.c_Y_#\7/_6){b@! 4!䰲*q<WMJS)̽ {\p<[Z ! @+ʐWGŧ̅YS@CJ>^~! @TCj(_okGB@!1}j_\B@q@@ 8u~P2 ! h! D=I 0Q} !  1CԅR}8f*-:n&@&Ta! }F@ }m=mHB@Lb e'&! *c4>ŲYZ,nwLRb $8B HB/P4`\KS,U{ XzB@L1b'US% D&3P=p ! $DB@1S6 'B@ J 'Ӎ)Y Ws]z;@"%1"x3; 1}! c7)6dvj-%bFB@!0!U5/ T>B@E@ ݁k.KN A@ @br,EB@$1מjq=RB` 0m"w! ! `\-B@!`h! BLa TZB@bZXL͓t*芀$7*>vZ&1(B@! @&@0)B Hpvk7d/LO_Z*S)x5[! 1jB@L)b ` {]MB@#  !  LE7B@! ЎTTt)艀(P! @2~UB@D@ @Ox(B HfnzP!  ` :3:0B`0enۘVB@!B@ @y`zZ-B@#   ! H4bݽjB@xh_m${8! @E`T-B@ aR\!  A@ @B:RB@!0 bA+)qT;F@ RSՅA@ hpT.B@! & 1]B@ `48*! .UV! h0B@B@ Du*+B`4 E! D! `KB@!0ljE'Ta! H0R8B@@@ dj)B`)L! d `2i]@#S ! &1mB@! p)B@D@ Dv*-Bp8~zFZqB`tI!  `bJB@!0:K$B`b01]5J`tX*'! " `R{NB@!p<%B@!0Ԟ;Dgt )B HF?B@! B@ Pp)B@d  V!  1CHHGB@# MlʙV]B@! `D@NR6V &`LuB@1#t2) $UQ!p8Z|2#`,;FB@#bl%B`\0.=q!c[E ! 1c1GY-m%[!0~m-0Z<B`0v*KpX^!0>7J͘4VtMje5v`v*U!  1miإdR&N}:_(`gKÏiS7L6y71уB@#`F\g3&˿Ln߻Žw> B@d# `w]{cTIUE! ǨI<*B@!0IR/sc-B n]5ưkT%! @b0] =S(UQTcruY)! HbƸfc[Jl!/PPN! 1J1;7C "''#!? !  >>l$b %3͚Y\)뮀=Z&[/B@E@ 2 X7pS` AfӸ&8 KρY o3\Ɔ&UU! !p @@rF|jC]}֓kj ?<{Fa^]#t נlc729S­f!tA= ! Gh4'+V3Ü~XiR΅3HpkCx Eg23>7GWN4o_~+˕߬A%Q1)3t݇q ~O1.x2yA>њ阯2hrxLx g6Cu gfmLt 3 ! @"j pD`m4#ʦvd \|zZ$n>3HQdؖg YGj7oIig s Ҹ<&> Ww ? Zf1&x&Ag?VTi3ܖ]\ֳ?r]gS.!1AoT!6L@:#ߎ&@7\5f3P&>tn`?34Э@3~Ռ)%řkzC¹cU<}q-``̸AdwOIR[=wUgGIb]8>m 3K]_F 6 3c3,`T*7a~'rfk/"l XLsj0[x8hoՕMwVP"wF!d2iǟOǔ#@⿓B_ +cctxٖlGG7= H 81^C=W3G>#fj4xx^Qm@[(qnn>t:e>/4ss[SRdZ)E#sG&ة1sܺbY25?>f>\h ;6bJйیDV/˦38,]oaK"gm.T1#McO?oپaJ`"ؒ|SB+|Ƿu|>dn>|{"F2դT,C0{Fp<\wL! .ډx͗ld ' ϕkQ[^&${:1ߵP࣏=a.]zĿ?bL6a>-1ӫo]5/(9! < \H7&ϟGȯ^j{َ_P5&-8s9}^"cB0\x7ejIhpxTXntpss\RE$aﳳsfnn+ k3e@/-AS@0׈HG#0c*咹'Fj, H^gRi(u_uTxduд7Wbb[_i~qh  B@ uq4E8Pel!ph:?FUL@'B@! FQ#:!YsZNHoB@# `NHu܊Pz ! ,bt 8[H05@]=5] ~H BI RRуvpvIy C@sↁ  Af !0'Ň%@: #u*z" '< < ܎nkؽ68"L I@ 0@tZ)C@pJ^,nHa֩EыEB`J`J; G”5[iF@)z` AMkTC@~%5 ..[L%bhKA `JFe=bL!1}!J^:V4lMk yܭEݐ:0u]4:~ @J:zJ:Z! `8%,֌]; @` (a-Tsb?y E@ }0Wӎ)@GL oZNPPR0O??ҁf !0H0]o (t tZ)A@ (%0$k{6I(PLb[%j%O${8!0,$'!m@*A! @@ `%+uɅյZ#^: SVcçZzJ<bj1"xN)iA@iiSE@ @_e@V=)$708r/@r{Z-B@#   ! H4Htvo\KMam wGJ!B@d"  ڿU [1B aHXd䄀B`0]l-5ЃB`0u]?iXIq t !0:0L 0)~'jNJ|E@ѫb$ mLO_Bb!p$c,! E Va5H!1=In %ٽa||~B H 0=ۧ] oCпI G@g&U}!0B$!LTwF2I՟;?h؁@D~S @,g9*yxC t0͠8 P@AoJ0= Q! `THNZ>^Oa'^_SJ!4$Gm4 ! @1DuIA8x2B@ @B:rfPo?0ljB@IG@ AM>(J'dLrV#CQIU|pFx,PN!  1߮=G13j臀~%4ܩQrL1KL'b߃g0u] .Lҽ ߚNz>ȿ1)u =0e-WsBq2U uu*z# 7> m m/QHh?w6K]݉|"i DkZ!Ick 7QD#_Lz}B`p Ub: H n  iC@ x^Jfp-$L Pj0O*OPzLL8 O P_OO_BPBí!  f5K!1]IvO:V쵰So #l0_hlBLX_`CQ?nK%+jf gi07ktxtӡk!Nfn @J{8C7I#v^bjB˕ f/_4VM&#IIC֟7%;$J.@ AsA.#)+:Ѥxa=iо7ո"}Z^ǁB`/W8dr@i<0rI@PhVB`Xd#P,WJダcIK &šg]T PLJ"n &1g#1Ɨ? Fe!`zhP|ᴹӖґb2?X!@o;;t0b8N-0JT:Ixh,{`PXc s/jj,TKU8r[ȑUwʐWqԯϘݻͭ\7ZdʩK2A` 6&LV6ViY7;==8:y!Z7LNVS 'IFG=SH ewll]S,Vm\57_yOf~T48/D SwWػЉvs[fOY4E'XFJ US}$+2hvaն!{=R+'{۾i֯|ӎ;^~rxD7hL .q޸n%Mn5h\)% *Pb 2gNӏmN_|/I uuxz#`)H]"='/5[yqyHLZXx1lټٸI}{y6@Z0l~?<2מ9zyq.'0rWL&{ڤf@o}\z_>,-辀KL`C Aj_5ސ9(hg(6^X=^Tm`Lr]y&l{[NTb;XvA7Pz /ZeZ1a̯[/"asQ"@ @K pܔ~b:rN.}( l|ۜ{ןHǭB4#<'t@M):Va~nHTz͟biNɏh_ OyIC|8!3c*\g` M:hAؑq͙똿K*jg pwХzd +\ZyJ=u؁wy{ᾥxG^n5_$@!BUVjur;!|"{-=}F Lt=:l:c_ʿeJ&,˅&mx:@~a7 vw_77"7! As$$ȵ*f?>HPz] b^]/2zHerŒϗ`I3<;" nyV롡ѿA*9RrJ&`I4 .n?ͻ?w8=ގYh\ Yyր0*eˉDTΘ3T@-l!l`lcF;KkC`p^1 6]߽kf2Y '~,z$&ȹ9{͂S)$!]N/Y Jgf xP;ӹ=mG2^2=%;Z#PCҥ^g| N"^;:`G. { B[<έJxkX^ ~٬i[{ 6W7#S1O͘b*UX:IaW[vOv` PeƏ̻񏠓Wk{p.Z'p*, fAJBk1yXINJ9#c[teLbTh_X ɘgç@SP є}2GbܱLL"H'YY=6r![" PT3@["x?i|.)xwGϧ7QkmU/6v3Iے T q(a6LƜz߽@Ƽ=ABh1 w7 >..Sˆ۶j |ok!fbmm/Fޚ1;"1+.12fl@踊 rT ;U.XAb8AKul̙Tfh>w4߃5-K%c>1f$`l ̘(H/lY.0ǜ ‘"3}D~.iցa6;}Lt0>$nÙfI>њ阯2hrxLx g6?Ƶ|tJ<.mDj=5(J HL+ᅧfʒF=4 ]|[uc6V+˛`H32xG|3|nOmߞ~m ǧo&7o?F7?[~0i\ ϐ?\Axs>`9Q .5z-W)Ab~P0v53#Amih,L=i_#p,Qӕ ?OO.IŶ7:+wa6 .ʦ~6<ȣYWO[Y K-*i}^.^h^Bho ["qğ͗pms$__4.ˊpDeRYpNϓbxV}%әNt}2[~n|_$~.qn7 LG<I\ztcbg ic\Rrue>N"e?` sWsH#|q]~.F`2q,kցёȭ]\}~>v JoxYBGG'D\_+l(y`WiU5b;gY= D in^4-bi؎l) O|i++vYVp0߾Dmų̃' x`Hn>-ykIhO/~wLdq^o~͸tߠDgpwE hwW+ `ۙHc3Ntcv]d"_y,,,[1I\¦Hj3| ^IĆREDeS#[ԅwcpq5C67?""%N+}ӟ5?o6v|47{?~5>᪄8_z0U} i=W|ӎ4gaי~}n;\J 6"~>A%(?1rHW f )5e3?9_}! T` -.DqXe.cxqϖ) <_At m3>~-'ޖa:il6n5uqUAl 8 by{@'eeoj,u & ,֭+cŃ7zOH 1HB>&azLh+ʐGمtF~b2_WκY;`ݜX]3W]@.6uwOLLTz)xP_1%ud2kv{ Z_s~~?Vr֏;VlUEajhD?udҾoO~pcIɈ6X'Qf=ʼ׺#Ho/_wڻ >+@(pe'z7gc}|/x,2t-TG/'}hi[lyէ^ uǮ!e߈}J4,VGbz׺Zb(Gťe EqCePP@QGE4sk.h3y||:F@4>m2rۜdf ;c ueW޷#]H}n$ʱ9X;/76oC4* zZ P:9ŅΞB_1j^ j`b2QfR0+A؜~}CĄGUCkU]q?{3Aڹ;=>K/| x\;8)q&|~똠{za'Կل1ҕ'l2B( Jipjmebe!i2h>BiO`(R֊ ʟ-Bjڻqok/iPâ=?4^by:h4hp b < #qw$dv;uDu'r[;cQ/x`^ʼMGMمHpgy`t`98k9ؑޑͺYXGҭnt P& Z԰U5ȍ:ݨMڹs`xٯy=uh<Љ74dʌ%-0KF8WΖ!sȝd1kJ8Zg݌ٸ{l8_JoVËp(h|YͷnsK3?qϐ` 1u/!ZpɩxckXgu%9CJ9餏su(X#w$[y,{k{rHRv!ity@jOؙf4nOü / O\Ml?:]JD{vqX)]Uw񷁺qѸ`:k 2}О{+f pJTĒ;2Kfy'V 1uW<{w֚"P׮78ljye0ND޻퍁s{~<+,/Y̱;믛3{A X8<u]3;WVw{ǖGܻ;%("ڟ' pi>NKmdZ]Gr))rRLPd|2 ٚK=lq-ܫUD1heh.V^Yw~ho:sd6$犥kc#@[ 30l:iGM'T[Q@AnGӹՇ0~.:x ;z[N҄{[Mf(^:$Ԫ$>ms<47yQ(_[O-6-RE(a7ukxaU.}l]]?wlh9wuA bKR;AK8ɰ`pNpYVlSPLRF۪q0Uq A^8c\e]>sfa, 0ءUo3 G}8hqVn퐿ӇqUme{Ob9y%/u\`႓WΣP ϱ9?9?2J.;hw$Ь^\~l-"Ä?S7mamN{͏qs6Ko~1 l+zG\ &%<{^]yr_cuA!@+£!-Y'In RjpF Ŀ|+dqI5?c#M˅kfYrg$]}(22jC'_~><j9o6"#κί1Yspښ)懼|" .TK G! lqn~T1-;)_ig%(rs^iz\xy2Ƨa*;k!nl`nŅD/].8߾2S?f̝Oo|J|NV`o> #qsq6h1K vh^gav~,`/O>d_ggA7H8*瘐Q6x>v9\*FJl©P(Aw10_J*[g2+`.D2m `v"?R8ctm@'SPA.Bvu^^jrQfn{aYiBۭ¸ȁn!oECL>eο$ذp~zB`-wέ<:MHs7 ,d"°_)*h5݄3n+|كn"aQM*ddO(/ƴ-d((& 0Z[crEM+J ~&Fi ƅ* t! _"RfF%WRtk>Z'FfFcs,rs?_'C -37xDh;15T {w5 a@"Ng! *-䶷D}[6.Py0?_s:6wx R=;;C~uc "V<R]q"slKG5˘pBVЉY Σ\|Kˎm->P|dqd:r۷̷?O?@"g2_18N=eues0eO"iqO)uf~bx?SV`@IDAT >*w~9pvWcÎ/{8Dl(AxS YnW%ҳh 4 (7yZ \8HΛ߄; ! .h>n-E_%Y/`'[J/8]Yiź|jٜ)V@Z~b<0+pmJؿ3EH$T#yg?/e*;..tf:U/1~_d̝ :.8AY&dcTZce 9ӻ- B`<ww~6wpWBuؑH-B:P6g/,ptx,:Rz|KŅW~9,Nat(6Db&V1x⍧ʘ.܅w4dZ|0۷:i"Nq8H("8 "'d^‚{%@#ys+%طWOJs{h0 >2a)rޔҠwpa>B@88s-cu>sr85k͸s0|ϰaW,rڑMxUvJjF4eX(з32׿jiV! l>G7A"2;XSZ뻟+i}k[g8,'8bCb\쀑H.O8L'W1C`ܮtOzR%L$ViW" ~' x{shwJ-mBvy߅蒢70.Qw3pmԆgexAN =E`xTt\ CS3XMScm e3s Q{Įo TwINʊ4bO&!͚6%ص|䀃 !plZKpl{,o~Z;i3ҷt|\Ao.lFͫ׊OZdU$ڪ'wݪ9cvlcF6L%p=lv[:PbS1K6=~\ Vfq HΞGt$Et*ܩ*Q=$UpJuXl0Es$K]M#Cgy8i,B`<ؽw eXR9KCĞ'90  pPXe.Wp-#>C% ଞ7խ J$j3l)|BG%/-AG 6|#9@Cw?9rD•nDJ~I׊DBFǕo5l8-"[(s8k>M9F;? (ܱkf~ťٹ:*/;%jV/Ǽ"o儀?xWT1j}onfڹ')tw#~9\ky@lH|o]3=ֱpk&y6p1wxs N3a+G{9H\HjijOM 856)v".i喎 æ'_:h%˓DJ 7D$.$5MSkݏo']Xǵ´8#$i\_|loij_}Gij7>ƿ2n?ϔ:.opOɊKZmν5KKwAe@ak7ZCOd^6o\2+ۊrgfa'ޭ;ysڋm.?9ÊΚSz0a7Ʒ-/x:{G1;-v:y2`/`P C*nGCC|n UuZRޖOlAC?ˀh{Y\9yawAZRLkus"8u~ G3fgDG h:m 0:"ރA Lt8ΝU?[nA"b-}LS8L s{r7'跻%ȁ*ؖvԆUu+h t~ fyu(7GI8uvSZҜA7d~VC R|[Z%ُ?.8~(v y};J~pN$@i/A|'-D,i9yj~-}՜9 KPxrrha̗}@(c;r%OZu+6m~]" өΒz u&l@3 ~yt%vqPf^~)ty4p ?&vq8NY0yl /;QdY}p]e7f8>Fn`𪐓-A\u4#+`d&΃~ߘw1%+F1a.p"2!e(9l$`P_-<>}vޜ>ϻE^0'_\}sIyY#qҺ0Viz7Sԥ`ea-<[FD 22^v\b g$0r8R`8#췐5{_':fr3D*qO )㷈$x%nA1[Fqq\7^Bͺv։%? #bn)}f1_g0=XgW6"2;0'2xܗĮx+,y]@^W6 HsĪ氁 Eǿa?l?"Oes J5h ~(PvJLg/؛]yrX~&mcӍlhnln>f%<r̮nl@JTqC0un jf?AWKWO?b@_S*a9DBZ~X]2m DuPN3| ؾ[2X)^W`1=o1\]Ր^ɁO}nJ1n Q }9֯|FpҿB~!νATDr4Mt^$ßBe"ws\3rݫ.37C7>lq3OFY(՞-+@+!tJ:-Z#@K:*j${06PEBQ'w3<Z &޵*pFBf ğGst r+gx"Tm\~ t.m;9^B@¶gvKEg[;n]moâxHJh3ÔzJqyJ Qn#d%%0aQ5x(S&2EO1wXƱѪT8jٽkϵ e>ek:T歗_ ƕ Bo7elmv =;#eƎy2?vGF᠒ v>bm/$.B1)I|'?D'd[[M'pϯ. 3o)>o'CD]Isnz4lPqůy~ڗTJ8J@3tt 6u$`n>hjM%~P˂mNx]~Oq8@B@ 68y?<:|2'pxI2#z\e Jm;sXMnܻm660y-3{\‰-jwϑ Ds 8D1(T"S:D=!!g6m.JiyL *s?{|[i| V.y$ID}U4/og>kf n s뵯w:ˤttߺO9(p0#BfלAy+.@k [n\4ޅ rx͉2nsIl1. 'Ξp/f`u+whr ĈL?:yzK\4m\ȖX=4`W9z^ h1ZP_~9;ggRiwwR8Lw -)kanFus)q$LQ ~nyGˮ$si 09?&B:Yw}nX|?-Ӝ{e^'DpdDB 30aC>S. =CM\ęذȽK4B3tAH{|&i &'!`(YI^ʗᣮ㜿w$t4w~3 :0Àגr[ĕfy-9}[J|Q~%c 4FE5EB+m#ƦҼ9z:\H8L~Ңۻ&=qӶfo^gARp OX-<`azހ?6`uh!4@9DaC_mKӮyL9EDj`り[7_20QgebYNfޅXNs : 4->|V={al`q˅ 3I"<-{8D).,y{֟iFIYB]Zl}A( D숹ǐy׀k2x&UR0bBAKPoZu< sŲc_G3LFns %@;6S\݈#9: 蕝kMA -'N꼀h"#pF!0 l #윥ⲐH(Lc_W Y"3^ZwcʁM4$YZMlDcfPqS0uv3>4 SK+tQG1"wǺP"Nh s%q|^ (?ދ[ɡ-A2t)zzM4**nlf9"q{s&ݪ$̓{Wܓ#/@n|*^a<kWu/G hfRVN]VW ~K߬couE<.wW_K֨ /ZԨAƾ"̝1W." ͝ʞղZCnDkGĩhvCyX\:e\{Ayna9!ƓcLVT D}R8,b[{g70Π3OA9<;#N[`ㆶ yuˇǓ?7̷>A03%wWr8s>1;$~DA?r{ u˧eEGq@",vm%"`p [;8&?w4!pnfkgMu>w@̍Wd'wJr۷̫͓?,kT/%s Z{;:W:p{$ln ƪ*3 ̗28W5(V`Oa&yq Zo]O1 ƵwTfيKk{X:R=G:Z5tf G0HaJtʁא fٺל/i xVKOiXL'2ҩ1yɿln%ێo#%`B}wiN>n„rST@RDqPDշMK,݅<4X}?1%ϣqΡ_aUfpqlқLΜDN4&] R۴5\BQ,2!@^J_y(n;XZB—|.CDZb "5;n3έpm/N^qYw{HB]Gӻ9BljGq1NA8?և/x\<9׹Q߫>Vg,y e+~sڹEc+ǐ(2$s2*(!ʛеT qpv3!}%$X{Ӥދ10Ge]xYBʲ aס Z)bm 2[eZxaOS<'Ϸ2q{J1}rXsP{<фTlBx[w73fn(4'yr<u kkĽ|rnK#J-ק#S=پ**'WyZky k0!D15Y]w/Y`XҙYl()ϳ8KWM][o~'꫘Usƕ6ɮ qs8C0Fty!چPR .zf9t~qo)^%8~穕/o)s]1E̩0={dOB|9F`؉CCNMhͰ~A6>=%L^'pظ>_| .jYNB@ 2`@F@ys{Qx v!a S4ܻ`Sj[?^a?(+-Ʉ"R@LN.SE[4sԌj/EVqaTS_LG 75?Ъf4ާJ,ppO1V6`Ąד{ٖME;WdV {`r8 9|PH*;Pmr;})̙eH.=Q$͸^ݞ9!,n ;ފG”Ŋ|+8.tmdAоL2`,J>9he9*!Ӻ%8) ;^Ck:˃mw-]aN=.Ká<Iv/jòm'֕9mvz bM;͗Y_i+ot E@ÚDeͫpK"\)j}h_{OS@2RÃor.|Ș{,Ays|.9sG24[0;[)S܏"V(2,\VQ7' -Bv)TwbVW-%̍L0'N=n]9y9 ' 1%g^pu<#plk ^ @ L/ \@XڭuH( +S8FKS6^׾7˴Xiaˋ hLg#ː,nqk(]Cu̗ u @+ OȲ8Hw 0\b(9TksҊW#9pHXv}vΕG+;s{(@\r;ϣC`'`&t7SINjڣ.A'~3aAkrB#B91'Ӱ0Nf J|ր椓߽M݃}GH^&$RLG@ru(;3,N77n߀hg+UO~^Al^uV-B9{|/n  1-S9oq}?7Pi/=nAq=5uDĉyzo Ie%5b[P];]̽OmvS#3v=#2aGL NB/zZ܀!&O>y/``]Bc [Ŀ̞&zkyM CANCB#2G~}0;sP$&z5;<̛W?N0>1w4jۙp.>q&. }tIa$4 cJDwx<ˏ*2y#^ex6af{8&k(y#&Clhj-4c9~?C|e}E韝+F9aD.,#ޜX1w9s y` {zIZPDO 4 v b+YЀT{lVƙm|9&A s<&Y.v^C;zMjuX](߸mUf@?fGE;:?\vnv;B G{}SL<;41NX^#,-,Ȟ;g_qrosq+RqqUhh`υ>.զpa}~КXspPXڌɕ9(WH$CNofks߮G̢"M-]5륇#1[I:d߂w߼Uc[F{Xhs?'oju`> nJ>a~KE'C-%0q b1 nVpnLNcÕù&y!^X~'٭E`.I R D'@]HJG?:GoqTV[F?.EyTv`Q[+C o, *=F2C0 xoTph0gp8н<}‚n}ܸ yzol+/o+i"{k>?vUrR[_0Ym9ޔd @f?a-dkMyo|Ow(Qۗ7}U_Ytao>QQD )&Cs 0Nx+d)9Tܶm|2-}2[r2iTfܜ:GjHgu"hۢElqFB9YSWk'e* 0h8?blQP1X$3L;wcp9,3*5Q=?^(1E Fawia/λZQ0- q~5{%9+jS=<ag =|^ 8zB`yl^pAO;],Sc'RWZ*ṟGY呾[/Ac϶"#m&MfLSvI0%+ &zpOsy7w/ c.:9L 3qor( }"crJ㜓Қ|j;М~ݖ\_n,6Y DK* zv<1yL6NqߵeD#[!XPlRds{7=jSLLyx^ Q:EBՂIͺ9Dg$I>3gg,+J) "H A~!A$tV V)- JKrpvs_}WU]weUWyanqdUMO.7{ٻzֆfe@@ITt|i[FOhe .=1R+@Yi *Wԋmv H)lYνMK AfJ·a臿gj]!MǙ91O%s |[5}d03;۱Q<ϊv qn췮  k]= 0\TpcEڡ,@Wˏ?U|)_^49[ԦiAi3;@>n J?-sD>&v0ބp,xˉqU#wKExߧ*MIGXXEhIMyv~1.coI{QjÛ?I-BN-&RZo`[a)AS_ڹ/8` 2 wnlI5\05 \P@ U}%ʫ q"S٩RWl0@&ܨlSLobr7iXZxY|ad3Q4&Ғ_nJM@ht~-+ CB9 #'eLM3}Aq\N'R@uH?VBk;*w׿,X,nwpOI7:3tDaC@gZW$Cᗉt4⼧qT@"@U6>}U3*:MW#m A\Vo:!~cNlo=R8.e2`$y=zC :kʒJ}eHPt]<4њid`|*=f?=۟EAu(et>Զe?!9/V1(3_rFvͬ VZJ/ aET7{.t!) eҳBFvG}kYr֔D@ wވP̑CƎFN)Ƶsma2TO|:@Ɲd\k@*|]^?~fft ǸxM'̗Û˅pMHE ˯:}I\c5Y5-aHg]p~K[!7rGo7ob|ۊ-"anhFjZ.#Q,['?׾ok#e~2{/\RYxmtkn0BZtmNq K{˥G',Uzrү+wٔK6ꟴε o@C ء35#v^s=|ܒڤ[|zKzJY1ViKؔvMǺB+=FE p.(cp CYu'I;=I "xp281,ʭʒallKV$Z {ѣ"ԋ^|\n-8-0)/(07g(_$,ۅ p㌸M-a&T!xy3Y8g:?nz׊踶(weuP3Avv p5߰*uJFX_+1ƫ!OS-s?pft/7 `琬$'bgO7o*.l(3WtƢ.=h'!z"dɌn/Q4$m VXtl${ɭ?}?K:A2|qbDߣW1s)}mܒ*9ͽ|#'6s.",d;O~= eWSdL̸eIdG `bD=#>H.IʉDۏj6tգ^`诳oy?~bJ::ƪ3>Ȥ=M+L~Kk}]haO )1vǫ7LLjbv#,Js`fR|5`R.]AUwA4r=qsT{z?H'D>Q,4peɻ"TkHQ*t :p"\}ڐ %0-c)E e#—Vj:7uU(S+T>̂*.MݓS髖}>o" (Y@Nm #Daܻ^v%l<3 b!=Ԩml]5v:ZѪ}[/5o`(Ĥu^VH5C\Kwޱډ%R>-SZrJ~/ 4e=:UC@IDATn< H^XsVLYIؘ#IDz)_=p Ĉ6?6sWXTFy ZIorU$QAPK R˚?oh\VHϒOcwY sį*Jfq~19WJu">nho3K'v"t.:haN =;5k;$G]ЮcE,l*C}J@o4M)8h }pA@pUs]"%ÍI}C 0JDfb(;cT.f' l:up ¨5̈77_HEKKOѵL8^+CN[ Rk nJ3<ǝ^tG$M)~Ƅ~,N$L\䗅P: ª3@L ;Y /\ޗ|59)K8"}eC8.!| U?+<~.m6Ĭu=6&bh&D̍7~wWg@skye*.dq3 wb[󄶊.뜇=/H>Cav6U}EHra7! gV"]V[lgQl(N”ř O2Sm̐4|]U-+=w\&6Xl IPT6wL+'0翮z"3nH=a/jp AG=sGU \>q*fw ;RE=DսvH%BN^{P$f2DMHZ۟gD %}cPxEJ~XI۸Xε?-5 >Nt=qt_[?ܯ Hޑh :!0uG  VfQp e{SGO1RwhkG?f/>MW,y p!?T<M@ùPp/k^:e2]Ymb(%R_|CO!oIhҢ"9 ]b+AӡuAM-yyFܹ.6+A!mEQeK8۟$][crBSWeLHCQR@jԔM Њs^Q QP ?>!o T`$}҂{ĩ_ӎS7\ϜPU>%W"UbTCd`:mW>!%='q|Ssg!aNlj\1ڭ=qknK#7N>f 5`GcIA`r9ə.'%^DX^o3l},ݣbR6&+g,A 21f}llJs_mBv_0&H#e;ML,|;iOEeʝn~ /_0!|G+@SPxE&er-P#$ai t4].Qj=Fq lWd%m},07" -']ny:qMơa#w<b#Tkz5D5jbd¢Xt]_1]S"V qO_L]:o[R_݋1?Qcہ~|^~;O~/+1 =Nxd=@j_TR[ I;aӹE-ӝ8.Dnv_)N_+-,]~O4T̄6~^qJZuqݷsi~QALW?n* |y?Dh1(A?Coy*};)֧?WƧ/5̪l&wN, }berق& *L:8:%?ʭa۸Q!~޷1B[]Юn@h+Fn' B/%Yg5ʩyS2^Tk {>'Spdy+i.,ſ:5 .=Od/\fvNO#~ocd颬õO_zJˁ8w\4wagcC~Tِɤ9{Qd)*LQ&s bA ;,1&`) §=I>wMcqher0ڣ U(T~GpFsg.epj_ H!~j ^<}mLFMR_p XR'Lر M7D"9Ҭ5Bn$X#/a\OGr]Hlal>u &8#(R\Nԏ5O "&eE9 >yI 1Z$~F$/f֋B* 설2Q_b/+N&4/˹ cb C䚌]|K+oUᜧ[qہo\- Wf5̔H PA4TggdP1HW(@elo'\Mug?jJlY1GqQP!q|"ͱlc/)/W q9Nb4f~]Oyavd nX/w73rzXcYtk^˘LLG@ 0i1}~Ny>:ӟgOi+E˜ά-o4)'tB"Pc9cJV4϶u+;B6LlT5VUj&ς o'? Ü.Yj1CXVG;\֬>C#9k*Pcx`'Ӗ\ήQDO+(KcCQsyȴSWә&S"6R[U2wcT-p]$44Kp>3K< pO.η_z]엥W06S/M &Vf )C `"dE!%Ճ ߲nWH%$ \c:e"q؝4|w=ˏui+G@FFnI4{Si1 * WvT )5wbN􍋒 UB߿+ Їp<ԁ5ˑLGxD 17rkcK_I~i j"E:ؿj,XS'O'fm6qx$~Y2~SWqEH<3prKU+ qj^<П b&6pCTV:gRl'_iڎIF p u26.zfVJ$TG[zM˝[|MÒ8czNL i)GDC$5 c_E$J0] mj5@Z_l^bNں6r4 XRb`D; VIhȅ;49eN@O#QCgȏV#vim@,ՙf B9⼧l> 9@(&Q0'5 ZPT}1j羬1'v+gPIF`ʂ eiK\S $ 0Yc0x4w/hLOrRSF80]hKAXgdŢ B%t!#悈I: z͌ VSXj녍\y+Yᅗ`[5 z$ؘlTZ)iS-0d9;$l?>ctbLL _GKnJdA51?0=0}5€! 8!,-k2f ."*IʓR\ZѧKw.i`Pye.HJ 0EG(C%E-nާM.7븀F=c±?m p,OhO8%6bOLY65'?wpM.lUjooo^Rf1+\Is9MohN{|Q>HW*1'WE)-#q7p{P\TArd3kg{V9Ap$EƓaеT5O7[&l&)A}-\1R5Ig]PN.6 Z{2 <+)0GBP}]5̝„\UX0Ww+gR^ E f.V(d!=U. Oy9M"y̗mcI19; n_MMK3*GgN*C|YA%<WZGqSgѓ/'c΂Tn aV7vtƴv"fԝhKr;xIiN҄S‘R:DeeqUd1Y2,õ f8PL?,CCz!U"jPNc麣9JI Ǐfwc] Q9QC)yFݼf 1<-X$FTl qXnCe>:kGͼ ,)g27|_<>F{.:#1`g tF}CE$3;8qp“1|/ofWZߓ;@df?|hI(akAl`8I/ߍ͕P8724P.4kg=aO P,&SgsXOֵY ILڙ͖a$ ]5OTZfP]Pm]o 8ysXc/ZcBoJ Kbvkaq#*eFvsɹl.vEV40:OnH/NkaUcd95m78'9K!= ^:β1I>4%93@̠j&FB.8ܑԥ~Sցw{`W1\sIp0˩w\s}ZllXXߗ~[[?#ר.V̋2|{ |x2ĕE=ݲ T9{RQ#tB;1!1vIM6$ [7'\B`>My0X!82%!;;מHbNz40S"~[JHT1BP G#$PlFgK s.(ns2(29ETI̽-I\_(6q,kE%! ѻ> z;(>E@?_zy^n;br8)1S|鑘xZnzrR@S:GGa 9}4 `m@2dE"!/%(~h*s뢇u-rjƝ-EʉU>C3"ȝcb-le53LMDPׂid7sFerKx=p IFj .15%q'p"W-Kb.ŕwMn/E>bGeUr:n }BBrb"!*F\T^2A1]o_{d/KM&nvG]x["^ń.,z=>sH^-VDPBͮީ*_kT Jyb{!&aXY{;ɕ@KmvdjG9!pJo]D˶!,]Req~QN\֠L3aëcB9 ~xon9v]:ƂOQKHC40g/$kR(LRptk* 9nwmU&nu]L(iAK:cYl,9?Z/8c@bǛ]ۆ r53BgmCϯkNfI_uW{ 'igAW*%1Zxi1^KV0e/Wg˵I#EIJ:N`;g; dvq{fU38$ɠJ;|ebCsWٓ<pDVp\ᚲIJU.ںv! ԩak%%?iJLwHl!d1xq;l$?Au@r ?Hqp7^,BKU޽Lh<-B{̙ ˑ.K#cRgOn=kVe[*8A/"yS Iqs*CVQ3UEwh" 9Y˹=0$B#0.ceHzGse…1.a'_8%[>;O_kRRB~'yd-8~7hl0hqx0]Na4Òoc>).fBN$Q-#i+.&)õ(σm yu]}a廩 f]y*/H:;QkdkoD踫i~{]:*L ɳӹ!:DDTAHoM:Y"zj9@M.[;v+}{}C #u A2y<8*: ׄsښM!vD K7օS_޼ +/'KGHB&L_E iv"L]C(+Wa|&5`.՚bhnj>W1o>+,&.wU4nd^@l^nǢ#U3+[;|G'Heo6F-f'jYoϱihe6Z/5Kߌc hūx5Т)E :ѹ.O/1pDWHΛ^ߔ\}sb"1.d E|Î@"UH(#bpŝ! ;u O'_ ]ZI` ΌS X@!~%/|C,-'lB{$!?dPW)fcAFtX(x+: -@ګ_ ]>anx>KH"ѷ2 "w`;)q{jHLg.s`]n}3hzشXmwS{ڎt WG7P խM&'hHŗW Le[{`@H=߳,Oxyo=W>F~ 2$8J=?ӲBy7!-|4{?v9m VY8|]xLecE0HYxng:oAF+z$H1 _c{-Hɴv^WR!p%:Bϱ老 wcd߇7""u-jYY὏-yi. Xb36HъkDYDPIz"U E8\Iy隝xG@ qN{Kuo(#f1D@rzd^R5O2U3^S9xcKz.)QHidٸH4QnAi"xOgִEc)8_x, b( ",#a\{o ˠ^vK( OPO`cB *<R ɂ~At{:#`b5ԉy~Idps[o5td{v-SΜhn.%bP~aH_cXClˠXZ=vpt~1W⏎782 L^݌+nusX]E#Eu c|q?"uv^gꆨ1@R"{Ix4L٤;|b28k@Z/%hAu!`Ą@C@솲|2=&-*~ࡘs/PE){iJ!Q;AHQ5ύsաZ眐wg+{@b TXCm@Q> ħe2ӖA4+NںvE[ W HQpF+{XaBV|$Swbv?0fxNԬ,^K~<%$J_]l򞚫q{A hkS~bZ e^ܫHL@8]w;~[T`s7L@Phbk}&aY各.dy$  !IDFk5 &+ڼ{(mM2#Lnhcƫ$ ,Fa:jg}B/ Rj0+`uR1uc"5eV| xB0[OE`,m_OfW ܬܨ ӱ2HWPtT3c&@* 6EV-`  [F"('?GJX$!C?α-<]'M>ZӛDwמ,~ќ蚫 )?tN:nh]qʀ1R?җh(ϽW+N񛑧oJm0È򗥎 Plؚ>)wm+#E<苋7WH 0IHMRtA^ĥS}|g]2M|ټq{鉶D'M0c+:MZ@Bdt*}WM-*Og8j8OvjWL"PQ0Q$BayG1Y}(_J(I4JzⴛyكiJ8' a<`Ljj[e!p]> <:,e@-HWggK!}ʗ~,{ {ߺ.jHBnəvKL)bVL8M1g5h˷_U;>ӯ++r_XK>{$WW5q6yW eW}" @lq*e Ƥ^s Rjyrh]WS,baNKഢ8=)_k"?ju\8`&|XȚ$j 1MBCe1}iDP(Ls0g A&)dS[$. ,[gTR'/^愳Gr>6qVcdžCذOI><l %CcNEdYF%D!ӊ&N{|vg9˘0꺆:ԢL zi̽H?;ߖkRr4'ĵ :9~[ 6F/akJp9yFF,'q=_97`ZW>4xxMF30˜Hb}ڿhg nXo, _?{;ũOpBKwI|'}/ϛMb1B-jݖ$n@Tt4>ds+?;]Ӆ%X޸GG/:_?\}Ez;ʺHi"@Et/>2$)*wu`R89srb|\g_5U6v:MS _i/ WY5%EZw!yPT%}mEĢs-z7"jgʰS :<6iP\fOq{껟ɘO/I<&X˨+@[ځNs%ee^!fU J.%L& Ri\WB);\vM,??vn+a`A]=@x?w+yylb\#l90\µrnDAE+IN'cEaccƇ-%@}/|/g?xbF,oJOҚbQfu[YؕZL$ QM_%)_n_ڻ ),"gfJܿ4lYYz0 pMSb x@h@m,>n;X Y6|8 M\څŤ >uYsw kF9AgsV#9$,@5p;E] /UФx}pE+0P`A7J?66PEuwm|[~wNp]%XpJE8lEek.?ZꔼR{F\iլ mZ}2;֪IqYJ D8طݢn+B=R>E dDEpBmsƩ@G];giSDɺF wEm3yG^|෰!E /{X'L￟,{Ƒb$61k={=42q29+&@"Gv?7dIn0{(3aMQ"qDQ/Y_8?3NJH:-n1d8g+ |fGj%Q93 ڸ(/s?D  JĐ>lY7q4;ǵId{f={stS\)΍G!d;%c6eOd&&iIZ}F҂Y1QHioxV}45򀼛@|qAzWdBM&_ d~fA$z``|-B38W=טeeU9)~?o:S mD]':^q88v5SfHW%1V8͒\FaWk#"|B@FY{ J0 Ϡg5O EeۯԨ s;$¼Pt@D#5D6*xly9}-)R$/;J pmy4lO1Ǧ^Hf+lf_""rR⽫pz-}kZ>_mb8.kmvXTVKwɭHH16 sxPNDPH+4}ˆ &jm֎9ֹ] _DQB 9jxZ;wQ Шv3䊖y;&*`wrbIL1cQV&iW}ÆEIŴq mpΆ9KZaЋԔv}:`[} :a =h5ɋ)Cv֥t4Jbj} {C`dTg;| /ל`yQ?VeH':|S{UduBJܷERX}]NLƞ+h\zG7#'dk@ۉjLI@S2BZVT>.hxE 9,Kp+Yΐ.5t j <":4.+P)_C=ppNsGeM֬Gg/8#>hhlC=ƥDut"@IDAT=/du&?|w wO]6?wz"(hs#eyw'6LI՗>~wg쾱{` wFUTU>˂}Ow Zq$4"ӊ @S/$?|ʁXvl\8Yq# Q(cum$0FUp2H .V_pznZ!S \vZy*_=M{ن`A5nr? Wmi<|C+hR1`;p"`շtgss:7$㼬c! QxUyeJK判Wsɽk>Zʈ Lj$+- HiFDs^dgH·͈ʫ|AJ94-H.L+1vE׼/B['q(Js 7Mr[f r+ DYJ,v^ʉq`S!Jb(v;P?9_Ig_-Exa8.eui%/aT._%\龙;=[6o_#ɜ 'Ű?9t[ W8it!p ߕ]?":63\ywHL)T繂DӐ.~=:s ck`bgGu[SuQ@Z!n쎢ik~@m…hcu9]DCXt/LYHL;򱰐脘hf[;;38Ӽs:w@Az]1j7Soi"JS>y++0^c#`cz?o酋]S8w%EqGni~4KǬ<z𳨖 }&=!D5R6Yiw6TͻW^vf]erkw3ܖ <8GNV\w>)EA X,#]DG@\‰vO`0̃nEh#m̮J1?Fѓ'ae= hU? V55тytsn >!|cw.{)0ŪSPNMP񍩸'G B L(¼* F@` 8!&T [&P0 Bpyi }[o+L$4#Rl.ɋ_ކ6q$j H108$(3asp$8H 80*z'# S͏%u_fNzHx~T@%8"]\K﩯p JwVG]~[{kҭɓ$~BG0$&p҄6=`ݶD;b O }+# ?iܴd_\_ɟhY^O3Mcz c=٪&Uy iy1j\B 1T܆Iw>?(.vqz{q 뉯Q î?REȢ%0V`Fb=$(RvBTqE^|aE2NR:Ndt+u*/%_@LVV衆qcvmyr$qKB5/-(TQOhNH_ v++Ԅ\3jpN ӁƍG7΂xꂑB!\~NlhZ^[3\A!~Ǽ,qЕ}x}oCcoMYCM (JX9\u.%YBX#Z6HظXP 5CWd᧏W(:6h?dYX;xtrC.=pcaPlBWP{;Gg$95ҤpќDSؕZ4Ôg0l]_"oFcGPT/FI"Npa>š|] ; i˳[mY;㢂F9;0?[7Jx"t鱁 _׼1[ϔνr|yߪ~Y;~]M Dʈ*w}_,iѡ,L?UGs$-BZR1MBB[K.q3 c #an2Đ9Ҝqp 9(#Fpi |CB¹'Pq"bMNo^gwy~F#kI8boWҕ\%g<bF̮0!JTL/;"8]AY>{;:aT(e*g]b_!vBiYL6Sa\.^I?b% RT$ڎ(wǺ7҃MbQNx8UPSzL,-rrT0g A?u$&6$p8B(',EW8Mt8`tȥK:MĀ0^bEpnXghO:-s[5oJw({jWQ|W>÷9yZI[R# !Es~ Q>6«]HD؏+ᖢΗ6u)'O )5&RK$͐OXW?t5s xT2?dRƀY,z ,\Njr{ XϿ0kH5~f<01PR ,d.)89}cxe@%^M FYyo% !5WIRQ;7.Ѿ3,*=IWȠ|clV'AOEs~Q-q\P,sn}7ytg:NdKx}A8P6(h'j67~(Q;D9 6.KvO{3,H\Q4ɴ~,c59jjR2_ oӵ¯ЧĆ?'z9NhO9_/}d՘tц6PgQq0'`"3=~]9y8I5lO}±!<=i`'QH cC2}sgA*,ӝKFAAy.A<)\wД߉$03 @(&F@ouʀeR Pgcјȁy}xw|_7϶ujnvP0&>O|418Q`8?`wEXqOsNYjݨSb8c6*Sc$EsUe)>!#HoGϼ T̛L {I%fa;C9:4Y#&Bq {֤AG{J\@ 5i,O҅7 @qY-}j۝wNlhȬ.-f~G5cgGc]zh 0p΢w&ɝ_ r<~zN @AgP/p C4!>IS *,Qi?G"SO٪ՎiY>ku^w)UPxUjoba`xUθv֯6r*pِt} -ڑj'jjQ%Isb~+ypɢ(R߀~r#_hJo:ő)x욹v,A]yB%+mT:sM*F@Cwz1v$#]Gƒ)dX#v~ c[_@gN H:r Y1t#z({@ AnD_U(UCy%E8s17j  LtܨX'̆ہM-0}I|t,,,~:á[_2Ʀp4 ۳3X*Ҿ}f \;ᨔz/FIđX1@#R>cdcGin5Ya?jxS:{.}عĴI&D{Yp 鎊Գh-sAvk&OռūPG3g_б#Nׂ13׃}1l*̝,|9zbps\,e l-9-OI#cCcZE]"8= `zރ2Xx紮QmrlOI=qCe:;tN ώ0*+;GP(Tn'@ -QYuZ7q1;Yj#.7 L1$U;YTNC|2n BB a@[VՏHWkjmJwB[J{|:+qov E}=ΟyϽ.)6<e}cgheBZԿlb1ygԢhbKD,E!s@6EB4H|ED uB,Bd+2)'8E("xAot,"v[ӐTo!Șݍ IwECmQ%(Qe3廬-ɀ>x@;;Z4em≯ LSJ\";<oaF@雗՞Qy_P8hƳv2+Zn^|?u1!pS 0ɍ{LePk{Ll\!0nHIq~MOD? Eş0RE)41)NI&x誔!jA06/R^v*!6gBc((*Ą8,+FpY-~&L Qc:aczFa>< ͚ce%S{0]G,νo((xx&O3_p@<]3`J" qAfMӣOcQ)Lm&t1МƁ(#qgIEy ӁׇW},"?̟*FX4E'62}JgOB'kN%Ĉ-O7.K%3.4p=(z@J:Kgpѡcy.)'",(?]M:|7i!g笪:yAB,{mTtGƌ?yFn1F[]6ȟ0[lfQ(0.e~=@(rfNzGt1:NÊ_tGP`a4_לr B07Y__;3oȕkݭOa8*z}H31L[Q+ DGCH(N|_vҦ'ێ$~bBH` !X>O/0w}Xy#J/3W7=+%1Vkb›".Tãʂ"_޳z{6ΦgCœDX[}_>S؁hXύn/ԃ%tm䔵 q 1!20#|nl$3pd&$ Ď2L$ UX MPgx'PbyC/@j :QQEXJw#4ߐMbqͽde68ָ̢{2B 5B =vϖK,bGD?V3C 2Q^YNA:pi*N("` OUmr 5۰B2ljXΉzx9\8;$sBh櫭2v{߃]%/>p3.e y闲oϵ&Psc #r%X%wB :L)C'cJ_<5!s]Y&D` }Heo7R5qz .F'4ᗧjU{Y %Nb;3ܱ<BfvJ}>Hfy I^YL=UcENT6ju~;?w!X+n];Ip~X bXGp8_}ƛ! 2"q}%Z"r7 ^db V\ƏY$`PN5B#€3+3~ß1`0H`Ptk+66,j{1@OfG<ʏ4_50#D!ew Avd/[TiXǶ'sЪPXe _̂ZPtl=<s'FiCL|A B @-õƵa$ag5~OZp9 _nWpj >`7G 1 U4Uq9큚ߕD~@`$dB0O{=E{:E(Gϣv ,GO%v"uf7?Ζ{7q"Z}3,I[YZi O+Bdw8$)7dHMbL*or}$XeLL_nY 7 v6(z@BScpiҒ R:Dpt_@$=!d套{7O?_kGaYw^Y|7Kx z/Gac>$?Cbr8b%C-Ş6px:RIG8]'ņ1 %ܟP SayOvwVI.K0w&Г'F| vOrfg×Q-`^`<0b$T>pz@h `ua~ɰLSlbe}|}t=KP\@(ZrDH#?ԈC^kZ6_32Td|iP%`1+,ᄋ61y-{yi9Xݸ2}ZT &0*$#,iSc}Չ 6ޱqҙ/>ץ_8֮\r1bF ~9[ɽ{Acˎ OkrN ,DԴacfdHxk;38[2d1y勁|hOO_-=Éf,=*E$Itv6mg>K̬\A[%ix[STRf`="/(dŕLP*VDޛ !R^XJwkbG"F*}ĕoٲ hK!RANniQ3M>W21uJ-N*(_03̀Mh{%׮})F L\6ݶphz{7OFd+V@#M+@l8+vF? sv yw$cAl*:[1bFh7%AZrEoƑM+ln{jq 煇 T@؁Iđ/Jqol['9|\U´E@2n~#?`FŃ#uQ-\RH4څq ޫzNyS9{;+VXkF\U ([u(IԳe׬K-%~mΒ2J՜(|o0Uó MwD^ A!?QO~c-5w 2L7FD,T_Df?Zyz{ b&0c5&SU6ܙjtJm|I`@uwL@I~&0'NĻ C\ |CDIˋ/&{j.:M}1#^cW9 \p ӻ#y{ :xDr'熦&d[qnr0iѶǠ!Mf)@b: +KsZFJ Gd3rPRBm20%Y~`> ZO`7PmԤ %uD$s01g3` W.垑L}U 煁GgFM{d^RYsDF}>{ ۤ~?CIt=s*qc q*f01BI~B8x~~/y[eubۓ·`ZF" ?ϭ7"EiFPX RWBm&ns b׽6rS /Ti*[`YR`&@7gt&Y+Ou@ izٗ֜NT:YPFĿmMi ]vC}.5U8P&9 4:QctB9+u(Igg@H=YJg!⟿{-'DBřJHN%4jᄡ1G]"ޯ=&eyy]/ou0?BjE'D.VS4z4, khLM{6V̏'7aMX6Y|"HQayXjhYl)SensaЌ ^bq3U"!C)Uޓ'*o;;}(lYBbLN ]l#y$Xd0A3XXYP/?xtpl G|N.@UF,¨_Jjy Dܯɍ֧Vq]E0:%MUbGAu .~ iI+ETB? ӷR$@;/5h&3Pt?'z\om=FwJʻuC 8za׾5ܘsB' ֌z}(/ waev P'pFj83~@[VE".~bd).8qbMLqi3:<8_^c<]|pى5utEK\:\{l[:gKV6iYUuI_&\&xL<׶U:.t_Jׯ{e1JT1ѯ0̎ i͹_A>4qR/0O#_7఩м4whca4WS-=˩L0+KA'/=kkHo|A7=(MUϲ 8`s*y!mbl ;~l(h?hNO [EëYQڽ?]-]+@ީ:'=Ӕvy}e9/ed]%˯$T_x\bI4kt^'%ڙ_6};)[V@ Y*Gl ԧS3\WHWΨ],8vF,[d CG`#0\>}I63.&:>s㢏JDpr|.wT˹?zWg?'?JPx4zcTMc7ԌW2ݦضRO969v[#b)mҬ4Dtrq#{ G@R\bNĤ y,}H߅Yof3_=3rxtfeY-ѝ" m#OBS40_%-ܼ0rmgGE\^H%,Ontd^^58<| LFG)|J#'S7dBJ‰`Hq$zbN@Y#T:wҭdY 3O鶔OӛnZm?m\F.ISPG 8?t:JJl6UzGV3Jj% 7rÛf=PeEyz";X 嶳=i7WHhsmH }L^r<|rB- 2eҧb!y26N;r!kُ03ިl6$^3?˼1nOwXѷgC7/%}8hvr[m@e[4*ߠ2k擝#s|8kXUiz$>^4px P{7(]Plkh6F)Lx8 c?ù6F7rhZ_Lʇ/:ᣞoܐgLZ%?O^~ɽg-qbQFkr1?D$$dZHlG&^= c Ňs;72py$Q_/zb@8|r1nyd:9<M%F@Wx%*/u.zT1ޑ$xD/hI*dk]#yބv@P=lW{3%,w:pOg+r'7?Xf'o[.G$w"FD"b-&s(^LLcB"c3=SW_6nwLsy3ildb*Ӌ_DsC_x"WF WWt"]Tr?SRoX |s'Q֢_@3{Hm"ݞvҏkeՇn.'[TdB0+ϓ Yᡘ~m\lnz)Vk9Wu4I޾Y=C}Cf0*0,Lf*eB[tr֌2NpV< PC\,0.>qLHMv>1 @Fon.#HVbXƄnB(mndg!^92uȥ0Q /6w$ \}4[0>.nj 2˅,8KV^,VSu$'Gxzב%I0oke"xڀh%-I$#^R"mԶ\aoDY9c?1h@7wv~1Ԙ1/>]2& ۘt 2>-`ǿõ 31,ؚ_ "/lWk(IcXze?n݅\oߎQbq%O$Z9ch\B!CB1vkjA{m5P6"7Es3jY972fignP&q1.d񅞟hDbd2<;;) Qs]bRLa}Eth\lX N9jltØ1"n@߳ :^6=N"^Hө/$"L~J<"@H\zR0+:``As~ v`b"}AԃwamEy>N٘MlZ|#m@[? @%7p$u-z}ø+&zbMMC"c^6׎) ^(?b5J5r1 K2ENB`w.(P7ޅdZfY@ t`sW (δ,>=pAcL\݆EC/?_DC~lj|=b)nV]Zq`z9@IDAT4' /d|rQfrs)? K,81 ~u5x)PI%k  Yvdv՗<˞?Spo_ ts.1f@O4I1z .LDL+QD"[ݏ'ʓl'W0,v]aYYTi[`40NLvN3Nv:+_&ˏAcq(̢hS( ݲLNGPd[e`t^VגAg諓DbM!:Qe~Yߌ&&kOgIZIPbx!eiP'{ɂƲ#9Y#!AхBAc@E{fK P nWc6n`ć@!D0Ri,{ x}k:vC/_ǗKd^98UjLpRA%f/7Pƪڜ<l K6?g) E.Ù# ,7fjZ C:$⬒%X _7|YFde6ɩ.;Jb@#*4H/喾Np q,7*}c"B@r{_ ;o ~θ;h)sOJk0 (p<-; 3],sWQiK:CQW<\;.ebl5O1Kn3w,N0/I~`.HWH4M?1OjcyeԌsO988B$2*L3]"`!oՉkD kvz)-|(WԢQBv!Q9"uqm3kqxEl;x>3uL &႘h(Sз~֞oR!!ܱ81dyј%ƹϸ' Q-(EC`|a9N+#EA{i…ݓn[i-b}65y@*mU2e]Rzy.){1nS2L;/*S 4cD}L7G?ۑ[}h'?B w8ޠ|OOՒeq- 2oꬬſQ[=0)nr@pA[KSRȲU^D?E hxKWt܎sDȋn;oz]\ۋ*9de +is~6?scl 3kmZF 8eqo9dz<HTs-)7;Rc2M76%~ cOLq+t`5S栎Kc!~/?4H"bc(C.}%DTveey;љzހrǼ/7D g^ gw,nFO(2nұY evm$v}k1 ޏv9t}jjL"_k,ЅccrNӟj$dKQG.B7 LnE՞};Yz zB^oԐ7GNS3/$ލY V S\P㋣%ߜzV;vn N72ąsRmWŤ*d}߲G3=ûWw:chTo)5D&Ȟ;\s'CwF>wks#`6h4,MHeCq?{2fN'A[qo).d_1 HO΍'0H >قD}Yv)׈BbQ' p$PL7+pY %86WNS&H i(kOB(-:]K\|5 JՃ|@ fpܮXQ K;cѡkw:z/hKZ\=y'LiV[aJ՞dOvCH >qZN4IΩE[N傽q664c~MO .~$gL=XWOˣ6׍(z゙+ آRqLx :s WB?aϲmNg:I NH-_h4&xѶ}(trߡ$0R77\c)W~G:vAܰ:5-S/I$-$eRU6iI}Y(te>Hw0߃psK:<GS4acvRщԟGra?3̠k0m?S/<,WֿH*3ߡ۸G_ D+}d(lN~*7ӟI 3鶅6,a)S0Cy@%ň|;y-1cM ryLjLQFсOu;2#?,OK9g4m/#_K|7 Գv^d,o9a;Db/ f@&x'k){FwI^&jK@W.? 5gŰ-``b^ĸ<.d)ѷenǒ߈&b`E|eF3Q u~}zwMBSp̹r0Cpl6 "tKgwˎEDfl{o,03@}c?Mf)ևCv8c#T]SY;f6&"U;>V!8)e츀i| Gd2۟"t nļ1v9kԉ͋ˢ2ÃƁ9 ~R+u{?. cg Rγ@ ^8>f= W(cIu HucnRYY"Y,sƇzikspz4a Mf!Ï n‰3hKJ/KK3Ҷ~Ҍu;K ˞N S_~7/Ň78B,}?L[4@\#i;~M95vw j]sm1~ =v|=wOיm4& Ϋ/ln`6H?qj Ih GgffwP('O q|@ȩ:sc¡Cy-+6݇aE@mxhe[~'2g9QOn<|D*;U%:&Mmq/ 3ŰxWF(8Dz^iWf^W*n0@r! D֯zp2~tH+{4|+Y{$Sv` (g!śS"[6cn|_&s^r+fcžLohaa% puƼf(wm=mv%k}'߅yZ4} Frv+!!(2^^╩2ѸM 3~`r̸W 7%9W>e1`tj;w̙w^0MY @Y8(&QaBdP\ŀ%0vyM6QDp|羽tANV0+/'w 0h9 EuK[ZDY/v^?{WFu7Sz@Y؇Œ)ubMS hN1.;T{7Z cWwbXDsN oX8c)x`>xof:؉eGR'euGL<\EIwgq?.&u/~CgEx0zgs?1#Lb@%!\B/Ǻ C$O"̏g m‚#d74x6t?=ŵ;ӧ-Kk6p[J{7Q|rȟŝ{Ns'Չh 'RIqw_ T1_볖_X9[+Մ +/tFܥGO3=G&/_-.Aq|Q*<寈!ų"8uw{RBI[pc0b8n$7 2F ݈"hVS.E+#[PD΁Pkdrzt !MŁ#-Ox)R%пP6U뉳"56ZXzy?yBp8/Õ;\_ڑ _oF},p$iʊFeqSW8 է-v!n A0m9?3pi1s\NJ ژ9 d}"{mz 3x+vPG@[tJԷbLfhKT=f=W̹/Zͅwb8B9SP Fg|H9SRӆ'/DpA\1164өG;Fpgw(s-y T% "&ߊ1u~\  WeWn3qA"PLόqq!eNzyI@OaX'>Tt. \A~/`pу Wt1h6n16j#}2E婪MYI2fMd0}xxJ56accR2 6qsNJ@-FhcSKHLя0%VFbI,2$/* =?7=ދiݪ'ÁÃi>b7eq=?ќl;+ྑt k 4I$;nD񔉴ZH@N}I˪'G:0YN|qeb gpo i 2c\*FC@':]yOՀD@gagG."~ d^؂^rJxsT#AWh71]~~n >qKHPE/^ju}.Û+6?<u>5qDoLjeǷ&A y|hc $uD?%H_:Dp>j_sD2ՔBv,r) rhdNFAE6"SӺ\8/ +v꺕u-d6*e5r vBdI=}l-%DxVGyaS`|s c U0$]:W~m`1&wr"^#p8) QYMAS*tX~Zn!\-;n `;yyZۙt2u}䵼+c8g-9a⢨o's'M|sOJQJ5qI=%kk}7 0VD8 7k:f38cPyOݩ̹65W͕J~+3Xfq5\¾I3G82 I˖o^\K+s T? W4p斳k~9 [q߈Ob:0 ЛXMלc}],UF}kC&6ѕUspRxi{bBXw7y)^ߒ@>dpZ7V{|BC`vt+VLFvІL7ۘ` g (1i}f:9S]¾ 0Tu;'.gКh1>~0~ q_B_n@0)ڌ%o]3=y0)~POsq:-  t[Fܯ{")0\y& ht Pk~W[ەۚwvnKgu`L o]J;.cŖ}Eܹgؾq{&}<Ǩ}t >~߽+WuҌ` Jm)˖P 15}\+%~7Y}-]굦h< htX8fG'`kI;GCS3~Z0giӚ;B!R0n0 ^Ѕ¶Rz彥q^ߠ],@8@†jvakǰ~! &SmBjv7D*88׽h* KӷIDW܋0`I}c̍b_ ,b}) [oqG[~#_Y_MĤlgϖ&vvaٮZ,Xl D2(oL֎nwk#gL4(Kz<֮o$sZ(Wa.xb.-XpVǙ겴1zs`1%F`8(!TR$Ґ xcƱwp}+ٯ]K8Ac'_ط7AƻmL?dSǯ&k9F:S^D#p&ds{3ܨZc$"i)g+7' mfcTyqA5U>4ˆhppG^_|LHPHGg<0&i\ "QaCdBN&yEfO|>ä_v L3VևzaOO& ӷ>l`P|[{M9].`s=oS@Cvڊ4S ir.ie{ױ T,*/=ezO׵ [Ɏsnw#q`5yKo$CKt.ou۶Y܆jد,/fwʙ3mӑ*k6N~6ƴ8"VᦽAawDUǓ$yЀ9Sy /A dІ5Ieϩ0te7HJ7( m ѼlzuBGT'u$q2ʎ2I@@7ʂGćGD1_X戮O:Mfz%W집|G(*qnZ|y6eo +P2`CW63-[8j>ߑpM{'!)Üd,$옧tȊ&(Oa}˞r{U旺uiuax xfD}< 2\>s@]u^rX`ဣMo;@EJ Sb4Nϴ58F˴s5?;Lczim!×͍XYl^8Gp]=6hJg0\4n 1#bFDnJ5@i3f\/tCr8XZE,Ik?. ޛz[z?T@ <`7樎,3vE.ץPw~mu!.Ep{"m$Vʂ'ځM'o~dbcUdUJ[CQGl1Dw(;&vV…:]43 GW/>_}# PFb]!޸ o@RdG nl:y,>- ?xD+b2IBKbiau\w]0 6 LB_Nwq>F,6FꋈXc!gԡdE#mYS&M6\3>5n9> >gsl U h5Muq,KͤbљǨH bNg>sDrfT9 G͵k"ݎoBwI;D :19Re4ci|Ί֩])>?HXw$#'n'SqQi=KDTGni:A̹,{6{I-_ɳ-9bF"wv4s״Da_uR]X*XmrA#8ғy̅ 陭l<Y{wan4~ND;?ec.27w؏f&7 3o<&5)5k 1`Tn{Wot 'ȔogEY!_]IG o\lL3kգE# B~e' Dw3ϣ?`o%Oe8##2Q=Vk6!VͶmYGGr*]5'U'5l L9 wCBUP}œvt?cFAׯ[csEqz/CW{_yǎ (עzV(!0J_ ׂE pR/4ܠZk̘ eki;Lncv'Lx0zY "3Pe`a @x7PYycqܝcD 7⅋DjqCqvк$8[ZG R/%9 .]I\>w107!LK ؛oQwk"Q!1\0o,ꏥ!bnYC'?:HY_@||d`J D-q:rwg;7I"^Y7c,N@2>$ ^NxM6KD`2@ \Mp`)&y|G0h_'@:pxZ穘N؅UǮ v awtsikFX{v2Cj6H6ԑeF]EtA]^rk!CHit0tp0UZr_uL@,=4lQ65?18M&r2;Y曍%qwsJ b]]i21 $G.8FW6~261`.wA g?qɛDL)SӃ,dgD'R.8>y5JR(k{"g(g9p?r'bp/΂ OϿ/ecx.Jh4 k9zҧ|&GGɮv0q:X9wI70kC?7‰67;{.Kys%?a &bD)]0;'neVQM:+Lq?1[~R,HYbKӝN;I.Y/ucG.\I@5쓃3G0$1O)8gx-}bh:hZ}Emi%o@S@N&(FBFc` cr1z}x-(vx`NGb9q<|jn-&s(1eoz~W?կ<1cտ@p =X%,#~+Lzw ɥfЧwzQfx:|n->oP:]ؾa~4(C`B|ct^[fa S*j?v+,@AZ xCY0K y/(/.e|}:40RE".:̯gU\ Y&-4f3ēKs[P? $񈇹.co:ؙy7aLi}_gs%*`$0X567ێ^wEvJ<1)!18 h<(}** bu&|cb@]Ddj5M^q G?8| iG3?h[Sݔ9:. z" 1J™!xQ!1T^Y0*0v ṬJgɕw]8w8s&?ϝ3 m~kr>`Qձk 3ʖWb83& gPa<ՙ.)" \&Ŕcڅ c mL Vf@a>w^xu1+~uPOW[}]{ECS~AQ2PLю}d$g~Zݯekp[hc]ksgЬ㬜 pb<( };~L;"2+Ҥ/tq#݆Mk/@kBPڣ~2F,BML{ _ iXa~fa"sx I0Mx#!@}L gL1S! 㰮a"pQv[:L\EY WHs9ඳi]Tj85s!€׬7_",]ʋ<_a}`Y,k:#}Ub[k{'WP`0?Y>`SwΈGpz:7敎Ȣ@fbv4/iN"Fw]lfu:UjݤDgB?1N"ӨD.. yE-?zy%1+F$?neթ|;]0IN6S4 J3%e&}eѸ|<rIְI.jFt~UvQ;}O+kBtva&{>1 î|nV_ =Ak7Ơ淟4W[bڜS[XjFnu@ũ/-R/xH"vUl19=鮻(DaW׉s%*T?;kZHzX]>WW#Dl\{81 M0O[#nshK}>o*Ɏc !|;Xa__g(̅_i8T/|0hQSQ6'K\a1бW[|X.>m_7È/H(G*Fsވ T*Xxp኿~?b_ْ?\L8,݀mI #' BRʼn1̅o)]0f9+CV1thqEʶcҫk9J9HqO$]F!o:UyU& tF r2~!"믵;=1l1T*Mh]oe9}cVJLgs}[XFRG x & m/یN_w{\38Z=wpO\Wzcd Ǝgm@Ew  nOJooi BLZ 3UF,pIDATΙ91`#k ;,NWxX;ps`O[NE^hFg7o)4nkGJܒ乎bA&?įD[|Y>19!G@R5S`\so/a]8ؑ=g֨&Ĝ?+Y;["0^%ygLV;,:>F2u+^ _;Of$ T`:MBuGɑ㧿: v  G61KS.(3zoֳ3  A.Tn96@,nQxt< ICM9~-R ,Tw1vZm:"hD3m7 <ɯ&}w-y1{Z*dAWQ5NoeVO|+Yg"6b[0mrw?iOcK`bBt7qMKGh;0"y&N3u'k6Nv%Ϡ\^p:p8/ɮ^0 zPƔ{m`p"\2`: Lsy(Nɻ, v}y<8 YУ\##E S>:LT=`MΆ|}c-2/_E5gwؙwfRY=3;⋀§Gci.#C}5R vB!pU0*`F8:_ϒ?Mx+G?_''ϘSK4+$-Hа6*F0ɼ $Wl*pح~a@+jo #=>aRS:3$K[㠺hW@'hK{>u<;4B>(K(k!_p//5wާk;r<. )|'zH˝ ?@8Ca`lSѸ\h\AΛMn st[ 91=2aMP%MqGN>ϕ/!.t"&5yY~)D*~ (=`ƍw vr_^1 3J{ 1w>}a[I~V5|>N|ҕP?#vKzڂڌmqMIm>3DIxXD2wc";,Ť3 R-{rV=ʖWW0P{]'lt"E E(Tgּh.!8qD?a2`Bz)!pe1 cnПH*Tm)M6U $ٓPY,%1 28T(o,;`P$ "eADf7옒TS?Fd #YǀLc8_Ғ/;'W _@,ܽ8Σ:ׇjR*m{{}@/EvX@Dߋq/#Z3܄ؔ_1\89-\[s;huK &a4LRa {#e]IDvN4XC;ʿ"ץ"j k]+ m[:/ M!U,<3gܼP * Tx03uGBhnˤrpS#~a)[G[_/ y15P_* TJ>C x$캶U6^) [r2b8%LLKۼ>)u[ԍoSePԏK?T0Pa< ,pa}"TT4k3 @ an]ԍqx܏x}o}>c5[6Ҋt,Ϊ2+ T Pv Ri BFO *&ow !Ub ^z7MO45okyK?+Oi`q+* " ;ubJ dUa ,o;},PL! ~})O*& |[cNb* TP؜3Q2Y$woZ? :>*.*{a9_U00Z꯾1>^D' jc|sɏP@vQP.34U` #oE!"En۹vETU`&~3#0a>EPA pUf\FtjW K)-e+tފi0Lv`&+πe\ū00RF_~,.{M92;5ɀyclTK.R.7Ş@)O* 3*`{V7d1k HX3)Ei:Nt90 ZXCYxkzulPf{0^՜.P9~jsF41~w|,8gYw|Y0X`)| E˛_ecaX༮W_WcL8ST_+ t^ IgU"ڦ9Xb) vSL x@=1-p-;~Ünl4(vs * uV :ZI!wsؘ5Ʋ/`鰪r3sw!EE1R'nhe{lQ-_øe`CWEsv^ w`R.A#AUVbr1^dbhδ(r!J,X,\ES9 0j./= èB@<P%^fu},yyS+gao@k[þ(_/bZ7OWrג{#ɥJSa]l3#BDqɋo}X0YM%vW}X+}]GG͗ηKv7Uw[%Y0PIQWR챣0Î^,F"w(wZ j?yrHDf]@׿90?ɫO* 1*`;gU3@2ݯp Z֙j2S.z9)}~qCe'Ɯ3;.>PgW*+RV05*kݏvQ/&3'zpLMr~ -cÏ~<;-Ni0'@تDTP\¼* =*`h}Y>K.Ů-m_ˢWa`0P\,Vؠ<3 M@`[a~aܯ,(ፘ`XTߪS}000vaAvw/fAYU  uhiw\Uo{g :UЫ˗tg>}[aW ԼoU+ T ِ;^%wSԲjNj -n˧nT* `*m! I]jbgsƬj 8 {1Ԁ򯲭0Pa@& 8aP$GLysn0P)v*M =c E=Qryqem|+K Og危{2 "WA_J1(Z)TU0 6r8;?Kj٥E ϔ\|rtsSџp6j C0C|O;g@%k(kju+_H>1<7mom̋B#* PV&3 GwО<b13bf^geZw0 2 yi+ o-f믿Nolh!zjd1zͯj\a ŀv:y]]i['g h?,vA-h\(EM~Yph `;=ԯHIQ4!1g@h1uWsIJ&IDTob'ɗJRvʼn|#֪"[J'e,>I2; ?]U2bM~ } jw~BYǓ;3]*U?|Pj:PՒ??JٟDmBiٔz00Ѐ|1!n3 ..Ӳ{g8_ k;{\oIa7pх|LZ_!8ע/!%ӵn K΍g906YK~T\VU A>qP:Y)V1!δt~awaik$wI;>Ģp p! y bxu \>;6.=%[6鯕cX2uGZ:zdSO[c=$!?|*\>r[~_\|7>,s8cII+v<#Ogq`}`>_3K?n6pHppJ`^G8LܷȧDžՉ,,֣V5ҚHz&LMCϠDR~,8bϺ91?T>IENDB`il32krpppps|qqqqqpXH%o[g^6,'AG;BCE-7D69.[@92F86 q=bauKBY-4"K"I9<1+)^5!/5C4$k:HJWS&0c(*!0%-!L*B#CH.Q 1''  L9=Y.?B0=BCkZVMNLLMJ_Kg^LLFN!'"" U.2<# 1@ #/3!]@K"^,!-5?($(6=B4Y<6Y!*0(9)0(-3!//"W&$ F66, &)!P F%-LF$/5 L; AʃÀ€؃ЃЃЃЃЃõǃbI0|ĝ|tȢƲƝtWǸiAGIRLƃDZ~XqCHF\L_Ȭj;9IR/ !(3^^ڟH$='6*+/I*)4)^uoۤDHI #;4"+L1R &+^\N @$(&? = #= G%(#&(SJHCCBBC@MB_TBB9C E!% " R)5 J #!$I! G/$-I <% E <B <B 3    8 is32|| } } p{{y}t`TbyaF[}J4AH|upP2F>A[U;?0\wcC8;D45&B-64E;7?* B>*5I544:@?1C.B&+4#%*6 C(0"!!%4- "0 ʹ IJ IJt²k`rĽsVnUANZd=TLOrbHMjD66KSG78GHRQC?DIPcmr{q0؟q0؟J6=R916CIGQRXWNNplQUrwqx q=hC88@F8AMSL8>@MPPLVq0؟q0؟ P7>D4)97:H NRSIOROPRjq=g?898 KSS=889AHG;AWq0؟q0؟ rzS787;87FG87E:88IHLSRGHF>:EO}q%"(88-/99*9887FHHGRQtlf`[H!؟q0uMmsPRy`TO:"79$<;<8*RS:;RTIQRI788;:HRSSiS8'o7$989!69$98>CAHGPSLA<ٟq0qHQkdHLQuyRSE6TB)#,9O>YJF=?SSHESSHMN998AOS^hu|S2t; 89# 998?:8:@=MMHMM?+:B ؟yq0rGKRgSF@LQvXSB?TG))98EJfS QSSNILJKJ@#08;QSUVnR4i79:8988,65C<8DQE:;MZTSRkXTG99MSE[88GIGRM798JI:99898:GHJS5]78OSSRID8=:8BNG>BMM7.d8:DLdHrE7H=884'#880$(7;;DLLIQTQ<6%@SES887>ICHC5".88=RM8:@980989* mJHPGoR77889$66%;;FH:87=:88:97KH_C88=C79>89%97KSL7;IA62998A89/d68=S#JHH7889FIF;29JNLHI9*oRSHILhV _]753+% -8@C889+678/,>FdNE>ME88688.#98AL>98;;%688&V787OSQQSSI>87BHN>877?II9jPP@7BQdSk sXhD[1@I79&0KE8&9>dSLHPF89!:889878>M<859E8@NHGJG?8GSSJ3488BF8.)jD=7;8MjfRSQrOQP/@TR;"54]QC=;88:9AG780%2/6EG83%[78787782-(&)988DRSTF+49788.s>88CDHQQPJGGNTT>89ORT1]+3>8#!96$*96:F7897:?-5859.jH9,8=HOPPjS9&288GC]785( %;'# &98.'6*%/8897]83(:+98 478DSM=783k@8.8:H@9' 9LS5\79!$43 !19#"* ^/**58:379#-99!19>TSKD887889_688986GHG887:1$ $,=;"C29%*BU='!"99* Q)0+: +8>QIHFCG?83]786$AHFHH983&#N8-8::975&(08! F'?E:DIA/ 97AHC8.]79!")6CF=J=:94988,$<^8"'4:789 I&288EHH@8"9GMH=.I..//9=80.2.'+/..#!J./#!-C4.! Q79(.3=A@?5% 4ADBDEEFRM.h  [_N5 M79=)$1ENXZ\_TTK:5EJWVTRPNKHB3bTfK!#')+.1358;;8531.+)'$" C598798@CEC<889%5@HHIIHG87Nmdj`]_^]^]^YPFEEKGEDEN]]YDEDSotcHE GE E&)  ]8$283482189%;D=9:@=88?H9?=0 &-21$/871.NRS?!,&E%$% \791"4:;3283$(&%,88:98GFEC9*:*$ELTSK58/E$:#$GG2 Y789 /9@E789%& 96,89LHH:/1.Q4@TT4!:&E*867OO?' K688.&39;988:<%$- 9&.86?DG9&!-"( "98(LT?/",E =D89ISRB6. D388:!95!97C<  !985@872 4##- 26 )'9>9##!HDIIA84'#.9-E:C8HH7>F9  ]787$9. %52G9489@<""4+%,32988GIIHHI;889880L!3AI988  ^7858273I%!8EHI;6;>%&6298:?88778H848&$6:?(b69:98D>89:9- ]7&(8899..@TC!3:7*-88$7)DoE$88"$9889.9&&5]794'&588-%99! ]79904+"6?;'!95119O  E9?5E E !(E E0E E&*E 2/6/#2 [   e  ÖеPŠSšSSRQPPPOOOOOOOOOOOOOOPPR¡SŀšSšSƖTO!ꜝÙ©PҘеQS׊TSϘšTSϘšTTϘšTTϘšTTϘšTTϘšTTϘšTTϘšTTϘšTTϘšTTϘšTSϘšTSϘšTSϘšTSϘšTSϘšTRϘšTRϘšTRϘšTSϘšTRϘšTRϘšTQκ–šTQšTӾQᰎ šT~mtrrQ~`k šT~XX_cdcPˀTbšS_ELPuPwSazłōœOp &6BAñP2tT]düKƺ'A:ļtT[cƿAÊʴzgltshigTWbqƒāOtQDDYdUEFTVcaQLRWazAAYDKdG>DPVTabki]\bf NrQFFNTFN\dZFFELN[_`ZiAA aELRA3GEHUTU T^cdV^b__bŀŴMqMFHF YdcJFFGOUTHNiAA eEGFIFESTJMUU_deUUTUUZbÁMtJ8$?F I_\FFLVUSFFQtAA#^_^]nb50FFCLFFQHFFVUZecTUTLHR_MsG"-GF38EUREEUfAA3T@865@]ydE9GFCNFFGHFESUZZWUMEFFM\ƷMhEHGFG:G7BFEPUUMEWeuAA v@ "!-\_EFBPG?'CFJZeZHRIFMYyg>iEFG,!,GFTUUPXebAA e6)BG/!!0=@>7C--AFP[YEVXFKU^~{fddc5uG C7GFG9/5GAGFFKU WeaBA鶦eF>GG1""!! % 1.DGFKLFIVWRbcOFFGVU_adbbeRDtK-+ 1GF8;GG5GFFESU abwpW-A\`bve`I+EG'".JH(FGF*acGIbeWacUEFFHITcdccB0|C!"-GFG) DG-'GFLQNUT_d[OG"AUa|UZbbdTCeQ4!-'6G^KgZUJMdeVRddU\]GGFN_dtc=$H)!FG+(GHGLHFHNJ[\U[^M6HO+꿛ATYceUN[bkdQNeW33GFSYvd aed]VZWYXN,ZcTHFEYWwd.\Y\RFGRe\=AGKFFEVedadgeAjEFITOFEFFB8HeddcKF EH$%GUePsSYh=m;>Ked)_IJUaw`G+RksWEFFMdVxSTUUPEF30@OH6!GRVIGW__^cbde>]EE\`SHT[EFFE\ddVEFESE5!GQV>oTU]M4Z%GYcbed`JHO]mp^balU\bRFF\dTrEF\]U[K." 6F<4EUUI84FFNOU[dde>#iEG`dbVWZEFJ\WGFIUEF8IQE:mTRS` -I=PZOILRJF!"%.WfL:!!NebJ+ CAkaPJIFFH HOUEF<.>;DSUF#"3/"gEFEFEFG?8203GFFQbdeT&$6AGEFF:LFFPQUaa_XTT^eeKFG^bd;i5!@MF,! ")KVA!"1RedJ/")@[OEF8%Id\FG("!! 2FH)"$jEGTIF1"!""!.GFJYd^YJ! !)G<45zVFOUXWUZ|ZEFFJYR:hEDXfcD "')""%HC!" FGYTG+""*RF G*5Ue[EF@!"$1!" lFHVO7!"!4GFHGRWHEFDFH$/I #3tUIFFHVUZg}OC>FFEF;hEG^dX*"03""!H3.'"+4?FH#""HF GFFBFU\LFG4!"(i+GKHC!"!-!5GC%$HSEFGEHM8BFBG:tUG6GJU__`dF0 ?FFVPhEFC2%""!!""!!" !/J'""!0," .GF91C5/;FGGE#"hF?"3I#!6GG(AEFRd]JEF>uMG:GHUMIX`a[LG0"(GZd@gEG*""!-@?'"%#" '>G#" ""! ',*"*i;44CFH?EG-"!8GG*=GMedYRFFEFFCjDFFGFDTUTFFEH>-(-&"!7KJ+G?G.'%4QfL1"!)"!*GG#"*Z""3JVIML< "!7I( 5FLbVUTQTMF>hEFC- "OUSUUGF? "0,&WG9EIHGEB/!"!2!"!;F*"K!""1MRGQVN;%"!#"")GENUPF:iEH)*4DQTJWJHGAGFF6"-K "jF+ '1AI$" FG "O1#"#>FFRUUMF"+GT\UJ:T9:;;CGB;:=:26#;::,)T:;+)8OA:*")YEG2 :@JMLK@0)AMQOPQSSc\9m  ] H fU!!  !""UFGK1+9R[dfhj``VA;PXcb`^\ZXUO>iTlR!$&'*-02579<>AA><97520-+(&$"HBHFD#&HFNQRQJFFG&.BMUUVVUTGEYwotkikjhihicXLKJRMKIKVihcJKI\}oNK LOK!""04" hF.?F@@F?=FG/"!JQKGHMKFFMUFMK<)08?>-! ;!GE= ! !:_cdN*! 7/K!'. !!-.!"hEG=+$AGI@?F@!""-20.7FFHGFTSSPG'"!" "$""!5H5"-TZed[B!" F; K!-H,"-UU>!" dEFG(!!;GMRFG."!0!" $HD"7FGXUUH;!" =!"!&!""!%!":bAMee@!)"%I0K 4FC#D^^M1""!"RDFF:/!!AGHHFFHJ/"-8!" G/!:FCMQTH/"!" (8*!2" +GF&2[eM;!"+7K(KQEGYdcOC&#:!"I @FFH' *HB)GEPK)"!!" ")GFCNFE? !" !B,*9(!?C$" %3&"2GLG,!,*!"#!NJebHIZ_\UOHG#"b5BF GG 2GCKUK5!" !@FFBPFFB9?0" -!""#CD"$:FFGCGFG8 "" ;.TOedISTGSUTG&"iEFFGF:&"!1DC;+!"!7GFARF> "0"#>A!""!)EFFLQUVNFA1-9G8J(GRFUUELSG'" iEFE.G9!" !" " !.B@TG@GGMJ+"*B1"%!'& 8@?HFFTVVUUVHFFGFF=T)!$@NVHFF'" iEF& CF?'!" E!""!& !AV-)GRUVH!"!BIH!"%0D?GFHMFFEEFJRQFFGFHM:oD'!9KVJF;#(!"hE1""'AFH;&!" " (IAF;8!@FLPSN+" " Vv}=!"#:GHHKUFAF/ .CIM2nDGHGFQKFGIH8!"hE0&'"2FFGH9"!:OeR*9$HD49FF-" F3!" RS "%! ##FF+-GFFG9G0 "!0B# iEH@2/BFF8.GH*"iEGH%/!"8MQ" C5!:,"0(*@Y$" E5!" DFD) "! "V!"(-!""#("J-H6" ;!1FQN*" !&"#GXZF#I!"+JA!"!7)" A("@" EH-"!>F%"N!"K (("(!#FGPA!" /JGJP;b0&0"!+$"!" !""A""!HE(1"$?F)"I "K!"%AEH3" !3KfPZBG4"*!"> "!:H&"%2!"! "g3!"K!"(IVB " !:IEK"'3%$2!"+8!" GG ""C=!"!=G!"W)"K!"!HV!""#4!"!7+"K!"K!"'H'")"!7" "&H4"X/"!"K!"K!" "%5!"5"!AF1"QPխ^2N%CXݮW%խP:ǹO&9T֯@VIIHRuuKMOMp{mbjMܘխP܅ۂ܁iGJLPHIB&,Ulխ^N#5Y0&-VP- $-R|ւխPܘխPӑD!T$'%MVcaHEP[݁߁ խ\N$#-$խ\H   $''",Yr؀խPܘխP܋tBF*!5[6 %!"4zԜ\հDI'$0YSխPܘխP܋U&$:1.1"&F|ZWWc5O !' .YSڲQܘխPր՘Ƀ W" 1 &%!(-$OT" ''JRWSTXHMN! &''%OTujN.ܘխP{FԡKUցtZO!!*MQP[+NT% &TWV։S*f   #%$&&IWWX<"#ܘխPt*Q~-8TցTW7!Y2@$KD7 VY0#XX'>@#GWqوԶVw ! #!:?%8J(:+۰ՖխPt$2VX6"9SրbX3-Y= .PjWXVLYXA'5.31"LW[]ԾU%[  ST;" !$#!FG4tP\ÕխRf GVRWU($"=ՏNBU55LkXXV>49* (ZA"3ZWRW\Y$I &$WT    7Z@M#5^խIK'YWH "%MجvO$4co;%WJj/2% +#&'!1GHCWTWYC=I% ,<CXY1&*2L&&?֓=խ:B7SOZXH $?fkDPRd3HQ-AWIW;?&:&''!"#&9W IIWP)-:!<.!' $K&%%Oœ կ.:$6#'3 ,N/=iYXTcY5@WJB+(%T; ,)   '(@T IBWWT+%! *>2!$:>L %9~ג#հ!;'!!!$7>?M[L&&XE;("(#&% R; # !%K&ZWWV,#!3Y <&!]1&'%NȁڍիB ! &'  9MA%"% "  8Y:!'# $L W-'' &'& 6;5''  dXX%'9\҈ ֆI#$/ Ac>&!<.(;" !  DDXPNYX'"$'>("'(  NMI""P}Wփ ֿɢcHG"08*#iX6&H1  !;! <"<&%2/"*UW<$&M#! 9ԃVTPւMQL<[>F $4[ )ZN OM$!   *'.. H#QWZ1x$%PSI0$$IׂYX#DUUI(#!83YW2#T;   I '  !1XA3  a*$'1,&'9ցA 7,I=ZO :/-/Z: J '#  &-  ! O&  ' 6\- HDU:   '+<" H "  & # O& !'(FGLS7@I!   I *VF O" '&"5PRD$ 9U#H  I  &XY2%I&' : /Z' * B !( #" )O+'&%&#I$'&''  @  ;#& %'# "'%I $&"(! ! I   =%''# &;&'% 5!   6  -) A  "!! !/#$%%$T;]WRA     * @!$!-39<>@=>9.*2487520-+&#T0\>  #&(+.00.+(&#  :  #$%%!#'&3RLOJIFA<;;><;@IIG;:BlyR<; <3; H!%" #""&"!       IVY- ; H   ''&% 54ZWF; 2- G #&  +'' S4YX ; BD" >  ! &%'   =X*  ;"(>XT" :   %!  (    <%VO 6D=&$  F "'" *   ?(YU&'&''  I-  "%''# ;&.''"& I  / #!   &('  ?#'  I 2%'(!!.+ "!%% # L"'! I   &"$&#9{w "' # K %"  I  +Y4( 46   I   I "!SU +  !'"V{&"   C  @ '!,[/ .#$$? @ ; %#  5< 4! 0   = ; %  &-? 0  :  ; %Z:9 -  H ;!( $'1 0  @ ;!'(! 0 ; ;  &  4 ; ; #2 ; ; / ; ; &  ; ;   % ; ;    (#  ; ; %" ; ; ; ; ; ; ; )      )  V     _l8mkname icons8mkt8mk@tetzle-3.0.3/icons/tetzle.ico000066400000000000000000002363671476255537600162070ustar00rootroot00000000000000 h h  N   ~#00&400 %B@@(vh@@ (B~ 1|(        !! """"#$%&&'( ( (!*!*",#.%.%/&0&3(4*4*#2-5*5+7-&608.&70%71<0):4);4"=2*<5@4@4A4!A4A5 A5B6"B6,C:$E8F;2F7%H;+I;3H?/I?#K>6I@+L>*M?/LB0LB4LC'NA0MB.MC1MC-OA0PE+RD5SI7TF4VF5UJOZH?`TEbUWdPHi\Mk`^n[Yrbsr[`sa~cpupwy{|¡{|}}á|ħǫȭѮĮүήӰӱԱձղβععٺӹۼ޽ ġģŢʫ˫ϲ!  %'  + B #/ 4H F> 2L-**6?<(D&C$5.J89 = "R:A)T^sZG7;K03O1EPmtsg\]S,M@IXUQWo{uu`|_YNVie[ac`rnnfq~vxssnussfvwssnussfvxuupyyyjzwnlhwssbwssd}wwk(  #2-  "&*"! &60   &70*"#*!(!"&".%$! );4!"/LB0&"5+@4!',#.%4*B6( 1MC3("0MB#K>4*A55SI*<5):4):4,C:6I@3H?%714LC8.%0LB7-"B6@40PEF;2F7 "/I?"  5*(  EbU%H;*M?<0Hi\wԱ~c.MC&$E8+I;+RDA4 A5/&5UJ!A4'NAOZHĮձԱá|upWdP"=27TF+L>-OAsr[Mk`?`TYrbήۼղղyģ޽`sa4VF^n[}p{¡{yӱүү}Ţ βعԱԱүղԱԱ}˫ġġβعԱԱүղԱԱ}ʫġġβعղղӰٺٺٺǫϲʫʫӹعүѮħ׿عԱԱ|عԱԱ|ععȭo(0       !! ## $$ %%'&!' '"*)$+ *#,!-#-".#/$.)0'1&2(3)5*7("6)6-7/7,7.:,:+9/ 9.%81:0<,<.=-<3<2>0?1 ?0@2!?5A30=:B4"A7C5(B72@<E7 F7!F80E7&G7(H9$I;3H;.H=8G>J=4HA K>%K=+K;:I@&L>!M@;IE1M;'M?(N@=LB3O=)OA$PC*PA9MF4P>*QB;OH-SE.TF9SH)UH?SLJVCAVN2YK=XL>ZH>XR?\J=]TB^RI]VD_TE`UPbQAbXIfSSeTDe[JeYPe]Mi]^kWdlUKlbzqWOqgepc[rd^ufXuiqxaaxi{`}g~faifvrsmlsmsttpvqw~èʪ|ĪήάϮ֯ЯŮڲԲȱճִܴĵ׵ϸػڽ۾ܿ¢ÞťơƦɭ̰ͭγеֺ< AQ   0 W K- .!   _ p* @$" &/*3m r#' 'B,?' s^ r6\0DS~iZZTW_gzqTMbg9#f8k(4* e: x52XF dvtJs !)G8'{lHRa'o%V`UcC=Y7'y;PYOIw[[p^>N|hu+6L}E1=a]n~¹jǑüĽĽĻůǸǸǸǷ(0 0=8         !!#  2@;     8HB "## %""$*"0&:/"""# ;JE ""# 7GA 9.%"9.1(#""& /',#%!" ;MG !"" A]S-$7-!+#)B54+2'"''"5+'8/$9-<0,$ @XO-#-$!" B_T3)6,&!6,E7)   ''':-C66+#H`V(PA.%!" B^T>2'OA:/!F:%M@Jla?VM;KE;KE:ID:JE:LE=SKRe[J^T:ID5HA=OH0'*#' % =SK@33)-$*UG?3YJ"I;$L>-PB6+WuimĨֲ̭i=]T7+-$&M?2O@0L>,SE!E9B5*M@?37,IeZA4-K=+N@(K=3H:ЮձԱ׳s_uhReRq~e3N?2N@E^O-PA"A5#K=^kWIUFCbX:->1J=qyaeƣ԰ԱԱֳqθȩڴekU1E6;. B5,PC&PB@\Kéz`fxJlabxjttŴ ձճճشo̰ջYre3YK~hkÞtcpbyqYrrqpѯүϭϭձt~ŸŢġڴ׳ֳ׳ձղԱԱԱֳuͮĠġġƣۿӰԱԱԱϭճԱԱԱֳuϱàġġƣۿ԰ԱԱԱϭճԱԱԱֳuϱàġġƣۿӰԱԱԱүԱӰӰӰֲtΰŸààƢۿձճճղѯܿ¡ռΰϱϱѳȱۿҮϭϭص׿ۿ԰ԱԱ׳uۿ԰ԱԱֳtۿ԰ԱԱֳt۾ӯ԰԰ֲsɪ۾ۿۿŮ( @        !!# $$ %&%&&!(' '") * )")$+ ,!,#-",%.$.#-'/%.)0%0'1$1&0+2(4%3)4*4)5+6*6,7,7.$8+9/:0!:/<.;1=-=/<2<4>/>.?1.=3 ?5A3+@3"B2B4A9C52@<D6$D4E7 F7F:+E9G;"G91F8H<#H:)I97EBJ=$J<4I< K>%K=L@&L>!M@"NA(N@=JG#OB)OA=N>>MC9MF/P@%PD*QB+QC!RG6R@,RD@NK2SC-SEGQEBQHGS@8TBCRI#UJ4UE*VI?SLDRN5VF+WJESO;WE0WI6WG@VHFUK;UO2YK8YIRYBCXP9[K@[OF]H@\PB_MC_SI^WJ_XLbTGbVGa[HcWHb\RdSJfZFg]Qf^[hTRg_\iUMi]Hi_Ij`_kXokULmc]qYTpdiqZjr[arhMtkXuiSukTvlpw`szc^{o_|oe}n`ehgu{mnjnkz{lmtuqrsuz~çͭͫάϮįЯƯǰԲ۳ճִݵضڸ۹ڽ۾ܿ¢ťƦǧȤȨʪʮеҶL  Y h$9Ix h &6 x dJ N3 %0  2< -U,= - 7D ;;)! 6  6Ha  *"-K]kFVM 8@ZAb:E c 8`f-. P  I;IrF#Vy{)?+1 B$6  cRCzRIZōv5E TXA2/ pV]^~)۶K4(eXoms6OpIQ9[Koj^CGӿsrwN<]rg;8>ZӾۧO6Ej~VtFSXn`غӺ׳KWQ_»׺ǫ“\( @ 3@;              !$   8EA       3VH0%^{o^p[ڵϮԱֲڵgHg^C66,0'$OA=WG'I;6QB*QC+SE8-D7/RDB6G9:.Mi^#J< C64QB.OA$K=?3*@4{}ŨԱԱԱԱԱkSpf\hV/SEqmAWG4RB8SDNdT7YJ"C7;0!K=5SDiq]>M@Lj`;/9.<0!J<-WJmpkTʨԱԱԱԱԱԱkԱrڵkpZ"D7 "7- ?3/PA3WH5VGI;YgUϮFRDJi^A4G9*I<$RE%L?سjƥԱԱԱԱԱԱjǦԱձղ~cPXFiq[C6!H:F:?\NL@E_Mȣʬpob|pOtjwx}|ȦƥղֳֳִִղiҷããĤŦƦYti-WLitsŮǥٸpKbX5I0(<4=4?1A3!@6B4"B3C6D6 E7E9%D:%F6!F8+E9G;"G9(H8H<#I: K>*K;1K?EJ<!M@,LB-N>(N@#OB/P@5Q?+QC&RE7QF2SC-SEFOJ=RE8TB)THWS=.UF#UJWRC%VK6WG+WK1WIKTN! 2L  S._B! %' +C2!n%S!&A ;I; #'D'=B-DY" xx !;IFI@'4)>S4;DCTS;$ "$CUo]CI'aJ'6@$FY''IT4"*Q'' g`nSC:JJ;#'CPY,  *sW #(bH\odLEoo]u %%2UY 2dhp  Z SF))'Mt]U ;7mmaPB 9+)M;) H.'@FUT@;HYkktĆ'T(J-' GC3IFKQ2$F`)FK]oږ\$9OBrB dS@Gn'.Q]JS`[nY`{ֲi :])\CV`SCDJ^]$8^jJTSJd\\UڎSJ7CGS{sFxdYp8'StS;K`$QUTD}zKS;R0ܓR}`|Sx~j`'G2aFc{/ D3;LQUjr?ܕȍnfr';^w{p{DJ\5CFF)FQavՎܓڥC7'$-CTdt\SϥX6JJJFaUnܓܓײ25VJT;SyhS\Ę4.$%""""!%"" 0)2(-#"&-$""""# gys """"""""# cun7+$+"?37-!!.%*"6WH*!0)&!I;!""$-$.$!( 1()<3 21'9.p3(=2 H:9.)!""""# iy=/A4%*")!!"#")!@2%I< H:=1!""""""!/&+# .%%/&?2"K='UH#OA?2D6gwq1&%QDF82("""""# exq:.>10'C6#NA1'"""0&D6$K=9.%"""""""") +#.%-$"'5+"H:2'1&'lzu7TD*QC5XI I<&""""# g}t?1,#<0F8E7=1&/&2(?2G:!M?6+ "          !' $ 4)BWG3K=  &dqm0%2(7RD)!$!!""# exqB4-%(OA/YM.TG'F:#@5,WK*VI#OB5YOspon}hxrgwqftndqmeqmeqmeqmermanjlzj}vdqmernx}cpleqmeqmgtoK]Wgwr *",%,$.(.(+$)"&% csm'8,"K>#M@' 7-,TG&TG/XI-#Oc\ %-&.%*! $+"  L^W !    /LB*""!!  !!"# g{t+!!J=C63(3)2(%D79YK#OA"L>.%r=/:/(WI'VH$RDF9<1.$%;0 mz4(3)&F9)!"#$#""!=03)! """"""# sD66+#1'>2B5"K=$K<>2;/'sD6#M?&UH&UH6YLlt]TeQ2'"I:2(o"E74*&%&#0&&,#-$ @4?28, C7B6) "!""# mzE7"G97-/%C6+QCIaP,$3)C6 'E8$QCRgT-WJg޷۵uva&L=H`O0&n;/)E9!#$+# ?4*"2#B55VF1'&6+'"$ jx"H9MaQF`P'PBF8!J<,PC,N?6WH#M@ {*QBD^NԱpɪԱձ}sȫURAl|+ &&& =1'PB3)(L=?3)JtֲӰԱԱԱձղ۶{jRcvqI;E8:/@3"B5I&K=A4K_NE\LE8"J<;/*H;#6,|XjVέԱԱԱԱԱԱԱٵrWt)G8ZfUH_O+RCshN^M^iU\iUH:L[LD`R1VH,QB1(!B57,%REC62SEB^OalZ!6-z.$A4:.<0&C7!H:!K=-UHHaP>XH-;0ʱĦձԱԱԱԱԱԱԱٵuY_mWo3VHoֲ;SDVdStv&:/m?1B4B53)B5 G9%SF;ZMiа~lSҷӯԱԱԱԱԱԱԱԱٵsXʱɩҰ{Աسh?2:.#0&/&6-@4$I;,TF:ZK&L> I;PgTbkXέhEJ=l}:-E7F8!D7B5%QD!L?8XI˫ڶrXҶӯԱԱԱԱԱԱԱԱٵrXҶӯԱղԱֲq7-%8-ZfS)K=F8$J<=1H;<\N+TFH:)O@~œѰv[l~>0$H:C4/>0>6 @0@2A3"B2B4D6D8$C9E7 F7G;"H:H<3H;J=)J:$J<*I?0J?!L?&L>,L=KJ?#NBQM8)OA4P>+QC&QE5PD"SH=RE-TE8TB3TD(TH#UJ/UG9TH%VK+WJJSM5WG1WI%#- O " ;    ;L"F]E6  % J &@"U-$Wj ,U $ ), G$I<    <-B@<  &|-%BJ$7   &6?J+1/L"B? << )4.;aZ  lK  -HJUCFLC-JF;5UJ8) D@@ &  )BRFJ+ ) #aGB $H@BD Ix^J\k= FHqHJ5GZ`BiLWFBDGJ2)n\~+lJcPJRxwYaR1?-eC@^i|"<;G6<`&!"""""""""""" v} """"""""""""" myu """"",#""+"!""" ,%""!""""""!@3*!""''J=!"!"!""""""""" v} """"""""""""" myu """"!&SF0&"""""&@31*'"0'"""""""6+""" (H= *!.% =1!"""""""" w !""""""""""""" myu #"#!=1!J;$"""".%E7;SE&C9;/%$"""""!"#""! /)  H:&!&!2(""""""" y$""""""""""""" myuA4.%"'( $PB6+"""1'$)PB;XH  3,$) #N@ """"1'( *""!3)( !6." F8$"1' G9?3!"!!"" z ""%!!#""""""" w?26+%C6A4>2!"""%!2(PbR6+0)C5-#!I;&""""$1';0!" XdQqyd " !!2(;/@3 H:4)8-+"$*! 8,,#-$!J;.$B5*!""""""" v@2>1>2( !""""+"!"3):.5-=1&SF&SE""""""!!"" DYH1H<!"!6+ H9!I;"M?D7E7!J<C76+ H:D7 =0:/$PB I;<03)!""""""" uE6A3A4!$2() !""!"!3)C5'M@E7 I;4*"""""""""""*"(""!3)!&/&?2!J<&SG(WJ#M@@3=1C5 v~)!?2'UHF8C6!"""""""" s~1'G9A4+"C5?2$PC2(!!""?3D6$J<C6-#%""""""""""!-#,$">1*""'!5+H:4)7,3(  +# vB\K:WG(SF1UG&TGB5!""""""" q{E6<0":.#M@G9F8<1$,#! C6*!F8(TF%PC+""""""") !"""" *"$%""4)(E88PBAXI( !"""6, v}.$!I;!A4RdSE8!( """"""" v>1F82(;/ G9=0F8F8$.$A5=1!I; G9#OA!L?G9$,#)    &        D5*!  !!A5WdR8SD     .$v}#1(""D8'""""""""" o}xE7C6)"(PB/[N3_R/UH*J> 7/,TG.\O-ZM*WK K>>_V~v~yxu|v}v}v}v}v}v~s~zxyv}v}u|u}v}v}v}v}v}Pa[z ( ,$)",%/'1*1*/',%)#' %# o|x8,$7, H;%QE!J=" #!L?.UG&SF%SG8ZK #Qe^ # $,% % $ $      N]W $             8SI-$"!        !!" q{ ( &SE"L>"L?'%.%& G91WJ'UH'UG"J< 'F7/&,#&TG&TG$PB!J=G9B5""5*$ |;.6+B5>2$"""'""""" E7 H9-$"""""""""""" y>1A4F85*9-$F86+E7C\M>ZK H:E7F8 'F8D6!J='UH'UH'UH&UHG9-PB-H<;/%1'7YJzE7%%2L?;/!""$"""!"!5*5* ! %#"""""""" >1$OB-$!#A4=0A5#N@E7G9=1A41' ""M@B4$PB&UH'UH&UH?\Mls]Ȫ۵E]L2(E8"I;,#D64PA1( !&&!/&6+$,#<0!  A6D6A4<0"I;'N@>2%""!"""" {D6!J=A42'*!)! G9$NAUdS9YJ ,#?2A4 "!I; H:$SF?[L/WJ"SGiٴԱڵ[gVF8%K>D^O"6*9UF*I<"###&M>'.%G8>2B4-SD$L= "*!.% ~C5>ZKWdSOaQ#M?!I<F8"M>$OA=1;XHMbR,WJE7C]M$UHtxa׳Ա}ԱԱԱԱղٴֲشRM;}D6B5/&9- #F8%REE7C6E7G9C5;UGAcV I<-TFE7 G:?26+'M??[LE7$OB4)7,!I;A4%wC5RcSK`Q-VIE7F8&N@!J<F8F8,SF"J<%K>(N@ $ K=/UHԱԱԱԱԱԱԱԱԱԱֳi[Es} J=&NAG9=2F8@3+K>G9@]NNaPemZL_N?2%H;S^N,SF!I;$SF9[L?4 E7G9;]OG9 I;:/F8$RD4RC,#rC54XJ J=+PAE7B5VdSRcSF8F8 H:9-3(@\L*"$SF~}e׳ԱԱԱԱԱԱԱԱԱԱֳuaJ5*D\LWeTTdTH:0VItx{cvw`/J=kq\rv_ H:(M?T^MB`R,RE+VH&L>*!9.@37,'VID7A4.SE4XJN`P[fU-%>1=1F8<0>2>2;YI%K=G9 H:2WI&RD+M>"D76;/dzgԱԱԱԱԱԱԱԱԱԱԱԱֳ{fM M@[gVsu_3VG0UGsղ޷emY"F8OaP>2 H:E7AXIdo^[fTH`PB]N%PB;[L+QC/& H9F8.QCZeSqt^zrt_.%4*$B5;/:.<03)F8"K=&SE.WJhoZos^McQ%3)ձԱԱԱԱԱԱԱԱԱԱԱԱֳydLMaQ̬}6VIs׳Ա|UcS @34TD&$?2&H;6TF#J<8VH?ZJ;YJB^NKaQJ<F8F88YK[fUŨͭzzc3*yE6G9C5 H9*!=0E7E7&SF&TGE_Of۵ݷ}gN԰ԱԱԱԱԱԱԱԱԱԱԱԱֳydLؿ԰ԱֲŨֲԱԱq7, H:2(#/&0&+"1*5+ G9F8)RE&QDD_OH: G9+WJfajWЯzO`PKK=y;/A4F8F8D7<0A4$PC'UHE7?\N¦ԱֳydL԰ԱԱԱԱԱԱԱԱԱԱԱԱֳydL԰ԱԱԱԱԱԱ{9.( )!CXH6TED6E7%L>=1;/!J<>\N,TF#PBE7H;aoZ⿙׳ṷlTyE7;/F8F8#J=TdSF9"L>&TFH;@]M۵ԱֳydL԰ԱԱԱԱԱԱԱԱԱԱԱԱֳydL԰ԱԱԱԱԱԱҰswakyฎ2N@@3F8"H:"L>"K=$OB1XJ\fT$TH$RE%QDiĠġۺԱֳnUH:#J<5TEC5*TGO`PG9!L?H^Npt^hײ԰ֲxdK԰ԱԱԱԱԱԱԱԱԱԱԱԱֳydLӯ԰԰԰԰ӰӰӰֲ԰ӯݷ,L>2TE:.G9%RE:ZLB^O5WIxwa@[Mzzbuw`ɫŢġۺԱֳoVؿӰղֳִ׶ضظظض׶ֳִղֳydKԼԽԽվվֿֿԾ\|r)UGm⽖ڹݹžƣɧǦǥٷٶ|jSSf_,$ *$,%18-n^F{fMyeL{fMydLydLydLydLydLydLydLԱүϭͫ˩ȧƥƥȧ˩ͫϭүֳnV2WIqܾٻԵԷԷ׺ٻܾàšnVJaP[hV|{cӱֲֳֳֳֳֳֳֳֳֳֳֳԱԱԱԱԱԱԱԱԱԱԱԱԱֳnW?ZKصŢġġġġġġġġġġƣycζڴڵ׳ԱԱԱԱԱԱԱԱԱԱԱүղԱԱԱԱԱԱԱԱԱԱԱԱԱֳoWѺĦ࿛ġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱϭֳԱԱԱԱԱԱԱԱԱԱԱԱԱֳoXġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱִͫԱԱԱԱԱԱԱԱԱԱԱԱԱֳoXàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱ˩׶ԱԱԱԱԱԱԱԱԱԱԱԱԱֳoXàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱȧضԱԱԱԱԱԱԱԱԱԱԱԱԱֳpXàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱƥظԱԱԱԱԱԱԱԱԱԱԱԱԱֳpXàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱƥظԱԱԱԱԱԱԱԱԱԱԱԱԱֳpYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱȧضԱԱԱԱԱԱԱԱԱԱԱԱԱֳpYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱ˩׶ԱԱԱԱԱԱԱԱԱԱԱԱԱֳpYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱִͫԱԱԱԱԱԱԱԱԱԱԱԱԱ׳pYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱϭֳԱԱԱԱԱԱԱԱԱԱԱԱԱֳpYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱүղԱԱԱԱԱԱԱԱԱԱԱԱԱֳpYàġġġġġġġġġġġġƣycз԰ԱԱԱԱԱԱԱԱԱԱԱԱԱԱӰ԰԰԰԰԰԰԰԰԰԰԰԰ӰֲoYŸààààààààààààƢxbзӰղֳִ׶ضظظض׶ֳִղղӻҺҺӻӻӼӼԼԽԽսվվտзӰүϭͫ˩ȧƥƥȧ˩ͫϭ׶߾nWз԰ԱԱԱԱԱԱԱԱԱԱݼŢǣwbз԰ԱԱԱԱԱԱԱԱԱԱղضܺs]з԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnVз԰ԱԱԱԱԱԱԱԱԱԱԱԱֳnWз԰ԱԱԱԱԱԱԱԱԱԱԱԱٶr[зӯ԰԰԰԰԰԰԰԰԰԰԰ֳǣvaззззззззззззиPNG  IHDR\rf IDATxY$Izs8򪬪E n@HL2F3MO$4% B䒘.vA^s1}wuݕGzȫzEtߦ2####?x8xh SjT o6|kN6{)&QodwR)?7~>ը7zO]_ 5j<&(5{Jm/, Ԩc$1lDF10ư? /G5>0x(wS਋7s{qY!)6,/cj#F#k XcFW5F51`^k0z@J$R{!k9~-R!EWB*wL}_)uE @@^_dw_HiV$]k/dG8RH)CxURd4!O;\Z't c䛜41 Tw? `2!ޝC4[;eqO4?#w3v\L6Ba$,āGEXRDL C19'R@*W%~<8w8}?41sgw~̄}_co"\'Wd<w _y%<31Aub:BHKoK/A>6Rn[H0(Xp&^?B`0se<$ࡠ|ɢQ!cs1NDQ2둰H:wh<졅~n#¢ [SSk,4Zk@qa^L 5*,Xcl5+hk +. Pk5 +x&Xh`A.-Xo^\"P, r,0zQu6@ bԨX`PQ45V*@ YZ Xd+F XpPXt,0ۈըca*L#"jWaaL'DE 1Ul45XT& 95`Ak֨1ҁ&`W0* [QƣB ctMXhPƢc r5B !Vui" RINuX\H!15j !$`M'CBǮObz6!oo{waf3<}?@dt |EpK_ڭhof^DK!.jM@'k`!opҗݦ"G)˝)E[b{x~Xkƹ?W>B`Rl`#Xݛ\,J6>2#rV}V7 Yr4Bm@|6}W(}$xh,D$!$y6`ofH@*|]uޫMt9Cb!ywIە!@.(bZlY(}5"ǝw< {y1I顋EvA"3Tt˽$h^W<3/`͇$0]^?8_-h76htNRh&#k ( " 1xR5PRrUn߸#j!ػ:_aG9b?d5]j^Y$Ń8:av~|uqgOҝ+BCQ[o" s,C!+С0𐪁{o-K"N!FS`/F<__ӟݹϥ!qCVaR)BtS { &Yf[&>b,Xacfgݽ}{ohm&s !@KH۔eS5ya]l{׊C$[ KF.$gV , g;Y^ZRpbV5>`7R|叿?_~=gzB7AFGvZ1,`yYr}3 &O0&;OLTgtd'}` $%y` eVT-j,Ek+4(gBY*"%r[[4,6䥦(˩g7OZnl 8&}qJo cZ_Awm%EXXk3( @HeFBqu%l-߾N!p >C.Zz\|<7;[< [{n9! qLQLO?~C@9GVE޽Moq#% | &#NR6h]x""nV'NjP^fe޽wEʉs/&I˜[o!BJ| dEIZ Fy)%0 4ڧcuAq, ]Ҭ$MgI iuVDSt5hf(Kwďr(yx;(ÿs3OR,pDDQ},`eN0+  i&L {{;$-3Iv}$5)}! iZXS bw^9Ɛ%$ʯ<4o ryO~RDc`tIfDIFݠSiB=wxbixkF'(d6a3-wL%l=AuA]g.8CJRR$itF<k/~+XcB- ͥ5:'.r ۫Xs(Ÿ C2eս^Fؑ AF{A*k=?<4+bx !I4Z U Ip}Q'ews/?pUR]EzWڿY:$^Тcx].'ypFscTjeH%(In9:L9 71fbY ei 2ߗ{H'@9KdCs {<ŏB&p-#a<]M )|{ djvk(K~R P4IgtJ Pϰ&g0@*9"H呧w(M S鴉Q{,p;~w7S)yGV8<,EkCi e!RYlÀ$KgT/p01A奔^Czmj![Z'4a7yş4/V{±-pь8$w+цfs]I(x™AIR)7|¯ܘʉ)ܕ`Rx<[`L ֖H@H=^*gKd8!,ww"gS^wAYnc qRiX"T7..n0V +FpىF'hm,u|xl03恴U$䬃74IMQBrЈ ihm y\`%)dB~+\x/SEԃ}V |b$Igf>vQAx*^;{h6J6{<ոwh.6–蜤= B`LyĀXc flc,չLYV'hQ:`tkCTxqZC]i䜋~ZCza} +YV:w25yυ(Qj?<]M㒃71 6JI!|c{0eN m0 PZc@k,˧cGY9a @)R7}jpEтTj]0yFFF :u)STFBSwh袏)# \Ԇ8hxJ KyCDo5 ZAsc}v` J+mFqAy2?][oP] â!< H[dI{W_F*s/|'>l0%Ex3p?`zRUƇR}Sɳig}QŽiJyZ5/+…e,8uƭwq( MQb6iEB Yrx긠δf%Ir8b4rDuPnA~cbm,XB$)RZ?S昔hP`eB@Y ﭭtzW4'wj|0>y0*SMFk[eMOи'8sS~狎3"c g.^xfO)laa&r%̭lmv>Vc.'wgqR'Y9ǧZ`&Bj O.ssS* R%qR'! =.s `D8,₡-t#Rhx3!H_xA}WP^H%-]0ܼ[>]hFGX[M;Ug!~Fi<_q|?yi6!h~x2%5q\] QJRw3عIk,aB3 (JM^ZSjshJT78y8^ѳ7!$==blk݈;CjԹ6O}tM !`^3fb]?﫝5>B2ؽ< o+ leV{&D}[XG׻{VBY074+G$!jT܃U wei~a}BۯK}0ؽ :q>dsHy;F@4⒌x*[cŔ뗿ʹ>ڗ1R"VP]i$i\Silh}cnkj*Q憨ߛxԭ'NFJm Mn!(Ec< X4}4Zgؼ-οh2'Q)7)3֞^5Lɉs/w]qo~W謜gi{ۯ!璁3ͻJnew3f܃#Xʗsv\`cMH✶qx]m Pq(LAh?_E5.QDQA@[˟?eWٻ.W}]z%>3asyOy:W9n:%G E^b$%jX`y 5Yҋ[ rb:m,KCWߢ}^=YH5S^O*Ɠ%/5l\}ako3E͇?FRhzs,tO4X>$OK(OcN8y}IŌ hsu*8͍70-8gNH_Eʹ~'?Ksf] Z_T`Tit0$GgKҸt񻰡 EP%&,KMH:&I1P,͆Oη;̸ IsssaK)dt׿ A* B; Aã5$(hxcC@ 'C5R2`2N9kef;Җe%dTI#G*,>YK; IDAT#O_'O?l`z,'h(!-h)[wxdT5I6w^>xcɳm+ʻӄs `ɖ;ߵh??R~GwI&N~ߓx**m'M̎?,ARd"\ ccFĂk%6wT]EAmk3WY}sl\:'7==\}pU! =E{qg AAYߑqΡ*R<unƓMyN% 2:%Uuʐ 0p^POv|Iuch QkX @iVDWg7IRVlcb4a}RcI5ܻ)z53WfRFH]=(o k ?ʳS:bjEZ .GO67Yqi.Hgtx,H!)ˈWeEqv O~p,CpfAv,g ܭ(˿9RuUrPQ-ZӈT(nYқrhZTXt =/tc-ACq%%VI;:Z S1E 6f豼n=wVy.Qe#֖X;#FoJh^q{4Vi;UJh._W\{IG{^#XaBqp.$wۺp6?E('\-mQ^ o-j<3do`rs'iu|:sW|st.5(omd,ܪ_!^aht>Bg3Xkܲ~OpBi8(]޵yl\FltZT>7]e;a ^v._dw2$]Gæ'cۃ5ZYֲv'1&S&IftH3JkO1nG,0K3-Փ#C`9!B(.Eyv[yx3mʹ` Ⱞl֖fKgx)4?ub*mY9Y|c|MkR$l>ɛ_'6akS;~i\ zxL Af jVVag]xn%on|J-PuָJTҧ(XL_lz 3AJa/Gކ:fm ppVRy\{ƯSɸ26;w/f{g"/]@&{[ #);˿8aL&)%+kMVB:U5Θ4AEE:L:D2D{d.`kÈ2 ܭ몁 Bh?O3ێJ%7E̛_C" <*e lc!l(ޭBH[?ɉOLhH폌|E5ި67I^^/'Bra1 7(;W\!(ICp+ILXWf֖`dVEvmQEx_˿ p PBPxiy&a!%_J'͗Cr""brlTյxKm+**lTՇ'_~H}qw#fi9t7:r1I#OvHɋ#)#[p'i?^>ƤDQk-iTL Ϻ{.<'([dvo %Yz!,|_mVaH,u/ U=oEJEoo[A09?=>WTAZ݀k-Q`d489Βvġ GC~!(v Μ"}3r|S<4)ٸ5mvˣyFq'|o"t%FcF*c?)K(MH&'4ydU_Zm%hw]pm-=-IEWISU ]Z>hۧ yns~ tAc zwm9R5K_gZS.b!=nl6{?~Oۤ.{PdC<ɟ{'RMe|SOsٿՓOͦRugHӭ4$-X33ѦVjfS׈8gleVsd.{)w3'JÂ6}QSmI^ddIIo۩k:!i8 @c(wg%yzk ah5c)|<ώg'8p_ϐ'7ó2?%Ry$ <'N7fBMQ9Iّ,c{?*FYS~KLkz;{xR mƵ@A h-}dxVs [V1FG#4-gQ^r I ?P#_;z<kOp/tI_inCq6%k"4["R-aMN],s`i4O]I7bFyQ-!R$M DfsfI.{پ*14,V<NqҗٹVYt6l"%/,1$yvWTkM(iNi_# VONf͘ ͸ hufǙ3G;tY /tp!H;1©m\N;$ 1?CX"/;_wͥEQ{ Kn('+c(-IV>@tL0JTjQ'_\RIŦFZnMU' q\7~|,2sj90jK}$i9ޛA$7ǃA=I5wV<̈MA=$l?ǭ_:pj܌Ayb5l D`Z(3ݜJd+Ni9] PRO+؅%]u] 7i44n)@=6S$*msr{~F5RJG,I1H'e=Dh5BLNJ,$ =aUkzcNBV2w<4A1Nkɸ'qLBzH&/Y6B!YrM1<`[k+4Pקj 8}Ƈk_IsJmrMy&BML˜hpo ]yg[Dm\^ Y^Y]iWK;%r;AN{7)-I&ǘtoT8Yy{@ҐW6h!WO^ ssww_9v+Vʿ{xp\R"<:+!! nк{n&'Ԁ#^ߏ+A=MAF'H^x_ř$}Xv*th]o8"%ĸO`V3*J.(̤m'ε; woyqFmben(s]U21xv%LmwΪa,$-\'U~3tT`&SEM?-2x:֡`g> !!{,y{L|1G;c-ـ%Lkݺ[Rd%i\Vp?̽NmIⶏk|}[Q/T}rimٸG3;FyW4Tu|TG96n*pNowVq;v6bzZ[n_!(zZ[5"?z4pVY0/1ڄ.by?YI͝I$:^?go?czLU3w呝%ȓU^%@eAH#9Z6}'>_WH0֛_xh9\g,%7νu7b!Ar$\TnHR .CJr7yB>eiH4,(-F5AYI5pB!gzQaT'_k̘o'͖OVB0;Z9Qci3X pkg'g_%.ϙ~IR87"jM VEyB4+F?I,2pTY$w*"#o:C!i(4EAYl^\? ߙhk> Tl۷^#_g[\?kbo}~A)ϥNo^>ޕrKŶv~~9Ҍ%A՚-BVd| tVf): ~meˈSivU}x/fD]ȷHocTa>BB'YZ ˓yV>8PJjkWcl4w9ite\)6XVNey76Ώ_!%Y>"oU1" THk,Ր^F*݀"qb&Kqifvri+[|?tj^MvߞB*{T)_cqUx aowkc79yStמ? ߦZyu1`XvX.ȃ`ܓ]<_q|5Ei}<ڴo'IT0M49k-͖O&h<̶pi.mAߞzNv ,KSWB|݅ )H2B(Z87aAONc;(բѺHrzi\pZ7dIÎ{^ۭ{{6g  ED?@zp@&=@S H "u\Z3ݘnܭ3"c{xlUUYÿŖo9{>X&ͪOiQi(r$_ͬ PR/(Y.vS0HP}ٟ˳Zɱ󰹴FQ ƨ֊s%$EF*@$+S2(g>o0<5!Ktքq*$L_7q}zdy)8X-ZM~4;r% IDAT~gXN#Lg)t U[_EB0jOc6Zc YZM#.BSȜs8C%ڢ$L{5D^Hx vim-&af!+ )g#di ! FYe14>稥 P gc8 i20lO"ٯtU"0U-:Ag}_S `JTfz] V3Aw4Y,BA rXKnf0ۤP@Q"|,P$Dos)䕥`/^gnpӹ_1N%F,!+ BL EP0)8'x;#D@+R>.Z}$- ˯+gHGbWy.Qsʣ['aom{nEfF-O37Yo2E\"^h@&ͣw(mr"{6f/1܆S8'Hz 7r=H`&=axiұ >|(fF``xH{څSJ, -Ć:`M$ʑYZ O)m1vuVE䧎琒\I`->U5yz 7<KVeh5^%G垅"?GEeHMJ5"Sh5mLiJ,N nSUczH OOoHY``| Ջ4o`;0>L^P C)eۡ>Fu9qv)ǪccӳDtaEB!Tӄga:~N߂a!E$|D+[){H<;զ pe:<w. 6V%s(rp"uR0^Nf$!$6IE+^I+E4>E BЮg%jGiFAYKil׀[(,~p+,O /0a^(rw{p8~0\ R*')|qc4RK&ӢSoἏ RmSnTĵsЄ8z#1J]$3SJo&q8/-RsZlu($F򩼖е ob<$ 1:fjk˦_b)A=VT-AAT~4Rp:/u՗h?r{ Q"I ؎"7$!Gby{[H`0uK$*-~OPO9R-<pkgQj;^R5c1R 69P}F_W?hA| ^#lw)]w*ZVD rLXiq̅(U!8YsJCn'eZ|v`]3\Ey0-* i_' ~p} =RBY91|q c il,7*)1S95q5 o*EZ]g}"Bh4z9dp049& jRL z+od?Ks: Q ~0E8:hx%1cY^R9R̥٦qcxW(s~Q>3ޮ_H.>5iչnAOSd1 vk肔KM"/hBחx.>\sְP*:%RڜG;8g8lLwE9zr_ׇ7(Zujt_݇MDAa J԰nu٫:fצ(VFfW˟" !d^$:@<!iX0Z]ir`0"_Lѳ 'FK`-֋0plL1{mInpM^ægS[ɋ){> H,  AwkYv:J9:H1 Pɟ͎[VƨazTU".>ҔrN3+'N3(3`<͊Mݮ*F1[.\!jwG!b}^QaQ`6LVfuL1&Fxyvud6(B_RIE]V_7b{% $%) Y%: w2-J?#Dc|{.ʫe iiZUY,%N_Mս-\.C m`63@* AMLy *lju$qe]Uo:LP YOP 0(gt)|O8z1J$)Ӏem{ Xhb]L<<*ZY>]x`>ls$YY#0_ytU)ŒQL~&Ww۟vyn618 ߘ[Bb1ƆpAmpfy.e0uSpq(Cqj`|HI2%$$#OҸ@KMq $ j81&Sb8!IdJ`B̾gc(+iwUP ,><WBeLfn݀AՙK1Pj~` FĮәV [-m(Fu=#9gsΰsa$ʱ߀QA  C@>!UL/! l%*0F%E!z&뾙Gk g$$sa'Ve&v)D}\`s~ \q6'J)çDA,,)0m^Y| 9,dL8}ɯ~QZӺ0!nk0[.o4`Ǖ btu/hD} .Yt|kQg sUZDysrH(DAJRJ=jbVR0Ͳ8|ց7v\TA̵IN^LW):}^B \fc}l rqU S 0P_&Ä2oENf:*O>[MI `(G l5p~8]%B:g\&԰+3 '?pF/b'6Ml!pTf/# bNLY0y՝h~,9b3(-E jjJ&oWԷN]$*P _~Ϸ8&0G0^|9ISt(N2oLCd@$q"wz*x&|18.X)a\ziB1 ,ߕ] (ø$|A~7p͠Sp߃i Rz:,/$LO~S Ӭvv xvl&;d,QXQ@EK^"rˊen[~F/-<)|-G$vrPp]aowNNsLU{Z@9/w| c*-')7(x0c)he((A!%E,B"2%!Mz@U09aja9"4u)2(S@Y,??) Ri܂`aB,"YF2֠g_ FcX`Ԍ;?@INbԫns 3,OG~?g˛beS?V6j-kEKbc3=o-aZ~ͽUr'e`s8'Iq5 EM` ֿ]139 5`@`܀i(28MSH JH(}A I) )ɟR@IARIH!1䕾_e Y#!;Q4JXvBtyGJ,)L컆(~5`hKJK] &<|g A?1~?ϖ*(9aǿa{ } f|2 3VRg)ROr.kBIȢ/DM6l;.J>O.k,aL0.Ka<@>A\Zw4+lVgs^V[UAe߳){ůA(ܠr179Ǡ—x^,B v-RRsKMhuZ>IUӄ܀7=]eq %s$iQ1AoяHݪ84Uzg fTi!;:V\u#mq iuj^L,&ӛQ;F#jk÷a{ 凼D=43$\׺1R}-<_~K}uǑYVRg5i6+nR/sӯ3F2]Jh"uh:}0bDޠ0hwn;3dY`4 Bg X-jOAA6,/k[(!TD;RT5*[.*D$V$XX} I/1py# ;n̠851*!`Z_|^ P:CVecy ofk^& +snhw돦+w=DGaxX#\d~՟߲LGIY"v;KoL\Boã!YhaQ`TJaAG/U'<sSIY:"ea&(B(YX emC/#" .EU8Bbh0[.BRK`mv*HJ/d65LowҔQF ΃&0OQ1!GPtQCEN<0,3cij ELΩ+irH5}[."F*?nUMFV]=#"xε&|KK-KsR b# D8!'kYڿkʁ2ŭes8 1(ebܵޖ0TMK!VD9K)aٴV`#/AnFͶMMޮER7,yJײ0<LuRhu]z0,^w3r1ΰD8'7$rQ@_~즊2.j9"F Om״y5yRc>&( RFvdVc4 | 6Wd pF9g\lrMh'Uo]-T27`cryRl@TRM m4\(*ku]w}Ѷpb:Q0H&i$G4B> o1anѵ `YNkSi}J)t<sEUSZHf۔i5-@|)9ZFvkq+P ir4LTM1^=n\݆i`8xI u>LƩu7$K ^i*RP!Hc34*(5_cQ`7]'(\ Jrpf9?; h D!m{$ xq DfiNM G^m>[BI|Q,N0bX4K Dkw+XU!j0 063ů60Cׯt3xYwU '}uEO7Yxy+{ݍϋf%фl0ILz3ƪR^_2zP7˳-0p0(>\ [_B] Q0ŋ/_b4z*pl'`r|{41:^qͥz޶7l0>Ʀ݃mQY|TVu,7xy$[;cT#A.?Uevu({My fgzS@ $2L(!^D{`X$}٪zGYq~ /F4-0ƈAp,9Cå$l SwUJaAkl_2KMr\޾Ⰼ#%K6SpOQrM(zt\l7@d+/JSu=<>:܅)24+ e em6l{t,scCTJlV8 T`&IDAT1B_VOJ0D%qy]GRZɈl=4Z6{37IIG°RaqdP 7Hod%soI AN_.I ,2\e0i5(b ~ qOWwg]=&/[6ƃMuLS#MY8֒RNLndR:'@J),@wR )v5gB1(ˉ]sN]zu勔 B,sR`thPpS4JWpO8x4kLRj<`k+L'p!RB<]qxGʼ )1fc҂i1 {PLPL`* S)D05!Y­[E ѽ0zdQGJL_ QO;RIQ `z.)anPo +Jb.?kQJ4ig mc(9_ittTj/Fр&6E.aDNyynGdz"ߴx4W[{r [?a.L{8 < K ,(H(A%JcŒj(@nttM$] ݽ$uG.(rLq7m"xmI0PDu2L6J- =pێQP"1`Yy&ټЋL+?0fcծ[d'!HGg:%cbl4VC$aJ6IR1<0ApR[6Lfv-N%ygF LO(hp.\2)DE'}5-}U*'Bq=لyn@9)F$'Ôv;/JaNd R$!"K,(u `p35>\^ۦk0 I Tj4Pi5ZLڅM&Ggۻ1pyZ&-IBHD2}o䔖 wM~0\\MJpa($8gp^JQ7+Gh&5b`64Dmq\ /Ľ`_ c ֕|(VpGلW5ƀ.}o&MIflުE]Rr 1Qpo!$N^L`&Ζ҅cx31m2okZ+s ߆aUpl*+?Ν葯UQ30KΏ"ph8MQ߇519 &@cYy*WВ`E*vdD>jif[?ڮp,dq(%LGtEptP(A JQ/G5lg `zD䙘qj Fdn/}YyX%~AxG+^vOp:)N^R1Oy-8EFQkbumy'0**DӼ"PA)jҹq~W AJj0N2AGB*08ӹnDZY5Ҙ){hlpCi@Fխck߇ՍT9ա (<{;-*`Y3(:^):P8y6PN/7 A''vO`:%dz% AWYqpax uzl΢1i6f#)&G8*o]۔uP 6zpkcQÓ7d)7 LUuMx,lBkR2 sMp3<D^lۀ ]IfoXp]햃p=SL1LjT[ʦ7b`kBB1N]Fa$2]|& ߄߰(,4]LG Fɝ<0^5DT踆 'D95LZm}K*v^ FӀ`>w~GOBޗ8~{g8 ǡqff!++|ߌuoJVAgۛdmB@oT?WY~Bed7$)OXղwa)j;8~y1h3 a8? SP)" A|gfmkSA)VR|V>(GTTdph",}E?!LX,2b }Y}R p:}k$bɋZu%C+D_1~7?'1n1<DHk&a|T274"@wǃ㚈C-Aɮaw\i$"$:6fƨ}s|`VUAqn d|c}v}4&G&q\E> ZnJAn\O@GCkrg1x""b)h;y[ʎźc4|"%amth@dR3CIn0T `mdK @IH|Y8ǟ~ފ[mexob֊Tط nFs[R+ ]c59џ#C ir 8ȫFL I4wnrDy`AJb!}l ;}k.+;0RN(,g;y+AeD557ܲ j,F0|×?CǐBBuaT/GƳ[}-yg{5#ԪEo~(Yx>USzy&pqVQ+F{ƌKe]Mp]d?E0|<>? +O8.R^ R_4wu7u\;a0'} )oN*0$Uݢ;&Q_`&D!1m>ƩV:5z(rWj.7Lŭbkt00ǫ/GBǃE.b^*jtI8,M&!TsƫM4x] nb9|kb%|,"c8y9poy| 7'y;'CAzF'!ɱqcQn߲i4;jM힃wq{hukjU}4:tOe޹ P.pQJNxg-Xe}'o>&~q:WݢyF;7 FX[paYaNl1W xU)R)uć!p,J(eO-v(,f: X[@\o}G~>g 8;$LzE8Ӎ/]dI4;cw*yËpu&"f<^4x@zu) a"/p&oDyow5|.CnvR%[.-O;xi 6Ÿr )a؄^F >--v͎3S klB,xWٴ8:[.Z($3Ō]Rn{\DA"P`,ǣMp#_fDw} xhTcjDceqT A\`FKmw |. nzueW] TBhlt˄4.pqapzD M"e|2>j h_y npx 2ӤQZQHy\3Rs SY鈴7 : c~0?D1Hw*:q-oR(\UV0H4KIF w-2 ~_MZ(޼)f)}0)C( a&hb:ڼw0q/jnzopQǝӘqʂpLWrmhwfWj >b3 x[\&2_?Xo{Rx^R Oxw[`nv⮢U"N!J>mXo~ďpWA@0Sô 46lϬݕ$ˋ-Ė*%mU5G3nq~>cWpPs \Dk\*R*8-r Q6-eO_VW06_coZ`pE.Dys5   0 ƉDJ (h9r"͏|_kXB|x;X;T$mfqyIa3&E \B/TmP5t^W bG !rUq( ۜ)+&T.vΫ'sC8 .'7eֵWC\k׼6yDEIENDB`tetzle-3.0.3/mac_deploy.sh000077500000000000000000000063021476255537600155240ustar00rootroot00000000000000#!/bin/bash APP='Tetzle' BUNDLE="$APP.app" VERSION='3.0.3' # Locate deployment script BIN_DIR=$(pwd) cd $(dirname "${BASH_SOURCE[0]}") # Remove any previous disk folder or DMG echo -n 'Preparing... ' rm -f "${APP}_$VERSION.dmg" if [ -e "/Volumes/$APP" ]; then hdiutil detach -quiet "/Volumes/$APP" fi rm -Rf "$APP" echo 'Done' # Create disk folder echo -n 'Copying application bundle... ' mkdir "$APP" cp -Rf "${BIN_DIR}/${BUNDLE}" "$APP/" strip "$APP/$BUNDLE/Contents/MacOS/$APP" cp COPYING "$APP/License.txt" echo 'Done' # Create ReadMe echo -n 'Creating ReadMe... ' cp README "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" echo 'CREDITS' >> "$APP/Read Me.txt" echo '=======' >> "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" cat CREDITS >> "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" echo 'NEWS' >> "$APP/Read Me.txt" echo '====' >> "$APP/Read Me.txt" echo >> "$APP/Read Me.txt" cat ChangeLog >> "$APP/Read Me.txt" echo 'Done' # Copy Qt translations echo -n 'Copying Qt translations... ' TRANSLATIONS="$APP/$BUNDLE/Contents/Resources/translations" cp $QTDIR/translations/qt_* "$TRANSLATIONS" cp $QTDIR/translations/qtbase_* "$TRANSLATIONS" rm -f $TRANSLATIONS/qt_help_* echo 'Done' # Copy frameworks and plugins echo -n 'Copying frameworks and plugins... ' macdeployqt "$APP/$BUNDLE" rm -Rf "$APP/$BUNDLE/Contents/PlugIns/iconengines" echo 'Done' # Copy background echo -n 'Copying background... ' mkdir "$APP/.background" cp data/mac/background.tiff "$APP/.background/background.tiff" echo 'Done' # Create disk image echo -n 'Creating disk image... ' hdiutil create -quiet -srcfolder "$APP" -volname "$APP" -fs HFS+ -format UDRW 'temp.dmg' echo 'Done' echo -n 'Configuring disk image... ' hdiutil attach -quiet -readwrite -noverify -noautoopen 'temp.dmg' echo ' tell application "Finder" tell disk "'$APP'" open tell container window set the bounds to {400, 100, 949, 458} set current view to icon view set toolbar visible to false set statusbar visible to true set the bounds to {400, 100, 800, 460} end tell set viewOptions to the icon view options of container window tell viewOptions set arrangement to not arranged set icon size to 80 set label position to bottom set shows icon preview to true set shows item info to false end tell set background picture of viewOptions to file ".background:background.tiff" make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"} set position of item "'$BUNDLE'" of container window to {90, 90} set position of item "Applications" of container window to {310, 90} set position of item "Read Me.txt" of container window to {140, 215} set position of item "License.txt" of container window to {260, 215} close open update without registering applications delay 5 end tell end tell ' | osascript chmod -Rf go-w "/Volumes/$APP" >& /dev/null sync hdiutil detach -quiet "/Volumes/$APP" echo 'Done' echo -n 'Compressing disk image... ' hdiutil convert -quiet 'temp.dmg' -format UDBZ -o "${APP}_${VERSION}.dmg" rm -f temp.dmg echo 'Done' # Clean up disk folder echo -n 'Cleaning up... ' rm -Rf "$APP" echo 'Done' tetzle-3.0.3/src/000077500000000000000000000000001476255537600136375ustar00rootroot00000000000000tetzle-3.0.3/src/add_image.cpp000066400000000000000000000043361476255537600162430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "add_image.h" #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- void AddImage::dragEnterEvent(QDragEnterEvent* event) { bool accept = false; const QList urls = event->mimeData()->urls(); for (const QUrl& url : urls) { if (QDir::match(supportedFormats(), url.toLocalFile())) { accept = true; break; } } if (accept) { event->acceptProposedAction(); } } //----------------------------------------------------------------------------- QStringList AddImage::dropEvent(QDropEvent* event) { event->setDropAction(Qt::CopyAction); QStringList files; const QList urls = event->mimeData()->urls(); for (const QUrl& url : urls) { const QString file = url.toLocalFile(); if (QDir::match(supportedFormats(), file)) { files.append(file); } } if (!files.isEmpty()) { event->acceptProposedAction(); } return files; } //----------------------------------------------------------------------------- QStringList AddImage::getOpenFileNames(QWidget* parent) { QSettings settings; const QStringList images = QFileDialog::getOpenFileNames(parent, tr("Open Image"), settings.value("AddImage/Path", QStandardPaths::writableLocation(QStandardPaths::PicturesLocation)).toString(), supportedFormats()); if (!images.isEmpty()) { settings.setValue("AddImage/Path", QFileInfo(images.last()).absolutePath()); } return images; } //----------------------------------------------------------------------------- QString AddImage::supportedFormats() { static QString string; if (string.isEmpty()) { QStringList formats; const QList imageformats = QImageReader::supportedImageFormats(); for (const QByteArray& type : imageformats) { formats.append("*." + type); formats.append("*." + type.toUpper()); } string = tr("Images") + " (" + formats.join(" ") + ")"; } return string; } //----------------------------------------------------------------------------- tetzle-3.0.3/src/add_image.h000066400000000000000000000020261476255537600157020ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_ADD_IMAGE_H #define TETZLE_ADD_IMAGE_H #include class QDragEnterEvent; class QDropEvent; class QString; class QWidget; /** * Shared functions for adding images. */ class AddImage { Q_DECLARE_TR_FUNCTIONS(AddImage) public: /** * Process drag enter @a event to see if it has images. */ static void dragEnterEvent(QDragEnterEvent* event); /** * Process drop @a event for list of images. * * @return list of images contained in drop event */ static QStringList dropEvent(QDropEvent* event); /** * Prompt player to add images. * * @param parent the parent widget of the file dialog * * @return list of images chosen by player */ static QStringList getOpenFileNames(QWidget* parent = nullptr); /** * Fetch list of supported image formats. * * @return list of supported image formats */ static QString supportedFormats(); }; #endif // TETZLE_ADD_IMAGE_H tetzle-3.0.3/src/appearance_dialog.cpp000066400000000000000000000211431476255537600177620ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "appearance_dialog.h" #include "color_button.h" #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- AppearanceDialog::AppearanceDialog(QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint) { setWindowTitle(tr("Appearance")); // Create preview widget m_preview = new QLabel(this); m_preview->setAlignment(Qt::AlignCenter); m_preview->setAutoFillBackground(true); m_preview->setFrameStyle(QFrame::Panel | QFrame::Sunken); // Create options widgets QGroupBox* options_group = new QGroupBox(tr("Options"), this); m_has_bevels = new QCheckBox(tr("Beveled borders"), options_group); #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) connect(m_has_bevels, &QCheckBox::checkStateChanged, this, &AppearanceDialog::updatePreview); #else connect(m_has_bevels, &QCheckBox::stateChanged, this, &AppearanceDialog::updatePreview); #endif m_has_shadows = new QCheckBox(tr("Drop shadows"), options_group); #if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0) connect(m_has_shadows, &QCheckBox::checkStateChanged, this, &AppearanceDialog::updatePreview); #else connect(m_has_shadows, &QCheckBox::stateChanged, this, &AppearanceDialog::updatePreview); #endif // Create colors widgets QGroupBox* colors_group = new QGroupBox(tr("Colors"), this); m_background = new ColorButton(colors_group); connect(m_background, &ColorButton::changed, this, &AppearanceDialog::updatePreview); m_shadow = new ColorButton(colors_group); connect(m_shadow, &ColorButton::changed, this, &AppearanceDialog::updatePreview); m_highlight = new ColorButton(colors_group); connect(m_highlight, &ColorButton::changed, this, &AppearanceDialog::updatePreview); // Create buttons QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::RestoreDefaults, Qt::Horizontal, this); connect(buttons, &QDialogButtonBox::accepted, this, &AppearanceDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &AppearanceDialog::reject); connect(buttons->button(QDialogButtonBox::RestoreDefaults), &QPushButton::clicked, this, &AppearanceDialog::restoreDefaults); // Lay out dialog QFormLayout* colors_layout = new QFormLayout(colors_group); colors_layout->addRow(tr("Background:"), m_background); colors_layout->addRow(tr("Shadow:"), m_shadow); colors_layout->addRow(tr("Highlight:"), m_highlight); QVBoxLayout* options_layout = new QVBoxLayout(options_group); options_layout->addWidget(m_has_bevels); options_layout->addWidget(m_has_shadows); QGridLayout* layout = new QGridLayout(this); layout->setSpacing(12); layout->setColumnStretch(1, 1); layout->setRowStretch(2, 1); layout->addWidget(options_group, 0, 0); layout->addWidget(colors_group, 1, 0); layout->addWidget(m_preview, 0, 1, 3, 1); layout->addWidget(buttons, 4, 0, 1, 2); // Load settings const QSettings settings; m_background->setColor(settings.value("Colors/Background", QColor(0x9d, 0x89, 0x75)).value()); m_shadow->setColor(settings.value("Colors/Shadow", QColor(Qt::black)).value()); m_highlight->setColor(settings.value("Colors/Highlight", QColor(Qt::white)).value()); m_has_bevels->setChecked(settings.value("Appearance/Bevels", true).toBool()); m_has_shadows->setChecked(settings.value("Appearance/Shadows", true).toBool()); updatePreview(); } //----------------------------------------------------------------------------- bool AppearanceDialog::hasBevels() const { return m_has_bevels->isChecked(); } //----------------------------------------------------------------------------- bool AppearanceDialog::hasShadows() const { return m_has_shadows->isChecked(); } //----------------------------------------------------------------------------- QPalette AppearanceDialog::colors() const { QPalette palette; palette.setColor(QPalette::Base, m_background->color()); palette.setColor(QPalette::Text, m_shadow->color()); palette.setColor(QPalette::Highlight, m_highlight->color()); return palette; } //----------------------------------------------------------------------------- QPixmap AppearanceDialog::shadow(qreal pixelratio) { return coloredShadow(QSettings().value("Colors/Shadow", QColor(Qt::black)).value(), pixelratio); } //----------------------------------------------------------------------------- QPixmap AppearanceDialog::shadowSelected(qreal pixelratio) { return coloredShadow(QSettings().value("Colors/Highlight", QColor(Qt::white)).value(), pixelratio); } //----------------------------------------------------------------------------- void AppearanceDialog::accept() { QSettings settings; settings.setValue("Colors/Background", m_background->color().name()); settings.setValue("Colors/Shadow", m_shadow->color().name()); settings.setValue("Colors/Highlight", m_highlight->color().name()); settings.setValue("Appearance/Bevels", m_has_bevels->isChecked()); settings.setValue("Appearance/Shadows", m_has_shadows->isChecked()); QDialog::accept(); } //----------------------------------------------------------------------------- void AppearanceDialog::restoreDefaults() { m_background->setColor(QColor(0x9d, 0x89, 0x75)); m_shadow->setColor(Qt::black); m_highlight->setColor(Qt::white); m_has_bevels->setChecked(true); m_has_shadows->setChecked(true); updatePreview(); } //----------------------------------------------------------------------------- void AppearanceDialog::updatePreview() { const qreal pixelratio = devicePixelRatioF(); QPixmap bumpmap(512, 512); bumpmap.fill(QColor(128, 128, 128)); if (m_has_bevels->isChecked()) { QPainter painter(&bumpmap); painter.drawPixmap(0, 0, QPixmap(":/bumpmap.png")); } bumpmap = bumpmap.scaled(bumpmap.size() * pixelratio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); bumpmap.setDevicePixelRatio(pixelratio); QPixmap pixmap(352 * pixelratio, 256 * pixelratio); pixmap.setDevicePixelRatio(pixelratio); pixmap.fill(m_background->color()); { QPainter painter(&pixmap); // Draw example piece if (m_has_shadows->isChecked()) { QPixmap shadow = coloredShadow(m_shadow->color(), pixelratio); for (int i = 0; i < 3; ++i) { painter.drawPixmap(0, i * 64, shadow); } painter.drawPixmap(64, 64, shadow); } painter.drawPixmap(32, 32, bumpmap, 288 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(32, 96, bumpmap, 32 * pixelratio, 32 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(96, 96, bumpmap, 160 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(32, 160, bumpmap, 32 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); // Draw example highlighted piece painter.translate(160, 0); if (m_has_shadows->isChecked()) { QPixmap highlight = coloredShadow(m_highlight->color(), pixelratio); for (int i = 0; i < 3; ++i) { painter.drawPixmap(0, i * 64, highlight); } painter.drawPixmap(64, 64, highlight); } painter.drawPixmap(32, 32, bumpmap, 288 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(32, 96, bumpmap, 32 * pixelratio, 32 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(96, 96, bumpmap, 160 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); painter.drawPixmap(32, 160, bumpmap, 32 * pixelratio, 416 * pixelratio, 64 * pixelratio, 64 * pixelratio); } QPalette palette = m_preview->palette(); palette.setColor(m_preview->backgroundRole(), m_background->color()); m_preview->setPalette(palette); m_preview->setPixmap(pixmap); } //----------------------------------------------------------------------------- QPixmap AppearanceDialog::coloredShadow(const QColor& color, qreal pixelratio) { const QPixmap source(":/shadow.png"); QImage shadow(source.size(), QImage::Format_ARGB32_Premultiplied); QPainter painter(&shadow); painter.setCompositionMode(QPainter::CompositionMode_Source); painter.drawPixmap(0, 0, source); painter.setCompositionMode(QPainter::CompositionMode_SourceIn); painter.fillRect(shadow.rect(), color); painter.end(); QPixmap result = QPixmap::fromImage(shadow.scaled(shadow.size() * pixelratio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation), Qt::AvoidDither | Qt::AutoColor | Qt::NoOpaqueDetection); result.setDevicePixelRatio(pixelratio); return result; } //----------------------------------------------------------------------------- tetzle-3.0.3/src/appearance_dialog.h000066400000000000000000000043311476255537600174270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_APPEARANCE_DIALOG_H #define TETZLE_APPEARANCE_DIALOG_H class ColorButton; #include class QAbstractButton; class QCheckBox; class QLabel; /** * Dialog to set game appearance. */ class AppearanceDialog : public QDialog { Q_OBJECT public: /** * Construct a dialog to set game appearance. * * @param parent the parent widget of the dialog */ explicit AppearanceDialog(QWidget* parent = nullptr); /** * Fetch if pieces have bevels. * * @return @c true if pieces have bevels */ bool hasBevels() const; /** * Fetch if pieces have shadows. * * @return @c true if pieces have shadows */ bool hasShadows() const; /** * Fetch board colors. * * @return QPalette containing board colors */ QPalette colors() const; /** * Create shadow for unselected pieces. * * @param pixelratio the pixel ratio to render at * * @return QPixmap containing shadow image */ static QPixmap shadow(qreal pixelratio); /** * Create shadow for selected pieces. * * @param pixelratio the pixel ratio to render at * * @return QPixmap containing shadow image */ static QPixmap shadowSelected(qreal pixelratio); public Q_SLOTS: /** * Store game appearance. */ void accept() override; private Q_SLOTS: /** * Reset appearance back to default values. */ void restoreDefaults(); /** * Update the preview image to show chosen game appearance settings. */ void updatePreview(); private: /** * Create shadow for pieces. * * @param color the color of the shadow * @param pixelratio the pixel ratio to render at * * @return QPixmap containing shadow image */ static QPixmap coloredShadow(const QColor& color, qreal pixelratio); private: QCheckBox* m_has_bevels; ///< do pieces have bevels QCheckBox* m_has_shadows; ///< do pieces have shadows ColorButton* m_background; ///< background color for board ColorButton* m_shadow; ///< color of shadow for unselected pieces ColorButton* m_highlight; ///< color of shadow for selected pieces QLabel* m_preview; ///< preview of chosen game appearance settings }; #endif // TETZLE_APPEARANCE_DIALOG_H tetzle-3.0.3/src/board.cpp000066400000000000000000001016041476255537600154340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2025 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "board.h" #include "appearance_dialog.h" #include "edge_scroller.h" #include "generator.h" #include "message.h" #include "overview.h" #include "path.h" #include "piece.h" #include "tile.h" #include "zoom_slider.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- Board::Board(QWidget* parent) : QWidget(parent) , m_id(0) , m_load_bevels(true) , m_has_bevels(true) , m_has_shadows(true) , m_bevel_pixmap(":/bumpmap.png") , m_columns(0) , m_rows(0) , m_total_pieces(0) , m_completed(0) , m_pos(0, 0) , m_scale_level(-1) , m_scale(0) , m_scrolling(false) , m_selecting(false) , m_finished(false) , m_action_button(Qt::NoButton) , m_random(QRandomGenerator::securelySeeded()) { setFocusPolicy(Qt::StrongFocus); setFocus(); setMouseTracking(true); setAutoFillBackground(true); m_message = new Message(this); // Animate zooming to best fit m_zoom_timer = new QTimeLine(250, this); m_zoom_timer->setEasingCurve(QEasingCurve::Linear); m_zoom_timer->setFrameRange(0, 10); m_zoom_timer->setUpdateInterval(25); connect(m_zoom_timer, &QTimeLine::frameChanged, this, [this](int value) { zoom(value, false); }); // Create edge scrollers m_scroll_left = new EdgeScroller(1, 0, this); m_scroll_left->hide(); connect(m_scroll_left, &EdgeScroller::edgeScroll, this, &Board::edgeScroll); m_scroll_right = new EdgeScroller(-1, 0, this); m_scroll_right->hide(); connect(m_scroll_right, &EdgeScroller::edgeScroll, this, &Board::edgeScroll); m_scroll_up = new EdgeScroller(0, 1, this); m_scroll_up->hide(); connect(m_scroll_up, &EdgeScroller::edgeScroll, this, &Board::edgeScroll); m_scroll_down = new EdgeScroller(0, -1, this); m_scroll_down->hide(); connect(m_scroll_down, &EdgeScroller::edgeScroll, this, &Board::edgeScroll); QGridLayout* layout = new QGridLayout(this); layout->setColumnMinimumWidth(0, 16); layout->setColumnStretch(1, 1); layout->setColumnMinimumWidth(2, 16); layout->setRowMinimumHeight(0, 16); layout->setRowStretch(1, 1); layout->setRowMinimumHeight(2, 16); layout->setSpacing(0); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_scroll_left, 1, 0); layout->addWidget(m_scroll_right, 1, 2); layout->addWidget(m_scroll_up, 0, 1); layout->addWidget(m_scroll_down, 2, 1); // Create overview dialog m_overview = new Overview(parent); connect(m_overview, &Overview::toggled, this, &Board::overviewToggled); // Load colors AppearanceDialog dialog; dialog.accept(); setAppearance(dialog); } //----------------------------------------------------------------------------- Board::~Board() { cleanup(); delete m_message; } //----------------------------------------------------------------------------- Piece* Board::findCollidingPiece(const Piece* piece) const { for (int i = m_pieces.count() - 1; i >= 0; --i) { Piece* other = m_pieces.at(i); if (other != piece && piece->collidesWith(other)) { return other; } } return nullptr; } //----------------------------------------------------------------------------- void Board::removePiece(Piece* piece) { m_pieces.removeAll(piece); delete piece; piece = nullptr; } //----------------------------------------------------------------------------- void Board::setAppearance(const AppearanceDialog& dialog) { m_has_bevels = dialog.hasBevels(); m_has_shadows = dialog.hasShadows(); QPalette palette = dialog.colors(); palette.setColor(backgroundRole(), palette.color(QPalette::Base).darker(150)); setPalette(palette); for (Piece* piece : std::as_const(m_pieces)) { piece->setSelected(piece->isSelected()); } const qreal pixelratio = devicePixelRatioF(); m_shadow_pixmap = dialog.shadow(pixelratio); m_selected_shadow_pixmap = dialog.shadowSelected(pixelratio); } //----------------------------------------------------------------------------- void Board::updateSceneRectangle(const Piece* piece) { const int size = Tile::size / 2; m_scene = m_scene.united(piece->boundingRect().adjusted(-size, -size, size, size)); updateViewport(); } //----------------------------------------------------------------------------- void Board::newGame(const QString& image, int difficulty) { // Remove any previous textures and tiles cleanup(); zoom(0, false); // Prevent starting a game with a missing image if (!QFileInfo::exists(Path::image(image))) { QMessageBox::warning(this, tr("Error"), tr("Missing image.")); return; } // Update player about status Q_EMIT completionChanged(0); QApplication::setOverrideCursor(Qt::WaitCursor); m_message->setText(tr("Please Wait")); m_message->setVisible(true); QCoreApplication::processEvents(); // Generate ID m_id = 0; const QStringList files = QDir(Path::saves()).entryList(QDir::Files); for (const QString& file : files) { m_id = std::max(m_id, file.section(".", 0, 0).toInt()); } m_id++; // Find puzzle dimensions const QSizeF size = QImageReader(Path::image(image)).size(); if (size.width() > size.height()) { m_columns = 4 * difficulty; m_rows = std::max(std::lround(m_columns * size.height() / size.width()), 1L); } else { m_rows = 4 * difficulty; m_columns = std::max(std::lround(m_rows * size.width() / size.height()), 1L); } m_total_pieces = (m_columns * m_rows) / 4; // Create textures updateStatusMessage(tr("Loading image...")); m_image_path = image; m_load_bevels = true; loadImage(); // Generate puzzle updateStatusMessage(tr("Generating puzzle...")); const Generator generator(m_columns, m_rows, m_random); QList> pieces = generator.pieces(); std::shuffle(pieces.begin(), pieces.end(), m_random); updateStatusMessage(tr("Creating pieces...")); const int count = pieces.count(); const int step = (count > 25) ? (count / 25) : 1; for (int i = 0; i < count; ++i) { // Create piece Piece* piece = new Piece(QPoint(0, 0), randomInt(4), pieces.at(i), this); m_pieces.append(piece); piece->setPosition(m_pos - QRect(QPoint(0,0), piece->boundingRect().size()).center()); piece->pushCollidingPieces(); // Show pieces if ((i % step) == 0) { m_pos = m_scene.center(); update(); updateStatusMessage(tr("Creating pieces...")); } } for (Piece* piece : std::as_const(m_pieces)) { piece->findSolutionNeighbors(m_pieces); } Q_EMIT clearMessage(); // Draw tiles m_message->setVisible(false); zoomFit(); QApplication::restoreOverrideCursor(); updateCompleted(); Q_EMIT retrievePiecesAvailable(true); } //----------------------------------------------------------------------------- void Board::openGame(int id) { // Remove any previous textures and tiles cleanup(); // Update player about status Q_EMIT completionChanged(0); QApplication::setOverrideCursor(Qt::WaitCursor); m_message->setText(tr("Please Wait")); m_message->setVisible(true); QCoreApplication::processEvents(); // Open saved game file QFile file(Path::save(id)); if (!file.open(QIODevice::ReadOnly)) { return; } m_id = id; QXmlStreamReader xml(&file); // Load puzzle details updateStatusMessage(tr("Loading puzzle...")); while (!xml.isStartElement()) { xml.readNext(); } QXmlStreamAttributes attributes = xml.attributes(); int board_zoom = 0; QRect rect; const unsigned int version = attributes.value("version").toUInt(); if (xml.name() == QLatin1String("tetzle") && version <= 5) { m_image_path = attributes.value("image").toString(); if (!QFileInfo::exists(Path::image(m_image_path))) { QApplication::restoreOverrideCursor(); QMessageBox::warning(this, tr("Error"), tr("Missing image.")); cleanup(); return; } board_zoom = attributes.value("zoom").toInt(); m_pos.setX(attributes.value("x").toInt()); m_pos.setY(attributes.value("y").toInt()); const QStringList values = attributes.value("rect").toString().split(","); rect.setRect(values.value(0).toInt(), values.value(1).toInt(), values.value(2).toInt(), values.value(3).toInt()); } else { xml.raiseError(tr("Unknown data format")); } // Load pieces updateStatusMessage(tr("Loading pieces...")); QPoint pos; int rotation = -1; QList tiles; bool piece = (version > 3); m_load_bevels = false; while (!xml.atEnd()) { xml.readNext(); if (xml.isEndElement() && (xml.name() == QLatin1String("piece") || xml.name() == QLatin1String("group"))) { m_pieces.append(new Piece(pos, rotation, tiles, this)); tiles.clear(); } if (!xml.isStartElement()) { continue; } if (xml.name() == QLatin1String("tile")) { attributes = xml.attributes(); if (!piece) { piece = true; pos = QPoint(attributes.value("x").toInt(), attributes.value("y").toInt()); rotation = (rotation != -1) ? rotation : attributes.value("rotation").toInt(); } const int column = attributes.value("column").toInt(); m_columns = std::max(m_columns, column); const int row = attributes.value("row").toInt(); m_rows = std::max(m_rows, row); // Old games converted to new games won't have bevels const int bevel = attributes.value("bevel").toInt(); if (bevel) { m_load_bevels = true; } Tile* tile = new Tile(column, row); tile->setBevel(bevel); tiles.append(tile); } else if (xml.name() == QLatin1String("piece")) { attributes = xml.attributes(); pos = QPoint(attributes.value("x").toInt(), attributes.value("y").toInt()); rotation = attributes.value("rotation").toInt(); } else if (xml.name() == QLatin1String("group")) { piece = false; const QStringView r = xml.attributes().value("rotation"); rotation = !r.isEmpty() ? r.toInt() : -1; } else if (xml.name() != QLatin1String("overview")) { xml.raiseError(tr("Unknown element '%1'").arg(xml.name().toString())); } } if (xml.hasError()) { QApplication::restoreOverrideCursor(); QMessageBox::warning(this, tr("Error"), tr("Error parsing XML file.\n\n%1").arg(xml.errorString())); cleanup(); return; } m_total_pieces = (++m_columns * ++m_rows) / 4; for (Piece* piece : std::as_const(m_pieces)) { piece->findSolutionNeighbors(m_pieces); } // Load image updateStatusMessage(tr("Loading image...")); loadImage(); Q_EMIT clearMessage(); // Load scene rectangle updateSceneRectangle(); if (rect.contains(m_scene)) { m_scene = rect; } updateViewport(); // Draw tiles m_message->setVisible(false); if (version > 3) { zoom(board_zoom, false); } else { zoom(0, false); retrievePieces(); } QApplication::restoreOverrideCursor(); updateCompleted(); Q_EMIT retrievePiecesAvailable(true); } //----------------------------------------------------------------------------- void Board::saveGame() const { if (pieceCount() <= 1) { return; } QFile file(Path::save(m_id)); if (!file.open(QIODevice::WriteOnly)) { return; } QXmlStreamWriter xml(&file); xml.setAutoFormatting(true); xml.writeStartDocument(); xml.writeStartElement("tetzle"); xml.writeAttribute("version", "5"); xml.writeAttribute("image", m_image_path); xml.writeAttribute("pieces", QString::number(m_total_pieces)); xml.writeAttribute("complete", QString::number(m_completed)); xml.writeAttribute("zoom", QString::number(m_scale_level)); xml.writeAttribute("x", QString::number(m_pos.x())); xml.writeAttribute("y", QString::number(m_pos.y())); xml.writeAttribute("rect", QString("%1,%2,%3,%4") .arg(m_scene.x()) .arg(m_scene.y()) .arg(m_scene.width()) .arg(m_scene.height())); for (const Piece* piece : std::as_const(m_pieces)) { piece->save(xml); } for (const Piece* piece : std::as_const(m_selected_pieces)) { piece->save(xml); } for (const Piece* piece : std::as_const(m_active_pieces)) { piece->save(xml); } xml.writeEndElement(); xml.writeEndDocument(); QSettings().setValue("Overview/Visible", m_overview->isVisible()); } //----------------------------------------------------------------------------- void Board::retrievePieces() { // Inform user this will take awhile updateStatusMessage(tr("Retrieving pieces...")); QApplication::setOverrideCursor(Qt::WaitCursor); QCoreApplication::processEvents(); // Make sure all pieces are free QList pieces = m_pieces + m_active_pieces + m_selected_pieces; m_pieces.clear(); m_active_pieces.clear(); m_selected_pieces.clear(); // Clear view while retrieving pieces m_pos = QPoint(0,0); m_scene = QRect(0,0,0,0); // Move all pieces to center of view std::shuffle(pieces.begin(), pieces.end(), m_random); for (Piece* piece : std::as_const(pieces)) { m_pieces.append(piece); piece->setPosition(m_pos - QRect(QPoint(0,0), piece->boundingRect().size()).center()); piece->setSelected(false); piece->pushCollidingPieces(); } // Update view zoomFit(); // Clear message and cursor Q_EMIT clearMessage(); QApplication::restoreOverrideCursor(); } //----------------------------------------------------------------------------- void Board::zoomIn() { zoom(m_scale_level + 1, true); } //----------------------------------------------------------------------------- void Board::zoomOut() { zoom(m_scale_level - 1, true); } //----------------------------------------------------------------------------- void Board::zoomFit() { // Find new scale level const float sx = static_cast(width()) / static_cast(m_scene.width()); const float sy = static_cast(height()) / static_cast(m_scene.height()); const float factor = std::clamp(std::min(sx, sy), 0.0f, 1.0f); int level = 0; for (int i = ZoomSlider::maxScaleLevel(); i >= 0; --i) { if (ZoomSlider::scaleFactor(i) <= factor) { level = i; break; } } m_pos = m_scene.center(); if (m_scale_level == level) { updateViewport(); update(); return; } // Animate zoom const int count = abs(level - m_scale_level); if (level > m_scale_level) { m_zoom_timer->setDirection(QTimeLine::Forward); m_zoom_timer->setFrameRange(m_scale_level, level); } else { m_zoom_timer->setDirection(QTimeLine::Backward); m_zoom_timer->setFrameRange(level, m_scale_level); } m_zoom_timer->setDuration(count * m_zoom_timer->updateInterval()); m_zoom_timer->start(); } //----------------------------------------------------------------------------- void Board::zoom(int level, bool on_cursor) { level = std::clamp(level, 0, ZoomSlider::maxScaleLevel()); if (level == m_scale_level) { return; } // Find cursor position const QPoint cursor_pos = mapFromGlobal(QCursor::pos()); const QPoint old_pos = mapPosition(cursor_pos); // Calculate new scale value m_scale_level = level; m_scale = ZoomSlider::scaleFactor(m_scale_level); // Center zoom on cursor if (on_cursor && rect().contains(cursor_pos)) { m_pos += old_pos - mapPosition(cursor_pos); } // Update scene updateViewport(); update(); updateCursor(); Q_EMIT zoomChanged(m_scale_level); } //----------------------------------------------------------------------------- void Board::toggleOverview() { const bool visible = !m_overview->isVisible(); m_overview->setVisible(visible); if (visible) { activateWindow(); } QSettings().setValue("Overview/Visible", visible); } //----------------------------------------------------------------------------- #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) bool Board::event(QEvent* event) { if (event->type() == QEvent::DevicePixelRatioChange) { loadImage(); for (Piece* piece : std::as_const(m_pieces)) { piece->setPosition(piece->scenePos()); } } return QWidget::event(event); } #endif //----------------------------------------------------------------------------- void Board::enterEvent(QEnterEvent* event) { m_cursor_pos = event->position().toPoint(); updateCursor(); QWidget::enterEvent(event); } //----------------------------------------------------------------------------- void Board::paintEvent(QPaintEvent*) { QPainter painter(this); painter.setRenderHint(QPainter::SmoothPixmapTransform); // Transform viewport painter.save(); painter.setTransform(m_viewport_transform); // Draw scene rectangle QColor fill = palette().color(QPalette::Base); QColor border = fill.lighter(125); if (m_scene.isValid()) { drawRect(painter, m_scene, fill, border); } // Draw pieces if (!m_pixmap.isNull()) { FragmentList bevel; FragmentList shadow; FragmentList tiles; const int total_tiles = m_columns * m_rows; bevel.reserve(total_tiles); shadow.reserve(total_tiles); tiles.reserve(total_tiles); for (const Piece* piece : std::as_const(m_pieces)) { const QRect r = m_viewport_transform.mapRect(piece->boundingRect()); if (m_viewport.intersects(r)) { shadow.append(piece->shadow()); tiles.append(piece->tiles()); bevel.append(piece->bevel()); } } if (m_has_shadows) { shadow.draw(painter, m_shadow_pixmap); } tiles.draw(painter, m_pixmap, QPainter::OpaqueHint); if (m_has_bevels && m_load_bevels) { bevel.draw(painter, m_bevel_pixmap); } for (const Piece* piece : std::as_const(m_selected_pieces)) { if (m_has_shadows) { piece->shadow().draw(painter, m_selected_shadow_pixmap); } piece->tiles().draw(painter, m_pixmap, QPainter::OpaqueHint); if (m_has_bevels && m_load_bevels) { piece->bevel().draw(painter, m_bevel_pixmap); } } for (const Piece* piece : std::as_const(m_active_pieces)) { if (m_has_shadows) { piece->shadow().draw(painter, m_selected_shadow_pixmap); } piece->tiles().draw(painter, m_pixmap, QPainter::OpaqueHint); if (m_has_bevels && m_load_bevels) { piece->bevel().draw(painter, m_bevel_pixmap); } } } // Untransform viewport painter.restore(); // Draw selection rectangle if (m_selecting) { fill = border = palette().color(QPalette::Highlight); fill.setAlpha(48); drawRect(painter, m_selection, fill, border); } // Draw message m_message->draw(painter); } //----------------------------------------------------------------------------- void Board::keyPressEvent(QKeyEvent* event) { const int offset = (event->modifiers() & Qt::ControlModifier) ? 1 : 10; switch (event->key()) { // Scroll left case Qt::Key_Left: scroll(QPoint(2 * offset, 0)); attachActivePiece(); update(); updateCursor(); break; // Scroll up case Qt::Key_Up: scroll(QPoint(0, 2 * offset)); attachActivePiece(); update(); updateCursor(); break; // Scroll right case Qt::Key_Right: scroll(QPoint(-2 * offset, 0)); attachActivePiece(); update(); updateCursor(); break; // Scroll down case Qt::Key_Down: scroll(QPoint(0, -2 * offset)); attachActivePiece(); update(); updateCursor(); break; // Grab or release piece case Qt::Key_Space: togglePiecesUnderCursor(); break; // Rotate piece case Qt::Key_R: rotatePiece(); break; // Move cursor up case Qt::Key_W: moveCursor(QPoint(0, -offset)); break; // Move cursor left case Qt::Key_A: moveCursor(QPoint(-offset, 0)); break; // Move cursor down case Qt::Key_S: moveCursor(QPoint(0, offset)); break; // Move cursor right case Qt::Key_D: moveCursor(QPoint(offset, 0)); break; default: break; } QWidget::keyPressEvent(event); } //----------------------------------------------------------------------------- void Board::mousePressEvent(QMouseEvent* event) { if (m_finished || m_action_button != Qt::NoButton) { return; } m_action_button = event->button(); if (m_action_button == Qt::MiddleButton || (m_action_button == Qt::LeftButton && QGuiApplication::keyboardModifiers() == Qt::ShiftModifier)) { startScrolling(); } else if (m_action_button == Qt::LeftButton) { m_select_pos = event->position().toPoint(); } QWidget::mousePressEvent(event); } //----------------------------------------------------------------------------- void Board::mouseReleaseEvent(QMouseEvent* event) { if (m_finished || event->button() != m_action_button) { return; } switch (m_action_button) { case Qt::LeftButton: togglePiecesUnderCursor(); if (m_scrolling) { stopScrolling(); } break; case Qt::RightButton: rotatePiece(); break; case Qt::MiddleButton: stopScrolling(); break; default: break; } m_action_button = Qt::NoButton; QWidget::mouseReleaseEvent(event); } //----------------------------------------------------------------------------- void Board::mouseMoveEvent(QMouseEvent* event) { const QPoint delta = (event->position().toPoint() / m_scale) - (m_cursor_pos / m_scale); m_cursor_pos = event->position().toPoint(); if (m_action_button == Qt::LeftButton) { const Qt::KeyboardModifiers modifiers = QGuiApplication::keyboardModifiers(); // Scroll board if only shift is pressed if (!m_scrolling && modifiers == Qt::ShiftModifier) { startScrolling(); } else if (m_scrolling && modifiers != Qt::ShiftModifier) { stopScrolling(); m_select_pos = m_cursor_pos; } // Select pieces if no keyboard modifiers are pressed if (!m_selecting && modifiers == Qt::NoModifier) { m_selecting = QVector2D(m_cursor_pos - m_select_pos).length() >= QApplication::startDragDistance(); } else if (m_selecting && modifiers != Qt::NoModifier) { m_selecting = false; for (Piece* piece : std::as_const(m_selected_pieces)) { piece->setSelected(false); } m_pieces += m_selected_pieces; m_selected_pieces.clear(); } } if (m_scrolling) { scroll(delta); } if (!m_active_pieces.isEmpty()) { // Move active pieces for (Piece* piece : std::as_const(m_active_pieces)) { piece->moveBy(delta); } attachActivePiece(); } if (m_selecting) { const QRect rect = QRect(mapPosition(m_cursor_pos), mapPosition(m_select_pos)).normalized(); // Check for pieces that are now selected for (int i = 0; i < m_pieces.count(); ++i) { Piece* piece = m_pieces.at(i); if (rect.intersects(piece->boundingRect())) { piece->setSelected(true); m_selected_pieces += m_pieces.takeAt(i); i--; } } // Check for pieces that are no longer selected for (int i = 0; i < m_selected_pieces.count(); ++i) { Piece* piece = m_selected_pieces.at(i); if (!rect.intersects(piece->boundingRect())) { piece->setSelected(false); m_pieces += m_selected_pieces.takeAt(i); i--; } } m_selection = QRect(m_cursor_pos, m_select_pos).normalized(); } update(); updateCursor(); } //----------------------------------------------------------------------------- void Board::resizeEvent(QResizeEvent* event) { updateViewport(); QWidget::resizeEvent(event); } //----------------------------------------------------------------------------- void Board::wheelEvent(QWheelEvent* event) { if (event->angleDelta().y() > 0) { zoomIn(); } else { zoomOut(); } QWidget::wheelEvent(event); } //----------------------------------------------------------------------------- void Board::edgeScroll(int horizontal, int vertical) { scroll(QPoint((5 * horizontal) / m_scale, (5 * vertical) / m_scale)); attachActivePiece(); update(); } //----------------------------------------------------------------------------- void Board::startScrolling() { m_scrolling = true; updateCursor(); } //----------------------------------------------------------------------------- void Board::stopScrolling() { m_scrolling = false; updateCursor(); } //----------------------------------------------------------------------------- void Board::scroll(const QPoint& delta) { m_pos -= delta; for (Piece* piece : std::as_const(m_active_pieces)) { piece->moveBy(-delta); } updateViewport(); } //----------------------------------------------------------------------------- void Board::attachActivePiece() { // Attach neighbors if only one piece is active if (m_active_pieces.count() == 1) { m_active_pieces.first()->attachSolutionNeighbors(); updateCompleted(); } // Handle finishing game if (pieceCount() == 1) { finishGame(); } } //----------------------------------------------------------------------------- void Board::togglePiecesUnderCursor() { switch (QGuiApplication::keyboardModifiers()) { case Qt::NoModifier: if (!m_selecting) { if (pieceUnderCursor()) { grabPiece(); } else { releasePieces(); } } else { selectPieces(); } break; #if !defined(Q_OS_MAC) case Qt::ControlModifier: #else case Qt::MetaModifier: #endif rotatePiece(); break; default: break; } } //----------------------------------------------------------------------------- void Board::moveCursor(const QPoint& delta) { QCursor::setPos(cursor().pos() + delta); updateCursor(); } //----------------------------------------------------------------------------- void Board::grabPiece() { if (m_scrolling || m_finished) { return; } Piece* piece = pieceUnderCursor(); if (!piece) { return; } m_active_pieces.append(piece); m_pieces.removeAll(piece); piece->setSelected(true); updateCursor(); update(); } //----------------------------------------------------------------------------- void Board::releasePieces() { if (m_scrolling || m_finished) { return; } // Inform user this may take awhile updateStatusMessage(tr("Placing pieces...")); QApplication::setOverrideCursor(Qt::WaitCursor); QCoreApplication::processEvents(); // Attach to closest piece if (m_active_pieces.count() == 1) { m_active_pieces.first()->attachSolutionNeighbors(); updateCompleted(); } // Place pieces for (Piece* piece : std::as_const(m_active_pieces)) { m_pieces.append(piece); piece->setSelected(false); piece->pushCollidingPieces(); } m_active_pieces.clear(); updateCursor(); updateCompleted(); // Clear message and cursor Q_EMIT clearMessage(); QApplication::restoreOverrideCursor(); // Check if game is over if (pieceCount() == 1) { finishGame(); } else { update(); } } //----------------------------------------------------------------------------- void Board::rotatePiece() { if (m_scrolling || m_finished) { return; } if (m_active_pieces.isEmpty()) { Piece* piece = pieceUnderCursor(); if (!piece) { return; } piece->rotate(mapCursorPosition()); piece->attachSolutionNeighbors(); piece->pushCollidingPieces(); } else { for (Piece* piece : std::as_const(m_active_pieces)) { piece->rotate(mapCursorPosition()); } } updateCompleted(); if (pieceCount() == 1) { finishGame(); } update(); } //----------------------------------------------------------------------------- void Board::selectPieces() { m_selecting = false; const QPoint cursor = mapCursorPosition(); for (Piece* piece : std::as_const(m_selected_pieces)) { if (!piece->contains(cursor)) { piece->moveBy(cursor - piece->randomPoint()); } } m_active_pieces += m_selected_pieces; m_selected_pieces.clear(); update(); updateCursor(); } //----------------------------------------------------------------------------- void Board::drawRect(QPainter& painter, const QRect& rect, const QColor& fill, const QColor& border) const { painter.save(); painter.setPen(QPen(border, 0)); painter.setBrush(fill); painter.drawRect(rect); painter.restore(); } //----------------------------------------------------------------------------- void Board::loadImage() { // Record currently open image QSettings settings; settings.setValue("OpenGame/Image", m_image_path); // Load puzzle image if (!m_overview->isVisible() && settings.value("Overview/Visible", true).toBool()) { m_overview->show(); m_overview->repaint(); activateWindow(); } QImageReader source(Path::image(m_image_path)); // Set pixmap fragments to match device pixel ratio for high DPI rendering const qreal pixelratio = devicePixelRatioF(); FragmentList::setDevicePixelRatio(pixelratio); // Create bevel texture m_bevel_pixmap = QPixmap(":/bumpmap.png"); m_bevel_pixmap = m_bevel_pixmap.scaled(m_bevel_pixmap.size() * pixelratio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); m_bevel_pixmap.setDevicePixelRatio(pixelratio); // Create shadow textures m_shadow_pixmap = AppearanceDialog::shadow(pixelratio); m_selected_shadow_pixmap = AppearanceDialog::shadowSelected(pixelratio); // Create puzzle texture const QSize size(m_columns * Tile::size * pixelratio, m_rows * Tile::size * pixelratio); QSize scaled_size = source.size(); scaled_size.scale(size, Qt::KeepAspectRatioByExpanding); source.setScaledSize(scaled_size); source.setScaledClipRect(QRect((scaled_size.width() - size.width()) / 2, (scaled_size.height() - size.height()) / 2, size.width(), size.height())); const QImage image = source.read(); m_pixmap = QPixmap(image.width(), image.height()); m_pixmap.fill(Qt::darkGray); { QPainter painter(&m_pixmap); painter.drawImage(0, 0, image, 0, 0, image.width(), image.height(), Qt::AutoColor | Qt::AvoidDither); } m_pixmap.setDevicePixelRatio(pixelratio); // Create overview m_overview->load(image, pixelratio); } //----------------------------------------------------------------------------- void Board::updateCursor() { if (m_scrolling) { setCursor(Qt::SizeAllCursor); return; } int state = 0; if (!m_finished) { state = (pieceUnderCursor() || m_selecting) | (!m_active_pieces.isEmpty() * 2); } switch (state) { case 1: setCursor(Qt::OpenHandCursor); break; case 2: setCursor(Qt::ClosedHandCursor); break; case 3: setCursor(Qt::PointingHandCursor); break; default: unsetCursor(); break; } } //----------------------------------------------------------------------------- QPoint Board::mapCursorPosition() const { return mapPosition(m_cursor_pos); } //----------------------------------------------------------------------------- QPoint Board::mapPosition(const QPoint& position) const { return (position / m_scale) - (QPoint(width() >> 1, height() >> 1) / m_scale) + m_pos; } //----------------------------------------------------------------------------- void Board::updateCompleted() { const int pieces = 100 * (pieceCount() - 1); const int total = m_total_pieces - 1; m_completed = 100 - (pieces / total); Q_EMIT completionChanged(m_completed); } //----------------------------------------------------------------------------- void Board::updateSceneRectangle() { m_scene = QRect(0,0,0,0); for (const Piece* piece : std::as_const(m_pieces)) { updateSceneRectangle(piece); } } //----------------------------------------------------------------------------- void Board::updateStatusMessage(const QString& message) { Q_EMIT showMessage(message); QCoreApplication::processEvents(); } //----------------------------------------------------------------------------- void Board::updateViewport() { m_viewport = rect(); m_viewport_transform.reset(); m_viewport_transform.scale(m_scale, m_scale); m_viewport_transform.translate(std::lround((width() / (2 * m_scale)) - m_pos.x()), std::lround((height() / (2 * m_scale)) - m_pos.y())); const QRect scene = m_scene.width() ? m_viewport_transform.mapRect(m_scene) : m_viewport.adjusted(2, 2, -4, -4); m_scroll_left->setVisible((scene.left() - 2) < m_viewport.left()); m_scroll_right->setVisible((scene.right() + 2) > m_viewport.right()); m_scroll_up->setVisible((scene.top() - 2) < m_viewport.top()); m_scroll_down->setVisible((scene.bottom() + 2) > m_viewport.bottom()); } //----------------------------------------------------------------------------- Piece* Board::pieceUnderCursor() const { const QPoint pos = mapCursorPosition(); for (int i = m_pieces.count() - 1; i >= 0; --i) { Piece* piece = m_pieces.at(i); if (piece->contains(pos)) { return piece; } } return nullptr; } //----------------------------------------------------------------------------- int Board::pieceCount() const { return m_pieces.count() + m_active_pieces.count() + m_selected_pieces.count(); } //----------------------------------------------------------------------------- void Board::finishGame() { m_finished = true; // Drop remaining piece if (!m_active_pieces.isEmpty()) { m_pieces.append(m_active_pieces.first()); } m_active_pieces.clear(); // Rotate completed board to face up Piece* piece = m_pieces.first(); if (piece->rotation() > 0) { for (int i = piece->rotation(); i < 4; ++i) { piece->rotate(); } } piece->setSelected(false); // Hide scene rectangle m_scene = piece->boundingRect().adjusted(1,1,-2,-2); m_overview->hide(); unsetCursor(); zoomFit(); Q_EMIT retrievePiecesAvailable(false); QFile::remove(Path::save(m_id)); QSettings().remove("OpenGame"); m_id = 0; Q_EMIT finished(); m_message->setText(tr("Success")); m_message->setVisible(true, false); } //----------------------------------------------------------------------------- void Board::cleanup() { m_pixmap = QPixmap(); Q_EMIT clearMessage(); m_overview->reset(); m_message->setVisible(false); qDeleteAll(m_active_pieces); m_active_pieces.clear(); qDeleteAll(m_selected_pieces); m_selected_pieces.clear(); qDeleteAll(m_pieces); m_pieces.clear(); m_completed = 0; m_id = 0; m_columns = 0; m_rows = 0; m_scale_level = -1; m_scene = QRect(0,0,0,0); m_scrolling = false; m_pos = QPoint(0, 0); m_finished = false; QSettings().remove("OpenGame"); m_scroll_left->hide(); m_scroll_right->hide(); m_scroll_up->hide(); m_scroll_down->hide(); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/board.h000066400000000000000000000253061476255537600151050ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2025 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_BOARD_H #define TETZLE_BOARD_H class AppearanceDialog; class EdgeScroller; class Message; class Overview; class Piece; class Tile; #include #include #include class QTimeLine; /** * Main class for a game. It manages the pieces, rendering, and player interaction. */ class Board : public QWidget { Q_OBJECT public: /** * Construct a board widget. * * @param parent the parent widget of the board */ explicit Board(QWidget* parent = nullptr); /** * Clean up board. */ ~Board(); /** * Find a colliding piece. * * @param piece the piece to check for collisions * * @return the first piece to collide, or @c nullptr if there are none */ Piece* findCollidingPiece(const Piece* piece) const; /** * Remove a piece from the board. * * @param piece the piece to remove */ void removePiece(Piece* piece); /** * Fetch current game identifier. * * @return the current game identifier */ int id() const { return m_id; } /** * Fetch a random integer. * * @param max the first integer outside the range of possible results * * @return random integer */ int randomInt(int max) { return m_random.bounded(max); } /** * Set the appearance of the game board. * * @param dialog the dialog containing the new appearance settings */ void setAppearance(const AppearanceDialog& dialog); /** * Expand the scene rectangle to encompass piece. * * @param piece the piece to include in scene rectangle */ void updateSceneRectangle(const Piece* piece); public Q_SLOTS: /** * Start a new game. This will reset the board and generate a new puzzle. * * @param image the image to use on the pieces * @param difficulty how many pieces to generate */ void newGame(const QString& image, int difficulty); /** * Start a previous game. This will reset the board and load the * contents of the saved game. * * @param id the game to start */ void openGame(int id); /** * Save the current game, if started and not already finished. */ void saveGame() const; /** * Grab all pieces and drop them on top of each other, * then push them apart to prevent overlapping pieces. */ void retrievePieces(); /** * Increase the visible size of the pieces. */ void zoomIn(); /** * Decrease the visible size of the pieces. */ void zoomOut(); /** * Find the zoom level which will show all pieces on the board, * then animate to that zoom level. */ void zoomFit(); /** * Set the visible size of the pieces. * * @param level the zoom level to use * @param on_cursor @c true if it should center on the mouse cursor */ void zoom(int level, bool on_cursor); /** * Toggle if the overview is visible. */ void toggleOverview(); Q_SIGNALS: /** * Signal that the player has completed more of the puzzle. * It is represented as an integer in the range 0-100. * * @param value how far the player is through the puzzle */ void completionChanged(int value); /** * Signal that the overview has been toggled. * * @param visible @c true if the overview is visible */ void overviewToggled(bool visible); /** * Signal that the player is able to retrieve all pieces. * * @param available @c true if the player can retrieve all pieces */ void retrievePiecesAvailable(bool available); /** * Signal to show a statusbar message. If @a timeout is @c 0 it does not hide. * * @param message the text to show the player * @param timeout how long in milliseconds before the text hides */ void showMessage(const QString& message, int timeout = 0); /** * Signal to clear the statusbar message. */ void clearMessage(); /** * Signal that the zoom level has changed. * * @param level the level of zoom */ void zoomChanged(int level); /** * Signal that the player has completed the puzzle. */ void finished(); protected: #if QT_VERSION >= QT_VERSION_CHECK(6, 6, 0) /** * Handle device pixel change. Reloads the image and shadows, * and reloads the piece fragment lists for drawing at a new resolution. */ bool event(QEvent* event) override; #endif /** * Track cursor position when mouse enters game board, * allowing for keyboard-only play after that. */ void enterEvent(QEnterEvent* event) override; /** * Draw the game board. */ void paintEvent(QPaintEvent*) override; /** * Handle player input. Allows players to move game board, * as well as select, pick up, drop, or rotate pieces. */ void keyPressEvent(QKeyEvent* event) override; /** * Handle player input. Allows players to move game board, * as well as select, pick up, drop, or rotate pieces. */ void mousePressEvent(QMouseEvent* event) override; /** * Handle player input. Allows players to move game board, * as well as select, pick up, drop, or rotate pieces. */ void mouseReleaseEvent(QMouseEvent* event) override; /** * Handle player input. Allows players to move game board, * move held pieces, or to resize a selection rectangle. */ void mouseMoveEvent(QMouseEvent* event) override; /** * Update the viewport for the new window size. */ void resizeEvent(QResizeEvent* event) override; /** * Handle player input. Allows players to zoom board by scrolling. */ void wheelEvent(QWheelEvent* event) override; private Q_SLOTS: /** * Handle player scrolling board by its edges. * * @param horizontal negative scrolls left, positive scrolls right * @param vertical negative scrolls up, positive scrolls down */ void edgeScroll(int horizontal, int vertical); private: /** * Start scrolling the play area. */ void startScrolling(); /** * Stop scrolling the play area. */ void stopScrolling(); /** * Scroll the play area. * * @param delta how far to scroll */ void scroll(const QPoint& delta); /** * Attempt to attach active piece to neighboring pieces in solution. */ void attachActivePiece(); /** * Handle player interacting with pieces. It grabs, releases, or rotates the pieces. */ void togglePiecesUnderCursor(); /** * Move the mouse cursor. * * @param delta how far to move the mouse cursor * * @note Does not work in Wayland. */ void moveCursor(const QPoint& delta); /** * Pick up the piece under the mouse cursor. */ void grabPiece(); /** * Put down the held pieces. */ void releasePieces(); /** * Rotate the held pieces. */ void rotatePiece(); /** * Select the pieces under the mouse cursor or in the selection rectangle. */ void selectPieces(); /** * Draw a rectangle. * * @param painter the painter to use for drawing * @param rect the rectangle to draw * @param fill the fill of the rectangle * @param border the border of the rectangle */ void drawRect(QPainter& painter, const QRect& rect, const QColor& fill, const QColor& border) const; /** * Load the image for the puzzle, as well as the bevel and shadows. */ void loadImage(); /** * Change the mouse cursor depending on if it is over a piece. * If the player is already holding pieces, it uses a different * cursor to show that they can pick up another piece. */ void updateCursor(); /** * Map the cursor position to scene coordinates. * * @return QPoint of mapped cursor position */ QPoint mapCursorPosition() const; /** * Map a position to scene coordinates. * * @param position the position to map * * @return QPoint of mapped position */ QPoint mapPosition(const QPoint& position) const; /** * Determine how far the player is through the puzzle. */ void updateCompleted(); /** * Find the smallest scene rectangle which encompasses all pieces. */ void updateSceneRectangle(); /** * Change the statusbar message. * * @param message the text to show the player */ void updateStatusMessage(const QString& message); /** * Calculate the transformation of the play area by the current * zoom scale factor. Also handles enabling or disabling edge * scrolling based on the scene rectangle. */ void updateViewport(); /** * Return piece under mouse cursor. * * @return piece under mouse cursor, or @c nullptr if there are none */ Piece* pieceUnderCursor() const; /** * Fetch how many pieces there are total (decreases when pieces are attached). * * @return how many pieces there are total */ int pieceCount() const; /** * Process finishing a game. Drops the currently held piece, * rotates it to be upright, and then zooms in on it. */ void finishGame(); /** * Reset the board to an empty state. Deletes all pieces. */ void cleanup(); private: int m_id; ///< the current save game identifier bool m_load_bevels; ///< does the current game support bevels QString m_image_path; ///< the location of the image for the current puzzle Overview* m_overview; ///< the overview widget Message* m_message; ///< the message overlay widget bool m_has_bevels; ///< are bevels shown bool m_has_shadows; ///< are shadows shown QPixmap m_pixmap; ///< the current puzzle image QPixmap m_bevel_pixmap; ///< the bevel image QPixmap m_shadow_pixmap; ///< the shadow image QPixmap m_selected_shadow_pixmap; ///< the shadow image for selected pieces int m_columns; ///< how many columns there are int m_rows; ///< how many rows there are QList m_pieces; ///< the pieces that make up the puzzle QList m_active_pieces; ///< the pieces held by the player QList m_selected_pieces; ///< the pieces in the selection rectangle QRect m_scene; ///< the scene rectangle QRect m_selection; ///< the selection rectangle int m_total_pieces; ///< the total pieces (does not decrease when pieces are attached) int m_completed; ///< how much the player has completed QPoint m_pos; ///< the center of the view QPoint m_cursor_pos; ///< the mouse cursor position QPoint m_select_pos; ///< the start of the selection rectangle as it is being made int m_scale_level; ///< the zoom level float m_scale; ///< the scaling factor bool m_scrolling; ///< is the player scrolling the play area bool m_selecting; ///< is the player selecting pieces bool m_finished; ///< is the game over Qt::MouseButton m_action_button; ///< the currently pressed mouse button QRandomGenerator m_random; ///< random number generator QRect m_viewport; ///< the size of the view QTransform m_viewport_transform; ///< the transformation matrix to view coordinates EdgeScroller* m_scroll_left; ///< the left edge scroller EdgeScroller* m_scroll_right; ///< the right edge scroller EdgeScroller* m_scroll_up; ///< the top edge scroller EdgeScroller* m_scroll_down; ///< the bottom edge scroller QTimeLine* m_zoom_timer; ///< timeline to animate zooming to fit }; #endif // TETZLE_BOARD_H tetzle-3.0.3/src/choose_game_dialog.cpp000066400000000000000000000062771476255537600201470ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "choose_game_dialog.h" #include "add_image.h" #include "new_game_tab.h" #include "open_game_tab.h" #include "path.h" #include #include #include #include #include #include //----------------------------------------------------------------------------- ChooseGameDialog::ChooseGameDialog(const QStringList& files, int current_id, QWidget* parent) : QDialog(parent, Qt::Dialog | Qt::WindowTitleHint | Qt::WindowSystemMenuHint) { setWindowTitle(tr("Choose Game")); setAcceptDrops(true); m_tabs = new QTabWidget(this); m_tabs->setDocumentMode(true); m_tabs->tabBar()->setExpanding(true); // Layout dialog QVBoxLayout* layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->addWidget(m_tabs); resize(QSettings().value("ChooseGame/Size", QSize(800, 600)).toSize()); // Create tabs OpenGameTab* open_game_tab = new OpenGameTab(current_id, this); connect(open_game_tab, &OpenGameTab::openGame, this, &ChooseGameDialog::accept); connect(open_game_tab, &OpenGameTab::openGame, this, &ChooseGameDialog::openGame); m_tabs->addTab(open_game_tab, tr("Current Games")); m_new_game_tab = new NewGameTab(files, this); connect(m_new_game_tab, &NewGameTab::newGame, this, &ChooseGameDialog::accept); connect(m_new_game_tab, &NewGameTab::newGame, this, &ChooseGameDialog::newGame); m_tabs->addTab(m_new_game_tab, tr("New Game")); connect(m_new_game_tab, &NewGameTab::imageRenamed, open_game_tab, &OpenGameTab::imageRenamed); if (!files.isEmpty() || currentGames().count() <= (current_id != 0)) { m_tabs->setCurrentIndex(1); } } //----------------------------------------------------------------------------- QStringList ChooseGameDialog::currentGames() { QStringList result; const QStringList files = QDir(Path::saves(), "*.xml").entryList(QDir::Files, QDir::Time); for (const QString& game : files) { // Load XML file QFile file(Path::save(game)); if (!file.open(QIODevice::ReadOnly)) { continue; } QXmlStreamReader xml(&file); // Load version while (!xml.isStartElement()) { xml.readNext(); } const QXmlStreamAttributes attributes = xml.attributes(); if (xml.name() == QLatin1String("tetzle") && attributes.value("version").toString().toUInt() <= 5) { if (QFile::exists(Path::image(attributes.value("image").toString()))) { result.append(game); } } } return result; } //----------------------------------------------------------------------------- void ChooseGameDialog::dragEnterEvent(QDragEnterEvent* event) { AddImage::dragEnterEvent(event); } //----------------------------------------------------------------------------- void ChooseGameDialog::dropEvent(QDropEvent* event) { m_tabs->setCurrentIndex(1); m_new_game_tab->addImages(AddImage::dropEvent(event)); } //----------------------------------------------------------------------------- void ChooseGameDialog::hideEvent(QHideEvent* event) { QSettings().setValue("ChooseGame/Size", size()); QDialog::hideEvent(event); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/choose_game_dialog.h000066400000000000000000000031661476255537600176060ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_CHOOSE_GAME_DIALOG_H #define TETZLE_CHOOSE_GAME_DIALOG_H class NewGameTab; #include class QTabWidget; /** * Dialog to choose game. */ class ChooseGameDialog : public QDialog { Q_OBJECT public: /** * Construct a choose game dialog populated with current games. * * @param files images to add to the new game tab * @param current_id the current game in progress * @param parent the parent widget of the dialog */ ChooseGameDialog(const QStringList& files, int current_id, QWidget* parent = nullptr); /** * Fetch list of current games. * * @return list of current games */ static QStringList currentGames(); Q_SIGNALS: /** * Signal to start a new game. * * @param image the image to use on the pieces * @param difficulty how many pieces to generate */ void newGame(const QString& image, int difficulty); /** * Signal to start a previous game. * * @param id the game to start */ void openGame(int id); protected: /** * Handle player dragging over dialog. This allows them to add images. */ void dragEnterEvent(QDragEnterEvent* event) override; /** * Handle player dropping over dialog. This allows them to add images. */ void dropEvent(QDropEvent* event) override; /** * Store the size of the dialog for next use. */ void hideEvent(QHideEvent* event) override; private: QTabWidget* m_tabs; ///< the tabs for current and new games NewGameTab* m_new_game_tab; ///< the contents of the new game tab }; #endif // TETZLE_CHOOSE_GAME_DIALOG_H tetzle-3.0.3/src/color_button.cpp000066400000000000000000000024721476255537600170610ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2014 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "color_button.h" #include #include #include //----------------------------------------------------------------------------- ColorButton::ColorButton(QWidget* parent) : QPushButton(parent) { setAutoDefault(false); connect(this, &QPushButton::clicked, this, &ColorButton::chooseColor); } //----------------------------------------------------------------------------- void ColorButton::setColor(const QColor& color) { if (m_color == color) { return; } m_color = color; QPixmap swatch(75, fontMetrics().height()); swatch.fill(m_color); { QPainter painter(&swatch); painter.setPen(m_color.darker()); painter.drawRect(0, 0, swatch.width() - 1, swatch.height() - 1); painter.setPen(m_color.lighter()); painter.drawRect(1, 1, swatch.width() - 3, swatch.height() - 3); } setIconSize(swatch.size()); setIcon(swatch); Q_EMIT changed(m_color); } //----------------------------------------------------------------------------- void ColorButton::chooseColor() { const QColor color = QColorDialog::getColor(m_color, this); if (color.isValid()) { setColor(color); } } //----------------------------------------------------------------------------- tetzle-3.0.3/src/color_button.h000066400000000000000000000023301476255537600165170ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2010 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_COLOR_BUTTON_H #define TETZLE_COLOR_BUTTON_H #include #include /** * Button to choose color. */ class ColorButton : public QPushButton { Q_OBJECT public: /** * Construct a button for choosing a color. * * @param parent the parent widget of the button */ explicit ColorButton(QWidget* parent = nullptr); /** * Fetch the color chosen by the player. * * @return the color as a QColor */ QColor color() const { return m_color; } /** * Fetch the color chosen by the player. * * @return the color as a QString */ QString toString() const { return m_color.name(); } public Q_SLOTS: /** * Set the color of the button. * * @param color the color to use for the button */ void setColor(const QColor& color); Q_SIGNALS: /** * Signal that the button color has changed. * * @param color the new color of the button */ void changed(const QColor& color); private Q_SLOTS: /** * Prompt player for new color. */ void chooseColor(); private: QColor m_color; ///< the color of the button }; #endif // TETZLE_COLOR_BUTTON_H tetzle-3.0.3/src/dancing_links.cpp000066400000000000000000000074501476255537600171540ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2021 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "dancing_links.h" //----------------------------------------------------------------------------- DLX::Matrix::Matrix(unsigned int max_columns) : m_max_columns(max_columns) , m_columns(max_columns) , m_output(max_columns) , m_solutions(0) , m_tries(0) { m_header = new HeaderNode; m_header->column = m_header; Node* node = m_header; HeaderNode* column = nullptr; for (unsigned int i = 0; i < m_max_columns; ++i) { column = &m_columns[i]; column->id = i; column->up = column->down = column->column = column; column->left = node; node->right = column; node = column; } node->right = m_header; } //----------------------------------------------------------------------------- DLX::Matrix::~Matrix() { delete m_header; } //----------------------------------------------------------------------------- void DLX::Matrix::addRow() { m_rows.push_back(HeaderNode()); HeaderNode* row = &m_rows.back(); row->left = row->right = row->up = row->down = row->column = row; } //----------------------------------------------------------------------------- void DLX::Matrix::addElement(unsigned int c) { Q_ASSERT(c < m_max_columns); HeaderNode* column = &m_columns[c]; HeaderNode* row = &m_rows.back(); m_nodes.push_back(Node()); Node* node = &m_nodes.back(); node->left = row->left; node->right = row; row->left->right = node; row->left = node; node->up = column->up; node->down = column; column->up->down = node; column->up = node; node->column = column; column->size++; } //----------------------------------------------------------------------------- unsigned int DLX::Matrix::search(unsigned int max_solutions, unsigned int max_tries) { m_solution.clear(); m_solutions = 0; m_max_solutions = max_solutions; m_tries = 0; m_max_tries = (max_tries != 0) ? max_tries : m_max_columns; solve(0); return m_solutions; } //----------------------------------------------------------------------------- void DLX::Matrix::solve(unsigned int k) { // If matrix is empty a solution has been found. if (m_header->right == m_header) { ++m_solutions; if (m_solutions >= m_max_solutions) { m_solution = m_output.mid(0, k); } return; } if ((m_solutions >= m_max_solutions) || (++m_tries >= m_max_tries)) { return; } // Choose column with lowest amount of 1s. HeaderNode* column = nullptr; unsigned int s = 0xFFFFFFFF; for(HeaderNode* i = m_header->right->column; i != m_header; i = i->right->column) { if (i->size < s) { column = i; s = i->size; } } cover(column); const unsigned int next_k = k + 1; for(Node* row = column->down; row != column; row = row->down) { m_output[k] = row; for(const Node* j = row->right; j != row; j = j->right) { cover(j->column); } solve(next_k); row = m_output[k]; column = row->column; for(const Node* j = row->left; j != row; j = j->left) { uncover(j->column); } } uncover(column); } //----------------------------------------------------------------------------- void DLX::Matrix::cover(HeaderNode* node) { node->right->left = node->left; node->left->right = node->right; for (const Node* i = node->down; i != node; i = i->down) { for (Node* j = i->right; j != i; j = j->right) { j->down->up = j->up; j->up->down = j->down; j->column->size--; } } } //----------------------------------------------------------------------------- void DLX::Matrix::uncover(HeaderNode* node) { for (const Node* i = node->up; i != node; i = i->up) { for (Node* j = i->left; j != i; j = j->left) { j->column->size++; j->down->up = j; j->up->down = j; } } node->right->left = node; node->left->right = node; } //----------------------------------------------------------------------------- tetzle-3.0.3/src/dancing_links.h000066400000000000000000000067231476255537600166230ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2021 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_DANCING_LINKS_H #define TETZLE_DANCING_LINKS_H #include #include /** * Dancing Links implementation of Algorithm X. * * Algorithm X is a recursive backtracking algorithm that finds all solutions * to the exact cover problem. It works on a matrix consisting of 0s an 1s. * The purpose is to find a combination of rows such that the digit 1 appears * in each column only once. * * To convert an exact cover problem into a sparse matrix solvable by * Algorithm X you represent each constraint by a column. Each possible value * is then placed into a row with 1s in the columns for the constraints it * matches. */ namespace DLX { struct HeaderNode; /** * %Node in matrix. */ struct Node { /** * Construct a node with the value of 1. */ explicit Node() : left(nullptr) , right(nullptr) , up(nullptr) , down(nullptr) , column(nullptr) { } Node* left; ///< node to the left with value of 1 Node* right; ///< node to the right with value of 1 Node* up; ///< node above with value of 1 Node* down; ///< node below with value of 1 HeaderNode* column; ///< column containing this node }; /** * Head node of column or row in matrix. */ struct HeaderNode : public Node { /** * Construct an empty column. */ explicit HeaderNode() : size(0) , id(0) { } unsigned int size; ///< how many nodes with value of 1 are in column unsigned int id; ///< unique identifier }; /** * Sparse matrix class. */ class Matrix { public: /** * Construct a matrix with @a max_columns number of columns. */ explicit Matrix(unsigned int max_columns); /** * Clean up matrix. */ ~Matrix(); /** * Add row to matrix. */ void addRow(); /** * Add element to matrix. * * @param column which column in current row to mark as filled */ void addElement(unsigned int column); /** * Search for solutions. * * @param max_solutions maximum allowed solutions before stopping search * @param max_tries maximum allowed attempts before stopping search * * @return total count of solutions */ unsigned int search(unsigned int max_solutions, unsigned int max_tries); /** * Retrieve solution. * * @return last solution found */ QList solution() const { return m_solution; } private: /** * Run Algorithm X at depth @a k. * * This is a recursive function that hides rows and columns and checks to * see if a solution has been found. */ void solve(unsigned int k); /** * Remove column or row from matrix. * * @param node head node of column or row to remove */ void cover(HeaderNode* node); /** * Add column or row back to matrix. * * @param node head node of column or row to add */ void uncover(HeaderNode* node); private: unsigned int m_max_columns; ///< amount of constraints HeaderNode* m_header; ///< root element QList m_columns; ///< constraints std::list m_rows; ///< rows std::list m_nodes; ///< row values QList m_output; ///< rows where columns do not conflict QList m_solution; ///< nodes of most recent solution unsigned int m_solutions; ///< how many solutions have been found so far unsigned int m_max_solutions; ///< maximum allowed solutions unsigned int m_tries; ///< how many attempts have been made so far unsigned int m_max_tries; ///< maximum allowed attempts }; } #endif // TETZLE_DANCING_LINKS_H tetzle-3.0.3/src/edge_scroller.cpp000066400000000000000000000056731476255537600171670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "edge_scroller.h" #include #include #include //----------------------------------------------------------------------------- EdgeScroller::EdgeScroller(int horizontal, int vertical, QWidget* parent) : QWidget(parent) , m_horizontal(horizontal) , m_vertical(vertical) , m_speed(1) , m_hovered(false) { m_scroll_timer = new QTimer(this); m_scroll_timer->setInterval(20); m_scroll_timer->setSingleShot(false); connect(m_scroll_timer, &QTimer::timeout, this, [this]() { Q_EMIT edgeScroll(m_horizontal * m_speed, m_vertical * m_speed); }); m_start_timer = new QTimer(this); m_start_timer->setInterval(200); m_start_timer->setSingleShot(true); connect(m_start_timer, &QTimer::timeout, this, [this]() { m_scroll_timer->start(); }); setCursor(horizontal ? Qt::SizeHorCursor : Qt::SizeVerCursor); if (horizontal > 0) { // Left m_arrow = { QPoint(0, 10), QPoint(10, 0), QPoint(10, 20) }; } else if (horizontal < 0) { // Right m_arrow = { QPoint(0, 0), QPoint(10, 10), QPoint(0, 20) }; } else if (vertical > 0 ) { // Up m_arrow = { QPoint(0, 10), QPoint(10, 0), QPoint(20, 10) }; } else { // Down m_arrow = { QPoint(0, 0), QPoint(20, 0), QPoint(10, 10) }; } } //----------------------------------------------------------------------------- void EdgeScroller::enterEvent(QEnterEvent*) { m_hovered = true; m_speed = 1; m_scroll_timer->stop(); m_start_timer->start(); update(); } //----------------------------------------------------------------------------- void EdgeScroller::leaveEvent(QEvent*) { m_hovered = false; m_start_timer->stop(); m_scroll_timer->stop(); update(); } //----------------------------------------------------------------------------- void EdgeScroller::mousePressEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { m_start_timer->stop(); m_scroll_timer->start(); m_speed = 5; } event->accept(); } //----------------------------------------------------------------------------- void EdgeScroller::mouseReleaseEvent(QMouseEvent* event) { if (event->button() == Qt::LeftButton) { m_scroll_timer->stop(); m_start_timer->start(); m_speed = 1; } event->accept(); } //----------------------------------------------------------------------------- void EdgeScroller::paintEvent(QPaintEvent*) { QColor color = palette().highlight().color(); QPainter painter(this); painter.setRenderHint(QPainter::Antialiasing); painter.setPen(Qt::NoPen); if (m_hovered) { color.setAlpha((m_speed > 1) ? 192 : 64); painter.setBrush(color); painter.drawRoundedRect(rect(), 3, 3); } color.setAlpha(m_hovered ? 255 : 96); painter.setBrush(color); painter.translate(rect().center() - m_arrow.boundingRect().center() + QPoint(1,1)); painter.drawPolygon(m_arrow); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/edge_scroller.h000066400000000000000000000037711476255537600166310ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_EDGE_SCROLLER_H #define TETZLE_EDGE_SCROLLER_H #include #include class QTimer; /** * Widget to handle scrolling at edge of play area. */ class EdgeScroller : public QWidget { Q_OBJECT public: /** * Construct an edge scroller widget. * * @param horizontal negative scrolls left, positive scrolls right * @param vertical negative scrolls up, positive scrolls down * @param parent the parent widget of the scroller */ explicit EdgeScroller(int horizontal, int vertical, QWidget* parent = nullptr); Q_SIGNALS: /** * Signal that the play area should scroll. * * @param horizontal how far to scroll horizontally * @param vertical how far to scroll vertically */ void edgeScroll(int horizontal, int vertical); protected: /** * Handle mouse entering scroll area. * Shows semi-transparent background and restarts scroll timer. */ void enterEvent(QEnterEvent*) override; /** * Handle mouse leaving scroll area. Stops scroll timer. */ void leaveEvent(QEvent*) override; /** * Accelerate scrolling if player has pressed left button. */ void mousePressEvent(QMouseEvent* event) override; /** * Resume slower scrolling. */ void mouseReleaseEvent(QMouseEvent* event) override; /** * Draw scroller. Draws background if mouse is over scroller, * and draws the background brighter if the mouse is pressed. */ void paintEvent(QPaintEvent*) override; private: QTimer* m_scroll_timer; ///< the timer to emit scroll events QTimer* m_start_timer; ///< the timer for a delay before it starts scrolling QPolygon m_arrow; ///< the arrow to draw in the middle of the scroller const int m_horizontal; ///< which direction to scroll horizontally const int m_vertical; ///< which direction to scroll vertically int m_speed; ///< how fast to scroll bool m_hovered; ///< if the mouse is over the scroller }; #endif // TETZLE_EDGE_SCROLLER_H tetzle-3.0.3/src/fragment_list.cpp000066400000000000000000000005741476255537600172070ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "fragment_list.h" //----------------------------------------------------------------------------- qreal FragmentList::m_pixelratio = 1.0; qreal FragmentList::m_scale = 1.0; //----------------------------------------------------------------------------- tetzle-3.0.3/src/fragment_list.h000066400000000000000000000040151476255537600166460ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_FRAGMENT_LIST_H #define TETZLE_FRAGMENT_LIST_H #include /** * List of pixmap fragments for drawing. */ class FragmentList { public: /** * Add a fragment to list. * * @param pos location of fragment in the scene * @param source_pos location of fragment in the pixmap * @param size size of fragment * @param rotation rotation of fragment */ void append(const QPointF& pos, const QPointF& source_pos, qreal size, qreal rotation = 0) { m_list.append(QPainter::PixmapFragment::create(pos, QRectF(source_pos * m_pixelratio, QSizeF(size, size) * m_pixelratio), m_scale, m_scale, rotation)); } /** * Add fragments to list. * * @param list a list of fragments to append */ void append(const FragmentList& list) { m_list.append(list.m_list); } /** * Remove all fragments from list. */ void clear() { m_list.clear(); } /** * Reserve memory to prevent resizing list as items are added. * * @param size how many fragments to allocate */ void reserve(qsizetype size) { m_list.reserve(size); } /** * Draw fragments. * * @param painter the painter to use for drawing * @param pixmap the pixmap to draw * @param hints the hints to use for drawing */ void draw(QPainter& painter, const QPixmap& pixmap, QPainter::PixmapFragmentHints hints = QPainter::PixmapFragmentHints()) const { painter.drawPixmapFragments(m_list.constData(), m_list.size(), pixmap, hints); } /** * Set the pixel ratio for rendering with high DPI. Default is 1. * * @param ratio the pixel ratio to render at */ static void setDevicePixelRatio(qreal ratio) { m_pixelratio = ratio; m_scale = 1.0 / ratio; } private: QList m_list; ///< list of pixmap fragments static qreal m_pixelratio; ///< render at pixel ratio static qreal m_scale; ///< inverse of pixel ratio to keep coordinates at 1x }; #endif // TETZLE_FRAGMENT_LIST_H tetzle-3.0.3/src/generator.cpp000066400000000000000000000076001476255537600163340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "generator.h" #include "dancing_links.h" #include "tile.h" #include //----------------------------------------------------------------------------- namespace { /** * Define a tetromino shape. */ struct Shape { /** * Construct a shape with @a p1, @a p2, @a p3, and @a p4 points. */ Shape(const QPoint& p1, const QPoint& p2, const QPoint& p3, const QPoint& p4) : cells{ p1, p2, p3, p4 } , width(0) , height(0) { for (int i = 0; i < 4; ++i) { width = std::max(width, cells[i].x()); height = std::max(height, cells[i].y()); } } QPoint cells[4]; ///< points that make up the shape int width; ///< width of shape int height; ///< height of shape }; } //----------------------------------------------------------------------------- Generator::Generator(int columns, int rows, QRandomGenerator& random) : m_columns(columns) , m_rows(rows) , m_random(random) { do { m_pieces.clear(); solve(); } while (m_pieces.isEmpty()); } //----------------------------------------------------------------------------- void Generator::solve() { QList shapes; // Add S shapes.append(Shape(QPoint(1,0), QPoint(2,0), QPoint(0,1), QPoint(1,1))); shapes.append(Shape(QPoint(0,0), QPoint(0,1), QPoint(1,1), QPoint(1,2))); // Add Z shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(1,1), QPoint(2,1))); shapes.append(Shape(QPoint(1,0), QPoint(0,1), QPoint(1,1), QPoint(0,2))); // Add O shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(0,1), QPoint(1,1))); // Add T shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(1,1), QPoint(2,0))); shapes.append(Shape(QPoint(1,0), QPoint(0,1), QPoint(1,1), QPoint(1,2))); shapes.append(Shape(QPoint(0,1), QPoint(1,1), QPoint(1,0), QPoint(2,1))); shapes.append(Shape(QPoint(0,0), QPoint(0,1), QPoint(1,1), QPoint(0,2))); // Add J shapes.append(Shape(QPoint(1,0), QPoint(1,1), QPoint(0,2), QPoint(1,2))); shapes.append(Shape(QPoint(0,0), QPoint(0,1), QPoint(1,1), QPoint(2,1))); shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(0,1), QPoint(0,2))); shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(2,0), QPoint(2,1))); // Add L shapes.append(Shape(QPoint(0,0), QPoint(0,1), QPoint(0,2), QPoint(1,2))); shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(2,0), QPoint(0,1))); shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(1,1), QPoint(1,2))); shapes.append(Shape(QPoint(0,1), QPoint(1,1), QPoint(2,0), QPoint(2,1))); // Add I shapes.append(Shape(QPoint(0,0), QPoint(1,0), QPoint(2,0), QPoint(3,0))); shapes.append(Shape(QPoint(0,0), QPoint(0,1), QPoint(0,2), QPoint(0,3))); // Create matrix const int total_cells = m_columns * m_rows; DLX::Matrix matrix(total_cells); QList cells; for (int i = 0; i < total_cells; ++i) { cells.append(i); } std::shuffle(cells.begin(), cells.end(), m_random); for (const int cell : std::as_const(cells)) { const int row = cell / m_columns; const int col = cell - (row * m_columns); std::shuffle(shapes.begin(), shapes.end(), m_random); for (const Shape& shape : std::as_const(shapes)) { if (shape.width + col < m_columns && shape.height + row < m_rows) { matrix.addRow(); for (int i = 0; i < 4; ++i) { matrix.addElement((shape.cells[i].y() + row) * m_columns + shape.cells[i].x() + col); } } } } // Generate solution matrix.search(1, total_cells); const QList rows = matrix.solution(); QList piece; for (const DLX::Node* row : rows) { piece.clear(); const DLX::Node* node = row; do { const unsigned int r = node->column->id / m_columns; const unsigned int c = node->column->id - (r * m_columns); piece.append(new Tile(c, r)); node = node->right; } while (node != row); m_pieces.append(piece); } } //----------------------------------------------------------------------------- tetzle-3.0.3/src/generator.h000066400000000000000000000020731476255537600160000ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2014 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_GENERATOR_H #define TETZLE_GENERATOR_H namespace DLX { struct Node; } class Tile; #include #include /** * Generator for a puzzle. */ class Generator { public: /** * Construct a new puzzle. * * @param columns how many columns in puzzle * @param rows how many rows in puzzle * @param random the random number generator */ Generator(int columns, int rows, QRandomGenerator& random); /** * Fetch the tiles which make up the new puzzle, grouped into shapes. * * @return the tiles which make up the new puzzle */ QList> pieces() const { return m_pieces; } private: /** * Generate a puzzle. */ void solve(); private: const int m_columns; ///< how many columns in puzzle const int m_rows; ///< how many rows in puzzle QList> m_pieces; ///< tiles that make up puzzle QRandomGenerator& m_random; ///< random number generator }; #endif // TETZLE_GENERATOR_H tetzle-3.0.3/src/image_properties_dialog.cpp000066400000000000000000000117261476255537600212270ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "image_properties_dialog.h" #include "tag_item.h" #include "tag_manager.h" #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- ImagePropertiesDialog::ImagePropertiesDialog(const QIcon& icon, const QString& name, TagManager* manager, const QString& image, QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::WindowSystemMenuHint) , m_image(image) , m_manager(manager) { setWindowTitle(tr("Image Properties")); QLabel* preview = new QLabel(this); preview->setAlignment(Qt::AlignCenter); preview->setPixmap(icon.pixmap(74,74)); preview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); // Add name m_name = new QLineEdit(name, this); // Add tags m_tags = new QListWidget(this); m_tags->setSortingEnabled(true); const QStringList tags = m_manager->tags(); for (const QString& tag : tags) { QListWidgetItem* item = new QListWidgetItem(tag, m_tags); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable); item->setCheckState(m_manager->images(tag).contains(image) ? Qt::Checked : Qt::Unchecked); } if (m_tags->count() > 0) { QListWidgetItem* item = m_tags->item(0); item->setSelected(true); m_tags->setCurrentItem(item); } m_add_tag_name = new QLineEdit(this); m_add_tag_name->setPlaceholderText(tr("New tag name")); connect(m_add_tag_name, &QLineEdit::textChanged, this, [this](const QString& tag) { m_add_tag_button->setEnabled(!m_manager->hasTag(tag.trimmed())); }); m_add_tag_name->installEventFilter(this); m_add_tag_button = new QToolButton(this); m_add_tag_button->setEnabled(false); m_add_tag_button->setIcon(QIcon::fromTheme("list-add")); m_add_tag_button->setText(TagManager::tr("Add Tag")); m_add_tag_button->setToolTip(TagManager::tr("Add Tag")); connect(m_add_tag_button, &QToolButton::clicked, this, &ImagePropertiesDialog::addTag); QGridLayout* tags_layout = new QGridLayout; tags_layout->setContentsMargins(0, 0, 0, 0); tags_layout->setColumnStretch(0, 1); tags_layout->setRowStretch(0, 1); tags_layout->addWidget(m_tags, 0, 0, 1, 2); tags_layout->addWidget(m_add_tag_name, 1, 0); tags_layout->addWidget(m_add_tag_button, 1, 1); // Add dialog buttons QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttons, &QDialogButtonBox::accepted, this, &ImagePropertiesDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &ImagePropertiesDialog::reject); // Layout dialog QFormLayout* layout = new QFormLayout(this); layout->addRow(preview); layout->addRow(tr("Name:"), m_name); layout->addItem(new QSpacerItem(6, 6)); layout->addRow(tr("Tags:"), tags_layout); layout->addItem(new QSpacerItem(6, 6)); layout->addRow(buttons); // Resize dialog resize(QSettings().value("ImageProperties/Size", sizeHint()).toSize()); } //----------------------------------------------------------------------------- QString ImagePropertiesDialog::name() const { return m_name->text(); } //----------------------------------------------------------------------------- bool ImagePropertiesDialog::eventFilter(QObject* watched, QEvent* event) { if ((watched == m_add_tag_name) && (event->type() == QEvent::KeyPress)) { const QKeyEvent* key_event = static_cast(event); if ((key_event->key() == Qt::Key_Return) || (key_event->key() == Qt::Key_Enter)) { addTag(); return true; } } return QDialog::eventFilter(watched, event); } //----------------------------------------------------------------------------- void ImagePropertiesDialog::accept() { QStringList tags; for (int i = 0, count = m_tags->count(); i < count; ++i) { if (m_tags->item(i)->checkState() == Qt::Checked) { tags.append(m_tags->item(i)->text()); } } m_manager->setImageTags(m_image, tags); QDialog::accept(); } //----------------------------------------------------------------------------- void ImagePropertiesDialog::hideEvent(QHideEvent* event) { QSettings().setValue("ImageProperties/Size", size()); QDialog::hideEvent(event); } //----------------------------------------------------------------------------- void ImagePropertiesDialog::addTag() { // Fetch new tag name const QString tag = m_add_tag_name->text().trimmed(); if (m_manager->hasTag(tag)) { return; } m_add_tag_name->clear(); // Create new tag item QListWidgetItem* item = new TagItem(tag); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsUserCheckable | Qt::ItemIsSelectable); item->setCheckState(Qt::Checked); m_tags->addItem(tag); m_tags->sortItems(); m_tags->setCurrentItem(item, QItemSelectionModel::ClearAndSelect); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/image_properties_dialog.h000066400000000000000000000032521476255537600206670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_IMAGE_PROPERTIES_DIALOG_H #define TETZLE_IMAGE_PROPERTIES_DIALOG_H class TagManager; #include class QLineEdit; class QListWidget; class QToolButton; /** * Dialog to set properties of an image. */ class ImagePropertiesDialog : public QDialog { Q_OBJECT public: /** * Construct a dialog to set the properties of an image. * * @param icon the preview of the image * @param name the name of the image * @param manager the manager of the tags * @param image the image identifier * @param parent the parent widget of the dialog */ ImagePropertiesDialog(const QIcon& icon, const QString& name, TagManager* manager, const QString& image, QWidget* parent = nullptr); /** * Fetch image name. * * @return name of image */ QString name() const; /** * Filter events of #m_add_tag_name to add a tag when enter is pressed. */ bool eventFilter(QObject* watched, QEvent* event) override; public Q_SLOTS: /** * Set the properties of the image. */ void accept() override; protected: /** * Store the size of the dialog for next use. */ void hideEvent(QHideEvent* event) override; private Q_SLOTS: /** * Handle adding a new tag. */ void addTag(); private: QString m_image; ///< the image to modify TagManager* m_manager; ///< the manager of all tags QLineEdit* m_name; ///< the name of the image QListWidget* m_tags; ///< the tags of the image QLineEdit* m_add_tag_name; ///< entry for the name of a new tag QToolButton* m_add_tag_button; ///< button to add a tag }; #endif // TETZLE_IMAGE_PROPERTIES_DIALOG_H tetzle-3.0.3/src/locale_dialog.cpp000066400000000000000000000111521476255537600171210ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2020 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "locale_dialog.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- QString LocaleDialog::m_current; QString LocaleDialog::m_path; QString LocaleDialog::m_appname; //----------------------------------------------------------------------------- LocaleDialog::LocaleDialog(QWidget* parent) : QDialog(parent, Qt::WindowTitleHint | Qt::MSWindowsFixedSizeDialogHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint) { const QString title = parent ? parent->window()->windowTitle() : QString(); setWindowTitle(!title.isEmpty() ? title : QCoreApplication::applicationName()); QLabel* text = new QLabel(tr("Select application language:"), this); m_translations = new QComboBox(this); m_translations->addItem(tr("")); const QStringList translations = findTranslations(); for (QString translation : translations) { if (translation.startsWith("qt")) { continue; } translation.remove(m_appname); m_translations->addItem(languageName(translation), translation); } const int index = std::max(0, m_translations->findData(m_current)); m_translations->setCurrentIndex(index); QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttons, &QDialogButtonBox::accepted, this, &LocaleDialog::accept); connect(buttons, &QDialogButtonBox::rejected, this, &LocaleDialog::reject); QVBoxLayout* layout = new QVBoxLayout(this); layout->setSizeConstraint(QLayout::SetFixedSize); layout->addWidget(text); layout->addWidget(m_translations); layout->addWidget(buttons); } //----------------------------------------------------------------------------- void LocaleDialog::loadTranslator(const QString& name, const QString& datadir) { m_appname = name; // Find translator path m_path = datadir + "/translations/"; // Find current locale m_current = QSettings().value("Locale/Language").toString(); if (!m_current.isEmpty()) { QLocale::setDefault(QLocale(m_current)); } const QString locale = QLocale().name(); // Load translators static QTranslator translator; if (translator.load(m_appname + locale, m_path)) { QCoreApplication::installTranslator(&translator); const QString path = QLibraryInfo::path(QLibraryInfo::TranslationsPath); static QTranslator qtbase_translator; if (qtbase_translator.load("qtbase_" + locale, m_path) || qtbase_translator.load("qtbase_" + locale, path)) { QCoreApplication::installTranslator(&qtbase_translator); } static QTranslator qt_translator; if (qt_translator.load("qt_" + locale, m_path) || qt_translator.load("qt_" + locale, path)) { QCoreApplication::installTranslator(&qt_translator); } } } //----------------------------------------------------------------------------- QString LocaleDialog::languageName(const QString& language) { QString name; const QLocale locale(language); if (language.contains('_')) { if (locale.name() == language) { name = locale.nativeLanguageName() + " (" + locale.nativeTerritoryName() + ")"; } else { name = locale.nativeLanguageName() + " (" + language + ")"; } } else { name = locale.nativeLanguageName(); } if (name.isEmpty() || name == "C") { if (language == "eo") { name = "Esperanto"; } else { name = language; } } if (locale.textDirection() == Qt::RightToLeft) { name.prepend(QChar(0x202b)); } return name; } //----------------------------------------------------------------------------- QStringList LocaleDialog::findTranslations() { QStringList result = QDir(m_path, "*.qm").entryList(QDir::Files); result.replaceInStrings(".qm", QString()); return result; } //----------------------------------------------------------------------------- void LocaleDialog::accept() { const int current = m_translations->findData(m_current); if (current == m_translations->currentIndex()) { return reject(); } QDialog::accept(); m_current = m_translations->itemData(m_translations->currentIndex()).toString(); QSettings().setValue("Locale/Language", m_current); QMessageBox::information(this, tr("Note"), tr("Please restart this application for the change in language to take effect."), QMessageBox::Ok); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/locale_dialog.h000066400000000000000000000033171476255537600165720ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2013 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_LOCALE_DIALOG_H #define TETZLE_LOCALE_DIALOG_H #include class QComboBox; /** * Dialog to set application language. * * This class handles setting the application language when the application is * launched, as well as allowing the user to choose a different language for * future launches. */ class LocaleDialog : public QDialog { Q_OBJECT public: /** * Construct a dialog to choose application language. * * @param parent the parent widget of the dialog */ explicit LocaleDialog(QWidget* parent = nullptr); /** * Load the stored language into the application; defaults to system language. * * @param appname application name to prepend to translation filenames * @param datadir location to search for translations */ static void loadTranslator(const QString& appname, const QString& datadir); /** * Fetch native language name for QLocale name. * * @param language QLocale name to look up * * @return translated language name */ static QString languageName(const QString& language); public Q_SLOTS: /** * Store application language for next launch. */ void accept() override; private: /** * Fetch list of application translations. * * @return list of QLocale names */ static QStringList findTranslations(); private: QComboBox* m_translations; ///< list of found translations static QString m_current; ///< stored application language static QString m_path; ///< location of translations; found in loadTranslator() static QString m_appname; ///< application name passed to loadTranslator() }; #endif // TETZLE_LOCALE_DIALOG_H tetzle-3.0.3/src/main.cpp000066400000000000000000000101251476255537600152660ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2022 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "locale_dialog.h" #include "path.h" #include "window.h" #include #include #include #include #include #include //----------------------------------------------------------------------------- /** * %Application instance to handle player dropping images on program. */ class Application : public QApplication { public: /** * Construct an application instance. * * @param argc amount of arguments * @param argv array of arguments */ Application(int& argc, char** argv); /** * Create the main window. * * @param files list of images to add to new game */ void createWindow(const QStringList& files); protected: /** * Handle player dropping images by passing them to main window. */ bool event(QEvent* e) override; private: QStringList m_files; ///< list of images to pass to main window Window* m_window; ///< main window of game }; //----------------------------------------------------------------------------- Application::Application(int& argc, char** argv) : QApplication(argc, argv) , m_window(nullptr) { setApplicationName("Tetzle"); setApplicationVersion(VERSIONSTR); setApplicationDisplayName(Window::tr("Tetzle")); setOrganizationDomain("gottcode.org"); setOrganizationName("GottCode"); #if !defined(Q_OS_WIN) && !defined(Q_OS_MAC) setWindowIcon(QIcon::fromTheme("tetzle", QIcon(":/tetzle.png"))); setDesktopFileName("tetzle"); #endif processEvents(); } //----------------------------------------------------------------------------- void Application::createWindow(const QStringList& files) { m_files += files; m_window = new Window(m_files); } //----------------------------------------------------------------------------- bool Application::event(QEvent* e) { if (e->type() != QEvent::FileOpen) { return QApplication::event(e); } else { const QString file = static_cast(e)->file(); if (m_window) { m_window->addImages(QStringList(file)); } else { m_files.append(file); } e->accept(); return true; } } //----------------------------------------------------------------------------- int main(int argc, char** argv) { Application app(argc, argv); // Load application data const QString appdir = app.applicationDirPath(); const QString datadir = QDir::cleanPath(appdir + "/" + TETZLE_DATADIR); // Handle portability QString userdir; #ifdef Q_OS_MAC const QFileInfo portable(appdir + "/../../../Data"); #else const QFileInfo portable(appdir + "/Data"); #endif if (portable.exists() && portable.isWritable()) { userdir = portable.absoluteFilePath(); QSettings::setDefaultFormat(QSettings::IniFormat); QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, userdir + "/Settings"); } // Load application language LocaleDialog::loadTranslator("tetzle_", datadir); // Load command-line settings QSettings settings; QCommandLineParser parser; parser.setApplicationDescription(QCoreApplication::translate("Window", "A jigsaw puzzle with tetrominoes for pieces")); parser.addHelpOption(); parser.addVersionOption(); parser.addPositionalArgument("files", QCoreApplication::translate("main", "Images to add to the choose game dialog."), "[files]"); parser.process(app); // Create data location Path::load(userdir); // Update settings layout if (settings.value("Version", 0).toInt() < 2) { settings.setValue("NewGame/Image", settings.value("Image")); settings.remove("Image"); settings.setValue("NewGame/Pieces", settings.value("Pieces")); settings.remove("Pieces"); settings.setValue("AddImage/Path", settings.value("AddImagePath")); settings.remove("AddImagePath"); settings.remove("MaximumPreviews"); settings.remove("AddImage/MaximumPreviews"); settings.setValue("Version", 2); } // Reset tracking of the game currently open settings.remove("OpenGame"); app.createWindow(parser.positionalArguments()); return app.exec(); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/message.cpp000066400000000000000000000055211476255537600157720ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "message.h" #include #include #include #include #include //----------------------------------------------------------------------------- Message::Message(QWidget* parent) : QObject(parent) , m_parent(parent) , m_visible(false) , m_opacity(1.0) { m_hide_timer = new QTimer(this); m_hide_timer->setInterval(2000); m_hide_timer->setSingleShot(true); connect(m_hide_timer, &QTimer::timeout, this, &Message::hide); m_fade_timer = new QTimeLine(160, this); m_fade_timer->setEasingCurve(QEasingCurve::Linear); m_fade_timer->setDirection(QTimeLine::Backward); m_fade_timer->setFrameRange(0, 10); m_fade_timer->setUpdateInterval(16); connect(m_fade_timer, &QTimeLine::frameChanged, this, &Message::fade); } //----------------------------------------------------------------------------- void Message::draw(QPainter& painter) const { if (!m_visible && (m_fade_timer->state() == QTimeLine::NotRunning)) { return; } // Find message size const QFont font("Sans", 24); const QFontMetrics metrics(font); const int width = metrics.boundingRect(m_text).width(); const int height = metrics.height(); painter.save(); painter.setOpacity(m_opacity); painter.translate(m_parent->rect().center() - QRect(0, 0, width + height, height * 2).center()); // Draw black background painter.setPen(Qt::NoPen); painter.setBrush(QColor(0, 0, 0, 200)); painter.setRenderHint(QPainter::Antialiasing, true); painter.drawRoundedRect(0, 0, width + height, height * 2, 10, 10); // Draw message painter.setFont(font); painter.setPen(Qt::white); painter.setRenderHint(QPainter::TextAntialiasing, true); painter.drawText(height / 2, height / 2 + metrics.ascent(), m_text); painter.restore(); } //----------------------------------------------------------------------------- void Message::setText(const QString& text) { m_text = text; } //----------------------------------------------------------------------------- void Message::setVisible(bool visible, bool stay) { m_visible = visible; m_opacity = 1.0; if (m_visible) { m_fade_timer->stop(); } else { m_fade_timer->start(); } if (m_visible && !stay) { m_hide_timer->start(); } else { m_hide_timer->stop(); } m_parent->update(); } //----------------------------------------------------------------------------- void Message::hide() { setVisible(false); } //----------------------------------------------------------------------------- void Message::show() { setVisible(true); } //----------------------------------------------------------------------------- void Message::fade(int frame) { m_opacity = frame / 10.0; m_parent->update(); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/message.h000066400000000000000000000027671476255537600154500ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_MESSAGE_H #define TETZLE_MESSAGE_H #include #include class QPainter; class QTimeLine; class QTimer; class QWidget; /** * Overlay to draw messages on board. */ class Message : public QObject { Q_OBJECT public: /** * Construct an overlay message. * * @param parent the parent widget of the message */ explicit Message(QWidget* parent); /** * Draw overlay message. */ void draw(QPainter& painter) const; /** * Set the overlay message. * * @param text the message */ void setText(const QString& text); /** * Set if the overlay message is visible. * * @param visible @c true if message is visible * @param stay @c true if it should not fade after 2 seconds */ void setVisible(bool visible, bool stay = true); public Q_SLOTS: /** * Hide the overlay message. */ void hide(); /** * Show the overlay message. */ void show(); private Q_SLOTS: /** * Fade the overlay message. * * @param frame how far through the fade */ void fade(int frame); private: QWidget* m_parent; ///< parent widget of message QTimer* m_hide_timer; ///< timer controlling when to hide message QTimeLine* m_fade_timer; ///< timer controlling how long it fades QString m_text; ///< text of message bool m_visible; ///< if message is visible qreal m_opacity; ///< opacity of message, used to fade out }; #endif // TETZLE_MESSAGE_H tetzle-3.0.3/src/new_game_tab.cpp000066400000000000000000000402671476255537600167640ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "new_game_tab.h" #include "add_image.h" #include "choose_game_dialog.h" #include "image_properties_dialog.h" #include "path.h" #include "tag_manager.h" #include "thumbnail_delegate.h" #include "thumbnail_item.h" #include "thumbnail_loader.h" #include "toolbar_list.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- namespace { /** * Calculate the hash of a file. * * @param path the file to hash * * @return the hash of the file contents */ QString hash(const QString& path) { QFile file(path); if (!file.open(QIODevice::ReadOnly)) { return QString(); } return QCryptographicHash::hash(file.readAll(), QCryptographicHash::Sha1).toHex(); } /** * Update the tooltip of a thumbnail item. */ void updateToolTip(QListWidgetItem* item) { QString tip = item->text(); const QString tags = item->data(ThumbnailItem::TagsRole).toString(); if (!tags.isEmpty()) { tip += "
" + tags + ""; } item->setToolTip(tip); } } //----------------------------------------------------------------------------- NewGameTab::NewGameTab(const QStringList& files, QDialog* parent) : QWidget(parent) { // Add image selector m_images = new ToolBarList(this); m_images->setViewMode(QListView::IconMode); m_images->setSelectionMode(QListWidget::ExtendedSelection); m_images->setIconSize(QSize(74, 74)); m_images->setMinimumSize(460 + m_images->verticalScrollBar()->sizeHint().width(), 230); m_images->setItemDelegate(new ThumbnailDelegate(m_images)); connect(m_images, &ToolBarList::itemSelectionChanged, this, &NewGameTab::imageSelected); // Add image actions QAction* add_action = new QAction(QIcon::fromTheme("list-add"), tr("Add Image"), this); m_images->addToolBarAction(add_action); connect(add_action, &QAction::triggered, this, &NewGameTab::addImageClicked); m_remove_action = new QAction(QIcon::fromTheme("list-remove"), tr("Remove Image"), this); m_remove_action->setEnabled(false); m_images->addToolBarAction(m_remove_action); connect(m_remove_action, &QAction::triggered, this, &NewGameTab::removeImage); m_tag_action = new QAction(QIcon::fromTheme("document-properties"), tr("Image Properties"), this); m_tag_action->setEnabled(false); m_images->addToolBarAction(m_tag_action); connect(m_tag_action, &QAction::triggered, this, &NewGameTab::editImageProperties); // Add image filter QWidget* spacer = new QWidget(this); spacer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); m_images->addToolBarWidget(spacer); m_image_tags = new TagManager(this); connect(m_image_tags, &TagManager::filterChanged, this, &NewGameTab::filterImages); connect(m_image_tags, &TagManager::tagsChanged, this, &NewGameTab::updateTagsStrings); m_images->addToolBarWidget(m_image_tags); // Add pieces slider m_slider = new QSlider(Qt::Horizontal, this); m_slider->setRange(1, 1); connect(m_slider, &QSlider::valueChanged, this, &NewGameTab::pieceCountChanged); m_count = new QLabel(this); m_count->setAlignment(Qt::AlignRight | Qt::AlignVCenter); m_count->setMinimumWidth(m_count->fontMetrics().boundingRect(tr("%L1 pieces").arg(9999)).width()); // Add buttons QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttons, &QDialogButtonBox::accepted, this, &NewGameTab::accept); connect(buttons, &QDialogButtonBox::rejected, parent, &QDialog::reject); m_accept_button = buttons->button(QDialogButtonBox::Ok); m_accept_button->setText(ChooseGameDialog::tr("Play Game")); m_accept_button->setEnabled(false); // Arrange widgets QGridLayout* layout = new QGridLayout(this); layout->setColumnStretch(1, 1); layout->setRowStretch(0, 1); layout->addWidget(m_images, 0, 0, 1, 2); layout->setRowMinimumHeight(1, 12); layout->addWidget(m_count, 2, 0); layout->addWidget(m_slider, 2, 1); layout->setRowMinimumHeight(3, 12); layout->addWidget(buttons, 4, 0, 1, 2); // Load images QSettings details(Path::image("details"), QSettings::IniFormat); const QStringList images = QDir(Path::images(), "*.*").entryList(QDir::Files, QDir::Time | QDir::Reversed); for (const QString& image : images) { createItem(image, details); } m_images->sortItems(); // Load values const QSettings settings; QListWidgetItem* item = m_images->item(0); const QString image = settings.value("NewGame/Image").toString(); if (!image.isEmpty()) { for (int i = m_images->count() - 1; i >= 0; --i) { item = m_images->item(i); if (item->data(ThumbnailItem::ImageRole) == image) { break; } } } m_images->setCurrentItem(item); m_slider->setValue(settings.value("NewGame/Pieces", 2).toInt()); pieceCountChanged(m_slider->value()); // Add new images addImages(files); } //----------------------------------------------------------------------------- void NewGameTab::addImages(const QStringList& images) { const int count = images.count(); if (count == 0) { return; } m_images->clearSelection(); QProgressDialog progress(tr("Copying images..."), tr("Cancel"), 0, count, this); progress.setMinimumDuration(500); progress.setWindowModality(Qt::WindowModal); QApplication::setOverrideCursor(Qt::WaitCursor); QCoreApplication::processEvents(); m_image_tags->clearFilter(); for (int i = 0; i < count; i++) { progress.setValue(i); if (progress.wasCanceled()) { break; } addImage(images.at(i)); QApplication::processEvents(); } progress.setValue(count); QApplication::restoreOverrideCursor(); } //----------------------------------------------------------------------------- void NewGameTab::accept() { const QList items = m_images->selectedItems(); if (items.count() != 1) { return; } const QString image = items.first()->data(ThumbnailItem::ImageRole).toString(); QSettings settings; settings.setValue("NewGame/Pieces", m_slider->value()); settings.setValue("NewGame/Image", image); Q_EMIT newGame(image, m_slider->value()); } //----------------------------------------------------------------------------- void NewGameTab::addImageClicked() { addImages(AddImage::getOpenFileNames(this)); } //----------------------------------------------------------------------------- void NewGameTab::removeImage() { // Find selected images const QList items = m_images->selectedItems(); if (items.isEmpty()) { return; } QStringList selected_images; for (const QListWidgetItem* item : items) { selected_images.append(item->data(ThumbnailItem::ImageRole).toString()); } // Find games that would be affected QStringList games; QXmlStreamReader xml; const QStringList files = QDir(Path::saves(), "*.xml").entryList(QDir::Files); for (const QString& game : files) { QFile file(Path::save(game)); if (!file.open(QIODevice::ReadOnly)) { continue; } xml.setDevice(&file); // Load details while (!xml.isStartElement()) { xml.readNext(); } const QXmlStreamAttributes attributes = xml.attributes(); if (xml.name() == QLatin1String("tetzle") && attributes.value("version").toString().toUInt() <= 5) { if (selected_images.contains(attributes.value("image").toString())) { games.append(game); } } } // Prompt about image removal const int plural = selected_images.count(); QMessageBox mbox(this); mbox.setIcon(QMessageBox::Question); mbox.setWindowTitle(tr("Remove Image")); mbox.setText(tr("Remove %n selected image(s)?", nullptr, plural)); if (!games.isEmpty()) { mbox.setIcon(QMessageBox::Warning); mbox.setInformativeText(tr("Saved games using these image(s) will be deleted.", nullptr, plural)); } mbox.setStandardButtons(QMessageBox::Cancel); mbox.addButton(tr("Remove"), QMessageBox::AcceptRole); mbox.setDefaultButton(QMessageBox::Cancel); if (mbox.exec() == QMessageBox::Cancel) { return; } // Remove images QSettings details(Path::image("details"), QSettings::IniFormat); for (const QString& current_image : std::as_const(selected_images)) { // Remove from image details details.remove(current_image); // Delete image QFile::remove(Path::image(current_image)); // Delete thumbnail removeThumbnail(current_image.section(".", 0, 0)); // Remove from tags m_image_tags->removeImage(current_image); } // Remove saved games depending on images for (const QString& game : std::as_const(games)) { QFile::remove(Path::save(game)); } // Remove listwidget items for (const QListWidgetItem* item : items) { delete item; } // Handle all images being removed if (m_images->count() == 0) { m_accept_button->setEnabled(false); m_slider->setMaximum(-1); m_count->clear(); QSettings settings; settings.remove("NewGame/Image"); settings.remove("NewGame/Pieces"); } } //----------------------------------------------------------------------------- void NewGameTab::editImageProperties() { const QList items = m_images->selectedItems(); if (items.count() != 1) { return; } QListWidgetItem* item = items.first(); const QString filename = item->data(ThumbnailItem::ImageRole).toString(); ImagePropertiesDialog dialog(item->icon(), item->text(), m_image_tags, filename, window()); if (dialog.exec() == QDialog::Accepted) { // Update name item->setText(dialog.name()); if (item->text() != item->data(ThumbnailItem::NameRole).toString()) { item->setData(ThumbnailItem::NameRole, item->text()); QSettings details(Path::image("details"), QSettings::IniFormat); details.setValue(filename + "/Name", item->text()); Q_EMIT imageRenamed(filename, item->text()); m_images->sortItems(); m_images->scrollToItem(item); } // Update tags item->setData(ThumbnailItem::TagsRole, m_image_tags->tags(filename)); updateToolTip(item); } } //----------------------------------------------------------------------------- void NewGameTab::imageSelected() { const QList images = m_images->selectedItems(); // Disable actions if no images are selected if (images.isEmpty()) { m_accept_button->setEnabled(false); m_tag_action->setEnabled(false); m_remove_action->setEnabled(false); return; } // Enable playing game or editing image properties if only 1 image is selected const bool enabled = images.count() == 1; m_accept_button->setEnabled(enabled); m_tag_action->setEnabled(enabled); // Prevent removing the image of the game currently open m_remove_action->setEnabled(true); const QString current_image = QSettings().value("OpenGame/Image").toString(); for (const QListWidgetItem* item : images) { if (item->data(ThumbnailItem::ImageRole).toString() == current_image) { m_remove_action->setEnabled(false); break; } } const QString image = images.last()->data(ThumbnailItem::ImageRole).toString(); m_image_size = QImageReader(Path::image(image)).size(); if (m_image_size.width() > m_image_size.height()) { m_ratio = static_cast(m_image_size.height()) / static_cast(m_image_size.width()); } else { m_ratio = static_cast(m_image_size.width()) / static_cast(m_image_size.height()); } const int max = std::lround(std::sqrt(250.0f / m_ratio)); const int min = std::lround(std::sqrt(2.5f / m_ratio)); int value = min; if (m_images->count() > 1) { value = std::lround(static_cast(max * m_slider->value()) / static_cast(m_slider->maximum())); } m_slider->setRange(min, max); m_slider->setValue(value); pieceCountChanged(m_slider->value()); } //----------------------------------------------------------------------------- void NewGameTab::pieceCountChanged(int value) { if (m_image_size.isValid()) { const int side1 = 4 * value; const int side2 = std::max(std::lround(side1 * m_ratio), 1L); m_count->setText(tr("%L1 pieces").arg(side1 * side2 / 4)); } } //----------------------------------------------------------------------------- void NewGameTab::filterImages(const QStringList& filter) { // Filter items m_images->blockSignals(true); for (int i = 0, count = m_images->count(); i < count; ++i) { QListWidgetItem* item = m_images->item(i); if (filter.contains(item->data(ThumbnailItem::ImageRole).toString())) { item->setHidden(false); } else { item->setHidden(true); item->setSelected(false); } } m_images->blockSignals(false); // Disable tag button if no images are visible imageSelected(); } //----------------------------------------------------------------------------- void NewGameTab::updateTagsStrings() { for (int i = 0, count = m_images->count(); i < count; ++i) { QListWidgetItem* item = m_images->item(i); item->setData(ThumbnailItem::TagsRole, m_image_tags->tags(item->data(ThumbnailItem::ImageRole).toString())); updateToolTip(item); } } //----------------------------------------------------------------------------- void NewGameTab::hideEvent(QHideEvent* event) { m_accept_button->setDefault(false); QWidget::hideEvent(event); } //----------------------------------------------------------------------------- void NewGameTab::showEvent(QShowEvent* event) { m_accept_button->setDefault(true); QWidget::showEvent(event); } //----------------------------------------------------------------------------- void NewGameTab::addImage(const QString& image) { QImageReader reader(image); if (!reader.canRead()) { return; } // Find image ID QString filename; int image_id = 0; QString image_hash = hash(image); QSettings details(Path::image("details"), QSettings::IniFormat); const QStringList images = QDir(Path::images(), "*.*").entryList(QDir::Files); for (const QString& file : images) { image_id = std::max(image_id, file.section(".", 0, 0).toInt()); const QString key = file + "/SHA1"; if (!details.contains(key)) { details.setValue(key, hash(Path::image(file))); } if (details.value(key) == image_hash) { filename = file; break; } } image_id++; QListWidgetItem* item = nullptr; if (filename.isEmpty()) { // Find filename const QFileInfo info(image); filename = QString("%1.%2").arg(image_id).arg(info.suffix().toLower()); details.setValue(filename + "/SHA1", image_hash); details.setValue(filename + "/Name", info.completeBaseName()); m_image_tags->addImage(filename); // Copy and rotate image reader.setAutoTransform(true); if (reader.transformation() == QImageIOHandler::TransformationNone) { QFile::copy(image, Path::image(filename)); } else { reader.read().save(Path::image(filename), "", 100); } // Remove old thumbnail if it exists removeThumbnail(QString::number(image_id)); } else { // Find in list of images for (int i = 0, count = m_images->count(); i < count; ++i) { if (m_images->item(i)->data(ThumbnailItem::ImageRole).toString() == filename) { item = m_images->item(i); break; } } } // Select item if (!item) { m_images->blockSignals(true); item = createItem(filename, details); m_images->blockSignals(false); m_images->sortItems(); } m_images->setCurrentItem(item); m_images->scrollToItem(item, QAbstractItemView::PositionAtTop); } //----------------------------------------------------------------------------- QListWidgetItem* NewGameTab::createItem(const QString& image, const QSettings& details) { const qreal pixelratio = devicePixelRatioF(); QListWidgetItem* item = ThumbnailLoader::createItem(image, details.value(image + "/Name", tr("Untitled")).toString(), m_images, pixelratio); item->setData(ThumbnailItem::NameRole, item->text()); item->setData(ThumbnailItem::TagsRole, m_image_tags->tags(image)); updateToolTip(item); return item; } //----------------------------------------------------------------------------- void NewGameTab::removeThumbnail(const QString& image_id) const { QDir dir(Path::thumbnails()); const QStringList thumbnails = dir.entryList({ image_id + ".*", image_id + "@*" }, QDir::Files); for (const QString& file : thumbnails) { dir.remove(file); } } //----------------------------------------------------------------------------- tetzle-3.0.3/src/new_game_tab.h000066400000000000000000000061411476255537600164220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_NEW_GAME_TAB_H #define TETZLE_NEW_GAME_TAB_H class TagManager; class ToolBarList; #include class QAction; class QLabel; class QListWidgetItem; class QPushButton; class QSettings; class QSlider; /** * Tab to set the parameters of a new game. */ class NewGameTab : public QWidget { Q_OBJECT public: /** * Construct a new game tab. * * @param files a list of images to add * @param parent the parent widget of the tab */ explicit NewGameTab(const QStringList& files, QDialog* parent = nullptr); /** * Add to list of images. * * @param images a list of images to add */ void addImages(const QStringList& images); Q_SIGNALS: /** * Signal that an image was renamed. * * @param image the image identifier * @param name the new image name */ void imageRenamed(const QString& image, const QString& name); /** * Signal to start a new game. * * @param image the image to use on the pieces * @param difficulty how many pieces to generate */ void newGame(const QString& image, int difficulty); private Q_SLOTS: /** * Start a new game. */ void accept(); /** * Prompt player for image to add. */ void addImageClicked(); /** * Remove selected images. */ void removeImage(); /** * Edit properties of selected image. */ void editImageProperties(); /** * Handle images being selected. Enables or disables actions, and updates pieces slider. */ void imageSelected(); /** * Update piece count display. * * @param value how many pieces */ void pieceCountChanged(int value); /** * Filter what images are shown. * * @param filter the list of images that can be shown */ void filterImages(const QStringList& filter); /** * Update the text and tooltips of the images. */ void updateTagsStrings(); protected: /** * Unset default button. */ void hideEvent(QHideEvent* event) override; /** * Set default button to #m_accept_button. */ void showEvent(QShowEvent* event) override; private: /** * Add image to list. * * @param image image to add */ void addImage(const QString& image); /** * Create a listwidget item. * * @param image the image of the item * @param details where to find the image name */ QListWidgetItem* createItem(const QString& image, const QSettings& details); /** * Remove an image thumbnail. * * @param image_id remove thumbnail of this image */ void removeThumbnail(const QString& image_id) const; private: TagManager* m_image_tags; ///< manager of tags ToolBarList* m_images; ///< list of images QAction* m_remove_action; ///< action to remove images QAction* m_tag_action; ///< action to edit image properties QSlider* m_slider; ///< amount of pieces QLabel* m_count; ///< display of amount of pieces QSize m_image_size; ///< size of selected image, used to find piece count float m_ratio; ///< aspect ratio of selected image, used to find piece count QPushButton* m_accept_button; ///< button to start new game }; #endif // TETZLE_NEW_GAME_TAB_H tetzle-3.0.3/src/open_game_tab.cpp000066400000000000000000000113251476255537600171250ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "open_game_tab.h" #include "choose_game_dialog.h" #include "path.h" #include "thumbnail_delegate.h" #include "thumbnail_item.h" #include "thumbnail_loader.h" #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- OpenGameTab::OpenGameTab(int current_id, QDialog* parent) : QWidget(parent) { // List saved games m_games = new QListWidget(this); m_games->setIconSize(QSize(74, 74)); m_games->setMovement(QListView::Static); m_games->setResizeMode(QListView::Adjust); m_games->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); m_games->setItemDelegate(new ThumbnailDelegate(m_games)); const qreal pixelratio = devicePixelRatioF(); const QSettings details(Path::image("details"), QSettings::IniFormat); const QStringList files = ChooseGameDialog::currentGames(); for (const QString& game : files) { // Skip currently opened game const int id = game.section(".", 0, 0).toInt(); if (current_id == id) { continue; } // Open saved game file QFile file(Path::save(game)); if (!file.open(QIODevice::ReadOnly)) { continue; } QXmlStreamReader xml(&file); // Load details while (!xml.isStartElement()) { xml.readNext(); } const QXmlStreamAttributes attributes = xml.attributes(); const QString image = attributes.value("image").toString(); if (!QFile::exists(Path::image(image))) { continue; } const QString image_name = details.value(image + "/Name", tr("Untitled")).toString(); const QString pieces = attributes.value("pieces").toString(); const QString complete = attributes.value("complete").toString(); const QString details = tr("%L1 pieces %2 %3% complete").arg(pieces, QChar(8226), complete); QListWidgetItem* item = ThumbnailLoader::createItem(image, image_name, m_games, pixelratio); item->setData(ThumbnailItem::GameRole, id); item->setData(ThumbnailItem::DetailsRole, details); } m_games->setCurrentRow(0); // Create buttons QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal, this); connect(buttons, &QDialogButtonBox::accepted, this, &OpenGameTab::accept); connect(buttons, &QDialogButtonBox::rejected, parent, &QDialog::reject); m_accept_button = buttons->button(QDialogButtonBox::Ok); m_accept_button->setText(ChooseGameDialog::tr("Play Game")); m_accept_button->setEnabled(m_games->count() > 0); QPushButton* delete_button = buttons->addButton(tr("Delete"), QDialogButtonBox::ActionRole); if (delete_button->style()->styleHint(QStyle::SH_DialogButtonBox_ButtonsHaveIcons)) { delete_button->setIcon(QIcon::fromTheme("edit-delete")); } delete_button->setEnabled(m_accept_button->isEnabled()); connect(delete_button, &QPushButton::clicked, this, &OpenGameTab::deleteGame); // Arrange widgets QVBoxLayout* layout = new QVBoxLayout(this); layout->addWidget(m_games); layout->addSpacing(12); layout->addWidget(buttons); } //----------------------------------------------------------------------------- void OpenGameTab::imageRenamed(const QString& image, const QString& name) { for (int i = 0, count = m_games->count(); i < count; ++i) { QListWidgetItem* item = m_games->item(i); if (item->data(ThumbnailItem::ImageRole).toString() == image) { item->setText(name); } } } //----------------------------------------------------------------------------- void OpenGameTab::hideEvent(QHideEvent* event) { m_accept_button->setDefault(false); QWidget::hideEvent(event); } //----------------------------------------------------------------------------- void OpenGameTab::showEvent(QShowEvent* event) { m_accept_button->setDefault(true); QWidget::showEvent(event); } //----------------------------------------------------------------------------- void OpenGameTab::accept() { const QListWidgetItem* item = m_games->currentItem(); if (item) { Q_EMIT openGame(item->data(ThumbnailItem::GameRole).toInt()); } } //----------------------------------------------------------------------------- void OpenGameTab::deleteGame() { const QListWidgetItem* item = m_games->currentItem(); if (!item) { return; } if (QMessageBox::question(this, tr("Delete Game"), tr("Delete selected game?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::Yes) { QFile::remove(Path::save(item->data(ThumbnailItem::GameRole).toInt())); delete item; m_accept_button->setEnabled(m_games->count() > 0); }; } //----------------------------------------------------------------------------- tetzle-3.0.3/src/open_game_tab.h000066400000000000000000000025311476255537600165710ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_OPEN_GAME_TAB_H #define TETZLE_OPEN_GAME_TAB_H #include class QListWidget; class QPushButton; /** * Tab to choose which saved game to open. */ class OpenGameTab : public QWidget { Q_OBJECT public: /** * Construct an open game tab. * * @param current_id the currently open game to exclude * @param parent the parent widget of the tab */ explicit OpenGameTab(int current_id, QDialog* parent = nullptr); public Q_SLOTS: /** * Handle image being renamed. * * @param image the image identifier * @param name the new image name */ void imageRenamed(const QString& image, const QString& name); Q_SIGNALS: /** * Signal to start saved game. * * @param id the game to start */ void openGame(int id); protected: /** * Unset default button. */ void hideEvent(QHideEvent* event) override; /** * Set default button to #m_accept_button. */ void showEvent(QShowEvent* event) override; private Q_SLOTS: /** * Start a saved game. */ void accept(); /** * Prompt player to delete a saved game. */ void deleteGame(); private: QListWidget* m_games; ///< list of saved games QPushButton* m_accept_button; ///< button to start saved game }; #endif // TETZLE_OPEN_GAME_TAB_H tetzle-3.0.3/src/overview.cpp000066400000000000000000000114361476255537600162160ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "overview.h" #include "zoom_slider.h" #include #include #include #include #include #include #include //----------------------------------------------------------------------------- Overview::Overview(QWidget* parent) : QGraphicsView(parent) , m_min_scale_level(0) , m_scale_level(0) { setWindowTitle(tr("Overview")); setWindowFlags(Qt::Tool); setBackgroundBrush(Qt::darkGray); setBackgroundRole(QPalette::Window); setRenderHint(QPainter::SmoothPixmapTransform, true); setDragMode(ScrollHandDrag); setFrameStyle(NoFrame); // Create scene QGraphicsScene* scene = new QGraphicsScene(this); setScene(scene); m_pixmap = new QGraphicsPixmapItem; m_pixmap->setTransformationMode(Qt::SmoothTransformation); scene->addItem(m_pixmap); reset(); // Restore geometry const QSettings settings; if (settings.contains("Overview/Geometry")) { restoreGeometry(settings.value("Overview/Geometry").toByteArray()); setMinimumSize(size()); } else { resize(400, 400); setMinimumSize(size()); } m_default = settings.value("Overview/Default", true).toBool(); } //----------------------------------------------------------------------------- void Overview::load(const QImage& image, qreal pixelratio) { // Find minimum scale m_min_scale_level = ZoomSlider::maxScaleLevel(); const int side_max = std::max(image.width(), image.height()) * 0.9; int side = 400; if (side_max > side) { for (int i = ZoomSlider::maxScaleLevel(); i >= 0; --i) { const int side_test = std::floor(400.0 / ZoomSlider::scaleFactor(i)); if (side_test > side_max) { break; } m_min_scale_level = i; side = side_test; } } else { side = side_max; } QPixmap pixmap = QPixmap::fromImage(image.scaled(side * pixelratio, side * pixelratio, Qt::KeepAspectRatio, Qt::SmoothTransformation), Qt::AutoColor | Qt::AvoidDither); pixmap.setDevicePixelRatio(pixelratio); zoom(m_min_scale_level); // Resize window const bool default_size = m_default; setMinimumSize(transform().mapRect(QRect(QPoint(0,0), pixmap.size() / pixelratio)).size()); if (default_size) { resize(minimumSize()); } // Show overview setPixmap(pixmap); } //----------------------------------------------------------------------------- void Overview::reset() { // Prevent zooming m_min_scale_level = ZoomSlider::maxScaleLevel(); zoom(m_min_scale_level); // Show loading icon setPixmap(QIcon::fromTheme("image-loading").pixmap(128,128)); } //----------------------------------------------------------------------------- void Overview::moveEvent(QMoveEvent* event) { QSettings().setValue("Overview/Geometry", saveGeometry()); QGraphicsView::moveEvent(event); } //----------------------------------------------------------------------------- void Overview::hideEvent(QHideEvent* event) { Q_EMIT toggled(false); QGraphicsView::hideEvent(event); } //----------------------------------------------------------------------------- void Overview::resizeEvent(QResizeEvent* event) { m_default = (size() == minimumSize()); QSettings settings; settings.setValue("Overview/Default", m_default); settings.setValue("Overview/Geometry", saveGeometry()); QGraphicsView::resizeEvent(event); } //----------------------------------------------------------------------------- void Overview::showEvent(QShowEvent* event) { Q_EMIT toggled(true); QGraphicsView::showEvent(event); } //----------------------------------------------------------------------------- void Overview::wheelEvent(QWheelEvent* event) { if (event->angleDelta().y() > 0) { zoomIn(); } else { zoomOut(); } event->accept(); } //----------------------------------------------------------------------------- void Overview::setPixmap(const QPixmap& pixmap) { m_pixmap->setPixmap(pixmap); scene()->setSceneRect(m_pixmap->boundingRect()); centerOn(m_pixmap); } //----------------------------------------------------------------------------- void Overview::zoomIn() { zoom(m_scale_level + 1); } //----------------------------------------------------------------------------- void Overview::zoomOut() { zoom(m_scale_level - 1); } //----------------------------------------------------------------------------- void Overview::zoom(int level) { m_scale_level = std::clamp(level, m_min_scale_level, ZoomSlider::maxScaleLevel()); const float s = ZoomSlider::scaleFactor(m_scale_level); resetTransform(); scale(s, s); const Qt::ScrollBarPolicy policy = (m_scale_level > m_min_scale_level) ? Qt::ScrollBarAsNeeded : Qt::ScrollBarAlwaysOff; setHorizontalScrollBarPolicy(policy); setVerticalScrollBarPolicy(policy); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/overview.h000066400000000000000000000040631476255537600156610ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2016 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_OVERVIEW_H #define TETZLE_OVERVIEW_H #include /** * Window to show the game image as a guide. */ class Overview : public QGraphicsView { Q_OBJECT public: /** * Construct an overview window. * * @param parent the parent widget of the overview */ explicit Overview(QWidget* parent = nullptr); /** * Load an image. * * @param image the image to load * @param pixelratio the pixel ratio to render at */ void load(const QImage& image, qreal pixelratio); /** * Show loading image and reset zoom. */ void reset(); Q_SIGNALS: /** * Signal that the visibility was changed. * * @param visible @c true if the overview is visible */ void toggled(bool visible); protected: /** * Emit toggled(false) as overview is hidden. */ void hideEvent(QHideEvent* event) override; /** * Save window location. * * @note Restoring location does not work in Wayland. */ void moveEvent(QMoveEvent* event) override; /** * Save window size and handle resizing viewport. */ void resizeEvent(QResizeEvent* event) override; /** * Emit toggled(true) as overview is shown. */ void showEvent(QShowEvent* event) override; /** * Allow player to zoom overview by scrolling. */ void wheelEvent(QWheelEvent* event) override; private: /** * Set the image of the overview. * * @param pixmap the pixmap to show */ void setPixmap(const QPixmap& pixmap); /** * Increase the scale factor of the overview. */ void zoomIn(); /** * Decrease the scale factor of the overview. */ void zoomOut(); /** * Set the scale factor of the overview. * * @param level the zoom level to use */ void zoom(int level); private: QGraphicsPixmapItem* m_pixmap; ///< image to show in overview int m_min_scale_level; ///< smallest zoom level int m_scale_level; ///< current zoom level bool m_default; ///< stores if the minimum size is the same as the viewport }; #endif // TETZLE_OVERVIEW_H tetzle-3.0.3/src/path.cpp000066400000000000000000000077721476255537600153140ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2022 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "path.h" #include "board.h" #include #include #include #include #include #include //----------------------------------------------------------------------------- QString Path::m_path; //----------------------------------------------------------------------------- void Path::load(const QString& userdir) { m_path = userdir; // Find user data dir if not in portable mode if (m_path.isEmpty()) { m_path = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation); // Migrate data from old location if (!QFileInfo::exists(m_path)) { const QString oldpath = oldDataPath(); if (!oldpath.isEmpty()) { QDir dir(m_path + "/../"); dir.mkpath(dir.absolutePath()); dir.rename(oldpath, m_path); } } } // Create data location QDir dir(m_path); if (!dir.exists()) { dir.mkpath(dir.absolutePath()); } dir.mkpath(m_path + "/saves/"); // Update thumbnails if (dir.exists("previews")) { QLabel label(Board::tr("Please Wait"), nullptr, Qt::Dialog | Qt::MSWindowsFixedSizeDialogHint | Qt::CustomizeWindowHint | Qt::WindowTitleHint); label.setWindowTitle(QGuiApplication::applicationDisplayName()); label.setAlignment(Qt::AlignCenter); label.setContentsMargins(10, 10, 10, 10); label.setFixedSize(label.sizeHint()); label.show(); QCoreApplication::processEvents(); const QStringList old_dirs{ m_path + "/previews/", m_path + "/images/thumbnails/", }; for (const QString& old_dir : old_dirs) { dir.setPath(old_dir); dir.removeRecursively(); } } dir.mkpath(m_path + "/images/thumbnails/"); } //----------------------------------------------------------------------------- QString Path::image(const QString& file) { return images() + file; } //----------------------------------------------------------------------------- QString Path::thumbnail(const QString& image, qreal pixelratio) { QString pixel; if (pixelratio > 1.0) { pixel = QString("@%1x").arg(pixelratio); } return thumbnails() + image + pixel + ".png"; } //----------------------------------------------------------------------------- QString Path::save(const QString& file) { return saves() + file; } //----------------------------------------------------------------------------- QString Path::save(int game) { return save(QString::number(game) + ".xml"); } //----------------------------------------------------------------------------- QString Path::images() { return m_path + "/images/"; } //----------------------------------------------------------------------------- QString Path::thumbnails() { return m_path + "/images/thumbnails/"; } //----------------------------------------------------------------------------- QString Path::saves() { return m_path + "/saves/"; } //----------------------------------------------------------------------------- QString Path::oldDataPath() { QStringList oldpaths; QString oldpath; #if defined(Q_OS_UNIX) && !defined(Q_OS_MAC) // Data path from Qt 4 version of 2.0 oldpaths.append(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation) + "/data/GottCode/Tetzle"); #endif // Data path from 1.0 #if defined(Q_OS_MAC) oldpath = QDir::homePath() + "/Library/Application Support/GottCode/Tetzle/"; #elif defined(Q_OS_UNIX) oldpath = QString::fromLocal8Bit(qgetenv("XDG_DATA_HOME")); if (oldpath.isEmpty()) { oldpath = QDir::homePath() + "/.local/share/"; } oldpath += "/games/tetzle/"; #elif defined(Q_OS_WIN32) oldpath = QDir::homePath() + "/Application Data/GottCode/Tetzle/"; #endif if (!oldpaths.contains(oldpath)) { oldpaths.append(oldpath); } // Check if an old data location exists oldpath.clear(); for (const QString& testpath : std::as_const(oldpaths)) { if (QFileInfo::exists(testpath)) { oldpath = testpath; break; } } return oldpath; } //----------------------------------------------------------------------------- tetzle-3.0.3/src/path.h000066400000000000000000000031711476255537600147460ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2010-2022 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_PATH_H #define TETZLE_PATH_H #include /** * Shared functions to find locations of files. */ class Path { public: /** * Set up player data path. * * @param userdir the location for portable mode support */ static void load(const QString& userdir); /** * Find the path of an image. * * @param file the image to find * * @return path of image */ static QString image(const QString& file); /** * Find the path of thumbnail for an image. * * @param image the image to find * @param pixelratio the pixel ratio to render at * * @return path of thumbnail */ static QString thumbnail(const QString& image, qreal pixelratio); /** * Find the path of a saved gave. * * @param file the save game to find * * @return path of saved game */ static QString save(const QString& file); /** * Find the path of a saved gave. * * @param game the save game to find * * @return path of saved game */ static QString save(int game); /** * Fetch path of images. * * @return path of images */ static QString images(); /** * Fetch path of thumbnails. * * @return path of thumbnails */ static QString thumbnails(); /** * Fetch path of save games. * * @return path of save games */ static QString saves(); private: /** * Fetch old path of Tetzle player data. * * @return old path of Tetzle player data */ static QString oldDataPath(); private: static QString m_path; ///< path for player data }; #endif // TETZLE_PATH_H tetzle-3.0.3/src/piece.cpp000066400000000000000000000245641476255537600154430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2025 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "piece.h" #include "board.h" #include "tile.h" #include #include //----------------------------------------------------------------------------- Piece::Piece(const QPoint& pos, int rotation, const QList& tiles, Board* board) : m_board(board) , m_pos(pos) , m_tiles(tiles) , m_shadow(tiles) , m_rotation(0) , m_selected(true) , m_changed(false) { updateTiles(); updateShadow(); // Add bevels to tiles if (m_tiles.first()->bevel().y() == -1) { constexpr int bevels[14] = { 13, 15, 11, 12, 5, 4, 1, 14, 6, 7, 3, 8, 2, 0 }; for (Tile* tile : std::as_const(m_tiles)) { int sides = 0; sides |= containsTile(tile->column() - 1, tile->row()); sides |= containsTile(tile->column() + 1, tile->row()) << 1; sides |= containsTile(tile->column(), tile->row() - 1) << 2; sides |= containsTile(tile->column(), tile->row() + 1) << 3; tile->setBevel(bevels[sides - 1]); } } // Rotate rotate(rotation); setSelected(false); } //----------------------------------------------------------------------------- Piece::~Piece() { qDeleteAll(m_tiles); } //----------------------------------------------------------------------------- bool Piece::collidesWith(const Piece* other) const { if (marginRect(boundingRect()).intersects(other->boundingRect())) { return m_collision_region_expanded.intersects(other->m_collision_region); } else { return false; } } //----------------------------------------------------------------------------- QPoint Piece::randomPoint() const { const Tile* tile = m_tiles.at(m_board->randomInt(m_tiles.count())); return tile->scenePos() + QPoint(m_board->randomInt(Tile::size), m_board->randomInt(Tile::size)); } //----------------------------------------------------------------------------- void Piece::attachSolutionNeighbors() { const QSet neighbors = m_neighbors; for (Piece* piece : neighbors) { if (piece->m_rotation != m_rotation) { continue; } const Tile* tile = m_tiles.first(); const Tile* piece_tile = piece->m_tiles.first(); QPoint solution_delta = piece_tile->solutionPos() - tile->solutionPos(); for (int i = 0; i < m_rotation; ++i) { const QPoint pos = solution_delta; solution_delta.setX(-pos.y()); solution_delta.setY(pos.x()); } const QPoint top_left = tile->scenePos() + solution_delta; const QPoint delta = top_left - piece_tile->scenePos(); if (delta.manhattanLength() <= m_attach_margin) { piece->moveBy(delta); attach(piece); } } } //----------------------------------------------------------------------------- void Piece::findSolutionNeighbors(const QList& pieces) { // Find neighbor tiles constexpr QPoint deltas[4] = { QPoint(-1,0), QPoint(1,0), QPoint(0,-1), QPoint(0,1) }; QList tiles; for (const Tile* tile : std::as_const(m_shadow)) { const QPoint pos(tile->column(), tile->row()); for (const QPoint& delta : deltas) { const QPoint neighbor = pos + delta; if (!containsTile(neighbor.x(), neighbor.y()) && !tiles.contains(neighbor)) { tiles.append(neighbor); } } } // Find neighbor pieces for (Piece* piece : pieces) { for (const QPoint& tile : std::as_const(tiles)) { if (piece->containsTile(tile.x(), tile.y())) { m_neighbors.insert(piece); break; } } } } //----------------------------------------------------------------------------- void Piece::pushCollidingPieces(const QPointF& inertia) { while (Piece* target = m_board->findCollidingPiece(this)) { // Determine which piece to move Piece* source = this; if (m_tiles.count() < target->m_tiles.count()) { std::swap(source, target); } const QRect source_rect = marginRect(source->boundingRect()); // Calculate valid movement vector for target; preserve some motion from last move QPointF vector = target->boundingRect().center() - source_rect.center() + inertia; while (vector.manhattanLength() < 1.0) { vector.setX( (m_board->randomInt(Tile::size)) - (Tile::size / 2) ); vector.setY( (m_board->randomInt(Tile::size)) - (Tile::size / 2) ); } // Scale movement vector so that the largest dimension is 1 const QPointF direction = vector / std::max(fabs(vector.x()), fabs(vector.y())); // Push target until it is clear from current source // We use a binary-search, pushing away if collision, retracting otherwise const QPoint orig = target->m_pos; const QRect united = source_rect.united(target->boundingRect()); float min = 0.0f; float max = united.width() * united.height(); Q_FOREVER { const float test = (min + max) / 2.0f; target->m_pos = orig + (test * direction).toPoint(); if (source->collidesWith(target)) { min = test; } else { max = test; if (max - min < 1.0f) { break; } Q_ASSERT(max - min > 0.01f); } } target->updateFragmentLists(); Q_ASSERT(min < max); Q_ASSERT(!source->collidesWith(target)); // Recurse, and keep inertia for stability. target->pushCollidingPieces(vector); } } //----------------------------------------------------------------------------- void Piece::rotate(int rotations) { if (rotations) { for (int i = 0; i < rotations; ++i) { rotate(); } } else { updateFragmentLists(); } } //----------------------------------------------------------------------------- void Piece::rotate(const QPoint& origin) { // Rotate 90 degrees counter-clockwise around origin if (!origin.isNull()) { QPoint pos = m_pos; pos.ry() += m_rect.height(); m_pos.setX( origin.y() + origin.x() - pos.y() ); m_pos.setY( origin.y() - origin.x() + pos.x() ); } m_rect.setRect(0, 0, m_rect.height(), m_rect.width()); // Rotate tiles 90 degrees counter-clockwise for (Tile* tile : std::as_const(m_tiles)) { tile->rotate(); } // Track how many rotations have occured m_rotation += 1; if (m_rotation > 3) { m_rotation = 0; } updateFragmentLists(); } //----------------------------------------------------------------------------- void Piece::setSelected(bool selected) { m_selected = selected; if (!m_selected && m_changed) { updateCollisionRegions(); } } //----------------------------------------------------------------------------- void Piece::save(QXmlStreamWriter& xml) const { xml.writeStartElement("piece"); xml.writeAttribute("x", QString::number(m_pos.x())); xml.writeAttribute("y", QString::number(m_pos.y())); xml.writeAttribute("rotation", QString::number(m_rotation)); for (const Tile* tile : std::as_const(m_tiles)) { tile->save(xml); } xml.writeEndElement(); } //----------------------------------------------------------------------------- void Piece::attach(Piece* piece) { Q_ASSERT(piece != this); // Update position m_pos.setX(std::min(m_pos.x(), piece->m_pos.x())); m_pos.setY(std::min(m_pos.y(), piece->m_pos.y())); // Update shadow m_shadow += piece->m_shadow; updateShadow(); // Update position of attached tiles const int rotation = m_rotation; for (int i = rotation; i < 4; ++i) { rotate(); piece->rotate(); } m_tiles += piece->m_tiles; piece->m_tiles.clear(); updateTiles(); rotate(rotation); // Update neighbors m_neighbors += piece->m_neighbors; m_neighbors.remove(piece); m_neighbors.remove(this); for (Piece* neighbor : std::as_const(m_neighbors)) { neighbor->m_neighbors.remove(piece); neighbor->m_neighbors.insert(this); } // Remove attached piece m_board->removePiece(piece); } //----------------------------------------------------------------------------- bool Piece::containsTile(int column, int row) const { bool result = false; for (const Tile* tile : std::as_const(m_tiles)) { if (tile->column() == column && tile->row() == row) { result = true; break; } } return result; } //----------------------------------------------------------------------------- void Piece::updateCollisionRegions() { m_changed = false; m_collision_region = QRegion(); m_collision_region_expanded = QRegion(); QRect rect(0,0, Tile::size, Tile::size); for (const Tile* tile : std::as_const(m_tiles)) { rect.moveTo(tile->scenePos()); m_collision_region += rect; m_collision_region_expanded += marginRect(rect); } } //----------------------------------------------------------------------------- void Piece::updateFragmentLists() { m_changed = true; if (!m_selected) { updateCollisionRegions(); } constexpr QPoint offset(Tile::size / 2, Tile::size / 2); // Update tile and bevel fragments m_tiles_list.clear(); m_tiles_list.reserve(m_tiles.count()); m_bevel_list.clear(); m_bevel_list.reserve(m_tiles.count()); for (const Tile* tile : std::as_const(m_tiles)) { const QPoint pos = tile->scenePos() + offset; m_tiles_list.append(pos, tile->solutionPos(), Tile::size, rotation() * 90); m_bevel_list.append(pos, tile->bevel() * 512, Tile::size); } // Update shadow fragments m_shadow_list.clear(); m_shadow_list.reserve(m_shadow.count()); for (const Tile* tile : std::as_const(m_shadow)) { m_shadow_list.append(tile->scenePos() + offset, QPointF(0, 0), Tile::size * 2); } // Update scene rectangle m_board->updateSceneRectangle(this); } //----------------------------------------------------------------------------- void Piece::updateShadow() { QMutableListIterator i(m_shadow); while (i.hasNext()) { const Tile* tile = i.next(); if (containsTile(tile->column() - 1, tile->row()) && containsTile(tile->column() + 1, tile->row()) && containsTile(tile->column(), tile->row() - 1) && containsTile(tile->column(), tile->row() + 1)) { i.remove(); } } } //----------------------------------------------------------------------------- void Piece::updateTiles() { // Find bounding rectangle QPoint top_left = m_tiles.first()->solutionPos(); QPoint bottom_right = top_left + QPoint(Tile::size, Tile::size); for (const Tile* tile : std::as_const(m_tiles)) { const QPoint pos = tile->solutionPos(); top_left.setX( std::min(pos.x(), top_left.x()) ); top_left.setY( std::min(pos.y(), top_left.y()) ); bottom_right.setX( std::max(pos.x() + Tile::size, bottom_right.x()) ); bottom_right.setY( std::max(pos.y() + Tile::size, bottom_right.y()) ); } m_rect.setRect(0, 0, bottom_right.x() - top_left.x(), bottom_right.y() - top_left.y()); // Shift tiles to be inside rectangle for (Tile* tile : std::as_const(m_tiles)) { tile->setParent(this); tile->setPos(tile->solutionPos() - top_left); } } //----------------------------------------------------------------------------- tetzle-3.0.3/src/piece.h000066400000000000000000000126771476255537600151120ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_PIECE_H #define TETZLE_PIECE_H #include "fragment_list.h" class Board; class Tile; #include #include #include #include #include #include /** * A piece on the board. */ class Piece { public: /** * Construct a piece. * * @param pos location in scene * @param rotation how many times it is rotated 90 degrees * @param tiles the list of tiles that make up the piece * @param board the game board */ Piece(const QPoint& pos, int rotation, const QList& tiles, Board* board); /** * Clean up piece. */ ~Piece(); /** * Check if piece collides with another piece. * * @param other the piece to check for collision * * @return @c true if it collides */ bool collidesWith(const Piece* other) const; /** * Check if piece contains a position. * * @param pos the position to check * * @return @c true if it contains position */ bool contains(const QPoint& pos) const { return m_collision_region.contains(pos); } /** * Fetch bounding rectangle of the piece. * * @return bounding rectangle of the piece */ QRect boundingRect() const { return m_rect.translated(m_pos); } /** * Fetch if piece is selected. * * @return @c true if piece is selected */ bool isSelected() const { return m_selected; } /** * Fetch random position inside piece. * * @return random position inside piece */ QPoint randomPoint() const; /** * Fetch how many times piece is rotated 90 degrees. * * @return how many times piece is rotated 90 degrees */ int rotation() const { return m_rotation; } /** * Fetch location of piece in scene. * * @return location of piece in scene */ QPoint scenePos() const { return m_pos; } /** * Fetch pixmap fragments for tile bevels. * * @return list of pixmap fragments for bevels */ FragmentList bevel() const { return m_bevel_list; } /** * Fetch pixmap fragments for border shadow. * * @return list of pixmap fragments for shadow */ FragmentList shadow() const { return m_shadow_list; } /** * Fetch pixmap fragments for tiles. * * @return list of pixmap fragments for tiles */ FragmentList tiles() const { return m_tiles_list; } /** * Attempt to attach neighboring pieces in solution. */ void attachSolutionNeighbors(); /** * Find neighbors in solution. * * @param pieces list of pieces to check for neighbors */ void findSolutionNeighbors(const QList& pieces); /** * Move piece. * * @param delta how far to move piece */ void moveBy(const QPoint& delta) { m_pos += delta; updateFragmentLists(); } /** * Push colliding pieces. * * @param inertia the inertia from a previous push */ void pushCollidingPieces(const QPointF& inertia = QPointF()); /** * Rotate piece. * * @param rotations how many times to rotate piece 90 degrees */ void rotate(int rotations); /** * Rotate piece 90 degrees. * * @param origin center to rotate around */ void rotate(const QPoint& origin = QPoint()); /** * Set position of piece in scene. * * @param pos scene location of piece */ void setPosition(const QPoint& pos) { m_pos = pos; updateFragmentLists(); } /** * Select piece. * * @param selected @c true if piece is selected */ void setSelected(bool selected); /** * Save piece details. * * @param xml where to save details */ void save(QXmlStreamWriter& xml) const; private: /** * Merge another piece into this piece. The other piece will be destroyed. * * @param piece the piece to attach */ void attach(Piece* piece); /** * Check if piece contains a tile. * * @param column the column of the tile * @param row the row of the tile * * @return @c true if piece contains tile */ bool containsTile(int column, int row) const; /** * Expand a rectangle by the margin for attaching. * * @param rect the rectangle to expand * * @return rectangle expanded by attach margin */ QRect marginRect(const QRect& rect) const { return rect.adjusted(-m_attach_margin, -m_attach_margin, m_attach_margin, m_attach_margin); } /** * Update collision regions to contain all tiles in piece. */ void updateCollisionRegions(); /** * Update pixmap fragment lists for drawing. */ void updateFragmentLists(); /** * Update shadow to be only under edge tiles of piece. */ void updateShadow(); /** * Update tiles to belong to piece. */ void updateTiles(); private: Board* m_board; ///< game board QPoint m_pos; ///< location in scene QRect m_rect; ///< bounding rectangle FragmentList m_tiles_list; ///< pixmap fragments of tiles FragmentList m_bevel_list; ///< pixmap fragments of bevels FragmentList m_shadow_list; ///< pixmap fragments of shadow QList m_tiles; ///< tiles of piece QList m_shadow; ///< tiles of piece with shadow QSet m_neighbors; ///< neighboring pieces in solution int m_rotation; ///< how many times is the piece rotated 90 degrees bool m_selected; ///< is the piece selected bool m_changed; ///< are collision regions out of date QRegion m_collision_region; ///< collision region QRegion m_collision_region_expanded; ///< collision region expanded by attach margin static constexpr int m_attach_margin = 16; ///< maximum distance between pieces before they attach }; #endif // TETZLE_PIECE_H tetzle-3.0.3/src/tag_item.h000066400000000000000000000021321476255537600155770ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_TAG_ITEM_H #define TETZLE_TAG_ITEM_H #include /** * Tag listwidget item. */ class TagItem : public QListWidgetItem { public: /** * Construct a tag item. * * @param text the text to display */ explicit TagItem(const QString& tag = QString()) : QListWidgetItem(tag) { setData(Qt::UserRole, tag); setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable); } /** * Compare two strings using locale-aware comparison. * * @param a first string * @param b second string * * @return @c true if @a is less than @b */ static bool compare(const QString& a, const QString& b) { return a.localeAwareCompare(b) < 0; } /** * Compare item with another item using locale-aware comparison. * * @param other the item to compare * * @return @c true if less than other item */ bool operator<(const QListWidgetItem& other) const override { return compare(text(), other.text()); } }; #endif // TETZLE_TAG_ITEM_H tetzle-3.0.3/src/tag_manager.cpp000066400000000000000000000214371476255537600166170ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "tag_manager.h" #include "path.h" #include "tag_item.h" #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- TagManager::TagManager(QWidget* parent) : QComboBox(parent) { connect(this, &QComboBox::currentIndexChanged, this, &TagManager::currentTagChanged); // Create manage dialog m_manage_dialog = new QDialog(this); QString title = tr("Manage Tags..."); title.remove("..."); m_manage_dialog->setWindowTitle(title); QPushButton* add_tag_button = new QPushButton(QIcon::fromTheme("list-add"), tr("Add Tag"), m_manage_dialog); connect(add_tag_button, &QPushButton::clicked, this, &TagManager::addTag); m_remove_tag_button = new QPushButton(QIcon::fromTheme("list-remove"), tr("Remove Tag"), m_manage_dialog); connect(m_remove_tag_button, &QPushButton::clicked, this, &TagManager::removeTag); QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Close, m_manage_dialog); buttons->addButton(add_tag_button, QDialogButtonBox::ActionRole); buttons->addButton(m_remove_tag_button, QDialogButtonBox::ActionRole); connect(buttons, &QDialogButtonBox::rejected, m_manage_dialog, &QDialog::reject); // Add filter m_tags_list = new QListWidget(m_manage_dialog); m_tags_list->setMovement(QListView::Static); m_tags_list->setResizeMode(QListView::Adjust); m_tags_list->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); m_tags_list->setSelectionBehavior(QAbstractItemView::SelectItems); m_tags_list->setSelectionMode(QAbstractItemView::SingleSelection); connect(m_tags_list, &QListWidget::currentItemChanged, this, [this](QListWidgetItem* item) { m_remove_tag_button->setEnabled(item); }); connect(m_tags_list, &QListWidget::itemChanged, this, &TagManager::tagChanged); QVBoxLayout* manage_layout = new QVBoxLayout(m_manage_dialog); manage_layout->addWidget(m_tags_list); manage_layout->addSpacing(12); manage_layout->addWidget(buttons); // Add tags m_all = QDir(Path::images(), "*.*", QDir::Name | QDir::LocaleAware, QDir::Files).entryList(); QSettings file(Path::image("tags"), QSettings::IniFormat); file.beginGroup("Tags"); const QStringList tags = file.childKeys(); QStringList images; const QDir folder(Path::images(), "*.*"); for (const QString& tag : tags) { images = file.value(tag).toStringList(); QMutableStringListIterator i(images); while (i.hasNext()) { i.next(); if (!folder.exists(i.value())) { i.remove(); } } m_tags[tag] = images; QListWidgetItem* item = new QListWidgetItem(tag); item->setData(Qt::UserRole, item->text()); item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsEditable | Qt::ItemIsSelectable); m_tags_list->addItem(item); } m_tags_list->sortItems(); m_remove_tag_button->setEnabled(!m_tags.isEmpty()); updateFilter(); clearFilter(); } //----------------------------------------------------------------------------- QStringList TagManager::images(const QString& tag) const { return m_tags.value(tag); } //----------------------------------------------------------------------------- QStringList TagManager::tags() const { QStringList tags = m_tags.keys(); std::sort(tags.begin(), tags.end(), &TagItem::compare); return tags; } //----------------------------------------------------------------------------- QString TagManager::tags(const QString& image) const { QStringList tags; QHashIterator i(m_tags); while (i.hasNext()) { i.next(); if (i.value().contains(image)) { tags.append(i.key()); } } std::sort(tags.begin(), tags.end(), &TagItem::compare); return tags.join(", "); } //----------------------------------------------------------------------------- void TagManager::clearFilter() { setCurrentIndex(0); } //----------------------------------------------------------------------------- void TagManager::addImage(const QString& image) { m_all.append(image); updateFilter(); } //----------------------------------------------------------------------------- void TagManager::removeImage(const QString& image) { setImageTags(image, QStringList()); m_all.removeOne(image); updateFilter(); } //----------------------------------------------------------------------------- void TagManager::setImageTags(const QString& image, const QStringList& tags) { // Add new tags for (const QString& tag : tags) { if (!m_tags.contains(tag)) { createTag(tag); } } // Add or remove image from tags bool changed = false; QMutableHashIterator i(m_tags); while (i.hasNext()) { i.next(); const bool tagged = tags.contains(i.key()); QStringList& tag = i.value(); if (tag.contains(image)) { if (!tagged) { changed = true; tag.removeOne(image); } } else { if (tagged) { changed = true; tag.append(image); } } } if (changed) { storeTags(); } } //----------------------------------------------------------------------------- void TagManager::addTag() { // Find first unused tag int new_tag = 0; QString tag; do { tag = tr("Untitled %1").arg(++new_tag); } while(m_tags.contains(tag)); // Add tag QListWidgetItem* item = createTag(tag); m_tags_list->setCurrentItem(item, QItemSelectionModel::ClearAndSelect); m_tags_list->editItem(item); } //----------------------------------------------------------------------------- void TagManager::removeTag() { // Find current item const QListWidgetItem* item = m_tags_list->currentItem(); if (!item) { return; } // Ask before removing if (QMessageBox::question(window(), tr("Question"), tr("Remove selected tag?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) == QMessageBox::No) { return; } // Remove item const QString tag = item->text(); delete item; item = nullptr; // Remove tag m_tags.remove(tag); m_remove_tag_button->setEnabled(!m_tags.isEmpty()); storeTags(); updateFilter(); Q_EMIT tagsChanged(); } //----------------------------------------------------------------------------- void TagManager::currentTagChanged(int index) { const QString action = itemData(index).toString(); QStringList filter; if (action == "ALL") { filter = m_all; } else if (action == "UNTAGGED") { filter = m_all; QHashIterator i(m_tags); while (i.hasNext()) { i.next(); for (const QString& image : i.value()) { filter.removeOne(image); } } } else if (action == "MANAGE") { clearFilter(); m_tags_list->setCurrentRow(0); m_tags_list->scrollToTop(); m_manage_dialog->exec(); return; } else { filter = images(itemText(index)); } Q_EMIT filterChanged(filter); } //----------------------------------------------------------------------------- void TagManager::tagChanged(QListWidgetItem* item) { if (!item) { return; } const QString tag = item->text(); const QString old_tag = item->data(Qt::UserRole).toString(); if (tag != old_tag) { m_tags_list->blockSignals(true); if (tag.isEmpty()) { // Don't allow empty tags item->setText(old_tag); } else if (m_tags.contains(tag)) { // Don't allow duplicate tags item->setText(old_tag); QMessageBox::warning(window(), tr("Sorry"), tr("A tag with that name already exists.")); } else { // Rename tag item->setData(Qt::UserRole, tag); m_tags.insert(tag, m_tags.take(old_tag)); storeTags(); m_tags_list->sortItems(); updateFilter(); Q_EMIT tagsChanged(); } m_tags_list->blockSignals(false); } } //----------------------------------------------------------------------------- QListWidgetItem* TagManager::createTag(const QString& tag) { m_remove_tag_button->setEnabled(true); // Add tag m_tags.insert(tag, QStringList()); storeTags(); // Add tag item QListWidgetItem* item = new TagItem(tag); m_tags_list->addItem(item); // Update list of tags m_tags_list->sortItems(); updateFilter(); return item; } //----------------------------------------------------------------------------- void TagManager::storeTags() const { QSettings file(Path::image("tags"), QSettings::IniFormat); file.clear(); file.beginGroup("Tags"); QHashIterator i(m_tags); while (i.hasNext()) { i.next(); file.setValue(i.key(), i.value()); } } //----------------------------------------------------------------------------- void TagManager::updateFilter() { blockSignals(true); clear(); addItem(tr("All Images"), "ALL"); for (int i = 0, count = m_tags_list->count(); i < count; ++i) { addItem(m_tags_list->item(i)->text()); } addItem(tr("Untagged"), "UNTAGGED"); insertSeparator(count()); addItem(tr("Manage Tags..."), "MANAGE"); blockSignals(false); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/tag_manager.h000066400000000000000000000057641476255537600162710ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_TAG_MANAGER_H #define TETZLE_TAG_MANAGER_H #include #include #include class QDialog; class QListWidget; class QListWidgetItem; class QPushButton; /** * Combobox that manages tags. */ class TagManager : public QComboBox { Q_OBJECT public: /** * Construct a tag manager widget. * * @param parent the parent widget of the tag manager */ explicit TagManager(QWidget* parent = nullptr); /** * Check if a tag exists. * * @param tag the tag to check * * @return @c true if a tag exists */ bool hasTag(const QString& tag) const { return tag.isEmpty() || m_tags.contains(tag); } /** * Fetch images contained in a tag. * * @param tag the tag to look up * * @return list of images contained in tag */ QStringList images(const QString& tag) const; /** * Fetch sorted list of all tags. * * @return sorted list of all tags */ QStringList tags() const; /** * Fetch tags that contain an image. * * @param image the image to check * * @return tags containing image, sorted and combined into single string */ QString tags(const QString& image) const; /** * Show all images. */ void clearFilter(); /** * Add an image. * * @param image the image to add */ void addImage(const QString& image); /** * Remove an image from all tags. * * @param image the image to remove */ void removeImage(const QString& image); /** * Set the list of tags for an image. * * @param image the image to modify * @param tags the tags which contain the image */ void setImageTags(const QString& image, const QStringList& tags); Q_SIGNALS: /** * Signal to only show certain images. * * @param images the list of images to show */ void filterChanged(const QStringList& images); /** * Signal that the list of tags has changed. */ void tagsChanged(); private Q_SLOTS: /** * Add a new untitled tag. */ void addTag(); /** * Remove selected tag. */ void removeTag(); /** * Update filter of which images to show. * * @param index only show images in this tag */ void currentTagChanged(int index); /** * Handle renaming of a tag. Prevents empty or duplicate tags. * * @param item the item representing the tag */ void tagChanged(QListWidgetItem* item); private: /** * Construct a listwidget item. * * @param tag the tag to create a listwidget item for */ QListWidgetItem* createTag(const QString& tag); /** * Save tags. */ void storeTags() const; /** * Update combobox items to match list of tags. */ void updateFilter(); private: QHash m_tags; ///< list of tags QStringList m_all; ///< all images QDialog* m_manage_dialog; ///< dialog to add, edit, or remove tags QListWidget* m_tags_list; ///< list of tags in dialog QPushButton* m_remove_tag_button; ///< accept button for dialog }; #endif // TETZLE_TAG_MANAGER_H tetzle-3.0.3/src/thumbnail_delegate.cpp000066400000000000000000000125631476255537600201670ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011-2015 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "thumbnail_delegate.h" #include "thumbnail_item.h" #include #include #include #include //----------------------------------------------------------------------------- ThumbnailDelegate::ThumbnailDelegate(QListWidget* list) : QStyledItemDelegate(list) , m_list(list) , m_small_font_metrics(m_small_font) { setFont(list->font()); list->installEventFilter(this); } //----------------------------------------------------------------------------- void ThumbnailDelegate::paint(QPainter* painter, const QStyleOptionViewItem& opt, const QModelIndex& index) const { QStyleOptionViewItem option = opt; initStyleOption(&option, index); painter->save(); // Find colors QIcon::Mode mode = QIcon::Normal; #ifndef Q_OS_MAC const QPalette::ColorGroup cg = option.widget->hasFocus() ? QPalette::Normal : QPalette::Inactive; #else const QPalette::ColorGroup cg = QApplication::focusWidget() ? QPalette::Normal : QPalette::Inactive; #endif QColor color = option.palette.color(cg, QPalette::Text); QColor background_color; if (option.state & QStyle::State_Selected) { mode = QIcon::Selected; color = option.palette.color(cg, QPalette::HighlightedText); background_color = option.palette.color(cg, QPalette::Highlight); } // Calculate element locations Qt::Alignment alignment = Qt::AlignVCenter; const int line_height = option.fontMetrics.lineSpacing(); const int small_line_height = m_small_font_metrics.lineSpacing(); QRect thumbnail_rect, text_rect, small_text_rect; if (option.decorationPosition == QStyleOptionViewItem::Top) { // Centered text with icon on top alignment |= Qt::AlignHCenter; thumbnail_rect.setRect(option.rect.left() + 2 + (option.rect.width() - 74) / 2, option.rect.top() + 2, 74, 74); const int text_width = option.rect.width() - 4; text_rect.setRect(option.rect.left() + 2, thumbnail_rect.bottom() + 1, text_width, line_height); small_text_rect.setRect(text_rect.left(), text_rect.bottom() + 1, text_width, small_line_height); } else if (option.direction == Qt::LeftToRight) { // Left aligned alignment |= Qt::AlignLeft; thumbnail_rect.setRect(option.rect.left() + 5, option.rect.top() + 2 + (option.rect.height() - 74) / 2, 74, 74); const int text_height = line_height + small_line_height; const int text_width = option.rect.width() - 4 - thumbnail_rect.width(); text_rect.setRect(thumbnail_rect.right() + 7, option.rect.top() + 2 + (option.rect.height() - text_height) / 2, text_width, line_height); small_text_rect.setRect(text_rect.left(), text_rect.bottom() + 1, text_width, small_line_height); } else { // Right aligned alignment |= Qt::AlignRight; thumbnail_rect.setRect(option.rect.right() - 80, option.rect.top() + 2 + (option.rect.height() - 74) / 2, 74, 74); const int text_height = line_height + small_line_height; const int text_width = thumbnail_rect.left() - 6; text_rect.setRect(2, option.rect.top() + 2 + (option.rect.height() - text_height) / 2, text_width, line_height); small_text_rect.setRect(2, text_rect.bottom() + 1, text_width, small_line_height); } // Draw background QStyle* style = option.widget ? option.widget->style() : QApplication::style(); if (background_color.isValid()) { option.backgroundBrush = background_color; } style->drawPrimitive(QStyle::PE_PanelItemViewItem, &option, painter, option.widget); // Draw decoration const QPixmap thumbnail = option.icon.pixmap(74, 74, mode); painter->drawPixmap(thumbnail_rect, thumbnail); // Draw text painter->setFont(option.font); QString text = painter->fontMetrics().elidedText(index.data(Qt::DisplayRole).toString(), option.textElideMode, text_rect.width(), option.displayAlignment); painter->setPen(color); painter->drawText(text_rect, alignment, text); // Draw small text painter->setFont(m_small_font); text = painter->fontMetrics().elidedText(index.data(ThumbnailItem::SmallDisplayRole).toString(), option.textElideMode, small_text_rect.width(), option.displayAlignment); color.setAlphaF(0.6); painter->setPen(color); painter->drawText(small_text_rect, alignment, text); painter->restore(); } //----------------------------------------------------------------------------- QSize ThumbnailDelegate::sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const { Q_UNUSED(index); const int text_height = option.fontMetrics.lineSpacing() + m_small_font_metrics.lineSpacing(); if (option.decorationPosition == QStyleOptionViewItem::Top) { return QSize(150, 78 + text_height); } else { return QSize(option.rect.width(), std::max(78, text_height + 4)); } } //----------------------------------------------------------------------------- bool ThumbnailDelegate::eventFilter(QObject* object, QEvent* event) { if (object == m_list) { if (event->type() == QEvent::FontChange) { setFont(m_list->font()); } return false; } else { return QStyledItemDelegate::eventFilter(object, event); } } //----------------------------------------------------------------------------- void ThumbnailDelegate::setFont(const QFont& font) { const QFontInfo info(font); m_small_font = QFont(info.family(), info.pointSize() - 2); m_small_font.setItalic(true); m_small_font_metrics = QFontMetrics(m_small_font); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/thumbnail_delegate.h000066400000000000000000000030501476255537600176230ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_THUMBNAIL_DELEGATE_H #define TETZLE_THUMBNAIL_DELEGATE_H #include #include class QListWidget; /** * Custom delegate for showing thumbnails */ class ThumbnailDelegate : public QStyledItemDelegate { public: /** * Construct a delegate. * * @param list the listwidget the delegate is for, used for fetching fonts. */ explicit ThumbnailDelegate(QListWidget* list = nullptr); /** * Draw the delegate. * * @param painter the painter to use for drawing * @param option the options to use for drawing * @param index the item to draw */ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const override; /** * Calculate the minimum size of an item. * * @param option the options to use for drawing * @param index the item to find size for * * @return minimum size of an item */ QSize sizeHint(const QStyleOptionViewItem& option, const QModelIndex& index) const override; protected: /** * Handle font change. */ bool eventFilter(QObject* object, QEvent* event) override; private: /** * Find small version of font. * * @param font the font to start from */ void setFont(const QFont& font); private: QListWidget* m_list; ///< listwidget for delegate QFont m_small_font; ///< font for secondary text QFontMetrics m_small_font_metrics; ///< font metrics for secondary text }; #endif // TETZLE_THUMBNAIL_DELEGATE_H tetzle-3.0.3/src/thumbnail_item.h000066400000000000000000000024631476255537600170160ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_THUMBNAIL_ITEM_H #define TETZLE_THUMBNAIL_ITEM_H #include /** * Thumbnail listwidget item. */ class ThumbnailItem : public QListWidgetItem { public: /** * Construct a thumbnail item. * * @param text the text of the item */ explicit ThumbnailItem(const QString& text = QString()) : QListWidgetItem(QIcon::fromTheme("image-loading"), text) { } /** * Compare text and image identifier to another thumbnail item using locale-aware comparison. * * @param other thumbnail item to compare with */ bool operator<(const QListWidgetItem& other) const override { int compare = text().localeAwareCompare(other.text()); if (compare == 0) { compare = data(ImageRole).toString().localeAwareCompare(other.data(ImageRole).toString()); } return compare < 0; } /** * Roles for the thumbnail item data. */ enum ItemRoles { ImageRole = Qt::UserRole, ///< image identifier SmallDisplayRole, ///< secondary text DetailsRole = SmallDisplayRole, ///< details of the game; piece count and completion TagsRole = SmallDisplayRole, ///< list of tags GameRole, ///< game identifier NameRole ///< image name }; }; #endif // TETZLE_THUMBNAIL_ITEM_H tetzle-3.0.3/src/thumbnail_loader.cpp000066400000000000000000000113731476255537600176610ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2016 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "thumbnail_loader.h" #include "path.h" #include "thumbnail_item.h" #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- // Exported by QtGui void qt_blurImage(QPainter* p, QImage& blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); //----------------------------------------------------------------------------- /** * Details of thumbnail to generate. */ struct Thumbnail { QListWidget* list; ///< listwidget that contains thumbnail item QPersistentModelIndex index; ///< location in listwidget QString image; ///< image to generate thumbnail QString thumbnail; ///< location of generated thumbnail qreal pixelratio; ///< pixel ratio to render at }; Q_DECLARE_METATYPE(Thumbnail) //----------------------------------------------------------------------------- ThumbnailLoader::ThumbnailLoader(QObject* parent) : QThread(parent) , m_done(false) { connect(this, &ThumbnailLoader::loaded, this, &ThumbnailLoader::imageLoaded, Qt::QueuedConnection); } //----------------------------------------------------------------------------- ThumbnailLoader::~ThumbnailLoader() { m_mutex.lock(); m_done = true; m_mutex.unlock(); wait(); } //----------------------------------------------------------------------------- QListWidgetItem* ThumbnailLoader::createItem(const QString& image, const QString& text, QListWidget* list, qreal pixelratio) { static ThumbnailLoader* loader = nullptr; if (!loader) { qRegisterMetaType("Thumbnail"); loader = new ThumbnailLoader(QCoreApplication::instance()); } QListWidgetItem* item = new ThumbnailItem(text); item->setData(ThumbnailItem::ImageRole, image); list->addItem(item); const QFileInfo image_info(Path::image(image)); const QFileInfo thumb_info(Path::thumbnail(image_info.baseName(), pixelratio)); const Thumbnail details{ list, list->model()->index(list->row(item), 0), image_info.filePath(), thumb_info.filePath(), pixelratio }; if (!thumb_info.exists() || thumb_info.lastModified() < image_info.lastModified()) { loader->m_mutex.lock(); loader->m_details.append(details); loader->m_mutex.unlock(); if (!loader->isRunning()) { loader->start(); } } else { loader->imageLoaded(details); } return item; } //----------------------------------------------------------------------------- void ThumbnailLoader::run() { Q_FOREVER { // Fetch next thumbnail to process m_mutex.lock(); if (m_done || m_details.isEmpty()) { m_mutex.unlock(); break; } const Thumbnail details = m_details.takeFirst(); m_mutex.unlock(); // Skip already generated thumbnails if (!QFileInfo::exists(details.image)) { continue; } else if (QFileInfo::exists(details.thumbnail)) { Q_EMIT loaded(details); continue; } // Generate thumbnail QImageReader source(details.image); QSize size = source.size(); if (size.width() > 64 || size.height() > 64) { size.scale(64, 64, Qt::KeepAspectRatio); source.setScaledSize(size * details.pixelratio); } QImage thumbnail(74 * details.pixelratio, 74 * details.pixelratio, QImage::Format_ARGB32); thumbnail.setDevicePixelRatio(details.pixelratio); thumbnail.fill(0); { QPainter painter(&thumbnail); QImage shadow(thumbnail.size(), QImage::Format_ARGB32_Premultiplied); shadow.fill(0); QPainter shadow_painter(&shadow); shadow_painter.setRenderHint(QPainter::Antialiasing); shadow_painter.setPen(Qt::NoPen); shadow_painter.translate(35 - (size.width() / 2), 35 - (size.height() / 2)); shadow_painter.fillRect(QRectF(0, 0, size.width() + 4, size.height() + 4), Qt::black); shadow_painter.end(); painter.save(); painter.setClipping(false); qt_blurImage(&painter, shadow, 8, true, false); painter.restore(); painter.translate(32 - (size.width() / 2), 32 - (size.height() / 2)); painter.fillRect(2, 2, size.width() + 4, size.height() + 4, Qt::white); QImage image = source.read(); image.setDevicePixelRatio(details.pixelratio); painter.drawImage(4, 4, image, 0, 0, -1, -1, Qt::AutoColor | Qt::AvoidDither); } thumbnail.save(details.thumbnail, 0, 0); Q_EMIT loaded(details); } } //----------------------------------------------------------------------------- void ThumbnailLoader::imageLoaded(const Thumbnail& details) { if (details.index.isValid()) { details.list->item(details.index.row())->setIcon(QPixmap(details.thumbnail)); } } //----------------------------------------------------------------------------- tetzle-3.0.3/src/thumbnail_loader.h000066400000000000000000000031521476255537600173220ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2016 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_THUMBNAIL_LOADER_H #define TETZLE_THUMBNAIL_LOADER_H struct Thumbnail; #include #include #include class QListWidget; class QListWidgetItem; /** * Thread to load thumbnails. */ class ThumbnailLoader : public QThread { Q_OBJECT /** * Construct a thumbnail loading thread. * * @param parent the parent object of the thread */ explicit ThumbnailLoader(QObject* parent = nullptr); public: /** * Clean up thumbnail loading thread. */ ~ThumbnailLoader(); /** * Create thumbnail for an image. This will start the loading thread if it is not running. * * @param image the image to use * @param text the text of the thumbnail item * @param list the listwidget for the thumbnail item * @param pixelratio the pixel ratio to render at */ static QListWidgetItem* createItem(const QString& image, const QString& text, QListWidget* list, qreal pixelratio); Q_SIGNALS: /** * Signal that a thumbnail has been created. * * @param details the details of the thumbnail */ void loaded(const Thumbnail& details); protected: /** * Create thumbnails. */ void run() override; private Q_SLOTS: /** * Set image for thumbnail item. * * @param details the details of the thumbnail */ void imageLoaded(const Thumbnail& details); private: bool m_done; ///< track if cancelled QList m_details; ///< list of thumbnails to load QMutex m_mutex; ///< mutex to protect list of thumbnails }; #endif // TETZLE_THUMBNAIL_LOADER_H tetzle-3.0.3/src/tile.cpp000066400000000000000000000032251476255537600153020ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "tile.h" #include "board.h" #include "piece.h" #include //----------------------------------------------------------------------------- Tile::Tile(int column, int row) : m_parent(nullptr) , m_column(column) , m_row(row) , m_pos(column * size, row * size) , m_bevel(0) , m_bevel_coords(-1,-1) { } //----------------------------------------------------------------------------- QPoint Tile::scenePos() const { return m_pos + m_parent->scenePos(); } //----------------------------------------------------------------------------- void Tile::rotate() { std::swap(m_pos.rx(), m_pos.ry()); m_pos.setX(-m_pos.x() + m_parent->boundingRect().width() - Tile::size); m_bevel_coords.setX( (m_bevel_coords.x() > 0.1) ? (m_bevel_coords.x() - 0.25) : 0.8125 ); } //----------------------------------------------------------------------------- void Tile::setBevel(int bevel) { m_bevel = std::clamp(bevel, 0, 15); const int col = m_bevel % 4; const int row = m_bevel / 4; m_bevel_coords = QPointF(col * 0.25 + 0.0625, row * 0.25 + 0.0625); } //----------------------------------------------------------------------------- void Tile::save(QXmlStreamWriter& xml) const { QXmlStreamAttributes attributes; attributes.append("column", QString::number(m_column)); attributes.append("row", QString::number(m_row)); if (m_bevel) { attributes.append("bevel", QString::number(m_bevel)); } xml.writeEmptyElement("tile"); xml.writeAttributes(attributes); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/tile.h000066400000000000000000000044001476255537600147430ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2011 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_TILE_H #define TETZLE_TILE_H class Piece; #include #include /** * A tile on the board. */ class Tile { public: /** * Construct a tile. * * @param column the horizontal position of the tile * @param row the vertical position of the tile */ Tile(int column, int row); /** * Fetch the location of the bevel in the bevel image. * * @return the location of the bevel in the bevel image */ QPointF bevel() const { return m_bevel_coords; } /** * Fetch the horizontal position of the tile. * * @return the horizontal position of the tile */ int column() const { return m_column; } /** * Fetch the vertical position of the tile. * * @return the vertical position of the tile */ int row() const { return m_row; } /** * Fetch the location of the tile in the scene. * * @return the location of the tile in the scene */ QPoint scenePos() const; /** * Fetch the location of the tile in the solution. * * @return the location of the tile in the solution */ QPoint solutionPos() const { return QPoint(m_column * size, m_row * size); } /** * Rotate the tile. */ void rotate(); /** * Set the bevel of the tile. * * @param bevel the bevel to use */ void setBevel(int bevel); /** * Set the position of the tile relative to parent piece. * * @param pos the position of the tile */ void setPos(const QPoint& pos) { m_pos = pos; } /** * Set the piece containing the tile. * * @param parent the piece containing the tile */ void setParent(const Piece* parent) { m_parent = parent; } /** * Save the tile details. * * @param xml where to save the details */ void save(QXmlStreamWriter& xml) const; static constexpr int size = 64; ///< width and height of tile in pixels private: const Piece* m_parent; ///< piece containing tile const int m_column; ///< horizontal position in solution const int m_row; ///< vertical position in solution QPoint m_pos; ///< location in scene relative to piece int m_bevel; ///< which bevel to use QPointF m_bevel_coords; ///< location in bevel image }; #endif // TETZLE_TILE_H tetzle-3.0.3/src/toolbar_list.cpp000066400000000000000000000035001476255537600170360ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "toolbar_list.h" #include //----------------------------------------------------------------------------- ToolBarList::ToolBarList(QWidget* parent) : QListWidget(parent) { m_toolbar = new QToolBar(this); m_toolbar->setFloatable(false); m_toolbar->setMovable(false); m_toolbar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); m_toolbar->setStyleSheet("QToolBar { border-bottom: 1px solid palette(mid); }"); m_toolbar->hide(); setContextMenuPolicy(Qt::ActionsContextMenu); setMovement(QListView::Static); setResizeMode(QListView::Adjust); setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); } //----------------------------------------------------------------------------- void ToolBarList::addToolBarAction(QAction* action) { if (action) { addAction(action); m_toolbar->addAction(action); m_toolbar->show(); m_toolbar->widgetForAction(action)->setFocusPolicy(Qt::TabFocus); updateGeometries(); } } //----------------------------------------------------------------------------- void ToolBarList::addToolBarWidget(QWidget* widget) { if (widget) { m_toolbar->addWidget(widget); m_toolbar->show(); updateGeometries(); } } //----------------------------------------------------------------------------- void ToolBarList::updateGeometries() { // Resize viewport margins const QSize hint = m_toolbar->isHidden() ? QSize(0,0) : m_toolbar->sizeHint(); setViewportMargins(0, hint.height(), 0, 0); // Resize toolbar const QRect rect = viewport()->geometry(); m_toolbar->setGeometry(rect.left(), rect.top() - hint.height(), rect.width(), hint.height()); QListWidget::updateGeometries(); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/toolbar_list.h000066400000000000000000000016051476255537600165070ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2011-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_TOOLBAR_LIST_H #define TETZLE_TOOLBAR_LIST_H #include class QToolBar; /** * List widget with toolbar on top. */ class ToolBarList : public QListWidget { public: /** * Construct a listwidget. * * @param parent the parent widget of the listwidget */ explicit ToolBarList(QWidget* parent = nullptr); /** * Add an action to toolbar. * * @param action the action to add */ void addToolBarAction(QAction* action); /** * Add a widget to toolbar. * * @param widget the widget to add */ void addToolBarWidget(QWidget* widget); protected: /** * Resize toolbar to fill top of viewport. */ void updateGeometries() override; private: QToolBar* m_toolbar; ///< toolbar for list widget }; #endif // TETZLE_TOOLBAR_LIST_H tetzle-3.0.3/src/window.cpp000066400000000000000000000235501476255537600156570ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2025 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "window.h" #include "add_image.h" #include "appearance_dialog.h" #include "board.h" #include "choose_game_dialog.h" #include "locale_dialog.h" #include "zoom_slider.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include //----------------------------------------------------------------------------- Window::Window(const QStringList& files) : m_board(nullptr) { setAcceptDrops(true); resize(640, 480); // Add statusbar m_completed = new QProgressBar(this); m_completed->setFormat(tr("%p% complete")); m_completed->setRange(0, 100); m_completed->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Maximum); statusBar()->addPermanentWidget(m_completed); m_slider = new ZoomSlider(this); statusBar()->addPermanentWidget(m_slider); statusBar()->setMinimumHeight(statusBar()->sizeHint().height()); m_slider->hide(); m_completed->hide(); // Add contents m_board = new Board(this); connect(m_board, &Board::completionChanged, m_completed, &QProgressBar::setValue); connect(m_board, &Board::finished, this, &Window::gameFinished); connect(m_board, &Board::clearMessage, statusBar(), &QStatusBar::clearMessage); connect(m_board, &Board::showMessage, statusBar(), &QStatusBar::showMessage); connect(m_board, &Board::zoomChanged, m_slider, &ZoomSlider::setValue); connect(m_slider, &ZoomSlider::valueChanged, this, [this](int value) { m_board->zoom(value, true); }); connect(m_slider, &ZoomSlider::zoomFit, m_board, &Board::zoomFit); connect(m_slider, &ZoomSlider::zoomIn, m_board, &Board::zoomIn); connect(m_slider, &ZoomSlider::zoomOut, m_board, &Board::zoomOut); setCentralWidget(m_board); // Add menus QMenu* menu; menu = menuBar()->addMenu(tr("&Game")); QAction* choose_action = menu->addAction(tr("&Choose..."), this, [this]() { chooseGame(QStringList()); }); choose_action->setShortcuts({ QKeySequence::New, QKeySequence::Open}); menu->addSeparator(); QAction* retrieve_pieces_action = menu->addAction(tr("&Retrieve Pieces"), m_board, &Board::retrievePieces); retrieve_pieces_action->setShortcut(tr("Ctrl+R")); retrieve_pieces_action->setEnabled(false); connect(m_board, &Board::retrievePiecesAvailable, retrieve_pieces_action, &QAction::setEnabled); menu->addSeparator(); QAction* quit_action = menu->addAction(tr("&Quit"), this, &Window::close); quit_action->setShortcut(QKeySequence::Quit); quit_action->setMenuRole(QAction::QuitRole); menu = menuBar()->addMenu(tr("&View")); QAction* zoom_in_action = menu->addAction(tr("Zoom &In"), m_board, &Board::zoomIn); zoom_in_action->setShortcut(tr("+")); zoom_in_action->setEnabled(false); connect(m_slider, &ZoomSlider::zoomInAvailable, zoom_in_action, &QAction::setEnabled); QAction* zoom_out_action = menu->addAction(tr("Zoom &Out"), m_board, &Board::zoomOut); zoom_out_action->setShortcut(tr("-")); zoom_out_action->setEnabled(false); connect(m_slider, &ZoomSlider::zoomOutAvailable, zoom_out_action, &QAction::setEnabled); m_zoom_fit_action = menu->addAction(tr("Best &Fit"), m_board, &Board::zoomFit); m_zoom_fit_action->setEnabled(false); menu->addSeparator(); m_toggle_overview_action = menu->addAction(tr("Show O&verview"), m_board, &Board::toggleOverview); m_toggle_overview_action->setShortcut(tr("Tab")); m_toggle_overview_action->setCheckable(true); m_toggle_overview_action->setEnabled(false); connect(m_board, &Board::overviewToggled, m_toggle_overview_action, &QAction::setChecked); menu->addSeparator(); QAction* fullscreen_action = menu->addAction(tr("F&ullscreen")); connect(fullscreen_action, &QAction::toggled, this, &Window::setFullScreen); fullscreen_action->setCheckable(true); #if !defined(Q_OS_MAC) fullscreen_action->setShortcut(tr("F11")); #else fullscreen_action->setShortcut(tr("Ctrl+F")); #endif menu = menuBar()->addMenu(tr("&Settings")); menu->addAction(tr("&Appearance..."), this, &Window::showAppearance); menu->addAction(tr("&Language..."), this, &Window::setLocale); menu = menuBar()->addMenu(tr("&Help")); QAction* help_action = menu->addAction(tr("&Controls"), this, &Window::showControls); help_action->setShortcut(QKeySequence::HelpContents); menu->addSeparator(); QAction* about_action = menu->addAction(tr("&About"), this, &Window::showAbout); about_action->setMenuRole(QAction::AboutRole); QAction* about_qt_action = menu->addAction(tr("About &Qt"), qApp, &QApplication::aboutQt); about_qt_action->setMenuRole(QAction::AboutQtRole); // Restore geometry QSettings settings; if (settings.contains("Geometry")) { restoreGeometry(settings.value("Geometry").toByteArray()); } else { resize(settings.value("Size", QSize(1024, 768)).toSize()); settings.remove("Size"); } // Start or load a game show(); chooseGame(files); // Create auto-save timer QTimer* timer = new QTimer(this); connect(timer, &QTimer::timeout, m_board, &Board::saveGame); timer->start(300000); } //----------------------------------------------------------------------------- void Window::addImages(const QStringList& files) { chooseGame(files); } //----------------------------------------------------------------------------- void Window::closeEvent(QCloseEvent* event) { QSettings().setValue("Geometry", saveGeometry()); m_board->saveGame(); QMainWindow::closeEvent(event); } //----------------------------------------------------------------------------- void Window::dragEnterEvent(QDragEnterEvent* event) { AddImage::dragEnterEvent(event); } //----------------------------------------------------------------------------- void Window::dropEvent(QDropEvent* event) { const QStringList files = AddImage::dropEvent(event); if (!files.isEmpty()) { chooseGame(files); } } //----------------------------------------------------------------------------- void Window::chooseGame(const QStringList& files) { m_board->saveGame(); ChooseGameDialog dialog(files, m_board->id(), this); connect(&dialog, &ChooseGameDialog::newGame, m_board, &Board::newGame); connect(&dialog, &ChooseGameDialog::openGame, m_board, &Board::openGame); if (dialog.exec() == QDialog::Accepted) { m_toggle_overview_action->setEnabled(true); m_zoom_fit_action->setEnabled(true); m_slider->show(); m_completed->show(); } } //----------------------------------------------------------------------------- void Window::gameFinished() { m_toggle_overview_action->setEnabled(false); } //----------------------------------------------------------------------------- void Window::setFullScreen(bool enable) { if (enable) { showFullScreen(); } else { showNormal(); } } //----------------------------------------------------------------------------- void Window::setLocale() { LocaleDialog dialog(this); dialog.exec(); } //----------------------------------------------------------------------------- void Window::showAppearance() { AppearanceDialog dialog(this); if (dialog.exec() == QDialog::Accepted) { m_board->setAppearance(dialog); } } //----------------------------------------------------------------------------- void Window::showControls() { QDialog dialog(this); dialog.setWindowTitle(tr("Controls")); QGridLayout* layout = new QGridLayout(&dialog); layout->setContentsMargins(12, 12, 12, 12); layout->setSpacing(0); layout->setColumnMinimumWidth(1, 6); layout->setRowMinimumHeight(7, 12); layout->addWidget(new QLabel(tr("Pick Up Pieces:"), &dialog), 0, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Left Click or Space"), &dialog), 0, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Drop Pieces:"), &dialog), 1, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Left Click or Space"), &dialog), 1, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Select Pieces:"), &dialog), 2, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Left Drag"), &dialog), 2, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Rotate Pieces:"), &dialog), 3, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Right Click, Control + Left Click, or R"), &dialog), 3, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Drag Puzzle:"), &dialog), 4, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Middle Click, Shift + Left Click, or Arrows"), &dialog), 4, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Zoom Puzzle:"), &dialog), 5, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Scrollwheel or +/-"), &dialog), 5, 2, Qt::AlignLeft | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Move Cursor:"), &dialog), 6, 0, Qt::AlignRight | Qt::AlignVCenter); layout->addWidget(new QLabel(tr("Move mouse or W,A,D,S"), &dialog), 6, 2, Qt::AlignLeft | Qt::AlignVCenter); QDialogButtonBox* buttons = new QDialogButtonBox(QDialogButtonBox::Close, Qt::Horizontal, &dialog); connect(buttons, &QDialogButtonBox::rejected, &dialog, &QDialog::reject); layout->addWidget(buttons, 8, 0, 1, 3); dialog.exec(); } //----------------------------------------------------------------------------- void Window::showAbout() { QMessageBox::about(this, tr("About Tetzle"), QString("

%1 %2
%3
%4
%5

") .arg(tr("Tetzle"), QCoreApplication::applicationVersion(), tr("A jigsaw puzzle with tetrominoes for pieces"), tr("Copyright © 2008-%1 Graeme Gott").arg("2025"), tr("Released under the
GPL 3 license").arg("\"http://www.gnu.org/licenses/gpl.html\"")) ); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/window.h000066400000000000000000000040661476255537600153250ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2011 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_WINDOW_H #define TETZLE_WINDOW_H class Board; class ZoomSlider; #include class QAction; class QProgressBar; /** * Main window for game. */ class Window : public QMainWindow { Q_OBJECT public: /** * Construct a main window. * * @param files a list of images to add for new games */ explicit Window(const QStringList& files = QStringList()); /** * Add a list of images for new games. * * @param files a list of images to add for new games */ void addImages(const QStringList& files); protected: /** * Save current game on close, as well as window state. * * @note Does note save window state in Wayland. */ void closeEvent(QCloseEvent* event) override; /** * Handle player dragging over window. This allows them to add images. */ void dragEnterEvent(QDragEnterEvent* event) override; /** * Handle player dropping over window. This allows them to add images. */ void dropEvent(QDropEvent* event) override; private Q_SLOTS: /** * Start a new game. * * @param files a list of images to add for new game */ void chooseGame(const QStringList& files); /** * Handle game finishing. */ void gameFinished(); /** * Set the window fullscreen. * * @param enable @c true if it is fullscreen */ void setFullScreen(bool enable); /** * Prompt player to change locale. */ void setLocale(); /** * Prompt player to change board appearance settings. */ void showAppearance(); /** * Show player description of controls. */ void showControls(); /** * Show player message about program. */ void showAbout(); private: QAction* m_zoom_fit_action; ///< action to zoom board to best fit QAction* m_toggle_overview_action; ///< action to show or hide overview ZoomSlider* m_slider; ///< slider controlling zoom of board QProgressBar* m_completed; ///< progressbar showing completion status of game Board* m_board; ///< play area of game }; #endif // TETZLE_WINDOW_H tetzle-3.0.3/src/zoom_slider.cpp000066400000000000000000000056121476255537600166750ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #include "zoom_slider.h" #include #include #include #include #include #include //----------------------------------------------------------------------------- namespace { ///< scale factor for each zoom level constexpr float scale_levels[10] = { 0.0625, 0.09375, 0.125, 0.171875, 0.234375, 0.3125, 0.40625, 0.546875, 0.75, 1.0 }; /** * Returns translated text with @c & removed. * * @param text the text to translate */ QString windowString(const char* text) { QString result = QCoreApplication::translate("Window", text); result.remove('&'); return result; } } //----------------------------------------------------------------------------- ZoomSlider::ZoomSlider(QWidget* parent) : QWidget(parent) { QToolButton* zoom_fit = new QToolButton(this); zoom_fit->setAutoRaise(true); zoom_fit->setIcon(QIcon::fromTheme("zoom-fit-best")); zoom_fit->setToolTip(windowString("Best &Fit")); connect(zoom_fit, &QToolButton::clicked, this, &ZoomSlider::zoomFit); m_zoom_out = new QToolButton(this); m_zoom_out->setAutoRaise(true); m_zoom_out->setIcon(QIcon::fromTheme("zoom-out")); m_zoom_out->setToolTip(windowString("Zoom &Out")); m_zoom_out->setEnabled(false); connect(m_zoom_out, &QToolButton::clicked, this, &ZoomSlider::zoomOut); connect(this, &ZoomSlider::zoomOutAvailable, m_zoom_out, &QToolButton::setEnabled); m_slider = new QSlider(Qt::Horizontal, this); m_slider->setRange(0, maxScaleLevel()); m_slider->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Maximum); connect(m_slider, &QSlider::valueChanged, this, &ZoomSlider::valueChanged); m_zoom_in = new QToolButton(this); m_zoom_in->setAutoRaise(true); m_zoom_in->setIcon(QIcon::fromTheme("zoom-in")); m_zoom_in->setToolTip(windowString("Zoom &In")); m_zoom_in->setEnabled(false); connect(m_zoom_in, &QToolButton::clicked, this, &ZoomSlider::zoomIn); connect(this, &ZoomSlider::zoomInAvailable, m_zoom_in, &QToolButton::setEnabled); QHBoxLayout* layout = new QHBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); layout->setSpacing(0); layout->addWidget(zoom_fit); layout->addWidget(m_zoom_out); layout->addWidget(m_slider); layout->addWidget(m_zoom_in); } //----------------------------------------------------------------------------- float ZoomSlider::scaleFactor(int level) { return scale_levels[std::clamp(level, 0, maxScaleLevel())]; } //----------------------------------------------------------------------------- void ZoomSlider::setValue(int level) { m_slider->setValue(level); m_slider->setToolTip(tr("Zoom: %1%").arg(std::lround(scaleFactor(level) * 100))); Q_EMIT zoomOutAvailable(level > 0); Q_EMIT zoomInAvailable(level < maxScaleLevel()); } //----------------------------------------------------------------------------- tetzle-3.0.3/src/zoom_slider.h000066400000000000000000000031131476255537600163340ustar00rootroot00000000000000/* SPDX-FileCopyrightText: 2008-2024 Graeme Gott SPDX-License-Identifier: GPL-3.0-or-later */ #ifndef TETZLE_ZOOM_SLIDER_H #define TETZLE_ZOOM_SLIDER_H #include class QSlider; class QToolButton; /** * Controls zoom level of board. */ class ZoomSlider : public QWidget { Q_OBJECT public: /** * Construct zoom slider widget. * * @param parent the parent widget of the slider */ explicit ZoomSlider(QWidget* parent = nullptr); /** * Fetch maximum zoom level. * * @return maximum zoom level */ static int maxScaleLevel() { return 9; } /** * Fetch scale factor for zoom level. * * @return scale factor for zoom level */ static float scaleFactor(int level); Q_SIGNALS: /** * Signal that the zoom level has changed. */ void valueChanged(int); /** * Signal to zoom board to best fit. */ void zoomFit(); /** * Signal to zoom in on board. */ void zoomIn(); /** * Signal to zoom out of board. */ void zoomOut(); /** * Signal if player can zoom in on board. * * @param available @c true if player can zoom in */ void zoomInAvailable(bool available); /** * Signal if player can zoom out of board. * * @param available @c true if player can zoom out */ void zoomOutAvailable(bool available); public Q_SLOTS: /** * Set the zoom level. * * @param level the zoom level */ void setValue(int level); private: QSlider* m_slider; ///< slider to control zoom QToolButton* m_zoom_in; ///< button to zoom in QToolButton* m_zoom_out; ///< button to zoom out }; #endif // TETZLE_ZOOM_SLIDER_H tetzle-3.0.3/translations/000077500000000000000000000000001476255537600155715ustar00rootroot00000000000000tetzle-3.0.3/translations/tetzle_ca.ts000066400000000000000000000343421476255537600201210ustar00rootroot00000000000000 AddImage Open Image Obrir imatge Images AppearanceDialog Appearance Apariencia Options Opcions Beveled borders Costats bisellades Drop shadows Sombres paral·leles Colors Colors Background: Fons: Shadow: Ombra: Highlight: Ressaltat: Board Error Error Missing image. No es troba la imatge. Please Wait Espereu un moment Loading image... Carregant la imatge… Generating puzzle... Generant el trencaclosques… Creating pieces... Generant les peces… Loading puzzle... Carregant el trancaclosques… Unknown data format El format de les dades és incorrecte Unknown element '%1' L'elemento «%1» és desconegut Error parsing XML file. %1 S'ha produït un error en analitzar el fitxer XML. %1 Loading pieces... Carregant les peces… Retrieving pieces... Recuperant les peces… Placing pieces... Col·locant les peces… Success Èxit ChooseGameDialog Choose Game Elegir Joc Current Games Jocs actuals New Game Joc nou Play Game ImagePropertiesDialog Image Properties Propietats de la imatge Name: Nom: Tags: Etiquetes: New tag name LocaleDialog Select application language: Seleccioni l'idioma del programa: <System Language> <Idioma del sistema> Note Nota Please restart this application for the change in language to take effect. Reinicii el programa per a que el canvi d'idioma es faci efectiu. NewGameTab Add Image Afegir imatge Remove Image Eliminar imatge Image Properties Propietats de la imatge %L1 pieces %L1 pieces Copying images... Copiant les imátges… Cancel Cancel·lar Untitled Sense títol Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sense títol %L1 pieces %2 %3% complete %L1 pieces %2 %3% completat Delete Eliminar Delete Game Eliminar Joc Delete selected game? Voleu eliminar el joc seleccionat? Overview Overview Vista general TagManager Add Tag Afegir etiqueta Remove Tag Eliminar etiqueta Untagged Sense etiqueta All Images Totes les imatges Untitled %1 Sense títol %1 Question Pregunta Remove selected tag? Eliminar l'etiqueta seleccionada? Sorry Ho sento A tag with that name already exists. Ja existeix una etiqueta amb aquest nom. Manage Tags... Window Tetzle Tetzle &Game &Joc &Retrieve Pieces &Recuperar Peces Ctrl+R Ctrl+R &Quit &Surt &Choose... &Elegir... &View &Veure Zoom &In Am&pliar + + Zoom &Out &Reduir - Best &Fit Millor ajus&t Show O&verview Mostrar R&esum Tab Tab F&ullscreen &Pantalla completa F11 F11 Ctrl+F Ctrl+F &Settings &Configuració &Appearance... &Apariença… &Language... &Idioma… &Help Aj&uda &Controls &Controls &About &Quant a About &Qt Quant a &Qt Controls Controls <b>Pick Up Pieces:</b> <b>Recollir les peces:</b> Left Click or Space Clic esquerre o espai <b>Drop Pieces:</b> <b>Col·locar les Peces:</b> <b>Select Pieces:</b> <b>Seleccionar Peces:</b> Left Drag Arrossegar a l'esquerra <b>Rotate Pieces:</b> <b>Girar peces:</b> Right Click, Control + Left Click, or R Click Dreta, Control + Clic Esquerra o R <b>Drag Puzzle:</b> <b>Arrossegar trencaclosques:</b> Middle Click, Shift + Left Click, or Arrows Clic Roda del ratolí , Majúscules + Clic Esquerra, o Fletxes <b>Zoom Puzzle:</b> <b>Zoom Puzzle:</b> Scrollwheel or +/- Roda del ratolí o +/- <b>Move Cursor:</b> <b>Moure el cursor:</b> Move mouse or W,A,D,S Moure el cursor o W, A, D, S About Tetzle Quant a Tetzle A jigsaw puzzle with tetrominoes for pieces Un trencaclosques que fa servir tetrominoes com a peces Copyright &copy; 2008-%1 Graeme Gott &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Publicat sota llicència <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_cs.ts000066400000000000000000000344131476255537600201420ustar00rootroot00000000000000 AddImage Open Image Otevřít obrázek Images AppearanceDialog Appearance Vzhled Options Možnosti Beveled borders Zkosené okraje Drop shadows Stíny Colors Barvy Background: Pozadí: Shadow: Stín: Highlight: Zvýraznění: Board Error Chyba Missing image. Chybějící obrázek. Please Wait Prosím čekejte Loading image... Nahrávání obrázku… Generating puzzle... Vytváření skládanky… Creating pieces... Vytváření dílů… Loading puzzle... Nahrávání skládanky… Unknown data format Neznámý formát dat Unknown element '%1' Neznámý prvek „%1“ Error parsing XML file. %1 Chyba při parsování XML souboru %1 Loading pieces... Nahrávání dílů… Retrieving pieces... Shromažďování dílů… Placing pieces... Rozmisťování dílů… Success Úspěch ChooseGameDialog Choose Game Vybrat hru Current Games Rozehrané hry New Game Nová hra Play Game ImagePropertiesDialog Image Properties Vlastnosti obrázku Name: jméno: Tags: Štítky: New tag name LocaleDialog Select application language: Vyberte jazyk aplikace: <System Language> Systémový jazyk Note Poznámka Please restart this application for the change in language to take effect. Pro uplatnění změn v nastavení jazyka prosím ukončete a znovu spusťte aplikaci. NewGameTab Add Image Přidat obrázek Remove Image Odstranit obrázek Image Properties Vlastnosti obrázku %L1 pieces %L1 dílů Copying images... Kopírování obrázků… Cancel Zrušit Untitled Nepojmenovaný Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Nepojmenovaný %L1 pieces %2 %3% complete %L1 dílů %2 %3% dokončeno Delete Smazat Delete Game Smazat hru Delete selected game? Smazat vybranou hru? Overview Overview Náhled TagManager Add Tag Přidat štítek Remove Tag Odstranit štítek Untagged Bez štítku All Images Všechny obrázky Untitled %1 Nepojmenovaný %1 Question Otázka Remove selected tag? Odstranit vybrané štítky? Sorry Je nám líto A tag with that name already exists. Štítek s tímto jménem již existuje. Manage Tags... Window Tetzle Tetzle &Game &Hra &Retrieve Pieces &Shromáždit díly Ctrl+R Ctrl+R &Quit &Ukončit &Choose... &Vybrat… &View &Zobrazit Zoom &In &Přiblížit + + Zoom &Out &Oddálit - - Best &Fit O&ptimální zobrazení Show O&verview &Zobrazit náhled Tab Tab F&ullscreen &Celá obrazovka F11 F11 Ctrl+F Ctrl+F &Settings &Nastavení &Appearance... &Vzhled… &Language... &Jazyk… &Help &Nápověda &Controls &Ovládání &About &O aplikaci About &Qt &O Qt Controls Ovládání <b>Pick Up Pieces:</b> <b>Sebrání dílů:</b> Left Click or Space Levé tlačítko nebo mezerník <b>Drop Pieces:</b> <b>Položení dílů:</b> <b>Select Pieces:</b> <b>Výběr dílů:</b> Left Drag Tažení levým tlačítkem <b>Rotate Pieces:</b> <b>Pootočení dílů:</b> Right Click, Control + Left Click, or R Pravé tlačítko, Ctrl + Levé tlačítko, nebo R <b>Drag Puzzle:</b> <b>Přetažení skládanky:</b> Middle Click, Shift + Left Click, or Arrows Prostřední tlačítko, Shift + Levé tlačítko, nebo šipky <b>Zoom Puzzle:</b> <b>Úroveň přiblížení skládanky:</b> Scrollwheel or +/- Kolečko myši nebo +/- <b>Move Cursor:</b> <b>Pohyb kurzoru:</b> Move mouse or W,A,D,S Myš nebo W, A, D, S About Tetzle O Tetzle A jigsaw puzzle with tetrominoes for pieces Skládanka s díly ve tvaru tetromina Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Vydáno pod licencí <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_de.ts000066400000000000000000000344551476255537600201330ustar00rootroot00000000000000 AddImage Open Image Bild auswählen Images Bilder AppearanceDialog Appearance Erscheinungsbild Options Optionen Beveled borders Abgeschrägte Kanten Drop shadows Schlagschatten Colors Farben Background: Hintergrund: Shadow: Schatten: Highlight: Hervorgehoben: Board Error Fehler Missing image. Bild nicht gefunden. Please Wait Bitte warten Loading image... Bild wird geladen ... Generating puzzle... Puzzle wird erzeugt ... Creating pieces... Teile werden erzeugt ... Loading puzzle... Puzzle wird geladen ... Unknown data format Unbekanntes Dateiformat Unknown element '%1' Unbekanntes Element '%1' Error parsing XML file. %1 Fehler beim Parsen der XML-Datei. %1 Loading pieces... Teile werden geladen ... Retrieving pieces... Teile werden geholt ... Placing pieces... Teile werden gelegt ... Success Fertiggestellt ChooseGameDialog Choose Game Spiel auswählen Current Games Aktuelle Spiele New Game Neues Spiel Play Game Spielen ImagePropertiesDialog Image Properties Bildeigenschaften Name: Name: Tags: Tags: New tag name Neues Tag LocaleDialog Select application language: Anwendungssprache auswählen: <System Language> <Systemeinstellung> Note Hinweis Please restart this application for the change in language to take effect. Bitte starten Sie diese Anwendung neu um den Wechsel der Sprache auszuführen. NewGameTab Add Image Bild hinzufügen Remove Image Bild entfernen Image Properties Bildeigenschaften %L1 pieces %L1 Teile Copying images... Bilder werden kopiert ... Cancel Abbrechen Untitled Unbenannt Remove %n selected image(s)? %n ausgewähltes Bild entfernen? %n ausgewählte Bilder entfernen? Saved games using these image(s) will be deleted. Gespeicherte Spiele mit diesem Bild werden gelöscht. Gespeicherte Spiele mit diesen Bildern werden gelöscht. Remove Entfernen OpenGameTab Untitled Unbenannt %L1 pieces %2 %3% complete %L1 Teile %2 %3% fertiggestellt Delete Löschen Delete Game Spiel löschen Delete selected game? Ausgewähltes Spiel löschen? Overview Overview Übersicht TagManager Add Tag Tag hinzufügen Remove Tag Tag löschen Untagged Nicht getaggt All Images Alle Bilder Untitled %1 Unbenannt %1 Question Frage Remove selected tag? Ausgewähltes Tag löschen? Sorry Sorry A tag with that name already exists. Ein Tag mit diesem Namen existiert bereits. Manage Tags... Tags verwalten ... Window Tetzle Tetzle &Game &Spiel &Retrieve Pieces &Teile holen Ctrl+R Ctrl+T &Quit &Beenden &Choose... &Auswählen ... &View &Ansicht Zoom &In Ver&größern + + Zoom &Out Ver&kleinern - - Best &Fit In Fenster &einpassen Show O&verview Ü&bersicht zeigen Tab Tab F&ullscreen &Vollbild F11 F11 Ctrl+F Ctrl+F &Settings &Einstellungen &Appearance... &Erscheinungsbild ... &Language... &Sprache ... &Help &Hilfe &Controls &Steuerung &About Ü&ber About &Qt Über &Qt Controls Steuerung <b>Pick Up Pieces:</b> <b>Teile aufnehmen:</b> Left Click or Space Linksklick oder Leertaste <b>Drop Pieces:</b> <b>Teile ablegen:</b> <b>Select Pieces:</b> <b>Teile auswählen:</b> Left Drag Ziehen mit linker Maustaste <b>Rotate Pieces:</b> <b>Teile drehen:</b> Right Click, Control + Left Click, or R Rechtsklick, Strg + Linksklick, oder R <b>Drag Puzzle:</b> <b>Puzzle verschieben:</b> Middle Click, Shift + Left Click, or Arrows Mittelklick, Umschalt + Linksklick, oder Pfeiltasten <b>Zoom Puzzle:</b> <b>Puzzlegröße ändern:</b> Scrollwheel or +/- Mausrad oder +/- <b>Move Cursor:</b> <b>Zeiger bewegen:</b> Move mouse or W,A,D,S Maus bewegen oder W, A, D, S About Tetzle Über Tetzle A jigsaw puzzle with tetrominoes for pieces Ein Puzzlespiel mit Tetrominos als Puzzleteilen Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Veröffentlicht unter der <a href=%1>GPL-3</a>-Lizenz %p% complete Fortschritt %p% ZoomSlider Zoom: %1% Vergrößerung: %1% main Images to add to the choose game dialog. Bilder zum Hinzufügen zum Spiel-auswählen-Dialog. tetzle-3.0.3/translations/tetzle_el.ts000066400000000000000000000372121476255537600201350ustar00rootroot00000000000000 AddImage Open Image Άνοιγμα Εικόνας Images AppearanceDialog Appearance Εμφάνιση Options Ρυθμίσεις Beveled borders Κορνίζα συνόρων Drop shadows Σκιές Colors Χρώματα Background: Φόντος: Shadow: Σκιά: Highlight: Επισήμανση: Board Error Σφάλμα Missing image. Ελλειπής εικόνα. Please Wait Παρακαλώ περιμένετε Loading image... Φόρτωση εικόνας... Generating puzzle... Δημιουργία παζλ... Creating pieces... Δημιουργία κομματιών... Loading puzzle... Φόρτωση παζλ... Unknown data format Άγνωστη μορφή δεδομένων Unknown element '%1' Άγνωστο στοιχείο '%1' Error parsing XML file. %1 Σφάλμα κατά την ανάλυση του XML αρχείου. %1 Loading pieces... Φόρτωση κομματιών... Retrieving pieces... Ανάκτηση κομματιών... Placing pieces... Τοποθέτηση κομματιών... Success Επιτυχία ChooseGameDialog Choose Game Επιλογή παιχνιδιού Current Games Τρέχοντα παιχνίδια New Game Καινούργιο παιχνίδι Play Game ImagePropertiesDialog Image Properties Ιδιότητες Εικόνας Name: Όνομα: Tags: Κατηγορία: New tag name LocaleDialog Select application language: Επιλογή γλώσσας εφαρμογής: <System Language> <System Language> Note Σημείωση Please restart this application for the change in language to take effect. Παρακαλείστε να επανεκκινήσετε την εφαρμογή για να τεθεί σε ισχύ η αλλαγή της γλώσσας. NewGameTab Add Image Προσθήκη Εικόνας Remove Image Αφαίρεση Εικόνας Image Properties Ιδιότητες Εικόνας %L1 pieces %L1 κομμάτια Copying images... Αντιγραφή εικόνων... Cancel Ακύρωση Untitled Χωρίς τίτλο Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Χωρίς τίτλους %L1 pieces %2 %3% complete %L1 κομμάτια %2 %3% ολοκληρώθηκαν Delete Διαγραφή Delete Game Διαγραφή παιχνιδιού Delete selected game? Διαγραφή επιλεγμένου παιχνιδιού; Overview Overview Επισκόπηση TagManager Add Tag Προσθήκη κατηγορίας Remove Tag Αφαίρεση Κατηγορίας Untagged Χωρίς κατηγορία All Images Ολες οι εικόνες Untitled %1 Χωρίς τίτλο %1 Question Ερώτηση Remove selected tag? Αφαίρεση της επιλεγμένης κατηγορίας; Sorry Συγγνώμη A tag with that name already exists. Μια κατηγορία με αυτό το όνομα υπάρχει ήδη. Manage Tags... Window Tetzle Tetzle &Game &Παιχνίδι &Retrieve Pieces &Ανάκτηση κομματιών Ctrl+R Ctrl+Ρ &Quit &Τερματισμός &Choose... &Επιλογή... &View &Εμφάνιση Zoom &In Μεγέθυνση + + Zoom &Out Μεγέθυνση - - Best &Fit Καλύτερο ταίριασμα Show O&verview Εμφάνιση επ&ισκόπησης Tab Καρτέλα F&ullscreen Πλήρης οθόνη F11 F11 Ctrl+F Ctrl+Φ &Settings &Ρυθμίσεις &Appearance... &Εμφάνιση... &Language... &Γλώσσα... &Help &Βοήθεια &Controls &Διαχείριση &About &Σχετικά με About &Qt Σχετικά με το &Qt Controls Διαχείριση <b>Pick Up Pieces:</b> <b>Κομμάτια πού λύθηκαν:</b> Left Click or Space Πατήστε στην επιλογή αριστερά <b>Drop Pieces:</b> <b>Μειωμένα Κομμάτια:</b> <b>Select Pieces:</b> <b>Επιλεγμένα Κομμάτια:</b> Left Drag Σύρετε Αριστερά <b>Rotate Pieces:</b> <b>Περιστροφή κομματιών:</b> Right Click, Control + Left Click, or R Κάντε δεξί Κλικ για την ανάκτηση ελέγχου + αριστερό κλικ, η πατήστε το πλήκτρο Ρ <b>Drag Puzzle:</b> <b>Σύρετε το παζλ:</b> Middle Click, Shift + Left Click, or Arrows Κάντε μεσαίο Κλικ, Shift + Αριστερό Κλικ, η χρησιμοποιήστε τα βέλη <b>Zoom Puzzle:</b> <b>Μεγέθυνση τού παζλ:</b> Scrollwheel or +/- Κύλιση η +/- <b>Move Cursor:</b> <b>Μετακίνηση Δρομέα:</b> Move mouse or W,A,D,S Μετακινήστε το ποντίκι η πατήστε τα πλήκτρα Β,Α,Δ,Σ About Tetzle Σχετικά με το Tetzle A jigsaw puzzle with tetrominoes for pieces Παζλ με κομμάτια tetromino Copyright &copy; 2008-%1 Graeme Gott Πνευματικά δικαιώματα&αντίγραφα; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Κυκλοφορία υπο την άδεια <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_en.ts000066400000000000000000000342251476255537600201400ustar00rootroot00000000000000 AddImage Open Image Images AppearanceDialog Appearance Options Beveled borders Drop shadows Colors Background: Shadow: Highlight: Board Error Missing image. Please Wait Loading image... Generating puzzle... Creating pieces... Loading puzzle... Unknown data format Unknown element '%1' Error parsing XML file. %1 Loading pieces... Retrieving pieces... Placing pieces... Success ChooseGameDialog Choose Game Current Games New Game Play Game ImagePropertiesDialog Image Properties Name: Tags: New tag name LocaleDialog Select application language: <System Language> Note Please restart this application for the change in language to take effect. NewGameTab Add Image Remove Image Image Properties %L1 pieces Copying images... Cancel Untitled Remove %n selected image(s)? Remove selected image? Remove %n selected images? Saved games using these image(s) will be deleted. Saved games using this image will be deleted. Saved games using these images will be deleted. Remove OpenGameTab Untitled %L1 pieces %2 %3% complete Delete Delete Game Delete selected game? Overview Overview TagManager Add Tag Remove Tag Untagged All Images Untitled %1 Question Remove selected tag? Sorry A tag with that name already exists. Manage Tags... Window Tetzle &Game &Retrieve Pieces Ctrl+R &Quit &Choose... &View Zoom &In + Zoom &Out - Best &Fit Show O&verview Tab F&ullscreen F11 Ctrl+F &Settings &Appearance... &Language... &Help &Controls &About About &Qt Controls <b>Pick Up Pieces:</b> Left Click or Space <b>Drop Pieces:</b> <b>Select Pieces:</b> Left Drag <b>Rotate Pieces:</b> Right Click, Control + Left Click, or R <b>Drag Puzzle:</b> Middle Click, Shift + Left Click, or Arrows <b>Zoom Puzzle:</b> Scrollwheel or +/- <b>Move Cursor:</b> Move mouse or W,A,D,S About Tetzle A jigsaw puzzle with tetrominoes for pieces Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_eo.ts000066400000000000000000000337751476255537600201520ustar00rootroot00000000000000 AddImage Open Image Malfermi bildon Images AppearanceDialog Appearance Apero Options Opcioj Beveled borders Bevelaj borderoj Drop shadows Ĵetitaj ombroj Colors Koloroj Background: Fono: Shadow: Ombro: Highlight: Board Error Eraro Missing image. Bildo mankas. Please Wait Bonvile atendu Loading image... Ŝargado de bildo... Generating puzzle... Generado de puzlo... Creating pieces... Kreado de eroj... Loading puzzle... Ŝargado de puzlo... Unknown data format Nekonata aranĝo de datumoj Unknown element '%1' Nekonata ero '%1' Error parsing XML file. %1 Eraro dum analizado de XML-dosiero. %1 Loading pieces... Ŝargado de eroj... Retrieving pieces... Ricevado de eroj... Placing pieces... Metado de eroj... Success Sukcese ChooseGameDialog Choose Game Elektu ludon Current Games Aktuala ludo New Game Nova ludo Play Game ImagePropertiesDialog Image Properties Ecoj de bildo Name: Nomo: Tags: Etkedoj: New tag name LocaleDialog Select application language: Elektu lingvon de alikaĵo: <System Language> <Lingvo de sistemo> Note Noto Please restart this application for the change in language to take effect. Bonvole restartigu ĉi tiun aplikaĵon por efektivigi la ŝanĝon de lingvo. NewGameTab Add Image Aldoni bildon Remove Image Forigi bildon Image Properties Ecoj de bildo %L1 pieces %L1 eroj Copying images... Kopiado de bildo... Cancel Nuligi Untitled Sentitola Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sentitola %L1 pieces %2 %3% complete %L1 eroj %2 %3% plenumita Delete Forigi Delete Game Forigi ludon Delete selected game? Ĉu forigi ludon? Overview Overview Superrigardo TagManager Add Tag Aldoni etikedon Remove Tag Forigi etikedon Untagged Senetikeda All Images Ĉiuj bildoj Untitled %1 Sentitola %1 Question Demando Remove selected tag? Ĉu forigi elektitan etikedon? Sorry Mi pardonpetas A tag with that name already exists. Samnoma etikedo jam ekzistas. Manage Tags... Window Tetzle Tetzlo &Game &Ludo &Retrieve Pieces &Ricevi erojn Ctrl+R Stir+R &Quit &Eliri &Choose... &Elektu... &View &Vido Zoom &In Pl&igrandigi + + Zoom &Out &Malpligrandigi - - Best &Fit &Plejbona adapto Show O&verview &Montri superrigardon Tab Langeto F&ullscreen T&utekrane F11 F11 Ctrl+F Stir+F &Settings &Agordoj &Appearance... &Apero... &Language... &Lingvo... &Help &Helpo &Controls &Stiriloj &About &Pri About &Qt Pri &Qt Controls Stiriloj <b>Pick Up Pieces:</b> <b>Prenu erojn;</b> Left Click or Space Maldekstra alklako aŭ spaceto <b>Drop Pieces:</b> <b>Demetu erojn:</b> <b>Select Pieces:</b> <b>Elektu erojn:</b> Left Drag Maldekstra ŝovo <b>Rotate Pieces:</b> <b>Turnu erojn:</b> Right Click, Control + Left Click, or R Dekstra alklako, stirklavo + maldekstra alklako aŭ R <b>Drag Puzzle:</b> <b>Ŝovu puzlon:</b> Middle Click, Shift + Left Click, or Arrows Meza alklako, majuskliga klavo + dekstra alklako aŭ sagoj <b>Zoom Puzzle:</b> <b>Pligrandigu puzlon:</b> Scrollwheel or +/- Rulumrado aŭ +/- <b>Move Cursor:</b> <b>Movu kursoron:</b> Move mouse or W,A,D,S Movi muson aŭ W, A, D kaj S About Tetzle Pri Tetzlo A jigsaw puzzle with tetrominoes for pieces Puzlo kun 4-kvadratoj por eroj Copyright &copy; 2008-%1 Graeme Gott Kopirajto &copy; 2008-%1 Graeme GOTT Released under the <a href=%1>GPL 3</a> license Publikigita sub la permesilo <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_es.ts000066400000000000000000000342351476255537600201460ustar00rootroot00000000000000 AddImage Open Image Abrir imagen Images AppearanceDialog Appearance Apariencia Options Opciones Beveled borders Bordes biselados Drop shadows Sombras paralelas Colors Colores Background: Fondo: Shadow: Sombra: Highlight: Resalte: Board Error Error Missing image. Falta una imagen. Please Wait Espere un momento Loading image... Cargando la imagen… Generating puzzle... Generando el rompecabezas… Creating pieces... Creando las piezas… Loading puzzle... Cargando el rompecabezas… Unknown data format Formato de datos desconocido Unknown element '%1' El elemento «%1» es desconocido Error parsing XML file. %1 Error al analizar el archivo XML. %1 Loading pieces... Cargando las piezas… Retrieving pieces... Obteniendo las piezas… Placing pieces... Colocando las piezas… Success Acierto ChooseGameDialog Choose Game Elegir Juego Current Games Juegos actuales New Game Partida nueva Play Game ImagePropertiesDialog Image Properties Propiedades de la imagen Name: Nombre: Tags: Etiquetas: New tag name LocaleDialog Select application language: Seleccione el idioma del programa: <System Language> <Idioma del sistema> Note Nota Please restart this application for the change in language to take effect. Reinicie el programa para que el cambio de idioma surta efecto. NewGameTab Add Image Añadir imagen Remove Image Eliminar imagen Image Properties Propiedades de la imagen %L1 pieces %L1 piezas Copying images... Copiando las imágenes… Cancel Cancelar Untitled Sin título Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sin título %L1 pieces %2 %3% complete %L1 piezas %2 %3% completo Delete Eliminar Delete Game Eliminar Juego Delete selected game? Eliminar el juego seleccionado? Overview Overview Vista general TagManager Add Tag Añadir etiqueta Remove Tag Quitar etiqueta Untagged Sin etiqueta All Images Todas las imágenes Untitled %1 Sin título %1 Question Pregunta Remove selected tag? Eliminar etiqueta seleccionada? Sorry Lo Siento A tag with that name already exists. Ya existe una etiqueta con ese nombre. Manage Tags... Window Tetzle Tetzle &Game &Juego &Retrieve Pieces &Recuperar Piezas Ctrl+R Ctrl+R &Quit &Salir &Choose... &Elegir &View &Ver Zoom &In Acercar& + + Zoom &Out Alejar& - Best &Fit Mejor &Ajuste Show O&verview Mostrar R&esumen Tab Tab F&ullscreen &Pantalla completa F11 F11 Ctrl+F Ctrl+F &Settings &Configuración &Appearance... &Apariencia… &Language... &Idioma… &Help Ay&uda &Controls &Controles &About &Acerca de About &Qt Acerca de &Qt Controls Controles <b>Pick Up Pieces:</b> <b>Recoger Piezas:</b> Left Click or Space Clic Izquierdo o Espacio <b>Drop Pieces:</b> <b>Colocar las Piezas:</b> <b>Select Pieces:</b> <b>Seleccionar Piezas:</b> Left Drag Arrastrar a la izquierda <b>Rotate Pieces:</b> <b>Rotar Piezas:</b> Right Click, Control + Left Click, or R Click Derecho, Control + Clic Izquierdo o R <b>Drag Puzzle:</b> <b>Arrastrar Puzzle:</b> Middle Click, Shift + Left Click, or Arrows Click Rueda Raton , Mayús + Clic Izquierdo, o las Flechas <b>Zoom Puzzle:</b> <b>Zoom Puzzle:</b> Scrollwheel or +/- Rueda del Ratón o +/- <b>Move Cursor:</b> <b>Mover Cursor:</b> Move mouse or W,A,D,S Mover el ratón o W, A, D, S About Tetzle Acerca de Tetzle A jigsaw puzzle with tetrominoes for pieces Un rompecabezas que usa tetrominós como piezas Copyright &copy; 2008-%1 Graeme Gott &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Publicado bajo la licencia <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_fr.ts000066400000000000000000000346001476255537600201420ustar00rootroot00000000000000 AddImage Open Image Ouvrir une image Images AppearanceDialog Appearance Apparence Options Options Beveled borders Coins biseautés Drop shadows Dissiper les zones d'ombre Colors Couleurs Background: Arrière-plan : Shadow: Ombre : Highlight: Surbrillance : Board Error Erreur Missing image. Image manquante. Please Wait Veuillez patienter Loading image... Chargement de l'image… Generating puzzle... Génération du puzzle… Creating pieces... Création des pièces… Loading puzzle... Chargement du puzzle… Unknown data format Format de donnée inconnu Unknown element '%1' Élément inconnu "%1" Error parsing XML file. %1 Erreur d'analyse du fichier XML. %1 Loading pieces... Chargement des pièces… Retrieving pieces... Pioche des pièces… Placing pieces... Disposition des pièces… Success Succès ChooseGameDialog Choose Game Choisir une partie Current Games Parties en cours New Game Nouvelle partie Play Game ImagePropertiesDialog Image Properties Propriétés de l'image Name: Nom : Tags: Mot-cles : New tag name LocaleDialog Select application language: Sélectionner la langue de l'application : <System Language> <Langue du système> Note Remarque Please restart this application for the change in language to take effect. Veuillez relancer l'application pour que la modification prenne effet. NewGameTab Add Image Ajouter une image Remove Image Supprimer l'image Image Properties Propriétés de l'image %L1 pieces %L1 pièces Copying images... Copie des images… Cancel Annuler Untitled Sans titre Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sans titre %L1 pieces %2 %3% complete %L1 pièces %2 %3% terminées Delete Supprimer Delete Game Supprimer la partie Delete selected game? Supprimer la partie sélectionnée ? Overview Overview Vue d'ensemble TagManager Add Tag Ajouter un mot-clef Remove Tag Supprimer le mot-clef Untagged Mot-clef retiré All Images Toutes les images Untitled %1 Sans titre %1 Question Question Remove selected tag? Supprimer le mot-clef sélectionné ? Sorry Désolé A tag with that name already exists. Un mot-clef identique existe déjà. Manage Tags... Window Tetzle Tetzle &Game &Jeu &Retrieve Pieces &Piocher des pièces Ctrl+R Ctrl+R &Quit &Quitter &Choose... &Choisir… &View &Afficher Zoom &In Zoom &avant + + Zoom &Out Zoom &arrière - - Best &Fit &Mise au point optimale Show O&verview Afficher la &vue d'ensemble Tab Tab F&ullscreen &Plein écran F11 F11 Ctrl+F Ctrl+F &Settings &Paramètres &Appearance... &Apparence… &Language... &Langue… &Help &Aide &Controls &Commandes &About À &propos de… About &Qt À propos de &Qt Controls Contrôles <b>Pick Up Pieces:</b> <b>Ramasser des pièces :</b> Left Click or Space Clic gauche ou Barre d'espace <b>Drop Pieces:</b> <b>Relâcher des pièces :</b> <b>Select Pieces:</b> <b>Sélectionner des pièces :</b> Left Drag Faire glisser à gauche <b>Rotate Pieces:</b> <b>Rotation des pièces :</b> Right Click, Control + Left Click, or R Clic droit, Contrôle + Clic gauche, ou R <b>Drag Puzzle:</b> <b>Faire glisser le puzzle :</b> Middle Click, Shift + Left Click, or Arrows Clic du milieu, Maj + Clic gauche, ou flèches <b>Zoom Puzzle:</b> <b>Zoomer sur le puzzle :</b> Scrollwheel or +/- Molette ou + / - <b>Move Cursor:</b> <b>Curseur de la souris :</b> Move mouse or W,A,D,S Déplacez la souris ou utilisez W,A,D,S About Tetzle À propos de Tetzle A jigsaw puzzle with tetrominoes for pieces Un puzzle Jigsaw à base de tétraminos Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Distribué sous licence GNU <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_he.ts000066400000000000000000000345571476255537600201420ustar00rootroot00000000000000 AddImage Open Image פתיחת תמונה Images AppearanceDialog Appearance מראה Options אפשרויות Beveled borders שיפוע גבולות Drop shadows הטלת צללים Colors צבעים Background: רקע אחורי: Shadow: צל: Highlight: הדגשה: Board Error שגיאה Missing image. תמונה חסרה. Please Wait אנא המתן Loading image... כעת טוען תמונה... Generating puzzle... כעת מפיק פאזל... Creating pieces... כעת יוצר חתיכות... Loading puzzle... כעת טוען פאזל... Unknown data format פורמט מידע לא מוכר Unknown element '%1' אלמנט לא מוכר '%1' Error parsing XML file. %1 שגיאת ניתוח קובץ XML. %1 Loading pieces... כעת טוען חתיכות... Retrieving pieces... כעת מאחזר חתיכות... Placing pieces... כעת ממקם חתיכות... Success הצלחה ChooseGameDialog Choose Game בחירת משחק Current Games משחק נוכחי New Game משחק חדש Play Game ImagePropertiesDialog Image Properties מאפייני תמונה Name: שם: Tags: תגיות: New tag name LocaleDialog Select application language: בחר שפת יישום: <System Language> <שפת מערכת> Note הערה Please restart this application for the change in language to take effect. נא לאתחל את יישום זה כדי להחיל את השינוי בשפה. NewGameTab Add Image הוספת תמונה Remove Image הסרת תמונה Image Properties מאפייני תמונה %L1 pieces %L1 חתיכות Copying images... מעתיק תמונה כעת... Cancel ביטול Untitled ללא כותרת Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled ללא כותרת %L1 pieces %2 %3% complete Delete מחיקה Delete Game מחיקת משחק Delete selected game? מחיקת משחק נוכחי? Overview Overview סקירה כללית TagManager Add Tag הוסף תגית Remove Tag הסר תגית Untagged לא מתויג All Images כל התמונות Untitled %1 ללא כותרת %1 Question שאלה Remove selected tag? להסיר תגית נבחרת? Sorry סליחה A tag with that name already exists. תגית בשם זה כבר קיימת. Manage Tags... Window Tetzle Tetzle &Game &משחק &Retrieve Pieces &אחזור חתיכות Ctrl+R Ctrl+R &Quit י&ציאה &Choose... &בחירה... &View &תצוגה Zoom &In זום &פנימה + + Zoom &Out זום &חוצה - - Best &Fit התאמה &מיטבית Show O&verview Tab F&ullscreen &מסך מלא F11 F11 Ctrl+F Ctrl+F &Settings &הגדרות &Appearance... &מראה... &Language... &שפה... &Help &עזרה &Controls &בקרים &About &אודות About &Qt אודות &QT Controls בקרים <b>Pick Up Pieces:</b> Left Click or Space קליק שמאלי או רווח <b>Drop Pieces:</b> <b>Select Pieces:</b> <b>בחירת חתיכות:</b> Left Drag <b>Rotate Pieces:</b> <b>סיבוב חתיכות:</b> Right Click, Control + Left Click, or R קליק ימני, Control + קליק שמאלי, או R <b>Drag Puzzle:</b> Middle Click, Shift + Left Click, or Arrows קליק אמצעי, Shift + קליק שמאלי, או חצים <b>Zoom Puzzle:</b> Scrollwheel or +/- גלגל עכבר או +/- <b>Move Cursor:</b> Move mouse or W,A,D,S הזזת עכבר או W,A,D,S About Tetzle אודות Tetzle A jigsaw puzzle with tetrominoes for pieces Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license משוחרר תחת הרשיון ‫<a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_lt.ts000066400000000000000000000352141476255537600201540ustar00rootroot00000000000000 AddImage Open Image Atverti paveikslą Images Paveikslai AppearanceDialog Appearance Išvaizda Options Parinktys Beveled borders Nuožulnūs kraštai Drop shadows Mesti šešėlius Colors Spalvos Background: Fonas: Shadow: Šešėlis Highlight: Paryškinimas: Board Error Klaida Missing image. Trūksta paveikslo. Please Wait Prašome palaukti Loading image... Įkeliamas paveikslas... Generating puzzle... Kuriama dėlionė... Creating pieces... Kuriamos dalys... Loading puzzle... Įkeliama dėlionė... Unknown data format Nežinomas duomenų formatas Unknown element '%1' Nežinomas elementas '%1' Error parsing XML file. %1 XML failo analizės klaida. %1 Loading pieces... Įkeliamos dalys... Retrieving pieces... Gaunamos dalys... Placing pieces... Talpinamos dalys... Success Sėkmė ChooseGameDialog Choose Game Pasirinkite žaidimą Current Games Dabartiniai žaidimai New Game Naujas žaidimas Play Game Žaisti žaidimą ImagePropertiesDialog Image Properties Paveikslo savybės Name: Pavadinimas: Tags: Žymės: New tag name Naujos žymės pavadinimas LocaleDialog Select application language: Pasirinkite programos kalbą: <System Language> <Sistemos kalba> Note Pastaba Please restart this application for the change in language to take effect. Kad įsigaliotų kalbos pakeitimai, prašome paleisti programą iš naujo. NewGameTab Add Image Pridėti paveikslą Remove Image Pašalinti paveikslą Image Properties Paveikslo savybės %L1 pieces %L1 dalių Copying images... Kopijuojami paveikslai... Cancel Atšaukti Untitled Bevardis Remove %n selected image(s)? Šalinti pasirinktą paveikslą? Šalinti %n pasirinktus paveikslus? Šalinti %n pasirinktų paveikslų? Saved games using these image(s) will be deleted. Įrašytas žaidimas, naudojantis šį paveikslą, bus ištrintas. Įrašyti žaidimai, naudojantis šiuos paveikslus, bus ištrinti. Įrašyti žaidimai, naudojantis šiuos paveikslus, bus ištrinti. Remove Šalinti OpenGameTab Untitled Bevardis %L1 pieces %2 %3% complete %L1 dalių %2 %3% pabaigta Delete Ištrinti Delete Game Ištrinti žaidimą Delete selected game? Ištrinti pasirinktą žaidimą? Overview Overview Apžvalga TagManager Add Tag Pridėti žymę Remove Tag Šalinti žymę Untagged Nesužymėti All Images Visi paveikslai Untitled %1 Bevardis %1 Question Klausimas Remove selected tag? Šalinti pasirinktą žymę? Sorry Atleiskite A tag with that name already exists. Žymė tokiu pavadinimu jau yra. Manage Tags... Tvarkyti žymes... Window Tetzle Tetzle &Game Žai&dimas &Retrieve Pieces &Atstatyti dalis Ctrl+R Ctrl+R &Quit &Baigti &Choose... &Pasirinkti &View &Rodinys Zoom &In &Padidinti + + Zoom &Out &Sumažinti - - Best &Fit &Geriausias pritaikymas Show O&verview Ro&dyti apžvalgą Tab Tab F&ullscreen &Visas ekranas F11 F11 Ctrl+F Ctrl+F &Settings &Nustatymai &Appearance... &Išvaizda &Language... Ka&lba &Help &Pagalba &Controls &Valdymas &About &Apie About &Qt Apie &Qt Controls Valdymas <b>Pick Up Pieces:</b> <b>Pakelti dalis:</b> Left Click or Space Kairiojo mygtuko spustelėjimas arba Tarpas <b>Drop Pieces:</b> <b>Nuleisti dalis:</b> <b>Select Pieces:</b> <b>Pasirinkti dalis:</b> Left Drag Vilkti, nuspaudus kairįjį mygtuką <b>Rotate Pieces:</b> <b>Pasukti dalis:</b> Right Click, Control + Left Click, or R Dešiniojo mygtuko spustelėjimas, Control + Kairiojo mygtuko spustelėjimas, arba R <b>Drag Puzzle:</b> <b>Vilkti dėlionę:</b> Middle Click, Shift + Left Click, or Arrows Vidurinio mygtuko spustelėjimas, Shift + Kairiojo mygtuko spustelėjimas, arba Krypties klavišai <b>Zoom Puzzle:</b> <b>Padidinti dėlionę:</b> Scrollwheel or +/- Pelės ratukas arba +/- <b>Move Cursor:</b> <b>Perkelti žymeklį:</b> Move mouse or W,A,D,S Perkelti pele arba klavišais W,A,D,S About Tetzle Apie Tetzle A jigsaw puzzle with tetrominoes for pieces Dėlionė su tetromino figūromis Copyright &copy; 2008-%1 Graeme Gott Autorių Teisės &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Išleista pagal <a href=%1>GPL 3</a> licenciją %p% complete %p% užbaigta ZoomSlider Zoom: %1% Mastelis: %1% main Images to add to the choose game dialog. Paveikslai, kuriuos pridėti į žaidimo pasirinkimo dialogą. tetzle-3.0.3/translations/tetzle_lv.ts000066400000000000000000000340761476255537600201630ustar00rootroot00000000000000 AddImage Open Image Atvērt attēlu Images AppearanceDialog Appearance Izskats Options Beveled borders Drop shadows Colors Krāsas Background: Fons: Shadow: Ēna: Highlight: Board Error Kļūda Missing image. Please Wait Lūdzu, uzgaidiet Loading image... Generating puzzle... Creating pieces... Loading puzzle... Unknown data format Unknown element '%1' Error parsing XML file. %1 Loading pieces... Retrieving pieces... Placing pieces... Success ChooseGameDialog Choose Game Current Games New Game Play Game ImagePropertiesDialog Image Properties Name: Tags: New tag name LocaleDialog Select application language: <System Language> Note Please restart this application for the change in language to take effect. NewGameTab Add Image Remove Image Image Properties %L1 pieces Copying images... Cancel Untitled Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled %L1 pieces %2 %3% complete Delete Delete Game Delete selected game? Overview Overview TagManager Add Tag Remove Tag Untagged All Images Untitled %1 Question Remove selected tag? Sorry A tag with that name already exists. Manage Tags... Window Tetzle &Game &Retrieve Pieces Ctrl+R &Quit &Choose... &View Zoom &In + Zoom &Out - Best &Fit Show O&verview Tab F&ullscreen F11 Ctrl+F &Settings &Appearance... &Language... &Help &Controls &About About &Qt Controls <b>Pick Up Pieces:</b> Left Click or Space <b>Drop Pieces:</b> <b>Select Pieces:</b> Left Drag <b>Rotate Pieces:</b> Right Click, Control + Left Click, or R <b>Drag Puzzle:</b> Middle Click, Shift + Left Click, or Arrows <b>Zoom Puzzle:</b> Scrollwheel or +/- <b>Move Cursor:</b> Move mouse or W,A,D,S About Tetzle A jigsaw puzzle with tetrominoes for pieces Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_ms.ts000066400000000000000000000336171476255537600201610ustar00rootroot00000000000000 AddImage Open Image Buka Imej Images AppearanceDialog Appearance Penampilan Options Pilihan Beveled borders Sempadan terserong Drop shadows Bayang letak Colors Warna Background: Latar Belakang: Shadow: Bayang: Highlight: Sorot: Board Error Ralat Missing image. Imej hilang. Please Wait Tunggu Sebentar Loading image... Memuatkan imej... Generating puzzle... Menjana teka-teki... Creating pieces... Mencipta kepingan... Loading puzzle... Memuatkan teka-teki... Unknown data format Format data tidak diketahui Unknown element '%1' Unsur '%1' tidak diketahui Error parsing XML file. %1 Ralat menghurai fail. %1 Loading pieces... Memuatkan kepingan... Retrieving pieces... Mendapatkan kepingan... Placing pieces... Meletak kepingan... Success Berjaya ChooseGameDialog Choose Game Pilih Permainan Current Games Permainan Semasa New Game Permainan Baru Play Game ImagePropertiesDialog Image Properties Sifat Imej Name: Nama: Tags: Tag: New tag name LocaleDialog Select application language: Pilih bahasa aplikasi: <System Language> <Bahasa Sistem> Note Nota Please restart this application for the change in language to take effect. Sila mulakan semula aplikasi ini supaya perubahan bahasa berkesan. NewGameTab Add Image Tambah Imej Remove Image Buang Imej Image Properties Sifat Imej %L1 pieces %L1 kepingan Copying images... Menyalin imej... Cancel Batal Untitled Tidak Bertajuk Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Tidak Bertajuk %L1 pieces %2 %3% complete %L1 kepingan %2 %3% selesai Delete Padam Delete Game Padam Permainan Delete selected game? Padam permainan terpilih? Overview Overview Tinjauan TagManager Add Tag Tambah Tag Remove Tag Buang Tag Untagged Dinyahtag All Images Semua Imej Untitled %1 Tidak bertajuk %1 Question Soalan Remove selected tag? Buang tag terpilih? Sorry Maaf A tag with that name already exists. Tag dengan nama tersebut sudah wujud. Manage Tags... Window Tetzle Tetzle &Game &Permainan &Retrieve Pieces &Dapatkan Kepingan Ctrl+R Ctrl+R &Quit &Keluar &Choose... P&ilih... &View &Lihat Zoom &In Zum &Masuk + + Zoom &Out Zum &Keluar - - Best &Fit Suai M&uat Show O&verview Tunjuk T&injauan Tab Tab F&ullscreen Sk&rin Penuh F11 F11 Ctrl+F Ctrl+F &Settings &Tetapan &Appearance... P&enampilan... &Language... &Bahasa... &Help Ba&ntuan &Controls &Kawalan &About Perih&al About &Qt Perihal &Qt Controls Kawalan <b>Pick Up Pieces:</b> <b>Ambil Kepingan:</b> Left Click or Space Klik Kiri atau Space <b>Drop Pieces:</b> <b>Lepas Kepingan:</b> <b>Select Pieces:</b> <b>Pilih Kepingan:</b> Left Drag Seret Kiri <b>Rotate Pieces:</b> <b>Putar Kepingan:</b> Right Click, Control + Left Click, or R Klik Kanan, Control + Klik Kiri, atau R <b>Drag Puzzle:</b> <b>Seret Teka-teki:</b> Middle Click, Shift + Left Click, or Arrows Klik Tengah, Shift + Klik Kiri, atau Anak Panah <b>Zoom Puzzle:</b> <b>Zum Teka-teki:</b> Scrollwheel or +/- Roda Tatal atau +/- <b>Move Cursor:</b> <b>Gerak Kursor:</b> Move mouse or W,A,D,S Gerak tetikus atau About Tetzle Perihal Tetzle A jigsaw puzzle with tetrominoes for pieces Teka-teki susun suai gambar dengan tetromino untuk kepingannya Copyright &copy; 2008-%1 Graeme Gott Hakcipta &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Dikeluarkan dibawah lesen <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_nb_NO.ts000066400000000000000000000336521476255537600205340ustar00rootroot00000000000000 AddImage Open Image Åpne bilde Images AppearanceDialog Appearance Utseende Options Valg Beveled borders Avrundet utsnitt Drop shadows Kastskygger Colors Farger Background: Bakgrunn: Shadow: Skygge: Highlight: Framheving: Board Error Feil Missing image. Mangler bilde. Please Wait Vent Loading image... Laster bilde… Generating puzzle... Genererer puslespill… Creating pieces... Oppretter brikker… Loading puzzle... Laster puslespill… Unknown data format Ukjent dataformat Unknown element '%1' Ukjent element "%1" Error parsing XML file. %1 Kunne ikke tolke XML-fil. %1 Loading pieces... Laster brikker… Retrieving pieces... Henter brikker… Placing pieces... Plasserer brikker… Success Vellykket ChooseGameDialog Choose Game Velg spill Current Games Nåværende spill New Game Nytt spill Play Game ImagePropertiesDialog Image Properties Billedegenskaper Name: Navn: Tags: Etiketter: New tag name LocaleDialog Select application language: Velg programspråk: <System Language> <Systemforvalg> Note Merk Please restart this application for the change in language to take effect. Språkvalg trer i effekt ved omstart av programmet. NewGameTab Add Image Legg til bilde Remove Image Fjern bilde Image Properties Billedegenskaper %L1 pieces %L1 brikker Copying images... Kopierer bilder… Cancel Avbryt Untitled Uten tittel Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Uten tittel %L1 pieces %2 %3% complete %L1 brikker %2 %3% fullført Delete Slett Delete Game Slett spill Delete selected game? Slett valgt spill? Overview Overview Oversikt TagManager Add Tag Legg til etikett Remove Tag Fjern etikett Untagged Umerket All Images Alle bilder Untitled %1 Uten tittel %1 Question Spørsmål Remove selected tag? Fjern valgt etikett? Sorry Beklager A tag with that name already exists. En etikett med det navnet finnes allerede. Manage Tags... Window Tetzle Tetzle &Game &Spill &Retrieve Pieces &Hent brikker Ctrl+R Ctrl+R &Quit &Avslutt &Choose... &Velg… &View &Vis Zoom &In For&størr + + Zoom &Out For&minsk - - Best &Fit &Tilpasning Show O&verview Vis &oversikt Tab Fane F&ullscreen F&ullskjermsvisning F11 F11 Ctrl+F Ctrl+F &Settings &Innstillinger &Appearance... &Utseende… &Language... &språk… &Help &Hjelp &Controls &Kontroller &About &Om About &Qt Om &Qt Controls Kontroller <b>Pick Up Pieces:</b> <b>Plukk opp brikker:</b> Left Click or Space Venstreklikk eller mellomrom <b>Drop Pieces:</b> <b>Legg ned brikker:</b> <b>Select Pieces:</b> <b>Velg brikker:</b> Left Drag Venstremusetastdragning <b>Rotate Pieces:</b> <b>Roter brikker:</b> Right Click, Control + Left Click, or R Høyreklikk, Ctrl+venstreklikk, eller R <b>Drag Puzzle:</b> <b>Dra puslespill:</b> Middle Click, Shift + Left Click, or Arrows Midklikk, Shift+Venstreklikk, eller piltaster <b>Zoom Puzzle:</b> <b>Forstørr bilde:</b> Scrollwheel or +/- Rullehjul eller +/- <b>Move Cursor:</b> <b>Flytt peker:</b> Move mouse or W,A,D,S Flytt mus eller W,A,D,S About Tetzle Om Tetzle A jigsaw puzzle with tetrominoes for pieces Et puslespill som bruker tetromino-brikker Copyright &copy; 2008-%1 Graeme Gott Opphavsrett &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Lisensiert <a href=%1>GPLv3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_nl.ts000066400000000000000000000346161476255537600201530ustar00rootroot00000000000000 AddImage Open Image Afbeelding openen Images Afbeeldingen AppearanceDialog Appearance Vormgeving Options Opties Beveled borders Schuine randen Drop shadows Slagschaduwen Colors Kleuren Background: Achtergrond: Shadow: Schaduw: Highlight: Markering: Board Error Foutmelding Missing image. Ontbrekende afbeelding. Please Wait Even geduld Loading image... Bezig met laden van afbeelding… Generating puzzle... Bezig met samenstellen van puzzel… Creating pieces... Bezig met maken van stukken… Loading puzzle... Bezig met laden van puzzel… Unknown data format Onbekend gegevensformaat Unknown element '%1' Onbekend element: ‘%1’ Error parsing XML file. %1 Het xml-bestand kan niet worden ingelezen. %1 Loading pieces... Bezig met laden van stukken… Retrieving pieces... Bezig met ophalen van stukken… Placing pieces... Bezig met plaatsen van stukken… Success Voltooid ChooseGameDialog Choose Game Kies een spel Current Games Huidige spellen New Game Nieuw spel Play Game Spel spelen ImagePropertiesDialog Image Properties Afbeeldingseigenschappen Name: Naam: Tags: Labels: New tag name Nieuwe labelnaam LocaleDialog Select application language: Kies de programmataal: <System Language> <System Language> Note Opmerking Please restart this application for the change in language to take effect. Herstart het programma om de taalwijziging toe te passen. NewGameTab Add Image Afbeelding toevoegen Remove Image Afbeelding verwijderen Image Properties Afbeeldingseigenschappen %L1 pieces %L1 stukken Copying images... Bezig met kopiëren van afbeeldingen… Cancel Annuleren Untitled Naamloos Remove %n selected image(s)? Wil je de geselecteerde afbeelding verwijderen? Wil je %n geselecteerde afbeeldingen verwijderen? Saved games using these image(s) will be deleted. Bewaarde spellen met deze afbeelding worden verwijderd. Bewaarde spellen met deze afbeeldingen worden verwijderd. Remove Verwijderen OpenGameTab Untitled Naamloos %L1 pieces %2 %3% complete %L1 stukken %2 %3% voltooid Delete Verwijderen Delete Game Spel verwijderen Delete selected game? Wil je het gekozen spel verwijderen? Overview Overview Overzicht TagManager Add Tag Label toekennen Remove Tag Label verwijderen Untagged Ongelabeld All Images Alle afbeeldingen Untitled %1 Naamloos %1 Question Vraag Remove selected tag? Wil je het gekozen label verwijderen? Sorry Sorry A tag with that name already exists. Er is al een label met die naam. Manage Tags... Labels beheren… Window Tetzle Tetzle &Game &Spel &Retrieve Pieces &Stukken ophalen Ctrl+R Ctrl+R &Quit &Afsluiten &Choose... &Kiezen… &View &Beeld Zoom &In &Inzoomen + + Zoom &Out Uitz&oomen - - Best &Fit &Beste inpassing Show O&verview O&verzicht tonen Tab Tab F&ullscreen Scherm&vullend F11 F11 Ctrl+F Ctrl+F &Settings In&stellingen &Appearance... Vormg&eving… &Language... Taa&l… &Help &Hulp &Controls &Besturing &About &Over About &Qt Over &Qt Controls Besturing <b>Pick Up Pieces:</b> <b>Stukken oppakken:</b> Left Click or Space Linkermuisklik of spatiebalk <b>Drop Pieces:</b> <b>Stukken plaatsen:</b> <b>Select Pieces:</b> <b>Stukken selecteren:</b> Left Drag Links slepen <b>Rotate Pieces:</b> <b>Stukken draaien:</b> Right Click, Control + Left Click, or R Rechtermuisklik, Ctrl + linkermuisklik of R <b>Drag Puzzle:</b> <b>Puzzel verslepen:</b> Middle Click, Shift + Left Click, or Arrows Middelste muisklik, Shift + linkermuisklik of pijltjestoetsen <b>Zoom Puzzle:</b> <b>Puzzel in-/uitzoomen:</b> Scrollwheel or +/- Scrollwiel of +/- <b>Move Cursor:</b> <b>Cursor verplaatsen:</b> Move mouse or W,A,D,S Muis verplaatsen of W,A,D,S About Tetzle Over Tetzle A jigsaw puzzle with tetrominoes for pieces Een legpuzzel met tetrominovormige stukken Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Uitgebracht onder de <a href=%1>GPL 3</a>-licentie %p% complete %p% voltooid ZoomSlider Zoom: %1% Zoomniveau: %1% main Images to add to the choose game dialog. De aan het spelkeuzescherm toe te voegen afbeeldingen. tetzle-3.0.3/translations/tetzle_pl.ts000066400000000000000000000342531476255537600201520ustar00rootroot00000000000000 AddImage Open Image Otwórz obraz Images AppearanceDialog Appearance Wygląd Options Opcje Beveled borders Skośne krawędzie Drop shadows Cienie upuszczania Colors Kolory Background: Tło: Shadow: Cień: Highlight: Zaznaczone: Board Error Błąd Missing image. Brak obrazu. Please Wait Proszę czekać Loading image... Ładowanie obrazu... Generating puzzle... Tworzenie puzzli... Creating pieces... Tworzenie części... Loading puzzle... Ładowanie puzzli... Unknown data format Nieznany format danych Unknown element '%1' Nieznany element '%1' Error parsing XML file. %1 Błąd parsowania pliku XML. %1 Loading pieces... Ładowanie części... Retrieving pieces... Pobieranie części... Placing pieces... Umieszczanie części... Success Sukces ChooseGameDialog Choose Game Wybierz grę Current Games Obecne gry New Game Nowa gra Play Game ImagePropertiesDialog Image Properties Właściwości obrazu Name: Nazwa: Tags: Tagi New tag name LocaleDialog Select application language: Wybierz język programu: <System Language> <Język systemowy> Note Uwaga Please restart this application for the change in language to take effect. Proszę ponownie uruchomić ten program, aby zastosować zmianę języka. NewGameTab Add Image Dodaj obraz Remove Image Usuń obraz Image Properties Właściwości obrazu %L1 pieces %L1 części Copying images... Kopiowanie obrazów... Cancel Anuluj Untitled Bez tytułu Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Bez tytułu %L1 pieces %2 %3% complete %L1 części %2 %3% kompletne Delete Usuń Delete Game Usuń grę Delete selected game? Usunąć wybraną grę? Overview Overview Przegląd TagManager Add Tag Dodaj tag Remove Tag Usuń tag Untagged Bez tagów All Images Wszystkie obrazy Untitled %1 Bez tytułu %1 Question Pytanie Remove selected tag? Usunąć wybrany tag? Sorry Przepraszamy A tag with that name already exists. Tag o takiej nazwie już istnieje. Manage Tags... Window Tetzle Tetzle &Game &Gra &Retrieve Pieces &Pobierz części Ctrl+R Ctrl+R &Quit &Zakończ &Choose... W&ybierz... &View &Widok Zoom &In &Przybliż + + Zoom &Out &Oddal - - Best &Fit &Najlepsze dopasowanie Show O&verview Pokaż p&odgląd Tab Tab F&ullscreen Pełny &ekran F11 F11 Ctrl+F Ctrl+F &Settings &Ustawienia &Appearance... Wy&gląd... &Language... &Język... &Help &Pomoc &Controls &Sterowanie &About &O About &Qt O &Qt Controls Sterowanie <b>Pick Up Pieces:</b> <b>Podnoszenie części:</b> Left Click or Space Lewy przycisk myszy lub spacja <b>Drop Pieces:</b> <b>Upuszczanie części:</b> <b>Select Pieces:</b> <b>Wybór części:</b> Left Drag Przeciągając lewym przyciskiem myszy <b>Rotate Pieces:</b> <b>Obróć części:</b> Right Click, Control + Left Click, or R Prawy przycisk myszy, Ctrl + Lewy przycisk myszy lub R <b>Drag Puzzle:</b> <b>Przeciąganie puzzli:</b> Middle Click, Shift + Left Click, or Arrows Środkowy przycisk myszy, Shift + Lewy przycisk myszy, lub strzałki <b>Zoom Puzzle:</b> <b>Powiększanie puzzli:</b> Scrollwheel or +/- Kółko myszy lub +/- <b>Move Cursor:</b> <b>Przesuwanie kursora:</b> Move mouse or W,A,D,S Przesuń myszą lub W,A,D,S About Tetzle O Tetzle A jigsaw puzzle with tetrominoes for pieces Gra puzzle z części o kształcie tetromina Copyright &copy; 2008-%1 Graeme Gott Prawo autorskie &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Wydano na licencji <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_pt.ts000066400000000000000000000343051476255537600201600ustar00rootroot00000000000000 AddImage Open Image Abrir Imagem Images AppearanceDialog Appearance Aparência: Options Opções Beveled borders Bordas arredondadas Drop shadows Sombras Colors Cores Background: Fundo: Shadow: Sombra: Highlight: Destaque: Board Error Erro Missing image. Imagem em falta Please Wait Por Favor Aguarde Loading image... A carregar imagem... Generating puzzle... A gerar o quebra-cabeças... Creating pieces... A criar as peças... Loading puzzle... A carregar o quebra-cabeças... Unknown data format Formato de dados desconhecido Unknown element '%1' Elemento desconhecido '%1' Error parsing XML file. %1 Surgiu um erro ao processar o ficheiro XML. %1 Loading pieces... A carregar as peças... Retrieving pieces... A obter as peças... Placing pieces... A colocar as peças... Success Sucesso ChooseGameDialog Choose Game Escolha o Jogo Current Games Jogos Atuais New Game Novo Jogo Play Game ImagePropertiesDialog Image Properties Propriedades da Imagem Name: Nome: Tags: Etiquetas: New tag name LocaleDialog Select application language: Selecione o idioma da aplicação: <System Language> <Idioma do Sistema> Note Nota Please restart this application for the change in language to take effect. Por favor reinicie esta aplicação para que a alteração do idioma surta efeito. NewGameTab Add Image Adicionar Imagem Remove Image Remover Imagem Image Properties Propriedades da Imagem %L1 pieces %L1 peças Copying images... A copiar as imagens... Cancel Cancelar Untitled Sem título Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sem título %L1 pieces %2 %3% complete %L1 peças %2 %3% completado Delete Eliminar Delete Game Eliminar Jogo Delete selected game? Eliminar o jogo selecionado? Overview Overview Vista geral TagManager Add Tag Adicionar Etiqueta Remove Tag Remover Etiqueta Untagged Sem Etiquetas All Images Todas as Imagens Untitled %1 Sem título %1 Question Questão Remove selected tag? Remover etiqueta selecionada? Sorry Desculpe A tag with that name already exists. Já existe uma etiqueta com esse nome. Manage Tags... Window Tetzle Tetzle &Game &Jogo &Retrieve Pieces &Recuperar Peças Ctrl+R Ctrl+R &Quit &Sair &Choose... &Escolher Jogo... &View &Visualização Zoom &In A&proximar + + Zoom &Out A&fastar - - Best &Fit &Melhor Enquadramento Show O&verview Mostrar &Vista Geral Tab Tab F&ullscreen Ecrã &Inteiro F11 F11 Ctrl+F Ctrl+F &Settings &Configurações &Appearance... &Aparência... &Language... &Idioma... &Help &Ajuda &Controls &Controlos &About S&obre About &Qt Sobre o &Qt Controls Controlos <b>Pick Up Pieces:</b> <b>Pegar nas Peças:</b> Left Click or Space Clique Esquerdo ou Tecla de Espaço <b>Drop Pieces:</b> <b>Largar Peças:</b> <b>Select Pieces:</b> <b>Selecionar Peças:</b> Left Drag Arrastar Esquerdo <b>Rotate Pieces:</b> <b>Rodar Peças:</b> Right Click, Control + Left Click, or R Clique Direito, Ctrl+Clique Esquerdo, ou R <b>Drag Puzzle:</b> <b>Arrastar Quebra-Cabeças:</b> Middle Click, Shift + Left Click, or Arrows Clique do Meio, Shift+Clique Esquerdo, ou teclas de Direção <b>Zoom Puzzle:</b> <b>Magnificação:</b> Scrollwheel or +/- Roda do rato ou +/- <b>Move Cursor:</b> <b>Mover Cursor:</b> Move mouse or W,A,D,S Mover rato ou teclas W,A,D,S About Tetzle Sobre o Tetzle A jigsaw puzzle with tetrominoes for pieces Um quebra-cabeça com peças tetraminós Copyright &copy; 2008-%1 Graeme Gott Direitos de autor &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Lançado sob a licença <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_pt_BR.ts000066400000000000000000000342101476255537600205360ustar00rootroot00000000000000 AddImage Open Image Abrir imagem Images AppearanceDialog Appearance Aparência Options Opções Beveled borders Bordas chanfradas Drop shadows Sombras externas Colors Cores Background: Fundo: Shadow: Sombra: Highlight: Realce: Board Error Erro Missing image. Faltando imagem. Please Wait Por favor aguarde Loading image... Carregando imagem... Generating puzzle... Gerando quebra-cabeças... Creating pieces... Criando peças... Loading puzzle... Carregando quebra-cabeças... Unknown data format Formato de dados desconhecido Unknown element '%1' Elemento desconhecido '%1' Error parsing XML file. %1 Erro ao interpretar arquivo XML. %1 Loading pieces... Carregando peças... Retrieving pieces... Recuperando peças... Placing pieces... Posicionando peças... Success Sucesso ChooseGameDialog Choose Game Escolha um jogo Current Games Jogos atuais New Game Novo jogo Play Game ImagePropertiesDialog Image Properties Propriedades da imagem Name: Nome: Tags: Tags: New tag name LocaleDialog Select application language: Selecione o idioma do jogo: <System Language> <Idioma do sistema> Note Nota Please restart this application for the change in language to take effect. Por favor reinicie o jogo para que a alteração do idioma faça efeito. NewGameTab Add Image Adicionar imagem Remove Image Remover imagem Image Properties Propriedades da imagem %L1 pieces %L1 peças Copying images... Copiando imagens.. Cancel Cacelar Untitled Sem título Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Sem título %L1 pieces %2 %3% complete %L1 peças %2 %3 completas Delete Excluir Delete Game Excluir jogo Delete selected game? Excluir jogo selecionado? Overview Overview Visão geral TagManager Add Tag Adicionar tag Remove Tag Remover tag Untagged Sem tags All Images Todas as imagens Untitled %1 Sem título %1 Question Pergunta Remove selected tag? Remover a tag selecionada? Sorry Desculpe A tag with that name already exists. Uma tag com este nome já existe. Manage Tags... Window Tetzle Tetzle &Game &Jogo &Retrieve Pieces &Recuperar peças Ctrl+R Ctrl+R &Quit Sai&r &Choose... &Escolher... &View &Visualizar Zoom &In &Aumentar Zoom + + Zoom &Out &Diminuir Zoom - - Best &Fit Ajustar à &tela Show O&verview Exibir &visão geral Tab Tab F&ullscreen Tela &cheia F11 F11 Ctrl+F Ctrl+F &Settings &Configurações &Appearance... &Aparência... &Language... &Idioma... &Help A&juda &Controls &Controles &About &Sobre About &Qt Sobre o &Qt Controls Controles <b>Pick Up Pieces:</b> <b>Pegar peças:</b> Left Click or Space Clique esquerdo ou espaço <b>Drop Pieces:</b> <b>Deixar peças:</b> <b>Select Pieces:</b> <b>Selecionar peças:</b> Left Drag Arrastar com botão esquerdo <b>Rotate Pieces:</b> <b>Girar peças:</b> Right Click, Control + Left Click, or R Clique direito, Control + clique esquerdo, ou R <b>Drag Puzzle:</b> <b>Arrastar quebra-cabeças:</b> Middle Click, Shift + Left Click, or Arrows Clique no meio, Shift + Clique esquerdo, ou setas direcionais <b>Zoom Puzzle:</b> <b>Aumentar/diminuir zoom:</b> Scrollwheel or +/- Roda do mouse ou +/- <b>Move Cursor:</b> <b>Mover cursor:</b> Move mouse or W,A,D,S Mova o mouse ou W, A, S, D About Tetzle Sobre o Teztle A jigsaw puzzle with tetrominoes for pieces Quebra-cabeças com peças em formato de tetris Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Licenciado sob os termos da <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_ro.ts000066400000000000000000000346121476255537600201560ustar00rootroot00000000000000 AddImage Open Image Deschide imagine Images Imagini AppearanceDialog Appearance Aspect Options Opţiuni Beveled borders Margini teşite Drop shadows Umbrire Colors Culori Background: Fundal: Shadow: Umbre: Highlight: Evidenţiere: Board Error Eroare Missing image. Lipseşte imagine. Please Wait Vă rugăm aşteptaţi Loading image... Încărcare imagine... Generating puzzle... Generare puzzle... Creating pieces... Creare piese... Loading puzzle... Încărcare puzzle... Unknown data format Format date necunoscut Unknown element '%1' Element necunoscut '%1' Error parsing XML file. %1 Eroare la analizarea fişierului XML. %1 Loading pieces... Încărcare piese... Retrieving pieces... Preluare piese... Placing pieces... Plasare piese... Success Succes ChooseGameDialog Choose Game Alegere joc Current Games Joc curent New Game Joc nou Play Game Joacă jocul ImagePropertiesDialog Image Properties Proprietăţi imagine Name: Nume: Tags: Etichete: New tag name Nume de etichetă nou LocaleDialog Select application language: Selectaţi limba aplicaţiei: <System Language> <Limbaj Sistem> Note Notă Please restart this application for the change in language to take effect. Vă rugăm reporniţi această aplicaţie pentru ca schimbarea limbii să aibă efect. NewGameTab Add Image Adăugare imagine Remove Image Eliminare imagine Image Properties Proprietăţi imagine %L1 pieces %L1 piese Copying images... Copiere imagini... Cancel Anulare Untitled FărăTitlu Remove %n selected image(s)? Eliminați imaginea selectată? Eliminați %n imagini selectate? Eliminați %n imagini selectate? Saved games using these image(s) will be deleted. Jocurile salvate folosind această imagine vor fi șterse. Jocurile salvate folosind aceste imagini vor fi șterse. Jocurile salvate folosind aceste imagini vor fi șterse. Remove Înlătură OpenGameTab Untitled FărăTitlu %L1 pieces %2 %3% complete %L1 piese %2 %3% completat Delete Ştergere Delete Game Ştergere joc Delete selected game? Şterge jocul selectat? Overview Overview Imagine de ansamblu TagManager Add Tag Adăugare etichetă Remove Tag Eliminare etichetă Untagged Neetichetat All Images Toate imaginile Untitled %1 FărăTitlu %1 Question Întrebare Remove selected tag? Elimină eticheta selectată? Sorry Scuze A tag with that name already exists. O etichetă cu acel nume deja există. Manage Tags... Gestionați etichetele... Window Tetzle Tetzle &Game &Joc &Retrieve Pieces P&reluare piese Ctrl+R Ctrl+R &Quit &Ieşire &Choose... Alegeţi... &View &Vizualizare Zoom &In &Mărire + + Zoom &Out M&icşorare - - Best &Fit Cel mai potrivit Show O&verview Arată imagine de ansamblu Tab Tab F&ullscreen &Tot ecranul F11 F11 Ctrl+F Ctrl+F &Settings &Setări &Appearance... &Aspect... &Language... &Limbă... &Help &Ajutor &Controls &Controale &About &Despre About &Qt Despre &Qt Controls Controale <b>Pick Up Pieces:</b> <b>Piese ridicate:</b> Left Click or Space Clic stînga sau spaţiu <b>Drop Pieces:</b> <b>Piese coborîte:</b> <b>Select Pieces:</b> <b>Selectare piese:</b> Left Drag Glisare stînga <b>Rotate Pieces:</b> <b>Rotire piese:</b> Right Click, Control + Left Click, or R Clic dreapta, Control + Clic stînga, sau R <b>Drag Puzzle:</b> <b>Glisare puzzle:</b> Middle Click, Shift + Left Click, or Arrows Clic mijloc, Shift + Clic stînga, sau Săgeţi <b>Zoom Puzzle:</b> <b>Mărire puzzle:</b> Scrollwheel or +/- Rotiţa de derulare or +/- <b>Move Cursor:</b> <b>Mutare cursor:</b> Move mouse or W,A,D,S Mutare mouse sau W,A,D,S About Tetzle Despre Tetzle A jigsaw puzzle with tetrominoes for pieces Un puzzle cu tetromino-uri pentru piese Copyright &copy; 2008-%1 Graeme Gott Toate drepturile rezervate &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Lansat sub licenţă <a href=%1>GPL 3</a> %p% complete %p% complet ZoomSlider Zoom: %1% Zoom: %1% main Images to add to the choose game dialog. Imagini de adăugat la dialogul de alegere a jocului. tetzle-3.0.3/translations/tetzle_ru.ts000066400000000000000000000364731476255537600201730ustar00rootroot00000000000000 AddImage Open Image Открыть изображение Images AppearanceDialog Appearance Вид Options Опции Beveled borders Видимые границы Drop shadows Убрать тени Colors Цвета Background: Задний фон Shadow: Тень Highlight: Подсветка Board Error Ошибка Missing image. Изображение отсутствует. Please Wait Пожалуйста, подождите Loading image... Загрузка изображения... Generating puzzle... Генерация пазла... Creating pieces... Создание пазлов... Loading puzzle... Загрузка пазла... Unknown data format Неизвестный формат файла Unknown element '%1' Неизвестный элемент '%1' Error parsing XML file. %1 Ошибка при обработке XML-файла. %1 Loading pieces... Загрузка пазлов... Retrieving pieces... Перемешиваем пазлы... Placing pieces... Размещение пазлов... Success Успех! ChooseGameDialog Choose Game Выберите игру Current Games Текущие игры New Game Новая игра Play Game ImagePropertiesDialog Image Properties Настройки изображения Name: Название: Tags: Тэги: New tag name LocaleDialog Select application language: Выберите язык программы: <System Language> <Язык системы> Note Предупреждение Please restart this application for the change in language to take effect. Пожалуйста, перезапустите программу для того, чтобы изменения вступили в силу. NewGameTab Add Image Добавить изображение Remove Image Удалить изображение Image Properties Настройки изображения %L1 pieces %L1 пазлов Copying images... Копируем изображения... Cancel Отмена Untitled Без названия Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Без названия %L1 pieces %2 %3% complete %L1 пазлов %2 %3% завершено Delete Удалить Delete Game Удалить игру Delete selected game? Удалить выбранную игру? Overview Overview Общий вид TagManager Add Tag Добавить тэг Remove Tag Удалить тэг Untagged Нет тега All Images Все изображения Untitled %1 Без названия %1 Question Вопрос Remove selected tag? Удалить выбранный тэг? Sorry Извините A tag with that name already exists. Такой тэг уже существует. Manage Tags... Window Tetzle Tetzle &Game &Игра &Retrieve Pieces &Перемешать пазлы Ctrl+R Ctrl+R &Quit &Выход &Choose... &Выбрать... &View &Вид Zoom &In У&величить + + Zoom &Out У&меньшить - - Best &Fit Наилучший вид Show O&verview Показывать &общий вид Tab Tab F&ullscreen &На весь экран F11 F11 Ctrl+F Ctrl+F &Settings Н&астройки &Appearance... &Вид... &Language... &Язык... &Help &Помощь &Controls &Управление &About &Об игре About &Qt О Qt& Controls Управление <b>Pick Up Pieces:</b> <b>Брать пазлы:</b> Left Click or Space Левый клик или пробел <b>Drop Pieces:</b> <b>Отпускать пазлы:</b> <b>Select Pieces:</b> <b>Выделять пазлы</b> Left Drag Зажать левую кнопку мыши и выделять <b>Rotate Pieces:</b> <b>Вращение элементов:</b> Right Click, Control + Left Click, or R Правый клик, Ctrl + левый клик, или R <b>Drag Puzzle:</b> <b>Двигать полотно пазла:</b> Middle Click, Shift + Left Click, or Arrows Зажать колесико мышки, Shift+ Левый клик, или кнопки Влево, Вправо, Вверх и Вниз <b>Zoom Puzzle:</b> <b>Увеличить пазл:</b> Scrollwheel or +/- Колесо прокрутки или +/- <b>Move Cursor:</b> <b>Двигать курсор:</b> Move mouse or W,A,D,S Мышь или W,A,S,D About Tetzle О Tetlze A jigsaw puzzle with tetrominoes for pieces Игра-головоломка с тетрамино Copyright &copy; 2008-%1 Graeme Gott Копирайт &copy; 20080%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Опубликовано под лицензией <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/translations/tetzle_tr.ts000066400000000000000000000341731476255537600201650ustar00rootroot00000000000000 AddImage Open Image Resim Aç Images AppearanceDialog Appearance Görünüm Options Seçenekler Beveled borders Eğimli Köşeler Drop shadows Alt gölgeler Colors Renkler Background: Arka Plan: Shadow: Gölge: Highlight: Vurgulama: Board Error Hata Missing image. Kayıp resim. Please Wait Lütfen Bekleyin Loading image... Resim yükleniyor... Generating puzzle... Yap-boz oluşturuluyor... Creating pieces... Parçalar oluşturuluyor... Loading puzzle... Yap-boz yükleniyor... Unknown data format Bilinmeyen veri biçimi Unknown element '%1' Blinmeyen '%1' ögesi Error parsing XML file. %1 XML dosyası ayrıştırma hatası.⏎ ⏎ %1 Loading pieces... Parçalar yükleniyor... Retrieving pieces... Parçalar alınıyor... Placing pieces... Parçalar yerleştiriliyor... Success Başarılı ChooseGameDialog Choose Game Oyun Seç Current Games Mevcut Oyunlar New Game Yeni Oyun Play Game ImagePropertiesDialog Image Properties Resim Seçenekleri Name: İsim: Tags: Etiketler: New tag name LocaleDialog Select application language: Uygulama dilini seçin: <System Language> <Sistem Dili> Note Not Please restart this application for the change in language to take effect. Dil değişikliğinin etkin olması için lütfen bu uygulamayı yeniden başlatın. NewGameTab Add Image Resim Ekle Remove Image Resim Kaldır Image Properties Resim Seçenekleri %L1 pieces %L1 parça Copying images... Resimler kopyalanıyor... Cancel İptal Et Untitled Başlıksız Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Başlıksız %L1 pieces %2 %3% complete %L1 parça %2 %3% tamamlandı Delete Sil Delete Game Oyunu Sil Delete selected game? Seçilmiş oyun silinsin mi? Overview Overview Küçük Resim TagManager Add Tag Etiket Ekle Remove Tag Etiketi Kaldır Untagged Etiketlenmemiş All Images Tüm Resimler Untitled %1 Başlıksız %1 Question Soru Remove selected tag? Seçilmiş etiket kaldırılsın mı? Sorry Üzgünüm A tag with that name already exists. Bu adda bir etiket zaten var. Manage Tags... Window Tetzle Tetzle &Game &Oyun &Retrieve Pieces &Parçaları Geri Getir Ctrl+R Ctrl+R &Quit &Çık &Choose... &Seç... &View &Görünüm Zoom &In &Yakınlaş + + Zoom &Out &Uzaklaş - - Best &Fit &En Uygun Show O&verview &Küçük Resmi Göster Tab Sekme F&ullscreen &Tam Ekran F11 F11 Ctrl+F Ctrl+F &Settings &Ayarlar &Appearance... &Görünüm... &Language... &Dil... &Help &Yardım &Controls &Kontroller... &About &Hakkında About &Qt &Qt Hakkında Controls Kontroller <b>Pick Up Pieces:</b> <b>Parçaları Al:</b> Left Click or Space Sol Tıklama ya da Boşluk <b>Drop Pieces:</b> <b>Parçaları Bırak:</b> <b>Select Pieces:</b> <b>Parçaları Seç:</b> Left Drag Sol Sürükleme <b>Rotate Pieces:</b> <b>Parçaları Döndür:</b> Right Click, Control + Left Click, or R Sağ Tıklama, Ctrl + Sol Tıklama ya da R <b>Drag Puzzle:</b> <b>Yap-bozu Sürükle:</b> Middle Click, Shift + Left Click, or Arrows Orta Tıklama, Shift + Sol Tıklama ya da Oklar <b>Zoom Puzzle:</b> <b>Yap-boz Yakınlaş/Uzaklaş:</b> Scrollwheel or +/- Tekerleği çevir ya da +/- <b>Move Cursor:</b> <b>İmleci Hareket Ettir:</b> Move mouse or W,A,D,S Fare ya da W, A, S, D About Tetzle Tetzle Hakkında A jigsaw puzzle with tetrominoes for pieces Tetris benzeri parçalı bir yap-boz oyunu Copyright &copy; 2008-%1 Graeme Gott Telif hakları saklıdır &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license <a href=%1>GPL 3</a> lisansı altında yayınlanmıştır %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. Oyun seç iletişim kutusuna eklenecek resimler. tetzle-3.0.3/translations/tetzle_uk.ts000066400000000000000000000374771476255537600201710ustar00rootroot00000000000000 AddImage Open Image Відкрити зображення Images Зображення AppearanceDialog Appearance Вигляд Options Параметри Beveled borders Скісні краї Drop shadows Різкі тіні Colors Колір Background: Фон: Shadow: Тінь: Highlight: Підсвічування: Board Error Помилка Missing image. Зображення немає. Please Wait Будь ласка, зачекайте Loading image... Завантаження зображення... Generating puzzle... Генерування пазла... Creating pieces... Створення елементів... Loading puzzle... Завантаження пазла... Unknown data format Невідомий формат даних Unknown element '%1' Невідомий елемент «%1» Error parsing XML file. %1 Error parsing XML file. %1 Loading pieces... Завантаження елементів... Retrieving pieces... Отримання елементів... Placing pieces... Розташування елементів... Success Успішно ChooseGameDialog Choose Game Вибрати гру Current Games Поточні ігри New Game Нова гра Play Game Грати в гру ImagePropertiesDialog Image Properties Властивості зображення Name: Назва: Tags: Мітки: New tag name Нова назва тегу LocaleDialog Select application language: Вибрати мову програми: <System Language> <Системна мова> Note Нотатка Please restart this application for the change in language to take effect. Перезапустіть програму, щоб зміна мови набула сили. NewGameTab Add Image Додати зображення Remove Image Вилучити зображення Image Properties Властивості зображення %L1 pieces %L1 елементів Copying images... Копіювання зображень... Cancel Скасувати Untitled Без назви Remove %n selected image(s)? Видалити вибране зображення? Видалити %n вибрані зображень? Видалити %n вибраних зображень? Saved games using these image(s) will be deleted. Збережені ігри з цим зображенням будуть видалені. Збережені ігри, які використовують ці зображення, будуть видалені. Збережені ігри, які використовують ці зображення, будуть видалені. Remove Видалити OpenGameTab Untitled Без назви %L1 pieces %2 %3% complete %L1 елементів %2 %3% завершено Delete Вилучити Delete Game Вилучити гру Delete selected game? Вилучити вибрану гру? Overview Overview Огляд TagManager Add Tag Додати мітку Remove Tag Вилучити мітку Untagged Без мітки All Images Всі зображення Untitled %1 Без назви %1 Question Запит Remove selected tag? Вилучити вибрану мітку? Sorry На жаль A tag with that name already exists. Мітка з такою назвою вже є. Manage Tags... Керувати тегами... Window Tetzle Tetzle &Game &Гра &Retrieve Pieces &Отримати елементи Ctrl+R Ctrl+R &Quit &Вийти &Choose... &Вибрати... &View &Перегляд Zoom &In &Збільшити + + Zoom &Out Зм&еншити - - Best &Fit Найкращий &добір Show O&verview Показати о&гляд Tab Tab F&ullscreen На по&вний екран F11 F11 Ctrl+F Ctrl+F &Settings &Параметри &Appearance... &Вигляд... &Language... &Мова... &Help &Довідка &Controls &Керування &About Пр&о гру About &Qt Про &Qt Controls Керування <b>Pick Up Pieces:</b> <b>Підняти елементи:</b> Left Click or Space Ліва кнопка миші або пробіл <b>Drop Pieces:</b> <b>Опустити елементи:</b> <b>Select Pieces:</b> <b>Вибрати елементи:</b> Left Drag Перетягування лівою кнопкою <b>Rotate Pieces:</b> <b>Обернути елементи:</b> Right Click, Control + Left Click, or R Права кнопка миші, Ctrl + ліва кнопка або R <b>Drag Puzzle:</b> <b>Перетягти пазл:</b> Middle Click, Shift + Left Click, or Arrows Середня кнопка, Shift + ліва кнопка або стрілки <b>Zoom Puzzle:</b> <b>Масштаб пазла:</b> Scrollwheel or +/- Колесо миші або +/- <b>Move Cursor:</b> <b>Перемістити курсор:</b> Move mouse or W,A,D,S Перемістити мишу або клавіші W, A, D, S About Tetzle Про Tetzle A jigsaw puzzle with tetrominoes for pieces Головоломка з тетраміно на шматки Copyright &copy; 2008-%1 Graeme Gott Авторське право & copy; 2008-%1 Ґрем Ґотт Released under the <a href=%1>GPL 3</a> license Випущено за ліцензією <a href=%1>GPL 3</a> %p% complete Виконано %p%. ZoomSlider Zoom: %1% Масштаб: %1% main Images to add to the choose game dialog. Додати зображення до діалогового вікна вибору гри. tetzle-3.0.3/translations/tetzle_uk_UA.ts000066400000000000000000000365011476255537600205410ustar00rootroot00000000000000 AddImage Open Image Відкрити зображення Images AppearanceDialog Appearance Вигляд Options Параметри Beveled borders Скісні краї Drop shadows Різкі тіні Colors Колір Background: Фон: Shadow: Тінь: Highlight: Підсвічування: Board Error Помилка Missing image. Зображення немає. Please Wait Будь ласка, зачекайте Loading image... Завантаження зображення... Generating puzzle... Генерування пазлу... Creating pieces... Створення елементів... Loading puzzle... Завантаження пазлу... Unknown data format Невідомий формат даних Unknown element '%1' Невідомий елемент '%1' Error parsing XML file. %1 Помилка аналізу XML-файла. %1 Loading pieces... Завантаження елементів... Retrieving pieces... Отримання елементів... Placing pieces... Розташування елементів... Success Успішно ChooseGameDialog Choose Game Вибрати гру Current Games Поточні ігри New Game Нова гра Play Game ImagePropertiesDialog Image Properties Властивості зображення Name: Назва: Tags: Мітки: New tag name LocaleDialog Select application language: Вибрати мову програми: <System Language> <Системна мова> Note Нотатка Please restart this application for the change in language to take effect. Перезапустіть програму, щоб зміна мови набула сили. NewGameTab Add Image Додати зображення Remove Image Вилучити зображення Image Properties Властивості зображення %L1 pieces %L1 елементів Copying images... Копіювання зображень... Cancel Скасувати Untitled Без назви Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled Без назви %L1 pieces %2 %3% complete %L1 елементів %2 %3% завершено Delete Вилучити Delete Game Вилучити гру Delete selected game? Вилучити вибрану гру? Overview Overview Огляд TagManager Add Tag Додати мітку Remove Tag Видалити мітку Untagged Без мітки All Images Всі зображення Untitled %1 Без назви %1 Question Запит Remove selected tag? Вилучити вибрану мітку? Sorry На жаль A tag with that name already exists. Мітка з такою назвою вже є. Manage Tags... Window Tetzle Tetzle &Game &Гра &Retrieve Pieces &Отримати елементи Ctrl+R Ctrl+R &Quit &Вийти &Choose... &Вибрати... &View &Вигляд Zoom &In &Збільшити + + Zoom &Out Зм&еншити - - Best &Fit Найкращий &добір Show O&verview Показати о&гляд Tab Tab F&ullscreen На по&вний екран F11 F11 Ctrl+F Ctrl+F &Settings &Налаштування &Appearance... &Вигляд... &Language... &Мова... &Help &Довідка &Controls &Керування &About Пр&о гру About &Qt Про &Qt Controls Керування <b>Pick Up Pieces:</b> <b>Підняти елементи:</b> Left Click or Space Ліва кнопка миші або пробіл <b>Drop Pieces:</b> <b>Опустити елементи:</b> <b>Select Pieces:</b> <b>Вибрати елементи:</b> Left Drag Ліве перетягування <b>Rotate Pieces:</b> <b>Обернути елементи:</b> Right Click, Control + Left Click, or R Права кнопка миші, Ctrl + ліва кнопка або R <b>Drag Puzzle:</b> <b>Перетягти пазл:</b> Middle Click, Shift + Left Click, or Arrows Середня кнопка, Shift + ліва кнопка або стрілки <b>Zoom Puzzle:</b> <b>Масштабувати пазл:</b> Scrollwheel or +/- Колесо миші або +/- <b>Move Cursor:</b> <b>Перемістити курсор:</b> Move mouse or W,A,D,S Перемістити мишу або W, A, D, S About Tetzle Про Tetzle A jigsaw puzzle with tetrominoes for pieces Головоломка з тетроміно на шматки Copyright &copy; 2008-%1 Graeme Gott Copyright &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license Випущено за ліцензією <a href=%1>GPL 3</a> %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. Додати зображення до діалогового вікна вибору гри. tetzle-3.0.3/translations/tetzle_zh.ts000066400000000000000000000335321476255537600201570ustar00rootroot00000000000000 AddImage Open Image Images AppearanceDialog Appearance Options Beveled borders Drop shadows Colors Background: Shadow: Highlight: Board Error Missing image. Please Wait Loading image... Generating puzzle... Creating pieces... Loading puzzle... Unknown data format Unknown element '%1' Error parsing XML file. %1 Loading pieces... Retrieving pieces... Placing pieces... Success ChooseGameDialog Choose Game Current Games New Game Play Game ImagePropertiesDialog Image Properties Name: Tags: New tag name LocaleDialog Select application language: <System Language> <系统语言> Note 提示 Please restart this application for the change in language to take effect. NewGameTab Add Image Remove Image Image Properties %L1 pieces Copying images... Cancel 取消 Untitled Remove %n selected image(s)? Saved games using these image(s) will be deleted. Remove OpenGameTab Untitled %L1 pieces %2 %3% complete Delete Delete Game Delete selected game? Overview Overview TagManager Add Tag Remove Tag Untagged All Images Untitled %1 Question Remove selected tag? Sorry A tag with that name already exists. Manage Tags... Window Tetzle Tetzle &Game &Retrieve Pieces Ctrl+R Ctrl+R &Quit &Choose... &View Zoom &In 缩 &小 + + Zoom &Out 放 &大 - - Best &Fit Show O&verview Tab Tab F&ullscreen 全&屏 F11 F11 Ctrl+F Ctrl+F &Settings &设置 &Appearance... &Language... &Help &帮助 &Controls &控制 &About &关于 About &Qt 关于 &Qt Controls 控制 <b>Pick Up Pieces:</b> Left Click or Space <b>Drop Pieces:</b> <b>Select Pieces:</b> Left Drag <b>Rotate Pieces:</b> Right Click, Control + Left Click, or R <b>Drag Puzzle:</b> Middle Click, Shift + Left Click, or Arrows <b>Zoom Puzzle:</b> Scrollwheel or +/- <b>Move Cursor:</b> Move mouse or W,A,D,S About Tetzle 关于 Tetzle A jigsaw puzzle with tetrominoes for pieces Copyright &copy; 2008-%1 Graeme Gott 版权所有 &copy; 2008-%1 Graeme Gott Released under the <a href=%1>GPL 3</a> license 基于 <a href=%1>GPL 3</a> 协议发布 %p% complete ZoomSlider Zoom: %1% main Images to add to the choose game dialog. tetzle-3.0.3/windows/000077500000000000000000000000001476255537600145425ustar00rootroot00000000000000tetzle-3.0.3/windows/installer.nsi000066400000000000000000000163261476255537600172620ustar00rootroot00000000000000;-------------------------------- ;Definitions !define APPNAME "Tetzle" !define VERSIONMAJOR 3 !define VERSIONMINOR 0 !define VERSIONPATCH 3 !define APPVERSION "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONPATCH}" !define ABOUTURL "https://gottcode.org/tetzle/" ;-------------------------------- ;Includes !include "MUI2.nsh" !include "FileFunc.nsh" !include "TextFunc.nsh" ;-------------------------------- ;General ;Use highest compression SetCompressor /SOLID /FINAL lzma ;Name and file Name "${APPNAME}" OutFile "${APPNAME}_${APPVERSION}.exe" ;Default installation folder InstallDir "$PROGRAMFILES64\${APPNAME}" InstallDirRegKey HKLM "Software\${APPNAME}" "" ;Request application privileges for Windows Vista RequestExecutionLevel admin ;-------------------------------- ;Variables Var StartMenuFolder ;-------------------------------- ;Interface Settings !define MUI_ICON "..\icons\tetzle.ico" !define MUI_UNICON "..\icons\tetzle.ico" !define MUI_ABORTWARNING !define MUI_LANGDLL_ALLLANGUAGES ;-------------------------------- ;Language Selection Dialog Settings ;Remember the installer language !define MUI_LANGDLL_REGISTRY_ROOT "HKLM" !define MUI_LANGDLL_REGISTRY_KEY "Software\${APPNAME}" !define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language" ;-------------------------------- ;Start Menu Folder Page Settings !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKLM" !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\${APPNAME}" !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder" ;-------------------------------- ;Finish Page Settings !define MUI_FINISHPAGE_RUN "$INSTDIR\${APPNAME}.exe" !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\ReadMe.txt" ;-------------------------------- ;Pages !insertmacro MUI_PAGE_WELCOME !insertmacro MUI_PAGE_LICENSE "..\COPYING" !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_STARTMENU Application $StartMenuFolder !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH !insertmacro MUI_UNPAGE_CONFIRM !insertmacro MUI_UNPAGE_INSTFILES ;-------------------------------- ;Languages !insertmacro MUI_LANGUAGE "English" ;first language is the default language !insertmacro MUI_LANGUAGE "French" !insertmacro MUI_LANGUAGE "German" !insertmacro MUI_LANGUAGE "Spanish" !insertmacro MUI_LANGUAGE "SpanishInternational" !insertmacro MUI_LANGUAGE "SimpChinese" !insertmacro MUI_LANGUAGE "TradChinese" !insertmacro MUI_LANGUAGE "Japanese" !insertmacro MUI_LANGUAGE "Korean" !insertmacro MUI_LANGUAGE "Italian" !insertmacro MUI_LANGUAGE "Dutch" !insertmacro MUI_LANGUAGE "Danish" !insertmacro MUI_LANGUAGE "Swedish" !insertmacro MUI_LANGUAGE "Norwegian" !insertmacro MUI_LANGUAGE "NorwegianNynorsk" !insertmacro MUI_LANGUAGE "Finnish" !insertmacro MUI_LANGUAGE "Greek" !insertmacro MUI_LANGUAGE "Russian" !insertmacro MUI_LANGUAGE "Portuguese" !insertmacro MUI_LANGUAGE "PortugueseBR" !insertmacro MUI_LANGUAGE "Polish" !insertmacro MUI_LANGUAGE "Ukrainian" !insertmacro MUI_LANGUAGE "Czech" !insertmacro MUI_LANGUAGE "Slovak" !insertmacro MUI_LANGUAGE "Croatian" !insertmacro MUI_LANGUAGE "Bulgarian" !insertmacro MUI_LANGUAGE "Hungarian" !insertmacro MUI_LANGUAGE "Thai" !insertmacro MUI_LANGUAGE "Romanian" !insertmacro MUI_LANGUAGE "Latvian" !insertmacro MUI_LANGUAGE "Macedonian" !insertmacro MUI_LANGUAGE "Estonian" !insertmacro MUI_LANGUAGE "Turkish" !insertmacro MUI_LANGUAGE "Lithuanian" !insertmacro MUI_LANGUAGE "Slovenian" !insertmacro MUI_LANGUAGE "Serbian" !insertmacro MUI_LANGUAGE "SerbianLatin" !insertmacro MUI_LANGUAGE "Arabic" !insertmacro MUI_LANGUAGE "Farsi" !insertmacro MUI_LANGUAGE "Hebrew" !insertmacro MUI_LANGUAGE "Indonesian" !insertmacro MUI_LANGUAGE "Mongolian" !insertmacro MUI_LANGUAGE "Luxembourgish" !insertmacro MUI_LANGUAGE "Albanian" !insertmacro MUI_LANGUAGE "Breton" !insertmacro MUI_LANGUAGE "Belarusian" !insertmacro MUI_LANGUAGE "Icelandic" !insertmacro MUI_LANGUAGE "Malay" !insertmacro MUI_LANGUAGE "Bosnian" !insertmacro MUI_LANGUAGE "Kurdish" !insertmacro MUI_LANGUAGE "Irish" !insertmacro MUI_LANGUAGE "Uzbek" !insertmacro MUI_LANGUAGE "Galician" !insertmacro MUI_LANGUAGE "Afrikaans" !insertmacro MUI_LANGUAGE "Catalan" !insertmacro MUI_LANGUAGE "Esperanto" !insertmacro MUI_LANGUAGE "Asturian" ;-------------------------------- ;Reserve Files !insertmacro MUI_RESERVEFILE_LANGDLL ;-------------------------------- ;Installer Functions Function .onInit !insertmacro MUI_LANGDLL_DISPLAY FunctionEnd ;-------------------------------- ;Installer Section Section "install" ;Remove previous installs !include removeprevious.nsh ;Copy files SetOutPath "$INSTDIR" File /r "..\${APPNAME}\*" ;Registry information for add/remove programs WriteRegStr HKLM "Software\${APPNAME}" "" "$INSTDIR" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayName" "${APPNAME}" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "Publisher" "Graeme Gott" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "InstallLocation" "$\"$INSTDIR$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayIcon" "$\"$INSTDIR\${APPNAME}.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "URLInfoAbout" "$\"${ABOUTURL}$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "DisplayVersion" "${APPVERSION}" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMajor" ${VERSIONMAJOR} WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "VersionMinor" ${VERSIONMINOR} WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "NoRepair" 1 ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2 IntFmt $0 "0x%08X" $0 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" "EstimatedSize" "$0" ;Create uninstaller WriteUninstaller "$INSTDIR\Uninstall.exe" ;Create shortcut SetShellVarContext all !insertmacro MUI_STARTMENU_WRITE_BEGIN Application CreateDirectory "$SMPROGRAMS\$StartMenuFolder" CreateShortCut "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" "$INSTDIR\${APPNAME}.exe" !insertmacro MUI_STARTMENU_WRITE_END SetShellVarContext current SectionEnd ;-------------------------------- ;Uninstaller Functions Function un.onInit !insertmacro MUI_UNGETLANGUAGE FunctionEnd ;-------------------------------- ;Uninstaller Section Section "Uninstall" ; Remove from registry DeleteRegKey HKLM "Software\${APPNAME}" DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}" ;Remove files !include files.nsh Delete "$INSTDIR\Uninstall.exe" ;Remove directories !include dirs.nsh RMDir "$INSTDIR" ;Remove shortcut SetShellVarContext all !insertmacro MUI_STARTMENU_GETFOLDER Application $StartMenuFolder Delete "$SMPROGRAMS\$StartMenuFolder\${APPNAME}.lnk" RMDir "$SMPROGRAMS\$StartMenuFolder" SetShellVarContext current SectionEnd tetzle-3.0.3/windows/removeprevious.nsh000066400000000000000000000053541476255537600203550ustar00rootroot00000000000000Delete "$INSTDIR\Credits.txt" Delete "$INSTDIR\imageformats\qdds.dll" Delete "$INSTDIR\imageformats\qgif4.dll" Delete "$INSTDIR\imageformats\qico4.dll" Delete "$INSTDIR\imageformats\qjpeg4.dll" Delete "$INSTDIR\imageformats\qmng4.dll" Delete "$INSTDIR\imageformats\qsvg4.dll" Delete "$INSTDIR\imageformats\qtiff4.dll" Delete "$INSTDIR\D3Dcompiler_47.dll" Delete "$INSTDIR\jhead.exe" Delete "$INSTDIR\jpegtran.exe" Delete "$INSTDIR\libEGL.dll" Delete "$INSTDIR\libgcc_s_dw2-1.dll" Delete "$INSTDIR\libGLESv2.dll" Delete "$INSTDIR\License.txt" Delete "$INSTDIR\mingwm10.dll" Delete "$INSTDIR\opengl32sw.dll" Delete "$INSTDIR\Qt5Core.dll" Delete "$INSTDIR\Qt5Gui.dll" Delete "$INSTDIR\Qt5Svg.dll" Delete "$INSTDIR\Qt5Widgets.dll" Delete "$INSTDIR\Qt6OpenGL.dll" Delete "$INSTDIR\Qt6OpenGLWidgets.dll" Delete "$INSTDIR\QtCore4.dll" Delete "$INSTDIR\QtGui4.dll" Delete "$INSTDIR\QtOpenGL4.dll" Delete "$INSTDIR\QtXml4.dll" Delete "$INSTDIR\styles\qwindowsvistastyle.dll" Delete "$INSTDIR\translations\en.qm" Delete "$INSTDIR\translations\qtbase_bg.qm" Delete "$INSTDIR\translations\qtbase_ca.qm" Delete "$INSTDIR\translations\qtbase_cs.qm" Delete "$INSTDIR\translations\qtbase_da.qm" Delete "$INSTDIR\translations\qtbase_de.qm" Delete "$INSTDIR\translations\qtbase_en.qm" Delete "$INSTDIR\translations\qtbase_es.qm" Delete "$INSTDIR\translations\qtbase_fi.qm" Delete "$INSTDIR\translations\qtbase_fr.qm" Delete "$INSTDIR\translations\qtbase_gd.qm" Delete "$INSTDIR\translations\qtbase_he.qm" Delete "$INSTDIR\translations\qtbase_hu.qm" Delete "$INSTDIR\translations\qtbase_it.qm" Delete "$INSTDIR\translations\qtbase_ja.qm" Delete "$INSTDIR\translations\qtbase_ko.qm" Delete "$INSTDIR\translations\qtbase_lv.qm" Delete "$INSTDIR\translations\qtbase_pl.qm" Delete "$INSTDIR\translations\qtbase_ru.qm" Delete "$INSTDIR\translations\qtbase_sk.qm" Delete "$INSTDIR\translations\qtbase_uk.qm" Delete "$INSTDIR\translations\qt_gl.qm" Delete "$INSTDIR\translations\qt_help_cs.qm" Delete "$INSTDIR\translations\qt_help_da.qm" Delete "$INSTDIR\translations\qt_help_de.qm" Delete "$INSTDIR\translations\qt_help_fr.qm" Delete "$INSTDIR\translations\qt_help_gl.qm" Delete "$INSTDIR\translations\qt_help_hu.qm" Delete "$INSTDIR\translations\qt_help_ja.qm" Delete "$INSTDIR\translations\qt_help_ko.qm" Delete "$INSTDIR\translations\qt_help_pl.qm" Delete "$INSTDIR\translations\qt_help_ru.qm" Delete "$INSTDIR\translations\qt_help_sl.qm" Delete "$INSTDIR\translations\qt_help_uk.qm" Delete "$INSTDIR\translations\qt_help_zh_CN.qm" Delete "$INSTDIR\translations\qt_help_zh_TW.qm" Delete "$INSTDIR\translations\qt_lt.qm" Delete "$INSTDIR\translations\qt_pt.qm" Delete "$INSTDIR\translations\qt_sl.qm" Delete "$INSTDIR\translations\qt_sv.qm" Delete "$INSTDIR\translations\uk.qm" Delete "$INSTDIR\translations\uk_UA.qm" tetzle-3.0.3/windows_deploy.bat000066400000000000000000000032461476255537600166130ustar00rootroot00000000000000@ECHO ON>..\tetzle\windows\dirs.nsh @ECHO ON>..\tetzle\windows\files.nsh @ECHO OFF SET SRCDIR=..\tetzle SET APP=Tetzle SET VERSION=3.0.3 ECHO Copying executable MKDIR %SRCDIR%\%APP% COPY %APP%.exe %SRCDIR%\%APP%\%APP%.exe >nul ECHO Copying translations SET TRANSLATIONS=%SRCDIR%\%APP%\translations MKDIR %TRANSLATIONS% COPY *.qm %TRANSLATIONS% >nul CD %SRCDIR% ECHO Copying Qt windeployqt.exe --verbose 0 --release --compiler-runtime^ --no-opengl-sw --no-system-dxc-compiler --no-system-d3d-compiler^ --skip-plugin-types iconengines^ %APP%\%APP%.exe ECHO Creating ReadMe TYPE README >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt ECHO CREDITS >> %APP%\ReadMe.txt ECHO ======= >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt TYPE CREDITS >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt ECHO NEWS >> %APP%\ReadMe.txt ECHO ==== >> %APP%\ReadMe.txt ECHO. >> %APP%\ReadMe.txt TYPE ChangeLog >> %APP%\ReadMe.txt ECHO Creating installer CD %APP% SETLOCAL EnableDelayedExpansion SET "parentfolder=%__CD__%" FOR /R . %%F IN (*) DO ( SET "var=%%F" ECHO Delete "$INSTDIR\!var:%parentfolder%=!" >> ..\windows\files.nsh ) FOR /R /D %%F IN (*) DO ( TYPE ..\windows\dirs.nsh > temp.txt SET "var=%%F" ECHO RMDir "$INSTDIR\!var:%parentfolder%=!" > ..\windows\dirs.nsh TYPE temp.txt >> ..\windows\dirs.nsh ) DEL temp.txt ENDLOCAL CD .. makensis.exe /V0 windows\installer.nsi ECHO Making portable MKDIR %APP%\Data COPY COPYING %APP%\COPYING.txt >nul ECHO Creating compressed file CD %APP% 7z a -mx=9 %APP%_%VERSION%.zip * >nul CD .. MOVE %APP%\%APP%_%VERSION%.zip . >nul ECHO Cleaning up RMDIR /S /Q %APP% DEL windows\dirs.nsh DEL windows\files.nsh