pax_global_header00006660000000000000000000000064135663210720014517gustar00rootroot0000000000000052 comment=12cc5b0120e6b01aa0d66c684340ea5534395ab6 Minder-1.5.1/000077500000000000000000000000001356632107200127415ustar00rootroot00000000000000Minder-1.5.1/.github/000077500000000000000000000000001356632107200143015ustar00rootroot00000000000000Minder-1.5.1/.github/workflows/000077500000000000000000000000001356632107200163365ustar00rootroot00000000000000Minder-1.5.1/.github/workflows/main.yml000066400000000000000000000003711356632107200200060ustar00rootroot00000000000000name: Vala Linter on: [push] jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - uses: elementary/actions/vala-lint@master with: dir: src/ conf: .vala-lint.conf fail: false Minder-1.5.1/.github/workflows/stale.yml000066400000000000000000000006441356632107200201750ustar00rootroot00000000000000name: Mark stale issues and pull requests on: schedule: - cron: "0 0 * * *" jobs: stale: runs-on: ubuntu-latest steps: - uses: actions/stale@v1 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'Stale issue message' stale-pr-message: 'Stale pull request message' stale-issue-label: 'no-issue-activity' stale-pr-label: 'no-pr-activity' Minder-1.5.1/.gitignore000066400000000000000000000003651356632107200147350ustar00rootroot00000000000000build-flatpak/ build/ .flatpak-builder src/*.o src/*.c src/*.swp src/animator/*.c src/animator/*.swp src/exports/*.c src/exports/*.swp src/themes/*.c src/themes/*.swp src/layouts/*.c src/layouts/*.swp src/undo_actions/*.c src/undo_actions/*.swp Minder-1.5.1/.travis.yml000066400000000000000000000004401356632107200150500ustar00rootroot00000000000000--- language: node_js node_js: - 10/* sudo: required services: - docker addons: apt: sources: - ubuntu-toolchain-r-test packages: - libstdc++-5-dev install: - npm i -g @elementaryos/houston script: - houston ci branches: only: - master - devel Minder-1.5.1/AUTHORS000066400000000000000000000000461356632107200140110ustar00rootroot00000000000000Trevor Williams Minder-1.5.1/COPYING000066400000000000000000001045151356632107200140020ustar00rootroot00000000000000 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 . Minder-1.5.1/LICENSE000066400000000000000000001045131356632107200137520ustar00rootroot00000000000000 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 . Minder-1.5.1/README.md000066400000000000000000000114611356632107200142230ustar00rootroot00000000000000# Minder

Get it on AppCenter

![
Main Window - Light Theme
](https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-current-properties.png "Mind-mapping application for Elementary OS") ## Overview Use the power of mind-mapping to make your ideas come to life. - Quickly create visual mind-maps using the keyboard and automatic layout. - Choose from many tree layout choices. - Add notes, tasks and images to your nodes. - Add node-to-node connections with optional text and notes. - Stylize nodes, links and connections to add more meaning and improve readability. - Quick search of node and connection titles and notes, including filtering options. - Zoom in to focus on certain ideas or zoom out to see the bigger picture. - Enter focus mode to better view and understand portions of the map. - Unlimited undo/redo of any change. - Automatically saves in the background. - Colorized node branches. - Open multiple mindmaps with the use of tabs. - Built-in and custom theme support. - Gorgeous animations. - Import from OPML, FreeMind and Freeplane formats. - Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, FreeMind, Freeplane, Mermaid and yEd formats. - Printer support. ## Installation You will need the following dependencies to build Minder: * ninja-build * python3-pip * python3-setuptools * meson * valac * debhelper * libcairo2-dev * libgranite-dev * libgtk-3-dev * libxml2-dev * libgee-0.8-dev * libarchive-dev From the command-line within the top Minder directory, run `./app run` to build and run the application. To install, run `sudo ./app install` and then run the application from your application launcher. ## Distribution packages Arch Linux users can find Minder under the name [minder-git](https://aur.archlinux.org/packages/minder-git/) in the **AUR**: `$ aurman -S minder-git` Minder is packaged in Void Linux, install it with `xbps-install`: `$ sudo xbps-install Minder` For Fedora users, install the RPM package with: `$ sudo dnf install minder` ## Quick Guide to Creating a Mind-Map When the application is first launched, a main idea node will be displayed in the center of the mind-map canvas. The following actions can be performed on this node: | Key/Mouse Action | Description | |------------------|-------------| | e or double-click | Edits the displayed node text (otherwise called the node "name") of the currently selected node. Editable text will be immediately highlighted, so just start typing the new name to change it. To end the text editing, hit either the **Return** key or the **Tab** key. | | f | Folds the currently selected node, hiding the selected node's tree. | | z | Zooms out. | | Z | Zooms in. | | m | Selects the root node of the current tree. | | C | Centers the currently selected node in the canvas. | | Cursor keys | changes the selection to the node in the given direction. | | Tab | Adds a new child node to the currently selected node. The new node will be immediately editable. | | Return | Adds a new sibling node of the currently selected node. The new node will be immediately editable. | | Control-n | Creates a new mind map document. | | Control-o | Opens an existing document. | | Control-s | Saves the current state of the document. | | Control-S | Saves the current mind-map to a specified file. | | Control-f | Opens the search popover. Entering a string will find all nodes with names that match the strings. Selecting a node in the list will select and bring the node into view on the canvas. | | Control-z | Undoes the last change. | | Control-Z | Redoes the last undo change. | | Right mouse click | Displays a contextual menu listing the available actions that can be taken. | | Click and drag onto empty space | Moves the selected node to a new position in the selected node's parent. | | Click and drag onto another node | Detaches the dragged node and attaches it to the node that is dragged over. | ## Property Sidebar The property sidebar can be shown or hidden by clicking on the gear icon in the upper right corner of the window. This sidebar contains three tabs. The **Current** tab allows you to edit information for or take action on the currently selected node or connection. The **Style** tab allows you to change the look or meaning of different objects in the map. The **Map** tab allows you to modify the layout or theme that is used for the entire mind map. ## Documentation Minder documentation can be found [here](https://github.com/phase1geo/Minder/wiki/Table-of-Contents).

Get it on AppCenter

Minder-1.5.1/app000077500000000000000000000044651356632107200134600ustar00rootroot00000000000000#!/bin/bash arg=$1 function initialize { meson build --prefix=/usr result=$? if [ $result -gt 0 ]; then echo "Unable to initialize, please review log" exit 1 fi cd build ninja result=$? if [ $result -gt 0 ]; then echo "Unable to build project, please review log" exit 2 fi } function test { initialize export DISPLAY=:0 ./com.github.phase1geo.minder --run-tests result=$? export DISPLAY=":0.0" echo "" if [ $result -gt 0 ]; then echo "Failed testing" exit 100 fi echo "Tests passed!" } case $1 in "clean") sudo rm -rf ./build ;; "generate-i18n") initialize ninja com.github.phase1geo.minder-pot ninja com.github.phase1geo.minder-update-po ;; "install") initialize sudo ninja install ;; "install-deps") output=$((dpkg-checkbuilddeps ) 2>&1) result=$? if [ $result -eq 0 ]; then echo "All dependencies are installed" exit 0 fi replace="sudo apt install" pattern="(\([>=<0-9. ]+\))+" sudo_replace=${output/dpkg-checkbuilddeps: error: Unmet build dependencies:/$replace} command=$(sed -r -e "s/$pattern//g" <<< "$sudo_replace") $command ;; "run") initialize ./com.github.phase1geo.minder "${@:2}" ;; "debug") initialize G_DEBUG=fatal-criticals gdb --args ./com.github.phase1geo.minder "${@:2}" ;; "test") test ;; "test-run") test ./com.github.phase1geo.minder "${@:2}" ;; "uninstall") initialize sudo ninja uninstall ;; *) echo "Usage:" echo " ./app [OPTION]" echo "" echo "Options:" echo " clean Removes build directories (can require sudo)" echo " generate-i18n Generates .pot and .po files for i18n (multi-language support)" echo " install Builds and installs application to the system (requires sudo)" echo " install-deps Installs missing build dependencies" echo " run Builds and runs the application" echo " test Builds and runs testing for the application" echo " test-run Builds application, runs testing and if successful application is started" echo " uninstall Removes the application from the system (requires sudo)" ;; esac Minder-1.5.1/com.github.phase1geo.minder.json000066400000000000000000000015571356632107200210330ustar00rootroot00000000000000{ "id": "com.github.phase1geo.minder", "base": "io.elementary.BaseApp", "base-version": "juno", "runtime": "org.freedesktop.Platform", "runtime-version": "18.08", "sdk": "org.freedesktop.Sdk", "command": "com.github.phase1geo.minder", "finish-args": [ "--share=ipc", "--socket=x11", "--socket=wayland", "--filesystem=home", "--talk-name=ca.desrt.dconf", "--filesystem=xdg-run/dconf", "--filesystem=~/.config/dconf:ro", "--env=DCONF_USER_CONFIG_DIR=.config/dconf" ], "modules":[{ "name": "minder", "buildsystem": "meson", "sources": [{ "type": "archive", "url": "https://github.com/phase1geo/Minder/archive/1.3.1.tar.gz", "sha256": "16d5fba1b2108f0cd4e67502555ac06dfed367344d17a365ce4f91d6f55e44a5" }, { "type": "patch", "path": "elementary-theme.patch" }] }] } Minder-1.5.1/data/000077500000000000000000000000001356632107200136525ustar00rootroot00000000000000Minder-1.5.1/data/Application.css000066400000000000000000000021451356632107200166310ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ @define-color colorPrimary @GRAPE_700; @define-color textColorPrimary @SILVER_100; @define-color textColorPrimaryShadow @SILVER_500; @define-color colorAccent @GRAPE_700; .theme-selected { background: blue; color: white; } .theme-font-selected { color: white; } Minder-1.5.1/data/com.github.phase1geo.minder.appdata.xml000066400000000000000000000700421356632107200231770ustar00rootroot00000000000000 com.github.phase1geo.minder CC0-1.0 GPL-3.0+ Minder Minder Create, develop and visualize your ideas Créez, développez et visualisez vos idées

Use the power of mind-mapping to make your ideas come to life.

Utilisez le pouvoir des cartes mentales pour donner vie à vos idées.

  • Quickly create visual mind-maps using the keyboard and automatic layout.
  • Créez rapidement des cartes mentales visuelles en utilisant le clavier et la mise en forme automatique.
  • Choose from many tree layout choices
  • Choisissez parmi différents choix de disposition d'arbre
  • Add notes, tasks and images to your nodes.
  • Ajoutez des notes, des tâches et des images à vos nÅ“uds.
  • Add node-to-node connections with optional text and notes.
  • Ajoutez des connexions nÅ“ud-vers-nÅ“ud avec en option du texte et des notes.
  • Stylize nodes, links and connections to add more meaning and improve readability.
  • Stylisez les nÅ“uds, liens et connexions pour ajouter plus de sens et améliorer la lisibilité.
  • Quick search of node and connection titles and notes, including filtering options.
  • Recherche rapide de notes et titres de nÅ“uds et connexions, incluant des options de filtrage.
  • Zoom in or enable focus mode to focus on certain ideas or zoom out to see the bigger picture.
  • Enter focus mode to better view and understand portions of the map.
  • Unlimited undo/redo of any change.
  • Possibilité infinie d'annuler/rétablir des modifications.
  • Automatically saves in the background.
  • Sauvegarde automatique en arrière-plan.
  • Colorized node branches.
  • Branches de nÅ“uds colorées.
  • Open multiple mindmaps with the use of tabs.
  • Built-in and customizable theming.
  • Gorgeous animations.
  • Import from OPML, FreeMind and Freeplane formats.
  • Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, FreeMind, Freeplane, yEd and Mermaid formats.
  • Printer support.
  • Support des imprimantes.
com.github.phase1geo.minder Node/Connection Property Sidebar Barre latérale des propriétés des nœuds et connexions https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-current-properties.png Style Property Sidebar Barre latérale des propriétés de style https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-style-properties.png Map Property Sidebar Barre latérale des propriétés de la carte https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-map-properties.png Trevor Williams Trevor Williams https://github.com/phase1geo/minder/ https://github.com/phase1geo/minder/issues/ #603461 rgb(255, 255, 255) 10 none none none none none none none none none none none none none none none none none none none none none none none none none none none

Changes

Modifications

  • Improved various icons (thanks to Nararyans R.I.)

Bug Fixes

Corrections de bugs

  • Downgraded Node.js to fix Travis CI builds
  • Fixed various compiler errors/warnings

New

Nouveau

  • Added export to yEd.
  • Added ability to create, edit and delete custom themes.
  • Added new quick entry mode, allowing node trees to be input within a text editor.
  • Added Control-W keyboard shortcut to close the current tab.
  • Added shortcut exploration help window (use F1 key to display).

Changes

Modifications

  • New search icon which has better contrast for Minder's themed header bar (thanks to Nararyans R.I.).
  • New non-symbolic sidebar icon in header bar (thanks to Nararyans R.I.).
  • New Minder application icon which fits in with the elementary OS color scheme better (thansk to Nararyans R.I.).
  • New focus icon in header bar (thanks to Nararyans R.I.).
  • Improved styling when creating a new node/connection.

Bug Fixes

Corrections de bugs

  • Fixed issue where separate trees in same mind-map where allowed to overlap.
  • Fixed node link drawing issue when using manual layout mode.
  • Fixed issues drawing arrows properly when straight node links were being used.
  • Fixed display issues with the node fill switch in the style inspector.
  • Fixed support for cut, copy and pasting connection title text.
  • Fixed keyboard shortcut for toggling focus mode.
  • Fixed issue with automatic layout that was introduced in 1.4.0.

New

Nouveau

  • Added support for focus mode.
  • Ajout de la prise en charge du mode concentration.
  • Added support for multiple documents with tabs.
  • Ajout de la prise en charge de documents multiples avec onglets.
  • Added support for resizing the inspector sidebar.
  • Ajout de la prise en charge du redimensionnement de la barre latérale de l'inspecteur.
  • Added support for creating a new node directly from editing an existing node presssing Return or Tab.
  • Ajout de la prise en charge pour la création d'un nouveau nÅ“ud directement à partir de l'édition d'un nÅ“ud existant en appuyant sur Entrée ou Tab.
  • Added support for adding a new parent node to an existing node.
  • Ajout de la prise en charge pour ajouter un nouveau nÅ“ud parent à un nÅ“ud existant.
  • Added support for importing/exporting to FreeMind and Freeplane formats.
  • Ajout de la prise en charge de l'importation/exportation aux formats FreeMind et Freeplane.
  • Added support for sorting children either alphabetically or randomly.
  • Ajout de la prise en charge du tri des enfants alphabétiquement ou aléatoirement.
  • Added support for creating a link from one node to another node in the same map.
  • Ajout de la prise en charge pour la création d'un lien d'un nÅ“ud à un autre dans la même carte.
  • Added support for building a Flatpak.
  • Ajout de la prise en charge pour Flatpak.

Changes

Modifications

  • Removed markup from translated strings.
  • Suppression des balises des chaînes de caractères traduites.
  • Standardized tooltips that display accelerator information.
  • Indications standard pour afficher les informations des raccourcis clavier.
  • Changed the way that node/connection titles are displayed in inspector.
  • Modification de la façon dont les titres de nÅ“ud/connexion sont affichés dans l'inspecteur.
  • Changed app terminal script to allow command-line arguments to be passed to debug subcommand.
  • Modification du script du terminal de l'application pour autoriser les arguments en ligne de commande a être passés en sous-commandes de débogage.
  • Changed header bar and widget colors to match Minder brand color.
  • Modification des couleurs de la barre d'en-tête et des widgets pour correspondre à la couleur symbolique de Minder.
  • Changed search icon in header bar to a symbolic icon to improve readability.
  • Modification de l'icône de recherche dans la barre d'en-tête en icône symbolique pour améliorer la lisibilité.
  • When note tooltip is displayed, markup text is rendered for improved readability.
  • Lorsque l'indicateur des notes est affiché, le marquage du texte est restitué pour une meilleure lisibilité.
  • Enhanced app script to allow command-line arguments to be passed to debug subcommand.
  • Amélioration du script de l'application pour autoriser les arguments en ligne de commande à être passés en sous-commandes de débogage.

Bug Fixes

Corrections de bugs

  • Fixed an issue with calculating connection endpoints when a portion of the node is not visible.
  • Correction d'un problème avec le calcul des point de fin de connexion lorsqu'un bout du nÅ“ud n'est pas visible.
  • Fixed file naming issue when a file is imported.
  • Correction des problèmes de nommage du fichier lors de l'importation d'un fichier.
  • Fixed issue with displaying resized nodes on open or application startup.
  • Correction d'un problème lors de l'affichage des nÅ“uds redimensionnés à l'ouverture ou au démarrage de l'application.
  • Fixing issue with export functions.
  • Correction des problèmes avec les fonctions d'export.

Let's stay connected!

Restons connectés !

  • Added support for creating a visual connection between any two nodes.
  • Ajout de la prise en charge de la création d'une connexion visuelle entre deux nÅ“uds quelconques.
  • Added ability to show/hide all connections in the map.
  • Ajout de la possibilité d'afficher/masquer toutes les connexions dans la carte.
  • Added support for remembering the last selected child of a node when navigating the map with the keyboard.
  • Ajout de la prise en charge de la mémorisation du dernier enfant sélectionné d'un nÅ“ud lors de la navigation sur la carte à l'aide du clavier.
  • When escape key is used when editing text, editing mode is ended without reverting text.
  • Lorsque la touche d'échappement est utilisée lors de l'édition de texte, le mode d'édition est interrompu sans que le texte ne soit réinitialisé.
  • Created unique contextual menus depending on what is selected in the mind map.
  • Création de menus contextuels uniques en fonction de ce qui est sélectionné dans la carte mentale.
  • Changed Node sidebar tab to Current which shows either the currently selected node or connection.
  • Changement de l'onglet NÅ“ud de la barre latérale à Courant qui affiche soit le nÅ“ud ou la connexion actuellement sélectionné(e).
  • Improved link drawing when a node tree is being moved.
  • Amélioration du dessin des liens lorsqu'une arborescence de nÅ“uds est déplacée.
  • Switched from using GtkFileChooserDialog to GtkFileChooserNative.
  • Passage de GtkFileChooserDialog à GtkFileChooserNative.
  • Added support for inserting emoji when editing text in the mind map (use Control-period).
  • Ajout du support pour l'insertion d'emojis lors de l'édition de texte dans la carte mentale (utilisez la combinaison CTRL + .).
  • Improved readability of theme name when the theme is selected.
  • Meilleure lisibilité du nom du thème lorsque le thème est sélectionné.
  • Fixed issue where changing a global style was not saved/applied to new nodes.
  • Correction d'un problème où le changement d'un style global n'était pas sauvegardé/appliqué aux nouveaux nÅ“uds.
  • Improved copy/paste support of nodes so that copied items can be pasted in other mind maps.
  • Amélioration du copier/coller des nÅ“uds pour que les éléments copiés puissent être collés dans d'autres cartes mentales.
  • Added support for dynamically changing to dark mode in the UI if the prefer-dark desktop gsetting is set.
  • Ajout de la prise en charge du passage dynamique en thème sombre dans l'interface utilisateur si l'option de thème sombre est activée.
  • Added ability to show/hide each panel within the style inspector.
  • Ajout de la possibilité d'afficher/masquer chaque panneau dans l'inspecteur de style.
  • Removed support for Loki builds.
  • Arrêt de la prise en charge pour Loki.
  • Fixing appdata.xml file omission.
  • Correction d'une omission dans le fichier appdata.xml.
  • Removing automatic style apply when the affects is set to certain values.
  • La suppression du style automatique s'applique lorsque l'effet est réglé sur certaines valeurs.
  • Added Spanish translation.
  • Ajout des traductions en espagnol.
  • Added support for Control-Return/Tab to support adding newlines/tabs in a node's title.
  • Ajout de la prise en charge du raccourci CTRL + Entrée/TAB pour ajouter des nouvelles lignes/tabulations dans le titre d'un nÅ“ud.
  • Improved node title editing support for selection and cursor movement.
  • Amélioration de la prise en charge de l'édition du titre des nÅ“uds pour la sélection et le déplacement du curseur.
  • Added support for automatically opening Minder files from Files.
  • Ajout de la prise en charge de l'ouverture automatique des fichiers Minder à partir de Fichiers.
  • Added ability to modify styles of nodes and links.
  • Ajout de la possibilité de modifier les styles des nÅ“uds et des liens.
  • Changed layouts to be stored on a per tree basis instead of a per document basis.
  • Modification de la disposition pour l'enregistrement par arbre au lieu de l'enregistrement par document.
  • Added support for exporting to the Mermaid format.
  • Ajout de la prise en charge de l'exportation au format Mermaid.
  • Added support for disabling/enabling displaying markup in node title.
  • Ajout de la prise en charge de la désactivation/activation de l'affichage du balisage dans le titre du nÅ“ud.
  • Improved the look of the fold indicators.
  • Amélioration de l'apparence des indicateurs de pli.
  • Lots of bug fixes.
  • Nombreuses corrections de bugs.
  • Adding Spanish translation (thanks to Adolfo Jayme-Barrientos).
  • Ajout des traductions en espagnol (grâce à Adolfo Jayme-Barrientos).
  • Adding support for special character insertion via the Compose key.
  • Ajout du support pour l'insertion de caractères spéciaux avec la touche Compose.

Updating French translation.

Mises à jour des traductions en français.

Bug fix release

Version corrective

  • Fixed bugs related to editing unicode characters in map area.
  • Correction de bugs liés à l'édition de caractères unicode dans la zone de la carte.
  • Reduced height of node textbox in sidebar to help alleviate window sizing problems.
  • Réduction de la hauteur de la zone de texte du nÅ“ud dans la barre latérale pour aider à diminuer les problèmes de dimensionnement de la fenêtre.
  • Fixed issue with moving a node to a different position within a parent node.
  • Correction d'un problème avec le déplacement d'un nÅ“ud vers une position différente au sein d'un nÅ“ud parent.
  • Fixed issue connecting a root node to another node.
  • Correction d'un problème de connexion d'un nÅ“ud racine à un autre nÅ“ud.

Images now supported!

Les images sont désormais prises en charge !

  • Added support for images within nodes.
  • Ajout de la prise en charge des images à l'intérieur des nÅ“uds.
  • Added basic image editing support.
  • Ajout de la prise en charge mimimale de la modification d'image.
  • Added support for dragging and dropping local and web images.
  • Ajout de la prise en charge du glisser-déposer d'images locales ou web.
  • Added support for resizing node width.
  • Ajout de la prise en charge du redimensionnement de la largeur des nÅ“uds.
  • Changed cursors when over a task button.
  • Modification du curseur au survol d'un bouton de tâche.
  • Changed location of task and note elements in a node.
  • Modification de l'emplacement des éléments de tâche et de note dans un nÅ“ud.
  • Added support for keeping the map from scrolling off screen.
  • Ajout de la prise en charge du maintien du défilement de la carte de l'écran.
  • Added support for shift-mousewheel to scroll horizontally.
  • Ajout de la prise en charge de la molette de la souris avec shift pour le défilement horizontal.
  • Added support for control-mousewheel to zoom in/out.
  • Ajout de la prise en charge de la molette de la souris pour effectuer un zoom avant/arrière.
  • Fixed issue with drawing background when zoom factor was small.
  • Correction d'un problème avec l'arrière-plan du graphique lorsque le facteur de zoom était faible.
  • Custom icons are now stored as a gresource rather than in the file system.
  • Les icônes personnalisées sont maintenant stockées en tant que ressource gresource plutôt que dans le système de fichiers.
  • Other minor bug fixes.
  • Autres corrections de bugs mineures.

Support for more export types and bug fixes.

Prise en charge de plus de types d'exportation et corrections de bugs.

  • Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV formats.
  • Ajout de la prise en charge pour l'exportation vers les formats SVG, JPEG, BMP, Mardown, Texte brut et CSV.
  • Added support for folding all completed tasks in map inspector.
  • Ajout de la prise en charge pour plier toutes les tâches complétées dans l'inspecteur de carte.
  • Added support for unfolding all folded nodes in map inspector.
  • Ajout de la prise en charge pour déplier tous les nÅ“uds pliés dans l'inspecteur de carte.
  • Added Solarized Dark and Solarized Light themes.
  • AJout des thèmes Solarized Dark et Solarized Light.
  • Changing button display in map inspector.
  • Modification de l'affichage du bouton dans l'inspecteur de carte.
  • Cleaning up Export menu to include a single "Export…" option.
  • Nettoyage du menu Exporter pour inclure une seule option « Exporter… ».
  • Fixing issue where modified node title in node inspector was lost when input focus was changed.
  • Correction d'un problème où le titre de nÅ“ud modifié dans l'inspecteur de nÅ“ud était perdu lorsque le point focalisé en entrée était modifié.
  • Fixing issue where an entire tree is attached to another tree.
  • Correction d'un problème où un arbre entier est attaché à un autre arbre.
  • Added Czech translation (thanks to Jan Marek!).
  • Ajout des traductions en tchèque (grâce à Jan Marek !).
  • Added French translation (thanks to Yannick A.!).
  • Ajout des traductions en français (grâce à Yannick A. !).
  • Added Brazilian Portuguese translation (thanks to btd1337!)
  • Ajout des traductions en portugais brésilien (grâce à btd1337 !)

Initial startup bug fix.

Correction de bug au premier démarrage.

Search improvements and bug fixes

Amélioration de la recherche et corrections de bugs

  • Added ability to search within notes.
  • Ajout de la possibilité de chercher parmi les notes.
  • Added ability to optionally control search criteria within search popover.
  • Ajout de la possibilité pour optionnellement contrôler les critères de recherche dans le volet de recherche.
  • Fixed screenshots.
  • Correction des captures d'écran.
  • Changed properties header bar icon to a sidebar hide/show icon for clarity.
  • L'icône de la barre supérieure des propriétés a été changée en icône de masquage/affichage dans la barre latérale pour plus de clarté.
  • Several minor UI improvements.
  • Améliorations mineures diverses de l'interface.
  • Removing deprecated GTK calls.
  • Suprresion des éléments GTK dépréciés.
  • Added ability to double-click on a node to make it editable.
  • Ajout de la possibilité de double-cliquer sur un nÅ“ud pour le rendre éditable.
  • Bug fixes.
  • Corrections de bugs.

Initial release

Version initiale

Minder-1.5.1/data/com.github.phase1geo.minder.appdata.xml.in000066400000000000000000000371271356632107200236130ustar00rootroot00000000000000 com.github.phase1geo.minder CC0-1.0 GPL-3.0+ Minder Create, develop and visualize your ideas

Use the power of mind-mapping to make your ideas come to life.

  • Quickly create visual mind-maps using the keyboard and automatic layout.
  • Choose from many tree layout choices
  • Add notes, tasks and images to your nodes.
  • Add node-to-node connections with optional text and notes.
  • Stylize nodes, links and connections to add more meaning and improve readability.
  • Quick search of node and connection titles and notes, including filtering options.
  • Zoom in or enable focus mode to focus on certain ideas or zoom out to see the bigger picture.
  • Enter focus mode to better view and understand portions of the map.
  • Unlimited undo/redo of any change.
  • Automatically saves in the background.
  • Colorized node branches.
  • Open multiple mindmaps with the use of tabs.
  • Built-in and customizable theming.
  • Gorgeous animations.
  • Import from OPML, FreeMind and Freeplane formats.
  • Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, FreeMind, Freeplane, yEd and Mermaid formats.
  • Printer support.
com.github.phase1geo.minder Node/Connection Property Sidebar https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-current-properties.png Style Property Sidebar https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-style-properties.png Map Property Sidebar https://raw.githubusercontent.com/phase1geo/Minder/master/data/screenshots/screenshot-map-properties.png Trevor Williams https://github.com/phase1geo/minder/ https://github.com/phase1geo/minder/issues/ #603461 rgb(255, 255, 255) 10 none none none none none none none none none none none none none none none none none none none none none none none none none none none

Changes

  • Improved various icons (thanks to Nararyans R.I.)

Bug Fixes

  • Downgraded Node.js to fix Travis CI builds
  • Fixed various compiler errors/warnings

New

  • Added export to yEd.
  • Added ability to create, edit and delete custom themes.
  • Added new quick entry mode, allowing node trees to be input within a text editor.
  • Added Control-W keyboard shortcut to close the current tab.
  • Added shortcut exploration help window (use F1 key to display).

Changes

  • New search icon which has better contrast for Minder's themed header bar (thanks to Nararyans R.I.).
  • New non-symbolic sidebar icon in header bar (thanks to Nararyans R.I.).
  • New Minder application icon which fits in with the elementary OS color scheme better (thansk to Nararyans R.I.).
  • New focus icon in header bar (thanks to Nararyans R.I.).
  • Improved styling when creating a new node/connection.

Bug Fixes

  • Fixed issue where separate trees in same mind-map where allowed to overlap.
  • Fixed node link drawing issue when using manual layout mode.
  • Fixed issues drawing arrows properly when straight node links were being used.
  • Fixed display issues with the node fill switch in the style inspector.
  • Fixed support for cut, copy and pasting connection title text.
  • Fixed keyboard shortcut for toggling focus mode.
  • Fixed issue with automatic layout that was introduced in 1.4.0.

New

  • Added support for focus mode.
  • Added support for multiple documents with tabs.
  • Added support for resizing the inspector sidebar.
  • Added support for creating a new node directly from editing an existing node presssing Return or Tab.
  • Added support for adding a new parent node to an existing node.
  • Added support for importing/exporting to FreeMind and Freeplane formats.
  • Added support for sorting children either alphabetically or randomly.
  • Added support for creating a link from one node to another node in the same map.
  • Added support for building a Flatpak.

Changes

  • Removed markup from translated strings.
  • Standardized tooltips that display accelerator information.
  • Changed the way that node/connection titles are displayed in inspector.
  • Changed app terminal script to allow command-line arguments to be passed to debug subcommand.
  • Changed header bar and widget colors to match Minder brand color.
  • Changed search icon in header bar to a symbolic icon to improve readability.
  • When note tooltip is displayed, markup text is rendered for improved readability.
  • Enhanced app script to allow command-line arguments to be passed to debug subcommand.

Bug Fixes

  • Fixed an issue with calculating connection endpoints when a portion of the node is not visible.
  • Fixed file naming issue when a file is imported.
  • Fixed issue with displaying resized nodes on open or application startup.
  • Fixing issue with export functions.

Let's stay connected!

  • Added support for creating a visual connection between any two nodes.
  • Added ability to show/hide all connections in the map.
  • Added support for remembering the last selected child of a node when navigating the map with the keyboard.
  • When escape key is used when editing text, editing mode is ended without reverting text.
  • Created unique contextual menus depending on what is selected in the mind map.
  • Changed Node sidebar tab to Current which shows either the currently selected node or connection.
  • Improved link drawing when a node tree is being moved.
  • Switched from using GtkFileChooserDialog to GtkFileChooserNative.
  • Added support for inserting emoji when editing text in the mind map (use Control-period).
  • Improved readability of theme name when the theme is selected.
  • Fixed issue where changing a global style was not saved/applied to new nodes.
  • Improved copy/paste support of nodes so that copied items can be pasted in other mind maps.
  • Added support for dynamically changing to dark mode in the UI if the prefer-dark desktop gsetting is set.
  • Added ability to show/hide each panel within the style inspector.
  • Removed support for Loki builds.
  • Fixing appdata.xml file omission.
  • Removing automatic style apply when the affects is set to certain values.
  • Added Spanish translation.
  • Added support for Control-Return/Tab to support adding newlines/tabs in a node's title.
  • Improved node title editing support for selection and cursor movement.
  • Added support for automatically opening Minder files from Files.
  • Added ability to modify styles of nodes and links.
  • Changed layouts to be stored on a per tree basis instead of a per document basis.
  • Added support for exporting to the Mermaid format.
  • Added support for disabling/enabling displaying markup in node title.
  • Improved the look of the fold indicators.
  • Lots of bug fixes.
  • Adding Spanish translation (thanks to Adolfo Jayme-Barrientos).
  • Adding support for special character insertion via the Compose key.

Updating French translation.

Bug fix release

  • Fixed bugs related to editing unicode characters in map area.
  • Reduced height of node textbox in sidebar to help alleviate window sizing problems.
  • Fixed issue with moving a node to a different position within a parent node.
  • Fixed issue connecting a root node to another node.

Images now supported!

  • Added support for images within nodes.
  • Added basic image editing support.
  • Added support for dragging and dropping local and web images.
  • Added support for resizing node width.
  • Changed cursors when over a task button.
  • Changed location of task and note elements in a node.
  • Added support for keeping the map from scrolling off screen.
  • Added support for shift-mousewheel to scroll horizontally.
  • Added support for control-mousewheel to zoom in/out.
  • Fixed issue with drawing background when zoom factor was small.
  • Custom icons are now stored as a gresource rather than in the file system.
  • Other minor bug fixes.

Support for more export types and bug fixes.

  • Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV formats.
  • Added support for folding all completed tasks in map inspector.
  • Added support for unfolding all folded nodes in map inspector.
  • Added Solarized Dark and Solarized Light themes.
  • Changing button display in map inspector.
  • Cleaning up Export menu to include a single "Export…" option.
  • Fixing issue where modified node title in node inspector was lost when input focus was changed.
  • Fixing issue where an entire tree is attached to another tree.
  • Added Czech translation (thanks to Jan Marek!).
  • Added French translation (thanks to Yannick A.!).
  • Added Brazilian Portuguese translation (thanks to btd1337!)

Initial startup bug fix.

Search improvements and bug fixes

  • Added ability to search within notes.
  • Added ability to optionally control search criteria within search popover.
  • Fixed screenshots.
  • Changed properties header bar icon to a sidebar hide/show icon for clarity.
  • Several minor UI improvements.
  • Removing deprecated GTK calls.
  • Added ability to double-click on a node to make it editable.
  • Bug fixes.

Initial release

Minder-1.5.1/data/com.github.phase1geo.minder.desktop000066400000000000000000000012611356632107200224340ustar00rootroot00000000000000[Desktop Entry] Name[fr]=Minder Name=Minder GenericName[fr]=Créateur de cartes mentales GenericName=Mind-mapper Comment[fr]=Créez, développez et visualisez vos idées Comment=Create, develop and visualize your ideas Categories=Utility;Office;Development; Exec=com.github.phase1geo.minder %f Icon[fr]=com.github.phase1geo.minder Icon=com.github.phase1geo.minder Terminal=false Type=Application MimeType=application/com.github.phase1geo.minder; X-GNOME-Gettext-Domain=Minder X-GNOME-UsesNotifications=true Keywords[fr]=Mentale;Carte; Keywords=Mind;Mapping; Actions=NewDocument; [Desktop Action NewDocument] Name[fr]=Nouveau document Name=New Document Exec=com.github.phase1geo.minder -n Minder-1.5.1/data/com.github.phase1geo.minder.desktop.in000066400000000000000000000007401356632107200230420ustar00rootroot00000000000000[Desktop Entry] Name=Minder GenericName=Mind-mapper Comment=Create, develop and visualize your ideas Categories=Utility;Office;Development; Exec=com.github.phase1geo.minder %f Icon=com.github.phase1geo.minder Terminal=false Type=Application MimeType=application/com.github.phase1geo.minder; X-GNOME-Gettext-Domain=Minder X-GNOME-UsesNotifications=true Keywords=Mind;Mapping; Actions=NewDocument; [Desktop Action NewDocument] Name=New Document Exec=com.github.phase1geo.minder -n Minder-1.5.1/data/com.github.phase1geo.minder.gresource.xml000066400000000000000000000051711356632107200235640ustar00rootroot00000000000000 Application.css com.github.phase1geo.minder.shortcuts.ui icons/16/minder-balance-symbolic.svg icons/16/minder-detach-symbolic.svg icons/16/minder-fold-completed-symbolic.svg icons/16/minder-layout-down-symbolic.svg icons/16/minder-layout-horizontal-symbolic.svg icons/16/minder-layout-left-symbolic.svg icons/16/minder-layout-manual-symbolic.svg icons/16/minder-layout-right-symbolic.svg icons/16/minder-layout-up-symbolic.svg icons/16/minder-layout-vertical-symbolic.svg icons/16/minder-unfold-symbolic.svg icons/16/minder-link-curved-symbolic.svg icons/16/minder-link-straight-symbolic.svg icons/16/minder-link-squared-symbolic.svg icons/16/minder-node-border-none-symbolic.svg icons/16/minder-node-border-underlined-symbolic.svg icons/16/minder-node-border-bracket-symbolic.svg icons/16/minder-node-border-squared-symbolic.svg icons/16/minder-node-border-rounded-symbolic.svg icons/16/minder-node-border-pill-symbolic.svg icons/16/minder-focus.svg icons/scalable/mindi-sidebar-open.svg icons/scalable/mindi-sidebar-close.svg icons/scalable/minder-search.svg Minder-1.5.1/data/com.github.phase1geo.minder.gschema.xml000066400000000000000000000250371356632107200232000ustar00rootroot00000000000000 -1 Most recent x position of minder window Most recent x position of minder window -1 Most recent y position of minder window Most recent y position of minder window 1000 Most recent width of minder window Most recent width of minder window 800 Most recent height of minder window Most recent height of minder window false Most recent state of the current item properties sidebar Most recent state of the current item properties sidebar false Most recent state of the map properties sidebar Most recent state of the map properties sidebar false Most recent state of the style properties sidebar Most recent state of the style properities sidebar 300 Width of the property sidebar when visible Width of the property sidebar when visible true Enables/Disables canvas animations Controls the initial state of the canvas animator false Hides/Shows all connections in the canvas Controls the initial state of the canvas hide connections widget true Search option for nodes Specifies whether nodes should be searched or not true Search option for connections Specifies whether connections should be searched or not true Search option for node/connection titles Specifies whether node/connection titles should be searched or not true Search option for node/connection notes Specifies whether node/connection notes should be searched or not true Search option for folded nodes Specifies whether folded nodes should be searched or not true Search option for unfolded nodes Specifies whether unfolded nodes should be searched or not true Search option for task nodes Specifies whether task nodes should be searched or not true Search option for non-task nodes Specifies whether non-task nodes should be searched or not 1 Unique ID added to image names Specifies the current unique image ID value 10 Last used affects value in Style properties Last used affects value in Style properties "curved" Last used link type style in Style properties Last used link type style in Style properties 4 Last used link width in Style properties Last used link width in Style properties false Last used link arrow indicator in Style properties Last used link arrow indicator in Style properties "solid" Last used link dash indicator in Style properties Last used link dash indicator in Style properties "underlined" Last used node border type in Style properties Last used node border type in Style properties 200 Last used maximum node width in Style properties Last used maximum node width in Style properties 4 Last used node borderwidth in Style properties Last used node borderwidth in Style properties "sans" Last used node font family in Style properties Last used node font family in Style properties 11 Last used node font size in Style properties Last used node font size in Style properties "dotted" Last used connection type in Style properties Last used connection type in Style properties 2 Last used connection width in Style properties Last used connection width in Style properties "to" Last used connection arrow direction in Style properties Last used connection arrow direction in Style properties 4 Last used connection padding in Style properties Last used connection padding in Style properties "sans" Last used node font family in Style properties Last used node font family in Style properties 10 Last used node font size in Style properties Last used node font size in Style properties true Specifies the expanded state of the Branch Options panel in the Style properties Specifies the expanded state of the Branch Options panel in the Style properties true Specifies the expanded state of the Link Options panel in the Style properties Specifies the expanded state of the Link Options panel in the Style properties true Specifies the expanded state of the Node Options panel in the Style properties Specifies the expanded state of the Node Options panel in the Style properties true Specifies the expanded state of the Connection Options panel in the Style properties Specifies the expanded state of the Connection Options panel in the Style properties false Specifies if we should create a new node directly from edit mode if Return or Tab is pressed Specifies if we should create a new node directly from edit mode if Return or Tab is pressed 0.05 Alpha value to use for all nodes/connections that are not within focus in focus mode Alpha value to use for all nodes/connections that are not within focus in focus mode. Value must be between 0 and 1. 8 Specifies the number of space characters that match the indentation of the tab character in quick entry mode and text import. Specifies the number of space characters that match the indentation of the tab character in quick entry mode and text import. Minder-1.5.1/data/com.github.phase1geo.minder.shortcuts.ui000066400000000000000000000637041356632107200234470ustar00rootroot00000000000000 0 0 Minder Shortcuts global file general General 1 File file 1 New File <ctrl>n 1 Open File <ctrl>o 1 Save File As <ctrl><shift>s 1 Close File <ctrl>w 1 Undo/Redo 1 Undo Last Change <ctrl>z 1 Redo Last Undo <ctrl><shift>z 1 Zooming 1 Zoom In <ctrl>plus 1 Zoom Out <ctrl>minus 1 Zoom To Actual Size <ctrl>0 1 Miscellaneous 1 Toggle Focus Mode <ctrl><shift>f 1 Search Nodes/Connections <ctrl>f 1 Quit Application <ctrl>q 1 node Node Commands 1 Creation/Deletion 1 New Sibling Node Return 1 New Child Node Tab 1 Quick Entry <ctrl>E 1 Delete Node Delete 1 Delete Node BackSpace 1 Clipboard 1 Copy Node <ctrl>c 1 Cut Node <ctrl>x 1 Paste Node as Child <ctrl>v 1 Changing Current 1 Edit Title e 1 View Properties i 1 Toggle Fold f 1 Toggle Task Done t 1 Toggle Node Link y 1 Create Connection x 1 Center In View <shift>c 1 Place Into View s 1 Sort Child Nodes Alphabetically <shift>s 1 Traversal 1 Select Root m 1 Select Parent a 1 Select Next Sibling n 1 Select Previous Sibling p 1 Select Child c 1 Select Node Below j 1 Select Node Above k 1 Select Node To Right l 1 Select Node To Left h 1 Select Linked Node <shift>y 1 Select Attached Connection <shift>x 1 connection Connection Commands 1 Change Current 1 Edit Title e 1 Show Properties i 1 Place Into View s 1 Traversal 1 Select Start Node f 1 Select End Node t 1 Select Next Connection n 1 Select Previous Connection p 1 text Text Editing 1 Miscellaneous 1 Show Emoji Picker <ctrl>period 1 End Editing Escape 1 Cursor Movement 1 Next Character Right 1 Previous Character Left 1 Next Word <ctrl>Right 1 Previous Word <ctrl>Left 1 Next Line Down 1 Previous Line Up 1 Start Of Text Home 1 End Of Text End 1 Clipboard 1 Copy Selected Text <ctrl>c 1 Cut Selected Text <ctrl>x 1 Paste Text <ctrl>v 1 Selection 1 Add Next Character <shift>Right 1 Add Previous Character <shift>Left 1 Add Next Word <shift><ctrl>Right 1 Add Previous Word <shift><ctrl>Left 1 Add Next Line <shift>Down 1 Add Previous Line <shift>Up 1 Add Start Of Text <shift>Home 1 Add End Of Text <shift>End 1 Minder-1.5.1/data/com.github.phase1geo.minder.xml000066400000000000000000000004671356632107200215720ustar00rootroot00000000000000 Minder file Minder-1.5.1/data/icons/000077500000000000000000000000001356632107200147655ustar00rootroot00000000000000Minder-1.5.1/data/icons/128/000077500000000000000000000000001356632107200152775ustar00rootroot00000000000000Minder-1.5.1/data/icons/128/com.github.phase1geo.minder.svg000077500000000000000000003436301356632107200232230ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/128/minder-focus.svg000077500000000000000000003377311356632107200204340ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/000077500000000000000000000000001356632107200152135ustar00rootroot00000000000000Minder-1.5.1/data/icons/16/com.github.phase1geo.minder.svg000077500000000000000000003310671356632107200231400ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-balance-symbolic.svg000077500000000000000000000236521356632107200224270ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-detach-symbolic.svg000077500000000000000000000232311356632107200222630ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-focus.svg000077500000000000000000003377461356632107200203560ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-fold-completed-symbolic.svg000077500000000000000000000450561356632107200237420ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-down-symbolic.svg000077500000000000000000000217201356632107200233160ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-horizontal-symbolic.svg000077500000000000000000000244421356632107200245440ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-left-symbolic.svg000077500000000000000000000217211356632107200233020ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-manual-symbolic.svg000077500000000000000000000234731356632107200236330ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-right-symbolic.svg000077500000000000000000000216311356632107200234650ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-up-symbolic.svg000077500000000000000000000217171356632107200230010ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-layout-vertical-symbolic.svg000077500000000000000000000247251356632107200241700ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-link-curved-symbolic.svg000077500000000000000000000070201356632107200232540ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-link-squared-symbolic.svg000077500000000000000000000060121356632107200234300ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-link-straight-symbolic.svg000077500000000000000000000060501356632107200236130ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-bracket-symbolic.svg000077500000000000000000000060761356632107200246540ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-none-symbolic.svg000077500000000000000000000032111356632107200241640ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-pill-symbolic.svg000077500000000000000000000065201356632107200241730ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-rounded-symbolic.svg000077500000000000000000000066661356632107200247060ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-squared-symbolic.svg000077500000000000000000000060571356632107200247040ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-node-border-underlined-symbolic.svg000077500000000000000000000057621356632107200253730ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/16/minder-unfold-symbolic.svg000077500000000000000000000251261356632107200223270ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/24/000077500000000000000000000000001356632107200152125ustar00rootroot00000000000000Minder-1.5.1/data/icons/24/com.github.phase1geo.minder.svg000077500000000000000000003314521356632107200231350ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/24/minder-focus.svg000077500000000000000000003377321356632107200203500ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/32/000077500000000000000000000000001356632107200152115ustar00rootroot00000000000000Minder-1.5.1/data/icons/32/com.github.phase1geo.minder.svg000077500000000000000000003300761356632107200231350ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/32/minder-focus.svg000077500000000000000000003377341356632107200203510ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/48/000077500000000000000000000000001356632107200152205ustar00rootroot00000000000000Minder-1.5.1/data/icons/48/com.github.phase1geo.minder.svg000077500000000000000000003435771356632107200231560ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/48/minder-focus.svg000077500000000000000000003377331356632107200203570ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/64/000077500000000000000000000000001356632107200152165ustar00rootroot00000000000000Minder-1.5.1/data/icons/64/com.github.phase1geo.minder.svg000077500000000000000000003432411356632107200231400ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/64/minder-focus.svg000077500000000000000000003375361356632107200203560ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/scalable/000077500000000000000000000000001356632107200165335ustar00rootroot00000000000000Minder-1.5.1/data/icons/scalable/com.github.phase1geo.minder.svg000066400000000000000000000367671356632107200244660ustar00rootroot00000000000000 Minder-1.5.1/data/icons/scalable/minder-focus.svg000066400000000000000000000023301356632107200216450ustar00rootroot00000000000000 Minder-1.5.1/data/icons/scalable/minder-search.svg000066400000000000000000003023611356632107200220020ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/scalable/mindi-sidebar-close.svg000066400000000000000000001126761356632107200231030ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/icons/scalable/mindi-sidebar-open.svg000066400000000000000000001127211356632107200227260ustar00rootroot00000000000000 image/svg+xml Minder-1.5.1/data/meson.build000066400000000000000000000020611356632107200160130ustar00rootroot00000000000000icon_sizes = ['16','24','32', '48', '64', '128'] foreach i : icon_sizes install_data( join_paths('icons', i, meson.project_name() + '.svg'), install_dir: join_paths(get_option('datadir'), 'icons', 'hicolor', i + 'x' + i, 'apps') ) endforeach i18n.merge_file( input: meson.project_name() + '.desktop.in', output: meson.project_name() + '.desktop', po_dir: join_paths(meson.source_root(), 'po', 'extra'), type: 'desktop', install: true, install_dir: join_paths(get_option('datadir'), 'applications') ) i18n.merge_file( input: meson.project_name() + '.appdata.xml.in', output: meson.project_name() + '.appdata.xml', po_dir: join_paths(meson.source_root(), 'po', 'extra'), install: true, install_dir: join_paths(get_option('datadir'), 'metainfo') ) install_data( meson.project_name() + '.gschema.xml', install_dir: join_paths(get_option('datadir'), 'glib-2.0', 'schemas') ) install_data( meson.project_name() + '.xml', install_dir: join_paths(get_option('datadir'), 'mime', 'packages') ) Minder-1.5.1/data/screenshots/000077500000000000000000000000001356632107200162125ustar00rootroot00000000000000Minder-1.5.1/data/screenshots/screenshot-current-properties.png000066400000000000000000005175221356632107200247630ustar00rootroot00000000000000‰PNG  IHDR½± 4sBIT|dˆ IDATxœìÝwœõÿñ×̨l/îƒÛ4ÓlJè -~„„$¤] IÈ/„#íJr)—Kr¹_¸»´K»K»\r¤)”4J0`cÀÛ¸­·õ™ùþþÐîZ+K»Òj´«]¿Ÿ<Œ¥iúj$¯VïùÌg@DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD¤Š¬é€ŒK¯ˆˆˆˆˆˆˆˆHm2Ó=)̞ˆˆˆˆˆˆˆˆˆE•ÄÕ§},"""""""""¹T%^E d«KûWDDDDDDDDD Qð]% e+W û°Æ """"""""2ÔB] c˜±–V¦ö_-ŒADDDDDDDDd6©…йÆ0#)0-ÍTì'½"""""""""3ÛTÕ Ã'`O÷Pà-""""""""2(ç«z z¿h?‹ˆˆˆˆˆˆˆˆ_©­Êï< cj_ÔÚ>­µñˆˆˆˆˆˆˆˆˆL·Z ŠƒO­=¯iq¨¢•>ÿ©Ú‡úë$""""""""R+¦*X®ôqÙüP S+yÞÕÚg‡êk!""""""""2[T+h®d»‡\ø}¨­“}¾Aî§éÜç‡Úë-""""""""2b:Ãß {²Û:dÂïC%Ìó¬õ߇Êk'""""""""2]j±r»ÒíÌúðûPNË}ŽAìæ"""""""""µa6וncVß³9üœê°{ºÖŸÍ¯¡ˆˆˆˆˆˆˆˆÈt˜®"S½þ¬ ¿gk`:U÷T]s¶¾N"""""""""3M9Añt\€ò¾gc˜:ar5{„Oåk2_˜Ú0·ÔÇšÊÜSÎלÙzV;ìrûSU!."""""""""•«fÅvµÃéC.üž-j5ï ¶]í ½³å} """"""""2UÁmÐt5ÃéC*øž agµïé »ƒxMfÃë*""""""""2‚yƒ ¡«P2Á÷LG«Ñ'»ÒmV«wwµ_«™þ^©vX[­ ëbËU£Wx5ûׄ™t–2ö ÃîJ‚îj^Èr&¿Ž"""""""""µ¤š}³KY®’<èð{Fß35,­•À;¨qTû"œå˜©ï 9tÕR…wPar¡e|—`&œSYU=™ »Òùå.Wé:"""""""""2½Þ“™_é6ËYnFß3-$ªÊê Ãî ‚ðJ_«™öZ‹ˆˆˆˆˆˆˆˆ­Òð6ˆ€¸’‹XV+üžUÁ÷L B§+ðžl˜]í|2ËNç6EDDDDDDDDª¡al-B&r—3OÁwŽ™nNEà]Nu÷d.h9U!ød–¯Ö6DDDDDDDDDª)ˆ¶ÜmLuÈ]ÎôJªÈƒ\fZÍ„`s:ï Âîj…à¥,3^[‘éTí éj‡Ü…¦òÁw­£Õ¼K­î®v^Íp<ÈõDDDDDDDDDfšÉ´µf7½œªïY|×zøYÍ @VRÝ]­eËÝÆd—+U­¿?DDDDDDDDäÐtèZêö‚˜+ÝF¥UßÕ¾ ç´ªåP³ÒÀ»Òv&S1­Ô±”2¯œeÊQËï94MGàÄ…%+©Òžì´JÚÌÈà»VÍ© ¼+©¶2ºíI%ËŠˆˆˆˆˆˆˆˆÌfåµA´1©v€]Ê8©à»ÃÐjÞA…ÖA,D”‰æU²¬ˆˆˆˆˆˆˆˆÈl4Õwþ´ ‚í «¾gUð]‹AèT„ÞAÞå†Ýö$w¢é¥Îj‘Z6™v²Án©´_æ:åÞ/ešBïidŸîbÓƒ¨Üžè¾=μ {€—:/ÈuDDDDDDDDDjYСwÐ=ºsïûãÌ›ÌýÉ®3Þô‰æ•2ÊÔZàYI [ðº”û…*ȫѥ”éÍ r‘ZTKw9ËäWdW~U)^ê|…ÞxçO2ðÎoS2^Ø]ÉŠMoz%óDDDDDDDDDf£É†µAÞ¥†ÚùÓÇk‹RÉýj´:©‰à»–РCÜ ïüÛ¥Ì+u{¥Ü¯tZ!µôº‹ˆˆˆˆˆˆˆˆTS©Aìd[•šVNØœv[n¢yAe¢é•Ì›2µ~ÖzàvçÎ+Ö¿»Ô°¼”ûãm{¼å*YFDDDDDDDDd6(%ˆ-5È ºÂ»Øm¿À´üõ|Q ág5ûxO¶¢{ä~¡Êm‹ñCìRZŸŒ¢—2¶bÓÆ›>ÙåDDDDDDDDDfªJª¼‹M/7l.´|©-L ãoc2å¥,[lZ©ó§5ø®…à3È*ïjÞvi…–¨ J9YlŒÅ¦7½ÜeDDDDDDDDDf²Jª¼ËmmRjŸîb•ßµ9)ŒOgð­Ð{A]¨1ˆÀ{¼Ð:?”.¥Ÿ÷x­OòÇT¬B¼ØýbÓÆ›>ÙåDDDDDDDDDfšjWyºï˜?Q “Üé…–ÏŸ7Qh>Þí‰î|OkèšÎgr¡k¥Am¹w~uw~À½X´r`NtAËrúÉN/w™R)(‘©dˆtõw¡é¥´4ÉŸîýÀv`ÿðt+g™ÜlÑϹ;ßäL/t{2&³~¥Y‘é0§ºÊ»’À»P¥÷ѧ.>í¬W¬¸ô=Q;zgÜ""""""""""Åd’~rû÷üá;÷í¼ï^à9Ưôί/§â{VW{Og¥wPUÞÓx/X·pÝ™¯:ü•Ÿíóûê:2ø½ """""""""21;Ü`7}ÞÒó?9”J>ÒñH?ÙŠo[é=rßfòßù•ØU†Ï¨jïü>Òµ ¨êórÚ~ ¼­r§~áá¿k¿·¿nÈRà-"""""""""“æã3äÑéuÖ]¸â¢k€Ã)œKæç•#Š]w°˜©Ìa§T-†ÞÅ”[å=ÑrÞ¹óòßH6Ðæ’^™1™’/"""""""""2‘ŒÉ±Ò+É^Cp$‹,”SBiÁw%j±ù5mºBïJ.ÊXÊz¥´5)6¼À;w~(m2ufz/D*"""""""""³ˆÁ1n=®8QN™_Ô[Nñðx¹j9‚Î{+2=½ËQΑ…rûxçN+ÔÇ»è…Þ"""""""""¤áVÊ#yåDdnïü¾Ü“éïÍ8Ó§­Ow9¦£Ò»ÚUÞå,?ÑÑb=½m&?^‘‰Ê# Uyç._nK“b;5Sí=zzWå]n[“‰‚m8°O U}LÏï•#"""""""""¤ü²Ü³Ô|4ÿv±å‹-[sfbp[I[“Üiã5uÏ}ëô©¦b•Þ…ïü¿ó»[·Ìx·‹-?#ÔJOï©Ø¡U‡;RR¬µ‰e0êé-"""""""""ÎssI?çïì"î[cV=¸ïv¡þÞ•*§ø”›êлÒ»œ‹TæÞ¯Ú;¹ñZ™ä¾Ñ²Ó¦ý%‘Y%›NŽd#ÁvnÐ=QàmåLËßòd.pYi˜=¥aø¡Ö¦#¿Š;wZþr…Zžj/"""""""""´ü,²P+“‰Ú—ä¯sH¨…Ð{2­M&Så=Q3öB ßó[šØŒ ¿EDDDDDDDDDª!¿ëDÁÌÎ7sÿ¦Èôr»j_9Ó§ÌT¶7 ²µI%Ë–rËBó ¼©ÔÓ[DDDDDDD‚‘öRãÎ÷TØàFlŒ“0,Ï'œñ‰¤­ +#N4˜Ö°pk„–¥mÔÏ©' c|C*ž&Ö1ÈàîLÆŸx#2eBVCU·ïšxU·_]£=½sÛ™na2Næ·AÉý{¼Ö"å´™1-NjåB–ù‚:‚Pjµwîíüà{lï±GVf oŽÇüeó*ÚFç®.œ' Õ®¾dƒÉ@¶ÕR×Jk]k Û*…m»?Ts‡j<ÛÅñkõÇ‘ˆˆˆˆˆÈT)5¸ µØ˜¦(vS¶Â^ÔH{.‰¡ÖPš¦AŸ7…C®NCˆ…k±hÕ2"ua,Û²,0Ã%‹¾Oç{žÜEÿs=ºF[)'Åâãg÷†½Oî%âVï`‰•÷žŸ»´+ÞyÁe»ötqû—Uµ±Ô¨Ü–&^ÎíÜp¼áà€¹P^¬ßw¡qšO™éN™J Ž'tO´­B½oÆëß]ì´YaéáKøÜ7?WÑ6>úž²¯§# Õ®x*Æîÿ>M-ME—Ù¸q'ž¸vÜí öòö Þ9e¡w8œ¤µ5NWW;µôö5†Z{¨l&êÖO÷pDDDDDDjˆ¡¿ÕÆÌm"ÔP¸"Ö²À …°ÛZ¡ †bqìî!Zj.ƒªšèœ:?û(Úµc;½‘yĶ—Hjˆ¹©}ÌYäÐ2¿…s¶Óñ—ݯzûÈ«Ïþ B(v"˜måòOÆË eCíÃN\Χ¾ü)Âá0Æ\×åS׊ŽG÷rS„0¶U½nÉ¡p„cÖ¯.8oû“‡dfŸKúÎ+ó+¼aâ€;ÿq‚À'³\ULwè]® ª¼‹µ7)6­P>ë*½-Ë&‹áy“;ì8VÀ?ô–4j*~4Ñgˆï ¦âº6ó.dË–-ç¯Y³†M›žàŒ3Îw;õõL|òY,CcãG®n&1èÓÕUý‡,WÓÜ+}úž$:ÔtБ^‘CoÚC8 ç`9¾;ڶͲ%óhkiƲ,zûص· ß϶í56`êèí衭˫ʷ«$ ®^ˆ-ïlo/åÑñLu^†šÂ¬<÷hÚ¶‘ ·²á‰,^8Ÿ•Qˆmw-:°gàìý[9<ù4‡¯=ßõÙÿÈžÀÆqz‡ÿ¾óØveßû}ßçí/$‚mË’ñ2´¯nãäsOæ¾›ï'Ó—!ã8±X €úúzÂá0I7I¸-ÌE¯»Çþð=[z ;á@Ç3ÂŒ)–“:rrŒä¹mJò§åÿM‰Ó‚¬ö®9SzÕ{²Ûo‰‚ïÜy¹§XÙ&:3浞€Á3Ζ Ö6#{#¸ým¬çÆÿùçœÓjÆúØ5Ÿ"¶»Zþ¹ÅãwÜqEç¯[·Çÿðo¨î{Ȳ=æÎäèã—±øð3xòOwÔÜ{vd<çŸx)¶þ‰m›öS×݆cf«‘±Ìðÿ-úç„ /žÃH4ÑÔXÏe½„3Ö@sÓØªïÁ¡8>ò¿øÍ ÆâX–Mhá\úüÚz29‰Wåß&Á«ÿú οø|ŠTŸǹ÷®{¹í+·So|/>i­ ÚHFZé]ñN]ű}’. d,~v¯6ÖÛįâ©ýQŽ‹=ÎakWÛ7ÈP•ŠélË"NOº¸p„ã8Ø–!¸ž5/Ãüãæqݧ®cùòå±ê¶?¿ƒ—\p&žç@ñ<7_ÿfþ|üŸ9bÕœyö™œsñ9|õS_¥óÉ®@‚ïü÷¤oÌèãçó}¿ì÷p­e åynWŠüþܹ¹e±p;×dBëjTuOIx>*½'˜×Ë{¢iùW@™žxϺJï‘À»Ø–‰Ø¶=éÀ¼†ÅÍX¶5ü!‘/‰rZž[ò6½x&³–ºÞzú_ñÆÏ\=î‡×Ö­[‹Îs‡ýÃÿÒR×RñxŠ 9)–,³êÄci›³p±Lm6v3ŒårÂá'ÒÞ²ƒoÁ}±™¨W7ÝC™rƒ-¡…ZS·úp®ý«WÓØ н®.ºî¸Œ¡õ‚ h^¹’‹Î?—œ¶–¯}÷Vž~n–eZÔ΀ÛEë@pU‹W/⼋Σ®®®ì ¡®®Žó/9Ÿ‡~ó0}ÏôU<–ºyõ,\µËvèZp2GÏ­'áA"erm’‹´R¤2†¡ÆìÌô²Ü߯ÂcW-ô†lH[î>ºoÓ6Ö¯ZFc] h!à¤Çd|ÚWµñ¾O¾%K–L&9ã¬3Xwú:¶mÛÆm·ÝF?mmm{ì±\õ–«p‡d2É’%Kxß'ßÇ—þáË ÅÐîŠÿI6×5³+¹‹K/½×u'µP(Ä·?öæÖÍÅ«BÝP?ÄáGzyÌ©D£Lb VÝQDê ‹÷J: ÅÂdÜ:Œ?õÕžå‘%¡!…©÷¨¯³IùCìOm¦½egœ~26n$±5C}²yÊÇ'""3ƒÕ~6×ÿì-¬Þðßü͇ÿÄPþÚmµÂÛ¿÷6V?ö=þéÓ–=N{ÙÅüÍ®dé}ßäŸxŒÉýö1µÅç,"”Œcaæ5¶Å8nõá|à=oÀ¶mºnº‰-ßøý´75Q²ûÇ?&T_ÏÒ7¿™¹¯{¼öj¾øÍÿåÉgw`Ù6f^3™Xa/˜£®©žúúzŒ1üüç?'•J΋F£\vÙeÍ«««ãU¯zõõõÔ5SàÔ¶l¡P˜þ†E4Í™Ãk‘ö ×&áB<i|<ÏàíŽÅòÔÚ—Í%Ü!Óp±]&zßòøv~÷ì>Þ{Áñ,jo <ôÎxN:û$–-[F2™Ä÷}vìØÁ¦M›X¼x1'œpÂh<gß¾}lÚ´‰µkײdÉ|ßgÙ²e¬=s-÷>sïh?ð Mœ1Õ|ÞÊ¥o¹”+ßûꃦ¿û%ï)wS¹y¤ÇØÂÜÜû….^YIµwP-N¦íÅš •Þ…”ÛûÐ2ù!v¡íæ¯;ë+½+ ½ƒ ¾-Ëb°b-¯“ÉdYÛsã3¾‘ºØ‡×—¿úŸcî_Ý»ZfôT¡€oËòikïãè£YrÄÉ8f“Ø€ñbqìIæ¥É¤cÄzØ·«‡Ž}!cÍ`ªß_ÜÇ'Ñ8@hQ’ÅËÛ˜Ó¶”†H#a'BÒ$í§éJo£ÞicýI'²¹é)ºžé¦¡¿{ Æ'"rè ³øÒ×rõÛ׳raˆT×>^øÓï¸å«±73ÝcO˜XáI]%Ã>ìd.:ËeÃMOÐåá9wõ¼òòX1?DbçÓüþ«?âõQI}œI§èß¾ŸÎÝ)&÷ëH°Mï/ á5¼é–8o$ÿð]þþï"f,Z.?ŸûÛ㈘nî¹îãüøÙYòœED¦A¼ÕÁ®èniªç½o»Û¶yñóŸgãÍ7sô²e¬=üðl(nYÙDˆß~;Cé4Mo~3×¾íJ>úÙ¯3Kj¨'Þ§µ;˜õ‘žË¾ïãº.¯}íkGçýìg?ý¾[lžmÛýloœÛ„e[$æúRö,Ò®!á[øÃ·oÀÇ“MßÜh#}N Íá Ms[èí¯ÞůÊÍJÒž¡eÕÑüóÝyÇé+9å¨eާ.TÇ_n}„#VÁégÎöíÛyî¹ç8å”S¨¯Ûr¦¡¡•+W²xñb¶lÙ‚mÛ¬X±‚?ÿþÏl¸ýêBuU©¾.ºÏ†§ÏŸ¡ÃÞ½…¯µV îÿŸûi°¸ôÚK*ÝT¡JïÜyÅîç^Ü*«ö®ý£ LEè]I?ï‰ÖL•÷xaøÈíü?¹ß£ìá?–™dë9 çðŽO¼ƒïþÓwéÞ× @û‚vÞù‰wð½Ï}Ÿ®=Ós¥Á *½ƒüa7œt%u¾h4J°#,ý A¡eªÑÝqÒ,ZÔϪ5 hŸ· +½crŽV'¶áp,›H8Dã‚…Ì[°”%;xfKsªZõíY‰ù],;®‰ ųҸ~Œ¤$á\ð‡{” z]„¬Ö¹’›w³ýÉ¢sû‘ªODäPfq!ïøûóX>¸‹'Û…½t+k"ãÕúI¤Ã£ó}ÊïðâÈ×\Å<ÅΟn¢Ó·hXõîõ„¶?ÏS÷Z,=g-¯ü'Øõ×x »‚=†_}ð+„ˆŸÄ§¿oÌÈw¼€{(—Cˆì÷ÍèI'²ºáA6Ä«‰ãÏ>Š0ƒMÈ2˜YóœED¦–‡Á4gƒGc —_r6 õutýàl¼ùfN<òHæ,_Ný;߉=|)ÿé§I|ó›4 À=÷à®XAã9çpÙÅgñÃ[‹eY˜Æ(^wšP?QGoß÷±, ×u¹ë®»H§ÓD"‘Ô …¸õÖ[‰F£\rÉ%X–5:Ϙ`~º‡"^(JÂ×\c‘ñÿ@Jg†Ãn3|Û2IêiÁ" Uí“f2•Þ®msæaN:™¯<´™+{ã ‚Ê †D_‚íÏnç”ÓNaëÖ­{ì±ÙÜĘƒ*Ë1ÔÕÕqÌ1ÇðüóϳtéR¶?³D_Ë©üðEþ¾7ÎZ<Ï#Îà™ õá(g¼äJßø[žyîOemªÄMœ‡ïy˜óÞt.õÍ&”3žáeGrI£Ý ]Ør¢jï‰*À ™h¹ñB÷J·]±™Ré], oZ)Ë”†VÝýŽ¿ƒÕ'¯âƒ_ú_xߨŽÍG¾öæ-žËÛþþ¯¸ñýÿÄÔ­–Ú›,k~–çþðõÀÞý–KêŸa¯i h‹¥ï¯â¡wp,|ÚZX¹¢ž9íó µLþéYyÜAlËaþü„BfS/û;çUí'N|n7+Ö6±pÎ<úÓ{Fîb\¸Þ^ΙÃàCtÆû õÏÅšT-ŸˆˆŒÇ^q‹C>{zßÿï½B„í½>€EÓ /ãõïkWµâ u±í§ÿÍܾˆ÷þìXÿñïòá?k›àùbá%oäš÷­gI¤‡§îØž÷KèÄûrìëòÏür[P½\ é:ˆ¶Š×FØð@«ù8N:Ù¡ãÙýÌ?z¸ÿè¬zÎ""S'±°‡[8ŽÅ™ë×°ù[ßbõòåÌ]¾œ†oÛ†ákLÙÇCã¿ý±}ÓßOò¦›h:çÎ>ãd~|ûïð}°›êIG‡ˆØ/Ê3z}/ß÷yõ«³­FŠ×^õªWÙ6'¹ËÉ÷²Û³|CÆXxxÃ9áHÀ=xcÈ9  6`ðÝêånã…ÞŸ¼åA:âWß÷›0IC—‰²ü¤“øÑ¦§è¯ogûq*üÆž²S,:f!¶ãpÚù§ÑÑÑÁ¢E‹‡Ã£ãÜúìV6Üû(§¾ôŽ<úHÂá0 , ££ƒõç¯ç©Oá¹û¶tõ‚mq’¿Ï\×Åu]’É$®ïãù>!Ö­{9uMlÜøë/n˜¿t>×ÿÇû©o®'1˜|W ·ê{ä>y·ƒho2Ñz3¢ò{ºBïj¥X¨µI¹½¼ó×Ë¿ e~ï²Ýü™›ù¿_~/ –/àƒ_þ¡pˆy‹çÒµ³‹›?ó“Én¶"•^È2èö&s4rÆ%×¶=€ŸüD Û«¥ÐÛ`3Ø¿ç· I=Ïâ¥ó±±ÀÏ ¾­œ·­9ÆÁx)Úš9ü°úúb¤2Ž ŽÑºÂ¢­¥‘þT'¹?'­á1™ÑãîY!+‚gl¶¼°ä¶:Ú[ñ¼Zµˆˆà?¿“]©“9âê×qEì§üüö-t„Xm§òÆÏ_źh'Oÿâ!ú[çêÀe9!Ëaå»ÞÏÑ$ØÿìÓôš“xÓ?_Å:ÿ9îûò°Ï)çþÝ»‰mÿ ·í][|Þ¾0!+ÄÊ×¼ë¶ûøíGrÎ[ç²\Àãoÿ%^Éë_~8½¿ý5w>Wǵa2=#¿³X„Ö½„3þøÝëqÊE' ¯÷ ö´œÂ›þåõ¬ìcó“Ys"ë®}/ÍCŸçæ÷Ò9´†ÖðvþüŸ騷ƒ¤ÛÅ3zñ‹ï,fÞ‘ußΞÝù¿eǻ꭯ÆþÉýܳ÷$^vÙz®þòñì¼ó>îûÙjλj-—_{_/½µaïùþ‚= ÎâMs+èäé;·Ái§pXF¾[m'O°/ó^—þ ï°°÷lãÙ†3Xó’#=ð áu'±:¼‹‡c4qòD\ IDATô>¸õÌL~Î""SÇ:Øvö Ü×/¢¾.J|ÃR©‹çÎ¥îºëÀ¶ÙöÑòôÝwÓÖÔÄÑ—_΂}û-o¡ç_þ…VÀïè náBV,[È ;;°m?:¨j2róƒH$ÂwÞI4%[x5rd™‘*ð ÃïL,1†pª´Y>¦š;7àik2:ÏÍÐæ÷ãù>n¬:ý¼aüÜ`÷`†%gžP¸´èûô$|m›%kŽ'a¢l¹û×¹ku“Ìm–·„~áï ‡ÃxžÇÓO?M{{;¾ïã8Ï?ó<·|þVBñ0/<¸×~ôJŽZužçÑÜÜLww7Çs Ÿø·Oàº.Ÿýðçè~¢{ÒcÊ—»Ïú÷exêË2X¶…—YÌK_r-Ñážã‹O8––6þüÇ[ñüÚéË÷†¿~=móÛèëèã[×ÿ''_x2½ëÂÉl*· Enè\¨§w¹½½É[¯Zaö´„ä3¥Ò»É„ÎUqjs’{;÷6éÐ{×¾]|í}ßà]ÿ~ ‹W.`ÿöý|ë†o±kÿ®Én¶bµTém©¾]øny½»‹±Cui)õ A¡e‚Þ_iߣ«·T"N|p+V¶ ‡1^+ÔB*•À²,'ŒãX?^LŒùóš™ÓÞËÞýÁ‡Þ™Ösæ5’ÈÄð|—!dGp]CÆs1ê¢$Ü~À"â4Lyì~¾gW; ©F2¦v>¼DDf×ïùñgò–ŸÎYø§¿~w|ú{ܽ)FݺÓXÛfØÿýÿå»ÿµ—˜Aü6‹Pf+?¹æ‡ü¥#‰yé[yãŸ}ßýwþòEìgZ8æçqÒY‹¸{ûœXdÞ·ŒŒã/Üñ¥_ó<+h­±= dÖ`œðhÀãØ°{d^[j“¢¿?N¢3è˜r—ø> Æ ý©â¹BCÊ‚%G¬"q¾aë]?ç¸ý{'=ž" 144€mÛÙk  Wâ?rÏܘGÚʾNVÜfÃ=Xµf®ëâ8¶mg÷Ycc#áPxÒã)$7›ò2†TŸƒcÛ8!'TÇüy­8áœ3À }äÉ´¶µò›»H* t<“õøÝòCÜñ•Ÿ³}÷vv÷dÛÁäÞ¹Ù$Ï2GúyL«¤B{FTuRK¡w¹ý¼'Zn¢jîbëæ÷ðgù±•©¥òñðúƬkÙƒþà„-ª%¸ Yøê»?˜s¯ŒïæT7#wýñO±ùÉÂPøú7¿ÀñÇ­áì³N]wx+ cÒô'¢¤·Í#žè∕õ47µb¼A0°}k'ý}õD¢Z[añ’¢u˜Ì áp+u¹UØÁ±ê]ê#õÄÝ>B­ %tîê&Óoã¤Â¸mqÖ¿ß·¨ 5Ó×7DçÖûby6ªwä]DDÙyïÍ|呇8áªKyå[×òêO¿šßð?tÌm!dùtïÚAŸ?4ºÆÈ/EÞsOòؾNúŒÅ¼¹-„,‡%ï¸/¼cdIŸ¾ÖfšŠÎkÝ–ß±Ÿ=nœ¤ÕO,iÀ¶qð‰Ýûsn9¦‘WþŸÓ¹ò §qñ“¿æ¿þöVžYoÏ^L³º20߯ç6²|úö¾È€?„éÙGoŽ˜ÓN³õÂð7×$HŽ~üEX~Õµ\÷öå Ýuÿýƒg‰ùlô÷gÇ›H‘òÀtuÑ‘‰‘°‡H¦ 8vÞiÈc)ü|¡¡µÛòé~q}þ ìÝG¯ÏhÜX¾<ðºäŽØfé›>ÈÇÞ¶¤„fa>{¾÷Yþñ[;s.â9¼1+Åón#u鱜x̳Ì]aï7±Ï?~ìr5ñœEDfšá3as¾oúžGýèuªÀÊd˜ÓÜœ ¼‡Ù® ‘ƒ±Øè:#[éÓÄ®»‘ÞýÅêª'{Ô³ôÐÛ7>_¿ÿ³$ýlËÆ[›÷Òbd<>&ØÐ{øuPÖÙ×þÀþ:óŒuôöõ³{wá#®K—.æÌ3ÖùÁ=Ù÷ÏD\<†2/îZH"ÖÍa‡u0áBl×"†ÝmXØDö¹tw÷pä)š[[ÀõplŒÁXo0X¶ç"v3}ô=ohèY@Ô áã“jˆaŒMÄnáÅ;IíˆÐÔ·Ï÷0ji""Ruá¶Bôôoáït^ýI^úr›c±c olÚ·a™Áì%àmëÀg˜Ÿ!5ü¹ï‰á}7ý/·ß78ºýL׋Ď+6ožÉžù†—!cò~c7à§wòç/}Í?<’ÓßÿZ.{ÙE\~éxêÎáeÜtv (iÁâÝC¸Æ¦uQ˜~hk£­ÌöAÝáß ,+çËpˆEÿç]\ÿþ£IÜyÿù/°#ãŽnÓ©‹b¥RýBsÆ;ú¥ÚÇù!gü¹Ÿ÷c>ÿ‹<ßä@ßX´.jÅ2ƒ0·…f{dýñösξ}]r_iC÷Ýwðý§‹}½»lbg¾;¶ƒ>É é×sò{.¦¥i?üónÜÓkñ9‹ˆÌ,¶{ Yooß­/y ý¿û¸.þÞ½8‹søÙgÞ=„N=HmÙBr¸’:´j=½ý£&´Ü`¾¨¢6<üðÃd2"‘ëׯ/¸üÈ2áp˜ÓN;mtAŒ%žNг¹ƒæyM,Š=Of˜Á¹«0Ã=½ó«¾­LŒÕC¨÷‰õ Ðÿ|'~•>8,3~è½ Þf÷ã÷ŒßÏHð",[{6¸ÇöÙ³õY¼~lj{zI{1&ßܼŒG*•¢¾¾Ïó¨¯?pÑTß÷YwÁ©l~`3N<ÛbÇkðXÁ:|ß­oll$‰à8©T ãUö¾*´êHvb;†h›‡El ×ÍÐß'ÚXÇÜ9 ² [°ý…'ÙðÇ_’rc¥Ú¿\~ÍåøžÏC¿y˜üÇGh›ß†Ÿ1KŽå’^Ã1ÝÛxpÛI¼ïÃ'Òšéæùè*.üØQ<:s+¿è>ó•4üòK|ü?'½³K`ˆ=þ ;Sǰòêwòîæ§H&ËmXÇÛÏãïKClÇ&þ²£´ÏzC¦è'±é’§žôyíú£0Û~ËÆíi8½ÈÂ%MOª‹®¦•dêæáÛ!<H%˜“ØÃa©çˆ¸qÒ©±OY8€ˆà»Ÿ5©ñ“³üãk×Þ©šO¥RÜpÓÙËs¥3t¿¸‰+‰²éwûIyÉŠ¿#÷léá‹ûáhˆ+Þq‹/"N>öêcWóW}+Þóg¼ôtV³ŠD"‘íFÙ¹c'·}ç62)—ëç=bä½Ô´ÀaÝÛ³×lÍd2ì|z÷|ú,^r sÏz X†gžú ›ÿ1wpÚ2„+Þs¿ñbšèÝ×Çí_¼£Z•ßê$÷ WRí=+U;ô.,Of½BóÇkmRNÛ“‰zâäow¼íOè'Ÿ»…«?úþ÷Ÿ~Ì®Îlïo\ÿM®þ‡7ð“ÏÝ2ÙÍV¬œÐ;[ÁdØ¿‡´é'lZñ+:ÞxÐ#ÜÞ${Uæ å± ‡B\|áyÜñó»I ]F"\|áy„C¡1ËNö‚¡eìøúb ¤¶‡‰ÅöågbðÈž†ÔÑÓÌ’žZÚÃÄcN¶2;èà;!™ôéî"ÒÝ‚ë»cNŸòaÛæNšö/Àqø&ÁCDD Jly†ç:OgåÙ/á8'I÷sëW~É3ið÷ýž›>=«Þ»Ž®¼Ó·—'¾>XðSßïÛÀÍi%}Ý9œvÍ먷Rô>ý(·%üqçMIJ˜wÖ…œxEâ}ì¾óçÜqW/&:þz~ÿ£üôïÚñÿú\Ž¿â¥„;xê;wqËÏöâúùÁƒœò7§qô«ÎcÞ»y.²’ö…šÇÑÎÞŠÇŽ­wñ˽>éDgȯú·Ï¹åßçÍï=_îðÄw~̓­¯fä«q%ûÒ˜€š†ùÝl~p7W®;Œž?ob‡ s*Ù\Ÿ³ˆÈLRŸ‚ÄP »¹χ‡6lâœ3OeÞ¥—â>ô¡½{éûÈG¨¿î:¢+VܶÍ7Ü@OGë׬!rùå<ð—x„l0C)¢I.ó›„Üö&ŽãÐßßO8æ‘G!s '°iÓ&\×%‰Ðßßã8Bï Á~‚îÇ÷ã%<º˜¶FŸ9éN\+ÌQ¸4ßÇó|úö÷Ú÷4~:IKKOÓµ=‚©Bð=^¥w®Ü‚:ŒÅ`ϦóqÞ¹® N\ɦoûº–gÛ#é&yðð‡xÍ[¯½©ëºÄãqV³šãN8`tšïû„Ãaêêê°,‹~÷ ûê .T‡eF®§ŒBïÛ¶ …²ýÈ&ޱ| .›ýÏ=û q?>íEs Í $|ãºo°kÏ‹Anz¢,rdº)°L©mLgÞDÕßãm{¢eª¼W;Q*'ôž¨"{¼i…þ.v{䧘sß.rßÉù{äEö`Á¹×®¿ö_ã~ù¥%MN3ƒÞÀhPlcÓì´0ä âMC;‡kòÁÏ~€L¦øÅ1|õ¾O3èu`[&2Ä+/>–”ßGÔjã‡?~€¾Ù+'§;",fí¤Çó²K3¼òê×w!Ëp=¿üáùÝÝ‘@¶·¯ßûý÷ î¯={öq÷oîà’‹ÎgÉ’E-‡yÛ¹ocQëÁó‚b†Ïã2€e,¢46ôÐ9Ø`[M´Øõ„0øfˆ 4ÛÎAûÇõ{è3QZílÓOŸïÐ2æq£4;-D‰ÑëÅñÓä´QG‚~oˆÌAãœhÜŽÕL³%„GÊÄ1V3uf€n?•ýl/y_)B“ÓJƒt{Il»v;Œç÷Òë»8v;í¶MÒëfÈÌ–ç,"2µ\Ï#>¿³¨ß÷hmŒpã§?D8bè‹_„M›èèí¥ghˆ¡D‚D"Áü¶6Ž\º”†ÓO§î}ï#Éð¡ÿ+ƒñ ¶íÀÞ~»â„œÊk矰€¿ýC,cóæÍ¬Y³†¦¦&,Ëâᇠ½Ÿxâ N;í4Œ1 ±eËŽ?þxù—¿ùt>±¿â±äj°iji¢qMMK›hšÓ€ee?×3é4ƒ{Ú1@|Ûv{­K2Xvö»éà€K× á@+¾­¹Q>÷ÝO•|ñN×uI§Ó\ÿÃMÔ…C\wÁRV,h£±±‘O¼ë3˜îÔÄ)‘ÛàrÕõW±n¸ k}}=ÝÝÝEÇF™;w.‰D€G|„Ÿ|ù'„â•¿ŸÂVÓ˜ûó—Ïå½_¼¦à²»¶ìæ»û/<–Æp#»÷l&î'ÆÝ~Æ ;¿RÿõÀ¹×îâ§_ûi Ûn°øÆ_¾ñ!à÷dO€3d0ŒüñsþùcŠÜ'ç>Œ­ Ï¿=ÞßMË¿ÍÓ«z×J{“R‚ðJ·[¨w¡å'ªâý XèœR¸xôy}c¦yøM›J¥\ÈÒ`èËìáݯ~#ŽmcÛ6ÏÇ~CÂaì(ûWÁ7†Œ›áSŸ¹óLE# ¾½I€Çý²ýÇ ï¯Å‹rúi§ŒÞ.´ÌH¯Ïj‡û“Ë'áAz¨ߌݧ¶“Ádbìé­'žn ü訜L„¡=CdZbDìïÀEX0ÐoÇ3¹‘©dLœþqz z&F¿ËŸJŸwðÁic’ zIš3Þ¼dÞ¶<â^'£#2Côz…¾°L°ÞãñÚn’dÑÄ4Nßè>Êä=nН3ç~†A¯3ç1óÇ9Ѹ ® wLÄØçPú¾ RzÌóòý>:sö—ë÷æÜŸ-ÏYDdjùø4öúÛR8uQºûc|ý;7qý{ÞDÓ 7ºí62¿ú ÛÛYØÞ>ºžzÕ«ˆ^vßøÎÍôĉDêð“IZúM` $Gª¼GÚ]<óÌ/ÿ¹9ŒD"<òÈ#£ó"‘Șuƒþ>óc¤úSÄNÐï„ µ„±ë|ÏÇòðR&EÂOPßÙ€1 Ú—§±,‹æ6ëÈ4Û"˜LpÁw9UíŽã‰D¸âÄ9¬?j!­ QB¡Žãš¤Ü§_|'¯?9Û“{¸W÷Ò¥K‰Åb Jeöh4Jkk+ôöö’L&±,‹“ן̶‹·ñÐO&šàÔ» ä?¯‘¼¥ß| «s+]RfâS]ÿ}é[.ÅÇpË×*ïä7öñJêsóÌBÕÔÕjq2^õø´·N©•л¥¶>)e^)§[fÖ%s¥„Þ¾ïóX×í¤L!ÇÁ¶,,Ë"Î^:cßÃó aÓB¥Ý;|×ÇóÒ…Þž›Âw«×Ó;ßšÕG.SlÝj³°ÆTScÀî 7zõnËg^Ë ñttµSÆ…‘Ëhìn§Ë‰áµôîmŒÃ7~¶ªÛÊ]mÖý™˜›&Òmá- Gyè±§øâ×Àÿ½æ D¯¸‚èWàmØ€»u+Κ5„ÖfÏ´Îd\¾ùýŸðÐcO‰6`Œ!Ô7æVÙLjeˆÅbD£QÖ¯_?æLac ½½½ç%“Ib±n¼øYæ•pË Àò-B=!¬á6ÇžñÆœU÷cÐÕÚ–§±lhn a­LÓ±-ŒŸ9øÌ¯É(µ½É˲xù©GŽ~WÙF"N”íog÷»Y´x¾ï“J¥èî©‰åË—‡líX,FWWžçä»wíæ…Ç¶q* ¼‹™(KIŸV þ?hÚdºBŒc¼,s¢ ;Þxat-LjÊL ½Gkm2ÞíB÷s§WÚK|Æ*µÒÛ÷ aZ¨sÚ°m›„×CÜí¡!4‡&g¾eH»nÅW?N§,¼tǦò PZ~:A&¸3€ò?¼ò×V¶µ · ¾ýðôimì£!ìóbç"R®U•~Þ#á»íZ´w.¡»mƒõ}´ÄÛ±-;wÁáǶÀšQ?GEDDDDDã—¶¾]‘Öüf‘zþ²q þø¼ñµ¯bÝÉÇ:õTœSO]Çõ<yìI~øÓ_ÐÓ#©ÏuÐÖgH˜€Î¢ú^èçÞ;ïå‚—_@8|p{Ì–––ìóðÆ¥Ž„Þ÷üêz·U÷Lwƒ!cÆÖã~ºÀ†¶ÃÒX4µ†àÈ [ $ø®$7Ég‚Î,Ë"þB‚Ÿ|é'¼æý¯aÑâElxh»¶î攳Ofé²¥£¯ã8ìÞµ›GÿøKW.á”ÓNaÏî=Üò•[HlO`gÔ1Š=瑾ZJ :ÝΉª\©yd±œÓ'ªþ.µŸw͚ɡw9Ê©Ò.tĤÈQ•j7¨˜J%„ÞÆÐ^Ä}÷ìÄÂ"êã´3’pS7ÁíwÝOzWƒÁôÔSɾI&]¼L‚P}ó¤·‘ËM ’H{1ËJ.¾q`½ê¾,ÀX>  “&Û–!ngOW˜¤kð­ájë*ŒÉ²²§é…2‹{#ceðm3&ÛΆã@Ç!"""""R۲߃~œy]tZýØs[ˆDèLñÅoüúhˆÕGÁü¹í ]Ý}lyvÉ´G$ZG$Ú½öAg?óº,’~œ߯*ûžeŒÁó=îûöýl¼o#‘æ–]Z;ãû¤Óô>߇‡‹c;^Oj2â~ :ÁÚV¤±m‹æÖ©%zvTÖæÄ7¾ëÓÜ\Y®‘ˆ%ð7ò¹"Æ||&CæÙ4?ú×qÄI+yâ·Oàõ{ì|n×~ôÚ1¡ómß½ývòX«ÃŽgwòÂãÛˆmáÚÙ)6v…¯cá–°Ež@ÁåËÝþÌ‘MI(­Ú»œ*îC"t™êл”UnOö±òß$¥ôï.´þ˜Ÿz³éF‰FÇ?5åc—Ý€ç{üÃo#™N‘pÓà¤Hw‡YýÐK³óÇ`Áî™óOo·Ëoñ;|“Ûc²,l˦·Ûà ·÷¨”êêꨫ««hSóþɶ ñ‡m¤ÚÛ7!R+Š[ÙåªÁûVölÛ„Æ<š±LN•yµÇ!"""""R›DÓ†¤—`ÁþFzÒ¸së E#8¡¾ç±ùÙ–íàØê,ËÆO¥pº’Ìë·ˆûñÑۯd|¾1Xø nÂÁ)=U1àááããCp³+óc˜®FÀ¾ –®h_¹~?æó·ïþ8ž)Ö†¹4Žå`' –ï²Ã“ÞŽùÏ€1>)Ò˜í†Û6âá‘¶Ò¤Ò)R©¡P6.L¥R¤Ò)’V’È@„·nĶ-Òd° XØø–þ&Ì 3Üó½Ï/_΢|!Û«§üÆVqçÞ™Vîn¯2¼Ôõª®*½ƒ<¬W(Ø.å± àåâ3š1†®Ý]|á£7–±ŽÏöù;9áÔ¨ ÏÁ7†Tr'½noÅGjmËfïöÅì!„kÜá໲텬žåb[ùá*Ÿ1†ŒŸámg½½¢ídü̘>]Õ6ú”ópÁ_:¤4&¯}‰úw‹ˆˆˆˆˆŒå˜7ÈœžF2±4ý­I¼Æ0NC'46ü4ÆÇ§pbæô[8)ˆ™¡À¿óY–5záBø¿ÒWÎþþ¯¬u«,Û㻓ŒbG=’½0ù¾Ì;Š´!qð÷ßrYf¸Í.sçog¸ ÐÇÇ ÇeŒ‹åXÙÞï„è}¶—oÿ¿oc…²‡$ŒëÓûl!;{V¿oùx+ÛúŲ²Û ò}6Ô=Ä?õ“‚Áw&\oúYb¼ßÉ´8¡Èz“Û´s¨…лã…Öån£ÔÞޅڜ̺@Üîvèíé-yycÜ£ÃÜú_ŽN³zšOÌ¡•†Â&Ø‹G.oYN¥ÿvçfO8 f@""""""2ë CfˆP*ÄüÎzèöª ?ÜrÚö äBSÒ&N2ÀÞùj)¬RÜá F±‡l’~¢¢mùdϨ¢ÈmäÌè ö»ÁŒÕ@¶R?;ƒÁ±B$·¤GÇmŒ!jEñ/›ÑXo/è+©d†Žg÷ÿ!¨P™lOt3ÎübYJh^ÓªzW3.%¸o³6¼ž ˲ð­ò¿õ\lëÀ…*>Ôþ IDAT<ã1h 6®(¨­O–ea;Á¼u|½ýDDDDDDdXĉ—"…mlšSœ”ƒ5Ü ÄàgÛS˜$¾•mé¡ðvjíûu­I™T`‘^-8è}`e+Á}<ÄÚ–eUí½ãšƒ+ê3¦ò³ôeL^(¬.Ô¢¤Ð6ª}1˪m{¦UzOÖDÉâDÕÝ…þ ÷džå÷Eê÷û«0’™a2ûKDDDDDDd<e >>®_½*n9tMW¾¥|¥¸œW¤¤œ2oÙñ^ÐU±=YµrÝ€ñ”Ó ½Òí¨ò[DDDDDDDDDf’R3Í òÓr–›6µzOÔ¶¤Ôõ‹m£Òí¬«p\DDDDDDDDDª)ˆr¼—²\ÍUŒÏ´ YVó(Æx Ýs—™ÍÜEDDDDDDDDdF˜(“,%× b 3F-Vz­ÐÅ++ÙÆAþøÇ?Nb“"µ+ÇinnfåÊ•„Ãáé’HÙ2™ Û¶mcppÆÆFêëë§{H""""d2ÉæÍ›§{""Uqà 7Œ7;ˆl³æ*³ƒ6CïRÛ£äÿ™´h4ZÉê"5%NþYµjétšD"1ÝÃ)›mÛ¬ZµŠx€H$BCC‘Hdº‡%""òÿÙ»ïø8Êÿãߙ٢ÕJ²$Ë’;¶ÁŒSmÓ»†„b:$„$ä~r—Ëå.=¹—„J Jè͉1%Ø0ؘfŒW\%Ë’VÒö)¿?¤•eY.+KÞ~ÍkwgfŸy¦Hk}÷™ç©TJ’tíµ×örM ¿î¸ã޽-¢cÞÙ/»'Ù[~ ½»²7ýÛt;ŸÐ~’J¥‹ÅÚoÇqz»JÀqG™LF£GÖǬââb~_ú“]×pwÊóU¸Ý?„Þ=ÕÏvWåî4?ðÃa¶kllTyy¹\×ííª{Åu]•——«±±Q¿¯ýÎ.g”yÜžÔÏÃñÞȲ¯v¬¾¯/$ Oñú×uµvíZ­\¹R“'OîíêøV_½?í[‰½]¾7v(›Ûåá'\Ïð+º7Ø?Äb1M˜0A………üÿ¯ÅãqIR2™¤ëÌ> ÷³Àù膮իWïêê=qvwAìíò^Ó›YæÛ¾ú$3:N3Î8AãìŵÎu@’ ³}Ëì>ÛJ;üzwÔñ„ç¥Ów¾=Þ׌֓cÈ0²Ú¼ø=÷É ¯*P(‡î £4ãÜ*DŒÝü–£}½úï5±»uŸ7ožÖ¯_¯Ç{L^x¡\×ÕC=¤X,¦çž{N\pA^êåÕ¿£ç^Ëèð˾¥c‡”iج õVß ¼÷†ÓG‹ßSø¬ÖÐ;SSááúâ×/UeÄÖ–…÷èÏ Vhø9“T¸§Û éçVª`·ïþîM>óiÙ¦×Ík_ÛBï΂n£“ùݽ§ã¼þ™š¤—뉻>Ñ”kÎÔK’­üÛíúà ëôÙ×êï÷| ã mÞW&•”1øhyÊ•z«º^fºª]6_Ï/Þ fÛ‘[0RÇÍ:]—[’³J¿g¹ŠÇªÞÔ¬D<£’ƒgêàìûzkC\éxJ‘‰§iÖÑC–”Ýú®^˜ÿ†ÖÅ]KÔô3OÔøRK’”\¿HóžG5nPÑŠ  ´ž„ JF ‹O xD]íûîÔÅ^§—ÿú¼f–ƪ»}ï®^Ýì³Jóî_¯ÑG¹ZúÒr5Œ£WßÛ¢æŒTrÐLuÒ8 0[ëüÂb­kr¤`™ÆÍ8M3 jí‚yZº¥^æ£÷êí±:ùü™:úC™d½¶% 0F¥Ëš•p[©›}3¥ä†×õì ïj«TaÅx ZRëõÑíñêäØ÷ƇÝ›ú±OË$?-ãÌ-߯ðþzïNëìžØÞ§n³ß´4C ‡Â †Zªl* )4e˜A…ÒëUSzµ.;«B¯A¯Ýu§–¬§ÓFv³l”¥«ÙÓÐàBG›ž»C÷.Ý I§’eÊlT}嵺âì2ÍoêÞ_?­7g\§+¯®T ó¡ýíkúèÙšR°I‹þþŽ Ïº^ß_¨Æ·Ô_xOCÎ?L²kõÏù+UuþºrtX© /êž»“0Ña˜*6DF²^Žºiɹ;u‰ 0 êf߇®ïº^îæ®÷Ç *˜úPo¬9A|ó| ³jhÎô™ß4»{=›¦©+¯¼R÷Üs¶lÙ"Iª¬¬Ôœ9sòÚŸ²9x¢Æ%æjþ¢BxØ* ØÊº­ ízõoo+|Ƶºir©”ˆ©)m˵ƒ %[õ7fk¨W}Ã:-œ÷Ž ÏüŠn_¨¦·ÿÚrnfOU‰»Y‹ºZfʬWÍ€«4çÌÖkáî»ôæú±:!»DK¬ô•o¬BeÕ¸­AŽ!y®¤ÌZ­÷.Ò•ß­B{£žÿÓýZ²þ@2l‹^ýû»*<ûËúÖ¸"¹uKõðÝó´´ü‹:î̳µmÓB ¼ôbͨ9–P2‘;®bŸ¬Wrðá*ëØ»‰‘»Î¯Ñå­×ù_nyFoθFW^U¥@æC=öûEúhò¹:$b) Ê2$©ë};eè½2¥ªf]WŒ.Pz˺çÏ)•L”ä|Êñêxì›z÷:§¥7€¼È.Ò/漨cîùŽföµlØìvv™§mö«Ð|_ dÙÛ)Coo¿ŒÔ!"Š76*Ödjàà ’ñô§. —U¨0S}}\…Ç+˜IËΕiФƒjjlT£[¦ª²aš4¾P‰ÆFÅR%ª*O+™påV¯Ôšèá:z˜£X}LÆèC4ªn½6¦%·f­6–®iƒÒjhˆ)]:U‡´Úªíf³rvåÇl벫ǥ»zu·?-éˆS¦ª$Õ ú>xï ×uÕØØ¸C¸íyžšššÚÉ s°N¼ìþÔãe¶þC^¸kußW?£Y×þY;;.ò_Ò.8[çþìe{§v~ÔÛ9é>Ù~hé³+doZo|SÒ«vüø Ê2r¿]\¹ž¤¶V‘],óZ¿ø5½¹j›2†)¥”*Üî e­›ëÊ32=GžZšÁz’dH^*¥xõ«ºï¶×ÛÞéZU’õäe3ÊD²ì–Úz¶¡@xO>Zv­.¿oç}ï®^ÝíB’Œ"EƒiÙ½ýÿŸnìj+í¦¦&=öØcª¯¯×àÁƒåº®jjjôÐCiöìÙ*..ÎS…2ŠgË4å¬ËtÔ™uZöìÃzbnVž;EÑtJ™Â°ŒŒÓr½Ü£'Ï(RÄJµµ wS)%ª_Õ}·/j=ç†dUiHÖív™ôä)(Ó³ÕrX¼ÖóçIÇé¢Ï½£ŸLw½T¦ÉÓOÔÑcJdzž<…ð2-×ç*ëµ|ê¦SʆÚêìÙ)™QeÓr=S’×zÚƒä:½ôô[*>íÎ*Ùá?òrutZÞç:reÉtm¹^ËuÞr¼íç×óÔò¯ó}s3ie#!Ù–Ÿ/ëÉ ò<ïÓW‡cß[èÞ=ËÓÖ—~©ÿú«ôÙoüDß<|¨ 2µZùÁVõr¤àVëµGç«àÆ#t`Ä×ñÆ.s7>­[î©×©?{@¿S TÍJ}\_¦°$¹›õòƒsUpÓÑËñÚ§ÌÀ:ÐxU/}x±ÆNÊÅ•ž^_ MCT±ÉW ôD†¹+­·û| ïœþz÷YýævyÓ”áI^[÷&¶ÒiGjËÛ²ö¯»^–Yù¢æ®¢KæÌÖаä¬|Z·,6vìF ÷¾¶Ã”[Ö:ì£aÈ**Rñð5ç²£UÚö6GÉX“’‰B$âJÈÐC’²J§½ëÖ:ˆd—ÝìF]rï7 £mhÊÎöÝ*ìº^V´ëýIÙ-3<ꬪ½mw¯çùó竾¾^ºôÒKåyžî¾ûnÕÖÖjþüù:ÿüóóW97«dsLI#¤1'M×Èß/W­3EÅ…QÄ›Ôì©íxo×·Î7£E*v‚.sTëyk97ñú˜’É®—¥ì–²Ú—ÛÆNÊ);Tg]v”NßòŠþzÿ‹z¿ò\RØqÍíÏÌ¢bEšÛÕÙSsS\‘¢¨ uÒ¬ µA¯<ýª¼ã/ÖéÃ\%2]¤ŽŸ=‚ó.u¾ofa¡Â‰fÅ=µ“LËu®îeîxµ?ö½îMÐ#²ËôäCtÜ¿üF³'˜Ê&š•PDÃ' Ïqå%êçßxO§ÝúU¤¬ÿúËzùèÛô/G¼£ßþÇû:ü\Gsÿ¼@ÕU¿û²©?tœ÷µ£¤uÏë·=®wë]…+ŽÐo¸\Ç HÙ%úÍ·^Våq¦>þ ^©æFé ÙºáªC´ñþßèé>‘õÃoëù²£uÕwÎ׸Noݸ uŠ >LÓ†Zʤ²2ŒÖÄž\·^oÜy³[±FÖw¿®ye“5>±DæU·ê+‡´ôaâ¬ù‹¾ñ?¶¾ñËI;”™Z3O¿ÿõ_õV«påQšóÿ®ÓñCˆÜv‹Q¦£¦ZøeºlÒT…$É«Õ+/Åt쌚·&·¢­uóoÑoyOµ™¬œâ©ºô¦uÚˆ€”]¤›¿¾@•ÇxZ±¢N‰XBÅÇ^¥¹ä°N²ø_“l·«ßôß“@‰„jUSßÒìÒmüHnèØTt÷8Y[F´Xt£ë>Ñâ%+•Úƒï{Œª‰šÐü†ž{óÕ64¨¡¾FŸ¬Þ¤FW2ªÒèæ÷õîÆ–›²[ßÓ²]©·½EKŸ] {æ ¨îêÕÝþøÍù矯1cÆèòË/—ã8r]W—]v™ÆŒ“×ÀÛ‰mÑÆú”IrÚ¸t™¶ ¢Aɨ«ïiéšf¹’¼L\‰.î{2*'h|ü =·d­jêêT·­ZkWnP“Ûý²î¸ÍÛ´µ1®æXƒRáJ *²d~ÊŸFåDMt–k隸\INl…Þü8¢ñ a„ Æ´­¾u'2›õú3/+uÜEúÌC‰L» ÙÕzëù—õqS]çƒÔèæåZ¶)w¿¯÷s×ù/ÀOœ ˵Â÷^}\Q02L£Ç•©Îhi'kɼÓc7ËŠ'ÍÔÑ?¡»n[ p´R‡L?LÃ?ÜÞJz‡õÖvÓ[[† ³J3¾p¼žâaýáÙ”/¨²I'ëÜ“K¶Fê¤ó&ë‰ÇïÖ­K‘ŠIš2±\µFûcßIËt·Y5ŸlPæpÉ(Úºìâ¾ÝÕ«»ýÙ©¬¾¥ýñØ•n!,ËÒ¥—^ªÆÆÆ¶>¼MÓÔ¥—^ª¦¦&9ÎÞ}±ÒV—æuzuþÚÒ”•«dØ¡:õsG¨ÔËÈ6†húì£ôì“êŽg³òBCtìyçèÐ^Û~lß• sþ ýãéÇtçs)9^@¥NÔgO(RÀìf™×±¬\žœÆ•zqÞÛªs X…9ýW"¹Ù®ßã¹å:zöL½øÄ#ºóÅŒ¬ÐÁ§N‡;JÛešxôp=ú·»ô§Â šyð6-ÞT+÷Ñ_ê]·µ £T‡_8GÇ—7ië'”âÊ+ì°=Ïké’¤ýë\—&í÷GÝÔÓ®™çLÒSOÞ«;2–"uÈ„2ÕzžPÙdRY•hÔ(KKk›•ÍdäÊ“J(‘äÿÂ’¤ðÁºææ›4÷î»õÝknÓ™êò‹NÖ˜¨äÚŽ\yr3e2†Ê§Ÿ¢.Ð;©Ãtdp­^y= ™ÿ6R†ªÛг?þ§^/ýãÍ¸ŽœÑ' _QðÄï¨Êø°]³2C%#Ç«DY¥ÓÒÈCÆËxºAiµ†œÁ‰:~Æ@9™Œ ש§ Õ×$û˜ÃA÷3}å|wH.{mû>ç(<êL]ý@KèåÚ²”•‰©93Vç}{²2õÍ­ß`š:à¬oj¼Ý¨¦t7Ë2%:î²ÕɦäzŽ2)[ÁC]55§åYÞgÓ©7\.·©Q)W’Qªc®¼^f"¦„mËŽŒ×ÙWOÕ¹VK÷@N&¡æxF®g˨ÔúáI^¡Ž8i²î|î ÅŽ¦—ëÄï—KËZ–·Ô½AËžy@O,úD Ã’š>Q|à¤v ® mo|‰F•hj–ãyÚntèÍ|Õk÷Ø«úJè}ÄÍÄÕØiÒšQsýŽ ²ñ†Ö‘q»[æ*ÙØ°CÄÉtWeÚJÄÛ×F©ÆXÛ+ÏI+Þ˜Vg7¸Ù¤šbÝ Ÿ¼cY-fÔÜÛþîÔ¥ýºÝí{÷õêzv.ŸÎËÆÕP×õ-I^6©ÆúŽç"£¦m;kÏN©¹!¥æÎÊéj™·sYÙæ:µ\5]Ô­Û÷HžÓu=œT“êSÛ_§º¼üÓjÜ–û¡ë¸½¬âuí¿|p”l¨ïdÝîëéfŠÕ%:Ýúî/À¬¡46u—¯ú¢ÆëØXE-Ý›x^»(­x<»c"ÔY<ÔnžYRªòq_ÐO~z޵Ý9ì*“H*›é¦Œ> o†¬Ž²G²kÆçë…K_ÓÊÌ™ª4[ëÙ F5í”ɺwÁ›ú ê ÌüŽª”ÛŸÖÇ’2•û’~ñ¿ç©²Ý¹±ÓÙ}m¿ÕWχÚîRO=YSïx\//¦%•'kvñŽw'7¿r»~ºàýè§_ÓØBCöâ›uÉÓjwgsLõõ®¼A-¹ëÖ­u*,)–±ÃÏ öý=ôÞaH½(cOÖÝ>"·Ë@¿Àïkä]xŠÎ=¯Dÿþ›ßiàõstÊ„ ¹ ÕÖ$\¡H¨Bƒ ÖkÍfGSGXr¶¾®W?°UpÒ®oÂ:pºŽ‰ýN÷-8TW5HA/¥m[⊨‚îÞhDUT°U7g¤²ðÞîéék!«]ý‘>ÌѸaÅ zÍZõÂ?µzØ8]fyòT¨¢‚­ß˜’WV ÉSøÐ“uèŸïÓ½ŸD5ó»•máj.¤µš©é±_ëÞGèšc*òRªÝܬ¢!*èƒ~ôµó!ImͲ=O®5I'y‹~ôû šöõ‹õH“¦UiÓîlë/ýûºó·?Ðõ·Åe{a ž~™nºêSBos˜NO# O®Fèäó'è¿ÿç]]~’nøÅ:40I'Mݦ﬜­o Ì—ÔZ˜çÉ ŒÓÅß½P¸å»ºê7-çfèÌ«ôï× Tï|Íн¾v>$µ…Þ-u35î„*þg“NšZ w‡1ª¤3¿¨Ï¾üúÚe¨¨ìpî©ÿÚö.iŒÂÃuxè1ýÇu+U— jÌÙßÒ·ŽËsûØ>£ÇõÔwNËý´ÑD;ëÓ»ã¼ÎN^w\Ö~2;ynµ{n¶{{nµ›h÷zF<ÿ‘$­Zµª“Ýú§­[·jÉ’%š5k–âq_ŒpŒý\4Õܹs5mÚ4 4¨·«€V#£’¬s®ûŠ®;ç`uèÓÄkzCwÞ|^­?@Ÿ½æj9d‹^¼ýWz|ÕÎ]¨úBo° jÈ¡Ó4*jHá:ü¤StÒaÃÔ±wjÙkz3fiÔiëÜ™Çköŧj¸·IKßÚ$§Wê ø4toöKžëÊË=w9;\é©9SÖ³µúÁÿ§‹ÌÍ7UÑßgõìBo°Ÿ2dȼNÿüë]ºó¾§ôÚFSE;õ…è#zê7tÇr;ÛŽÑÉóîæuöhìâëÜdvòÜj÷Ül÷ºýcgÓŒx<þ#I*,,ìd÷@Oxê©§´lÙ2]{íµ]®cX!…ƒ¦ÜlZÇËÍT(”éf•Î8ò$f@Á`@¦!yNV[ vXG¦¥` Ó4dHò\Gv6«\±/wÜq‡n¼ñFIR4ý®¤Jrº˜ÜN½v¯½vó:>o?i_w÷øióÔͼ¼ÿ6¥{à;ž“QÊÙi¦2fz®­LÚÞa^Çuä:Êf:è«èÞà„Þß ôø¡7À7½¾Aè ð Bo€oz|ƒÐà„Þß ôø¡7À7½]€|©¨¨èí*À.©­­íí*ø-½¾Aè ð Bo€|É,Ô÷Nÿw½éíŠÀþ‹>½€¤´zî/õ³?¼ uY…JGèÐ nÒæLQ¤·«Ø'½€o¸Ÿ<¬ߺUgþúIÝv`R5+õaà …{»b€}†Ðø†»­FõC§iúè¨LI…•ãuXåöåÉŸÐ/~r·^¯uU0x†¾ü_ßÔiÃ’l­~ê'úÙ_–ª&‘Sr¤®ýáwõÙQA)³Pß¿z©¦Ï±õÀ¯þ¦G|OO|ÿD¹=¡›v·^Ù™¨+õK}a˜¤@Z>øúËSËT—Ÿø5ýð_OÕP«— ìgèÓøF`üIš{D7ÿå mJy;.̼§?üç \ý'=ýôãúýyÛô»Ÿ<¡M®$Y8ù\ýÛÓO>®Ÿû±n½©²­ou¶ÌÕ_¥›|^ó¾¢ 2oëöÿ¸_ÆœÛõôüùš{ïkÖ­1Kj‰'¾ [zRsû©ŽXö+ݽ„N¾`_!ôþQx¸n¼õ{:fóŸõõÏA7þêoú¨¹%ü¶W¼ ……³tɱeÊRÕÉghòÊ×´´Ù“dhÀS4¦Ä”ÖØÃ'ËܶMé\¹îͺn¶ÆµD)ö/êåâÏhÎñU J ””©(—²XkÖù‡¨Ø”«#'[Ú²©Y"x@¡{à+fùT}þÛ¿Óù7¬Ñ ¿ûžnüNJüÕlUÔÕjëÊguã矔!I²•´F누'ÕëíGþ¤û®QܰdÄV«¹bêö Ú¬ÔªímÝú:5–NPygÍ •0r/dš†\ÈöBoàKft´N»þKúû9ÿÔ {¶Ž/-×À‰—éw·~QC:„ÕÍ/Þ¬ï<;ZÿwË¿jBÔPöÕês´_ÃѾì’R7ÔªÎÕöÞ]¬ Ø·èÞøFvÓûz{]LO’Û¬Uó_ÒªiT@ L:U'ÆžÔÝ/oVF’Ü„j>©QÂó”nˆ)[R©Šˆ!e6êù¿½¡æn¶˜x¼Ž©F÷½²U¶$7^«º­¹ / ô¾álù§~ÿÍ têÌãu⩟׿¿4D_ýÁ%cJ Mѵ?¹Tæ_ÕçN?]§žñE}ûÁejö •Ÿz¹.Hß©K>sž.¼ú—ÚxÌÙšÔÝýñ‘#uýf+þ‡+uöi§êŒ‹~¨ç« ½ /è©»m:–ÛÙvŒNžw7¯³Gc_ç&³“çV»çf»×í;›fÄãñIRaaa'»zÂSO=¥eË–éÚk¯ÝiYEEE/Ôv_mmíNóî¸ãÝxã’¤h4ú]Iÿ”ät1¹¬û—\МÍfµxñbÕÕÕé„NИ1c: ¯‹ŠŠTTT¤ªª*vØaZ¿~½Þ{ï=e³YUVVʲ¬¶ð{O¸®+Ïó‰DT\\¬d2©eË–iРA=z4]©ìC„Þ°›Üú×älx ÛuL'µjÀþ'x' -\¸PƒÖ¬Y³Ú–š#FhèСzã7´aà :TÁ`pƒoÓ4%µtu  UPP ††-_¾\&LeY»].vŸÙÛ€þÆ(ž$#z (Þy=*xg2-\¸PãÆÓi§&˲vÄrW&Ó4uì±ÇjĈÚ´i“Çik±½7 ÃP0T$QYY™ÇÑ|°×åb×ÐÒv“ªPpê;]–]òyéš}\#ö¹>¼—,Y¢Áƒ먣ŽÚ«0Ùó¼w·uwg“뺚6mšlÛV"‘ÈKkïÃ0TPP ÒÒRmݺUñxù˺õßNR1ãнÊu]9Ž£÷Þ{O3gÎlëÒ$LÓÔ¤I“ôþûï+‰ìÕ –• …T\\¬µk×jòäÉy)#ôà+Žã(‹©¢¢¢m‰|J$jhh ôú"¯Vÿþ7t÷öN‹‚G|U·ßt¼¢»[¦a¶Ü&oš"ïzW®Ev}}½lÛÖ¨Q£ò¾áÇkùòåJ¥R²,+oÝœHR P$QMM’Éd[·'È?Bo¾cš¦@Þ>”r ÃP P&“Ék¹ò¥PcŽ;Kgv”\»H –7¨bÊ)š6<¨ÀÈ õvõì•\è½aÃ?¾m^¾ :TÛ¶mË{kï\®‰DTWW§aÆå¥\ìŒÐ€ï¸®+×uóÞÒ»}__ú #ª‰g]¡ƒMO5s×êååM>ób]uJ‰ä:²íF­xæ.=ðâ2­ÛÚ,Ôa³®ÐÕ³Æ)šY«çÿôG=¾x­܈*FNѬ«¾¬ÓÊwÜDjå£úñÖ'CÏÓwþóBÐþØWr¡wMM&NœØcŸ4H7nÌk¿Þ9–e)«¡¡Ð»zð•öF=ñáGà ôež\'+×ñ中s\[Ùl¶¥k£P…n\æØ“táY­š÷°^¹ÿ žü3¹æAýyájUμXWŒIhÍòf—µ‹MLCnÍBÝúhUñL}óÛ_ÒĈ+·7vصp2•J©¨¨¨ÇþFF£²m»-ôöðì®ëÊ•'§y³>~sÞ^¸NŽ!Iž¶.¸C÷®,Õ„Ê3‚2e)ÙJFO×™Ÿ;Jã¶| ?ÿýñ…‰ºéÔ*Zû˜aŠD"jjjRQQQl£¹¹Y–e}úŠ{Àó<9ŽCèÝÃøÝ À—zjKZyý•¡Š™Ÿ×yTlÉcúëó›5qΗth¨ei¸8¬ú¥ÓýúƒX’Ò˜“¯Ñå'”k{ÓW®] C.¹V'Šëíûÿ ù›^Ú`ÿd† ÃPii©Ö¯_ßcÛ©©©‘eY=ÒøÍq¥Ói•••å½llGKo¾C7$ÀþÎРY?Ö£çšr³ierpG'ë‹?øƒ.1 yž#ÇötÞC³åeS²½«ôóc¯•ÙÚòÛule³Ž¼§è{œ)ÓÍ*qäEÕõw<®¯®²é }{ûH.ð6MSƒÖ²eËtä‘GöÈvª««‡ÛÌWøíyžlÛV2™ÔÀóR&:Gè À—z*ôÎõ½ oóœŒRb{®ìLZvûyNîUV™t¶³‚”i_ç*›N©“5ô°\è ŒW­Z¥1cÆäuëׯW*•Ryyy[è/¹À»¤¤Dáp˜|¡ѽ ßÉ}hä{ ‹öe€}+z‡Ãa5J¯¿þºlÛÎÛßý¶mëã?V(Ú¡¥w>¸®«L&£¦¦&=šl¡‡zð%úôÀ_r¡·eY>|¸"‘ˆ.\(ÓÜûˆÓ4M½óÎ;J&“*//—eYy ½=ÏS*•RCCƒ¬H$²×e¢{„Þ|'N»®›×‰À€Þ• ½£Ñ¨Æ¯šš-^¼X†aìq oÃ0ôþû﫦¦FEEE*,,ÌÛ@–®ë*™Lª©©I´òÞGèÓ€ï´ÿÐê‰r@ï0 C–eÉóÌK4(þß3z¯Çÿ¬÷¶  ß ÜÞzð=í‹+aש¤ªZ¡Zû÷’²^Rv6%É“e¸*jÉs7Éq]¶©úõåùß Ëüý×½]ºDè À·v7ø¶=[õ©-²œ¬¬ÖA-ÌÜmQ†!ÏËÊu`v]É ÊvèãûwÛzeßx´·«@—½øNnäåݽÉu]Éö$Ó”ç²\CŽáÉõlIžL# y†ÏëšrO®çöÌN}Töµ%ÇîíjÐ%Bo¾Óqtæ]e¸A57„ Z--¼MWᢌlµto0J7‡ä9†!ÇqöB=°@egd¿N+oýYø’çy»ý!vä°SÕ<\’dHz¯f¡ê½·,hiÅâf¥Äº:nøl 6Lò¤¢‚o?]-·ö2"#e üº@ÿç¬^,/ÙØÛÕ€Nµo—›ÚÏÏåFkW¦¹ þC ÀW<Ï“mïÙ­–ÃËFixÙ¨¶×Ÿ4/׆lV®ÙÒ½‰g{ ª@㢠£'t_ÄÙþ å…‘Yr¨ÌA'Ëx¼d†÷¨~@o³?|¥·«Êuu꺮êëëµaÃUWW+™L*•JÉqY–%˲TPP h4ªP(”·ðÛ²,…B!…Ãa•––ª¼¼\‘H$O{‡ÝEè ÀWlÛVuuµjjjdšæ^•µ¥v‹²Ãmy–#O’lGé¦f¥R©ÝkIî$åÖ/’[¿H üVÖ°ÏËr¾dñá€þÅÝ´b×V£Â%(½xCÏVÀ~/×¢ÛqÕÔÔèwޑ뺚4i’=ôPE£Ñ¶ð9™L*™LjË–-Ú¼y³<ÏÓ AƒTXX(Ó4÷:üÎd2Êf³jjjÒ¦M›TXX¨Q£F)ækw±‹½øJaa¡N8á„¶`zol~ÿ}”þXAµôÛµ6Z&LøÔA£dЬaÊkú@^|UKà-Iv£œu’»ù)Yc¾&sà̽ª#°/¹[×îzn¾jß¾ü1ñU°/½Ó/‚°ÆûèW8›£ß>·óõÏ¥6â¼ý:êÔ‹1;"Ü;ŒûâÕuöR…WyÁ»¬¬Œ©S§Ò¡CÎ?ÿ|LÓ¬8~(íÛ·'77—E‹±qãFÚ·oO0<ìÂwùçå­NlÛ&;;›M›6±téRúôéS‘Ÿ¨_RôBˆè‘Û›¹½ëf0+ ³Ó5˜Æâm|oÓ?ð¶ü]¶«÷/Àʪ›XB!„BÔvn° IDAT€.) 1åïø[W¢ 6áïÚ¾‡=òj‚þtï“ÝDÍÆFAt‰§C‡;ˆœr F‹+±6ÿ’è§ë ÷fÂ瞃ûÂÛ$ëS&ªç©¨U?'6uäôAy[ñÌÇŽÿ—XÞõ„ŽíуÇB4måïD"ÁÔ©SéÛ·/ÇwÜ^‹WV—a <˜+V°yóf:wî\ëß\,3`Y:u"//eË–Ñ¿™ñµkx+„¢fŒf—°= ¶À/œ‹³`<:±#ÍÉ !„Bˆ&OûûíJ|ú,ÎÔñVÍÄß¹|ó²ýŸoÔt†¢ÞŸ¼ëÅÑF£E[T¯ñ„Æþ†Ðè 3ù¶þãáÏx't#Á›ž'xê`¨HY£½‹îsA sB45å=¼çÎK‡* Þµ¯wïÞdff’——‡çyµn™ZÎ0 "‘mÛ¶EkÍÚµkëd\qp2Ó[!Ò@eöÂô4îò_¢w/DǶà.¹{ÀÀÎNwzB!„¢ Ñ»·ãÌþ7î×âç¯'tÅ#XƒÏ­8nv?wö¿A)Œv½1ZvB5k5ìÒýÆ2ZtÀÏßP‹l|ü›Ñy 6sX­1šÅð+ Û&ªuþ”{‰96Æ/ø±BÑ©8¾¬¯EBˆÆ¬¼à½mÛ6 9÷ÜsñýýßÐ;œqû÷ïÏÌ™3)--%33³Ö [–SJ‡éر#«V­"77W·¬gRôBˆ4Qv6ö€Çpß,|—­ÃYúSì¿S~ù !„BˆÚÑ»wÿÏop—|ž[±ß[3w¯¢·Õ4Öƒ_VkLÕª TUôîv#á.D¸óq–0+ôœ'ñ.¹ŸP×|dàÏy„DAqÅq²Î pæÕPêBdî¼"P+Ð=o#8ä~âsgC·¶ÕÊ·&tѾõi–öÏ_2š¬}ê\~Þûüâ®±aØ]cv;gÚ?ë(Ú `žô >»`åÁÎ30¨¬£yrš+Pvw:Ô²V­”’…Ñ„H³ò¢÷¦M›èÝ»wÍðÞWëÖ­)..& ¡µ®³¢·R ˲ÈÊÊ¢  €:ÔɸbRôBˆ†ÀŒ`õ÷ë›ÑÎ.¼M/£šÂh>$Ý™ !„BˆÎÛ°ç“gP9í ^øSÊW…4»Cƽ×i,³÷0­½Ú¥¤NoÚ=D§£9äÙFó|çÚqô0AkÏõÐhJWOâÅ'2wm!ºyŸy×^0€æûà²õ‹çxò_ÓÙè´bài}©Ÿòš¢ºÊ‹ÞÛ·o§ÿþõVônÙ²%ùùùø¾_ç1LÓ$33“ÂÂB)z×#y“RÑè93îæ¨æÃøõüØž=%¼2ætžX[û…,RIZcöº7ÙÖDûx+B;…éNK!„B4P:^Fü?¿!ú䕸K¦àLû'þ®ÍõS…²0{ ­×uGã9ŽãàºÐųyîјº)ƒAgð–;˜õêc<õñöý ÚzÇž{öSÖDÛ0dÔ`‚ g±2µ~!,x—½c±™™™ûêz xž·×¾ºRÞÛ;×Ù˜bRôB4&ÎèÏÜŸü†/Ëö>¢‹fò»±çpÑUWqñùWóäœÏøÉ¨[˜o壌ls)/hôΗ¸ä¬'HwÜÈ>³ã¸dî‰xkÿœÞ„„B!DƒäoZBô± “­FtòXû„Ë1rêÖ =ì²zQ¼Moó“+Ç0fÌÆýêCò5DÍ`ÞnƒÎß¹ƒ;¯¿–Û~4–V”¥Óæ²}ŸšVÙò…¬ˆt¾ðN~tã Üy×wé.×Ë ‘VåèX,F ¨·8åEïú˜ém¶m“H$êt\±7ùq-„h4~‡«xüÂg¸éi¼ûðà=û}Ö<÷SÞ?æ>½§,}ˆÑ?]ɯfêâ,¥Û¹a¾œãw*%'ßEçðV Ùé:üüÏÑÑ ø;>Áos6FöqéNK!„B4 ‰)Ç/HÎê6Zw#xù¯1»“’ØÖѧ£²Û¡ ·¦$ÞáªÜÓÛlÛƒšÒÝŸڠU«æxŽ‹nAË øE…ëH¥gk¢%¥øÚ¤MnK<ÇìÖ´6 ~çÒ !eßYÙõC4^RôB4Ç=ÎW_Å/>{™d‰ØcãÚMä-{– ‹°“é<º3/±Œ/–šœuÛ &¿3—/[8~L/j·¬OQVï_à,¸´‡÷ÍCž£þÞÅB!„‹uÜwñw¬Ãê?šÀi7ƒJ]pÃ$xöíÄ^ûYêb†½zzûžçcdgc+Ÿümùød`í`GŒN9dï³N]¤Y†òÉß¾ŸNPOAãê (D“ˆÅbdddÔËøõ9 Û÷}Ç! Ö[ !Eo!DSb´gìã·2iÌ/ø4¢èIçî]éÙÿažß#¾•U["tÏþ/Ínú#ïÛÇñÐÑDzìñgx©¬/× l8?UFÌö—àm~ÛŒ·é_˜¿—î´„B!Daõ;«ß)é‹ì˜sÞÁß²"m9ÚžžÞ• ÕÁA'3¢å,¦|ð*@ð›é,uÃ=r(­Ô¢JÏUDú ¡Op.‹Þ{’?î>šÐê/XíLE"½”R„ÃaJJJˆD"‡~ÂaˆF£˜fýL‹ó}ŸD"!EïzÖp*Æ]ùFÛó±zÜ]ë1…B!DãàïÜHìÅ;ð·, pÊõÎÿ¿4gÕ0¼÷Þ{,^¼˜›nº©Š£v0€‰K"î²_GÃĶ, C¡´ç¹¸®V& á;ÄP¦m™h<×ËÆôbŽWÿ/R±ÏóH$lÚ´‰¥K—2vìØ:ï½­”böìÙD"Ú´iC ¨³YßZkÊÊÊX¹r%ƒ®r1Îgžy† &‘‘q0 ð°ùUÜêJu¥}ûÞ¯¼QÍÇ»=Ô>²¯Î¨7€%Û„BˆÑú4TÆQøÛ>DG7¥9#!„B‘ ÞÊéDŸ¸¬¢àmävÇyuš³j,|œxŒXUoßÃIĉÇbÄâ ×OV[´G"#¶§àÜåˆÇˆÅã8ž—W ÞB¤R Ã0hÙ²%¾ï³nݺý¶¬í–——‡ã8dffÖùLoÇq(,,$++KÚ›Ô3)z !Dƒ¦0»Ü˜¼«=¼ ϧ7!„BQÿ<‡Ø ?DGw` <‹ðß@5ÏMsbB‘^åEï`0H×®]™1cžçÕYÁÛó<Ö¯_O0$ ÕiÑ»¼—÷öíÛéÖ­[ÏP{“¢·B4pFÎPTóAøùŸ¡ËÖ¥7!!„BQ¿L£íQ`ÚÏÿ¡«G¥­¦B”½MÓ¤cÇŽ„B!¦M›†aÔ¾Äi+W®$‘HвeË:íé­µ&²iÓ&rss ‡ÃµSœ½…¢0;–_ʪñ6¿šÖ\„B!Dý ßþ ™ÎÆ>å{PÇ‹¨ !DcV^ôÎÈÈ wïÞlݺ•yóæ¡”:ìÞJ)V¯^MAA™™™D" è“bºïû”••‘——‡iš2Ë;E¤è-„€‘},*«þŽ)èøö4g$„B!êŠûõ83_]©µ2À¥/)!„h ”R˜¦‰eY´iÓ†Þ½{³råJ>ûì3|?ùs´ºÅnH¥—-[F^^@€ÜÜ\,ËÂ4ÍZÍòÖZ“H$(++cãÆh­éׯ_EŽ¢~YéN@!Dõ˜¯Ä]vhË¿1»ý Ý) !„BÔ/ÅýoŒ¶=“຦ ÌCÓ:‹ZG‹‰¿þ3ÜÅŸ$Sjž‹Õï”´åSS~þz¼Ó1ÚtKw*Bˆ#LyáÛ¶m:tè€a¬Y³†·Þz‹aÆѥK—Š¢ö¾³ªË ÙJ)¶mÛÆ¦M›ˆÅb:tè€mÛ‡]ðö}­5®ëâº.»ví"??ŸÜÜ\ºuë†çÉB¸©"Eo!„h$Œ#PáÎèè¼m1;]VfºÓB!„¨{ZSzïñõ&4öa¬ã.¬÷8UñVL#ö¯¡ËŠPá,ŒÜiÉåpèÝÛ){äœô%0ê‘ôÅB¤]yoo˲…BtìØ‘@ À¶mÛ˜5k³gϦgÏžtìØ‘ŒŒ B¡ä•3±XŒh4JAA;vì ‹áº.ÙÙÙ´jÕ ×up§ÆEo­5ŽãH$())¡¸¸˜ÌÌLH$‘‚wŠIÑ[! …Ùá2ÜÕÅÛþ!fûËÒ”B!Ds¿þ %qâýkÐY)o#â­GôÙ›aÏìC£ÓBW?ŽÑ¢cJó¨øO¤;!Ä®rá[)EÛ¶mÉÊÊ"''‡¢¢"¶lÙªU«H$8ŽSÑV¤|6¶ïû„B!²³³ñ}Ÿ¢¢¢ŠÞ‡3ËÛ4M‚Á ¡PˆœœzöìI(Âó<)x§½…¢1ZŸ 럧뻘í/da#!„B4!žC|âïSJæá|ùö‰ãR¯‚›H¼ “À)×8ëv0Ï¿çþö5¸óßOwBQQø.¿5 ƒH$B›6m(--¥´´×u+ŠÎ–eaÛ6dee‡1M³b;Ü‚w¹ÊýÂ}߯˜9.R¯ñüVBF³Í9x›_CÇ6ãÎÅÈ®ÿK…B!RÅ]ô1ºh[Êâ93^ÃqeJ{{›G 'üÃ×P9-;¥,n]qf¼¾ÌZB4 å…êòͲ,,Ë"Ó¢E‹½­,?§¼@T¨÷íý-·zX D!D}2Ú^@ùoë»éMF!„¢Ž93_Oi<Û7x×ÏØ[W{ávJ< ï›/÷:fvØ( Þ81Ü9ï¤; !„ØOùâ–å \Šv#•·`0H À¶m,Ë:ìE+EÃ&3½…¢‘Q¡v9CñwÍÂß5ߎ ¶IwZB!„µ¦Ë ñÖÎKy\oÙg˜®³ñÜ%Spf¼†·bZ¥S1{ ­³é⮚…Ž—¦; !„8 Ê-J4{[ŠÜMŸÌôBˆFÈhûäíãoÿ(½É!„BÔoõ—ii›á.›Zgc9_¾Eì·íUð6ûŒÄuMÅH'oÕÌt§ „Õ¶oë“Úö쇽…¢2rN@Zì)zKï1!„B4~þ–eÕ;±÷‚Çw¬ò:æ §õ¨YÜ­+j^l÷=üm߀çì“Àž³M ëè3ßú2áŸF5kWæù[VTïă|Žj¥¾ÆBѤH{!„8 ºl=:‘¿ÿþøöÔ$  Œ6gâmzÛŠ_´£ùàÔÄB!„¨'~þ†ýwv½‡ÈI )ûg¥«ÛVþÖèX V¿S]ÿ—ŠÓìã/Âl{*»-*«U]fÙ øùë÷ß™ŠÏѾ㎪Á…B4RôBˆÒÅKpÞNºgWmÎÂÛô œí-Eo!„B4 N ¿`3º¬]º ]Zn(Ã߸¤ZC¨cž ”ó$±·>zn¾jß¾ü1‰ò“¬žØWþ5ãÇ8‰‹ ž9J=lÄyë ¼’½ÿ–‹>5e‡Á÷Á²1:öGe¶@…³ÀáoZ†»àÃýrñ6/#ñé³µü 4ºxÿ‰U9Øç(¾ªö¥·`úEÖxý gs4ùDc [.Â{ú~¼œßz4Σwâr¡«š“˜w Áì'Á9x|!„G6)z !DMéÔ÷™¬Š wFeõC/Åß9ºßf8Ýi !„B$ùþæex›–âoY†¿u%þÎÕ.šV‡FAt‰§C‡;ˆœ2–fG¬K®À˜{ñÕŧžŠZõsbS×AN”_ÅX»ó÷šÒàïXW½ж‘øïãuðjš¦ý?GÇ`´¸kó/‰~ºro&|î9¸/¼Ö€¿osgÌv6~»èåqÌÎA\ã8Ô7/ õ1H§V!„‡"Eo!„¨!Õl ö ¿¡c[|N eJr1Ûœ…[¼¼(~Á­ÏLI\!„Bˆªøùëq‚·z6þÚyèxY}GDïÞSD÷âhÃFa` û1ÁâiÄÞË4þŒpN¾‘àMíaçd—×s^â[û~Ž‚-Ú¢ÚŒ'”ëY ç É¢7 üU[±»uÇÌõq§¯ÀÐÓlƒ·`´)z !„8)z !ÄaP™½P™½ÒF«SaíŸÁwðw|"Eo!„B¤œ.)À™ó6î¼÷ðóVW}’R¨¬Víû`´èˆjž‹Ñ<•‘ áf¨@‚<Ž»`R-3òÑ_þˆhÞÕ„.<ƒØëŸ@ë ü)÷slŒ3^$0ð#b_îÚëYÓoÆèØ<íyPZ€_¼J ðwmÁÏ[….)]Å4qÃÄì2ë˜ó0þíb–MPì™ðwnªÅ>þÎÍè¼?›¹ ¬ÖÍbø•>¬zÍL8öj,o ñ­K0F]Žøw‹·§è]Åç@ˆzÇY½z5EEEhÞV—¢qSJѼyszöìI0Lw:M–½…¢1³21²‡âLÇ/œNØÍÓ•B!ŽÞÚù83^Ã]4ÜÄÞ•ÙûDÌ.ƒ0»Ñ¡/*”yÈ1}¡ª¢w· ßpa²ýˆ;ç­¿µC/ü ‰n!xÂJâEg8ój(u!² w^Ñ~Ï1ûž‚ÙeÐÁÇ—âoZ‚÷Íœ=ۗɾ‡·vÞÚy-:`Ÿ8kè%É~àMŒÑ¦{ÕEïjŽ4zΓx—ÜO¨k>2ðç~lºS9bHÑ[!š£ÕhüŸ>~þTÌö—¤;%!„B4vžKâÓgIüï¯à9É}ÊÀ:ö‚gߎÊnW/aͧ¥¼èm>§î³‚ØÇ_„}ì8³Þ 1éÏèÒ]øÛ¾!ú÷ïcŸp9ï܃ „ë.f ©`ë¨á¸Ë>Ow*B¤•½ó=úv‚Œ&Ô¾HԟҨǂoþRôNé¼/„M€‘=4Ùâð ¾8ÄÙB!„ço\LÙ—‘øèOoó¨áDîþ¡±¿©·‚7€}üEµn“Rf—AÔýÀ†‰=â "?ùûäë’û´Æ™ù:ÑǾ‹·v~ÝÇLë„ËÓ‚igêR2¿e‘HŒ°IÈvÒÆEŠÞBQCÚ)ÄY<gÞ¸nîêߥ6)ÃÆÈ–Ìo÷"´S˜ÚøB!„h|Ää§({ò ü­+PÍÚºîIÂ7?‡Ñ¶g½§ ²ZaÕåÌëC°GßX¯ã«pÁïÜCäŽ70r»àïÜHô¯×’˜ôç”÷/¯ V¿“1ZuNw‡EÏâ©\Ëþ<‹âj´ÓÕESøÍUc¸êáO«uþa唂Bq¤‘¢·BÔÞ½]´ÛrÀDAÊó2ZŽÚ“ .˜‘òøB!„hÜtÑ6¢O_ObòSà'k³‡^LäGïc 8-¥¹κ=Ù7ºž™=‡¥ìµ™ðoì‘×$wø‰ÿý…ès· ËÙ„e8çÎtgq`îbž?–+n‰û¬;¨ìÚuîLçö9تc)#Y81 yºŽ²á‹ñûŸÞÆ ×\Í÷ÆßÅýOMdyÉ!*Ù5‰!„¢Z¤§·BÔ‘= #÷<ˆçíwÌ/œ—†Œ’Œœa`Øà;ø;§bäž›¶\„BѸxË>'öÚÏÐ¥»€älëॿÂêjZò1Zt pÚ͸sÿSA”"xÑ}õ7~UìÁ ‚Õû$b¯ý]R€·ü ¢O\Fèš'0:öOm>µ` <«ÿ©øy«ÒJ ¨*ŠÈ¡¾\þ‹ßbø. ·.gÙ{l™ü÷ÿc1Ñæ=8þ¤Xù«XüM!FXJÙB‘jRôBˆš2CX=ÿ¯ÊCÎÜ1èøö'´‡Áh~,þ®YøEóÁ+3#=¹!„¢qð=“ž$1åï “³QÍÞ'û*«eZS œq 3nIkõÅìs‘;ß"öÒxë¿Æ/ØLÙŸ¯"4æA¬!ç¥;½êQŠÐ÷þœ¾øï½wXOÓEóÀ­O³´ÿxþú“ÑdîžÂ÷>GééWpÔÆÉL]Q­pþÍ·qQßÌýž[ý=ø&Ú_ÄÏ~~9½Ë Úñ…¼÷öbJ#ƒÿÛ{9£µÊÀsbh MéêI¼øâDæ®-D7ïÂà3¯àÚ Ð|ÿ,|îî)<|ëóè«îeäú—ù×LÍY¿~ˆ‹;É…üBQ™üTBˆ&¤¢Å‰ïàïšÞd„BÑ é²B¢Ï'ñÉ3ïÀyw¾ñé´¼ªy.ἄ}â¸ä7Nì•{H|øD£ìóÝhìÛJD¸¬þè]Öv:—q&²íkþýÂd6Uþ4 ûTþúø¿ù&k$·ýø úVšÁímXÊòÝt#r<ÇÁIÄñµBºx6Ï=úS7e0è¬sÖr³^}Œ§>ÞξÍOzîž|—¿þ[þ>«˜–=zÓ±¹Ì$Bˆ}ÉLo!„hBŒ#@ }üü©­ÒsI²B!6ó2b/þ¿`3lgºæ˜ÝŽMsfGÓ"xѽûë~p$>y?o5Á+E#éÎðˆa¶?ƒ®?Ÿnúh gÍçÍí[ÙæAGŠÍLüã‡ÌŽõaÜã9!ÛÇ«T­Öe¥”jEfv3Ì*ZxGÍ`ÞnƒÎ—ßÁc:c´cç-ϰtÚ\¶Ôð\cæŽÇÿ“[(<ÇÙ+!„2Ó[!š»9F³ø…_‚OsBB!„hhܹÿ¡ìÉ++ Þf×!D&¼)ï4²¿ˆðøçQ™-p—L!úçqè][ҜّÃhÝšlÏÅó,‚AþÞUdçë÷yMÙ´Î4ö+2«p¥)-Þ»ßèšÒÝŸڠU«æxŽ‹nAË øE…뚟kuÂÑ™.‰„¼SIk]± q8äk(u¤è-„MŒj92yÇ‹¦uaM!„B40n‚øÛ{ígà&ß·‡!|Ë ¨æ¹iNN˜]!2áMŒö½ð·® ì—ã­ŸæÌŽÆž» Ó IDAT¶'û5Ù³/k —]u2­‹fòü³Ÿ“¿ÏiF§žôCtá4æìÚw EVv6¶òÉß–è¢숃‘C¶:ŒsÕRõJ –¢¶äk(u¤½‰B41FË‘xkþ hü_$[ž!„∦ ·{iÞ†E¨@ˆà%¿Â:ö‚4g&*SÙíßú/â¯þwñÇè’¢O_Oð‚Ÿ`›îô]¼˜‰/<¿§PlÒiÔXNosxcYÝNäì ‡Ò+o}üOžý¤/÷œž[1“PEŽå¼³;3çíÙüíg÷1{`gBÑílØÙëGŸA'3¢å,¦|ð*@ð›é,uÃ=r(­Ô¢½bkp®H-)VŠÚ’¯ŸÔ‘™ÞBÑĨ@kTFwü‚²’Bq„sBÙãW¼–ßöм(ŒºöN¿”ª˜¡ó3ôEõ貵̞<‰I“&1iÒÿøj‹[‹ÉÑ>¾âè«nâÔÖ¥|ýÊß™¼Õ«Ìâ¨1¿àÞq#énçñÕ_0wE!Ý»ÑRŠ áúŸÝÂ]ã,þx³wä0ìŠ{øáé­ö‹T“sEjÉ,]Q[ò5”:õµÄï¾ãVGUqÿ`ûªºUÕ|\¾UÜ7+Ý7*=®|[ÕvRii郑ˆ,."DCàû>ÅÅ%¸îþ]ôö¥µ&##ƒp8T§98sÇ ãÛ1rNÀê÷pŽ]ÞÆ—ñ6<€}ôŸPÍŽN[.B!DCåo_ƒ3ýÌîÇQÿ™G CE²ë|ÜjsÄ'þgú¿`Ï?×Vß“ ^ù[T¸YúòÕæ~ýñ7îC'b¾æ TNû4g–ä­_€ûõ‡˜]‡¤<öëã,^¼˜›nº©Š£v0€¹Ï·µïÄIø á;ÄZ™{?Fa‚X†‡sðö=® ì@Sù8ñÄ>ý´†ea™†R 5¾ïâ8^²Øn˜Ø–…a(”öñ<×õ«È¡†çŠ”˜>}:'œpBE±rÝçsLï¬4g%“ù+ŠézîD”RÌš5‹OqF»^uÚ[5HÍ•B4$ÙÙÙäååÑ®];)VŠZÑZ³uëV²³kwõ¹88)z !šMŻ쩸\H)Õ(.é4rFàïœÚÅß5£Õ)éNI!„H+oÕìÔÇ\¿Ý]«ý‚M¸_€;û-ü÷:fvLàü»1»[ÛTE#cäö |ãÓx˧ÿ·øÛ¾À™õ&ά71{Ã>«ÿ©`ª?°Öp€¢^:¾‡„hŽ:ê(V­ZÅœ9s¤E…¨¥ÙÙÙuÔQéN¥I“¢·¢IÐ@4ƒµQJá¸nJbÕ†j10¿`†½…Bñ¼-Ëël,uÌ„rž$úÉ7?Ñ÷ðóVÕ¬(í{xá-ÿoÅ4¼‹÷~Ã]X}NÂ>qfŸ‘‡÷D“aö9‰H¯á¸_@â‹—ñ7.À[=oõlT8 ³×‰XƒÎÆì9 i~À±üüõ8ŸýƒàE÷‚2À0÷>¾eY½¾!*Û¶0`€ÌòuBÚãÔ?)z !9Mþæe”å¯ak‘µga‘úªÄAo;f»žDšµ®ÿ ‡AÙÙ¨¬Þèâeø»f'û}*#Ýi !„i£wnاÕû»ÿ‡•EûT$ûÑ/qŠ/"4|1±‰ók×ÏßpÀ¢·ŽîFï܈Ÿ· oë*ü ñ7/©²…„Êl=ôR¬.ÃhÑ¡Öy‰&Ä0±ŽùÖ1ßÁ[÷Î/ã.þ<-Æ]ðî‚@­º`ö8£C_Œv½0ZwEeä$lj•àÌzoÃBÂß{2ÙÜ´+Âì{¥Á·,ŒÑÿG §çý§ðœJ‡ö½J²‘\5)ľ¤H)Dã!Eo!D£¦µfǺy´kÕ%ù·sjƒãy%l]Þ`‹ÞFÎ xÅËÀÝ.^‚jvtºSB!RF—îÂ߸]²]Vˆ¿cÝþ'uº ;üÑ>Lþ-Ñâ$ìöý°Ž¿³óqÖ*ôÈÛàß7àäû¨þêþ±Í{žŒ}é-˜~„5ÞG¿ÂÙÝ+DüI|øÄž7Ÿ5ʰо.ÙÉÞÕÁý©H6f¿S°œ†ÕgdÍÚTˆ#’Ùuf×!è¢m¸_ˆ»pÞ†…ÉB³öñw¬Åß±vï'YAB—þ•“|3Åß²œ²Ç."8æ¡d{e€RèÒ]U ÄΘM|á@G·Ä›¿5ä„¢pÞøþÑ•O\Œyá ÎNȈàO}Î<ïéûñrn |ëÑ8މ˄®jNb’EàŒAPêA`#¬­: !„¤è-„hì4Ø–­˜fªg0+bN<ðå¡ Ñò$¼ ÿÀß5 SŠÞB!š2ßÃ[1 wÑÿðÖ¿}í¡g”n™ˆÃÝ„ÆôÁ]³íœÅ»!1;>‘Ä’¯Pe„Ží…3i3æÀŽxŸ/„¶ cØX›IôÓu{3ásÏÁ}áí½Ã&¢èÄ·…ðƒe¤‚Œ¶Gaö;ó¨á˜ûï×bBˆêPÍs±O¾ûäëÐÅùx«f⮜‰¿þküüõ{o¸ñäÕ‰²Š]:VBì¥ /ü)öIW%wzUµø3PCNC/û5zmú² 0¾þ¾#>²W?I~ÍW<þuò ˜î%úùFhu=áK{ãnéŒÙÎÆo×½<ŽÙ9ˆk‡úæ%èñKÔªŸ›ºrúÀ€këñ#'„¢±“¢·¢qS`Ø!|7¡ìCŸ_—¡•ëÆ #)[S*ÒlƒŽoÇ/˜ŽÙåûéNI!„¨sº8gÖ8³ßBn­Ù“ã‹q^þN¤3fçÁ˜£ÿHÀyžXEëb^ô.ú¦ 0g.ÁÊøŒDž·§èm¢Z´EµO(ײ@Ï©U÷/Ã[¿oË ÌU³0{ÀpF›î‡7 €ÊjUÑþ@ÇŠñ7/Ãß¾çztþŒVÑe…•žd`ŸtÖÐK’W$˜vrÛ÷ê³öqý1 Ch¸Bµê€êö*q|tÁ¦Joò”?60Zd£WnKî.܄΂?}+v·î˜¹>îôXúcšmð¬ÁßñÎÉ7¼©=ìœ Ûëû#&„¢1“¢·¢QS(L;ŒïEÁJíLo­5n"†ÈHiÜÃa´Ž·õ]tÙztl *Ô>Ý) !„uÃsH|þÎ'O£ãe{2ÚõÂìv,FûÞm{¢"ÙÄßþ5ÞêÙ•ÎR¨^×cÛI,Ù€·|ÞEhü0ŒåÉãD§âløöyañ¯ñýò#zçftÞˆÍÜVkŒf1ömûj »„À‰WâïÜŒ.)Àß¶ ûZüÍË’Eƪ*äN¬b!ÂÄÀhÓëøïb1*³E}Å‘I…²0{ Åì1ôÛÚÇ™û.üþ }£]¯ŠÖ&F«ÎøÛö^¼Uõ‹±è.¢Ÿíé9’=†Ð¹§¡–îÿ¥|ì£ v¡Zå!§3ªxþ7…péÕXÞâ[—`Œº+ð îPí3ð§ÜḴ1Îx¨¢?¿B±‡½…š¬@?Z‚ö½”ÆVJã{.V œÒ¸‡Cµ8 ¶&ÿñwÍÂlwqš3B!jÏ[9ƒøÛàç[üRÍs±‡]Š=ôTvÛýžcäöܧè­Ñ[ÁwCø„2´£!àãOú-ÞŽQèso#8ä~â_­Ã›;›àÝH¼»}¯çûsžÄ»ä~B]ó!?çÅ{Å5s{b´ï‹Ñ¾ï~9é²B¼¥Ÿá.ž‚»|*¸‰*_¯¿} ‰ÿ>NbÒŸ±ž‰=b,f×cjô1â ´Z8û‡Ný>É~${·Ö1ZvÚ¯èmh‹÷Öúow}†z«Y!Uóñ¿üÞ¥?#4fdظ=€Ž†ðìû°ó^F»ëñã¿ îiTÖμJ]ˆ,ƒÕ â‰Bˆô‘¢·¢QSJaÚ!œüÔ¶7Ñ <ÏÅ „R÷pÍ/Š.˜ RôBјù‰ÿý…ÄÇO'‹t€jÖšÀéã±O¸ü ý¯6]÷ßYò%‰~YÅÙ¯{üõJO6Ð ÞÄ+KN]Õó'PÞ¥;ñÏñMÙhÛó€ÇT$ë¸ïb÷]tYÎŒWqf½.Ìûöœp3pch'nwþDÜù1Ú÷!pöíXýF4¾Õ¢L졃ïðûHµî|¶×>ç™÷>IoÃyþúä±Êû¿¾»â{†è</ÏÛgôbœç†W<Ç}ãTÊ;ˆë¥[ZéÔQTã !„8R¥zÕ7!„¨sv ‚ï¹hßKé†öð}Ënø3½1lŒìcð‹¾¯4Í !„‡G—}æFÿûkEÁÛ>†È?ÄqÅ!|4»Q˜'=JøŒ ÎÇ3ºe• £Sõ’V‘æNOÆO'¼øç`ÐÑÝh×Áê{2f·c+Î÷·,'öü­DŸº oÝW5ÍLˆ½)’ýGŒϳz=à1!„¢¡¢·¢Ñ³|ßKþãë{©Ù´‡ï9 LL+îAµ-F$ïhלô&#„B]œOô/×V´'QY­ÿÁK~‰ªæÂÒF»^¨ìv5ŒœÀ›vÑgÆÝíúô}˜]'gj×èI6öˆ+ÈøÕÔd1@kÜeŸƒï¾é9¬Áç$¼µó‰þy±܆¿scs"IUôî>³ç0°þ•ŽB!ŽlRôB4zV Œ·§è­µ—šÍ÷ðÜ8f uˆ  •3œòûþ®YéMF!„¨!½k ѧ®ÆÏ[€Ñº‘»ÞNàjÈ:úŒºNïàñŸsØÏU¡,‚ÿœðMÏVë½õ ˆ½ò#ìQ×¹g"Öó’ î’)D»çó’oÔ Q×ìVŸ‘éÎB!„8()z !=ÓíY>E³¼÷Ìôv8v¨ñ, £ìlTVo`OÑ[×|¦šB‘º¤€èß¾‡ŸŸ\(Ïê{2‘»ÞBeµ:¬ñì.?älÖº¢ÂYXÇ}·Ö㘽F¹ë-¬¾£€äÇ$ö·ëÐÛ×÷;"ÞÄì:$y,#þþ£Dÿ|%~ÞêZÇb_ö —¥;!„â ¤è-„hô,;„Ö íû ÝÔl¾‹vØ¡¬t¿ü1rNHÞqŠÐÅKÒ›ŒBQNŒØó?¨hÙa 8ÐuªU{#·;fï“ê*òOºªÚ­WEE² ]ÿ£o@'¢Dÿqî×btèKø¶÷;T$oÃ"ÊþpIrÖ·®q'r!ÈìuâAgB!ÒMŠÞBˆFÏ´he&Û›¤j!KíáynãXIJ£å·ÿàK‹!„ žïûçÿámX€ÕÿTB×|wÉ ¹eðÊGÁ0ëdl£}o£oÄ]9½NÆ«Jàô›ël–÷¾ìÇ¡BYÄ^¿wOáûG„¬VÿѨÌ„®ú=îÑgëWè²"ÜeŸã=~1¡+Åìq|½ä$Ž,V¿S°¿oëÊt§²?w1ÏÝö “wAÎIwñ»Û†’¥÷+þ:þ·LïÏß9œC-Gïmù’ÿη8áÜch#S…¢Q‘¢·¢I°ÃÍpvmÆRRóFïûXªgzëÒU¸ß<†2‚`ç BíPÁv¨pG°ÒÛÅh1oë»è²µèè¦dNB!Dã-›Jâ³çP៮óràÜ ÎP§c¦’uì}øë÷‚çÿ×ݨñ/`v˜<>è,Ì.‰ýóGxëæ£‹¶}úz‚çÞ…}òu)ëk.š®à˜‡Òü½÷rÐÀØ3¦pæë¼Î®ìi PÕºÊÃaåä—ymö`zœ-Eo!„hl¤è-„hô´Öø*„ç$¢ÿß\×GU_^­;Ñy«8¢P‘Ψ¬~Íbä »yý&ºo-FÂÖwð ¦av›ÒøB!Ä¡èÂFIäA®ïx3±ËíÏw®E§–½È(ù’g{‰æ.ýþ0¼é¯òÎÓOÕáÆöòŠB4$òSYÑè†A›Ž½‰dw £uý÷7±,‹H$B$Rõì(#ûx¬~ƒC'òÑñ­èÒ5èØ&ôî%貵ɵ_4¿h>¬{³Í9í/Aëq6›²0Z Çß>]¼ÈGZÕ_¦OÉô7˜WdÒuÌ8¾;²=ºëæüôæµ…Ëzt¦nVBQ¤è-„hlÛ&;;;%ïr†QÆ~fî˜ì›]iÑ(w7þ®9ø;§âg_ Þ–7ñ¶þ³Ýw0;^ vvýäÞrþöÉ€Æßùf»‹ê%ŽBQºh‰ÿþÊ"tõãÒwºº”"t͈þq þö58sÞÆè:{Ø¥{f´ìDäöWˆýûW¸óÞCÇJˆ½xÑß'pöíu¶P¨ ƒÆo9š+Ïùˆûþ3‰×>Í¥­õí±ÒÝŸڠU«æxŽ‹nAË øE…ìvýŠ¥‚´çá)MIQŽvYóÚÝ\ùZù8­JJSþÊ„Bœ½…M†R ÕXþ1¶ša´> £õià•áoŸŒ·õtthoËÛxÛ>ÂìrÞ‚tݾ.#û¸d+/†Þ9 ¤è-„¢ˆ¿u?:V@à‚{¤w ©`¡kÿHô—£Qâï<„Ù±F‡~{Ÿh‡]ñNçÄß{<—Ä”gðÖÎ#tͨ¬–éyBÔ “Œeħ¿gúÞg§_¾_‘•­|ò·åã“Q´ƒq0:åm( ´Æßs~fv3,eÑåÂ{¸iDöž¿ÐV³\dK!„hXäç²B¤›Áh÷]ìc^Àêó+T¤kr¿W†·æIœ…·¡ËÖ×mL#ˆ‘=÷pw×íøB!D yË>Ç]úf·c±¿8½ 5RFn‚—=|àÆ‰½t':Z\å¹ö‰W¾åT³6xkçQöøEíe„h*tÆñ\~Q_ìÝ›Ù\üí•¡ÁA'3¢¥fÃOñ§^â¯Oü›¥n˜þ#‡ÒÊlFv3»çñî‹ÿâå·¾¤äè“9!ÛcíçïòÙ•¬\úÓ'ý¥vOQBQ[2Ó[! …ÑòdŒ'á彋·áEpw£‹—â,ÕãþŸ½ûªÊÿ8þ>÷Þ™LBB %z/"EAlˆ‹ˆ (*Š\E°×]]uU°¬®+®¬®Ë*?»¬ `¤÷– „R§Ü{Ïï ¡$„†$ß×óÌ“;wî9÷s‡dH¾sæ£é¹Õv6£Ñá©U´ƒ›=£éyÕÖ·BQ%vÀ'o›Q—>"Óš«Ï0<›š÷nVé“ð]õT¹ÇšmO æ®ñOûΆ…èü]¿|=Þ³ÆárkD§;q37øø ¬.§ƒ·æûÞCE5Àê3ì¨OZ“|ö• ùê!fl߻ؼŠéÃunœúó¾ý ;¶ý¯¸†ë7­0r(¿üç+VΙÅÎ~­8¯Á™\ÿÀÍøÞ˜ÎOï½N!>wÀhŸ¼^ !ı¦¦^™ì·¼ó¨r¶+ÚWÞWUÉû{nF9Ûæ>ÛÆ>÷÷ýZÞíôÂÂÂGƒ.d'„¨B¿^†ìÄH<9¼åС\œ ÏàfýXºÏhz.V‡»ÁðiTp οt#éT¬nyŸB!ÄaÎ~…à“ð ¼–¨óï‰p¢:À Q4y$nÆz|cžÅê9äàÇ»Áo_$øí‹à†‹‚F³Nø®þ'F³ŽG#q™<÷ôÏ[ÂwÝóXÝÿ±ó‹CûôÓOY¾|9ãÇ/çQO”S‡’¹¹Kö)À á•¿ ea ¥]ÇÆ.™Ï[…¡@;!‚!½ïñ€vìPçè--$„¨ã^~ùeî¼óN4hððàäæ–óUïs_ï³ïÀí}oTò~E_µ öUû«¨Lo"„Ç(åIÀê:«Ó}`FàîœIhÅŸ ´ûÈO`6ÀHèî7÷WpмO!„¢ŠtÑnB³§ b“ðž}S„Õ¦ßÕÏ€å 0}"º ûàÇ&Þ!·=~jé\ênÆ:Š&$øÍ àØG#u©Ð¼wŽêùüüŸ¥ÅQ¹„~ü¥ï}öùý{ Þ®C( à÷ã í»€¥k,i•ôµïñ~? ¼…âX$Eo!„8ÆMÏÁÓëE”7¼¨”Î[FhéÍè@Æ‘÷Ýh@xà âæÌ?âþ„Bˆª }÷:ÚžsÚ{öÍ(_l„ÕF³ŽxϽ]MàÇÙÆìØŸ˜»>ÂêuNx‡"øÕ¿Ãs}¯?:¿+è@Á¯þ}TÎu0îŽØË¾‰h!„B>)z !D- ¢[ãéó:*¾Ú¿{Ùèâ´#ë7étöüWàîš}¤1…Bˆ*ÑÙ„æNÀhÔ ÏÉ£"œ¨îñžq fÛð'»ìåßb/úìmTl¾Ñ“ñýqJéOß" IDAT"—îŽ ¿x-þ7nÃݱ¡F3Û‹>CG~‘íмw#A!„‡IŠÞBˆ: Àúîãâ³qîðó>d0#n{%ùuìs†VžãžÆht:°3\øöo;ì.•'#¾'nÎB™âD!ÄQüîUt òÆ´"œ¨2L¢.å O•øßcè¼ÌJ5µzœEÌ=Ÿá9i$¨ðŸŽöòYýóBï?€›¹¹F"‡|T#ýV•³a:7=Ò1„Bq¤è-„¨õ‚ 'qåd÷NŸÅÌŸ1ãëOy´Ý;ŒþóLÒÞ¼ˆžçßÅ_î»›k‡žÃ-Ó·áìþ™\~]}5Í”E…¾{}GÝσ÷ßøaƒ¹qz:n„¯­ eauy#ù<t({ùÝè`åþx-Ñø¬ð†ëÇÍžW)…BˆCÒy™„æ†çm6š´Ã:ax„Õ]Fã6xϽ]œGàãÇ+ÝVEÇ5j1w~€Ùå´ðN×!´`:EOÅÿú­8«]=¿5éÝ;p·®¨–¾ªƒ½fn¤#!„â0HÑ[QË9¬ùòk’®º‰þñªd_ Çßp=¾ÿŒßµbwã³øÛߟáÕ—ÎgíäiÌyå¯|v¿øpÚ4>xª+<ò;4(¥ÉIÈ„ÇþÁ&ÌoÎ%Ñk;e`u¼£ÉÙ@Ɉï÷SxXÝ€ ¬swͪ¶˜B!DE‚³_ï›Á0#œ¨nó ¸zï4'K¿Â^QµiÍŒ݈÷ Ñ7¼†ÑªGé~{ÅlЧާèïçœõòŒv6,}ì|ZÏYýc¤#!„â0HÑ[Q'¸®Ëþi´200hÖ¦5Q€Ñ4…¦9é¬Ú´•Œ¯eìÿÈØ'Åcä±Ó0hœÒ  ¼>þ 3¿æ[g°}Õfzþù-Îp*óoÏ¥ó’‰)ȧùµÏò÷vñ‘¾ŒÃcDáéþ8¡¥·£‹6âfÏÃÙü"f»›«ÖMÒi`øÀõãìš…Ñ|D BQßé‚lB¿~„çš¶Ž?;‰êïYã±—ÎÄݱ‘ÐÏïa0¼tÚ“Ãa$µÀ;ôN¼CnÆ^;gù,ì•sÐÙ¥Ç8›ãl^\¦­ŠOFÅ$€åňo ¦^†‹^»cØxÌ×§ì_ƒŽé‡wäXŒP4ˆÁýîa‚»N"êò+PYѺ5°>|¬¯7žKnÂtwC´Æ™ù0¶yQCzA¡Þ4B=‹S°OAÞup³·b4iwØÏ‘B!Ž>)z !ê€(:Žü;,ûH>Š„Óoá™û»³w¦ÐfÜ÷îçe޹ì]æï¹Óãæ½_3i«Ù«û„~ vÎöP±1š ©B1NÃÍœ…Î[Ž.ÞŠŠnYs™…BÔ[¡Ÿ¦íËûÜÛA©C´ÕÊòuÉ#¿0´Kàƒ‰¹û¥ÓžI¿V÷3±ºŸI”vqÓ×ᬟ³ñWœm+Ñ9ÛË4Ñ»w„G}nZE+ÈûŒàŠQD 9ÿ{¦@10ú݆™z?Åß§Aã눾äB¬uC0–ßMñܨ^OÓ³äØþwam{ˆâ9›!ù¢‡ÃM„Z÷ þ6CbWT9˜Ó9 Eo!„¢V‘¢·BÔ*ª)žãþAhÙà±×OÆÝÛ¹Ò}MÏÅÍœhÜ31Û\_s…BÔO!?¡Ÿß@%4ÇêY…7hEµ1ÛˆçäQ„~~wÇF‚³§â=û¦ê;20Rº`¤tÁsÆtÑnÜŒu¸Yiè¬4Üìmè¢\ta.墅àØá¯ny«ªhÜEOºòI¼î+YwÅ@%% ×† çänEÇžˆŠC§ç½µd&•Ô ÕôF|É.z!ú牄\OÔøÈúšàŒræ—7f„BˆZGŠÞBˆ:-éG‰ŠíŠÕá.ìuO‚ëÇ^ý ž^/'¡Rí„QQMѸ™ß`¶ ÈyB!ªOháÇè¼Fƒa¢…¨)Þawc¯˜ƒÎÛIpÖKX½ÎÁhÚ¾ÆÎ§bâ1Û÷Ålß·Âã=RúÆHz'ö§ï`]}fHã⢳sP“4HlÊOÃÍï…•˜ìD5n‹R«µ 1ÿÏ;Àj‚Ñ0ˆnÔwöýøCŒ³ÿ‹·çLü röÏÞ r¿K !„âØ!+Æ!Db4=3%<Ï‹ì$´æá*,l©0šžSÚÖÍý­fB !„¨Ÿ´Kè‡7PÑqX'ŠlžzNù∺øð;Hàƒ‡º¸äѤµªø€üoü 0Û{wÁs8­'à»ìq|çwÁžù ίoâö~ßñ¶5ÑZ…]8§Ã#ø®xßU°šECÜÙxÇ<ƒïòÇð¶Z…½~wÙL±käZ…BQsd¤·BÔ1fÛ›p Ö„çæÞ½'õµJOUb4='m q3>ÅH¨x4–BQYöÊïpw¥`õ¿áDÂê1«ÇYØËgálúÐüðDøÍˆrG›oþÅ›÷ÜÑè÷S4aÏýß¾uàõ_xþ‹²ý/&8íÆv>…åÁó¨ÄTt\%’‹cIãÆòF…¢vصkW¤#ÔY2Ò[!êebuˆò6ÀÙú6n΂Ê5õ¥`Ä÷ÀÍþ̪±˜B!ê—Ðì©á ÓƒwÀ˜È†¥¢.zå u?Qº°d¤˜íOóØ›e¶îéB!„8 RôBˆ:Hy±:?Ê4öºÇÑ•jk4ÞÐ!ÜŸ×\H!„õ†³e Ζß°ú EÅ'G8‘ØCÅ'ãzWøŽÀÿÁß":͉òÅa¶;1bç?uÜ HGB!Äa¢·BÔQ*¾fëëÂwB»±×Nm²‘tZé(qwÇç šŒ)„¢ýøfé¶Œò>öxN¹ ³cœÕ?ZðQDóXÇŸÑóï¡¢b0»Œt  ÁøÛ¿2+Xå†Ìžp]冑Q…ët3fñÄG0ü¢1<6+“ÒUƒû¹Bˆš%Eo!„¨ÃÌ–Wb$ž€Î[޳eê¡)£Ùùá6¸Ùój2¢Bˆ:Nçeb/û³ÃI-ºE8‘(C)¢F=ŠŠj@ðÓ'q³·E,ŽuÂùÇÄœïV¿‹K§~µŒ»žWÆ\ÍKkeðFõ°YñÞ‹¬:íŸüoúTþÔ?箼“ééîǹìXð«Šó4þ¹<6êA¾Í‹ü¢ºBˆÚOŠÞBQ§)¬NöÎï½íýJ±äá Ì’6ïÕhB!„u[è—÷Á à9õЧc$µÀ{Á½è@!÷ˆØ4'*:ë¤K"rîRVž3®‰l!Ž6éÛvÓ¶Kk<Ê‹¯A.øÓõœÞ䀒’»o^ý•…‡ùÚÕƒKjbÕ‘GBÔ{RôBˆºÎÕõPÂó{ÿȨ°‰ò6Âh|&::eÍçBQ÷8¡pÑP ͰŽá@¢"ž“.Áì:gý|B?ü7bY¼gGùb#wþ?\‡‘Ô"bçÕ(øšÀË/?Èí7ßÄõW_Á¸Ç¿fkÉ ð¢µ3éº 9wÈÎqïm:`ôrÁüé¼‰Ì •vÈ„ÙA@³{ÑkÜ=j8Ã/¾”1÷¼Á ¿—=%Ûâu3ñÚ vþŒ÷ßl QF`ŸNºŽ‘#F0âü\qÏlpÕÞfã§?êB.1”óG?Äg›C¥×ûȘgùöÛ§;|ç>ôþŠ®Ó °æÝû¹ö’ ;ocŸü–íû×ÙÌõaÞX”ÇÜÉ×1æö7XXÃGþ‡sô~Çý4åaÞ^¾„7nØ[_c™]Á5”—3´„iþËbûPÿnŬýð®»ê®½ü@û†!V¾p-~{çNèp2>gêw7ðÈ»ßÒ%Ö€àïL>ØuúeaÑ¿yîýLj ¬ä…ñ÷òƯg0¡¿7P%Ñìß³z1?_ð ð‚½ˆ2ËÝ«$N¿åvÿø mž›ÂÈ& ‚Ëxî`×PnÎ*õïv_ëO™ü~7¾ö'5ÈgöCc™uÆnè)%.!Ä^òŠ „õ„™r :o)nÖOè‚Õ8›žÇlÇAW :`$öÃÍY€›5]œŠŠn} !„¨íB?M o˜<§\Ù0¢RT|2Q?ˆÿÿîÀÿæDßù!*úèÏmíéwž~õóŠ:Ès7†~nªC…×à+›³¬òÿÝŒViµe¿fŸÇv±di.†7—ù{…û‘¢·BÔ'V,V—‡ -»\?ö†ÉxbÚ b»”{¸ß׿w×wèVcd´·BˆJ þøVé¶çÔ+#˜DލÅI[Ž›¶{Ål‚ß½Š÷×G:–‡­¼·lŒ† Äåî"Û…ƒ 6Æ00´Þ[PÆO~A  ã‰ÍË!wO{]DAÉ"ŽFBº]Ãóÿ¹œæVcM÷¹”{§ŒäƕӘpï|öú¿8¿‚ö³ÿÉ„¯ÚñÌs¦kEhÞ$F|¸ÿÕî{½_§ª±ÑÑ>Áʻܷ¦Ã¹õ¼Ï¸ãúq|Ø<Ž&'ßÇTKf!DÝ!o„ !D•iÜ_âly¹ÌMvF:Ü!©ØÎXî ßqýØ«„PîA7[_ÞÐΖ׎BB!„µ.ÌÁ^2³M/ÌÖÇG8‘¨2ÓCô˜gQ1 ¿üÎúù%Dõ²ºÁÉ93ø¿¹™Ø€[¸‹ì¢F9{“i½‰µiቾô9ÌZÞ¶ºžFßÌ/™¾4 ¯ÿ”/–„j´ºæÌÝŸðÆéáú®[ÄÎÔؽ³s#smÀ a›î´i`rtí5ÜÝ„6¥q´‚à6¾ýbGzÕÁˆ¥at›ÓüUzªÌÙÌœï¹iêTžþY}‰{ªã•¼÷øsÌÎp+ìBQ÷IÑ[!ªÈÍ™½þ)œ­ï”¹ÕFÓ!˜)— ƒ™„V?ºü{Œ„¾ñ'àfý€.XsÔr !„¨Bó?„P¸èá9õЧ‡K%¦à»òÉð´&®ƒÿ¿·ãîJt,!ªOt?n~ôb _¹Ž¡gæœ+'ñíŽ*²V/®¼­;¿LÃØoæöÉ[è|jÉT1§p˃ÙøØå »à"®›’É[„óödüã£1Þ¹…C†0øœËùË»Ë)8°è½ý[ž¸ö|Î;#F?GÎ…·2,Ù¨ ½"ið¹$ðW¿ˆQ×OfÛÉCé^Ñçø+sÕÁhÇÐ+{°ðþ‹¹pÌs,T•{ª.†&‰Ky|ø@Îüà ½ŒÛŸŸK¦ :°¥?ýÂÚì¸>!D­RSŸb9°ßòΣÊÙ®h_y_U%ïï¹ål›ûlûÜß÷ky·Ó ˆ‰‰)çò„u•.N%´äfp zŒ‘x2V÷'ŽbªÃ ]ì•÷àæ.Àhr6Vç¿RÞK¶Î_Ehé-€ÆˆïÕcòÑÍ*„¢öp ‚ÎMG5lBƒû¿ÓéTâ¿ú7Áo^ÀhÜšè[ßFÅ&E8•¨ï>ýôS–/_ÎøñãË<Ö¸qã$GG€ÅÏŽãõ¤û˜xE7<š`öþuÓ $=ñcÛËØNQ»ìÚµ«Ì¾—_~™;ï¼€ <ü8¹¹å|ÕûÜ×ûì;p{ß•¼_Ñ×Cí£‚}ÕþN•Ìé-„U¤¢[ã=éàú+8¨¼¼*«óƒ„–Ü„dàf~ƒÕ³Í¸²‡ÆuÃht:nÖ¸»ÇÍú£Ñ-„âXg¯œƒÎMÀÓÿ)x×Þ!·àf¥b/š»+•âçG}û»¨è¸HGBÔ7º˜­©ù4>±ñžð˜FÜÍn'‰Îq²Ø®b¯ZP•Bˆcá ßj;OV÷¿c/¿ÊÅÙú6xK§>Ù—Ùfé"„b¡§…7LžS.lQ=”ÂwÙcçe⬟›¹‰â—¯'ú†©(_;-K¼sVÏ!pŒØ=½‡¢S"CˆºO%pÖø+Yøñ\ù’rp£Z2àŽ¿0¬‰½…{IÑ[!ê9Ó«Ûã„–ß ®gÓ (OF“ÁûݳåU8©¯£ƒ»pR_Ãlwk„R !„8¹ëq6,Àêqªa“'ÕÆôà»öyü¯ŒÇÙ¼7mÅÏŽ"úÖÿ«™©Nì ÅSÂóÁg¿RýýW3wÓ"|×½éBÔ 1]/eâ«—F:†â'“ !„@ÅuÃê6”ÐØkÃÍú¡Ìqf‹+PÑ­p¶„Î[v”“V,ÿÿ.á´ÇV’[òÕ‰t !„¨gB?½Uºí0:‚IDMPQ1ø®³MoÜ][(þ÷U¸YiÕ~®àÿ­ö>k’½ò;œõó#C!„%¤è-„#¡V§{Ù³¥½æQÜ]ßp³Ã]{Y÷D… zV™ÞÁÇ÷^ÈðáÃÐ1ž”Îcøðó¹jÊ"ìê;K9çÕÕ¿j†BÔ3º8{ñç-ºa¶íáD¢&(_,¾q/cvì„ ßEO «Ö‚¯.Î'4ëåjëïh ΙéB!„(!Eo!„¥Œ&ƒ±öµu{Í#¸ŸìL|Ìæ ýéØëžª¾*™ Ÿú˜3>á™KÛqÊŸÞç³7ÿL·äÊ?^ËeÃ/eÒwÙá壳¿çÑQÃuÀþ=òæ=Ç-cG3âŒ?pËÿ¶ãdÏáá‹ÎeäU—qîF1e‰Ÿ‚wFÑÿ¢›=úŸÌ Tße!D}šÿ:P€çô«#œFÔ$å‹%zÜËX}†‡w86Å/_Oð›ÿ€{䟳²û¨Æ7Õgí<Ü]["C!„HÑ[!ÄŒfçcuºTø¿{ó8›_‚}JÊf»›Q±p³~ÀÙþa ¥qÙðúߘuòs¼ûÆë¼=ù$¾ø&›Ýò÷§–FtÈn8˜¿O}‹ÿý÷V>3µ; I¹ñE>ø¿÷xÿxíí%¸†f{ì9¼0íÏœUC— „õëúéÿP ñô>/ÂD3=ø®|ï[¿3¸Á¯¦„§;ÉXwD]‡|TM!2­±éB!„@ŠÞBqxÜØù¿9Å‘NxDŒ¦C°º< F¸ìl{{ÅŸÁÎ  ¬ðãfƒð㛞ÇÍžWI¶n΢uÇ–€Ùª=-w¦²Ý)º»§IJçŽÄ*0RÚÒ"7ƒ^EÆÿ&rómwrÿ{kChLš·oGt $BˆúÄþýKtn:žS./‰ÄQ¡Þ!·=î¥ÒÅ,Ô¥M¾„ÀôIèâü*wéfoÅݾ¦º“5Ϊï#A!„HÑ[!ªL§\pÁùôf¯™é˜GÌh4ÏñÏ¢<á?bÝÜE„ÅÍý åKÁêtÏÞák&áî^\Í)LZµkÌ–u[q'u=iÍÛÑÒ,‹ÒÿÕ\26m¡pÓ·ž”ÌŽçïgùÀgxqÊ3ÜwnsÐáaáÊPÕœY!êŸà÷¯‡7<>YÀ²2;ŸFÌŸ>ÆêuNx‡"4ïŠLð›ÿ  ²+Ý—»ñ·Jyt8iËÑ…9‘Ž!„BÔ{RôBˆ*ÒþíÕ»xã1LÅvÅêõTÜqèà.ìÆÙø/pŠ0 Äj{ø`×½êAÜœê[È Ú_;‰! îàòkÿÈ^ÂùÇÐÚ(Ë’úµã@ã¼ïxðÖq\~ýÿç1œ9h ™¯ÜÀ·ßÛþž´œ;…÷¶Éò•Bq¤œ p·­Àsâù¨‰N$"AÅ5Æ7z2¾ë^ÀHj„¤ ~5…ÂGáû^œÕ?rÎo'=B£¼{ÿ“è!]޼íâîÜxäý!„âˆX‘ „µ‘Ø«ã½hZ™Çœ­ïD QÍRQMñÿ/œÔWq¶¾ hœôqv~ƒÕþ6Œf`Ú…8[^§{õß°:þ £É#8«E¿'~'<£ç&¼7 ì!‰åì?åCæ0Åclð/æ Û{ï¯w„¿Ž?‚”B! 8{jxCx\Ù0"â¬îgbu9Ђég½„ÎÍ;ˆ½hö¢(_fÇ“0ÚôÆlwFÓv¨˜„Òö:g{ÙNÛÞKÌè“ÐÛ3ÑÊ‹òfcÿï~BéÁ½Ç(Uú)®Hs3·`¶;1Ò1„BˆzMŠÞBQe #¹üºÜÌYèÀΣœç(P&f›ñ‰§`¯]œ.p¯û;jÛ»˜)—b¶¼gë4pƒØkŸÀÌ_ƒÙöF0<‘N/„¢†¸;6ଠ¿Ýhu?#¹}„‰c‚éÁsÊexú]DhñçØ ÿ‡³é7ÐíÏÇ^> –ÏÚ¯‰Ñ¬#ʃ›¹¹ü>7M¥xÚLÀÄü_¢Ú&Jßê3_¯\t0•ÐŒ•˜Å *ìOîÃnúÑǧbïò RºÁ‚¿Xßïȱ:žmØÓŸÁF¡ZŒ$êÒxTr ô÷wX×Ï%7aº»!ZãÌ|Û¼‚¨!½ Ðo¡žÅ)ؿخw¥ÖÌó*„BˆJ“¢·BˆJS ÇÓ{*ζwp¶½ N1ºh3öú ¼0’NÅÍýÜ Nútܼ%˜moÄHèéèB!j@èû7JG×zÎ(óQßY^<ý.ÂÓï"ܬ4ì%3qÖýŒ³i1Øýu3ÖWÜWëÑø®>¼)±Ë ¾ž „¿ýŒÀO½3 ÝøLŒŸÁ¿fª÷d¢ût!´MAñB‚_Î…wsæ IW`n¾âŸv ÚžÙ0P¨âŸ ~0ÝêNbÎ8#éJ¬mQœÚˆÂHJB¯Í4zó§Ø]Üìíá~Bþ’ãš¡šÞˆ/Ùâ@/Dÿ<‘Ѐ뉟Y_œ±ºœ«•E²…BˆH“¢·¢ÖÊÏÏ'..–¸¸=´êŠ IDATÅçCÿQPP€ã8ÄÇÇÆ5Z‡‹í………õ·è½‡'³Ý­-¯Â͘›ñ):XòG¥¶÷;Tç¯Â^u?ž#\E%‡ 㦣ùÈ£¼rì|Tƒv(+<‡óý"„u[pöÔÒw„½g^á4¢Vñø0ÛXî¼×é“Í«x]”±‰ái¼Ùómha¸cãü‹ Q§¼HtÓò~7Ôèœ\Tãd`+ªÝeXÆ—„ÊçâfmCgLÆÿó°š`4 ¢µÇ}?þãìÿâí9ÿ‚œýZª ezB!ÄÑ%Eo!D­åº.^¯Ëò——‡ëV¼x‘e™à÷hÞ¼ùaŸ7¢‘…’ŽÊ“ˆÙj4fË+p³æâd΄ÝKÐNq¹ÇëÀÎýæ=w³>ZQŸѰ*¡/FÒ)(_J¤ !DDéÜtBó?ÀhÖ «çÙN$ê £Q«òh{-¾k‡**ˆ3óaÜý¦qp×/D |„¨6謵è¶WãÉ9ðw6wÁó8—MÄ×z7ÊÚJè£|ˆ;ð„½p ÎÈGðµÝÞ¸ Ÿ$ÄÙx‡Œ†BbVaÿ¶»LTÛè°¯_!„ÕCŠÞBˆZËu] ÃD)ƒÂÂ"lÛ®ðx¯×‹a˜†Çã=ìó†:d½¾ÐÁ,tîÜÝKÑyKÑþ푎T3œbÜœ_ çœM/`4: ³Åe¨¸ã"L!""øíK`ðžs«L]%ª‘Ü¡ìÎÍOQôèAüþ'ö¼Í®W=Nñª}û1ü¥twÆ‹¿Þ ¾>ÿ ýìwÜ´8áSøWâZt­ø!„BÔ8)z !j-·dxOll,:uªT›ôôt¢¢¢0ŒÃÿã\ë½ç®t(wçW¸»¾G¬!üÁâJRÊÛ¬8Ð.¸TƒÎϨ±¼‡CÛàßÞDåâæ.D§ã'üqçq³~ÄH: ³Ã]ákBˆzÂÍJÛ;—w‹nX=G8‘¨KŒv'‚å-}S¥Öñø0[tt !„¢Þ“¢·¢Öòx<¤§§³{÷n\×­Ô”#{ŠÕ«W—·èPÅ”R˜fxŠ”fÍšU¹}í¦qsàîø<<‰>pT½jÐÓ]´ ]¸aïC¦#ñÔðÈèØÎG5uu1ÛŒmãfÏÅÝ17g> Ã÷ó–bµ¿£‰}„õCð›À ÿ?à=ç¶š_IZÔ+**³C?œ5s#å°XûƒÇéB!D½'Eo!D­Õ¼ys¢££Y¶lÉÉɨJüÑ}$#¼Ç!##ƒž={æB˜µÀÉø wûûÍæ0šÁH:#¾nÞrœõO¡C¹¥G˜­Fc6¿‡Ùáê~á_QohMàãÇÂÛJá=ïŽÈæužgÐ8Bó?Dåúàc€Ñ¬žS¯ˆt !„B”¢·¢N¨lA:’Ÿ_°ß¾† ãðz=*çhÖ# àlý?œ­ï‚•î6[]ƒÙâR0”ß,㓽oÀsÜ?P ¯ñ¸Ç"åkŽçÄiØKnA3q2>¨&˜-¯Št4!„¨öoŸàlY„§ž0ÛžáD¢®SÑqD|{éÌHG©Ï×€aF:†B!JHÑ[Q'T¶ ½uÛv¾ÿaÞ~ûŸ5V-S*uŽºF¬Ã^÷ºhKé>£ÑÌö·¡¼MÚÎÍž‡]2—5†OgPqÝj:î1My›`÷$¡ß¯í⤾†ŠëŽß'ÒÑ„âˆèâ<Ÿ<„§ˆþ§'õ…Õë¬^çD:†B!j!)z !êŒÊ¥mÛ¦  °Ì¾Ê´­[Eo³õœÔ7JGw«¨¦˜íï8äô$º8{í¤ð¢•ÊÀêò`½/xï¡bÚau{å_Â…ï5“P½_AyE:šB¶àgO•.(è9ëT|r„ !„BQ1YeKQ'ì;¯÷¡neW®}]¡; -¿ gË+¥o£Ùp<}^?ô|Ün{ÍDpü˜mo¬wsxŠ‘Ð³Õ5èPÎúD8‘B>gí\B ÿ€Ñ¼ Þ×F8‘B!„‡&#½…uF¥ ÓåÖ¼ëVQ»"nÎ/ØkŸ;åIÀìxO¥ ×ÎæÐ…0š ÆL¹´Æ²Öff«Ñ¸ÙsÑkqsæãÑôÜHÇBˆ*ÑÅùøß{´ÃÄwÙ£`ÊŸB!„âØ'#½…uBe‹Öº¼ªw¹ûÿÇ$íàly{å„Ò‚·‘Ы÷«•.x»ÙópÒ?@E·ÄêpWÅ­ýV—‡ÁŒÀÞô:˜ÙHBQEé“лwàx-FËã"œH!„BˆÊ‘¢·¢Ö«ÒÔ&©y×åéMÂә܉³õ@ƒ21ÛŒÇ:îI”7©r8E8&—Þµ:ÿ ̘š \G(_s¬6ãÃwì|œÍ/F6BTAèç÷±ÏÀHéŠ÷œ["œH!„BˆÊ“¢·¢^)o¤wù£¿Ëi[ ßnÎ/„~‡Î[€ò6ÆÓãÌ–WªÒý8[^Ew`¶ºÛ©&âÖ9Fó¨p3g¡óWF8‘Bš³åwŸ<€òÅâý XQN%„B!Dåɤ|Bˆ:á`£±ƒÁééض ÀŽ™eŽIOßA(^ÐÑòxHIi†Ç*ÿå±Ö¾µ“úÎÖwÙ3¼ÝHìÕyX «ÖUÁœŒPÑ­0[^UÝië0…ÕáO„–ÞhìMÏãéùoªò†ƒ‡âwÎÊ9xN JÆ3Ô7ž3Æ âW[z÷üoÞv€¨KÁhÒ¶ÚúâB~Šž¾X¬Î§E: f§þ˜Ç@!„BT½…uÂÁŠÞ¦i°;/Ÿ aÛN¹mÿíñx8¹ÿ‰J•ÛWm)xkÿ6ì5¢ V‡w(³õXÌ–—Sõb«ÆÞð,hP˜îÃS͉ë6× £éÙ¸;¿Fç¯ÄÝ5£ñ HÇuDhþØ¿†ß” ~÷Z„ÓˆHps3ð]õTµô¥ýùO½¡toÏéWcõ>¯Zú¢² 'Dçܶ*Âi@-øˆ˜¿ÎDùâ"E!„U ÄuFyóp+¥èÚ¥#]:wD©ƒ| Cѽ[g:uj*)zׯy½Ý_„§3))xît&¥ýeÎ.íËh<#¾OuÆ­7ÌÖcK·Ôÿ–¼‰ Ärl‚_¿é"Âìß?ÇÝväS'é@!ÅÏÆM_ €uÜ ¢.øË÷+DU¸»¶”¼º0‡Ðì©‘Ž!„Bˆ*’¢·¢N¨¨ mY}OìE×.å¾ à[×ÎôéÝË4둦ƒYØ+îÅ^ÿpŠ0 ÀÓçUTއשÂI}5¼mø0ÛÝ\MiëÕ3åRtq*næ·N$ê{ñç¥#rE=¦5Á9¯YE»ñ¿t]iÁÛlÝßÕOƒqðÿ…¨ ÁoÍEŸCóÞAŠ"C!„U Eo!D­·§}°ÑÙZk¼^/'žØ‹æÍ“÷+|+¥hÙ2…úôÄãñTØÇ±Iã¦Lhñqs†w™1XïÁê:±ÊówïËÉøíOw™2åmRë-£å•`úpÒþ ºüév„¨¬àoF:‚8FØË¾Eçï:¬¶nö6Ч\“º £U|׿_uFât^&öâ/"£\Ú_€½è³HÇB!DHÑ[Q'TT¬ÞsóEEqú©'ѬYÓÒv)Í“9õä¾DEy+ÕDZD¬&´äfìÿ»Õ°žÞ¯`$=²Îbœ´iá>= ˜-¯<Ò¸õžò$`&Ÿ€öoÇÍú1‰Dm榯Å=æºÇ'„½¬êŸ qÖÎ¥ø¹Ëp37`¶ïKô ¯¡bª9 ‡fÿþ%8¡HÇ8({ÉÌHGB!DHÑ[Q'T¦`­µ&..–ÓNéGÆq$&&pê)ýhÐ ¦Òíºx+öÚG -¹iïb•V,V‡»ñÿÊ—rÄçpÒ?;£Åe`ÆqŸ¢ä¹Tá…@íD8¨Íì³#AcœUßWþàŸÀôI¿rº Ïá=îe”/¶† Q±cýuÍÙôÚlÍ7.„Bˆƒ³"@!ªCUŠÒ Æ1ðŒS0 ƒ¸¸Ø*³#YøÖ œ´7qw~½ßÔF“³1ÛÝ„ò$VωÜîö÷Pž$ÌæUO¿åm„ÑôlÜ_ óW¢óW¢âºG:–¨…œÍ‹#AcìõóãdMOÅÇ-ýšÀ§O¢sÃÓWa˜xϹï ñPÁ‚ÏBÔ(×ÁI]éslœu¿`v¤“!„¢d¤·¢Ö;œBt“Æh”Tµ"qD ÞÚÅÍ™½êB¿^»ãËÒ‚·jØÏñÿÂê<¡ú Þ€“ñ):” ”ŒL6¢ª­ofÊ( \Xr¶½Ù0¢Ör·¯©üÁ½ÿIô.ûïër'QýZVÜ®2ÇTVuöUu³DŸÕ¡ÆÏQ)·sõ¹e÷‡ü¸Ù[Ëm¢E„|Dá¤?àóÎÒ‚·jØ”èñSñžuƒ¼ED¹™›!ätŒCrwlˆt!„BT’ŒôBÔ Gcú‘£YôÖÅ©¸™³pw|‰fî÷˜ŠíŠÙf,FBß8±[RˆUžÌfTÿ9ê9Ó#¡/nîBܬŸÐþm(_‹Hǵ‰c£óvî¿O5ÂöV²…jz†1Nžkþ¿ œ>Öbúã5#T€j¨°?}Ο°ÿÏ^ç•8±gðZ‘‡êû¾¸g(ž³ ZÞAôé[ 9%?Ãù0:µ/ÿµnÏue¥UçÓ$„Bˆ$Eo!DPk ÞnØ.NCû·¡‹6¢ó–¡ýéûÍÓ½‡ŠjŠ‘<£éy¨¨¦5Nã”Ìå™2²†ÏW }Q1mÑE›qv~‰ÙúZ°dñ¸úHdãl^„»m5îÖ8ÛW£wï¨æ³(TñÏ?˜ƒnu'1gôUªã Ôºñÿ°»¢ÊÔJ+:ÆÄ8ñZŒewSÚ „¿³ÁÎ?d[Õ #éTÒé }Ø3ÿsMssE†çª4›žVÜQ9oý¤0[ŒÂ^÷8ÅáÂwÊ¥‘%ކ’ÅÚœ5?a¯þ wëŠC*÷PQ1`XÕ`ï"„•;)nööp±'äGž’WwÞDB¯'j| d}MpÆê²mzŒBÅÇànÏ4zÇ:tW•”€^[R¸ÏÝŠŽí³ÏtÑ.:oWxÓ ”d)¯Ÿò®ã }@é{†:35\ÐÎÛ†Žî‡‘Ô ÕäF|É.zá³–¸¸9éáç§`':ú”rÑÙ[ÑáöMh_îó¬ÑË>A¿óçX ¾#˜±'XeŸ«1’Ðköß§âãÐé9á¶Ù[Ëq%|šƒLÇR]œN[Ž›¶|ÿ®¢bÂÅïV=0ÛôÆìØ_¥¾EÝ¢E8ànþ'mîÖåèâCÿ^Såõé oGÇ¡Ctþ®Ê5¶5ªÇMDu/„ø¶mð³÷vàBÔ®²¯ÿé¨Ìë!2÷½BQ‹HÑ[Q'‘ÞU*z³Ð»¾;ôÊ@E·B5èŒßÕ°*ºÕá‡<î¶J¶ Œ”‹#’¡>1ý6½vîŽ/¤è]ǹék±û”Тeçã.¡|q-ºa4iƒÑ¼3*!#!ß ›´ß±…Ÿ^þ4'Ub š4À}?þãìÿâí9ÿ‚œJ£ÑT|C Õ¤#J­Agç 'iØ•¿­›W£¼~,6)À-·ow¿÷ TR ŠÕè†)¨¢¸YÛÐé“ñÿ¼¬& ý´11µ@±Ÿ‚*Ú‰v›–ÔŽ]tÖ6tÆíßÅþoH–lÿ@(õZ<ÃZÃòIûœ§²ÏUNVW¬ö¹ù½°¨ÆmQjU¹ÏdÔEâ9õrôî8iËpÖÌ%´à#pìý²šûcvè‹¢w…G溻RÃÓìI(ÂÙø+ÎÆ_ (£ew¬N§`v>³}_ ^×i'uΚŸpÖýŒ³e ¸e?•VÊô`$µÄhÜÕ¸ *6 #¡ªAbø×Õ œM‹qF>‚¯í.ð6À]øw‚ÙûŽNuÑ N ·InûÝ_p½=JsN)Û~Ç>™R÷Ù^¼ç×ùD]ߎà'û¾¹QùçÊݹªÌ>'/÷ʧñµÞŒö›h]þ÷‰ŠO.ýjÅ'cõLÔȇpÖÎ%8çUœu¿gý/èì­Dš„Ù±É?µË·¯ÆÝ¾7m9NÚò½oÒh7m9Á´å0ûTLÖqƒ°zƒÙéd0=ü‹ZÃup6-Â^úö²oþ&]ƒÄð§Zõ" ¥ FBóÃ~#ÄhܦüO*´»žè±#Â#´íE„¦MÅ]¿5ð¢Úd ³Ö¢Û^§éŸ •þìíÀÕy­Øô nÿ;‰ŠZ‡¦!`–¼ÆÜL”»*|= Ê…BQ;ÔÔç³ì·¼ó”3<¦Â}å}U•¼¿çf”³mþ?{÷_E•þqüsfæ–$BH¡¤ƒŠHql(ØûÚV]uwÕÝUwÝŸ+–Uu-»¬ëÚ»ˆ;‚H‘*½’žÜ63ç÷Ç…ˆz’ÉMž÷ëu_wîܹg¾7öäÌsvÚ6vz¼ó}M·á•••w$'Ë@BxŶm>ÿüsºvíŠÏW·¿pG"Ö¯_ÏqLJa5›{6:’ÑòH¬Ãî®Ó<µÉYÿNN¼Ÿ·Õû>Œ´A'jtÕ:b?\ €‘5«ûÍ'µA‡+°¿{è7ÏïÒŸÛhÕ«ï8¬þ'`´=ô€/•¼~+±ÙoÔF܃“Ú³YΖbT¯ÛIêõ!UoÍònœ°cÁÎÐgkjgÀN74è{ÂoÍøy+…zx)·LGµl»ÛçUßy÷nܼUñJ8éOøF]²Û×è’\œµs±WÎÂY5«Æžó*©9Ö€“ñ = £}ïƒ~õ)öå³D¦MÆwäY¨¤ÔZSevÆ74±®˜ró×bÏy‡ØÜ·ÑåÛvy^5K_!Ðý(ÌnCâEêZVu÷8܃Y(rwŸ{µ(pòŸ÷øù"ê×Ô©SY²d W\qÅ.ÏeddxH!ö_aá®í½¦L™Âu×]@JJÊ߀ÄúÕtsk¸×;=Ö;íûåöÎ7öññžî÷¶=ì«õoß2Ó[‘ÐlÛ¦ªªŠ¹sçÖùlo¥Íš5ömü~ïgg×7‚³õ#TRŒ´j:TrTóÞèò¥¸…_A×ß™âu,q œ±™¯þøÏq3}XýOÀwÔÙ˜ú×JOX³ÇÑ £è­Ó1Ç]‹/TÍmbSçz;ާü˜ÃïÄh1±×fîúS{¿G•Öfo³û‘$_÷:ÑÿMô‹§@k"Ó&ã–ä8å¦g骴l¬ã±Ž¶·êYþ5ö¢Oq7/‰Ï•›ù2±™/cd÷À7d"ÖÀñ»´åihtéV"Ó&ûîµÚX˜í{c´íY{cÖ.Ç^ð!öœwp6,Øåy£Mw¬ÃÇ`ö‰Ù¡7ñúuÇì1 wÖ«ðʽ|îÕ"£Ë€:]!„µIŠÞBˆ„8öØc‰F£¸î¾-w  à ÔùŒòúæ~vF›ñÔ×™"Îl}vùRpøùÓ1²Oõ:’8öâO‰¾¼/òvªY:¾£ÏÇwôyµ¾ Ùs˜Ö/z5{ ük¢Ï~ÝpÆ9zþu„je¤(ÎŒ ÍØÍÓuü­ÃFïã~ü'Ý€ÙýÂÿ½©$6ãtyÁóïÛk{ #»þìøG_Ž.É%öÃûØó§áæ®âEñÈÔ{‰¼?Ö¡#°ŸÏf6¼_;"ÓµKäýûIúÍ”ºÿ`hïÓ>ûuìÅÓ!þÙÓF«XNÄ8#«k½F3{'v@Eï½|îÕÕ,³cߺ=‰B!jMÃûéS!öƒRŠÔÔÚ¹¹©rò¦Æ7ŒfÖñÞ†i‚ŒŒQ°î?àTâl&Eï£Kr ¿qÎòoª÷©”–øF]‚ÿ˜ Á ÔÉyU°9VaØË¼)‹†ÇtÊ~oö8š¤k^ ôÔ•è²|ì…IJ%púmû|5‚JËÆ?úrü£/Çݼ”Øœw°˜†®*ÇÆ^ú9öÒÏQ©Yø‚5dB½RwÇݺ{Áûu6¾³bî– f¶·.ÉÿûÌ}g—"*o»4d"f—Aµr5ʰzJjŽ•ïý`XýO¬óÙîB!„¨=RôBˆ&L‡6 Ë—`¤«¹Ç‰š 3 3óW8ySÑ•«Ñ+PÍF‘DìÖÄf¾Lôƒ¡#•Õ»}£.Áÿ««PIuÿ¹äv®½f§~˜úí÷댶=Iúí³„ý5º¼Øw¯£’ÓðŸxýþÕ¾7ö½ Œÿ3öÒω}÷:ÎêÙ ]tY>Ñ/ž"úÅS˜úc ™€ÕÿTлï9±ožßuÑÄÚ>ǬWœþ÷:=Çž„±O'6çíê‹Uÿ[ 8hkù‚XCN#ö^È IDATõ½N²+eà~×)„B±¤è-„M˜»½—7€™=ÁÃ$M›Ñú„ê÷nþ‡˜RônÐtEá—oÂYñmõ>ó#œ1 #£c½å0=#»Gu[ Ñtùûí¿ÖÈìBÒoŸ#ôèEèŠ"¢Ÿ?‰jÕßgØ€–«ßñXýޝqv±³aΆDÞ½«×H|C&`öf=¶slìíý¸ƒd/üˆÀÄ¿íµeL­røÂ£ó¦b/žŽÿ|Ötõ¬ûAã1Út¯¿\ûÈ7üb3_;êu”Ÿ±R¯_ß…Bqð¤è-„M•vq >@Û¢R÷8PÓ¥šŠJ醮\ƒSðfçkÀh\½ã gÕw„_º]¾}•uÓ"púßñ 9­þ[(ƒÀ‰7zúªú=¯hP¬^#1{8¨1Œ¬®/}”ÐÃçyû˜íû`´ëuP㪴lüc~‹ÿ¸«pÖÍÞó6ö¢Ñ‘ªø,äEc/ú•Ô³×(¬Þ£1Q糎5³w)×]Uгq!fç:^ ÚŽà¬þ{ÉgØK¦£+Š~þ¼åÇê=ßà‰˜=®ß"ü~2ÒÛávnƒší­‚Íœtƒ×1„B±Ÿ¤è-„M”[2Ý€‘u<²€¥·ŒÌ18•kÀ.Ã-ž…ÑêàŠX¢–iMôó)D?z¤ºE€Ùu0ÁóîE¥e{Ëì5ÿ¸ß¡K·z–AxËwìåµ2ŽÙ±/Á î#üŸÀŽþßõ$]÷zí´ Q ³ë`Ì®ƒñO¸%^ìžó6κy 5:TŽ=ÿ=ìùïiavêÙý(ÌîG`vè[ë‹`:ëÔêx{<×ÊYµ_ôvÜܕثfᬚ…³vÞ. RB¼åŒoGû’Z^L·.ùÇ^ vêxò}eö†jžáu !„Bì')z !Dåæï¸´ÛÀÈçi±½è½áIÐnþÇRônHba¯ýö?-zçs5þ1¿m3&ýc¼µ…;³úŸˆoí\b3_Á-ÜHäI/¸¯VÏ¡Éø†LÄ7d"nQÎâO±гaaüJ޳v.ÎÚ¹ðñ#`0ۊѾFûÃ0ÛtÇÈî~P‹Äº[VÔâ;Ú˹òVÜŽ[¸wËrœÍKq7-ÁÍù1>[¾F»^X‡Á:|,F놱hèþRÁæN»ÕëB!„HpRôBˆ¦È.Ç-Š÷#6Ò YÊŸŽ‘6·x6nñ÷èX Ê—æu¬&O—zæÜM‹PÉ-ž7óÐá'¢nN¹ gí<ܼUØ >Àî;«ïØ:9—‘ÞcäÅøF^Œ.ËÇ^öÎÊ™8«f£«JâÙœ ãEñ”B¥ecdtÄÈè„JkƒÑ¢ *¥%¤´ÄhÞ RZ¢üI5ž×-ÍÛugç?“|ÅPìGÎ!šëÄ÷µ½–äkÅþ÷™D·8ôÝ »2FW– +‹ÐEèÊÜÒ­è’\ÜÂè ¸Å[ÀÝý¹U ³Û˜=†aöѪÃåB!„hl¤è-„M[ð¸1™åÝ€Yãp‹gƒ¶q >Ãl{º×‘š4·p#á'S½ŸÑº+ÁK•ÅÌDãf^pUžv„È;wav?•”Z§§U©YøŽ83¾€¦vq7ÿˆ³fΦEñÙÍE9?¬5ºx NñœUßíaPUÝžE%¥Æûî›>Ü¢M5¬Ñ›«0‡†wgAÌ¡}Ð9ñ§“ÀÖe± TªÂ~÷fì¶÷‘Ô7{«Fe³ÿFdñÏ[ ¹[–Sñ×(½ý,; ØNì€?Nf‡>ú`v‚Ù©ƒ¸âD!„¢¡‘¢·"±„ä¹?ÜÈ«ù)¤ZaŠ‹‚Œ¹ã þ4,­;RǘÿÏyhC .ž|£ëv=-O8ùÆ7Ìi£Ñ€éGƒ™N%nþÇRôö»e9¡'¯¨^°Òì<àåÕNc!8£Mwüc®"úáCè²¢ïý“ÀYwÖ_e`l/ìîXÒWW•ànZ‚³ezÛFܸ…âýìµ®y­Ñ¡²øæöû=œr?ÀÉ<+ù{lFáK…]xlüç‹ä$ô¬I„Wä úÿ‹¤=±s5ªò;bï‰N;Ÿ¤óOÆXúô®­¨£av“pHF5k…Jo‡Ùñp¬ÃÇ`´;lGB!„h’¤è-„H(±¹OrÉ…|ûöÙ¤öºxfQ1Òð}Á¤Ëîeqr *·hNzàïDÿøGÏ}Àµ%¯_À¸9×òõ-ðð•·3Ój…*QŒ¾ýq~70¥úºô#^.ͽg|ÏÝooeÔù­©š=™K&}‡¿•EIeW®}üŸ•˜ ?ꪵ芕£Á8𾨢–~ŒÌѸyÓЕ«Ð•kQ)‰Ù“5‘9ë üÔUèp9Ö€“ žs˜¾½¼RˆÆÃ?ê2ì…ánYAlÎÛXCNÃìRË 2†Ùs8fÏ_´²#¸Û6£+‹ã·òmñûªte 8QtÕö¢·ÅÙ¼b‘]O¢×[x$íqõ8Xx7ºçö¢·­Q}~Kà°JhÑŠ,ÀÅ-δ+òÑIQ5ýhà _,Zÿ´8ãÞfzk®@‡+ pÎÊ™D§?ñ‹™ÞC1;õ“™ÞB!„5¢·"¡øúŸÇ¥ú&νtÇsG É¥§¶Äœm•´½êqn×™ŠWÎbä+e¼yºâ·ïläêߥòá››8á/ƒØüôXÞ8…/nì?ÞÅ迼ÊYï\Jkà²ñåw°NþmŽî@æÿcÅ9×£?ŸJéqOñÖu=ГÀ_=Ýü«·ÍÖÇ{˜DÔÄ̇›7 ·àÌ”«¬Fënûõ’ðs¿Ã^òY Ïhô¢wÐ^ßÉ'öB ª'€…yÌuk/"üC%ê¨ÇIÊR€‰ÑªŠèmQUùè_ÌòVÍÒI¹mFÍAª{z£+¶mïé‡.ÉÛmOo]–½ôsXúy|üêžÞGaö)=½…B!¶KಢIj6„ë_ûœ«·­fá÷³øòŸgpKòŸxóÁH (òÞ¾«§¥âÛ¼‚Hg‡ö§Aò¥ï°îì Þ.Ï}›žÚLÞ²;¹ìGt)>c$ù´¶€è<¦Ì”ÐùÜ|Ê! =ᆠÕÌúÕ¬¶Ã}ø–Œü’×ÎM%ç‰ùl™Fµ9•3Züš§ žð/1M¬®9¤÷ÝŠÿ{ó,Þ¹4£ûˆ×·t:º #ó8Óˆš)Œ¬q8ŸAG·á–ÌÅhy„ס=wÓÂO_ýSÁ{ܵøÇ\íq*!¼ç?á÷Ø ?DGCD>|«ïXð½ŽuPTM3Ã×O&´>¾é¼*UÛwÛ¯ý:¾±å„–ítü7 >ˆµî%"Ÿ­Ùí¹Œ¶½.¬ia´îŠÑº+Vÿãû\7wöªïpVÍÂ]7 ÇŸÊYF4gÑÆÈîïÈ3±œŒJnqp9ê‘®*¥òÖ£PI©XýÆiªyþq×zC!„ûAŠÞBˆ¢Èè?õ»‹÷D3Z$)¢•½'=À`ŸEÉè‘Ü%WÍjO§n}iÿí#¼¸üe&œÙ’›®®âÎ…0Pt¹d#®º‚3g¶&¹¢œìKäž.-À]ÏÿßÌèG»³c^­ÑnöÜwãðíÌ«Ž”š…oÐ)XƒÆc´é^¹ö‘›·ŠªûNõ:FŒÌ.$ÿyjƒÿ£AS2uêT–,YÂW\±Ës$BˆýWXX¸Ë¾)S¦pÝu×’’ò7`àìææÖp¯wz¬wÚ÷Ëíoìãã=Ýïm{ØW볌ÚP!DÃäv|q>imÒðYãân·ð oÃ4Rº¢ˆÐãÿTðz:“þäq*!åOÂ\|Q]]UBìÛ=Ntð¬¾ãêüfaõ[ð0LÌnCœ}')ÿŠàyÿÄì~¨ø¯}º,ŸèOQuß©„þs!±9oW·uj¢Ÿ6Ü?È»ë⋈ !„"!HÑ[!šˆ X¢ ŒŒÑÞ†{e´f¼o®“ÿ±Çi.'4å2ÜÂX}Ç8ã6P‰Ø¸Hˆºçvªy|ædìËgÑ‘Jßg€é«ÓsøG\T§ãï•/ˆ5ðd’®|š”[>Å?öTZvõÓκyD^½…ªÛGyõœµsë¥åËîè’\ìÅŸzvþ}›ù²×„B±¤è-„MS…[< £Å@”?Ýã@b¯ÌdŒôcÐeKÑá5"NŒðs¿Çݲ³ûQÏŸ,—¬ ±'¾ þclŸí=ó•ÒßÐÓêl|³S?ÌG×ÙøûK¥eã{ )·|JÒ•Oc <¹zAR©"6çmB^DÕ=Çýè!Ü­kë=clÁ‡à:õ~Þýá¬þ¾ºgºB!6)z !DànûÜ(F毇ŽâÏÆHæu¨„›ù ÑÏŸ@5K'xùT3iõ#Äþð}>±/žŠ·ÄøêY|C&6ÌÍûÈêó+è#W@Y]ñŸtþþ€³n>öâO±Z½Ð¯®(Â^ð!ö‚øUGªY:FûÞ˜ú`´; £mOŒ´ìn忝;ºo÷¿Ÿ¤¬)„>Yq@ç:XîÖ5žœW!„ûGŠÞBÑȹ…Ÿñ…©¤µIâ1²NÀÙôº ;ó$õÝ€½-£S&î‹¡Y{Ì.±&aÇúíúó\cûA¥þMÄÞ|§Bÿ-\Ž®,F¥´¬²B!ꈽ…¢Ó¡M芕ñ^Þ†,Ö—ˆŒÖ'áÚÁÝúf‡‹¼Ž”0téVÂÏ\ކL¸«÷hS ‘ØTZ6V߱؋>ÁYù-nÁ:ŒÌ.^ÇuLRâ_?w| ÕwÛFÜÍKq Öãl@oÛˆ[¸]Y¼Ç±ôNÓµuEÑþ&A…f}ý t‡ëH1OÇ8âz¬œ¿úb=´¾’¤OÀþ¨šKôý™£ž'øŠªi«1Oz_ÇnÆ/_sîÆcQ«þð×ë¡å¡¨šÖðŒ…÷3³B!꛽…¢«žå ™Çy˜D #ý(”¿:º w뇘.·‡n}ÑárBO]Y]Pñºß°ss]¥¤DV!„BÔ)z !D#¥+–£Ã9Ç"³’›Ñú$œÍ/wË›RôÞ­ ¿z ÎêÙ˜û¼à>0Lƒ Ѹø†_@äÛÐá ìùïá;êl¯#‰edtŒ÷øÖ5õÙ.îœGpNŸD°s!øSpçÜCt¿_s/1Æà{!TÚ¼ {^éÏ^¥’Rk\ŒS!„ ‹½…¢‘úyk“_y˜DÔÌÆHŒ[2'¾ e8lçu¬)úáƒØó§ñBJðÒG¥@!D°œDtê=èh˜Ø÷oJÑ[8+€‘Ñ·`ý/žpp?˜ÈÏ:h/ø#¡ÛyúßöíÐD_¸ê¯ÿéXýíÕÛî'çn³¦×ü“ð»j´ëµ·w#„BˆÀð:€Bˆ: Ü‚/PÉQ)‡xHÔ£ý¹Û·\ÜœW=ÍÒPž}‘èçO š¥¼| ªYºÇ©„hœT kÀɸ›–àæ®ð8‘Hdfa^GØ'f—^GB!Ä>¢·B»ÎÝõÉ÷:nÉ òî=(à¥Æ/™BÔkèéÕÛ±Ùoz˜D$:ëÐc¼Ž°O¬>òs•B‘¤½‰Bì']¹–Ø¢«Áxe·Üü¶o)Œ ùå¬11Ûž½ênp#8yS1;\èu¤ÁYþ á—ÿ®†Iàüû1;öõ:–žÙ©ßO ZÎÀÉËïu,‘€ÌÃP)-Ñ•Å{?Ø#Fënm¥½‰B‘d¦·Bì'+jÐoœ*Ü¢Y¨æ‡¡‚ÙµÉÈ<åo€›÷.hÛãDÞsÖÏ'üüÀ‰RϹ«÷h¯c Ñdø¶ÏöÖU¥ØK¦ïåh!vÃôá;â ¯Sì‘oÄE dap!„"ÈLo!„ØOFÚ`¬CoG‡6ïö•Ô¶ýœ[ø%¸ñå™ÌÖÇ{–CÔea´9gã3èè6Ü‚Ï1²ÆzÊ3nî ÂOýÿŸLø+ÖÀ“=N%DÓb OäýÀ‰›ý&Vÿ½Ž$”oøùÄfü¯úkzCbdtÂ7èT¯c!„bIÑ[!€Ñªáötv´61‚ÇzFÔ 3{NÎËà„p6>ƒ‘5hz3ÏÜ„ž¸ .À?îZ|GŸïq*!šÕ,«Ï±Ø ?ÆY=·(#½×±DR©YøF\Ltúã^GÙEàÔ›¥uB‘@¤è-„ˆmF—-¶æÍd‰:a5Çl}Ζ·Ð‘­ñÙÞMlÁR·p¡Ÿ®ˆ/Øê;æBüc®ö8•M—oÈéØ ?íbÏyÿ¸k½Ž$”ïØß€vÁu½ŽRM5ÏÀì5ÒëB!„ØRôBˆF$¾€¥Àh}‚·aD2Ú‡“÷~|AËMÿÅÈÊô:V½p Özì’ê‚·5øT§Üìq*!š6³ç0TZtI±9oá{5(Y>Hì?åOÂÂu^ÇB!D‚“ŸD…¢ÑиùŸ Y-ú{œGÔ%åo…Ùæthnþ‡'ªnîJBÿ¹]–€5è‚gÝ) ‹ á5eà<]’‡³ú{ !„Bˆ¦LŠÞBÑH¸%sÑÑŒ¬q4ÅÏMÑþ<0ƒ8ÿ nÄãDuËÙ°€Ðc¿þ©¥ÉÓž}Mc†» 5xBõ bó¦zœF!„B4eRôBˆFÂÍÿxû–ÂÈ:ÞÓ,¢~(_f»sÐÑBœÍ/yœ¨îØ?~Iø‰KÑU¥øŽ:›ÀYwHÁ[ˆÄÈèˆÙ±ÎâO!ö8‘B!„hª¤è-„S‰»m*õpT°­ÇD}1Û dà伂oñ8Qí‹}û"ág®FGã4ÿ˜« œþwii"Dd ÚÞv)R‰½xºÇi„B!DS% Y !ÄþrBØk‚hánQÍzavº¬þ"mý ºµ…) X6-F³ó•Ø+î7гöa¬Ãîñ:Uípl"ïÜElÖ«ñÇÊ 0á¯øŽ>ÏÛ\BˆÝ²úŸ@äÝ»Á‰›ÿÖÀ“½Ž$„B!š )z !”ŠŠ úB÷^‡ÿlÿ¶¢bnþSRý\Vh6}Š>Þã1†òÕS»õƒø¦Õ £ÕÈz<·hŒŒÑ[ßÇ-™[<7ÿãí}Ý—.Ë'üÜïq6.@’ œ7«÷h“ !öD%·Àê5{Ég8+g¢Ë QÍ3¼Ž%„B!š)z !Çq8ê˜Ñüï©G¶Ä)çóæ*BýB35€‹ýCÈ4rvy.CÕk ·d.ºj=fë“ÀLª÷ Âk ³ÛŸp\¶ýJ„ñµPÝö$Ñ8+f~ùæê+ôö/ù7Fv“ !ö…5øTì%Ÿë`ÏŸ†oäÅ^G .úþD¿x £}oŒVí½ŽS+Œ‡ãu©×1„BˆFKŠÞB±Ÿ*t þùgÏÝ‘t6é*¿^ó¸¹ïlß20ÚŒ¯×s‹†C³1;^†³îßà„±WÞ…¯Ï h¡G;BdÚýľ}´Àì~Á îC¥´ô8œb_Y½F¢’[ «J‰Í›*EoqPtéV¢_<€»y)îæ¥'ª%‹>Åê1 £í¡^'B!%)z !DÓáÜ¢ï0ÒBÛyœHì×u)..¦ªª ÇqjaÄAè´[À.ÔŠï QþO„Êqó× SºÀØ¿RéPéí  c[9III¤§§cš TÈ¢)2}XýŽ'6ëUÜ-ËqsWÊ•â€EÞ¿ßëuC»DÞ€¤ßLñ:‰BÑ(IÑ[!˜›û.à`dOð6ŒØ/ZkÖ¯_O(ªå‘³ÁÊŽo:@ee-_W Èè¾ëîò———S\\L·nݤð-Dg :¥zÚØÜwŒ¿ÑãD"¹…±øÀëuÆY17oF›¾ÿ !„â HÑ[ÑàL}ãζ>ëu墹ôô(Oƒå„pò?@%wÆHäq ±?JJJê àÝøÅb1 iݺµ×Q„{`vê‘Ñ1^´\ð!“ÿÊð:–H0±/€v½ŽQ§b3_&pÚ­^ÇB!)z !”ÔÔTþúî–ý|ÿñeVç/¹ùŸ€]€Ùf ¼ $ö‹¼\8ö:‚bo”Â8žè'ÿA—nÅY=³ûQ^§‰Äu°4ÞYÞ;Ø‹>!0ñoòG!!„¢–IÑ[Ñ (¥HNmI º/КXy!vÑ&B-ãpU IDAT[–c—mEG*Q¦#¥Áìîø3»âKkƒ2}uš½~iœ¼í XZÍ0²ÆzGì7×mÜ3×ê’|ì„H Ö Sˆ~úhü{õÜw¥è-ö‹³a!º¢hï&8]Q„›³ £}o¯£!„н… Ë…©\3‡ÊEÛ¶‘ô´T:gg“”žB4£pÛ ÖÎÀ¶RHî9‚Ô>c°š¥{»V¸Å³ÑUë0³N3ÉÛ@B!Ä/­:`vê³þœ%ÓÑÑÊ/߯ľq7.ò:B½±WÎÄ/Eo!„¢VIÑ[‘b¥[)üü œÍ (#±Û¥8›^ˆo(#{¢·aD­ª¨¨`Ë–-dggÓ¼yóZ·rÚõ\¹åZþ{E7L üíCÜSp·NhGm_P½¯c;+þÃùOÂ'#PË„ ƒ5èœõ? #U8K¦c ïu$‘ œÜû÷‚þ÷“”5…Ð'ûùºÚÐó:©o™³¹z—ø Á–úlÍ^_înÝû1B!„Ø?Ò8L‘pbelûêô–Eœ2a_|1‡v(¿Ë41 Ó00 EzË ?f§{mZØöÅ„6/õú-·dº<þŒÌãPÁl‰Úòä“O2|øpN;í4†ÎC=„Öz—ãì÷qÒ³xlÕO ¾:ËÿÃCÎàÑÎ.Ç×$xô¸í Þ{;ÿÁŒ]#­Ùõ£ „HV¿ãÁò›÷žÇiD"Ñ¥[kØëÃèsÁ«ž%é²'HºæÇų¹ ­."xò@Xñ`¼à½ãñ~Ò…ë œBÑ´ÉLo!DBюͶo_ bùW\|ù• ~ ¿…†ŸŠbJáB|A ¥QÊ¥}ûŒ8ñ ¦½ò ùŸ6v²Xœt=wxŒK§wà˜Ž1 W,Ç<ínþÚw÷Þò2EÙÈH.d^á ¼pßñ÷åüü4«¼æ±rÏ-¯PÒ® æFªô!芅<{Ûc,°Ò  †^ûwÎ?,‰ªþÈe§Ñ)©gß~1üuù/ „¨ *¹V¯‘Ø‹?ÅY5 ]V€JÍô:–ht4„»enî*tq.nI.ºx :†hwÛ¦]_Ôö7޵ˆ>y)NHƒJÅ<æJÌ6_á¢PíN'pf Tëv诮'²¦+þ³.ÈU Rö»7ÛAõ€¤Ã7búPm{Á÷7ÙØÀ9硊7 #­0›HÕ¹øÎø-¦[ Iç£Ûˆål_ˆZec{fÇÁøÕ˜¡çˆµÜþxm±™ƒýw?ÆvnQ ïU!„Efz !J(g¡U3éÕ» A1Û%ºãæhl­p´ª¾w0ˆ¹à>º8*ò)[úèÄ[ Ï-™‹.‹÷¸42F£’Ú{œHÔ–O?ý´ÆýŸ}öY {5F÷ºá-¾(ÑèÒ¯x¯àHŽïºÈápówÙß~N¡OQøÙãÜùU ÖÖuDÛÚÛ¯‚pÙüæ?y¸ÕÑÜqcÆW;R´Ì̈ÿ@à `9Q B´>´%Š´CºÓú›}?ÑϪiì ²ºÇÇNnמtå²5g+…kŸàÖ5è ,c0E.¤`Ù¡ýN3Ì…‰Èê5•Ü]UJlþT|£.ñ:’¨/®ƒ³â[b?LÃ^<báÝkP)i¨æ(nÞ*tUé®Ç¿¬WŸ ·hKü{^,Œ6|(;‚êó[‡UB‹ÎPdU«Ë ã›Nmø1Z$ãn)4zë*ô¡*½ *ë*‚­] 9è9(5tÛ sßÆØ¥ .„Bˆƒ%Eo!D°CeÄ ÖÒ¢Eé™­‰Ú†(eàâ¢Q87^ðv\EÔ-%¢ÚÀòIÏîHÞü™ÄÊòªèí|Ž®X €‘5•Üi/¯‰dĈ|ðÁ5AƘ ´úã£<êÏdü?Óˆ~«Éÿ*‡?Çý'¦ÿÚoùn­®>¾ÍÄò`÷ÿñç»§s×Q»K¢hÑ2@a~štÊÖ­!_ºçßÛ»T´l•L~n1.Y”oXO>”6íÛÑñë¹ã¬,Œh ’è`BPR"ñ™>¬þ'›ù î–¸[–c´­éëŠh,t4„=û ¢_=‹.ÉÛåy•š‰ÕóŒö‡a´éŽ‘ÕÕ<ãgÇDÞ¸Øw¯í´ÇÁ]þ œs1æ¼»pÊPi˜cþ‚¹övv+mbsÆÚ‹ÿP‰:êq’²v÷=E£+"¨©@*ó”ZÞ–ƒÎûáY[ÁÊÄH ãîr¡à/ÇÜù±³Oc¨”´ÝäB!Ä’¢·"a¸ÑnÅ6iI˜¾QÛW¡ …ÆE&®Ö¸Zá¸Ä Þ¶&¯$JQ•ÊÂq5É©é(;‚]^èõ[Úwn gãÓñm#ˆÙQfÉ56't ,à•W^©Þ7qâDÎ<óÌݾF¥Åi=ÿÅ{„oQ¤õĦ7&qûÂÖdwèAë^bÚÚþŒ|þYcÿÂ5ó¯áÞï“¡CM£t-þv37/éLF@Ór75‚]Ï¿7Ç_Hö_näúEÈhî¡ {â5 št7üЊ`U%™oæúvÍö:š"qXƒ'›ÿú›ý&‰·xœHÔ 'FôëÿûòYteñOû•ÂÈî‰ïˆ30{ÄHo·×¡T«Z¸å>Møã« \ø_ü±J0}è5ÏY[ }y°‹^=5rNyèm+Ñ/À—µ€]¯¡rqç¿ gÝK°Ãzt ´vqç<‚sú$‚ ÁŸ‚;ç¢Eå?½lÛ ô!×â7m(ûéq`À¤íEx½÷1•&‹’ !„µ­®¦OíéÏÝ5íSû°¯¦{µwÜŒ¶Í¶ï|_ÓmxeeåÉÉÉ5¼=!ÄzäXTC=:R¸‘­oÜBÛôfL¼àrÒÒ3À0Á°ÐÊ@cà p1p\MÔvÉ+ “W\ NSÛ˜:FÁª,úò]Z޽އ©Õìw$MºÊÇhy$Öaw×Ú¸Îæp6Ä‹Þfûó1;]^kc olÞ¼™ÒÒ]/ÛÞ°a999dggÓ¥K’S°„ï‹ÚqdÏ–„¿þ;~u6BˆWuÿÜÜ•¨ä¤Üú%X½¾F${Ét¢ÓîÃ-ÜX½O¥´Ä8ßðó1ZÕø—ÖÝr–Cè©+k;æî¥öÁl–ƒ³¥Õëv’z}HÕ[³êåÔ¾¿&pÊMõr®ÆdêÔ©,Y²„+®¸b—ç222jx…B4<……»?¦L™Âu×]@JJÊ߀€³››[ýÞé±Þiß/·w¾±÷t¿·}ìaß>7ÛW2Ó[‘0”éCû’°cJJJHJMG+ÐJÚˆ½ ¥aM^YŒ’ÊÊUXÊDi¥¡²"0LŒ¤T¯ßÒ>Ñá\œM/ |i˜íÏõ8‘¨K:u¢S'o[×F³þý(o¦6§ªÐâÜ7˜‚·"qù†œFdê=èªRìÅÓ±œäu$Q tù6"oNÂ^2½zŸòñÖ‘g¢üI4®Ùmø‚{î^›t:æ¸kñ…Ê ¹MlêÜú9/`v\oçB!š )z !†•Ò#­áâe¬YµËlLË6ÁU[k*lƒmaEy\GchS¸.J©,#\²Ô_‹Ö^¿¥}â¬ù¸ñ_øÌ.ׂ™âq"ÑØ©V#¸á‘ÝõBˆc OäýûÁ‰ûþM)z7ö’ψ¼~ëÏZ™ø»ßèß y5¬/ˆuÈPìe_dÊ}Tþ5Ñgëé\;ó±z]ÿçB!9)z !†áK"¥Ë`*r~`Óª%] ¤fàš~\ÃOD[İp ®21¶¿N)_ OCiÎJ*‹ò°Zž‹Xº[ßÇ-™€‘6#óW'µEh!„B$>)z !›R4ï:ˆæ]`Wc‡ÊÑv 3‚¯Y:jû,$«´?õ&6OLiÁLӤ˚éÄœúÐÁãV'ºb9±e7 (¬î7¢Zôó4“h8åÆó‹oD£± Wx¬Á¼wøõ‘ÍÈ)qxwQ[+á¥sâ²g/ÅÎË%ÿõ·0“‚t¾å&¯c !ê‘oع8+¾×!:ã'ÿÙëH¢î¦%ñ‚w¨ ßÑç˜ðWùC¥B!<¹žXÑ8(«Y+‚™IÊîARënøÓÚT¼whÖ©Ϲ +½#EEElÙ¸–æ93 ,ŸŠŠVz>>Ã;¶ô&ˆ•ñ…+Ìã<Ë#–UEßóôÂëp´¡L.ìso¼w¸ql vˆ>þ¯øöú'ñ¥· ÷ù—ØòÔs¦BÔ7ë°Q°g¿ŽTyœHü’[¸‘ÐÓWýTðy‰¼…B‘0¤è-„hr‚™è8ñü­»“——Gî–ͤ—þH³5¢¢õžÇ-™KléÁŽÿRifOÄl^½ç SQ(‡'~¸š¨àì^·2´í)§Ú–ÿ8µ%©Áø¯®²O~ºúùÂŒ”ÖOíàl~{éŸa{AÓl.f×ßÕÏùEƒg»1¦,¸–ÊX c»\ÁˆŽç{œêÀµL6˜|ZK ®†»5£ÝO Lí8¬ºáfÂ7ySQO¬!QIÍˆÍøh×ãD@‡Ë =u%ºx ÖÀññÞB!„ DŠÞBˆÄ¥5 Qh”vQÚA¹6Ê¡œèîon åÚ$eu¦ãÄ¿bevcÙ²eeçÒ!ÿKü‘"êr.“®ZGlñïq6<µ}Âìr f§+ NÏ,ÉëËî`CébúeÇ„ž‰ßó¶{?—Õ €Â —)å‡Òñ†øzìÒRV\s=n(ìeD!D=Qd¬#Îâ­4ì¿ô6'Fø¹ßãæ®Àê},Ásþ!3¼…B‘p¤è-„H,úEn'в#Ne‡Qv aØÛo±ªŸnvà ǟwÂ(;L³ìCètÊŸp›µfÑ¢E”——‘içÓ½ä[‚±âÚÚŒ½z2±.E—ÿ€ò·Â:ìn̶gÔúùDâš½å¾Þô™ÉùußɨFò‘ˆ5çÌøZÚŸ. ±fÔ¹´:aU+W±ú/2£Pˆ¦Â?ü0Lb_?ïqš&Nk¯ނ³z6fǾ/¸¯úßG!„"‘X^Bˆ}¦ÝøÍuQhp.¸ 1¶ß+íVÏß@kR…ahWÅ+ƒ¤Œt>õÏlþàæÍ›ÇÈ‘#i•\ŠUô ˇmÑùàf8Ùe¸Eßá|Œ[ºàg—o£°ºÝVóƒøÀˆÆfKÅJ^ZúøÍ$®èÿ’ÑÿÓ€;Æ·ä¢ÿs4÷~RÆK“&Z³–ª•«ØöáÇŒ8šÌÓNõ:ª¢Ž©´l¬ÃÇ`/ügÍÿ³wßÑUUiÇ¿çœÛrÓ I„^¤KGi*ˆ((ˆ¶±ÏØõµŒ:–±÷†Š¢ "** ¢ô&½·RHBH»õœóþqC &ô$'ç³VVnNÙûw£‹$ÏÝ÷ÙË0Ò7¡6jgu¬3’ÿ§×®š €R/×õ¯Ýeqªï'÷\=%25±µÕq*åtZ«ÞVÇB!D))z !êˆÐ oL£´¨­‡>,|öX1ÿÚD¡´ô­¨((¦„ ÞŠª¡(á [ÓøâÛØ3뿬[·Ž.]º°vÍ|²=³‰¿æe›óÄÒ–ì$°æðebLPF‰l–<µ~Ÿ*úþˆÓ…nyíßËm\Ù8êô+µˆ³qÝ9¼õ{!ûŠtÞ]`òóÿaÝ×`x<ìzò¢úô™ÔÐê¨Bˆjf?oÁ5sðÏ{×5ÏYœèÌ\5ÿO¯ DÄvó(1§ 1òÒ®ãÍÂô‹UÎW…ûï_ËÊx!„¢–ö&Bˆ:á`[¥lŵRZÈVBg¥ôœrh‘wéÊîÃ?E ]¯ªPvOh\wÃ64½ìAö0ùöÛoÙ¾c'zx<('þO¥éËÆ,ÚŒȧ¬à­¨¨õzbëð_ì_•‚·¨Ôœ¯“V° €® ÃèÛø ‹UŸ‰½ÃIŒ ¾\ULNl3šÝÿôÂ"v<ð¯Òwm!NgZÓ.hͺ\û#FNŠÅ‰Î,zÊZ¼Óþú÷V³ãšðæ4ã„™ès!^þ…#7­Š¿‹B!„8QRôB!,PÈç›m/à¶G3²õ]'ªÆt gÊÒb }S–qiç0êèOt¿s8°p1ù¿/æÀ¢%D÷ícuT!D5r ¾™àš0röøýcì]‡£&w´:Vd¤oÂûƵ˜~/ÎËÆÖmDÕOð¢§oÄHÝ€±w FÎŒœ=˜…9U8‰ŠÒuæ¦ÿÃÜ•‰yÅHÔ?ÞÇ04Ôî×¢®¿ÏÂl”.ÿÅÝYEí>áOÇÊf¢€g9þïB£;pè†s5ZÊCx~M…¸ë Ó‡à¼U¾Ùø7îC=ÿléÿÆ3o7$L&ìâ‹~0óð]у¾*|ÎB!„8RôB øë8¾MyK&t–¾O¢F|¿ã5ŠùŒhu;áöz'ªÕg IDAT c{¸yga™:ßoð0²³›æÞËš‘c0u”ç^¢Ó9½C›Ý !NOvÎ+ÅóÆu`èx§Ü…û¾ï¨¹~§#u=ž·n,+x;.ø ö¾ãªdl³0}ûôíKÑSÖadmC?þì.”ðz(N7Š3œ¡}»ìNô+0 sËߣµÇÞ£Zþ“¸ÎQPâ¡4ŸŠoG%:sË~ÀÄÌKÃ4•JŽý9„YPZ”×}˜ª5¦æÖ¬Ð±ü4̈®‡ý¸QQbQâoÆ•`‘`.?¸÷ê!ªü™-„BXM~ !j?ÿF¶¾v/;óÃqh^|….]û&ÛŸD‘Ð4¥P&,—ïÍbAê§Ä†5æü&×Xœ¨vÛ=œO—Sâ7ùpIÃ;º kÕ‚—$û˯(Z¿Ü9?{ÑP«£ !ª‘Ö²öÞc,ù#/߬gp^öÕ±ê }÷*¼ïÜ‚é-À~þu8.ºóä4ôÐæ¢ç¡o]Œ‘¹•JªÈeÔØd”¸¦¨qMPc› Ä4B‰ŠGŒ…ðú(ް£Nç›þ(ÅŸvDAi7uÝÝxæ—îïPo,®‹¡ìœƒYX‚R¿>× EÙRɱMÇz’yûQâ€T¨ß¥0 Ãl (€™›Ž™ùÞÅY`k€åÅ0Ê¢„Ë ÙB!„Õ¤è-„¨õŒ­o³®x#‹02ç°ug&õP‹³öÅÇÈÒbQŠNzƒ ËXõÜÓä¹¢ æš$ßòmöLä»_c‰vµ¤ÝͽÉxírÕ0‚Þf´»í?$a¢ïx—¥/äQ¸gî1_Ðï܆Hy\T‡9;_' ‡VÝjsª¢Yœ¨v‰r©ŒéÎGK‹HË×ùi³‡ Û‡‘|ëÍä|ó†ÏGÊ‹/3tŠ&ß;!NgŽ÷ o[‚‘›J`á'h-{bë,/x‹¾c9Þ÷þZÖÛ1ðFÃï>ñ }û‚k"¸~.fQ^¥—© -Q“;¢%wDmÜ­ÑYe›‘ž,5¶IùJ#l}ѧ¶Iäùè®§°ÅÍ!°ò#ŒñÿÅÕd7¦WÃ4MŒ ÇŽõ›‰¹ì%ô1â»Âíç<†Yt1æð[qv}ßò—ÑG?Š«Y8Â1–ÿ^aùìõ“Né¹ !„âÔIÑ[Që©-ÇÓÖ¼_žûƒ¤Ž½iÐñ|Úô­ŠAÁœHiýïl{žàÛ÷>§ù_âqxƒ®=šœ%³YCëÖ&%aøø¾‘x¦"£ÃG\xicü?&-¯0ð‡¦Ç]— myY3¢Ÿ;Fþ‘U.Ç“ÆÂ´ÐʵF‘gÑ=ñ"‹ÕNã{†óñ²" >_YÌ…íÃp4L$ñšqì}÷C¼»SÈþb ã®°:ª¢)®\ž§äåñ ðM{5®)jRÛ*ßóòUè{Ö ÔkˆÚ Y•ŒYÇàÉh-{UÛø‡ þñÞÿqhî!Å1ìÖÃÈÞIpùL+gadW8¯Æ4FksZësÐZõF ¯ʹ+ÌÑè¬òÌ4oÝø§cYÞ»¾ô‹ïð½ú]…q*;Væ¿S¶eæx¦„ú§¬üÓ…Ÿã}þàªóÝø?¾ùÙÛõ¼B!ªŸÔs„µ_XO:>ü í ¶“·e1ÓÆ°Âùß2˜âÌ4<)³` @UÎÇ£%àYø —F¡îÛ‚ž4Ü ›£¡Sœ¹w·xœí'ÐîÕKlŠ(N7ªîçÈoØâä}¿ý‚F€KZ߉¢HùÊÔw«Œììfæš6fX¿×OÇ$&ß@Ö´éè…E¤½ú& FDuÚjB!Dí¦6î€sä}ø¾zÓ[„÷£;»õS”ˆ˜Sר»}ÏÌü ôüŒªˆ[)_á>Üwj5¾;Å4ñÿðþŸß*;ä¸èNƒn:¾Û}%ÿøŽà²è{þ¨p^mÔ[§!Ø: EMhQe±DkÞÅéÆô•Tû\UI‰ˆAMlmu !„âŒ'Eo!D-gâ]õ,›}WÓåœV4èÙŠmM²îG>Œˆ†Íˆjúçh„È  ×NɬÁäužÏ Q{1{SJË׊¨„ÇÇR”ž†I ëß`»1–6Ç™fÉwô–ÿã+ºQk:]ñ#Ü!Ä!ÙÅ»X²w&M£;Ó9~ʼnj·Ñ]CEo€/W—Ð1É-:š¤ë&’úÒkø³÷‘=c&‰ãÇZœTQÝìýÆ£ïYCpÕ79)xß»×Mï ¸"OzLßWOTa£32·X9 {Ï˪e|³ä¾©÷Üôkè€fÇ9æ‘cÏgšè»V\þÁµ?T(0«±ÉغÀÖcjlrµd?"›­U‚~©ÙyO‘­Ý´…BËIÑ[QË)¸Zö‚W®åûo#p8 ¯Jý‰ÏgSQ‡>Jâÿnâç Ø<…¸‡½@§.çã>™ß75&²agÂ7¼ÌÎøƒ=5¢†=BÃçoâÇÍõ!Ø‚v·ÕƒýÇ—¦ÏÍ/TÛ3§¿ÙÛ_Æ0ƒŒl}Št?ª6ñvº&;Xêgîf/· 0ˆ Wi8é2>˜B° ½o¿O—£ØíVÇBT3רÇñd£o_Šž²Ï+WvûçÇܱ2úŽeè»þÜ¢z|T-Eo}Û¼Ÿü£¬ß¶ƒk h-{ñ3?ƒÀò™WÌÄÈM-ÒîÂÖi0öÞcÐZô´tp[·u¯èÝ«z^ØB!ĉ‘¢·¢ö‹ÀÙ àìÊÎEô£ËCßþéàÿÞûÐW]Jÿö(ë 5n ,ËùŸqéÁÇÍfäÃåO¤ocùûU/¦YGº^ó¯c= q†Ë)Ieef¨¯h³è.´ëoq¢ºaL×pV§ú è&_¯-áús"Ð"ÂIœx5i¯¼ooûf~Cü—[UQÝ4;®k_ÂûÖè)ë02·ãyýZ® %2ö„† ü6¥šB™‘±}÷*´fݪd<ÓSˆÖ¬˜ fè]mZÓ.¸&aš ÇÀñ}ý”ÕIŽ‹óâ»­Ž „BˆRRôBˆãp m++>x¸Òsõ›v Û„×p"Q—úsY”þ%#ÛѾÁy'ª;4.ïêæÍß É)2˜·ÕËà³\Ø¢£I¼z,éo½‡7%•œoçÐ`äp«ã !j€CØ_?ÂûÑ]è[~ÇÈMÅóêœÃÿ޽ÿ5Ç짬oYA ¥ýÓÜ›~…Kî9¹›ƒ~ËgâÿéÕr+ŸÕÄÖ8¯|­I' ´\ß¼€à–…è~Áô”G³a;ë<ì}®DkÛ¯z7׬ö¾ãüþqÅ6,µŒ­ã ´6}­Ž!„BˆRRôBˆãݸ¬ô'í—Ýн mñéå}‚FuvóÞ¢"ºÉ—«‹|– €†×N cʧ/鯿Mƒ*›‡ q&Pœá„]ÿ¾éX6ô¾Yÿ!°ø3\W?‹Ú¸Ãï5RÖÖ`Ò?ͽó@Jt Ý\>ÿ‚A”WÂ"q ù+¶£0R×áÿáeô­‹ÐS׃¡WGmÔ.´ª»Û%(1Uò|j„fÇ5é%ô”5V'9*[‡ ¬Ž „BˆÃHÑ[!Žƒôô'Ë,æ×ÔOˆs'Ó=QV#Ÿ¨˜p•óZ9ùy‹—?Rý¤î’\߆=6†ø1—‘9e*ž»È›÷+1ƒ{@!ÄéA³…V8·é‡ï«Ç1‹÷cìÛMÉ‹W µ>ÇyÑÎê_aå·ž¹­js$ÝŠû‚í”|<ç¸.7rö ­è­ÐÓ6 oþàªÙV8+Ž0Ô&QÜÑOÃ÷Í3e=½Ë_¨ 6ól†¢Æ59‘gU«¨ImQ“ÚZC!„uˆ½…â8HOoq²~KŠ'zkùàf7¢*µûmäµÕ¨.n~ÞâÅf¯ópËy¡MÖ’®ŸDÖ§Ó0uŒ?‘¢·g ÛÙ¡µì…ï«ÿ#¸öGôm‹ñl[ŒƒÖú´=Ñ’; D'`dW¤Ù½¸oìNðõ‰øÓ}€Û„WP¾½‘@žQñúS`dlE©ßÓ[E¹y防1Ò7`ä¤`äì©t¥6(€‰é÷„6¢¬ìŠÈØÐóm}¶6}OhE¹B!ÄéDŠÞB!D51LŸw¿@„#†¾F[œ¨îêÑÔIb”FfÎwæ4ã„™ès!î)7“oæ“0óÉ“x–ZÍ­ÙP[£%wBmÜ­iÔÄ6 H -!„Bi|)„BT“ÕY?pÀZQ8 É5Ø5—ʼnê.UáÃÈ.ÔY¶ÛWv.éú‰eÓß~¯Æ³ !jµQ{\^À}ßw8†Ý†Ö¼ûqnÔ¨@Á7øW6Ã1´Ûaucµçmh)Oàýì!¼_¯C2 [kQ×?€÷Ë'ðo/,½^Eí}¶ô§ð~z/ÞÙ;± ½¨jkÐN7j|sl.À9â8G?‚sÔƒØû\‰Ú°­¼…B!JÉJo!„¢š\åmSíœßd‚Åiê¾BZšÀìõú4wѹ#Q½{R°t9y?ÌÅ·7gRCkà !,¥Æ5Á1är ¦¯c×jŒÜ=˜² ,›ŽY”WÉ]&ƪ§ ŒGËû 5QQbêanÍ ]’Ÿ†Ñ%:3c?`b楕¶ÔVQbQâoÆ•`‘`.GQþÔr[ÑJ7Ý-=h`g _ Fö.Œì]7ü:¦ÙP¶EkÚ­u´–½QÂ"Oô[&„BqZ‘¢·BQ öXË®ü?è‘8‚G}‹Õ}IÑÝš8X™âç×­^ ¼Q®Ð›ÖNºš‚¥Ë1u̧ÒôÞ»-N+„¨-g8ÚYç¢q.F^:Á?¾«üb3›à¬©Ø®¹ -`b``æíG‰KR¡~”ÂTŒÂ.ØêײQâš¡(›373󼋳ÀÖ5Ê‹ñ§z¶søÝØ\Wþ ³Ó7¢ïYƒ¾}FÎîŠTÚ](Ž0Ìâý‡ÝÄHÛ€‘¶ÀÂOAÕÐw@kÛ[ÇA¨ÚŸÂwO!„¢n’¢·BQ æï™Röø‚f×åJq"Ftr³2Å_7ùq“—1]ÝÄ <gãFøÒÒÉþbo½Íí¶8­¢6Rã’~AáOøœOØÕ Œe/¡yרýn'8ç1ô‚<ŒñÿÅÕd7¦WÃ4ÀÀXþ2úèGq5ËG8ÆòÿàÏ+,7¼R?©âœšµaÔ†m°õ€y ‹àš9×ÿŒ¾ke¨ðb¼(±Øº_‚Õ=múŽe‡6è4tô”µè)kñÿô:jl2¶NCÐ:EkÒ¹ ¾ƒB!„µŸ½…Bˆ*vÀ—ÍŠÌÙ´ªßƒä(YeWU¶qñìO %~“ÙëJÊŠÞ¨* 'Žg÷“Ï,($gö÷$\)‡ !*R“ÚU<¸ûY<»~abnxˆ’~½ÿ”•ºá;|¯V²ZܳÿÇ7}þF•Ì_ %:ûy“°Ÿ7 #7•Àï\1ÓSˆY”Kà×PZâ¼ô\W?*’o]„¾m1úæß0K`ä¦âŸÿÌ5¾¶ž£°w‰\9jÏkÑw®@mÜÁâ4µ›Óׄç@‘í»„BœÙ¤è-„BT±ßS?#hÐtâ1®'"Ì®0 µ‹ï6xØ” %/H“˜Ð¯3ñ—"õÅWÑKJÈš:MŠÞBˆJimÎÍz°ÆçVê5DkrÂ÷©±É8/}ǰÛÌÀïcz‹0²vàyû/Ø{ÆqɽØ{^†½çe`ši®ý‘àÚ0rS0²wâÿöyüßÿ[Û~ØzÆÖ~`èûQKÙ;Ë ÞFÚ ÓÔ~FÚ+Î ý „BœÁäå_!„¢ ¦Îo©ŸPÏ•@ׄa':ý ïx¨mÉO›½eµÈâ.¹€â›)ücmgBÔ~Š+­ywKæ¶u¸à”îW\8.¼÷?`ï{Uè iXú%%ÿ‰¾çÒ ÔäŽ8†ßûpß1 ûy“P"bBç à¦x?¼ƒâÿ€ï«'02¶žR¶êâ›õ´Õêÿ/ƒ°:†Ba))z !„Uh]ö/ð…úªöO¾ UÑ,NtúéÖÄAlxèW˜Ÿ6{ÊK?¶ìqÖÔi5šKQwغ°d^{¯Ë«d%¼>ÎËÿ‰û®/Q¶ÀÌÏÄóÚD >¬°¦šÜçÈûÿç|\_ÄÖî‰ÚiaÚ˜¦À¹Écqµ8“$FidèÌÝìá¯ç*zÇ^8„ÝO>Cp>YŸIÒu@•7· !Êsœ7‰À¢Ï0dUû\¶î—¢5íR­shíÎÇý÷¯ð¾s3FÎô]«ð¼~a“ß=fáSkz6ZÓ³q^z?Á5?X6}×J0MÌ’øç¿óßC‰NÀÖ~¶ŽƒÐZô»«Úž¾ke¨/NŽi o^€­Ç(«“!„–¢·Bœ %¢ öSÁ¿ÿÈÙÂk.¨ SgQÚÔw5¤CÜù':½)ÀvaLYZDz¾Î†Œ†Þ"¢:ľŒ½ï¼wO ù‹–PïܾÖBÔ>vay #kgµO¥µîSís¨qM »ý30 µ´Õ¬+¹1õÎíKþ‚ßÙ?¾½8“ZX!jŠÝEØõ¯âýð‚›`ìÛ絉„ýõ£*|¤6j‡£Q;Þj²u1úÖEèÛ—jAbè[12¶–¿Y³£Æ4F‰IBND‰ŒE ¯úp×wŠÍ ®» ìNÌüÌÊžjÇ¿á8· JÀ.7fÊüßýˆqÂϪ myŸ•óC¨×ºi–;dHÑ[!ÄLŠÞB!Ä):àËfý¾Ð–âΧ¾KŠ«5å‚¶.Þ_\ľ"~:&9ÊÎ%Ž¿’ü¿cê:YÓ¦ÓäÎ[-L*„5ÌæÄuíËx§ÜMpýϹ©xÞ™LØ_§ „Eûþ#P㚢Æ5ÅÞw\¨Ð¾ =e-FÚôÔuÙ»À8lß=€±oìÛÅ)ôœØð¿}=ºÇ% ­ÿd´Ä_1PPÆyE4JB#Ì_ï·£Ž+o@ ¡D)¿¾ŸÀ^ÊÙÏÖ)…`Ž%©,»_JœãÆ£ì߃é‹E‹üž’/3°¹Í8a&úœG¤{*Ä:¸Û›û· ãú^dk…}ü=(‹îÿ=?t,¬;ŽÑ7 š>°§œñ<Á`é±@.„»1æ?BààîžÏE=‚«K>¦?…À´÷у‡r™Ey˜~O•¶B!ê )z !„§hQÚ—fè¯LÙÀ²f,zÌÛê-Wô®~œI ñíÍ û‹¯HþÛd»ýHC !ÄéG³ãšð<ž÷þ†¾åwŒŒ­xßþ a·|P5›PªjrGÔäŽe‡L¿#s;fn FÎŒìݘ¹{0òÒ1‹òNa2 µm_øãPÁÀ,@_ðl¨˜Þ@Añ,ÆÿÅ<Ìä;qŸ×2ü˜‹Å»%åìëÚ–ÀÞµ˜(àYŽÿû…Ðèܺ£6˜€ºîn<‹²Qz¼‚»¨½ï–þo<óvCÂdÂ.¾ˆà3þ¼ úÐs¯0nWØh±¾ uÅÃø¼QQ{݆¶û~<¿g¡4»-*µåmh)áù5â®'lÌ¥—(¨=+9·Tßï”Lý™JcÁÊŽ !„§=)z !„§À4 ¦M ÚO§-Ntfio')ZcïùÛ|Ü6à°“ªJÂØ1¤¼ð2œòæÎ#ö¢¡VEBkhv®} Ï[7¢ïZ…ž²ïÇÿÀ5é'ÕkûXGZ“NФSÅ“†ŽYr³x¹ Óz¿‚~‚kæ`äUì‘]ÖǪâày{C…߀Sµ£}(oÁÙ¾¢›Až­ìZ³ 'ôP÷aªÔh7ÆÞ<ÀÄÌÚ†y–Š“ˆ3®ˆsye]DÊe(?®µ÷}8 Ç;+çð'‚ƒ¹µtÎݳbCëYskVè’ü4̈®( €†SÉ9ÕÀÌK«¼à  ÊŸüB!ÎL²Ë–Bq 6å.$×ú£¼oã1¨JÕÄÑ hZ­˜¶?ÈŽ}åW´Å¹ Åúƒ?ë‹5žM!j» × ¯£6l@pÃ/øfü_ÍçP5”ˆ˜Ð†—-z`ë4{Ÿ+±÷‡cà¡a·â~7ÚYýÿt³Ž±ù7èz-ZdéÏZ¥ÚЧq´ ¯d2 µÿ¨;ŸÆ÷ÕÓø·ì£´z\ ³È‡(( Z¡(fn:æÚð~ö Þ/Ã7ë+Œnn`.»‡’yQ8.rXs>J\BhÎæã°·ŒÄÌÛ_z ¨ß¥0­´È®WzÎ0ŽR„·9¤µ‰Bˆ3–½…BˆSð{êç@h˾¯´8Í™i`›CoÑŸ·Õ[îœ=.–˜Á¡Õ÷/Å—¾·F³ !Dm¡¸" »ñͲ,K¦áÿåm‹S™פâÁŒwñþ}‡„ýåMÂ&?Ýü†ÀÎâJF00·/Géý(ÎQÿÀnÛŠÙììñ•½8m`¬š ÝžÆ5æ!É¡wrË_Foù(®«ÇuõƒØÝ'õ\Ì sí“ø½qöiZzTÇXö*z‹ÇpMx׀Ƙû`,{ ½Éƒ¸Æ>‰ë’¶çÌ*-j›•Ÿ;ʼjLã“Ê+„BœŽôRwU[ÙûË™5šM!j#{ï+p\ðÌ‚}xÞ™Œé-´8Uy¶n—X¡Î²µ€cu !„Â2RôB!NÂ’½_•=îÓèr “› }š;X¿×Ïþ’ò-Lœݧy?Ï#·¿Æ3 !Dmã¸ðö²ÕÀFæ6|SC?Æ]5ÇÖ~J½†VǨ“ìçM²:‚Ba))z×Þ`;ö¯$¥`†Y{~ Bˆ3UÐð³2ã[G¶#9ª½Å‰@ÿV¡'† ‹vú*œ= 3 gÖìÍ&„µ’ªáºæ¿¨;Ü𠾯ÿcq¨Ã(*Ž!7[¢Î±µ;­eO«c!„–’¢w-·6ûgþ¹` ÿ]:–§]Êã GS’ZñBïF>˜<‚‹.ËØ+.eè ±<»(ÓHã­á½xp¹ÿеÁõ<ÞoÿÛáeçÌ3xΰý6ù]ÖUù†©BqZY“=—â@>½]fqqÐ9-œ¨Jèñâ[œÄ ¹[t4ÙӥʼnB`wvÝ+(Ñ ~B`Ñg‡:ÄÞórÔÄVVǨ;l—Þou !„Âr6«ˆ#+ðçðþÚ»ñ‹ËŽemãƒuÿà½?/wm`ÅÛ<—?…_% îšÃ{k3 ¨gqÕߺ0ð¹¿ç¢€’oòu‹¿òí§ù´ÁsßÏ¥_=(aÇÿaîšB:÷‹B©Ñg+„uÇ’ôPkU±Ñ+i¤ÅiÄAQ.•N¬Ió³t·ä¬ :ļ˜Ì)S)ÙºÂ?Öyvgë !D-¡D'vÃx^¹ ÓïÅ7ã1”èlZ-´ýÚ—1Ò7[¤NP¢ Æ5µ:†Ba9)z×bÛóV”+x´cÿJŠù„Û땳Ÿ=žëÍû¸êú?¸ ozŸ{>×_Zàò7F<ù/¦¥_ÌI¹|ýæ .¸ëiòz°+§pN½ƒ7&=F‡šyzBQ'øsؘóâÎ#Êgq"q¸~-œ¬IóSà5X—î§KcG¹ó W\N攩ì›>SŠÞBQJMj‹óêçð~x;:¾OþŽ2ù}´¦]¬Ž†×T ¹B!„8!ÒÞ¤S”Ê×Z+(¨ŠVþ`DOîšö 3ž½þ‰…,zf ƒîøž°wæÆI0åƒøv|Ìûã¹¹—Ãmôe˜ÃC—\È…ƒÏ¡û_²_:œ!D¥–íýà ²emtnKWÙã…•ôõv·mCDÇÐË»9ßÎA/)©±lBQÛÙ: Ä9ê!L¿ïÛ7adlµ8•B!ĉ“¢w-Ö&¦7‘ŽØ ÇÛÇõ'ÌyØ“}?=óұŶ¢×E¸ç?“ˆùuÛƒ*ÇÝÂYsÞâµ7g‘tÓš©-.ºˆÀ§/27Û@‰¾'¾™Ã¬.¹¯Ù.S!*·$}áöztŽ¿Àâ4âÏZ6°‘zaxᎊ}½âÇ„6´Ô‹‹ÉýþÇË&„u½ï8CnÀôâyg2æ,‹S !„Bœ)z×báözÜÔõ¸›”kÓ›‰žþÓ• qg÷BùôZ† ¿ŒÑc.gä5³hûè­ô°—^9„[-á±¹çð·áõP[§{˜úX,ï]=„‹.ÉÈK†sùL~t4±ÒÐ[!*H-ØHzáz4Muãa…~-lß$³ â˸q#.F ­ÏþbFfBˆºÀ1ì6ì}Ç`È¢äc¥ð-„Bˆ:Ezz×r­ê÷äÑþsÉñ¤âЈvÆWzÒ`~6€8’³YÆþG?f§éðGølx•FBˆÓÖâôée{']faq4ç4w2}u¨mÉÂ>Fwu—;¯EF;t0û¾žMáê5xvî"¬Es+¢ !D­åõæl‚~Á,ÈÆóÚDÂn~¥~’ÕÑ„B!ŽIVz׊¢ÒÀÝôˆo!„ÕO7ƒ,Ïø€Äˆ–4¯gýÆ^¢r=š8qh¡·,-Üy¤'‡^´Èž>³Fr !D¢j¸&¾€­ã ŒÜT<¯OÂÈK³8˜B!ıIÑ[!„8ë÷ͧȟÀ9I²emæPèšj=³b_°âîÌQ=»ãjj¶oæ7˜Á`fBˆ:A³ãšð<¶ÎÃ0òÒñ¼6#s›ÅÁ„B!ŽNÚ›!„Çá`kEQé•4Êâ4âXúµt²t·_ÐdeŠŸ¾-œå/PâG"åù—ää²þbËÆ¤BQfÇuÍñNµ\=3?Ïk“p]÷ Zón5¡äÉ¡e+Ìը䙳2® Ï£6î`ÙüB!„8~RôB!Ž¡È¿ŸuÙ¿Ð.¶õ\ 'ÇÒ¯¥‹ç.`É._Å¢7Ð಑¤þïUL]'û‹¯¤è-„G¢j¸®z ¯f#¸b&fI>ž7®Ã9ò>ìýÆWëÔÆÞÍåZª¹©Õ:ßÑøf>EØ­[6¿B!ŽŸ½k‰â@>sw½CQ ßê(•ÚW²‡&QQ»êÄm‹$ÜQŸ{}¢œ ˆs'f‹´:¦BT‹³1L€>¤µI]иžF³X»sƒ,ÜáåîAQ®qÄ7 ÞyýØ?où¿-ÄŸ•#AöÏBˆJ©®±Oà¯ßÿÜ7@àûêqŒŒ­8G=¶Š/.Vß×OU˸'Cß½ŠàÆùØÚ°:ŠB!ŽAŠÞµÄÜ]ï2gçVÇ8ª-¹‹z>Ü^8w’£ÚÑ8²=ÉQíiÝ M‘ÿÍ„uÛÁÖ&a¶HÎŽbqq¼úµp²;7HZ¾ÎîÜ Íb+þ<Šsûç-ÀÔuöÍü†F“o° ©BÔŠ‚cØm¨ šãûò_˜~/%Óз.Â5ñ…*oý¡ïYƒ¾cy•Žyª¿M‘¢·BQH5²–hÓ›y{>ħ—Xå¤ò)>ÏžkËŽ957Íëu¥mì9t‰LÈV&Bˆ—Q´”‚õtox1vÍeq"q¼úµtñÉòbîôUZô®?à<ìq±rrÉž>“F7]ŠRÓQ…¢N±ušÔïGwadïÄÈK£ä¥qØÏ‡ãâ»Pœî*™'ðÛ”*§*éÛ—`äìAkju!„B…½k‰vqçòâµÇ¾Ð"ºÄ |ºO°€b>E%!„8.WyœÓh´…IĉêÒØA„S¡Èg²p‡—«{†W¸F±Ùh0j${ßyïž –¯$ªW Ò !DÝ¢&¶&ìŽiø¿yšÀÒ/ÁÐ ,ü„àºq »{¯Ñ ¨'?AÀ‹¾i~•å­2¦‰¾aêù×ZD!„G!Eoq\4ņÛ €ÛM}x­O/!½p3Ûò–±3ö-@7ƒd—ìæ»¯ðýŽWiU¿ç5¹š®‰J !D­d˜:ËöÎ ÞÝŒæõºZœHœ› =›:™·ÕËš4?E>“gÅUÜñcF±÷÷Èþb†½…â8)N7Î1bë<ß—`ä¥cìÃ÷Å¿ üú!ö7`ï64û ­ïXŽé«ï‚ nú»½…BˆZí^z¢rNÍM‹zÝÖâfnéö/ ÝÀ]½>á‚f×n¯€‰É¶ýËywÍüó×ü²ç‚FÀâäBQÞÆœß8àËBX*HÛ‹ºæœ¡Õ‚,Ýí«ôš°æÍˆìzA#÷ǹè…E5O!N Z›~¸ïùÇEw”µ61²wâûü!Šê…ÿÛç1²wžÐ˜zêúêˆZ%ô]«ÀЭŽ!„Bˆ£¢·¨vª¢Ñ&¦7WœõÏ^°Œ;z~Hׄ QKWwï÷fðŦÇù÷oƒY’>£¬5ŠBXmIú E¥w£Q§'£_iÑ`ɮʋÞñ£Cÿ} ¯œÙßU{.!„8íØ]8MÆ}ß÷ØÏ›„â úðÏ{‡’gFPòÜ(ü³ÿ‹¾u!¼GÎÈÚ^ñ`Üu„M¾Æú­ôÆþ½‡B!ÄÑHO Q£E嬨~œÛ R>å§]oã×=äyÒùpݽü¸ëmFµùãYWq+ `Mö\ÚÆô!Æ•dq"q2â"4ZÇÛÙ–`éQŠÞ± e÷Ï “ýåL®º²S !ÄéC‰j€sä}8O&°øs‚Ëf`ä¦`dlÅŸ±æ¿ª†ß5®)jR[”úI¨Ññ(îz`ÃÈK?ú`möÏlË[ƨ¶÷Ð?ù*é¥+„¨QKö~€ËN—„¡§§¢ws'/+B}½++zĹŒ¬iÓÈúb:-:<\c…â´¥(h-z µmldnGß±#m#zÚŒ¬'ÙÛÀ,Ø€(Áôå–>Ö¥ã-8ÛCt3ȳ J´co`bfmÞ7Kÿñw<¥Í…7•=6~¼ ïŸïû­ôsÔ_߃¾w?J»ÇkWžÕø?¾ùO7<ƒwã1òÅ69Îg"„B+¨Vâh깸«÷§\ÙîŸØÔPâ÷ÔÏxzñh2‹wXœNq:Ú”»ýÞLú4ºLö8Mônæ,{¼t·ïˆ×in7 .½€’­Û)X±ªÚ³ !„¨HmÔ¾ê5cІ=…kÜ38ϵX¸â䯱9QZVm6!„BT))z‹ZOAa`ÓIÜÛçKÂ[°·h+O/Íê¬9§Bœn~OýýÛÓ[Z›œ6ZÄÙˆ õ_]²ëÈEo€Ä«®,{œ5uZµæBQ9­iwtÕZ¸ÿû7ãýì^¼o?H +prÙZöMÞ4-„BÔfRôuFrT{è;³¬§·7XÄÛ«ocúæ§0Ì“Ùñ]!Ê+òïgݾ_hÓ›8Ù<÷´rpµ÷¶ìûKŒ#^ÖªQ½Bmmr˜K 7¯Fò‰ÿgï¾Ã£(Û6ÿfS6„JBB¤(¤(‚ˆ(¢¢" ¯ >El€"(E}UDTôµ"6TA:R¥†j€ÒûÎ÷G ‚˜drÇ‘#;³S®Í†esϳ÷#"r›Nµ¯·:Eœëßhu¹½¥L±;yðpã·éSo4Î6WLLíÿˆ7×ÝORfœÕñD¤Œ[3GmBz]bk)kZ„åµÉ2¹x‹ ¿—·™Mìì¹ÅMDD àÒô6«#œÇ°{àܤ›Õ1DDDäTô–2©}õûx²ù—øºU`wüZƯêÁÞ„õ'‘²lù¡™xºT¤I•›-N#E­y˜Ûéí—jqâש#®•8þõ7à¸ðÈp)NµÚ` (]F:7ë‰á^Áê"""r *zK™^±1£Z/ ¦_sNeçµ÷²äÀÿ,N&"eÑž„uù䶨vGþä¹rõðq·Q»Š ëdb^d[ÃÅ…ÊwçõtÏŒ9JÂÒ?J ¡ˆˆœÃ0píü¨Õ)òîpí4Äê"""R*z—g>n/çòrõcX³Ïè1ƒ\3‡Y;^fúÆGIÏI¶:Þ%eå¦[ADN;3%@ÛàÞ&‘ât¦¯÷‰{ã.>Yå»{b8åM~yìKMh)"bç&ݰ×·:®7=Šáågu )M9]Šå8²˜5‰‡g‘•›N¨wúÔKuïsßôe¯|Šú½§F£@lf6I‰vnó/ÝX‰œ•OQ¯ërú-YÊ ×º)|Ù»±~aXxûææ™wÖêæ†#5 jõçõÉiäeX󠯀Íp¢G­á„û4â“¿ž&#'…ÇæPÒv6zƒðŠ­Žxž'—óÕ¶‰K;ˆ»‹77‡æ¦ð‡1Œs¯Cåî™Ä C\ùì—'¨®KT"Å&-;‘ ÇP÷)^5,N$Å¥e¸OV§°::‹•\.¸­=(ßíˆ_¼„SËW’qè0n!šÜTD¤D6ܼƒ#vŸÕApŠlfq),½K±yQ“X¼FþrtâfÞ]ÿ/´ù/Wßs¶ui3‚93{áäîz}LßÏŽ!7ÕçÏg_eí¼±4÷ø{ŸœãéûšƒÉ?-¢MEHcÛÿ&°hs2 ÛxSvÊÞyU¹‰‘æñѦ¡LÚÆ‰ôCLZÓ‡Ûj£sø ó ÊV‰MÛÏÔõƒòGï§g'ñmÔDÜ\*Ð.¤oû¤}Ý‹ëæÖ kä)þZu”ºÝ›ã»õël<üÕ4îpý1¾Æ_>¤Æ˜t{óS ø‰'ú¿KlhM½Ž³ìXoVÌì{â*& ËJgŒSÇNc`öTŒY«¿3§R#xlÚ«Ü\¹¬ýˆ\¹µ1óÉÎÍ M°&°¼š]SÍWƒ´,“5û3¹¯¹çE·¯Ò·ñ‹—€ÃÁñ™ßúô°J*""g>Upò©bu )CJGP tfBµ³%eƱ%vÑE÷ËHˆ'ÓËÀÄQí>¦ÜÅȱËIÉo`šË¾_~Ž×`ZUÿœÙ¯×aö˜¯ØøÛ;½Êûÿ›ÉÌɽ×å0)g–ÎkmâîâÍuUo±8'g\W=¯ÅɦÃYdæ\¬³7TlݷмIÔŽÏœ#ãâ`ŠˆˆˆˆˆˆõTô.¥LÓA–#£Àû2rRÎ[—½r½{ô Çí·ÒkŠƒáoõ'8ÿÙµQýÞ)^®y=÷öÚȸÝY¸ï=f®¥ù zþÒr’.²—JÕqÜÜ=©T'ÀÍÝ™ìl0íǾË#㹯w‘™•ÉјT‚Ã*aÃÀ¿~ªÙr9}˜c¿¼ÂƒýûóàkâbKÁ{ðTú'NàžÎ7Ògü*’œŠþq‹”Vѧ6q$yÍoÃÅÉÍâDRÜZ†ç½³rL6ºÄœ6Uzß@nJ q ¾/îx""""""ò/©è]J†ÈŠ×¿ƒš~-Î[ïÒz8_ϛǼùßóì‰ôªõ¢-ˆ>S%~Ì‹,I6'"ºv%ûË7YëÀð¹™qß-dÁ]±Ç%amY¸h\Séžoó=ªÜ@¶#“ùQ“·¢;Qñk,ËUÓ¯yÁë} ^iÙ¬ýïslm?…ioOáÙ›Á4¨äƱ# ˜˜$ìÜNŒÀ‰êaÔ¸k<3>ù„O¦OeÚ”~øïK¦éˆY°h!¯Î+sNR†¯{ˆ\–3£¼®éca))-Â\óo¯‰¾ôÈí*½ïÂÙ»1~§/‹ˆˆˆˆˆH餢w)voƒWðs Ê_6 ·Õz’ïzWt<£JO&>é`ÑÒ¼?ð¯yš¯Æú3ãÞ›èÚý6nëÞžã’<æNüËj“ð±WfH“÷Ôä]¼í•ˆI‰âµ÷òÞ†ÁMÙ]â™V¾‘ÖÁwŸ³.¸B]n­9ô èL­Ží‰û`0CžxšO3¼â]6¶‚ßç÷sßàÇ™ð§I€ÍÀÀFø€1´û}w÷Èý÷<Á[Sáè†÷êM¿ðŸMè{ƒ_™mq#r92rRXôÂ}Q­B‹IIñu&Ð'ï#-«÷_ºèíäåIå»{qà ñK–k>ùwŠ«®õÏãt£€Û[WÐw£Ëg¾lÜv:ë¶í¬å³¿ôÕ655õ³f‡,b™¹él?±ŒŒœdÂ+6¡ªgd±ëj—–ÈœãY3ÓÌ¥g6Zõ [äãx„”hž= ë8’…·=€k*uÄÙæzé.CîÑu,‰ çÆF¤ýø0m¿ïÍš©(Ú³ˆ”mË~ÁWÛ_à¾ãió RrõšðK"ßnJàûG*SÉëâ}2c޲±S7ÌÜ\¼[4£þ§–DL¹€ °uëV tÞ}$¹|'Nœ8oÝôéÓ6lžžžÏËÜ |9 ønžµlžµîŸ·Ïþ¢Ëû~©u\d]‘7Ðtu¥œÝÉ&UºXãªàáâÃý×L Ch?æGMbÛ‰e˜¦ƒÕGæ²úÈ\®«z 7„ ¢b“ÉS÷5|›Ûñm¶8~}q4úV$å˜ Ni§‚·È?¬8< 7gOšv³8”¤aöü¢÷šýYÜÚÀý¢ÛÛƒñëÒ‰“?þLÒšu¤nÛgýº%UDDDDDD.“ŠÞRî„x×㱦3ˆŠ_ü¨‰DŸÚÀúc?²þØT«P›VÕî¢i`7|ì•-N{åŒ*·ðÚü[¬Ž!RjíOÜÌÁ¤m4¼»Sñ}jGJŸ¦¡®Ø p˜y}½/Uô¨öð@Nþø3‡§N§ö»owL‘sxm2±sæYã< ¾üî5"¬Ž!""""’OEo)·jùµà™–ß°5n ‹öÏ`×ÉUIÞÅ7;ÇñÍÎqDTlBƒJiP©Áê`jƒ/rµXzàóüÛmBzY˜D¬PÁn£A+[Žd±î@&l—húæY¯Þ-š‘´f K–’qà n¡ÕK&°àHÏ '1Éêç1WÃè""""r5QÑ[ʽ¼¢vG'ï`ÅáY¬‹ùŽÔìSì;µ‘}§6²`÷<\|õ¹†ÈŠ×â] ¯Zø»WS!\¤ JÉŠçÏcß^±1Õ½XœH¬Ð<,¯èæ êx6uªº\rŸjƒ’´ffn.G¦Dä¸1%Tä|þ7w¶ôü'þbéùEDDDD.FEïRâHò.ާî³:ÆL?‚¿{5«c»š¾Í‰¨x-“¶²ÿÔ%m#37¯çkZv";N,gljåùÛ;Îx¹úááâ»s…Ó“Q¸Ø\1qëÈ!ÔçB}ZôˆŠFRÖ ®mYݰ IDATíÒ!‘²àC_‘ãÈàÆ°§«´³óáŠÖìÏ,TÑ»bÛÖx]SŸ”¿¶7ï{‚‚=(°¸£Šœ§Ö[-=ÿ‘éu98ù-K3ˆˆˆˆˆ\ˆŠÞ¥@|úƯ¼\3Çê(r™rÍ3cIÌŒ½à6»âW—`¢âóÓÞ©<Ôè-jú5·:ŠÈ¿’ãÈféÁ/ðu«ªÉ‚˱A®xÙ R2MÖìÏä–^…Ú/ø‘AìüÏPÌœb¦Ï |ôsÅœTDDDDDD.‡ú2”N6—Ó#„EJ¯¤Ì8ÞX{/oyê¢E~‘ÒîÏ£ßçÿ_r6ÃÉâDb›ÍBíl9’Mz–Y¨ý|;¶Ç£v-bçÎ'+6®Ø2ŠˆˆˆˆˆÈåÓHïRÀÇ^™1íq4e·ÕQ ”šDvn:ݪX¥D¤e'¿š= ë‰I‰Â4ÜÖÛ^ {%<œ½ñq«Œ³ÍŽaØ g R²hQ­.eôÂFFN*ëb¾ccìϘ¦ƒµ1óÙ»˜[k ¥ch? ¥ÌYv0oK'7®ékq±Z‹0;K¢2ÈÎ5Ùp(‹6‘öKïd?ò0QCŸÆ‘™É‘éþü³ÅVDDDDDD EEïRÂÇ^{e«c”[¦é`Û‰¥,?ô5[ã~?¯ÕŒAU¯„WlLdÅk >=‘¥s9éqݸJg&meæ¶—ˆNÜLFN ßìÇÊóéSo´ZžH™±7a=щ›ht;^®¾'«µÿ»È½::³pEoÀ¿s'Ü#ÂIßÍñ/gQíá¸VÑÿãRöäl~‰Öê³ô«^¸[FDDDD¤ˆ¨è-åZŽ#›•GfóÛþOΛHÔf8smÕ.4¨Ô‘úíË}q¬ºwžn9›•G¾a^ÔDR²ˆI‰âµ÷Ò,è6zÖ¡ 7Rêýýw!«Cõ~§‘Ò Èlj_g%ä°ö@fáw´Ùyü?Dýß3˜¹¹úïT"Ç.¶œ"“½ò)êu]N¿%KyáZ7 …/{÷ vÂ/ W7C)Tô–rÉ4¬;úßí~“é‡Î¹¯A¥´ªv'×T¾[áFü•†a£Mp/WéÌ‚¨)üqx¦ZžH™q4e[â~ ^ÀõT«PÛâDRZ´såPBûOæp,)—ªÞ…{ óïÚÏ?&uÛâ¾]@Ѓà^Ìi¥$¤nÛnu„e'$\à'BnªÏŸÏ¾ÊÚyciîñ÷=füRÆ y-•1N¤Ð`øûŒªù;OôŸÊ‰ð::í!Ŭ™¸Š‰ƒÇ²ÒÙã”ADZÓ˜=•cVãêï̩ԛö*7W6J䱊ˆˆˆˆü*zK¹³%ö7ìžÌ‘ä]笿)ü!:„öÃÏ-È¢de‡§KEî©?–6!½ÔòDÊŒ_£?ÈïÑß9b°Åi¤4inç›i@^‹“<.±Çi†AèSCÙ>pfn.§ü—Úï¼QŒI¥¤léyÕ.“‰£Ú}L¹}:ƒÆ.gþøÆ§×;Øûñ‹,n9ƒÅOFbîžÈ ƒ?¡e§9ìîñ5 ­FÒì{˜=Û$ú£‘|wít–dî°Z˜6qD9ˆˆˆˆH¡Ï;J¹q"ý0ÿý³?ïm”_ð¶;yÐ5òQ¦Ü¸žµŸUÁû2iyr_ƒWóÛ¿œiyòñ–§HÌŒµ8¡Hž„Œ£¬;º€ðŠ©å×ÂâDRš\[ÝŽóéwDk÷_F‹À§M+|Zåý>Å/ZBÊæ¿Š:žH!Ù¨~ï:ô"/þžxz].‡÷Ÿ¤z`l€SHÁ±Ùy$‘ ê•°aàNe›ƒÃч9öË+<Ø¿?¾ö'.¶¼O¥âîé|#}Ư"Iä‘2Bã5äªç0sùíÀÿø~÷›dææäs¶¹Ð6¤]#ÁÛ^Éâ„e›ZžHY°xÿÇä8²è®QÞr.OWƒA®l:œÅºY8L°]F‡êÇò×]÷‚iýÊ®™ýEñ…•W}øP«#ä‹_´„”M[.¼-ˆ>SåçÞ/²Äà>N„„p`÷aDbÜáÀpúWõ⻃q8¨Fâî(Ž:Fúã™1¤¶Ì£ìޱã±o'MG|Ì=YlÛæôbÞÀÔàDDDDDJ;½åªv4e7Ÿþõ,û7篫_©=wÕEUÏH “]}ÔòDJ«ÔìS,?4€ª^‘4¬|£Å‰¤4jngÓá,’2ì8–Mý@—BïëÕ >þ]nâäÂ_HÙ²•“ ÁÿæÎŘVJJ@÷[¨öð@«cäË:rôâEoÀ¨Ò“‰O~Oó{2©ˆ/ÓyÈPú €“Ytû7Uaæý}¹sM-}r¨jƒÐch7dw¯¬‚GJ2¦0”9 ý>þÎ$&4¡o??¼EDDD¤LPÑ[®ZúŠÙ;Ç‘›äe{Õ}æA·[œìêv¦åÉÊ#ß0/j")Y ù-OšÝFÏÚ#ð±W¶:¦”#¿F˜ÿ)Îácêì%çkfgÚɬٟyYEo€Ð§‡‘°d)ŽÌLöŸDÅvmqò(dop‘É¥õD~o}fÉ ÒmzfùzF}}ý?öèÃGËúœwœggþð5“™ß½H£Šˆˆˆˆ”ýå/Wôì$¦o|Œ/·½_ðnRåf^ºþg¼KÈ™–'£¯ÿ•v!}1 &&kcæ3úÎ,Þÿ13×ê˜R¤d%°ôàgø¹W£Y ^¤`u«ºàí–÷¶huôåõõ°W£Ú ¼ÁYÇŽs佊4ŸˆˆˆˆˆˆžŠÞrU‰>µ‰WVvgãñ…¸9{1°Ñ5y‡ ®þ§+δFÐðW fƧ¤ï‹.ÒŒ""""""R8*zËUcéÁ/˜²öâÓês £ZϧYàm'“3-Oîkð*^®¾ù-O>Þò‰™±'”«QRfK~@%PZU»ÓâDRÚµ³〵û/´·Ín'üùg0srˆ~yB‘æ‘ÂQÑ[ʼ¬Üt>Ù2œ™Û_"Ç‘Á ¡ýyºål*y„ZONSË)i ÷½GVn:·Öx›ádq")íZ„Ûóo¯ÚwùEoߎíðíЀĕ«‰›;¿H²‰ˆˆˆˆˆHái"K)ÓâÒ0}ãcNÞäµ3éwÍk4©ÒÅâdr!gZž´ éÅÌm/¸9¿åÉÊóéSo45ýš[Sʸ„Œ£üqh&^5i¨™ØäÒªTp¢F%göÄå°ê úzŸþ³$®Y‹#=ƒý&áÓº%®U«aR8þõ7åúü"""""£¢·”Y[bóÉ_O“ž@ W 5y—ªž‘'“Â8Óòdå‘o˜5‘”¬„ü–'Í‚n£gíøØ+[SʨowM$Ç‘@÷šC1 }°I §M¤{âRˆMÎeo\‘•.ÿ­’=¸¡O #ú• ä$&±gÔKÔûè=0ŒbH,åÕ¾_¶:‚ˆˆˆˆH©¥*€”93—ùQ“˜¶aH~Á»i`7F´š«‚w£–'R%mçÏcßPÝ»>õɹ m"þnq²|oƧê}}ði݀ī8öå×ÿ:›ˆˆˆˆˆˆŽFzK™’”Çûaß©8ÎÜQ{7† °8™üjy"EiÖŽ—1MwÕy®•»¦š+Þn6’2¬Ø—É-½®ì@†AWǰù¶»ÈIJæÀÄ7©Ø¶ n¡!EXÊ• A©|÷VÇ8[õêVG9‡ŠÞ¥ÌŽ“ËùýÀg$g¤ºwºF>¢§m?ñŸlNrÖI|ì•y¨ñ[Ôðmfq2)*jy"ÿÖ†c?±'a×Víª‹%rÙl´Š°óóötþ:’ER†o·+û`œk`UžÁžÏãHOgçàÇh86»ýÒ;‹Àˆ=(Ðê"""""¥žÚ›”"[bãíuØ»˜èS›Xzðs&­îMFNÊyÛšñ?ñ|öÔ©Ü•cM²W>E­ë¸åÖ[¹µ[Úµ½Ñ‹ã0áÜûNõxö;âÌ,öÍÅ]n¤ë­ÝèÒñzº þˆÍ)fÉ?ø‹È5s˜»kïü90¿à]Û¯%£ZÏWÁû*¤–'r¥²™ÌÙ5›;j°8‘”UgZœ8LXµïÊ'´¨Ô£;þ]:½ŸèÑãþu>¹8ô.E~Øó&çœO¤bõ‘oézÿ9ë ¿®¼2'×Ö#ó×¹´Áœ™½prw½F‡‡>¦o‡gÿÇ}gälC÷×Lþim*@Ûþ7E›“iØÆ»T48’¼“6=ÎñÔhl†3·Öxœ›#þ£‰é®rjy"—ë×èˆO?@§ð p¶8‘”U­"ìØŒ¼¢÷Š}™t©ç~é."rÜÒ¢ö½ŸØ¹óñ¬W—ª÷ßSDiEDDDDDäŸTô.Eâ3ޏ>áë/&#!žL¯pÛúlþrZOcwò°0‘\ ÚDØÙ|8¯§÷_G²hìú¯ŽçA /³ë±'1³³Ùñð#4únn!úD‚ˆˆˆˆˆHQSˆRä®:£p±;¹UDÅ&4êñ÷ 3‘߯äëȉçdŠ;žnyÕi—ÖÃùzÞ<æÍÿžfM¤W-·‹œÍ‰ˆ®]ÉþòMÅ:0|nfÜw YðFWìqIXÑ1ùhÊÞßøo­ë—_ðös â±ë>b@ÃÉ*xK~Ë“g[Í%ܧ@~Ë“q+º³;~­Å Å ü2ÿ¹¯_©=-Î~͹B­"þþÿxÅ¿ìë}†_§~dŽô v<ø²ŽÇɱEDDDDDäoé]Š„ú\à mdÅáÙ$fÆæÓ6Á½q2Îzš o®¹Öä¾¾7ò‘-×¾“[áÒÇÎ^ñwÞúiþUÃû&Fú4_Lj{oâ 7O\ÈÅáY—ÁcîÄ¿GyÇgÄðÞ·Y}ä[§[™†v!}éQëiÜœ=K.Œ” jy"gÄgÄðmÔë¸;WàÞúš$PŠFÍÊ.xÙ8‘â`å¾LiWˆÿl !äñÿ¾7š“ !ãÀA¶LýÏgàâç[$ǽKJ¡ô¨5ü"[Tê2Ÿ»ücuëÉlk]ð.­'uè‡ë6š™Ý® hˆI‰â·ýŸ°âð¬sÖ× hKZéîÝÀš`R&¨å‰˜˜|¾u9©ÜYg¾nU-N%W háÆü-iì‰ÍæDJ.^EðzbÔœô*ެL~[JúÞ}lï?ˆúŸ~€sE}¢IDDDDD¤(¨è-%*37 Ç~béÁ/8¸åœûB}Ò£Öpêø_ z/R€3-OÚ„ôbæ¶—ˆNÜœßòdåáÙô©7šš~Í­Ž)Åà·ýŸ°ãÄr ïbYëà»,N$W›6‘væoIÃ$¯ÅÉí ‹¦W¼áâBíÿNfçÇ9µ|i»¢Øvß@êñ1Î>>ErÈk¡²çÙŠìxÅ)dè#¸G„[£Ô‹=—SËWY#_èˆ'±ZCDDDDä<*zK±KÉŠgû‰?Ø»ˆ Ç~:ïþPŸkè1˜ÆUº``Ñì™Ræ©åIùr0ió¢&àæìÉ} ^Õ뇹æ¡v\ ²rMVì-º¢7œ.|¿ó&;=JÒÚ?IÛ½—­½î§Î‡S‹lrK3'‡“ )’c·À~}­ŽP&¤nÛQªžÓàGYADDDD¤@*zK‘2Mqi8”¼ƒ]'W}j‡“wœ·‹“Mªt¡]H_"}¯³ ©\Ôò¤|HËN䃑ãÈ oýWðs ²8•\Ü] š„¸²f&ëd’•kâêTtWlînÔ™ö_vy‚¤µ’¾ÿ›»õ¤îŒix7½¶ÈÎs†³w‘óßÈIL²:B™fÕó©çMDDDDʽ-’kæq LÓê(…’ãÈÂÙæJZN"¹Ž\ÒrIÍ:EJv<ñé1$dåDÚ!&m½à1l†35ýšÑ´j7® 솻sÑL &òOjyrõ21ùxËpN¤çMTÐ!ô~šv·8•\ÍÚDÚY³?“´,“‡²hf/Òã;yzR÷£÷Øûì œøa!ŽÌL¶÷{ˆêO %h`?0ЦÈ^mÐ@ª?5´HŽUTN|÷#»‡´:F™Õlí–œ÷øW³Ø7Z“‹ˆˆˆH馢·rYŒ[Ñc©{­ŽRh&—_ ÷w¦–_ êø·¦~¥öxºh’.)9jyrõùyßûl[@xÅÆÜY{”ʼnäj×&Ò)‹óF¶®Ø›YäEo›«+5'OÀ-´:‡ßû37—¯O!qÕ"ÇÆµŠ^§DDDDDD.‡ŠÞÈÌM#.í€Õ1.Ë¥ Þv'<ªSÉ£:Õ*Ô&¸B]ªû4P˱œZž\=¶Ä.f~Ô$¼\}y¨ñq¶¹XœJ®vÁówfÿÉ–íÉàÉ‹©¥„a2ôQ¼^ÞgF‘“”Ì©?V°¡ãÍ„=?‚*½ïÂpÒ딈ˆˆˆˆHa¨èmO—Š<Ñìì?µÉê(…rx¹úâéâ‹·=€ ®þVǹ(µ<)Ûv\ÅG›‡`3œÐpŠ.ªI‰iagÿÉŽ&æ²ïDÅ÷öÉ·c;ΟÍÞ‘/’¸z-fn.Ñc^åèŒO {î|;´+²–'""""""W+½-R˯µüZXC¤Ü) -OÒ³“ˆK?„¿{µRÑò'íçQ ;ú0Óú‡c³:L$þÅû!+7ƒÞõ^¢^ÀõVÇ’r¤]M7¾X— ÀïQDxëùìAÔûd:ǾšÅ¡7Þ&')™ŒC‡Ù9ä <ëÕ¡ê½}¸­6W×bÍ!"""""RV•Æú†ˆH±:Óòdôõ¿Ò.¤/†aÃÄdmÌ|FÿÑ™Åû?Æaæ˹ÜûOÿÖœñ+oç™ßZðmÔÄÛe¯|ŠZ!×qË­·rëé¯Ï~G\QÌ}kšäî{“{ŸYN6àÑåU¦—Ò‚÷ñÔ}¼³þAÒs’¸½ÖS´ ékq*)oVsÅÏ3ï_Èï»3J椆AÕ¾½iòË÷TíÛ;¿µIêöì}n4믿‰½£^Ê .r¹’¿¸‹6㶣߹i¤·ˆ”[%Ýòdsì"¾Ûýfþ²ÃÌå—}ïèYƒ–Õî8o{—6#˜3³îùk²Ø:±+\Þ`Þ^|Õ·Û[À³ûî§Ýì0ºÖ7ˆÝ² ‡fðß{?äu¶xTÆ8‘Bƒáï3ìè:Íò§–‡?uí X¼~ãÛ…34q(·ìËO‘c¸an ºÖÌâØ¦8=øï´XͰþïZ“@¯ã,;Ö›3{ãQd?• ‹Mfâê^¤fŸ sø ºD )3‹œËf@»nÌۜƮãÙMÌ%Чdúk;ûV$ü¥Q=øG¦Ï îÛ8²²È9uŠØ9óˆ3€ŠíÚâÕ°îáa¸G„ãZµ 6— õ¼Ï"zÞh†¿½šT77r“SpoþS^½‹<^6elç“¡Ïðu¬'ÞÎ$Ä»qÓËïódÕOè7­)Ÿ¼ÞÍ€ """"削Þ"Rî•T˓ǼþøÂ‹ÞÙ+'ѻǗ§G`;yßLü¿·èÚ{$cÓ<ØP÷5fµõ"÷€AbÀ¼8áVܽC—¾ŸóÛÞYÜr‹ŸŒÄÜ=‘ʃLb¼º°è³Ø绊}yk52¾È;Ÿa˜$ø¶gԸθlxžV“þà¯]o±§ç,~üOqÿ»™?”D7áƒI[ywýCùï6Á½èQûé8³HÁ:ÔÊ+zCÞhï{šz–èùíÁÕˆû!C%nþ÷Ä~ó-é{÷åßjÙrN-[^¨cålšÀ=ãsx}ábÚù`&°üÍWY¼íV"CW1æÁ×øËÇÔ“no~ÊãÜHÙ›ög_ð25¦ŽÁí“y¬ºÁ©Ù÷ÑåÖt>ôÛÏÚw`ÆÛ ³WgN¥FðØ´W¹¹òù¯"[ûö/ªU‘:ñÃÂBÿ\K‚#½àOdÿù“OÝÏŠo{ã äD/dÆæÌùx‹×.c|[ðxóElÓñd É rã—'qn fâ*&ËJgŒSÇNc`öÔB=o"""""¥•ŠÞ""üÝò¤q•Î,ˆšÂ‡gbšÖÆÌgKìbn­1”Ž¡ý°W>ºÓa:.k½Këá|}ÎHï<P»÷Q^‰jŠŒª¡Õ±¶ÊATNXÆÎý'©Þ%8¯`Apì Ž:œŒÇ(øŒ6‚ªâ®n¸ädr4&•àÆ•°aà_¿Õ~º²Ç~9¶Æ-áÝõç/· ºƒ¾õ_¦dÊí"kZÝ/»AJ¦ÉïQ%_ô>ÃÅß ýØô½ûHX²”S+ײå/r“S q„\öýü î}>¥­ïéS†/mÿo"mÜÝ© ™Æ‹]ÂH™Ù‹ö_næ?ZpQì0OÞiðø¼ƒ<ò¸7?Í9ÄÍ÷SÍucò÷ÝHÇŠ Hìô!s‡ÕÂ<°‰#eí§ÃANb’Õ).É¥q_š#¸gà&n¸¾-Ú¶g`_žmy£B_FÞÖ†¸8/îúl OŒ ç—ÙÑtjëÇR‡ƒ}ä»k§³ä™Z°}G~E“–eüy‘rOoaEDÎRœ-OTêÀº£ Î[M厅?HúŸLz;‘o„ðù‹?Òí½nØÉ%f_4é4ÄóÈbü«Q?"€9»ã óà†S̓aû»plš—jnà_ÉcG0©LÂÎíÄ8>ëe21Y¸÷=¾Ûów ˜NaéYg¤ Þb9'ƒ6‘nü¼=-G²ˆOuä÷ù¶Š{dî‘=4L“ôýÈØ€ŒCGÈ:KN|<±sç¸onnÁ—¾L»Á±oÇòÈ÷Þ¸ÞEfXöéYþyQ,›Àžwá1pѽø6¾;c83ûµ³÷Í¥Ö£Sé?y÷t>€#â.^šXðkˆÍÕl¥gfGFÞˆjgoo|Z·´8ÍßR·ï ãà¡óïðjÆÿÍúGNîaóÚUüþú]<ç1œ¯ºÙÀ ðΈèü+‡4eîÉî<¼’¥Ž>̱¯ðàv˜‰¸ØÚã=x*ýߺôó&""""RZ©è-"R€âhyÒ,¨;û7óûOó'¯lÜ‹¶Á½ Ü>{ÅkÜyë§ùLÞí¸#d»ú~Ìó÷xùç<5÷:ÞÆ†wÜ/<ÿØ÷ÄìØOÃáŸÑ¾mK:JŸp2‹îcß#äàŠüc;G4¤Òï/ñä—Óxù‚‰mÔ¹ïüÞÏ}ëjQÕÝ$ÀV<åç¤Ì8>Ýú,Ûâ–æÙpâÎ:#¹!´1œMäÊt¨™Wôv˜°lO=•DwûB2Œ¼~Þáaù«r“S (z;ѵ+Ùý§ðóýoÓµŠ8N²tì0µ‹®?<ÇÖö¿3ëo޼ ‹w\øâ˜Qõvîòy€¦º‘Ñc"'ßíù}s9•LÓsG[Ævà…9½˜70à¼×‘zŸL§ÂuMŠægQVÕn@Åöm©9i¼Åiþ=zÇÎ+z›Äý:‘éé÷òìm5h޵͚›¬ºq {oþû§Q±+ý›Oâ{Èí1•0ÛJÀFHD5êgÆjØ2²;ƎǾ…zÞDDDDDJ+½ED. ¨[žôªû7† .íþî!Tò¨^à¶.­'UÀ`>x†§ouy÷wºÉ_Tlû(Sž«ÇßIª2êëëÏݵÕLÖœ¹9„ï6ž™òòÊágÝßàyV΂ܣëè÷Ö—ÜØ(€´æ·ï})걘kcðŶçÈÊMòFÛ?ØøMêú·-â3‰ü;­ÂíØ 2sLï*eEïËàÜðfŽË“½:0ÉÝ §¬lü:>Íäë}±§µ'nò`†¬ &4²!Á+Þæ‹­éUÐŒºÝíˈGÒxesuÖÿsßw˜S+„%£ßÂÇߙĄ&ôíç§Âi‘3hÜãñþtyß wƒ¬TõÇL¡E­©4*ïç›}kÑþŽ ½eϽ„m!€ðch7dw¯¬‚GJ2¦0”9 ×ó&""""e˜ŠÞ""—PÔ-Oü݃ñw.ÆÄEÇf‹ã×Gó¡oER޹ðè”v¸ѱ$náÛ¨‰ì:V÷+ IDAT¹*]M¿æôo8 ?· ":‹HÑqw5hfgÙž ÖÌ$1Ý{éiÉQx.„v™9Ý ¸«Û[,éö÷âÈ¡§oÔ=ÿ¢w~Îá;/¾ï°GŠ*·\ˆQ©£fv`Ôy÷œ}²rT»{·ùxÝ{æ‚'<;ó‡ì7™ùý~ˆˆˆˆˆ”*z‹ˆRq´<) Î*\5£Ê-¼6ÿ–"=æÁ¤mü=õGÌoóââäF÷Ãè6Ã(‹ED)/:ÕqcÙž r°$ªìŽö–ò&“5ÿÈ ?Uâ±nÂËê8"""""ÅLEo‘ËPÔ-OÊ‹ìÜ 6_ȪÃß°+~õ9÷5¬|#½ë¾ˆŸ{5‹Ò‰^»n¸¹dd›üºSEo)+ì´xâ ~yÂê"""""%CEo‘+PÔ-O®63—˜”(¢N®&*a-;N,ÏïÙ}F-¿ÜZs5}›Y”Räò¹»´´³hgfr2Õ¿§> """""Rš¨è-"ò/\¼åIw*ºZ±Ø%¤ÇPÁÕä¬2sS9™~˜#É» ÜÖÙæBã*]h_ý>jø6-á¤"E㦺î,ڙÄE;Óé}§Õ‘.)eÛR·m·:Æ9RJYž²Æªç3e«ž7)ýTôù—Îny2wçV™ƒ‰ÉÚ˜VG+œ gjù·¤Q囸¶êÍTpõ·:’È¿Ò:ÜŽ§«Aj–ɯ;2ÊDÑ;qÅ*¶¬Xué ¥ÌØÒó«#ˆˆˆˆˆ”Z*z‹ˆÓt°éø/l‰[ §'g,<]*âïL€GÁêQ± ¡> qs.ýEA‘Âru6èP˶¦³5&‹cI¹TõV‘ÒBEo‘é`ÒÖü¾ÞgyÕ¢sÄ"+6±0Yñ311 O—Џ;W°:ŽH‰éTǶ¦c¿îHçþ^VG:ÍÍNÄØ¬ŽQ(n¡!VG(ºß‚GÝÚVÇÈçZ¥²ÕDDDDD ¤¢w ÛvbQ'WãæìɵU»RÅ3â²öOþâ.nÞ?–eÏÕãŸcÊÒ~Ű£3­8šRK¤ø¥fŸbAÔþ8<ÓtàæìÅ­5†Ò1´6C#?E®VÍÃìTt·q*ÝÁÛJgÑÛpq¡JﻬŽ!E¨ÂuM¨pÝÕ}1UDDDD¤(¨è]‚fíx™%þ—¿üãÞwÜd* *uâ¥+]ôø]^eúÅ603oÄ`>ÜžMâÎåìõn͵AÎøtÃÿ¿ö’¿ Ž}orÿ´¦|òz[\.±­ÈÕÌ4çL\ ``Ð,è6zÖ]#ßD®vÎ6¸¡¶s7¥±ïD»c³©YYÿ;Šˆˆˆˆˆ”*z—CIÛÏ)xä8²ùrÛ Œk¿ Ã8wl¶K›̙٠w w×ktxècúvx†@€ôµŒ½ãI¶zøcÒíÍOy¼‘[þ(ðŸ"ÇpÃÜt­™Å±Mqzð3¦ö ÄfT¡ÇëóèAëF6eBƒY̹·fâ*&õéÊJgŒSÇþ—Ž‹ûò¬ËÌ{‹¯úöcÛ#ïÒü³,^»ŒñíÂyþÖjM.åÒ…Z™ô©7šš~Í-L&"%­[wænJàû¿Òù¿Uô) Tô.!G’w¸>!ã©Ù§ðrõ»à¾ ñdz…ãaä-›i陯K]ÂH™Ù‹ö_næ?Zäoo& ¾í5®3.ž§Õ¤dö¼ ÷î`ßG#ùîÚé,y¦lGÇ‘ßÒë›·èÚg$cÓ<ØP÷5fµ«‹sf[&VèËH¼¥R+ù§A®D8³ïD?mOç±pq2¬Ž%"""""Rî©è]B*Ø \ïâä†[“¿e¯œDï_b3sȶ×eø[ý ¶A2€ÿv,|ïËá]d†ecž³·€ ª¸†«.9Yä^0Y.‡¢slÇ+<¸Ýf".¶öĵ0(€Ú½òJTS<€¬+ø"e–Z™ˆÈÅÜÚÀƒÿþžDbºƒ?ödrCm7«#‰ˆˆˆˆˆ”{*z—:þ­ õiÈÄ-ç¬ïö ζó?íÒz8_Ÿnor.)«ßbë#«™}7GÞ¿…Å;Ìó¶*<'ªG„Q£þxf ©†-ó(»c<ˆÌþ“WÞNcä!|þât{¯Þ€iþ›s‰”-je""—Òµ¾;ï.K"×ßoMSÑ[DDDDD¤PÑ»„8Îû{A_mSSS_ððð(àá‰HY£V&"r%~ßÁˆoó^3k_û[xYœHþ­UµÐýjNoq)È‚ غu+ƒ :ï¾€€‚Û‹Šˆ”6'Nœ8oÝôéÓ6lžžžÏËÜ |9 ønžµlžµîŸ·Ïþ¢Ëû~©u\d]‘·–ÐHoÔÊDD®\›;¾6Ò|»9MEo)6§–¯"uÇ«cšGH|;¶·:†ˆ”C‘DD¤|QÑ[DÊ5µ2‘ËÅÉàæzî|õg*GNå²á`×Vwµ:–\…ýƱ¯fY£Ðºß¢¢·ˆˆˆˆXBEo)—ÔÊDDŠÒM<˜ùg*&0kCªŠÞ""""""RÑ[Dʵ2‘¢âëL‹p;«£3Y¶'ƒcI¹TõÖ'E¤ø4YôƒÕ.hc§nVG‘rNEïb°?q3Ÿo}ŽÌÜT«£”ˆ´ìD\<ðtñÁÉpÁîì—‹/ž®¾øØ+áï^ ÷X‘LZ–É×ëSUô±€ŠÞRll†¾nøºR÷Ù9÷%dewüZvœ\Á¶¸¥$gàDú!~Üû?í}—z×scØ@ê´Ñèo)4µ2+U°Ûè\×y›ÓØu<› ‡²¸6ÄÕêXR¥}݇Ž;G±â¥†zÃ/""""åŽÞ‹%|Ýit;̓nÇÄä@âÖÆ,`ñŸHÌŒÅÄdÛ‰el;±ŒïzÜ^ó)êWjoul)åÔÊDDJƒ>M=™¿9 ølM ׆øYI®fæqæ̇۳Iܹœ½Þ­¹6ÈÏJY˜aV‡±†ŠÞb9ƒ0ŸF„ù4âî:ϱ3~%‹£g°ýärLÓÁ¡¤í¼³þAjú6£Gígˆ¨ØÄêÈRʨ•‰ˆ”&áþÎ\_Óe»3X¹/“Dz©SÕÅêXrN|÷#fvŽÕ1ò¥nßqþJ£ =^ŸGrX7²)ÌbνHûº7­¾úˆ'Žgÿöh‚žšÍÔž‰«˜4x,+ý1Nt;Qh7§]#Oñת£ÔíÞçØ}¬_gã᯦q‡ûêó÷ɞʀ1«qõwæTjM{•›+ë“y""""R:¨è-¥Šaبëß–ºþm‰K;À½ï±&f¹f»Ö1qõÝ4ªÜ‰»ê_Ѥå;}ÈÜaµ0lâˆþª‘RDoO¥ÔªäÊý×LàæÈÿ°`÷¬?ú&&›c±ãä º×ü?n}@£xË)µ2‘Ò¬nUZ…ÛYÉÒ¨ öÆåYIo»Ê go«#È‘ž#+«[;Q%<Àp÷Àž“E.¹Š>̱¯ðàv˜‰¸ØÚç°Q©Z .€›»'U+TÁ psw&;»à}¼O¥ÿ[¸§ówñÒÄÆÅ÷ÀEDDDD.“þú’R¯’G(6z“ÎáƒøbÛóHÜBVn:sv¾Êú£?p_ƒqT«PÇê˜RBÔÊDDÊŠ­¼X‰ |²:…—»W´:’R³µX¡@Ñ£Çqì«YÿâNT£FýñÌR [æQvÇx¸võeîcÇcßNšŽø˜{<²Ø2¶/Ìéżšz\DDDDJ½¥Ìñ®Ç³­æ²6f³w¾BJV<û73~en­9Œ.áƒ0 ›Õ1¥˜¨•‰ˆ”5‚]¹®º+ëf±hg:·ñ¢ºŸÞz‰•l„C»!ƒ¸{eSʆ~ gšÐ·ŸŸ Þ"Rzälå£Ç^a‘Ë-Œ~³µ5.FD¤ÜÑ_^Ræ4ºzm™µãÖ]@®™Ãü¨Iì:¹’ 'ãm¯duD)bje""eÕ€V^¬?Ä·—&3ñõö–ââL³ñ›˜szÉ£÷LÖœ¹«Áó¬<3@¼bžùÃ?öý{ÛàGræÞ†/­â Úg2ó»a|‘"eÃf†MäDDÊ)½¥Lòrõc`£)4¬|#_ïCJV<;O®äåÝèßpõÚYQŠ€Z™ˆHY×,ÔÎ5A®ü“Åò=ì<–Mª.VÇ)WÌÄßÿè ²»¤Öžyü²#—À¦ôìß‘Ì?aÁæX¨ÔÛÿóÝky`˜)ìüþc¾úm+âR BuštÀCÝjáIÛ¾}ŸnáHR6Ó ܯÎ]GVÔOÌøß÷¬?„Í7’Vw?L¿vÁØ­þ!ˆˆ”3ê!eZÓÀn<ßæ{jûµ %+žwÿ|ùQ“q˜¹§“+ešVžÅè?nbÙ¡/1M̓ngôõ¿pcؼE¤Ìx¼C Àa›K’¬Ž#""Rþ6ld³ýÛ¯ÙÖÞ7†‘}h%¿ük|nàî[êàtt³¾þƒx0<ðp¤b«Ù‘^ýzqû!V}9ï÷ç’õ×,Þ™½ Zÿ¯½t7uÜ œ#ncÄ}pN^ˌɟ²2!”î?ÄÍÇøíý7ùvoŽÕ?‘rG#½¥Ìó±Wfh³OY¸o vOÁÄdá¾÷ØŸ¸…½—«ŸÕå2ÔÊ$Ы&}ꦖ_ “‰ˆ\™FÁ®ÜPÛÅ»2Øx(‹%Qt¬åfu,‘rÇ)¸Ü׈,¶ÿ¶›u:ðÀ Ô7Ã9ôûV~;y‚xø;Ù»óEƦÉqÇV²£±9$œÑ‰°Þ÷Òãú ̰8Öü– c¸;²:¶#"RrTô–«‚aØèù‘¾×1cóÿ‘˜ËΓ+¿²7y›0ŸFVG”K(¸•‰'Ýj å†Ð4²[DÊ´Ç:xóÇÞL²rLÞþ=‰6‘v\ÔeTDD¤$Ùüðuäƒ3®6°ùùáíÈ!ÇtÂÕÕ‡‰ y˜eŸ~Á룉KÎ"';ƒ\Ó Løöî;<ª*ø{ïô’!´Pƒ(EŠ€ El(k *º"?·Èºî®¢‚ºîZV]Ö]w]\]WTDWÔņÒDÀJï½H(I¦—{๞¹™„P’ ÉûyžyæÎ¹3wNf¢LÞûïÉÈk ¶aÇ–}æmÃöR ¶ŽÍ£èð••!ªÇ°í_ãÆ7ŒgE®ÏŸºšˆ¨‘bèM JÇìó0¹ÿ¼ðý/±åÈW8Ú‡§—ƵÀ-oLõô( ]×°tïñî¦?Á9P  WþŒ,ºަ)ž!Ñ©kžaÁ ==xe¹{Æñæ7ÜÜÇ“êiÑì«>S=…*Å+|©žQrªiaKEI²Ð¥ŽÃ‹^Æ?ÿ·¹C¯.B|ñÓxpÖN€³çµÝí;¼ðÚ¯1ö5À‘ßãÆ D¦¢ ™«bEë+‹ ý38¶kz{ËÕ1†ÞÔà¤;šàW}^Å;ŸÀü/!¦E0síl?òFwyv‹+ÕS¤°• 5&ãúyñþšû5¼´´—uq!ÇÃ?éäÄÊØžˆ¨¶hš :â¾blþf'¾_´ñÒqýÀ·X²>ˆì½Ñ¹y6róš%Ìχ³ë ôÍ\ŽE ç`· ¬~”ì>„fÃÇ£ +µ?QcÃЛ$U±`TÑdfvÇŒÕ÷"`Ù¾ÙØãÛ€ Ýÿ†&îÖ©žb£ÆV&DÔyì î†Ç>*ƒ?¢ãÙÏËñ𙩞A<]:#çÒ‹S=óv='ÕS ": r^‹«¿zï}ýfí뉫nè´™€¨îAv&°~Ó ,Ù$ò.¾ÿå3˜t~/üô;á|ù,™õoøáDn»ãdK3"¢ºV[ÿç57Ùó(I¶«Kv­Ô𶸨I¶-Ò¶*Ý–¯“]øýþGÀív'ùñ~tÀ¿ ž-Èv5G«ô³«½ïɪxm.ÝñÝVÒÅ1b+§¢ÿã]°pæuhluÎû}[ñÏïîÄ~ÿV€ÃâÆÍgÿ½ò¯Hñ̪v8¸;ËWÃañ CvØTÇI+0ë Ù0_Líšò³\leBD¦ãg”bÃþ(àÏ£²Ñ¿íÉÿ?žˆˆ¨±š;w.Ö¬Yƒ &$Ù«Âæ°Ã‚"á4Å»ÃU‹"‰C‡6§ -†p$½ÒýUXm6XUºG<¦CµY¡‡6àµ{&ヌ›ñøýW¡Ð ¶¿…©÷Ì‚ïŠßã©Ñí`Q-°Y­PÕc­St-ŽX4Џ^ׯ©¦OŸŽI“&<Ï–ˆWqÑ’\ëÒm]3oËÔðvu×ÇC5c§ýÿ’©ÎÀ¼7Ö=„E»^ÃËa (§?þïÜVj±]zº\¼7¹ SÎ9ö¶Ä¾ŸŠÞæâÊ/¾ÂCݪy«týôÿf4 ͼípoÿÙxeõïðíþyÇxqå$l8´×u~°Þµ;Y¼{&Þ\ÿbÚ±@¤™§îì9=Iuz[ÞžŠßþ}.¬‘ ,nÂ#‡sJþ‚1Ï÷ÂËO8ñ è:ô¤½íN [™ªíŒ_w .|3=ípËEÇŽ¢‡Öâ¹1÷`×ÿ½Š?vZˆ_Žû;J ‹oÙŸÞúá…xtâ“Xån ¥Ô‡³5þ‡ßÁÐÿ w=‰ÁV`†·p³>£n<ŒGÆ}‰±³Ûã²ìÿþ;Xn›¿_“Æ-Âá°¸q{÷¿bá®Wñö†ÇÕÂøbÏ›ØzäŒëúZgԯߖvbÖº‡×üxµß¿o¬{¿èõï„ûF¾ú=nü³ Ï~0}3¬~æ*Üôk ~§¿„ù+á± q7t„¾{wß~;ÖmGó_¿…ç.ÜgîxK­9PŽ*òÈó¿q¼ñû4ñÅ{pþi* O}Z†‡.g›""¢zÏÒWÝ9¥/ˆWŸZˆˆÅœ–gá’»îµ=œÇê'‰ˆ¨^`è]‹6Zšt|]é¢$¡·Ë97`Ȧ1÷Ð`\§¼û†áúsp€vÈæŸÇ”KÚÀ÷ÆuôúJŒ=WÇ>ï%øtÆUÀk£ G·cæÇƱ/aÚÐLl|ìil¾j>üYÊß·ÞÒ±íßS0¿ïK˜w;è›ÿ„¡w¬Ä„n[°hM]W®CápV,adl|ƒîF+u)Žd Âä?\ Û· ßS_ |ͨ3¶EÊ V7£}V/ükå]ØïÛŠýþ­xbÙH\Rx†·ÿù)µ96^‘x ›/‡¦Ç¥€8Žó>FöMïâ¼ QèÆ9wܳ{ÎG0íFÜwE¢³4”eã/Œ€û«É8ïÏK°aÇsxïÜéøü·uÀûfaÄèŸÒNÃÏÂV&DDUßß‹E[BØRüµAô+tà’³ÎÔ]‰ˆˆ i¯Áož¾U C×tÄãQÄØ¿„ˆ¨^9Ó vÏ(VÕžt¼Ê`ÕÒc® ãõ™Û±cÖk¯G«Þ!Ý¡`ÿìGpç/&áþYŽD¡Ã‚ü¶…?ж½x7XÕWhöï+CóVM B·M!šªöî8„Ví[kVÞ²-Z܇fC[aõâõX¼Ì‚K~~.Ê—|‹ö¡÷ÅaŠÜæÍ` Ø°Å"8Ó¿¨UV„ûú½‹ó[\àX8ûá¶à_ŒÀ–#_§tn6Kòß «jKZ­iš©µ]QMÿa[WØnŠË G,„]Û÷`ÿÇâ¶qãpÛ_æ–£D“ŸNÍ®ò5øÓ²kñêšÉFàïí€I}^Å­ÝžaàMDžÝ¢àÑŸdÁi;vâòáÿÅž#•OzQý¢k1D#a„B!„Ba„#ÞDDõCïZÔ§ùO’•}›_]Å#T49y<Œ‡?jŽ1WäüÐW9ŠÏÞ5ƒžÁó}÷^šèÇþQUTÅxlËñ¯cñïŽbÊ]ï XSÑ4Ï‹}»J AGÙæM(ÖT´(ÌÅÎÍ{Žu³ßµ»ó Ñî‚ ‘¾ô/xÏßœÓ-·¿ŒW6wÆÅ]îìn>ûøyÏ‘ílàØ‚£O/¿/®œ„£¡)™×Y¹Àc«ü÷žÍ.7XÐiø%8:ã¯øâˆø€ÄÚþ… C¯BO+ ëU}ðRѲm´õ^zùe¼<ýïxþ™ñèl‘ŸNN Z†™k§àñ/¯1zw;­Œ,šŒÎŸ½»‰ˆ$…9Vürp: ®¿}ÿh&""""":U ½kQÛÌs1æìÇ‘fÏØ,N\Þþ—ØêÆ*£¤]„Ûº}‹ÕÝÇc[ŒZÑqÈ ”¼p&þò7x%Ô-¾ø+fíMüÃØîp¡`Ô_ðpæŸ1qú6t3 -g݈‘·ÜŽ¿Œ¡™ ´ÿ{\¼â.Ü0~Fß³#¹­³‡```Öu:ùŽ®èçþó›^„ÞÉ Õ”.MáÁó0¸õ(ʱÿ¾.~S_ˆw6>ôhÎÇcËÄÿûO4q·(ŠŠÞù#0ªèþJ÷µ÷z¯ÿFÁ´QÃ0ü'WbÄ¥?ÁýÛoÄŒ'‡!³mW4Y0w¿¾)Ie¾‚ÖãÆ &àÚ[nÅ˜Ñ¿Ä k|§4o]×ðÅž·0uñ0,Úý:t]ƒ½ó‚‡~‚amneïn"¢$Föpã¢"'`ki S?8ÊÅ©‰ˆˆˆˆˆNÑ©•uÖü¸ÉžGI²]ÝX²k¥†·ÅEM²m‘¶Ué¶|ì2Àï÷? n·‘N'¥CGy¸iöõض£ßbÖºG°«|1æ²¥cPËqQáípÛ2êl.:t €ÓêËz::lמ]åkñƺ©Ø~ô{c,ßÛ7œõ+»‰ˆj Õqûk‡°é`0¶¯w^P¿ÿßODD”jsçÎÅš5k0a„TO…ˆè´š>}:&Mšðx<X ^ÅEKr­K·ui̼-_PÃÛÕ]o ÕŒöÚŸ†Û¿¢Q °‡ñ m湸·ÿl|»ænz;Œ–ãÃmÏãó¯ WþÒz, Ò:Õú\(Èr6«õç9hæl~‹wÏ„®[¦Üiõàòöwahë±<ÁCDTCN›‚'¯ÎÂø¥8ÐðŸe>x n9Ï{Úžã£uA|¶)„m¥1ĵÆUKžåVqv¾7ŸçA/ÿm"""""j zI(èÙl8zä]‚/ö¼‰¶üeáƒÇøbÏ›øbÏ›h•~6zæG¯f—#ÛUê)×9]×°tïÛxwÓ“Æ"• ôÊ‘E÷òÑIÈϰàé‘Ùøå›‡à ëxnaÜv£zTÿm²ãÑt`òœ#ø|Sè4Íô̳÷hköEñÁÚ žº& Ý[4‚þmDDDDDCo¢$TÅ‚-G£_ÁH|U<Ÿíø4<)G IDATöT¬ì*_ƒ]åk0{ã“hæm‡®M‡¡(»Úfõ„ÃâJñÌk[™Õž.ù6MÞ\ÿ(v–­Jõ4¨žÒô84=^iü ;ú·§`F'‡­LˆˆêFŸ6üý†üvöa”ú4,ÝÆÍÿ.Å#WdâÜV5;ɉÁhíq^G-ζþsX,“¯k)œ Õ†Þ§I¯üËq(¸šÞ¸þŠÄƒˆë18,îFÖâBG\‹!®»è§ð¾+PᲥƹ^‘xšÇÀ–7âºÎ4²÷™ˆ(uºäÛðò-¹øÍ;G°~%¾8~6ë.êìÂݦŸPÕ·ÓÆÖDDDDDÔx0ô>M†µ¹ ÃÚÜ–êiP-Šë1¬)Y€e{ßÁºÒňăIïç±e"ÏÓ-ÒŠãnlgsd:›Ák˂Ǟ —5VÕVdz'"¢3Q¯ÓoÊÁ K|xu…š|´.ˆ¥[øö\7nêã…×Á@ût FuÄâúqïgQ.ˆIDDDDTO1ô&:޲ðA,Øù ¾Øó*"‡*í/H넎Ù}Ñ6ó\´ÍêlgóÌ’ˆˆ*»EÁÏ¥a@;û¸ ÛKc¨kxéKÞøÆ Ú;qMw7Î)°×h±ËèÒ_ã¬Ë–à–ÏâÁs|xýú«pðñ1©°æÕãÉŽÛåúhß-ÇŽbEçÛžÇW7CMªm›†1Ï÷ÂËO@•§‡uº¢ ¶âæÇ>*ÃGë’ŸØ–ukaÇôsjiDDDDDt*zU¡4¸lþ ¾*~q=fŒ«Š…™ÝÑ'ÿ'è–ws$"¢:Ñ­…¯k‚wWðÒ—(õiDt|¸.ˆ×‘áRѾ‰½Z;Ð2Ó‚LwUQ³-/ꂯïý#V¼ûú¸Ü£—}‰§îxK­9PŽ*òÈóøE×5¸wèËúñ?pá®'1xÀ LØðnÖg`Ô‡ñÔ¼IY¹íüßáí7®ƒ ‰Çü“é˜?o³ßöV»3àß§ãòi¯àçÄ»½„ù+aJôø¢Ù4|þ»NпyÿÚï_ò*†¿™ƒŽžv˜øâ=èª<×[£Çø‡—ÁžcÅQ[üüù?âÒ¦'§;UøÂ4ð:„c@´UàDDDDD”Z ½‰LÊ#¥˜·õ9,ÙýbZÔÏtæaH«[p^ÁÕ º‰ˆ(%,*0²‡WœãÂÇëƒxëÛ68öoUYPÃ7»"øfWä8Gѡ܌g®œŽ ,ÁœÇºÿ0®aÛ‹÷á½s§ãóßvÖýCî›…ëÞ½ uß‚Ï×DÐuå:waÅòFÆÁ7èn´ª¶Œ;ù1Gþ©)šO|S.iß×aÐë+ñOœ‡+®€?¥Æ¯º=ƒ/ö'IUuìó^‚Og\…4hØúœù¸3Ñ£ï\” ûÞ™ÔúÎï±÷>é^ßÓƒ»/LÇç›BøÏ2þycŽ4Üðb ‚QßDDDDDõCo¢„b~|¼}:>Ûño„ãc¼™·®ìðktk: Šrò_û&"":]V#ÎqcÄ9nl-aÉ––l cÃ("±š²*ZÝô ~:æfLY0½qìÞ¾û×?ŠÛÖ©€^›:ãôÖ Ï.^Åë,¸äçÝðñ쯱"²½¯ïyyãèâÇpå¥/ýÐÎÄŽ“_Ç€dÇ´æaÿìGpçûé°íÙˆp›(jÐEùm ¨"O>×ô;þŽqy£/Þ ­í(LýS÷ã³j­³}Ln“cEA¦«‚¦ix*‚ÑøI—ˆˆˆˆˆjCo"kKâõµâphŸ1VÖ ?éðktm:4…3#""ª^»\+Úåz1¶¯šì>ÃÎC1”øâxò“òª¨6Ç Ïü ]?Ÿ»t­Ú¶Aû.᥉PÃÅØ¼ÏvV@x!ÒgüïÙzáçôÄúg¦ã•@gŒëšøQÒ6ð>ÌIho¢aÛ7æcÚpà¹aX3hÞ޽ÿŽù댼u°Ú¬ˆ†U¬‡÷ïC©vlŸb4-O6WÜÛ6 ×ïþÑîV=2¾}Þ½5÷¤^×çW`ב–ocçá~?ï(ù4”úxÕw ½©QóGâÍõ¿ÇŠ}sŒ±tG.®ét/úäÿ„•ÝDDtFQ•cÊ­³­ð…õêCoJÞ5øÓÝï£Ïè0º@Eáø‡qÁÄ ¸viܾ äŸ†Ç 3 dÁÀÀ/0½Ï]ÈwtD?÷ǸÓûž³wFIŽùgÜ3dJž¾¿lÖíº¢ÅÅkëûã–¶]ÑdÁTLi;NÆ¿9¹ÊQdÀ4';î3¸ o㞇þ‚Œ+ÊŽôÀ·dŸô‚—å! o|í7n¿¿úø‹[QýP[ ß››ìy”$ÛÕ%»Vjx[\Ô$Ûi[•nË×É.ü~ÿ£àvK+@Ñãûãõµ¢"r *V\\x;†·ÿ9lª#ų#"":5¾°Ž ÿr¬1öؾ^ÜyAZŠg”:òk1²‡¿½(£Êû.ÞÂöC±*÷ MÓ,¸ô,×qïGDDµcîܹX³f &L˜ê©VÓ§OǤI“çKÄ«¸hI®ué¶.™·å jx»ºë㡚±Ó¾h+½©Ñ‰jaüwñh×kÆX«ô.söãh‘Þ9…3#""¢TØÞ‰íS= """"": ½©Q)ömÁ‹+ïÂÞŠ‹bÅeíîÄeí~U±çÑDDDDDDDDDTß1ô¦FcÙÞw0sÝTDâÇzr6u·Ámݧ¡UúÙ)žÑé§JMãâÚiÿ¶àE×üù-Jmu÷#""""¢ú‚«ôQƒÓ"˜¹n*þ³ú·Fà}^ó«0ùü¹ ¼‰ˆ¨ÁrÛäz}Ô{u…ÿô7É;ƒ,Ù6¶Û5aÍQCÇOýÔ  íÇ ßý ÛËVìn8ë!ô+™â™Õ¾>­øßÚc'|ûÿ©7÷ñ¢¨™-ųª[k÷EðÚW~€Uzµ²§xFDDDDDTÛzSƒµáÐRüëû_Â= hân… =žC‹4.VIDDÃ/‡¤ãËía hÐtà•å¾TO)¥Æ÷KC‹,~ü%""""jèØÞ„:>ÜöüõëñFà}N“¡¸¯ß» ¼‰ˆ¨QÉr«xù–\ô+t$ôønl2\*î»$·ïMõTˆˆˆˆˆ¨°Ô…”`´/¯¾«~P#Úß…KÛÝ ø¯}""j´š¥[0íÚl":¶”DŠ5®îÞùé´È²òSQ#ÂлðEŽÀiõª֟›&cRñíx~\¡ñu€ØÊ©èÿx,œy\)]r;ÊVâßNDy¸à±eâ¶nÓÐ9w@ŠgFDD”zñ°‘âèÑ­l¶ú󙃈ˆˆˆˆètcèB}‰™ë¦à€;,ŠýZŒÄu§À¦:î]zº\¼7¹ SÎ9ö–žŸŠÞæâÊ/¾ÂCݪyuºrâ5ÎîKþˆé'ø˜TÑ¡ãÓíÿœMO#®Ç­3ºbB¿!ÛÙ<ų#""J½àÙgŸ…ÛíF‡‘‘‘ê)Õ†Þ)r$´ÿüîNc€¸Òݳ`W]¸¶ó¦{«ÈëéÅ¢#8m\`á¿¿Fzt(ô²/ñÔ`©5ÊQCyã7ŽÇ…oæ £§Æ]²¿Û—µ;ŠÕ_£óˆ>°܆o¾RqûÌçqµ}¾í ¬vgÀ¿OÇåÓ^Á¸57ãÒ`Á¸ ˜4îï(-,B¾e |z—º~©ªU>ˆWVÿëJ(Üz ®ét/¬ª=ų#""J ]ס(?žònÒ¤ n½õV´iÓ‹%…3#"""""ª}\È2EVøÄ¼eËöÍNro–snÀM/bî!úá÷1cß0\ßA Û^¼ïûü÷ÕWñÖ“ExëáY(Utìó^‚¿¿zúÙ#YƒpÿãÃÓ#JñIÅp<ôä?ððyßbC~4Ÿø<ÞzmÞ¼xéõ•8V/ÇÆWžÆæ«^ÆÌéÅCC3Q¦Õò s¾*ž‹©‹†·Ç–‰;Îý®ë<…75J>Ÿ3fÌÀ”)SP^^nŒ«ªŠvíÚ1ð&""""¢F•Þ)ÕÂÉÇã¡ä°tĘëæã3·£å¿ÀµÓÐêã98ˆ8vo߃ýëÅmëT@/ƒM„Í‚ü¶…pˆ@E“‚|Ø8]4K˃€ÓeE4 èûg?‚;ßO‡mÏF„ÛDql‰+ö•¡ùÙM B·M!šÖƒÓ$‡Cû0síT¬)ùÜëÕã»ýYÎf)œQj…B!X,Œ=éé驞5 º®'Ý®nŸù~¾–lUûäÇÕô˜æÇˆÛUëxû‰èÌÁÐ;E:åôƒ¢¨ÐõÄÒéιçWñÍFŽCÞuãaGsŒy=¡À‚VmÛ }—ÇðÒĨáblÞçFþŠePÔšüO:ŠÏÞ5ƒàÍÑéØûÏᘿ^ü¡ ižûv•@CÊ6oB±ÖãäèSÓ¢øhÛ?ð鎊ùv‹ #:ü C[…ª°zˆˆ]×±iÓ&lÚ´ —]v¬Öcérssqã7¦xvDDDÔPèº^)Ä–Çt]‡¦i ·Å¶¦iUË|mÞNv[¢åpZ´u—êª±m~ pìÛqæcÑ™‰¡wŠ´Jï‚k:ýs6=…˜ä{ÛcôY¿¯ò1JÚE¸­Û½¸Óù*¹* Ç?Œ &NÀµKóàöU ü4L©ñL¬è8dJž¾¿lÖíº¢ÅÅ›: ŠÆLBË17bäòŽÈψ¡™ª£êó°µC×5¬(ž‹÷6Oáàc¼(ç|ÜÔåQäº[ÖñŒˆˆˆRkË–-xùå—QTT”ê©Q%ÜòEÓ4hš†x<ˆÇã ãæà;Ùãå@[„ãæ€½*UÜ"ÐÁµ¹Í¡·¢(°X, ÷-à,KÒÇÑ™§¶þë57Ùó(I¶«Kv­Ô𶸨I¶-Ò¶*Ý–¯“]øýþGÀív'ùñjæpp/v–¯Ç–‰öY½X­,Ñ¡cÕÁùxo󟱷b£1îµgášN¿Cß‚‘PjíW˜ˆˆ¨~Ø¿?Ú¶mkŒéºŽ`0xJŸAˆˆˆÎdsçÎÅš5k0a„TO¥Áá´¥ãñ¸vËÁw,3î+öÉÛæ0\„äæ P}å·¹òÚ\­­ªj¥À[„Ûæ°[·Z­ ûåû°Ú›Raúôé˜4iÀãñ<` €x-ɵ.ÝÖ¥1ó¶|A oWw}¼1T3vÚklYébÙ®d» R=z%bù¾ÙX°sŠ}›q‡Å¡mÆá¢6?…ËÆ>¥DDÔð­_¿¯½ö\.î»ï¾„¯ä2ð&""¢Úf®ØµvÇb1Äb1c\\ä°[Œ¨´/Yø-?· Wl' ¼EH-Âls¸-ß¶X,°Z­°Z­Ðuݾåã‹'⚈Î, ½©^Ðu ›¬ÀWÅïã›âŒUû¬ª ç·¸—µ»ަ)œ%QíŠÇãÆ×k E‹¸á†ЩS'ã1"""¢Ú&W^‹ [„Üñx‘H±X ñxÑhÑh´Rå·Ãåªps¥¸ÜÅÜ<s%·ø|$Bl±-Âml+Šbl«ª ›ÍfÌÕjµBÓ4X,Øívhš–Ðÿ[̇Á7Ñ™…¡7Õ ¿ß•+W"??………ÇÆ¢G±ñЗX[²«K>GEäPÂcœVú\‹!mÆ!×Õ"Ó&""ªÛ·oÇœ9s‹ÅpÏ=÷ãiii8ûì³S83"""jHªª¦㢲Y„ÐrÐ-Ù‘HÑhÔÀEè‹ÅŒm±_<>Ù6€„êñê*½$ôß–+¸åJo€›ƒn±-.v»Ý¸¯Ø‹6› 6›Íx^sx²v+ò5¥Coª5Ñh6lÀwß}‡ 7@‹k<¦–®ý6ZŽ’à.èºVéq­ÒÏF¿‚‘è[p5œVo fNDDT·"‘Úµk‡>}ú¤z*DDDÔ™’P©ÚZî¹-Ýr m®î6W}‹kq1‡ææªïd d0Âe™¹½‰¨ú6÷ëNÖÆDÞ¶9‡ÃUU @¥Þàòµ¹ú\Ì›!8Qj1ô®áxß퟇˜IõTjÅÁÀx¬PhïóãÀ?*v)Т?þÏ]sù0g÷’£Uztmz!z4»ͽëjêDDDujçÎX°`<FeŒwêÔ :uJá̈ˆˆ¨!’+¹åÀY®Ü–Û’ÈA·“+·åÐÛ¼mnib^àRôô–Ãoq»& Y?¶7‘oHXtR¾ÍaµnÛl¶„ÞÞr¸hb³ÙŒ*qq¼d!º¸ÈUàCo¢Ô`è]fo| w½šêiÔ ‹?žo‡B‰[*í‹e(Pën…Ù}Ð1ûC$AÏž=S="""jÄ’µ7Aw8F(B,C0D(B$A(B04úuË÷mOÌ-Rb±XBó”ɪ¹O•9P–o‹Jk ±ŠÜïÛܲD\‹@\„Ý6› .— N§v»N§ÓØA>X­V#ôNV¥NDu‹¡wiæi—ê)Ô©!C† ¤¤ß}÷ eË–p:€¢¢"„Ãa:t¨Ò?J›7oF^^222R2o""¢±yóf¬Zµ =zô@Û¶mñ±cǦpVDDDÔXTÕ ÛÜ/[Tv‹ [„Ù@ÑhÁ`@ÀØo½EU¸ho"Ž)®«ZSžSU ;Ö¤ÿuM‚rså¸|̪ZŸ˜»Uߢ]‰Ýn‡ÝnG8†Ëå‚Ýn7^»Ý·ÛÐÊEô—û~Ë-VÌéDT{zS­P×\s JKK±{÷ntèÐÁØçp8ЧOŸJñûý˜9s&‚Á n½õVtìÈ-‰ˆ¨þÒuÿýïѤIãÄ.Q]1÷ÊÐVÄ|‰F£…B•ª»Eè-Wz‹ûˆ'âñò”r_n¹ªZŒ‰à=YÐkÞ=ÞÏ›ìv²6)òÜĘù¹åžÛ¢B[õò1Ä>ð‹Ûáp$¼FÑhN§³Rx.®Í­VÄ6Õ†ÞTkl6n¹åüíoK½«âõzñàƒ¢¸¸yy‰ [Λ7èÝ»7 kkÊDDD•hš†o¾ù7nÄðáÑ àØL÷Ýw_ŠgGDDD‘\M-‚nyIy1Js¥¶\é  ðp8œ°_Ìå…*åç*‡Èæªêdû伦ÐÉ»4‡Óæ±dã"—ƒpñ:ªªŠxsûA®Ô׿þàrø//Ø)Ï_¼Næq¹j]TzËóˆD"°X,Æë(·=±ÙlFÐ]ݶÓé„Ãá€Íf3ÀÔu‹%áÄû^ ½©Ö5kÖì”ѽ{wtïÞ½ÒøòåËñþûï#77÷ÜsÏ)?5^X¼x1<ˆ1cÆŒåää`òäÉ)žÑä*fs•·¨Ö6÷ëŽÅb•BïP(MÓŒ1ùb~s0+ªµEH,/©ªª± ¤Ü;ûxm>Äu²ÞÜUUx›Coó"›r·|‚@BßqÑŽE~ñs‰ "ôŽD"°ÙlÆke³ÙŒv»ÝxN»Ý^©ÅŠx-4M3>oŠ} ¾‰N†ÞtF;ÿüóѶm[ø|¾„ñ@ €yóæ!//½{÷fe×Þ½{±mÛ6tîÜ™ý‰ˆˆèŒ W1‹jä@ ¿ß¿ßP(„ŠŠ øý~Äb1#èÛáp8¡B\ô¨–Ã`AnM"ÂZs%·XøÑjµÕÍ"—ÛzÈÁwM{\WÕºD®D7÷3D" }¸£Ñ¨1.Bgñú™O"ˆç0ÏUôì¶X,p: mLDU·×ë…ÇãÃáHhüX%oµZrÕ"†ÞtFSÍ›7¯4n±X‹Å°|ùr´lÙ­[·6ö•——ÃjµÂív×åT‰ˆ¨žX³f ,X€´´4Œ;Ö/**BQQQ gFDDDTY²vš¦%´%!v0D0DEE|>‚Á ÊËËBoq±ˆ¥}E´\Ùmn="kQÑ-*ŸÅE¿V«Õ„ÍUßâZßÜ÷[0‡ÁÉî­IäŠnù瑃|Ñ×<‹ MÆb1ãyåžåŒ <‹Uj½"~&QÙ-^z‹ç¡w,ƒÓéLXpTþyåv1ò8q¢“ÇЛ$‡Ã믿>é¾3f`Ïž=8p †^Ç3#"¢º …Œ?j„p8Œ6mÚ G)œÑñ%[°R®ZN¶0¥hm"*½Å˜¹¢ÛÜ£[ôœÏ+÷åÕÝâs•¹‰¹ºÛ\é-‡ÝæþÞÉ»LÖÞ@B¶¸ǹ›+½ÅÏj^à3ÙEËÅýE¨n¾ˆ×LÌAQãøŠ¢ý¿å¶0ò" ¢Ò\´L‘O&È'äJpàD'†¡75:·ß~;víÚ…ŒŒŒ„ñ 6૯¾Bûöíѯ_¿ÍŽˆˆN—W^yëׯÇСCqÑEã={öLᬈˆˆˆjNÞ"˜ÛbÑIh‹À[½€1  WuE(+‡ÏŒðUÚÇÛA·ØVUÕØ/‡æâÚ\Õ\ÕB–æ×"ÙB–æ–$É*¾å“ñxápØØ¯§¡#‘HÂknÒÅãÄ\Í eŠ \<8!a·Û“‡áp.—Ëh"Ç׌×H`ðMTs ½©Ñ±Ûíhß¾}¥ñŒŒ Øív¬_¿}ûöMXlbóæÍÈÉÉANNN]O—ˆˆŽcÿþýصkºuë–°†C·nÝЧOŸ¤ÿÏ'"""ªÏ̢̕•‰hQ"©á¶hm‰DŒÀ[ôð VÊÕÐ"<–{mËUÜr»ÊŠÖ%ru·iå*nsïn•zx›ƒnsè-W{Ë!·¸6W|‹*uùç”û}Ë‹[Šªlt‹ŠpPËÛrx-W‹ËUøb[¾Å—âõAw8†ÝnG(‚Ûí6^W·Ûm„éò‰qb‚7щaèMôƒüüü¤-Q|>^ýu„B!Œ7Žý^‰ˆê‘’’L›6 éééhÓ¦ š6mjìëÖ­[ gFDDDtrÌa¯\¥,‡Øò¢•áp~¿ßÃÅ}Dx8NˆEH+÷”·Ýn7Z“¸\.¸\.Øív¸\.cø|>„ÃaTTT ‹TÊ•áÑhÔ8® ÊíGD€-‚nQ}ìñxŒm·Ûmôëv8Æ‚•V«µÚ…« oèŠ nù51÷üNÖö¤ª‹ÜªD®¤!·½Eõ|86ªÖEå·pËýÂu]‡ªªÆ{ *ÞʼnqL‡ÃaÛår%œ€'äV3¬ö&:q ½‰j@UÕ„êAᢋ.† ™™™0^\\Œ¯¿þ­ZµB×®]ùÑ (++ƒÍfƒÛí6ÆŠ‹‹qàÀtîܹÒýxQC *“åÅ$å*EËŸÏ‡ŠŠ #ô.//G$1BïxÕÝß|_1n¾ˆ×FÓ4X­Ö„v(¢r[CÒ6› ÑhԨʖƒl™üܢ݉øûK„骪"Àf³%<ŸÜ/],l)ÿ ò{LD•1ô&ª¸ýöÛ+Çãq¼õÖ[(//ÇUW]…¾}û&ìÿ°Õ–H$‚E‹aùò娨¨HõtN»¼¼< 4=zôà‡¿zLÓ4¬X±;wîÄàÁƒN:ƒF‹-R8C"""¢Úg®B!w8N¼å6&¡PðûýˆD"F.‰Dª¢E¥±ºN§^‹ os¸-*»E¸Óé„Íf3ÆÌ‹^ÊíLdÇëÏ-Æj+ø>Þk.Ø`ôêûå`_Ú‡Ñhn·Û8É ŸxíJÌ'.DOo¹Â^îõ‹ÅŒ ôP(d,œi·ÛÞ 9ä–{ùµ!¢1]#ªC‹“'OÆ‘#G*}îܹøê«¯Ð¥KÜtÓM)š!5d%%%øÏþƒÒÒÒTO¥Ö8po¾ù&V­Z…n¸N§3ÕSjôDÏI¹ET À²eËФIØíö„û3ì&""¢Æ Ùb•¢Õ…±EKz‹>Þðù|Fßè`0h„®ò¢‹"•Éæ*ny[^°RŒY­V£Ï·Åb1Ú™ˆÊh¹‚¼ºÐõxáwU•àÕ¯&÷­.<—ðL$Çãq£Ò:¯‘xÄ Q}‰DŒžÝb8†¢(•*÷E»¹ýŒ¨ò—û‰;#Çã ‹„ŠmMÓª<é@ÔØ1ô&J¬¬¬Jc—^z):uêT©ÒûàÁƒ˜9s&rssqå•WÂëõÖÕ4©)++à /¼€òòòTO¥Nlذ3fÌÀ­·Þj|å’êÞ²eËðî»ïÂåraÊ”)Ƈq¯×‹I“&¥xvDDDD©—¬ý…M€z‹B‚p8l„ßr[ÑÃ[ô‘–+°åÅEon§Ó‰´´4£·Óé4BoQñ-Wt‹cаUn›RÓÀ5Y«‘šÝÇ;–ù55·W‘Ç’íãâïq¹}‹ÿm6›Q™-Bmñš„Ãá„@ø±G»8¶èÕ.‚jZëºn¼–bLFÐ-ZªÄb1Øív£jœA7QõzÕ.— guV¥ñÌÌLôèÑ¥¥¥•þQŸ7ozôè¶mÛÖÕTé ôöÛo7šÀ[غu+/^ŒÁƒ§z* ÞâÅ‹±zõjaèÐ¡Æø9眃fÍš¡yóæüPNDDDdb¼E[ Qá]QQ‘°`¥he"ú{‹€\^@¥j`«ÕjT*{½^dffÂív#33éééFëz‹vò±ä*hñ¹N¾–?ëUdW|ŸH¯n17$›[óüͽ±­Vk•‹^Š‹81á÷ûát:m›Í†`0ÆcE1Ža~­Dx.Þ?‡Ãa´Iñx<`„èbñPŽ‹D”Co¢zÎn·ã‚ .Hº/++ û÷ïGqqqBè]\\Œ•+W¢  çœsN]M•ê©]»vaÓ¦M©žFJ,X°çŸ~ÂÂ/tr4MÃÚµkqðàAôíÛ×øû°ÞºuktêÔ)á1'á~DDDDôc°\ùk®îöûý¨¨¨@YYYB¥·ØƒFe¸X¼R¬"è¶ÛíF_n¯× ǃŒŒ dddÀãñ ;;iiiÆ}D¯oÑÃûDU:›ƒìS©ð>YÇ ÛÅë&ª®åy‹÷Jܯ»¨ô¶Z­Æ¶h%À¨ÚŽD" ¡¹XÏ+¶®ë '1DKñ^êºnT›‹êo¹¹9È'"†ÞDg´¾}û&,†)„B!l۶ͨ¼”?°,[¶ ‡EEEp¹\u9]J‘Õ«W§z ) …°iÓ&téÒ%ÕS9chš†òóóñÒÒR¼ýöÛhÒ¤ ºwïžf6¬ÎçIDDDt&A¥¼À¡¨ð­LDŸh±ˆe8F45.r€*·×r±0¥èßíñxàr¹Œjnѯ[îÑ}²ÁiU½¹EÀ,Þ5©ð®Iµ÷ñå5}N’‹ZÓ4£7ã½Aº¨J—ßCQ.Ž-ö«ªšÐ<@UU8ãý')ı倞8Ñ1 ½‰ ÂÂBÜyç•Æ5MêU«°oß>D"œwÞyƾ½{÷bïÞ½hÙ²eBÐEg¾âââTO!¥Š‹‹zW!Âjµ&| þàƒðÅ_ E‹øùÏnŒ7mÚ=ôP fIDDDÔpˆÀ[šrK“`0ˆòòrTTT -M"‘ˆ±`¥ÜÎ@ÂB’ò‚•^¯iiip:ðz½ðz½Fo±-¬Á­¾O5,M~§"ø6÷î>Þc“©*D¯»ÝnOèÑ-Þ±_œ\p¹\Æb£b±ËP(d¼º® ZŠo0NDˆjþX,›ÍǃxN4ô­j~ɶEÛP‹6'â=‹_F"8N£zßn·Ãï÷mMä7ŒÊq‚@¼¢åI4…Ûí6î/Úžˆ÷NnqSUèOÔX0ô&"@¿~ýЯ_¿Jã>ŸŸþ9:„Ûn» :t0ömܸ‡Baa!«Ã뱺î—Wß4æŸóæÍ˜={6&Ožœ° ѰaÃàp8ЦM›„Lj?„ˆˆˆˆèôm,DÿæP(dôé–[›ˆÊîP(d´Äa·¨ú¦ÜfC,Hév»úx§¥¥ûÅ‚ˆv»6›-¡EJ²ö&5 N×ÞDÞ®ËüD{‰›ï/‡Çò¢—Š¢Àj=«É¯ªEA8NXXT´0‰Åb UõæE/Åóˆ ]àòb›N§V«ÕÉEŹ٠6´1ç·ýï(ˆ«{Ãܱ5øtw\Üæ(ÊJö`kn7e¸±sûûØÖn,†ûgà¥û¯Åü=ÒS(M0è¶ päõYX´£Ë¨›»ðe,,ѪœUCFQ^^ŽìììJ I®X±­[·Æ­·ÞjŒ{<tïÞYYYÈÉÉI8–¼(-Õ" Aµ¦i‡ÃF…o(2ZœÈã"à!§?ÍÕÅ¢/·ÇãIX°Òãñ}»E*ZcÈ•Üõɉ,ny¢Ç­êøµET΋v&"AµÓéD<‡Ûí6n‹Åb´¯¿/B<‡¢(Æ ±j0„ÅbßïOèéüXáÎà›3&HDT§ú÷ïþýûWoÙ²%lܲgŸ}GŽÁ%—\‚!C†ãGÅ–-[¶mÛÖúÜÅ—KC8X\ v~6 «vkèzã´wÅa;¸ oÍ?K׎èêY€ïjHowì¡•îïÖßÇÕK±zƒ—¹±zm+¹7cᡆxûý~ìÞ½v»=áwôðáÃxê©§ in½õVtìØÑØwÖYg!??­[·N8–ÛíÆ AƒêlîDDDDtòäÞÝ"¼¥ßï‡ßïG 0¶ý~¿|‹ð[–-[†öíÛ'„ÞYYY¸ãŽ;àñx*Um&üÎÑ™G„²¢:W´µƒnŸÏg´7ñù| [F"£‡·èÛ-Ú“ˆ–&Çh_âõz‘••…ŒŒ Øív#ð‹Uš+½ÏÄ Tžó©„Õµ]í-N.È'ä^îñx<¡ÿ¶¼Åc#‘ˆ˜ÇãqãZT|+ŠŸÏgôý¡ºÓé4‚tqbÄf³Õ¸w9QCÃЛˆê=Q±`ÖµkWtíÚµÒ¸¢(ÈËËCII "‘H¾%K–àÿû¼^/î¿ÿþ„EV.\hWîCÞðé8ºê¼úÉ^ü˜C[Ю_¨ßþ sv¸qÞØÑÈRŽÝ×ð™É‚Ö¦ûg›>Séåk±V…ËzF°õGP_»ûíÝ»GE›6màñxŒñ/¿üóçχÇãÁ¯~õ+c<‹aëÖ­F¥…lĈ¸üò˵‚¢(•*¹‰ˆˆˆ¨a­IDð-‚l9Ü6·:¹B\üÍ"ZfÈm2D{€‹+E{ÑKZnr¦†ÞB}î.^[UUyZ­Ö„>Ü¢§·\É/Ÿï•ÊÅ{%°­mÄB–â=Öu6› ÑhÔxN¢ÆŒ¡75HC‡M:Þ¯_?´nÝÚø°'躎;wâÈ‘#ÈÎÎN½,X€ùóç£Y³føÙÏ~–ð˜ @QtëÖ YYYÆ>QQît:ÏÐ>jJv”`è «qåY¥8|(†¶mÜð:¶7~è ¬G ß®7°¶ªû·v£ü€tHÝõkc¸´×6¼´î>¨=z>Ÿ^¯×[½z5–,Y‡Ã‘Ð7;âùçŸG<ÇÈ‘#ѳgOc_Û¶maµZ+}ãÀn·WÙÃ^|µ‘ˆˆˆˆ¹²WÙ@@>ŸÏ¨ò–+½£Ñ¨q€Êí)¬V+l6œN'<¼^/ÒÒÒ‘‘ôôtäää ##ÃèïlµZm¹’¸¾Þ§»ŸwuǯMâ5A´¨¾`´.íG¬V+ü~?âñ¸q²Cþs<¯Ô&E,T ûûEŒ‰¶)âd‡Ü^îiNÔX0ô&¢FÅf³%­°UUcÇŽMú˜ž={"33ÓXDˆÇãØ±c***дiÓ„ÐûÓO?ÅgŸ}†ÌÌLÜ{ï½Æx,ìY³ (  €V­ZûJJJ°}ûväää ]»v Ï ( \.×IýÜÕ‰ozÓ7™Gu”¯z/¬·?Çbi¯¶w>¦?÷Ã=/a& ªû‹ý ,–(¶|»åuXœ±aì_¿½{÷6Æ222PXXˆ&Mš$Ü×f³aêÔ©IMÍËË«x™Éý¼EïP(dÜ"ü-N‚Á ‚Á`Bð)ÚY0ZeØíö„¶&â’žžžp‘«Åµ\ˆ#ÛµºŸ!Y@šê*ë}þSYódVyI]×ÚˆÐ[„Öâ9D¥<G0„Ýn7Boñû$n‹@]ôòï“hq …`µZß# mVÎÌ¢,¢ÇЛˆè8ÒÒÒн{÷JãV«ãÇOú˜Áƒ£¨¨¨Ò¢œªª";;Û±e›7oÆçŸ¯×‹»îºËD"øýï]×1räÈ„ðvñâÅøì³Ï›››P…‹Å0sæL£ª$õìhsÁH n¶óÞ©¨ÓÖ&}ûöMxÍ U«V 'dÉo""""¢ê˜V”«oÃá0Âá°nƒA#ä”ۘȽò‚ˆ¢‡·Óé„Ëå2ª¼Ýnw•}»“ÍO»·ìöɼ&µE®\®ª:üDŽSÓÛ'r¬êî'ŸŒ-kD¿Óé4*¼Åï‡øx<7Ú„Ãa£mŠh—c³ÙŒkùyäV9D ÿ²'"ªv»=i¨ªª*.»ì²¤éß¿?ú÷ïŸôX÷ÜsB¡š6mš°¯K—.p8 ­;Äó ¢¢‡>…Ÿät‰`Ç¢™x9ÕÓ """":ÍDà-_Ä•áp@Á`>Ÿ/¡Ò; "mMäŠ^RÊwZZÜn7222™™ ·Û´´´„þÝrèm~“Üb¾ÕßBMƒädÁï©à'BW÷˜dyuÇ=Þ}jZo»å–5¢XIôùŽÇãÆ Æ—âwËb±ï—ha#~·TU…Ëå‚Åb1BÕálqBCo"¢3@NNNÒñììlôéÓ§Ò¸ªªF_óiÓ¦ÕÂŒdôáþ˜¹*Z ǯ -.n›^ÆÛã)š5v"8•Úr%n(B0„ßïGyy9ÊËËV'bŸhka å `p{½^dgg#++ N§Ó¨øv8 fM‚ïªÆ«ª–>ÕÊídÁññŽYÓÊéªzWïñ5 ÑO5$–¿ ÞæÐ[,b)æ/Bpù[âwKü~‰ù‰ãƒÁ„Ð[^äRàšCÔXðû DDœÚòRüßÕQŸ>ú¨-.ÂUçe€5DDDDt&¡¢(åÖ¢í„$€Ñ†B,X)/:(ˆ0Óf³Án·ÃétÂívÃëõa·Óé4E¡w²'UU_WèžÎö$5 ¡OÇóŸHk“d·«:ap*ó0W«‹ŠoyÑQѳÝápÕûò‚—â8r¿xñm¹µI²‹ø'WˆVzѤŸ7£[îÂŽHs´ò–bÓA™ù°|? Ÿ¥]‹Ñ-wc›/ùMüø~;? x;â’«û!+¢Á߀y³¿F¨WUÇyïnoŽ‹+ÝÿÜÐb7v3‘ß (·E‘×ÛßÃ÷ö Çÿh10äʳ?xñ;•á$""""ª"@a¤Eà-Ú›ˆE,ËÊÊŒ€2 Á¥hi!/:)°t8FØžžnTz‹0\Få 5Y+s%´¸Ÿ\|ªíMNôµ;ÞxUÕØÕõó>‘ ïêî_Ó¶&æêõªî//.*oMÓàp8 išqâBì“7UżåÅ+ãñ¸q\·ÛmTz;Nã›â÷ÊápTûº5$¬ô&""ƒú•øø½ÿaƒ·Ñ¯>Ä{nAVÇPu8ð=>ùàm¼·µÝóT*šö¹ß¿‰7f½†tÀöÖjŽÓùIï¯B)]…Oÿ÷.æï͆ëà>\µß„éøÝqÑ…½]ü*ÞœóÉÿ³÷v¯²½kzÖSUã«j®õûu÷F ˆ!é±µ¡é††„О÷Æ€ õHÈ•£ˆ$(Oô@ñ$¤Óx ¨ˆMç Ih…´Ät¯9gÏ*÷»žzæ;Fšk®9×uAQ5GñŽ›½÷5îu¿öÇÇŠ48|Sb²Û§»}ÂûááÁîïïÓd–JèŽã˜&.4³'éî˜ð~ÿþ½½ÿÞîîî.&²TmÅÜd–/ëã6sÒ6×]_kö?Ï­£ãZËšó^³Îsö=·mîaBnKýÖš¨T¿m×Qv÷}o}ß§ûI÷Y¼ß”öÖ½ð#@Ò'{¸¿·³Õ6ö÷vÿp¶ón4Ûfv¶¿øó¿°“íþþhMugmìç_ùûKÿúß´ÿàß<Ûfo6þYm›ÙqJûifýû¿ø`'3›Æ³mÓ;=¿¬wöÏÿb2;ŸìÏÿå£ñóà[!©©ŽåÓ锺¼%µUa¢.f n?q¥™]t<«îâp8$ùé嶤é\•Éܲ¹ïÌ> a/Ä_J¯©Ôô_;æ—d;—â^vë7^zP»¾uHˆÃ`eYÚ0 O~sÿéÕuµmku]Ûf³Ic¨ß{®·à-ô€•lìç_ýÛÚŸÙO?ìØžÌìlþ/ÿ?ûÓÿëØóvV¼ÿ…ݵvþ¹1Îök×ßXfüÅþç?´ë§Ùÿ]Ú¯ýÚIoø¦HtKpw]g÷÷÷)qÛ¶mJäªúDI] Q¥«ª²ý~oeYÚ~¿·÷ïßÛO?ý”’¿u]'!ªmÖŠïø]ŸkEè­¢4ŠáÜßKRü%:¨o™Øò–õ澋“›Î¥áõÛIt«Úæt:YÓ4ÖuÕumã8Ú~¿ÒÉ-áíÿ…Áñx43KGN§Szˆ¢Ê”ÏIÔ¼Þ°šÍ_úûwÿý_Ø¿úó?µüOþ5ûM;Ù?ÿ_þ¡=ü{ÿ‘ýÇÿvk»âÿµôþgû³ÙΫÖ?ÿÅ?·âwþ¦ýõú÷íÂúÿøý¯Öüò?µÿä7ÿÌw6ñ¿Ïàá'T²ûx<ÚýýýŤ•Çã1‰o oÉÇ(½ëº¶¦iìÝ»wöóÏ?_LZY×uvÒÊœ´ÌIí¹Ïq=ÿ÷ܸϽ^ñóÚï¹}?g’Ì/Åf³¹ø]Í.…·—à¾îd·ÛÙù|N‰oÝSºÆq´¦il;ŸÏ“Ÿúûïx ƒm·Ûô/ tìÓ4Ùv»M5'Ú—î)=xÑZß?8A|Ã[é ðÆy÷îÝ·>„oÊû÷ï¿õ!ÀÂKK_W2 CšÈ²ïû”ìöVjû˜Ô–ô.ŠÂʲL²SÉî¢(Òz1™»¶ªâñ=·þ­×gŽ¥òµÛ}®ð^:·k“o^#Ws2w s)qÝúýUocf)ñ-ñ­mü¿ˆ÷å8Žéó0 ©RE“[ª^à­€ôxãü•¿òWìþ讯øFù«õ¯~ëC€7BLêjA%½»®³ÇÇG{xxH•&Jyçú”5¡DwUU©ÏûîîÎîîîÒd†’ŸKélñ’â{͘ŸËçvwç:³o9¶krúÚqåRé~òJ?édÜv®zf³Ù$Ù­ûLT*é=Žcª·Ñþ$Âw»]º/Õ5¯º”º®“ðV"üZMÀkƒ;àó[¿õ[?lÅÇ/~ñ ûËù/ëÀ7€Ö¾²BBR’ÞO¤·—žJmïv»”è“X‡4‰e”Þ:Žø9ÊU!‘š«Øˆãä¾—¼¯\gõ­×uͲµß¯ÞKÇ}m‚йïãr}|5ÊRò[ï>ù_×uº'š¦±º®ÓwqþAŒþµîC=ˆñóñ_"¼Þoœ_ûµ_³¿ö×þÚ·>ŒoÂïÿþïóOôàE‰²Ô§n•ö–dô“NÓ”¶ª,QO·D¦$·¯8QýÄÚZŽ(¾cŠøÚùÅÞñµ×æ¾FJü%÷µv?~‚ÉÜ$–sæB¿QßJýE‘€äêM$¾ãË‹pUžø¾q€·õ&?¿üå/íOÿôOíOþäO¾õ¡|5~ï÷~Ï~ó7ó[¼1¼ôŽ©Úãñhöøø˜¤·Ä·d¤ïòörs.é­ngUPÌMþ˜«(9NµK5(××K‚vŽ¥I"×,_ªÉC®¦äq¿&%¾vâKŸÄ Kûô÷GY–iÒI.u]Ûããã“ä¿¶ðõ&ÇãÑʲLÿ"¡,ËtoQmoîj€€Ýngûoÿmûíßþío}(_œÝng¿ÿû¿o¿üå/¿õ¡ÀÂKKÉEŸðVÊ['ú[ëHXÆÉ+}Ÿ·’¼’ßJ÷* ž“ÞþørŸ—*H®É]ÿZº.Ÿ#¶ãò5ûŒÇ97æšTõ-¬íµ&¾ ÆáÏ3Ž­‡!º/š¦I÷„:Þ½°Žÿò@Â;N®Ú¶­Ç‹z’Þð!é ðƒP–¥ý­¿õ·ìw÷wíÿðíÿøíñññ[Ö‹ñ«¿ú«ö¿ñö7þÆß°_üâßúpà ᥱOm«"B/_á'®ŒòU•&zrÛ î[ðܤ”sŸs_[¾fß×Ö›cî8n!'á¯×µ„÷šï}Ê<—4Ïݹãôâß?Ñ$–þˆî!½â¹ê>ô"\/MˆI§7¼UÞ?¿þë¿n¿þë¿nff}ß_üó·×Š&õøø*utkòJ¥iõŠ"Ñw;Kfª§YIÞý~‘àõÂ{îxÖ|w‹øk–/]§¹uŸ#Uoéë¾&¬_šX¥âSÞþ˜ÖT¥Äßå|>Ûv»µóùœºÜÍ̪ª²¾ïÓ¿÷ÿ_È'¾õF©o%½Û¶µÍf“þ…Aœdà-€!ø©ªê[À«Á§f5aeÛ¶©* q G?©aœœPu&ûý>UW軹*/F5æÜ:×>ç¶¿¶|nŸsë>—kãKû¹ÖU¾vK ï\RÛ‹cŸö3þËXñâSÿã8¦À—ÞäÚ¯^Þªà)ŠâBz×uð†7 ÞWTôb[Ÿ½ ÷)oŸôÍÕ›xùíëMbÊûZ§öµåsŸ×nËwk¹õœ^º~ã–ژܶžÜ5•¼^š¼RëæŽÃ×›¨âÄW›ø½bG¸¸¨ÚDò;>¤¡ÓÞ"$½® äö4MIêå+N|ç·—ß§½«ª²Ãá`‡ÃÁš¦yÒë='¾c{M/÷K×›Ùí;Üã>âçø¾Ô+îÿö÷¯=‰çáå|¬áñiæ8¼fÞ HhúÔlß÷Ö¶íÕZ/@½°TM…O|{ùí÷ýâ{MêXÇø¥ÉUäÄó·êãäijÅþwW­Èµ.ï9ñ[ß¿ëÚív÷¯<ñ“ êAþ…‚&^mÛöâ_&¼5¨7X¯8Q­‰ú¼s“Xz¼°ôÒRÒ[©]Iï¹É_ò³Ž+žãs–¯¹v‘¥tõ5á½¶Îdi½[»»µn®·Û×ÚÄô´O¬çÒë>ÕŸû½ü2Ÿðöâ[ëãx±½D|ß÷©O¾ë:«ë:Õòä=Àk‡¤7À1Ñk"bÂ;nçñI]US(¥…wn¬%éüœ”÷­iê[åèRuÉÒ6sË—ÒàŸ+nsÇ¹æø¼ä^zè?_›¨4·¾^^|ë>Òò8–¯æQâÛËn¤7¼EHz\Á§¼Uoâ_^€Ïu$û´·d·ª)ôžßs“Uúc{nâ[ûc|îòøÝÜ:K¼DõŠOS/Ï5Ñë«iâ9û„·Þs>üñäßq™ö•ûÎ o=$Ñ}³ÙlÒý©ûÇ'½‡a0³Iñ¶mm¿ß?‘ßo ¤7À|Ê[â;Öšxá½$½cÊ;&½Õé='Jõùsøšõ&_J¨ÎÉeÉêk©ð91~­3±ëû½½¬\Sß1'fç*3–&JÌ‘³ß“õb9ögçŽõsjPæöµô€CÇ-÷?Ç}çDx¼Tkâÿ•@”ß±‚Å¿Ç6Kçð@z\AP5&J{û cMD®‹Ù'u£´ŒXú}¯ý¼V’¯‘òk®Ç—àZŸ¶®³¿ž±äš¼¿Óµ‡kÒݹW{øŽïQèû%úñÒ¿ðÇ»èýC=¸‰“±"¾áµB½ À¼ìôâPÈßq_k17 a–KIå¹^èÜ~¯}ÖsûñøÊÜú¹ïÖ²VôÏ¥ào³¹þì5cèû¹IKõÝbÅÉR×wü£øžÞþ>ò•/ܾÖÄ?´Ñ~N§ÓqðšàO¾JJx/‰P³§iÞXOeåµãˆŸoIy¯í¯Ž×Ö¿ö]d)Q÷k:nû9"~N®ûß7¦¼c½Íµ±æàq[¿]xÍ ½®ȹ´o¬èÈ}ö\ëp¾&„¯UWøÄî\|Íß·,×¾•@^ãkö±$çÖŸû~NHçjk–ÞÚfí1Æcˉïܱ/-“è^³¾˜»OüùæÖxm ½VÀ±Þ$G®#ûZ×w.­×ÏÝÎo¿Ô=Ü·T¨Ì±¦êd®ÊãÚ~ãþâ1å„wNŽç¤õšÊ’¹m®-‹ä&°Œÿ¢ '»ãyåj[ßðZ)¾õ¼¢,4³‹t¬¨séãœðÌ%Å£¤Ôzþ=w|¹}ÆïoI$Çíç$ô-=Ü×Òí¹ý®áZJÙ_ÛÜÃ…kÕqÙRZ;îcî<ã1ÍÝq»¹}kY®%îÏ_d7¼5Hz<ƒ[ÓÇ9 í;£—ªR–ö=7‰æµã\;~\îm<†k,¥Üoeîš];Ž(¼scʼn,ýº¹óXZ¶Fò¯©9ñ¬¹GæÆAhÃÒà™¬©ï0Ë×uÌ ×¥äwNvÏ}ÿ9ŸãqåÎkp^ªùܺ•sûÊÕ{è'#õ“U.õ\ç$õR¢ÿ¹çãÏ+wNñº_{Ø’à­ôøÌuu{¼\ëÏm“K‹—ßk¹µSûÚ¾^ºf#×Ù+=ô;ø¾ö(Èצ¶—Þ—ÖÏíc´^óðÁ ?Ho€ÏÀ§¹Åš¥„wnœ¥ïçÄèÜäˆsǺtÜÏ­PY[£ò\Ñ}-Ù}Ë>ãÄ\uÌçNR¹´þÒ9Ýšm‘àð–a"K€™“³×„²Ⱦ7zN|+ù›ëñû5=йu—¶Í%œçº§—:©çŽ?nwmÜ[Ö‰“7n6› ©ß>Ýí›ÜøK“U.Mê¹4¹e<§5äªpâXôzÃÒà 9±¸6Å›À^´NÓdÛí6[¹á÷…u”ØsßùcX»|îü×Èì—è³¾&e×ÈãX¯©¿Þñ=÷Pãñ¿_:Ç(Éý6scć$¹‰DçŽëÖ‡5¯êMVà{«·ÛmzyÖ&Àc—tN¸æRßþ=Gný[?ßZ3²4Ù✬}þú_«S™«0Y#‹ç¶Ñò5Bø9yÍÂÜñëþÉûµú”Ü=—¼FHz\AòObp·Û]ˆïœüÖúq™ª3N§“ãhÓ4¥÷Ü„–Q´æªIr)ï¥ó˜û{.ѽf¼¹DrŽ5òxîû5~F¯í⃆˜òÎí.QŸ{_:‡këæÖ›;7Ý'~òÍ%‰ïÅ¿çîçkÿ‚à5€ô¸Â\Ê{·ÛÍölç¶Õ÷•ÞÛíö‰ˆõÛû÷x\ñ»%Y9W©·[ïš$_»Ý×ú§cŠy©Òc.Õ½Te’ê9Y½Vxûó_#º×|ï½ü±Ïý®þïxOçÄ7Àk…z€äD¡_¾†(a}Z7Nlé·É½_[víóR…ÊÚ¿—Ö[’¸svi æµ×;'¼sçì¯ýÒñøïrçü¢xMÊ:w]«kYÚG¬4y©sø– ½È¥¼•ðV:ÖwMÏ¥~½,•èÇ1U›xùë’νÇek?çÆÏ}ŽûZº>K×Í/["'¥ç¶½v\ZÇ'»ýgͯísíûÒ1_“ÊkþÅ@NvǤ÷šúá“Ýþ>Žu=¯ î`€+,U›äzc ‡Ç÷yû—™~Œ[Ä÷œ`^“N¾õsd,ÏÉå(q—Xó}LÍûýæä÷\ J$'¬sbzí±ß’¦öÂÛ§êqüß¹ãɽëþÍu{ßz|ßHo€D9XÅqh6/f}7sN|Ǥ÷\*x©ÇûZɵuÖ|Žç·$«—–DZn­-ñûÏ%äsõkÄóÜõŽËžÛ[þ\â¹IxûŠ¿^<Ö(¶ãCœœG|Ãk…‰,ü“,,Šââå%bn»øÙO`9Ž£õ}o»ÝîIâ[Ä4qNÜúuâç¸nn5Ÿãöñ¸æŽw ·¬Ÿ“ðQèǤ·OvÇ1üõ[Sårë:KÛ\[w.©ÿ•@¬ÈÑùøsÓ5ÞívéžÕçXÓÃd–ðÚAz\Á‹o¥¼½ôÎõW{Qì¿ó)ï¾ï­,K+Šâ‰ðöÛ/‰î(l7›McMZ÷ÖZ“(Q—ê=ædýR?÷Üñz¹ äRÎqY.éî÷9w=ý÷·n÷œuçÄ·?W_mâ¥÷\ÊÛÿKKvëefÙÔ7Àkƒz€+Dy˜“†1­íôîedL{çêMÄÜgO®bc­°¼¥Öä–Š”Üv×ÎãšðŽcIÏUš¬í _Ã\?öÒùÄmŸK®¶Åל,M€ê…·ï¢Ï½ÞðV é p…˜ôV:ÛKïÜ6~[‰oßÇ< ƒ Ã`}ß_Ô›øúk"û|>Ûv»}R9’K€?÷sբ̥·sç°$X£h•%9ñ­õædyî5ë+"| ;W¥áE¯Ä¯Ä¤›JñJhj»¢(’à\šp0Šì¥º“¹Ní¹±®-sÛx!›{0û~®%n{\Ê\ÝÊ­¼„àŽÄ´·Ý~²Ók×ZÇçûè£ì&é o¤7ÀÅ’†§Ó)%½»®{’–͉o³Ë¾j%¼ý„–Jñú4¯ºÂÍìIÒ{î8ã²øyM|Íç¹Txî¼õåõ’ü6{Ú-žsŽ9©¿”d¿%Õý%d·P}‰Oyû{ÄO^鯅_ï[%½÷û½Õu}ñÐà­ôXäáù|NÒ;ÖDH ÎM.èSÞúìS¼}ß'ÁÙu]ê ÷ÂØw5{KqÇ”ùœ4÷)õH”¼¹qæªRâçœÕqÛ8©ed®â%.Ë­;wì/%¶—*hrÇã¯CìòÖ}á';õç–;Wÿ¯tÏêUUÕE=À[é °€Ä¡*"N§SêHV‚VB\ëåz©çªE$A}EÛ¶IJ–eif–Òásu%¹äõœ]ª8Ñ2Ÿ²ÎsnükÕ#±·{Nh/‰ækõ*k¸uŒ/™êÎíÇW›øžw/½s5&¹ñ$¶5‘e®Ïé o ¤7À$³% UIR×uàs"Qb×§±ã:çó9ÕXx‘^–¥ãhçóÙŠ¢È&¸õw\>—üެY/î/Jã[¥é\ªÛÿ='¦çRÙ¹eÏ‘Õ_KpçÈ–ôîû>¥¼ÇcúÛ'½sÿš Ö›TUeUUYÓ4v8¬ištïú¡ðV@z¬@Õ&àMÓ¤W¬8‘DôâUÉi_K¢õN§SJò*Q¾ÙlR%…™YY–O&±ŒŸo•áqÿîÉ%ÓsË—¶ó×ãßB:KÙmv)¯Õç= CÞÇãñ"õ­^︭ÇKï¦il¿ß§WUUéžxk ½È%´ÍìBtë}©×ût:Í&j%:‡a°Ýng}ß§*u2«Ä'ÇsÇÿö©g¿Ý\ÕJSÇž[/7)¦_gnBϸî5â6/)¨¿‡j˜|WÝ^šÄ2Nd)殇îYÝCeY^Ènÿ€à-ôX@él³O“G*‰Û4ÍEG²z½7›ÍŤ•fOkNbÂÖ÷y›}œÈ°iš´ÿÍfcÃ0\Hu Û\|N‚Ç.pÿýµ^ð(»ãuZª$‰ãÅ>ê¹Ê”¹I2£l_#ÁçÖû–ßsÂ{Ç‹z“¶mSÇ·dxß~ 3Kÿj@]ÞJ{«ÞDñ o ¤7À|-‰©d·º‘õwUUIŒKJúŠ({%P•èõ]ÍêòVÒ[ÌfŸDwÙ9i=÷9GÜNï·&­sûX#'Ýý6/1yåÜñ}ËJ³O)3K]Þz"ñÝuu]—¶èÞÒ=ï+³O)oõÍKx‡ÔñÿuÀ[é °’œ(Vgr]שã[U%JäzYîå¹ð’|»ÝÚ8޶ÛíR¯³Ç1áë)æÔZv­’Ä/ïþ8}Š=w]âþ"sc\cNˆÇÏÏáV¡¾vKëù +ý{×u¿µ–k}¯ø¿uº'õ*Šâ⌯åAxÃ[é p…œ<Þl6)…-Ù}wwg]×Ù8Ž)kfI€KöŠÜä…^Fïv»4Á¥>KTúz}Ήì×êIrb:ŽùÒéëxlsµ&þXü²Üzs<Îíïk⥷þºoŽÇ£µmk}ß§{¿|"\UÌ.;¼U_âÈÛï÷"Ü÷Ô¼Þ+ñ2VIYIÅÃá`ïÞ½K=Ìf–ĤOçê³¶Q|û¸&µ¬ë:«f/isiÝœ<–ÄžKr/mŸ«ÏÈ}·F ®ÜrN¬_“Øk¿›ækÖ{ ô C“Tö}oÇãѺ®K"ò]j¹îËóùœ’Ýu]?yiRKßAð–@z¬ 'y·Ûmˆ>Qkf)íSØ1å'ôÝߪ9‘8/Šâ"Ù«ãð’v)%íSÛ¹õÖJn}ž#7æšu¯ÿ­¼„¨þÒéou¹K|Kv÷}ŸD¸:¼c½‰¶Õ&fŸ&°Œ÷¦&³Ô÷ªÛAzÃ[é °_õ!á-‘8 ƒÝÝÝYß÷IXw]g»Ý.%zÍ, Ë({½ÀTr[Io tMl¨„®*Sr,Õ~øó™[o.%¾´Ž¿F¹ñâç\¥Jnü¥±—Î×/Ÿûþ¹}ÞkªS®m¯ß]“U¶mkI€«ÇOŠªt·ïûöµ&f–þ‚„·îÑý~oMÓ\LzŠô†·ÒàH4–eiMÓ\t3o·[ëûޭ뺋ú‘8¡Ojk=!É= ƒm·ÛÔÁ»¶µ¾ÙÓôôRB{mº;·žÞcµÊÒº9©·õÇy­åšp¾Vu27þ­,Õ¡DÉ­—ÒÝú}Õå}<Ór­“ݾâät:YQ•;¾g^/?‘¥ˆ}ío¤7À3‘hTâ{¿ß§‰,•°•¨ÖúÀ^\š}Þ¾sÛì“0Ç1‰t/½µž¯Q¹&2×Èç5ÛÅås{iÂÌÜßq»%9¾t,¹õ¯}?·ÍZ–Î×Ëê\—÷8Ži™ïëöFr/íCénÝ‹‡ÃÁ‡ƒÕu}Ñß ð#€ôx1é-¹©ÊUUô}Ÿ¤£¹§ÓɆaHiéóùœz–½Ÿ¦É†aHû<ŸÏVUÕ…”Uµ…¯«¸V]ñ¹½ÙkjMâºzéókµ)¹º_?îk.ií÷›û;7^{éïÜqé·V%‰>«ÒD/ý-ùíëKü+÷¯6›Mª0Ѥª?ÿü³ýôÓOv8Òr=ñÇJÊÞ"Ho€g°Ýnm»ÝZUU6MSÖfEçÃÃ5Mc]×¥´·Oýú´®ÒâJâzY-é-Y:M“ÕuÖ33+ŠâBªÏ%z_Bt›­«IYš 3¦ÙsëFÖÔ,Ié5éöµéî¹døÜµõ¿]œ´RïmÛ¦þvýæß>ñíßõ€EÕ7MÓØáp°÷ïßÛÏ?ÿlïÞ½³»»»”AÞðVAzg’<à IDAT<“ív›ÒÞˆã8Ú~¿RoâëGN§SšˆÒ§u%%½TÇ1m£É ÍÌʲ´²,S-ŠÄ»O:n5ÇRuÉÒvKËsãÆøœ7Ë ÷¹}Ì-{‰Nð[Æ”¤ö&¾Ï[‚[ï1å+Mr}ð»ÝÎ꺶º®íîîî"áíº„7¼eÞÏÀ'l%¥5Ià8ŽvwwgMÓ$ñí¥®&2Ô8J{K`*Enö1%Ü÷}Ú^>> ƒEq!\×ô7¯•Ùkdø-)o ¯-‹ií%™}í\ã1ùï®U—<·%Ö›(å­dw¬8éûþ"ëM´\ãªÚ¦(ŠTmòþý{û•_ù•ô·îÃ(¾Þ*Ho€g émfirɲ,í|>[×ui"Á®ël¿ßÛ~¿OißÜ$–qÒB¥º£üUJ\‚Tâ]òÓW¦ø~p»´¯IÐ(¥¯%¯­ÿŽz®úÄ_ƒkÌm7'¼ã¶kÉ pŸÆ×à Énýf^tKv+ñ­*Ýþ=Þ±Wþp8ØÝݽÿÞÞ¿Ÿz¾ý¿ ø@z|&^~ªÊ¤,K«ëÚš¦±wïÞ]ˆÍ®ëž$vc’7'¬s\n·[ëº.U­ä¤¹ŸØRËü±¯IÿÎIëk(K%¹Z“˜0Ÿëåžû âø¹ãÛ\Ko_ᱫÝÿž¾ÊÄ¿4ieìì~ ÿ ÄÌR²[XªÖD/%»ëºN}Þ¤¼áGé ðL$’%#%¼«ª²Ãá`ïÞ½³iš¬ëº$@m³Ù\TYxÙmf)±-‘eµÄ}ß'Q:Ž£UUeã8Z]שC\ÛIˆkìk]ÝÚOÐk¶‹Û.¥Å½øÖßþ¸—&œœë¨ÎÉî[„÷5ù=W‡âkLô{êaGÛ¶v<mGkÛÖÚ¶M¿¡Öci¹Òâ¾ §(>j½¦iìîîîÉëp8¤jRÞð£ôøL¼p•”ø6³”ènÛ6õK@«¯{·Û¥žo½{q­I.%­Õõ­”ð0 VUUªQ©ªêb›¹ãõÌÕ’h›kÝÞkäv”ŹÊ¿ßk×{IPÏw‹ð¾–÷çåFHxë%Ñ= ƒÇ$»ýKO¢@×ÑÍf“RÛês²ûÝ»w©æDÿâÀ×ßü ½žÉÜŒ’ÞÐwwwU$šÄÐ×bLÓd»Ýî¢ÚDãæ’ÞZÏo¯¾oÉî(Hs e7—ÊžcMÉÒØ9Q>Wm2'âsûsò<^ƒ5 ï9â±ëw‰“VªÞ$¾Ç‰)ý¸þ;?y©Ù§Q *՚ΉnOü ½>ƒ(¾½ðÇ1ÉF}§ª‹®ëžHëa.¤¬Òà~|íOÕZ¶Ûí¬iš´žï2Xû¸¥²äZš{mɵ1×txÏ­³”¿–êž{°ôÙWšŒãhÇã1¥»}Ò[¿¿~?©ï÷ò\4Ì,Ýcu]Ϧ¼ïîî²}ð?Ho€ÏÄËDM2(ñ;¹Ç£=<Užø¸âçóÙ†aHÛLӔޥ(Š4±aY–I¢úÏ1q>×Á“Û:V¿nü¬¿µî-Ÿýø9–äõsþŽ lÉg?q¨~/}V‡·¤·’Þ¾—[ã˜Ù…äÖï> ÃŘ¾«}·Û¥Apwwg?ýô“½ÿÞÞ½{—Þú×?2Ho€FýÝêÕV%É4MÖ¶­ýôÓO¶ÙlR‡·©d¸Ä§Æ2³$_Í>U˜xá-Ñ)a*¡: CꯪÊú¾·ªª¬ªª$QÏçsÞ±C|N`_«AY“êž[wi½kÑ«G$¼•Ꞧ)U˜ø—¯;ñU%¾¿Ûw¹+)î;¿¾~›²,­i;öþý{ûùçŸm¿ßÛ~¿·ªª¬,K’ÞðÃôxA$'£Hž¦)ÉÉý~oÓ4ÙããcJGÑ)é­ú‘išl·Û]Ô¡(ìÙ±.Ã'Ç%áõY‚Tcøîï¥-¿eBËku&K߯­4ÉçÒßk¶Ï%½%´õjÛ6Ém-;Ni™^>åíÇcæ~73KÒÛ×›(á­$¿ïøQAz¼ ^"KRšY‘Jk²ÊÓédmÛ¦±„¹Ràš¨Ò иO3»æZ¯,Ë$T•úÇ1›d³º¿ý~ü÷Zž«7yNÕInÌÜ>oaMÒ{î»\ÚÛÌÒõô‰í¾ïíxWvûóÏuvëØç„·ïH×Ë?Lˆç{À½u&>î7]Gÿ0AGÚ¶µ‡‡‡Tuâ÷ïVÄë‹ø†¤7ÀW@⸪*;=Úu]›™¥uoÇngŸöõªÒ¨^Jh{+¹®JUl(=ìÇ‹ï:vŸ2öÉs/\×ôyëóÜzñZ>·Ÿ;÷ò xý-KzëAA×u©¢ÆïÃËm½”èöÂ[ãDž{  ëÙ÷½=>>^TçÔuÆÐC¿~#=¸xë ½¾’u]Ûét²²,­,K+Š"uik¹ÒÖ¾òBÂ5Šo‰Ô²,Sç³j/¼ø6û”ÂVjÙë2ügÿ·Òê’ò’´ú[Ip‘ëë6{ZS2·Îç$“ýxqbOý-ií%·>ëa@ü%vLûëêëK$º}RÜ㯧î3K¿Žáx<^\3UçhÿEQ\Ô h,Ä7ü( ½¾ÆMÓ¤I+Í>ÊY%‡Ïç³GÇѺ®33{R±áÓÀ>e\ÅEõIÄ‹Y/§i²ív›Òâ’ÚéEQØétJŸ5–Ùe·¸Äl¬ÒÈU–,ux¯ííηÉMNé…·„³„´–÷}Ÿ®6x9­ï|=Нˆ‰éü˜îöãû1ã5ˆ¿¥úþw>N©æd·Û%¡Sã? Ho€¯€OÙ*Í}:¬iš‹¤wQIXªêÄ'ƒ½ÐT/÷4M)1î%tY–ÙŠ¥ý±é]Ç“èz÷Ç'®Ô¾Õ_®}­Û9!¾t-×q?9eLzëZÆôµŸT2¦»õyîØ£T÷U&z¨¡‰0‡aȦÃý9úz’Ýn—Žl6›4žºÖ3û8ijUUi?Ñ)À[é ðˆÝÌ‹m%­•8®ªêb2ĶmSg³¤sœŒÑ÷lKÖj=ÉÏœ÷“1J¼K¦OÓdUU]T«è¸ý¸ª7Ñws×Àÿ­ýÇeÏe.éí“ÝÚ¾O[òØKê(»%ªý¹øsð‰ñ8饯ª‘üÎ17I¨ïp×öþˆHl6›”øÖo§Úœ8öK]s€ï ¤7À7F‚²®kÇÑîîî.RÜË^6›YvEÉV3»˜T2Nh87i¤ï÷Ë}zÙË_mã'¹T§´ð“ZÆê“øÙ³¦æÄGn™>ë:JÇz_1âkFü±N&&Éum|»Äzìí^:ßx~±3ÜWÛh¿}ß[Û¶i²TÉo¯Hâ+Sbï;À[é ð‘¨<IHEaûýÞªª²²,íp8XY–Ö4ÍEbÙ§‹}*ا‹ýd”^JûWN~*Y¼ÝnŸHaƒ¯ÐôöcÆq£øÎÉ÷9ù›[· à?ûãöéy_w;»ç&¨ôÛëóReФ´Ÿ3We’;7/º§iJë+•¯î÷ãñheY¦ó†Á꺶Ãá`ã8^ÔÒèwòµ)HoxK ½¾!^p«‡»,K«ªÊ­( +ŠÂÒ$˜’œÛí6U]¨Ú׌ Ã&¥T'·úºµG÷‡î/&¸„·Òࢤn]×VUU’£Ã0Ø~¿O©ì»»»Tuòðð`f–’ÃffÃ0dÓÓêã8¦í£xõŸ£àŽ2=vgG‘­mcxü[Ǧ÷¥®ïÜ~½ ö½Õ¾r$¦¸sãú1=¹®pí#öuw]—ªf|ú[Ÿ£¤Ÿ“Þ¹ŠíÓO^ê+güõPüã㣵mk‡Ã!«D÷v»Mߺ7ÞÜÕߟz6³T5¡”®ÖQ’w»Ý&q-¡Ú¶mVòza-±ì%nœ°1N8™Ú±Z$®¯¿sU'ªTñëøcÓrmâ>ýß¹¤¶¿¾·ÛO¯ëkI|’Ûw¦ë{Âo™´Ò_Ë(Æã–þwô•-ã8¦ J›ë¡‰Rþ»Ý.¥Áu,u®¼FÞß)ÃeYÚ4MÖ4õ}Ÿ*-¦iJIݪª²)c?q¡ÙGIª.h/>‹¢HïsÒzîs˼¨Ž©q/ncÒ ÎÇÇGÇÑÚ¶µ¾ï“ðö¢SUÃ0¤ .%D}¯xœàòÚ•³1¥¥®„­ÎUÛùóŸK¥ûqc÷vî{ þ\ÅHnâKŸIo/£Àö×K×J” ÇÑÌ,½ûãͼfsëÇë«}>>>Ún·KU(ã8¦ .§i²º®/Dº¿tN¯ ¤7Àwˆ¤·&¸Ôç²,­išôÞ¶­½{÷.õ8ßßß§å°>¹¬JÉð¢(¬ëº$¹%yí¥s]×éu</$©¯ß†! R-×dˆ’³Ú‡O}+%ìà±ÿ;Wµá™« ‰ßk¼¹ì¹ñr•%sÛIjû‡1¹í«abÒÛËh_Mâ{ËU#¢ #Õ©­±ÖJýØÛíEw<¿L¿ëv»µa¬mÛ'“|ê76³t¼šè’Zxí ½¾C|E†¤©ï•Þï÷vwwgã8¦J“‡‡‡TU¢ðœÀíûÞ†axRQâÓÛeY^Œ%!ªqµÜìS†¯(ÉuV{‘:'¨¯‰ëܺ9Y¼Tg"= Cº&š˜Rµ Q‚{Yî{»ýƒUÎ4McUUÙ~¿·ív›¤³ÆYsÌžVÀèçÆðKx+Õ¯ª›¢(¬m[;5(Ýò:¯[~ €ï ¤7ÀwJ®^¢ª*›¦Éªª²¾ï“°mšÆêº¾XOÒRõ%¾^Ã×€ø´´—»¹Z¦Ïš3vAÇÏ’Ã’°’ëkej쩞û.7ùcœ<2Nð©ëæ—ùë©d|¼:wI½WUeu]ÛÝÝ«ëÚ‡ƒm·[;éÚJFëï\]JÄO\éï ßñ'¤Ô9*©¯ßÂ//ËÒN§S:º®/&õCü~IÃ÷Òàá%¯—ŸªÓhšÆîîîÌìcŠw³ÙXß÷öøøhûýÞº®³ãñh]×Íö\+í+ù)iê;¨%À•öÕ(¾ë;7Ñ¥Îãš<“Þ^œÏIïXcâ'¦\JqKöúóÇ©k­î­ª*«ªÊ‡ƒí÷{+ËÒöûýE½Éù|¶²,ÓõóisUÐä&ìŒïþzÄ»®O|)¹­k£ô÷f³±ãñx1٥½¯ÁA|Ã÷ Òà¤D¥„õû÷ïm³ÙØ~¿·¦iìÝ»w6 ƒ=<y€ï¤7À+#×ŭ媆Á‡ƒµmkÃ0Øñx´ãñ˜d§_Þu]’ßß¹I0Í,‰m}öÇ’ݹ¿ýËŸOî<ç„÷œô–ÎÕ†øD»̹óÐDª-ñŸ%­÷û}JwûÉ «ªºè<xxHIpIï¦i¬m[»¿¿·>˜™Yß÷çî^|ÇŽïÜ5’ ÖƒIoMn©ï”xoš&=P¸êOü>Þð½ƒôxEø¾e³O5!Q2ã˜äì0 )Ü÷}®}ß[UUöøøh}ß?IǤ´¾ó‚z®JcNr_“ßsÜ’ðÖ÷ñs”àqRJ/s%­ëºNu%êéÖ»d÷ápHIoÉr'ù¬ã(ŠO:®(Š‹.q¿Þ\µK|ExœüÒ'Â}ʼn&@Õ6ñ¸õ™ .á5ôxeH$­¾9¼¼ö×J†úÎu}ïÓïz€Ñu]z/Š"¥üý}£}è>Ðy©¶à{é 𠉢X’SIbŸÖ–ôÞï÷iÃý~ÿ¤kZÉÞ®ë¬,Ë$µ/Ÿúöu! å\z; îœôÎÉïœÔö=ܹÏq/éýË'º•Önš&½~úé'{÷îí÷{{ÿþ}Üïß¿OÒ[ïþœôYè’üÚ‡dû4MÖ÷½Ïg{||L“Zæ’駺}½‰ŸØ4wŸÄnsMBªã”xW퉶SÏ»¿Ç´¯[Òú_ ¤7À$¦œs]Õâ§ÓéBhªë[u(êý>ŸÏ©ZIðœt^JZÏ%Á×$½ýçø·ïÿÎÕ{ˆØ=®*¥¯Õɽßï­®k»»»Kõ%šTXJþúä}®ƒ\Ô­Ê™išìîîÎÞ¿offmÛ¦k< Cº¾ú–~ßÜ5ñ&$É}¢Ü? Ð6Ú·øáÏÁ§Èuõ`Ä €o ÒࣔnUU©ªB²Ru}ß_L|©Îo?Á¥ÒÁß·^€û4ñ\";×S“ÖsçÿÎMŠ)Á¯s×»^^xÇ +•üÖ„“ûýÞŠ¢H}ÞeY&I^UÕ…XŸ«yјñXu=%—˲´¾ï­m[ëºî¢wÛ_7Ÿ¼÷ioßá­¿õéZëÜýqèwëûÞŠ¢¸èC÷Õ6ª@†ÁŠ¢H×KRß?`øV ½Þ0^KrKô*­Ü4MšPQr[Â{GÇ1}VG¸ÿ¬^j/Ľ—°õµ(f—µ%^fÏÉoÿ·OkûÏsçêÓÖ¾ºE× ªª´žßZ®m”—ì­ªê¢&wœfvÑ®Ï>!~>ŸS'xQÖ¶mêZ73ëûþb¼øÐ Nf©ëã' õÒ[üºú}T£ßJ74VÓ4é÷–ü~’N€o w"ÀÇO|è{´•x.Ëò¢R#—èÖß]×¥¿½—÷ p½$L}|®‹;G.Í­D±„³¯g‘XŽŸs"Û‹kŸXVjYËü8qy<Öø®T½RÖ¾{[×PQNÓdEQ¤ë;MÓÅ>r5*Zî?ûk›«”ñµ'ÚF2Û¯±t¯¨ ÇwŠë:/ý†_¤7ÀFRSÒò|>§DnLbûJ j_Y¢$xÛ¶6Žcªßð|† îºÞã>—ªOt>ÉÓë>Õŵd¶Ú¾“[&1 ®1㤗1U.‰{Ãã±kÉëÓ锎ÇOp©ãýðáCоƒ[䮑t¬@ñßÇd½O›+}¯ÛíÖº®K•8:ž¦iÒýáÓéªÉø@z¼q|Jziá娗àÝêýöÒ[½ßþ³¶‘¼•÷²;Wy’;6/¼%k}}‰Ouïv»‹É&%½ÕÛÝ4MàMÓ<éûÖ‚Ès“̹±¼73«ªêbbH=H8NöððpQã'©ôÇä'¬Œ¿iüýuí$¸ý¤–^äÇ}è÷S»ïN×õŽ54¹ý|IÞ­Çð/!ÉéŵÑã8¦¤µï÷öŸ½´õ¯ÜqäRÞQzë³—ß°êèö=Ü>ÓܹsþRøžñÓédûý>=,¸»»³ãñhçóÙÚ¶53»xp É$uÝ"±žÄì“÷WšÙ…ô^Ôû’ñªQò_|Š€€ô†¯ Ò²xlöQÒžN§$<}ZxG«ªê¢\¢ÔKÓX©’“ÌQ8Ç>ïœøÖ2IÖ˜üö\ës”ß_óÚªf%N,)±]–¥™}L‚K0+a«arøk+Ù½Ùllš¦ôÛÆ -Uã«O†aH½ä^œk ßíî“öú ð5AzÀ~rCýí;©%<%UQ"©-aë+8¢ìÖø¾ÚD䤷?Ž(ˆ£÷“túı™¥º“˜‰ò¯®_]×鳎G×I½ÙeYZÛ¶vo>|03³¾ïŸŒ¯]¬:ÑØ^zk;]£Xw¢õ%Ú}å>Kzã˜RþMÓ¤d=ioøš ½ ‹—ßÛí6õ?E‘&N”ÍMP»§ý2±¶N$¦½Enr˹e^rû—Æœ›ŒòK cSzÚËétJýèºî§Óé¢ë{š¦$©ÅÜ5Ì=dPÚÛÌ’7û$ÅcÕKœPÓ?Ñ¿’øñ;Ÿ*ø’ ½à qDŸ–¼öR<Êk/:s=Ýúì—ßzLsßÇ4x.!î—ç¶ÿÒøT¹¿®JFëûº®Sù‡R’>JhŸÊÏ¥½ç®]¬šñ4®ïÿVš[U&:ž²,­ï{ëûÞ‡ÃEÝŒ¯7A|Ã×é W‰•"·l÷µù“P¾¹ë踙¥^l%ì}Ò{¿ßÛ0 Ùd}ŽXu¢Ï¹‰J•W¯wLˆ{î'ÕÔq¨Ff³Ù<ùÚï×ìP‡ ¤7|1^‹€þžP-HY–I.KtßÝÝÙñx´óùl]×™™¥‰CÕ¥.žKÕǪ}öëª;‘ôŽu2%½5ùæ0 6 ƒu]gmÛšÙÇI8µ­ú½uŽHoø ½¾”~.ËÒêº~"œ%¶Ë²4³B¹ï{kÛÖÚ¶µ¾ï“øÎU䤷OpK`Ç .•ÞÖqø:¿?_Ù²Ùl’€ïº.“RàUU]­¬xHo€ïˆÝngEQ¤ !‹¢¸¨9ŸÏV×µm·[+ËÒÚ¶µ>$aÞ÷}kM¿·&Ë4û(´UUâ·Ñº¹ .µ,N|z>Ÿm†”T¯ªÊ†a°ÃápqžþXßð ½¾$–‹¢HòX•"JTû:‘Óéd»Ý.U‹è;³OÙ¿‹˜ôÞív©Ú$ön›}êúö|Hâºïû4V®ã;Ên3³qÍìS列ÞJck|Ÿüö]Ò\ o3Kýã]×YUUéø5.IoøÞß9’Çš$ÒKhMb©4¶êLv»ãxñÙåä–>I«M„RÛÚç8ŽioÕøí$¼5ž¶íû>£¯?ñ¿®ë'džø†[@z|ç(I­îl³b¹®ëT1²Ýn­i+ŠÂŠ¢°>$!>M“Ýßß§ñ¢TÖx^^ë;In/Ù5†RæJyKdûÔ¸ï ×—ÛíÖÚ¶µ¦il¿ß›™%y®ZŸ*Ïý 0Òà ¤¶G\"º,Ë$Ç‹¢H“GjâKMfy:žL\)|-‰P͉¶Ó>UE"ÉíŹÖÑß:¥Îû¾O‰ï¢(Ò±·m{1Y¦^1M0Òà•¢´µz¼%·û¾·išìîîÎÚ¶µÓéd]×™™Ù4M©òD“IJ€K({±íå¸*KTy2Ž£E‘è:áeuL|ûä·ú½w»]šŒSãI†«þ$‚‡Òà•"É\UUªñMj‚H‰äªª¬ï{kÛÖÚ¶MéëažÔ˜]NH™c·Û%i®}«ç[µ+WipU¡HœÃÒÝJ’Ã&휦)%Á®sÈôxÅH0×u}1!¤ú¶Ïç³ÕuRÓmÛÚ‡R…Iß÷i¬(½s[úu´/½U¹å´’ä¾ó{GÛívÖum6›”@ïºÎ꺶al¿ß[UUI¦ûc£òr ½^)×EQ\ˆgU‡H"o·ÛTg²ÛílÇ‹ïÌ.'·ô©ï\ï÷4MiÒÉøÙÌ.&¶Œø*‰ïa’¤WÚ[R[õ&¾‡œ”7,ôx¥¨NÄ'¬O§“Õu*A¶Û­5McEQXQöáÇ$ħi²ûûû4^ÞOßEžKzkŒ(à5†Þ•B×:ßJ£‡t^’êáþøHyCé ðŠÉ¥ž%À%‡•–V*|ÇÔç½ßïS/·OS{¹íe³—ÌJŠk¹_G²ZcæÆQ¥‰ßÛíÖú¾·aÒq«®ÅWœÄI3ý5@‚Òà¡äµ’Ó’Û}ßÛ4MvwwgmÛÚét²®ëÌÌÒ¤’ªA‘ãê]b\RNÓdã8šÙ§I4•ÐÖ±ää´ŸèÒKuCß÷¶Ûíìx<&™.‰¯ôº/Ž?Ho€7†sUUiâHI` éóùleYÚf³±ªª¬ï{kÛÖÚ¶M)ðqŸT‰HvKjÇu´? n¥²Õ'Sèq; uu}Ç”ÇÑŠ¢°ªªÒËÌRÜ'Èu¼ðãôxƒìv;+ŠÂêºNŸ%£%½ëº¾èÑþðáC’Æ}ß_Œç%µOy«žÄ§ÀsÒ[â]}ßZ׋iý­ä¸Rèã8¦$zY–v8.&µŒ)q3„÷ Òà!¹\Å“I&5i¤:´Ug²ÛíRºZ߉8Á¥¯7‘¤öû.Š"ÕšH`›=Msû±ý¾Ì,Õ¥ø^pMÒé{½%ß%ÓsçðcôxcH«ÛÌ’0Vöv»µ¦iR/ö‡’Ÿ¦Éîïï/ÆŒ&QZK>klí·(ŠôÙ—WcIÖû 5%ÏÛ¶µº®­iš´3³ªª¬,Ë‹1ß?6Ho€7HNüÆ>mM©tö8Ž©Ï{¿ß§¾n/¡½ðVMŠDµ™Ù0 ©NEûT"ÛKoŸ×x{·Û=ÙŸ¯e)Š"õ‘—e™ö¡í4Ée¼Tžü ½~|vY–In÷}oÓ4ÙÝݵmk§Óɺ®KÕ%ª<ñÞ~L¡´·&ÁÔD—}ß'Áîè’àª=1û$¦õ®cÖgM¢9 Cš¬S»,Ë”,—L÷[úqáí‚ôøAt®ª*‰fIàÝn—’ÔJQ×um}ßÛñx´®ëR ܧ½=Jg«ÜW H”KF+=MSJhûq´®Ù§.p/¼»®KIñq­( «ªê¢ÂEioÅ:¼MÞ?ªÑ„þ>¤®ë”oÛÖʲ´ûû{Ûl6Ö÷ýÅx1é=MÓl7·ïÛÇ1%²%¯ãx¹ýHz·m›RçÃ0$‘/i¯sRÚ{·Û¥ ;ámƒôøAŒ.Š"Õ†(y­I,•ÒVŸ·àþ;!¡ì;¹%±µ½ßï8Ži %Æ%¦5ÖÜqkè¾f%Ju¿ïõÖù.íÞHo€?‘¤ϧÓé¢d»ÝZÓ4VEJ„›}œ rš&»¿¿¿ÓW˜x™ìû·ý•¾Ödš¦t\Ú¹ñ¼°ÇÑÌìBrw]gMÓ˜Ù§É:51§öçk\àmƒô€ïž¹Ê ³ù~æçló¹ŽcêÐÞï÷6 C’ÚÕúìÓ×±bD"}»ÝÚ0 ]Þ~ÂIŸ÷Im¡Ä¸¶Q-‹êZü9h™ï×›ä÷Ûé ß5K"ùÚ÷¹ï|Ç—à%÷'tü’HPEaeYZÓ4Ö÷½MÓd‡ÃÁÞ½{gçóÙº®Ku"ã8&îëFüñÇI(UoÒ÷}’Òþ£÷*K8|²¼ï{ëºÎÌ>&¾O§“•e™Æ-Ë2mëÇD~¿ ÞðY|Iü¹ûøÇö¥÷ù¥%½Dïf³I“Aú:õcŸN'«ªÊÌ>Jã¾ï­m[ëºÎú¾OÝfŸd·êGÔñíÓÝ:/¥°µ&·Ôßñ8skšàRÇ1Ž£UUeã8Ú4M²[ç¨äw.¯¤7dù\Ñú’¢ö[Èë—ä¹ÇÿÒÂ;—d–€V H]×)ñ­$¶’Ôê÷.ËÒŽÇ£Ýßß§Š‘¾ïÓx hUš¨¶D¢ºªª$Ÿ5ö\OøÒùhrK/ÑÞ÷}êûŽ"^ûd‚Ë·ÒŸ#X¿T[RumïõçÔ¡| n=Þ5묕µK]ÖêÜ6³‹ÚUš¼{÷Î6›MJ}ïv»$š§iz’”öûRŠRãÚŸö_…MÓd»Ý. qmç?û÷X}â+W|×xìúÖ:þüÞo ¤7Ü,‚Ÿ+–sb1We‘ë–cüÖbû–®ÕKOŒ·‹õ!EQ¤d·z°%‡·Û­5MceYZQvŸ*E$¬ã¸^Jûsš¦)½$Е,×2¥¯—„tLz›}JsÃ`}ß§tºÆÓ9ÆcEz¿Þ?(·N¹f]ß'7n¢·SNоé}-}|«¬]’Ý>uíQ¿¶’Ó’àJ‚«>ät:ÙÃÃCšÔÒ'­}r[ûÖ„“:Dz,­,Ë”÷=ßþ¾È-óŸ%Ò•HÇ1‰n%½‹¢H‚_“vúnïÜõ‚×Òà ò%Rѹõ¼,õU·Œ‘šKÇ57Ƶí¾G®%âsu$¹ K ú¹}ÍIðˆwY–6M“UUeu]Ûáp°ãñhwwwv:¬ëº‹ %U3¢w¿/íOò[‚Zélß%îÃ'Çý{¿Žö!Ù­No?ñ¦`ãÇF~¿>Þ¯”—ì®^¢Kcy™ùœ}/Ið[Ç|-²{m‡÷ܤ“Ÿ»Ÿ%¡>7Æn·³º®/ÖQ*["ÜìcŠzG;Öuõ}‘öÎÝ/šàRÒ\¹(Š4îù|¶ív{!¦—d¿_.ñÞu]Ú¿*UêºNR\ûÑöÛí6õ”#¾_Ho€WÂ-ÕkÂת3>g‚Å—˜œñ¹ëŠ[Eå­ûøÒãßR_ò%'bÜn·V–eŪ7QZú|>'!^–¥u]—*DT32 C:N/Áõ½ÒÝ>y]–åÅùkÿñ|%Äãõðu%Jyk¿Ó4YY–Ç£ñ¼ìÖßHï×Òà;çÖžëkõúûVaýÜð[Úk&,¼5EþœÎë—æKõµu0q¼¹‡KÉp_o¢uÏç³õ}oÃ0$y}>ŸíááÁ¦iJ\Æñ%˜7›MÓ”ãã8š™%©®Ï~rÍk¿iî_(¨BE~¼tWŠjO$Ýýºðú@z|§|N²ûs¶ù2üZó­ûYâK%Ê¿´$_{r4^Ÿ|ö+…­‰!7›5M“&†¬ª* qIíxlñA‡—à’Ò§ÓɶÛíE÷Òyûe¾âDcê˜$Ò%ð%¸}‚]ç¨c€×Òà;áÖÎjŸzÍ¥uoáÏíÌ^“Ôö\´·ô|¿ÏÿÖ$ù÷4þ­ç«Z¡Ê‰ã²,“0.Š"MHy>Ÿíññ1¥À•°ö l³Ë ­cö±#\cãheY¦u•þö5&ñÞòãj¿~bM^^zûNoŸLÔ|ß ½¾!ÏÍ×j-n•ÆÏY?'cD…¹uÖìoí1¿kÆþÉêܨׯ¿eRʸÞÜĕנÄîk¥»‡a°¦il»»»³¶mít:¥ *§iJ5&š\Ò'¿µŽdºÖ†!Mv)I-Q'›ÔñÏ%åcb|š¦ôRM‹ºÄÍ,UŸø{Yã“ÿ~Az|%>7I¥Ûœ”¼¥†d­ ’;÷]\~Ëþ¾TÉ—óÖtû—bNî.Õ£Ìsmy”áľ·Ûì“X>ŸÏVU•™}”ÇÓ4Ùñx´¶mm†”ºŽ©oM:©žmŸÄöý⾒ħÐý¹ÇwcfiŸ^¾KÆ×u}±®$·àKb¾=Ho€/ÄKÕ…ÌMªwM*ßZž—Øk;¦_✯ñ¹Òû¥¥ùÚ”õ-ã}i™Pøåþ8–PÊ»i𔾖€V¶êHʲ´®ë’¸V]‰ä·Ò×>A¥·dsQ÷¬ÿÏÆÚëæ“åêùÖß_Ç/ü›ªTAzŸ ½¾·ÊݹDísªKÖlã™±+ü%jS>÷»—Üæ¥¶¿¥ŽäÚ¶kÇX’Ós•'Kß­©IÉ}'!-‘­õú¾O‰mÕ™E‘*KÆq¼7Šom§—»„ôn·{Òÿí·ÇëH$Ë•R÷•'çó9Mžifi_~9\~ß ½^˜µÒyè~ÎXsrzInûÏ>Ý}ë¾?gùµïnÝf)…û’iïµIï[Rö_‚¹t÷sÇÚn·V–eJIŸN'«ªê"™]×uª#¹¿¿·ÓédÃ0Ø4Möðð`fv!¼5i¤î×®ë.RÕ›ÍÆªªJ‰r_¥¢ãš;Þˆ¤·¾Wò\•,B sßïíëTàûé ðBܚʎ‚ù9u%×–çú¶?'Á}Ëò—”ÞÏIDßšL)ž#²×ÖÇ| –ªN–Òâº|‰Òݒت'QR{ëûÞÎç³=>>¦¸îC‰h]Ém/½•Ú.Š"U§ÅSÍ™;þøàG/-×qç&ËŒ©ò\_8u'ßHo€ÏäÖÊ‘¹ú…µÛ/-óä&\Úî[Ëo/ãã:kÄï­røKÈä[:±oYnuÉ\êÿ9Ëõ¤tUU6Ž£5Mcã8Ú»wï¬m[;NÖu]’ÜÃ0¤ %U}¢¸*H†aHik tuƒû¾mWNJÏáëOü~•þVÚÜ—“ÿJª#¿¿-Ho€g°Väæ„óœì¾Už¯9¾¹‰0¿”ø¾¥Ê%&q?'™}‹Àþ’Éé¥Äö×wÍ‘µ×a)1=÷ࢪª'x»ÝÚ4M6MSªQÏwÛ¶Ö¶­õ}Ÿ„³ä³&»ôçæ“ØáJ„k_ª%Y{Ž~ü¸ßóùœ$¾Ù§+XàÛ‚ôXÉ­òwN8ûm^JtG©¼Vtß*ï×l­Þc|_ûýÚuž³îs¹¥Þä¥$ùµ*\sÛçÖ™ÞKûR%‰ú½•–>ŸÏ©—»ª*kÛÖîïïSZZbܧ¼ý¤•Qz«BEÕ$s˜|Wxîúøëä'Ú4³ÔW.ʲLç“K˜#¾¿-Ho€|N²{Í8sßå¤ÝÜ:k÷ù¥E÷œè_óÚw/ñý箿†[êM®Õͬï¥*Mn©>¹V{âS×>m}:¬ï{ëûÞ6›M’Û»Ýî¢âDcÅz½Ýnm†Tw2ŽcªF‘pÏÓ܆\¥ŽjWrç+ÉíE>²ûûé p…52ø¹âù¹Õ!·Ö—¼„ÐÎý«Jž[¡²´üÚw·¬ó¥¹5uþ9’ô–Š’¥1t,KãÆeKÂ^¢[B¸®k«ª*M<¹Ýn­iš4å‡Rˆ$¸ÆVâ[“d*í­¤·ú½w»EqQkr:.&Ù¼vü9ã˜Rçê /Ë2­/Á.É.1ôþ>@z,°V_“ÝÏ•ÐsÇs­6%÷÷sëMrÕ)ZþRõ)×–_ûn-_SŒ¯­7ùûK…¯Mxûc»u;Ý#’×fŸD¸ººUbfI«ÏûñññBp+ñ­¿7›õ}oeY&é­ªIu-Ï]ÛRýŽö)TŸ¢sWJ]’¾ª*›¦ÉŠ¢°Óé”öíàñ¯Ò`†—Þ·Ž;WÍp˾^ºâäZÍÆ-iøçÇZæ¶ó‰ôÏÝÇsÑkÖ˱FJߺ<ÞCsëÄ+KÂxn¬¸^QiBȺ®íp8Øét²ãñhwwwv>Ÿ­ï{3³T[¢ê½K:+ÝuÝE¿¶å’Ò¾ŽÄÓµ¤½`¥uÛ¶µÓédã8Ú0 Ö÷½EaeY¦󪪒÷æJ¦Ã—é ¸EꮑÐkÓÞKÛj_kkO–öqË:K5Ïë·ˆïkäDëµu?wŸ_‚9I}m]¿Íœ_ª$¹µ·{)ù/·Äo]×µ#ª.9ŸÏ)­]… Ã`]×Y×u)®ö8ŽÖu]JcK„ûZÕžÌ]?±e”áñef)Õ­NrIí²,­išÿ¿½;¶¥®ï¼ÿ©ª=žáÞÃ$ 2^P‚ºE(8°M»“htbBb#ÈŠ&jwÒ‰±ÉJÔ•´‘Ç8ô2- ¢f°£ 7`‚ÀÓ!â€"(h/ˆ gØ{×ðüqîoß:ujÞU{:ï×Zg]U¿ªúíª}pùÙßû­a —f³©v»= øÛíö–‡n¢~\e€Qá"ásVèšDf¯Ìâö**ÈG ºÓ*ãÆä9nwVõpÚ¸¤êé¸mIãÌØ¬uyztg…äEö‘6+­M_ìpõ³ ©% Ûž4 mllhuuuK0Þï÷‡Ü&7?&ô6s«Õ’ëº[Ú¬Dn3׸kÙÍoü6ïɄަ‚Ýô1ït:ùxW A4L …iwÚq¢Ë“heR¦²»êP=MZq‘½È UH«ŠŽ‰ŽËê“7>I\àœ7¸N ƒ£•Þy÷ WV›8NÁfK“Á`°¥-‰é= äºîpl¸ªÛ,›`¼Õji0 û„›>Üá ð,á ïp ›-VÌk|›sv»Ýa(o¶›?®âõ!ôØ/©b8lgÞYÇÉ›Œ ¢ë»ëºÓª£ë¬$¯:„Ì[å=ª´0;:Ÿè~IA{RÕö(•ßÑÞÙ&ð‚`XñÝl6·T‡Û‚¬®®CoÓZĄɿA—–e CqóIS-> †ç³,k˃(Ó®›™s8ð6ç0}¼MÕyj·Ûêt:êv»jµZÚØØP¿ßW·Û†Þ¶mo©G½½”¿Z8«š7Oà= ÕÝ“»ÃçÏÓ«¼Ì¹Æ]é%é}æi5Rd}Öy{t— ·Ó–ͽÏÏ,›@¸Ùl[ž4a¸ìû¾ÖÖÖ†á¶9¾ Àƒ >Ô²Õj _›=z.3‡p%¸™¯yH¦9— »Mñákß÷Õjµ†UÞ­VkK sþF£!Ïóbï ªGè v¼¤u”À;IZ%p‘Ö"iÛg)ðN_v]AwÖ˜¼ýµó¶'É ‹“ƅׇƒÛ¬Šó¢éuŽ7ãÇÙòÈn·+×uµ¸¸¨õõuÁf I[ª¿ƒ †Þá€Úqmll žS´xô^˜ÊnsSÝíyÞð¡šf]¸··mÛÃ9™~åf?ÓžãAè Pƒ´à´L ªŽ]gà]GØ=JµwÖ¾U·"ɪ柳Heut®IamÙà;:6íøYãÃ_¥/›`ÚThÛ¶=<žéËÝjµ$iX1½±±1  Ã³4ØæA¨Õjm™—ã8[æÞfê~¿¯^¯7|`¦ii ÃMènökµZà pß÷Õét´°° v»=öY°“z€--<Íêyœ6>nLZßåªBè„Þ1²*wë>_Õó‰ uŸ7+h­kimžc$}9Ýžg[ÒrÒYËYêø“dîf³9 ¥äyžµ±±1l"hqbÚŽ˜êjÓò¤ßïËq­¯¯×›àÛßôó6=Âͱ²æi*¼ÇQ³ÙT»ÝV«ÕR£Ñ†âEï'Ê#ôPñµªP|”*Ù¤ñI¯‹gÔñÑà;O *–Ãç“¶÷÷Nk!]ŸGÒý‹[Ϊ€/rž¬c” Ñ'¶‡c‚b ‡ï§¤a Ýl6eY–šÍæ¶Ð:ܧ»ßïk}}}øÙ0U⦽‰ymZœ˜‡Oº®›ù>Làm*ÉÛí¶ºÝî0øW©c<½ÀŽUwõ6¨#ÜOZŽž/OÐÖ%nE¶­ðÎ3fÔªò¬ó9W‘ñI¯ãŽa*½Ûí¶ư’Ú<ôRÒðá”­VK½^OO=õÔð¸ý~XÉÝëõdÛö–°<úPÊpïpOð´^Üfž& oµZÃÐÛßÍfsØúãAè °_Våp]ç«»š¼î–&yª½ë:wÚ˜¬û–´_Ù{]&ð®ê-pO:^‘÷®¬6a³çyÇW.--©×ë)õz½á~ÑŠípwV5wtáV+á‡mv:u:-..jqqqXíÝl6‡mN0„Þ`ÇËîÆ…ÅEZm˜ ,. q+¿Õ IDATŒ†ÁYnÞ0ºl°\v9i]t[Ü1̺´å"ëÒý²!ëXq¯ÓÆe/tGÛ¸äCѰ;íiísò?ϲeYjµZò}€KÚÒ²¤ÙlJÒpœ Å£½º£_Xd1-WLønZš,,,hiiIKKKZYYÑÊÊŠºÝî–joBïñ!ôˆ‘ŠÆ{yƒï´s„_‡Ï‘fŒGÇW±œ6&îýG÷‰îWGà]—¢s™õy‚½¬uy—‹´q©"ð?0²Ñh eÇq†íIL¯ïv»­~¿¯ÕÕU­¯¯Ë¶m ƒá¸"UÞ¶moù1UÞ¦º{yyY»víÒA¤•••anz{OÃgt§ ôP±¶!y–“Ö¥´E«ËÌÙÌ!:f”–'IÇL7W3¦h;“¸›ên@›Ïyˆ¥´Ùÿ;­­­É÷}yž·­'xæïÜÓî­VkØÓÛà jµZÃo6áœQ?Bo€ýò¾i±‘UqñâÆ×UÑtŒQ–ÓÆdí•7ÀN [§¡ê;ïùóÜqŸ—ðø¬62y–óŒË¾WYA]6ç´m{ضÄü­˜`YÚlAÒét†¡t§ÓVx»®«ÕÕÕaèý{Ìî'nªÍME÷òò²vïÞ=lobƘŸI.wBo€*‚ï´@ÖŒI;o\ ‹ðþiãã–£çGK“¼ûEçŸvãΗ'X̾—U$Ø,p›uáyg}¦òÌ­hèl>÷iÇÍs®¼yô~›qáÊi*›±ÍfSŽã [¸®«^¯'ß÷µ¶¶¦Á`0|OæšÇ½?óۄݦªÛTx/--iyyYËËËÃžÞæµeYÃ9L×1; ¡7@†²Áwt9®*·êªï´å´ù9Ψ¡zÒ¸èú¤9ç Íãdµ>©RÖ<’BäðþqŸ—´cç  ‹„ä£ë£T©(÷Ùö}_®ëªÛíÊó<-,,¨×ëI’úý¾,k³Å‰ùñàÒôë6ÕãáÞÝ êv»Ã–&KKKZ\\ÔÊÊŠ–––Ôív‡Ö4¡yÚ¼QBo€u…ßImL²Î_t>eÃî¸uEÇÙwTqAvžPx”ö&eÂh£H`^4ÜNÛ–5çi º“¾Hn?b‚jóðHÓë[Ò°¿w»ÝV¿ßW¯×Óúúº\×Õúúº<φç­Vk¸§ÓVv›ªnóºÓé [›t:á~æý˜àãCè !)T-ÚòD:§µC ‹î]®¢%IÑuicòî•§uIR¨žvܤñuÉÓ>¥l`^UÕwt}‘ªê*×åùlä½&A ƒoó:6›‡XÚ¶-×uƒÁpL¯×“뺒6û·ÛíáÃ1[­–ºÝî0è^^^V·Û¶5 o7½Ä%mii÷EêCè CV«<ËÑã„—T5Tž5§¬ã9Nžc¥½Ï¬–%£¶:)"î †ª•sÙлÈ6óÞã¾T‰;ΨÁ}ZÐTUžvü´ã:Ž3lM|ßöß6”4Át»ÝÖúúºÆ0 7­M¢½»;ŽºÝ®´²²¢Ý»wkaaA»wïÖâââ°ÂÜT–‡Û›ä}?¨¡7@AiUÜiËI늞7O ]t^qÇI;~‘}ÃóÏ:ö8äio’U‘^t¿¼s*;&íÚ'ÜIû–i’çxeÚ§$}>ÒeÓÎIJ, YÖæC+ƒ >h²Ñh¨Ýnƒj³¾ßïƒnÓª¤Óéhqqqt¯¬¬¨ÛíjeeE ÃÐܼ/Z9y„Þ%ÄU ç ÃË´É i‹îŸÕŠ$k}ÞÊð´õIï!mß<ÇÏ’§ýH™ãVuŒ2áw\Oø´vU·-É[¤}ŠQ¶·xxÙ÷}IVy·Z-ù¾¯N§#Ïó¶ÈÒ„àFc|·Z--,,¨ÛíñpðM…÷ô ôQžà.oEt‘Ö!Ñc˜ãi7ϼ÷´U¶æË(íMªšCÜù‹ÕYç)³½lew™>áá}’Æä]NkßbYְ϶¤aàm>Ùï÷‡¹ìõzÃÐÛ´=1¯MnÂoóÀʸÀ{šþ&v*Bo€Š$…ÊiÛò´2ɪÌ·h ”´9%/ÚÒ$íøy·GǤKS÷C,ó¶O©b{žqU…ßÑõYï3Ï—4iÁxžc§}Þ´ º¥­NÇ‘çyjµZr]WžçÉu]ù¾? ÊmÛÞò»Ñh sS1n‘’õ¾1>„Þ55T.2G[wä©;_ÖœãŒRõwß²-MÊcRíMʧêÐ;º>Ï1ó„Óáu£„íyÚ¦¶m+‚a`mö7¶ôk{´ E4ØËSÅ_Ñ01­";€æm7RE@YÕq²Î1îãäùR#mŸ¼ÕâÑÏBÞJë´ã… ßólÃÎCè 0aIí6Ê´IêŸ\eÐ[&´õ<áåI¶7É{캎“T¡_v]ܶ´/IÒBé¤ãUU]^f v&Bo€)‘·IÚ˜<íG’‚꬞ÌYs‹#+”Ì;.ë|ELs{“´‡æ=f‘V(I÷:o8^EOî¢s'èF„ÞS*OµoZXôa”áñY-MŠ´Ó¨"¨Ü íMò<¤±Ìy³¾0(ÛF%­:J œ'OšSžv4„ݘ„Þs¦Lop3.O5užãåí>Š2ǪªZ<Ïñ‹Ž¯û!˜IÛ’z‰çÙ—v%˜F„Þs.oÿíhˆ\WPiÛví}µó(Ò—<Ïþ£ª»÷yÙêï¢ãŠŽªFè °Ã¤õÏz0fÒ1Šô™.;¿ªUÕj¥ªcŒÚ¥Ìƒ)ãÆçic’´/0 ½ )_î<ûæ=רߣ´K™¦À¶Š*êºÛ£LÓõÒz VÑCæÙ·huuÞkƯóa’isÈs®Q«±ËŽ/z¿€YdOzT…Ð07ho€Ò&Õ¦åp=±Pé ˜„Þ€¹Aè ˜„Þ€¹Aè ˜„Þ€¹Aè ˜„Þ€¹Aè ˜„Þ€¹Aè ˜„Þ€¹Aè æNð”¯÷|ÊÕÏÂÕK Ì/Ð~ÔÓ-Þ'Wµy|OUàº;¡7˜;÷|Õ×7ëêÏ^³ ×-}ðWó”$Y²e• Dü@ÿóWŸ|2çrU2;Â{e>? ôÇéé–Þ¸N3‡Ôk=æë’aß¿ºwPÓÁGüìm™›;†û3ß`Í×Û?:ÐïÝ`ÝÃßòôÖ¿tõÚô‹7xú_ß }•pœQÕzŸ06ÓòwP™}OIÏ8Ø•×ëËvlýøÙ¹8Ú1ÝGݾÐÔ‹–ó-W¥®ã–5œÏŠ­ÿðâ–NmOpSrM2n¹Ë×7j SGºѹ5ê¿¯Ûæºé¶@ëÙj˜´²ïë~Q:ëÇõç?»¤÷žeëæòu¯ŸrœQÕ|Ÿ0>IO Jÿ÷Ÿ=ý¯‡í{t 7ì²õ«çú?7 tÌO8úñH·ñ_×~Á×?¯IíEK—¾ØÑ‹–¥ çë÷ÿÊ×ÓÏmègÝûÕû}¾§¡ƒ÷ך&.÷=ýÎ_úñ =€wÛÍÝtlS¿qt Ïþ£§ë’Ü@êbë/³ulè]Ÿñuús¥O~Ñ×÷ŽtôþÛj‡ëùñûJ’-}ó+ž®ÿz GÒaÇÚúõ3lnK|ÃÓ{¾èQOòÚ–^óGçî–äÅŸ3H¸&ÆùxúÐÿvuæ…ŽÎr¤õøzß|Ýñd  aë¢ó]°²¹þOÿÑ×ÿ] 4,½è4G?w¬¥†èŸôuøñÒ=ÚèI:ÌÖδudpìí÷"éF%ŽÛ?ÃŽ“¾ñý@O¬K‡=Óѹ_Ÿþ^ µuiy£7þ¨¥Ålj{?ß¹ÓÓ û$û³®>Ûµõ+çÙZøfþûrþ¾~C¿rÄæ{ñ~àéê½Ò¯rt¢½õz$ÞoÅߣ#¾™Û9–>¹¯uÞ?Iz䛾>Ýmé’¥¾þ~ÿý |[½†tL»§^Ojí²uˆç+œG§þm¼ÔÒíãéѸëv¾­ûnÛ>¿ïÇܧã~XÍçãEè æˆ¥ÓžßÑêcëºãGô¦c|¹®n¶,YVd¨è£{}µÎ\ÐuÇZzôžu]}«¯gþ;[‡7=÷8G/ñÿð]G/þ·y–mÙV ðé,Û’eK½}}ÜoéO.mjYÒ£Ôµ}ɳ¤Õ@{°©7ýÇ–Nj¸ê ¼-ÇMÞW’ëë.¯­w\Üвë郟ÜÐ'²õº£¤ƒoéÊ“:¾-}ý¶5ýÖ—½ô…–Š9熫%]+ú>7Û‡Xûßÿu7ùrÎXПŸ`I=_«H^ Üä«}Ö‚>rŒ%÷‰þû§ûºq¥¡ŸZ²d­új·£ß{•­†èŸZ×õÙúåAÂ{^ë´{˜÷^ks÷íêè÷δe­ô›íëÏëè^å¨Ñ÷tÍÇûú‡“½¢•}œíïÇÑëÏhëKßqõŒW¶õÊ_nßÕã¹ï‹§‡¾Ü×oÜèµGXjIzàÛ’Nhjíoû,&ÞïØ{äj!:·uWº¯µÞ?IÁª¯?½ÇÖÏÿD ëöÐßL×ÖO3ÐûöZúÙ“¥{î´ûùmýˆín;Nì߆hù™Aìu{ÆwúïÛæèøm×b Tñ¹éæÿ/ªA{0Gùî@¾$¹}õû®ü„‘î£nk6õÓG4èõ´û؆~ä±@w÷%Ù–.x‘£³ö—hn<è_vtz;ȵœ¤±ÛÑÂ#®þúþ =Ñëi¹ÈNÝÖyÏ·u\ÐÛ ¼#ÇMÝ×¶uÞ)Úýžz¾¯SŸfißêfÿã]»eõÔëõtô¶ì ©—pÎÔk’ò>ÝGÝÞnêgŽÈëõäY®:f}§¥Ÿù@ 5IV_Z]ÅA‘s¦_“ä÷ô¥'»Ò²¿C ×?Õ ´˜õžvu-=¹j ϹÐ0 ìŸwÚu Ïa6ßÐÛL}_›_]çÀÜ-KêØfÙî“}œø÷³MÁû¢Žôc‡úÚû][ÿf9ÐíNC¿¹kó<[îIÊq“îQšºïß¾{}ýíRKo?ÂSͼW=ýÁçýÛW,èÿ9Dzàž ýÎßúÕó=»‘óo#áº9vÚßRh}n¾}—«7ÞÈ“tÚYM½eOæ¥Çˆ½ÀŽdu,ü´–®¹ ¹ÙºC’Èí÷å…óÀ¾¯ø¾£—¾0È·lIVp è–¤USê»Z>ÔÑ~å¢^ûHO¿û·žþþG¯hož[A¨)Jô¸Eö5çý¶§kîsô;ç·tRKrèëg¿¢Pë•­û¥^“^d>ákÙ¶´´á뇥…Ð4¬®¥]ë¾ ­l-Ðr×’­ qމﵱu©óuCóÈ·}q‘p™ãÄ)z_zþ‰Žþ웾îYÔ9ÁÖò¶}FÒŽ›tÒÔ}ÿîüV ûÞÐ¥_ß¿›' ¾æëNlè݇úÆ-½e¹¯^O:№ο§§/>&={wο…„ë–4¾yÿ}nŽ;mA7žaK ä úxÙ_8`4´7;RãPG/\ïëº{7ôd¯§ÞFOßÝ×ÓS$/ЧnõtëSÒ“ß‘î=ÒÑ©û+:³–åXzZÓ×}o.zOºå{û_¯úöš§A¿§ö¢­£[–’ò¯èq‹ìkô–ÜŽ¥ÝA_ýõž>w«Õ”}Үɶ÷Ùï´uOõɕ䤤Æ!ŽÎö|ÝðÍÖãƒ'}Ýð-Kg›J%½×èRïaÎ÷UDéãX––|bs±è}‘µtôo ôgZzÑq›UÄÑë‘vܤ{Û–÷[ëý³tþùKúÌ/-ëÆý?o?ÅÖYç,麗8ZØe«½o /oì¿fôÿ=eë˜å"ñ×-q|äZTõ¹ ܾ666´±Ñ#ð*½ÀÎdI—¾¼­?ÝÛÓ/ÞÈ•¥§Ÿàè-gH×Ò×¾#=ýd©ÿ­@?úl©µ·;2–e[ú©3ýþÍ®noKí¶£Sޱô¯Ú Àß³×Õ¿ú–ZŽtòs:úOKîf =n‘}ƒŽoêU÷õtÅÇ¥¥®¥—>·©g}+%tK¹&ÿ}Ÿa¶ôóç¶ô?nîëçþ!PдuÉyŽ^¹"]üc-ýéÞž~ù [gŸÙÖOîJŸwÒ{ýÂm‘9¤Ìw˳óŽËRö8–ôc?jë¿ýŸ~iÁÖ¯h»/’dK/;JzË#ŽÞÔÝýŒ¤Þï”{´en?î8§Uçý äõ7ä…öRàõÔHÃúõ“zï§]=%)p,õ‚ŽÎétSÞ¿ þº¥ßr-^iWó¹ÁØåüÇ #7îïÀ‰y¯AìµN¼‡Ñãç'[vCÁ°Í¥F«%¹=¹~‘ã„ÞÈršj5l)ðö_Ï‚÷EÒ¿ü“§¿<´©ÿv¢ÿ±ì”û|¶Ì­ïËI¼n5Ü¿»Ù–ã÷´ùWKv£¡†c³ynøÛˆ»néã·^ W~UŸ›œÞ÷¾÷骫®’$-..þI·h³Ð>îÇù„–ƒÐºèëðr.§ýÎZ§”u•—¿Sé æÊùHDÖöFGÇÅ­ïG¶e-ç=n–èq‹ì›ôÞóì÷>óìWvÞyç÷øEæ½fáó–}?y?“Yz:¯yw=ÒŽ[æÕ}ÿÒöO_æo#|ÝŠ¼ßª>7|æšމ2½À\ùܯ-Oz @u|Oþ© }ú)[/yñ‚~嘠†ºØ94Å×mcccÒS˜{„Þ`®(a¾Øºð‚]lòÚXŸ’ävêqÝv2Bo`jùrû½´çF"×m'³'=ªBè ˜„ÞUñýáG=ÝâMz"°szTÆ’-‹À&ˆÿæFcÒ¨”è³ÿèéú‡$7º‡ØzãËlkK?ðuí|ýóšÔ^´t鋽hys·¾áé=_ ô¨'ymK¯y‰£swoï]Ÿñuús¥O~Ñ×÷ŽtôþÛòàë}_ðuÇ“‚†­‹ÎstÁ²$[úæW<]ÿõ@¤Ã޵õëgØ:ÜΘãK-}á3žÖÎl蟶Ø#ž®¸EúõW9Ò×=ýÉ=?Ð}?”œ®¥ÿpNC—>mÌצ¡w²`ÒÅõôõq¿¥?¹´©eI>>P×ö%/ÐG÷új¹ ë޵ôè=ëºúV_Ïüw¶·¤ƒoéÊ“:¾-}ý¶5ýÖ—½ô…–²¤Õ@{°©7ýÇ–Nj¸êm¸zÿM¾œ3ôç'XRÏת’'Éõu—×Ö;.nhÙõôÁOnèÙzÝQst½ä„@¿ó@ Ÿ{𥆤û¾-µ÷4uüš«·~ÕÖÏÿd[ÏkK·~n]{ëèçŽÈó'sLùeÚ›€¹ÒØíháW}ÿ†žèõ´Ü äHr t[³©Ÿ>r A¯§ÝÇ6ô#º»¿¹ß®Ý޲zêõz:ú[ö†Ô3 l÷|[Ç=õžÜGÝÞnêgŽÈëõäY®:f¬më¼Sµû=õ|_§>ÍÒ¾Õ­éTüy¼£åÝëKòýÓƒ–Î>>÷”´oÅÖõÕï tì!–¾ûè@o؆Jo0WœCú½—zºîŽ.ÿ¢¥sO³uÑÑ–‚žôèú¯Ÿ¬ýc7l[Ïq%µ¤»¿:Ð'´&ÉêK« ¡ØÄ²tXǓɘƒ¾ôdWZö÷GÙA8Ò¶´Üð÷‡Ü¾dIÑl:iŽE[gw\ýã#ÒIN Û[ŽÞ²Èqõ˜§^·õ‚ޝ»¿èØgZ²)ô€m½À|ñ]-êè?¿rQ¯}¤§ßý[Oˆ£s;–~ZK×\ÐÔá&õV ·ß×÷{ºæ>G¿s~K'µ$÷¾~ö+Âq)‚KVÛÒÒ†¯–,El[dޝXðuÖ –~ûÁ@gÙŽ·u„ÓÕ[ÿÚÕg–,zt[—ínOÓ´7óÅ[ ôí5Oƒ~OíE[G·,yÔ8ÔÑ ×ûºîÞ =Ùë©·ÑÓw÷õôT õ–ÜŽ¥ÝA_ýõž>w«Õ”"êÆ¡ŽN[÷ôWß‘\Iþ@úá kb>u«§[ŸJž£ècò]_ùK/:nªí¹Ú{¿¥×þä‚~ÿ‚®Þø£¾ ¼ Öù¤xàľÆ÷ÜsŽ8âíÞ½{Ì3›<òˆþøÿX?ýÓ?­3Î8c¸>\9½ººªk¯½V½^OçwžŽ>úh}þóŸ×Ç>ö1]qÅ“˜öTyãߨÁ`°e]·ÛÕ;ÞñŽ Íh$uä–“ì^›y¨ô6¯Ê=ýäYv0˲{[V]5³íá‡Ö 7Ü g=ëYj4¶FT®ëêúë¯×…^¸£CïÃ;L¿ú«¿ª÷¾÷½²m[§Ÿ~ú–í¾ïëýï¿vïÞ­_þå_–mÛ ‚@/xÁ ôÁ~pB³ž.ƒÁ@×^{í–u—_~ù„fSʸsʹÈ>ç!ôΫìÍ¢òŒäÚk¯åA~¾ïkß¾}Ú»w¯Î9çœ-ÛöîÝ«ïÿû;¾tÚ³g^÷º×iaaA’tðÁëu¯{$é®»îÒc=¦+¯¼rKïì¯|å+[Z¢ì4o~ó›µ¾¾>\Ž ¹¯ºê*IS_õ]u.¹còÌy ½ó¶6 B¿wÌ õ¢Çw>‡~¸$鳟ý¬N?ýt-//K’žxâ }ö³ŸÝ2f'ó}_Ǽ‚ Pj6›Ú³g|ß×W¿úUyæ™Ú·oß°÷·¿ýmÝ|óÍúµ_ûµ Ï|rÖ××·Uw'™±ªï<¯Ÿ»ltCï8&ßÀ"ÿ¶hîn<¨=¾óYYYÑ)§œ¢¯|å+úô§?­‹/¾X’ô©O}J:ùä“uÐA)vn,óùÏ~øú´ÓN¶zñ}_’ÔjµtçwꦛnÒoþæoêž{îÑ 7Ü Ÿø‰ŸÐ 'œ0·Ía˜mýƒˆà;âjÖBï2¨,Rù ÆãÆìˆ(ϲ,½á oØÒbAšúV c.¼ðB½ãïпøE½ð…/”ïûºãŽ;Ôn·õêW¿zGÞÒfÕ¶ñœçµÛm]sÍ5j6›ºôÒKuê©§ÊuÝqNuª\{íµºüòË3«½Í˜h=”•I ´ËüaÍÔ㬅ÞF™ð»èñó|b½ë]ïŠ]?ÛØtÐAºä’Kô¡}H7Üpƒ<ÏSºøâ‹uØa‡íøÐû²Ë.¾v]wÛõسgÎ>ûl­­­iaaAǼ|ßßÑ·tàoÌü¾êª«ôîw¿{Ûëð˜)6éÝ™ü#¬+ô¥";nߤãE×g-•Öÿf&o8*½³A ç=ïyúú׿®[o½U’ô¢½H§vÚŽˆ¥$ ƒákÏótß}÷iccC+++ºÿþûõ²—½lK¹”IVvG÷ÏZΚSÚ>EæQ‰Y­ôΣêjpBnf€yà߸Ï]~ç;ß;ÖT–NSó$®™áº®.¸à}éK_’ïûzå+_9õ•Êã¾^wÞy§n¸áI’mÛzâ‰'tꩧꬳΒmÛc›GY“ú|…Ï™çõ ¨z²3õ拘öлŽàÚ ½6¿ó~;RÕ7) &“ØÖÖÖ¶<¸2]}õÕZ__W·ÛÕÛßþömûLSØ6ÉÐ{ccCúЇ†_|àÐk_ûZµÛí‰Ì'q^¯¿û»¿Ó-·Ü¢Ÿù™ŸÑsŸû\½ímoÓÊÊŠvíÚ%˲¦ês”„Ð{$e³Ëè>;*0ŸöÐ;/s‘Óòèƒ*“Ú¥¤}8À”wÀvâ‰'ê­o}«$éÿð‡s0¯%mksbÆL‹q_³/ùËúÄ'>¡'žxB’tøá‡ëMoz“‚ Ðûßÿ~½ùÍo–$íÞ½[^x¡N>ùä±Í-q]¯¯}íkºé¦›tõÕWëð×ïûºêª«të­·êÉ'ŸœªÏPBïÊÉ0ÃÛ²ÞìÜd¡ã ½ë~ødÚ¹ªêí]¦Ì¸¶+¯¼RŽãHÚ¬ø6s0¯“LSØ6îkvýõ×ë—~é—dÛ¶þàþ@W_}µšÍ¦¤Í ¾ùÍoÖoüÆoh}}]×]wÝ0Ÿãº^7ß|³Î=÷\vØaÖ/­VK·Ýv›.¼ð©ú ¥!ô.-.¬»—wÆv®IWz#¯£EÊTÿ5°“;`3m9¢sÈ2MaÛ$BÉ^¯'˲´k×.9Ž3|pe£ÑÐîÝ»µ±±¡~¿/Û¶§êZIã»^?ü°^þò—¯M¯×Ó‡?üaqÄ:å”Säû~ís¨Â¤BïÁ` F£¡÷¼ç=Ã/¡Ìkó%´}¶bÔ‘EŽãMOôÂN:ô.#ܦ$©EIÑ›V&̉Iö§6Ö××Õétb·ñ Ké5¯yþâ/þB®ëêâ‹/ÞÞ^rÉ%úð‡?¬F£¡‹.ºhª®•4¾ëu衇ê–[nQz衇tóÍ7kyyY—_~ù0Ÿ“ø›Ü³gOæ¿سgÏÔ}¶F0J¾™Ö%mûÔš¥Ð»LÈ׿DÚÚÛ;nLÒ/iú‰ &fÏž=ú­ßú­Ì1;Ùž={ôÛ¿ýÛ’¤~¿¿-À=ñÄõ¶·½-qûNqÉ%—è£ý¨>ò‘h×®]:çœstÖYgi0ÌSX[‹+¯¼R¶ãù¾û/5¦”¯ôÜ2,º¾hëæ¬|êM[èUÅwÿºŽoŽAU8SjÒ•Þ¯ýë‡=¾“xž7UaÛ¸¯™ëºÃöe¶OÚ¸®×®]»tÅW [¼¸®«^¯Wûy«6‰¿É¸‡ÇΠ*rÈ"±¬óøc5m¡wœ¼uÖÃ+ó‡0€fY›ÿ×’¡÷4†m–e ¯MÜ6iºÚ­LÚ´\/Ïó¦òó5-×kV¤]¯’òfšYÕÞyoÒÔßÌY½«§<<&íŸ LýM`§ZYYÑ÷¾÷=yä‘U‡J3Ëôƒ^YY‰ÝÎ5ÛŠëU ׫˜¬ë•´[ÆOt\Ö±æÞ¼†ÞÑ;úíg“·’<î5˜'t’¾ñoèöÛo§²t?˲´²²¢“N:)v;×l+®W1\¯b²®WŒ2™d´ŸwÇœ)u†Þ£ôÍÎ{ì2=ºÓöÉÓüŠo¦T³ÙÔ)§œ2éiÌ®Y1\¯b¸^#)óÐÊè6%lK;gÙ}‹ªíØé0>yÊóÓ¾©HÛß×ö}£ë`’ârK³.mŸ¤å¹k‹2îÐ;«œ>ÏúªÎmq’vÞèØ™ºÉfR4ÌÓ®$ilÝykÚú±æ©ÓXé]ÕEÉSñt®F4÷µZû‘}-ŇÞáÊr³¾³Úœ(a}Z”¸õEªë‹ @ÕÊ´eªŽ³ð¤`;n\Ra­´½'w´2;n9iŸ¤jm%¬K›oÚ{3îIc&jšBï¢âðQö7avZoïpÐýàšv%áuvè· ÍÍX/´O\…wøuÜ{-ÚÞ¤l…wBoT­Šµhè]$ØÍ ý„å¤`;­êÛ¬“¶ç•áyù1ëF15!vQ³zÇɪߨðº¸\:b›Mt9.ü6û…—M…wx>iíLÒ*»ãÖUYíç8À¤ä cë¨òNÚ–´.\Kɽ·“Âî¬å¸ ;:ß¼•ßscR¡wÑ*í¤;ëxy÷‹~먓þY‚zÇßáÀÛ´@ ‡ÚчY¦áQYcÆUí L“2¡w‘6iA·_™ »ãª¾ÃÛwžè˜Ê~I&¦#ô.pٷ̱£Aw\ðhõw8 öòŽ«ê6?Ñ~ÞчVFç‘·ww‘ ï"}»‹^Ksԥʀ5-ðÎ[ñ·.)ŒŽ«öŽVl'õóŽ ÃÃû)áqóI{i²ö%Ì®=Ÿ¶ö&Uäq¿•°-zÎðöp·y­ðŽn“>_¸ª;üÚüNko]}Ugø LJÙ°;mlV ¤p9:6®j;ZéxÇUˆG·™{R@ݯ¨‰Tt'™¶Ð;MRP]Õ1ãÚš$ãÑP\ÚÞÎÄü¶µùÐJ;tœ¤&Ñ \1c²Öå]NZ̃¬VYËy*½Ã¯ý˜1qUÞflR×ß;i~áåh7Š*䩈Ÿ:“ ½ó×Yãâ¶gU{+fÙ¼?°2©ÒÛìc~ÂíLLØKôÇŒ5ó–âCí¤õ£ßy¶U¹GÕm9ÊÞá×Iã㪻ÍrÒORøWáVé­Èë¸Êóî=U]å=Ñp;É8Cï"ÕڣK[«½Ã7'Úâ$,:>PG+»ÍØ@ÉawVþ}­”õ£ŽËB€º• UÓ‚ìQÇ©ðN[ ±£ÞIë²*È¥­UÞU…Ö£Üc ȧ¡Ò»L>JµwÒúpv¢íMÌ:+ôÛ -G{w— ¹ËTxÇ-g­/;·*«½³–£¯G Á£¡tR•·”] SZEzÜú¸÷÷:¯‰WOC褎Êð¸<:.©¿wøÒÖÛŒ·b~¼˜1Jø·.:Bo`r¡wt]žà9ZÝŸ·ŒNÚ/O¥v\€=ÎÀ;k[¡wmUV{'íW±­˜uiauÖ1ÒΛô~¢ÇH3ÎÖ&â—QÓQCï躬P7TG·E‘Ôƒ;)<®O;FÙ¶&Iû&ÍZŸµ­r“ /']í~|§õãN«O ¸ÓŽ›wnJY.²®Ì`mYRd]™P9OŸí¤ªî´mIÞEæ}]d[ÔTTyK³zG× Áó´‘’+¼³¶e…àYëÒ^çYÎZ_t 0 ʆÞqëóÂyç"áÑþày· ¿Ó¶©òNÛ¶cBï´sO:ø6¯Óì¸c¤UpWUÑ]¦ÅIžm£Œ&©H¨:J»“¢ÁqÚ¾E+ÂÃÛó+Ï<²æ5·$9“8é~eÚ"¡wÚ¶²ÕÔAÆøè´HK–8icŠ|`¼0Ϫ¾‹TyG—ËT€û1ë’öëå'ðNSU =‘`;Í4Vz—Ù6JµwÖë¬meª¸Goë’z`ÖŒz—YW4/S ^´Z<ïë"ã’Öº­6“8«ªöŽ®¯£ú»ÈºQ›w9i]Úú¢cªØE™ð´ÊÞÞqëFmq~]4gà]f}Ö¶ZM:ÀGµwÖružýŠ;ÏrÒº´õedz&oèZGð]6àÎóºÊÀ;klÒºQ·ÕjBÏy¾ËŒ%ðÎÚVd 0ËFím]$ø.[MMà]±I>ÈÒ¨2ôŽ®¯"øN:W•áwty”a6°©îjïQBå*Âî¼Ç):·™6 ¡·4ÁwÚ¶:ï¸å(ÚšùT|²®à;Ϻ"•ÝUÝ„âØéŠ„³uT~WÕ¥Ê1iëgÒ4†ÞR}Áwt[Õ½µË¶)©»w77°©ªà;i{Ù‡EÖ¹®Î*î© Ì§5ô–&[ñ´¾îuUTuWp˜`ÚT´æ=^‘ðxRawÚú¢ãf.ð–f;ôÎ3fÔL&­¯¢=IÜú¤ 7°Õ4ߣöû.zì2}Äó#ïö©5í¡æ4ßãX_vŸ,Ó~߀ªŒÞVùÐÇq¯¯;ðžÚP|š+½*z[ •§1ä®c °“UîN[>JàÇÔÞÒì£U=Ô±Šªï´meÃì*ZYf|]Çê4‰w”*é*Ãñ¸mU„Ý3ßöd–‚ÍqT@©ú®k[žíEÇ5KŸ ìlu…°ã‰«Ü6jà=Ó-MÂf-ÜWë*Ãï*¶çSçþÀ¬5´­"®:$W¥ÙèéVutÕáwÛóŽ©b” v'„WÕ†dfÂì¼f5(­:8.TO¢MI÷lV?@ám‘c×ݥʞÛsUámÌZ¥·1îŠï´qUðeCgÂj eCÞ*+«ËTv5sav^³–Nª’z”þÞEÇ•_Ô¬€ºƒÜ¢Ç¯"¯º{îÛžÌCÐYWkªÆN¢uÉ<ÜW`ª w« žë°ë;uæ%­3XžDø=Ê>eÌËçW`[õC/ë ¥wLà-ÍnOï8uöÍ®:(%d& Æk” ¸ÊO–?-Ç›y PÇÑN¤Îà|œ÷dï? 7À­³OvÝÖåSi^CÏqõÑWh>¯÷ ˜5ãªÌ®³º¼ªóL¥ySÇ,OªeÉ<ßC`Æ8W¹o™ýç.ð–æ?0DEuU×´®{3ï÷ˆª+Ü­ê¸U‡À{¿€Žãá•ug\ǰiÃò¹ »œN2ü®ëx³rn`’&öV}nÂî;1ÆþÙ;ñ>óh«ÃwLà-¶Nòá•ÓxéÆ û¡–sƒ0õ€izˆeU¦m>À´˜¶Px³œK„¢ñæ©7€é1 ý½çal>u_'î0ê¡ ¹3Ø“žU¡Âx4Ópý¦aÀ<™†jêi˜ÃL¢Ò07¨®×@*¹kB¥7`nP‰<ݸ?Àt¢R{JQé yüÿƒþÒ|c®zIEND®B`‚Minder-1.5.1/data/screenshots/screenshot-map-properties.png000066400000000000000000005161521356632107200240540ustar00rootroot00000000000000‰PNG  IHDR½± 4sBIT|dˆ IDATxœìÝwœ\g}ïñÏ9gÚö]õU³%Û*¶,7É…âÆ6¡\S0ÜŠi—HB „’„ä½¹”$„„–B3Å@lcpƒ r‘,Ù’mÉ’­¾½L?ç<÷Ù]ÍŽfv§œÙ]}ßzé¥SžyæÌhfç;¿ù©#k¶' SÒý#""""""""Ò˜ÌlO@гg{"""""""""""AQ%qý鋈ˆˆˆˆˆˆˆH>U‰×‘ÙúÒñ‘b|׉BÙÚ5Â1l„9ˆˆˆˆˆˆˆˆˆÌF7Âæ,…¥µi„ã×s™O!tn„9ÌI LË3ÇI÷…ˆˆˆˆˆˆˆˆÈÜ6AµÂðiس=x‹ˆˆˆˆˆˆˆˆÌÊù€î„â‚>.:Î"""""""""ÁWj«ò»€ÂØ‚:vLm>"""""""""³­Ñ‚â æÓh·kVœêh­·¦Žß©~?‰ˆˆˆˆˆˆˆˆ4Š™ –k½žS6?UÃÔZnw½ŽÙ©z_ˆˆˆˆˆˆˆˆˆÌõ šk÷” ¿Oµ µÚÛäqšÍc~ªÝß"""""""""ãf3ü òº«ë” ¿O•´šÛÙè=¾O•ûNDDDDDDDDd¶4båv­ãÌûðûTN+½Aæ"""""""""a>×µŽ1¯ƒïù~ÎtØ=[ûÏçûPDDDDDDDDd6ÌV ‘™Þ^†ßó50©À{¦Nˆ9_ï'‘¹¦’ x6N@yÊßó1L‰0¹ž=Âgò>™÷¿ˆˆˆˆˆˆˆˆÌl˜[îuÍdî™ çÎ| =ëv9þLUˆ‹ˆˆˆˆˆˆˆˆHíêY±]ïpú” ¿çK€ZÏÀ;¨±ë´×b¾<DDDDDDDDDf*¸ :€®g8}Jßó!ì¬Wà=[aw÷É|¸_EDDDDDDDDfB!o!t½êS&øžëáh=úd×:f½zw×û¾šë‘z‡µõª°.µ]=z…׳ÿxC˜ËAg9s:ì®%è®ç‰,çòý(""""""""ÒHêÙ7»œíj Àƒ¿çdð=WÃÒF ¼ƒšG½OÂY‰¹ú˜‘SW#Ux&ÛFÁwæbÀ9“UÕÕݵ®¯t»Z÷‘Ù­ð®f}­cV²Ýœ ¾çZH:S•ÕA‡ÝAáµÞWsí¾ Z­ámq-'±¬Wø=¯‚﹄ÎVà]m˜]:mgsL‘z¨Gd‹jCîJÖ)øÎ3WÂÍ™¼+©î®æ„–3‚W³}½Æ©§ BØJǘ黒åµT‘¹Í¬š ÁælÞA…Ýõ ÁËÙf.Ü·"""""""""³©ÞÒõ¹‹-?åƒïFFëx—[Ý]>áxû‰ˆˆˆˆˆˆˆˆÌ5Õ´fOµ¼’ªïy|7zøYÏ@ÖRÝ]¯m+£ÚíÊÕè9uº–;^s­cÔZõ]ïrΪF5k ¼kmg2ËÊK9ë*Ù¦ü‘SÓlÞAœX²–*íj—ÕÒîdNßhÎTà]KµuxÐmOjÙVDDDDDDDDd>«$¨ ¢I½ìræqJ߆Ö+ð*´b› Ú L·®–mEDDDDDDDD棙¼ —l]õ=¯‚ïF Bg"ô*ð®4ì¶«¼Þé–—»>¨}DDDDDDDDDY5!lµÁn¹´_á>•^.g™BïYdŸîR˃¨Üžî²=ź {€—».È}DDDDDDDDDYСwÐ=ºó/ûS¬«ærµûLµ|ºu嬟1xÖèÖ#¼.çr± òz´D)gùtë‚ÜGDDDDDDDD¤5Rà]É6…Ùµ†ßAUŠ—»^¡wAޅ˃ ¼ Û”Lv×2‡R˦Z^Ë:‘ù¨Ú°6ÈÀ»ÜP»pùTmQj¹\V' |7RtˆTà]øs9ëʯœËµ.+¦‘îw‘z*7ˆ­¶UI±e•„Íùaw©í¦[Ô\¦[^˺Ó(ág£Þ…awþºRý»Ë Ë˹<ÕØSmWË6"""""""""óA9Al¹AnÐÞ¥~ö‹,+Ü_Áw ~Ö³wµÝã—‹Un[Lb—Óúdª½œ¹•Z6Õòj·™«j©ò.µ¼Ò°¹Øöå¶01L=F5åål[jY¹ëg5øn„à3È*ïzÞv‘eŶ® J%×YjŽ¥–Mµ¼ÒmDDDDDDDDDæ²Zª¼+mmRnŸîR•ßÓµ9)ŒÏfð­Ð{ A¨1ˆÀ{ªÐº0”.§Ÿ÷T­O çTªB¼ÔåR˦Z^ív"""""""""sM½«¼‹]ö‹¬Ÿ®…IþòbÛ®›.4Ÿêçé.|ÏjèšÍ+§ºÐµÖ ¶ÒÀ»°º»0à^ œtpâxNwBËJúj—WºM¹”‹ˆˆˆˆˆˆˆÈL 2D ºú»ØòrZš.w!`?p|l¹•·M~¶èçýœ¿Þä-/ös5ªÙ¿Öë¬Él˜3]å]Kà]¬Òû¬‹º/~þïœvÝ;£vt žbÞ""""""""""¥dS~jÿ½‡õ•»Ÿ½û.à)¦®ô.¬¯¤â{^W{Ïf¥wPUÞ³x/Ù²tËe/?ýe3èÆŽeáŸôí‘éÙØáf»ù¬+V\ùñÑôhjÛ±mCä*¾ar¥÷øe›ê+¾ +±§« ŸSÕÞ…}¤APÕç•´ý(x[Eþæ/?ýêÓ¯yûqïxlÔUà-"""""""""UóñõGéñzbWŸö’›€Ó)žKæ•ãJw°”™ÌagT#†Þ¥TZå=ÝvÓÞùë H6Ðé’Y›5Ù²&/"""""""""2¬É’µ2kÉCp<‹,–SByÁw-j©õ m¶BïZNÊXÎ~å´5)µ~ªÀ;}(c²13»'"‘yÄ`È·‰çœ.§,,ê­¤xxª\µAç½5™ÍžÞ•¨ä“…Jûxç/+ÖÇ»ä_…Þ"""""""""¤±VÊãyåtd~ï¾ÜÕô÷fŠå³Ö§»³Qé]ï*ïJ¶ŸîÓR=½mªŸ¯ˆˆˆˆˆˆˆˆˆÈtŠå‘Ū¼ó·¯´¥I©ë­FÃT{Ï…žÞSUyWÚÖdº`N“bUßãË {刈ˆˆˆˆˆˆˆˆ©0‡¬4Ç,7-ü¹Ôö¥¶m8s1¸­¥­Iþ²©šºç?`JUz‹ˆˆˆˆˆˆˆˆˆÔS©Jïbwá¿…Ý-(ØfªŸKm?'4JOï™8 ÓU‡—ú¤¤TkË`ÔÓ[DDDDDDDDD5–9æç’~Þ¿¹MN\¶&ízrßíbý½kUIð7Ó¡w­!v%'©ÌÿyªjïÂí¦je’ÿ@Ë-›õ»PDDDDDDDDDæ•\:9žAŽÛùA÷t·•·¬päjNpYk˜=£aø©Ö¦£°Š;YávÅZžk/"""""""""´Â,²X+“éÚ—îsJh„лšÖ&ÕTyO׌½XÃ÷–&6“Ão‘z(ì:Q´3ÅóÍü)±¼Ò®ÅæWÉò3“íM‚lmR˶åœÀ²Øº"*õô‘`x¾7åzß2ø6øŽ…±Çâ ÏàøÛÛL8¶ÔTV¸#BûŠNš4ކ1¾!È?6ÂÈ¡aLÖŸ~™1!«¹®ã»&Q×ñëk¢§w~;ÃÉ-LÆÃÉÂ6(ùÿNÕZ¤’¶#s¦ÅI£œÈ²PPŸ ”[íÿsað=¹‡÷äOVæ oÇâ•‹j£ç`/NÿüL 2’d¬öX±Ž@Æ*‡m»?ÔpÕx¶‹ã7êÓ‘ˆˆˆˆˆḚ̀JD žmÈFlLÔÁŽF°­Éï½ï‘I§!ãÍäðSÓbéæe,[·’H,Œe[X–f¬dÑ÷êæð®ƒ =Õ¯s´‘vÒtŸÓ;nŽì:BÄÖí: ó Wtrýû^YtÛÞýüèsÿ]·¹4¨ü–&^ÞÏùá6œxÃÉs±0¼T¿ïbó"4Ÿ1³2•WtO7V±Þ7Sõï.õµyaÅéËùÔ¿|ª¦1>üÎs´ÿX@3j\‰tœÿ¸çë´¶·–ÜfûöœwÞæ)Çá-W½mÆBïp8EGG‚ÞÞ.éák0Œvôi#ê6ÍötDDDDDD†ÁŽYÐ#‰Œ„'GãÆ¶qšB˜&C&TšhÊ” Ñç›è‚§¿àLº–ua;‘E$š—±š—Hz”…é£,XæÐ¾¸ ösì·‡0^ýr:¯)÷7¡$ØÉ`ÆÊ矬—%Ê…Ú«Ï[Å'>÷ Âá0Æ\×åïÿÇ>@ÚMvÂØVýº%‡Â6n]_tÝþ]§dfP˜KúÏ+ +¼aú€»ðz‚À«Ù®.f;ô®TUÞ¥Ú›”ZV,Ÿw•Þ–eÇñ¼©¿JUŠã8X?é5/o%ÔZúÓD7‘%q0˜ŠëJXØ,^º”Ý»w]¿aÃvìxŒK/½lÊqššZ°f¢­¾ehiåŒõm$G|z{ë••j]¢e­Ïàž¢£­§Ì/f""""""¥ø–!³ µµb[ö‰°Â²hok&bYL¥I`L.GcøÑ0);N,écMÓò¤)’,]¿'ZÙ·½½´Ç±=Lj\xj ³öò³è\ÚI*ÜÁñ¥çѽt1k£Û"áZô$áððFìã{9=õ§o^ƒïúßv8°yœ¤Éáßoý"¶]Ûû~ß÷yËKß É`Ë÷³^–®õ\pùÜý{Èf ‡Ã8ŽC< ©©‰p8LÊMî ó’ß½šG~õý»;á@ç3ÎŒ)•“6\1ñLÏ!óÛ”.+ü—2—YíÝpf*ôªwµcNµÏtÁwþºü¯X¹&:s澞†Á3ÅË4{›ñ£Üñˆ¶4ñ™ÿüÛ¼¯ÕLö‘›>AüÐЬüwKŒ$8çœsJ®ß²e Ž3õ‹ÿÈàPßÇe{,\8ÂY›VÒ}ú¥ìúõ- ÷˜ŸÏ•ç]ÇÿfߎãÄú:qÌüo•#"""""’oüý‘ÒMá¶Ö‰b©p$Ìúµ«X¹| ‘ÈäÀ1“ÉrððqžÜ÷éL‡p[+IF‰%¼‰Â¢ Þ&M’WýÁõ\yÍ•47WÖ9‘Hp×mwñÃÏÿˆ&+˜à»ûü•t,é$é`à´çqÑÒ(Ží“ra8k‘ôsdz¥É&ѽŽÇG9'þ(«7ŸFüè£u*¦³-‹L&Suqá8Çq°-CmãäËzYŸ³ˆ÷~⽬ZµŠ5ëÖ°ÿé<ïªËð<ßÏìžçñ?ßÿ?ùͦ߰fÝ.{Áe¼ðšò…O|ž]½ß…Iߘ‰ë/äû~ÅáFË@*16óü®…ý¹ósËRáv¾jBëzTuÏHx>*½« ̧êå=ݲÂ3 Ž/ϼç]¥÷xà]ê‰e:¶mW˜ÓÜ݆eÛXc/…"‘!ǡ㬅eé%²¼˜µÇÚyÓ%¿Ï>yã”/^{÷î-¹Îq¾ùÿE{¬½æù”rÒ,_‘`ÝygÓ¹à4ÀÅ2Á½HÉ`0–˹§ŸGWû¶?º÷¹6¢^l¶§&"""""2ãÒQ·ž¼—,êdËy ‡s1ŽI$HìÙ@ôôÓ‰tu±öô¬Z±”ß>ú=}ƒXØDZ[Èx#DÓÁÍ­{ý2®xÉÄb±Š3„X,Æ•×^Éw<ÈàžÁšç[ÔÄÒuK±l‡Þ%pÖÂ&’$Ó†Q×&•µÈøõ íA:km9g³¬ò÷±tcwÝBoÈ…´•£»wìc뺕´Ä"% «ž“ñéZ×É{>þ–/_N*•âÒç_Ê–K¶°oß>~øÃ244@gg'gŸ}67üÞ 8ŽC*•bùòå¼çãïá³ñ9†Ÿ®K«“RùÒ\°k0žGŽ÷ó. »óOrésrà]¬¢»TµwÃ×µ˜ÍлÒÿµ•´6)w»bÁ÷øÏÅú{_®äzçŒÚ+½ƒkmâÓÿñ7S^ß_þËG+ó#7}‚ÑCÃ5ÿ—l‹µq0uë®»×u«# ñå|……±…xu¢››F9ý 36^D4Á$wcÅÎ$3tw÷“N9ŒÆÃdÝÆŸùŠjÏòÈ„RМÆ4y4ÅlÒþ(ÇÓ;éj_É¥—\ÀÃ-ÛIîÍÒ”j›ñù‰ˆÈÜ`u½€÷ÿà÷Xÿпó'ükFô×n«óBÞòµ7³þ‘¯ñ×õpÅó´W^ß|óÕ¬¸û_øàÇ¡ºß>fÖ©x›ED‚âÙ`·4a¬rÉ¢N.½h–e‘ص‹ÞmÛH§ÓÄ"ÂŽÃðÎØ¡í›7ÓtÎ9\¶e÷oÛÉñ¾A,ËÁjiÆËÄqjskm¢©© c ?þñI§O$êÑh”W¼â'­‹Åb¼üå/§©©‰XK0N+ …j^F낌ºÏtm’.$²ñÀ÷Áó îØëѡ虬J kåB²C'Û¡šÐûæG÷ó‹'òî«6±¬«5ðÐ;ëe9ÿç³råJR©¾ïsàÀvìØAww7çž{îD"‘àèÑ£ìØ±ƒÍ›7³|ùr|ßgåÊ•l¾l3wí¹k¢x¦Ï˜>oåºß»ŽW¿ûU'-ÇóÞYéPùy¤ÇäÂÜüËÅN^YKµwP-NfíΚ •ÞÅTÚûØ6…!v±q ÷÷•Þµ„ÞAß–e124B©–שTª¢ñÇÁøÁÌo<¤.õâõ¹/üë¤ËïïÛOÚfâ«BÞ–åÓÙ5ÈYgµ°|Í8f“< €ñâ¬9û|V{²™8ñá~ŽìçØÑ#ñ60õï/îã“l&´,E÷ªNt® 9ÒB؉òFÈøz3ûhr:Ùzþyìl}œÞ=}4uaÏÀüDDN]aº¯{-7¾e+k—†H÷å™_ÿ‚›¿ðG²³=·©„ Y€®ê,öê xÉó]úöcôú@xçÜx=/{幜¶8DòÙ'øå¾ÉO¤–.š&“fhÿqz¥©îב`šÝ_@ÃxãÍàŠEúÕWùó?{€¸°håûøÔŸžCÄôqç{?Ê·žœ'·YDdd£6‘p®Ê7 ³åüX–Åð½÷rt×.¶·³´³óD:ö^<»gÏ#²y3[ÎßÈ/~õ[Ò—P8L&æàÔz¼ç²ïû¸®Ëk_ûÚ‰u?øÁ&Þï–ZgÛv`Ïí- [±l‹Tób¢À`2žEÆ5$} ,ðö øX`ré›maÐi§-œ¥ua;Cõ;ùU¥YIÆ3´¯;‹¿½};o½d-ž¹2ÐùÄB1~ûým¬Y·†Kž û÷ïç©§žâ /¤©irË™ææfÖ®]Kww7»wïÆ¶mN;í4~óËßðж ÅêR}]ò˜-_¼øLB!‡#GŠŸk­ÜóŸ÷Ðl5sÝ»®­u¨b•ÞùëJ]Î?¹%ÔVíÝøŸ21¡w-ý¼§Û·š*ï©ÂðñŸ ÿ濲ÇþZ¦ÊÖ –.à­{+_ýë¯Òw´€®%]¼ícoåkŸú:½‡gçLƒATzùd7©º’ºP4%Ø–ÿ!A±mêÑÝq2,[6ĺ KèZ´+scò>­NîÃ1àX6‘pˆ–%KY´dË`Ïî^Žõ,¨kÕ·gy$÷²òœVN[z6ž•Áõã¤ÌI×0ì‚?Ö£lÄë%d ³áŒµ<×vˆý»Ž=¶€°©ÛüDDNeöš«yëŸ_Áª‘ƒìúy/öŠ•œ¶º•¬×è_"›ïSy‡Çg¼æ®¿êqžýÞz|‹æ­¯à÷ß±•Ðþ§yü.‹/ÜÌËþŽßøOÜ×WÑHìá¿ÿð󄈓¨âÕß7fü=^À¿=TÊ!DîýfôüóXß|?Å«•M/8“0ƒMÈ2˜ys›EDf–¯‚6¬?sáCbÇvŽîÚɲ hjo'tá…X‹ç¶êíÅݶp: ÏìÃïì ¼z5ëÎXÅcOìÀŠF𓉉ÞÞµ¼}ßDz,\×å¶Ûn#“ɉD&BïP(Ä÷¿ÿ}¢Ñ(×^{-–eM¬3&˜g÷PÄÁ EIºàƒk,²>àŸHéÌXØmÆ~¶ŒEŠ&Ú±GCu{¥©¦ÒÛõ¡sÁ"Ìùðùvòê¹"ýÀÒ ’ƒIö?¹Ÿ /¾½{÷röÙgçrcNª,7Æ‹Åظq#O?ý4+V¬`ÿžý$SXN§‚Ûe(žµxžG&“Å3YšÂQ.}Þ«ytûÏÙóÔ¯+¦$L‚ï|+Þx9Mm'>L¨d>cÛŽç’&»;±åtÕÞÓU€3ÝvS…]³¹Ré]* žjY9ÛT†VÝýÖ¾•õ¬ã?ûA>ýžÏ`;6ú§±¨{!oþóßç3ïû?A\MÅ©½Éʶ'yêWÿأ߲`yÓŽ˜Ö€F,ÿx•½ƒcáÓÙ>ÌÚÓšXеÒÇÁ~=«àwÛrX¼x ¡…Ù1ÀñžEu{ÆI,ìã´Í­,]°ˆ¡Ìቀ»—$®w„¥ 0²f”žÄ¡¡…=íDD$8öi«éùùÞ·ùú¿Á"l§ð,ZÏ}1¯{ߋټ®g´—}ßûwþñGËx÷Þ€õÿÀýgÜÀk®¶¸ëÇ]ÍWñ†\Íæ3Û1½ÏðÛ/ƒïÜz˜ Í›^\t]¶ëüÁÞ@Ó~À3k¯ä²s;áèn~öw_á¿cšVqޑ߹|5íN’þ½OpÇg¾Æ==Â˹âSÉ‹/[„¿Íç\ÅëÞÿÎ_ߎ5pǾÿ¾ó½t½î½¼ýú8áòÁ{^ˆûÐ7ùðÊ×>ðÃÛ÷3è…8ûO?ÂÛ^¶‚Ó–ÙÜ×wâuË›oø›ßäé³_ÊUçwà>·Ÿüîõ\{ÉB8ú8·}ò+ܾ3 ]—ðŽ¼‰õ}ýñ¯‰wNs{ ±ôÚ7pÓ{¶²<ÒÏã·ì/ø%túc9ù~ù[~º/˜ê>0dž9Fbõ:ÎÛá¡û2XmçpþÇž<Îâ³ÆúΫÛ,"2sÜ…ïå «–/àøC±¨£ƒ¦övÂ×\“[9ö¾ÒZ´ˆðµ×’ýÙÏ0©îÎDV¯fõÊeìܽcÀ‰DpCIœŸ1ç÷ò}ŸW½*×Êa¼xíå/9ks’¿m|oìø†¬±ð<ðÆrÂñ€{<ðÆ÷*Øx€Áwë—»Mzüæû9–8ù+uC&LOÊÐk¢¬:ÿ|¾¹ãq†šº8ã85¾cOÛi–m\Ší8\|åÅ;vŒeË–‡'æ¹÷ɽšÚšHŽ$'ß5ȯú¿LÁÏA´7™n¿9Qù=[¡w½¾¥X¬µI¥½¼ ÷+<¡eaïŠ}ç“ßá}îÝ,Yµ„?üÜ …C,ê^Hï³½|ç“ß­vØšÔz"Ë Û›,\ÒÂ¥×ÞØxÏíúX ã5Rèm°ZÊÓ»‡É¦Ÿ¦{Åbl,ðó‚o+ïakÆ?ãÎb¼4m-œ¾z˜ÁÁ8élK sH…ãtœfÑÙÞÂPº‡üçÉÉg?q\BVÏØì~f?©}1ºF:ð<[µˆˆœà?ý,Ó°æÆßåúø÷øñvÓ7öbu^Äþî¶D{xâ'0Ô±˜Pï0.«Ykßþ>Î"Éñ'Ÿ`ÀœÏÿö¶øOq÷ç~…}勸üÏÞA|ÿ'ùá‘Í¥× ²B¬}Íï`ýðn~þؼðM›xůâÑ·ü”á«_Íë^z:?ÿ·>céæ0ÙþñßY,B[žÇ¥÷nã‘»<.|ɹcûý„ÃíòÆ¿[#GÙy˃d7œÇ–w½›¶Ñ¿ã;Ï¡gtáýüæ_·sìèRn/{À7.¾ÓÍ¢3bØÏáC…¿åæ»îM¯Âþî=Üyä|^üŠ­Üø¹M<{ëÝÜýƒõ\qÃf^ù®Kyðýw1pR–©nïO8¼äù¼ñOžÏiôðÄ­ûàâ Y†ñ·ÅVçÓË‚ûe(Èß;,ìÃûx²ùR6ëÃyð&Bï“[ÏÌåÛ,"2ƒ{¬Ò¶³£•PÈ!{äžëÒÚÔDèâ‹Á²øÅ/èÝ»—X$µ€— IDAT‚õëi¹ì2¬Í›Iýú×Dji¡³½•¡QlËÂwljê×5&??ˆD"Üzë­D£Q2™É…Wã—Ç·¯2üÎÆ3c§ɘU“ª¹óîñ¶&ëÜ,þžïãÆëÓϦΠdY~Ù•'…KK¡„OÒgĶY¾aIe÷í?㌃ˆU™Û,?g9þôŸ‡ñ<'žx‚®®.|ßÇqžÞó47ÿÝ÷ %Âû3žæ4Z._Ç‹–¯`©C‹ÖUdo¿‹|«‡ׇ®±ýŽlãæÝÌ“þÜïáʱýú·\Êy]†c_ÿ_ÿ·ý˜Å½t|畬»ö\²°ƒCñ+93v„Gô vg³¤1ã‚cí›ßÌu|~ù,þºí?÷?ý§;ØaÍK_φ¡íÜú™ÛÙÅ!–\û6.Z²Œ6 ”<îÅoïÀù›936~Ì`N³øk/añØ~±-ÓËÉ÷K2¯©¶ÓÒN[‹SÆïE/>Âpüäœ-±{[‚-—œÇªÐ:/ß@xÏ]<Ñ¿‰L3êlÜf‘¹Ä²OÔKp'² ðÔw1~0=½ïæU7#ÿxÝûëع«ø þù_¾À¦s6ð‚ç_2±ïØ(Í k2 %£dö-"‘ìeÍÚ&ÚZ;0ÞØ¿·‡¡Á&"Ñ,н¼h¬“!î %–_…«É¥)ÒD¤9ÔÁh2IÏÁ>²C6N:ŒÛ™`Ã¦åø¾E,ÔÆàà(={Ó´]ŠåÙd©ß'ï""0³w}‡Ïo{€so¸Ž—½i3¯ú«WñÜëÿ“c Û Y>}0èNì1þK‘÷Ô.9Úà±X´°å°ü­àÓoßÒg°£Ö’ëZ'Æòç°› e O°m|âwý˜›7¶ð²ÿq ¯þôÅ\³ëgüÛŸ~ŸÇÇ÷;|˜ç2#Ä­^FG ,¶q€–…m„,ŸÁ#Ï1ìbú2‚5 ºh³ž{'àãš$©‰—¿«nxï}Ë*Foû6ÿþO/ñÚèÏÍ7™%íåzªËÆIÚ£¤Ò»àkÈ“)~{¡¹£Ûòé{îƒþ9Ê€ÏDÜRƱ6B×r‡Öž=Œ,Ý4©•I±¶&V&Å©'ñ<Á§úIgSÌ¥˜©Ú›ÏMšKÄZÃiÛ‚Xö?ó Þ/ÃÙý#5ÏÕó¼‰9Åb±IÙ†Á5il+÷8ôŒ‹?v}ãûD£Ñ‰ŸOŒUËœJ;>÷oyñ ƒ3öMòÂñêû‹Á+Þú ~ü•°dånüùÿ¶ûyðŽÙ~×vâ~„ïòã¯ÜRá|NÚvªbÞbÿ©Ê©ü.jWÛ÷»aBòF ½K™.¤.\WiØ]ø)Iþr»`›IÛç]¦]KºøÐþ˜%«–ptßQlÛfÉéKø£ü#>ýÞÏ0p¼T=Pýä>õ,?ôöÏ?ßó7¤ü~lËÆ{ÛŽÐnNd>>&ØÐ{ì‰:¨ëÜ}âx]vé‡8t¨ø'®+VtsÙ¥[&=qWûø™Ž‹ÇhÖ⹃KIÆûX½ú‹—.Åv-28ÔÓ‰…Mä¨K__?g¬IÓÖÑ®‡c;` &ÀºxƒÁ²m<ß±Û8Ö3ÈàÓ†æþ%D½>>éæ8ÆØDìvž{®‡ô­ƒÝx¾‡QK‘º w¶¦h7÷}¥ðúóºKV±zÅá$¾±éìîÄ2#¹SÀÛÖ‰×0?Kzìu1ÑÇ3G¿ý_üèñ³½Ï?§Ôºƒx&÷Í7¼,YSð»?ó,¿ùì?³ógpÉû^Ë+^ü^yݯxüÖ±mÜLn何7†Dß(®±éXÖ f:;éŒÙ?ˆ;ö{eå½±ì¼÷¿ï,’·~›ýûû8u'ÆtbQ¬tz¬WhÞ|'ÞTû¸ã¿#äÍ?ÿõ~Òë‰Û›NዎeXf¶Ófï?ÕqÎ;–÷Kþ=mè»ý¾þD©·×“·M>Ûo&ÏmÜÈûx&ó:.xç5´·çÞß½¤o³ˆÈÜbåD:‘Jc€èªU¤öíÃø>þè(Vk+«WcFrχöòå˜p¯·—¬çå‚Ý… 1@"™>ñ|ëùH6›%‰°uëÖ¢Ûo‡¹øâ‹'Æb.‰L’þÇh[ÔʲøÓd‡Y¸3ÖÓ»°êÛÊÆY?úMÞñÁa†žîÁ¯Ó ‡e¦½—4ÙzôîñÙáû¹†½+7¿\ƒcûÞû$Þ}¿à¼Ãd¼xM[xYt:MSSžçÑÔ”ë3=þ!Æ–«.bç};qNnûf­WmÁ÷ý‰jð––"‘ŽãN§1^mYK±]dzÛ1D;=,²`[¸n–¡ÞÑ– ,ÉmlÁþgvñн?%íÆOšK½/xåM¯Ä÷|¸ãA>ô¢sq'~Öpÿí"=iÛ¸WÙ· ò>»*UÝ],ìž®·÷t?OZÏ©¾Þs!ô®U-UÞãËjni’樂%«–Ðól/_úÀ¿bÙ6ïþ»X²j 7}üm|ú=Ÿ âj*VQèíûĽãüÁïÞ„mY¸žÇŸ=ýÉ '¾›û„‰Jïàä/˲¸úÅ—óÃÝÊÐÐð¤í::Ú¹úÅ—cYVÁ§•õc0¤}£ý I¤F‰b媥ø¾OÖd0Æ"›±9xt!˜6žÝJ8Ãó¬@ï .X„I§SôïõhíY‚ïû¸¤Á2øÆL¥ynÿX;“D+³u–e‘S‹E×ïü/>úúO?ò,,eÓŦç ÏõøÄÞÍþÄÙœùú›xWûNÛV±ªÿ¿ù¿ÿyòHÉbWÿ&Î{É%l숣Ùf®éäø··³kŠufÊßÿ-þÎüî9Ã<õÔÆu1øx©é?M>¸Çz6qÑ oá-“>ûRÖ†2ì»c;½žÏÈ ågsí^ÃÆ¾}Ü¿ï|ÞóÇçÑ‘íãéè:®þÈ™?黂þËËhþégùè¿V}°Ë`ˆ?º‡gÓY{ãÛxGÛã¤7]Æ*çÄ)©§:ÎSKCüÀ~{ ¼×zC¶ä+±ÚÅã»|^»õL̾Ÿ³}.)±q×T¿Û,"2Çø&W8„ÅÀà0žçY¹ì\Tá>ø Ὀֽ“J1XcÁå±;î 9År¬… ñ|Ÿ¡a°rí+,?˜ŒÊø“Ï võÕWsÏ=÷LÙþ3c & 6TÃÀ¾~ÂQ–_´’U#OПu-ÙØ"|;„çé$ ’‡Y~Šˆ› “Nv‘¥ÃØÉ¾;ýw ªšß9Ë_¾vËÄÏãUóétš|û±Üé¹2YúžÛÁ«7FÙñ‹ã¤½TÍï‘ûw÷óÿ>òYÂÑ׿õz–u/#“ÉL\÷ú³×óû~÷ßù—¾èÖm\G2™Ì}ã &òìgùáW~H6íÒ÷Dpý¼Ç?–Z—8ly xd³Yž}â wþÕOè^¾‘…Ï X†=ÿ–þ‚¸;2kÂõ>kÞp ÍmÍ äGÿï–z]Ua«“ü\Kµ÷¼TïлT°\Í~ÅÖOÕÚ¤’¶'ÓõÄ)wªñ§õÝOÝÌ~=ÿõ×ßâ`O®‡÷ßÿ/Üø¯ç»Ÿº¹ÚakVIè«`2ìKÜIÆ 6øAœãÄ5ÜÞ$wVæ ~b…¸æê+¸åÇ·“ëSD¸æê+‡B“¶­ö„¡ÍÜüãͤ÷‡‰Ç‚åç>Å6à‘ûÒ±þ6–÷ÓÞ&w&~Á T"B*åÓ×;J¤¯×w'}}Ê7†};{h=¾Ç ãš,X?)*¹{Oõ\ÂÚ 2=¸V˜Q¢„qi&¾çù ï'}ô üLŠööœž¡wS‡à{ªJï|ùu‹‘þaLÏ£¼mK'W·–_ö t-Ï&¾3NÊMqÿéðš7½zâ$¤®ë’H$X¿q=çœ{ÀÄ2ß÷ ‡ÃÄb1,Ëâ¾_ÜÏÑŽ Å°ÌøùƒQìñaÛ6¡P®yÒ$0–Áeçÿâ©'ï'á'f½h®¹­™äH’/¾÷‹<ü\CO—EŽ/7E¶)· S¬›®ú{ª±§Û¦®Á{½¥JBïé*²§ZVìßR??‹Ùy—í—¼ÇÿZä>,¸ü][ßõ~å¥%­N#ÞðDPlcÓæ´3êàÍB;‡%›—ò‡óA²ÙÒ' 4Æð…»ÿŠï¶ea"£¼ìš³IûƒD­N¾ñ­û<;sræX„U{6W=Ÿ_—åe7þnp'² 7ñÓo|‹_Ü d¼£CGùÚ/¿Vôx>|”Û︀k_r%Ë—/;i›p8Ì›/3Ë:N^3ö=.XÆ"ê@Ks?=#mEï‘Çùë“DÂavì O‡s/´AÍüH–Ð9i²)v·`yö‰$ ’-#´'`|0ÖX­¹Bo‘cYÍ´Ù1Â8X<Ò$ýQRã_-µZhµ›ˆX—´?̈ Óá´f„~/uâL9VŒ»™èØX>iâÞé)×Å ÆrhrÐBšao×j¥Ý޲¬±"qFýî4ûeNºN—Œ‰3êgðÛj¥Ýn"„Á7£Äi¦ÍvN:>®ßÏ ‰Òa7c›!}‡öI×¥Íi'Jœ/G˜V§“I†¼Q²'Ísºy[8Vmv”i“ÀXmÄÌ0}~îkêåË Ehu:ˆ1BŸ—¶;é²Ãxþ¾‹cwÑeÛ¤¼>FÍ|¹Í""3Ë÷}üÖVk3Æb‡k®º Û¶ÉÜ?;@<•"™ÉÉfɺ.-±]mm„W®$´u+žïó³;C:ëcYþH'žÂ¶kvŸ»„?ýßB<gçÎlذÖÖV,ËâÁœ½{ì1.¾øbŒ1ŒŽŽ²{÷n6mÚDKK ÿ'ÿ›žÇŽ×<—|Ív ­í­´lè¤uE+­ š±¬Üëz6“aäÈ£†IìÅîê§cyËν7vé}&hÅ·µ0ʧ¾ú‰²OÞéº.™L†÷c±pˆ÷^µ‚Ó–tÒÒÒÂÇÞþIL_zúAÊä6»ÜðþØ2Ö†µ©©‰¾¾¾’sF£,\¸d2 À¶û·ñÝÏ}—P¢öZÚ°Õ:éòâU y÷ÿ»©è¶wâ«ùOº—žMK¸…C‡w’ð“SŽŸ5£S®¯Õ¿Ý÷o“.ßö·ñ½ú^ c7ÛÍ|ñ·_ü#à—ä¾gÈ}Â0þ×Ïûwü¯)q™¼Ë0¹*¼ðç©þnYáÏL³¼n¡w£´7)'¯uÜb}¼‹m?]÷Ä3`±ï ”ÃÅcМ´ÌÃ?iÙL*çD–Ã`ö0ïxÕplÛ¶y:~I?ޱ£üéïß²n–O|ò3˜=5Í(øö&~î—ë?Vüxuw/å’‹/œø¹Ø6ã½>ëù9ääg.Ÿ¤™Ñ.|3ù˜ÚN“sx ‰D¦%ðOG àd#Œ%Û'bGˆxÑI}<[]x&ÿÄÂ""2“ŒI04EAÏÄòâ…KôNþpÚ˜#^Š‘“ÖLµ.U0–GÂëabFf”¯Ø–iö›f>ÞIã¦H•LL N£lÁõ¦özò.gñzò®³pžÓÍÛàša&ÕAL¾ åË e&Ý.ߤ'ïx¹þ@Þåùr›EDf–œ¤‡s±C!© ¿}d—\t.‘K/Å۽逸h‰Åh‰Å&ö³{Ý:œuëØöÈ.’é,ޏ.¡”7)íªiŽcUÞãí.öì9ñæ?ÿ$‡‘H„mÛ¶M¬‹D"“ö úýpÜ“J“x0É&ÔÆŽ9øž7êá%³¤Mš¤Ÿ¤©§c’t­Ê`YmÖŽí‹`²Áß•Tµ;ŽC$áúó°õÌ¥t4G …B8c'1 êx¥Ý4—\s1l½ ד{¬W÷Š+ˆÇã “Nçöh4JGG--- J¥°,‹ ¶^À¾köñÀ÷$šæ«wÓ(¼]ãyK1¾1ø@oÏ^z ¤ÍôÌtý÷u¿w>†›ÿ©öNsŸª¤>?Ï,VM]¯'SUÏzë”F ½+Qnë“rÖ•óõ€RÛÌ»d®œÐÛ÷}éýi3HÈq°- ˲Hp„žø×ð|CØ´Sk÷ßõñ¼L`¡·ç¦ñÝúõô.´aý™Û”Ú·Þ,¬IÕÔpŸ;ñ¨1X–…eù,j!‘„c½]TpbäJ&ZúºèuâxíC„c›óðŸ«ê¶òw›wÿÅDDDDDD¦çyXÉ ´98NˆCGz¸Û¶^¸ gÜ 0GŽà÷÷`-Z„½t)«ßöèã:Òƒ çÖ'2¹¦ÈÉÆ³Äãq¢Ñ([·nôMac E×¥R)âñ8n¢ô·Ìká—3Œå[„úCXcmŽ=ãMúV}ÂCo3è\•Á²¡­=„µ6ñ}aüìÉßüªF¹íMÆY–ÅK/:câ½òøAŠ8Qö?ºŸCWbY÷2|ß'NÓ××Gkk+«V­"Î=v²ÙÜ}ÝÛÛ‹çyù¡ƒ‡xæ‘ýDœÚïR¦ËR2~zöÕ1öÂ??iY5]!¦0U–9]Ð]¸nª0:ˆ& e.†ÞãJµ6™êçb—ó—×ÚK|Î*·ÒÛ÷ aÚ‰9ضMÒë'áöÓZ@«³ß2d\·æ³gÒ^&‰cCÍ' ´,üL’lpß*ñ*ÜwFX¹Ö&0Ö6dìçÜ‹§OGË ÍaŸçz–‘v­ºôóßm×¢«g9}‡i¤=Ñ…mÙùŽ]·Öœz ŒO8鑱Ө-1l'Ä᣽üìÎßpîÙëXÞ½»»§»ûÄ>ÆpøÈq{üI’©,¶“‹{¼xŠhÒà °ùÓà3CÜuë]\õÒ«‡OnÙÞÞž»î‚ }<ô¾ó¿ïd`_}¿én0dÍÔÁzÂO@_3ØÐ¹:ƒeAkGÎÈrl/ßµäãùLÐùeY$žIòÝÏ~—×¼ï5,ë^ÆC<ÄÁ½‡¸ð°b劉ûÎq<ÄÃ÷>ŠµË¹ðâ 9|è07þf’û“Øu’R·y¼°¯‘ƒ·gújWnY*§Èò骿Ëíçݰærè]‰Jª´‹}bRâS•z7¨˜Ie„ÞÆÐ^ÆÝw>‹…E64ÈÅ—.%é¦1n’Ýv™ƒ! ÓßD-Ç&•rñ²IBMmU‘ÏML{2ËZN¾qb¿ú>~,ÀX>  “&Û–!“éâpo˜”kð­±jë:Ìɲr¿¸…²Ýý«ÉZY|ÛLʶsá8PÇyˆˆˆˆˆˆ4¶Üû ×ÏCÚò±››pB!R™,÷oÛN8d³pA-Í1 H¤èíÀõ|œP' ^áÆ÷ÉŒdxzÇv=ŸT5~zZÀ:OË`Ûm!Ò˳ô¨­Í‰o<|×§­­¶\#OâoüsMŒ1øø$M–쓾ù¾Éšó×òØÏÃòxö©¼ëÃïš:ÿð«?äøÃ=<ÒápàÉgyæÑ}Ä÷ÇqíÜ7ómìïÇâ-aKÜ€¢ÛW:þÜ‘KI(¯Ú»’*îS"t™éлœÿÓUnW{]…’rúwÛÒ³Þ|z„D£Q¢Ñ©¿šò‘W|Ï÷ø‹[ÞL*“&éfÀI“é ³þåÖ‘¢Ý3§çŸ>—Ÿÿäø&ˆ®c¶e3ÐgðÆÚ{ÔʱXŒX^µjƘ™ÇO®mˆ?vmãÕÞ¾ ‘ÎZ¹PÜÊmWïÞ·rß°MhÒµËäU™×{"""""")ÿ½PÖÏŒ›Ä4G°CvÄÆø†ã}ƒÐ;ÞÎÒ¶‘`á»V"M,å“õ³e]®’ùùÆ`á3²w§üTÅ€‡‡o ÁuήMÜcz[k,ø6X^¸¦cåúYü¸ÏŸ¾ã£x¦¶Ö2Žå`§ –ï²ÃUcÆÿ0Æ'M³ß°}ßv<<2V†t&M:&ÊÅ…étšt&MÊJްýûÛ±m‹ Y,6¾eÆÞÉó†ëù^ŒçW~,çQ¾ëÕSyŽ “«¸ó//«ô0MU^î~uוÞA~¬W,Ø.纊à•âsš1†ÞC½|úß©`Ÿý‹ŸåÜ‹Î%^€o éÔ³ ¸5Rk[6Göwsü™®qÇ‚ïÚÆ Y!<ËŶ OÂU9c Y?Ë›Ÿÿ–šÆÉúÙI}ºêmâ(ïê‚?uHyLAûõï™Ì`Ș ‘d“M‘‰:˜H'âàœçüŒ HÚÇr}2“*¼ƒaYÖĉ ý±?åïœû'4ö§¢}ë,×㻓ŠbG=RP}_æˆÅNÙ<ùýo¥,3VÈfWx¼ Ç+ôñ1cÅqYãb9ÆB„xr€/ÿï/c…rI×gàÉABvî[ý¾åãap¬\ëËÊd¶0Ú7Ê7>ñÝ¢Áw6üczŽ›ªÀ·š'”دڹÍêgzWbªÐºÒ1Êíí]¬Íɼ Äí>‡þ²·7–Á=+Ì÷ÿíá‰eVk`ó‰ûñ‰ ´ÖPØ`À{òÈUí«¨õÿîB,L½È‹ˆˆˆˆˆHãɘ ¶kuÁJø¸a ßfRDeù†X6÷¾×5ÙºÊV)áÇñF¢Ø£6)?YÓX>¹oTQä6þÍè Ž»ÁLÕ@®R?·ƒÁ±B¤vg&æmŒ!jEñ/—ÑX't1]:•娓ÇKÎÿT,, ¶§ º™b}©ë,'4ohõ ½ë —\O5y^Wò,|«òO 7í½Û:qbÏxŒXÃÍëÄ ëÿ“eYØN0_?ãØ¥Ožè‘ë¡rCXcàDðèâN­afF{ÝhÒ&X¤×Èœô8°r•à>I'˲êöØqÍÉõYSû·ôeR^,¬.Ö¢¤Øõ>™eÝÆžk•ÞÕš.Yœ®º»Øß±žÌóããò¾HCþPëÕ‘ô IDATf27Ts¼DDDDDDD¦RNÆP¶%"³•o)_)-ï)+§,Øvª;tNUlW«QÎ0•J´×:Ž*¿EDDDDDDDDd.)7Ó "?­d»YÓh¡÷tmKÊݿԵŽ?¾¯Âq©§ rÈ©òÐé²ÔZÇŸ5zO¥š“X–ÓÏ»p›r¿. """""""""2*É, —Ox—»nÎd£s±§w%'±¬dÌŠCmc ÆÌû8"""""""""2ƒªÈóóÍJwžÍ“YÖÅlWzÏħA_‡*¾EDDDDDDDDd&Ô#‹œ‹™lEf2ôžÍZëu—úš€ˆˆˆˆˆˆˆˆˆH=”j[ä˜3iÆ®{¶+½ƒRN ]ØË»Ô8êã-"""""""""ª’ ³ÒÞÞó" môžÞ•är¶-<#i¥¡ö¤}ÌØ‘ äe޵d˜¹¡N,›.Ȭ¤wwC÷ùnôлÕ>*¯Ån©àjDDDDDDDDDDªRN~9o‚ëZÔ+ô®¦ ~¦ö©æ:Š–þïÝ=W/"""""""""§ RíHf*­4Ÿ©}¦Õˆ•Þµô– ªM9½p¸ý¡Ûª^DDDDDDDDD¤´––(ïÜ„Õ( ›K…Ïål×pãsíD–õücª†îùÛÌ‹fî"""""""""2'L—I–“k1‡9£+½ƒVì䕵Œq’{ï½·Š!EW"‘ ‘HÐÖÖÆÚµk ‡Ã³=%‘Še³YöíÛÇÈÈ---455Íö”DDDD$ ©TŠ;wÎö4DDêâøÀT«ƒÈ6®2;hó1ô.·=JáߪE£ÑZvi(™LfâïºuëÈd2$“ÉÙž–HÅlÛfݺuÜwß}D"𛛉D"³=- @*•àïxÇ,ÏDD$X_úÒ—j¢0íIj5CïRjéo3år…Þ2Ÿ¤R)†††&oÏóf{J"Uñëà¾Y„¾ <Œ£ÏêKV¶µ›Ÿr4­«û^»[û‚ ظq#?þ8sçÎÅ÷}~øa"‘‹-âÜsÏÍH]¦òm½ždÚ¼›8¼_ˆdÕlªtößÀ{o˜-—ðé ¡w"BMÎ4¾zýÅ”f»lYr÷¾ôƒÎOΞn#4”£Î*%k·ïîMÛˆˆˆˆˆˆH³«lÓ´óºG;BïÖ‚n«•ùí½§å¼î™š$Öð{>còU§1ÂðX÷ìm¼?ò¾tЧüë¾÷é5Æâ‹ÍQ’ñV¿œvâX ÍÇm/³}¶­^ÈóË7QëzøYC8rö)L,vÀû˜Ý·†üÑeŸ×RMR0q&Sïñæ¦(‰hœìq'3{ÆÂ@jë;¼°ð 6D}‚qÔiÇ1¦Ð ¶q) ž›r?HnÉXF '!HÁ°c¹ðØ^|ô÷G©nkßw§w/?ô>]5›Q´·ïíÕÕÎþx³ào~˜Ïª×P5ä4®<}ä~ÞvtXˆsÏ=—û￟mÛ¶ñè£ây‘H„’’Î=÷ÜŒ -áÇb¤J†18eû¶Z,;—’"Ÿ”[ÿu ÔÖwù÷óo°>’Âû2ã쳘Úë<¸‰‡ú¬zi ‘Á§rÅi#1[ßeñ¢7Ø5 †sä©;®µT[˼YpÿŒ±ØÒx-Æ©'Œ¥Ð߯ê±|Sžoõά3¦¶Ë–•OóÚ»[¨MBÁÈ™œ~ühzÙ 5¿°œ 5‹}ôÉÌäÓ—°jK%öc÷óVÎ(N8g&3·HÆ*Ù^g‘5t…«k©ó ÙM;{{³àþ÷ÉeQöE”X4AþÄ£™ZÃ[›êHDcd;‰Y‡5\ç¾ÏAWÎb$íì› ±MËxî…wØêÉ)È  ×G»Ç«•cßÿÓÑð&""""""Òí*“ÜUÆ™^~@àÝ!ôÞÞÙ±½]n³Ûô´C„CaB–E}É6¡PˆpÐÆ²ƒ„)/¼’y§—0U¼~ÏݬØ8𓇴³l˜C¯¡G0gúPúåx|¾èvî_µ‰ñ'ñƒ„’›©,½šËfaÕ®äþßý“•G_ÃåW–H~Ècx&ÍarÖç,ý×Ûäœþu¾?&‡ê·äÎÞ¥ÿ9Sé•ú”W®£ï9ßâòáaâ›sßü½ÆYX–MÁÀþX±J<Úéɹ;µd‚l ‹vö}Àƶëò¿h{ì Áø‡¼±þXÎýö9 tꨪMî7¿iv÷z¶m›Ë/¿œûî»-[¶PZZÊ%—\’Ññ”í~ã]÷ —æpÜÔ¡\Réá¯Üͼöì[„O½šïM(„º5 ß Š5ëæ0À‰RYµ% Þ&ç´kùÞ˜jÞz¨þÜÌ9˜ÿ –¶µÌ Jn¤¼×\rZõ0ÿVnű©¬pŽåÚ›&’CŠêíUxH~ÊFs—{89îfž¿ëo¬Øx'ÜÂkÿz‡œY_ã¦Ñyø«xdþV•#O›ÅöÏ—Ðûâ ™–›¤6RG¬.}$|"Ÿm$ÖoE-G7±Ò×ùU\ÚpÿõÖ§YyôU\~E_ÉyüOKùhÂYLÊvƒ8@Ûûvâ€M¼ºp}ç\ÏeóHlZÌ}÷Æ)x»8^-}M×^çêé-"""""‘Zʯ/YÌá÷ý™û[69ìvv™¡mv«Ð|_ÝȲ«S†®Þ~÷¤±ÙD««‰ÔØôî$MìrY¸¨„œd„ÊÊ(9ƒL&pÓm:ƒPšêjªý"ú dü˜ꪫ‰Ä è[œ Vçã—­c}î4f ôˆTF°†ObXÅF6'À/ÿ”ÍEÓ˜Þ'AUU„DáÁLâ4–í§Rxù1ë`-=.íÕÕÞþÔëÃ!'LA¼ŠÊý(ðÞ¾ïS]]Ý,Ü6ÆPSSÓÑ›2tŒÝãæÍØØ*Ÿ/O¼´†­ ÇÓ/ÿ„ ù‡pÄ`Cdûv"q¿>p ‡œ0™¼X%5I¼òu|š;\ª*ª0Ã&1´rSõÖö2œ!L›Em$BUµEï¾Aêê’8½KÉÙò¯¾õ)åµøNpÇ9u3õUTDs<¨þ=~ù'lÈ›Æaý]ª**¨qFsÄ—O>ÙN"#e ‰ê*ª"u;~žSó!KÞ„#Ž‚C+œÁŒ;(@u$BÄ+¢oñ ÆÎ!‰P˧´(A,ÖÊyicßüò l.šÆ!%q*++‰õšÂÁC,:p¼Zûî|‹ˆˆˆˆ´/ÉçKÿÆÍ7^ÁùçžÍœ¹síþ•·jºú¯`ÃÖ7—²6ÖÅeìWlxþ÷ÜtÙ\Î>{sç}ƒÿ~d q ãÇËnøO2ÂßÀ#ßËÜoý[܃ÖԼ¯/9— ³”T×T×uuNºO¶ßzz§uä€ìíAëŠOJºTóÿýq¬ôoß½"ÛXfêØ¸üuV~¼¤eC¢Šxa¿&-ˆc5l¾±ØÆÃPß ÖX`âq¢e¯ñÀ_–5¾ÓwúÒ?e0©$Éì0Ž[_­q-á=ù_KÇjiý};ï{{uµ·?„+Ü`·«ÿþiGG{i×ÔÔðøãSYYI¿~ýð}Ÿòòr~øaæÌ™C~~~† JM1ùôyvZ«Ÿ{„<“bîY“ÉMÄI愱’^ýy4éGƒ±òÈvâ½Âýxœº²×xà¶¥ çܧ/ýS~»ËLÐ`b—úÃbΟ’#¹àËo³øùǹçÅ"&u3F`ƒ!DÀ$ë¯ã“2õ†ú‰8ÉœPcÍÆcgå’¬Nà0 ç É1ˆmàžIþÉ11œ"Öò†ô&]£Wÿ>ßÃÇÁö]|S׳ãüCý­ï›ŸLÊa¥êFLÊà„,Œ1»>^-Ž}WÑð&""""Ò¹ åÏÿ’ïßo8û»¿æÆCØÊº÷·QßÅ‘‚ÿ/?ø Yß›Á¨ìot˜¿ùŸÜz_%'ýòïünDñòu¬­," :^]ÆÆ e¸µœWÖÍå 1é¸ÒYñ*e"ÏiµÛ׬32ÌŽôÞÞï{x§u§Ð{¿Õm¾.oÛXLãð&.‰„M¿ò߸¬éë¶—%×-æ™uý¹è’9 ƒ·îŸÜºÜj>Œ@ú}‡)½¬á¶–…“—Gþ ã¸dÞ ßæ‹Ô«Ë!«.J½,€‰„i^[ÃM$Û¾`7jI¿ß²¬Æ[S¶¶ïNNÛu9¹mïOÜ­Ÿa°h­Ô®¶»×óÂ… ©¬¬¤¤¤„‹/¾c óçÏgÛ¶m,\¸sÎ9'sÅù)bµbVˆÇÅ?­a›7™üœ\²¢5Ô÷ ÁqÃ|;7¼Çrñ%‡5œ·ús­Œ‹µ½,îÖ·Õ´ÝFn ¯h §Ï;ŒS¶¼ÊC[Ì{¥g1)§åš;žÙyùd×V7©ÙP[%;/‹VºÄ7ñê?_Ãs!§ ô©K¶uZþ¿§EpÞ¦Ö÷ÍÎÉ!\WKÔÐpL’õ×9íËôñjz컚†7‘N‘|›GÿúGÿ6æN à&ã$­†Mì…ñ}Lt1ÿ}õ[̺÷;H±ôæKø÷‘÷ñ3VrËïrØW\þqÇ |1ù;ÜsƒÍZÎûõ øÓïâÍ Ÿpéa\rã5Ó?©¥ÜrÝ‹ô=Ææƒ÷*ˆÕD°F•¿>…óoáñÖãüèzÉ×ÿû|ÆàI_UA¤ßT¦pHÆSؽ†3®—Á÷+yãî&Ç«hcêV`_ñg®T?†‰·þ¯Üp³Ë ¿߬Íx[çF:Î.äÐÃ,^~ù}Î3‰€ÙβW«™qä ®O¯è±qñ_¸ý©5T$Rxù“8ï†k9~`R+øý÷_¡ÏtÃÚµUĪëÈ;ôb®;orã¿YåÀ¡obìÐÑOHºïI €^¡m”WÖw»ô«?âÃM-»Šî/åbåæHTS]ñËW¬#¾Ÿ÷X}Ç1¶ö ­üŒmUUTU–óÙ'ŸSíƒÕw$ÃkßãÍõ_6Jm}—Õ©Ûݪç^â£êÎùª½ºÚÛŸžæœsÎaĈ\zé¥xž‡ïûÌ›7#Fd4ðö"[Ø\ÇðëØ¼j5[z÷§O¬ÒQT÷.«Ö×â&¥®ï=Y¥c}ƒE+>¥¼¢‚Šíe|ºn5~ûËÚã×ngku”ÚHñp)}òì]|ði•Žcœ·†Uë£ø€ù€•k³3²–&;a{eÃN$¿`ÙÓ/?òÎaQ—lR[ƛϿÌÚNúÚ¤Õç †×®aõçéëü=ÞK_ç{x¼DDDDDzoã;¬¶㘱®Ÿþ»Üàû ß(n£Ùèìú l(¿½>Œëï~’Çþc&áÖæ¥>à›ÿAhÞxð¡¸åKæßº€2ÓÐFÅrÖ^ÊÏoù_~ÿçŸ2sÓÝ<òN‡_y Ç÷À¿þ ùõÅŒWK`äÑQó$zôMʦþ±Æ€UÔüxýÏ78ÿ”RV¼´šú>G^YŠ5óxF6ítÜŽ3äO?†Áï¼Âê†!3MÙ뼞:Š£úùM†ý´);›oÞr7óﻇú>ý^Ãr{û›|Òïr~úË›ùíïnbòšÛøëʺÖ6ØÝôüÜ2Ãôë.ºMÏAk3NÈÏÜÏÚ¬l‚Ù>ºˆ «¾Ÿtº'óNí,Ë?“kÿÁ=y‰pn)“ŽšÊ wô’n¶¾ÕÐoºeoK˲ûrôyÇðü?áŽçâx&HÑø8ë„ÂÎŽ?{ÿxb>N:d—Œgò¸b¶YM}+=ÓýZÊ?ÛDrXy»QK÷Ýj¯®öög§¶ö/MGG†…p‡‹/¾˜êêêÆ1¼mÛæâ‹/¦¦¦ÏÛ»Vk©ÝÀk ÿÁ–šV LÁÀ)œôåC(4I\«?GÍ9Œçž|ÛŸKaBý9âì3™ÒË4îÇŽ])áðsŽæßÿ|œ»ÅñL€Â±Çñ¥cóØí,3-ÛÚñǬW½ŽÅ Þ¢ÂprrÔ™Y~ªí÷¿˜sf²ør÷â$K˜xÊ—™šï‘p‹7c={wåŒeæÄí,ÿ|þc¿áôÑV!Óæ^Â1Å5lýl©É>&§ÅöŒ©’¤éëô&M÷‡vê´1óÌñ<õäýÜžtÈ.Ǥ±El3cvçxu=õô‘Î`¢µÔôav49õÒY ¤H¤ZŸç®}…e9§òÓ©y¤.…GÀ¸??Ç»µ³é›'pü1¥øÉ$IŠ8h¸ÃŠò<×ÃÇÔÏOêoa¹ê–ïñÌüùü調Ðæ\.½àFä‚ßâxu"ƒ{‰·ãS94ø)¯. 0óC°(kl®ÝsÓÕÃÛt3Vî!7ò!^y«Ži3²ØôÚ23¿K>jºyƒ"ßĈF¡ÿø1ØÏV“¤!ä Œåèà IÆb$éËqÇõç»o~Œ;}’BÐÌþr¾[$—]¶ýÎ#<ì4®¼!Pzù..Aœd„Úä(Îþþ’•µ Ÿ`Ú =ýÛŒq«©I´³,YÀ‘ó¾Ë 6øÆ#w Nñ©©M`œï³rÒ7.ů©&îV!‡_þuìºu®‹›=†YWÌYNýð@^²ŽÚh߸X¥GrѷDZÀxI’&]wîYviº­†yYøÊ÷¦ãÕFˆ¹»SKÓuÛ;.íÕÕÎþ´<.ÝœçyTUU5›çûþNóöV`èñ\ùÓ Ø cb§Dk£$<À$ñ &söµ‡´-0)ê"bþHÎüîD’Õ$sÜ©¬QœzÙÎtê?üðµDjøí-³[¶e3ø”o2Æ«¢Ú=ž+o<Ǫ“ÝX 51œ¶ß‰¥H†Frê“9³þ"­!šð쑳ùú÷ÏÆòãÔÅyb¨å‘'VUA­7žs¾;/RIÔk±={'\{1~U1°zqؼk°k[¬K{u&1½gpÁ ǰ ¾›$iB8‰Jª»s¼DDDDDöŽÞ£(#róÉ©­"â¶š.ìÜÉdG§À.¡O¡gš¬Þbž©`ÛúóÃ+Ÿi0<âÎP&Æ & CvVº}cA}—®ïŒ²OÏE‡xx9c8ãú_sæÕŸñâ?çÇ¿Hð??9¾-WÁ Nù7^\åྯ±,4““ÎŒiÿÜäuÍv_YL>f<÷¾°ŠšCúóÊòŽù?E°¦É*&šgå雈acE7-³c¹•E8¸ã‡)œ›C¬&Êö…ä®ÌWM“Ç.µ¿„Þ²øÉ(Õ­&­Ij+›/HE«îŒÛÞ2ŸXuU³ˆc‰¶Út©‹T7­†xu¤ñ•ñD«D[«;£&ÒÞí“›·Uß`’Úªôöw§–¦ë¶·ïí×ÕöþìܦìšIE©ªhíêH/Q]Ùò\$©Ù¾ó±6nœÚª8µ­µÓÖ2³s[©Ú ꯚ6jk÷=`¼¶ëðâ5TÆw¼Ž·yù'¨Þžþ¡k¹½ÑЦ>xĪ*[Y·ý:ýT‘ŠÖ¿¶;ÇKDDDDd_Ù—A«=p<£ã·óúÚ‹7¶eg¾Qlv„ÜÄ©¦êo(ßZ(ÝÚ¼‚"ŠGŸÏ¯ÿçlJ¿9ìã&’¸IÍÚoúhÛTèÝ„ñH%=púqôeçðÂů³.y¥vËã•Ëô'pÿK+y¿ïdÍü!}kÃc{çfÛïn <éX¦Üý¯­èÏ›¥ÇrV^ócX·ì~óêPþë§×12ÇÂ]ù;.¦É ~5•%õ¹ëö­•ääk|çPw½›Ý’p/ÚØ“uwÜ Q_—éôûZDDDäÀ°OƒÖàÎ9§€ïÞò¿ô¹á N_BÈ‹²µ¼Ž¼þ}ÈvJ蓵u›SLÀ+•—ßsÉ:É4 7¸sèÝrž3r&GE~Çý/ÂU‡—2q¶}QK^ÿ²vZ¿aCc0VyYålÜÇeí›ãÑÂþz»eñaª?£æ4µ|üÂ+|2p4óƒ¡åñ2„§œÀ”{àþÏr™ù£ÒÆá"ÓǼÝs£~ì6ãŒá˜é›ùå›9äºóÉ&ß’7¤¢QÜ‚ÞäYqbÕe,Yô&Q3nGÞ‡¼øüZfž7šœšwxæ…mL¹tdw@[Í"wó}{³Ýýç‡w7uãs."iûÃDdOé:9ðìëÏ <ë¿ùyÖÝÜùû˜_Ã89”N»ˆÿó½SèŒeΕc¸ùWßfyA>áüQŒ?¬/Ÿ· º›oÒrž3š 4—;nýWü>Šk ˜yÿqMoÂ;­ßÈb0Ö`N8g,ÿ÷櫸²øx¾ñë˘²“ ýíß–nùrî»õ>ÞžÄeS2æx®üþÙ ¶ >­¯ñðv~¸n7õNMÓИ1˜@;ç¦+w´Ûr5óHò_­åØÉáÆ{PÕ³èuÔ\ÎxíwÜxõÃäaæ—Odô²&käLejø)~rýÇTăŒ8í;|{Z;Æ’Eg}æÔ²Ý]ÝM´µ1½[ÎkíÑjåuËeM'»•çN“çv“×éçN“y&¯ŽF£?øøã[Ù=‘îiëÖ­¬X±‚Ù³g¶=œˆHw‘››Ë3Ï<ÃôéÓéÓ§OW—#""""°~ýzV¯^ÍÕW_½Ó²W_}•Ã?|­v H0à`7$ÆK‘HºõÜ:!BA»a mË‹“ôBÙ^,‰×ØVkóÛ! â¤ïsä¥H&=L+ëÛ¡,‚~‚„k°œáÆ%Oí³±-ËbéÒ¥]p.vÁvœ'ß%•L5f¢;¯$ïüåž8è—ü×ɽiqÌÛ<7ûôù5j¹¹¹]]N 6¡œ0&#e'LN–E².Žk€@¹—hÜË!”•Eý“›òpC<žÂ¤Þä׾Č»~À19VÃýÀâûÙ¹ˆF£¬Y³†ãŽ;n§e·ß~;ßúÖ·ÈÍÍýð à5L.à7yí5¼ö›<7M^›&óZ>o9ÑÆó>’kãqWóhg^ÆOQOì齯‚ü ôuyéAt=KOeY–®o‘ľï]lðR ¼TKÝq·µ%.‰º– Z›x. ¯µFv^ßKÄpã&ˆµºí}cëé—$kûþC-WjóB{k4³.)h²-Žy›çF:Æ'Y×äFV^‚º¦}ðÜ8ÑÆ›‡z$cQšÁ?w~2NÝ~tÉeXgæž=ê¨õÄÐ[D2`¿ûÃDdé:9ðèß3ûn{.¼u<òã[xn{G_ûCfdün¸"*…Þ žƒÒ“èz–žJ=½EDDDD¤ÃœÑ\pË|.± ^2ARcBïÿ‚‡rãßÀÆQ¿{Qè-"""""""=J·í]ÜußsᑌÕÑö@(²ÿq‰GwK=…Þ"Ò*c 999]]†È^ëž`‹ˆˆˆÈžJ»Oîºoè-Ò9Ò?¶mwq%=›Bï¶uø;ðÏ<óLgÖ!²OÕÔÔððÃwq%"™õ /ŸŸßÕeˆˆˆˆHŒ;¶Íe………lÙ²…þýûkx»ý€ã8]]‚´Fw½’tªíÛ·STT”‰¦ôK® ½3à»ß¼ «KÙ´X IDAT9`<½hU›ËFÅÚµkY¾|¹zï–-[ÖÕ%HkÖ¬éêx¶mSTTĸq㺺”M¡·ˆˆˆˆˆˆˆôÁ`‰'ª—·H+Ôó~ÿàû>žç郹N¤Ð[DDDDDDDzß÷»º‘ý’çy]]‚È>¡ÓEDDDDDDDDD¤ÇPè-""""""""""=†Boé1z‹ˆˆˆˆˆˆˆˆˆH¡Ð[DDDDDDDDDDz …Þ""""""""""Òc(ô‘C¡·ˆˆˆˆˆˆˆˆˆˆô ½EDDDDDDDDD¤ÇPè-""""""""""=†Boé1z‹ˆˆˆˆˆˆˆˆˆH¡Ð[DDDDDDDDDDz …Þ""""""""""Òc(ô‘C¡·ˆˆˆˆˆˆˆˆˆˆô®.@DDDDDDDDD¤»1Æ´:ß²¬}\‰´¤Ð[DDDDDDDDDdÒ!·1¦qj:?v[–Õl’}O¡·ˆˆˆˆˆˆˆˆˆôe›ÊXõÊ*Ö¬\CÕö**Ê+HÄ{Ý®1ƒÁ7>)/…çyøøc…Bö.¤°w!¦MàðãgðˆÁضmÛ ¿÷1…Þ"""""""""ÒímøhÜñ_lø‚ÁÃS[@¯¼B†ÆžFΆú ;•¢º®šü¢|¦5 O °w!ETWVS¹½Š7—¯âö›oÇ 8\p팞0ÇqÔó{Rè-"""""""""Ý–ïù<ø§Y±d£ÇfÜØqØ–ƒ……eïYÐÜ´gwM]-Yya.ºì"&ϘŒmÛ;­_ܧ˜â>Å4vs.œÃª×WñÇ_þ‘a#‡qÅw® ©×÷>²óÙébÑÿûƒÿeÃG;f?ˆc°°0Æàû>žçíöäº.®ë’H&ØZ¹•QSFrÓ¯obÊáS°,«Ù¸Þ­M–eqÈ‘‡ðçGþLQŸ"~öퟩŒàû~›7À”ÌQè-"""""""""ÝŽçzüñÿþ‘€ (¿Û²0¾¿×“ï{¸^ŠÊê fžq4_1ÁPp—awË) ñ|ƒ“Ï<™_ÿð×$“Ißû€BoévþËøq—!cc|ƒïù{=y®‡›r‰ÔD˜pèfϽ׵ž}áÙLš>‰»n¹ Ïózw2…Þ"""""""""Ò­løh+–¬ ?§Ç ` ø¾ÙëÉó|\Ï#žHÎÍbîÕs1ì^ïîV' W\Ÿ®ý”Wˆçy]}{4…Þ""""""""»`"‹ùùEçqÑ/þMM+4wµ¼SjªYÊ¿>¯ÿaé>Ùæ¾ÞžH{½ãQFŒcwgbòüú1½kêj˜}á,BáÐÞÞé¡NÂ!®¹ñ¼íA…Þ,ÐÕˆˆˆˆˆˆˆˆdŒ»š»¾ñ3V6Ieƒ‡qÃ]7rdx/Úµìúžƒ¶µ'Ë;,¢ÿ!Ô ("Ø õ>ƒgV8|Ö4JíÎßžHGmÙ¸…/>û‚AýrBøžŸ‘v1øÆ'™J’_œÏÔ#§f¤Ý¦¦5;{'Ÿ­ÿŒÑãFg¼}©§Ð[DDDDDDDzÛ+gGž0b  e“¡æ­ý(íÍÇÜÿ ÛwIº™ ývHñÑÂûypÙÁtZ}èݹÛ鸷^{‹C@Üà“¹ÓÆ<ß#žˆqÄ G`YVÆÇÞ¶,‹¿t"Ë_Z®Ð»)ô‘ÇÊŸÈìy—2ÖLýé¼Èb~qÝ]DO:ŸQ²äà (™È×|ƒ³Çåa™Z>xúþ¾x5¶ÖBþ¦Î¾Œ+g&'ÝpjÏÝòž}{;¡aÇ2ïúyÞ§µDÝýè_Ü}ïÓ¬ÜP]tG|å*.9fÍ:œ··Íêöë%òÀmM¶—o¢ëžãÞ{ŸfÅú*L¯¡|ÊùÌ;s"½vQ»•ø”çﺓ'–J•ŸMÉÉ̾âkœ2,ØÙ—†ôkV®!ä„pqñýÌ}ã›úáMÉ#'ì´›MŽ›<Ž—n~©SÚ–zÓ[DDDDDDDzSó.ÿ¼ëNî¼óNî~òmª C¸¬[ð$ëÏâÂ9“SöÎ_È&°rÈñ£Ø£Žgî%s9${#¯ÿívžþtGOÒÔ»/±*ûŽRLtíBn¿ïu"­ñ]ówßr¯UåKW]Éiý·°ø¶ßòÄÇnóÛÛæ.ëm1¤Šec“bͱnØlÎ;q©¯qÏOò^'ð•Ycq¾XÅýL…ioÛ>9ƒF1$¬Ü œy͵\sæDòZlÏÔ,ã®›ç³dS.SN=½·²ôï·ðÇçË1íÖnˆ¼ú ÷.ù„¬éçsÙWOabaùEê›)³½|;^ÂÃxà{&£“çú¤<—’’’ŒåÝr*î]Lå¶Ê®>Œ=š~›ˆˆˆˆˆˆˆHcêÖóú‚õ8£Š9ùô‰ä7,sœÌ—ŸÁp3‰ª¥«x¤ü Ê<lÛ ;çÇü?ËÇ7†2KçÂåônxïÐÙ\÷ͯ0ÔŠ¹î¿ø×{o³Ö=šCZl?¾úuVF†w!gÍ€¶•åÿñ«Þüœ¯4„}Ã;°Í6êÔÆ¾;ƒNbÞE³‘ìÅšÅkYžó®>‹ f8_\ÍâíÛ¨ð¡·ÓÖ¶mú6a¹Oðv|0ÓŽ?‘‰Ž[õQ³íÄÞ}•Õ6CæÞÀ·Ï‚]ÑŸí×ÞΚWVP~XN»µ÷Î À§jófR3ÏâÒ3’å¦ðtƒLé€HE„ÂìBëm0¿þ†˜žçQXR˜‘v[SXRH¤*Òií‹Boéì¾gòó?_Á8ð]I—ô vŸ>z.ž [à7„f‰M,¹ïžY¹ž­5IÜTÏ8Ð$T³ Éó\RÒ§ØÆTE‰Æ[†n†ÚH„”qùäÁ¹àÁÆwSRm¾jG¶ÙV½mí{ïŠ|—!ìâb |×8„Bõï7»Ø¶ñ}Ò[1ž‡·ÓPæ†hu ®±))é…—rñ³‹é?REÉi§v‹Ü#.á›ë£Üµ`1óþ"œÍõ7]Àä^ûјé²_ó}ƒe27´I}èíãû>¦!øî¬áM29$‹´N¡·ˆˆˆˆˆˆˆô@†T¯¯©¢`Ü\wéáä·R[¹Ó¹òG_ç”A¼òÐ=ÜýÀS¼¾Ù&/«éÊÙfgÙŶ­>ÌoªÃû¸«cí§H&Z=K"»ÔwP_ˆí9TnªÄ±[¼÷c0ưT”W°äÙ—9föÌŒ´öê ¯Ê1ä !mWšÓð&"""""""""Òmc˜{Í\>Û°+`en˜¿~x“ôíWŸœÿ$±h¬1 ßÛ)qߟîcÖy³‡5†}gRè-"""""""""ÝÊàƒ3ãø„zñ<ÏÛûàÛxãð!Ë΢bkwü쎌Õ|çoîdðÈÁL8xŽ“™ÞéÒ:…Þ"""""""""Ò­cøêu_%œ¦pX!žçÕß¾¿w“ñ1ÆàX;Àª×Þäß>иÍ=™¾ûaÖ~°–9—Î!77W¡w'Sè-"""""""""ÝŽ1†ëv=vÀ&w@ å¦2ÖÛ;ÛÉÆò->¶ˆßÜôâuñÆív4ìŽ×ÅùÃÿû¯½øóbúöíK PèÝÉz‹ˆˆˆˆˆˆˆˆH· ¹ñæ9a$q+Fß‘¥¸¾KÊMÕ÷þöw¿÷·1 ` '”ƒ…Å›¯½Å÷/øÿ~êE0`Y–eíTOã|¯.z•/½‘Hu„K¿s)C‡% â8N«ï•Ì tu""""""""""{ÊÃß¼€™³fòÐ_ÂËvé?°?~Ê«‰QWUG2‘Ü£v}ã²Cļe_láöŸßÆ#w>Â!G´£¦ÒoP?ŠK‹Á‚ªmUl+ßÎ{o®fÉÂ%„²CœvþiŒ?šÒÒR‚Á @Û¶zw2…Þ"""""""""Ò­yžÇÀá¹én¢|s9+–¬à½•ïQS—¢Ö«!á&ö¨]c ƒ±  æÆ¨ýâ36?¼‰§}c –eÊ QЫ€‚âFŒÁ—œÁÀ!éÝ»7¹¹¹Cš(ðÞ7z‹ˆˆˆˆˆˆˆˆH·gŒÁu]z÷ëÍé_=YçÏjs’ÝiÓÓx£LÏóˆÅbÔÔÔFI¥R¸® €ã8rssÉÍÍ%ã8Nã´·µHÇ)ô‘#RgºÍt¯îp8L0¤°°°ÙM+Ó¡¶mÛ;M »÷-…Þ""""""""""í°, Çq0Æ`Ûv³°»iè~l:ɾ§Ð[DDDDDDDDD¤šÙé°»µu¤k)ôÙM ·÷_vW """"""""""’) ½EDDDDDDDDD¤ÇPè-""""""""""=†Æô‘G7š¯ÿa)5­dZþ–ò£ ¾Ê%¿{ƒÔ¾/¯Kìꘈì/|ßÇó<Þ}÷]fΜ¹GCš´7ÔÉøñ㩨¨Èhoo¨ïñ …ÈÏÏçÓO?ÍX»Ò:…Þ"""""""Òs¸«¹ëk_åüoÞLJ^çž^E¹_ÿz—ÇDd?î‘]YY‰ëº 6,ãÛ4h–eÇ3ÚÛ Mmm-±X,cíÊÎ]]€ˆˆˆˆˆˆˆHæØØõÁuã<‹úüÚª_–5޹?þ¶ï’týZ°,«‡÷LñÑÂûypÙÁtÚ4JmvyLDöéÐ{Ó¦MŒ3¦q^¦ 0€íÛ·“mÛXVf> ²,«1ø®¨¨`àÀiWv¦Ð[DDDDDDD(&ò}ؼysÆ{z8ŽC8¦ªªJ¡w'êÙ\ŠˆˆˆˆˆˆÈÉÔ¼Ã?ﺃ;;î¼—6z;Zv} b×÷7[s×ÿæ“X)S9˜ð;KùÈmÚÖÜ}Ë}¼V9”/]u%§õßÂâÛ~˻ͷY½”»ÿç~^Ù”ÅÄ“Oç„I}(íÓ—`Í2îºy>K6å2åÔÓ™Ñ{+Kÿ~ |¾cÙØ¸¬[ð$ëÏâÂ9“SöÎ_È&?]kÛËÛ«­­zz Å\°r'pæ5×rÍ™ÉkyLö¸fCäÕ¹wÉ'dM?ŸË¾z  óÈ/R¿KÙ;Mo8ÇÉËËËØXÞ-§ÜÜ\\×m ½3|[–…ã8$‰Œµ);ÓoéqLÝÞxaCó™m¤ u¼Ã‡ ›!s¿ÍMç ƒÍElùölnX_ý:+#Ãλ³fÀ ÛÊòÿx‚Uo~ÎW‚Ó¸ÞRVU§ÛŠ ~ŠÈ˯±²ÚfÈÜøöyC°+ú³ýÚÛYóÊ ÊËÀp2W\~ÃÍ$ª–®â‘ò/(ó`PCÛm-/i§¶3´^ëNgXî¼Ì´ãOd¢ããV}Ôì˜ÄÞÝóš{g… àSµy3©™gqé™ÉrSxºA¦ì¥tÇ ‡Ã»~à ƒ¿‘eZz¸”d2™ñ¶e…Þ"""""""ÒãØ}Ïä羂q`ªyþ§—óû·[[Ó«â‡Ò¾½ñR)(ìC›†ÐÛP‰2.Ÿz.ž [à7ÛZ_Þ^mµmÔø~ãð-Æóðv®xoj¶È=â¾¹>Ê] 3ÿç/òØÈÙ\ÓLî¥;dÊÞkÙ+»3·!Ý—Boé ©xœ¸˜d»½Œs r±-Ÿmå[ñ Û¨h¼—£E^a+ÀÐ/«,l¸A¦E  o³qcsóò°-­e[ñ¨ïn ä´|¶•mÃ';²•­ °Q˜Îí†áEh£ÐV—·W[)ùïµVÁjøchý–•Ö^Õl¬÷óÏßý;î|ùyùD&ÑÅÞ’ ¡PˆX,F Ð9Ñf"‘ÈØÍ+[J™Ò™=ÕE¡·ˆˆˆˆˆˆˆÐ,rÆNelxï>õ{~W=‰¬u/³ÎƒPÃY“åðÂe,yéI^Ì;‚([7n§ß¬ËXÔ¤ Ó˜½œ·ž¾•ßVO¡8ºO{ÅÎ=–#{/eñ³äÖèD¿Ê7›I3£Äzw¯ªo¯¶Ú¨ç?/êKae+yòÞ0oŽâ´“š·ž²§5¶¾t÷¯+dìÐÞ+ˆCv¶>É Ë²ÈÎΦ¦¦†¼¼¼NÙFmm-ŽãìzÅ=`ŒÁó<…ÞL7²‘[Éñ\yõq ~ÁÊ—ßÅ;ö"fõß™X¹Ó¹òG_ç”A¼òÐ=ÜýÀS¼¾Ù&/«EOÐâã¹ö;s˜Ö»š·ý‹¿¥ßð>89S¹ü‡×rò°«ŸŽe[‹˜qþ÷¸þ¤’½.½ÝÚڨǶú0óœYŒéUÚ¿ÀŠMñÛÝ‹šÃùa*W=Ëß¿¯ˆ3â„«¸ôØbõò–½fY–eQXXÈÆ;m;ååå8ŽÓ)½½=Ï#‘HPTT´ë•euÖï›–í¶¶«•çíÍkíÑêàëôd·òÜiòÜnòºéckÓÑÑhôgYVE+»'"""""""áéE«X½z5W_}u+Km‚á.É„Û0|‡… ´}R‰$¡pÛO‘HzÀr‚6Ïu!ÄñSÄS #aÛÁ@Û¶°ã{¸©oÎhÙ‚AÛ²ÀøxnŠ”gš¿ßøxž‹ëú«e-P˜€í‘Чðvµ|µµUOýü¶ÆK‘t!Øâ˜ìi;lØ&€Á÷\R)¯­[D:Ìó<’É$›6mbõêÕœþù߆eY¼ð „ÃaJJJƒëõmŒ!‹Q^^ÎÔ©S …B;­sûí·ó­o} €ÜÜܯ^“ßÊ£iòÚ4™×òyÓ‰¾nïqWóhg^Æ=hxéA|R‰8©fó ^2¾ãFŽx$ã^ó5¼I¯É»<¯y¾G*Ùü=­1~}ؾsYm¼ß´¬Åà&ã¸]¾‹ÚÚª§µù-É×ì§H&R;¿Od/Y–…mÛôîÝ€?þ˜#Fdt7n$S\\ŒmÛíííº.±XŒ‚‚Âá°n–Ù‰4¼‰ˆˆˆˆˆˆˆˆˆì÷Ò¡w8fذa,[¶ ×u1Æddr]—µk× …‡Ã ½}ß'™LRSSÃðáÃxw2…Þ"""""""""²ßK‡ÞŽã0hÐ ²³³Y²d ¶½÷§mÛ¼ýöÛÄb1Š‹‹q'c¡·1†x¢1½EDDDDDDDD¤[°, Çq0ÆPZZʘ1cøðÉD"sÌ1Ë:Ú–çy¼ùæ›”•• …èÓ§OFzy§‡KI&“TUU‘͸qãð}Û”ŽSè-"""""""""ÝF:øƒ 8Û¶ùä“Oxì±Ç˜>}z³›[¶ ÀÓA¶eYlܸ‘?þ˜ºº:B¡ýúõ# îq/oß÷1Æày^ãM+kjjèß¿?ÇÇóv}3\É …Þ"""""""""Òm¤Çödee1hÐ B¡eee¬X±‚+V0bÄ Ô8\ @]]Ñh”²²2¶lÙB,Ãó<òóó)..Æ÷}‰Äõònx' b±|ðÁäää(ðÞÇz‹ˆˆˆˆˆˆˆˆH·Ò4ø¶,‹~ýú‘ŸŸOQQ‘H„²²2>ùä’É$©TªqX‘t8íû>YYYâyÛ¶mkìá½'½¼Ç!“••Eii)%%%deeáyžï. Ð[DDDDDDDDDºtð~´m›œœJKK‰F£D£Q\×m Á`ÜÜ\òóóÉÎÎÆqœÆiOï´¦7Çô}×u3µ«²›z‹ˆˆˆˆˆˆè= IDATˆˆH·”ªÓS  MqqqcÝtÝt@4Ô½ù¥t ½EDDDDDDDD¤[KßÜÒƒmÛÍÂwú±é$=BoéšÙmõÞVÐÝó)ô‘GáöËîêDDDDDDDDDDD2E¡·ˆˆˆˆˆˆˆˆˆˆô ½EDDDDDDDDD¤ÇPè-""""""""""=†Bo‘ÿÏÞ}‡GU¦oÿž)é•$PCïMT,°(¨ ˆXQQ±ìZ°üv]uÝU×¶v׆ʪkòXTT&* 5t„ô6íœóû#$˜I&‰÷çºæÊÌ™sÞ÷™É&wÞyŽ4 ½EDDDDDDDDD¤ÉPè-""""""""""M†Boi2z‹ˆˆˆˆˆˆˆµûcî¼ð|&=¹¨‹‘£Rè-"""""""MG`/_s>'žÏ5O/¡Ð.ßþÏ]y>?¾_MÇ4ŽÆ(ûk¹àú×XgÖtÒºaîZÂG³V°× u%""uG¡·ˆˆˆˆˆˆˆ4!€MÞ¢|¼©|m¶0ŒšG!†aüÆe-†ã7l~ÖÏý/oòY ½E¤ s…º‘à2ˆLï@⎠æ¾õÃï<‡ìcS¼q¯¾:‹e›ó°ãÛÑoÄ\:¦ F€Ì…/óô߲ݟLŸáݱ>vý§LuË·àHìȉ®bÒZ^Ýí"ÖÎúoÍ_ÅÖ¬"ˆmKÿQ—såÑ̽ó6flë̤ÇÿÎ™Í ükþÃM÷ÎÁ{ÒÍç3î½á?¬ï=/Ý:ˆs ïüù¯ü/o0~þ â?ûOÍË Ìåž‹æâêuOßÖ…Ó_bæÒ-äY‘$·íè+®aDº»öß‘ÑJoibl¬V§qÁàD<«?ä½eE…Ö`~ÏË¿Â×;¢é;ò &e±ø­Gyæó½XYóyù¥d”6§ÿúþÓbÖ*»„龯w¹í}Õ•œž¶›ù/<ÁÌMªÍˆ"Ê*ÆÑy(çM:‘ÛYôæ4fmKeȰn¸Í –ÿÉæå+ɱã8np"P·½Eù¯mXÊW½;00ˆjÝ™¶Ñ`D÷dÌÕ×rõ˜žX߽ͫ_gqì\~þz%Ä›¨5’"Ҹ駘ˆˆˆˆˆˆˆ49¶/Œ>§×¢—øöYœÞ«;F¥#¥?ÇòmÏ»‘©ÛâÈI#ûÚi¬ùf[Ã×°Îë íyS¹mb:ìLd÷Ô7عÿXϪE,Ïw’>ñ"ÎÜ;=‹¥·ÏdÅ»˜Ð±-ÎjUè }üßø§aaÙ6{¬,~%ƒÌ½&ÍžBï××ðóò•ä ïÀŠ•YØ Ã8¹§›Ò¥‡¯{ï1GŠyܤõ=–ôè™üèiÃ1C‡ÓËiRøM8.,òvîÄ?ø.ÓŠˆ€ó࿈ˆ4" ½EDDDDDD¤ ²±’†ráŸqçsx{A R]¿ÞW\PHÀvœé`E6#)¬ü\öcÙNš·HÂôû!!…ûCo›¢ü|üv€Œ·oá·ËÇt\T\ýò¼;øúµ7ødùf² }üLÛ ¶ qÇrÊ1ѬX¾Œåkrù!Ó&iÄÉtsÛä¶î< ­äƒ& ¨tMÛ²*V¼Û¦‰i@ô‰“¸~s1/6ŸWîÿ’÷;â†Û.¤O|ÃèB."ò[(ô‘&ÊIÇ1çsÒ‚GøöƒÉ®8y£AlBnÃbßž}XDãÈÏ"Ë Ž6ÍH‹ÆaXìÛ›…EÈÙGN¥ccâp.ÚýL9)aÿI* \q-ªÙGÖ&çëWxaö’‡]Ï]c»a.|”»flÝ4ý†GÜâÅ|=³€v2§ŸÜ×ëN$ÁYÖÞÄ*)¡Ô†pÏ2s-~]zn``€mSþpl#™ã.½‡ãÆ­çóéOòÒÂOxwápzŸ•Ú@N¾)"Rs ½EDDDDDD¤É²£ã¼±ÝYòÊvÚ¶{xß!œ”´˜ù³Ÿá©â^„oú–5Hz>ž6ÝÃ辌Ÿ?zš' z±q!Í_è3„¾çë¯>ä˘iå*&k{6©g^N«Ä*j(\ŬW¦“`8ió‡‰ô·,,lÌ¢L6,ßÊʯ·bV¤Ì6a½†pRÒW|¶6G‹1œÔÑyÔºSâv‘k°ê—ynúnR2±¬Ô†˜ýÃ:âHˆ3`Ïr>|5œ:10é'fmJ [»$lÃ'‘‘Õ>§ˆHƒ¤YŠˆˆˆˆˆˆHÓeÛ´8íBF¤9X¹lDõgò_¯å´t/«>ŸÃ÷Y‰ ¼àÿ¸áÔdHÊ•SN¡½;“å Ær1g¦ý¡ÑÇrå×1¢ußÌøÓßøˆE;ÄDT½6Ú.ÙÌ÷sç0gÎæÌ™Ç»L’O`l¯$ò—ýŸgÒ}Òô «t«+89ÃrvÒItpT£nW/Æ]y:]â XýåB6%žÃUg´¬´Ð;…ÁãϤk|!k|Á²^ÂâÂÉ]1›7_~‘·–yè0ì*.ÒL«¼E¤Q««Ÿa[Õ\¡·ˆˆˆˆH”••Ń>HDDÿøÇ? i=6l   €ÌÌÌŠÐ{×®]dggã÷ûCZ[cdÛ6>ŸðððP—4^¯—Ë…Óé Y ¦iòòË/cš&W^y%†a0mÚ4LÓäšk®ÁápðÊ+¯à÷û¹òÊ+q¹BYÚ¶ÍÂ… Y²d @€~ýúqê©§6ˆÚäèô]©¡ð˜Tœ®HÌ@i¨K‘ zÿý÷Ù´iW\qIIIUî³bÅ Ã &&‡#ô]coºé&^}õUJJJ*¶9Z¶lÉW\Âʧ_|‘µk×ríµ×Ò¹sçP—SkÛ¶mãé§Ÿ¦U«VÜtÓM!«£¸¸˜_~ùÛ¶ÉËË#,,Œ 6PPP€ËåâçŸ 77—”””ÕZî‹/¾`Þ¼yŒ9’°°0æÎKaa!&LuiR ½EDj(6©§L^†ß“wÈ}_¿vr*‘`øé§ŸÈÏÏç믿fìØ±‡Ü¿lÙ2/^Ì?þñ !¨ò@‰‰‰œsÎ9¼ñÆœtÒI,X°€1cÆœœò“å}ôÑGlܸ‘K/½ô€?$˜¦‰aüá 77——^z‰6mÚpþù燢\ŠŠŠ°,‹W_}•aÆqâ‰'’Zj¶m è¸]XXÈ·ß~ËÂ… ñûý†°:ˆgòäɼþúëDFFË1ÇCXXÉÉÉ΄ hÞ¼yÈ_· .dìØ± 4€””¦M›Æ9眃Ûíqur4 ½ED~wxîð¸C¶GĶÂS¸3‰ˆˆˆˆHm]wÝu¬ZµŠeË–ñúë¯ÇÒ¥K ¤§§³cÇn¹åâââDà eag›6mðx<üå/©?Û·oß ‚ÃuëÖ‘——ÇÛo¿ÍÈ‘#iÓ¦ ³gÏæÇIJ,zöìÉYgÅ–-[˜?>yyyø|¾CBÜúrà 7““ƒa|õÕWÜwß}ôíÛ—Áƒóý÷ßóã?ât:9á„:thÈ[†|úé§,^¼¿ßOÏž=9ñÄùá‡øá‡èÝ»7S§N .îÐß_ë“mÛôë×õë×óí·ß2räH’’’ˆˆˆ¨h#2pà@ˆiš!­µ¼^ÇClllÅ¿õ˜˜LÓÄçó)ônz‹H“bÛ6EEÅXuøæ.2"‚°0ý'""""ÒÔ¤¥¥ÑªU+† ÆÃ?ÌêÕ«?~<Ìœ9“V­Z‘˜˜Ø ÂäÊ>øàlÛfôèÑ8æÌ™Ã;ï¼Ã%—\êÒ˜2e ;vìÀ4M>ûì3òóóq¹\\zé¥8Nf̘Á#øà^~ùeÎ8ã þùÏN Àãñ4ˆ>Ô¦i2dÈž~úi†^ñï(ðÝwßqã76ˆÀÀ0 zõêÅgŸ}FóæÍq»Ý|øá‡¤§§Óà~È¡BÿŠ ¢@Àdgf6± )Fðûëù¼¥eÓªejÐÇ‘в, ˲0 Çøqã8p PÖžá±Ç£¤¤¤Aµ»°m›¥K—rá…Ò¿lÛ&55•gžy†óÏ??ä+RINN`àÀÜ~ûíŒ1¢¢_öèÑ£yóÍ7¹îºë*‚ÄòïC(<óÌ3lÞ¼™#FЬY3 àyóæ˜¦É%—\B—.]p»Ý|üñÇ! ½—.]ÊèÑ£9î¸ã°m›„„xà¼^/óçÏÊúe÷Ýw¤¦¦rë­·†¬Ör)))¤¥¥ñã?eßë%K–žžÞ ÚñTvê©§òøãóÏþ€ˆˆÆ× j”ÃSè-"MŽ;,‚øÄ8Áÿ˜Yiq¥j_"""""ÒäœNgÅÊS§Ó‰mÛ! c¤¼¦Ê-WBWV¹Žò¶%‡£¢Öò¯å=C­  €@ À¦M›ÈÊÊÊj´,‹ˆˆˆŠ×CDDDHÛ°@Ùsëp8Yíóù*z¥{<LÓ¤¸¸8¤µ–³m›O<‘÷Þ{ÒÒRÂÃùôÒK\˜¼hÑ"† FTT{÷î¥S§N,^¼˜ã?>Ô¥I5(ô‘&ç×7UÁÿÏܲ¬÷±ˆˆˆˆˆȶíZ¿o?æ˜c˜={6111„‡‡óÞ{ïѼys¢¢¢‚ö;A0ꄲZgΜYÑkøÃ?¤wïÞ„………ü÷—ììlöîÝKii)‹-Âétòù矅ÓédΜ9DFFòÄOp '””DjjjÅêðߢ6ÏëÍ7ßL^^­[·®cýúõlܸ‘÷Þ{óÎ;¯¢½Iß¾}+æ E­ `öìÙDGGÃÌ™3‰ˆˆ %%…ã?—Ë…aŒ9’ØØØÖZÙO?ýDXX“&Màí·ßfÙ²e«ÿƒ¡¶µ–––²lÙ2n¿ýv~þùg àOŸ>Ìœ9“Ý»wÓ¢E‹ Õ*uC¡·ˆ4Yuñæ.ÔoEDDDDäè‚Î=šœœž{î9lÛ¦S§N†ÁôéÓéß¿?]»v­u›“`…ˆcÇŽåþûïçõ×_ÊúRO:µAüþòÒK/QPP@ëÖ­=z4;väÿû3fÌÀ²,úöí˹çžK~~>~ø!sçÎ%**Š¿þõ¯¿yUrmžW—ËEBBEEE,[¶Œ… bÇgÅŠ<ôÐCôìÙ3(­.jSëgœAII Ó§ODz,:wî̤I“Xºt)³fÍâøãgРAÄÄÄT|R!Tµ–3M“ü‘«¯¾º¢UÌ„ xùå—™0aBÐN ZÛZ¿ûî;úôéCLLÌÛ ÄÂ… ?~|mK”:¦Ð[Dš”òÿØÊ>æܕޡþ˜ˆˆˆˆˆTO0Â9Ã0èܹ3111Œ7ŽÈÈHü~?>ú(¯½öýû÷çâ‹/yyyy~øa\./¼ðkÖ¬aÀ€µ»¶Ú·oϦM›¸øâ‹IHH 0aÂÎ;*ÇîõzIHH`ܸq<õÔS´k×®V¿Õæy}á…ظq#ááátêÔ‰‰'Ò¥K§žz*ùùù8Nbbb*Ú›ÔFm_çŸ>çw@ âÄ•½{÷&++‹/¾ø‚‡zŸÏGzz:üãCZkù~¿ÿ€7†aíßCù<¿u¬;wòÕW_qÝu×aYEEE”””T´f¹÷Þ{éׯ:tJ­R7z‹ˆTS0ÿ‘ºŒ÷îEEE,Z´ˆÑ£Gãp8ðx<œvÚi¼þúë´iÓ&ä'@nn.ü1'Ÿ|rEçSN9…÷ߟôôtš5kV«ñkkÒ¤I8NJKK+zO—?—•Ù¶Mll,÷Ýw–eUô{þ-jó¼cYãÇgàÀøýþŠZü~?‡} õ]+”ýÁ¨8ù*”…ÈñññLœ8‘=zðâ‹/RTTÔ ^¯‡£¢ÏèÑ£±m›>úˆcŽ9‡Ãòл¨¨ˆ'Ÿ|˲p»Ý3wî\,ËbäÈ‘„‡‡ã÷ûyþùç¹ýöÛIHHJ½| ½E¤IªË€ZÁ·ˆˆˆˆHÃŒß^{í5233ÉÌÌ< ×pïÞ½yâ‰'ðûýøýþ×ùÜsÏ‘““C¯^½*NiYYYY<õÔSÜ}÷ݵ¿¶j[–Eqqq­ç¬Íózà 7——GóæÍÎS°~w=x Û¶ñz½tïÞ¿þõ¯ÄÅÅ5ˆÐ`üøñ¼ÿþû¼öÚk†Á€‚Ò*¦²ßZkxx8)))øý~ÂÃÃq¹\ÄÇÇWüÁÃív“””T±²^ù@Ã¥Ð[Dšœò“Mª§·ˆˆˆˆÈïS0~HOOgûöí´lÙò€±@E[†Ú FmÛ¶¥´´”V­ZUŒ•˜˜Htt4ééé¿Ëßajó¼:’’’jýêªëOš5k´Ö$Á¨ÕáppÑEqÑEUŒë÷ûDèít:¹ãŽ;*þh`Û6wÝu@EwÝu¶m¥½Ô…Þ"Ò$)ô‘Ú3f ãÆÃëõV´åhˆ.¿ürœN'§b¥wJJ =ô¦iV´¿êiŠm-Ë_ Ey ÜPÜZÇçóp;X­m¤n)ô‘&+ØoTt"K‘Æ!Á¥×ë­ó`.uVÀ™¦”6!Uc ®UkÝhLµJÝPè-"MŽmÛX–…Ãüº¼uŠˆˆˆˆˆ4Lå‹UÃûvsu£1=¯ªµn4ôZ Ãк:¦Ð[DšœòÿØòp"""""R7ؽ{7iii >Tr:¡.¡FËêñÆô¼ªÖºÑkµm›ÌÌLB]J“¦Ð[Dš$Û¶ öûÛòäÊÒEDDDD®Î;³aÖ.]ÚàÂ|ÿý÷¡.¡ÚÖ¬Yꪭ1=¯ªµn4äZ à !!Î;‡º”&M¡·ˆ49åc öÉ:ú*·ÛM¯^½ôþ=ÈòÊÙƒ5äŠu’YÈz‹H“Sz×ÅJRDDDDDDP˜T$‹Hc¢Ð[Dš,Ô""""""""¿? ½E¤ÉùuEvpCoÃ0´Ú[DDDDd¿@A.ÅWãNH u)"""Pè-"MR0BoÛ¶°*a¦e¢Î€""""ò{(Ìç§+N ]S^ ÝÜ""Òà)ô‘&'X=½¿Ù4‡ls‘îH|¦—@A8§w„*EDDDD¯]o=êDDDK¡·ˆ49å¡wmO^c;JéÔ1œ„¸²Ð»¨ÔÁÚÅÁ(QDDDD¤ÑòîÙIöüC]†ˆˆÈa)ô‘&%˜ý¶M;@‘µL'`ã1Á´#ƒ6¾ˆˆˆˆHc´oî»Øf Ôeˆˆˆ–Boirlû·õôö™>,ë×7ï~Ó‡Óôâ ûï7ð[. b{ÙÅͬP?\‘zãݵõmFשô˜zÚƒµòßÁ ¼[\Hú%ý0‚7¢ˆˆ4aZé-"MÎo^émÚx‹ Üþpœ†ÓåÄfⳋ·…és˜˜¶°q˜5ŸGDDDD¤!³MËSŒ3:îûü¹ÕÃ9øa:¥<ÏÆ=SèÙ)] ìÆûÝJZ”~ƶí“hÿ‡ÎG˜oŸþãF^ù%pÈ]îäùke+Ò­iÂz‹H“cYVo€îi}éNߊÛÅë³Ùé[…é({Ãlù!‚XNjóºtîpırw-åë×áp†›Üƒ¤Ö'“ÚiqÍ{׸.‘ ±-0ìtº{æ+ìõÆ!»–lYwÈ6ÃéÄ6ÍLhÈÉÆðû°a¸›·ÀÝú Ú¶¶ÁˆÁ¶–ãr€ß,ÛßóÙd¾œöw¥ÁžÏÉüoyqÿ÷³ðÞy&l>Ü|Qt8é ÎloRºe1_­É#¹ÏpŽmíÆÕ¶ aìoÏâ0z‹ˆ4a ½E¤IñûýdeíÅã³p8j·Â://ŸÛé7Á¶±à/*¢¸¤¤Ú+É-ÓGþž•äïYIÆògˆKéIûc®%µóYZ.""""õŸ›Å¾/> ÷Û¹x3·‘~ý=$ž<²âþØžÇýÅLp8ˆl×™ðæ­p7K!yø9‡Œ–Òïîíµ¨ÆÂ·wÞÿfëܽàN&<у·"GwànMɇ'÷7‘çN£å óÈØKöÆKÀé¯zx#šîg\N/‡ÍÞO¶°pM!­_ÄÃãÀ2ñçn ÿ6æúq/¤ôáìkÿÄè.QG+Ü»…Ï_~‰™K·gE’ܶ£®¸†éîZ<·""RN¡·ˆ4)átë’NaQ¶}èGk"Ìeã°¢‰°ËÞxúl“èø8ÒÛµ9ê±±IÝHIFAÖj ³×â-Þ@AÖj~œó'2–?KSî#1í¸ZÕ(""""r8þÜ}lŸþ/ò—~‰+Önþ IDATmþúÞ¸hÍŠBïøc‡Ð÷µ¯«5fxj›*Co£ëet¸ý¬²ÝÈZr¸l| ž§hÊtèš…Á£ìÜ[ôë.‰Ãh}Þ˜…&Îèuä|U€íØ@ ç5´t?;¿ZÃúv|Ëôc™6æþsÎÛV¿ß_ie·ï§y|{Üp† ÚÀ‚/à½WærÜãh]¼„龯wÎþœ{Õ@Ìoßbæ OÛêA&¦8pàgÍÌ8FcbËo˜1ç;þsïJ:Ï„3Wò¿VðÎŒ…œ|çHšn¬8cëÛ¼úuÍ_ÄåJؼ¦ˆØDE4""Á¢Ÿ¨"Ò¤¸\.:vh”±Ìx/k2›cìÿýÀ6 ½K{âzlDl+ºœt{Åíü=+Ù²òeöf|†ðP¸o KÞ?—ŽÇßDÇãnÄ8è#¦"""""µ•5û-ò^qÛá'iø9¤M¸ê7žÖV~wÀ6{Ý㬾æÐ} ¸Š&)Û_bÝceWw?~Ãaf°ð/{œMËÞþ›n{G—Ú7&q´Áo»Œ.lµþ/üoo&{LH^µˆåùNÒ'^Ä9ƒ[b§g±ôö™¬øaçŽ(;ÖÙúT.½x|ñ¬™¿¥±§pé”sèi·gû—«˜Ÿ½ ¢Ž0Ö¨–ḰÈÛ¹ÿàs¸lL+"~L»ÖMDDPè-"rXǦàØôA+¾E?úŽ|_É>Ö~s»ÖÍĶ-6~ÿù{VÒgÄS¸Ã¦‹ˆˆˆˆTWÜ€Áä|;‡ˆVé$Ÿ6žøÀpÖ®Å^L÷þd}úv*¬©0¢Ï¼›–ýsÙ‘U»‘œ-ÒH2ýìp¢¢ ȶ›¢ü|üv€Œ·oáŠ‡é ¹¨¸âXGR2‰V€.ÂàhÖŒ8+@Àvf€ecq¬¢OœÄõ›‹yù³ù¼rÿ—¼ßi7Üv!}âÕi\D$z‹ˆÔ£°¨dúŒxŠVÝÏã§¹7à-É"kË|Í8“ãÆÎ 2¶u¨K‘F¦xÃ*vÿo:áÍÓh}Ù­e½¯˜nýèõ쬠Î×÷ §ë€v)õÇGñì;Ø0˜òbí†r:)‹ÿ+/­6ˆIˆÃe¸hwöÿ1处ý-Q \q-pPÖ²‡ãÀ“`UóÈcFÇ]zÇ[Ïçӟ䥅ŸðîÂáô>+U'Ø }ž^D$’Ú âĉ³+zz—äocéÌóñe†¸2i,,O Û§ÿ‹uw\Nþ²¯Ø;ûm|Y»êtNgT ±=­Ó9B)¢ÏNH0ÙüÕ‡|ùÓzÖ¯ùoçÌc]±»ÆaôáÇr±ï«iüë…7øøÛ J 7œDF†×Écù=Rè-""1©?î’Ú  $+Kgž·¤–ŸÕ‘&¯$ãÖÜ2±¬Õˆ]vÆÆäSÇ–Ò²ÎçN:ulÏ*Fô±\yçuŒhÃ73þÃô7>bÑN15_}¤±ÂcÃÉ]1›7_~‘·–yè0ì*.ÒL«¼ED‚¤®~žÒ×£mãÛ‚þãO+½EDBÌátÓ÷ôçHlYÖê¤pßÖ,økˆ«‘†,é”ÑD¶íDê¸+èö¯·ê-ð0œNÒ&^[oóýV¶éÃãñüx—mÄçñàñ•Ì6ŸOyà `™ø}^¼¯ÏiWu¬‰ßãÁã ì¿má÷zð”ÞG˶üø¼eÛ</>Þ""A¥YŠˆ4§›cÇü—E(g;×¾G|ê1´í}I¨K‘(~À`â ÙüICÎ${ÁG”nݲDDDG¡·ˆ4zæÖ…Ü6}ƒ§œËØVNÀÏwo΢àôs8½YãéŠçtGÓÿÌi,zg _!kÞMB‹~Ä5ïêÒDDDD$D,¯‡íÓÿEñÚhwÝÝDwíê’ʺücZȦß>oEÈæ‘†OíMD¤ 0HêœÄæÏ–²Éà=¶'“Yo~Èã3æðø+s™»}o¿°€Ÿ`í[Î=÷Îæ›°K~቗W’âÏF'v¢×ðe½¾þâl+Ú¢DDDD$$¼{v²îÎÉdÏÿÏ®­ä-ù2Ô%‰ˆˆ4 ½E¤I°ã»qQÿ‘FÄêDDjËÙnw¶ûõv\ÓxâÞò[iŒ¹pÌ!Ç »l Ãö_ï7~2OÕu‘¿QÏ¡°ðõS°Lë¿{æíOÃpèG·ˆˆˆHS’ûíÌâB’OÆþµi†GxDh i¤”œˆˆ4`‘qmh×ç26ÿ0â¼ ¶ýüíúNuY""""uÎ,-!û‹™D´éˆQ+Nb{é*j³¸­Ïþ¼%_àNjAü€Á!«§¦¼™Û(øq1-Û}ç s‡`Ni,z‹ˆ4pŽ»¿¼ƒß“Ǧ¥OÒºÇDœîèP—%"""Rwl›'Õ}ø›þ§ÐlÈYu>OU V.bË“w(ÊÀKDë!©å·ðçf±ú†±¡+`Ê‹¡›[DD<õôiàÜáñ´ï5¾Ò¶þôjˆ+©[9ßΩ—yv½õ,–Ï[/sUVôËl¼ÿúŠÀ;ªcº?üá-ZÕ{-¿Õ®7ÿêDDDK¡·ˆH#Юߕ„G¥°eåK˜Oˆ+©vÀÏÎ×ëçŒ+¾ì=dÏÿ ^æªÌöûÀ¶1œNRϹŒ®ÿüaÍOàíÙ¹…œ¯g‡º ‘ÃR{‘FÀéŠ ½ÿU¬ûö~|%YìXýíú^ê²DDDD‚.oÉüÙ{êm¾¬9ï‘2ò¼zííÛg ]ïW\á-Z×Û¼Á’5ç]lË u‡•œœêä fI »ßx›]/¾B ?¿Ê}œÑѤ^8‘–S&㊋­ç '¯YÂW[ÿËÜÍ/RìÏ«rŸW4h{1§·¿šHw\=W(G³oß¾P—Ðdi¥·ˆH#Ѷ÷$Ü l^ñ–éqE""""Á·oîûõ:ŸgGÅ›ÖÔÉØ¥Û6’ñ¯[Xuí( W/?à¾èνeàmù¼ä|ùq¨ËFÆE««&sÌ—ŸÑöÖqÅDzY\ÌΧ³â”‘l{äI…!¨´qðš%ÌÍx;¾ü3×ÿ«ÊÀ;Â͈Wsÿ…Œír›oùÝÑJo‘FÂ鎦]ßÉlüþ1oÁò¯‰îÔ3hãå/ýЬ¹ïR°rѯs¬ø†Øž‚6G¨þ¼³´8ÔeH#U~§^tþaW~—‡ß»ßœ¡•ßÑÊn‘êÓJo‘F¤mïI8œál]ùrˆ« ®¢ÕKCÒ6#Å·A+{þlzøæï¸~'Ñü¬ ƒ6G(þô}¨K&@+¿kF+»EjN¡·ˆH#™D«nã(ÈZEnæÒW$"""<%›×Wk?G¿?Ñö”ªOüèü0]Çu &ºK·nÀ6ͶiâÙ‘8¨åœÃ €át‘0p]îy‰Nw<;1¥Fã7T¥[7Tk¿#}j£®Æ•ÐPø}d »E~;µ7idÚõ»’í«ßl¶þøÓŽ uI""""AáݽýmFשt?skŸGùpkå¿ÙÄym3€oßnÂ[!Lµmò—/¤xÝ­û‘Ò-ë1K‹‰0˜Žy¢b·¤SFÙºîäTÜ IA¬²aðdúÌ×Ç÷¨\Ÿ]ê`p µ=9Ú˜ˆÔžBo‘F&¦Yg’Ú "{ûBölúOáN"bµÚEDDDËçÅ·w'Â|…y ó±ý>,O %Õ;¡¤sðÃtJyž{¦Ðyàv 2ݸһÂü»ØY¾“»#)7ÜDØœ;ÉôžM» ½± Mœ;Éšöo òíÆ\w×å8Ã"Á¶0œ.¢:öÀŸˆ3*GX%›×’ûݼCj)Ù¼Ž=¼R»'¥ äeWk¿#}¶ýÜ’W_E´™Ñ6…3î'+£tÿ½hu÷h ï}€ÂäKé|_OöÝøgrŒQt¸1Ž]_÷£]òóìªÃÇ(¡ó{¿v‹Bo‘F¨mïIdo_ˆmØñË»t:þ¦P—$"""rÛ4)ݼ–’Ík)Ù¼ŽÒmñíÙ¿š¡iõ&1p/g÷[‹±;\G×Ñý0V®–$^u_þƒí« ‰;çO÷ñÉ6HéBXL¹Ù*Ý®jEsUü9{ÙùÆÓAy8MÒ!ߣþD¦L >ãŸløp+´¾‚Î ïáñÛ€¹ž‚-mˆm릴]|+¼Dw#ÏÙÇš7ØýP§Ö¦ï÷~+ì >…Þ""Pó§“Чh7;y‡NÇß5ê\)"""|ÞÌmä-ý’Ÿ—R´v%–§¤Žg´ädcø}ØNà lØÍ´Ì_ÄÖW³Ïg=úrÚß•{>'ó¿Õë.Ápð÷( wó¸[_AÛÖ61ØÖr\ð›>ŠÚMóîí‰imRðÙzbïA´+…’ï¶b·½ï­žÔÔTRRRX±bn·»bûŸþô'bbbxðÁk<æùçŸO§N¸ï¾û‚Yêa5õð»!…ÝMáõ"R™Bo‘FÈ0œ´ì:žŒåÏPZ°œ‹iÖêÄP—%"""¿C‚\²çHö׳ñlßTõN†;!‰Èv]oÑ w³æ„%5Ç›€+:Gx$ŽÈhv½ñ4¹‹m!R3þw±íÚ_>ŒŒg@ËhJ>ü;¹ï¸‰°†]Û~!â¬q4 ßLöVZú=ªóÀð·¿ý-Ô¥ÔJS ¿RØ]YSy½ˆ€Bo‘ßÄ2ý˜CW.¼ùUì]7ZuŸ@Æògعæ…Þ"""R¯ŠÖ®dßœwÉý~>¶ßwà†ƒ¸~'Ý¥7±=Ž!²}7œ‘ÑG3²}×*Co£ëet¸ý¬²¨3ðYKŽ<Ží÷â_ü»º=AÛÓ6²=g­Ï»³ÐÄ½Žœ¯ 9&nÀ`¢»ô>â¸fi %¿P´zEkVP¸zYÙ|–IÑ/?PôË„5oIÊéIv6Î膸ÕFD«öU†ÞÕÿÙøú/“""""¿™m“÷ý|2ßFé¶Üå$iÈ(â#¶ç gÍÝŒHk{è”ëgõ5‡î[[ßκò Û_bÝcŸUl+üÏd xœMËŽ0±aѦÃQësFFÛs±=e!xÁò¯Ù÷ùL ׬»lóÎ×'sÆó¤Œ<—ÔqW4©ð;<(ß#Øýø ‡ŸÄÞǾ†±oÿÍüçΤâ÷Âÿ+oJKÿ]êСþóŸ¹òÊ+ùæ›opô)„üü|Î:ë,ž}öY&NœH^^'Ÿ|2iiiLœ8‘Ë/¿œO?ý”¡C‡²|ùrN>ùdzöìIaa!gžy&<ð“'O&++‹N8N:1f̘:\-ünèaw¹¦úz‘ß'…Þ""5Tœ—òÀ»\«nç’—¹ Ó_Âî³iÕ}B¨K‘&ªpÕ2v½ñÅW°=¶ç±$Ÿ6Ž„Ã0\îÃ]=1Ýûƒá»~WòF´J¯ÖJôƒ9#£Ht:‰ƒNÇŸ»¬9ï²oÞû r±¼¥ìùè¿d/ø˜´‰×|ê8 §³ª¯_1=°÷“7C]†T“mÛÜvÛm̘1ƒgžy†ë¯¿þ€û,X@XX'N !! /¼>úˆ´´4RRR:t( àøã`þüù8&Ož @JJ “&MâÍ7ß jˆ™››KVV¦ibY‡ù¹pÒ@¢NxÄq uÛ«wrÚºÒŠA\ž:èÈ;ù!cýö*ïr88NRRRHLL¬ƒ ÿëE¤2…Þ""5”’>œžÃ¢4ëa÷‰NìT/µ¤uÃÚ…Ç xرf†Bo :ÏöMìxí V~W±ÍpºH<ñTRÇ_AD룯®.W|3¢;õ xê YñýO®õîÄdZž-©ã¯ ÷›ÏØùß'æ(ÌcûK’õÙ;´¾üVâú9œkèâúá;´¥4X.—‹—^z‰SO=•³Ï>û€ûvïÞMJJÊÛRRRسgûöí£Y³fÜ—œœ\q\NNééé÷ù|>z÷>r‹ šÊÊÊÂï÷uÌÆÊ²,,Ë"++«ÎBohܯ‘Êz‹ˆÔa8hÓóÂP—€+,–æN'sýäîZBIþV¢âÛ…º,il3Àž^!ó½—°ûC'ÃAÒ3I›x-aÉ©u2oüñCë=ôN9"¢ˆë}<ù+¾ u)RÇ{,“'Oæšk®¡K—.ÛÓÒÒÈÊÊ:`ß½{÷Ò²eKš5kFNNÎ÷effÒ£GZ¶lIZZ[¶l©ÓºMÓ<úN¿3õñœ4Ö׋HeM÷”Ò""¿­»Ÿ·ÿšÍÎ_Þ i-"""Ò4”lZÃÚ?_Ì®·Ÿ«¼cû ¤Ç£oÓîÿ¨³À é”ѵn“RÑ]zÕ©gÐÇ5œNRFN çÓÐü¬‹Ë6Ú6ûæ½Ï/·žOÑÚ•AŸ³¾$Ÿ6.Ô%Èopß}÷±víZ>ýôÓŠmC‡Åï÷óî»ïÍ믿΄ 4h»wïfÞ¼²“Ë~ýõ׬\Yöº=å”S(--åí·ßÊVíÞzë­Ìš5+¨5Û¶Ôñš‚úzNãëE¤2…Þ""\³6'Û €kßÇ®ç˜"""ÒtØ–Eæ;/°îŽË(ݺwb n{”Îw=KD›Žu^ƒ;!)¨+¯¦ÅÙ—ÕéøÎèXZ_:•nþ—ˆÖíðîÞÁ†»¯"sÆóõÞ¿<â &<µM¨ËŠŠŠâùçŸgýúõÛâââ˜5k=ö]»våä“Oæâ‹/fòäÉ´jÕŠ^x«®ºŠ¶mÛòüóÏ3qâDLÓ$66–Ù³góì³ÏÒ©S'ºtéBnn.C† j͵ x‡ B¿~ý8æ˜c0`@ʼn³³³«=ÆôéÓ8p wÝu×o®cÏž=ôêՋ²ÓêΛ7}ûöå¨Ã«¯Ð»1¾^D*3êiܪæ1ª¸~¤mU}5ªy»üâ¨âº³ÒuG¥Û•¿VuT\\|@„qàÇ7DDêÛ†ÅÿbÓÒ§8~ì šµ>)ĉˆˆHcãÏÙËæ'ï¤hÍòŠmIÃΦõ¤©8£cëµ_Ö.Vß8¾ÎûFÇö:–Îw¿P§sTfù¼ìzóßœ2®ßI¤ßp®Øøz«#r}ÎæÇþ²ùwMy‘U«V1eÊ”Cî+ï#,ßêÕ«¾Óa 2„¿üå/œqÆx½^222xæ™gX³f o½õ-Z´8êãÇç /düøñ¿¹Ž={ö0|øp-ZDll,cÇŽå [·n¿yÌž=ƒÿé ªþ2mÚ4nºé&¢££ï¾ÌÃ\¬*¾Ú•nÛ•¶|½ò…jÞ>Ò×£mãÛ‚þ×õôiÒºœSzïÞø‰Bo©‘üß°õßw(ÌÊV[·rñÇ…f^XJKÒÆ]Aö—ÕÝ$†ƒ6WÔohë §õe·×ïD¶üûnù9¬ü޵¹˜·®ï ¤_/®øf!­-õÜ+I=÷ÊÖPWâúD÷‡ß ãÑ?S¼þ'|{w±þÎ+h{Ýßh6èôP—W=†A‡ÿ{4dÓož·"dsKãåp83f /¼Pö ââb®¹æ¦NÊØ±cÉÍÍå‚ . mÛ¶<þøãœsÎ9\}õÕœqÆøý~n¾ùfî¸ãFÅ–-[;v,'œp‰‰‰Õšÿ‘Gaîܹ<þøãµZé-"G§Ð[D¤‰Hí4ŠÂ}¿à-É"wç÷Zí-"""G(ÌgË“¥àÇÅÛZ]t=-Ξ†NÿT×ÜÍšÓåžÙñÊcd}6ËïeËSwâÙ¾‰–ç_«ïU`Í—xßû;vÁÞP—Rw.7èC¦¥¥QPPÀ÷ßÃá`ìØ±$&&2fÌ>ùä†zÀqn·›¹sçV¬äNOO§M›6lݺµÚ¡w° |8³^ç«OÉ1NnÏ Žá¡.E9…Þ""5d™^6,þ¥;»O\ó^tðÇz¬ R;ņÅjq""""GV²yÜŠoï. ¬Iû›"¦{ÿWöûb8]´¹âÿˆêÐm/>€í÷±ûÓñlÏ ý†{qDD…ºDiÀ¼ïÿ£iÞu$33³¢Ÿ÷¾}ûÈÏÏgĈ_Ožë÷ûéܹs•Ç~üñÇ|òÉ'˜¦‰aìÚµ Ëj|'£mÈö™<8'ŸY×5u)ÒÈ)ô©¡½›?góŠ#ŸðÈ ”€z*h¿èÄŽµ8¹C+„DDDä Ù_Îbû´û±ü^¢»ö¥ÃÍân¦€!T’†Ž!<­ÜJ ?‡¼¥_²îÎÉtüóã„¥¤…º<‘&ò,>øàƒŠUÜÍ›7'%%…¹sçõØo¾ù†'Ÿ|’·ß~›ôôtÎ:ë,œÎ²Ö’¶ýë¹øŠŠŠ‚\½ˆÔ„Ò‘JL;ޏ”ž¸Ã㹄Zj§Qû[œ,>ÊÞ"""ò{bû}lñ¶>swEà|ÚxºüýÞ @L·¾t{ð¿D¦w tëÖÞ>‰¢µ+C\™4TáãïÆˆÓ¿Ýê°m›-[¶pÛm·‘““Ô)S8î¸ãðx<|úé§Àÿ³wßñMUÿÇ_7«{ïm)”,ÙÈFÁ‰Š¨8pÜ âü¹¾î‰‚ ‚8Aq°Ù– ¥”îݦi³ïïBZ ”¶iËçùxä‘äæÞsÞ )m>9÷œŠQÞ/½ôüñG•6 ð÷÷'::€Å‹“ŸŸOYYÁÁÁèt:öï¯XØ5%%…¤¤¤j³èõzŠ‹‹ëãi6 ÁÞZéúÏ֢铑ÞBq–ܼBé;iEµýþIoÌÆSO{RßÂFË'B!„¨Âš—Å¡—Ät`'7wZL{”À£]œLÏNâ³’òÆmü {qûŸ¹èî#dÄxWÇŒ®ý tOüîêõkçÎs:ü‘Gá±Çü¦eÁ IDAT 00Aƒñå—_âëë €——ï¼óóæÍãõ×_ÇápЫW/zôèQ¥­áÇóÓO?1jÔ(¼¼¼¸ú꫹ùæ›yóÍ7‰ŽŽæàÑG%""‚˜˜†ŠÃá¨ÒΘ1c¸óÎ;™2e wß}w­ž×ßÊ Bœ‰Ò@íV×RÍíÓm«îZ©áýcM5·µÇÝÖwÿøëê.ýM&Ólw¥ š§'„8+z‡Ä¥û¥Ÿ¸$ú…#0æíÆÍ3„AS7É'B!Äy®hã菉ý öÒŠ‘…naQÄßÿ"±‰.N&NIUÉøòm²–~G§K:Žè›B£7¸8\ãðê-$%%UŽØ=^pp° ‰ú°ó‹ÞÍU‡\AÔ‘¼¼¼*ÛÞ{ï=î¹ç¼¼¼fkÇ).Îj®Õãî«Çm;ùöñjxÿt×gÚÆi¶U·Ï9‘‘ÞBÑÌ„'ŒÆ˜·»bŠ“Œ¿ ŒêãêHB!D£dNO!wÅ"¼Ûu¥îÇùtì‰ÎÇu§h«6+ió_#wŢʩ_·þÄÞõ,Z/_—å5 (D^};-ZqøígpZÌäýú-e)ûˆ¿ï…F3Ï·iß¿®_‰Wbôè‚>…B4RôBˆfæ„)Nöÿ Eo!„¢N‹™]÷\ @îŠÅõÒGà€Kˆ½kv½´}&eÉ{8ô`ÉL@Ñꈺæ.BGO®—¿¨ýFâÓŠä—À’™JÙÁ]ì¼s±wÏ! Ï0—f³æ¤³÷±*îü¸ áL{¿áûBÑdÈ9ïBÑÌx$àX±Rvò TÕéâDB!Dã“ýíÇõÞGÁÚ”%ï®÷~Žç´ZHÿâ ö>z]eÁÛ-,ŠÄ9:fм›  ´}~>þ= :ìzå!½öS‰Ër¥ñ¦ËúçEþϪB^!jFŠÞBÑ …µº‹)‡âì­.N#„B4.vcÙßͯÿŽT•¬o>¨ÿ~Ž*ÙºŽ=\Mö·Ÿ : ( ¾Œ¶/.ijUûË!êžÖÓ›ø^"꺙hôn®]Á®{'R¸~Uƒç)OÙKᆆïWœ¤À[•¼&BÔŒ½…¢:VôÈ>ø³ “!„OÞʯqZ- ÒWñæ5Xó²êµò”}xî.x[an½öï4—QPOïi!N‚^¯G£‘ò•F£A¯×âê(B4 ²¥¢Ù0šÊÉÍ/Gop?㾪êÄa+!¾eh$s°ø‘¤lûSáAJ öãØÚÕ‘„B—+;´·ÞG^Ÿ¬xóÂÆÝP7©NJ¶ÿEîÏ_S¼éòë1¨É3piU7}‰FKÑꈘ8€~#HûôUJ¶­Gu8Èýù+rþŠàa—rÉ$úN(Dó#Eo!D³àt:).1áçJ@Й Ùªêdÿž$ÊÊk÷» èµZô=uFµÐø¤l«˜G4'ùg)z !„€1éŸïÓ´oS Z/ßZ·aÍI§`ÝJò]Š%;ý„ǼÚt&êš»ðn×õ\£Š&Æ=:ž„ÇÞ dÛzÒ>}µrŠ“¼_–’÷ËR|:ö$xø•ø÷¼Eo¨yêzÊEOÿ6üϨððpBBBزe zýEÔ3fàííÍóÏ?ÖmNš4‰„„fÏž]—QÏ^)vcðÐ1ðºzOˆ=eñÛRfçÏÏð÷×).)~7ë÷‹8/IÑ[Ñ,dåa¶(øzSœŽ¢hñòñ#'¿vóyª€Óa%*ÂwCãü> òBôîØÌ…d'ÿL|®Ž$„B¸\ùá}uÖ–vÀ $„¼Ã¾%Éœî/Õé¤<õàY¥U‡ƒ²ƒ;)ÙºŽ’m0ÜuâÊŠ¿®} ¹ø*|»ö«ý“Í‚ï}iש…ë~&gùBÊî*¾ä1&ýƒÖËß.½ è3 ó>õ0–ÌT²¿›OÌMFAÑœ8pyÊÞz}.¢n™L&æÎËO<áê(u£‰»OÖØ‹ßÍîý"ÎkRôB4 ¥¥fâZwF«Õát:kp„JtLl­ûSU•´´CجöF[ôV-¡qÃIß½˜âìíXLÙ¸y…¹:–BáR–¬#U7êã šz7¾å8œtÞVJ¾œCvѥĎØÅáùÛN[Ô®i¿§*z;L%X²Ó)O=ˆ9u?¦;)KÞ]í:¿@‚‡Œ%xøB"Ï1•hN­–À£8 ÓÞíä,_HÑß¿¡:ì8LF ׯ¢pý*P4¸GÄàݾ;žq‰x´l[dKt>þ8ÊMäý²Ó´zðeô!(ºÿJ–ì´S$Ðá9önBBJ)˜ÿ.ÆãÇ–(ÊI_Ú(²f™7o·Ür ãǧ}ûöÕî³aÃî»ï>òóóQ…Ë/¿œgžy½^ÏÂ… yüñÇÑh4ôêÕ ‹å¿ØÍ›73sæL²³³ÑëõL:•{ï½·~žH/vŸ¬±¿›ÍûE¤è-„h6TTU­aÁ»¢h}¦Ñà5è²Ñ AúîÅ€JvòJZtºÖÕ‘„Bˆe7QvpöâìÆḃ«ì£´ºœPÏÙ÷âJ€Ú— ØDÅ'¡á»œ£§£¾{9YN´=ž$¡ý·~Ýà×s0~]ûžÝ4â¼ä•Ø…¸Ä.Øò³)ܰŠÂ ¿`ÚŸTQhV˜3WùYÐè݈¹õQ Á@ňîÝ÷M¤åOâ×sŠ¢EÁ^RT}§ž} ðÝDÆ_»0ãš4ýçѺOKyoϧ¬×q÷çïÂûÆëñ°€¯æ– ™0ã³s1_OëÙÈ»û! ”ÑÄßíKÆbã;¡hÝÓÉ(®ïW±yˆç¡‡âæ›ofíÚµU„,..f̘1üïÿcâĉѯ_?"""˜8q"7Þx#?ýôƒfóæÍôë×:`45jsçÎeêÔ©äææÒ»wo¸ì²Ëêî 4³b÷É[ñ»É¿_„8޽…¢ nqZ{99É+¤è-„¢ÙSNJ¶­§èïÕ˜öíÀœžrÆ¥jÊ ò•»ˆ»=ãî1íÙBþÆ0o#´ü'²6mGç[FüÀÖä.NǧO$%ß%¡¶Pp2¿ä9ì_v¢o¢õ”½° ÛqÝ:-å8-å§Šp»'-ðë֟νðlÕå¤Âƒ5¡ #tÌ5„޹[Q>Æcü÷oLûþÅœ™zÂφÓfÁi1Ÿð>u”›H~ù!¢o¸ÐQW :ìÕô¤ÁÐêæç±íÍÂ~ëhÜ×ÍÇê½yÞø ©¼ÿ'ºKßÅgßÓìÿ! %â:ZOkC^J Þ-ô”·ŒÇºÅ‚WkEÚ®hv-DéðÚÏüc*„´qëùÕkTUå`Ñ¢E¼õÖ[Üyç'<þÛo¿a0˜8q"þþþLž<™ï¾ûŽˆˆBBB¶ÇKBÙúC”gÌ%ÿÒ‰{<²!­ ü-ÞXèt:>øà† ÆØ±cOx,++‹¶…„„M^^'<\y\AA±±±•Y­V:uêtnaϳb÷ÉCñ»I½_„8 )z !š0›k·(em(Š‚Ýaç|ÞÇ IvòϨN¹)«‰h3öÌ !„M„j·‘ýÃd}ó!NsÙ y´HÀ»]WxcÒ?Çí¥ ë|Á†ŸÈÞtÓÖ#˜(x=Ñ·­TÌ= `ZGþk ¹&eãóXœP±¼Ÿ[N–´79¼2ôÁ¸˜±œTð:Ž‹¯Â’“½¸€ò#±¤¦,e/vcQµ£ÑVKåB„_¼{T,Aƒ.%hÈXt¾uø*Šó‘ÖÓŸÝñéÐý¿N'ùþTüü´œñ -*§6p Áœ–|b[ÝÆãñ÷ÃüîpŸ ñÄMŒnsÕæ+î;±æá ¤¡Ç`(ÌÀ¼«Ç€«ñ³ï"#u7îc® Ðíù‡Uô-½([ö…‹õxŒ«q.N¥GL:•éÓ§Ó¦M›Êíäææž°oNN‘‘‘RPPpÂc™™™´oßžÈÈH"""HII©›€çy±ûd®.~7ú÷‹5 Eo!D“W^Zˆµ¬€ü¬dT§Ú °E¡ÌTL¹ÞC:ƒ{ôZ;¡qÃ*og\!Eo!„ÍFÉŽ¿9òþܧԅ|8þù'Û¶mcèС 4ˆòòr¾üòK&Mš„ÕjåÑGeРAŒ3¦æ¡¤Ø}Z®,~7Ê÷‹gAŠÞBˆ&MUÚ¹oïP(;‚Ò€}{)*¦¼<¦\"ZukÀžÏŽÞ=€À辤­'/õwœ+­,€%„¢éRN²¾z—Ìo>µbâ}@0áWÞLðð+O;ÿµ{T˪K6“õêfªNŠò5øºòžF£`Û°„"cEiϱæAö},ëÕ»N›Ù=æÔ:AƒÆ4h öÒò~^LÞª%Xó³+÷Ñzû¢ZÌ8mVT›•‚5?Q°æ'Ó6N³­ÎOÚ—‘ÞBˆ&O«Óa·šÐéö¹¢(Ø-¥è½ý´ßÚYYôÎ9¸BŠÞB!š$[Q>ž½òÔƒ@ÅÂ|±w?‡OÇ5nãE†àð³\ìÒŠiùcì_~–òJìrVoE§'dä\BÆ‚7Éýù+PUŠ·¬Å«M'Z?þ?ò~ý–¢¿¡Úm”îÙÆÞYSñëqÑ7܇[XTíŠóÛiŠÝÇøtì‰Æà†ÓÚpëéˆf@ŠÝuÊÕs~ Ñœú¼?!„hEA§wÃi·‚êhЋª:°ÛÌz>ïc<|£ñ é@ΡU¨êÙPB!\Íš›É¾'n®,x»G¶¤í‹ Ϫà}Œ¯!uï´úލõ±ZOobn~˜„Çÿ‡!8Ó¾9ôú,B/½†öÿ÷5ý/¥â£]ñ¦?Ø}ßUäüð9ªS~ß‹º§1¸áÛµŸ«cˆ¦ÂQŽ#m!ÖMq~¯ú‚·ÖmôÕz,BÛrš¼Ï±â÷ƒß cäíñð­:å±â÷ —­âç·va6Ú\Tˆ†'#½…Mšª‚Vg@uÚQŽí[Q48ìVôúÆ_ôAIn–²\г·âÞÝÕ‘„Bˆ±—²ÿé[±d§à×­?q÷½€ÆàV«ö‚‡]AÎò…ÿMåP´^> :÷Eº|;÷¢í 8üæoY‹½¸€ýOÝJܽÏw÷Â.»Ž#Îôw;N‹™´O_¥pÝJZÞþäiç¢6‚‡]AÑß«]ã¼ç,Ø€ãà˨Ö|WG©ÚÈ h#¯í™§§§v¬øÝëÊXÖ/JfÝÂäSŽüþó³.JY3¾ÁîŒ}¤ mûW]ŒZˆ³!#½…Mš¢(hõv+8 zQUN» [)zÇý7Ê,ûà &B!jÎi1sðù{* Þþ"þ—j]ðpŽÃ÷‚¾uñ´B/™X£¹ÆkBçãG«‡_%lìõ8-å$Ï›Iáú•xÆ%’8û#bÎÇÓì~p 9?|Þ ~qþðíÒ[¾Li_išoÚS1ôøm̵Rð®Cn^:OmÃßcØ­m«ùÝØ•ä™YöüvWÇÍ€½…MžNgÀé°£ªTgÃ]p:±;lhµMã ßxøÆ“¼ÒÅi„Bˆ3SNýߣ˜ö'à×ã"âî{¥Öñˆš<£rJú¢ ­,P×ECÔ5wsÓƒ@Åk”òÚcnø€ÀþÓþÕ¯ è7²âq»´O_åàó÷`7ÕmqþR¢¦Üéꢩ‘bwƒiÅo!ΕLo"„hò4zwŽ£#½ë~ÁßSª˜'Sm2Ó›„Å$eÛ˜Š’)-Øw`kWGB!N)cÁ›oú¨X€2îîÙ(šº)T{Ķ!|Üõ”lÿ«NÚ«Nø•7ÕÙ(ï“…\<­§7‡ßzª²ð­Ñëñëq:¿@âîyÿ^C8òÞsØK‹)Þ²–Ý÷_MÜݳñn/Sœ‰sç×}Aƒ.¥<µqO•Мi[ÝÛ4¦7Q4ÁÃеºG Ý ìXñ»ïÄx–½°ƒW¦ãt6î3|ƒÝûpWÇÍ€½…Mž^ïQ1òZu¢6à©»NÕŽVçV£Uî‹Ðø¤lû€œäRôBÑh•lYGöwŸ qs'áÑ×ë¼€9y‘“gÔi› )pàhT§³¢ðí°sèÿ¥õ“ïâÕºbñê€>ÃðjÝ‘”×¥tÏvl9ìz:‘Sî"ìÒkšÔß0¢qjyÇS.ëûÀª-.ë»±ÐöAøµ«cˆ&ÀÍKÇUOw㪧»¹:Š F¦7B4yZƒv§p‚jo°‹ÝfFgðpõÓ?+‘bð [¦8BÑHYó³Iyó PU­–„Yo¡’­ª4èÒÊ©N*ç?Ï:Rù¸!8œÖO½OøSŠ3ÕÒçÿɯ<ŒÓ\æ’ÌB!„õMŠÞBˆ&O«5 ª*ªÚ° Y:íVônM«è­(ZBb‡Pœ½ si†‹ !„'QU¿õTåüÓ“nÇ»í.Õ¸…\<‘ðq7`/)$ùå‡pZÌ•+Z-‘WßAÂ#¯£õò è¯_ØóÈu˜Ó’]Y!„¢^IÑ[Ñäéôn¨*àt¢ªöº8p8lè›ØHo€ð„K*ogøÑ…I„Bˆªò~Y‚ñßx%v!¼®‚l¦"'ÏÀ÷‚>”§ìåȇóªìãÛ­mç}ŽGl"æ´Cì}ôŠ6þÖ Y…B!꛽…MžF«E«7à°[Áél¸‘Þ;:½›«ŸþY ŠˆÞ­b”WÖ~)z !„h.tAz!„Bˆº!Eo!D“§ª*èÜÉ+(¢ÐX~Æý@=Ç>Eʼn–0ÍÙý7j-Ï'ïðïäþVO`TBãFÑf,zwÿsLV3A1Ñ|°[díÿQŠÞB!\JµYIûäe­Ž·Î’iMÎA@ÿ‹)ݳܟ¿Â’Αž'öî9Õîëݶ m_ø‚C¯>Bé®ÍØŠòÙÿì„_~#WÝŠ¢­þ þ†`Î8LÚÇ/â{A_4nî Ö¯ÖÝ“€þ7XB!„¨{RôB4y†ÈVh ¾Xí¶Š"x=Ójµx{yáåXíãQ}hÛÿq¶2¬åù”—f`ÌßÙ˜IIÎl–bœy©’—ú'{Ö>ChÜZt¾žÀ¨Þõš_£5?’ô=_WNqâîQ¯} !„§’ýã,™©„ŽšT9/µ¨½èîøk æ#)X»ÿ^Cðï=´Ú}õþA´~ò²¾~Ÿ¬o>@u:ÉZò!Å›~'îž¹¸Ç´jàô :ìºû J¶mhðþ5îžøõØàý !„¢nHÑ[Ñ,xxxÓé¤jÞh4 å£Ð´zO|C;òxSá 26’›ò+9É+p:¬dø¬?àуV=f[ý‡ÓºÞz4é{¾¦bŠ“‰½àæzëK!„8{i ÙK?@ç@ø„i.NÔ<(:=ñ3ç²û¡kPmVRߟ‹w»®èüªÿÂ^Ñhˆ¸êV¼Ûw'åDZäPžzÝN!üÊ›¿üÆŠù¿HîÏ_5X_ÕIÿâu|»öséHw!„BÔž,d)„h64 :½¾þ/Z­ö”ïšð H ¦Ãdºþá·í§óˆ× ŠPùxQæ&6—\EInR]¼{ÐîÅô€j·‘¹èvß5Ƥê5ï1Ns™‹ßm¾NÅœvˆ¢¿W»4ƒB!jOŠÞBábZ;‘‰—ÓsÜúOYMT» •¤o`âÑìþ£bª”º¤Ñ@QæfÌ¥™uÚ¾Bq&öâr~Z€[XÁïpq¢æ'tÌ5x%v hãoü¹üŒÇè|ˆ»wñ¼Œ> sZ2ûŸžNò‹÷aNK®×Ì.Ça*©×>j"oå×®Ž „BˆZ’¢·B4"Þ­é4ì\óa­*PRU'‡w|º…#(̨ÛV­Ç½¥Êho!„ .û»Ïpš+¾Ô˜0­A§Ï8_( ±w<…ÆÍ€#y"p IDAT½ˆ­0¯FÇú_8ˆö¯~EÐq T|t,Úø;»ïŸÄá·ŸÁ’y¸^2ç­^V/íž-ãÎMXó²\C!„µ Eo!„h„¼è:ê}zŽ[€‡o eŇٸdÉ›Þêfâòã§8ÉØ»¤NÚB!jÂV˜GîŠÅ¸G¶$ ÿ%.NÔ|¹E´ òêÛp˜J8òÑ‹5>VëåCËÛ§í¼ÏñíR±Ð¶êp¿z;ﺂäî£dÛzPu’Õ–ŸMYòî:i«.”lÿËÕ„BQ RôBˆF,(fý§¬&ö‚[PUû6Ìcó÷7b·–žsû­ð„Q”äü‹©¨~OWB!ŽÉZú1N«86Ê[ ¬O¡£&ý7ÍÉ_¿PüÏgu¼g\" ³Þ¢õoãÙª}åö¢~çÀœ;Ùyç8²–|tÎ#£»¶Ð «’×PÉÖu®Ž „BˆZ¢·B4rZ;mûŒˆxÃÑ-žÎ|›ÐÐúßXó2Ϻp/„Bד•b„Í€ƒì¤¿X°!«^ÖaG’Èø‘íiáæêluËÝ'Š>W}ÏŽUw“}pS—\EÏq ð n檡("/'yó[”§R˜±‰€Èžuœ\!„¨`/. à÷¦ý{ qq¢óKøS)üëÌi‡È]ù .©œö¤6 !‘DNžAÄ„i”ìø›¢¿S¼éì%…•û˜önÇ´w{•cõ¡è|üPô !(Z¥»·TÓ‹ëöƒxN™Š× ï`²÷ww§]‡¥|=07‡ÌÌÄÜ1]N 6g å`žž »õ¼Åà¥b\ôùÚ ´œÐ Õè@ëžNî{oRRü_A^u:±ädàÙ²Ö¯‘B!ž½…Mž=m#o®ÑpýWà`çÈšxëG/ˆMâÅ}èªP’•[Ïa\—`dù’ì׺C¹B‡áƒ¥Ç²ý'žMò§K°ƒâÌ\4=FpcG/W?Á“hõž\pÉ»$ýúé»c-ÏgãÒIô·ß޵j3²í•$o~ €´Ý_JÑ[!D½ÉùiQå\Þ‘“n¥±ý¦mÞ½Ócß“·€êäð;ÏÒîÅ…•ÓžœK»~Ýà×}¨Q~øÆ›(ݵ…²C{°æfV9ÆVƒ­ €²Ó·ŽR°œ´® Åø 8¸àØYnÜOÇgßÓìÿ! %â:ZO»”Ò‡âþÏ#ì_‘ƒ¶Ïsô9ºïø%Ïaÿ²Ã}­§Œ¤|ÿEhw·+ΰ8Ê–=Eáb=ãß#²÷*®.:¡[­¼B!„h8²bŒ¢‰SˆHliËvö•Ûf'mãN2Z«¨”`Ô’ =½‰ ò%¬S_n0œéW bêèöD7Ùÿ Úx‚¸nÓ°[lþî:Ì¥UO!>“ˆ6—£Õ{¶sa¦B!Pä|ÿ9Z/B†_áâ@ç7­§717?€j³’úîìS..ÙÜ¢N¿CñjÒ¿×àÛÞ8±üö6% wÇÓÄ^ךâEßcücÖ¾sˆ¿sm´ØUåè¾ïPÚañw>Iì=܆}ïóÄÎxŠÈV{)ø·¤J—úc‹t !„¢É‘ÞBˆ&O}!3.ú‹…Ÿ/e™AÆaCÒ–Û/‰Á}ç ”Z!DsQô×¯Ø ó~ŠVëâDâ´…–·=ή{'â0•öé«xwèé’)it¾Dßx?kW4xßZwÂÆÝØàý !„¢îHÑ[!š¹øw`ÌßCæ¾e”§°mù­t¿l>­þ ÇÝIæ¾e¨ª“ƒÿ¼!Eo!„g-ç§/Ptz‚GŒwqQúÀPZÜü‡^{ €C/?@Ûy_ õòið,Aƒ/#hðe Þ¯B!š>™ÞD!š=…NÃ^Å?¢ùiëØýǬ3åØš°V—Tsd EY[ê5¥Bˆæ¥ìÐ^Lûþ  ßHt>þ.N$j* ÿÅ„ý’Â’NÊ›Oºl~o!„BˆÚ¢·Bœ4Z=ÝF€§_,Gv. yÓg<.¾Ç€À¾õsë1¡Bˆæ&wù‚ÊÛ!_åÂ$¢6¢o¼ÏVí(ÞôÙË>uq"!„Bˆš“¢·Bœ' Atý>:CÅéÉû6¼@ÆÞ¥§=Æ7¤¡qÃ(Hÿ‹ü#kê=§Bˆ¦Ïn,¢pý*¼ÚtÂ+¡ƒ‹‰³¥èôÄß÷:ŸŠu@2¾…1é§B!„¨)z !ÄyÄ'¨-]G¿_9ŸwÒ¯÷‘Ÿ¶î´Ç´éûЦb ˆ½ëæ ªÎzÏ)„¢iËûõ[œV !#'¸8¨-CH±w> Š‚êt’üÒX²Ž¸:–B!ÄIÑ[!Î3AÑýè8ôe@Áé°±õÇ[0æï9åþÞ­‰n?€’Üdìù¦’ !„hŠT‡ƒ¼Ÿ¿@L@ß.N$Î…o×~D\y3“‘sîÄ^RèâTB!„§'Eo!„8E&^N›¾`·Ùüݵ˜ œrÿ„^÷¡Õ{°ûÏ'±[K$§Bˆ¦§xóŸXó²:E§wq"q®"®º•À‹[[²Ž°ïñ›p˜Œ.N%„õëHŽ™ëgÌdÊ”«ÙðÃgµjÃbƒ!ã‡ÍRÇé„g¢su!„®ßýÌÆ Rÿý siÿ|;…^W~‡oL•}Ýo^ƒ1i“«c!Ž£(NÚ*ÿ?)nÞtyWM¼’¿xT€ÉyLq/“'OæÁ{nƘqU…·æ/#mûf^~çGx:8,^ñ×N½™)S®å®Û®£8uÅ&¸äªa`·Vö=sî»ìùséaT=/¾ÿÙ»w3ãá§xì¡[Ánk¸Cˆó½…âÎ5×ÞÈ‚_0nÌe¼ôê“(À„kÇraçD®¿m&Ï>ÿ$hµ´lÛ‘—_{ƒÏ¿˜O¿ž½YúÍ{XoÅŽr£*Å(Jþ“oš@lxO>ÿ"sæ=:mýBœ‡dz!„8Kþ=è;é'ÊŠr7ϰLtîEK§á¯ ht¤ï^ŒÍ\ÄÆ%WqÁ%ïÜbà û¶éû0¹‡WSVœJÚÎ…Fõ®,˜Ÿ{OzŒCœ$¯ø’ïÂ.áîÄ\–-ý‹·Ò=PL6¢a\¼;”¥³léfR ÿm¿ø¸¦ÊS·ñÉ×vŠòK ì?’ëâ YúÍfŽè XJ ë¥#˜³’çv¸aðcè•Ýh#¿…¢Öò~]ŠÓ\@ˆŒònÖ´^$<ö‡ßzŠ‚µ+Pv<{n%슩(šs[•ÿÇ8ÊMu”¶á”ìøKf*nç> ‚¢~´ðÑRjœv6í7æîÉ¡€BxÿË8ðÎ{PšO¨O9¸ÑB9ô S¬7žTŒæVºŒ$õÛ΢çrÂðĈŠ€VuüÌ„'“÷BQ ¾!ð éàêuJQ´tú"Z;©ÿ~†ÝjdÓ²)´ð±ÜR¹ŸVïÅ—¼Çß__ŽÃ^ÎÎÕãÔŸàvõJ%gó_$µÆcüPó¶0géúÇuÁYÍöž=þ;®Ô­“®LÀ£p+sï!34€^ƒ¹¢/æí?ñì¶\D©ZðèÄV¸×Cz!„8_¨¹?-@çãO@ß.N$ꛢÓ{×lÜ"[’ùÕû¨N'‹Þ¦xËZLµ/èäÿ¶¬“6 U¥pÝJÂÇßìê$BˆS(.7oÐh8T˜GFÊnnºé!€Š‹ÖÊ‹À'è„ãœ*,Y¶’mV£S «ÄJtà©¿àSU9TW“¢·BˆJŠ¢¡ý 9xøÆ°oý\TÕÉž5ÏP”¹…ŽC_@g¨XpÅ7¤íÍáß_îÅa/çïo®¤ÿ”_q÷ލãD*…f‚¼QÅß—ÀÒL *Žê¶Wþm©쇛Н/æ J4AïÜÈÇ{ h‹ ±8 þ~èë8µBœo ׯĚ—@ðˆñh n.N$„¢1a^m:“òú,ì%…˜ö'±ç¡)GäÕw õ:»ÅÚ¬9é”§ì«§Àõ¯xË)z ш-ÿs%mÚÇ‚V·¿?ñm.à•—æ UTò*Ç}·f›~[ÎSsçâïéÁ†ñÓ÷Ÿ Qª¹ËKK *í!ŽÌé-„¢Š¸nÓé:úƒÊ"wÖXûÅP ÒÖWîÕn1¯Àn5²qÉUXL9uœD!0À¼üRTÀYTL¾/šSlWާRThĨF#Ež”üµž#ñ˜zÙ.kãU9‰·¢TÛ±Bˆ³óý|47BGËÔ&çß.½i÷ò"ú @µÛÈýù+’¬¯?À^RXã¶Jwo­¯˜ Ât`vc‘«c!Nb,³1Éj6,û”™S.EK÷68KÒ9´¾b= § GÒË@õ¬r|jIž>NüÝÌV˜ÿË?•3x{ÀÝÝÒTì›­’º3‰“?fh4`p7Pœvêi2…uGFz !„¨VhÜpúNü‘m+n£$w'æÒL6.Ddâ8Úx ƒG í/zky>Ù¢¬8…¾D±_Ôáˆo…Ð}è´ôÞøÊÊt1„ Ej¶æ§°ú˜ÓøjÙ! sÄ A;¥”UkVóÑao‚ƒ‚<¼ þuS!ÎcÆ›);´€À£ÐùÈ®ç#½q÷Î#póŽ|ôÖœ &#‹Þ&sɇôJà€KðéÒç´s~—¥ìoÀÔÿÑôKë¨Ø÷Õþs[ÜZubN;„w»®uMQK‡•ñ3ŸGU´èt ºôaÞKÐ2€HLžõ¾þ6û^yppÉ îÜ<ã18©d=è¢Þ,ýc!WO¾ŽÀ_~û×Wüîs×Áå·ÜÀm³_ÆÛ/oŸ .ìYu1g†]y%Óç¼CHð¼þúg 3Ô÷Ë Äy«¾Æ·Ünuý(ÕÜ>ݶꮕÞ?vÑTs[{ÜmÍq÷¿®îÒßd2ÍpW ªyzBÑ<8öÿõ)[ßGUèÝ|‰ë6Ø®Ó [—ßBnʯ<‚è6æcüÃåÞBœÌ™Aɶ  hhÿÊbÜ£ã\I¸˜j·‘¿zYK>šŸ}ÂcZOo|:öÀ«Mg¼Û^€[d,:¿ÊÇ“_~¢¿~=á%q&ígöÀr8UÑ£u+¤ð£§É=l=n'ÎaÝ:+z-o{‚ !cϱq&?¬ÚBRRÓ¦M«òXpp° ‰ÆDR€8œ¨hP°åT”s¼+÷3ÀP°¹@  Ä“DaŠ€0€ð-áèQ¾¨¸mµ_|IÅA 2É$šP@KöѾÜÉ‘ D^^^•mï½÷÷Üs^^^³€µT¼U«»8«¹V»¯·íäÛÇ_¨áýÓ]Ÿi§ÙVçáËHo!„§¥Ñº‘Øï1ÂZ]LÒ¯RZ°›¥„}^àðö‰íz ‡¾È¿«f’—úÖò|6.OÛþOТóõ®Ž/„¢™Ó’)Ùþþ=JÁ[‹\OÐàË(X÷3ù¿}W1m‰ªâ(+¥hãïmüý„cÜcZ¡u÷Àœ‘Zm›êÞOH~uN´x\ù>QmüÉ=œƒ¦ÿïèÈ8'èÍ8ðÆï8#à¾ê92·e í76ÚP¬ 5m&ká_¨ñ·“xiWִ‘ŒwþÄ™0ƒÄÑ]ñ™€_òö/; Ñ7ÑzÊHÊ÷_„vÇ3$ÿ˜ !m08ªfu˜Œuô !„¢¶¤è-„gÉZžÇÖå·b1erŸÀ¨¾túb¦jÊÿ³wßñUÕ÷ãÇ_çÎÜ{s³÷‚°ÂÞ²œ8pâªZ[­ÖÑúû:ª¶ÖZ¬­«­m­Zœµ"n\ d ²!ƒ‘=nvror×9¿?.B$!á&áý|<òàæœóù|Þ÷rïɽïû9ïÎ@Úˆ[HÊ¸Š¼íoq`Ëkx\@£pÏŒ6ü~7šê£"5ß¿7“ؾ3è;úv¢R¦ (r ŸBôÞŠR*V| €uÀ0ìÃÆ9"Ñ™ãSH¸âV®¸ÕãÆµw…ûqåÒX”‹¯¾ÕÝ€»(ÕãnÑ^Ëù¹/,EtƒîaÀí—àzv~T|¥E弯 ·“6Ö‰ÝÅaT|•k¦½4½ c\$žmU€†/ó ª]‚Š·¬8лñàqñSæ–¢Цn¿äi*.þé'Bé2ŠßÎjyge•l!„"è$é-„íTY¸Žª¢ Ç=Æ9ðES(ýÆÝEßÑs(ÎúŒüÿ¥ºd>¯³ÅñŽËqX€%,‹=EÑ£3Xé;úg§4ö¶ò6ÖÉÉìp„¢Û)ùäͦYÞñ³n r4¢'љ̄Óêbù¯ý Çâ…Çm¯Õ×AX$:å`±RM X/¾›]sÙ¿Ú‰ñü¿aOn-ù¬á-¯Áœ¢r5QÊ*Z§â)+Â]ð¹KÊÀƒ9ÒƒŸŽëÓ'¨z߈åšWHš´”½Ë«›µ<²F¹B!‚C’ÞBÑN±}f:ü&\5¹-öUä¯ BDÁ£Ó›I2›ä!³qVåP’óeû–PëØ¦©­¶i¨Í§¡öp­KÇ¥§*ÜÓmD%O"&m*±}ÏÃÞçÄ„¢ó”—PþÍÇXÒú9iF#½…9!¥ÕíJÆÍ¤?x GgñPûÞq«G.çǽc†Ë%mP)ž’l¼ƒ¯'²üèu±TÜ+þMÝ/£ÿÀZC!ŽWë!âè5<+^¦~îcô˨@ ±â]ñp³øÏ?4ïèˆ~Ž<®ä…{ñöÕôh–¾Ç?@!„]N’ÞB!ÚÍïk¤lß×e~LyÞ*4ÕÛ¦vŠÎˆÙ‹ÑšŠß×HXÜH\ÜÅ··±–†Ú\L–< ”ç}‡³z/~¯ MS)Ýû¥{¿"®ß ;çi̶¸`‡,„§Œ»´ŠŸ`MÏ bÂô G$z“Ð!cPŒ¦¦/UzÉŒ5]’ÞB!D°IÒ[Ñc56º),*ÁëóÒqMF#ÉI ˜Í¦S:nwàªÉ%oû[îz¯ûèËy,aK’œí­7Z‰K?ô1w7âFÛyMyÕï¥lÿ w/}úœ°¼‰¢(£iz}Ç’Š¢ ªê‰ì¡êÊw±sÅo¨.ÙÔ´-4j '?D|¿æ—ìf­}†}?¼€Þ¨‹þI\úé5Ã)<~4“gʪw¦£úÝ”ä|éÛh†žóRêDÑkhùóÿ¸­($Ýpwpã½^·RñÍÇøêj‚J›XÒú{áì`‡!„Bˆƒ$é-„è±t:…rG)>Ÿ†¦èOXÞ$ÐF‡Õj¥   Ýã) èP©¬(%<´7ÎâÕÈÝ:ŸÌ5óPý ¦PL|€>#oEÑ5ÿ“‘·ýí¦„7ÀøËß%2éŒSqwa KeÚ-«X·ðrë‹ÉÛþ!¡ ôO°CBˆNQñí8³¶uæ…„äˆDo§·ÙI½ý7T¯]ìPÚ$îÒŸ œÄ¤ !„Bt.Iz !z¬ø¸XJËÊÉÊÜFxdŠ®k?hhªŸšÊBÒû$Ù¥cjÞÆ*¶/{€²ý‡?X&¼ŒÁSŸÀlkYÿ¼lÿRv¬e­7X8ãÊD$Œ9eñvG!¡‰ŒŸõ6kþw!šæ'{Ýs„'Œ%:åÌ`‡&„'Åﬥàg@Ù‰ä›ï rDât9ù<"'Ÿì0„BÑIÒ[Ñc™Í&RS)*©$%%ƒÑÔ¥ãy=nêËHMIìÒqNµª¢l]|7õÅÍa ?÷YâûÏlõxgU[ÿMó£(zF]ôÓ>á}Hhtãf½Å¦ÏnAÓül]|g^ÿf[|°CBˆ+xëŦ®žƒ1ªã‹A !„Bq*ôîUÆ„§MÓºô§7*Øù?6~r]SÂ;"agÞ°ä˜ oÕïfË×wã÷ºÈ8ëÑÓ®†÷‰Ä¤M£ÿ„ûð¸ìøæÿ‚‘Bt\íÖuT¬ø KŸÄ_vS#B!„âÄ$é-„èº:áÝÛßšægÏê?°cùƒ¨~/}ÇÌeâÕbO>f»=«ž¤®|IWÒwôí§$Þž¦ÿ÷7Gî w/ rDBÑ~~g¹ÿz4 E¯§Ï]¿CÑË…¢B!„¢û“¤·¢ÇkOBÚçóátºšýøýþN§;óyêÙüùÏ9ðã+è !Œžù/Ÿõx‹Å*T¶)yÛßÀ‘ÎÐsæ’x{"EÑ1fæ¿ÑmìYõ{Üβ G%„í“ÿÚŸðV”wÙÍXû rDB!„B´LÕBômIH—²~ÃæfÛΜ2„„×'í o·³Œ>»¹i¶¶ÙϸK_oš•|,>O=»Vþ¦é÷Ñýƒ)´Kcíé,a©dLy„]ß>†×]Cæš§yÁß‚–B´IùÒ©\ý5–¾$^{G#B!„¢íd¦·¢WhkyWCEÅ%Í~O‹Ò&õ•Ù¬[xySÂ;,vS®ûâ„ o€ìu¦±¾€~EXì‰ÛHy ö˜ÀÌÈ¢ÌO¨.Ù|‚B|άm¼þz‹~¿~]/-„B!Dg’™ÞBˆ^¡Í‰écÓ–¶=9ñ]U¼‘ÍŸÿoc5±}g0ú¢¡7ZOض¦lyÛeMl‘ýé7þ—]kï¢0lú3¬[x9 ±gÕï™4û@ v`¢ÉýÇï¨ùaÑ3.Ìg8ÝÄ]r#ƈèNëÏ[QʾçFõºH»ó1̉}:­!NDu7²ûkÑ[C±šìp°?ƒ°Q“‚†B!ÚI’ÞBˆÓJkyëžœÌn‹Òœ/Ùºä^T ‘2ôz†Mú¸õ»Óصò7hšPvΤºd3ÅY‹H4+Øa‰^¢|ÙÇT¬ü€ÒÏÞ r4"¼å%ô½ïÒ—ßUOμ{›êxÇμžÈ)tJßB´Õö;.Âï¬Àµ?3ÈÑ@Å7Ÿ0ì¥OÑ[¥¬›BÑ“Èt !D¯ÐÖò&ÇžéÝKœänÏ–¯ïjJx˜ð+†Ÿû—6&¼¡8ë3jJ·0à¢R¦tY¬½Ù Iÿ×t;gà ¿Dâäh~Å _ v"È*×,ƵoÏI÷ãop‘õøòr6)·>pÒý Ñî⼦„wwá««¦ôã׃†B!ÚI’ÞBˆïP2ºMIëÖòÖ½2á­‘¹æ)v÷;4Í¢30|ÆŸ0ñ×mîAõ{ÈZû zƒ…ÁSÛUÁöz!ödú޾gUE™9"ÑT­þoeY°ÃÁ¦i”~úæIu᫯%çÉ;›Þ¶ÃI¿Š”˧Xñ‡ÿ v­r,^ˆÚè vB!„hy'+„èÚš”nm¦w[ÓÙ=%ñí÷5°ùó9ìßüoôFc/ù)ÃnhW?yÛߤ¡6€>£çšØé±žNú¿«©†úÞ / ©¾ G$zº²/Þ v¢›¨Þ°ouE‡ÚzEd=z+ΜXû¥ÿ#CgéÌ…8!oU9Uk;ŒVùœT~÷e°ÃB!D;HÒ[Ñ+kv¶×르ÌAqq)ÅÅ¥TW×¶h[UUÕ´¿¬ÌÏç;æLïîžøn¬/aý‡WS¶)&k,®\@lßíêÇïu²wãß}X¢é7îîNõtc²Ä:ü&\5y”îý*ȉž¬!/§[Ôº݃æóR½aE»ÛÕn]Çž‡o¡±(€Ð¡cø»—1ØÃ;;D!N¨êû%h>o°Ã8¦ªµKƒ‚B!ÚA²Bô­%¤5M#/·€=™Ù¨š†Ïײ–òæ·£×ëÑét ’AddÄ1ûêÎjʶ±ùóŸãv Î`Ü¥¯c Kmw_¹ÛÞÄÛX @úØ;1˜dñ¦Î>æò¶½Žê÷r`Ëk$ ¼,Ø!‰ªfãÊ`‡ º™ÚM«ˆ½àš6«zܾõŽ%‚¦Þé÷Ï“Þ"hj6~쎫~÷ü®zYÐR!„è!d¦·¢W8ÖLo½^ϰaƒ‰Ž‰ÂåjÀãñ´hëv{p¹HˆeèètºW×;绬]pISÂ;¶ï¹Lºæ“%¼ý¾üø*fk,i#oíÌPOkf[IWP]²™ê’ÍAŽHôTõ{¶;ÑÍÔíØØ¦Y²Õ떱뾫p,^šŠ¢Ó‘tÃ]ôð9Ix‹ Ñü~œÙÛƒÆqi~uÛ7; !„B´‘$½…½ÂñÒf³‰IÆ‘’’Ôê~EQè“–ÂgŒÁd2uhŒ`ñyêÙòõ]ì\þPÓ¶ô1s{é:<;;Ç;xÊ}½½A’ ©ï˜¹€ÐTw]ˆöjÈÍnó±º)O“1{àÁgÝÁm£IÚ9ÉÇo׆cÚC'öu<ú©&ãª~Íîko£ô¹“Á÷ŸßâM¼êqã.+jµÚè¢bù'l¿c&ûž{Oy ÆÈX<þ/®šJo~ÔDwç.ÎEõ¸ƒÆ 5ì vâ4£(ŠüÈüãGˆ‘ò&Bˆ^ãxIé°0;S&gɲ•-êzGEE2qâ8Bm¶n™Ø>–ê’Ml]|OÓb“z£aÓç‘”qU‡ûTý^öo~Ôò>TƒZtžÐ¨Ä¤M£<ï[Êö}«æÖð¾ÁKô šß‡·ÊÑ|£EÄMbDŸ4sÃV\U~ü[^&¿¦eê–—È;Á8m9¦­Nª¯øé{Á.rßÞÒæ…‡;¢@kŽŒ)˜ñÅ]œGHRÐTò÷ãÌÚJÕš%¸öîÂßàl:Ng2wéM$\y+ºk#"ÀSQÖb›’ñ+†\¼ƒ=/,EíÊÁÛñn,ꬳ¢B!ºš$½…=^[Ë„…Ù™zæ$V¿žªª@(**’³Îœ@˜=ô„í»KBÜç©'gýsØòZÓ¶°ØáŒ¾èŸX#ÒOªïâìOq;<ÓFÜ‚Þ(É®ÐwÌí”ç}‹¦©änÏiO;$Ñøêªñ8JðV–âqã­t૯Emt¡ù}øjªZ6Ò*©~ûªÑc½ñòbß*º) ºôËI¹3SJ2ÞERhz±/“³ý,Òf@«ó£)ÄñÊKÔÖÎuú©>á1DM'õîk1”çámˆÆ¹„ÌW+ˆ›ûS,îJ³ÐøÙ)‹z,ÐWé\Ņ¶Øˆ¡o,œ¼õå­÷óÂT%ˆ+/Ç>`, »Š(ÎL%ᨾ‹w6ÿ"S—q=©¿°`LŒÃóùcäïH$þŽÛ±ùkÀ¦Q·`Ž} MÇëÏ~ŽA“‹¨Í×0ôéúÍï)4>ÀÀÉոݔ¿¹ÛÏhÿþðž0¦Ý>ƺ­ ^r'Ú¿AY‰Š~üï0ô²ÞÚH¤µñ±*ÎØò>'õîÙÊàUSÑ){[}îì{æWh(Muº¦M„fŒ"æü« IIGõz$é-º„ßY‡·² _]5¾Ú*¼µÕøk«ñÕU¡z<¨î†¦r<~g=žêò¶w:žÄ_ÜŠÅS.R¡æÍWÐÝò`ó×Þ¨ÝÔ†ŸEH³sEúsž¥ÄßÈþ$úÝÅ ™E”ù¯áÄê)˜G¤·~®;È]ZЙ“B!º$½…½B[knÇÅÅ0iÂ8–~óz½ŽIÆÕ¦¶Ý!é]œ½ˆ=«~ßT»úŒúg>ŠNìÒ,m£5ÕòÖmô=ç$ûÇ“6ШÔWfS°ë}LüÍaÁK¯¶Šú=[hØŸ‰kßn\²ðV¶œñxrôÎ ½üê€_’qÉh”Í:LÃÏF¿íIö}‘±ƒ0µXë÷xÇè9ûfÌë&g‰ã9ÏæéwbÏú=ÙŸ $ÞÂÀ¹—Rµâ`MAïÜDÉÿÖ¡õ»‹ŒËF£[¿S‹~žoµj¾ßB|ÃW”l*Ç|Ù[ô]±ë]sr:ŠN*!ŠãÐ4Ü%ù¸öí¦±8wqî’|ÜÅùøêª»lXÅnÁ»tÅ[ŠÐŸù ƒÎ´²w•‹ô#^{®šTB³ž8ê\ñ?Z.g^EÍ÷[ˆkXL•án’{>õˆ+&„BѽIÒ[Ñ+´'!˜ÏÙÓ&£×ëIHˆë²q:SMéVö¬~’ª¢Ã (Ù"ú1ôœ§ˆNÚ)c”ç}G]ù.R†^‹ÑÞ)ýŠÖ(¤½“íËÀïuR¸{}Gßì Ä) ©*®ìíÔnùžš-kqíÝ}ÌY¹GÓ…XQôôkSMæ¶Qñ–ʸÑô†¦í_?MÅe?#ýñD(]FñÛY-ÚûÆH ÞU€†//ž1:Œ±áx¶÷Zy!žðQ˜”Ãýù*+iY¯ç`,­õÓê#€©µ¾uàiJNùñå£j@U^ë8Bââ1&Í!-E%MÝ„AÞ¦6*^GI ¦Z^Ûh ¨øJ‹PÑaŠ‹Ç˜rTûVËHjx׎û±‹±-ÝM„}Åù‡iëc5K\8ž-Gm‹ Å“h«:ŠðëOѱʱ‡ßY‡kï.\{w5´C¬Xû ÆÚo(¡# ~†Pùrît¦6º¨Û¹ gæVœŸ3~g]‡úÒ™CP /ëõ¶P4ouEÛ{5Œn'm¬-ºŠCÔko µ®KÑ•´Ho ̰MLÅÒg ¦˜ŒQñ˜¢ã0„G5;vÛmçã«©<ɨt“l¸>}‚ª÷X®y…¤IKÙ»¼ºÇ¨øj=¢ì@úätŒJÞ²j̉q@JL*¦ª"j¡CÆ¢èõÇù=ž¦âÌÞIíÖµÔm[3{;š¿•éÏ)#渤ÀU‰iÂ"1ÅÄc°G`‹Ä…ÁÎÜrì†Ülvÿ¿ëÛ”ëÅw²k.ûW;1žÿ7ìÉÊQ¯½gp†œEL‹s…>Š!ðÞI‰ˆÅp(‡­èÛp>D¾øB!zIz !z…¶–7é ¼Õe~Láî÷©uìh¶/®ß ™ú–°ÔNÓU½Ÿò¼ïˆé;CV<ôF+Iƒ¯!wë|ê+³©*ÚHdÒÁKt"Íç¥rõb_ý×¾–IJcD4a£§:l¡CÆ`ŽKnžH=ŽÄTêO:é­Aä R®½½-“ÊokÛqŒJ㪅øïú}äás+ø5÷ŠQ;÷ÿH¿»B Ô,xoüØãÄÑZ?‡ÏçZi6¾aw’rÖ< ZéÛsä©_~ËxçLØœ@âßR·{+¶¹Ñ/£5ÄŠwÅs–Õ7_ ›h“’HâÇq›†6ís¯x™ú£ÛçSö·WçRÿí¤þ¦%o8šÑÖǪ¾pO‹muU•DÝóGú ÌÅëÔãÓZž˜¢b0FÅ1!Žˆ ÓI»ýj·®£ôÓ7©Û¾4ºñ”‘ö‹Ç±?xÞÑ4<•e4È¢á@&®½»qæì<ü%¦6Í/ùä öpÂÇŸMääó°˜Ð”H=›¦ª8÷üHÕÚeT¯_qÌ/é ö¬†aë?Kú¬}bŒIìpIsBj«W*(·Òï‘KWbø~¤ôù7iܱ Ãe’6¨OI6ÞÁוü•M¯½2Üê1λ—Óxî/IµìŇ?ºƒç˜¹$ªE’w>cDL‡îŸB!N½¶}²:ù~[Giåöñ¶µö¯ÒÆßýèZ¹­?â¶îˆßü·µŸ³œNçS!ÊÉ~èBt”¦i¬Y·•”>ƒQt];ãLõû(ÊÏäÌI£yÌÊ7&ÑXWHlßswÙmîÛírPž»’¢Ì©*Zê÷±W!¶ï Løáñ£:~Ž#sõØÿã+œqÅ»V2E_}E&«ß=€ä!³qÞóAŽHtƒ“ò¥QöÅ»-ês›Rˆ˜t‘S.ÀÚwP›“ÜGË{ù”óIg„{R”Èa„†R—[nìãdŒ[žW×§ªt×öÓ‡ìÌúh_§Œ§týÏþ½¯®åÈIè§â>ÿçç˜b¹¿nû Þx–†¼ƒ a* É7ÝGü¬›ÙÆS^Bý®ÍÔm_Oí¶ ­Öœ×ÛìDuÑ3.ÇÚoÈIßS©ô³·)|ûEbλ }'Íâ IL#zÆåÒשÒXx€Š•‹¨\±oMË2#†°HìÃÏÀ>r"ö¡c1'¦uz ;9 wia‡Ûëµ×™’o¾ÿ¸¯qj}¾t3;vì`îܹ-öÅÄôŽ/(”¾OâtÐ[&½•—·\Ìù•W^áþûïÀf³=¬üÇøQ[ùW;âwíˆmGß>ò‡6þ~¼O´ãlëôÿP™é-„§˜ß뢾2›ºŠ=Ô”þHEþ*\5ù}Ž×­$¾†´‘·5°ëâñ5R°{!¨zV—%š Î "aÕ%›(Éþœ!Ó~ÁdvX¢ƒ4ŸÇ’(ùàµf‹¸)#‘S. ö‚«± ÙáD÷‘ì£&w‹¤·¦FvýÄÔס‹ðáxss‡Þ­vV?ÁeÂvñïHSEÙ?×·Hºuõ}4EÇ7á `1Áz‡¢÷ÿMé'o€¦Qøö‹x+JHþé­ÎÒ5Å$5íb¢¦] JõÔn^MÕúå:àš†ßY‡cñB‹bI@ôôYDMÙ¢,Owã­,£ðí(_öQçu¬è°ö‚¥ï Îë³ ø]õT}¿„Š‹pfmk±ß’ÖŸˆ 37[ÿ! tm=kûÈI¸—~Ø–Çíu¦ÐÁ]3ù@!„O’ÞBˆ^AÓ´v/ÞÕ¡1ÚÈU“˾MÿÄã*Gõ»q»Êh¬+ÂírÐX_|ÌvŠÎ@têY$ º‚øþ¡7Ú:#ôã*Éùoc©Ão¢ë.­IvÕ%›ðû(Êü˜´·;$ÑÕë—SøÎßp—ä7m3„GwÑuÄ\tm§× 5 Eoh^«9jÖPøÌšîÓOøW=Hæ‰kÎ/%ûËcìîâû>~Z›ŽSŒ&’röág°ÿ¹ñ78)ûò=¼Uåô½ÿé–§°¤ À’6€ø+nÅS^BÕꯩ\õ y9@ )^ðæó¾ó7ÂÇžEÔÙ—>~оû}ì(|û¯]Ó±¦Røß¿1àÑ—º¦ÿ“¡iÔïÞLù²©^¿Õãn¶ÛœBä” ‰šv1!É}Oiha£§PÞ¡¤÷ ^{Ä…màð®DÑŒ^¯ÇœµÚÃl6cµZ1™Lèt:ÊËËñz½„„„‘‘ÑhD¯×£( 999M3pÃÂÂ9r$Cào™ßï'33“²²ÀÕOV«•ŒŒ TUÅãñ——‡Óél?44UUillDUOþë¹Î|l„譺߻O!„è€î–ôvVåõýÓm8RÁÙȤ ĦCtÚÔS>Ó7ÇÀ™ÉCfŸÒ±$ ,héóÔQ°ó]Iz÷0žòò^™G퇓™{ñ³n&ö’ÑM]2®ÞJبIÔl^Ý%ý‹ž'jÚ%í:>lÔ$=ù9óîÅ[å jí2ô6;ismóÕ¦˜⯸•ø+nŵo7+Qµúk|õ5h~ÕWR½q%ÆÈX¢Î¾„ès.;å‰Ôci,ØGåšÅ]Öí–µ4Èê6³½=å%T®üœŠoá.)h¶Ob%rÒ¹DOŸEè1r5JG„š„ÞfÇï¬ Êø'9å‚.Ÿí.„8Ìjµ2`À¶mky%JkÌf36› ‹Å‚Ùl¦´´´)éÁèÑÍKTZ­Vöî ”û %22²EG:²ÔŒN§CÄb΋…ðððfÇ7444ÇСC›öy<öìÙCeýŽÍ“ IDATeeSßaaax<Ûô¹søðáäää4K¬ !𓤷¢W8UIïŽÖ 3˜ì˜mq˜mñØ"úa‹èGhtáñ£0šÃOÜA©¯Ì¦ºøâÒÏÇ´XNWz£ÄŒ+Èßþ6µŽÔ”m#>Ÿ¯ÙãU[[˪U«ŽoEEëׯÇd2¡×ëÑëõM m€ºº:*++›ò&“ “éðĈÄÄD |Iªª*N§“={ö3¡­×뉈ˆ`ĈlÞ¼ÇÓêqíÕSŸ/B‹$½…=Zà‹½^¡‹fTâõhx<^TUEw‚Ë¿£R¦0|Æ_0šíè6tú®­£ ÖòHñÓ FrzKrùÛß p×Izws¾šJüýqj·®kÚf~iw<Š9!õ”Å>f –´Me%Äé+ñêÛ;Ü6$©Ÿx…¬ßÞ†¯¶Š’OÞÀŸBÌyWv¨?Åh"rÊùDN9¿ÕÙÅάm8³¶Qðú³„JôôË9Å`ìð}h/Íï£êû¥]>NõÚe¤Þöð KÆt&MU©ßµ‰Êo¿ zà ü®úfûͺšz1–´þ§,®¶Š»øz‹¢y;'ÓY¢Ï¾ø”žß…èL6›Gy„'Ÿ|2Ø¡´‰N§cĈX, PZ¤ººšŒŒ "##›’Ňƒ;w™Ó‡’Ú 444PZZÚÔgCC›7o>î¸';cúиÇÚwäŒõ£K“ÔÔÔPYY‰ÍfÃl6c·Û±ÙlÍfЧ§§ãr¹¨« \ £( !!!Œ1‚-[¶tZ©“žö|âx$é-„èѼ^••ª6®A§ïÚ•ª_E‡ŸÏÉtü±ô Öð´.çdišŸ¢ÌÀÂ]Öð>D&OrD§¯ðøQØc†PW¾›âìÏ<õwÝö‹’Ó]Ýö øÛcx«+PôÒæ>BôôËO}IEGòOî%çé{Oí¸¢[ {acÏ<©>B’ûÒÿáÉüMàËÏ‚ùÁÚ(ÖôŒ“êד@Â5·‘põêwÿHŊϨZ÷ j£+0 yÝ2ª×ʪ„›Jø¸i„=³Ëg×íø¡E2¸+øêkpfmïòÅU¯‡ú©Þ°’ê +ðÕV5Û¯MDŒŸFô9³°ž|J“ðíeŠM"öÂÙÝj¶·Þb#é'rž=×C=Ä«¯¾Ê|À®]»Z=fòäÉ<÷ÜsDGG£iü1¿ýíoñz½Üpà üá@UUÖ¯_߬ìǸqãxá…ˆÇëõ2þ|žþùÇj±X6l¡¡‡¯ŠˆˆÀét‡¢(x½^êëë).>¼N’ÛíæÇìð¸§ÚÑ j§ÓÙ”×ëõ˜Íf\.WÓ~“É„ÅbÁb±ݬ­Ýngذadgg3éÞ=éù"ĉHÒ[Ñ£™LFΚr.WC‡K´•¢(ØlVŒÆÞqê,Ïû·30"yȵÈ–Á•”q5™åOám¬Æ±ñ.vHâHšFÉÇó)zï妡CÇÒ÷ž?`ŠIZXacÏ$éº_à©(=ñÁ¢WJ¸òÖNéÇ6p8é÷Ïcÿ‹¿AõºÙÿüC ~æÎ)A¢(„Kèб¤ÎyªußP±â3êwÿš†ßYGåw_RùÝ—(z¶Œ‘„˜Hèð3° Öé‹`:3·vjÇS·}}§'½5U¥!7›ºíë©Û¶žúÝ?¶X%g¢§_FäY3;}1Ý®”8{.šÇÖ ½u†°Q1FDŸø@!º©}ûöñÌ3ÏðÚk¯qÖYgµXD1<<œÏ?ÿœ»îº‹ Áš5k(..fÁ‚¼þúëÌœ9“+V0nÜ8Ö¬YÃÎ;±Ûí|ùå—<òÈ#ÌŸ?ŸØØXÖ­[GNNŸ}öY»ã3fL‹ºØHzïÛ· 6 i~,z¿ßß,á PPP@yy9v»»ÝNBBB³ò(QQQLœ8‘ššš“Nþ÷”ç‹mÑ;27BˆÓ–N§#!>¶ËÞ‡(AZÜ©+*m¢(:’_ähDÒà«ÈZû'4ÕGáž$éݨ7¹ÿz’ªÕ_7mK¼ævfÏí3&®¹-Ø!ˆ^"òÌ ©ßµÇ’p—ä“÷Ê<ÒïŸ×©cèB¬DŸsÑç\†ÇQDõúåT­[Ž3k;h*šßGý®ÍÔïÚ þ…ÎhÆ’>k¿¡XûÁ’ÚŸ´'µHlCnv'Þ£Œ•·÷¤Úk~îâ<dáÜ»×¾]¸öíAmtµz¼5=ƒˆ‰3ˆ˜x.!)é'5v°è­¡¤ÞþH°Ã¢×P…¿üå/\wÝuÜ}÷Ýüýïo¶úôéx<,X@uu5ï¾û.³fÍ¢¸¸‡ÃÁŠ+Ø´i6l`ÆŒ¨ªÊüùó@¹‘·Þz‹o¼±ÃIL¯×‹×ëÅl67-i·ÛÑëõ2‹¹'kll¤±±‘ÊÊJRS—[òù|8N¬ÖιJª'=_„8Iz !z…Þ”Œ>¼Õ”í[ @TÊ™„Ø“ƒ‘0[c‰IŠ#wŽÜ•xÊ1Yb‚ÖiÏ[]ÁÞg~…+'P3ÒNßûž"lô” G&D×H¾õê÷üHCÞ^ªÖ,&rÒ¹DL:·KÆ2Å&wéMÄ]zÞ*5›VS·mu;6â««@õºqfm$ÅQL1 ˜R1'¤bЉÇÁ‰>,cx†°tfK«ã¶ve„’q?COåo~Jq^à²s¥ï ~jÕÞLqnÇj¥ºKò¹Oõ¸ñÕUã«©ÂW[…¯®oežòÜ%ù¸Kòñ8ŠÑŽS§UbÅ>|ýôÓfûp8Ͷ9âã㉉‰i¶ #}<Ô.**Š4í3™Llß¾Ž8r†²N§#22’„„bbboÇéêÐløªª*JKKq8VÏûžð|¢-$é-„§¡â¬OQýE¢’‡\ähÄ!ICfãÈ]¦z)Îú”>£æ;¤Óš»$Ÿœ§îÆ]Z@HJ:ýzA3½šÎh¢ï}O“ùðͨ^7ùóÿŒ}Äèm][ÃKÌyWÐÔT\ûöP·s®œ8÷îÂSVtø`MÃã(Æã(¦nû†cwª(è­v 6;( ŒM¯éæ4¼{]„΃îP !túPüû.l:žÄ_ÜŠÅS.R¡æõÇ©ìû4ƒ&Q›¯aèÓõ›ß“¿¾¬Y¯ 2ÙrÓ™pðŠ´C%;4Ÿ·Ã“mÀ0¬ý‡:t¶A#QΆBˆãùᇘ?>/¿ü2YYYMÛ‹‹‹‰mvl\\EEETVVÕl_bb"»ví¢¨¨ˆââbúöíÛ鱪ªJEE˜ÍfŒÆS·ØqwçñxX·nnw˲V©'=_„8–à_“+„â”+ظÍ`²ßf£‡Ä÷»ƒ) )ÜýA£9½5È$ëñ9MɱÐÁ£Èøã’ð§KZ® |éæ­*§à­OmŠkÿ¡ÄϺ™ô_?Ãð,bäüå xô%’oº—˜ó®Ä>|<¦èøã/ «iøµøµ¸Ë q—ÒXxà gò–P—távB§µžªâ@²Z±[ð.Ǿ¿>Ìþ¥3uŠª¡¯Û@ñŸ'÷ßßréLÌ­|ºRݨ7ªÇæó¶-á­èÐ[C1'¦6r WÍaðŸÿˈW¾¦ßƒÏ‘põm„# o!D»<öØc <˜™3¿ÿ_±bF£‘Ù³gÍM7ÝÄÂ… Y½z5 œþùL›6Ñ£G°råJ, ×_=˜µûì³Ïr饗vjÌn·›úú®_|¸§¨¯¯ïò„÷!=ñù"Ä‘d¦·Bœfê*öP[¸Œ,qàeè ­_þ-N=ÞLâ Yäïø/µŽÔ•ïÆ3$Øavœ™[É™w/~WàVÔYÑçî'P 2ËHœ>â/ÿ)Uk—Ñp ‹ŠŸ=}¡ƒG-ƒ=œ°Ñ“ =¹ÙvÕëÁSZ€¯¶:P¤¦ÿÁÛ¾ú4oàª&Ÿ³ÍëÁµwW« ?¢æRùý¤ž™„S=Ö>‹gÔÙL^ ã„ÛIëD‹îƒâ0*^G @­¯m4FŽîYg27ÝÖT? œ8ñ­©ø]õø]õ¸‹ó¨Ý¶Ž’þÓ|¦÷°ñØŽÄ·¢Í\.wÞy'‹/nÚV[[Ë¥—^Ê /¼ÀSO=…¦i¼óÎ;ÌŸ?UU¹ãŽ;xõÕWÑét¬^½š  ×ë©««ãâ‹/njg0øæ›oøöÛoƒxEg’ç‹èé$é-„§™¢ƒ X$™ÄHDk’_MþŽÿP”ù!19¢ÓKýž-ìw/þ†@Iƒ¸Kn$å§¿>þlR!z!Eo mî£dþæ§ i¼ù<ƒç½Ùí^ :£‰”~íj³ï/P½ae+{T¼ëáýõ\½*ÿZƒn€ëÅw²k.ûW;1žÿ7ìÉ  ÇŸ„ŽlüQ‰ëxÕæ=Â"ùŸe­ÆÑTÓ»¶_Me i_QЧ¢ô˜5½½Uª7®¤zc þC5½í#&>Njz !šKHHh±mÉ’%-ÖCZ·n“'Onq,Àüùó›<Ú¦M›˜6mÚÉ*ºy¾ˆÞF’ÞBqÑ4•¢¬Àb$Öð>D$ŽrDâh‘‰ã±†÷ÅUs€¢Ì4ùaü¹>êwÿHμ{Q]$\5‡¤î rTBmàp¢§Ï¢bÅg¸rvR¹êK¢¦]ì°Nš9!íØ;ÖSqà^R½Qï†@%s?î›0\ö(iƒJñ”dã|=‘•jØdçLØ’HâÇqkÍ»3FŶ2H€ÎdÆX„óX4¿wq> ¹Y8sváÚ· ×¾=Mç)µÑEÍßQóÃw¼þ¬éDLœAÄÄs IIoûƒ"„BÑËȧh!„8T®Åí, )ãÊ G#Z§ŽÊu7±ötR±*z!)鄤¤yæ…XU•†YÔíØ@ݶõÔïÙ‚ênÀµ?×þLŠÞû–´Äœ‘gÍÄÚµ ‘v&_}-Û~6½-ŒÈÉç;ŒÑ$^wg°ÃB!D;HÒ[ѳø*ùî³Õ¬s±èü8]z†_0ƒKú˜é¼ ®U|»š¯«ÍL»x"C{QßâÌOšn'e\ÄHÄñ$e\EÎúç3ó÷| Iï.ÖXx Y ï„«æHÂ[ˆƒŒ‘±Ä_~ ÅïÿOE)ޝÞ#þŠ[ƒÖI 5)P¦E;VªºóØéô>k¿ÁXû &~Ö-¨^õ;7Q½aÕVà«© !/‡üÿü™‚·^$bü4¢Ï™…}ôd]+«mv#Ûçœ €ßYKù²‚Ía–¾ƒˆ˜8#ØaÑÌ™¶0ŠO&¦›¯;¢jKêªy®¬§ê?qÑéLVSïŽaÀ9¡(ºîUªìhÎ ßýÝAîzW°C=œ$½…=Š¿`_6æw7Âø+sù¶Ä…3zW}¸‰|£ w-Œ¹t"¾/Va˜=‹ "\Ûó§ü‘<>´l}4( ;:$~£¨5æò½3…뇗òÙCÆXñäoæßËŠ1Xu¸<áœåF…ïqèÕï¡tï—„ÇÆ!—=wW–°"“&RY¸–Ò½‹ñyê0˜ìÁ«WòT”’ý‡»ðÕV?ëf)i"ÄQâgÝLÙÿÃﬥô³·ˆ½èZt!Ö`‡ÕaÆÈX¬é¸öí9ñÁÇá_õ ™Ç;@Ñ1¾ëk—ꌦ¦E>So{çž©Xù9Õë—ãwÕ£y=T­]FÕÚe#c‰:û¢¦^Œ%­—ÇÖ^ y{ÑTõÄAÑ»/>þlY8Tt+ö€„7€NQ¸(,’)¶0Þ«r°°ºB’ß§ˆÉªcÄåጼ2³½{éyˆ-ÚÀ´{by{}n°C=\ÏxÆ !ÄAú¤ ÎÖvðÒßóå{ÉQ8{h$@sy‰œ8û®ŸÉ½aåV7ã‡ÃæuhZ#[¶×1jL•¿gsòÙÜwÝ…Üwq$ë¾É¦¦i²—FÅÖ½è÷!"}a{÷P¬j”çìÃ5` s®É//H\<{:,Çë® )㊠G#NäÐ"£ªßMqö¢ GÓ;ùj«È~â¼’?Ñ3® ù¦û‚•ÝÎl!ñš9øêj(ûúý Gtò"&Ÿßåc„šˆ!<ªËÇ9’¢Ó:t}îú#^]Bß{ŸÂ>r"(7.Þ*¥Ÿ¼Áî®%ë··Q±rQSY§î äÃWƒÂ15åRó÷ÁCˆ-L¯gnL¦æÖ¨8l:ù©«˜¬:ÆÝÉOÞè÷Dõ˜„·IžõBˆžÅÏÌŸ\Åý%Ãî%ûÛ/™·(—: 4ƒBÍÎ ¼þÙw¼¿­ Ÿ_#jøÌ™û(sà‡†~L‰W¨¬ª§&{¯,\Ê++Ë0(j%½ýe,ßTÆuKùû{?]œÍò~’¦LgZã¼ôŸxie1 =ðìYœ(m¢(zÎ r4âDâûÏDo ̤,ÚýA£é}ü®z²ÿpî’|"&KÚJ!Zˆ¹`6ƈhÊ>{ C÷I”vD̹W tñìȸK~Ò¥ýŸˆÎd&jêL>þO†ÿs‰×Þ)&¡iýîÉýÇl»ýBrÿñõ»6Ÿ’’/Çâ)/¡zýò ßŽÅ ƒ‚Íü¹´rŸ7Øa´›$¿»NoHv*o"ÄÉ’ò&Bˆ¥6{˽ÌAÿŒú¥jd¿šO©šŠºæ{òû]ͽ£LT­ÿŒe „öcBÈRV®Õã:‚>*Œøø)Ü11Å礤ÖHüÁ÷®=ÛÉ>“ÿ›‰Ðj¶ó·¯÷R` £ß9ç3Åè'ï›ø`Ç@~5ÞÒ‰uÄ»–ÏSOÙþeD§ž‰ÙäˆÄ‰L¡Ä÷»ˆ¢Ì¨*þWͬá}ƒV¯ ù¼ìûËÿ£á@ö‘I¿ïݾέÁ¤3™‰¿òg¼þ,¾ºÊ—,$þòŸ;¬3Ø#ˆžq9åKºæKEÛ ÚáÝ„)&ÄÙsI¼æ6ê¶o¤bå"ª×/Gõ¸Q]T¬\DÅÊE˜Rˆœr!QSg’rjË U}¿Íß½ËÔíø_Må)ŸÁ/ı¬qÖ2k_m°Ã8.‹NÇÕÑÜGØQå%¿oŠŠã£ê Þª,£^ÊžtˆÑ¢cø¥aŒžyÌD··AeÇçµlYP…ÛÙ=KI Ñ™$é-„èQìIñ(Ÿ.åOLX àó(¤œ?•t½WÿdjW-g~n(1ÑÑDåneã"Æ4ó¿O|\{Ÿˆ7‰Á/篹VÌnã§q}” ´ZV¯«gèM—Á(aéŒh\Êú¢ò¾Ù‚Ū£¡!–)cCzL tïW¨~7‰ƒ¤´IO‘<äŠ2?4 v-`Ð䇂Rϧiäþó÷ÔíØ€µß`ú?ø|—Ïø¢7ˆ9ï*J¾Š¯¾†²/Þ%î’{ôk'qö\*¿û²óË{(:Rþ`÷¼rDÑa9ûȉø]õT}¿„Š‹pfmÀ]R@ÉGÿ¡ä£ÿ’’NÄÄs {¶ÃšJ¤t•š+»´ÿN¡©Ôn[OÔÔ™ÁŽDˆ£AUy§ÒÁ‡ÕÇL~[u:nŠŠåªˆhI~·“$»…86Iz !zÅ–Âå7¦py+ûìƒÏæ±Á‡ŸuæÁqòÒð#ú°$2ëÆVÊ{(a\0稄°ÊŒŸ^¸=ñd"®C¥Mtz3ñýåƒZO•r&{ uíù€@ÑÉŸî“QôîKT®ú sB*~ówtæ G%DÏ 3™‰»ôFŠÞûÞªr*¿û’è­ýEîŒÑô½ç8³·wj¿!‰iXûíÔ>»‚ÞJÌyWsÞU4 bå"*¿ýoUà’òÆ‚ý”¼Fɇ¯a‹Ä>ü ÂFM$tØxÌñ)‹æ÷áÜ»»Sûì*µ[ÖJÒ[ˆäwç’d·'&Ÿœ…¢—s»”ç­ .ý< ¦Ð G$ÚJQt$½–œõÏÓX_‚#wqé]¿øZoåXò%Ÿ¼€!,’þ].Q¢b/ºŽ’OÞDmtQºè¢§Ïêž3šÛ(bÂ9DL8'Øa]Hr_’rI7ÜsÏT­[Nõúåx+Ë€À¿Uß/¡êû%@àjí?[ÿ!XÒ‡`í;cLb‡ËD5@ózÚt¬nÊÓ LžOÖÂl‚Q¼±`_F¢÷ä÷É‘d·m'Io!„èå³¼ ¥´IÏ“2ô:önø+šæ'ç»’ôî š¾¥à?Ï 3‡Ðÿá1'¤9*!z½ÍNÌŒY”}ùû¨Ù¼šðqSƒ–è$ŠNGèÐq„GêÏÀ™½“Ú­k©Û¶göö¦šÛ¾Ú*j\Cík·51Ç%aNHÅœ˜†1"cT†° aQÂ#1„†·zuÍ¡äúá΢ˆ¸éQ¢SŒè“FcnØŠ«ÊËËä×téCpB‡@BœI~·$»…h?Iz !D/W”ù1Fs±}g9Ñ^!¡IÄô9Ço(Ï]Ic} !¡ Á«Gqfï`ÿ‹¿ASUŽôûça8üÄ …­Š»ìfʾ|Ç× $éÝ[):lƒF`4‚ÄÙsñ7¸¨ß¹‘úÌm¸öíÆµw~g]ÓášÏKcQ.E¹'ìZo±N¢×£·X[ÖU×*©~ûªÑc½ñòbߪÀ1º) ºôËI¹3SJ2ÞE’·¾¬#‰¿ãvlþ°iÔ-˜GEâ š”Om‰Ë 7í@ OÁÚ_¥üÅyT{F´l£ŸMŸÙ#ÐêüèC q¼òµ5‡ç”û]õøêª1Ø#:çqâ4'Éïã“d·'Io!„èÅœU{©- Ô*ï1:½)ȉŽHvŽß ©> w/ ÿ÷;¤Ã[QÊÞg~…ên eÎC„?;ÈQ ѳ™bˆ˜t.Õ뾡vë:‹r Iêì°DÓ[¬„?ûð9TÓp—äóÿÙ»ïø(êüã¯ÙšÞC!´RDP©‚ ¨QOÁz‡‚Чžg=ÛÏ®gÁ^N³¢`GE%ôz !=!½oŸùý±)¡'™lø<}°;å;ï‰c²ûÙï|¿u;±dã(ÈÆQ˜ƒ£ wuÅ1ÛòØj럻«ÊO2‰‚±v-ùï/EírÝÆöŰfæ‘wšñi?fAüº^ UËÁT“Bák0ÿŽ~+Hýl×LT+¶ØÃ÷¹[ÚpŒ[ž&ãçlˆNÂÒ@]MuØ!ø$c !ŽIŠß‡’b·§OŠÞBÑŠ˜À m·«tL"NG›Ä‹°¶ÁQ[DîŽÙt:÷ï(Ê©›z&ñÔÕþüݸ+ˈ#Ñ—\£s*!Z‡èË&R±úÐ4Š™Cû¿= w$ÑÜk\Ö¸„#Vyj«q–á®®À]Uî}TWப@s9ñÔÕ€¦¢yÜxì6ÜUåØ2wŸàU\E¨;šÑ°´‰Á?…„x ” 45“¢â*+AT§ ·­tÿsŠ©á}< _ tÌ_éøxìû‚ÏÈåÃãØ ÑÒéÅo)v Ñx¤è-„­X~ª·èíÔ–ðvuN#N•b0Ѯǵd¬¥9ˉJ¦w¬Ms»Èxù~lÙ鄞;œ¶×ß­s*!Zàžýñkß{ÎÊÿD»ÉÓ1øèK´ÆÀ`üO¼+´-{;ÿyíiQÅY”#÷m²9 k¸W—Þ'¹5¦#u?þåsÌø_óÚü=‹í¹n =¬Bˆq¦¿¥Ø-Dã“nbBÑJUîÛD]e&qIã¥g°‹?kàíY–µù¿ú†ié4¬wŸ¢zÛ:»ö¢ã½Ï£äÿ!S›1×Þ¡*Ê–Î×9ðeÖ¸öpZïSTÉïSÓó1:ýýIï}€¨„ã} ÓÐ>þ>’øû^$ñ®ÿ£mçTʶV²—10¤ÁÉ8…h‰ Ùº‡áoç IDATu+f³ùåo¿ý6/¾øâ)µùÕW_ñì³Ï6F¼r ø}ÕÞ¼[R@•çÈ¢öâ÷zpgTAc-µLfçLã†O:0ào‘ ¼]6•_WðùY¬™YÚdïÖp½q0éé-„­Ô^ÞqIWê˜D4†€Ð¢†Q’½„’¬ÅÔUfš¨w¬)ÖÛ”-[€5¶=~] B4ð!—‘ûñ«¨;%‹~$J†§È`¶à×¾I0=ÔÍšDÆAKÔ•zàEÎG¤¾¶ÿyíf g~GÏŸÛº~¹‹ôýÏm_ßB& í3ƒ=ëž5 cÒqÏGˆ–$00Gy„§Ÿ~Zï(§¥µõün©=»[Ëõ"HOo!„h•4ÕMaÚ\‚"ºÝSçD¢1t욦²wÃ:§i™Š™Má` §Ë£oa ×7”­”Ñ?€ˆ¡—P·g¶¬4 _Üg€ÞNHP÷¾zGâ¤<ôÐCÜwß}œuÖYGÝfРA¬\¹’ÔÔTvíÚÅ /¼PßÛwÒ¤I¤§§³{÷n>ûì3¬Vký~ýû÷géÒ¥¤¦¦²mÛ6î»ï¾&?_ïùÝ’zv7¤µ]/âÌ&Eo!„h…Js–ã¨+ .I&°l-"ã‡Ý €ü]ßക霨e)_ñ+¹ÿ{ƒÕοŽ5¶½Î©„hÝ"Gþy'Qé¢ޱ¥Çrν#œÐóFèAˆ“’‘‘ÁK/½ÄG}„¡¡ÞBCC™7oo¼ñݺucàÀŒ?ž;˜˜þ÷¿ÿqÛm·‘””Ä믿ÎèÑ£fþüù|üñÇtëÖ#F0}útÆß,çåkÅï–^ì> µ^/âÌ$Û!D+”·sÎþg qIWèšE4®}§°õ·àqÛÉÙö9ϓɪ6® óí'ÑTÅ` ã½Ïص—Þ±„hõ“zÿ9¡åÒ´»á³EïXÂ…ô€)8 wuÅñ7Ö‰_|':vÓ;†'EQ^~ùe&NœÈôéÓyë­·Y?bÄœN'³gÏ ¢¢‚Y³f1~üx (..&99€””Ö®] ÀÈ‘#QU•™3gP\\̧Ÿ~ÊäÉ“™;wn£å¿öÚk™:u*ÁÁÁžR!Àû-Þ}û ¨­­¥ººšÿüç?Ì™3§áN“¯_/BLzz !D+ãvÖP´÷wÂâúš s"јâº^5° Ù[?Aõ¸tN¤¿š]›ÉxõA4· …w=Mè¹ÃõŽ%Ä#j¤÷ËUwM%k“uN#|•b2uQËžƒ¤ÍØÉ (zÇ⤹Ýnn½õVžyæýlKqqñ!ËŠ‹‹‰‰‰!**в²Cï,,))©ß/""‚ÌÌÌúÇ´iÓoÜaå¦M›Fllì)¼[“ÀÀ@bcc™6mZ“Ç—¯!&Eo!„he ÓçáqÛh×c‚ÎiDc3Í$ô¾Gmi?êœH_¶¬4ö¼p7ªÃ@û¿=@Ä£uN%Ä™%bØ“w,Ï’Egöï$qz¢Ç\×b'¶Æ%9|¬Þ1„8eëׯgæÌ™¼ÿþû¸ÝîúåDGG²m›6mÈÏϧ¬¬ŒˆˆˆCÖÅÅÅŸŸOAA‰‰‰õ¶mÛr饗6jî°°°Fm¯5 mòcøêõ"ÄÁ¤è-„­Ì¡MŒ&âºÊi­QBï›0š½½]ÒW¿Š¦5ÿx-£0‡´§ïÀSW@ÜÄÛ‰¾l¢Î©„8ó˜B ;Ï{wEõÖu8‹óuN$|•9<š6ãnÐ;Fƒâoù§ Ý#|Þc=F÷îÝëÇYHNNÆl63a‚·³Ldd$7Üp_ý5Ë—/'66–Q£F0lØ0úöõNæºxñbüýý¹îºë°X,¼òÊ+Œ7®Q3˜ QüÉbižßE¾x½q0Ó[!Z‘ºŠ½”ç¯ ¦óhL– ‰¦`ö #þ¬‰dmž‰­:—´ŸÎ¸±ÛÙ¤>ö7ÜUå´3‰¸knÓ9•g®È‘WP¾êwÐTJÍ%nâízG>*öª[@SÑÔ–ó…®9,’Ð~CõŽ!Äi«««ãöÛoç×_­_VUUŸqã˜1cÏ>û,š¦ñùçŸ3sæLTUeÚ´i|øá‡ –/_ÎìÙ³1TWW3f̘úýL&üñK–,iÔÌ M¦Ø†Nee%ƒEQˆ‰‰á‚ .`êÔ©DFFžt{ûöí㢋.bÕªU7Aâ?5ÕÏäp¾x½q0)z !ÄI²×°þÇëqÔ±Îå¨Ô!ÑŸrw~ h´;ëZ]³ˆ¦Õ©ÿänŸ…Çm'}í b»ŒE1œÖíùY¤ýß´ú‚wÄðqÄßòOS qf 9{ –Èœ¥û(MžKܵSA‘›JÅÉ3Xýi;iºÞ1„hbccX¶páB”ÃÆ¦_½z5ƒ j°™3gÖO>x¸””† vúAuò /0zôh¼óÎ;L˜0/¿ü’˜˜˜nGÓ4ÔôEÝ©’ëE´6òNT!NRå¾MÔ”¥árTñГ¦©äïú¿àvD´køˆh¬1´ï}µå{ÈÝÙ43¸·4¶ìtv?>W¹wˆacépç“2±˜zS D\x9ÎÒ}To[¯s !„âÄX­VzôèÁ›o¾I\\o¿ývýºÕ«W3aÂ.¹äFÅ|@QQ½zõbÖ¬Y :”íÛ·ÒæüÁÈ‘#ÉÊÊjÖsBüéÌè&„(:ñb:Ÿw7µåGÝ&¤M¯fLäUš³ {Míº_"=ìZ½Nýï gÛçx\uìY;ƒ¶Ý®Âhò×;V“©Ý½…=/Ü‹»ÆûSäˆñ$Üþ8J3Ýâ)„8¶È ÇQøÝAÓ([ú3Á½Ï×;’Bq ãǯ/l»\.î»ï>}ôQÆŽKff&W]u$!!ðNì¸lÙ2Š‹‹ëÛY¿~=Ï=÷|ð:tÐå\„RôBˆ“f0šé:ð½c!oç×ûŸ)´ë!C›œ ,þQtê'i«_Á^SHÆúwè:ð~½c5‰Ê”eìñ0ªÃ@Ô¨«I¸íéá-D bmO`×ÞÔîÞBÅšdÚßú«ŸÞ±„¢Õº¬SoŽŠ#.¨õ–vš»Ÿt\\UUU€wÍ… @bb"íÛ·'++«¾è=nܸCÆØNMM塇â7Þ k×®M–óü—Zï¤ÑΪ}d~÷ ;Ó;ŠðqÒ5J!Z·³š¢ ï#ámÏ' Tzœ)Ï™Š_p;önxŸºÊÖw eñ/³Ùóâ½õï¸kn#a꿤à-D 1|,[-k“uN#„­Û­¼à­‡‚‚‚CÆóþé§Ÿ¸é¦›˜4i“'O&??ÿñ»#""ÙÿÁÄétÝl™[KH ‰W½¤w Ñ HÑ[!ZÜí_áq{ ‚ñgMÔ9hNF“?Ýÿ Õã`ç’ÇuNÔx4›ìÿÉãŒ3¸üò˹ÿþûñx<Í–]q$)z !„ÏÓÈÝñ%fk±]ÆèœG4·¸¤Ë‰l?€â¬äƒ†ºñ]®òbv?>…’ß¾Àà@ç_!ú2ºGˆ–ÌBh¿!ToY«¢TçDBÑzÝó[5n½cø x‡)¹ð ùꫯ `Ô¨Q,X°€1cÆȤI“¸õÖ[yûí· :j»&“‰W^y… &пFŽÙèÙ×>Ô¶ÑÛ¢µ‘¢·Bø¸ì-Ÿ (Ú÷’™Ê?¤=Iƒ`çÒÿÃãªcó»9ÿªÙ(ßùS¯ºœä}öÅ¿ÌM ¸Ï:Þû<¦à0Ó !NTh¿¡˜‚Bq×TRºd¾½Åiq•±ï‡¨ËØI]ÆN}5’òÕ‹é3ÿÄnzG⌴dÉ’ãnãïïÏ{ï½wÄò)S¦0~üøúe111lÛ¶­þu»víX¹re#$Bœ*ßù$,„âu•™gþ@tÇ‹ MÔ78)n‡”™ä•ãtžþ­©gQö$N{9”ÁÖ9_Ö±’6=wmöܽ¨N œw# –˜vXÛ´eýŠ]˜LFâ¢B9·GGü¬f½ã !ŽA1™ <Š’…ß`ËLÅ–.wjˆS–÷ù›zGhšJÞoÑåÑ·õN"„B´JRôBˆ“¤i²·|Š£¶ð¨Û†w¡] Mž%{˧hšwöð„Þ77ùñDãñxT>ýy…%•Ür ½3ÎW×uÅÜ~ >ì6M7_Rÿ2-»Í»³ùÛÃñ—·-Zä°1”,ü€Ò䟈¿ù:'¾ÈQ˜CÙò_õŽÑdª6­Â–½ÿ„ÎzGB!Z)z !ÄI*Þû;—>qÌm¢/jò¢·ÇUKÞÎÙEt%*á‚&=žh\[Òsš àÝúUÖØX³užÛ]ï(BˆcLêƒ5¶=ŽÂÊW.$þ¦{@1èKø˜¢ù_Áþ/÷[«’_çÐþ¶GôŽ!D‹¥ª*ƒüý8˜ª¶îß‹B4ùÍ!„')(2 ‹¤Þ1ÈÛõ-.G }n]óˆ“SPR¡wŸUP*?;!ZAzz !ÄI MdÄ”ÜΚ#Ö-ùx`ƒËŸFö–0[Ch×ýêf8¦hL.·Gï>Ë-?;!|Bİ1|ýÐ4J—üLpŸzG>¤v÷Ü•ezÇhrîÊ2êö¦Щ‡ÞQ„h‘***ˆ‰‰Ñ;F‹RY)w‹ q"¤§·BœE1b¶†ñ0YC›åøÅ™‹¨)K ]‰ÍÍr\!„âDYcâ Lê@ÅÚdT‡MçD—ԦmÓ;B³©Ú²FïB´X|ð………ÔÖÖêEwµµµòÁèEŸ =½…ÂíY÷ŠÁ´hÑZX-fBƒü©ª±aw6Þ휖Îçr]P*Ÿm®FÌíº3* ›iuhv¯mÛÑ›ûTóÙâ|ÜœAÑ2DCmêfT{k’ë‡<âxlYi'µ½að tm7“Ý_§5úßµã»ï]ć}Oöâ¼úeÆ þM—è÷Ùý]ÆqóØs2š6 >lΜ9Ì™3ç¨ëƒüÜþ—vüóúöD„4<Ñyu‡¾Ïãåϲ©¨Ñç]§ÅèGÿ6c÷üMA nãôØH)šÏªüo±{¤È/Äé’¢·Bø˜ÒœeT¦Ð¶ÛU„&èœH4–ÁgweØ9Ý04McÕ–t§ì:b;C›³˜zYÛ~ZÆòrïGiCD7þ:.†Ý󖱬ìø÷]y»˜Š9{üÓh[Ѻ„ ¾„œ_Es9)[6_ŠÞℹʊXjÆrþ4âG÷Æàt ø ¦Eî¬ßÑeÔߘÉ$^²ƒ¬ÏÞ&û×›NªGaN“Ä¢°°ââbúõëwÈØØo¿ý6555<üðÃ'ÝæW_}Ezz:=öXcF=i¾Rì>Àé±³ªà[RŠ~>jñÛbôgPÜÕôo3F—âwk¾^Ä™IŠÞBácÒ×¾x‡Xétî]:§%)!– ûw¯­( ƒÏîJie [Ósؾ¶ÄMBR$¦5%¸1’†£Ô –H.¸¨ mÜ.̾f#ëËþœ K1ÓoøY„Wj´uïä«ê$nèPËž*‘¡h©ùµ8ŒQÃ:PSKËJ‚Ÿ.Î?¤ pÔãóg¯ò†ÛgÔ°Dªk¨Ñ1S –pN"^s¢Y kÃÖ—z°têÏäŽ.ÊܵlX¾‡\Ê[Ÿc !´ßP*Ö,¢zË\å%˜Ã£ôŽ%ZÕa£nïnìÙi8K q–îÃY\€ê°£:l8öå±’x ¯2’÷ìíÔÔj „4öo·_J †ŽW{(–øv¸~zìí‰ÄÝq þÎ á •ÿ{œâ,'†!/’4 ‡ª3¦Än°èq²ÓzÓ~úµ˜J²qÙ" _Hê…DO»@O%jTÏ~žâŒýÃô(±„]uÁ]ú§ü•àÚ/(Šö¾ŽÝ‘O}É> 1Gkc?gç*Dc ä‘Gáé§ŸÖ;J£ðµb÷áZzñ»µ]/âÌ&Eo!„Ïs:]TTV‘™•KQq)µµ6,3á¡tHˆ'¦M$V«ƒÁ÷§1(Í^FyþZb»^N`X'‰ÆÒ-1®ÁåIâ,zkåyd…¶'ÉZÂbèPÌΪX-&ªwmay^–Ný¹¡s(ÊÊP ôœHdÚf–Xz11ÐÀÏYÊŠ”bÔÈîÜÜ;‚èÐŽ„g¦0{—€®çsVüðC¾ùævìØÑà6ƒ âÕW_%22MÓøþûïyâ‰'p¹\Lš4‰gžyUUY³f V«µ~¿þýû3cÆ bbbp¹\Ìœ9“×^{­IÎÃ׋݇k©ÅïÖr½RôBø0§ÓEÚžL~ùm)©©¨„††áçç‡Ç㦺º§ÓAlLL¿szäË>j¤®zðöòî|ÞÝ:çÉ`P\n<Êr´Z¶îæÒNäkq°w;•íb ôhvHâ²ö.ÿ6úÕ¢Ev@)6Õoë.+õ~¡ër¢͘Âýqe–îœ=8Ï1`nƒ9~ ñ(Ahj &¸NøÎ£lCñýŽ¢åÊÈÈॗ^â£>bèС¨‡}Ùʼyó¸óÎ;™={6aaa¬X±‚‚‚fÏžÍÿþ÷?FMrr2ýû÷gÅŠlß¾àà`æÏŸÏ#<ÂÌ™3‰ŽŽfõêÕ¤§§3wîÜFËßڊ݇kiÅo_¿^„8˜½…>Éf³óÝ¿’¼t5AA¡\<êRzõꉿ¿?ƒ·Û…Ýn'??ŸõëSøtÖ¬Y¿™']ElLŠr”Bb V°{.UE[h×ã‚"ºêœH4¦=9EôìtduyOnCcšhÔfæP;¢CU;Û;1µƒàÎݱä®äû 7ÁÝúçöUi)|[Þ‰+Æ1/ÿèYêìÌ€¿Ð`‚”#‹G;þñÔÙÝZP°c $H©¤ªÚFyÅN~ÞeG3úà¡\õ¾IÑš{62!D£SLf¢xá7Ø2wcËLÅ?±›Þ±DR6Jþø¢¹Ÿá,ÝwÄzsx!}Щþ ±¶MÄyÈ6Ù·Þzëõ#FŒÀét2{öl***˜5kãǧ  €ââb’““HIIaíZï]§#GŽDUUfΜ @qq1Ÿ~ú)“'On”"fk/v®¥¿}õz¢!RôBøœªêfó3¿,\ÊàÁƒ™4i!!!hš†ªªxùôs>úx>x'þþ~:ŸÍ‰Û»álU9tè;¿ †Ç¾í×U[Y·=ƒÐàªjl”VÖ4¸Z´ƒÏ÷wÏ_¿˜™û—§/_I:ÀAÃï­Ü¾ÿIÅz>Ýÿ4sõ 2ë·HáãOËÓø$”€0¶®Þ@f™süÙ$&¸Óû¸Ç/;p¬#Ûøùç#'ìZµxÍË\{Ú_áÓ»öÂ?¡ ¶ìtÊ—ÿB»›îÅ`¶èK4¢ŠµÉä}öŽÂœúe¦à0"†!zôD¬1'×áÀ¿CCw´¹q®Œõ ¬Zù©žç|Dêk HÛðç&…ó÷?É;r[%¼'¥3¥:«C¿Ç î_V»™ÂÇNnß7ìyà›ƒdôúÁúc³ ;D³X¿~=3gÎäý÷ßg÷îÝõË ˆŽŽ>dÛ6mÚŸŸOYY‡¬‹‹‹cÇŽäççSPP@bbb£ä;Ӌ݇ӻøÝÒ¯!N„ &„ð)YÙyüüK21±±Œ;TÕƒ¦©õÿŸã#4 ƒÁ@DDƒ `ë¶T–­X‡æ#ã&ÔUf“±Þ{[™Å?ŠNýïÔ9‘hJeUµìÍ+>jÁ»9hš…ŽýÎáÊ úqUO…”¥œðð¥Bq‘#¯À]SIåšE:§Å]YFÆË÷“ñòýõoƒÕø[þI¯÷æË?Oºà Ôó\ ëñ7l$šFÈuOÓqústm¢xÁ†#&qn*A=ú5Ó‘Ä™î±Ç£{÷îŒ=º~Yrr2f³™ &É 7ÜÀ×_ÍòåˉeÔ¨Q 6Œ¾}û°xñbüýý¹îºëo¯ÝW^y…qãÆT¦ #÷_Ÿ@Ú·yîŽN ¼«ë<¼òE6]þ²ŠGßËhõïƒ(~¿³y É9Ÿbsùá@ñû®¾ÿeDû›ð36Î9‹•à^çQ¹aùéÆ<1•+È{iEóë ‹•¾ƒšý¸âÌTWWÇí·ßί¿þZ¿¬ªªŠqãÆ1cÆ ž}öY4MãóÏ?gæÌ™¨ªÊ´iÓøðÃ1 ,_¾œÙ³gc4©®®f̘1õû™L&þøã–,YrBY¤g÷ÉÑ£çwKº^„8RôBøŒêšRÓöJBB{TÕü9Œ‰¡¾ê­z‹àÐTïz»½ $±C›6o¡¨¸´Å½s·II¶÷@TÂ0â’®Ô9‘h,FƒÜluªäg'„o2‡vþ…”¯üêmëqåais3àŠGó¸ÉûüMŠ~eB5Ò IDATžU?ãpP÷¾t¸óI¬q vœð!—4_Ñ['aƒF5kvqf‰=bÙÂ… Q›€uõêÕ Ôð—/3gάŸ|ðp))) 6ì¤2I±ûô4eñ»%^/BœùÔ(„ðµµ6ŠŠK" Ûêñ z¯s"јb"BôŽà³ÚÈÏNŸ9Â;Ä šJiò\}ÈS⮩"íé;)š÷…÷Î:£‰¸‰·“ôô‡Zð4 SpËî pºÚŒ¬w!š… cÒ¸ôöD_!Eo!„Ïðx<¸\n ªêAUU4MEӌ孢©*ÔÀ¨âvÙ±×U£ a21( &£EQp8œ:žÍ±iš‡Í ÿŽÛY @×AÚAçT¢1”@XðéÝú}&ò·šл³Þ1„§(äìX¢½“1—$ÿûçâ¾ÁQMê¿n¦fG æÐH’žþˆ¸kn¥ñ?Z*f mÆßØèí¶áƒ.& £Lb)Z7)v7-)~ qt2¼‰Âg˜Ífü¬VœN••„†„àñhhš£Ñˆ¢ñŽz æÁå°árÔa0€ÑhDÕÜ(ŠByyF£‘àà–ûÇ>mõ«”ç¯ :ñ"ûNÑ9‘hl³‰¿ŽÆÊÍ»É+®Àí9±©"5M¥¼j/NwFƒ™ðà˜LþM÷”TÚ5r«¼-hW[„¿Ã{k¥!8SÛXïŠ`P ÄD†0¤OW‚üš(±¢É)"/¼œ‚¯ÿƒ«tUWÒoˆÞ©Ä °çî%íéÛq•{ï” êÞ—N÷¿Œ)4¢IÛfÌ$Š™ƒ«t_“§¹¬~´»ézÇ>nÌàHÞ}0‰¸(ß"§¬ÊÅ›³syç›<ªj¥Ð}:¿7-àܘqœ{ÅQ‡=wµN)OL³Œù™ï’^±Nï(ÂÇIÑ[á3ý‰Œ #'¯˜œÜâÚÆ&TUCU54Õ[ðÖT7ªÇåÈR1`0¨((8ŠKÊ ð#22\ïSjPÑÞßÈXÿÖÀz_ü'\>Åßjæ¢ó{žðö.·o’o¡¸j%D†vẋ¿$8àÈñ÷Zй©Nþ½ ò×xeù3$¤téH¢½dŒn!Î(‘#ÆSðÍG ©ý2[ŠÞ>À–•FÚ3wâ®, lÀH:ÞóŠÙÒäÇ6X¬tºïEjvlhòc5'ÿ„®X¢ZîßoáÞyÀ7 ÞRìn:O+òç°~ß¼£¿[º K£ïà­MRô§GŠÞBŸDÿsz‘š6uë6MhH0‹ ‹ÙŒÉhÀl6b21  qȤŠ¢°'#‹ü‚Bºtî@»¸–÷A£¢p#›™€ÁhæìK߯âß´=¨„oð¨.¾_:¬Â•ÄFöfâEŸãomÙ×ÇønöÕª¼¶ÊFKá©1Oðæ¯O˜»—š_¡XÌD=x(òÅŽg Kt!}Χjójª·¬ÆYR(Å¿¬no*éÏ܉»º€¨QW“pÛ#Íú{;0©I}šíxBˆ¦!ÅîæÓŠßBœ.éZ%„ðŠ¢0ü‚ùS^QÉæÍÛ±Ùlhª†ÛíBÕT<uÿ¿žú×JAá>6oÙAee%£/N``Ë¢rßf6Ì»Û(ôºèU"Ú Ô;–h4ÍÃÜeÓÉÈK :¬;׎ü¬Å¼¸­Ÿלåí…TPÿ¾êÿ M4Õ?ýJé›ê˜N¡‡èK¯@óx(^ð•ÎiÄÑÔíÙAÚS·×¼£/›Øìo!ÄÑMy7%½c—ªjÌúuÝ&¬á…O²¤àÝŒ¿ßÝ|ïŸ «e«q–± ó=½cˆV@zz !|JtT·Üp5ï|ð9éY¨šF¿¾=‰ŒÃãña¢iÚþÉ.½Eo»ÃAjÚ^6nÚAfV6çœÝƒçŸ£÷©¢¢p#)?ÝŒË^@Òà‡hÛí*S‰–bÞŠûHÍ^@xHG®»x~‘:§:9O «Âú|7ëJ |=õE®{û><•T}=St$¡“[öø‚BˆÆzîXcÛã(̡䈛0ƒŸLîÛ’8 sHþn<µUÄ\~ín¼W ÞB´ óW–’xå*½càðÔñSÆ ~ʘ¡w!šôôBøœ!ƒÎeòÄË)ÈÏ#}O&«×nbÓ–””–S]SKmêšZªªkIÏÈfÙŠÖoØÆŽ»(//§¸¤‚¬œ|Tµe|Ë]’½”u?Lª/xwès úO×9•h)Öíüí{¿ È?†É£fè­sª“g2Àë—êç-–|’a!뉗ê×—½ÿ ¶5­k¼V!Ä1(ÚŒ¹Om5¥Ésu$æ*ÝGÚÓwà®ò¾7‰ºä喇RðB!„¢·ÂçX,fþrÅeLŸv=ng6n&eã6-YÊ՛Y³~+×lá·äU,Y¾Žu)›HÛJMun·›Œ½Ù¼õÞçlݾ[×óÐT7ëßbý×ãqÕЩÿôþ´®¹DË‘U¸‚E)Ï`5sݨ/ ˆÓ9Õ©‹ðWxgtFT ÛŒÿKÏz'²TUŠžzW^Þ1…Í$rÄxŒÁÍÿ |à–ë3§®†ôçïÆYìý}1l ·>¬s*!„Bˆ“#Eo!„ϺpØ@žú®¾âbT·;¶³|ùr’“—°xñ6¤¤P¼/Ÿsútå…gà‰ýà@ªªªHKß˧³æ²iË.ÜnO³g¯)MeÍ·W³{Õ¿÷/Qè~Á“$ ~^TªjóøqÙt4̓¢Á[D…vÕ;ÖiëßÖÄÔþ~Õª¼\Û•ˆi7 VUSô¯çÐì-lJ!Äé3øuÑ•€w(ÊõËtN$4·‹Œ—ïÇ–@è¹Ãé0ý)éá-„BŸ#cz !|–Á` *2œ‰×Œãê+G““Oqq)u6‹™ðð0:´oW?ae×Ήüó3ÞšIYY{F¾ùá7jkm Ø¥>ÐÕUì%#å]rwü9i—5° ½F¾LtâÈ&?¾ð .·ï–ÜF½€¡}þAçv霪ñL?ÏŸE{]¤–z˜ŸædܘË陚Ní¢e8÷dRüüë´yú!½c !šAôèë(úyšÇCÑϳ=o¸Þ‘Î\šFÖ»OQ½m]{ÑñÞçQ ÒOJ!„¾GŠÞBˆVÁd2Ò©c{:ulÌí†_0€À€ž|v%%%ìÍôç·ä5xT•çõÁb17z6—½œ¢Ì?Èßõ-e¹«Ð´?{–ÇvGÏ/`ö kôã ßµ(å K·еý% ésΉ—ѯ\È_æTáòÀSKl̽ÿ\Y98÷dR»h5û4æb½£ !š˜%*–°#)_ùÕÛ×S·7•€ŽÝôŽuF*øæCÊ–y'M¶DÆÐùá×1XýtNå•ùÆ£”-ÿsX$~ ]ôŽÓ Ø«þFp¯sõŽ!„Bˆý¤è-„8£Fœß—ûï½oÍ$//€€V®ÝŠÛ­2|hŒÆÓïÑT]²“Us.ÇV•ƒÓVh‡¬‹íGçóî&:±õôÞ##1w@H`[Æ yÖ8äM—#·÷÷ç­µ6öÕª¼³EåŸO>@þ´¢Ù씾ù!~ýÏÆã{“v !NN›±×S¾ò7öýð1ÿñ‚ΉÎÀ®s*/gQeËÀUQŠ«¢TçD s•Ñã•Ù(F£ÞQ„BŒé-„8C¼p0Oç@ÛãQq:]8.ì'v‡›ÝNÍŽÍî Îf?äQ[gÃfw`³;°;¸Ün†9‡ï¿£6mÚ„Íf'#«åk¶Q[wê=¾£;ŒdÄ” œð#=G¼HÛîWcñhÄŸ‚hmR³°-ã[b"z1¤wëÇûh†u03¤½w,ýE{]¬ÎóýÈ=B¼=ÜËÞÿWv®ž…Í ¤ï úÞÞåËà(ÈÒ9Qëç©«!ãß÷á®* 抛‰6VçT‡òµ"²=7ƒšõŽ!„B¤è-„ð!Þb·VßsÛérár»qº\¿íN'6›cÜqP¡Û‰ÝîÀápÖoëtºèÝ«;wL½—ÓÁŽ;p¹Üì+®dãÖ êl½O[œlŽr~]ó/ŒF ㆼŽÁpæL»ñÐP ¥ÿâò:ˆŒ òÓÐNJ^yWÇtBˆærpoï¼/ÞÖ9M릩*¯>ˆ-;€ðAÓîú¿ëœêPšÇMÅê?ôŽqÒ*Öø^f!„¢5’¢·Âgx‡.ñàQU\n÷×(€ÛNÎý…ïƒ áv‡³¾`îr¹Ñ4:ø<øÇTJŠ÷±cÇêêêøñ§_yê¹7q8Ns¨!Žc馗©³—0¤÷½D‡uÓ9QóêadÂYVRK=|¿ÓAШ ë‡9±oØBíïKôŒ(„h÷ö®X›L]úvµ^¹ÿ}‰ê-kìÚ‹ÓŸ¥eMš\³k3îšJ½cœ´Ê ËõŽ „B¤è-„ðÚa·¶*û?˜išvÈãí÷/SUMÓPkïð6ûž}wN½‘¼Ül’““Ù¸q#ååGl'Dc*,ݦ´/h~{Ý¡s"}üý|‚-ÞÿKßXcÇæÒˆºÿN?o1¼ô™¨0ɬ¢e‹¿é^oñUÓÈýä5½ã´J…ßÿâ…ß`ŽŒ¡óïc°úéœêHuéÛôŽpJ…¹8‹óõŽ!„Bœñ¤è-„𠊢 (`00 FŒF&“ “Éèý×hÄl2a±˜±Z-Xý¼?+V? «‹ÅŒÙlÂlò>L&F£·=‹ÅÌ…Ãr÷7c4hœÕ½3¿ã&¬V‹Þ§/Z-…kGÓT@aÔùÏ`PΜaMá¯pK_oÑ¥¤NeΦ¸Ân˜€§¸”Šÿ}©gD!D3LêCø QÔìÚDÅêßuNÔº”-[@þ—ï` ¢Ë¿ÞÄ®sª†Ù²ÒNy_¥Ãít¿wÔ!vZÖTìy™Íp!„BË™ùÉZá“ ÃþTUà(hš†gOnU5Ô÷ìÖ4 EQдƼ¯´£( F£Á[PŒF#Š¢0x`;Äãçg%*2¼¾W¹msúWä—l gÇ+ißæ|éë¯}­|¾ÅN¹]ã¿Lìi%tò_¨Y𮼪æüHðØQ˜;ÄëUÑ„ÚÝðw*×-Au9ÈþÏ „œ3ƒÕ_ïX>¯rýR²Þ} 4 Åd¦Ó¯àŸÐEïXGå*/9ÊWÜCtt eŸ}@usL¿3™ÄKvõÙ&Näþ?GaN“GB!ıIÑ[ás¼ÅjoÁþœàòÀsð¾•ýEñƒ÷;ü_E9ð¯R_Hhß¶ÙÎGœ™ìÎ*–l| «9˜‘ý×9‘þüÍÞÞÞ3VÛ(®Sù~—“I½¬DÜ3•}>…ævSúÆľöŒÞQ…MÈÝ–6—_Oáw3qWWÿÕ{Äß|ŸÞ±|ZmÚ6ö¾þšÛŠw>Ip¯óšåت½GaŽ¢\%xª*pW—㮪ð>j*ÑTª­Ö»½ÓêtÖ¿>BÀ`ÂCÖ“¿º'1çGP½¬Ì»÷è­s¢–aro+ÿÝh§Ê¡ñá;×ô°0ø<üÏ;ÛºØÖnĶ~þçöÕ;ª¢ Å^}+å«~ÇQMñü/‰r)]zêË'ÕíM%í©i¨ï¼ío}ˆˆ F7úqT‡º½©ÔeìÀ–¹Û[è.ÈÆUQÚˆG1`z!ZÊ‹¸R qO‹ßŠÏ°«ü†ß€ßºGHû¥ã ç dÀoø¤Ã–Öœ¦`¬M¡ðËÕhî¤ÛåçàßæZ‚w?EÚ¼\”¸›è:õ|Ê~؄Ӷ€Â”¬ãž%4ã9Ò~Ì‚ø)t½þ*þý#®ƒº€kÎæè~.„Bˆc‘¢·¢Õ9ZñZŠÚ¢¥¨¬ÍeÃîO jϹ=þ¦s¢–#È¢pc+דּSP­27ÕÁÕgY‰¼ç6roº T•ò÷?Áÿó½ã !Z%ƒÅJ´ÇH{jšª’1ãaz¾ñŠÉ¬w4ŸR—¾´gïª/xÇ^y Ñ—\Ó(m»+˨ں–šmë¨Mߎ=7Íã9áý +¦à0 þý0y—›-,VjvlÀUYvèN¦D ïA@ÉSt¼TÁÛS÷9äîð`™Sh¨Åù¸5ÓËO¡â.+õYâr¢-˜£Cqn)@+ÉÃz6–ú?7,mb0ÇO!!^%MMÁd×A§®˜äc¶B¡7ùk,„B4³å›_ÃãqpQÿ'ÎØÉ+æÆ>~|¼ÉA­Kã?ì\ÙÝŠ91à1S=o!Ž]iÔ&/'päzGB4¡àžý‰ºèJJ~ÿgQ>¹ŸÌ ý”õŽå3jvmfÏ wã©« æòh;ù®SnOSUjwm¤bÝRª·®Á–ÚÑG¸¶ÆÆcm_ÿ°D·Å94SHØqÇiÏþðJ~sÐc¿kð_ó0{æfy Õ‘×Ðñú˜v.ÄUiÃaŒMÀ¤ìÆ}IJ]Ç9KWQÖ¸6@.JT{,åù8µŽû¿hUqåãÈ}›¬…E`ŽÂnÇqX­ßvœã!„¢©É§l!„¢W¤²-ã[ÚFCRÂ¥:'jyBý&õ¶òÑ;Ù•*óÓ\žd!ìo“©Y¸Íé¤üÃÏ>ÅhÔ;®¢ µ»éTo]‹c_Å¿Ì&¸g?Â^¬w¬¯fG {^üžýãbÇ\y í®ÿûI·£©*Õ[×R±ú*Ö-Æ}xÏëýüâ;Ðù,»œE@§³ðïØ ƒÙrZç`9lÒb¥-—´¡úÜ?'“,[JµÿSDÆ.dßÒY8ÿþºfáª5âÖ4ìG,;ÞBŽä÷¨šú§W@‰ÊÙ/਼ wÏÛ‰ú<¹ÉïS3õ1:u+Eõ À•ü*yE5‡´b‰Š;­sB!Äé“¢·BÑŒ–n| MS~ÎC€ ÑÑ[úú1s£UƒÏ6;¸<É‚©M!W£òËïpåäSóÓB‚¯lüqi…-‡Ñ?Ž÷½Dê£Es»Èz÷i¬± ø'&5Jû©ÞBíî­X¢b±¶íÐ(m6$ö/SîÙ¿ÉÚ?XùŠ_Ùûú¿ê_Ç]sqo?©6ìy™”.þ‰²%?ã*/>b½µM;‚ûœOpï÷>Sôl8ü¿±–Gñ³Ó[VDÉKwìñ+YOüzD; -;@]ù©^ä|DêkÞ§…36¶å7ìyà@¯ó, gÜ}ìì»s½B!šž½…Bˆf’WœBZîotl;œ±CtNÔrEú+\ÝÃÊ×;l-r³¹ÐÍÙ±&Ânœ@õO¿¢ÖÔRþñ—¾Åzz½ …-[@§Äß|9ÿ} ­–ŒW¤ÛsÿÃ~ZíÚ2S©Ý½gI!Î’ÂÆˆÛ Wy =^ù Å`h²c iäõ…ßϬ_ÔvÒtbÿrbóF¨ö:ÊV,¤tÑÔîÞrÄú€ŽÝ0’°áß±ÑbMPs0ø ÚëšüXÉBg½c!„g<)z !àÜò ÏË“Gq¬Á>Ÿ·‡Ó}Ȳب0Æë×´E«°tÓ¿÷?S¸ðœ‡uÍâ &÷ö½fmspv¬ CH0¡¯¤ü¿_à))£zþo„\5Vç¤Bˆ¦}ÙµÔ¦m¥lé|…9ìyáº<þ.Æý“žŠœ™/7bÂc³çì¡léÏD^xy“´ï®©"ë­Ç©Ü°Åd&aÚ£Ç?ž¦Q³s#¥És)_ýÇfkl<C/#âÂñXcÚ5Iö£QÌBzŸOźÅÍzÜÓÚo((Møå†B!Nˆ½…-Ÿ»Œ¥s—³ºÖŒ¿ÁCm‘^—ŒdlëÉ ¡¦œú€7ŒvŠ{Š3]nÑ:² Wеý(b"z霨åëeäܶ&Öç»YîäÁþD¹ö *gÿ€ZSKåçß<îR³¼¥¢µëpǸʊ©Þ¶ŽÚôí¤>ö7º¿ðÉq'DlHõöjv>„EÓ*š÷E“½«·®eïëÿÂ]U€)$œNÿ|‰ ³Ž>œŠ³¤²Åó(]òŽÂÜCÖ,VÂŒ$ò¢«>«ßþ õ>ô2Ÿ+zGޝwÑŠhǘ,V!ıÉ'D!D‹çÉÝÆ|{wž¼1 ÀS–Å’Â:6’«.:¿Ù~Â7­ÜöÖþg Ãú> k_r}o+ëóݸ<ðõ'wœë‡!0€k¯ bæ,ÜûŠ©ùå‚/— A…hí“™N¼Bú3wR›þÿìÝwxTeÚÇñL2é! i¤Ó;‚ ÒQŠ((6Ö¶*v_ÛºîÚ×îÚu׺öÞQ@PÞ{h©¤“žLÚôóþ1Á„™îÏuåÊÌ™sžó›1’É=ϹŸíX ²Éxì&’x]`È1U>÷óS”òКò2©ßµÿ®}NÊx®†: ?|‘Ê%?Á¾Â˜_j/î~CXd‹ýÝv5kQùûê¶­ƒ}ëKìç—Ú›ÐQª×üÈö2Ï8ž–” !A>TTÖ£HSî6V¨)©Sw”ÌôÇ©¼fù¿Ðy‘¡½½œ¨ã¹´»7×7ápÁgÛlœŸì¹#ಠ©ýöGT«š¿ÂÜHÐx¯÷¬¢íh}M$=ð ùŸ>Cu:š·kýÌD]r#!#/ 1k;KÒà™ IDAT%_½‰eë³¶£ºÝ-Æ1%¤rî$B†O8æv0Þ¤èô$Þûo²¼÷ßíháíB!„8€½…íž¹sÊì…<»Ö€IN»B̸á$h4†ÐuÖ"^Í3a´Ù x.“’¢±,[Äûyþ„…†’·…UAûGSè4p0Ý¿]Ä‹ùFTWc/2¢Ô.ôôÇoÕ¶7O¯U™å}|BMÆ$˜ŸegC±“¼7ñA´ÁA˜'Çòíy…4®XƒiøoÇB´E«#þ–Gè3„‚÷žÃYWƒµ8]ÿ æÞƒé4éJû m1ó»© ûäæˆ¿™´©Ùd¼²–¥æ–¬%‡-z«N9;±lZAÕ²yØJ‹z\côÁ/¹'Zs  ¿£ðã—›{zLÁ”ÔàÁ£ 2cdì1>³ö÷K*¾]R½C!„ˆ½…ížâÃ…WÆpakúF1åÊ)Ú8‚‡h™¤Žªòc(iwÓýÁ~T=v%9vÀDÈÝ/¢ûì6ÊÊŽ¦”}ô¬ùYÃ#q55଩ÄV^‚£ªŒÆœ]Øö`Û[€êrµŸêåó0‚û–lL3þŠßóoÑ`;à!ÿDμ_[øbýñ)JJ{Ûtte{p¸cÑ(ûf›zqÓø¹jÁO¥î«§)Ïi:èLï?OÁûÏû“üÓlnE«Ã7. SRLIÝðKé…o\òþ~nB!„g4)z !„§€ÍQÏ–¬/ L!%vœ—ul¦v5ðßuVöÖ»YYààœ8=—O¥aÑ2j>û–NÿÝ›Q…^dJìJÂ=ÏÑyoÕËÁ²u5 [[Ÿ9}¥j.…ë¦wI_²?ÏØ·]ƒqÔ͘3'ó§B”¨«I™yõÛÆà³îdÎ/C{öÓŸ½oßÑ·˜ó™³ó æzRfŒ§æùÙ8Zé>r<4>& ¡ð‰ŠÇ¿ç üÒzcŠOAÑNÎ „B!NRôB!NÍ™Ÿaµ[Øí@fÞ¨©]¼¹Îº¯Å‰½¹èm잊O¿^X7m£ñ÷•8KËÑE„{7¬«Œ‘±D^r‘—Ü€«©‘†Ý›±í-ÀQYFÅ¢Ù8-Õ­対ì%*î|’Î=¦ †ð@ì[=«b«EØûáâ=¿Pq—ãT÷íÛ)}ÌõÄŨ ø£º7 Ó€ãÀš»Fƒ¢Ñ6ÏÜVU7´²ðdkÜÖF¬E{°í¡fý`ߌïøüR{aîuæÑú™ï…B!„8MHÑ[!„8Éܪ“ »>À×BÏÄi^Ntzˆ Ð0(ZÇÚ"'¿æ8¨µªúx>L¼ôB¬›¶¡º\X¾CÈmõrZ!D{¡õ5Ðwhó}[y Õ+~i}gµœê¿&àž›ñ·©Xqc/«ÁÕ (D ‹ÅP]DeMaÁ@ÚÈ8tÊ.À½¬[áä-(}Æ`+¶?M2žq'S®:ø´NÖâ<svѹúôuXKò[´4ÑŒh||qZjþ8Öå¤1g'9;)Ÿÿ5ŠFƒ)©;}†8h¦Ä®!„Bœi¤è-„ÇHu;ÉÝôM–üY늼H´7ùó°4x~ú¥þÖÇˉNÓºY[äÄîRù9ÓΕ½Œ˜† F³¤”º9¿ô×+ÑøÊë.„hÉsøjQ4g8]ï2`Åmñ›Xfþ„ÛjÀ_GíWÏPW]EÈO‘˜’‡£A‹SU7¶ÅoQ?ó!Ó*qû˜p,~‘¢²úƒ†7„Gµ8¥¢Óã—Œo\2¡#'à¨,¥zÕ¯Ô¬ûú›<‹XÚm¸í6t!„œ;Cp9»¨Û¾GµgNÕí¦!3†ÌtJ¾}cD4AƒÇ4d ~)=OÊk(„BÑÞIÑ[!ŽQYî¯d¬|ÆÛ1D;¶nçÿÐjôôO»ÆËiN/ãõ<¡Whp¨ÌÚek.z£Qœ>…Ê×ÞÅ]ß@ÃÂ%˜§œçݰBˆvÉ”Öb›ºû2v7ßùþ1Òÿ²ÿþ&ö¾¼éOGüBÞ#­ÌoØÂÞ—ï<æó·FA§É3è4y¶ÒBÊç~Iå’Ÿp5Ôᬭ¢lΧøÄ$sÝ}tù¿§pT•aÙº†º­k°lZ‰³¾[i¥?~Léã݅Б2búàŽÓ*ãѩ߱Sb7/§iß ¢I¼çP4ÞŽ"„Bx•½…â„÷ÄÇ¿3ÖúboGíPiÕvŠÊ77ßN^NtzñÕ+ŒMÔ3{·ô2{j\t Òà?q,Õï~Š»© Ës¥è-„h•¹÷`­ÕålósÂ"1FÆóqƈb®»¨Ëo¡töÇ”ÏýWSÖ²ž¼°Ñ}Í=„޼€Ð‘€ªÒ˜½ƒê5‹¨Yµ[©çê#kÑŠ>{â/þC@ß¡„޾Àç¢hÛ֢=Ío€Æœ^LÓþ5æì¤rÉ9žŸ!D›±9`ÂcYôÅÏ 7z;Ž)z !Ä1ó ˆaäuk¼C´S›3?m¾=°Ûõ^Lrúº¨«‘Ù»íÌÍtpë OÑ[ãï‡ß¸Ôý8{F6¶í»0ö^¶BˆƒiMþøwëK]úú6?wàÀ't¼Ö×ΗßB§IWPòÕ[”ÿò ¨*¿ý€eó*îy¿ÔÞ (˜’{`JîAôŒ;hÌÞAÕòùT-›‡³¶ Õí¦vãrj7.GBðÙã7 ߸ä“ôLOžÂ_ôv„§äË7 9ç|ÞÛQ„h—\n˜~Ëݸ÷f£h´h7}º%qã5וÚçøÆ‚ÜwKÑÈ5OB!ÄIbsÔ³=g‘!½èÖÏˉNOgEë3yÞÂÌͲôXÀ´IÍ·-³æ¶i.!DÇ2|‚WÎ:ú“2ŽÎDì Ðõ¹Ïš ÕöÊR2¹‘²Ÿ>k±¦)©;1×ÜC¯·ç‘xïóö?EãùwÔY[Eùü¯Øyïeìúû_(ŸÿÎzËIÉy¢swcÙ¼ÒÛ1:{e)5«óv !Ú-ð×8xê¥×™5k_~ñ#ÏÉÿ=ô0•ng%„訤è-„Bœ$Ûs¾Ãîl _ÚU^NsúÒ(01Å3{-»ÊEFå3j É øôòô{mX¼Wmû(Ü!Ú—às& õ3·é9Í=u?ï£eJìJ×ç>¥ÓÄ+@QP]N ?z‰=o<‚ê°·Ø_Ñê2†¤¼JÏ·æ=ã|¢»4?Þ˜³“‚ÿ=϶™ç‘ûÒß±l\êvŸÔÌÇ¢|îç^;wGW¾à[oG¢]S7]•BÏm£?½Ï›Â¥—]ÌŸ½ÙüÁá×óWsÕ_o`ÆŒ«¸ó–«©ÍÏ<­L®¾õ –,Ù´+®âÝçîC{Àت ¿ú_½ýt‹!…mGŠÞB!ÄI²)ã| të2ÅËiNo’ Í·Î<¸°c¾h"ªÍNýÜ_Û4—¢cÐŒDLiÃ'…ÎWÞ~j†Ö鉹î>’xÁÓG¶jé\2ÿu κÚC§'â¢kéþÊw¤=õac§¡5ù :ìT¯ú•¬gîdÛõc)úäU2¶µiñFuØ©Yû{›ïtS¿k ÎÚ*oÇ¢CÐA@Ä¿°eW¸ÄwíÉ‹¯¾Î§Ÿ}°AC˜õÝ;€§I]©•µ+òß÷ÞçÆ¿ßŽ²0Uá­¯¡©«å²<H !¼CŠÞB!ÄIPP¶–òšÝôH˜†AççåD§·>‘::›=ocæý©èí7ú´ÔÍžn™a#„h©Ó¤èCÚf±áГðKíuJÏØÿº½ð%ƨ8êwm&óñ›Žªðé—Ú›¸›¤×» èrûãøwïß\¨qÖ×RúãÇì~ðZ¶Ý2‰üwžÆ²yn›õ”>Ÿú›p5ÖŸÒsœÖT7µ›¤5ŒÇ"ά¥Þ ¸= ÷êâO'³PúœG~U]󾪪ç†kFéÐ' h¶/ßÍÎ5‹xü¾‰ ÷³Bì' Y !„'ÁþYÞýÒ®öb’3ƒLL1ðÞF+7ÛJôŠð¼­Qôzü'£ö³ïp–дn¾ƒû{7°¢ÝÑ}H~ð ¬E¹§ü\æ^gòs£âH{ú#2¿™¦=»iÊË$ã±™¤<òúà°#¯1 1™“±•Rõûª–ÍÃVZ€£²”Š…ßQ±ð;4z#~i½ñï1sÏA˜ÒÐ}OÚsiÈÚ~ÒÆ:SÕo_GèÈÉÞŽ!D‡Q[F3h4¸Uø~ö6¯Z„N½;1!ÌÕh!8<øcÁX—ÓÉs¼JT´ ôqÈîqQq„GÅ>þO¡;g' YÛiÌÞACölE¹¨nwóþªÓµ8kqÞ ?'¥Ëµ$LÕRôäÍÔ7¨ à?鯘c—R…‚&áBbnÄcÎýäoïBÔ-×âk¯G¬PûÁÔçÙÑ {–ÔÁXJô躤Á¢‡ÉÏìEìm—¢«ÈÇÑŠ9x»ßÞKøM7âçª?•º¯ž¦<§©E.íðçI ‹¬Ò™¤üiÜæ¹ßú$Âï¼ Ã/Q”¾oQ¿~DÞx ¾ª ¡˜Š÷^§ÖÑÈ™×àk«‚_¬?>EÙþ1ü´x¬4øARήÁf+¤âÍO¨? úï´Tã¶5Ô¶3Bœ.\.;—Üý,ª¢E§SèÕçlž{áŸÇÇ0rÄf-ù‚+®¼šà FM½–Ì•»0ª°Ó#"€©×]Ë¿^|œ¿ô1|NùóB´$Eo!„âä/¡¦ÞsùpŸäËÑjôG8BœLç%xk½§ÅÉÂÇAEoÓÙƒÐE„ã,-§n΂®½E/o}„gE§'áîgÉ~în,›WÑ”ŸEÖS·“òèÛhŒ'^„Q4LÉ=0%ÿ1“Ñmk¢© ÛÞÏWÑÏ÷ò’£ZTóÐ4úž{ÅÞ‚7€j¡þ§W¨4Q Ú†µ¿µwòí¤Mê‹6߆cáÓ”l.F;ì9R‡§R‘—ª‚¶a{¿Xšx+iôÇÔùrŒk kA9ú‘/ÆÑ·˜ó™³ó æzRfŒ§æùÙ8Õc¤Å¸}Q6ºÎßx)>¿?NÁþ‚7Œ£nƼû2ç•¡K›ˆ9Ø„±Ç͘3'ó§B”¨«I™9™êÅŠgÿ??ö+è­«Èzýw\­Erµ¶Uˆ3›VO¼ý ¸QÑ `š-à¹ê$Í 7ÿûU"pVÀÆG`ÔÃkß¾›Ç‡ÌìÆQV‚ÀfEÕêÀaEÖÄõo@ G)×5ï묪ôôÇvØQµztÁ¾8öT*΂lìý4è;E ¹ž¸T÷tp²Žüçqu€Ãè{è\»Š¼*|¥0t ƾuß9wÿL5:Ì#±oõÌíV+аöÁ xöׇ·|L¯¸q–ã¦uŠV{¨°Bœ±  žÎx†}_0žfPZ`ïîøæ-1D´ÿŸ·ynÅÄÔBˆc%Eo!„â8YŠÈ.Z@bçQúÅx9Ñ™il¢7[ɯu“Qé"5ô?ðÍ“ÇSóþç¨N'usHÑ[qFÒ}HúÇ«d<|=MùYÔ®_BÁ»ÏwÓƒmšCÑhІ  v<ÃÞ#h1M¼ Ÿ3É]Þ€~Ük˜£•CœMÅi±£ 1Õh£Ð+ØËб¾AÞ‚2Їa ¶b;æ‰Ón‹$'ÿ ®MÎ~Û7Sܽ¢cT' m·‹ Qb)«Ù·­%,Cu1v5Ò3N+9ÔpTµõ©çŠÞ ­M„Bœ±¤è-„B§-Y_ ªž¿~û§I¿hoŸ¤çÃÍ´89°è­ Â4|0 ‹Wдa Î’RtQǾˆ›BttZ“?Éÿ|]^‡£²”Š_¿ÇMäE×z;Z«Œ‘±-¶©y‘ûõÄÜó.öFÐépnÿ˜Â0øÏ{»±¥o@wÁƒÄ¥–bß›‰£ëå„Do¡ºÅÈnl˾ÁuëtIÎÇiSp©nì‹ß¢~æC$¦Uâö1áXü"EeõÇü\T‡ Çê(îú qã2ÉYŠÛâ·©»å!’R,(º"Ê߭Ö÷&–™#á¶ð×QûÕ38"ú*¶Å-³‡õ9ôkØ©ó1gB!N‡ú¨ûdÛÚy”Vnn[kß•£¼¿ÿKÓÊmí·5Ü?ð{k_ç444< ࣜHoº#+­ÚNAÙjtZ’cÆáïÛ锞O!Ä‘©ª›ÿ~?„ºÆ̦(n¶E9ù—‰‹#s«0âÃZ*Ýt Óòýe=Þ´z={ï{ € ë® øziC#„8sY sØýÏkq55€¢xÏs ãíX-Ômß@æc3Ûì|JpüŠ¨Ë«AÓÿaÒ,`×»k8TûîŽ øœóIø¿§¼ã”ùiáFÒÓÓ™9³åÏIXX˜ !ı«¨¨h±íwÞá®»îÀÏÏï!`9à:Ä—»•ïê÷Õ¶ýùö_åýÃ}?Ò6³í¤ÿÊ•™ÞíÜêíÿeɦçPUO—6ƒî ¦þˆØˆ?MepV±ôÇå¬nÐã«qÑШ¥çøÑLŠs°ø£Ÿ){ —Åì›ùæ®ä‡·—âséôß»–/V•bÓiqÛíÖ+'÷ ΀BˆÃÈ-^B]c ½“/“‚·i“ ç«í6vV¸(°¸‰ øã¿‡ïYÐu ÃYVAýÏ ¾îJÏABqò‰I$ñþÉzêT§ƒ=oMûÇÈMgCH/†Z7ðŸ%*fLåþk§ðÀÌ‹øK|;Jìþ žBœj[³¿< XöNºÌËiĸ$}óí_sì?¨QðŸ8gYMë6¶e4!„hwÌ={ýßÏ‘9ÿ¾{e©—SLÑêè3¤íNX»‚¢çî$÷?’ýÔ£T:Úîܧ‚¢!hà¹ÞN!„Bx½Û±Òªôæ^±ª©Ï§¡éàË´Ó¡¦óÆ·+™»>›,w$#º£|’{Ó¯<ÕÔ&Ö¯)¥ûÙ]hÈÊGß»)Ík›èˆ0„óã §¬ïBœšlUdü@|ä0ýeKo­'Àèùíµ0»e¡Â†@RcÏ÷r±ßèOÑۭ²¼Vf{O€êpRÿËâ6Í&„í‘¢Ñp×Ó˜»P»~ …¼àåTP4D^|ƒ·St8ýÏÁ¿ûoÇB!¼J²lÇtZ#—Žþ˜EždOÉRô:?ºw™Âð¾÷µØ×Ü9eöBž]kÀ¤§]!fÜpö­]‰1–±É«yrG,ÿ8ψh#pû¸u|ñåÌÓëТ¢êC36éo"„­*©ÜByÍ.º'\„Nkôr"±ßð8=Z\*,ÍspQ׃We6{6š3nKõ?/$𲋼”T!Úч¤û_d׃×á¨,¥|þWøÄ&>þoG tÔÊæ~µ ÛÛQ:Eo æÚ{½C!„ð:)z·s~Ñ\tî›GÜOñ‹áÂ+c¸ð{hˆ{ïŽ=x[X×ÁÜÑõÄs !Ä™bÿ,oð\y#Ú@…¾‘:6”8YYèÀ¥‚ö€qƒÿñ#±|;{N¶í»0ö_‚B¡ ùWØýÐu¸mV Þ}CHxsëoR´Z’þö{2¼¥CЇcŒŠóv !„Âë¤è-„B%§Ëʎ܈îADHO/'6¢‹ž %Nj­*›÷:uð[óçaùvu?/”¢·BìãÛ%•„»ž&çß÷¡ºÝä¾òORy ¿Ô^ÞŽ†1*N ¹B!„8&ÒÓ[!„8J»óæbsÔÐ;Efy·G#âõÍ·—ìiÙ×ÛÔc×~]Š»ÉÚfÙ„¢½ 8‚˜ëÿ€Ûf%ë©ÛiÊÏòr*!„Bˆc'Eo!„â(mÉú­Ö@.Òº=J Õeö¼½YÒÊb–þ“< Zº›hX´¼Í² !DG>þ¢.ñ,éj¬'ëé;qT–z9•B!ı‘¢·BqjêóÉ/] @jìùøƒ¼œHÊÈ}³½3*]”Ô¹[<î?nŠgÒº9óÛ4›BtQ—ÝÒ¼¥£²”]ÿ¸GU™—S !„B=ééÝNTÖf±píÃXµÞŽÒªºÆ½„š“Ðhõ(Š“1_c0¾Æ`ü|à ò#ÈO€©3üX !N?ž,U@°lï†Çëù"Ýxf{_ÞÓxÐã?üF £þ—EØÒwáÈ+Dã¨BÑnÅ\ÿwÕÔ¬ûGu9Ü@Ê£ocòv4!„Bˆ#’êd;±5ëKöìmß—X74•qFOX` !žÞâ"†ÔE‘‹ „—ªº÷½!Ð/†øÈa^N$gp´ƒVÁîRù½•¢7€ù‚ñÔÿ²ð,hrëumS!Ú5E£!ážgÉ}ùjÖþŽ­´ˆŒÇf’úè[:E{;žB!ÄaIÑ»è•t)%•[±;ë½å`*X‹p¹øèP V{-N— §«åâ_n·ƒ²ê”Uï`[ö7ø‰JrÌ8’cÆâk nëg!„'$§øwê2;J IDAT›<ýL{%M—òÚ9“^aPg+ ¬)tbuªøè”ƒöñéÓ}LŽÂêçÿFðÌ«Ptò¶H!¤èô$Üý,¹¯>DÍê_±—“ñÈ$ýóu|ã’¼O!„â䯻v",(•+ÇííÇÄál¢ÑVI]C µ …ÔÖPZµŠÚLª,9¨ª «½–ÝùóØ?EÑÒ%r=“.!-n:­—Ÿ…BÙ¶lϿϊ¢¡WÒ¥^N#ŽÆˆ.zV8°:UÖ99w_ŸïfŠ‚ÿ¤ñT¿ý®ªšV®Çtîï„BˆvÌSø~†¼×uT-Ÿ½²”ÌÇn$ñþ—ðïÚ·M2l¿m ¶²"Œ^še®($Üý,¦ÄnÞ9¿B!މ½ÅqÓë| ÔÅèC ƒzÌál¢¤r3¥kÈ*úÒªí¸ÝTÕEnÉRrK–²@o¦OÊ H»Ž@é¥*„hŸ­•d, Kä9òïU12^ÏÓË<·—ç;Z½ó„1Ô¼÷)ªËEÝO¿HÑ[!AÑhˆ¿ã ŽÊßÂYWKæã7sÍ=„Ÿj? nÚ³»¹à `+-:ÌÞ§Váÿ&õ‰÷½v~!„B=¹>[œz/qg3¬÷]\3awNßÌ”s^'1zZ­›£Žµ;Þá­ÎaÎò;©©Ï÷rj!„hi{î÷¸Üz'_æå4âhÅjH ÖžÅ,[£ ÁwðšÖlÄU^Ùfù„¢£Q4âo}Œ¨KnEAu:(øßsä¿ýn‡ý”·àƒOÙØÇª~×j7,óv !„B)z‹6ác {ÂE\:úcî¸x£ª3…¢­ì_ÀÒÇDjìù^N#ŽÅˆ}³»ókÝäT»ZÝÇr˜·£ !ÎPûgyôN’Ö&Í€(fƒB]eÉ×õm¹x²¢Óá?a µŸ}‡£°ëæt|úõòBZ!„èX|ã’èúì'~ô¿ý€êrQ>ÿ+jÖüFÔ¥76æBPŽŽ•ÛnkŸ­DT•šõK‰¸à/ÞN"Ã÷o'Bˆ£Sp§·œ¾d¦·h’cÆò×É¿0yØ+õfjêóùbáÌ[õ7¬v‹— !Î4g#;÷ü@dH/"Bzx9‘8V: ‰ñ|¾¿¡ÄI½õYÜæIãšo×ý´ M² !Äé@ãc"H~ð :ਮ ÿí'Ùq÷t*ÿˆêlýJ›#©ß¾þ¤Î?™,Ûa1^!„‘¢·h7ECÏÄ‹¹ý’ œÕ}&Š¢T¶d}É{?Ž&·x©·# !Î »ò~Ææ¨ wòå^N#Ž×¹ûúz;ݰ"¿õ‹>.ŸÞÝhø}îú†6Ë'„§ƒ€>Cèþò·t¾âV4>&¬E{Èûïãl¹zEŸ½ŽµhÏ1Ù˜}ò{„Ÿ,õ»¶ ºZ_+B!„탽E»£×ù2zÀÃ\}þ„u ¾©”¯]ÅïŸÆívz9¡âL°5ëKtZº'\èå4âxí/z¬(8ôïÿIû´´Ù©_¸ä”çBˆÓÆ`$rÚõôxm&Ï@côÀí°QúÇì¸ëbvÞ{EŸ¼ŠeËjÜ6ëaÇk*Èn±M‰¼ŠÔG.Ç œ’§pÔT§{E‰wC!„â°¤§·h·¢Âúrí¤¹,Ýôkw¾‡ªºX½ýMòKW3eøòõvD!ÄiªÊ’CAÙ:RãÎÇÇèåDâxuòÓÐ5LË® Ë1ÓÀoô9T½ú6îÆ&ê^HÀÔ‰m˜R!Núà0b®¹‡Èi×S±ð[*ÿˆmo!MùY4ågQúãÇ( >1 #ãðí’Š!< }p8:s ƒöòâÞG3ì9R‡`ÙkÆ75 ë†tÔÀLIn*Þ]€ï•×àk¯G¬PûÁÔçÙ!d±·]Š®"GS(æàì~{/á7݈Ÿ«üTê¾zšJítâ§÷B­s¡õ)¢ü7°ÔÜ"ËV’1"攽ŽB!„81RôíšV£gÔ€‡HŽÏœåw`i(¦¸bþ|>“†¾LJìxoGBœ†¶e xþ¸í#­M:¼a±zvU¸Ø[ï&»ÚER°¶Å>_üÆžKÝ¿`Û•‰=#Cj’Ò !ÄéAg$rÚõDNý+õ;7Qµâ,›Wb/ó³U·›¦ülšò³©Y»øØO ‚®~{?[ƒ~Ê»$ø¬`÷'Ù˜f|HX÷•4,|š’ÍÅh‡=GêðT*òv`qÆ5µ ýÈ— ãèÛ ÌyŠÌÙys=)3Σ)sÚ­ÿ"çç|OÅÐJ'{ÅÞ|…„8²†z;‚í–ß3òÁ£8<)z‹!¶ÓY\7i>sWÝGfÁ¬v ßý~g÷¼sûÞ·¯ÿ·Bœ8·êd[ö7ùÇ9Ôˉĉ«ã›<·Wä;[-z˜'§îÇ_¨ûq>¡÷ÝÖV…âô¥(øwï÷þX ²©Û¾žÆì4æìÄZ”{œý±Ý8ª*P·½ gSå¾Û.ôgÝH\ÿÔÐx”r Aì‹cO5 â,ÈÆÞOƒ¾Sú˜ë‰‹QAñGuoÀµà*'^GÂÃQPú+%Ÿd´8»êvŸÀ‹"„BˆSMŠÞ¢Ãð5sñÈ÷X³ã–lz·ÛÁªô7(©ØÌ”áo`ò õvD!Äi §h1õMeÀþ,½Ü8Tœ°õøè¬N•®îclu?c÷4 )‰Ø3s¨ÿåw‚oý+“o§BˆÓ›Ol>±\I£º\8ªÊ°W–b¯Ø‹ÛÚˆÛf¥bÁ·X‹óŽã º~7¡¬¸‘Üå èǽ†9ZÜ8-vt!f mtz%{Y1¶Â7È[Pú0ŒÁvÜ 4Î~Œê¯õø^ò‡,${QÍÁgÑȤ!„¢=“¢·è`w¿‰è°þü°ôê›JÙ³w9ÎÈEç¾Iç°þÞ(„èà6îþEÑÐ+iº—Óˆ“Á …Au,Ëw°¶È‰ÝåÙÖš€©©xþ ÜMMÔÿ²ˆ€©“Ú6¬Bœa­Cx†ð¨ƒ¶ÛögÑ[ÅU° ݘ‰K-ž7G×Ë ‰ÞBÕ²opÝú]’óqÚ\ªûâ·¨Ÿù‰i•¸}L8¿D£‰¹ô \u.´~»©ZbiqYÖûB!Ú3)z‹)¦Ó ®›4–ÝBAé, Å|¶`:cÂE羉Aï@zÎw|8wå5»p´w5Z+È/]E•%ÇÛQ„€Ëí`kÖ—øE“=ÆË‰ÄÉ”¢%Òßó¶gEþ¡‹Þàiq²_ݬ¹§4—BˆÖù¥öFç’[ˆÔ® è¹;Éýσd?õ(…‡ÿ}p(þÝû¡hå¢i!„¢=“ßÔíX£µ‚YKo¦ t >†Îü,ݺ\pÐ~®¼eÜÿyQ&4¸ilÒÒcÜX¦%ûâÎ[ÆßÞ/føÌK˜­¬üü',ç_Äù!nʶ¯á‹U¥ØtZÜv;„uãÊÉ=ˆ3xá Ÿ€®ñ“Jãû%3©¬Í¤²6“æNfìÀGéÛgk®Ýñ¿oz·ÛóF;-n"“‡½Œ^g:h?wåFžš¥åÖëû*ké qJeüÒ¼€eß”(Š|.|º«çû6vU¸¨lR õmýV}—8|úöĺ9†%+©¾mpP§Bˆ3›¢ÑÐ÷lª–Ï÷v”ÏåíB!„8)z·c¿¬y°¹à `µ[øyåÝD…ö&ÈÐ¾ÚøÜue À]¾'¿ÛÁÐÄtB!4%”ÜùëȾzI\Ý«x=ÿY¢2㺩¤ú8)ܰžô;±ñ:Z540™k&ÎaáÚ‡Ù–ý N—•ùkþAnÉ2Îò ¾ÆoG ¨|=‹6< \L¹;.¡ÉœÛ÷o­cß2·Ò7ÄFA~#»E ­¯%·PaÔ£¨-äûï6P 7`³@¿ Æ3Îo}½KpA†FvÕ¥ðØ•©è­%üüýZ2µ>ФÐcÜ(F¸·ñö¯%èL팛:”>þmô‚ÑNlÊø­FOŸä˽œFœ Ãbu|¿Ó† ¬,ppAê¡?á ˜6 ëætT‡“º9 ºúÒ¶ *„€“Û]Ñ[ãc"dØyÞŽ!„Bˆ#¢w»¥’Y¸°ÅV§ËFNñïôO»æG:š¬8 ÷U­ÕÀ®ÌˆNç¿sÏùáÍã—eæ£ï})¾ûÔ3`yIƒÎIC_¢KÔp¬y›£ŽÝùs),_ǸAOÐ5Þû ’eþ ­tÌ.üíEohðæÂ qT/ýŽ×l]ø×ÄöÌûš….trC0FÆbÛ[àí(ÍÂFOAëgöv !Î6›£ñä\†^U]KYY%µ–zlv;ýûvÇßÏs¥uyE51›†ú&›šp»U®˜>‘~}º[À˯D“Õ€‘kg\Ä =Ø[ZÁ‡ŸÎôf&ŒNtT'TU¥ h/½žà@ }Ë€Çèd¾6Bœ®¤èÝŽêOëÖ.¹wåmäõw£àÆ¥ aÒ”î„(àÚ÷xX¿áŒüê¾ÍÏK®(¨ª§øªZóøæ«Íä:lX‚ûóÏiÉøuà¿í{$L¥sX?f/»½•[ih*燥7“{ãÏz S„ÓÏ «à‡ÐëõMh½^ƒË ªN¡vûZ>Øe@[[3ØEmƒÎ¾(€D(!»Tªªë©-[Ë;e ¨vtJ4¾CFqîòõ¼ñ¿:Ôd¦M”‚Ÿ8³lÊø”ýFÉ–§¯ …îáZÒË\¬*p¢r˜ßµzæÉã©ùèKœ¥å4®Z‡iØYmW!„¢5}&{^ØÛIÐú™‰¼øoÇâŒP²·œ/¿ÇÝ·_}TûW×X(*.¥¬¼Šê gŸÕ—ÎQž¿kwíÎá…×>l®”–U2}ªçª¢âRvìÌn~LQjjëšï«ªŠËín¾o³Ù±ÙìŒUAfvþAy‰ž4€õÓyë_7?`öãúk.¦g÷Ün79{ 0û„FsäYh¯¿ý9WLŸØ\XB´$EïvK!5n;÷üxÐV½Î—Äè–=ä´ñý¹c_{“Ö‡óãìɽÙúùjvè!…Niñ¸¾ÙLz¿séåÏ¥×ÄãÜ»–'Øqjœ$ØÜ…«'ÌfMú›¬Øö*N—Œ‚_È-YÊ9}îe`׿¢Õœø'¬Ç*5öòl/'§Ò°X=ée.ÊÝdTºH Õr_ó”ó¨ýôT—‹ºYs¥è-„^2ü|Ê~þœÆœÞŽBÔô™è‚½Cˆ£vë“ïàgâ©;¯@«ý£úáìßñ1ê¹üüaÇ<æëŸÏ#2,ˆéãOÝ{æú†F^{óS**khj²áëkl~¬ªº–¢âRºÄ4ÏÔÎ+(æ‰gß:¨¨ÝØØÄUWL $$ˆ¤„X´Z fÌþŒ8gPó¾}{wå_ßÃáÄÏ䋯¯±yl€äÄ8Þ|呿ûªª¢(üµÜ§WWžyünjjëp8X­¶æ‚6@|\4=º%S^á)È×Õ7b±Ô7?¾lå>þÜSûÑé´ÄFGríUS‰éÜúd=«ÕÆîŒ\^ûï'„Žúó"Ä¡HÑ»;ﬧ°ÚkÉ-^€¯1„‰C_ Ðïø(þÉ\yN.|á"ÐFàöqëøâ˘§×¡EEÕ‡0fl2þ§IµS£è8»×¤ÅOdQX¶‡³‰ÅždÓîÞç>º'\Ô¦ ÖE…õeüYOòÛ†Çq¹<Ÿ÷L¼„Á=n>Î5D%EcY¶ˆ÷óü %$o+yçõÂoñþ[DÌ ((„B×Y‹x5Ï„Ñf'hàpÎ'‹ÏÝŒ¯ICSS8CûûHÁ[œ1väÎÆj·Ð/uÇw5†è(ΉÓóö+àiqr¸¢·."ß¡ƒh\¶šÆµqïE×9²­¢ !„P4$Ýÿ"Ö¢=^Ρàßc w3ql³¯gÚØŽñá½Ýîàµÿ~JYyY9ytKKâýO¾gç®l,u è׃[oô¬Ã`&91­NGDx(BrVŸæ1;…‡ðûn<ìyeÆôïÏÑ)¼õuÄ:…‡pÏ´¨µZmøøüQÈOIêBîÉ”””S]c!7¯ˆââ²æ¢÷º éÌšó+Âèß­F‹Ûí¦¢²†Wÿó1÷ß}ýIkuÒÑ~^„8)z·c>Æ .ó)–†b¬öZB’Ðj[þC¦Îóñ­ hãÏá¡ è>ŽWžØO!¬ë`îèzÒ£·;!IÌÿ-›2>eÙ–i²UQS_ÀœÿÇêío2´×tŸÜfÅïþiWÓ#q*U–ü|Âð‹nu?Mh¾ ÿÚÿ\ξý¿ãÆ^ÊmŒà¡þ;NîºRB/8Q¾ØwÿÆöžB¶âÅ”+§üéLù§ÛÉ{~Bt$û°Ôë|é™8ÝËiÄ©Ö7R‡I¯ÐèPYQàäú~‡ß?ࢉ4.[ n7–Ùó¹åº¶ *„¢™>4}¨7Û Ñq]>aï}÷gõJ&&¢õ¢lf~ Ÿý´œú&+ 0°G—Œ‚V«aÕæ ¾Y¸ EQHŠÄát5—[TƧ?-¥¶¾ ­¢0bP&?›«ÃØ[ZÁ»|Ëžü¢æm»3÷ɺ é¸ÝnüýLÄÅEqî°ÍûšyàÞõۓ ޣ¹çvOQÜf³S]c!2"¬ùñšZ ¥e•”–U²5}÷AÇîÉ/æÍ÷¾dÆevâW¢t¤Ÿ!ŽDŠÞ@€_gü:{;F‡§(šæbóšío±~çÿ°;(¯ÙÅìe·±tË ôO½šÞÉ—aÔŸúÅiŒz3Q¡}޼ãqR”&¶-\Ãb_#¶: ã&w–ÿá…ø“½•[)©Ü@·.Sð1x9‘8Õt­cñ‹X*>ºCÏî÷Ô}LŽÂê~˜Gð_g È¢AB!„è :…rÁˆ¼÷Ýo3'9Ù!ƒ, !@˜a£ÈÖUg«ÖÖYkÕÚŸú-Zk§µÖºGÅ…* ²dïM†ì!dŸœ“³îß!@€INÆõ|<òÈ9Ÿ{œë›CxŸÏ¹>yñ¹GP¥I‚ÝÖÌh4Ô ¼&ŒÆ€¤²²óÈÊ)`݆TTZê¶ïÍ8ÌSÿïïôèsÍá[¹^„hŒ–ëé D+aÔû2ªÿo¹ÿƵ$÷¼³®¯wIy&+¶½Àkó’ùvÝÃÊý¡®ýH[¤˜»pËÓxhö$ž¸gcB/þ~!:ªÚYÞÉñ[$G´}#bj^÷«]*[ œ—ÞY£à;ýzÜ–**ø±¹ËB!„h2ª 7¤%cw8X¶qÏÛ÷ËC§ÓÚ¯¦µ·—‘¡I=Ù¾?“™yøú˜HèVÓbµkd(Ý¢k>u±ïhÒ%àçcbdroÖïð¾”àR’û0õúÑTY­uãÞ&/zt‹Åìcj’ÇiK׋—#?E‡åcêÄÄÁsHMü%;~È®Ãs±ÙËqºldd. #s½™Ø°¡tž@LØP}»xºl!D±ÙËÙ—õ5áÁýîçáŠDK}vãõ9NFÆ\zQcßi×Qúáç¸+-”}ò%¾S&‚Fz¿ !„¢mÐj4ü|ÖxþôÎ|’âêm+­°à{^`êg6Q^QE…ņÙäUo›Ù»fß² •U6ùóuÛœNÑÁWUã¹3”Nû³aónvìÚÇ‘c9õ†ìÈÉÂíVéÝ«Ã'‘’܃áÒ¿Ë^©¶p½Ñz‹ÏÏ'’ÑÉÏ0¼ß£ÈþŽ=G?'÷ä@Åî¨äpÞ2ç-ÀËàOtè`Bƒ öïNˆÌ1ôfÏ> !ÄÛsä3ΚY2Ë»c‰ Ðé§!¿Üͺ\pé™1o|§N¢ìÓù8òŽSµ~3Þ#S[¦X!„Bˆ&JZJ"ï-ø‘ˆ€ºñ_*,Özû–WX ð÷ÁìíE¥ÕVo[Y……¨° ý|ð3óêïîjòZu:-I}{‘Ô·Å%eXª¬—?¨ƒðã•9¿!(пY§-]/B\Œ„Þ­DƱùœ*=xù=¤¨ìÁ~Ý[l¡GOŠ Hˆ<%™—gRa9ŽŠ›½¬^^K£hÑéLu­R4ªª¢ª.ƒû˜ØâÏ£)•Yr‘ô‚ýºyº!š„[u²íÀ{˜ŒA$tîáŠDK­çóŒjŽ»8iqæséßünšJù_£º\”}ñµ„ÞB!„hsfOÊSÿü˜Ââ2Rkfð&ÄEát¹Ù¼÷0Cúö ²ÊÆú]¸aT2ñ]"(«¨"ýp.}zD³?3Ÿ¬ã§HìM¯¸(ì'wbhRŠòt M"÷ᢠÆÞzë-}ôQ|||žÖ®‹|¹ø®žs_=gìüÛç~ÑÈû—ú~¹1.1ÖÐ>×D¦k¶F½™û¦¯Æf/ót)¥ªîÑÚDUÝänfÖ7Ë_Eµ£¢Áý´=þæh‚ý{àoŽÂÛŒŸO$&c^?tZz7EŠŠ—¡í®2­ªnä|Ïš¯`­.¦¨ôŸ,ý) ]§3và$,mNAÑ Šv7S®áÊרÐ/LÇÎN6æ9p«—_›Òß ¯}±íÜKÕºÍ8ò ÐGun™‚…ÔêjÜ ²Ì“T—ÛÓ%!„BQ„Þ­ˆ—AúTyJ•­ˆ‡þÇž#Ÿ×µ<8—¿9š˜°¡D†  s§dBüãÑh:Î_Ÿ=n£wìVï|…]‡?FUÝìË\È‘èÒ IDAT¼åŒè÷¸´<mÊÆô×ÏÜRœp¿Gkž5,º&ô.¶ªì/r‘ØI{ÙcnŸÍ‰{Áí¦ìóyºõ·'í“Ϙ}|Ëë<úøB!„B\ФT¢C+³ä±aÏ«¤gÎÇå²×Û؛ĸYÄGM$ÐOVð2ø3iÈ‹$õ¸™¥›Ÿ¥ hvG%+·ÿ{Ž~&-OD›P\~”ùKèÚy!þ=<\‘ð¤á1z^ßZ³ÂüúG£BoÓdŒ½{P½ÿ0•?üHÀÝ·  —O ˆ–úǧ<úø¥Ï£ä¿z´!„è謶PôÊ¿q][ËÕæ¦h4øŒO#ø7¢ñ1yºœ©Ú^ɲ-¿'#k!ªÚº?¡e6…qýЗé9ÞÓ¥ˆ6®ý÷«¢U¶Ó,ßúª´m³;,ì8ø!›3Þ¸hÐmЛIîy©}~…—Þ¯…+¢åIÚ'ÚµÙ‹xçÛqu·F£gX߇y`Æúv›-wªmyrÿkÇ™?[•}™ yëë4¶ì{·ÚÈY”B4±­ûÞÆéªY°phŸ_Ëß}Q'ÊOCl@Íõ°!÷ ^£4 ÷ÜVsÛí¦äݹÍPãÊ^ËãÏ}΂|×™>YÀ’bÕ£u !„oþ·ßDôWïôÀ]h|}/ØÇ]UEÙÇ_’;ónŠÿûîJKg ±;,lJÿoÌOeÕÎ?5xôfRû<ȃ³63zÀÓx‹Cfz‹vÉá´²|Ûsì>üiÝXxp?&ý+¡½=XYûWÛò$©ÇÍ,Ýü,E;êZžì9úÏ!&l¨§ËˆÍ^ÆŽC53`}»Ð»ËTW$Z›aÑz²K«9Vââx…›߯½)â3v†¹_b?t”ÊÅ+ð¿e&úبf®V´„êƒG<]Bƒ\¥eÙ¢Ü#˜Ì%[9zG*ÝÎùÀ‚Z•Ï× ¶“c0¡XDËô|>úbAhʨVƒQmÇY4 ‡µ^`UHœ0†4÷^Þ\~·†*»?f #ÉÜ"OU!D;S~ûμáâ3¿Ï„ß󿗙ߗ!3»…¸< ½E»sªô_¯y¢²Ã@Í ä´þO28ñ~éÙÝ‚¤å‰h-6¥¿ŽÝQ @jŸ_É뀸Àˆh=Ÿî­`]®ƒÙ ÆÆ¨(ýò.N<öT—‹â7?$ì¥ß7c¥¢¥Üû¨§K¸bª/n‹LçÝå<~]§ÚQ ·o"=f<¿éZ´ƒì§G÷#œH¼žß 5cÝ»„Í{TNmÝÀŽÈq<›…[™³ä±ÑǨê>ŽÇF¢–œ¢D>$#„âIø}m$ì¢ñäþ¢]Ùux.Ë·>‡ÓU^ûwgúÈ× LðpeSmË“ž1׳zç+ì:ü1ªêf_æBŽä-gD¿ÇIé}·„¢ÙXlEl?ø!þæhúÄÍòpE¢5©C§§»¦ÅI£CoÀ4h¦”$¬ÛvSµvÕûbLèÙŒÕ qq!F2úóøòØDâP).±ÒÝŒ(~UPPf' Ü„ýðS ¸¤’²Â-¼U¨€jG§DbJèuÛø÷»¨AÝ™9¹Ó%_!„h, ¿¯Œ„ÝB\9IšD»àtU³tó3ì9úEÝX¿î?e ?¢×™_¦÷à±”š°\!„h — ¿ôJ #ivŀ󋕬´5èüE»E³¶nTÂn!&¡·hóJ+sY°ú>N§`Ðùp]êË$t½ÑÕ‰óIËÑ’J+²Ù}¤¦¯§€ž$vááŠDk6"ZÏö'e6•ŒB'ýÂÿ+’±W|FÇòã:ª÷Âòã:|ÆŒhÆjEK1Oÿm7yºŒ:Î…—½ÅÜ[Gdòÿ>u…BhÊPú.XÍkóLPå"yâX|½ÙøÅþ™H€—Š¿!Séµ`%¯f{c¬¶2’ë8Â'ËwaòÖ`µvbX²—ÞB!šÅÅÂdª|:æìî yÕ|¹¯ÍZ »…¸ ½E›v4%ß®{›½fa§`ÿîÌL{‹`ÿ®L\Œ´<-eÍî¿âv;5àw(Š4£7ÇqÅÇë"¸½fF°³°ˆ²?oÒú„B!:’ÚðÛ­“Ðû|Šbdô€§%ðâ2$ôm޵º„/VÞÁú=ÿDUÝhc’ÏŒ´ÿbÔ›=]ž¸Bµ-O®úLÆ €º–'߬{ˆJk¡‡+mѲ­ÿUu0&ùW#Úâjz¾ï>é¤Ò®^ñ9üo¿ ]DeŸ-À‘פ5 !„B\‰ç¼ÍSÿ˜‹Ëå®7þÁ׫ølÉú«:çkŸ,fÞÒ–› ¤ª—ÿÌl22ed~õ“ñ<|ËD¾e"³Æ¥àoö¾ì±~>&ž¹g*^†+[ûçj»œ£’–Üë’û4æÏäj´‡ëEˆsIèÝj5Ï‹X[—jo}=šÌ‚Õøxuâ§ãç2$ñ.“mVmË“ûo\Àø;δ¡PÙ—¹·¾Nc˾·q«NO—)ÚˆÙ‹È=YÓ§¢{Ô¢By¸"ÑV ®™IätÃÆ¼+Ÿí­ ?v?ªÓÉéü·IëB!„¸RÕ_ÿ¸ÍÓe4«éiÉ( ¼½`ÿút)o~µ‡ÃÅMãSší1+­ÕüëÓ¥ØìWþ;ckÖ®ÑqÈçDZ•鯳ýÀûTÙŠ Jdü ç‰ìtá µZ•Í—_ncs¶Ž›Î¨Ókyò“|Â"¼Ñà¦Êª%qÂxfv7áÎ>w[ MX_~~] ¶}›ùtãIªuZÜv;„ôæÖ)‰ÄZö™_ŽªºÙ”þ:kwÿ½.üŒê4ˆé£þƒ¯w¸‡«M¥¶åIR›YºùY ŠvÔµ<Ùsô3&žCLØPO—)Z1‡ÓÊÊísÐiŒô¼g mÊð˜³3uÖd;™wåÿzŒ÷°ATmØŠuÛ.*¿_Žyòø¦,S!„¢Ñn¾~8ï|µ‚Á}»Ôà>‡sŽ3wÑ:*­6 %±7MHE«Õ°q×!æ-Ûˆ¢(t‹ÇátÕ—™_ÈÇ‹ÖPViE«(¤ JdòÈ-ôÌÎ òeç¡l쎚¬ Úîdñƽ˜Î™…ÈØÁ‰xõ¨À¡ì¬ÞqáâÐ]:wbì Þ˜Œz@aסlÖï:Œ¯·Ý<¥÷22¹߯Ûͬq)üýã%ùù0küÙ‰6F½ŽÊªjþûÕJ"‚ý7¤f“—ª²ûP[ÒIZr/TU¥àT Z­gç¦v„ëEtz·"[÷¿Ëê®»üôn¾Xq÷L]Š¿OT½}ïXfßnF÷ÆÙ˜hcòè­=0îSÛ™óÕ>†Å $ô¼mµ\›ùÛj•ÛîžA¼ ÀIÞöm¤·kh5ó¦+­…,Z÷Y'ÖQœð FxF.áö¨¶åÉž£_°jÇŸ°V×µ“†ö%Àׇì‚"N—âp8qœ Áz³' aÉÆ=ì?V€—AÏ7Œ ¢ÊÆ¡ìuçÑjfŽÈ÷’q4Ÿ`3?¿q4YùE”TTàgö柟ü€¯÷ÙË ŠJyí³ex Ü;#éG0èuüdÒVmÛÏîC¹x{¹sêJÊ-œ*aêÈþ|¶t3ÙÇ‹ˆöçŽ)#8URÑRtè׋è8$1lEvúßcÕŽ ög}CjâƒWt.‡Õ†Ãà‡ñÌë“+{¯}tðL­!lÀÆç ï7‰¦Ú£tD L%ªÁ3zFƱù|¿ñ \îšðÁÛ+˜)ÃþA\äW&š[mË“ž1׳zç+ì:ü1ªêf_æBŽä-gD¿ÇIé}7E^ÆD’òL6e¼€ŸO$©‰¿òpE¢-J‹Õsè´‹•nv¬½âsè"Âzà.NÿóMÜ•ýéUÂÿþ ´–·“E{PôÊ¿=]‚Bˆ6@Uᆴd6í9IJ{˜8,©ÞöýÇòÐé4¤ö뀷—‘¡I=Ù¾?“?|}L$t«I ºF†Ò-ºfý’}GóÐ(6(¨éq=2¹7ëwhñsÅ– ²Ÿ¦O·Î$÷ŠÅd4UpŠ5;r²¸œØÎ!¸Ünö+Àfw‘™G|LX½ÐÛåRyý‹åØ5³“O—URRa!ÈßLI¹€Œ£y—ì©=mt2ÙEì>˜@lDª »åPe«&ýH.}â¢ÐjµXlÕd/àøé2òO•6ýÐè׋è8$-jEªí ¿›Wm/oÔñgƒm7.m7LK H Mæ¡z3½UޝVê^¬U[6ó>ßE¦£šòÀdž™Ùþ߼ܒϒÍOs,ÿǺ±ØðáLñ/™áÛÁHËÑXK6?…Ëe`|Êóèu¦Ë!Ä…Òºèy{‡ €ÕÙŽ« ½üfM¡jÝf¬Ûvaݺ“òßá7sJS–*„BÑ(Z†ŸÏÏŸÞ™OrB\½m¥|}êÿÞìg6Q^QE…ņÙäUo›Ù»fß² •U6ùóuÛœNÑÁÍó$.ãHî ŽäÖØ~Þ îÓÛ'ç?óV`6yQe«®·•ÕŽ·×çéÓ-ŠÄn‘h **þfS½y kõÇÔÞ¿~>&¾Zy¶'¶ÙdÄd0𫟌«Ójµœ*.ÇÛ¨¿ '¸­Ú~EÏ»9t„ëEt z·"Q¡ƒ8˜óý㑞½£ÚÉXµŠþCIõµQQ­#ìL›ª ƒíKQí‹kÞ.ÒŒ¢¯9–ŸÜ‹óÄæ,µã¾ü š…Ëí`SúØ¼ï¿Ø•èuÞŒêÿ[RzÝsfCÑIËq)éǾ$ûĺvE|Ìu®H´UýÃuø{)”ÙTVg9øEò…ÿjE!ä™GÉ¿ãW¸+-¿ñ¦ÁÑGE4mÁ¢Cñ¿}6æ)=]ÆôQ=]‚BˆËˆ‹ %-%‘÷üHDH@Ýx€¯k½}Ë+¬øû`öö¢Òj«·­¬ÂBTX~>ø™yõwwµDùåc2Ð¥s'2޿ו”W±|sÉ=c ö7SQeÃÛËXï8o“JKýçÊè½yÿÛµ—ÕäÌjܧÌcƒÚ·;~»®®­ @EU5•V+¯±â‚czÇuÆëœ¾ã>ÞF¶7©Õ^¯ѱHèÝŠŒô…%”Td× ˆ¿îQÎŽTùÏg X¥8ÑõÉMH¹]ÙÛùçûë²ÄìŸä×¶òég Y¬×¡EEÕ1n|wÌ-<Ë[UÝìÏú†µ»ÿZïùwŤԗ 0G·lA¢U’–'¢!å––o}¨y“lâ 9®H´eZFÆèYtÈήNÊl*þ^W÷¢.4„àGïçÔœ¿£Zmœ|ò"?øŠ¡•­-Ú ]X'ta<]†Bˆ6jöÄ¡<õÏ),.#%±foB\N—›Í{3¤o*«l¬ßu€F%ß%‚²Š*ÒçÒ§G4û3óÉ:~ŠÄîÑôŠ‹Âîp²q÷!†&Åãt¹ù|ÉzºE1 W˶«¸~X?‚ýÌlÉ8†ÍîÀ ×1¸OÖj;…%å( h5 ½ºvæ@f&£>ݢؼ÷h½óø˜ŒTUÛ)­¨ie2 g,Þ&#Ý¥?ùçíedúèd–nNçTiýÀ:çD:–„¸Îì;V€V«0z`ÙÇ‹È;QŒÙd¤kd™ùEÄ„äOV~QÓþ]¥öz½ˆŽC’¡VÄ×;œ{§.çhþJ,ÖSD„ô'"8é‚ýüâ‡óTüyƒ±#y%¶áójcGò·§/ò ½†ðP¯k*ûšÍ_Éš¯p²$£nÌd bìÀgéÛí&h5KjŠÖBZžˆ³Toü-¶3m Æ$?C ŸüÒ$®MZlMèíRamŽƒ)ñWR›¯KÕºÍXV­Ç‘“GÑ_ÿC§gmÂj…B!ÇhÐqÏcyù½…uc&/OÜ5¹‹Ö0oé&`xÿ^¤¥$ ( ÷ÎËÛóW ºUâ»FÚ/·[Åd4ðäÝÓøxÑæ-݈˭’Ø=Š^]#[ô9Y¬vþ÷ÝzFèÉý7A«ÑàpºÈ?YÌÜï7b?3ëú‹¥[ŸšÈè䞨@úÑÝ#ñõö"-¹iÉg–×>[†Ýáä‹63nHÒ’{£Ñ@VÁirNœÆîp²xÃ&OBQòN³ÿX>MëÈ@Úãõ":–æú›tþyz¥Û—kè»ÒÈûµ_šnkϹ­9çþ¹ßúa±Xæx)Å <=q)N—ýYß²íÀ{œ,N¯×ëL¤ôº—!‰¿ÄËàçÁ E[¡ªîz-Oj(Òò¤ƒØqðC–ny€.#¹yü\ä2q­Êl*Ãß+ť”x™àsMçsWZ(¸ï78rò~ô~ünšÚ¥Šf’9¢¦ÿºyÂh:=÷„‡«BÑEËvžžÎ}÷ÝwÁ¶è…x ¢¦gy:ÏÓ%xÜKï}ëéZ¥gî‘ß%}þåéšDîÃÎìë­·xôÑš‰2>>>Ïë¨Y²¯¡/wßÕsî«çŒûÜ/yÿRß/7Æ%Æ.¾BìU’™Þ¢Eí$ãØ|öý‡³ªn\£èHêq Ãû=*!¥¸"Òò¤ã**=Ä;^ÀËàÇä¡EoÑü½ú‡ëØ~ÜÉÚ.µ¦íÉÕÒ˜}{é÷<ðDMï×ßÅн+^ýû4]ÑB!„B!êȪ€¢Y9œVŽæ¯dùÖçycÁ0>Z<í?¨ ¼õ:âÆ}ÓW1iÈKx‹«VÛòäÎÉ‹è’ P×òä½E“È9¹ÑÃЦäpZùzí¯ê^KÆ¥<Ÿ,¤&šNZ—šE…Êl*»N8/³÷åé»DÓé™Ç@QPNN<ñ΂×|^!„B!„’©¢É¸ÝNŠËQXºŸÂâ ²N¬ãTÉ\nÇûv èE¿î?¡oÜl¼Œ œMˆ«Ô—Ÿ]· ^Ë“¢ÒC|²ô§Òò¤Y¼ñ·œ*=@¯Ø)ôí6ÛÉöfdŒž¿o¬Y™~u–ƒ×þ+“÷¨TÒ÷?EµUsâñ?ñÚËh;_ó¹…BÑñ”m_KΛ/â(9åéRšÏõÏ{º‚V©÷ë%ž.¡Ù„úhxa´7£ÏLBâjIèí!e•y?½›fhYÓ,*­'ðñ £ÚQŽÓUÝaÁZ]L•­˜ÒÊ,Ö“”[ŽãV/>.È/ŽøèIôŠJxp߬^t4Òò¤}Ûºÿmöe} @H@<“‡ýÕÉö¨gˆ–P …7ks<>ÔÔ$ç ¼çVY¹X~\‡#ï8Ç{–ˆ¿Œ6À¿IÎ/„BˆŽ#÷­—Úwà-:¤B‹›çWU±ê.ùýX\I|<Àî¨äýï&a³—{º”fåíBtè`b‡Ò%|ÁþÝ=]’è`j[ž$õ¸™¥›Ÿ¥ hG]Ë“=G?câà9Ä„ õt™â äœÜÈÊí/`Ôû2+í ºk[dPˆ†(À¨X=_î«æ`‘‹B‹›PŸ&è §(túO ÚíT­ß‚#+—]J¥µú‚í=»D²¸Ámž²ÿWž.AˆVOÒ1›Bef©àù–'*9'7Q\~Œs ±áÃQ<üÉû¡ |Tч{ú¡x´’†UZ ùdéO(³äÐ'î&†÷{ÄÃU‰ŽÀ[¯0¨³Žõ¹6ä:±»À mºó+^FÂ^yŽ“O¾€mW:ŽÜ|ònðü¯¤Ä¦{ 34¾­ëjwE¥§KhÓ<õ󔟛Bˆ¶¢¢ÊÆ¿>]zÉÀ»1F%÷ä›U;[Uè-„¸< ½…’'Zž¸ÝN¬¾ÃyËêÆºDŒä¦1ï£ÓÖŸAêÊ^Ë“ŸäáMm$® ëËϯëŠßµ&Ó*¸KvñƦP˜ÜCü0~~§l.U¶Ó|¶üJ*²è{7 û+´Êx^´Gi]ô¬ÏuPåPÙZà`xtÓÎGÖx›ÿÇ9õâ?°,_ƒj·sâág|àNüožQÓ­ Ü>›Àîl’s5•Êe«8õ‚,D{µbæ‘Ç-_ð=§ÿö<¶Bq%|½½êÍôNˆëLZro²OœB£h°X«Ù¼÷(]";1´_wü|Lä3åvnžD§_fŽMaÓÞ#ì<˜íɧ$„¸z !:¬–ny²ëðÜz7@Öñµl;ð.©‰^°¿6v ÞÚC݈‹¼5_ó–f ׳ñÓ¥ä ›Ê´â¥üß^_’BÊOœÆ8h{IŠBàÏo'ìÏ@cöÀºy;9³î¦|Áw¨.Wó=¶B!D;By•¬üšE?䞤¤ÂRoŸ­Çp»ÝØN N•`–Å…hË$ôBˆ3j[ž\?ô/˜ŒAu-O¾Y÷•ÖÂk:¿Qïs‘ñ†û²jc“yèŽ)<~Ç¿c2·õõEÑ6ØÄêÕÕ I ;3ãZ! Рø˜ñ³Z((¶\hküª¬ TÕä‰Åâ|ý¼ÑŠN‡Öí¢´ÂAP  0‡Ô™wÎÉM¼óí¸º–&]ÂG0kô»´€¢¥¤ÅÖü­É/ws¤¸yÃgïaƒ‰üà5L“jÜnNÿí òn¹Ÿªõ[@U›õñ…B!Ú#o/=V›½ÞXÙy¡·­úìUUQ4™ Ñ–Éß`!„8GmË“ûo\Àø;Î,2©²/s!o}Æ–}oãVWuî>ÝfÓP/ê¾Ýf7þ$ŽB¾ÛàdÚ_Ö-Ë¢BP)).Ǩåå”x›‰ ö¢èt%*à.-㴯ʕ·6ûè(+¯F,§Š)iæ¼mó¾7ùlÙ-¸\5¿&vÁìq¡×™š÷…¸„q]ϾU´ìX3Îö>CJø?çü›_ÖÍúvœàäïþü{¥bÑRTGó×!„BÑ^Øì¼ õÛVúÉLn!Ú5éé-„ ¨my’Ôãf–nþ=E;ëZžì9úÏ!&lè3:t0S†ÿƒ•ÛçPe+ÂË@Zÿ'é9®Áý]ÙÛùçûϾ;iŒ$% —‚þãy0IOXþ"æf„r'`ªÌዯ3)),'fÔ$zw çȂռ6ÏU.’'Ž%¸ôxݹµA!øÛÄÇ»ÆrñÈ]¡ó€¾ø|¹”ÿä _¥y–¬´²xã“Í_Q÷ØÃû=ÂȤǑE+…§ ˆÐì­át•›eÇìü2Å«ùTQð›q>cGRúî\*¾^‚êra?t”¢—ÿEñïã3"Ÿ‰£ñêßE+½îÅ•±íüž?—¤ò‡±A2 F!D»—_XJ ŸC((*%.² ½].7^^ÒfQˆ¶FBo!„¸„š–' ÙsôsVíxkuq]Ë“„®Ó;ð˜M¡>_Ÿ¸Yô‰›…Í^†—Á‹ºÚØ‘üí醶 dô™[ý¦Ï¢`Û©àÓ¥·× .¼™~ë´ú‡Æ\ÇÿÕÞîË÷=sg2ÏpÎö°A<¸+N2rê$#LØ® c¿W“FЪêfÏÑ/øaÓÓu3èz_¦Žx•îQšð‘„¸zÆvÑ3o_5ûO¹È¯péÛ21¡Ößàljÿ-3)ýß<*¯@u8p—UPñÝ2*¾«Y×;5CB<†˜Hô1QhCCPtû5ÏÅ©ŒÍÌÝp‚j½wµCTn¿®;a’·MÎbÖ|³ŽM=& K•–>Ç2Ùw?ol åÉ‘­BˆölzZ2ÓÓ’ëî;.Þœ¿ªî~YeK7¥3s\ Õ'ÙEÍk\ûÊôcùÌ7ˆmû2Yµý@S—.„h&z !ÄeÔ´<¹…žÑ׳z×+ì:<Uu³/s!Gò–3¢ßã¤ô¾Òø—T/ƒ3VÜtÅÊÞe›ùÑd¤ºBÄ)›ìŽÌ‚Õ¬ÞõgNœÞ[7–Êäa'ÀÝD"DӘЭ&ôX~ÌÎI-0Ûûºˆ0Bžü5¿¸Ê~¤bÑRY¹uÛ«6m£jÓ¶FËU°¯rsË=3éeÔj®ßJúÉ®„gþWÛÉÕ¨.‡S'21BKõîÅü1=€¤eÇO¡˜Jئ-ègOcb€BÕÞx93œ¾eYäŸslšs7o.?ŽÎ[C•ÝŸ 3†‘ÔÀ2Ç|²‰þ¤šVåŠ5þsm ª­ºÁqW^:ßÛzñÜÏâ1®âlV?Å–mdäåóÍ>0¬ß„2s“ƒlû–óâ.ÚXPmÇY4 ‡µ^`UHœ0†4÷ÞFýÜ„B´nÎy?o^|ø´Ú³oØðõ*¼Œzn¾nøŸóµOÀì‰Wö©×æôê§?\tÛKï}[w{Çl¶ïϪ»ˤTªªíTUÛëíðíÚ]u·¿_·›ï×ínº‚[©Žr½ˆŽCBo!„h$/c“†¼DR÷[Xº¥iZž4I]jgj7=ÅÜ…[îèÒdçSU7Gò–³uÿÛäœÜT7nÔû2²ÿ ìy×™>êB´.©‘z| v•eÇ-z×Òàó üož#+—ªõ[°nÛEõþC¸+-—?*…‡³Ñ'M¤gm«|ÅHÏ#è ¸‹ÃÌx?l»óÇ]§Ž¢€ÅÉôI1hó7òüšJ®ïfT0a˜]{+è7 AÚ1ÜTwl!½½ŽQÕ}D-9EI[ûëív㮨ôt—¥íÜ“4u=ÿþ²ˆÄ.atëEZ¢ÕÐ™ÅÆžLKèL¹EÏ«;Š˜4ÁŸ={ËéÛÅÈ~UåÔÖ ìˆdziP¸•9KÝÆnB!êT;|ýã6fŽìéRŽÜœ'pÆU\Fåâå ëv7¼*­ªS(ËØÂû hËJpºÏlQðõóF (:Z·›€>Ý1Î;Fa’Û¬qÌ Ó°eõ¹ÇªD è5Ûø÷»¨AÝ™9¹Sƒ«èõ i=ɪZ]3£ZãkÆ”ÒßÃÕœe?tGþñ 7¸þ¶™Œ¯*%'÷ûWφd~Ýóì.}zú±µª+Sý³¿TåtI%e…[x«PÕŽN‰Ä”:†Që.ÿsBÑúÝ|ýpÞùjƒûv'*,¨Á}çgî¢uTZm(@Jb7nšŠV«aã®CÌ[¶EQèŽÃéª;.3¿­¡¬ÒŠVQH”Èä‘Zè™]—KåÛ5;7$‘±ƒp¹\,ݔΉӥž.­U‘ëE´'z !ÄUhLË“A ?G逋0ºÜŠËq²8œ“É9±ÒÊÜzû(Š–Þ]¦2¬ÏC„Ä{¨R!®Ìø¸šÐÛ­ÂÊ,³Œž.é,EA…>&ªnÈ]ii ôVï‚kÞNö$&ɬ€jcÿŠ5¤wEÒ äÆÍâá$%›¿!ã­.sƒ½–±j£GÂ,¿;ïX•²SvâFO`˜ÞEΊù|™ÞƒÇRL¼2†¿ú"^ýšìãZeŽ˜ÔôJïôÜ®æ¬ÓûކÞ凷³ÒÑ“i të@\´Êá·s)<çåU1uaTô–..Ã8šNÊq@!8Ȱ°aÜ?ÄŒâ´p¢\‡ñtq£~nB!Z¿Ð ¦¦¥ðÎW+xî—7¡(õ_Í«lvþúþ·Ü=c ©ýzPe«æ…7æàëMjROÞürOÞ=„nQdæòÂóˆÆZmç•÷¿áæIÃH”@¹ÅÊs¯NxHɽ»6YýŠ¢ ª ¿Y¥ŽåŸâØ9}¾Ûªó†M©­_/BœKBo!„¸—jy’‘9“1ÐÓ%6;‹õz7Öêbœ.•ÖBTÕÝà¾>¦Nôëö’zÜJ€9¦…+âÚŒŒÑã¥S°9Uie¡÷ÐF ä¡ ›ùxîW|§×£q¹ñ‰Kæö®^è‘”¯]É{ÙfB‚ƒ ÊÞÍúÂR:‘bb@?#Ÿ.tò“Gü‰È?ÿØ=lídfßò]˜¼5X­–Ü´‹áоÃP¾^ÆË[ xëÀiWˆš0’n!Yøþ°‰wågýè=0ŠÞ/áÆ)f”ƒ ¦ÒkÁJ^ÍöÆXm' e$×q„Oäç&„킪 iÉlÚsˆe÷0qXR½íûå¡ÓiHí×o/#C“z²}&~>øú˜HèVó¦z×ÈPºE‡°ïhÒÕ¼iíçcbdroÖï<Ð$!¦Ën!{ï‡(jªDWõ¨n…o(e|š&¯¦ý¤\[½^„hˆ¼r!D¨my²v÷ߨ”þܪ““Åéž.«UôíB·È±tOLØP4ù§G´MÞz…aÑ:Vf:Ø’ï Ô¦àÕ£@ !½‡òhï6õJãÙ^gïN«]¯(ô:þ¯v0lÏßvævŸIü»Ï¥½®ÁÄ\4%Å'Šé·F1ý‚-}yâá¾u÷ìn• ¾}Hö®¿Ä´[§wÜHoèúBÑ&i5~>k<zg>É qõ¶•VXðõ1Õó3›(¯¨¢ÂbÃlª¿Ž‰Ù»fß² •U6ùóuÛœNÑÁ×Tkmعý Õ¥è¼_®\Ó9Û·KÇò5e¬Ý\ÁÈ!¾M~·¥ëEˆK‘äA!š€µº„5»^a×áOêÍr60êýø™yõww5I}ç‡ÝµÂ‹9¡¿'&ÜJÇþLukp»µXJjÖBª®v7[øÝÚ¯!CBo!„¸ªêf÷‘ÏX½óÏX«‹ÏŒ*$vÁ˜¿—Å…hgÆv=ÛâäûÃz‹¶BK÷á“xjøå÷BÑ~Íž8”§þù1…Åe¤$ÖÌàMˆ‹Âér³yïa†ôíAe•õ»pèdâ»DPVQEúá\úôˆff>YÇO‘Ø=š^qQØN6î>ÄФxœ.7Ÿ/YOB·(ôj|»Š‹…ݵBk WvÓ÷º¦ü ½¡ýN(º”êj7k7W°bM9V«û‚mÍ~·ÆëEˆ+!¡w rºllÎø/9'7aÐy“7ƒ^±S¯è¶ßóç’Tþ06ˆó_Âì‡6ðQEîè'}…h'Nïá‡-¿çxÑ®º±N½˜8xÑaC¹¡^à]kÝî0°çÝ,ì¦È£·öÀ¸OmgÎWû7@ÇIæÿo-yzÕå0`êD&Fhëf?¼™ÓH qQvüš”‰ÜÝÇEñ&eòRpslÉg|v=0 ÚŽóÝ'_sXëV…Ä i$]ÂgšQ<6\ÏÆO—’7t Ývd‘—Ï7ûý¸±·Yf“‹GZ™!FÆê0*í5-NÚBèmݺëÖž.C4¡‚{õt B!D£IØÝ´<1ó[ˆ¶FBïRa9Þàxµ£›½ì’ ½9¬6?Œµ)³ÃIà1ÌŠ÷ö{1ÜuŠqáuû+ XL‘LŸƒ6#ϯ9Ž£Ow ž]¥pëvDŽãÙ´(ÜÊœ%Gr[IŸ®gCOVèpîˆÆÙ™EÆžL“À[t@ÒÊDQ˨U§gá;»O8)¨pÓÙWþ!„Bq> »›—„ßB\œ„Þ-$зKƒã&c &cÀã®ì¼öÑAܸ´AÜ0- l€ªÒŒ-¼À€¶¬g û¼£|ý¼ÑŠN‡Öíâü=ÎR).©¤¬p o* ÚÑ)‘”+¤ 6ñ›O,üä‰0 €ójŸ¼m˜´2B4äúî°£‹Û¹7ÙËÓ%]@1 yòמ.£QôQž.¡Mð™0C8O—QG×éâ“6„B4¿SYËÉXù6ËIO—rUôƺ ø±I÷ 3˜=]N›V~ìÇšåü¸þâá÷ò5eª²qü}µütF‰=½=]Šhã$­i!Q¡ƒèÝeû³¾9gTa\Ês(Ê…²µ±É^^ Çø3jèÅÃïÖ®¬ÂÅ ‹yáwz‹k#¡w š6â5ºvN#çÄô:oúÄÍ"²ÓÀ+<‹‚!0ŒŠ-+y/ÛLHp0AÙ»Y_Á૪J¡ÓÀTz-XÉ«ÙÞ«í¤ %yË úçÁ$=aù‹˜›Ê}!øÛÄÇ»Æò³þȇaD{%­L„—£ÓÀ¤î>K¯æH±‹E.z…È2ÏB!„#awËiá·ת¹Z3ŸÞ†Giàö¥Æú®4ò~í—¦ÛÚsnkιî÷†¾FX,–9^Jí,P!D[&­L„Wb÷ '7UÀIFž!³QÚ‹ÌS0OM§çžðp5B!²hÙÒÓÓ¹ï¾û.Øý¯TÔô,Oç]r{[io¢("âo$aô‹v{ˆÍ¦2ïÛÓlßmAU=]Í¥5¶½‰ÏŸ¢Z¨¢æ•ûpÑco½õ>Z³h¹Ï³À:Àu‘/wßÕsî«çŒûÜ/yÿRß/7Æ%ÆšüÊ”GÑáI+!ÄÕH ×Ñ=HË‘bß´óÄPoô2Ù[!„-¤S—ñŒ¾g›§Ëm€——ÂÏf‡ð³Ùíã !!CBo!D‡&­L„×bF/Ù`¥Ô¦²2ËΤn®Æ!„B!„¢eIè-„褕‰¢)Lïià¸Ü°à€„ÞB!„BÑHªÓLN+.·ÝÓe´·Û‰F£C«Ñ£×I?SѺI+!DS öÖ0*FÏYÖå88eqÓÉG–zB!„BO’лÌYÌ×kÄ­:=]J‹PPPÏé7¯×™01ƒ0›Bñó‰"ÀM€o zèÛE‘@@´çs}¾je""ÁÐ-ÚÂÄ®v6ezùà´—ÜŠÉš¿BZO—WŸ v—”uÇ—‚‚ˆˆˆˆtpÊþHÐÄF¦™Æˆ¾ŸÇë«áxö{:ý6'rÖx©¬ÉgýÞ'Ù’þ c<Èè_Vïo¹$µ2‘`ûì'›2ë&´üWº›GÆ…;$iÇl)IÁá’,áa*«‚†ˆˆˆˆt`JzK›`·…пû­ôï~+Uµ…ì9ööû'•5ùx¼•lÜ÷{vý;ƒá}îUÛiD­LD¤-˜ÜÕN×( ™e^KwóÕQ.\6#Øa‰ˆˆˆˆˆt8ºîVÚœ0W<“†<ÂWmåæ±¿"2,€êÚBÞßñ8KÞžJFö{AŽRÚ‚w «·ý?þ¾rA}ÂÛi`æ¨Ç¹oþJ%¼E亲u½½JjMV÷9"‘ŽIIoi³¬;ÃûÜË ×3cäOqÆPV™Åkïçí_§º¶0ÈQJ0˜f€½/³äíiì9öÏó½» öXÄ—®ctÿ/©w·ˆÅâþNBíuÕÝ/î¯ r4""""""“’ÞÒæÙ¬NÆ ø2_¹m#ú~¾¾µÉáÓËøë²¤Ÿ|3ÈÊõ”W´ŸW-dÕÖï×÷îNˆîÇ=³_cÁ¤§Ô»[D‚*Âi0¿€Ã~vœõ9"é¨<ûWñ“÷ ñ;‘ P)¤Ü0œöfy‚á}>Ë»[¾Kná^jÜ%¼óá·8šµ’yã‡Ëì0¥•Ô¸Kذ÷Iöf¼|¾²»î51i裌ì÷Uv‹H›ñ¹!N^KwcÏî®etJx°C’ö̬fçÊX— ºà,çœÉôˆ´à ócÆ;8‘àP–Hn8 ÑýøÜœ·ØyäyÖîþ5€—c™«È+:À­“þ@çN£ƒ¢´ Ó °ïø¿X¿ç7õ•Ýu­LncúÈ©²[DÚœ´X+3zØYsʈ3^Ò ü L°;,¹ •ï­Ãôµj}ϱMPFÍ›Ï(œ\õ/–%Îåáá<ûWòøÞt^zÃMA~1“çqß 0¨ÍeÅ›Ûɰº Æ`à¬éL-|ŸŸŒbX¬›¬ÌjRú'b­,ãT¶Áô»g0ÊÞÌ>üåý\l¡ª=Q̺mCõûŽˆˆˆˆ´JzË É0¬ŒîÿeÒRgòΦo’[´òª^þÏLúã=„a¨{Ï.¯h?«·ÿ¨~’J¨ûÑcö˜'4I¥ˆ´i_šSuYþyg ˜«làªjí¦`‡p•LªCºrûâ8²7ó“¹x¥Q²c3»SgòØÔhÈßÁ«2>ªBRY8·+%Þàiww~>/–Ó+_å½,]‹.Þçݺœ¤º×L™ƒYR@‰>v‰ˆˆˆH¢¤·ÜÐb#{rX¿ç¿Øvh Ódž½¿%+;·Nú!N]×{#R+¹Ñ êderW;3½¬9éåX‘Ÿ>qªö¾QX"Úæf­Óë½Â­-DÅDà »{ÀO“â’JÊò·³$ßÓƒÍH¥Â4ˆŒ à Øív¢¡X»Ý‚?Ðü>!ã¦3eÓNþø\fl/ÍKh½'.""""ò )s$7<‹ÅÆô‘Ñ-yo­ÿ _§Î®ço+æqÛÔ¿7$Ø!ÊR+iOåbc¦X²«–ßÍ vHr…º­üW°ChVÑ|é»×pƒ¸ØH'ðàØp _yåvb²ó>á>6œEÅôœ6‹ v?™kÞäõƒ½ydTÆ5D'""""ÒR”ô–v£gÊ4¾¼pooøÙ;(«Ê柫1kÌ/Úëî`‡'C­LD¤½™lcLªí9>V÷ðÐÝ£Uí-Ád0rý–~ÀSgBqº=DšÂ¢O¼Ïdæpœ—ßßKH¨…šš&Œp)á-""""m†’ÞÒ®D„&ñ™Ù¯òÁ®_°óÈóøünVnù9»˜=æ—Ø¬Î`‡(Q+iϾ:*„í9LøÝæþ8¯m¶ÍöÀBÏ9ŸááóKŽ!søùG«GóÓ{Î?IæÖÏÜzѾ¶¿ïžÜõ¦;ø:Íí3™Gû·`ø"""""-HÙ$iw,7þ) #xwówðùkÙüßäâSSÿBtx—`‡(¨•‰ˆt ã:Û–dcožµ§½¤ø˜ jo‘Ö¤yÖ¥ÝÐ}!ŸŸ·œØÈžäàïïÞBFö{AŽLòŠöó⪅¬Úúýú„wBt?î™ý &ÒT˜ IDAT=¥„·ˆ´+ß™P×ç8`Âmªv8""""""íž*½[YÀôqäôr J–ÂÀž‹pØZ~"«Ú=ïò›’qüxFl³¿døs·òÓuqüøîÞ8ZüìmWBt_>?o+6?±ÌUÔ¸Kxcí3àËLþ¬{°ClÖñì÷É)؉ÝÊ€·]Suºgÿ*žÈÅã7ÅìÚBµ2‘Žhd²›{9XuÜÃγ>þsÂÃì´Žôn,"""Wã›ïuv""7,e˜Z‘?àååÿÜNNÁ®ú±ÍžæóóV4©dõŸÙÄ÷žËfÒ×îඤº´µÿìV~üçSŒüê,N¾LQ¾ f«<ƒöÁigÑÔ%lMÿ3ö Æ ü*]:fÙÆoPV•M^Ñ~^X1—#~İ>÷вiÞ«“W´¿QÂÀí­àƒ?ç ·¼ÛhÜ—½?n´ðùûÑËà#kãrþo……f:éÙ9,;É|>iõ9]Ƣ˲ˆ˜ŸB‚³/·öǿߤ:¤+·/î#{3?Ùx–³%ûÙ:“ǦFCþžX•Áð¡^O-‘†Q+‘ÆébéEÕþ¼³–…}ćjz¹:ŠÊ`‡ """"Òf)ëÔŠB]qÍŽ‡¹â›ßÁÃä!Yü}oi–ã0x ñç“Þ6ƒ²ôí¼pĵ¬_L°…ðb’¿c¯†wãÁ[Â0PVá!:©nò,gL$‘—Ôß+0¢#‰­Ì%j|ÛN—pôœÁññHÏç„¿Š´!ÑXŠ ""C±†Í†5à'Ð*­ëÇåˆä¶©aoÆK|°óx|UœÊÝÀsïÜÄ”aßeT¿û1Œà$!BCšqF7›$6ͦmL ŒF o,DÅDà »{ÀOQI%eùÛY’o€éÁf¤Ra^x=] µ2i^¸Ãà[c]üdm5•“'?¬áÉY-?χ´_Ž>i„MŸì0®˜s@Ÿ`‡ """"”’Þ­hxïϲçØ?ñxVâŒðÀ%÷‰4€È—¶ó†-ŒÉw»ðf8ñáf²z.æ›C”l[Fzþù£Õwä0ˆ5‡‡“öòÇwŽ“z{‘ávJKk0 §¦°„R3žØ…E•˜Da––QIbO!K÷²ÛÒ‰;’:qvãA6zc˜’lâæãl†õ¾‡ÉSYµíœ:»¯¯š5;Æžcÿ`ÖèŸÓ#eêu)-e:1‘=()?Õh|T¿û/ÚÒ ¹oWªÞÞDZaéà#{{:g{ ‡åøeÏIbâŽá«"¯ÜNLv^ƒ×ÓÕQ+‘Ë[ÔßÉ¿ºI/ðóÎ1óû8˜Ò­mNª,mOÄ‚›‰Xps°Ãió”ônEÑݸ{ֿظï÷ä":¼+c}•ž©Ó/¹áì´äyÁ~3ýìp Éi©”oü€çÏ„Gì™}l‰n¼¯Íj#fÐTŸ^ÆóÛãùæðaĽºŠÿÍŠ!Úee@¨ñ ^ºž?¼Õ~FÌžA|ˆ—¾Þõ|ÐyѶhz;2yÞ9“/t€ ¶¢Â;sçÌràÄk¬ÙõsjÝ¥—Ÿäßk>K·¤ Lþ}RâG\·x¬V÷Ì~÷wü”¬ü­8í‘ ïs£û©É¶¶ÎcxhêV^ùçRÞvرø½Xúñµ¹]«(%âäVþ¹ww6)Z7ˆ9Ž~K?à©3¡8Ý¢GMaÑ5Ä­V&""WÆjÀ3¸ýµr|xìƒjVÜI„#øóJˆˆˆˆˆˆ´­õ ëâã6w£™Ç—kîÞ¸Âån–f[<¶4XnxßÜmRUUÕ.£—Cw Uµ…lÚ÷{öeü‹€é;?jÐ5q,S†}ÎF5¾¶H­LDD®ÎÓÛjøÓÎZníëà77©Í‰ˆˆÈ'±ü½ÝºñQ}ˆ ïBTxÂC:u¨DDä“’hãé¹á<°¼¯~±¾š¯Éýï¾âû¥îF ïÑ)6lÖŽÓ1|{¶ÿùÂör·Éw߯â»#5Y¨ˆˆHcƒ?Ï‚½[à¥j°Ú ¢Zõgûl;gZ»6À€ä°^ü‘®%Îo»g€ï5%½E.¦¤·Èe™œÈYËŽÃÏr:wÐø’ðg,½;ßDפ tMGdXjp‘va\gOÏ çáUU¸ý&¿Ý\ùªß›ÊÕäª_;táÛÏÚÏG‘Þ1Û{<¸¼’ g¼äVØœåeVOG°C‘¬±ÐÙ ?ß kªÁæ€8Û…¤wx"<¹fF‚á…7߇nš0žš)6°ÕÀ¯Ã? ,ù"¬Úͧ`à2˜5Üa7xgD€Òbá‘ßÂ˵–ÿ}+̈€ê2øùRx£¸î|±Ýá/óa¨òóaíâ¬Áeο 2ž  î¾ øã«ðó\ ÆÂúℬÃpÿJè|#|÷Àâ xô%ØÞ±ˆ\’’Þ"—p,k5÷þ–‚Ò£Æ#ÃRéÛu{|Ф¸Á€ªÅDD¤åLënç™[Âøú»UÔúL^Üçæti€ÿº)Œו¿çxüp²¸î[OZŒµÃ&¼~9#”É/ÔÍ¡‘žïgVÏ $"""øŠ`Ÿ ¾62¶Áäyί´ÃOï„ØðÓ"°†Â=sá¡øŸ‹¦Èª­†76A‘ÒÂ/&ÿ—‚Ç€”8x|(<» ‹ëÆblm€¿žÞv:÷‡Gªá°°Ácw@Ü!x¼"Rà× açßàŒ~¹{á'ù`†Âwæ@ɾ+|Ò Îo‰†ÿžï­…>˜9FdÊóÉu¬01~·pÀ‚‰ðƒðËðgänƒwËát þcˆ´Jz‹\äLÞfÖïù g w׆•^©3Ùï>º%MÄ0:nâ@DDZß„.v^üT8­¬"¿*À†3^nûW9OÎ cLê•}|sûÍúÖºtì|NÛ… ÊÝk"O‘A ž\·§Á;߀ãéðøz8P öTXüp¼^ 'D¦Á}ƒáéM““ ÿöB‰’Cá¡A x,°ã¼|Šü€½Áù+áÝÃ`‹‡•³áåw!Ýö®p›ß¯–Bè9¸sÜä‚“`¶¾¿Þ([(L ý®âùÛ:AÏxè ñCiO˜nÂÞÊóqš°å¼y <ˆŸM‚ì­PfBöIXVüqgéX:ö7 ‘ K±f×Ï9uv}ý˜Õbg`ÏELò0Qaƒˆˆt4ƒm¼z{½[ÉÁ|?çªÜ÷vóz;øáäÐOTõí²éª$iðu?”ÀæÒÞ¾¦ÿòc ª¶”Õµñ»aG |'¬ aÀÈ!𾡾¹mfœOx7Ç÷Ïÿaxöd]¢<$:EÂO>?<¿Y ¶ˆ¨­uqy«áXõÕ%½PCàH5ôƒ³G¡aávFÖùä} <`·_â`"(é-‚?àeëÁÿcó§ñê:‚†…A=3yè·Õ§[DD‚&1ÌÂK‹"ùÃöžßSKÀ„åÇÁV„ ª=ûgGõ‡—FÀ¯7@¦ladZãsÔ\fÒÈ.Ãà›øñÈôÉåeð‡µPxþd6+ì­¨[W뀰`€ë*³lþ"x! þû‹p_)TÃ3‡??·zu‹|"JzK‡–[¸—w·|—‚Ò#õcÝ“'sÓèŸÕ;ˆ‘‰ˆˆÔqXáÛãC˜ÖÝÎãëª9Qì§Ümò§µü}Ÿ›™=ìÜ9Èɰ$ÛMvé?³‘ï>–É|šÛR­€—Í//§|Χ˜{õI\ÿ™|ïå“C©kf!eô îzų_˜Å{yfk'¾2/¥qåV£À4ZoFŸ¬«fù1ÏÇn72ÙÆ?E´R"""‹#FYaW¸M…”j(<9°Ãßì k |­'l]¾LjŒ‡°l< ‡»GB“ ã.ÑåÌ¿› ï}«´ ñäÀN õÂ#G Ö€ÔX(ó‚'ÒCáK]á{g ´ÜÚ j¯âù›>èÚ Vl‚eP]ÛK¯ v*üÐ#P{‘F”ô–)`úظ÷÷lMÿ¦Y÷sixH"³Çþ’>]nrt"""ML¶ñö‘¼vÈÍ3;j)¨Pí5y瘇wŽyˆvô‰³2®³nQ–Ë´?1ˆëÇ©U;8ñ¹q¤5¸4Ö¬ÍeÅ›Ûɰº Æ`à¬éÌN.â_=ÌÀ/Ng`é.žøÓ9f|{9ÌS¯¸¹çþa$œ?•µÛHþLo4>æò‹Ž9+æo¾±‹,»w9 _0›ÙIÕì\›Nzv¯/ßÁш)<653g ?ßœÈwúå·û]$;¢˜¹x½}Mc8À_ÞÏÅj¡ÚŬÛ&04üêÿæQ.ƒ ·IÀ„‡A­ßÄ«*+‘爇_ß"À|xc3ìòC žÚߘ oûÓáO§ç‹NÁºA°òa(®„5'áLØ¥ÎØXÿÑ07NMµ“<ó/øûùs}2ZàÔøì2¨,?î‚o Ž[¡¸åA§æN`Àç>Ÿ9p î|ºñz¯î½ùÀç{á«k ÷r`Åøí"H/ƒ¯? ëôYEPÒ[: ²Êl–mzˆœ‚]õcC{ÝÅô‘?Æåˆ bd"""—gµÀ]ƒœ|ªŸƒ^>àæPAÝ7›ÒZ“í9>¶çø>æ(`FõãžÔƒ<÷þY“ðÑ(ù;6³;u&M†ü<±*ƒ±÷öepòåùé’[LB?'²|Œ œ¥¶çpâ.[rÝü1GÏ !fìtõ‰¤vßJ~±·€™s“>$…åξÌMÞÃÑÊÆG²&%Ž®üðÎ4\˜œÛrñqÑ­ËIª{Íä‘I1˜%”\üÓ÷qòÃÉ¡ü焇¿î®å·EP\c2ÿ•rj¼š SDD¤%ÕæÁ“ïCœÌTUÁÞ,(9ÿ–»u/˜%ÐÙ† §s`O `Ào—×µ#©Î…ÿzúºÀí…“ù°ö”ø.lW¯ÁXéaøf ”¹/¬N¯°e/ø‹¡[X€òb(0Ölï9ˆ5À] g|yq…vž_ »C.$éMò^8ÿÄ›abüp'”úÁb‡ùàKûáMcߺ~V¦ ·ÃcgÁæcWТM¤£PÒ[:”#gV°jë÷¨õ”šÌÜñOÒ3eZpù\6ƒÅý,îï$£ØÏÚS^Öör¨ÀÛe Ùøá“™öïÕ¼~r6=0).©¤,;Kò 0=ØŒTÊM+½zE°út GÏ Ïô|Nø«HMü²ÿôNþûùCç[Xè;}}›;¦5”²ôí¼pĵ¬_Ì•|C³u~2ªæc 7)›vòÇç*0c{±h^ÂÇóÒzÄÔ5XI‹±Ò9ÒŠËfná0”ôia¾ XqðÒëýµ°ùh3+LX¿ï£ƒÀîc°»Áê½EÍl×ܾ¹ð·K”Tûjêν¹™uµðŸËÄýÑyö‚=ͬÊÙpK*Ԧó» Æ„x¸}JݾÍÅž›y¡¼¢–!"QÒ[:„@ÀÇû;ÊëÝyó&üžgL#¹6½c­ô޵òÀH~2Ëüœ, p®2À/6T_zG#Œñó‡°ÿå­²Cg âb#ILœÀƒcÃ1|Uä•ÛI´=º²g/»-¸#©g7d£7†)ÉK©­ÝGñh£ö&&ù9ÓJù–7É깘ouP²méùC³Z ü¾ºD¸¯¢ŠŠó9f£¾ª¼¹Xm8‹Šé9mì~2×¼Éë{óȨ«ú»>µ­†Ó¥~>ÌòqºÄÏ>€‚*“ü*•P‰ˆˆH 2aã¸y¬^Àâ‡Cûá‹«ÆEäŠ)é-í^EuomøJ};‹ÅÎÌ‘?fd¿/ÐzÓ`‰ˆˆ\VzD[ém¥Âc^>é á½øÌ¤Süä?1H9Ž~K?à©3¡8Ý¢GMá®X†«3}½ëù ó0¢mÑôvdò¼s&_¸äl“õghö˜·¤¥R¾ñž?N|\±göña~2“cã‰8¹•×b{’zr3/¸ãˆÀMh“™›š;îdæpœ—ßßKH¨…šš&Œp]õ;}Y­É‹û.\ãüæáŸÜRDDDäj:¿+‡X •G¼ÁŽLäÆÕZ¿‹ÛÜyŒf_n¬¹{ã —?ºYšylmðØÒ`¹á}s·IUUUO¸ M‘ÛVežÛÂÛ¾NUmÑá]¸mê_IŒäÈDDDZW…ÇdÌ_ëʃ¾<Âţ㯮â¹=hø·¸{“ŸL ½ä¶kO{9Qüñ3@%†[XÐÇñ±Û‰ˆHëXþÞn<È<Ðd]|||"ùä ›Œ-Y²„‡~€°°°Ç€M€ÿ·@3÷fƒe³ÁØÅÞ¸ÂåËÝÜ—kñþªô–vÊd[ú_X»ûW|ôï&-u &>…ËÜÐDDD¤ÍšÞÝÎôîö`‡!"""""×@IoiwÜÞJVl~„c™«0 ‡<ÌÄÁßÂ0,³·ˆˆˆˆˆˆˆˆˆÜÈ”ô–v%¿ä0K7öYUm!'sÖ’[´Ó ;œzžc›yvWy£†:þÜ­üø• Úê4N{3^æ…sëÞI±ƒù¼w•ð‘)ÌnZ÷Qï¹=µ-ß$ï²îô…Y úÄ}ìì›"""""rƒS¥wí>ú"ìú>-‰±ƒ¸cÆ‹„…$4ÚÎfß{.›I_»ƒÛ’ê¾¼úÏnåÇ>ÅȯÞÉâäËüva‚i|òK}&ð¥O¸O°ÔzÊYµõû9³¼~lh¯»˜5æ lVg# ® ]l¼}´îçêÁÏ”pßp:VÒwÿ9?/ì­û¬e³ÀØTõëiï”ô’ü’C¼·ã'˜¦¿~ì\ñAVoÿ!‹¦þµÉöQ©vï8Ë- :ãÀÇ‘]ù„¤80³6—on'Ãꂃ³¦3¥ð}~µßE²#ŠÉ½ÏñÊá(†ÅºÉʬ&¥"ÖÊ2NeL¿{£¬Ù¼ùÆ.²ìÜå0|Ál¦ä­æ7%ãxlT ÿxu?±1D[Êp›q×ñ¯ôñÎä}ÈÊ-ߥ´2 ‡-ŒÙcÉ ž‹ƒ™ˆˆHð}wb(3½טøMxvwm°C ª¯Œ ¡k”.tiïô©?HNçnj”ðþÈÉœuÍnoIêÀÂtvWƒY}Šå]&&ù;6³;u*ߺóf¾5/†­k2¨À¤ÄÑ•ûîAT…¤²pî4îé_ÃwwÍ›Îâ.ùìÊòcV{‰;oÝ5—oŽ…u{ ¨‹Ì$w×nòÎâ¡EÓXœæ¤º\íõU³fçÏxå½»êÞI±ƒ¹ï–•Jx‹ˆˆœbðÚí‘LîjoÔ㻣‰vülZ(_í v("""""r¨Ò;H,–æÿôVË%.¹µÄ0yHß[Fšå8 žB|ÆIÊ1).©¤,;Kò 0=ØŒT*L ѱQØ?‘‘aX»ÝN´3 `·[ðÀ´”¥oç…#¬e%øb>ê-nRZá!:)pÆDÙ¾0ŸÎÝȪ­ß¯OvƒÁèþ_bÚð`µ:‚›ˆˆH[“aaÉ‚pª¼&G ý¸}mäìë$%ÂJ×hË'nõ&"""""7.%½ƒ¤wçÙlØó$_U£ñ=n»ä>QƒùÒvÞ°…1ùnÞ ƒ¸ØH'ðàØp _yåvb²ó0®èÛ]€n&«çb¾9ÔAɶe¤ç´Î *ÜNii &áÔ–Pj&\î`­ª´2‹ÕÛ~À©³êÇb#{2wÜ“tI´¸DDDÚºZ·‡cGOÑ»g"ÂCƒŽˆˆˆˆˆH«RÒ;H¢Â;ó©©fÕÖP^• è±#»ä>†³ Ó’?äûÍô³ÃºQFŽ£ßÒxêL(N·‡èQSXtÅ‘XHNK¥|ã<&œø¸8bÏìck¤ ¤ FÜ««øß¬¢]&QÆõ¯«®-bó§ÙsìøÞº¨ c<À¤¡`³êRe‘Kñx¼<ù¿Ã4á¾{(é-"""""í^k]éyñq›;ÑÌãË5wo\áòG7K3­ [,7¼oî6©ªªê —QÜÌÓ»R&åU¹¸œQ8la×pœö§Æ]ÌöCKØuäo*âSF2{Ì$Æ bt"""m“×ëÃno\×p:ó,)I 8—h£&""rƒYþÞn<È<Ðd]|||"ùä ›Œqɘ] IDAT-Y²„‡~€°°°Ç€M€ÿ·@3÷fƒe³ÁØÅÞ¸ÂåËÝÜ—kñ*[UzAdXJ°ƒhSr‹ö±ûè‹>½ Ÿ¿¶~<>ª7S‡ÿ€Þ]f1:‘¶ÉëõñÚÒ÷8|ì÷ßû)zt»ðù¢{W}Ö‘ŽCIoiJ+³8tê-Ÿ^FAé‘Fë"ÃR™<ôÛ ê¹ð)B‘¶-` qr×⛕ä‘MIo¹.|>?'2  ¡Kç$¼¾j²ówr:o#'²×PX–ÑdŸ¤¸ÁŒîÿeúu›Õ¢Ë±EDDLö§ãÐá“Ì=‘訜·-˜äèDDDDDD‚OIoi5¦irâÔvîÙÇÑŒ³¸Ý~†Ïæ½½{È/9Ôì>.g4»ŠÁiw7ø:G,""Òö—ðæ²Ø? —ÓìpDDDDDDÚ%½¯ƒÒÊLv~¿ßìPZEQY.g4V‹ƒªš|j*Ã)ʦ¢8…€ïÂäœ['νÔdÿðDzu¾‰>]n¦[ÒD¬V}È;WÄÉÓÙŒ5«µ®ÅW|\ ?ûáW‚™ˆˆˆˆˆHÛ¥¤÷u°qïïI?õf°Ã¸.üžªr>¦µÉ:kÈI ÃJldOcÒ¥Óº&Ž'.ªW"iÛNœÊæ¹ß"±S#†öÃju;$‘‚’Þ×A¯Î7‘‘ý<ÞÊ`‡Òjö0,† {¨Pë ÎŒj²ÍMïb숧ðû,„„¸‚¥ˆˆHÛTëöPT\Jjr§ú±ÝRxô¡{ˆ‹ bd""""""7%½¯ƒþÝпû‚`‡q]­X½‰·î­_¶X F ÄÁô“¼±l )Éxð¾ÅØlM+ÂEDD:’#ÇNóÊë«p:ìü¿oè·X,Jx‹ˆˆˆˆˆ\%½¥UÌ5‘ü‚b2NdÐ95‰—“aCúAQqVë…„·ß`ïþ#$%Æ“’Ü©þ ¿ˆˆH{âóù©u»  ­KJŒcÑ­3èß§‡ÞÿDDDDDDZ€%ØHûd±Ü}ûâã¢è“Öõü¸…´3r`£/öµn7k7íâÿþúj}¢\DD¤=Ù±û¿üÝsüýå寣£":¨‡=H‘‰ˆˆˆˆˆ´/ªô–Vãr:øÜÝóyæÙWéÝ«ëe· á;߸—òŠ*"ÂC­{kù:ÜncF ¢G·”Ö YDD¤Eøý~»ýÂG­ø¸hæÎšÈ iAŒLDDDDD¤ýS¥·´ªø¸hî½ë–Fs]NdDÆE×v§õèŒ×ëå\~Q£qÇKiYE‹Å*""ÒÖnØÁ¿}Žeï®o4Þ£[ cF$T“9‹ˆˆˆˆˆ´*UzK«ëÑ-õšö<°ƒöj2¾ië^Þ_»Î)øÚ—︦sˆˆˆ\Z·‡ÝŽÅráÛ¨ÈpæÎšØì{—ˆˆˆˆˆˆ´>%½å†5mÒ(z§u¥¶ÖÝh¼ªº† î&9)ž!û4JDˆˆˆ´”—þý.‡fÞì‰L;´~|İþAŒJDDDÚ cÐØ`‡ Òf™·;iã”ô––ÅbÐ%5±É¸ß 7¯»‘˜GrR|ý:ŸÏÕjÅP\DD®iBQq)q±ÑÞ?ºwKaØÐ~ôëÝ=h±‰ˆˆˆˆˆHSJzK»Æý÷.lvÝÓ~…êšZnž9Ñ#\çÈDDäFSV^É_žƒ²ò ¾ö¥;HM¹0GÅÄq™ˆˆˆˆˆˆ\Š’ÞÒ¡|áž?™MJƒêo€“§s8u&‡>½º5[=.""í_Yy%EÅ¥ôìÞ¹~,4ÄÅ´É#éÑ-•„ø˜ F'""""""WÊìD®§Ø˜(ÆŒبR ºº†ƒéÇYúÎÚ&ûx<Þ랈ˆɾƒÇøÍÿü¿ñ~ ~Ün·1fä %¼EDDDDDn ªô èÅ ½šŒçž+äþ1Ñ‘Ü÷Ù[‰‹Bt""ÒR**«9xè8.—“áCúÖ÷éկܿ˜Î©‰X,ª ¹‘)é-rɉñ‰«7râd6Ç7îÇârÒµKr¢‘–¤¤·ÈÇèÖ%™nÍ$BB\NÒŸ 2"¬QÒ»ªº–â’2’ã±Ù¬×3T9oãæ=Í8Ãè‘:¨Oýø·ÍÂ0 Ãbt""""""Òš”ô¹JS&Ž`ÊÄMÆwï=ÄÊ÷6Î÷ùÂõLD¤ —5鹕sŽN 1¤&'4Wë‘öOIo‘6y† êCM­»ÑxYy%~îuâ㢹uÞTMŠ&"rÎæð׿-ÅãñðèC÷U¿î3·Ï bd""""r­ìV ÞŒ_‹0‡H—ƒ» ›ÅBfiµ^á;z¤à²Y±[-X ƒm™yd–T¬>]qXë®äöúl>Ë©â2"]&vOÁ0À0©ñú8[HiÍ…œ@l¨ _ @•Û‹ß4¯ùù´äßF¤½RÒ[¤DE†Þh,"<Œ›gŽçl^a“¶'[¶ï§¢¢ŠÒHMît=CióÊ+ª8xè8@€Iã‡×ÇÇF³xáL:§t":*"ˆŠˆˆˆHKŠr9Ó5‘÷Že^Ñö¡v1¡."œvBívN—Õ'“"B™Ó¯{£í#óìÌ:@L¨“”Ȱ‹Žg¿°`‚¥Ak<›ÅÀf¹°år’Ñx°ŠZ{k èÉ´^ë×Õx}l:u–œ²J !<”¯*—À$ŧ§ufGv>%Õµ»­HG¥¤·Èub± Ò—aCú6YÈ8‘…×ço”ô®©©%3ûÉIñDF„5ÙOäj”–U°s÷!2NdRV^‰×ç vH×ÌépM¿>Ý5|‡ýãw’6ÉãñbµZ±Z/´!Ù¾ë ;wbðÀÞ¶u8ì êŸv½C¹!üêë÷QY]Ãoþþ*þÀ…ªàÛoš‚ÛëeÙú-Ÿø˜÷Ý:›‚’2–oÜÖ’¡6â²Û˜Ù» áN{“Šæ0‡è'EÕµõ•Úqa.æ÷ïÑh·ÍÂÖ3yTy|TÕà¨öø¨õù9š_R¿mVi%o<Õ0ðøxúcTÕðÏ]Gê— ÃÀl˜Î*­àÍÇë«Èmƒœ²ªúõEÕµä”Uátæ°b·b¿ŽëÓ)†ñÝêæó”Ô¸ùðÔYJj_=þ»ÕBRd3{uaÅáSÔx[æûÜúz¹%½EÚ€‰ã†1qܰ&ã§Îœåå×VaðØw¿„Óé¨_W]S‹Óáh”¹Ó4ù`ýÖmÚ…ßïv8-ª¦ÆMiYÇOf±vÃ>5:• ½á¼ðÏeœ8•Å´I£¸iúØúñ›¦å¦ic/³§ˆˆˆˆ4Çá°3{üHV~¸#Ø¡\«a0³W"]uß};…‡’WQÍÄîÉ$G†Õ'‹O—³îD6PW9_YCÀ4©p{)¯us¢¨¬þ˜n+ºìyK/‘`nŽÙL%vy­‡òZO³ÛW¸=*Ö/N䟫¨ælyQ®º¤x|X1¡®ú¤wØ(†§&PîöPTU‹?Àb„;íÜÔ§++ŸÆh™V'7ÚëEär”ôiÃôëÉã?x€ÊªêF ï@ÀäÉÿý;~€Å g0lpÓêq‘†L^[ú>{ v(­®ªº–—_[É­ó¦1vÔ `‡#ñz}ìÜsˆ¼sEÌž9ްÐúu£GdÂØ¡ôìžÄEDDDÚ·×oáî9ÓÙsôy…ÅÍnÓ#%‰ÛfL$ÌåLö;ÉŠMÛñŒìß›ù“Çbšp:7›åB«Î.‰ ,ž1‰ˆ°Pü[æƒ{¯:Ö¨'S{¦êªKŠ¥´ÆM÷ØH,†Û秨º–ŒÂÒúmª=>V9}Õç½Þ.îÅ]Zãæ?GÏu ñP»²s„…:lDºDºtŽjÜF5.ÔÅô^Ùz&— ·÷šc»‘^/"GIo‘6În·ÙhÌb1øÖWï&'·€.©‰Ö½¿v{¥ŸÌŸ3ùz†*mØúwuˆ„÷GLÞY¹žÄN±tïšìp:¤@À¤ ¨L“ÄNqõã…E¥|¸m©É MöQ«‘–UXRÆû[wñ™9ÓùŸ—ÞlR¥âpð•OÏçßÿYÏî#„8½º5™84,4D•Ü""""mDf^>[÷æ®ÙSÉ/¹0ÉcyUá!®FÛ†‡†RVUMU­›0—³Ñº¨°0ò ‹)«¬¦¬²šÇÿòb‹ÇêÈ*­ «´‚0‡gƒÊ掮ÆëãõýÇ©j墦éõ"r)jo""Œ9û>{+Ó§Œn4((,a˶}Ô^ô‹íšõÛY³~;…E¥HÛV^Q삪¬\U!W*+çk7ìàБ“ÆËÊ+)*.#.&«µñ—Ži“G1fä@B/úð+""""mËò [IŒ‹a@®õcÇ2s°Z, ï× €°cöaÏ‘ãœÌ>KdX(ýº×Fõê’Bj§ºb’ŒÌlìv#û÷ÀjµrÛ´ JëÞ¢1Wy¼W×~ü†Dqum«'¼?r#¾^DR¥·ˆ\Rrb<÷ß»°Ùu••ÕdfåÖ¨øÉÓÙH?AçÔNŒÖÿz…*—ák¡þn7ªŽþü/fšpâTEÅe ܧÓQ¿næ]•2vTã ÝRèÑíÖ몈ˆˆˆ´ ÏÇ¿V¯ãëw\ø\Wëöðç7–³xÆdæO ˜lO?Æ–‡1M“WV¯ãî›§cX Nfç²ûHÃÀíñò§×ÞañŒIÌŸ<‹aáXf6Y9Á{‚Ò¢ôz‘]kõ*¸ø¸ÍÇhæñåÆš»7®pù£›¥™ÇÖ- –Þ7w›TUUõ€ËP"‘œ8•͆wøâç>U?îõúXöîzœN‡úü^gOÿéòò‹Zíøaý'2®v+kN5L.D^Àœê•¬ Ëœêwùwºï’ÇhMcG fá-Sƒrî`ª¬ªáÔ™œ}z]¨ÎÈ/,á©g^&*2œÏf>‰â‚¥ˆˆˆÈÕYþÞn<È<Ðd]||ûhmg ìDÚ,óà¶`‡Ð" ›Œ-Y²„‡~€°°°Ç€M€ÿ·@3÷fƒe³ÁØÅÞ¸ÂåËÝÜ—kn›k¢JoiQi=:“Ö£s“q‹ÅÀá°“_PLYye£¤÷¦-{H?|’´ž¹iš>Ø]oÖ^3xtN4ùŰ:°WfÙ;‡É¿L´%e, RÒY¶³’ªÃ²æú…+ÉÊΣ °„Þ½ºV?¾fÝ6vî9Lÿ¾=%½;ÅÇðÄ¿¦ý""""""Òn)é-"×…ÕjeÁÜ)Í®ëÖ5…ʪœç'ÇûHqI9ÿ÷×W  áŽE³HMîT¿®ªº·ÛMTdV«¦'¸6&¥éùÇÚØè9ç6&t?ÆÛùݘ?a^ƒPßqÖä¤1«kå…ç8×›¾Q.†žÞÈ©ó™Sý.¯fvm°ý >8ÛàF4S?;‚’×ÿÃþZÎ!áÃwX_Øâ?æ¶K¥e¤>‰išL?¬~Üíö°äoKq8ìÜê¢_Ÿõën7s§`±4ý÷¡„·ˆˆˆˆˆˆ´gJz‹HÐuIM¤Kjb“ñè¨Ý:ƒÒÒ ¢£"­{kùZÒŸ WÏ.úŽ»Ývï;BDx(ýûöTBü³â àö˜X]™ÞcŽÉOÏ¥—+€½à ¯o(Â:°+ƒCw±¯Ð$ò|žµÉö!&|4‡¦YÆþ sú„pàp}C²ØP¤„÷ŶlßOÎÙ|† êÓ¨:ûhÆ6oß×臧ÓÁÏ~øà%Û`zý‹ˆˆˆ´W3,ž°ùèd´íÏÕà¿•Çý6*Ûv¨í–Óágá´3 îS„ÅÒ¶ÿ#”W:x{mwŽœRKT¹6Jz‹H›e± ì׳ÙuwÜ6‹âicp\T^VQÅ–íû©¨¬æË_ˆ"%)¡~Ýûë¶q.¿˜ýz2lHßFûUU×âr6›"ãmä¸)+© @ÝÄMo_PÔpVq“Òç±ÎéNLM"!§vSܶ?k]3ŸÏOYyáa^§ÇOf±ò½ñz}üöî<<ªêþãøçÎ’d2 !;[؃€ ‹ ( (Rpi­Åb•*P‹ûVµZ‹â† V-¶µˆ»à¢¥T$²E!ìKö}™ÌÜß!“°%2y¿žgž¹÷œ;ç~ïp̓NÎ6õz¯¾Ÿwî•a²Ù¼¿á¾uSß‹ºù?Õ´‰²²rURêòjOùyÞø×DzZ­šþû‰^ë'oùI¹yj×¶¥šÇÆqª2•½e­þ½*MžŠ6«:ô¹@Öï?ÔÇ{BÔgÒEJ2+ÿåÔk… ‹Úœp|Ô‰gÉÝ©-æèY¦ËòÀ_ÏO® °H›6ïPi©K.éåV?ÿÊ”ž‘­þýzjÔˆíMÂt~犎ŽÝîý6“oUoµõ©©aj†­L7›nÂï:ÖÃn ¶zh4z÷ì¢Þ=»TiïØ>A·ýö:•”–**2«/åç½JùyrróÕüŠã¡÷O;÷ê?ï.UxX¨n¹é…9C+ú¶lÛ©¼üBuh×R1Ñ‘uwAuÊ£´=Yº|À`IÏQf¦[íZ;TYÞëÎÌ’ý’ê·o¹¶H’̪Ç'„(÷Hå1 µm›[#zîÓ§¹çÞßn]®2íøi·ÊÜnuïš(‹åxª¿ðÝ¥Úµ{¿z÷è¬Ã.­h?x(]ë¾Û¬&áaêwqw¯Ðû—7Œ’Ç4}Â=©!ƒ.®û @@{ÀekË›œˆð»îBØ}lyàlzhô ÃPËq>ûÆ]}¹Ïö„–ñºzä@¹ÊÜr„„xõýœ¢Ô=”“§C/©hß¶c—þóîR…:BtÛÔ뼂ò5_oTvNžºvn¯Ží*Ú]®28”&ghHèîŸVéÕŸNl5•ûãJýýÇcû´¶R¯çàwzõïGw|¬·%IÕ¬_²ZÊôó;UŸ™·ÇãñÚ_øîRý¼kŸz^ÐI£F ¬hßµû€Þ~™B!jß¶¥ÂÜ}Ý»%ª}»–jß¶•×XÛ'Tû›±1 õ<ЬôXtii¿Ë¨Q¨LýÒêÑo­n5=!œ?~O5Ýú—Ç¢ye6åú©Î†.ÈîV¿ Žè² Vv—”Zµ~sœVoh¡âŸ V…ÐÎ@ppP•uÁ¹aŸííÚ¶Ôuã®ÛíQ¨ÃáÕW\RªŒÌefyÿ5oûO»õÖ¢ÏdÒ]3nV“ðãAìKGéYº¤Ïºâò~íûöÖ²•ëäpëW9ÓK¬evµ½tˆÅÐç‹ ëui·Ûíµa¯.Jì 6­[xµwêØZ¾ïÿ|ŽQÝÚòªW(CóÜVýÓm©6üv¦nµº5Ùâ!ü>M„Ý@õ½ žéü.|ö ÒÏg{·.ôÐÝSUævËꔹj²²s«¬5¢¸ØòµÏ‡º”úÍR¥úáÌ'®›Ø¡µª/ÂïÚEØ œ¡7œã‚ƒƒ죽U‹8µò±,KTd„Fèãà?„ßg‡°8u„Þ€3`(ââ«5²ðS½ý£¿bQ«!£uÁÏKôénÏÉpN ü>=„ÝÀé#ô€FÎÒòý¶×~ý}ɹO~x½°´è««[ü¨7ä×ëúßêÏÉÂo÷¡²«›BCuSˆ£†‘_™»@®²<íØ7_©‡U´v¾z*4¹h´®oqX»]1Jpf+%ÝPÓø8Y7/ת°¡º¾åaí*pªyL±¾ß-©P2œ­5|ôŠtyäNÕçK¶¨¸Wuã,ÓG»ct…Ïã)µ(\Í㤃¥-u^Xˆz¤®Ñ¦¢¯ñ—}# ºªƒ<é9*‹²«ôgkÎFuáwÙ˜kdFEù»¼s‚Íê”ÍêÔy ·*õÐ"Ânà$Ε'œÎ¦iHi;´üó¯µÝ'ׯ$-Y±W‘âd9Ú÷ŲUZ²+N=b I†â.ì­ˆÍËõöûŸkyv¢.mg­aœx5«æx#ã'­X¾Z+6‘#-MG’ÿ«Méª2þÐA]U–ô™Þùd½~. ’áï/ @­8~_Vj×ßÊl2ÃÃý]Ò9Çn‹Ðšÿ6×SoôÔÒ¯¼j0ÓP‰©üü"™²«ÌU¨üS¦¥L¦Í*ÉTnN<2•_P¬`‡Jd(""Lñ-j|'É1äJ’Qí8¶jÏË-”GR™Û”¥âïm–Ž·Èl(-Ï#É£ìœ"%øí»PŽ…ß·ÙlÌÖR‰ý‡ªk¸E:hST¤ƒ™Þ€¹ífåé¯ Éí9þà÷k‡]¦—K¯N:í1o3\iY9ZòÕúÚ,µZãäÛOOO׳Ï>«õë×ËårI’zöì©Y³f©E‹5~öðáÃ:t¨’’’~³ÊÏôs'sçwªuëÖºýöÛ«=æT¾“3÷ Pÿ`8eF\gºz¤Æ¶9¤ï˜’Lùß&ô¼B×½B×è¤èÿ9ÕTÚ)oæeÉ~Á@õka9aüŽrmÙ®£5ql?µ±‰Ôð-(È®á—\èï2êÔ]wÝ%Ç£?üP_~ù¥–,Y"‡ÃQcp|6LÓTLLŒ¾üòK………ÕÉ9ü¥1Ü/h<˜é œg’æí/ßÎûïýG’Tªuo-/oÌÞ¤7>0qqWenýV‹,«øìfIÒn}þönïA«§|³úã¥C«?ÖG’ôݱΪãÿôúæÓ¿P ‘ùhu’&޼\ÿÛþ³¥gú<¦]‹f7¤¿œ!!’LmÚ±SŸ¬ýVnGvIÔè}ešRêÁC²_‡P ñ±?d€Â¡r{ø rss+ŽÙ´i“žzê)åääH’† ¦iÓ¦Ukݺuzúé§•““#Ó45aÂÝzë­:r䈆 ¢{ï½WsçÎÕ#<¢éÓ§+))I»wïö Øóóó«O>ùD’´eËýõ¯UFF†l6›Æ§›nºI’ôé§Ÿê…^ÅbQ÷îÝ+fªûKc¸_Ðxz ô¬}±î¿š4òrÍù÷û2MӫߤßM­·—­ÖÆm)rkæ¿PN~¡6nÿI“¯ª—ÞY¬”=û•«™“Çë`F¦‚ƒìú¿k¯ÖÇ«“´nóV…9úã¯&(-+[›J­×k3fŒüqíÛ·O}úôQ×®]åp8äp8$•‡Ð¿ÿýïõÀhäÈ‘ÊËËÓäÉ“«aÆUŒãr¹4sæLÝwß}5j”RSS5lCè IDATnÜ8õë×O­[·–$×­[7­\¹R’”••¥ñãÇkÊ”)’¤‚‚ýîw¿ÓŒ34nÜ8eeeiâĉjݺµ.¸àÝÿýzå•WÔ§OmÙ²E“'OV‡êë««¢1Ü/hpX’t^›V2MSë6o•$åéÛämº¨k§zº²ãî¼óN=öØcJIIÑÌ™3uÉ%—èöÛo×öíÛ%Iëׯ—Ýn×È‘#%Iááá5j”V­Zå5ŽÝnײeËtå•WJ’Ú¶m«„„íÞ}ü·NG-‹Åw”fš¦î¾ûnõíÛW¿øÅ/*Îm±X4nÜ8IRdd¤ÆŒ£O>ùD6lPdd¤úôé#IêÚµ«ºw¯úgTŸÃý‚ƃ™Þàb¢#µ3u¿¿Ëð›ØèH—øÇãÑ[Ÿ¯Ò´Æê‡”]^}MBC•_TìÕ–_X¨&¡……„¨ ¸Ä»¯¸üØpg¨œ!ÁzäÖ_UôÙ¬¨fIŒº6xð` ÿüsedd(2Òûÿ "##•‘‘QeœÅ‹ë“O>‘Ûí–a:pà€<•êUm ¯¾úª<¨gŸ}¶¢-==]999>|xE›ËåRbb¢²³³á5FÓ¦MOëºëBc¸_Ð8z@€;¿K{}ûßd—á6›Uç%¶ñw€_í9tDë~ت†Ò‘¬œŠöÜ‚…9¼32,4T9…*(.‘3$Ø«/ÂéÔ¡ôLåä*'¿PÍ{³^ê¯NFF†’’’4zô芶„„Íš5K‹-Rjjªbbb”••åõ¹ÌÌLÅÆÆzµ­]»VÏ=÷œ.\¨¶mÛJ’׸RùLh_6lØ ×^{Mÿú׿*–U‘¤¸¸8ÅÆÆjÙ²eU>óùçŸW¬1~Lzzº_—79&Pï4.,o®cûÖjÕ"ÎßeøE¿‹»+ä„¿xÑ’5ë©®íZW´íس_V‹E½:w”$9!ês~'ýoÛOڹ8CÕ¹m‚$©cB µŒ‹‘$¥ìÙ'»Ý¦ »$J’¬V«Æ ¾TÝ:´­ß‹’ôè£jîܹÊËË“T¾Žök¯½¦ˆˆ%&&ªOŸ>*++ÓÒ¥K%IÙÙÙZ¼x±FŒá5Nff¦š6mªV­ZI’-Z¤ŒŒ Öxþ¬¬,Íš5Kwß}·½ú.¾øbë³Ï>“T>Ë{öìÙZ½zµz÷î­ôôt%%%I*ηmÛvö_H- Ôû3½ À†ô‹±C5ïõ÷TRRêïrêM³¸h ÔÇßeç„Ò²2-\ú¥n»nLE[qI©^yo‰Æ¨ÑúJ2õí;”´y«LÓÔ–~©‰#.—a1´sßAmÜ–"‹a¨¤Ô¥—ßY¬ñChôÀ¾²íسO){ëwYÅèèh½ùæ›z饗4jÔ(¹\.9õêÕKo¼ñ†œN§$iîܹzê©§ô /H’®¾új7Îë”W\q…>ûì3]uÕUr:š8q¢n¹å½øâ‹ «¶†?þXiiizá…*Æ—¤•+WÊétê•W^Ñ_ÿúW=ÿüór»ÝêÛ·¯.ºè"9N=üðÃz衇äñxÔ»wo9Òk9 Äû‹ïß˨ýq}Çð±]S›¯wã÷½,>¶­•¶-•ö+¿ûz (((xL’B Ö pîÛ™º_o½ó™ ‹O~p×<>F¿œ8JM#Âý] êÀ’啜œ¬©S§V鋉‰ñCEµÏèÖ×ß%ø]òÛ¯û»„sR·ëãïüÎL^ïïjEzzz•¶ùóçkúôé’$§Óy¿¤µ’ÜÕ¼<>ÞÍJûf¥¶·+¿tŠû5½Ÿ¬M5´ù:欰¼ 4íÛ¶Ôn½A=/8¯Ú'Ž7tÁÁA2èbÝú›ñÞ4R,oHD“0]7î ]}åeúy×>åää«ÌíöwYg-ÈnSlL¤Ú¶n!›Íêïr€z@#ä V·.þ*8€33ÀQ¤{£3k+ów)¨g~ýw—PgÊ stø›7U°o“¿KA˜¿ßÀî!ðFà±…F(þÒ_ú» Bo@À ôh`þ’­´2V­E`)_ÞäŸþ.€ŸŽ ÌÚ"‡®Ú×ÊßeÔ©äS8fРAÊÉÉ‘Åb‘aŠ×À5uêTEGGŸö9>¬¡C‡*))Iááá§_t=Øñ[ü]pÎc¦7¬'žxB7nÔ7ß|£§Ÿ~Zû÷ï×µ×^«Ã‡ŸÖ8¦iÊãñÔQ•ê¡7¼àà`uéÒEÏ?ÿ¼š7o®_|±¢oݺuºöÚk5|øp]qÅš7ož$éÈ‘#êÖ­›Þzë- 0@?þø£×˜+V¬Ð!C´{÷îz½g‡åM0,‹ÆŒSl»\.Íœ9S÷ÝwŸF¥ÔÔT7NýúõSëÖ­%IÔW_}¥´´´Šq6lØ Ç\óæÍS›6mür-Î ¡7JóæÍ•››+I²ÛíZ¶l™BCC%ImÛ¶UBB‚vïÞ]z=ZËñ¶oß®»îºKÏ=÷œëÿœBo”ƒ*>>¾bñâÅúä“Oäv»e†8àµ~wTT”×çgÍš%—Ë¥ØØØz«@í!ô@Àðx<úðÃuùå—K’Ö®]«çž{N .TÛ¶m%•Ïì®Ì0 ¯ý9sæhéÒ¥ºóÎ;µ`ÁY­Öz©@íàA–hðLÓTjjªþô§?)33SS§N•$effªiÓ¦jÕª•$iÑ¢EÊÈÈPaaaµcµoß^3gΔÛíÖ3Ïøà­\¹²^®@í`y€ó—ÛnV~a‘þº`‘ܕ֮¾vØe*q¹ôñê¤Óóæ1Õ–•£%_­¯ÍRÏÊêÕ«OzŒÃáÐË/¿\¥}Ê”)’¤1cÆT´ÅÇÇ+99¹b¿eË–úæ›oj¡Òs[c¹_Ðx0Ó Ù5ü’ ý]îfz V'iâÈËõ¿í?ëPz¦ÏcÚµh¦qCúË"ÉÔ¦;õÉÚoåöxta—DØW¦)¥<$›åøÃâc5~È…;Cåöx´nóV­üîûzº2ÔîBo€”ž•£/ÖýW“F^®9ÿ~_¦izõ;‚‚ô» £õö²ÕÚ¸-EŽà`ͼñÊÉ/ÔÆí?iòUCõÒ;‹•²g¿âc5sòxÌÈTp]ÿwíÕúxu’ÖmÞª0‡CüÕ¥eekóO©µV¿Ç4e1ŒZ/xNø3¬M ý~*cy€d†¾øö{Ùlº¬w÷*ý‰m[©ÌíÖÆm)’¤¢’mØš¢î‰íÔ1¡…ò ‹”²g¿$iïá4í>pX’t^›V2MSë6o•$åéÛämº¨k§Z©ÛaskB·ƒ2ÌÒZ/xÜÒ¥‰£lsÔúØ õ~|a¦7@€òx›Õ¢Õ,‰qª6·Fu>¢ çTxp™<¥Ù²†ÄŸÕ˜¦¤DêÝnˆº%ôWòÞ¯õß]+TRVTkã7¤û¨ ¡7@ÛsèˆÖý°U7 ¤#Y9í¹ s„xªœ‚B—ÈìÕátêPz¦rò •“_¨‡æ½Y+õv“óÓ×ïàTz¸%kÖéÞ)Ó4B›RvJ’vìÙ/«Å¢^;êÛ~’Ó¢>çwÒŠo¿×Î}ÔĪÎm´-u¯:&´P˸mß½W){öÉn·éÂ.‰úïÖY­VØW){(ùçÔS®©º°û˜¼Ý‹tä§÷ôÉö8-Jn¡‚R«QŸÝ¤î­¨wÛ! ±‡zõÕUø}.Þ/Àé ôp¥eeZ¸ôKÝvÝ˜Š¶â’R½òÞ2P£ô•dêÛw(ióV™¦©ÿ,ýRG\.Ãbh羃ڸ-EÃPI©K/¿³X㇠Ðè}e1,Ú±gŸRöî?¥ZNvKR‘ËÚèÃîc\îRmܵR›÷¬­·ðû\º_€3QWÀ=q\_ç1|l×ÔæëÝ8Åýc/‹mk¥mK¥ýÊï¾^ “¤ƒ5ˆ¨/K–oTrr²¦NZ¥/&&ÆÕ>£[_—Pë»kGM3¿)-+©“5¿Ïfòz—P+ÒÓÓ«´ÍŸ?_Ó§O—$9Îû%­•䮿åññnVÚ7+µ¸]ù¥Sܯéýdmª¡Í×1g…™Þ¨3„ݵË3¿††ÐµŽ°»n~Õ#ôh`ú´ÊÖú¥**´Ôߥœ‘¼›>ÜÚLo‹W!a÷Y9~'ïýF=ZT6ƒª ¿{·â§*OMAq®Vm]¤Ô´-þ. ¡7@3­Þ„Ýu§´¬Xßí\®M{¾ª6ü>×9Cšèò®×êÕø»4p„Þ¨S„Ýõ'ÂoàlYü]NÏ‹ëÚ*³0Èßeœ”iZµ3F¿ù ‡þЂÀ» ¿ßüê1m?¸A¦iú»¤“*(ÎÕª-ïø» fz40ßîkª_¾ÛÓße (-+ÖòÍoiùæ·ü] Po˜é „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€Aè „Þ€€aówðf&¯÷w Ð`1Ó0½ƒÐ0½ƒÐ0½ƒÐ0½ƒÐ0½ƒÐ0½ƒÐ N‰K2a˜ä*ñw)’¤Û{IÛ×|Pçç9×®8Ùü]·÷–­×Ûÿ|E…YGáÔ¤1C5òú[küŒ[RSEÝ:=…%Ò/ÿïZ½÷Ü|)<òÌŠ®"[†äÕâöH×þß yý,Ãb•Åð¨G—úíM7©y§gt–³¹n ± ô€ß¤ì+Õ¿ÿñ¼y|¶º·k¦Ü´ýòäí©ÓsÚƒ¤i·ÿAr†ÔéyLIa—îzæß¡\%ùJúr¥î¸ÿ½üØ#ŠîÔ«NÏ4V„Þð›]YEj­îmœ’ …ĶRPlTEÿ;Ó5ç¹'U˜v@¡ÁÒS~¥îFVgÑçë´xÑßå))QtCÞs¿"ZwR‰Kúí5åú»õÜ+³ueÏxݓšêÇézú™¿¨8óZÅ…êY÷)¼E;IÒ7›vëÅçW«HÚ5“åkÎÉ–‚ÃÂ%‹åŒjw—•é¯o<§æ-C%{k1¯ðFè ¿ 9úr…FjðÍwèÉ#$W‰Â›6UAv–äñ”§¿’222”é5«úã¯vhêOõðO¨i¨CIß®Óg‹?ÀtK†ï5·%éíeß«Uh¨®èáÑJ¤°¦MÕ¾SO=3ûqY.b*]’C¡ U”›S¾¨¶aÈ4¥üÂâS¾ÞO×,S§®m%«ýŒj7 ‡žœó´<ó„Ö~¸@ÆßzÊçþ~³ûP†ïÝ)™¦,é›/ÿ§&-ÛH6«.ê)w‰]»¿]!IJ=X¬mß|©á—ö‘§Ò{r3îQÓCÅ¥Ò?¿øÎ«¿&3<ú`Ñ<Ýó»Ë$KóŠö ;EÉ“»_»¾Y*©|6ùÞý…’ª^b•›Y¢Œäõ’¤-» ´'9ù¤çÊ+téŸï¯TÒG 4ãÆ‘’a=£Ú £L-"šhèèõ–)o×§xµ@ãÀLoøMÊáBýã™G•™vXÁAv×¥·¾ûfÉbW3‹4é¾õòs/hï ¢)·Ü(G›^*tcð ~ú`õ4qÒ¯ÙT—ûµR¾©ú°Ëª ýë³*É8 ?Ý7O.½*›µDsú³Z4k£I÷?¨×žY;žyU’[W¾P·L»O C×Ïœ®»ŸyUE¥/¨MBõ¿ô"Ÿgp»K5aÆ“2 «l6CÝ{\¢¿Î¾W‘mZEíI¥:?¾‰ÆÝükýùéGô·gÞ”‚BNå+^]=ÖõÄq}Çð±]S›¯wã÷½,>¶­•¶-•ö+¿ûz (((xL’BŒL—ê’啜œ¬©S§V鋉‰ñCE8i*_«Û!S†<’rU>O3\’”/É%)R’T ©HRŒÜ’ê Z)N%²*[R¼Ü’ŠŽ¸[R¯ãÊ#Uj‹Wª,j«RIAG+Ê>zþ0å=6B’!×Ñj›K2”yô¨&2%e+W‘j¢=’ZW\›))UR;ydÊ"C¥Gë·J “$•=ãé×^ÞvPRsí‘Ô²â4 éééUÚæÏŸ¯éÓ§K’œNçý’ÖªüÝ×Ëããݬ´oVj;q»òK§¸_ÓûÉÚTC›¯cÎ 3½à7±[Çæ&Fzõ‡yí9¾Êl¥òåH‚%ÅW´[ÿºM•㎩ÜÖVÒñÀ[’šVl…{}Ê.©EÅ^”WÝ‘j"©rà}¬§$Ért–fÐ ç:»Ú%Ýò>/ÐØ±¦7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `z¡7 `Øü]¼Yv‡¿KÎYqßów 8Ç1Ó0½ƒÐ0½ƒÐ0½ƒÐ0½Ãæï€Ê\nCv«Y+cå•Ê.´¨ Tr¹¥Ž1n9‚ÊûrŠ }±=HE.©¤ÌÇ”.O,UÇX$é`ŽEïo RI™!I ²Jû”ªSœ[’”UhѲmv™¦)»Õ3ÈÔÅm\Šv–×nšRZ¾!»ÕPx°G6ëÙ_Om~7@ "ôÀ9#³Ð¢/wØô‹ž¥§t|~‰¡ô‹² ”êÒÌ­¨ÐòÐzo–Eï~,³RFœÕÚ¥Ë:–I’Òó íÎ<¾‚a”w¼Ar{ŽïºÜR©ûxV¡¡ýÙÞ )D8L]ÒÎ%IÚ‘fÕ'ÉA}¡A¦Fvu©mTyhî1¥C¹…™jbÊbè¤>úÁ®Ë;•)Úé9ùÁ@#Eè `ºÝðwEG8ôÅ܉²Ûއ²÷ÌýRλîŸÒÿ´Çœú—ÏÕ®E„îùõ%µYª—¢RéÃMAÊ-6Tê6TiFs^‰¡ô|‹š…Ÿ©}8ÏÐ[ß…¨ò¼çb—4ô¼ò@8<ÄT³ðòÖ¡A…I´tWÛ!Ö£›ú«Ìc(Äf*ÈjVŒ-IÍ›xtûàâŠ}SRå\º}Œ[¿¹¤Xù%†ÊÜ’ËcTÚ’îQÛh² å•HE.C%Ç?Ÿ|À¦/¶Û%IV‹ãôhD—bÂ|Ú¥ni_¶Ul²hÒE% ªß õ~ªCè € ‹]zþí úã}ü]Ê))sKnVvQy¬¼?Û¢Ö‘n-ݤ=Y––·wŠskt·òYàÎ ©ES,†©¦S‘¡¦º4;:7u˜šxQIÕ“UR¾É©…Ǿ&b7u”ŸÛ—¦S¿èqüü¥îò%RŽiéQ›(·2 ,*(5t8Ï¢ŒKEè½ãˆU_ï´+ÒáQ\¸GVkù,¹Å†>ؤëz—È^ K¦H ï~jBè €˜Ò_|v…®ØQZGù.Ô…%Ë7*99YS§N­Ò㇊jß‘ewø»àœ7ü9—P+ÒÓÓ«´ÍŸ?_Ó§O—$9Îû%­•䮿åññnVÚ7+µ¸]ù¥Sܯéýdmª¡­Ö…åMƒÐ0XÓ )LÎPÚÂí*Ë)õw)52 )ìÂxÅ\ßI–«¿Ëi”JT¦OÌdý`î¯ý5$jY¸‚5ÆÒ]ïïRÐÀz40ioï8çoI2M)oÃalÉTÓË[)bp+ÂïzR¢2­7Sõ¹KE:÷ïIÊS‰›Éú£Aè³Cè €:å)t)ó“]Ê^µð»Ž5ݨm„Þ LìõÄò&'"ü®;v‡+XWÝü]¡7@Ú-Zm»ÔßeÔÈSâVÎWû•½|¯<….ï¾cá÷{1°…"®h-k(1Õ™(•[ßš©Zkî¬6ì–Mm4PbØë¹B þñÓµÎlUä°ÖŠزúð»¤LY_ìQÎW¿Oa7P=~Š Î~×.Ânàäøé€:Gø}v»SÇO ÔÂïÓCØ œ¾ÆùÓ~Eø]3ÂnàÌ5ŽŸ8'~{#ìÎ^`þt@ƒÒØÃoÂn öÆO„Æ~vµ¯aþ4@µºÝðwEG8ôÅ܉²Û,í÷ÌýRλîŸÒÿ´Çœú—ÏÕ®E„îùõ%µYjµ=ü>—Âî@¸_€Ê,'? Ma±KÏ¿½Áßeœµcáw›?÷SÔØö²„V …ß{\§ÌvÊ]Xæ‡JOM©ÜZkþ¬g<+µÜÜæ3ð–MŒši ÑFçz™Ý(÷ 1Ó =0¥¿þøì ]=°£:µŽòy̆­õмµÊÊ+’!CWõï Y¿ê'»Í¢VíГ ’d±êݹ™J]îŠÏmJ9¢_Y£´ìBÙ¬VMÑU¿ß«N¯§¡Ïü>—fvûh÷ ·sã¿zÔª6Í#4íº‹4ã™ZY C“Ft•$EG8tݰÎzoÕŽZ 1‹]UÞK¦$ÓRMÜ^ »©æqÜ’2k­ª3sÞÑ×Éä}Èð¸d˜¥ræýO![j·¸£úýTFè  lV‹ž™1L×Þý¾®ç·Ð‘¬B­Þ¸G’”´y¿’N“$]Ú£¥ŠKËôá—;$I®2·ž¿VË×ïªåª‰­ª0¬õrš†y¿Ç1Ó À9‚múÛíCtý½V´…‡éߣæ­Ñ“ ’dÈЄ¡5qdWY C»cˆfÎY!)õíÖ\× ê$ÇT˜#Ho=6V¾²FOü#Ien.ë• K.hY«5›2|¶¯Y³FÿøÇ?´eË•––*66V—]v™¦M›¦ˆˆˆZ­áÎ;ïTëÖ­uûí·WéKOO׳Ï>«õë×Ëå*fÏž=5kÖ,µhÑB’´|ùrõêÕK111'=×믿®yóæiøðázôÑG«ìKÕ'µ­!Þ/@euõ_ʉãú:ác»¦6_ïÆ)î{Y|l[+m[*íW~÷õPPPð˜$…þ~ǒ啜œ¬©S§Vé;•p±!8²ì—àwi-«þù¾÷Þ{zòÉ'5cÆ 6LÑÑÑJMMÕœ9s´ÿ~-Z´Hv{5½<5…ÞS¦LQ||¼î»ï>9NåççëñÇWJJŠÞ}÷]IÒ¸qãôÄO¨sçÎ'=×øñã5iÒ$?Þçþ1±ûçו5lqßów µ"==½JÛüùó5}útI’Óé¼_ÒZ•?Õ×Ëããݬ´oVj;q»òK§¸_ÓûÉÚTC›¯cÎ 3½pÎ+))ÑìÙ³5}útMš4©¢½C‡š3gŽ222*ïM›6é©§žRNNŽ$iذaš6mšl6[}Ÿ~ú©^xáY,uïÞ½b·/)))š0a‚œÎò‡m†……éÁTnn®¤òÀ<%%E3fÌÐo~óõíÛWW]u•¾ýö[…††J’n¿ývþùÚ¶m›víÚ¥—^zI?þø£²²²¼ö|ðÁÚÿBFè €sÞ?þ¨¼¼<=ºJŸÝnW³fÍ$Iùùùúýï¯x@#GŽT^^ž&Ož¬ØØX;¶Ú¾‘#Gêþûï×+¯¼¢>}úhË–-𒤮]»ª{÷îÕ–wçwꢋ.Ò§Ÿ~ª… *''G—^z©n»í6wÞyµö5œèêï﮳±ý-Êž¯i Ÿëâ&?ù»4p<  Úº-°obbbär¹”‘‘QÑ6qâD½÷Þ{zï½÷¯ââbedd(22Ò병‘‘ÊÈȨ±/;;»Êƒ0›6mZcMƒÖSO=¥+Vèƒ>P\\œnºé&eggŸåÕ6N™®0ÍÝ;Òße zàœ×µkWEGGW<$R’BCC£˜˜Y­VIåáxVV–×g333_DDDÅ:ßÇøzР$eddhÉ’%^m š5k– •ššZå3Çê3ÍãÏìËÏÏ?ÉU8„Þ Li—Î2ƒƒý]F½²Z­ºï¾û4þ|½úê«:tè<RSSõä“OêçŸVûöíÕ§O•••iéÒ¥’¤ììl-^¼X#FŒ¨±¯wïÞJOOWRR’$iÆ Ú¶m[µõ<ú裚;w®òòò$Izíµ×¡ÄÄDIåk Òcbbd³Ù”’’"IJMMUrrrÝ|Y T”=_·%|îï2XÓ qÇÆªhP¬¿Ë¨wÇWTT”^ýu-X°@Š‹‹Sÿþýõþûï«U«V’¤¹sçê©§žÒ /¼ Iºúê«5nÜ8Y,–û~øa=ôÐCòx<êÝ»·FŽ)ÇS¥Žèèh½ùæ›z饗4jÔ(¹\.9õêÕKo¼ñ†œN§$iôèÑúÃþ o¼QwÜq‡þô§?éÞ{ïUóæÍ• ¡C‡ÊívŸÖw°¸ç“gó‚QOãú:ác»¦6_ïÆ)î{Y|l[+m[*íW~÷õPPPð˜$…™>.Ô…%Ë7*99YS§N­Ò㇊jß‘ewø»¿KkYõÏRìþùþ.Áïâ†?çïj…¯åsæÏŸ¯éÓ§K’œNçý’ÖJrWóòøx7+훕ÚNÜ®üÒ)î×ô~²6ÕÐæë˜³Âò&€€Aè „Þ8絿âAƒÇwœBoœƒª>@²Ñ3Oï¡—@cEè €sŽÅ]ìïÎ9O‰¿KBoœsBóþ'‹»@†ÇåïRüÎð¸dq(4ïþ.hlþ.8QHÁ…l©¶ßGAö ÛÈbø^öÃ4­*-‹RqiœLYëªÔ¹J­Ú´>A¾j£’"ßQ\P[ôÝ«‹îV°£¬ž+3½L·þ®A·þ[®2ïu±ï™û¥{íë3sê_>×ÿHªòΊ!‚íi Ý*GÐAŸ·iZUâŠUnag•6÷[à-Iö ·.˜ª)w®Uÿá?û µKK­ÚðU[½>{€¾^Ö¡Úp¼®òý‚ƉÐ »ôüÛü]F­iha÷‰Îõð;Ðî4n,o€˜Ò_|v…®ØQZGù¡Þ–= ”û½R›æšvÝEšñÌ -ž3AÃðêÏ-(Õ,ÖS¬±ƒ:)'¿D£g¼£¸(§®”¨ÛŸ^®…Uÿ­´)åˆFÏxG絉R~Q©&Ýÿ‘îûMMúÿöî<Ȳ³¾þ÷vÏLÏ¢™ÍH-H }$,lÈ@ˆ ¸ ”—µ€@6ð¦°à U²cˆ“àØ)bã,€mCR¿VR$ŽlÇ ½l’‘2’% ÐhÍ"ÍÒÓ}ïûÇè¶îœ9wßï|>U]÷œç<çܧï¹Å·ú«.É£{æUïûRžuÆb®zá¹[ÿ¬…ÝE“~Oû÷io0ƒjµä½oxn>’Où¯;þ[îͺ5s¹úï^˜$YôØlߺᘱí‹òðc²{ß¡lݼþ˜cÛÎ}h÷<¶ÿp~êmŸY=vd¹šÏÚÞ×Zg½²»I¨üž¦ï ´"ô˜a?yáÓòæ«.Í?þç9÷¬“WÇOÛ¶)î9xÌÜGöÌÓ·oÊÉ›²gÿ¡cŽ=¸û‰\xö¶<}û¦œ¶mc¾óùw d}'zØ]4îð{Ò¿/Ð íMfÜ/ÿ£æÎ{ËŸ뇫c?sùY9²RÍ—ÿòÎ$ÉcûåÿýÚíyÍ‹/Èó/=#=v ÿû»÷$Inüþ}¹õoN’\qù™9´´œÿöGÛSY^ɯ}êëùÓ›~ÐÕšN´6&ÝgÛ“Iü¾@7Tz̸ kòÑ_º2oú•ÿ¶:¶yãºü§ñš|è“™ßüÜ©¤’׿ìâ¼ù•—d®RÉGßwe>ðo¿–j-ù;Ï>=ÿï^˜jµ–“6¬ËþÈÕùð'þ2¿ñÙ³¼RÍKžóŒ¼ð²3;Z‹Êîò{’¾/ЋJû)¹nÙûTJ¶[•½V:ܯÿÌ•lÏ7lÏ5ì7¾–ý¼è‰'žøH’¬¯ì.ùõ€aøÊŸ~7·ÞzkÞýîwwì”SNÊï¡ëß7î% œ°{0Ž,Í7 ¿ëÖ­[JÏïIñ´Wüθ—0<òÈqcŸúÔ§rÍ5×$I6mÚô«I¾žd¥ÉOµäµÖ°_k+n7þ¤ÃýV¯íÆÒb¬lN_Tz04ÂîÁwÏo˜BoNØ=\ÂohNè 0eÖÎïËÆ…§R™Î³Z›ÏÒ‘Ssxù”Ôjsã^ÎT«‡ß—=ÿǹùÆgä»7œÝ4üþö_=s<‹ìÐI›çÊ«oϳ.:¾ítÿU¦ÌÆ…û¦2ð®ÖæshééÙpGyšÀ{€Ö-,çù/ýAÞùÿ|#/|ÙÝSYÑýøþ…üù—/÷2˜*½*•Ý£S¿ò…÷6­ü†Yçß2SæÀá3S«MG¹täd•ÝcÐXù}ñåd®R÷’Ú:ióá\ùšÛǽ fÀtüÛ€UGV¶dïKƽ ¦Àº…å\õúÛrÕëo÷R`düy €™!ô`f½˜Bof†Ð€™!ô`f½˜Bof†Ð€™!ô`f½˜Bof†Ð€™!ô`f½˜Bof†Ð€™!ô`f½˜Bof†Ð€™!ô`f¬÷8ÖÓ^ñ;ã^ÀÔRé ÀÌz03„ÞÌ ¡73Cè ÀÌz03„ÞÌ ¡73Cè ÀÌz03„ÞÌ ¡73Cè %~é#ÿ!wüåÚõï}èPþá/¼?o}ë›sãWþ0ïYÎÏ}à—óÖ·¾%×ÿ—?´÷…Y·fÜ €n|ó¯ïΗ¾øùüàö[³²t0§?íä¼ã¯É ®zÀßiO*•uÇþñõ7募ÿD<öP¶-nÊ[^ó²¼òMïI’|ý»7çEŸ—lÜÜöê¿ÿ_¿’ý—ä]o»:©Ý—ßþâÿγÏß‘÷ì_%µ{ü»À‰Cè ÀÔøßø›|úw?”÷¼÷ƒù™_ûp6¬YɃ÷ÞÅʾ‘¼ÿ?^ÊúìÇóÏý·òÏzzö=|_ªûÔ+ÕäS_øÃ¼èŸ^ÓQèýÀýwäM¯xF’¹¤òŒÜsÿWóúKç’T’Ê9ÃýE`† ½˜ KËÉ¿û½æÚò yñO_¤šZÖdñì ³>O¬Î»íîGòoç7sàá]Ù¸¼ïçÞžŸxÑ+Û»á–åß}ü׳îÈÁ\ø¬§'ÕMÇ­áÌ™§mÏOœ³)I%ëO=+ëNÝ–Ô’þÞåÁ;ó ×þZ·­Í?û•Oæêw½<ÿã?ÿ÷dÍÑŠñ÷ÿÆ'óî+ÎÌŸß³’ßòü›»ÿ:§ù¦\úœŸÍ]7þ¯|òÛËùÒW¾žßþØï¯žtGè ÀTø??ZΖjòâ眗d1IRI²>Ir4 >x8ù•ürÞÿ¯ÉKŸwiÙõ7ù'×~(ÿñìg%§]ÔôØÊ©å×ëùö׿ÅϹ8»î¼%ï¼æWS{ÅYǬá‚óSÝ¿7öG_Ê•ÿ-Y·°1ÉÆ¤’¼åçÞ|óæŸýæ¿Î©Û—R{<9©²˜¤ºz~­²7ss›ò†·ýƒB?úè£9ù䓳¥Å±M'mÎÁ}{“'CéZ-yüÀ¡Òu¬O²-Éú'ç¥ïx_n½}Wräðqóæ*LJܼ÷èˆÐ€©ð´uÉ•o~}®ùÍßÈß»1©®¤ZKöìÙ»:ç§/<9+‡×æGÿß×’$?¼ÿPn¿á/òŠ+žŸç¶8vù…§fßîÃyôÖ›’$ÿçOäž[o=n ?zàÑ5/xÑeÉÜ\ž>Ÿ¼åŸ~8ÿñw~7÷þîç²°°>?÷óo͆sž“ui~ì¬$oúÀ5¹öc¿—ƒK¿›sžq^~抟>n w>x ŸýØ¿Ìî‡̺µ¹hÇsók×¾#™[{t}¯{]þï_ÿDN=å÷óñÿ—ü_ïúGùÇù79iq[NÚ¼=ÏÞå#þÔàÄ3¬?,¯[ö>•’íVce¯•÷ë?s%Ûó Ûs û¯e?/zâ‰'>’$ë+»K~=`¾ò§ßÍ­·Þšw¿ûÝÇ;å”Sư"Fmw޶6ÙzƒÃIËÑGIVòx’#INN’<‘ä`’£ßVÇvçh°¾%µ${²/'gKîIröê{?œ£½À7¤–JªIö=yÖæ$ɃI“¬Ï®$§çáT²%µ,$Iög_¶¬^óî$çæ¾$g&É“û?JrÎ >&&Ü#õ©\sÍ5I’M›6ýj’¯'YiòS-y­5ìׯŠÛ?ép¿Õk»±´x£{•ÞL•mÇ,$yúêÞIÇÛôäOûcO]·’äälIÒx'É©ÇÌ™O=>¯;mu댆ùõÍ-Ç\óÜ$õÀû©}7ôKOof†Ð€™!ô`f½˜Bof†Ð€™!ô`f½˜Bof†Ð€™±fÜ €I´sçÎìܹ3I²cÇŽìØ±cÌ+:¡ÒJìܹ3×]w]®»îºÕð˜|Bof†Ð€™!ô`f½˜kƽ§;w–>¨²q¬þPË¢;vdÇŽC]С7'´fvqNY0þÚ×¾Vè F{f†JoNh;vìÈk_ûÚãÆ«»›µ1Qå “Gè À ­Y }Ýu×z—ãÀäÑÞ€™!ô`f½˜Bïæjã^@òË&<ÈJ4>¼²ìA—Àdz@‰;v»a ioÀÌz03f1ôVwá€q‘{vhCoNPBofÆ´‡Þµô_~ßÍùµ&ÛƒÔk9ˆ¼tª³Ïi½`Õšq/àIµ$•†×q½?0Åyä‘q/`œÆU¡]+¼Ž•Jof†Ðû)e…èt `ä–]z03¦)ôîä/ƒx2é ¯ 0(ÃÈ0G‘½ŽÌ4…ÞÐÒ¨Bï~þ 0ˆ¿ ts©ù‹pÂuö9­i¬ôîöƒéåƒ,žÓn`І‘SŽ"_«5ã^ÀˆÕšl·›ÛÉ|€aé&¯¬•üœ0¦±Ò»„ÜZŸ“lf7ÁSm–*½kI*#zŸÆW`B>|8wÝuWöîÝ›ZÍÿu•J¥’ÅÅÅœþùYXX8î¸û2îËäiwO FCÎÌ—`’Cïv!v¿Çû13_˜%wÝuW¶oßžŸú©ŸÊÜܬÿî“£Z­æ‡?üaîºë®\zé¥Çw_ÆÃ}™<íîI‰aæÝ¶îöøØLrè Е½{÷æòË/Ï¡C‡Æ½”ÎYg•»ï¾»ô˜û2>îËäiuO Â9ª]Ów` Ôjµ¬¬¬Œ{'¤•••¦-2Ü—ñq_&O«{Ò!Yf*½5ˆ‡]tí¶ÛnËò«–0T1IDAT¼ç=oÜK9aíß¿?_úÒ—rÿý÷ç5¯yM.½ôÒÌÏÏ'9ß~ûí¹îºë²uëÖ¼ýíoÏæÍ›Ç¼âÙö‘|$6lÈÚµksøðá$Y탽´´”$Y·n]’äÈ‘#©V«YXXÈ¡C‡R­Vsíµ×ŽgáÃ%¿ìÀ8Cïa÷ÜîõÚ¾8ÀÈÝ|óÍyðÁ…ÞcððÃç¯þê¯rÇwäâ‹/Îe—]–{ï½7_ýêWsÖYg夓NÊßþíßæœsÎÉK_úÒìÞ½;ŸøÄ'rúé§ç%/yIÎ>ûìqÿ 3inn./xÁ rúé§çž{îI’ÕϺ¸ß}÷eii)ÏzÖ³rÇwä–[nÏ¢‡k¹å8{†Í,Tz×?¼A赆ŸNÆ:öðÇÝ{ï½YZZ*=ö¶·½mµ¢•Áûìg?›ç<ç9ùЇ>”;î¸#µZ-/|á sõÕWçºë®K­VË?øÁ¬Y³&wÞyg¶oßž×½îuù³?û³|ñ‹_Ì?øÁqÿ 3iaa!ÏxÆ3òÌg>3Õj5Irþùç'Éqûóóó9xð`Î?ÿüìÝ»7;wîÏ¢oÔ9åLdŸ³zwª×›¥ò¨ååå,--åôÓO_{ðÁ³²²’ÅÅÅÕ±G}4ËËË©T†õË“m‘qÞyçeyyy5L]^^N’\rÉ%I޶79xð`jµZªÕj–––rÎ9çäÛßþöØÖ=ëjµÚêç]ï]¿?ÅýjµºúÓg¿ìI2è\rf>˜vf1ôî´µI­áõ„¹áÀøwÞy©T*yå+_¹:ö¹Ï}.<ð@Þüæ7¯ŽýÉŸüI’díÚµ#_㉦ÕÃ믟ùÌgrñÅgûöíIž \a‚ÔÒ}øÌe£sã^ÀˆînoäÌÝx`<<˜õë×gqq1=ôPŽ9’#Gެ¯ïïÛ·/ëׯϖ-[²gÏž1®˜$¹þúësçw榛nv3N½äšyè ‘sN[èÝËMéö/­æ« úrÇwä’K.É¥—^Ú²ïðÎ;sÉ%—äÙÏ~vn¿ýö®¢]»vå›ßüf–––räÈ‘ÕÖ'0"í2Éníaf¬aÚBïºaÈ~‘ºòÈ#dûöíÙ¸qcžx≦ó}ôÑlÛ¶-7nÌþýûG¸BvíÚ•OúÓyâ‰'²´´”o¼1=öXsÅWdaaaÜKäÄ1îÝ©ÌA‡ÕÓ»Ó¾Úeç”ÛìzÅñvûÝjÕe*o80>‡ÎúõëWûDoݺ5{öìÉÖ­[™wðàÁlذauÞââböíÛ—-[¶Œ|Í'šåååÜpà y衇²{÷î$G2ºfÍš<ÿùÏÏ3ŸùÌ–¬€j–I"ì.žßn¿ÝšZÓÍ:bdY×oà]v=`ÂÕjµ¦%·Ïþ󙟟Ï~ô£$ÉÊÊJn¾ùæ¼ãïX]sµZ;ð…¬Y³æ¸yïz׻ƶö~Mò}IžZßüü|®¾úêÜtÓMÙ¹sgææŽ6J¸è¢‹òêW¿:wÝu×1óëÛÓjZîKñ³n÷ZÜžƒþ…fôÐ{Áu¥a»þÚé_Gõ—`H&9ÄÛ°aC–——é ½qãÆã‚º77oÓ¦Mû{ub’ïKrl¸ºfÍšüüÏÿ|¾úÕ¯æßøFæççóÆ7¾ñ˜û1+áê4Ý—ú~Ùkq~Ù±)ÕkvY<ç„ Ì'=ôîTýCn7¶Oi6·ì‹1Ñ78Ö$‡xoûÛS©IÔjµ,--õ4ošLò}) V—––ò³?û³Ù¶m[’dóæÍÇÌ›•pu’ïK]«?04ÞƒYº/mt“a6k÷ÌL:ÊÐ{ÐUÛݼנz{Ç€ 3É!ÞáÇÛΩÕjÍ›6“|_êŠáêÒÒR“m;SŸ¥puÒïKq}„ÞÍæN¡²˜±~øã½{ÑØ¦¤Y‹’nCn­L`FLzˆ·²²’O~ò“YYYÉ<#GŽ$I*•JjµZ>ó™Ï$IæççsÆgd~~>ïyÏ{2???Îe÷mÒïËÃ?œn¸!÷Þ{o6nܘ[o½5—]vY¶nÝš•••|ík_Ë÷¿ÿý¬[·.?þxî¾ûî\xá…ÿ{µ3Éë_ZZÊ®]»²¼¼œ]»v%ÉjÛŸâ~ýŸ¥µk׿ÁÌáÇ'ö÷’~òÍV­QZŸXÓz÷r—µ9IŽíí]6§ÙO5É\kXuá…&IÎ<óÌ,--eóæÍÙ³gOŽ9’ÓN;-ûöíËÚµk³eË–1¯ôİnݺ|ë[ßÊUW]•w¾óI’ƒæ{ßû^®¿þú$É•W^™k®¹& ©T*Ù¹sg®¿þú,,,Œsé3­Z­æë_ÿzÖ®]»úÇ¡µk×&Ié~­VËÍ7ߜǯ¶£™!Õ´Î-Ç»mÝÜ.Ÿx“z·«âîôüa]¿~ Uá0¡&¹r5IæææòªW½*ÉSUªµZ-•J%•J%Õjõ˜ñähÅë$ÿN˜äûòÞ÷¾7ÉÑàôàÁƒIŽÞ›ç=ïy¹âŠ+V-//¯?÷Üsó‹¿ø‹I’C‡aÕƒ1É÷åÃþp_ç×ïÕDÙÍC,‡yý‘š´Ð»L§u»‡Wvra6L±bX<©fñA•õоٱdrïKY8Z«ÕR­VW+Š‹–——³¼¼<ì¥õmšïËƽ„¡huOzÔi¦Ù®Ú»Ó/Âd~aLCè=T€7ÎiõŸ LüM€ÕÖ­[óÀäôÓOt¨D µZ-÷ßÓ‡oº/ãá¾Lžv÷¤Ùim~ŠóÚ]kæÍjè] °‹ÿÔûÙtZI^¶ Lˆ .¸ wÞyg¾õ­oMlõê,ªT*Ùºuk.¸à‚ÒãîËx¸/“§Ý=)ÑK&Yìç=ˆkN•a†ÞýôÍîôÚ½ôènuN'ÍßU|À„Z»vm.¹ä’q/ƒ÷e2¹/¯—‡V¥É±VïÙë¹ÝÚµç†uá!é¤<¿Õ_*Z_ÍñçÇÆ©,·¬µ:§Ùþ̵EuèÝ®œ¾“ñA½w±ÅI«÷-Ϊ› L¥bÙI»’fs‡·¶iž:‰•ÞƒúP:©ønö^4…oõ—`ˆæææR­ú¿æÀì¨V«™›;&®-«æî´ s'Áw¿™k?תI ½;Õi™Nþ¢ÑÉ_LêãZžÀ˜y晹å–[ßÀL¨V«¹å–[ræ™gµË#;éPÑiÅ÷(ûyÕ0d9,íZY¿esŠç6~š=Ô²úä±jŽ?ƒW¿úÕùò—¿œï|ç;‚o`êÍÍÍåŒ3ÎÈ+^ñŠÆáfϬ¿vRÜ[v­²ù­L]:¡w7Cî²À»Y0Þîf󿦇jÛúX"З¿üåI’׿þõc^ Àе{8e«sЭM¦Æ¤´7éäÆ òF´ú+HÙXã_Qª dž¡ž?Ö3ÉVUÞ¶6ÄzZ]w"2ÓaWz—US·kOÒéœÆye¯Iy•wq»¬½I»8Õ$µM›6}àÉóæ~*…±J‹Ÿ4Ù/®'%cͶ;ÙïÅ ®ýD¨Ú®õG³p·“F–=;°ÙOc˜Ý¸_ë¶Iq¼Õv³>Þ~ÎÌùÃ/Gd¶ o›•…¿eÛ­^˶çJ¶çJ¶ÇæŸÜ.¾¶Ú.»N¥d»ÕZËÂðf¿«í²óÚõ2†iÐ!k»p¸Y ^l·ËÂëb¸Ýø³Òf»ñµì:Å ½±cEãv³u·zm¶ÝIïð‘‡Þ³ÞÓ»Q»þÞÅ›]pe%ÇßÄjÃxñ¯3u•†±Zž ¿WòTð]_GãOãÚŠ!v«Ð¿¸&ãBo¦Õ Bïnðf•ÑesZUt'ÇWq7«î.;·ì½šÓîwšy“z—ÑŸ8§l^ãkÚ\£qNãõ¯Q Á«9ZW çVRz7V–×÷ƒïvmNÒd¼U”²ñnªë»! `Ðz h{©:n€7 ¶Ëæ5+¬MŽïÉ]¬Ì.ÛovN³jí4kµÞV¿kñše×h6g¬&)ôîVYÞÏùõ0»UoïÆ »øÅ­·+i›kx­‡æõ¹+ ç”Ux7n—ý®Ý¶7éµÂ»¡7ƒ6ˆµÛл›`·]x\m²ß,ØnUõ]KŽÏ+×U-ëÇÄ„ØÝšæÐ»L»êðÆÕ8V€'O…Øõ/Mq¿,ü®Ÿ×¸_¯ðn\O«v&­*»ËÆYíÝÉu`\: c‡QåÝìX³±bp4ï½Ý,ìn·_t×Ûiå÷ÌWèÝm•v³»Ýõ:=¯øW—Æ€ºÙ–0ß°]¦|7Þõ(¡vña–­‚ð¢vsFUí “¤—л›6­‚2»v—U}7OanÙûçt²öfÇû9¯™±„飽» ¸»9·—kƒî²>àÅêïÆ0¼ØË»¬ª»þSìç]|heqöîî¦Â»›¾ÝÝ~–s†ek«À»ÓŠï²±fatYµw±b»Y?ï²0¼ñ¼4y²õ´úýZiwN?aöЃðIko2ˆ€¼ì5MŽß³ñxc÷\a»Xá]<Þø—œÆ÷k¬ênÜ®¿¶joRœ[+n 3ü€qé5ìn5·] fárqnYÕv±Ò»Uà]V!^<ÖÍÚ›äÅóº5–Šîf&-ôn¥YP=¨k–µ5iŒCñäøv&õ×¹}hå\Ãušµ0)á)™Ón¬Óýfc0 Úµêh·ßI¥wãvµdNY•w}n³¼¬¿w³õ5î»Q B'ñgœ¡w§Áu»yeÇÛU{§d¿¾ÝøÀÊf•ÞÕÂ9õŸÆv&õ°»¸–âO}n}ÝIy¨Ýl¼ß໓cƒ<:1è¶½ÞÛÍæ—Uw×÷›ý4 ¿Ë*¼[Uz§°]VyÞI•wÙïÕL§÷el!ù$Vz÷SÅÝ˹eÝÅð¹„Ï娛V¬ø®‡ÝUÞe=»ËúzwóZԮՉЀi1ìл8ÖìÜví@šµi@ïÆíb…wY%xãºZUžw£Ÿ€zâ*ÀGz÷d7»N³íâÜfÕÞÍz{—…ÙÅÀ»±Ò»’ãûx7¶:©4ŒÕÏ©_³Û»ß'd0mô¶«îî%ü.¶¿Rò³R2'M^ËÆŠëzÀøBïâX'Ás±º»q~§à­æ·[w» »c·›G¨ÙÍC[Íí´u§UÔs…ãÍúpÏ5¼v:·ñ½ËÆÚ­¹“ãeûÍÆ:9ÖŽ@€aë'Xí¶­G'•ÑíåNÃîúX}¿Yk’jsËæµ[W«ífó›Ím5>Ò€|RBïnÆ;iõÑmÞ¬íH'av'ÇÊÞ«l»Ÿß©¸Ýj¬“c0Íú ½{ÝnVõÝ®åI³jîfÇŠãeÇ{ º» ˺Ši ½Çz­ö.޵ ¡;©o7·l ç•Ûév3¶:éæš0ÉÚ…«†·Íæ´Û®ÆZÏíª´;­è.{¯NªÐ[m7›ßln¯ãC1 ¡wÙ±NûZ+ø.«âîä¼²u”ä­Ößé~³±NŽurƭۻݱv¡x«8)£›×I¥vY€=ÊÀ»Ý±"¡wÇYíÝìܲŠí”Œµ «Û]£Õû6û}Š×h6g”­MâŒJ?i¿¡wq¬]¨[ ª‹ÇŠ×hÖƒ»Yx^ou^Ûš4;·ÙÜvãíŽ Ü¸ÂËqW{7n7 ¾[õãnU-Þ,ànuÝN×–ûÝŒõ2¦A·-Kºë%Tî¤Ïv³ªîVÇšUxw³¶âv7ÇŠ&¢Ê;™îл8ÖmÞIË‘¤y…w»cíBðvc­¶;Ùo7Þ혽†ÞeãÂÎÝT„ûƒwz¬›ð»Õ±nª¼[;aBïVï=î໾Ý*À.»F« îAUt÷Ò⤓cýÌ€qê&Tí§ÝI·Áq«s»­o<Þɵ:YG»5MEà$óãxÓ'õÐvz·:Ök5u­Íüâ´›–,eZÍéæ #ð`– "øî¦Ê»¸ßKxµd¬Ù¹e½¼; ¼[T =–`»•I¬ôîåX?ÕÞí¶Û륊»ßõb¬¡7Ó¦ßл—±nCð^ªÁ»­ït»›yÍÆú=64ã8Uí]Fõw7cý^·Óýfc­Æ»3ˆs ½„§ƒìí]6Öo‹“ÆínƒñQÞ½Œ·;6Tã0GQíÝnu'çusíNö›µïuL›NC×aß½Ül2ðn7·ÙX¿Ç†jBÏY¾{™×OàÝîX7s`šõÛÛº›à»×jj÷€óA–uƒ ½‹ãƒ¾›½× Ãïâ~?_ a65ìjï~BåA„Ý^§ÛµMµI½“É ¾[fà]¶_¤­ tfÐÁw?ûýß½^«Û¹íÆû96Óz7;Þm¨ÜoH>È€»“|ì_˜ý„Þã ‡QQ^¶_fªóÇIªø¤à»Ý~¯½¸õ°Ê^+Á;9fM?•ɆრÂh÷€÷òytzîHLZ:Ì6'£Üf¸ÝOà=Ès`õ¼+ø.ë%ìÅ~»ñ~ŽÔ¤´7©Fó è~zp«š»“÷Ö90É|÷ú ËfcìÞîõœVãíŽM”I ½“ñ߃šÓíÚ»} ¥¶%Ð^¯í ‚ï²ñvF¸ÝéœVãíŽur|¤f-ônu|TÁw'cÝTv*èŠp¢ë&œFå÷ Z¢ rN«ñ©4‰¡w2¼à»xlнµ{mS2ìÞÝo8jPÁw³ã½>,r˜cì➸À|RCïd¼ßÍÆ‡=6ˆªîAÜs&Í ƒÖN¯×Mx<®°»Õx·ó¦.ðN¦;ôîdN¿˜l6>ˆö$eã;$o8Ö$ßýöûîöÚ½ôïôŸX“jNrð=Šñ^ÏigÒï; J?áí ú8êñaÞŠOr¥wÝ z[w*ObÈ=Œ9p"T¸;i!x?w'&6ðN¦'ÔCQõÝêX¯aö ZÙËüa]†in?UÒƒ ÇËŽ "ìžú¶'ÓlŽ¢º›ªïaëäx·óº5Mß Nlà aGòX¿÷T·4i4máæ¨Z 2üÄñNç ó|˜vý†¶ƒ†’ª?÷TÞÉtôôn4è èA‡ßƒ8ÞéœAœ<¥—`w\Aø ÚLM˜Ý©i J÷T£MÉ0ïÙ´~`˜ám7×v[”AöÜž© ïºi«ô®uÅw«yƒ à{ …Õ0½†¼ƒ¬¬î¥²»[SfwjÚÃÒqUR÷Óß»Ûy½ÎïÖ´`ØAn·×D>èjì™o{2 Aç°Zƒ jî8Z—ÌÂ}€QT¸;¨àyö0çNœY G‡,#üîçœ^ÌÊ÷FØú¡—à ¥O˜À;™ÞžÞe†Ù7{ÐAy?!³€F«Ÿ xžìeþ¤\{df1@E;‘a磼'³xÿ m€;Ì>ÙÃ~°f?ï1‘f5ôUíQ…æ³zŸ`ÚŒª2{˜ÕåƒzŸ‰4Ëaꨃåqµ,™å{ã0ªÀyçörþÌÞÉì¦ã¨¨Ôg:¬{3ë÷Іî꺃¸ŽÀûI'J:ЇWû:£º.pÔ,†å3v×hÁé8Ãïa]oZÞÆiœaï ß[ØÝ‰‚Nbÿìñ>À,šÄêð&ðN„­ã|xå$¾ÐÚ¨äQ?ÔrfSŸ2I±”I[LŠI …Çñ0Ë™$-7K}¼€É1 ý½gš0¶3ÃþœÜ˜ á…ÜmÌ{0(*Œû3 Ÿß$¬fÉ$TSO¦’Jof†*ááòùeTr‰Jof†JäÉæþÀdR©=¡Tztâÿ½m>!j²PIEND®B`‚Minder-1.5.1/data/screenshots/screenshot-style-properties.png000066400000000000000000005226711356632107200244420ustar00rootroot00000000000000‰PNG  IHDR½± 4sBIT|dˆ IDATxœìÝwœ#w}ÿñ×̨m¯·{ýÎíªïl\ÎØØ¸@L%8!`J Á&ƒÉ› SB $` c\ƒÁÁ¶±±}.×ϾóõÛ½­ÚU™™ïïíîétÒ®´íj÷ÞO?Î+MÓW#­´zë3Ÿ‘ ²¦{2.=>"""""""""ÕÉL÷$?{º """"""""""UWžö±ˆˆˆˆˆˆˆˆˆdS•x)­,í_ÉGÁw…(”-_5ìÃjƒˆˆˆˆˆˆˆˆÈlP at5ŒaÆRXZžjØÕ0‘Ù¤BçjÃŒ¤À´8S±ŸôXˆˆˆˆˆˆˆˆˆÌlST+ Ÿ€=Ý@·ˆˆˆˆˆˆˆˆÈl œ¯ èAÈ/èý¢ý,"""""""""|¥¶*¿s(Œ="¨}Qmû´ÚÆ#""""""""2ݪ-(j<Õv¿¦Åñˆ–{ÿ§jÿˆˆˆˆˆˆˆHµ˜ª`¹ÜÛ9nðã5L-ç~WjŸ¯…ˆˆˆˆˆˆˆˆÈlQ© ¹œíwá÷ñ´Nöþ¹Ÿ¦sŸo·ˆˆˆˆˆˆˆˆÈ¨é ƒ¼íÉnë¸ ¿—t2÷³Ú{|/ˆˆˆˆˆˆˆˆÈt©ÆÊír·3ëÃïã!8-õ>±O˜‹ˆˆˆˆˆˆˆˆT‡Ù\—»Y|ÏæðsªÃîéZ6?†"""""""""ÓaºZˆLõú³2üž­éTÞSuBÌÙú8‰ˆˆˆˆˆˆˆˆÌ4¥ÅÓqÊã>øžaêT„É•ì>•Él|üEDDDDDDDD`jÃÜbok*{pOU8_ufSèYé°;ÈíOU…¸ˆˆˆˆˆˆˆˆˆ”¯’Û•§»ð{¶¨• ¼ƒÚv¥ƒör̖爈ˆˆˆˆˆˆÈT·AЕ §«à{6„• ¼§+ìâ1™ «ˆˆˆˆˆˆˆˆÈT"ä 2„®T@}Üß3=­DŸìr·Y©ÞÝ•~¬fúsADDDDDDDD¤Òam¥*¬ -W‰^á•ì?^frÐYÌØƒ»Ë º+y"Ë™ü8ŠˆˆˆˆˆˆˆˆT“JöÍ.f¹rð Ãï|ÏÔ°´Zï ÆQé“p–b¦>'DDDDDDDDäøUMÞA…Éù–Qð]„™pNeUõd‚îrç—º\¹ëˆˆˆˆˆˆˆˆˆÈôVxOf~¹Û,e¹|Ï´tª*«ƒ»ƒÂË}¬fÚc-""""""""´rÃÛ ârNbY©ð{Vß3)®À{²av¥CðÉ,;Û©„J„±A¶™lÈ]Ê<ßYfJ¸9w)ÕÝ“9¡åT…à“Y¾RÛ©¤ BØR·1Õ!w)ÓË©"r™i5‚Í鼃 »+‚³ÌLxlEDDDDDDDD¦S¥+¤+rç›~ÜßÕŒV:ð.¶º»Ò!x%Ãñ ×™i&ÐV[˜=ÞôRª¾g}ð]íág%OYNuw¥–-u“]®XÕþü‘ãWСk±Û "`.wåV}Wú„œÓªšCÍrïrÛ™LÅ´bÇR̼R–)E5?GDDDDDDDDäø4w'–,§J{²ÓÊiw2#ƒïj 4§*ð.§Ú:È<è¶'å,+""""""""2›•ÔÑÆ¤Òv1ã8®‚ïj C+xZ±LmP&šWβ"""""""""³ÑTÞ¹Ó‚ ¶ƒ®úžUÁw5¡Szx—vÛ“¼Ý‰¦;?¨uDDDDDDDDDªÙdBØÉ»ÅÐ~‰ë”z½˜i ½§A}º M¢r{¢ëö8ó‚î^ì¼ ×©fA‡ÞA÷èξî3o2×'»ÎxÓ'šWÌü)Smg9n%Âëb®ç« ¯DK”b¦O4/ÈuDDDDDDDDDªQ5Þ¥,“[‘]nøT¥x±ózçtà;=ÈÀ;·MÉxaw9c(4m¼éåÌ™&ÖxjçN¯-J9×+Ñê¤*‚ïj @ƒqƒ ¼s/3¯Øís½ÜiùTÓã.""""""""RIű“mU’oZ)asvØ]h¹‰æ5–‰¦—3oÊTKøYíwnØ=¯PÿîbÃòb®·íñ–+g‘Ù ˜ ¶Ø 7è ïB—ý<Ór×Wð]@5„Ÿ•ìã=ÙŠîÑëù*·-Ʊ‹i}2^ˆ^ÌØ Moúd—™©Ê©ò.4½Ô°9ßòŶ01Œ¿ÉT”³l¡iÅΟÖà»‚Ï «¼+xÛy¦å[v¢6(¥Üf¡1š6ÞôR—™ÉÊ©ò.µµI±}º U~OÔæ$_0>Á·Bïqu¢Æ ïñBëÜPº˜~Þãµ>ÉS¡ ñB× Moúd—™i*]åﺟgþD-L²§ç[>wÞD¡ùx—'ºTð=­¡wh:oœÉ…®åµ¥Þ¹Õݹ÷¹À«€S€X·[êø§:˜V.""""""""3ÍT‡¬¥Þ^¡¶&ÙÀàvàá‘eG³ºìËGóÜù&kz¾Ë“1™õ˽ͲLwÀ9ÕUÞåÞù*½ß²¤i髯ZqÕ uNÝ <θEDDDDDDDDD IǽøÞ[·ýtû¦îM·ÿÉø•Þ¹•â¥T|Ïêjïé ½'ÓË»šïs–4,ùÈÕ§¾ý¼^¿7:äásô‚ˆˆˆˆˆˆˆˆˆÈÄlljíZí¦äwžþöïvìüðÕ|W]oïÜ>ÒÕ ¨ ¾”“9æ ¼­<ÿ²§¿ê +ÿtáAï`tÐTà-"""""""""“æã3èÒåоaù›’i©œ/—ÌÍ+G:ï`!S™ÃN©j ½ )µÊ{¢å& ¼³çå>‘l`–·0mÒE ^DDDDDDDDDd"i“Æ8Þ2çÍ"óå”P\ð]N†Zh~U›®Ð{2½¼KÙ^1mM Í/ðΞK™tÌLï‰HEDDDDDDDDd1ÒÆ­jG&M”Sæõ–R<<^®ZŠ óÞ²„¦ãF'¡”oJíã=-_ï‚O(…Þ"""""""""¤¬VÊ6÷Å6#ËùYËZ#—­<ÓÆ»œ-ßôBËV•é¨ô®t•w)ËOômH¡žÞ3©-ŒˆˆˆˆˆˆˆˆˆÌLÙyd¡*o².—ÚÒ$Ÿ_í=ÂÛñª¼Kmk2Q° GöI¾ªïÑé3¦ˆˆˆˆˆˆˆˆˆÌX…ºSÀÄ9f±ùhîåBËZ¶êÌ„Ð;W9mM²§×Ô=û S¨Ò{&î;™²Ob™/§„£ïÜŸ¹Ý-ÈYf¼Ë…–Ÿª¥§÷TìЉªÃ }S’/ð¶ ÓT^=½EDDDDDDDD$HY™ãhégýÌ,räºuÔªÇöÝÎ×ß»\¥ôŸrSz—b—r’ÊìËãU{ç.—¯•I¾:ÇÕEDDDDDDDDD¦TvF™/§¯]söO L/µ«F¾ñ•2}ÊLe{“ [›”³l1'°Ì7/÷Iêé-"""""""ñ|oÜù¾eðmð cÄžÁñ ¶¶?:ql'¨¡V­pS„ÆÍÔ´Öކ1¾!9”"~`€=ý˜´?ñFdÊ„¬ÚŠnß5CÝ~eeŽÙíL Ƕ019Ëåγr–ËUJÛ‘Óâ¤ZNd™+¨oŠ­öξœ|g›G³2kx­s¶—µC»»pÏþ7ÐÞD/‰þ@¶Õk¢)ÖȶŠaÛ.ÆUÝW5žíâøÕúr$"""""25 Öù¶!±ñ#!ˆ„À:ºÉ®ïƒI¥!íMeðãS¢sí\:—- ‹`Ù–•ÙQƒñ}zõ±ï™=ôm=¬s´å‘t’Ì[=/³ß0ì{f7Z±ÛôÍÑOÖö-¼öºWç]¶k_·þóÏ+6–*•ÝÒÄ˺œnñ70ç à õûÎ7Ž Bó)3Ý)S±Áñd‚•¯÷M¡þݹíNfUà ж¸•›ÿíæ²¶ñÁw}ÞÃ}¨zõ÷òý¾GCS}Áež|r§¶vÜíô÷öóç/yë”…Þáp‚Ʀ8Ý]­TÓSØ`hê¦f ‘¨[3ÝéC2fcj"™ên|Œq19ñ’XQ+"éìDŠHÂ`UÑg¿JжÆXòâ“hÛŠí8ôDÚªí eÕ.‘ä mÉý´ÍuhšÓÄÎÖç9ðû=¯r9W“ù„Ð0ØÃÁl+›o|Ò^šh(jÏ_3OõÓ„ÃaŒ1¸®Ë×ÞH÷‡HºIÂNÛª\·dÏ1¬Z·"ï¼-Oo­ØíV¹ì\Ò'^™[á ܹ·D>™å*bºCïRQå]¨½I¡iùðÙWém|âñ8ž7þ¡T…8Žƒg‚ý*¹v~=¡úÂß&ºCi†vSq] פé˜ÛɦM›òÎ_±b6<Źçž7îvjjêpMºC<še¨«dé²Zúú€®Êßd©ÂÍ.õ'º l :XÜüa&"""""RˆoR1¿.‚g|ÌÈgn˲hj¨%bY0œHÒ?0„o àá;NC”¤":ìcMÐòd2 Ó¹¼'ZÚÑÞ^ÒãÀæÄ®à)TféeïD¸‰ƒ§1¯s'F="¶Åkqhöö¯Ä>¸¥‰,]{¾ëqðÑ}#W2šæwÝ‚m—û¾ÏUW¼Úáp@#ËH{iš—7sÆ…/â×ÿýéÞ4¾ãã8ñx€šš|Ç'á&7‡¹ô/åñßMËš¸öo¯eþüù$ λà<Î>çlvìØÁÏ~ö3úú2­k›››Yµjo|Ëq‡D"Áüùó¹öo¯åK7~‰mƒiuR(_šÉv™lŽôóÎ »³Orésl௢»PµwÕ×å˜ÎлÔßÚRZ›»\¾à{ôr¾þÞ£×g¥ò+½K-|ý¿¾<îí}á?þ±¤m~ðê`eÿJ¶Ö¶1äe/{®ëNj¡Pˆ/ô+´Ö¶•7˜jkYrbšËOÅ‰ØøÃÏbÅN&3Ì›w˜dÂa0&íÆ0þÔWT{–G*”€Ú$¦ÆÃ‰’þ “OÓX¿ˆÓÎZÅ3µÞ‘¦&Ñ0åã‘™Ájy1ï»õ-,ì»|äúõ VéŸÝVó\}ËÛXþø-|ê“(yœöÂËùÈ^Ç‚_ƒ|üq&÷×ÇÔ:ﳈHP<Ò5™þÝ ¼Ï=óT,Ëbè™gèzôQ’É$±H„°ãÐÿôÓØ¡k×R³z5çu*=ú4»{ñðñcáT; 6'N­CMM Æî¸ã’É䨼h4Ê+_ùJ€cæÅb1^ñŠWPSSƒ]ÌçКùõ„ÂaújçRßÚÊ k‘ò îͰ CiHy™}zžÁy?Ú=™EÉÌYØÉÞ¦H÷[l„É„Þ?yây~¹e?ï¹øTæ¶Ôz§¼kÎ?•… ’H$ð}Ÿ;w²aÃæÍ›Çš5kÆ*ø‡††Ø¿?6l`íڵ̟?ß÷Y¸p!«Î]Åo6?H,|±ÚÄSÕç­¼ì-/ãuïyí1Óÿòük&»ÉÑà;»07ûz¾“W–SíT‹“i{°fB¥w>¥öðηL¾;w»¹ëÎúJïrBï ƒoÏxôõõì}•H$JÚžã8¤½G!69a;søN¡7¯/õߎºþ¾kßuÌ2£ën+(–åÓÜÒË 'Gh_²ü^Ìpæ[kãÅ9aõàyøéa†û8¸û0÷Gˆ7€©üÓÚÇg¸®{î0‹inœC4\ƒí8$¼R~Š®ÔvjìfÖ®]Ζúmôn馶¯{ Æ'"rü 3ïe¯çÍWŸÍ‰!’]ûyný/ùÉWfßœ~bÒL‚$`ü“9–É^ü".»Àå±=E—„[Yýæ×på«Ö°dNˆá]ù¿¯þ€Ÿ?ÜK9$M²‹Ûž#ü|“*´ó‡IÆKNïÇ»ð þì'ïç¢vHüæÛüÍG&n,_uÿpÃj"¦›û¯½‰nž%÷YDd¤"@È ÑH˜³N_‰eYô?ø ûŸy†¶ÆF:››„¡#ŸÅÓ›7“ò<"k×rÖé+ùåo~O2åBÈ"³¨ èDˆÆøcGŠ»®Ëë_ÿú±y·ÞzëØçÝBó2GŠÓ›¹®µ˶HÔÎ! ô&!åY¤\ðoáÞ¾ F:¤ºÑ:zF"i"ÍÑŠ…ÞPz‘`Ê34.;…ÏÜó$o?çDÎ89Ø#Ä#N„;~øsNZ~ç¿ø|žþy¶nÝÊgœAMÍÑ-gjkk9ñÄ™7o›6m¶m–,YÂoø wþ÷´9íŽmTÁ}62½£ãB!‡½{7Väöƒð£ÿø‡ݼóï bs¹•Þ£råìëÙ'·„òª½«ÿ[†<¦"ô.§Ÿ÷DëN¦Ê{¼0|ôr¾W޲GþYf’=¬[;[yûÇßη?õmº÷wÐÒÑÂ;>þvnù‡ïеwzÎ4D¥wp‡šâƒq\/˜ºžh4ÊèÃÄGO¬PÌþÊ·Œ1£Ïžà^3'Åܹ½,]ÖL]k'&ù˜¬7îáç° `Ù8Nˆ†ÖFÚÚ™3o/ÏméâÀ¡ÖŠV}{–Çðœ.:VFYÐqi¤ý>L&m þHd1àu3l °téÔdïÆýD´ö#ŸˆÈñÌ>᥼í£±x` ëï|Т,_h1èUûA¤#£ó}Jïðâ¤×ý ¯¹øI¶ÿÏùµgÿ1où˳p¶?ÁúÇ §\|&W~Òpðª¯ó»î2öÄÐfþç½×“tZ™‰•\=áƒ?róÁþõPª$Ã&óy3zÚ N©}ˆÇã€UÏÊ N"ŒÁà1ìû˜YsŸED¦–O:lc¼ò-?y1áPˆ¡ ØÿÌ3Ìmm¥¦±‘Ðg`Í™€éêÂ}ôQÂÉ$<÷~s3áÅ‹YvÒbžÚ¸#s¥PfÛ| ¼}?Ó’Ôu]î¾ûnR©‘Hd,ô…Büô§?%rÅW`YÖØ¼ÑÏÄå ECXXx¡(Ã.¸Æà‹´øGR:cFÏË–¹l‹54bA´2ï4†ÉUz»>4·¶cN_yøi^×3„±¬ÀÆhY΀ÖM[8ûœ³Ù¾};«V­"bŒ9¦²ÜC,cåÊ•lÛ¶ °eÓì+Vþ¸ŽééMþÅó<ÒiϸËã ®â‰'ïcã–KÚþTiŒ4òä|Ç õõ“ÏȲÙ'­­óÈwbˉª½'ªÏg¢åÆ ÝËÝvÙfJ¥w¡€z¼iÅ,SJnSÜíLèê›ÞÆò-ãÿü~n~ïç±›ÿËõ´Ïkç/þæ-|áº/q3%«¦ö&Kw°åÁ! ]ŽeÁÂÚÍl4sÛf¹¡w,|{˜¿È¦®©’޼r 6îXmœ´ÒÇóÓuhNÅ^qâm]Ì]¢µ¥žÃÉÆîB\†q½½477Ó·¤Ÿ¾¡Ã4õu`;-DD¦½°ƒya?ø_úö~<“$e717Ú@‹ú5/åM×½”µËšp»Øñ?ßåk·Íå=·^…õµ/òÐIoàO.µøÕ_~–_Õ^ÌUï¿”µ'7bºžã÷ÿñ}þû®½¤°¨=õ¥yç¥[^Ì_ßz5·ÝÊs'¾„óÖ4ÃþMÜûÙoqçqLÍ".úПñÇ.¦ÑæðöÜwó-@WËRjöí%ešIâpê»®ådúÙõìïÙážÎUŸyg{ñÃÏý–Ðeoáõ}ƒÏÿ=·í[;μIB¬þ“—‘úñøö£kxý»ÖñÊ÷_Äo¿‹þ—¾š7¾| nªç¤39Ü5úe®EäœK8ûû¸çže\zåš‘õîdoã\õ¹7±.ò<þø’§^Â%ï~7uƒŸá{Ï=Ës+ioàÖ¯üŠ]^ nÅzz€ºØ\NN]^ñgÙ¾+çðï_¼šôþ›ïí¼?û“³yó—W³ýŽÿæû?|oüóµ¼êšu<ò×ГۆŌwïdoǼùð„øÝíO⯻˜ÓÂ0ÚÕj~Ñû2çq9äßÎ ÏðxíË9ë¼¥„ÚBøÌ5¬ mæÞGí±Ðû˜Ö33ú>‹ˆL×>òžÓÜTO(äÞ·Ïu©¯©!´nXÄsÀS IDAT=¿ü%]Û·‹Dh]¾œºóÎÃZ»–ÄúõDª«£¹±žž¾AÒ¶OMùnv~‰D¸ë®»ˆF£¤RG^^]f´ <Èð{xpc ád/)³è¨jîì€{´­ÉØ<7M³ß‡çû¤KkŸZŠñrƒ=iæŸ÷’cRŠN oÈçð°Ï€m3Å© ™›î¹—“vï"6ÉÜ cU7Þ|#ápÏóظq#---ø¾ã8lÞ´™/|ü ØÃ™£Àû¿ÇøÐ§>IJåËð<††º»»Y¹r%ŸøÂ'p]—¿ûàßÑ÷Lp'ÍÞg}ûÓ<{»‡e,ÛÂM/á² ÞK¤v¤¸±8}ÍÅ464óàúŸàyÕÓ—ïýZ:Z8¸ï ~燹øåó¶kß6™Mew¡Èóõô.µ·79ëU*Ìž–|¦Tzç3™ôk¢*î|mN²/çkwRº>øÈÕáÓÿúiN8åvîØÉÇ®ùáÁH徘@5Uz|’½»ñÝ`Þ|ìP SV7Îcû%A¾e‚Þ_`±kèëä™gØÍ‰'µ ‡1^¦q›j$™ÎÊä„q ã§ÁK‰ÓÚVCCK?ɃÁ‡ÞÃ}Ìk2œŽãù.!;BȎຆ´çb ÔÆ¢ »}™ûâÔ’HzìÚz³»Ž–TQçH‹ ØÞ_ñ•µsýM¯ä‚|€uoÚÀŸ¼…{6ĉu:k›}v~ófþé›{Á¤0N;™#ª-©ǸùÍŸã×#̽òÞÓê±ã_¿ÏwwÖÖÝòN=¯“{wžÁÚóîøifÞ®;ùÆçïc¯õ4-—œÅ›´Ñâ@÷p›æ¥'PwÏm|÷»1á6ê[2ëù{îäK7|ŸþbÜ57óÆ‘õŸu§µø<ÿÍ/ð¥oîôï¥ýŽ÷rêå«ðÞû8ϾŽÕìfÃÏb“£>&âDÁŠqâÛÞÆ«W¹lþ—Ÿð‡~ˆäy òž¿›ÿò/ÙëcÍ«–qNï/ùÖgîb›õ@üØtIJ÷ðìÃý\vÎ*…vÑøG§}öx¦ç\^5ÁV§ã>‹ˆÌ$¾}ä³bM4S=›Ø¹“ÚX ˶±ZZðÓiº¶og^k+‘pÄx¡yóˆ'DÃaÌÞ½X§œB,¾¬mXÔlŒáòË/»žz*f™ÉêÙ{ÿ4Ÿ¦ø^úÓ+0Nx,àÎŒñè°{t^sr/“¤«§¡Cqj¨)xå/7ð}2ô% ç i I œ°œÄK`ëÝ·±æàIÇÃ% 18˜ù"ĶmÇ«Äà¾hL7Q_›©JL òÀ½°bå \×ÅqlÛfhh€ºº:|;à#«Ì‘ÌÄK’½Žmã„lB¡íÍ8aû¨å—|&MÍÍÜsÏ’L;žIº÷ö{‰§âüÛ?ýv÷ÜYð¼uEÈ×Î g™£ý¼G§•S¡=#ªºó©¦Ð»Ô~Þ-7Q5w¡usCíq–?º2µX!Ë¡9Ö1Vá àØ5 Ä&µÍrw"ËàÆn|ãÓÓÛønVus [‡£Ô¶šû‹Èßß‹n¤ÑŠâ' X™þ£C÷ß–ÕrÍ/æ­_ºˆ?yæ>þý†ŸòìÈÛ‚·û‰P+­V˜ô€ŽÌ_ù5Íu„,Ÿ®>mÑÌpœîØ-u4E¢dj˜l¢áz€ÌûL„Eo¸†÷^½˜îÛ?Ëg¿ÛM8”ÿœþÁ^Üp8¤=ð»úpC4ÚaÜ„ÛàóÞuäzþû ±†lËãÀžmÑVèí£ËƒE#ëÆŠØ—G—ìÛ´YpÕøØÕ ЍàðÙóí¿ç“ÿ¶+«l`d;–ÏÎßm`ø•«Yµr­ëbìøÏ§è3çs§ÿ>‹ˆÌ,Ædfdš!ìilaù>5‘H&ðΚ†ãL§ÇÖ£CŒ >³gWz'ªå.d~Ð÷Âaí;ÄÜ…õ‡63ÐyêQ­Lòµ5±R NJlÁó˜3‡V‡±¿?ÆÛÏcûrìqÉ~¤ »ïø27=)"ô6¤övágUË)›³ðœ§“/挿¼”¦†Ü¾¾++ó®žû,"2³XY'‘J$1@tÑ";v`|p«¾ž¦Å‹1ØóçcÂa¼®.Òž—y_jkÃCÃÉ#¯ãžèg+c <òétšH$ÂÙgŸw¹ÑeÂá0ëÖ­ËZ¿ü1Ô˜Z¶þáYÚ:Ú˜ßFú`˜¶e¬£ÚšŒÞž•޳|ð1j¼zzéÚ²—*ó™ÓŒßÓ»£ÆfÏ¿[Ø÷3!y¿aáÚƒkplŸ½Û·Ð÷àÏXúüV:ÂMeÕu]’É$555xžGMM¦Â}ôKŒ_úb¶?²†2ïÓn­Ç]úGø¾?V ^WWG$Áq’É$^ÐÏ+Ž|ic;†h³‡El‹´›âàÁbuµÌk_˜YÁ‚'·®çîûo¡)Ô€“óWN¥ÿ,xÕ;_…ïù<|ß#\ÿÕëiéh!™JòÐ=SëdޤÝ?Máæ’öUÖ²…ª»ó…ÝÙË•xÓâ¤Üªñ)5Bïr•Så=:-»—÷xëå;‹:Ùýünn¼æ&,>÷­Ï±`ñÞññ·s󵟟ì¦ËRRèíûĽƒüõ߉mY¸žÇõ[?ä`Àw3ÿ‚0VéœìýeY—¾ôB~vÛ]ôõÝ˪©©‘K_z!–eå|[Y9¶eSc5ÐÓæ©ÍÝœ0ð‹ÏÈ8Ñ‘/l¢ì=Á2‡Xsj=áp ×Íùã‚E˜d2Á¡­I»ç³bXŽVæ6‡Iv>w³»ž–á6b¡ØQGCˆˆH¥X4¿üÝ|üͶ=¾‹:Yu^s` [ø$’ñt|güÙ»xw˳ô6,bÑá;ùÂ÷²·‘zä~Ûu_ù§\ÙÿûÜ:ÚNláà~Èúqæý®çØmeOiûã·ñžÕýlÝÚ…ë»ø¸Ä‡ŽZ)ß;Fêá_óàó¸ìOßÎ5›H®\Çêð0OÞõz¼½=žÉ+ÞoØÛ½ƒ‡vœÆ_]Í©=쬽„wúr,<Ý÷S~Þ}7}ãJjñÏÜôÍñÆ[šc×7$žxœ‰³9íÏßÉ_6o"¹úNq`ô€ðñöóøûÒÞ³—çws²…eE‰8 ׊oá<Î=oþ¶ÿbà ֑Ð{Â-;®ÊÝg‘Æ7dÊ,zzûñ<ŸÈÂ…0òzì>òáK.¡þ’K0‰ƒ5\¸ï>j£Q,ÇÁjkÃó}zúúÁi_PŠÜs‚]zé¥<ðÀã¶ÿÌ^&Ès‚Ù–ÍÀsýlxèqN;ÿ  läp²‹®úIÇÚñíž$‡iÞËâäV"î©Ä0ý»6°`±MïNß-¯‹m!ãÝ׿{ýYc—G«æ“É$ïÿÑS™Ós¥Òt¿°×­Œò«»vÓnÁ¶ÊçΧwññœh,Ê[¯y+óæÍ#•JÝöÊU+yÛÿ{+Ýÿç^r.+V®`xx8sÄA8L4eçÎ|çß!™HòÂ3»ét:ËW®ÑçR}‡ÃYWƒçA:fË3Ûù׿ù˯㵗\–aýwò»ßÿŒÖHË´ýðšk^ÃåW]NmC-öàëŸû× 7Ÿ›Ef·:É~r•Sí=+U:ô.,Of½|óÇkmRJÛ“‰zâän·¬ß£ºéŸ¸î×ñù}ÈPæpÙ¾óoøÐ§?ÈW>ñ¬2[†OV)o<ÆdÞˆw ÝOÊô6Møö̸ÒÛÏwˆKyr¿± ‡B\~éEÜ~Ç=$Gú”E#.¿ô"¡ÐQËNö„¡¥ŠÚ1’Ãíl|®—ÁøB¶ÁøþX°±k8ÔÛ@ßá>[ Æí±?°‚d†Â$>]]ÄzZˆY™“N˜‘Ã%|ßgëSû‰h¡Á4ôï‘©Òÿôz~¿ÿ N»àžçspÿ~’û7bRIì¥ ºŸa*|Wé-» c1p¸sè ÞqV3Ÿv"ë¿á”x4ÑÄÞ'÷‘H'øÕ‰¿â-W¿eì$¤®ë244Äò•ËY½f5ÀØ4ß÷ ‡ÃÄb™£µï¿÷~6>¸‰X8Fs¸”vË÷ü°m›P(D8fnM'µ¡Z|Òüêw?æÙÍ¿™ÖÀ{TmC-ƒýƒÜðŽ Ç"d¹Ž—GŽN7y–)¶ ãÌ›¨ú{¼mO´LEƒ÷J?'J ½'ªÈoZ¾Ÿ….¾JØY×í׬Ÿ£ÿ,2oßx÷Ùï>cÈϪ2*’k\ºÝ´ÇÚq,ç¨im±¶ 1ŠR·ºŽ›>{étá3Ýcøê¯?É€wÛ²0‘A®¼|I¿—¨ÕÌ÷~¸žþ.ÆR",Ú¼vÒã9ÿ²>^ÿço îD–áþç»ßâ·ÿÌ‹ñöÃÛùñúçÝ_{÷îçžû~ À—½„ùóç³L8æ ¼“ZO d<ù˜‘ã¸||\ß%mâ4Öö1<ºSƒ$|›]KS´•z{äÐV·‡Ã©AÆ"ÔFÛiw’ê&á´±(V?ö–ïÒ“ìchl[u´ÄZ©µÆ™Ç`ζÒô ï¥×¯cN];Q÷0Sƒ¤ŒBDCM´F뉘ñ׫ͱ"Ô„šiÔàž×áäIcrZh±û9”:ö½=Ï–eáöÇiJ†²Î—4yµ«jùäç?I<çé§ŸfÅŠÔ××cY<òÈXèýÔSO±nÝ:Œ1 ²iÓ&N=õTêêêøø‡>Îг¥ç)ãéMõâÕùœ°fó—Ì£¥½k$sI¥’Ü}¶ídÏæ]tv†8aiCæä XÄ|ºŸ‹Zñ=Ø”â+ßû|Ñ'ït]—T*Åû¾¿X8ĵ/`IG3uuu|àê¨ïËŽ‘ÉHÖ$yÃûÞÀ9çƒ1†ššº»» Ž5ÒÖÖÆðð0ÿîa~üå.¿`ÍÉù:¾aA=úÊûò.»íÙí|ïÆÒÔ¾”4)ìßLc¨qÜí{ —=Æñüûïþý¨ë¿øî/¸õë·²íZ»–ýý¿þ¸†±†~xYÿü¬Ÿ£ÿLëd]‡£«Âs/÷s¢i¹—™`zÅBïjioRL^îvs/O¶’{ì0ß1Åp¬5cÛ(4m*ùEœÈÒ`èMïå/_{ŽmcÛ6Ûâ÷1ìÇ1v”¿yë øÆvÓ|ô“Ÿ.ó~T ½ &Ð}[hÍ›×É9ëλœo™±6'Žç˜ÛÈúi[aêé‡q²[hC8äa¥‡Ø}8Œçµ3 ÖoàО^hNá8Í8é¬ûo i¸¨ë?«¯©B–ÓD{MÓ1ÓÇþN µ0'Ô’3/LG]ý1ËZv=­5õ´æÙVáyõ9Û ÓX³„±0¡Væ†r×c¿Þø· ¶ÓBgmöýªgqÏ“†0u£[ŽæÜn-muKh»£¥v £[>fœŽÛ"jgnö_êáú#Û÷~ån;HGß/'<—Åá#·sôõÙrŸED¦˜eá$\¼š4N(ÌP"Åï†sÎ\CäÜsñ6mÂÛº•ºXŒºXìÈjŽƒ½lβe<úø3 'Ó8NßMJº`…yôGª¼GÛ]lÞ¼yl^öI#‘>úèØ¼H$2V!î›`?Ÿ4EšI%SìøÝ&6þöIjšêˆÔDñ=¡þ8~§֩entýûØnú9å¤&° ¾ÉÆ:)ÉÁQL:¸à»”ªvÇqˆD"¼æ´VÎ>¹“¦Ú(¡PÇÉ÷Aí¯¤›ä¬ËÏä¬ug‘L&Çzu/X°€xfÙ‘ó±ì?°ƒGC¨qÂý2Õ\ùWbY6?ù—Ÿ”½­œ±Ûdî|²óÌ|ÕÔ•jq2^õø´ÿIV-¡w)Šm}R̼b¤¥ÉLPLèíû>wÝFÒôrl+S-<Ä>ÅoÁó aÓˆë•×¾Ãu} €ÕÞŽÝ™)¢ó}ŸGŸx–=ûá„2ßDúñµW%<<8L<'röÙgu¤°1†žžÌÉòÍK$Äãqƒ•©¾ØÚ¢í ©¡~ÜöÚ¬6B5G"°¦H3}‡úØjú8ù¤&,ê:NLphG?í2žbÛ›Œ²,‹—ŸyÒØgöÑmɱÿýœÉÌ›7ß÷I&“twwS__Ï¢E‹‡3Ït:M<§«« ÏóÆòÝ»÷ðøïDZƒÙO¹&ÊRjœXÞùÓáÒ5—3­)ÒHs¤%ÏÒÈ—W ºsçFѤªÌÄÐ{T¡Ö&ã]Îw={z¹½Äg,Sd¥·ïÂ4sš±m›aï0CîajC­Ô;­ø–!åºøe†ºÉ„—Ʊ¡ìPZ~j˜D2Ø7ŠRß¼r×X&ót5–É´ 1™Ë†¦º^B¡Ïl'DC¦åIÀOïÑíÕÓ@úÐ[{ÕôÒ8ÔŠme%ýí»ýY÷&"""""RÇrˆ §HÚC„ëë°{÷wqïý¿eͪeÌŸ7{Þ<œyóÆÖñaテ<õì†il'÷¤ãÄþXµpl?ÀÝ¿¸›—]ù2Âáð1í13ÇñxÞÑE©£¡÷]?¿‹ýÛÐ öä‡Ù,¬ ÏÕi¢¯ ¶Ù}œrr3¶ Ma8)Å¡í‘@‚ïrrƒÑ|¦¡w׎.¾ú_å½×ÿsçÍåá‡fÇÖ\pÑ,\¸pì±s‡Ý»w³þõœpò ¬;g{÷ìåk7ÿ };zi‹µ:¶Q…îsðÇ”oIý’©¸™bóÈB!8y¦OTý]l?ïª5“CïR|Λ¨Ê{äúljÄPDèm á¹üúþ]XX¤C½¬;·“a7‰q‡¹õ®_ѳ3‰ÁàuE)gß$^z˜Pͱ'Éš 79Àp"Ø“Y–sò#ëUöùcþo¤‡·±LV¸ìÑ7\áx„ 8¶=òÄ~L–ŽeÓì·î ãØÆöq²^‚FÃqk,óž-¿[""""""Å©dµcøñ!Ò–!\W “H¹<ôèÂ!›¶Öêjc`h(AWw®çã„B#Þ†ô`œp¼‘Ú–Z¶½|O>ú$ýÏ÷ÓkÃ76v™ã± N f-f29ÜLÎÆÆ>^çŠñ*¾³—/¶â{Ö˜êл˜ß‚‰*·'{[¹áu©mKF—=êÕ|6=C¢Ñ(Ñèøß„~ì•7àù7Þþ6©$Ãn œ$‰n‡†V¶Ã˜I¶uòÏ¡®·ßv{`m@,Ë¢«+…gü@Îxl€X,F,6ùCj¦î+“L š±oDG~ø&„1Ë;¡j¥#ø¦Þ4fÕÂÊ$Ü™YŒFñ•‡ˆˆˆˆˆHuÊŽ¸jì “vû±ëjqB!ìˆñ »{¡k´¥•9S$Xx®‹"’p©±kÁ²м3뇬0sÂÞv˜C¦«¤õ˦#ÒI( þâAhŒ4Ñw¶ÐËòe­8–a(•Ä0ùÐÛõÓ Æy÷Û߇Oy•Ú66Nb¾CÈžü‰HÍÈžñ1ŒÜïçú¸{ëÝ4„h‹µã¥=’É$¡P&.L&“xi¶X;n<ÍÝÿu7µ¡:š¢MÀ3>XÖH`6¹àû˜ÈÛ/z{~éµÞÕò< €Í‘ÊëbdgžÙUÜÙ×G§•º›Æ« /v½Š«†Jï ¿ÖËls[ùð‰ñYÓ€Áþöqã‡o,zŸísw°æÌ ·âÃððVNŠu”ýM­eYlÛÞȆÍq<Ïæ ±© 5Ò)ÿa3Æàzi.:ý¢²¶Ón<ªOW¥Ó:dšžÁŽå̢ߑʰ,›»+‘ ì#UÅŽF EBG5›apSiüd {8IÌ8ÄìºÀ?{Y–E$!B„:êÊÞVµh ¾:D4bø°CóäóåÌ— ‹áÁ¾)tîÁ"Y±P v¸¼v+£y€o|BvˆæX3~ÆÊ„Í»6îâæ¿¿y,ôv]—]_ Ùn&ŠP®Ã¶ËÁÂÊ´,µ‚m“Úß5Àg>òOy[™ø)¨Lñ*VL·ŠÜë“mqBõ&cÚ«É«!ô.Åx¡u©Û(¶·w¾6'ÕóÊô¡4Ûì(zyƒÏáÕ ¾ûÿ›–iiR> ‹æH3M‘¦‘o÷Êý±žÓØÁ:ÛžˆˆˆˆˆˆH.˲¨qjˆøÉ¡$^ßÕz—c²O„’¶Wgוp3""""""""""“RL~9k‚ërT*ôžLüT­3™ÛÈ{;›7MÁÍ‹ˆˆˆˆˆˆˆˆˆS׎y2øT­3¡j¬ô.§·LP=hŠé…ƒ5g’[O¦Þ¶˜sNFnØ\(|.f¹ª«Ÿi'²¬ä·ã5tÏ^fV4s‘a¢L²˜\3ˆ1ÌÕXé´|'¯,gǘÄ&Eª—ïûxžG(¢®®Ûži߉džÇñx×uqGÏc‘Y¤¿¿ÿÿ³wßñQÔùÇ_3Ûû¦ÐEAÅ®¥*(X° üì³÷.§g9ÏŠí¬ ö ÞéYEQQŠ€ ((½„^¶ÌüþH‚IHB¨ Ëûy}ìîÔÏÌ|w=ÞûÍwº‘¦U«VuÍÞÙf£ë™½½¥bè]ßáQª?¶š‚I%¶mcY–e I$$‰†.Kd‹†A0$;;Ó41 ÃØ¥~˜‘ÍØL0$"²ËY±bŶn¢zÞ¹KO²­R1ô®Í¶ŒoS'…Þ’J*Bî`0H2™Ä¶Sê;Ov#¶m“L& àp8p8 ]–ˆˆˆˆˆˆÈ¶Ú^ãx§¬T½wÔ8Ûµmw“éê9(©&‘Hàv»ÕÃ[vy–eUiËú¾‘]L½3Êí¸?ØÅÃñ†ì¢ÜXVßÙ I¤Ñ±m[Á )Ã4MýÅ‚ˆˆˆˆˆˆìêvTfÙX3Úm¢T«ªÚ.„ÂnihÊ/ë!†7Ùêjj0"""""""»˲(..Öp„eY ]‚T¢¿ênœN'>Ÿo[®‡²ÌÍPè½õÔ€DDDDDDD™ââb|>¡P¨¡KÙí­\¹’@ ÐÐeH¹ÂÂBZ¶lÙÐeŸŸOqqq}>Ê·Rc½7wQ·uþ¶Pƒ“”gÛ¶ÆA–” v,"""²{I$x½^ º”ÝZå›È;ެD’É$EEEú7R#àõzÉÏϯïâ;:㬫Alëü“JÓ°³‚hÞ ÎÉÁ=ÌÅ7¶ßlk]Ò`œ9ÿÁ‹9$¥š„Ú¹ˆˆˆˆ4~ñx¼¡K©ÕV|G)÷ÜB©žZµ¼®m™-Ùž4›XiŒÒxÅIÒÄ%çuâ·gäã¥Û8^˜{ξõpæ?þ:?mÉUÕëÚ=„Ãa ÀرcÉËË  1pà@ÆONNÎvÚ“›]NcÈ€Chr(\Ç¢Iïñꋉm§=lwvœÒX)[Þ$ Ò:@èŸYZ82Ø¿ÿ vÛ‡4§EÉšŸøø­ø)+¹õµ©‹ˆˆˆˆˆˆìJ¶G†Y¹gv£í¥½=¤zè]]õ ¾]}¯ü';²3”wÃôѦïEœÕq%‹–KÛ~=â ;jEÅ[zm+Õµ ·‰-­}À€´nÝšÁƒ3fÌLÓdÈ!D"ú÷ïϘ1c¶K]fÓ àcÒ#WóùÒžŒ6ìk¼÷¶039äØî”¼þ KKl oE“xæ–ÇY^ädÏ“oå¶ScáK?P°µÿyŠ-à³WR´E÷®mWÿlŠˆˆˆˆˆˆT³¹lÓ®ã}JÛBïš‚n£†éu­S}Ú®™šøŽàÒ¿wàû»ßbnÀIçóïãð9ÿà•_:qÞm‡³þG‹¶{‡ñ‚Ø~Λcf’ev®}žå E×ÿcÈ1퉸œ8ŠðÙko3uMœeëm˜e³ç^a/¦|Ì4Oz¶á ù)œ1†×&,¦Øw«îœñýè1‰eÏåÓ7ÿËYIÀ о?ç 9Š=1òWÍdnäX:F]±5üøñ;|4'F§AçÒ«M3¬«nå¨üÙüçÙ?ÖÆí‹’á³ÉŸ7—¬##„ ª†ÞÎΜwûl˜e±ç^Q‚a/¦|ÄTOzµ—·óѼúE í¼¶c³ ûǹgÅÎRòVþȼxbã.ë:_5û]µ‹ˆˆˆˆˆˆ4Íe’›Ë8+æïVø®zoIï챿±ÏÃŽUjÁ&^1L£ÔßÖîãÑûW3›püíÃ8¦ÃlF/¬cÞ¯I²~Á‹ß<ÃÒ'{y77õnÏôÑ¿‘´c”úÚÓlå=<üÖ:’ÑÞÜòÈÅôùä^¸ ï!\úÀq2m“‹Ú0༽uWÏ* ­ÇÕÜ5¤;>7‰õî}9ñìƒX1òVšWŒ¯ÝiÜz‡Ÿìéeǽäð5ÁU×UÚ’Z Äâq6@Ǿ¤}íu9ÛÖ~æÄUqW×Þ ¼°%ïÜÃUÓ×cÓˆºMpÆËÏõ‡¼póH'¤§uä”ó{RøÖ]\ýS>i=®ùëÚ8öb@móì81ö̾Gß^EÜlÊñw ã˜}góûX޵>âï×M£Ðv“Ö, À§#ÌáüëÆß(pµãÌ\ϱ~fô¢6œpA ߸›kfåàhÖ‹«n?Þ«ŸdìÛoÒjŸ“Xýðã|ç&ñãóWœ “´ûX:‘µÕGò±ãÄ|íi¶òn~sÉhn}ôú~rüsqß¡\ö@™:‚É…Iâ‰8I öc½xN:û@–¸…çãÛû4n»ÃÏú逳îóµÉ¹íºí\DDDDDd#Ww†éÇ÷gÞË7>^v¾†È.w¹^ã;ëF– s4ôþw ñLYˆ?%-œ`Õ²¡°·ìäÕ:ϦxÍ r]iddÉ[´ˆ¸Ï«b›‰ß™ñK)¡h”¨±–eë3cV.h”¨7›åë|CŽÖÒ)ÿÆ/1Iˈbý2ßšu ÏÀ±GGÚg}Ë×Ëݤ§§á]ÿ“ü5–±ÃåÆQŸ+\ÏZê{^œuÔU×ñØÆJ¾þÏ÷d{ÓÉØ…oÓ4 ‡ÃU¦†A4Å4·ãWLòÞh?†úpÅøâÔ#iU~>{t¦Sî׌ûÍ"œ‘AÔ vÅI5Vñ;c½7ŒgëÎì—ÿ Ÿ/6ʯÍTT´µ:æ_È”ò¶ Ç7¶…Äš´9šã»îCóŒvIé_ßüÉ…|ûõ*ÜiédrXø{ŒPÄ‹³ug:æ~Ë„%i„JbÜt;7ÃôáÂ'œFZ¤Òç 0ÓãÔÞ0~ìo$¨Ab!3Ž•·ó5eíü§Ü²š=ëY¶ÖO¨Æv^ó±9÷èÈÞY“øzEy;ϪÜÎ7s¾ªû]¹‹ˆˆˆˆÔÍC«îç1ìÉ×ùχóñïðâƒphMÿß{§2hrh7:ø7¿äîÃKÛãnäÉ·?ä³±Ÿòá»#¹ÿ¬ð`Òô°î›?_vœ˜ߊû7I̽8oÄx>ùb:8ªÎ2Â}¹ûà |zg*ÿ6–mÒð_L;Á®ÐÓ»B}Nȶž´Ôíå]›*GWJÜ2Ë'eA²½™yFˆ}úGïÎ-ðÙIlo&¾ì¥U¶™°ÊƒOÓİX80°Á01ll0|Â{ à¦{ûm\ÓL,ç7ž‚"âåÃX‹XñÖܬ²~µÔ´^MÇ^W]u¥€•C~̃3ZW(âŒ3Î ==Õ«WcÍš5cÈ!¼÷Þ{äççoŸ.üÆ*¾{ã!&¼ÕŒ®g]Åå¹xòùïÉõûñåw•_'Ãü«i'sÈ«t® ð‡sÓ}åׯ3¹œ%îºçQ m¨¢-˜6ØË?áñ—zpêé—sçik™úñÿK6I»˜˜åÜX—£|ÃçÇW¥ý¸‰ççáÍðaPsû6‚9õâÞä¼û(“óx5-#n•¬i‚'Y©›åǵ©šÍðúðwüÕÎK‹¬ÍžKJ7=÷"""""©É Yÿa ?ßæÝ{ÿÆß'/¥ÈÝŒýmEq~§¢fKz}"ELeÁnt?Ÿº˜­qÓE>¾¢?çþV„¯E':7+*û'ŸÙ‚^çœDÑ¿¦è|íTIb¥‹ø-ÙÞ_gÁÜŠ.^Ñn=i±ôWrKc»[ñη#2ÌúôÞnô=¼+ìJ¡·l+ÛÆ2ŒJŸ7~Ÿ³Ò{£Êëªjžç;è4.8x)?úÛ8;_ÄÃ}«®·‰*#•}N¬üÌHáå?ðÃz/™M}ر•üºÔÄíÊ ëe·sæþ{‘xd'm˜Ã|¬óôì²1L{_ÈóÜ ¿rv•mz÷>ën:‡Ã2LJ×Lá凞câJ{²Eìl¾›hӿϼ6wVÙF&G÷ŽòÍW0hŸŠ´=þ®;ó@2=.y?ñÚƒ1~iùgáù>¬lÒ±SH€¼É#yôµÉÙ%bZÙžvÖð&»‚úþB²ëF8ñ d—¶`¦eÝCÍôƒ9´}]EëÉÀévcçn î‰mÒžÞ½À¿gÈZ6“ŸB}Ü«=ÍÒÓIÏhÉÞÛu‚µl.ó£GÒ½p·ìB—öõø½Æµ'½þo§í˜KVW]uOª=z4‹-Ú8†·iš¼ôÒK,Z´h»ÞŽŒ6ìÝ,PÖkØd¯žG²çê?X™kùl憻Ñg¿ÀôFyj¾îÖ²™ü>¦ÒµiÁÞÚuÔ=¯.f´­Ò‚#QÜËX‘gcm¦ÙY˦3ÓÕ…>ûE0gæáô9¨™s²°ìb K3hÑ´,i7¼{qÜŧ÷¯ü#à®ôÕíÚ“^g²Ûù/Ìvá¨í¼+GVnç[q¾DDDDDR‰cÏÎ`Mbâ"7£ü¯<¸Ü®ò¿´ŒOƪÞ_+fÙ`ÇI69–sº.äþAGÑ{Ø—”Ô4ÍÕ‰óî8•¢çÎ¥_¿\òn‹¯Hsƒ²m¤AǬg¸ê’‹9oȵ|Þr(gœÏ7OgìŠÙŒºìL†ümsvóÀ 1ÿ+¾‰áæ³§¹×Àp8q;M°×óÍãeçëÅKsæ%ñâ‡+9²wg<8h{t7’_|ƯÉJtíÇÃN£èÙ³9æ˜ã¸èÝCoHs%n[È$ÊxÖ‡ƒÊÆšÁhÙ“žÎ |µÊQ©×n’µ³Çpßy9¾ÿ®ÿ¶-žv`Ù|;N2óö^öW\rgŸu?t¾¿uÝ´cÙ.(õsËí,#8©•õÆ,fè…·p`Q!ñ‚ÅÌŸ•EÓ­Þ MÞŒOøòàK¸ãŸƒ(Î[ÁÔq“X|ðÖljŸ>÷ g\|%wŸÀIŒµ3ÿËKÿÍ¡4¹€GMçâ¡wðOO‚‚U3˜:s--6³IÃe}Ûãý΀¼­9¾Í¨«®ºŽg”Ò’É$¯¼ò ápxãÞ–eñÊ+¯ …p8¶OjF:q¹½huc'JÈ^ô=£_ü’5¶ §µ˜Ÿ›À9Coâþs=¥Køô¹‘LʪaCå×fðEWqÏY~œFŒµ3ÞgÔs(­k^µ9ÒäÌó{ÒÔ'žÈgág/óÉ{3ß°«÷üÇ z ÷œéÒUL{w$_¯7p;Ö0müB®ºðnîɟ·SZЯ}+Ì}稊®ÓÖ:¾zò_üoM”Ö;¸ÿoÔt.:Œû=q VÍ`ÊŒªí|KÏ—ˆˆˆˆH*1|ÖPä4¨e¤ÂÍl`)>÷+}Mhê¯yšsŸ£éšÿ7αÉl’NlÊ8æÜ4ˆÎÁY] Äg3þ« ÓÓ1(eñï ºe„ð†ü8 w4“ []]HüÂÓCïäÔ«¯æáW¯aÕ7oóâë_°¨ÐÄòã0L<‘ Ò“6ß~Æ’sûr°÷G¦Å÷¢G÷8_þc9&­6nÎÙ¡Ý >â†Y™i”NËì›OáÀàG¬ÎÓ9ß"EÓ?o(Çà‡ïŠiÓëhb_üƒõP)ɵ)Xö;yŽ š4±Y;ûg’ƒÃ¸¡ì¾Wñ9|ùM>‘ôt°³øü³¥œyľ8§üXó}±$eí¨ôÓ±1ê^ƨǴºž+?jšVñ0kxmŽj¯ÍJ¯•¦9(‹±ÀS=zô8 ´t׉w’¥ùäƱMÃpâ2b$=i„Ý1òÖ—âÉSÑA6^°žBGQo¼öyž$…yy”$Á0x|Nâ¥"/†]Zm½8Ù…8¢Q|&@’¢œ\ì`:'؉ Šˆ%,l ž ‘°â…äç—°ÁpzðTÔ½±7o’âœ\¬òm`•’·¡G$€c j©¼,Õ׫tì>³Îºj=žMÎKãÇÉËË£yóæÄb±†.g#;^Hn~ Ë L—‡@0€§ü.¦v¢˜üü"â–]6þw$‚ÏŒ‘Ÿ]‚;½ê¹¶“%æQ𴱡ìÚËÚZ­óìM·/ȦÈ%ì,&7¿„¤m`N_ˆÏ‰QÇ:ŸYe_<ÐÆž!É’|ò cئ—€7A^AõkáÀM'è(%oCŽHGõýÅ)Ì.ĬÔ΋sò°‚Õ–¥î:­xùùÅ$lÓéÆ]¹oÁùj(n·›Õ«W‡q¹të‘T•UÖÃ¥U«V›ÌËÍÍ%bï¤×l{ÏÝíã©¿ªyèOîzé>=÷)~L89òæ·éóÝÙ<<ã`nzûX¾?ë!¦Vôv¾É4W—[ùÏß#'»¸|0]Ï"^½æ^ÆçÆMoÃ÷g?ÌÔDÙ¼ý/{‰³–\Ï]_5ãâÎcù-w1~ÃÎ ` à ''ŸÏ·Ý:Cm7Vœ¢‚JÜm9þƇ¹¹Í§\{ÇǬ6;ñ·ÏgùMÛmƒí¦Û°—èùíå<¶æ ž½&—;¯ù€uî#¸yt?&y€éGÜÎwFNvIÙµ±M<Þż|ÕÝŒÛdü͆“L&),,$==}§}6êÍÜ“!O\Nþ}ÃßúzF4‡ë\ÎiŸÅâÛïfòÃÝs"C™FˆrÀ s9½[v;¸'×äì{¿¦Ðy87½ÝÉç<È”òÑe\݆ñ^Ÿo8óïi< Ç_ŸH$²É¼+Vlün›4iÒlà: IY®Ÿ¤ìçµd¥‡UišEÙ˜Û•_Wû:>êC{çǬÞäQ%ü0î'.=îpö[Ý…Â gYu¬`kÃz²æŽâÒ¡oU½6éQ|,ëoü ³>gúµÿG¯n+8båxÞ)¬:NL Ç•ÜÙk!×_ùOæÚ¸ŽúŸœQ)15£dD XWÖa.³y&9¹$«ïJRÞ®zWîݽ-ÛØ¦eT¹#¡UÛs£ûõWd†¡ïk‘Ý„mÛ;ïß3ñŸxë Œ¸íf²†`ì/ë(uhÚ<@Áе•®aUñ^´oå`ÆŸ ÍŽ¦ÏN Ç–ÕhSþ¼±ä¦Ó¿}É×Ñ;¸â¤Ù<ÿýb†&­‚¬XGñ&ËÛå , ¯¸9mZ¹±³KvÎùhä\-:Ñѹ‚_—ç7#tØKç2*åçkd—&‰YcùáòK¹¨m>_ܶ³Z4”üíK&¦ÝÁ•'Íâ¹ï×3}4iYqmäë´S?õUQmƒõ Ÿ¿']»'“E6îòù¶ .¯gÎ: =QÒ‚-8æä®ùyãqÙÎ8n`G&¾6Âð¡œ6°)Óžþ•¸m§ÂÏAÛœanÅú¬±Ôß®z‹ˆˆˆˆˆˆˆ4Ã`õ{7peñ5Üxã mîÇL²ú‡—¹ëþÏ(JÎå'á¾»ž£{^¥¹óùñ»•´Þ’}Ø xéÖW¸ö®Gxë¦NJX1ñ9î~fÅu­g-eÜ›?3ü®7xsý3šŽßv<Ÿõ9¡Ìì’Ö•xiõbX1 rr)J‚iºðúÄJD£>LçáÜôαLt;cóâX¶Ó&t7ªk}>¶pLïŠq½ë3¦wÅû­Ó›ZæÕõ¼¹iÔ1Mcz×ÃÎ òEDDDDDDD—?Lº?\ã\‡7Lz•[>…ÊŸ=DšV»ç“QÃ4Êïc”îc“=Ô°¼;Ü„Š;ì8|2k½GÐîÇpIϬéÎJeÞ•®•«õ@Î:|.ï(økätÃC¤É_çÜpz §Õ|2©ï³á IDAT'ÁŒJ÷|s…Èlò×\Ã¥iÅé5ÝÓ›T½¯TµöíðGIá[LíÈܳ±ý²MR1ôÙzŽ}9wøœØd=_Ùµ$aÄ…x2iâ E yR#ñNéÏFì;îêõžÌªCÉîI¡·ˆˆˆˆˆˆˆˆH.i™º ©¿jÃÎÈîM¡·ˆÔÊãÑ,DDDDDd×cFêöf‘]ža¨+úŽ¦Ð»võn}YYY;²‘*™Lew I%ÙÙÙê®ñ""""²c¸\.b±^¯n,ØXTü;SžþMÔ8”””àr¹¶Ç¦”ž×B¡÷v°È›ÑÐ%ˆˆˆˆˆˆˆì6Ú×ÞùÌï÷STTĆ vbER›Â†.A*Ñç¢qp¹\øýþ†.#¥)ô‘” 5|@#át*zjL‰DC— ”ÝPÔ²¬†.#¥é›GDDDDDDDRŠÂ¤ÆCC›ˆHC0º‘íE¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ gC """"""""©Ë²,Š‹‹I$ ]ŠH£àt:ñù|˜¦ú#ï( ½EDDDDDDDd‡)..& ‰D0 £¡ËiP¶m“››KAA@ ¡ËIY ½EDDDDDDDd‡I$ø|>rrrº‘FÁï÷ë󰃩½ˆˆˆˆˆˆˆˆìP±X¬¡Ki4ôyØñz‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ"""""""²Û0ÒNdø—ßòå#'1ºšíÇÝîdþñòÿøü« |öÎíôŠxiê½¼úá|9áSÞºù(‚)t¼² \ݸý?wÑÓUíµH q6t""""""""Û•`ï~çsñ}8¨MŽ‚Õ,œù £žÃÏVŒ¸ v"†ÕÐun7~ºž{Ç´³™÷É›ÌX1Ÿ_ݸæo½i›ü™ßù…•sæQ`où–{ödH·8ߛªÔ9a»³5Cþý ‡ÊmŸ¬cãå·ãÄ­8q òk‘Ô¡Ð[DDDDDDDRˆƒ=Où'O]wþì¹Lül2‰ærd‡±B‚å‹Y)“ó™!22¼ñI¼þÐÓŒ/qÚçÒ=ûòUîâ+î!¯c 7ìâ€AW2´÷潯Ð{WãØ«7ÝKÅêуŸ¾ÏÊ”ið"›§Ð[DDDDDDDR‡÷þïüC |ǽg]Åûk Œdœ!!nllW{Nû煜ٵÆšýÈý¼1;Ûsàë¹ôÄCÙ»E#g1SÆ<ÉãcæR=‘GÿsÁG2¯Ý)ß¹ öêÊëF9ä¼[¹îô#huc`Søù0N¾2ÞýsýµCèÞ> ;k>_½üÏŒ_B‰wN¾ñFÎëÑt³µ‹g0æñù`aü¯ãª­®÷þdß¿ÝÃ…àìËÓgrÃø7™Ôú$:; Ç?Îô~ËxûÊ xË<µæýc>à ®½j0Ý÷ÉÀQ°’¹ï?É«¥góSZàtο¿<øOpö¿ÝÜùÔ„>¹¿˜C¼Æ‹ ÏIǾ]Yýßû˜>àvz·ýo/ѯ²ûИÞ"""""""’2œíâÀ¨AñäÿñuQ”´H„hz&‘ׯ1­ <]Oå˜ä$þóÙ¯$ZuåÂkN¡­ ØäÙ>â³ßç¹áÏóMÁ^ô½üÎÜÇVŒ¸íb¿ÓΡýooñÄÈïÉoÙe㺞Ã.á΋ºb»™!—<ÏÅ6ñy¯pí㓉GzrýýWÑ7ý7^ûçý¼óGKN¸õnÎëè&혡\s\G ¾zЇŸÍ”µëÉZ[-N®­®ö«gNà‡•IHÌã½ûïáñÿMeڄ鬲l⿼Ë}÷<ÉøÜ£kÙ¿ #Ú›þu%ýÚ2mÌ›|0u9Ë–/#ë÷Y,ȳ±ò¦óê½wsïËSÈ3Ýø¼>|n Þˆy¤ï¡‹ø|ÚJ¾ÿ<›n½÷QÏWÙ­¨½‹ˆˆˆˆˆˆHÊ0üB†Env!¦’ÓªmrùîºéIæ²/‰ƒÞâo-[ÒÜK,‹…/]Æù ^—ƒææÑ{ë~´jæ„5eë&þÃÃG³ÈœNæ±=¸¼UKš;LJölCÔØÀW_ÿÈò_×2ué¥è3°Š,}zÓ=Ýâ·gÿÍ›V`,lIï7†ÒµKkFÿQHƒÌvíñ}ñO¼¹„X(Œ¯JWÅÚêJðÇ—øùÜ+9®Ù fŒûŒ‰qŽ•{sÞ•ýÈXúãÆ~‡àƒµîÿÝe½èµXøü­Ü4rX lO˜€{ .¦›o1“Ç}Ê–Ÿù<ƒ|L‘GÁw#å?´/ûÿ<–§ãì©ãXvVö{ó7æ¨k¾ì&z‹ˆˆˆˆˆˆHʰ ò)°M¢iQ\üzW—\¾œœ`˜ Åù@3Û¼mxõCœqTZ„½8Ý>œF¢ê>V­¥0Ào˜ÄJÓÀ¶-²—/§Nì{à^„²:²_s“øœed‚‘4܆“ý®~ÉWo¬‚ÕA?_>ΰv!î8k7=uCçæ¾a#˜¾¡Ò ̵Öeàôzq.ŸŸ fÅøÝ¦ ¯ßOZ´¶ý ‡£¸Œ$+Vç‡ÿÚ§ÓS>D€ÛçÇŸ ÛØ†zz7ZF˜.ÇE»£ŽeÜÉ哌b¿Êœé% [›ÈN¢Ð[DDDDDDDR†µd.s ¡—þôÈœÊYµŒcœ°°ËSÛ¿Â[“&Ç]ígʪ†qé‹?á8á1^¿ºCÕu“ݳrð[2y$ÿžr4w^ùã®´)ùós~b<l¬õÄí ^¹†ûÆ­/_ß&Qí(aêS—ÐÔœ~ǃüý„3¹°ÿÇ̽kKêªý¬Wëþ7P|x.IÛAË=Zâ` IÀ0 lÛÆ¶m¨p;}>ŒÒâº1b£d¤Eß–ïsþá2«ü÷šÐ±0æÄ#NŸDAÖ'²S(ô‘”aOæíÑ è3´·hN¯K(ò·`樂ñ﫞gNÅ‚F-ý”mpFÛqxÿýérrÌêán-ë:öìɇY÷óWÌ\²ŽÕ+VãjÛ†ÀúåOÿ” YÇpÂÉC\<‘?ãAš·kÊò1OóãÑ·qÕ~ÙÌY¸ËŽc‘  ¯xËëªCíûŠÏ~šÄŒÂÞt?çnîÍø¬P{Úg¿É /,'{ƒÑºç]çèìy|0µ=ÿzæyùÅ”&, Ó‰7%âsb•VÔo˜ô Eîú,!w½‚¥ÜÜ\ÒÓÓI$“ïx ×ç`…3 ¹*O·)Í͢ȕNš/AîºbÅ/º‘¥È_ôYØñô­+"""""""²˜î i™5©""";“ÙЈˆˆˆˆˆˆˆHj3 ï"RAŸ‡O=½EDDDDDDDd‡q:ãóùöÉn϶mŠ‹‹q:ËîH:»""""""""²Ãø|>Š‹‹)..nèRD§Ó‰Ïçkè2RšBoÙaLÓ$4t"²јÞ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2z‹ˆˆˆˆˆˆˆˆˆHÊPè-"""""""""")C¡·ˆˆˆˆˆˆˆˆˆˆ¤ …Þ""""""""""’2œ ]€ˆˆˆˆˆˆˆÈöâp8º‘zI&“ ]BÊROoI ½EDDDDDDDDD$e(ôÙEÑxäó‰|þÐ"FÖéÅc>c̰^ Z‡ˆHM4¦·ˆˆˆˆˆˆˆÈæ8áúw‡3(ÃĶ-’¥d-ý…oß}—&.#¶³ê°cÄm°ã1¬ú,o„èxÒ%\<èhöÛ#Œ³$›?çLdô¨×øêÏ’zïÖѺgtóͧ²Ê»t-K~[ˆñZJí­>‘B¡·ˆˆˆˆˆˆˆÈfʼn%ÁÊŸÇçÎ$'Ò‰žý»qÆmVν…×îääײÙüÝìsÎC<~q'œëçòÍ'_Q˜y}ŽÂߨÏw2vu}êv±ÿÉ—sI¯©Ìÿ ,ô¦x6/^uqW˜´uö‘ÆD¡·ˆˆˆˆˆˆˆ¤¤ /¼ .¸ ÎeÞyçFŽYïmÚ¹3x÷ßO2'îevp"öŒ ›±ãyxÌu/ÜÌí®à²>ÿ»æ6fq CO8„vÍC¹K˜:æß<ùŸ¹DNàá1×üxóÛ¢çLìÕ?ñÞðñæœ|l Âûæê+O§[ût…«˜÷ÁpîüÀÆvíÍ©÷žÏà.-0ÖT^¯’@ÎÜoÁdî=û*þ·ÎÀ°L^¿ô Þ½² gêÄ#摌žÀÃcn ù„W˜”9€“Ê dáxžý×Ó|½ÊɾgÞσZàtÆ“_œFüÇ'9çþ|q3ÿøgÜ1–\Û ÔéT®ºê ŽÚ'#g1Ó>ɳïüĆÍ«·=']ç½if!kÏä½§æÃ…ñ­¹ì""Ó[DDDDDDDRÓÓO?ÍÓO?]ëü_|‘áÇoÑ6ð! ¾ú:n¼k8—wuQ8o%ˇqÒù¢¸±WˆÕsdaV¹–—øìxþ±ø&¿-}.»‰3Ú;Ê—wÑ锳h·à-ž|q2ù-äü«O¡­ F´×ýórŽmSÀ´÷ÞâS—±lYÅ0*ž®§Ð'ùÿû+‰V]6®W™³MGö ”ÎøŒïKÓH‹F‰¦‡X7ñ ~K:hÖq_2 Êkq°Gÿ“h3ûuž3G§“¹ñŠcH3,òÎbaž•7×î»›¾2•\«ê0+F¤'×ÝýÚäñýè·™°²)½†ÞÇ'µÀ¨óX ¢}/áªþûR0ñß<ò즮Í"koÙzêé-""""""")) ñÚk¯pÍ5×T™÷â‹/ò /‡·h›f¸3'žß;±–éÓ§`ã\Wéd† ¾‰OÖ; ¦…q¾r%&œx\š›Gsì-hÙÌ kËÖHþù?6†Eæt2íÁe-[ÐÌkéIרÍï/ÜÎ-/.+Ží‰’Ö¢|½åïq÷ÍO1—}Iø&C[”­·¤ò@ß^?Aæ$·Ûü«Fgi¹˜þJAyò×w>òV0—&=^ã¢C¥“{<ßNÿžÑÕ·˜)ãÇñ“åÆßìÀ*çÅhoº¥Ùüþü0†ZiËh6öNëÛæßæÕy¬kó ‰cÑ®=þ ¯óä[Kˆ‡"ø[tiDD6ROoIYÁwåß[x$—¿ÊYûïË~GœÈ}ß:9ü»¹´›wãüÄü)̶2h’ÁçkË€[_à½O>g—_ñîuâ4 ìJc$W­¥0$t+±Á4°mƒP(‚ËH°bu>‘H˜HZQ¿£R+È EG 8¿b½ªµÚyyäÛÞ´4ü•Ý6¢iDM°òsÉ«’[¹EXÁ`ŒÜ †ÛÏmâô¸Ê$—ßßë¬6†·A Æe$YUL$&L6kKÀŒFˆ˜u«MþÄ'¹óµ·;™žÃ'oÝJ ."[O¡·ˆˆˆˆˆˆˆ¤´ÊÁ÷¶Þe\D[´¤™¿€E¿gc›~Ò£J!°‰Ë`Ùÿjn|$žåÒÿ;ËFÍ#Y}sVERm”o£ì}~nIÛI‹Ö-©ˆº £Rœ´°M׫,ñçlfçÙxëGïæ[ñÐþ˜¾tp$Y1ë²*­æh¹-€³­››ØÅÈ.²Á¶Ëuè%H²ÉËZOÌvТUsLÀHoE /XÙëXW¬×r¬¦#‡iOå¸~gsÏgËðwÌý[êæ˜"²Õ4¼‰ˆˆˆˆˆˆˆ¤¼ŠàÛ¶ím¼ÁˆÎÿ] Ç׊CÞ3¾笯!r.‹vMÀÙ›#úïO—“:`Ö´à&lŠfMbfa/ºu'w§Ï +´7í7¼ÅMoWÞþfjMçÍWfÓ÷†.\ûÌótñ;ÅiûÑå°=1×O`ÄR9rìy·Üâ÷a×Ì`øŒ\²s,ŒÖ=8÷êdÏã¿UÝWÉôOø|u_ Æ]i?R²ï1ê*䇱“Ȳ¨«Jš+WvÚÀœ…«±ì r‹ês¢DDj¤žÞ"""""""²[…BÛx˜Á}é5h's¾“xõ¶y}IMKÚ¬7‚—~XKzÏ zR+f>þ4SJê•zCöXî»õE&­NãÈA§3àÌ]±iOñº&+Þ½†‹ïy‡©ë£Ô§Gwtóç—£¸ù»˜˜_¹/¤Méã˜â=’cÍ {ÆkÜõäwØkø|Ô[Ì^áãO [kϦ!ét»ú^þó››CN8…žM×òå3×sçGë7ÎgÖå4.½ñf.ïågÞðØ¸¬H©õ—"Õ·[Ó~Œ^×5­¦g£žï+f ¯•^›•ÞW~®éñT=˜”]ZÃቈˆˆˆˆˆÈŽÐ®8 €V­Zm2ÏáØAw?´KÉ]›MaÒ ÃÀtºñÄ|N «ˆì59”z¢4K÷—õ2´JÉßCa̧—`ÈEé†|ÌhsÒ<ÅÕ–OPµŽü„—´fix H–ä‘›_LiÂÓ‰/”FÔÛìzUYÄ‹òÉ/,!–°° —ÇG Âç,[؈ôãþ1Ã8ü‡{8þª÷XUjaºý„£a¼å§Ó*É#;·¸eàð†Éˆ@nµãµãEäåPK‚éÄãyplrnªÖì.Í%;·˜¸eƒáÀå ‰øqi|IqÉä¦?c­X±bãwÛ¤I“f×ÉZV Ïv¥÷v¥iÕ_W~PÏ÷u=onuLÛî¿qix‘Í1äŠ_«:4‹ˆÈ.L¡·ˆˆˆˆˆˆˆÈ¡YDDvaúñNDDDDDDDDDDR†BoI ½EDDDDDDDDD$e(ô‘”¡Ð[DDDDDDDDDDR†BoI ½EDDDDDDDDD$e(ô‘”¡Ð[DDDDDDDDDDR†³¡ iÌ,Ë¢¨¨ˆD"ÑÐ¥ìVlÛn趈Óé$`šêgÜÐz‹ˆˆˆˆˆˆˆˆÔ¡¨¨¿ßO À0Œ†.§ÞV®\IË–-ºŒ­²råJ@C—±Eb±………„B¡†.e·§Ð[DDDDDDDD¤‰DÇCqqqC—Roá|qqñ.×cºò ‡£+Ù2n·›Â†.CИÞ"""""""""›¥¡MDvêé-""""""""²ƒ~øá´mÛvãû`0ÈôéÓ™;wnÃUON§“¾}ûÖ:æÌ™¬_¿~'VT?§žz*.— Ã0ÈËËcùòå±téRâñxC—';Bo‘dâĉ”––n|ß¾}{ Àüùó±,«+Û<˲X°`AóºwïŽÛíÞÉÕϬY³p8¸\.Ün7ûî»/¸\.–,YRåzHjRè-"""""""Ò\ݹct?&¹—ovtçÓ¹/©" U¹±áš5kˆÅb´k׎ßÿ½+Û¼d2ɼyójœwàîäjêoúôéX–…adddPTTDË–-éС¶m³páÂFÿƒƒl…Þ"""""""²û1Ûqþˆç9«y ¥IÃ*eÍü/yý™—ùnÕN»Ù޳bÄ7{Amû_ÉõôbŸ4'ñÜ•üòáSÜÿî\J0hzX7¢ó'³ h{ìKv4ÇÃäÉ“9ꨣX´hQ£¾É¤aøýþçÙ¶]冓Iff&PVcii)Ó¦Mã°Ã£cÇŽ4iÒ„‚‚V¬XÑÀUÊŽ¤YŠˆˆˆˆˆˆÈn(A¬ôw^:¯;]»v¥Kß! _|(7]Ö“P#ËñÌ=qãE>¹òXŽ8´ }Ïƨoþ ÀlIϳOd_#+ZêôÇàr¹hݺuC—²Õ*zR7f†aàõz‰F£Ì™3‡%K–ЦMÂá0.—«¡Ë“H=½EDDDDDDd·åŽ4§yó$ØIæOœFÎuéD Èwvç¶§bÚ»NN¿¢-f=Â9N¥Å€¹á̃Èô¸päÿÄ«ÿz”qKàêÎí#aõ×:§ã G°}›‡ŸúŠ•Iðí}Wßp6]Zú0ŠðÖ°a¼¿Hxèpúœ3°™XûÝ‹<ðô׬JþU£I#¼ü¦oдy;±ŠK¸Ýét½ô6ÎØ/¬‡_àÄ søÕßkä%<=»l G» y~˜“áWͪrÜÞv'píMgsX†Iéš©¼üð³|½r'õpÜn7S§Nå ƒbéÒ¥ ]ÎV±, ÓÜ5úÓšæÿ³wçáq•õßÇßgö5“ÉÚ4] Ð–BY*›e‘}d“T@DE@D}@D7ATAYdý• ] PèBiÓ¦Ù“ÙgÎòü‘¤¤mš¦m’IÒÏëºæš9gΜóÉ6ùÌ}¾·‹P(D}}=+V¬ ¢¢‚†††a9 § Œ‘ñ)"""""""2ˆŒ@ 3ÜÔ«oPgN³ò0¾ôÙ…üô˜™ìÙ3d1iœóWy$‡z½8‘sN•…ïå IDATܵsD¡“§P¾Óoæ[çœÍ']ÄÓµçqê /øvæìHî_æà}÷åÀ/ãá¥]ý„ƒ{òÏ=|íèÃ8ððKxeÊ78mÆÚ#P <Ç‹¥§òý3ö`ŒßÀp{ñy]à´ðÂo~Íusùãy'qòWÅí¬dÏwÆ€›möû,æÓÿáƒ!:ÞùÊO uËérðáœý@„s/9š1Ã{Ðî¨b .¤¬¬Œêêêb—³YFÂHïžÜn7«W¯¦¡¡ššÊËË‹]’ "…Þ"""""""²urOâÌ›þÁC=Âcý•ïžë\ÊšéíŒe<|Ë£¬ TR]ÀËÑä)§ªª„ƹó±JJðuoŸŸÃ϶)/§¢,ËâL*ÊÃx'ïËÞísÏ[âÕÕ”ù¬îDƜˣÿZ‚·¢ŠêhïÌë|LÏ(Ñ0ßãæs¯àÿÊOáW÷ÜÅ/Ï?œíÂà" ã1 ü¥T”GIÏú/Kv?ˆÝ€{[öÛ§À3/¬X+òLÙ™ÉG¹oTT•Sxå æMÚ##'À ¼^/¯¿þ:»í¶[±KÙ,ù§÷†x<òù<ŽãàñxÅ.I‰Ú›ˆˆˆˆˆˆˆÈÖÉZÂÝgŸÊ- MWŒOù97Þr6?»è¯,°hNñv'ÆF)»žüeNš¹ !,œÈ" zì0EÎrwÖ.Ü8·£1JZõuÝçr}j; Rog(m¸?}LO†ˆ³„G®ù÷{·áÈï]Ç5Wú¸øòÇ©_gSWæUžXð5Ü=ÄìÕû23û ?ªwói2DãTl(7ß2NW­~s1ó@b ^OÙ$†a0þ|öÝw_ÊÊÊhii)vI›ÄqœÓÞ¤›Ûí¦®®Žêêjª««ihh ›Í», ½EDDDDDDd«åUS]mc³ú3ïÛg²CÜ`Q[çý† º‡~‡÷¿+øoŸÿÞKwŸ«øï©=÷¶þ¨WpÚZHÄ+)wÁJ{½MXw°¬Ó[¡.áX9a§•Y·ü…Ï?vÛy§ÞZg;#Ç›O¼Í7ŽÜ“iõ{“zæ \kŸêï´6ÓôÞœwî}kêqÑŠ2Bî ¼P2(Ün7o½õ»îº+Ï?ÿ|±ËÙ$#­½I·d2I[[;ï¼3eee455»$#ëã‘Áà ±íçfFb‹Z?·¼¡î¶FÒ2ÊÇìÄ 'Ì$ºNæ×[h~ô¼\v'ï]Žp…ʉ>Ó“§fv_‚×Ü1v<ö0¦.û€¥ÀNÒ‘®aâ8÷Ášû$ol{ç|6Á3ÿ×¼^øc.|–çâ§páq;3®ªŠªê‰Lß}*åÙ'Çqüb³gÏfÒ¤ID"‘ßÿ`ÕݳþÁÚ÷`1 ƒ\.·¦Å‰ßïßøƒdÄѯ3Ù:uõô>ÉÜÙå¯ð—ÜÎ|ÓÀë]wc‡Ögî䝿®¿ŸK¢e Oßû(óÜøa s>·]úw~pÕ-÷üà YÙÏ2+öâ«—žÀÔ ?v>EÃ{Opãð‰ãÃÃ'<ñ×yüæÇåsÍÏpý…·óNaO½^Á±Óîåªv×z©ºá,äÎïßÉÅ?þ5÷}/‚×ȱâ¹[¹ê–F2ý+IPw›“]vÙ…—_~¹ØåôÛHéív»©¯¯_Óæ¤¥¥…úúuÉH7Xß™ëî··ã½Üîk]o×F?—»/®^n»{ÜvõXîyÝÛå¦ý÷ßW€Y-¹^žžˆˆˆˆˆˆˆ †I™ÎvµµµëÝçv÷·?GDc)ËÕÙ^ÄÃã'\RBØç'K[C†@Uœ@wÒ`çH´¶“6ÁåöyÉç<ÄãA\ëmïoo$á­ <äÂ.¤hoO‘·ìÎÝee„Ý}?¦›“OÐÒ–¦`9`¸}A"%Q‚žÎ¬L-9wXy ~ÃÇ.ÜÆÉï_ÈžKw%ëÔç˜:ÚdMO „x,€º›ô®­­ÒÒÒAlçž{.÷Ýw™ÌÀ|ô`Æ Ö}À°jÕ*>üðÃßwwí¡Ph~¦û/—Ë1cÆ f̘ÁìÙ³Y¼x1…Ba‹÷kY©TŠx<Þïí×UWW·æwÛ¬Y³æÖ.v/×Ne§Çºuo÷¼ÐÏå¾®7¶Ž>Ö ø7¨Fz‹ˆˆˆˆˆˆÈVÈK´²†è†î6”VÖ^çò-¯Zû1¡ moà‹UQÞýPo˜xExƒôý˜5k}QÊ«6X)î`)•ÁO—½ãŽâô=Þã·'1º››¬SŸá +Ûà^e(™¦ÉG}ÄôéÓyóÍ7‹]N¿ŒÔ‘Þ^¯—U«VQVVÆÄ‰±,‹?þx@‚oz‹ˆˆˆˆˆˆˆŒùë+8¦²™§¯¹”×ò.|šÍmÀ f¯i—ËÅ«¯¾Ê™gžÉœ9sÈçó¶ïÁªÛ¶mª««7·´´ÐÚÚ:àÇ.—‹ºº:***˜áç¥e#çÍŠˆˆˆˆˆˆl˜×ë%—Ë =øh.×ÈnìnYV±Kè·|>×ë-v‚Bo‘Mö™Úv.? ïþ^o®(Uè-"""""2J„ÃaR©---Å.e“ ç¾Ú“J¥Š]Â&ñù|D£ÑõÚ¥ÈÐSè-"²‰šÓ^r¦ ¿GÄDDDDDD¶Ñh´Ø%lu<ž‘]Ú¶=¢F¦f#ë;GDdø¸5Ä—ÿ9ƒ¨ß\ï¾;O˜[„ŠDDDDDDd°iôîÐËçóÅ.AF(…Þ""›!•w“Ê»×[ߘòQÖe‘bQè-"£mÁ`Î+âra âDDDDDDDDds)ô‘ÑÅq˜±ý¶œyìQø}¾ßýÇ+VrÃ=ïÀï[DDDDDDDD¶œBou&Ž­áŒcŽ"ø¾_Ÿ;¿3ô‘aI¡·ˆŒ:Žã`Ûö L2âhâ‘aM¡·ˆŒZŽ3ð½cŸ""""""""2pz‹È¨ä8΀Ô†&¯ö\Å.@Dd¤pôÎ4Ò[DF¥Áé-""""""""ßBouºoõôÙú(ô‘QI¡·ˆˆˆˆˆˆˆÈÖI¡·ˆŒZšÈRDDDDDDDdë£Ð[DF%Û¶g¤·í€&³¶z‹È¨Óv«‰ˆˆˆˆˆˆˆÈÖÇUìDDÃ`õó¶m{À÷+""""""""G#½Edr% VOo‘áO#½EdÔqgÐFz«eŠˆˆˆˆˆˆˆÈð¦‘Þ"2êtŽÈV@-"""""""²õQè-"£N÷ˆì½×´7Q–.""""BÜm±“/O³åòcç2¾¯­­mè ÙÑh´Ø%ŒZ ½EdTˆÐÛqlì ·X¶µ…•‰ˆˆˆˆŒ|1—ÍÓã—íø§¶G6x_MMÍV""²ù’Éd±Kµz‹È¨3P£¼_ZüÍÖG½AòVŽyï7nñ~EDDDDFºoÅ[‹]Âe2} ‘­‚Bo•ÇÁ¶í-Û‡+ÃöÛù)-é ½“óßÓhÙºÕzLŽht¢ˆˆ _ ½ED6ÀrL’v=XnÀ!kåä‹]–ˆˆˆˆHQMà14шˆ _ ½EdTÚœ'y+m›k– V·•#g]÷؆‰ËcƒÛî:8¶kà Æ|†Ã±ÑD±Ëé“Bo•6'ô~uéÿH± ÛƒadÜMø ‡¬™ÃÁÁÁǸmÂ{ÚX0 lÇfî»+Y¶ 4HÏBDDDDdxùL K‰kËÚŠˆˆ 6…Þ"2êt‡Ý›z·d—Û¶ŸÏÛePâÓ°ÈšY<¸ØaçSvŒbÛ6–iМjdÙ‚Áx"""""ÃÏgƒšãFDD†?…Þ"2*mÎHoË1iÍ/ÇM·Ë…ÛåÂåú´uI–<ŽÝ‚eÛX¶cy1<ààêEDDDD†§)¾þÍq“ÍĹÁJpyÄDÍEDd¨éoˆŒ:Ý÷¦^lÛÆ4-LÓ¡`ÚL›|Á$W(+ÈÌ5ë;/Ž­S;EDDDdë1Ác®·ÎÌ•qjc˜\u`+W `àm›%\Ù`ý£‹ˆˆ¬O#½Edr6o¤·åKx ~܆ÛãÆë³È;)ÀÁk„°ò^LÓÂr,ÓÁ´4k½ˆˆˆˆŒ.n†MG/¶ÇÝV¿ö‘NUq‘ÙÊï<¥œŸ6ÙÇÍy?®h#—<ü­¹”yضÃîñfNõ}ú¾:“‹ñÓ6?·CÒ69¥Þ^·Í”ŠS*Rœ<}KZBüó½f}\¦à""""2$*ÝÇEN1ÁcrUSO§>Œñv6Àñ‘$6°(ï£ÎôÐh¹y$]o_+Mã½…-ª§Êc2ÎÛÊ•Q —ãf¹åPÛã­qsÁ`ÇXG”|Ô6†ÛÒi~é0\ŽñŸA¡·ˆˆôA¡·ˆŒ.†‹w?YÉ»·ÿy‹w5qF–“wƒßî Ïó¶E}óJð–lô±·†x³.Ƥ²4Û”f(u¾)ŸT–æÒýsòôUüþõmXÐÙâ:EDDDDzSá¶ø~Y „ÒxzŒÎžÈ®zÿ_:ÄŸLè×>Wl ô6³1.]霸ÒÈrZhÃû¨‰´ò™æ ~³Ø‘.ì™NXa~ÛPBÄ I;Ï‘ y⭥ܘjæâHúUî1bðƒ;.cÆœk9ï—/Ò¾‘ÁðFéÑ\ûà÷Ùííë8ùò'6ºý`ØÔšEDF…Þ"2ºøü²«ú•ðç[WÑ=èÄ2í>poüWgcÊÇÝo_³<¥"ÅqÓêÙgB+>·Í¶ñ4×±€¿Í«åþyµlF r‘>ZÒÁ!áÔšå¼cðH"ÊŸÚc›½ÏO ^f3k­óø[ø×øõ·Ý€Fîî^ákã®ÊΛgU®Þà1*B-ܰ^hžà7cär›\öÀðÌà;\Ï1ùqñW~Ï»æ§w9¹–.üˆÐ’rýyoïä)8àòëµ›Ye‡cÎå«ÇíÇŽãJðd[X6ïyþþ§{xnY¶ßå»ÇïÏÉŸ-ðâ¿^c•½5‹ˆŒ ½ED6 ×"×ÞÇ•MðaS˜_ÏÚŽÒ@¯íñ MjÆ0àÌ]ë˜R‘âúY“Hæõ+YDDDDÎË™ G„S|\ðòP"ʬLk ÃÍ99?§Ly›ÁàÝŽ nËXE:~¼Ž•Ç\÷uÌÌåŽ Î¤à-!õ1p }L>óWüæ«Óð4¿Ç‹?Gªbí{*WLŸ€ÿüñD}¾¨^v:ö›œ{Àk¼ÿpgè=x5‹ˆŸ‘!Ô–õrýKÛñÌâJ¾¿ßbâÁ{Ö¶qÓÑïqùÓ;ИQê""""²õ˜îÏqN¬•¦‡ß´”ÑÎÉ8vŸ=Ök™ ¦c¬Õ.eè8L/iä–8µ¥mÏ>ûlÎ:ë¬>·¹ÿþûùãÿ¸E•ñøÃÿ>mWÒ;šk¼˜ÈcâýmŽãð+pêßá×ÿ‚{ç%Ö{|p‡¯ðëëÏbÒò¿qé÷îâÝt×ëÞ›SNÚ@ò~rÆ<Òh`Ø.þòõ¿òÀ·öæŒã¦ñ¿Û`•͵^˜gþ̬ŠÏsì®åd?zŠ[q3/¬ò0õ”Ÿó£ãjðx¿Èoÿ÷E oÿ–3nrÝÿz¶X1ˆN; .8™}'—a´-áõGÿÈ­÷¿CëFžØžc¾s _Úo2qWІ%³ùÇM×òèG[Öÿ]Dds¹Š]€ˆÈÖhΪ.þÏNkzz‰æ¸æð¨iBéŸËáûe-ÜY³ŠÏ…ÒœVÒAÇÜø·@Òv1;Ôc ¤›o¾™›o¾yƒ÷ßqÇ\ýõ[~ uÛ•8y Ž—iǟΤïã·w¼Bbì^|åÂãÙ¦gc;¸ÆÎe?9‹ÚŸàGßþo§>ý@Á3q¦F roý——sq⥥”–Ei|þ,´ÜTï0• £ûxnÆ~ çþ…[|÷´cùîù‡7l:>šÃGvÇ›ÜóÓ«øÙŸ_£Ý^»f#ö9.þù6±ƒ—ÿþ7žYYÅ_û)—SƒÑçó1(=ø\.8|*ÉçÇu·>Èk M4­Và-"Å£Ð[D¤HšÓ>.zsVuNŒYÓ|ǃzs(""""}›æËsÿØ:N-éXóýÉ(«ÌÁ?¡û‘äÈ™Œ=rÏ=÷ô|ßqÇÜvÛm””l|¢úÍe-û×Þð ÿ¾ç÷ü{±»¦†jw÷½6Ûpê/aÿà;üî;?çål_Ï>#Ã!ÛžÁY“àxrIÚmp…Äz$;Ö÷sýæ_¿»‘‡—ÛDf|†i¾<Ëß|™“d—ðêSOòÔ[u¬;Ü&ô™™wXô—òÃoæ§ß»•7 av=xÆ}?ŸB"EƒòIÛZñ¿ýîµ<Ó:¯¨ˆHÿ(ô)"Ó6¸êÙ©¼º<@mI–Ÿº¿g£ÓÙˆˆˆˆÈVììÒ6Ævê^Vðr^ý®i.g(šŽ<ŸS?áú@é-øŠÀÀZÕ@*!q“Ï:à2ÖšÄÞ·Ïéœ25Ùfš A‚îµïttp ñ8¡a¸Q§Ôv¢Žÿ:ØíiìH˜p$O{«á ô¹ðø½] o(D(àY§‡·A8Z‚×°¨oÊ‹•PB Yp•ƈ¹úz>‰çËîy‹Ì¤c¹äÆyü¾KÙ¿\]ÂE¤xz‹ˆ™iüêÅíy¯! À¶ñ4ìýqq‹‘aí±d„EywµÇ8såXæ aËËÛÛJ‡ìx¡gð=T7vwÂmt…Ì=?–0 íun»ñ1V•Ê÷¾wUëäÄæ²¹Ìípðï~ŽéNÄýlÈÁLq[ÔÍy—¦»tGðÔ0~Œ 'ÓJKÚÇé Û cACGS3yÇMMí\€QVKMì–F»ƒõ <—»×oþGvWÿw9¡i'qÖác59¦ˆÍÈùhVDd3mƒ«ž™ÂoŽ^À„X†C¶kbaS„ÿ,¬*vi""""2 ½”ñR:T´ãÿ7á˜H’í}#gNšîàÛqœ- ¼Ò=8í¢0­€ÉÒ§ÿÄc+7o_æûOóðß_äÝñŸá–¿É%GÏåŠÇWÑ1ù7¹÷Ïs9ø’½ùö-à³o-"ß‘½wŸ€«ùnÿ×GôŒvܾÈÿûQ”w}»sDµAë“/±ÀŒvZÚlŒñûó¥ M>nYÀ¿þ½v-Ù7çéúƒ9îÔreüm²Sá3Þo<1‹&gϾ^ª¼”oMkeÞGõØN“d{zó^‘ Ð[DF±ƒ·çÃ_äÃ’|ûŒj^ùÓ“¼iLåÜc<ü¹4oAN~÷‰s¨ çysE)W?7e³ö±ßÄ.?`K[C|ç?;aÚ:1PDDDdkSë1¹®ª)]£©ÿÚãw­ñ"W5J*Ê ¯5DѦNHeÉ›6ŽáÂëŽF z:ÿO0b‡ñóÈo\Í‘üƒU9—/DIi ®—ÃÎvÐÒž¢`¸%”Ç }­Á)¤éèH’É[àòà•PõãÞÈóñåÚiiÏP°0Üxb±^ý#Ò'˲Ö[WWW·æwÛ¬Y³æÖ.v/×Ne§Çºuo÷¼ÐÏå¾®7¶Ž>Ö øˆEô‘QÁH|ÈCõ;rú>5üñÅîQå»ÌdçÕÏó»×Û |¾}@)/4ÄØ¾ÂÍʪ2š—˜LëaŽk,þOæv¢X\/-+ãÙŲ]ÛÆÓœ4}Ì[ì²DDDDd}6˜á•”¸:],-xy ±å£”e ~bÕ5Äz½3DYMv3®u–ñ©¨!²f_ën ´ª†Þ;¥»ð†b”…z?òÚ1tns"ÍéÎçqÚÎ+˹"*^ÃẪ†5÷³©0g¯Kƒ©qk"""ý¡Ð[DF'ÅÛÏÏ'´ïÞLöužÓÚ– qá«Ü÷ßg¹÷©yà¹÷Y¾|ÙÚ]˜îm`qc=­¥;°W¼•‡Kä ©¼›?¼>¯Û梙· 2Ç`qÞGÁ1¸©5Î啤ÕîNúà´>Êù»Le— cMk$"2hz‹È¨â¤óÈ›SÇ»‡æùo°hÂAœ{ôÁ|å˜Ï±o¥'»‚ÅÞm©i©§ÝjfiaZ‹\‘ˆˆˆˆ •sWÕpð'¸·=6ðNeôq…(«KMWon‘­Î‘Ϫ{…›ê>]N.z–«oì^ZÅÿþýøzyùŸwòr×í÷ž¼‡v‘›éÖ×¶áöãæãuÛœý™å¼±¢T“ZŠˆˆˆŒ2‡‡SD]6'¢kÚíÙ@ÖÑû>‘Í¡Ð[Dd[ôóØÂ*¾¸c=µ%YŽšÚÀ¿ß¯.vY""""ƒ.ä²9>’dIÁ;(ó®ØŽÁìl ¨£¨£.›W4q`( ÀjËÍKéÐF5|Œ÷øl ˲"ôoÒ”7""Ò…Þ""ÃÜßçå°íšˆúMNߥŽÿ}TAÆt»,‘Ac/NødÐsuSÿIFý8½ùl0Ã/*×LV™°],Íû6ò¨á£ÒmñPmÝÆ7$§¶çë&""#ƒZ=‰ˆ sɼ‡‡Œ Äorô E®HDDDdpN ÉqÎ/mÃo ýXï,¿«^½&ð^óó¥•c©+ˆéÍõ­¸æ›‘áK¡·ˆÈðÈ‚1´f¼œ°c=>÷`œä+"""R|^Ãá¢! T«=&ÇECr¬ž¼†ƒXŽÁÝí1έÃÊxoã-pT$Yì2DDD6H¡·ˆÈ·\<Ò5Ú»4PàˆÉE®HDDDdpJSå1‡ìx'F õt‘od‚œ³ª†“êj¹µ5Ž9Â&¬<)šP˜ ""ÚþN‰ˆŒÿYXE"×9è¤é«ð¸Š9í’ˆˆˆÈà8qˆG^OòØÑŸ”}oïËó몷‚ÝÙµî{7çgÅÝÝÍo88ùÄï IDAT£QÞ""2Ì)ô!2¦›P @E(ÏÛ6¹"‘sÙÌX' û3º¿Bi~W½šûÇ®äÀPš1“}øŲg0CÈ¥V{""2¼)ôAþ³°š¼Õù«û¸iõE®FDDDd`íÌåŸÔ}CéÛ×q‘$×W50³GÈýj&Èý%vŒbÚ»Jˆˆˆlª‘w.•ˆÈV¬=ëá¹%å9¹‘íÊÒìX•dAC¤Øe‰ˆˆˆ ˆ)¾|¿¶ËfâÜ`%¸hÎûqE¹¨kÇñò¦2꣜kDùY›Û!i›œRÞÊÌuòè;kV‘q \tŽÒ^÷Ñj¹IÙ.²ŽÁT_žÃ©õj™êÏqV¬}‹^“‘¤Ümm|#úþ]ðð·æRæacػǛ9Õ×5ÌÞñsËê{T7³—ãõ~N¨màóD¸¬ÑÅ7"®1[ñŠôÎ4MB¡mmmÅ.E†1}  ½EDF ÇV³[MnÃáÐí¹^m±KY‹Û€©¾;øòLõåÙÞ—§Öcö;4íèpe9'žÁ“sN{€BÇÃSÍ%, 7ñ݀Ͳö É`3וpLÆúûZ·® ½ŒhîM•Ûâ¸BØ éík´ÌŒ2Ë×Ìm±b|³5ÌaUIÊŒ<{û<¼•7˜\ð26hó^Îà`'@&ÐN5£§UŒŒ<ù|ÿÚûÈÖKß#ÇBo‘èõå¥4§}”‡ò¶}Ì«eZPŠˆˆˆ ŠñÞ†ÒìȲk GȰý˜¥n `àࡳ§v]¢Œ?¸3ü¸ÌÂlmá 1®¨÷àxSœW(1”ÖýÕ›šó1~Vpá!K‹e€Ãô€Å9/ï`f4Ïki?ïáflj˄Î(]DDdÃz‹ˆŒ@¶cðÜ’rNž¾ŠêHŽéc:˜__Rì²DDDd+w[IrT$ɤ ŒŽv€fËÍGyu¦‡ÓCƒå¦ÝrÓa»È8iÛÅ…ñVí¥…È¦ªŽ6r·„+ZBl[‘†‚Áޱ&Ž(5ø¨m ·¥Ó\±ÖŠNÿÜVÊûyÃÁMgP[»lj<&Ûùò”¹­^ãV ˜Ÿ ðd*Ì™ ƒõÏ­cê©í¥÷ú¦¨ò˜Œó¶reÔÂå¸Yn9Ôöxa áæf‘ã[¾*ÃyÙ®‰{çŽÃÑ)Ž"""²\À×JÛøj¬wWèÜh¹¹®¹œÒ¡!©¡Ùró¿T˜£"É!9Þ_Úcƒºÿ„íâ·-e<• ó“Š&¶õç1¹}L=wµ•rG[iQú˜o‰—Ò!–¼Œ÷Š]ÊàpL މéä)”ïÅ´Æ3ùÖ9KÉã8ëÏwqêŒYÜ8w2_ùá ¤n8C^l¥ê¸ßpÏ%GóÁ¥Rß×ûqÃ7%õæ‹|rÎNLr?ÃÛ¦I㜸êÑËø°ÍÃNß¹Ÿ[NÜ•gnœ{¯Ó9ƒ;9åð§h'@õøÊÎéé<@pO>ãù&_;z6m¾é|çÞ›8mÆËÜøÖ(ýÚlEÊËË™:u*>Ÿ¯Ø¥Œhù|ž… ÒÜÜ\ìRdˆi"K‘ÎqàÙ®^Þ•á<;Ww¹"‰*ÝSÏy¥mkï'#œZW;dw·ÛÚJÉAû·²!{nïçü|yåXîï(>ý€á·Õ«‰¹FVìm¿o+-vC'?‡'žm%R^NEY–Å™T”‡ñNÙ™ÉG¹oTT•Sxå æMÚ#ýûÞuç’$C!]›'–/¢ÉSNUU sçc•”à Ë—’œv,g± ã«¢˜©Ì§”˜syô_KðVTQmàyµÌæ9ÒÓäÉ“xŸÏÇäÉ“‹]†Fz‹ˆŒ/.-ç´]V°ßÄæÕ—¹"Iö f¸ª¢‰RwgO„fËÍ/›ËyqˆÃîn«LwµÇ8fG{ÛŽÁuÍ僶ÿÞäƒß´”ñj&ÈÕM”¹-f3üeìJ~ÐPÅûù‘p=› ób8Åö=ZàŒ^)r–»+HváÆé¼S±ý¡Ü|ÿÉ]“Qºð›‹™ß«¯ ÞÑJ» ¥ìzò—9iæ6„°p"ˆ4,ÀþèNÎÿñqœÁ¯¸ç[ŸðäŸnåÞ×Vc8 RoçˆFÃýim2âÙöÈú0l8Ók¹uRè-"2 |Òdikˆmãiö™ÐÊmoLÄ¡“#‰ˆˆÈÐqߌ·rv¬}MPöZ&ÈUM´Xîb–Æm¥Ü9JG¿š ò¥•c¹¶ªý9ÆzLþT³ŠŸ5UðäNª9˜àû UE;þ$š†ðh뿯v§µ™¦÷îà¼sïceW¦æ8¢e„6úããa› jîÝ|hAøsråòíóÂ{)ðîsÿ=µkSokñ#üêëðÛÎá7¿ûG\ðCþÓÞUÝ:å©Óáè0{ölöØc‚Á`±KÑ2™ ³gÏ.vR ½EDF‰——•±mú¨F)o!—ËE,#š‰ƒ‡êûC6N¡·ˆÈ&ò¹m¾¼[U‘Ü·YÔæïÖ aU0ëã2¾´Û @-NDDD¤oS}y®«j`¬Ç:Û™\ÞXÉ;Ù¡ ¤“éüº¥Œò>~PÞŒÏp8'ÖÎ$o7U’¶g:÷d¾zǜݵhw<Å•_~±_5œ…Üùý;¹øÇ¿æ¾ïEð9VûMláòõ¹Í›+J¹ú¹)CTѧn9æ]¶§iÍxùò?g ™EDDd]_ˆ$¹¼+`˜—óóƒ†*‹ÜÎdk·«?ÇuU ”uõUÿ(ïã{ U¬25V­7“2íMjkk×»Ïíîï÷rDcI³Ç*Wˆ²J?™Æ ª8²´5tÝ6òí$¼”‡\8f†ŽöYÓÁÁÀ(! àîí8–ÑX.<¾ áh„ §+°s$ZÛI›àr{„¼äsâñ F>AK[ÞpŒÒ°Ãé»6Xmmm”——cšæÆ7–­–Ç㡹¹™ÒÒþµç²,k½uuuuk~·Íš5k.p1`màb÷ríôXvz¬[÷vÏ ý\îëzcëècÝ€§úë)"²‰4DYÒ¢*²þ¤=_qßõlq²su‡F{‹ˆˆÈ>Ãá’²NŠ~:ÃÞC‰(×·”QÐ\ E77çç¬U5ÜPÕÀ_žÉ¾5<þRŠˆÈ€éÙâdÿ‰- ½EDDz0þQ[ÀÉ=z\¤'Ra~ÜX9(ûÞ˜|y~QÙÈoÓ1¸¹5Îý%?S” š§Sa–¼\ÛõµÜÑŸã¡Ú:®lªà™T¸¨µõ˜ÜU³ €Ó‹püS›ÔšGDD6LŒ2+Ú,k 0sB+†Î€YÏY±öA?Æ‘áÓ|C;ׇßp¸0ÞÊÝ5«ÖÞu¦‡¯Öáo ¼G¤Eyg­ªáÅt笆Ãá—•ü¼²qMËšb¸0ÞZ´c‹ˆˆlŒBo‘Qè•Oâ” L­H¹‘á¥Ômñå!½ à«¥mƒ~œnû3ümìJΊµã6à±d„3WŽåý"´Ÿ“´]ü¿†*nêÑÓûˆpŠûkë84œòz¦øòE9®H±Q$¡ï‘áCíMDDF¡W>)ãô]V0s|+4êôO‘n'Fø¡ó¼0ÃIý ö`žìËsa¼•}‚Ÿ69^iz¸¦¹œ×3ÁA;® -¸·£„—3A~VÙÈT_ž*·Å/+96’䯖2–¼CRËÉÑŠudkãñxÈd2ƒAMV(½2 ƒL&ƒÇ£¸u8ÐWADF Ã0ð{<¸]ýy n7M –5èuÃ’–«“~ª#9>;¡•?¿=¾Ø%‰ˆˆ p|dè΂rG„SÜÓð}ó˜œWÚÆ‘‘äšSxmàï%ü¡5NÆQ,9--x9{U çÆÚ9§kTÿÌ`†½Æ®äád„»ÚJi´ÜƒvüËáÈ!ü.B¡étšt:]ìRdóx<„B¡b—!(ô‘Q$ðsìçöeÊÄ Ý6_(ðìëoñÚ‚† ²âxuyœã§Õ3®$ËøX†åíé%""2Õ—gŒÇÒcîÌ Xèíöf8)šàs¡µƒ—Yé·´ÆY2D£}¥xLÇàö¶RžN…¹¤¬…™Á nÃá¤h‚“¢ IDù{"Ê¢¼oÀ½W C`ˆÎ”N\.‘ˆÎ )z‹È¨à2 b¡g|áHÙgïnŸ/hmë`þ⥛u<°l‹œiÁ0=µíµå¥?­èœÐrù|…Þ"""{ôh2Tv d)qÙtØ›?¥ÒXÉááÇGÔ®ÚÏÏù¹¹5Î;ÙÀ––*#ÌÒ‚—o¯®ff0ÃwÊZ˜Ô5yéñÑÇG¼™ ðP"Êÿ¥Ckz÷‡œôtÏ@vË d ½EdT¨­(ã‹}ޱUU¸\®öXóx¼ì±óŽ„B›÷Ï¡íÀ‚ÅKxþí¹ä …ÍÚÇ`{ou”Žœ‡¿ÉÌñ­<8l±K)º)Þû»NUq‘Ùʱ}ÅÙ.`;_~“Bi·;úrìÌ03˜aGn­Ê6ðj&ȃ%¼¢¾Ý[½W3AÞXYËáá$§EìèÏõž, ÛÅk™ ϦC¼™ öùÌo/•tp]KYç@uÂò)¾ü`>‘¡Ð[DF…êxœ«.>Ÿh8ŒmÛÝÞãvñå/³Ùdzm›»ÿõ(/Í}w؆޶cðÆŠRÝ®‰É)ÊBZÒ:ÝYDD¶nãz ½/·”ñ´e6 –ÃÞñfÎpG¸:‘çªxv‹ÿqç1yg÷•¸lj=&Ûùòlç˳“/Ï4®×-–›'#<”ˆ²j'Ç”‘Çrà‰d„'’vñç8­¤ƒƒBi<†CÔesX8Åaá6°¼àåíl€…yå}|bzhëê2Nˆ&ØÉŸãû U4ZnÌÁw¯?C|ÐçÓæ emì±ÎÀrÖúàfÝe‘¤wI"2J8ضݯÀÀqœ-šqÛ¶í1c÷kŸÄ9t»& `æøVþ³°ªØ%‰ˆˆ ©R·Å4_ž2·EÌe3±—ÀÎÌE¹×NrgUŠ0`™Aþ÷ñ\2Â9“»ýþŽ8®òzÎôB:]Á…Ù7ú;ïØ~þÚ\ÊNðyx'o0¹àelÐæ½œÁÁN€L ²å$ƒÍ\WRÀ1}œÓ<ð“tŠˆÈè¡Ð[DFgËGooÒágóû #yËÅÛ«bÌßÊ.c:û,Ryw±Ëpån‹¢ Ž‹$³ÎDåÊqFe='Ù^>Êù™ÝQÅïv®éÑ*»"”¤vu„yÑÏ[i¾îsºš4˜šó1~Vpá!K‹e›9 ;ä²ÙÙŸcŠ/Ï9?od‚¼ñqAmÊdó5[î5íO".›©¾<½Æ{LÆy ,7=ÄzŒä¶¿w”ðh"Š×p(8ÇXÿìÇÏÃI =ü0邇ŽlçM;— L7cVg?|Oj+@yÀ♜—w 03šçµ´Ÿ÷p³cÈd[o _èˆqE½Ç›bD¼‘¢Qè-"£‚d³9ÜÆÐœîë8¦µ‰ÿPÉ«ŸÄ™9¾ËaÚ6^\Z^ì’DDDŒ×p8³¤ƒsJÛ k‡^”÷1'ççü%yí¶‹ËÊ›Ù#]k»ÖLŒ‡$g‡ ì,°£æ×Xü4V3\ŽñÅx°Õƒj¦–ÎQ«àPí1çmåʨ…Ëq³Ür¨]ç-É£‰(ÿHD©ñ˜”¹-¶óå™è1™êËs[½ŽF÷Κ‰/ˆ·òqÁËãÉÿNFhµô!¶l™¤íbv6À쬺€£#I óççÿ³wßqRÔçÇ?³½ï^Ùkt* %ˆˆ Ø5AMb£Iì-ùY¢K4öØCì»»ˆŠP¤ H½~{{ÛËÌüþØã@îèWöîž÷뵯ۛò½eÙ™yæ™ç¹¡*Ÿ“–†Ò&Ó&zïP%só££’{뛺ji7 8¨u4®Ûy­ShR)MÑHCÚL¹)MW›Š³ÚÃg$¸À’d]›ÿé)Ž·èT'y«˜âSø¡¶ˆëµÈû"„¢c ·¢ÝËwÉwèÊ"f1·Z·’¨¥Økb“ªKeo¦É‚M¾†çãº$è-„¢ÃkqUn ݶ ÀU¤M¼vñFØEy×&-‚Þ>K¥&Ÿ‹B:.Ò:ôöÕ0Øl''àã‘jþäL1Âçî 3gçÖg§Ö+qQÏÕ ›¦ïªá¢6½6efUÒªdã’ ^ƒÆ¡Ž(QÆÛc;­ñÝӜ⢜ðÕòQÔÁ+u–$¬MÎ+ľP˜Uëã©ZŠ;åÙœ27 z¿22*/ÕðÿÂ`Š2V÷ó®ºó’>]\µ\ǵU*h ‡úª)6( ×òxÍZG¾’bˆbãvC5W)RÜ[áÁe„°–lÖ¿[!DÇ#Ao!D»fPàª3ññØÕ2”xë5v:ìÀ|ú_r27<þ2óÖÆZm»{+”0±´ÌÃТ:F–1uRª4ÀBÑ~€ßûjù¯¶!ÈV¥y¼ÖÇ«!÷.ë_¯o"®ãœísv£ß„¸§d[6i ð;BL¨ß¨ÃYÁãõ¿›î/ßå˜×î¢4IP30;ìbvØ…Ç qЧޓ]a ·+ÓR§°):–úÇÑÎG;#¬NZ˜Uë㳨c—ÛbOhºÂ›aFôL°»‰ë/ëÓ&ÝaÚi…;~þUN.(`ÆvSmÎJžÚúÂù·£“ 7prýóñù›_ÿÜê¨áîí>æ§U»vû÷!„è¼$è-„h÷lV;½»÷Ä`hå@®¢`±Xв7É»ÁWsZT‡Ý¬rPQ_oö¶õ„Bˆ}â­o¬·}¶ö+!7÷r‰j»?X´])‡=§ð]]>³b*§æÇØÛð²¬ØÃŒì:ÍÀãµ>ž z9ÑæòÜ,ŠŽÇ ¡óbv\ŠÎ°ú¿¿Ÿ%É=,ŽÛx ÃRÉüûIGÒÛê IDATš.¸“ñMÌΞºÖB± »ŸE!²—”êH'#héD«>ôt‚X4H0–Úí8ÛÚW·•89¤{MŽD!„ØwyF••5¼«U#ç—q[uÞ¼!S§¸¬‰lï]Óì©äÁÂ&ìC)í%quÚÞz¥t…—Cn¦lìÆË!7 FŽ·Ç0*:–ñAÄIJÏüÝÃlq/.åî‚ ºìm#O!êéì¾=丄.w !„ÈnôB´{å0édtµUº®† F³?è]¶²¦&“—6¶k-­ÔïS!„h6Ŧ4•ÑÇ’©å»>eæô-%|½™Û·r)"Î}^6¬¸½:‹Ê ‚õC¬ nöWò\‡S7wὈ³¡¤ËG”ºlætOœì‰‘оˆÙÛzBˆÝPU•X,F("   …BÄb1Ô]ÔÛ¢£ã !D»¦ëPŽ“H$Ð5µUháH˜h²Ô7!Sâ Çž¢~¸G#„Bì¹£Ê?‹Êè^ߨ˜[ÿžô4§¸®ÒÏY[JJ›ØËrkx¢¸´QÃA!šÃ«õw!²S,Ãív3sæLfÏžÍüùó™?>³gÏfæÌ™¸\.b±ìíK%Ds ·¢Ý«ª‹‹GAS[õ¡ë*5‰]uËÊ"[ƒÞãºÚp$B!Äž³):÷lW²cnÔÁ•ûU^a]ÊÌ—­”©úbgK¯ìNP3pEy!Ï3½9ìŠÎÝ…å匰*iáœÒb®¯ô¬/¥r 5Á³%[8ÝS·‹ ÍBì½ù1û.›³ !ÚN8æ”SNáÕW_eÊ”)`410eÊ^{í5¦M›F8,ÉP¢ã’ ·¢Ý«‹%‰Å¢èzëgz×Ö…H©íã4rmƒòp&ìànôB‘ý À-þJ[|upUEACëýñ` ‡–¾n]¡ùw]ó6Ö€9ÜY“ dÞ£¿ù+9Òà݈“S7wáýú’*æú¬ï{ ËñåvvÑÔAbGó¢f‡] uö…mKUUòòò¸ð Ñõ=;/¾øâ‹™3gÑh£qßJ† ‘­$è-„h÷¢ P$º¶Ç;÷æ éijB‰V ³ï¿¯6ú8i`)qòâ2 z !„ÈN¿°Ç8Ó ®+\ZQÐìä‡9<ÔŽ³Uß»03ó«0):·ø+9¿¬ˆïêk{qò]ÂÊßü•dMPP_ü@ϽíêFd§«òÛlÛ½©j³m‹Î+ ‘H$дì«q™H$¸õÖ[1{<>£ÑÈŒ3¸îºë°Z­-<ÂŽÏ`0`µZq»¥ïA6 ·¢Ý‹$5ªjƒ€zëݶ›N%©¨k_·‚-/wS—0ᱦ9¸[€—•´õ„BˆF MinȯBT]áâòB*ÒrêÒ”ÙaƒÆÿåÖ4Ô??§¬ˆõõ–ËÒ&þXVÌ}Îö1—ælIrSu~‹e¢ !DG …èÞ£&LÂnϾä¡U«V2qâá{6zôhìv;^oó–ãêŒ4M# …$ðäÈQÑî¥u¨ª­C×ë›L¶5• &Ô¾nçÔt…›|Ù§Š~ùüÎ$•K[K!„h É\ÞZzV­ÅRŽc—þ[çÁoT™á ’cT¹Í_É9¥ÅÄëkŸ«:<ÈaIÜÆMþJ<#œz[’\UQÀ:iH(„»•H$=æêBaµÁ¶N#¥ee8ö½zçåå¡iƒ´ýÛ_ƒ‡Ã!Aï,!Ÿh!D»—R*jê@ÓÐõt+=TbñÁXª­ÿü½öùú܆ç¿èQÓ†#B!;Ùb´-ÀÒ„•§ƒ’y¶'äðe,“yØÏ’äʼêFó|³sÖ–V'3¼{™SÞæ$w¨Ñ|›Ó&Î)-æí° §A㎂ .Ì ÈÉ¡Bì‚Ýn盯¿"ÏΗ&£‰ššš¦íÕ£´´EQöz9y4~¤Ói¢ÑhV–¿éŒ¤¼‰¢C¨%I%cXÌfh•Óc…H4F(ÞtлÈ`j¿ Òª`ÂDEØJeÄB4Õö±SªÂWs8¢OüaòIª¢RâD!DÛ»:·§!“qvoM®ÔñÞKQÍÀ•<]²»¢ó¹5¬LXY™üù~>®+̬Ê组•+rk0):3¼A²&¸ºÒOÚöÇ+B‘m<ÁÚÞžýjVfGÇb1Þ}w gœqÆ^-÷É'ŸF÷º,Šhlky·Ûµwt&r)„è*ƒ R©³…L5ЖŽÆˆ&›Þ‘u󯏸àŸMÆMüXíäÇ'«*],-sK·þ‰å¼õ¹Ñ'Ó l|Ï^_QÔêcB!¶7ÞãÐú2߯m¼YŸ‰,öκ”™[ªòù›¿‹¢s[Agn)!¤5Îã~)äfuÒÂß *ðU†Ûâü§d ×WúY(uÔ…âgTUÅívãõzQ”ìkœH$xå•W˜6mV«u¯–éÞ½û/#vnk¹ xg z !:„ÊP’9 –`³9v;¯Bsä‚ë¬ÞXA,©²7Av¯-ÍÈ.AFvÉ4>Ik KË<Ìßè㓟ò%Zçkyk‰§Ee| z !„h[EçòÜLÉ­´®pkuž”5ÙïEœ ³Å™æÑÅ”æÊ¼j®¯ô79ï’„•3·”p«¿’¶8yF•‹Êx*èå‘ÚÔ6ü‡èaNñ§Ü¾ŒÙšr¶†¨f཈³Õ¶'„h?TUÍê€fMM wÝu×^{ín3·EáŽ;î ¶¶·ÛM2™l¥Q Ñ:$è-„è6‡ \þìr •n3S4 ÄÔ¦OÀ–•yxì›nØL^[Š|G’^91üÎäEqYÒ˜ :#J‚Œ( rî¨ÌßäcöÊB–•·l§g)q"„"›üÖSGws¦9ô !wC]j±ïî©Ée„-NosŠ©ÎGœÌ‰6P­9¿¬ˆs}µœã«ÅüÎä0{Œ¿TúYÛÿF^î²€Cì­_?7ª+|¶“÷K!²‘¢(8Þ}÷]t]çŠ+®Àf³5 ~+ŠB<çî»ïæý÷ßÇívgeæºûK‚ÞBˆAC!¬AoÅL»80ˆ§ üX½ó ¡®Þ8ƒ BŒîZËÁÝ2 »ÌFñ=jߣ†ï+]¼¸¬„…›|Í>ì­¶/qò‹5¼ñ½d{ !„h}ƒÆto樀jä±Ú–Û÷u&)]ᚊþ]²‹¢su^5‹ÖÖëÖ€Gj},ŠÛ¸Ñ_IQ¥%ɳ%[x"èå© —t+f[Ÿâ®kµm5åâœ_Ämšé.Dcf½þe&}2?Míð«q\óâQ|qÚ|’jziÑñ™L&\.~ø!óçÏgúôéŒ=šÂÂBÊËËY¸p!O?ý4¡P—Ë…É$¡AÑ1Iƒn!DÇ¢(­÷Ø›‚6ÞýÁÏÍ÷åäçFq×¼>,.õ4ü~ ?Ì “Vó÷É+é“Ýßw¥I[KœÚ³¦E¶!„BìÎ™Þ ®úæ•Öúˆ4Q{Z웵)3³ê/"äU®Î«Þí2_Çmœ±¥„ëË{˜?újy®d £mñïVƒÎï}µ­²­éeNq¸#Ò¦c­ÀЛ³f=ÂÙ}v¸dËŸž¼–‰îf¸Ð£ø8ú¶W™9qÛ†^gòÈ{söÛ¶kr!Ïþë,zÙwµmTR#™Ò…‚‘ãè·uµz’¤–$%j:=³ÙŒÃá óàƒrúé§3iÒ$&MšÄ駟΃>H<Çáp`6ËU¢ã’#J!„hcIÕÀÇkó¸öƒœ÷Æ>Z“ßð»¡EuÜwìwœ7f=6Só–nI© ó7å4”8B!ZS®QåTO€Íi¯IóÊf÷\ÐËÒD¦9ÙáŽ(G»Â»]& ¹¦ÒÏÿUPYŸÞÛœâá¢2î,¨ —¹eÓHv†ñZ©dÝ.Ls‡Úz¢Å¥I¦S$Ò;LN,áÙ›žà«P3DõZ~¹ž¾ö«¿Õ^¡`ØA8ªm Q\”1PóÖQ#ÉWÅÃÀÁ,]´}ûm£à9è nyòE^ü÷Süó¦ÓdK¢+>þÃUœràθ}ÿ¼ã ™€´•~¿ºŽ‡ž~Ž_~Ž.›HqÓD' ( F£³ÙŒÅbÁb±`6›1RÃ[t ôBˆ,´)hã–¹}¹öƒ”‡3ÙYÅî·MYÉ©C¶Ð\‡(Û—8™Ô{÷·< !„Í%ߨrŠ'S·y}ÊÌ»Éòn)SfþÈ\L÷4þœ»çºCš¿UåsÖ–¾ŠÙ0*:'¸Â¼Òe3wTpˆ=Öl'–¦4­‰fZÛþ;¸ šhŠ, §IéiÒ: 'Iåa`å\pö ~;íbÞïò{Nnó ÎúËÉDü GLšÌŒ\œsù±íp°®ÿ´˜%¹ƒèSÀ>”‘=–òÕû_òuþ(Fx°ôgð«X´REÙ~Ûö‘œ{åa¬»ùD&M9ŽÇ:Öƒ¢×0÷ž;ygóùý4N9g‹S€}4#LOsî±G1qòå|Ñïüz¸”¯hicÆŒé´ël©õ¶—u¶äzÅþ“ ·Bd±Å¥Î{c¯¯È4™4(:Ó‡obæ¤ÕØÍ{–¥µ+)Uáó ™lïò"tñ´N­N!„b†7ˆUÉܾÿh­O¶°ë< eNŽpF8̱w=CV%-\\^ÈeE¬¨_ÀaŽ(÷–ój×Mœí îwfôk¢Ù.î7‡qôÉżóQW^ù¹qÖü&?ω¹ßx ¿ÁsK!¿ Ôï°´÷H†¸~þ)VôU,ZÑ›!¬X ß÷óY¡®aÁâîŒîÄÔë@–-â»þ[šúŽaxż¼Ê‚¿ Û¦7ysq 0`s;1) V_>ùy., ^¯¬Åœ_@¡»‚o—fÆ™Mÿ§„¢µHÐ[!²\R5ðè×ݹþÃþã™Û%Gw­å®©ßãwîî׿5ÙÊžt1¥¹ 'À›]7ñLÉ.Ê 0ÜǬìÝÕŒ~–æí1¢&}L¯t²¯¹ãý›y<¢½ŠPõÁcFôÌswùœÉÏ?Ë3Ï<Ãsÿ¾‚QiƒmÇå¬X´‰ö£ÿˆÁlXð)EeÅWËé7r]°d •;.æpá ‰™3¡Å”"Z·‹ÿ·zˆHÊœ ô(ÆmãBˆNH‚ÞBÑN,ÚâåÒÿ f}mæÖâž9Qî9f9=|û—´¬ÜCeÄÀὪåÀX!D‹;ÛÄR }¤ÖGÛ·,ìÖ¥Ì<ô™2"åöi=:0/fç²òBNÚÔ•§‚^jê^*À@K’éÞ •ñEõ<^\ÊUyÕœâ1ܧÀ”ÞéñFI™âéD.¿ÜPÌãÉ­Kx·²ˆç[¡Üv‘)½×{Ñ5þÄꀨ¦jù£œ}ÌT¦NÊÔ©“™8ñb^+kü™©ùn1é‡1ñÀ ‡QPH-ýŠ{`òàB–,ú‰—Òƒµ„|yälݼâÄíÚõÑúŽ¥šåÓ+„謤U«¢0âï7†‡bI§ÐŒ&´šÕüïÓïÙÜÁ’s*#®xû@þ4~ ãºȵ§øûäï¹öƒ¬ 8öiºs×åqÊàRŠÜ „X^ánæ‘ !„¹F•ãênH™ù8ºoû/±ož z9¡—9Å/Ý!Þ »Êžì‹Ò´‰‡9á“ò–S¸¬_5Ü…~ô¥ðâêhÖeGÄÓný¤/—[Ë‘}ªðÚÒÜ:y%×}0€55û8˜³&ŸS—pÔUôBÑbNu‡jyϪõeÝ~¶£Kê ¯Îã_Ee€ëò«8}KICÙ“ýYHƒyQ %É([œá¶8,IŠ›Èà.0ªÔÇífýš)Ìå7·ÖÚ¸+g[Væ°…Ö*ö¤!åå¼jCìN6:*¹ß&ñóQ}äÍá>³T3Ë›ÊÌpÒßj'l¯æO =m¡²‰·!ǨJл#3öåw¾ÃŒú—ZÝ{\æ'{´¨¢¯âñ??Î¥½“çþä¬$Ø4ç!f>XI£{1õøv•‰±¥ß°EÙœ²è«rœ–E|×D %½ˆ‡¯ÿˆ›f>ÎmI‚ë?æý9›è  oà/åž¿þ› Õr×åßìÓŸ/„•½…íœBa¯îDW¼Íú†Å4[/§tzOºn{lï|ò)÷.<¾}½=Rþ1÷ϯ…¼Q\rØ,zõ{:Øã›yﳨ…cùÓ˜bL«×Ôçe]‡{?ïM,eäøåx¬™À÷µôçÇ꽯‹º!hç‡j'}ó"ŒïYÿt'–6î~A!„b/X_Õ×ò.K›˜•ZÞmáÛ¸WCn~åÑËœâ,oÇk}Ͷ~ ø!iᇤ…çë<x },Iº˜Òt5¥)1¥ñU¼ ¯QÅ¡ègýϦ¹j8±ÒϿ╠@¡"m¤È¦fêvšRª6Ö¥ øí™iSšœúyËÓ&ª“^nN0Çéªá¸—kËLèæ¿Ïi|› ¶ŸDÓÖðè´!ücûk2¹~+ú¶‚lÌãú­Ï€4ßÞ>•OÍùä9,˜k>æ¶³ßä†´ŽŽ‚Éæ!Çk£ñ‘tœþ<†×¹ø=–úi eÏþ–aÙ)Èwf–Im¿= êª'¹ð¸‡Hé “ ›!AÚ–OŽÍ@íÜ8éͺю7×ÂÇ;§T¶Bt>ôBtÊŽÅët º`ˆ4 G#„l](ò9ñäŽâ·y:`AÕS¸ @'Ž¢¨*ªÁ˜Õtà_ z j ' *ÃeIsëQ+¹ò½ü´¥NÞÿÁOß¼v“Ê„^5¼÷ƒ¿ù-„¢S;ÞÆWŸÙûbUÒ¼Û̃&8¢ø*¿óù(âä§Ìf®Ó |·ñínæ»:¯ºáÂHc*“sëøª2‡oÞèšTJÓF4Ò6SnJsœQã353-œ6SEÐ)2¥éjp½[Å Ù¨êXÓfy«˜âSø¡¶ˆYÑ(w¹ÔŸ•ˆjÙ|D(ö·¿˜¦îq´níFiÃW¸}gJ‹·€­­à“ožïn·eÀžS„}‡©&W>Å®íWÿóí¬nrýMß…i´ûðo·Bë.Æ)Z΂ :í:[j½íe-¹^±ÿdï-„hçtÊ×nÀ~àz7ã™(>h…Ö±QSðú<˜ÅíÆ SZ¢rÕ—<÷öG<ûÞ'¼0ç{JÛi-xôëî¼²¼§EåÆ#V“ïØûbæs×åOgv Sú6ê/„Bìð[O!ÍÀ«a)¥Õ–š;ª3á0‹¢ó—¼ìhf½9½ë¼,Åå,ˆgFÛÅUËÁ‰<®­ÊçÚ€…C}aF¹ê(ŒäsUU>³G昩Ä`D<Ÿ««òùke.¯%PÜ[ágfU>³’I¦ÚÔFïÃÖ&B!„h?$Ó[Ñî©e_óôü1œxâ‰LNmmd¹Šgæn$Ñw0qGwŽ?²'Þ<7[~ÈËè1åpÎé%i¶P÷Ýg¼lß/Ÿø¦³ÊÑý*Èw$¹uòJþïÝAã{þ5Mùì§<Ž: ’þùazæD÷)c\!„hÊ¡Ž(ÝÌ™¢ao„ÜDµl±vns£æFLtDn‹s’;Äk¡¶½±®‰ls“5À¿¶ëµ™ã¨â[_Å9Û¿cóË×E¯Ü`º¿|‡‰5ܽ‹ÃÒ´‰dz !„펽…€Jåê/yluãßXщmZÆ«_Ö°-™;ÊoÎn4oråûܵõEÕ×ÜóFËŒ¶¥<<¿^[ŠqÝtñÄ™9i5×¼?€DzÏOÔÞÿÑÏQd²¼éWÁÃó{¶Ðh…Bt6Ó½ARºÂómXÛÜQÇ([—AãϹ5Ì‹:¨lÃÌæÅqi]Á´“ºÞ­í»„u÷3 !:ScûGf}f•ȆOxüÎY|RÚ¸ao¶PòâÆG®@à$f~ÜD×Ôl x9ðäßsîqÃð[tBsïäâÇ–’=憎â àÏ¿›@›‚ZÅìîâù¥uÒ”;KÉ%k!„è 4]áöO`IY¦aTÿü0WºÃ^œ4®¨p±®>»{RŸjœµEÆ*„¢sbM0Äš9É~?â¤b7%,Dë©T<È´z´(:×åWµi™“°f`qš?Ê]oBˆŸSœ%”„ß⪓&0þÐ)\òIO.<ÿp|Ùz“âçÈ ŽÅòC)ñ¬½ÁÙHi岋¹õŒ£™åùäde„MÁÔœPùÏý@Vônh’u'M®ä_{‹-¦< Èw[²j¼ŠÑŒ)¾žõQ7~,ë(7™0eÓ ÅÏdåI!„û.’4r݇¨ŽZøå¥L݋ƔsÖæQ—ÈdàÛ¿EvâB!öC¾Qe¢# À7q«’–6‘Ø‘ÜT•O´¾võå9ŠMmwCù»'Q½íOUß ¹K=o!ÄŽ Vœ.&€‚ƒ†âYù³ð&Y¥à(.8®œZ‚jÊÞï3c×A ”QtÞÝÌzìqžxøFΙ›UAo=8—ç>Âå×ÊÁÊï®9ŽÚYϱ4«ÒÑÅö²÷/„bŸUF,Ü2÷€†zÞçý‰ƒŠêv³TFR5ðÎêJÜqÆv ´Ø8…Bt|¿t‡0×—ÚzYjyg­Ò´‰Ô—9q4®oÃ2'!ÍÀ!Wm=#©+<'w%!vÃP0‰ó§xæ©,+Å 0ù‚c)½ÿa¾Ã‚’U!äŸS¼yMñü›™qò‰üzæb†^q‡¹³hÌJ’g¿Êƾ¿â¼?]Á1æÏy}ic Qüœ½…¢ƒZUåâžÏ{£&ƒÎ_&þH‰;¾G˾³ºUÏì½ORÚ‚£BÑ‘™“ëKe”§M|ÍŽ²¢io„Ü|Y_Îc´-Îo={vÁ¼%<ôiÃ,ëg‚^J¥ö¼bß(Ο9š\Ç[5æ, )+L¹c6ßÏ?W€%Û£Š‚ºø%ž\ÅåÏÇ^ú?ÞZÓ{gOÁlÅ?•™·Mdá%ÇrÌÑG2ãõî\ußy µµõÈÄÎÈ^\!:°yësyæÛ®L¾ —%ÍG®æòÿ "œÜõ×eħër9¼w5ýóà )ªcüæk IDATY™d; !„Ø;“Qò™û½_ »P÷¼·²h:psU>/tٌǠqYn _·QIš€jäîš\¦:#­¾í¨®ðtÐÛêÛB´Š{(çÜx.¶'/áÆE*.[–E••\FOIß¡#xçÄL8Þ`¶a:áe†¼#gÞû5mWĪ1µl3eÞBJìF6h€Ù…Ô&‘ÈžÇÐqô[ü<×Tº(ðCðã‡øïñ2¶çc,]™…µm„½…¢£{iY =}1ëUM‰;Î_&þÈ_?ìOZÛu.‹ËJ˜Ø«E_Ù"Ao!„{í´úLá”®ðŠ”6i*U#wTçñ7¦È휹¥„Pd]¿vñV¸mËœ!ÄŽÇ Î˜y>9Ï]ÂÌÏb¸ìÙ“Ü@¯à¥óFñxrëc®ÍoÄŸæÚñ{­Y•™®oø˜µ»8ëÈyÜñþ,Oàè’oxôÇ4ÙÒ~3¾q#ñi‡2*w%KC:öžW²‰O7km=4±ôBˆNîù¼7®ýa*ªãü±?ñÀ—½v¹ÜÆ Ï7ä2¾G Êëà³²RN<…Bì™þ–$C¬ Þ8©U³0( šô^ÄÉ0[œiî]LinȯâÏdO¾B´ßáÓ9cD?ŒÃßaêÖÉêf^ºüwÌZž-ùÓF¹E8¶{í6+…xm8®0–òß¿ÜOÑßnã?°£Ö.å?×ßÈ7)KvļI/‚ëg_Å5=‹ CjÞ}ïÕêXä'+IÐ[!:´¦póÇý¸ë蔸ãLí[IEØÊ‹ËJv¹Ü‹ËJøE`ƈ\ýÞÀÖ°Bˆvï×ÛÕƒ~I²¼Û{jrdI2Èš`‚#ÊYÞ ”üBtª_:—¡%w˜nÄ™çÇ“-ÚFÒ|{ûÑ̳øÉ±gãMXêæqÇôw¸)­ƒÁ‚ÓëÅ•Eï§bVYûâUœöd @1as{qÛ$â­$è-„D0nâ–¹pÇ”ïqZTξ‰Šˆ•׿ít™µ5lò1¶k-C C +®cq©”9B±k>£ÊQõµ˜—%¬,OXÛxDbo¥t…«+ýü»d ^ƒÆ9V$¬,ŒKÇ.!DçfpäQìØý|ÙEÁâ- õ;4ì9ÅdÇ›g'{/¯°¸rÈ—›ŸÛ,«´/„¢%ýppËܾ õ¼/·–ƒŠêv¹ÌSßtCÕ3óŸ3rJö\lB‘¥Nr…±*™b/K–w»Uš6ñ×J?:™ÇÛ *èfNµõ°„B!vK‚ÞBÑÉ,)ópï½Ñ“AçÚ‰?Ð3'ºÓù7í|ðƒ€Þ¹Q&õ®j¥‘ !„hŒ üÊ J5òAÄÙÆ#û㋘Çk}¸ ÷TcTÛxTB!„»&Ao!„è„>^›ÇÓ‹ºà´¨ÜtÄjºzã;ÿÙ%]ˆ¥3µÊþ8z=v³œì !„hÚ¡ö(E¦L#¯×CnRºÜ"ÔÞ=Rëãú‹ÝÌ)-*ÃmÐÚxTB!„;'5½…¢“zé»büÎÇö¯ Ï‘äoG®äª÷Rn\w53óÊwEœ1l3N‹ÊŒ›øçüm0j!„ÙnkË”®ðŠ”6étàæª|ò*£mqz˜Sý) !ðÝÅÓ¸ÔIJU¸ïËÞè:( \rÈ:,ÆìºµÙ:h*W’‹½þ§ìä„¢uýƳ­9ò už6‰h QMáÒòB–%2Ç»›S½¨+£»ÔRäN0¥o%ËÊ= óýeéÜ·YŠNᨪwy|­ŸÉSÆ2£(†n7Sºp.ïmˆƒ­„ÉSFÐ%µmúÜíÖdë2”S6áÉqQ»ð^ÞècêÑ#(I%±¸`ùœù*ïH.§"UǼw¾e­ôçBˆ}v’;„CÉÜ$YÞ[D3piy!ͯbª3‚IÑy¨¨ŒGj}x?ì¬ ´Äû¡?d,ý·Ìá…A”œá\<¥? 7.ÅÐÄô¥Ë¶-çHläwÖ÷ÄÅÇöÃ_ ¸x.ï¬ a8…Kæ3¿\Á›ÜÈÿ[K¢F/„…QSÝ!jU#Dœm<"ÑÒRºÂ_+ýlH™9×W‹8ÏWËx{Œ¿Uç±&iÙçuï 7ß@[‘LvFx¼Ö×ÖCB!:=)o"„¢®ÃÃó{òÄ7ÝÐõÌ´ßÚÀ5‡ýˆÓ²- zmƒ‡ç÷ÀjÒ¸cê÷ä;Z¢‰§‚Ïk#£Z¨ŽZ‡¯Òôômy…:Á@ ‡CmN<šŽ§ïhN;r<ÇÈÁd4   ÖѸ%©Bˆ½q”#BQ}]çWBnºê tàÑZ—–64³lMðïâR®Ê«Æ½ÙÚ%¦4ý,í«1øöÆÛcm=!„B Ao!„Mxey17ÏíK4•9ߣ†‡OXÆÐ¢mM¥>\“Ï;« p˜Uþ>e%¹öæë‚qrs\(€Áã%'RG­Þôôm•4<^7f@q¹ñÄ¢¸‡LñÆÏyáÃÏù`]$Óhˆî !„ØggÔ×2Nè /„Üm<ÑÚ¾ŠÙùÍ–>¬Ïð7+:ÓÜ!Þ躉s|µä÷¼~ØðvÞ r5o/þ^!„B´ c ­wÇÔŽ¦R=”&žïjZS?•=|½«‡a'¯·ÿÙÔãè=zlˆÉA¢ãÙ\gçó ¹ .‘cOá0«ѧŠwœïÊ=$TßlöÒ#'F7o·5ͨ®AæoÌi–ï;_éýžÏWð ;˜ÃútcØ.Vñ5߇Tb5u¦¯¶õb´m3‹’]V`%¿kZ@Õ× Xt3vD_z’›ˆâìÓ ¥N¡›q _nŒ!¡o!„Ø7#mqfÔ½g‡ÝRÚ¤“Šé>Š:ù>ia¨5Û aUtFÙâœæ ÑÓ’"¡Øœ6ïrŸ{¬+ÌPkë‹GüœMs¼MݯÌ0˜sP––J¢--'iºîñ4î!`0H~Ÿ•¾‡IKŠÒT(2û4õ÷„B¡†ï¶ 6”ï’¹ÁjO4ñœ&žwh-õ ÈÖ ·¡‰çF~à66ñ³©Ç}‡zèAŸÕH%X!DÇe1jœ1l3'*àdö‘¤‘W–óÚŠ"4]ẉ?0ºk-Á¸‰çôcU•«-‡-„¢•Ü_XÎ!öðëÍ]X'Mü:=³¢s‚+ÌÙÞ …õeo¶ k¾ŽÛX–°²8nc}ÊLPÛ ¼½ ‚IŽèÏ–I'r9­ÂFWK& Ö5¦äV1Íòóóv}?ÁGüœ— ò¸/¹ß™a7WåófXŽƒZZïX]ºtiô;£±¥òû„mekp8•J‘H$ˆÇã躎¦ièºÞä6Ɔ×ÍüVEQ0 ˜ÍfÌfs³]\SÕÆ‰´›7onønûì³Ï–—êNZ?õí^ëÛMÛñùÎå»z½«Ÿ»›Æ.¦5{0^.? !„Ø¥¤jà‰oºñņ.9d=|1œ•³†oâøå¼¾¢ˆû¾ìÅå¿XËÈ’ ^[šÛ§¬ä±¯»1{Ua[_!D êeNqp} ãÏ¢ x Óäò•›·Â.&;#œà 3ÌG\‰Ž(wl¯M™‰jz˜›.•f²¹ÃÁŠÂšÚ"îOø¥E%ñsAD£»’æ—¹ T{ùQш«ð‹Ü*NHåóÇhšq&¨NZ1¸+¹Òfæ™j«ÐIèi~•`LºøGµ-I3~oWÚLü§ÚÇR4MgdN5'ènªµb2ꄵ4§æ8d‡øj·ü B!öÞÖ`w2™¤®®Ž¢¢"¦M›ÆÄ‰),,$//€êêjÊËËùä“Oxï½÷زe ‹¥!8½?Áï­Au]×I&“ÄãqŒF#v»].²e1 z !„Ø#++]\üÖ`¦ö«äŒa›ðXÓäØSœ=r#3FndΚ|>û)ñ=«15λžCºxâ›î¬©q´õð…B´€Ó½Á†ÌÚçë—[RW˜v1;좫)Í‘Îcì1²&°(?Oèê½›@q:áaf¥E7±VMpQÚPw²Òãáü(¶”ƒuîj姉Eüü!bá8 ÔâœÔÌáì õi7ßX«¸ß“&œpñ¥j@†8ççE±%r˜Q—™ï3K5³¼)Hy9/िÕNØ^ÍžzÚBe1×>4ðBј®ëèºN]]>Ÿ;3ɓ'7™e]\\Lqq1Æ ãâ‹/æƒ>àÞ{沈²«Õ ìÖ·®ë ÛN§Ó„Ãa, v»}¿Ö+Z†½…b/ùl)þ2ñGòìÉγ´ÜÃ}_ôjÅQµUWøßª>^›Ç1ý+8yP>[ 8¢OæÓXʈŨa4è +®ãþã¾cáf¯¯(bI™GúF !DQ`Js‚+ ÀŠ„•oâ¶6‘Èf›Ò&ž zy*èÅªè ²&èiNÑÝœ¢‡)רbStz˜SX•Æ &k7ú#XX"‡‹«] ,ãòMi¬€®èTG}ÜÓ0¥Í¤L :à3ª˜P–6⯯Ýí±†™ÄSkJcEÇ ”¥MT'½Üœ0`"ŽÓUÃq!/×–™ÐÍ~Ÿ³óãA!„ûN×uTU%0eÊn¾ùfl6[ÃïvEQ&OžÌ„ ˜9s&}ôQCÖ÷þ¾·–90›ÍFR©ªªât:ÛMñÎB‚ÞB±—†8° ´Ëy6;öm­Ñ”‘—¿+æÍï ™Ð³†©ý*èÏ>ìæÆ5ÉFw©et—Zt "l¥"bA×bª7¿/jåÑï·Uå§€`ÜL]Bv—B±£éžº†,ïK–·Ø ]áÛ¸o›¸PrU^5ÓÜ»>β4ÐŒÄ[ëx+,¯Ëa­Œ¿;5*C…,ÜÉá˜ß¨²%mD#M$îæ="ÛÄ|¦4]Í®w«t#UkÚÌ oS| ?Ô1+å.—ú³Z⵪Üê.„ûck†w àÜsÏåâ‹/n˜¾7¬V+·Ýv>ø O?ýt³e|o]‡Á`Àb±J¥ˆD"¸\ÒÏ!›ÈY¼B쥯7ûxguÅîx£ß +®kƒµ¤jàÃ5ù|¸&Ÿ®Þ8‡ö¨al·äFQšÈÒR€BW‚B×¶Àcë`f³XÚÈwen¾-õ²`“Òµ­‡$„mªÈ”æ¤úÀ䚤…9gHt›vR>ðpM…Ó`œ¯Š®À¶# îö8`O¨›’$Ü|ÐÄo‰»–QUùü)¡¡ë)¦åi(¯ÙSì 0¢:Ÿ«*6M!ßUïqro…—ÂZ’©;¼j$è-„ûlû’&S§N墋.Úïu^xá…lÞ¼™9sæ`6gö3ÍÙàÒl6“L&‰ÅbRê$‹´TÞýŽëmj;JÏw5­©ŸÊ¾Þú04ñܸÝsÃv¯·ÿÙÔã¾C=ô €Ïj¶j !:·§~µ¿3ÉÂM>n˜Ó¯­‡Ó*ÜÖ4ËëÙ¥–!…¡Ÿ´;"]‡/7æðêòb¾¯”+ùBˆÎé/yÕœ\ô¾²¢€£Ò»A4qö÷–·õ0ö˹¥Å,IÈò–Ö;–)­×¥K—F¿“ÆrB´_[›EÚl6^ýuŽæ9ƈÅbL›6ÚÚZŒFc³–"ÑuMÓH&“¸\®½úRÕÆW]7oÞÜðÝöÙgŸ-.Ô<´&~êÛ½Ö·›¶ãóíìáë]ýÜÝ4v1­Ù ¡J¦·Bˆ½f1jŒë`bïj†1ölÿ”Ö13ᤠEѱu~¬q2ï§œñÞqYTŠÝq13>{Šá%utõİ™4Æu0®{€¯6æðÐW=©‰5•&„QSšãëky¯JZ˜+oÑŒ'l$u¥Q£Ëö"¡+¬JZÚz¢µ˜ÇqÍ‹GñÅi7òIÇ®n(D«Ø>ËûꫯÆn·ïuI“±Ùl\pÁÜxã Í(›+ð½µÔ‰Ñh$‹I™“,!Ao!Dû¥k5c+7‹Ð€´b„Nؤ¢ØàØþåL> §åçW¤u ×ÙJ«*oÏÇ_~”¸ÚyU»zâüzèf&öªþY¬?­),Úâeþ&É´sGmÀkK7üþ…¥%¼¹²ˆ`¼ýïnҚ¼õ¹Ì[ŸK¿üŒý‰¾y\–4¿†¾(O/ê&'0Bˆ­§9ÅÑõYÞËVæI–·hEí6èý¾Ô·ogÒ$Ó) é&'–ðìMî*བྷŒ½g\|%Ú„ Ï~…-rÐ(ÄÏlÍòŽÇãœp  †fËòÞÊ`00iÒ$þûßÿ6{¶÷Öu R©TCÓLÑvÚBÑ©u+.¦{I ±Xl·;DƒÁ@UUš¤š {—’ýØf!&£ÔŽ;·5͌ᛘܷÃv·o ÚxïG?üè'”01µ_—ÿb]Ã<Ë+ÜÜ=¯7åᎹ£_]åäò·ä¸þåœ7f=§ .¥Ð•àîy}Hk’á%„è˜þà«ekÞÒ¬Z_›ŽEt\ïG\\’ÀmÐÚz({¥J5ò¡½;ó0ξë(¾øõÍ|Ê8®~äÊæj ’‹ÝãE_ùn¿o[¶_Fñ1öÒ;˜ÿ'Wþë[~/71àˆƒ){ùs-‡÷|çÖÕ¾Íã¸êƒ˜ÿ‚‰_Å‹ïàô»4.ÛqÚßçaè} ^þkFù­(ñ Ì}ü—`êíÓÿ¥3¹{a ¸îù+1ßÿnø(„nÎeOÿ†µ—\Å›ÕiÙ/™L2f̘fxo5zôh^xá…Y÷Ölo zg z !Ú1“Ɉ®CMM ÉÛ³X2õu,–}ß™L¿~³u@%g܈Ǻ-¸¿¢ÂÅËß•°`Ó¶ÛÙ3t3g ÛÜ0Ï KKxvIWZè%kè:¼µ²UU.fNZÏ–bBÏ Üþi4¹µYÑÁ ´&8Ê`QÜÆ‚ؾÝ5%ÄîD5…WCn¦{ƒm=”½òtÐKJöÿƒž&¥§IëIRycXy:œ½Ž„Ò•éO>ÁiÃ?ã‹ëçW¬pÚuœkœ oùЏÓÊÏ X‡rĈµ¼÷D)ËMÕÜ}x?^\·’4€ž$í?Š3žÅ5Çÿ•ï’n òÇ7žV8† ¯?™ðí§sÔ§U»ÿ’;¹š_®¿œOçWpìÀî®Á4x]7oÄ8ü@¬}E²ë@¨YÀ‹Uzæ _ˆ,¦ë:ªªR\\ÜbA"4MC×õfÍò†LÐ[Q4­}]´í¨$è-„h×Å€Óé¤G»Ý)*ŠBii)º®ïWý.ƒÁÐ}…³G¯œ(üýá†i‚vžYÔ•/7þ¼áäôá›8uH&Ç%©¸íÓ>Ìߘ]M)[Úê*'W¼=ˆY'.ÃbÔߣ†àÿœß³#L„Œü_n Ù>è\ßõ¢õ=ôr’;„·d{¯IZx)äiëaˆ–’\Ì;pååá&ΚÒŒËsfbÈäz3F}εÍ%洳㙆cä¸ìmHѾx‡ ¿Ä ¯déÖæ—Êz^{ð ¶Øü:šžfê;ޱµopÉ2…¼‚BôðÇ<óÑ9ü߸.¼üÍRl¿€OYO—QƒXóü³fŒb y>ëˆsÉS”JÀ[´º®SPPÐbë/,,l±uö2-¢íIÐ[ÑŽ)|þõ"ŠóóèÛ£[¦äÈn ›6mÚë­¥ÒiV¯ßȧó’L§èh© pÂÀrα³1s‚Kù÷â.Ì^YˆºCæÒ±ý+Þ×}ПåîÖrÖ([ùýkC¹û˜ä;’Û¿‚ꨅ—í{!„È&Ǻ ±fš¿q²$!·ìŠ–Ò ÜVÇŽh[eü§ÎC'j÷Ò EH¨Æú£Fômg¦1œqv}ý‡ãŽ×i9ž>ãä½@GQ‚¤†=ÁÒ…ñÌÄâµëIjt¨£F·5Íå¿XËØ®µ Ó>ý)—GöàÿÙ»ïð¶Ê³ãß3´··³²™!„M!ìMY¥ƒY:(/¥ÐIiiK”¶P ¥ «--´ ”2Â$Œ„@ Œ„LÈö’eÉÚÒ9çýC¶ãxÅIìÈvîÏu9–¥GëXúûÜOcªs;—#FFÚzYgò*ß™?™U Þ½6ߨ!içû/LâÞ³>@U,>{È>ª÷²¼Fª¾„ƒ›_5ùzK•wÒRùMcI‘g$ö/$<Ò#[ _ø·Åqæ ~÷ùbÞúß<ßz|#íWþQJŽeöðÇùì´;x§å¾“îäñ³fà]ºˆÖs+èŵßf…ëi*© L…-&€FiE ±†¦cÙÇ_bÿcg°ãbþ‘N /‰pþŒ™¨>aÙo¡ôÖE qŠ¢PWWǘ1cúeüÚÚÚ~·Uëb–¢ø$ôB ^ŠBÆô>b8e¡þ=ÕÚán g¤ÍÂ}ûW4óÍ™ë(sgHd5îz}¯oìúç9"æ›Ç­CU,LKáöEûíów« M.~ðâD~xâjTÅâ›3×qÝSИú}à…C×õ%m >Ü ÞØýaB1Xuÿê¿™Œ’äåŸÞǬoäÂe7òØú|Û­ªfΦlÑÝl-«¦ºesÅó¼ûÍó92ø*/Ä»¿ý¶üêçyÁñ}.8|÷.£VÏæÂ™Q^¼q *+ÞMsÑyÇÿßwiF·cþø<K=ˉ¾ø ±whšÆÆ=zt¿Œ¿qãÆ>ïåݪµµ‰„Þƒü/!†ŒÖ?0ýõ12¡žŸžüQ[ིÞ˵ÿ=°ÛÀÛ®™|{æZœz!üxðí‘û\ïY¶5À_—Úš9®?j}‘g$„»ïHWг¼…DfMÖΣ19{E1Äh¸rî3ÌŸ?Ÿùóçóìã72c—êTUÇ™\ÀÏî®áŒ¯š ö–o©£8a¶—… 6ìP3£ï3É8N<¶¬×Ø ëy䛽è—<úØßùóÏæ°íWßåŸÛ ±NÍ{ïák±di  Ô¼ÅR} îåïÑ¿u­Bô-]×yíµ×úmüÅ‹÷ÛØ­ qÚíö_Yô»þ*Uì8îÎZ*½ØÖÕg¥—_·~¨]\ÖÚ]VÛ}ÝþsWwwÜq,jÌtñð„{ËqSÆóÀÏDi0د÷SÛæó7}‡·?î¾ø#Ÿz—rO–¥›ƒÜúÒÄ~ÏžP‹+§o⼩5mÛþ³¢Š‡ßÙ©ww{_9âΘTÀ‚õ¥Üùê~ý>×ÁHQà®Ó?d|i¡¬æ×¯ã…ueEž•BìŸjò·a[©Ðó–ÂÛªY™•7qBˆa\ª€áÇwú^ï­ÏÑ\ß@¼}?ÕMI¹ƒT} gE'išêZ.+Ùh=Ͷ2J]Ù¾g¤"„:¡R6 O¼!‚(Ç·Cn‘iª'a/¥Ä•ë0>`u¼Ï–Íù±hœŒa‚¢ãôð9uÀÊF©gq•µÞWŽX]ig)å~»´7^k±YxF_p IDAT:ÆápðÔSOõyÅ´išœwÞyD£Ql6Š¢ôiÕ·ad³YÀ.ݦ£-[¶´íÛ-Z´¸0ºù0»ølµûÚj·­ãåöôòëž>ïl=lëóJCio"„ôv¥;ŸÏ“ÉdwØæt:zõÂx¨T|»lßš¹Žà ý»³†Ê/_Ç«zîÑzÄÈH[à½5æä¾%cú{ªƒ–eÁO_Ï}g€K7øÂŒ,Ûè²?ºB Tß, S¡’ Gc~ ¼…C _y5]­ ä¨t¶\rl»  `TPÚÅ÷4Wˆ WûQt¼eå]Œ®àVPXXë0> t¼Ï–ͺ‹@©«ÓvÅ ¢zÇÇæ¯¨FÎσÝn'‰ðÄOpî¹çöéØóæÍ£¡¡‡£ïän­òn Ó‡Bv0ØIè-„2zóGeÛ¶Z–¼¹l‡mÇ}8UU}2þ@WâÊñ£9«JNÚùÑ‚ ¬ ÷¼H”ËfpíÚ¾þùÂýH大kOjãy{_>b^{ž+§o”Êx!Ä q¾¯™S=…³UVgíü¡©ϦB!ľ­µâZQ\.¿ÿýï™3gOß,hœH$xøá‡ÛšìË*o˲0MÃ0ðz½C"; ¤§·bHèm_îd*ÅÖm5;|¤Òé}¢§÷È@Š_ž¾¢-ð^ßèækOï¿ÓÀà²i›)méûý×åÃYר7/<†ºÿ­ªä㈀YãÂL.yFB±s:2ÜXÒ@ÂTùN}9ÙZ_ !„BôEQ°ÛíÄb1n¹å–>÷Ö[o¥±±±­»/Y–E.—ÃétöÛ"™b×I¥·bHèu0ÝÍuzsÛÁ|O­ˆóýVãsNS_º%ÈÏ_O:¿ócŸJmmM6Çœüãƒaý:סÄîyc ¿<} ð…Ã6rÓ3Sû¾Y™Ø§ý ¬™î$O4û0‹=±×=ó6úîÌ› =ÏÏËë±+…=ÕOÂ¥lÌIk&±÷8‹¿ ßBÜTYœêºÃÞôVÚ9 æ!„û‚ÖÀXUU<‹/æÎ;ï䦛nÚí÷㊢pçw²xñb4MCÓ´>«ònÍ!r¹º®ãv»»ìÑ-ŠCBo!Ä>¥«¿“ƒ9ÌîcF7rÓ±ë±k…8lþÚrî}cL V¶R(,^©*pßâ1ä 9r½+V5xY°¾ŒÙã˜\ç¸1a~RZìi‰!â\_3gz g|.-òlD1Têyn©ïª_ì®óª&wWÔµõñþ{ÌÏó 9³Gì]OÜ„O-¼f™dÏîäÚýïoœó¶ 'nÊIÒB±·(Š‚ÍfÃãñðïÿ›-[¶pÛm·áv»{ýþ]Q‰?üáY¼xq[y_·4i ¼}>ŸÞŒüåB ½mobuScÛÛÛ6gO©åÛ3×µÞ]>œ»_Û«À`æØ0Ë =]_ÛPÂ{5²ÎîøÓ;#Ú.æà-¨Êàû]®X|!ØTìiˆ";Å“`rƒnÕdnU ã[ÆZ˜tó«Æž8¢¯´åÚï"¨\&…b¯i­Ân ©}>K—.å /dÞ¼yX–Õm¥vëv˲˜7oŸûÜçxã7PU‡Ã±ÃØ»£}ïî\.G6›Åétâ÷û%ð€¤Ò[1赆ѽkoÒåƒ2Ðî‰\9}çï¿ ÃR¸oñž[Óûj@›fqÙ´Ídò*s—Žê©îêvæ­¨âÜ©5Œ¤9a\˜ו{Zb;Å“ B“×û:ø| Êw÷ ÚÛ¯šü¦²¶-ðþ ãàæúri—#öº«h¸|¡¯™‡£A’¦œí&„{Cû6'­ßétš_üâ<ðÀÌœ9“c=–áÇSYY @mm-[¶láõ×_çÕW_¥¡¡Ó4Ñu]×ÛëÝ ¼[ƒv˲0 Ó4±Ùløý~E!ŸÏ÷éã}CBo!ÄÐÛк«JïÞÆÝƒ%wè&ß:nGŒŒÊkÜþÊ~,ÝÜ¥qΘTK¥7À+«hHÚû|®û’~PÍ©ëpê&—´…—×—öºâ^ˆ®|Ú+öÄ1ˤT3v«·wµžçÞÊZFÙr¬È8øZm%iÙ?‰½¬L38Ù“(ö4ºäQMNóÄùW³¯ØSBˆ}FûpÚf³¡i6›T*ÅSO=ÅOŸë¾¦)mã™Õœ7µ†*_†£GGXô‰´»g¼=; zÝŠÁ¦XœàNòø.rGºRü¨¬PËï¤ÜPWABz‹"8É“À6€ÛÍñ$$ôBˆ½¬5¤nmI¢ª*º®c·Û;…ݪª¢(J[8Þúuû1öDûûk ÛÅÀ&¡·bÈèêŽeYlܰ™V­Á´,òùέ–½ó>š¦¡ª*S§L" v;Ö@6¡4Á-'¬¡Ô]Â64¹øáK©;vy¬3&×ásNÑúׇÕ$s»^=(:û÷‡Õœ5¹]µ8wJ„Þb·ïN{ b€9fBo‡bñµ’FÎ÷5·-ð³0éææúr©ðE3Ð÷k‡82xUS´Bˆ½¬}XÝÚbDUÕnߟw¬Àî«…+Åà#±…CBw OjšÆþûO¦´¬„d2E6Û¹22“É’L¦¨ª,gê” m@ÓB–§N¨ç®3>l ¼—nrã3Sw+ðvè&çM­ ’²ñß*ût®û²Æ”—ÖzyO.3¹<^ä‰Áê`G¦ØSÌ gºWU²'z<>| ´Þ&ð»Hˆ›ê*$ðE£)pÀ߯éŠÅ gºØÓBˆ}VûE([«¾»úèx=±ï’Ð[1$ôH;vŽ<|:#F ëòûŠ¢0zÔf̘†ÝÞ}ßêz»mßž¹–ëŽú¸mÛ¿WTñ£Hífuöië: =Ïþýa5YCþTô¥ÿ|XÕÖGþü–ƒ Bìªñ»ÐÚ$(çò&;íÏsI§Bü$®÷¸Pao®Óë9ôáX=I&*¸*jÒ 0Ù —Õ{è:‹az׋(¹U‹s¼qþ7r?/¯§ªåzõ†Æµ5U< ôz} !úÃ(=‡c·6i5NÚJ !DÑu µ»ûBÚ›!†ŒžBi¿ßÇÑGÆü^îÔ×»¤$ÄGLÇëñ È`»;“Ëã|ó¸um‹M¦ò÷-Âõ¥»=¦®Z|jÿm@¡—÷Ó«+úd®b»Q˶˜>,ÊÑ£æK³µÙYìi‰ADW,ÊµŽ­š4^Ž”òDV!žs°YÍ0Y³ðºšøvÇ¿œ®7ïä~zsÞÚ“±Ì¼Ÿ4gùA(]”®ÐñmSû9©Ež_{#m96äl¨ÀX{–ƒNò$˜jÏâQ· ÈX ‰ùùc4HÒ”7…¢ø*»8`“Ï”ð™X†?•'ØõóÖzoWö1£º9°$„Bˆ§Ø¯Í…bõ¶ýˆßïã¸cŽäÕ×—‰DBà}ì1‡ã÷ywzûˆ»lŸ=d çNÙ^%¼®ÑÍÏŽgklÏÂÓãdž)qª¼ÿ·ª’t^ª¼ûüULEQàì)µÜÿæèbOI AÍ J3¨ÐóTëyÊ4ƒ€jâRMth[tpG³BuÌBaE¤šGìõÜá)„œéd³^~VÙšµQ¨ã:«”ëó~ãts[“]³ˆ›y.*pTKHžLTpÝN®cnîlðÑr”©ËŒ”ü5`­b€¡0>棌ÿËGøäËÉÕ¤\3j!Í ¤š4ƒ jâP,œª‰­Ýu˺ܯuÍ2Ìm°V1IpLI”\c Jûç^*ÃQ¦›õöÍñ n2"ÜÈaeC|!–çÓJá9ü€êä“´[ûºV#l]?÷„B1ðHè-„zÛs»¢¢Œ#ŸÎó/.DÓTŽ<üPÊJKzuÛzÏÓÈÕ‡mlëÝmÿ]YÉCËF‘3ö¬ZO¶^Þ©¼Æ+¥—wygk€Q£)æŒoàÏïŽ ‘•ài_Ò vd˜dÏ2Ù‘a¢=KÅ.„?½WÓ|¹4‰3âò˜“œ»°½6í"î s‡?‡•·SßÅn¤§ëlˆØì®ã.ŸAS¼‚ù)زÔÑÀoýyÈøRØË¬–õ ¦¦¹"”Bφ¸"ê$çN°µ‹q w“çXw†áJ‚ËÝ[cåÆ>­*FûæU15ÍWËxò~¾Òàåí¼‹Eö0÷r…ÛD<œT§uYM)ü|®%qäý\×àe«êÕ¿-KÒ«êp{·ùZç”ÅR2üEIp¹;CÄ4ùVÂÎ%Á<‹“:Gù³mÁ^oV‡¸Ý¶èò°É]Ïo|y‰r^ìf½?…ÎUéíÙ‹®3\©¶mͦʦœÍyM9ó:e|’ÚmbÄžS(„ÀSìYFÙrŒÒóŒ°å©ç öÃ~¬•e¨”ûÂ\íÊ“J”sMBáW^“ï´{îí¯ê¼ÝžÂÛi4ƒ£[ö1sr÷Nö‡îAЂE!„z !†„] ¤««+9~æQhšFUÕ®µï(Vð=±,ÁÕ‡mdÿŠæ¶m[bN~»d ïnó÷É}Lel¨¤¼°¶ŒxVþDô ø÷‡U|íèqé'¯gÞŠªbOKì*…ÅÚŽr¥8Ú•b²#ÓëV’–JÞ‚¤©¶õdî­=P ´õ÷íkäÌX€›kt,[‚/„:÷«íþ: aC¡Ân¢[ŽòÔç5ªœFáqé9* ' ívAÍ@,tÀèfœÎ꺻ނaí©2[7 jyÊM'çt¹?Ψè¤i´ ¤ÝmJõ<ö–Û”N"”éy(ÔæuÂÙ·ïæç\æŽ3¼ÖË{¾ Œ$×´U”÷þgµ.§QåÚqÛÇy•ò–mn=O¨›ûïªËÎøT“©Ž S;,"˜´TVeì¬ÈÚy/íä­´“˜)gÿìËܪšÎ;2Lµg™âÈàSwïÐHÚRȶ,œ7UŠEi/ƒrK±'ƒÜž2Ñó6rºBI‡çÞѪf½ó¾¢sè½]oö‡r H!„<$ÑB z­Aô®Ò£GètûÞÞÏÞ´E3Ÿ=d UmïCž5Tþþþ0ÿ š|öb=·¥ÊÛ²àI©òîw‹>)å ‡mÄc78e‚„ÞCÝx{–Ó= NõÆ»èÇ]7UVeílÊÙX“³Q“שËëÔÆŽg<7r%}PIÎ)L 4pJPaMS÷'“Üé5vN»¿ŽEPµçU, b9õd©Ð ¶å5Lò·Q«ç)WzzÉÙõ8;^£ðoecWtØ †ó:²8 °j°Ÿ-Ï{„[|ª¥±É°Þá6õínS¯”(ZËÏÀ¢JÏ3¶ãí+r¡~l‹¶ÕgÙü#¢c¸Ã ßÉcìêgu¾ÍàÅÛÎÔL…mñ¼º^LïŽp)7û(× öwd8Ò•âo½]uª¼v²,íÄ­Xm•¹#m9ìí®çVL¦9ÓLs¦ùŒ?† |”qðfÚÉ›)Ë2N )zÒThû=:Ü™æ@G­‡J眥°5¯³©å¬ˆ¡Qkh4S%Òr9mu~í2Ážå¯Ã¶öbV ÆB¬sÖð3I}s%KsŸ{û[næu±¯Ð‹|Ëýg ¦–Q-z·?”?B!Äà!¡·bHèm{“ÁÀçÈ3kl˜“Æ×³_ÉŽç°/ÞâKGQïÛ%†ùÓ:¬Ðç|é– ,¬¸¤ó*/®+ãì)µŒ ¤Ø¿¢™ë|Åž–èC6ÅâO‚‹ý1&Û;‡”aC㔋·ÓNÞM;Ù’×éí^lS^ï“ÐÃÃ]u~¼ÄÍ,§vxvvqÞfü e|?›§T 0ÜÛÄ‘áRnn0ÀT8.¦2ßó>¥«qZïC³e E‚ü:æë]ŒÝþp‘aAÐtò»°‹†œÎ~þ¦9Ó|.ãÛ§©Pæmä«^{ ¿ »¨ÏéLð70Ì*iûÞ0o„C;Üþ+öísºÁ±ýòž‡zÓü²ÎÆ%ÆUü½ýYlËvÚv˜f0¿¡Œoeò”©P ]þ®Ôµ©74^Nºy9éæçáRŽt¥ø| Ê g8Ì™f˜žç¶†2–F uã P¡ç™`Ï2ÉžeŠ=ËTG¦í má—¢DM•…I7/$<,M;ÉudŠÁGq¦™ãI0Ëìö ]“¡±"kgEÆÁª¬ÕY;5y}·+¡7ål]ž©Oøf­·ð\RÒ\^e´+M$ZÊÏ2Õz–ŠŒgsiNm÷ÜI×û Ë‘dlsŸGrQñ²}3WÉÓÔÔóþ°ÁVdB!Ä`!¡·bÈèïл?ǹrLå„q ì_ǦmÛhomò×÷†³ºÁÓ/÷Úĺ¶7vO¬”Šã½åÙ5œ=¥€S&ÔKè=DxT“ó|Í|ÚëÔŸ{s^çÅ„‡çVgí½¹;ú8kçàí( ,¦†¶rG»-NO=´~aoâ¡r€ÐÈ/Ý]߇ÛS·Óë ä8£¤vƒtª”¥IUMsEyzÇë9ZÇêj.`v1Në>IÕ›ùÕ°ÖÖN¹Îc·ãóÖñ—Ný .+¯íö6^gŒ¹v!u»yª™.n¿ãœ¶_†PînffÇ‚ÐÞþ¬èj[‚[ª=>€5Y{—Û§\,N¹˜áLscI#ûÙ³ ÓóÜWUÃo"!°€Ú¼Nm^çÕäöÿð*=Ï4gšÃiw¥Ú~§ªÉYÞ8gyã4›*Ï%<<Ùìce7s¨>ˆr}(š}}VÅ»1gãÉxO4ž1¶g¶üvu@-bh¼•vòfÚÉÛi'›r¶.FÙ}é–*ñáíZ7éŽFþ5²‹+»¹ßµýËË[º¼e2ÛŸ{J—Ï#PôŸK_iùÜþ9Ü“Uƒì÷[!„Ø—Iè-„{™S7L1&˜dRY‚Cª£Tú2ª‰Z+ÿûQ%›¢®.Çê vÍdÎ~ @¡Oøò>ê.vnC“‹•õ^¦”Ç9vt#¿_:Z´ÄlŠÅ§|Í\ˆî°ˆ[ÎRx>áá_Í>ÞÏ8v;ènoIÚɹ¾Þ…4ýIAeISóT“”aqaIšÝ‰ÂújœâRø VÆý)ƒ‹ÊRtv¯™Ÿ…Kûù^ºçP,Np'9«ÝÿE{­ÿÏ%¼$ÍâWâ§-…ÿƽ\ê{*˜Àß›eÝ !„b0‘tC1¸Y  k:v{ÿVSéºÞë7ÈïÕø¹û±$²é¼FÎ(þ›É®´öòøßªwö¾âùµåœÞRqÒøz ½¸Íà‡e Ù.p^švò³piŸ/îÖ“×S.Öfímm%ľëÁ¦ànßvCÎÆ—jªøCU !Íàò@”-yy»ðe-…^Hxº¬.>Бá@G†Ky5éæ©¸—%i'¹½ØþDW,æôc•w«9ž·‡K÷ju° Lw¦9Ýg–;‰·CÕtkÕý3 ëHz{‹ù¹À׌½È­›:z:îÝ«ûw!„Bì9 ½…ƒœÅªµëøæOnÇáèß7oéL†O6ntPz~sžÉ«Ô4쾪bq¸0Ûš|X+LŲºÁÃÇ7cCIfŽidî[£ì’}Ý gš—×SÚ²PeÞRøy¸”'ãÞ½ÞÀ«²v/ß³H^M¹x­—ý¼»óIÎÆ×ë*x¸zß(ideÆÁª= Ekò:6y¨)È!Î4g{ãÌö$q+&ÅâDO‚= šM•W“n¦\¼žr÷{ÕñaÎt§0¸?øU“–÷sh»bq˜3Í,w’Yî$¡v éBá@Ä– o¤\ºEǶ¼Îã;Uí0Uîݳ„BQ\z !7E%œËñ»îûSUЇFyè°¥-‹j¾°®\°,²—Ö—rÕô$>GžÃGDxmCI±§$ÚQ€+Q¾Š´µx'íäû eÔä‹÷rêµ”‹û›‚Tv¹Ä¾ã‘h OÆù ãàæúr~R^]±øYy=ŸßVÝ'-H, Ï—wÒN~Ñh1ÛàloœCœiÀ§šœæsš7NÞRx?ã`IÚÉ[)fí}¾æAŽLŸŽ×“Ã]©>½U`‚=Ëᮇ;ÓLs¦;-H …–3OŽ<÷öùbºýinS»b±wW8éÞ’´“°1Pf#„BˆÞ’Ð[1øérºé_=–/Ê–E·`}—ºM±8q¿ ½‡bqKYËÞ=ÐdnSp@TLîIk !Ú›Ÿð0Í™æ_3#m9¾Sææúò>½¤©ðTË¢–ÕzžÙî$³= pdP)´™Öäl"k)¬ÊÚY™q°2kg]ÎÆº¬}‰Ý›-ö³åöèöºb1RÏ3ÑžeŠ#ÃT{–IŽ,n¥ë½Ïª¬I7/%<|¿ÍÍñÕ۸ƾ{çCì!ôv(AÍ ¤š5ƒ jR¡ç©ÒóŒÐóŒ´å¨Ö ´ú['-•·SN–¤¼št³¥ˆgž!„B $òªH!öAÇ cÓ Â ëú¶ŠOì¾וsØð(ºjqüØFžX)‹‹ÓH[Ž{*kÞ²ßÇ97ÖUÈbfbHËZ 77”ñ§êmØ‹o”†y+íì÷öõ†Æ¼fóš}¨À$G†éÎ4ûÛ³LudÖò<„B»¡j=Oµžg†3Ýí˜ÐÜ2︩b9Ki{Nw¼v‰ÃdYÜA¦$…eq‡‰X¦“¹ Ö*&iŽ)iàôl9×$ómƒHÖ†Ã×À7ÜíRíYÞжvë÷l»¹Pc½¡±¢¥ê}YÚÉ{'†ô'¢“¦¦ˆ‚Q IDAT¦bOA!zÅ瓵µú‹„ÞB±:i|ÉœÆëeq¦bñ¦ ‰¬†Çnpâ~õzÑD{–ßTÖ¶-X¹<ãàkµ•}ÒßXˆn]Ö΃MA¾ŠP¦\_ÒÈö^, íLÚõ¨&S&Ú³ŒÔóŒ°å©ç©Ðót×èD¡°˜$í>÷Dµ%8,çc¡™fnž6Rœ¬»i,C¥ÜæjWžT¢œkvN·C\Msu(‰#ïçº/›ÝQFu×¹· $M•ˆ¡±5¯óaÖ΂„‡öpqQ!öÕÕÕÅž‚BôJ</ö†, ½…b3&”d|i¡7ñÂOJÈä%Ä(²†Ê¢OJ9ubû•$Jòq¤Ú ˆîäÈpwe-Þ–ìÙ„‡5”‘ëãÅô„Èþós¢'ÁD{–³¼qþ÷ònÚY´ùDM•Å)‹;´²+Ãõ|[{RÍ Ðr9 šmÕ­¡·M±˜êÈt¹ð#JŽÓ=N~×Ù_qƒ»‘ªTKè­X„“AnO™èy9]ÁJõ¯“!‹ÓÐ©× J;ÞCãäM#»¼¯ÖžÞAÕ$Ôò¹RÏSÙCOïrÍàxw’ã[æßÚÓûÍ´“EÒÓ[!„¢¼*Bˆ}ˆ¢ÀñcØÖì`e½·È3­¬ó²µÙÉ0_šYãxdÙ ©0Þ+¦9ÓÜUY‡[)ÞEü."íľ냌ƒÿƽœå3Õ‘á4oœ§ãƒÿïFO}ù5Í9ö·+ ªÀXŒr¥‰DKùYÆ ZÏR‘ññ‚^ÃÅïÂ.ês:ü ï0^½¡u{_K),ÂÙÃ\uÅb¤žgBKoó©ö,“Ù¶ý”[19Îä8w’KY•µ³ 鿥„§p0@!„b%¡·BìCªŒQêÎðòÇ{¯?«è= xq]Ÿ;d3%®Ó†ÅxkK ØÓò¦82üªb{àýû¦ 4‹<+!Šïw‘s< \ŠÅW‚M¼”ðäâÖw뎿oi!~@h+nÙ~lY ÇÐÈýí:«\î‡d¢‚ÿ9cÜÈÑ]£°Õ{؃;ßRÉþqÎÆü„(´>™hÏ2ÕâpgšCœé¶¾á“ìY&Ù³|)ØÄÚ¬ÿĽ<÷öûB¤}ɯš¼8j#1SåÅ–Ç\laCã÷ò7A!„T$ôB .z Gœx4‡ºs¤M ·Óà£W_æ¥-™><åZeäG3ËŸeñËo²&×gݬqá¶Ë/­/-âLDO¬/å³oFQ íh$ôî_cl9këáýP4 ·-ê ?G\l¢RÏs±?Æ£ƒ{Ÿ´$å‚nÀìKËÛ-ÆÙWL࣬²vþ `W,u¦9Ád–;II˼ãíY¾QÒÈõ¡ “nžŠ{y#åbçKz×ó£6…ðû<_s‘g³Ýê–*z!„B z !­j*':>âWÿYKP£8ªÂJÓ9œÓN;”a¹,v/|¸`)Ú Çú)Æ,\“NâÚê÷¹ë 8þ”Œ3ÓX‹5¯¾Â+µÛ“mÅ1Šé®-<±ª‚“'¸Y»"‰­zŸ=¦ #eâ²Åxeþ¬ìºè€eÓ,ŽUhm²ºÁÃÖXñ$=«;x¿ÖÏAU1ŽÁc7Hd»?E^ì¾J=Ï}•µ„ZB¢G¥¥‰< p‰?†_5ù\ Ê?›ý$ÍÁ[í]oh¬ÊÚ™lÏîÑ8nOöð}X¸BÒ¬¥´-òy{¸”CœiÎôÆ9ÁÄ«šØ‹9žs< ê §ã^žIxX·‡Uèýa?{¶Ûªùb»6aaÊ- ‡ !„ƒÄ@}M!„]2êVó†r—Ÿv³ÇXµ–7ÖD0Åe#úîË<øÔs<´Žœlgùj8p‚'S'yY±¢žàAGq`í"|êyz¹‰iÇŒÇ×v ¡)ã0×m$¶y=Í£'Q¡(”Œ‹kÃ<öôs<¼`-á^&ՅÆ7᱂=im2𽸮ðd×LŽÝXäÙ M!Íàw•µTèyžˆ{ùÞBt’²j9û! š\ä‹yF{no´ÍX’rÑØCOïþ`ËÒN~ÔPÆ©›FrK}9o¶«î.× . DùÛ°­ü¡ª†3½qÜêÀIq¯ D‹=…n¶å˜édB!Ä>LBo!Äà’­cÁóxàå¬KØ{Ä©\wâh¼†… .žs,gM¡k ÑÕëÈŽG©g4;?á­z‹PÀƒÌa\zú‰\zD9†eÇ׺7ÔÊ9æ€rFL;‘+Î<”±åã9f„Fí²WXì˜ÎËGVâ8ï{mÖØBkÓRXøII‘g#væµ!ÒùÂ/æ‰ûÕy6CW5¹·²–‘¶ÂY/%Ýü´¡¬Û$ 1´<Þì#Üà~6Å­£¿íÌ‹{Éõsoò¿Æüý:þÎd,…g®­­äœÍ#øCSšüö}§9Óü ¬gFnâe Ls¦÷JË—îTéyf»v¨|¡ððB!öÒÞD1¨xÇLã}5ϯ²a}”Û`ìÅÃ)S7¡L?’êMóxhe–à!g2±TÁНçÌŽšf`[ó*õ–…ÙÔL}ÃüåÝ–æ¦Ü›§¡å½»kÜ [ý÷¿Ù„ (¾¸òøqT½cã’y;§1üès9câZ澟4™Ûfpøˆ&–×ø‰¤:/â%–TNã!NfJEœa¾4[›¥%M_°)wTÔ1±¥µÁ›)ß«/ð}n…(¦Œ¥ðH4À%T“ |Íüi÷ön24žŒ{ùT?õŒ~?ã`Iʵó+î%5y¹MAl r˜+Å™Þ8³ÝIŠ…[19ÓçLoœÍyù ÏÆ½|ÜÅ‚Ÿýé$OMد¬¦;Ó”hÆ^¯àB!Ä®“Ð[1¨$êê°æœÈWɑ΃f³ØöÚkl4MÜ·â1‹K†ÇiŒ„i~ ‡•Îç½2œs²ÎS7cá÷ßdí)'pÕð$Y›Ø‹x"šÅÏáÓ¼¬žm ¿¬øÇ|dŸÃ¡Ua†s0©”‰ËÙÀ[öå™ýïèQìZáQ½, X/¬+ç„qaà¤ñ üñÅžÒ §·”50Ù ‹ÁÝXWÑïŸB ÿiöñ…`~ÕäÓþÅüƒú¹3·)ÈiÞn¥oy™À/Kä듾7S.îPMNò$8Ëç@G€zž+Q® Dù8g㥄‡×R.>Ì8úýÀàñ¼Ê §IîLóì^h#„Bˆ=#¡·bP±’[˜ÿäæwñ½øºEüfÝö¯ç¿Ýr!ü<·¬n7FfÏ?ùTƒÇxåOvØ–àµ?Q¸üîžÌ¼¸f+´6É*¯o”žÅƒÅò?u ž 'î×À£ïÇÄÓ@ð•P„Ó< 6ål\_[IZ~¦BôJÆRøkÌÏ—‚M”i§y<÷{Z»-lhü ¾ŒZß¾²1gceÆÑ§cö‡¸©òŸfÿiö1Æ–ãLoœÓ½qÊ[ökËqU°‰«‚MD ·ÒN–¤\¼v²9ß·o#uÅbÊ.,º·åJIè-„B z !Ärå8¤º°0Ô››ƒ$srJî`aYðüÚ2>sðJÝYÑÄ’MrÐbw]àkæò–EÒ"†ÆõurŠº»è1?ŸÄp+&Ÿ DùoÜ; +š{ë夛—“îbO£è>ÉÙ¸7â·‘‡8ÓÌv'9Á“ ¢%i'yœÔrÐ0bh¬ÌÚY‘q°*kguÖNM^ßíjð1¶ö^¶6I'ÊùR.ʃÁ,ÅØƒ$á¼B±¯“Ð[!†¸ãdžÛ¦zùcim2Ø<¿¶œO´U±8uB½„Þ»i¦;É7J g<¤-…¯×U°i/÷«b(h6Užlör‰?Æ8[ŽcÜI^•ÐxÈ0ei'ËÒN~ÕXÂþŽ GºRîLs #ÓÖs;¤íJq´+ÕvÛœ¥°5¯³)¯³)g#lhÔM†FÄЈ˜*QCëòìšÖêòí4^Ž”òDV!žs°YÍ0Y³ðºšøv‘UŽÔóÅ€rÔásÏ#_dÜÂpö‘+ö„%p<ßžû-¦½{;_øÙ+DóÑM!Ä>KBo!„âN[úY·¶‹<±«êvÞÞ`ƈ&¦RêÎNÚ‹=­AåG†Ÿ”×£Rtn®/çƒAÐz@ˆê/1?—øc\äk–Ð{ˆ2),Èù~ÆÁ\À­šæLs#Ã{–)Ž >u{m·M±mË1Ú–ƒvaxW¦Š–BÒRpwªò6˜ªc +"Õ;òB1Iè-„CXë– ÖKk“ÁêÍÍAS6J\9N_ÏßÞ†%ï·wÊ«šÜ]QGIKøòh4Àã;"ÏJˆ¡á1?³ÝIàB_3w6–{Jb/³(,ÜU«(ŸjR¡ç ª&!Í ØRTM슅W5Q(,`éV,BšÁ„]è•]¢çqŠba jó:ál€çTtÒ4Z…V,:àP-J1P»ùnnãñ6rfs€›kt,[‚/„:ÏKþ.—_~9—]vY×yì±ÇøÃþÐË-«>¤~ÜTιêtžúÆ<¶uºŽ‚oÊy\{í…3¡¥i=Kžø÷=ö–Έ“¾ÆÍ_<‘±¶ZÞúï;BeßþŸâÿ¾z!GíÂjXÉ‚G~Í}ó?Ù±‚Üs]0güu~xéµÌ«WPL•?]ógþö•#¸ôœ)<ÿûÁ3¸ý7PõÂÃ,*;³.%½æ9îûÉ=¼¼MgÒE·ñ½sªÑmçs×óç“[vŸ¹-ÏÏßÄ!ËîàÂï° «æþyçOxô½f,çxÎúÚ |öØ „ÔuëßæŸwßÎkB#!ÄP&¡·B aÇ·´6©OØy¿Ö_äÙˆÝeX /¬-碷RéÍ0­:ʲ­bOk@³)wTÔ1¾%DY˜tsODú¡ ÑWÞN;YŸ³1ΖãLoœß6…HšR ( šM•ælï[qígÏò·a[÷à-ªô<#lnñ¨–Æ&â´ÇVV]߯‘·15ÐÀ)A…5MUÜŸLr§×Ø!”ŒJk“Aåž{î!‹qÝu×uùý¹sçrÿý÷ã÷÷öµ²‚úÉ¿¸÷£rî8ëR.;æEn_Üá™\Ûµœ`_Ëó–ôgsæÕ?¿†o-™Áõ7œÎ$k=/Í[Lþ°³8ÊF[ ­Žãÿ~øeN0^ã·½ˆíÔ¯rÅM·ÝøEüh{Oy}ôd&y2 ŸæµLˆPÀ¢~Áó¬úâT&MžD™²‚Z+KÎÒqòYŒ~ø!î[u2×\z6_ÿò –ÿ`±5ï²&v(¥¶·øó]O±®~Qó rX¹,æÎÏ+Yr–)ç~šÌ?ær×â\ùÅãùüWÏåÕ/=JdöU\{ò$¶üï.æ~äcòô µx !úŸ„ÞB1DM,K0ÌWèå·ð“R© äž[[Î…nEΞR+¡wà–²f8 ¿ÿdÜ\_ŽÙóÍ„»èo1?ß- ãQMNóÄù—œI!vÓ¦œ P÷`ŒaÞ‡†ËøvÆÀi*”y¹z7ns îªóãÕ nf9µCà3Õ.ã—Ïçãü#@§à{×ïÕa°üÞ¹,=黜xÅEÌ[öίµÝ‡Îâ¨ÅÚß}—ï>ð1„6QùÌ÷˜>ûhÆ¥â@§ÉÚû¿Í7殃õŒø÷õŒk¹­kÚñUb²ê·÷ò×—¶ÂšaÌúóU1c|´ž¶æAN7^Å"Maµ=yôLœ¨ ªÇƒ»Ý“Êøè1îüÃØÂ‡”÷G®˜v(Sìϱpék¬Ž_Á‘®õ¼ñܳ¼cÚqW´ÃãíéñT-,¬ñ`lø'·ÿò¬S—R6ç8¾8¬šJ êšäP(7÷ ⮿|LÎÀ%ÇŽ„ýLBo!„¢fÝÞÚä奵É`WÓì`ÙÖÓ‡E9lXÃ|i¶6;‹=­é+¡§y ½ì7ål|½®B !úÁs _/iÄ©Xœí•Ð[쾬¥°9gc”­cõ§ÅÔÐVîh·Åé©ç‘Ö/ìM“+Wþ“Ûnþo5IEŽ¢íÉÁt!„”¦XÌS½7F]¬o”…û†‚}P €¢Àùû×y6ÓEþ—¢D ëë*ˆÈièBô‹¤©òlÜ ÀTGf—z2 ÑÑ’ôà8ûî ™§è¬5ø¾çž{ö,ðn¥i¬ì·<v1í3—0½íxˆE¬!LÖÒ¨^… (%év‚ÙXÇæÆf K£zDá{jeåZ»Û†ÉYy>|è+\rñÅ\|ñÅ\|ñ¥\û§ÕäÛÝ}~Ãr–Ç,ÓObVUëÆŸ8›‰šÁ–w? ¡]®¬ AµèÕŒ¬R±R“XV¡J]Qº ˆzz<õÔ·ëm«q*-¡yákUkbÉ=WsÊI—rëÓ›pO¹€ËN&‹c !úTz !ÄtȰ!W¡ÜäeYÀrÈX^ãg]£›ýJ’œ¸_zg±Œü)ou²'Á%¤-…¯×Ut¹Àš¢ï<÷r®¯€³½q~) ZŠÝôzÒÍ…-¿KÙ+I)$ÌZƒo˲ö,ð@Á–{ƒ¹½ÃìoLgŒ²½/wzéS̯™Í9—[BËHO:‘Cm Þ|f—gx7=“Ã/ý·”,#=yûkÐzØ0µôi^h˜Íg_ÍélÈ{©[Á–Çïá™D»{Ï.åч—3û†#ø¿{Ç‘o­%šÊÓG¡†_à÷ÿZCûÈGu>ßøžìÓ9¥R!ò쫬0%Jc“‰2ò8>ûÕ<Ÿ4®à_OîøH{z< ÖŒF•§~“¯L‰ðÞšL+‹Ižx4¹‡?{!„Ø9©ôBˆ!hÎ~õ@¡¾â•O$ôJžXY€]39}R]‘g3píJqkY*`7×—óA ˜ !úÂûë[.îcWätu±{–¤4 ð3sÖçl¬’ö&ƒžÏçëƒÀ»…ê üÔ=üs£Á{¿ÌR~ùÕòø*;ÓÎ8—™u¼xï×øÞ“a”ðÿ¸ý¶'ø(;’£N:ž¼‹Ç6lïC¢¤ó‹/ßÊãëJ9éê¯q×.eÖÈMsbEeËß®ãÊ[cq8ÈÁ'œÄ±“ílxñnºü4·/Œ°È,{–7œ‡3çÐRßú#·Üõ*)«–ùü…åáÓN=ƒ£F:è´'ïéñìäG”jˆ:â|®ùúM|éx7+þóS~ùlCçûBˆ>Ö_g”t·«ûQº¸ÜÓ¶®>+½üºõCíâ²Öî²ÚîëöŸ»ú¸û¸ãŽ;`Qcëñ\!ľî‘O½K¹'ËÒÍAn}ibQæà²üåÂwpè&+ë½ÜôÌÔ¢ÌCô]µxøSïRâÊј²qÅ¿!oîÛ'ˆìÈpoU Nž__γ O±§%Ä>ãRŒZβ¸¹¾œùòü»éÚP¤­EÕ@ô“p)ó¤wý€1.ÕÀðáÃ;}OÓú銕!Z×HÒ¤²ÄU¨"´²ÄêÃ$ò¸BT… ½·­\’X,N*k€ªãpûñûhXä“Q"Í)ò–ŽÓçAMDIÙBT†œ(€™KÒÜr[ ÍæÂêjñG“\²™æDšlÞÄRTlŸ—^x}¨Nâ¶|—ÃÞ¼•S¯ý'Û2&ªÝ?èÇÙ2ž™ŽÑM34§ŸÒDk›È8‚T–¸Q{zÌ.>[í¾¶Úmëx¹ý½üº§Ï;ÛFÛúüX˜œ-„CÌq£qè…j‘Öþ?{÷&W]=~ü}Ëô¶½¤'¤Ah„!´ÐE â°+EAE"–J‘"EA®Fª”„^BIž¶»Ù:;½Ýòûc6Kz²ÉîÎÌæ¼žgŸ™½åÌîì̽çžÏùTociQj Ká¹Eµ|kß5Txr|ed;¯.«*tX3Æ™åÖÚfÜ]Õ¥7uTHÂ[ˆ~öBÂÇ…åaŠÍ©þ¸$½Å{"ä¬`´û=½˜¬Ê9x¾«‡½Ø…).Bµõ„6xÌI°¦žkLJ—P¥wÃeó?A÷–Qí-ûò!߆˩[\wc*oˆ ï¶—e u›ù÷RÝAªÜ>ƒŠú [ùlñù¨Þ–ÕñWÕÓýßâQåÞžø„¢wI{!„`ޝzÉ*o¬ÞªÑs‹jHùÒœsöm@ÙE+e†:rÜYÛŒ_Í_ä¹§³Œ'¢½4\Y±Ý¦ÖÝçøOŠzÝØÆBl^«©ñH¤8“c·tTµwÑ\!„¢I¥·B ƒ‚iö¨ÉOõΪr’¹âî)vL,£óò’*NÙ½™_†)#Úyý‹]«wûPGŽûêÖR®å‡> ò·Î²m¬%„è+ÿû9Ú—@%?¡å=òÿ(vЃ‘ªbUuV»©ñVÊSè0„Ø!vx?ÚûÁ Z•!Ä®@’ÞBÑCUÞ,¿;fžÜ&?ó; [Ývônmݼ,­M´'?Ä´±­85‹³÷ià­˜»HÚpGŽ¿¬—ð~.îçæÕ D!½ŸòÐlèÔê'ûãÜÛY†µíÕ„ØDÊV¸+\^è0„86i?"„»¹È'„=4¶*Á°P ¿ÓØä«ŽÚ-ßÚ¤5ád^³´yÈ:’ž[TÀ`šcºÚÚ t£Yî­[KuWÂûù¸Ÿß¶Uõþ¬'Bˆ±€g»ú×êû»Ó… H!„BìÒ¤Ò[!zhöš2ÿtƒƒ[>¡_ÚÞÿ“xM¬PåÍðê²*lÉxO}VÏñc[pëùjïY_T’1îõì½\n­m&ØÕÃû™¸Ÿß·UI5©E⹄o—u¢'øã|v:$!„B±‹’¤·Bôa)ücÎB‡±‰£»ª¼mà•eÒÚdWЙvðÔgƒ8gß5Tz³œ±g#Ï-¾×fo8Ì›äÕ­¸•üÕœÅü±½R*¼…("«s>˸ØË•aª7ÉõŠMzi»$„B!ŠËÀ-Bˆ]ˆÏi2yX€Ï›4Å\ŽHô—ͯ£5áàëÖRÈ8¢Þwf0Ê-5-Ý ï¿u–ñIx Q”žïjqâU-Žð& B!„ØUIÒ[!€cGç'4™ÀrW“1Tîÿh(NÍ⇮(l@½HWl®¨lç@¾gð í•ÜÓYVØÀ„[ôRÂG®«ºû¼ÀÑ!„Bˆ]•$½…¢Ä)À±cZHd5Þ^Y^Ø€D¿{sE%s›ò—08Ò=¡i)«ÖLî­[Ë×1’¶Ê/Zjx2(pdBˆ­‰Z*o§<äIQÙ5é¬B§ü< IDAT!„ýIzz !D‰›8(°P €ÿ-©!ehŽHô7øó»#¹ó”Ïðè&?>hóÖ»Ûž”šƒ=)~[ÕFyW²¬ÑÐùYK K³¥ù|„ØÕ<÷s„7‰ Ló%x$,tH¢Ä]XæÜP„Y' 9G¡Ãéó³NŠ„ †B1`IÒ[!JÜIã›°mxa±´6ÙU5Ç]<4gߟ´·nñ‹Ã—qÅÿÆc–Ð$rNÅæâò0g£¬‹zvÊÕmUtšr1GˆRñvÊCÔR ª'øã’ô;¥Z397`wg–ÝÙGÔ;¦ú¼Ÿò°X.è !„}B’ÞBQÂÒ8¸€÷×”Ós8"Ñ.§“o{$ûŽÏãÙéí)€§"AÐeP _¿%„ñù|ý²¯õ%  Ôïûmll”ýö!Û¶‰Çã$“Iü~¿íWlž$½…¢‡Vuzˆ¤uBîþ­@ØØÔÝÚñ9óý=»°–ÂÔ'ˆµçn# BÉÚS.Qôlà…„ï—uR£™àI1;µómœÄ®CŽÀUÞëLõ&¹±½R. †Ëå"•JõËþÖO¬kZÿÍcšùs¸T*Õ¯Uæëž¯ì·o¹Ýnb±X¿íOl™$½…¢‡cnÎyr"^‡¹ÉÏøú'x6óxoSørËDVcæ2©*5n§ eÞQ.ùÝ Q^ˆûù^Y' p¢/!IoÑ#{»ÓTh}LUhšÉ8g–ÒâD€~om"Do“×pñ¤·BìËVˆg7} gµ~Iz0¤“a¡|ÄËK«IýW™ „Bl5†Î§{»2áKâi·IÙÒ¿TlŸ=[ž;e 9È“’¤·b«&L˜À>ûìÓ}¿µµ•—_~¹W÷1xð`êëëwhÝl6˼yóvx߯ côèÑèúö¥)-Ë¢©©‰Ï?ÿ|‡÷¹ÎèÑ£9rä6[꘦I:æwÞ)XxÑ3’ôBˆ4}¯FL[á™EµŽFô¦xEÿ‘¤·B”˜}ë£ì^àµå•¬Iºp ¸÷Þ{¹óÎ;1 MÓøö·¿ÍÅ_¼IÕ1÷&NýÞlNúç£ühLþÔÞ\x'Ó¿5‹©?ÎÇmûtß}èO¸vãÜæþwbÛ›eÛØŠ‚Ô‡ Qz^Nø¸´¢§bs¼$½EÔ蛮И,ãÖ¨‹´bcÚ .gŒKÊT÷{„`A~Ëòëò0WvÝ¿:–å×åémg¨$½0‡_ýS_?ß¼Q࿳ã®xüÞ™þ^——\ɱm›t:Íœ9s€|r§wÛ†™¦É²e˶+¼¾ªª*Î8ãŒÞïˆ#xûí·™;wîvO`jÛ6ÍÍÍœxâ‰;•ô?~zú#2—ˆ‹4üûsü»û!þwýäï,vHµØL¹ü:¾9n½ #™¥Ÿ¯Gë麎s'æúQ…áÇóþûïãõz·k¥K—rôÑGãv»I§{vSô?Iz !Jžª€CQð¨àRª‚¤ ‹´ ËÆ wë#L¨ÉÏýÆŠ ¢îm¬!JÅ–zò½úê«›IzÛ¨cNàÀ•ÿbVç$ŽS^ç™Öƒ™6|&í±5g^ÃLò…ŸqÞs‹8kÜÞùµŒžÿýc¬8õw\»Ž5‚¢ØDƒ“øþOAŸÿgÎ~à#–~ñ0«Ž¾™¿L¯&<ã"N{cã*ë-ï¿c½¥¶´í•SÿÄ=ߨ!ñ¿_ðÒK6 OßÂk{\ËýßËþÊ·o}‘i> ŸjÓâ9„¿ýñ(zv,„(&ÏÇýéM¢ÓüqŽôìdZ nÅfwšC<)ð¤áØvÛ5¤<¸|­ìÓ½¢Å¾Á0ûéÄÕ4?ªLâΔs^ÔMÖaSh练T¢šï'œœîÌ Q5Íùå)ôl9çGÜ,ËYãmáÖ€Ig¼†—RÐ/çMg;w‡r ñðcjâT`p˜7Ã`%Á7]A>4LófxDIpž×$ÛÕy a«ÛÈs*ä@µ$d3K¹ï[grÇBÜuLùÙÝ\ÿƒ¥|ò›™ÄŠäO£9•KÏñßÍ?¥p×ïÎÞu)2ê ¦œ}©ëÞeq²H¢ Õ»ªª ˲ˆÅbÛÝK ©©‰Áƒ³lÙ²>ŒNôIz !J–øu…z·N¹ËAeYˆŠòrœ.†a‰DèèŒÐ‘HÑœ1g-ú~ŠÉ¾£çí—ï¯fÙ Ï“*ïÄ47ÿêÌå¶0þTÎÉǽÇuÏ7°—ö÷KêßžI›C¡íÕ»ùýë>ôæ/È2ÈFZ¬yúþ\y(¿»¬ µ{Ô¢ByuUþ€ÀáB7³´¶¦¨_ŽŠBÙè1Ô¾¹ýûïØ`¡Ím;N͘ü¶½ƒ‡P¡X474Ó¶ü®Y¦‚GW Ã*ÕC‡ —v„(mo§0³Ý¯;÷¨¹øgg³¥J¦ù=î¿þN^k4`³Ûz+ŸÔÔP9Á5³ù 죦Îm4±x•†ÓYÁÁßÿ%gL‰uýÝœžÇBïAXý·’?†ÔFÇ_~¥sÓs7xÎ[ŒEˆ]DEEk×®íQÂ[UUÖ®]ÛãjxQ’ôB”$Mz—Æ`Ÿ‹Ý†ã ƒf=öÀårcc“ÉdI$¬YÓÀ'sç²d隢 V&sdJôÌbÊÈvFWæË†^YVŪHïöp…5eÊžþùÍ>¾y*UÇ|•ÊŸÝÅ]ÎjN¾¡ŒìÛ6-ÏÝNâ°øÓ >Zžøï-·»—¯;ínó¿øÃ+ü¿É[ŠD!T%ŠMÑ/–ÑbßÎýoëY*”Wzii cQClå ZíñÔ ̰їð»3kP³­¬lõ0Tƒ,lw_?!DñÊÙ /%|œˆ1Ö™e¬3Ëâ¬ô+È<ŠÍ©ç£Ôn¦uG›©ñnÊÂŒ‹e9+sÚ7j{ó«ÊvN Ä6xl°'‰Ñä=;‡h*wV0ÛÝÁy›‰cA´œeîµüÁgѫ僭ô1©6톊I4ç •,µºÁG˜«&ª­±Ú´¼ÑÇÒÆi|{£{Û³ˆ´ü)Š»žÉÓö'ñî 4X€koοú4âדcÞhCö5nüëå|må%<јŨ>†s¾›+N¾†Ï²jêã‚˾ÂWŸÊ÷ß‹ãßûÇÜsæ—Çü߯N#ñ§opÔëajN½™/9‘…—Í`­½™m•¹»GÚåÎäõ²«øùÙÍÜùïY›qàÔ»ƒ×n¾‘ñ“~ÀÊïýˆ'Ûœ 9ëNþzÄ^¸>ù˜ #;ã¥ß°ÐÌÉëžèVc)Äo^ˆþç÷ûéèèØö‚‰F£ÔÖÖöAD¢·IÒ[Qr4l†ºŒy8øàÉœyæ™”——cÛ6¹\Žl×W  ¼¼œÑcF3oÞ<Þzí5ô¦f¾H¤J,ñíÐlΘ¯òÎ*Ì\àˆDo;ñÄ™;w.=öX÷c§vÚV'…Q|“ùÚ¸[ø½ëLrÃÛ(”í¹?«Ÿú ¿ý¤–ú¡c©óOž]¾/ǧ‹šc¯à‚/àúÙ^º¹­ªŒ:ù,BW]Î埠ÊeS¾…¼ó¦ûß•'‹ú+.ã’yé ˜T)PÚìÿ›k¹tN%îd‚êÓ.ç’Á2ÙÉsq?§w%0Oõǹ±£bkˆRäPlÎF9'¥Lûr“ ,É:ùO,À[)MƶOC6³ŒæŒòÿÊBÜÒZÇÊj+Ý.qY°™^ÆC=i‘Jþ1©×³Ôd¼˜Ksôfö7Â#ØVÅ5YƒJÊ€Aþ0ûµWqyÆÄm)Tù;¸p½°4G–òpwbƒöåý[íü¨k™mm Y’Þ…¥â›·=Éé–ŠÓï!ùÑ_ùùÝ_`¡ásuÎàâO*kj±ã³øÇ«ßᇠ橧e%ÿ¾cîjj½ 9‰-3¸h‘“êš*ì5ÿå¿sÏá @{“ã3¸dTÕT’{çæýü«ìåÿ/kS›nk}Šñ9·çJN»è"þøà…4½þ(ûÇË,K¨¸>tEÁUVE•m“|óy–ëHöuÌû¹‘vHŽW®YƒÊ—ç[¥XzºÑÇ\.±XlÛ nÄ4ÍU‡‹Â‘¿’¢äÔ¹4êÝG9•O:‰`0Ø] ª¨ù&¶mcccÛù‰1Æßd:Kì•—°ì8‹fI %ýÚMÔúóg,¨£-)r¢(\uÕU|ë[ߢ¡¡úúzF޹Ùeõ}Îûæoï}É¿y¢ëñ)¿}€)g¹ì÷Îéº1êîº9ùЇø²Ðû&]wsÌxäO`¶~Æ)WÜÀÁãÊI¿ñkÞ=¸AßÕmîܺ}mºm€ß>xü&Ïé»7ݵÉcîië­/„(iŸe\,Í:íÌ2Íç¶p9Ù­´©¥ço’‹Ëà u|YNÝij¼ðñD4ÈšíHt¯oÉfGØÔ{;¹asóùZy`Ýmg'÷W$¸{½qç»n86]Ö2]œXÑÆ$§I:UÉI UÍpnuócTõ7Z?a’[ï~ ÷uÝÚÚ6ùPhær8o:w,2°Õ{œù{n¹ã<~wÑC¬ð‡„ç“vä„ÝE:ÜA .?6²ZhOzp¬;Pòúñ…#¤º—Ï‘ŒvuÊ©}4·?zF׈—±Œyn µ™m­Oqâ·—óŸë¾Ë£ŽLûÙ \wµ“Ÿ\ñ,k7ZTM½Ë ó¿Ëû{ù¨ùP&§_᪵¬ÿ2ÛZ,=Ï Q’v´—¸®ë†´*’ôB”·b3Èã`ØÐ¡}ì±8Nr†iYX–…ašds9Ã$›Ë‘3 r†aš¨ƒ†ÄXºˆÖLŠöùœª d˜¾W#iO}^_àˆD_>|8Ç/h ªÚÁ»wÜÅÓÁÉ6o\vŽ‚F$„þ÷siEAÕâHo’ÿ%dŠÚ B3¹¼²#½_–Z§m…»Âåü' µƒ7>J»ÉØÊVû€÷&•÷;«øj‘2mΨH÷Ûgßœ´Ì^QhŽP-µµ&ØÍ/?˼‹¿Éør…/Ú[鬨¡J%ßîÊš ¢maLòW_•îÆìv¤“XY%å ù6!Š€?ÿ?`‡Ûiûü^¾÷Gh\·¼­¨ªÀëb“mmBuâ Uâ³Ã¼yÇ?8þ™#ÙÍñ,k7žFÉðÁ óƒi“Ø}íA$^¹’• ¶‹ <»ˆl6‹ÓÙó‹Ž^¯—dr3ËDÑ‘¤·¢d(@•S#àq1ùÐCÑ4l.‡ašØ6ØØ˜¦ÕìÎf³ùŸ‘í‚•øƒ!jRY¢¦I®Fïýø ¸ôüÑè½ #‘•#QÑ·”Ê)\zû–z‰ !ÄŽy!áã¢ò0Ž®~Ï’ô.}Gx“\YÙ¾A+“û#!Œ”‘´v®’?c+|˜vs¨'µ³anEKqQMÿìk}[áÝ”ÌÓR4T/#=‘‰±¥<¶1Z_æ×5œ~à,îx¯µ~*gL‰ðêϰ»Ú…¬ÿJ7¿Ãìê 8yÏWùÛ§1\#ç¸}´?Æ¢W™Yþ+.‰íË TUU¡( ííí2™e ¿¢d(€¦*¨ªJ6›#•Nc³.ámc˜f÷W.g`Z&kšš™¿d)–iâv:1L Û]×P‹¸¨FUl~qø2|ÎüIÞ¡)æ*pT¢7ýkæœ3íh†ÔV:”’‰'øû3/: !ÄšòÐdèÔë§øãÜÛ‰RÑw†:rÜZÓ°®É*;LŸ·Ôði¦oŽQ²¶Â#Ñ ”‡ûdû…öJÂÇ"™Ä²Àªë le E÷ªÜL ÅMYí¦åÞª+@Eõæ·¸n[¡íÜV÷*k¶¥æ)£z½CNà|Γ÷ÄQÖµ6Ùh[ŒEˆ~fšÖóË-º®“Ëå¶½à(ŠÂÊ•+>|8óçÏß®uvÛm7-Z$ ï!%!Dɰ°É&–eÒéDÑu,ÛÆ0-LËÂèªòÎärtFc|±¦ÕMhª‚ÛéD3 tMÅÌe£ˆ[›œ³ojòS§°¦Œÿ.¨+pD¢·%Ó¦ÿê·|ÿ´“Ø{Ì(\Ží®(PY–Æéȧ‰LK¡#â"—S·±fÿS]~þª®{6õ±µø|e`ĆÕ=ÎmX W¬âÞ?GKÇÀL~±+°€gã~¾WÖIn0Ù“âmég\F:rÜU·–ª®ªë¹i7¿l­¦ÃìÛºÐG£AÎĨÑVk«´­p[¸¼ÐaˆFÇ7o¼’“«ÛyéºËx/«â,¾CÄ­*¦žÞ'tUUUÛ^p3Âá03fÌØê2=íé­ë:£Fòý¨[[[w(¶-í×¶mªªª3fL¶çõz»×ß‘ý~ñÅL™2…D"A*µ} v4Mcÿý÷ß®ÞÚ[û=öÙgLžÙmdr‘(+šXÓÜL"™ÂåÐq;X–…e[˜††A2›-Ú~Þ 3}¯FÚ“Nn~{EªØI‘x‚z|»—wèÿwÊbF ‰Ðvsÿ¿Ço•Xp·ÉÔþm@l›^½=:WS ¼mjüÒиƒÖ…›óLÜÏwÊ:Q3ƒQIz—€1Î,wÔ6SÑ•ðž•ôrUk5Ù~èE±.o­în§2P,Í:Y+=íEo3?ãžs§q‹©á–tK³’ÑÒҲÕđH¤—£@ À´iÓ˜?>³fÍêÕíwttPSSÃèÑ£{´žmÛ¬X±b‡÷»dÉœN'“&MÂíÞòˆ‡õ†Á’%Kxë­·ðxvü8bÅŠŒ5ŠúúúíZþ³Ï>£££§³xϿėäSVQ2 ÂY‹X,ΪåËhèèÄRT²†A:›#OHgHe2–…®ªØºÎ—aȦÁÈÒšH‘±‹¯ìa\Uœ_¾ ÃR¸ñÍ݈fä­Z€¦Ùœ}â’î„wC‹fŒ#™*î×GtÙ»èÞ2ªöÿ:8=ülÊϹõÅ«—òUÍ$ \ièraGˆ]H“¡3;åá`OŠƒÜiêtC’El\WÂ{]_íÅü±½²_ß·?͸ú¬…Š‹e þB‡1@¼òÊ+;8º®ëƒ½×³ÿ½÷Þãå—_î¾ïñx(+ëÝy1,XÀǼC몪ºÃñx<>ýôSfϞݣ j—ËE °µæDÛ¦ª*3fÌØîýªªJ($MJ…] !JJ§¥Ð‰RUY•Œ“s¸Éš&™lÈ÷üv:h–…¦ªhª‚¦ª(ŠF·bÑÐÑA»¡`Y–mlU‚kZŒK·°[ßŧÍ;÷!.U±™>m)c‡ç+FšÛ½}G †ÐØÃQ|üäЋ¹Ö„Á™šI ø$¼„Ø¥< p°'…¦ØLĤÍC‘ÚÝ•áŽÚf‚j¾¥ÖÑ 7uTÈ…J!DŸQ¥hZGôfÒzgùý~üþ¾½œáñxvªjzgø|>|>_¿ïWQ”^¿x (E›wuC9n«iéNx? ògIx !úÃá “Éàñxú=ñmšýßpOU 3òXöÛwE!•JáØÎùšDß*­3f!„"–ÂÒh Çâ%Œ3šÁ‘t–ˆ¢àPU ˶m4UÅ¥@•σGƒ5«V‡^SE[K„ÎT¦(NÜöáWG,ţ紞YXË“Ÿm œV« IDAT_O11ð:q-ûŽo šprß¿ÆK–ÞA”m™4¾v7#Nû=šË‡2aßjüœçÚ?àçºÁB[áM«øÚ !zŸ< ðóŠªÅÉþG‹§¢nWW£ÜYÛLyWK“§cnë¨(pTBˆÎçó‘H$èèèè×ý&‰~Ýß:ápa&g—ýö-‡ÃÑ=¹§(,Iz !JŽeC›©òYGœ¶ç2~ØÌÐú*ÝiÛ`Û¨¶M&•¤¥¥…¿XA"Çëtâ1²2´†9kÛiŒ& ö<4Åæô=›ø¿‰kº{ò³züxhÁbÅeÔ(Ó[ @:£ñ÷#RÄ“Vn‹™ŽÑ8ó†Nû(*¹Ã¾Ë¹Ï\ÃýV ¸EÏñµœ“Uý01š¢ðž‰øAY'Õbz Æ“Ñ V¡ƒøU‹ÛjZ¨×ó£Ï^ˆû¹¾]FŸ !úÇÎöhÞº^˜ÔØŽö Åϲ䈦HÒ[Q²Â¦BÜ‚öek¨nXKÐíÄãrár91 “t&C<¡-£-gãT4†“ÃŽD¨r88dÄ Þ_µ–†H«Ÿ‡Ï /Kqñä/_Àîý`3Ôõk¢x•²œuüRTÅÆ¶á‰ÿíFKGazìõ¦TóÚç=Gå>'£{ËX~à9üé­¿p™nP¦À_9NÏ:I:P!DŸKZ 3bÎ EêÈq¸7ÉëI©Œ*$‡bsCM £ù¹RÞHz¹¶­ª(FÆ !v …Hf»æ‡B ,’ôB”´œ -¦BkÂÄ•LâT’¨ä“È92¬›°R!eêœÂ;‡ÚÑAµ¦qÔî»ñî²Õ,jéŸ!tƒ‚iÎØ³‰cG·v?Ö‘rðçwFòACïN !J—C·8ûÄ%ø<ùê™ïfÑŠóúèøäüÃ&â*B`äüsùûì¹öCNP-Æ)6×;r\œ+½.Bˆž{<àÁ(šbó`T’Þ¤WWµ1Éೌ‹+[«¥ú^!„%I’ÞBˆÁÒ¶Bz¥HKÅÌÁH% ­­x<ŽÚs,îÅ+ø¼±£* .ƒ‡t2uT{×ÅP•/ƒ|kew¼7‚XFÞŽÅ—N8|ƒkò½,/gÖìÁލwÙ–EÓëeø)× ¨:5“ÏáŠÿ,f7;Â8ÅæÕâuÍäi™ØRˆo­¡33éå_‚ýÝiÆ9³,Ê–n§RöݲNŽ÷å?{š K[jHI»©ßU·2Í— ÝÔXV¤¯¿GB|˜v: !„Bt‘,‹b—b1[eµa3„, x½^ŽÛo—“ÙËW÷J«“åIn9ásjý‚nƒO¶úyìÓA|°fàTïŠÞ1vx„I{¶‰9yê¥QrXy¶³‘ŽOž£râ©èÞr¼ûžÂ%<ÆSÎ,^à*Ýà]K¥±H.Bˆ¾óh4È1]ÉÖsC~ÕZ]àˆv=Ó| ¾WÖ @ØÔøQs-á"¹ð8H7˜Öõú¨ÔL*=ÅÙ«Z7øFãஆB!„(4µÐ!D!tš +² ÑdŠ¥K—’N$˜vÀÞ»Ïî¸;=°Ú—elU‚Ðz oËVø¨1Ä•/çg/ì! o± Ëà´£¾@QÀ²yn élq$úBǧ/`$ò­…ÊÆOeE Ž?ùÿ¿p½¾é#!ÄÀóiÆÅ¼Œ €©Þ$C¹G´kÙÓ•áêª6 g+\ÑZÍê"j1õÓŠþiA·³F:rœâ: !„Bt‘¤·¢ä)Š‚¢(¨Š‚¦ªÝ_º¶ñ—Öý3EQH ±ÆP‰&S,X°#›å¨‰{2mÿ½pê;—h´pÊÁÂV?/.®áOoâ›OLäšWÆ1·)Ø;O\ 8'~eA~"×>DC‹¯Àõ-Û2h~÷!U£jÒÙå~«ŒNÑ_Ö¯ö¾°<\àh6¸¾º•ÑÎüè¢W>î—6¨èŠÍQ¾+>(¤©%T™.„B d’ôB”„uíKº[˜(_¶,qhz>éíèú®k¸Ü¯Ë‰ÏíÂÛw|™$wè84 ‡®“T4Z:ó,dþüù¤R)©{†\òF)úÜ1“×àóæ{ØÎš=ˆævO#ê_™p‘%oà*BhÌ¡ü×R»Ûœ¬Zœ¬Z… QÑÖU{áM²‡+Sàˆ®_T¶s`ׄŸe\ü¦­ªè&MÞÇ•!X‚ïý‡IÒ[!„( ’ËB””uíJ¾l[bw}¶¢Ðõ¥  t÷ûÞøëË忬¦MØ*k-9Ÿ~ƬY³˜3gñ˜LH$úÖàš“öl ©ÍËÕ8¢ÂhŸ3+›OÀTNü*ªîâC'ÕõóËuoáÂBô“[;*°¸Dª½ûÄy¡§òÇ7-†Î¥-5¤‹°…Ô„½è1D7¨—JB!DÁIÒ[QlÛÆ²,,ÛÆ²mLË´lLËÆ0- Ëİ,r†EÖ0Éà •Í‘ÊfIesdr™\ެa3òË–‰ašùíÙ6aCaq,Ãò5„3Ë’¥Wc$J…œ|ÄJ”®^óϾ6kjk²>3#üùKèž¡qSXc+Ücä§©Ul.’$‚Þ§¯$ò“øîëN—d{‹b6Í—àÇ]â–ÊOZj›;7yw_Y×zeG˜Ù2Îmõ‘ÙÆc}e„#×{B!ÄÖHÒ[Q2lÀ´, Ó$gšäŒü÷¬a5Ì|RÛ0Èä¾Lv§s9RÙ\×÷,霱Árù¹¹A"Ê÷œ†¢9¹×ÔXÕUx¾f2J)¶øBˆÞv{¸œl×ÿýåxäÿ¾WîMrMU ³.k©aiÖYè°¶¨ªk‚ÍM),ŒTpm{öÓKÃ2‚\v³½—^‡JÒ[QLÓ$•J‹ÅˆD"D"b±©T ÓÜÒ{¬‡^è„¢'lÛÎ73±m,E+_- fWëPX¿ÊúgC ¶¿occÛ¬wÿËÛ@wK!úŠÛerì!«Èd5^|sX#*<ËÈžÿUû}-_í=æP:Îâw†Î½Ž:pµnp~ÎQèP…}¨ÉÐy$äüP„2Íä‡åané¨(tX%mOW†ëª[q(6ðÛ¶*>H»ûeß^ÕfˆžcnP¥™„4“2Õ¢L3)W-‚š‰øºúw»§bwßߘmyøŸ•æ"Ÿ‹’ûûLÀ2½ÜؤSÏQ…NŠ–éåú[_*QÍ’‡èОu¡Z¹ÌíàöKL…Ñ¡#~fg på8ß­óÏö2æa¡X6û—·3ݹaö}°ŒLBX*•¢²²’ /¼‰'RYY @{{;sæÌáöÛo§££gךKHìZ$é-„(Yë'¬»Ød™õ{vÛ›ù¹…rÔA ø<ù“♳KJ" sÁ,*öœ†êôR±×ñD¿É,Ëà-Kå0ÕâpÕâPÕâmK« 1Ý×YÆQÞ$Ã9Î Fù_ÂÇü®I.EÏŒsfùKÝZÜ]ó7¶WòbW ™ÞäVlÆ9³ìîÊ0Ö™eˆn0Ì‘£r‹Û;fm‹îi§ÒePÖîg¥/Â`e<Äjo+$Õ¼š„U›yl} UÓœ_žBÏ–s~ÄÍ #À®6î  ñÃv7Ç„2 Vœç5iŠV󦳻C¹üÏÃ>Ž©‰³þe§ŒNBP<笳Îâ /ÄáØð£¦¦†ãŽ;Ž©S§rûí·óøãã÷û ©}K’ÞBˆMÝ¢•2¸W~òÊpÔÅ;sk Qñ°r)Âó_¡rßSÐ}w›LdÉ›üÞÐyΙE~®¼“u"ÿÝB \[áºöJþR·øCu+§7 &W„.³=\n¯mîNx? ñT¬wZiUh&ºÓìïN3Á•a”#‡ÖƒdoÆVè45’¶BÒRIt]ÌÌØ [a?wšŠæ¶‹Ç,Ò«øU ’9h:Ê%nh7Uª&*àÕ ÊŽÍ<¶±2ÍDlt ÙШsç×AÏQkºií^Z¡ÙÐiφø]@E'M‡ ë½4 y ! $•J1}út~úÓŸ[>ÖuK.¹˲ø×¿þ%ßb@’¤·BÑÏŽ:¸]ËÛ~þÍa»ìä•[Ò¹àUÊ'‹êpS±÷ D—½ÍRËâiSãLÍd/ÅæxÕây©öb@û(ífF,ÀW1é?-s£´9Ùnû¸2ÜZÛŒ¿«MÈÃÑ w…7—öÝ>*ùÉE§x“èN3Ú™ekŸ^k Õ9G÷÷&C§ÕÔè05:MÔ6×W¶óõ@lƒÇb©K½­ÜÊ¡–àWa/aw‚ Õ¢ÕÔ°0ˆÚÈR¾™Ç¶¥F7i2òë`8hÖ jp°n|an0Äæê€‰jk¬6moôT"òù$„(Ó4©¬¬ä‚ .Øî⯋.ºˆ™3g’L&Ñ´âœØXˆ%Io!„¢ÕV¦˜8¾ €Õký,X¶ã ˆÊÌ$è\8‹Š½ŽÇ¨&0â@¢ËßãvSãTÍÄ\ªü/ëD¦àb`»5\Î$OŠÁºÁ™Á(g\¼Ú­9šýÜin©iÁÛ•ð~0âŽHx«ÀžS½I¾âMnZyÝeyÎÁ‚Œ‹ùY' 2.eÝ“‘î¨5ÆÆ§ª:ÏÇ4¨Ì'¼T=ÉAv5ÏåœíRÛVÅ/3U*TÃ6óضÒ@õþNn¯äÊ6,…ÃËÚ¤ù(—qK¢Kýaök¯âòŒ‰ÛR¨òwpáF¡®Ý$v!Ä@‹ÅÈd2XÖæç(¤L&Ãu×]‡¦iÛŸ¦iœwÞy\uÕU¸\ÒFlg©ªŠËå"èQUbçȧ±BÑŽ™¼†u­æ_zgˆ´èØ‚ðç/Q±ç4PÊö8šèò÷h²25¾«™ŒPl¦k&ÿ4¥"Eˆ,a©\ÑRÃ}õM8›«+ÛY•s°$ëì•íß_ßÄ^® k U}8Iîý‘õÓÄ‘Çúü¿ê/rü­³Œ{:Ëz´Ž'ùãœàS½™Dw£¡3;åáý´›Ón:ûà½xñ&cƒéµÍ=frZÍÚ®Û ®®Kl²Í=¶ŽÛ×Êëî8;¹¿:óüêôFKƸyЗUççVodžõÒëSQ\b±ÆdÊ”©EÙdÑ¢…qÄ‘=nñ9iÒ$<¡P¨"ÛuX–E2™$‹Iâ»HÒ[!„è'Ãêãì>* À’•!–¯ 8¢âe¦cD–¼IhìÜU#pW"ݺœ» éšI¸@3ù—©±qjB1°,È:¹¥£‚Ë*Ûñ©×W·òµu„w2Ñ:Ö™e/W€:Ý N7z#ÜÍªÒ ¾Ñ0˜¾¬ T€–‡9?é~ì®p9l_ëÚë‹sŠ?Þý{Yߢ¬“YI/3>¾èà ëÌM»IÚ*^¥øª)·¦ÃÔX&Io!¤L&ä'Å wF¶½B?kZ»¯×Óã¤wee%–e¡ªÒšig©ªŠ×땤w‘¤·BÎñÇrqåGÜüvûVOH¿6õ0œŽ ß:[Ã^=§oÂ1“×`ÛðÒ;C Mñë\8‹ÐØ)”ŸÊÚÖåt÷:?Ñ j›¯k&Hµ·Þ“±{¹2ï3Ô‘ã–š.l®%¾½“^ÑÑ‹nÝ(GŽüqžûûdûAÕâ7Õ­æIëšt[ûSÈ÷é>Ågª/¹I‚y¡óbÜϳq? ýܲ#k+|róo²_÷»³ÞNyúô↢°¢ÑNgq¶±m ˲zœô.ÆV-BôIz !ŠŸ^ÁAGÂ~ÞiKÃë6YøÖkÌlÈìPk…m÷sÜ’Í|k×»ºáõqF ‰°ð‹r[½ލøe:V“j^Œ§v,‘Ðöá“©75Î× ‚À4“'L\¡ƒBô¹ßµWR¥Lr§™àÊp_}ç5Úæ„ˆ›³¿;ÍDwÿŽ9;퓤÷$wšÿWÝJyW’°©qyk5o¥Jnp¢?ÎIþ8C6ªpÏØ 3“^fÄ|œv´ ׋ _É%½Ÿé£ BˆÂóx<|ôá{LÜï@Üîâko¢k:aª««z´^SSŠ¢Hò»¬koRŒíovE’ôB=­nŽr-äæ/% ¨¡aL®ñ¢’ÁrÕ1õ¸IŒ²ÒØ.›%o½Î‘Ž?~?å²8ýðùÌWx¯òh.Ÿ¦%孙͌>j"Cm‡#Æ[/¿Ëbôš=øÚ4••A"¼Èã‹“Ý'zÕåeœ<å ÍÆ×ÔÚÁ ï|Ðo¿QšŽ8°ÈWy¿üîàGS::ÌÂS;EÕ Ž=œŽOž%<`j\¬™ RlNëJ| !¶œ­pYK wÔ63Á•a”#ÇÝuk¹¤¥†Ž¾œŒöQ”[6Æ™eW†O2½S!P-.­èàDœuiÿO3.~ÕZ½Ù‰]ŠÍ‘Þ$'ûãàI±qü§ÏÄý¼œðíT}oz-é¥ÍÔ¨ÚšÅfaÖÉœ~êÝ.„èÁ`HgÏ?û¯¢L§R)^|ñ@Î9眭÷ú믓L&{\!.6µ®½I À4Kã³k “¤·¢è™-‹yW9„óޝfñšfV®iàÝ%,ªöžÌ^ͳøóûPye4sg¥ˆÌ}¾ˆáÚý8~²{ï7+„²«¹ý¹/L:•1 ¯p×Çq<ƒÇ±»_GAÁ“Yͳ/® [0?? }ñ²îêÑÖp'÷Ïø_A¢t ®I0vx¾ïßÂ/Êin—*ïí_õF2Œî-§lÜ„?}Û²ø‡¡óÍÄüP3yÚÔÃJ!¾¸¥rIK ·×63ΙeW†û뛸ªµšÏ¶3™ìU-éjÒߎð%v:é­)pš?ÆÊ:)ëJ›¶ÂÃÑ ww–a¬Wù®+6¸ÓœàKp¸7‰_Ý0IÓjj<ßÕ¾dE?ôéî)ÃVx0âgýØŠfgÜ./tBˆ>dš&@€P(„¢ô|”Q_Ëd2<ýôÓœ~úé¸\Û÷Y³naÆm÷:bËlÛÆ²,Ix Iz !Š_¶…Y3þÛžƒëësÐ4NÊÍå¾WWSò¬<€³+mÀ‰içØI‚c&1}·,f =¢¢`‰DÉ¡PòY‘Â’ ‹øp–YÄ"1²9CÕ6¨€ª©(ã¤Ã·PéÝÖÁ oK¥·Ø²#&5vßž5{P#)=¶eѹèuª&~Ý[†ØþÄV|@'ð©ñCÍd˜bs’f2Cª½…Ø%„MﯭãÕ­Lö¤¬üµn-·‡Ëy<Üf?åƒÝiœJaªÙó¤¸m×u*6'ùã|¯¬sƒÊçeY'¿k¯äó®dz +©°'Åo’àF‰nÃVx;åáß±ï–@ÿé§c¦£›´a)6¯%½¼Ÿ’áìB t¦iuB³££ƒ›nº‰+¯¼r›•ÛŠ¢pà 7ÐÙÙI  ›ÍöS”BôIz !ŠžÄDÕóòÒ+—GXÕ#§¦J]E¸3FkÛ»<27­y©ö[ö;•úÕÿáþYÊö=‰±•]Wám°éŒ¦©,÷£Á=dOP–2{1´tH¥·Ø1µ•Iv`ÉÊ -¾GTz"‹ß rŸ“PT²Ý$¶"‘éï¦Æ¹š‰ø±fòŒ©}òFÑ;’–Ê¥-5\QÙÎ)þ8ÅæÒŠNĸªµšYç×ÝÓ•éÇH74‘£Z3iíÁEºŽ'ù㜌âX/Y³TþÖYƳ ?{83ü ¬“ƒ<)&¸2›´.X”uò|ÜÏ‹ _ÛÁÒº¶6…ü»m7’2ŠKQXŠ¢àõzyñűm›K/½·Û½Iò[QÒé4úÓŸx饗EY¹.ÄÎ’¤·¢è%ZZ°>Šï›ûÿìÝwxÕõðñï”í»ê»’,wlã &€ØôzHB/!$ á €˜N€@‚Pˆi¦ƒ n¸[½÷­SÞ?V’, ÉZÛçó<ûììÌì+i5;sæÌ¹D Ð6¥Ì6ËÆ^¹˜ Ç—K ÂÄN¾ZÈ»ÛJðO™ÁùMÔÔVSWpÛJwÚT­\Ì×'ÌàŠ~1Pøèö·Ä!¥¦·Ø]3¦”Òz ùÁç’å½;ÌHMÛ–<OîA8Ór‰7”Sm+Ì55~¤™ SlŽQ-ÞM‘:´BˆÞgØ wWå°(âáæ¬24“ŽÏõ+aqÄÃK i|ÒE&ó0gÏf²™ñ ~\Ÿàñ`3;scø@G¢Û ·C±9Øgº'‰þ& :e8Gm…¯b.ê-•ïùiV ]…*l`MÌÅûa/¦`ù’µ>îd}72„H]Žüõ<ŽùßÙÜõa* »ÝMÓ¹õ3ùä¼»ø_*tUì]×ñûý¼ûî»|öÙg\tÑEL™2…ÜÜ\ÊËËùüóÏùë_ÿJcc#~¿]—РØ?É'[‘òìp1ó_/f~W c¥¼óú›f.ä¡ß¼š¿$ùüqëŒH1o½RÜñ-kçsëtÕ<ðZÇÅRÓ[쎌@œ±Ã“uH·•úÙZèãí»ê¿þÀàÉ€BÚðéT-}€'M 5 ¸D3%è-ÄèfK¢nnÉ®æo€©žS=jMÅQ7K£nÖÄ\T˜Á.E4bYœ[îâä¼2.uÚ€ÊÛ•!j3˸ ‡Ï˜†;”:^Õ"K3é§5“Q®ýuƒºÖEùPwKî®Ô˜ŸEÝ,Žxø,âÙ¥Œr!HêP~ôØ_¸ /JÌ´Q¬åkÞ㹇Ÿæ£Òž(©c“ˆ[Ä{PRIÉàÄß=ÍÔ·À] ’û8uÈ™3gŸ^s9ÏlHîÓôC®áÙkùõO×ñ½GcÉõ÷° ±óvÛ÷G!4ép2Ö|Â×aÀŽ·âìIWEjp8mÙÜ?ü0†a´ ¼©ª*º®ãp8ðz½ðû5ùt !„½ä°ñå¨jòÌáÃ%ù}Ü›}[¸t Fs º/‹´aÓ©úòU°mJl…ÿZ*'©ÓT‹ÑŠÍj[nÏâ@ScjÜRâ`gœ‹Òë9Æ×Œ dj&Çûš9Þ×ü--Øäº¬®MgU¨Ž1ív#¶åæéêt6(&˜ ÃÓ«¹Øáæþª4êô9èDZ†¾¶-/Tg° Ų™”YÍyÎŽ¤ŸgWóóÝø;ïÙ [acÂÁꘋ5q'_Å\lˆ;‘x•»Â ÛÀS?<—‡×šàÎ㨛æpïX~×ûl3î vŸº• ÇŒ@_° …Єñx«ÝL˜˜º¡ •üÑc~þ›#…¼ð›mÔ[çÕ~õýSˆÜó)_‡Sá=I×u4MÃétbYV[‰EQPUUU¥¤‰ØïIÐ[!„è.§É”1TÔxX»)³{´³mê7|LöøSÑ}™øú¦¹xO:'µ”+¸B7¸a¾…_±gÖÆÜZd@]³|ÍLsGçŠu™9Ý™¥7q£3À=unîÏü¦JQSŸ»ªx4Í€D:WVû9Äã£Ð[ÉCƒææ ï%“/)nÊd¡³š9é‰äºµ>f†šÈꡟ/l©Tš[–Dݬˆ¹Xw—‹}Bìgzyy&Ø&k>øŒº²HW ÑÏГ¸æÆó™t¡D·±à©xba)†c:·ÌÏg×9몙ä/ûþîc\ã/ä–ŸžÊp=BÍæøÜŒ·]Œr=™ëoú>“²Ubå‹xúÞGXPb@—m}Dk%ûª_›5šþê2¶ØéŒ?4ƒŸû/™DÎÜ"*HcÔØ+^Ù„í˜Â%÷Ïä“óïæÃ„BZWýQ28ìò[8g̬{çpJÍBfß± #Îúž4ŠT|ô÷Ì^@iêŽÛ(º¡( š¦¡ir×80É=ÀB!D/˜2¶·+y†ðɲ<ɼë ë?†–ßdÚð#Úæ/·>k)kr‚jÑo'‚[Bˆý[aÂÁSu\^–Ç1…¸¾<—ûj²x¶>ÚnJ~äùk8ÝÈà±hkY¡ÂÐÈÓMT@Õäš:› • –œçÕ 2[Ö-7tª#éÜ]•ÃÝõ.tTj:í’,’ƒ3-Òɼy IDAT]€×«Z r$8ÚægY5<›_Êÿnã¹~%Üœ]Í o˜€*Cú ±»w>‡Ÿ0‰æOSl®q\òë3izäBf3ƒã¯|•¬Ÿü’ï TÁŽcgòƒÃÖñ›SçÈ[Þ%ê™Äe7Íæ»Oç˜ãOáâG#Œ›––¼SÃ1šÝv&Í_À±ÇÌââ¿û¹ôÆ“ÉS躭vý²·,cyÖXFe(àǤA+X4ÿS¾È™ÌÄtœ#;|Kך(¶AÂ60l`Gý±kXðÀ}¼U¼œÇr6ç\:‡e À3…‰ú_¹ìä™Ì˜u#ŸŒ¸‚ó•d‚o3uêÔ¶ÍÞjw_i³7Û{N2½…Bˆ¦ª6‡/ ÑY¶6»{´H4U.ûoÞHü'¢¹|˜±dÉ‚gLiª…üH3ù½!‡8Bˆ¤°¥òiÄçýtƒY;,wb2+«E•™,Ql†b“«›”ÊuƒS4‹…fr^“á Š8`“§ôwÔò뀉jkš6’°g×fòB}z‡yÅf#ÁÁÎ8c]1&»£ t$¶+i³"¶BF»À¶®ØŒrÆåŒsN  Xs±(âáa/keH!º§ åÂçr¶¥âô{/yœŸÏÙŒ…†ã éL«{ëW*d‡r±›>à¹÷.åÓ ˜7P¶òÊïQâ’ëý ©Zñ×­s å`½ÎëË~À4@ñozW@N(›Ä'o±âçgpˆÿuÊ"Û·Õžb¯céê¡L?ØÅûñ‰ŒXó)«Í°l §êãÝÒ1Œ*[Êóa:DyvÜwÀ‡®(¸2rȱíd %c9¯ýsŽœ¹v_®0øa¶…:IàBìsäŒP!v‘¦Øœ9¦Œ|l»eA_¼‹wˆ͘aµd’Ÿ…ÏV†HrcUOiXÿÞ¼‘(šN`ÈTêÖ~Àû–J¡­0@±9W3yÈÐ ÷q_…©©è[.Š)Z˜ëÓ¼\\©0(ð×qXu6·W™`)™QÍdÍd~U·Ä rTÈ&yJ?-«søeÌÄm)äøk¸¶ÓæÊºØ~ÂVØw²!îäÍ&?!Ýà8o˜Þ0ÜQÀ¥Ø¸›Sã­fU†ÎHWŒIîhÛ*0Öc¬+Æeu:ï7ûx?ì嫘kBìwÌM<{ñy<¼ÎÀVÓ}îÿãO_ÌÝ×=Ï:ÚÕDÉc9Ew­­!HÞ6oUPöàh=ÔóúñÕÖi[?A¸¡å"U “œáÇ1û¥sZÈ*.c#+Ü@¤‹¶:ˆ±zi?3‚‘ÊX¶-~‚„b²zÑ*~~Ô!lºü*;¿­»þtÅn¤9áHþlІ†½ÝÅ7!„ØWHÐ[!vÑÔu\2±°¯»!RØô e˜¦Âg+sû¸7û—¦­K±»Õá&mømAo xÎÔ¸]7HNÕLþÑM !Äk]_ÝUËcífgz«xmPë«(—£ÞÑ̯óºÈWc\,ï~û;™y]aè¼ØÆ‹ iô× ÎKkàdÕ"K3¹0­M ÔdñëÊ AÍdš'ÂTO„#<ÒZ²Á tƒ¦×óÃôz¶$¼Ùäç?M~*÷¡}äãyeêNþ ÖHæz·Jn« îRÙŽô\rsM°-Êßy“×_ÈÁ™ ›«+©Ë ‘£’,w‚Fv(‹†ªZL’éØŠ ­¿p»¾ŽÆŒl2(³ÅGÀŸ ÛµÕT­z‚Ÿ\ú7JZ×·u9Yx[ö?íÛê¬æ«eÇÍ ½–ÅóšPPH¬XĆ‹'2Ë“Ëò×¶`ÓqÐÛîú³#Ç6” o!ľJ‚ÞB±‹6Õx©lvJV·èR~0ÌÀü&VmÌ¢±Yê ö$ˈѴm)iæãÎŒ3-—xC2À4ÏÔ¸Q7ðJÐ[±‹£n [Aïƒúÿe†Nán ¶[dèü±&‹9uü0­óÓð©C fç–óZc€?×fòf“Ÿ7›ü(À(WŒc¼aŽó5S  v$¸6³–«3kù4âáµÆ #Œs°#Ñðå”ã¯îŒrÆ9)âi»c@ì"ÕËY'shãþ]kcT¾Ã»®;8{ê<¼¨5ÿÎ9ªž÷n*Ʀèd6¾þ„ÅÁk8uì{<¹²×9~¼ƒêƒ±î=ÞϼkO_Á£—W< ü4Wiy·ÿ‰Û¾dyðn¾[ÿwæV+ €]Æ¢†k¸|ôW<ø‡í³²»ëV á|õwAí7ÿc©»7Bˆ]#Ao!„ØEåM..þ焾î†HQS©h›þd™dy÷†† Ÿ6l:!S©^þÀë¦ÆùšÉhÅf‚j±Ì’Ò2BˆŽš,•e1“ݳ·{߇aï·¯ÔfKeN]o pEFgQ€3î‰pke•16ɺޫc.®Íd”+Æ ¾fNð5“Õ2ç-á5¦Æ»Í>^iò³!³¨–UÓ×]Øç\™QÇ›}$RøbFJi«é h ÑÂOxî—±ÒPp°‰go~’îú#/ÜàA‰måÝncn©ŠË½}Sб”Gý¿¹ó)^vÇ©ßúóß/b0ɺÜOýü)n¸ã>þv“‡£èýG¸óáo‚Þݲ×óå:i¥K(QZƒÓõ,]TŽÏ¹”¯¶¯¼Øm°·ñÖó+xàŽç9ªú]î¿qÉnþ…"5õÖ·`çv»ÚŽÒÅtwóºzVvòuëCíbZk7­¶{Ýþ¹«ÇƒGyäx€…5]|»!„8ผ&¿¼tN‡II…Gþ>¦¯»´R†ž{?º'x] [^½£mÑ(Åæ–,ÀWL_È€–Bˆ.œîoâW9U{}»?(é·ÓåMvÆÁÎ8wæT1¼e¿gØ ³k3y©!­Ë’ºbs”'Âi-AòΗ×´Ô»ÉOC \4éŒóB¿’¾îÆ>éW•AþÛìëënôª¡‘äÿpAAÁvË4mgïöJÐXYE³©&ËzØÉºÝ¾´4|Îäÿ€mDh¨o"fZ è¸éÜ:Š¥®"‚;”‰»]$Ê5R×&a+¨º·ÃpçéVZÚj$jØØ(èî42ÓÝh;h«#‹HmZÁ4g[àÃhª¢2ê!”ãCèÔVwý1#uÔ4İ5éYN"•íû`¯¯¤Ñ‘C¶·ï÷©lêÔ©,^¼ø€l³·ÚÝWÚì‰vMÓÜn^qqqÛ¾máÂ…Ës«‹g»Ýk»Ý¼ÎÓíìäëîž¿mÝÌëñ[ð$è-Ao!„=ä°qåœ:c+¯¼7„/Vû¸Gû¯àÔóÉ}[_û?bµEmË^v$˜¨ZD#ãNj%ÓMщK±yk@!uïU>^useY^·ëPl®Ï¬å¼´†¶¡·šüü¿êlâÝìÿ‚šÉIþ&Nñ71Ø‘è°,n+|öòf“ŸO#ž>«}gN§ø›úhëû¶/£n.ï…Ï[*é™ ·Bô- zw»Î‘ËuB!Di-mi¬ø:«{³kÜüyÛt`ÈÔËþÖ’èÎÚ‹-!ľ#f+¼PŸ¾×¶gÔföJÛ [á5Yü¬<—XKûDä–“ÞÍ>°ÒÔøk}:çðãÒ|^i ÐÔ²ÿt*6Çùšùsn9ï ÜÆõ™µâŠíÕZ¿NÅf†7¼·¸¥mHB!ôB!zÀà~äf'+2.[›C÷‡*˜æ‰0đ౼2®,Ë£r2Û‹ Çê2x¬.ƒ‘Î8ßõ†9Æ×Üv‘À©ØLqG™âŽrÉ¡›âNÖÄlJ8XwR˜pPfè»U|Ø.½£ÍA®LÔóTFœ½u¯U¸9ÄuF-³~þd6r«ßØîî¢ÖužHOìöG»ÛÆÀ½pAGˆ‘âëG¿¦7¸åŒëXßàdäåóøUßeùïP—ŠÑO%ÈqWŸŒs})õ){=QcÐÙwðÓƒÞâ¶Üʪ:Õ“AvÀ¹WKkuËw—]ÕŸù—Äó›c¤vÏÝvK®xŠuRM*%IÐ[!„ØC“FW¢iÉ#\ÉòÞ{b5ۈחáLÏ#0d2•_¼ vòïPh+,´TŽV-¾«ZôSlJd@K!Ä"j+ü¬"ÄBá‰0Бà‰üR./Ë£ÂØõSÀuq'ëâNæÔe0À‘`š;ÊTO„)íJ¨Àpgœá‚Õ [¡ÄÐ)5tÊMS£ÎÔ¨³TêMK%n+mõÄc¶BÜVÈí²,‹BI8ƒ?7¸ˆ*6¦­àr6rcf3}9t´ÛSËí}¸ýV6t ÐS'?Rˆý‰]û)/>£ˆO=ÈóKjR¦tˆ]¿€¿}x7ýê\žy½ŒQçžBÝœ_±"šìfS’œý !„{à õd¦%ëâ}±:ˆiÊÏÞÔ¸å ²Æ @`ÐÄAï–J‰­ÐO±9Gµ˜ ÈÞBˆIÂV¸­2ÈCî‰0Üç¡Ür®*Ë#ÚP Xs±:æ‚ÆÅf¨3ÎÝ K°{€n¯;5¨fwŠ#\¾JÆ·Åm,&¤Õ2ˆ& IrUvw,“‹ÜÄ6Á@5—y "ÍA.ovr¶3†4¨Q.ÉŒ Ç3¹¤ÞÍÆDEÞ þ0©k 1?¥M™,tV3'=‰t®¬õ13ÔÄŽ.owÕn ¶­óßê4¶úªøYKÀ ¸)ƒ%®*J3hŠùùÔT)Šf𹫊GÓŒä6«ýÌ|³~çeÇ RðhNo}Ò$è-D¯QCÇpÕÙ*ÏÝô ©SŠ@ 1ëê“)}è:¾ÂÉ¡©Õ»”ôlrGDþß~ÆÅ¿-FýýóÕ}åoYИ"ao%Ά7ÿEá/çÊ›\øÊ^äÖhJêþ^tôB!öÀ´qå@²ªÆâ•}ysõ)VSH¢© ‡?ÿÀ‰T~1¯m™E²¶÷MºAP±™©ZüGj{ !0 [áæŠ³sË™àŽ2Öã·ÁJ~QÚ­ZÛß&b+¬Š¹Xsm·L24“tÕ"C3ÉhyÖ_K™·bãPlfúšé×Ey«›n–nàÅÆŠMu8ƒ{#ºá ¡+mƒš‰(Øè@•©rZ¨@º#A0†Nu<»ÉÞëD©±!«›øFçvM ¸1‹¿hîÈ2ÛeÁ+”Awr^š«‰ãQXÒ¤‘×2=A®é¦ÊN®_at½,G7Øþ·dJÀ[ˆ^£dLæª;ϦæOWóFoJEØBÇ_ÃIÅqíjp¦úðŠ‚¹l.Ï,ãæ@é¿yc㙌ª±`yj”jR‚'pçï¿Ã'ןÌõëaÈéÿÇŸ¼’Ù×=ÆŠh_÷Nt%¥þ%…Bˆ}IF ΈÁõ|½5ƒºÆrŠÞÔ´u)™cfáH áÊìO¬¶¨mÙ\Kå’<çj¦½…¤¨­pcEˆ'òÊîŒs”7Ì/³«¹§:{¯öÃjZêz“pt»®Oµ8;ÐØa^'ŒQ•Æ"5Ó5•¥uY,v×pqm¬iÈd£»Œßù,*sù¼›Û}ÒU›jCÅÆ¤!á ’8¹ºAG-¿˜¨¶F¡iS°1äÜ@%p¤q{—!9ar° i&%††…As4ÀifšnRÚ2ÃA¹nTôäú].Óv˜»·)m"D/Qã¸ô®Ëp?s=w-5ñ»SìSÉbÊQ“8hÜDÞ:=¹PnôÓæqÈü»øáŸ¿ 5BÉIfY1eé¹ôóhl³‡¯n‹¥H–7à7Ë^âÖJ?¡ Ôð/Ÿú0Ó?ÉŠµ)XÛFHÐ[!„Ø]“ÇT *-X®HÁÑVM[—9fþA;½«l…w,•U‹éªEŦHBˆP“¥rCEˆgòÊég)1tž­Oïë®u©°‹ ¸ælà·éü©2ÕVHs×s£Ë‚ðöm ðD©­Ïæw1“|=N(àíD”ãºØÞ`#iU9Ü7ÈV èç¯ebu¿Œ™¸-… ×îÆ´C± ùj¸"–Ëïü!@úê˜\•ÃM1 ÛNpv¶Eg‡Ugs{• –‘Õän ü]-Ûñ÷ËBˆ^¡xGóƒ;¯"óo×sçÂ~Ö×]Úž]ÁÜ+'óTÛØÂ:So“ –žÁM <Ó])UìÄÞöïZ÷ó£ã>âóKpŽ:û-በ¤HO£……DÏ>’ÉYkYÑhã<ƒéýŠø°¸7î›=¡·>9Ûíj;JÓÝÍëêYÙÉ×­µ‹i­Ý´Úîuûç®yä‘ãÖĺøñzN~0Ì‚F†ÂÚÍ™46wŸ!„¢÷) üâ’e¤ûãÔ79¹ï™ Ø©“ˆp`Q†ž{?º'XM![_¿«Ãâ£U‹§ZP›mj<(A!Älˆ#Á3ù¥øT øeEˆ÷Ã]Uƒî[“ÜQæä•íµíY¦‹/Lƒ)N“h$›ËÂažÍް/Ÿyý·Ùǯ*÷ßÒkC#Ul·LÓR0)ö ™'ÿž¿ß4ÍnÄ2‹™{㙳*•ò§ÛÓsåÓœ¾òrîù¸wcX»Ç æÆõÿï§ÌèÁ¬[Á‹wÝÅÜm ÎÔˆyc'œq ·žw,ÔDï>øÿ2‚sv9¦¹}–xqqqÛ¾máÂ…ËHVÌêêauñl·{m·›×yºýƒ|ÝÝó·Í£›y=~6-g})î¨I¥Ìš^Hk]üx¢¿¾>‚-ÅŽ+êYL;v:½ ¢–†×m²ö£¼_â`úY'’õñ¿x£´åIÍâø Ž$öï7ù*8…Ó'æâ4LT‡j×òê«)Ž#„¢ ¬'ÝŸÜY.Y”€w_²mš·-#}äѸ²àI4V¶-^h©”Ú ùŠÍÙ-ZJ>†â@µ9áà!Ì-Ç¡ØÜ¬¤¢,¯º¨ÁÝ—–Ç\4Y*~uïì±T>«ËáUÕ"bÚœ“ݧÞ_DÝ}Ý!öC6Õs/cÜ“ƒ&¾ì i©¡ÝŽÁ—÷žÈGÎ ™žT죎³á#þpÑ[üưAuâKOÇŸB¿OÅa²é·pÞ3‰ä¹„¢ã¤pËE¶T%Aï–“eæô"Úët˜œuÜ&øëø—@´¼ÑëZ˯l ¨é9<äEµkùbi7LÀ;¥[ˆÎcW÷qMäŠi ¯Ì}M1ü±“tRRïùK,B±™4:TµmXº:§{#·.%}äÑøJíªùmË,àŸ–ÊµšI¾bóÕâC©í-„8€}uó‡š,nϮƭØÜªàâÒ|ÊSèNÃVXñpœ¯y¯lOÑ"\Šì•mí ða fð ±?P½Ùäïsÿ^ Îô©<ž¥¢{HÏöšE·TœþLrü}ݱ³äŒ/…õ 5·ÕŠm/+=†ßÛq³âk>UÆrñ‰‡sÌ!C¢–óéúZL ¶e%_ea¢_<2>È×_nÅ;x‰µ«ØÜvg‹AéWŸ±@ÞBÑ-¯Ç`ÔÐZ6¥QÛZÙq¢HÙZ¬x² «ÐÄí–Ï3µ¶ìîs4hF!^m ´ÕóÎÑL U쵬êõv³¯¯»°ÏZö& B!PôNa±x×)¦¥í¼,^Á¯½Ê“ V³±ÙÁi'pݱƒðXÕ|òL9$=s‡¹ÖóQK©¥%\q äÔ³NåêóÎâæ†±Ï]´Bˆ½hÂÈ*4-yypɪý·Væ¾Ä¶Lš‹Wà Csw,Vd+|Ú’Ý}œj‘ÕÅEe!„8Ðü¥6³-x˜3Î]9U)u‚¸0ì¥,…²Ï÷%/6¤õu„Bˆ>•JÇ4¢“…iTT{¶›¿dU„ÑñOç|(Ç÷aEêÙºiïýo-áä¨6uk¾¢|ÈŽ?„úe먱mª6mE=ž‘^;¶7þù½¿ Ã딆Btcò˜äÀI‘˜Îê™}ÜѪ©pYrBQðõ?d»åóZ2ÞÀé)–Í(„}Án¯ ²&ž¼áý(o˜›²jú¶SíXÀSõ©{£{ªú(âa©ÔóBq€“Ëæ)Ì0UþúúHNüÎ6†¬'–ÐXñu6ï-Ú~têæŠ ìãŽåê ¢h›Ò?f[ë9}¼¶Nåúƒ yda,9ôjå—<ûÑdN?õ4¾kX((‰Z>þh#{§ržBì{úç6“›,£±|]6†)— SE¸ø+°-PT|‡Ð°á“Ëç[*u6d(É'ÏÈmßBAÔVøyEˆgòÊéç¦5°9á`^càÛß¼¼Ñà‚´†:ß¾² n+ {¹¯:·bóPn9Ã%ÃZ!„û z !„;irKiÃTY¾.»{#º«-ÂhNÂÖÕ`–ðÍ€–>ख¬o!„IóÑìN$Äb1¢Ñ(¶mcY¶m·¹5MCÓ´¶×=üVEQPU‡ÃÃá@UåÜ!ÕIÐ[ì¶„¡R×袮ÑÅÖR‡eÝ¢^Cú52rHùÁ0šj£*6ÃÖ3|`=јƒÕA>]žKmƒ«~ !„èžÏc0jH- Óeµh.ZÓ.ÀW0v» 7À¿,• 8W3%è-„;`wV1l…SüM¤«æ–ó§š,æ¶ xÙ[F8ãmo€½ïî˹)»šËJóûlûBq j vÇãqÈÏÏçÜsÏ娣Ž"77—ììlª««)//gáÂ…ÌŸ?ŸÒÒRœN'š¦{üníƒeY†A,CUU<O[û"õHÐ[ôŠ„¡²¹(ÍEi¼¿¸·Ëdäà:&\ÅÐþèš…ÛerÄ¡e>¡œ_gñÞ¢þÔÔK0I‘Z&\…¦%rdË}G¢±’x}Îô<|ýÇÁg/m·N…­ð?KåÕâ(Õ"W±)—-…¢Kð›ªÊ K3êp(67gWs3Îý5YÄ{iÿySVM¯´»;Æ»b|Ç棰·¯»"„Û¶±m›††233¹ãŽ;˜9sf—YÖùùùäçç3a®¹æÞ}÷]fÏžMUUN§³-[{Oû£ë:¶m“H$hnnÆápàñxö¨]Ñ;zërDçOQWŸ*¥‹éîæuõ¬ìäëîê^·îêqâ Aƒò¶ER«w*2L•òj/Ë×åðÙÊÍÌ´8^·¢@^N„i‡Tà÷”Vúˆ'äJ™"5œyìfü^ƒHTç•÷†bIPtŸáäà Csùhܼ3Ö´Ý:QNÑ,T ÖVøÂ–lo!„èÎ’¨›Â„ƒéÞº£\qNô7³<ê¦ÊìÙcøC\1®Ì¬ëÑ6÷T–jñŸfÿ·¯(z]¦ --m»eRv@ˆ}ŸmÛ˜¦IMM ³fÍâ‰'ž`äÈ‘;¸V…aÆqæ™g²uëVÖ¯_ßVòdOßíËœ¨ªŠ®ë$ âñ8‡c·ÚîªFycccÛ¾mÛ¶måÀÛ$+míìƒ.¦ébz¿&Ao zïu†¡²­4Àg+r)*÷ÌŒð%PUèŸ×ÌÔC*qè…e~,K‚KBˆ¾3 ¯‰SJøbUµ›3ú¸Gb—X&içhª"Z¹q»U¶Ù çk^ ›ç{8`#„û£ 'F¼LvGÉÐ,ªÅiþ&25‹e17‰º@|CV-܉i«§ôs¼Ýì£Á’&Ao!ö_­Þ555\vÙeÜ~ûíèú®«Ðuc=–x<ÎÒ¥KÛÚèÉ:ßš¦aš&ñx§s×Ç} wï‘oÑglÖmÉà‘¿áù7FP^¼MÐé0ùîÔ®¿p%Cû7ôq/…²I-X,YìވݩXà0®Ëu ’µ½)6SUkouO!öiãN.*íÇ«l@SlÎMkàŸEœhÜãM—bóo¤'ºÚ£àhOêõK!öíKšœp \{íµ{ÜæUW]Õünm¿'´½]®d©ÞHD¾R‰½EJX»9ƒÙ/Žeîü¡Äâɬ‰¬ô?>s-g»·K²é…{—Óa1nD5%>J+¥~ç¾Æ¶LÂ¥kð„Buv]ko^»ìîs%è-„;-l)ü¶:›ëËs)1’Ùs9šÉíÙÕü£ ˜SýM8”Ý ,LrGñ*©¹O>Âîë.!Ä~-‘H™™ÉwÞ |ßÝÀm·ÝFVV–Õóß-ªªâr¹H$˜¦Ä¯R…½EʰmX¶6‡ß=y(™‡e+( LSÉ ?XÉðõ}ÝE!Ädìð\ÎäË’å½Ïj.^ €¢jøúérM¶Â-ÙÞÇk&½Ö;!„Ø?,Šx8·¸€¿Ôfna°#Á9U,¸k3kìØµ2%£\±ÞèjIƇc:·þëNŽvtšîímõ¦ýåçûöYÞ7Þx#n·{Þ­·ÛÍUW]ÕãÙÞ@[o‡Ã!ÙÞ)D‚Þ"å$ •ÿ,Èc/n+y’æ‹sñéë8þˆB4õ€)?$„èC“ÆTÉ}ÒŠuY}ܱ»š‹V¶M{ ºzÌk z»Ó4ÉÎBˆ]³ž®O笢^lH#ÒR×Û©Ø\”^ÏÜ‚b^êWÂõ™µæ‰àþ– ða]É­D:——¥QÖ+?ÁÎs(6ùšÑǽ=BÊž˜Ïÿý&o¾™|¼þâ LöMã¦gngF@;NÜŠ“°é8ÝJÉàÄßÿ‹;g|sW :ä‡<þß§¸dø7w“é‡\à ýˆ!žvm£š4­oíªýõ{Îã\2¬SmyWû¶»±³ÛÁEÁôqûCÏó¯7þÍ›¯ýƒ'1{¬}!¶gùùùÌœ9³ÇÛž9s&¹¹¹½’Ýô¶,«W²ÉÅ®Ûõ*ðBì%Eå>ùûf^ć–¡*6GM*eHA#ÿx{µ ®¾î¢b?•“eP~#«7f‰É×å¾Ê׫)Ä•5`‡™Þÿ15~­ø€³5“¿É€–B±[ªL?Õdñt]g95ÐH= îŒ3Üç‡éõXÀ渓m†Îú¸“RC§ÊÔ¨75¢¶B¾Þ}P9Òäò°Át]eCLcˆ'†f鬉ÁÙÍl¨Mgƒb5ሬ*ÎsÚX¦—û«Ò¨Õä¨KÍfžÌ6˜WÁ ,ËfRf5§Ùiü¦Î…®Ù4Yçf×rx§¯…ŽE†ìû â±õóó‡Ø)ä…Ö¶ÕŽúþ)Dîù”¯Ã»!6ˆ ÔÎÿ&±åß´½Çrÿ\dñÒ—rë'Ûˆ8ò=±€H´/DG­Ù×Ñh”ÓN; UU{4’é£>šyóæ¡iÉ{O jÙªµÆw"‘h«ó-úŽ|K‹”fš o4€µ›28÷ø¤â ÈkâÚ ¾bÞ;CY³)³¯»(„ØM]Ië±Ï«¤´É¾.\² WÖt_Îô|âõ¥Û¯¼ijœ§™¢ØŒQlVÙrïºBì®zKåéútž©Og‚;Êñ¾f÷Dè×ÌVaÎ8Üq¾»5² AòãÌõyÜfGx63ÁÚÚ<æF#ŒTs™ÇHÇ›œíŒ±­)"o˜Ô5…˜Ò¦L:«™“ž€D:WÖúéòÐ䩿i lÃIe_yß”ûgzyyí2?¸äþ™|rþÝ|¸1·ª_›5šþê2¶ØéŒ?4ƒŸû/™DÎÜ"*HcÔØ+^ل혒lû‚ÙÄ| 猂uïN©YÈì;Ö‚ábÄY¿â“F‘ナžàžÙ (Ý™ÄÔöýf:¿|üXÊXŒ:$ OZ:öÚ¹÷Á÷)iÿ%ƒi7ü‹£áæÇ¾¤-žíœÀy?È;·ŸÇ kø‚yøm“’µ[МTÀ3ô$®¹ñ|&](Ñm,xêžXXJçÿŽ®ç˜Î-³ÇóÙßuκj&ùËþÀ…¿ûˆÔ-n$ö†x<ÎÔ©S{<àÝjòäɼüò˽Ҷ½S‹”7û„-%~il[Ûí2¹ðäõÌš^„º›ƒã!DWTÕfâ¨*j\l.Jëã‰=Õ\²ºmÚ×M‰“—­o‹Î“'BÑ#là˨›ßWgszQÎ+.ྚ,Þlò³!îÄ܃ Œ™š‰¸T›lÍDœ @u8ƒ{k²x´ÙAÂV°Q¨6Bº… ¤; C§:’ÎÝU9Ü]ïBGÅç¯á+ÛËò¸½ÞEsÛ–ûös¶AÂ60vòTÓÞ²ŒåYc•¡€g“­`ÑüOù"g2ÓpŽdìðu,]k¢´¶mÕ°àûx«x9ÿälιtË€g õ¿rÙÉ3™1ëF>q纓űÛ÷ÛŽ“ȞʨÊÙ\}ÉÅ|ÿìë˜_ðÎkß–âbøy¿â2ÏSÜðÇEÔ·ûyµãk}È\ø] €¢áh xãÇ%¿>“¦G.dæ138þÊWÉúÉ/ùÞÀNa¦îÖ³ãÁ™üà°uüæÔÃ9ò–w‰îÜO*öS¶mcš&ùùù=VË»ó#//¯Çkz·j­í-åMRƒdz‹}F8ªó·7∉¥Ìš^„¦Ú=¹„þ¹Müãíá4Gäã,„Øs#Õð%ëˆ.YD.«íû"å_c› Í·ßjW¿ÛåzË-•5¶Â(Åæ Íä^Cï2Ð!„b÷mJ8Ø”ø&è¦)Ò ruƒ<ÍÄ£Z¸›³ ÜÅÁ/[ÕG2Øè+ãw>‹ÊÆ\>OØd¨6Õ†ŠICÂA%qruƒþŽZ~0QmBÓÆe8^Åñ ëëò˜s¿ß¤}x^ò¼÷#Úp.zô5¾ßrÐÿâA.úmí.5¡ØëXºz(Óvñ~|"#Ö|Êjs#,Èi‡úx·t £Ê–ò|˜vQwÀ‡®(¸2rȱíä- Ær^ûç&9!rí ¾\aðÃl u»~\_Æ[ïÕâÏÎ&@”ë ¦gû’Ÿe ²Žü)Oþ˜Û¯]@Äçép1Gñúð֖Ѻڰ~Ðt¦Õ½Æõ+²C¹ØMðÜ{—ò‹éÌ›· ë)[yåá×(qÉõn¿qà±m›P(ÔkíçææöZ9$ß½Ù¾Øy%ûøhi>…e~Î?q#i¾8Ã4pÍù_ñÒ[Ã),ó÷u…û¸iãʰmXº&§{#z‚m„ËÖá+‹'o$Цc›]‡+þfjü?ÝÀ œ!µ½…¢×™6”:¥êc÷×Ýz{1j³ù]Ì$_Šx;å$#iU9Ü7ÈV èç¯ebu¿Œ™¸-… çããÏiø5h²âœÐ)à P/ßûsC‡šÞŠ+`ðÈ]l$Æê¥EüxÌF*cÙ¶ø ŠÉêE«øùQ‡P°q4êòG¨Ü™¦ìFš-ÙÔŠ††½Ýçoç53[²´Q;¶¥Oå—Ø[—£x=hS­†šÓ²ÈР¤«Ã&:ÚÕDÉÌnEw­­!èXRàÛÖ³*¨{pHÑŽeY½8–,쇽Å>ikI€G_Ãù'n`pA#é8—µ–ÿ,Èg+zbÿ–ˆ3|`_oÍ ¾ÉÙÇ==%\² _ÁXT݉'4œpéÚ.×{ÝÔ¸E7JÐ[!úLaƒDªŽzÏkyá«äÙ–ÉP œ?·L”QʽÞwqK¥2ËLprVSœ&ÑH6Ÿ‡-T5ÆEÁòNï¨áß’q*ƒXî_¶«é½j¾Z†qÌÑÌÐkY<¯ …ÄŠEl¸x"³<¹,m 6ìT»ó¸z»úÛ~kmmY«ùËîÂú¿§¹ù{«¹eÞ¶w0X…+Xå¾#zŽÕk¶¯²mWWR—"G…b @#;”ECU-&Þ]ZOQ‰CŠŠ¢PQQÁàÁƒ{¥ýòòÎûüžeÛ6ª*WqRüÄ>«1ìà©Wæã/ó°mÐ5‹ÓfláìY›pèò)„ØuSÆV´°x¥\@ÛŸ4¯j›ööÛq]ï0ðjK {„b3E•ï!„è kã=áYA峺n¯ r[ƒÂ9iQv²Rrq[asbwÞ)ökÛ¾dyð»¥~Î’êd°Y‰.cQÃQ?úk¾\×EƶÕDC8ŸAý;xדCi︭FbJ˜wîy„º3n✡.äËxñ¹ZN¼õfÎ8$ˆKt¡þ!¼ _¿Ã»®ã9{j6àÈ?†sŽªç½…Å‚ô;³ž .ÚÓ4ÂÂÂ^«é½mÛ¶^ë»mÛX–%Aï!…§9Qä5átÈ ZY–Âäïo 'O)=¸ŠkÎ_Env¤{×=Ÿ'Áþ ädÈPB¤M³™4:yÓi]£“u[2ú¸G¢'ÅëJ0š“õ9}c»]·}v÷÷e@K!„è+¢n¬ž=]U´ׅʹ'§’?åVq†c÷òg—FÝ{0§ØOÙëùrNøË%”´}<êYº¨_éR¾Ú>Yìm¼õü &ßñ<›s;;^%ÚAüø‰·˜?>óçÏçíy71e—®Å(¨ªŽ;ü¿{°Œ“vµ¿Ö¤(”Íý)W>SÍá?›Ã¿þóo½ú÷^:…,6ñìÍO?÷¼ðÒ?xþwÇQúÀmÌ-U;meçÖ¢•®ë|üñǽÖþ¢E‹P:ßNÑCZât:åŽáTÐ[ßÔÛíj;JÓÝÍëêYÙÉ×­µ‹i­Ý´Úîuûç®yä‘ãÖtõíµç|žß?)Y¾ Óxõƒ!¬ü:«ÃzZÁÜ~Z•alEÅí2ùú£÷ykkµàn?'ŸÅ/½ÂÛå&à`òi'øßë|P¯’sÐNŸ˜‹Ó0QN¨]Ë«¬¦8Þ+?R¯ fF¹ðäõ³’Áî„¡òŸ²ø«ÔËÖüÎÄ2fM/DS“Ú«6d1ï¡Ä¿øÕÌC¹n–És/¯ VÆA¢W=¨† NÜÀ;ŸögÁçýú¸G¢§åq iØlüûÏ0£;\÷EG‚©ªEøNÜIµ7„b¯»;XÉ ¾ÔRøÞêlæ5úº¼¡‘* ¶[¦i;[ž,AcU¤ ´ÛQê*"¸C™¸ÙÁôöiÛDj+hÔ²¦9ÛFS•Q¡_r H»cf¤Žš†¶æ!=ËI¤²}û6ñúJ9d{ÛŸ+&h¬¬¢©}=ÕKVÐõÍû·ëk»¶<ñN}¨¥ºY'3;€£ÃÏe‘7ÒÐ%aX ¨h®™™^tÀ6"4Ô73-PtÜtn¥Óϸ³ë‰[k&v4ÅívóÆoôxÆ´eYœsÎ9ÔÕÕár¹P¥Gà¦i‡IKKÛ¥÷tV\\ܶo[¸páràÀÜÁÃêâÙn÷Ún7¯ótû;ùº»ço›G7óz<ê%…ÈRØéßÝÚðp»LΞ¹‰âr5õo2‹—òäëHjÖD®?á`¾Øö%ÕØÔm©aàÑ“ôÊglm7Œš;‘‹¦)¼2÷56ÅtòÇNbdÐIIq¼ç?m½¬²ÖÍ£ÿÍ©3¶2qTÝâôc¶0|`¯~0˜p$5>îó›8áˆmê´^Ce­›w>íßå{œÏÍ#êY]ç¢_?/e+°¼i ȳùä¬0 8ñĉôKÄÿ?{÷Åyî}ü;3Ûµ«•P—(B˜Þ1Å€qÃ6®ØÄŽKâôœ¼)Ž'yßœœô8É9‰8‰ÓlÇ%9vl'±cãFoSL  PA}UvW[fæýCH @`I»’îÏuíµ»³3³ÏjW»3÷<ó{°¹¡`Í*6Fp÷­“ñ4úhЏ•p˜Ç—±grÝ¢Yä­˜v“Ã׳YÄó3уNkëWlæ@ þ Bĉ9“«Ðu…i1nè þŠ‚SEo…„ì‰4ÙrÎy_Ð5f«VàÕàO’í-„}îíwܽ¦ÊrB¬›!zŒOjÛ}Šƒ¤ Ç©;çº}&gr&Î3¦ZÜ©d¹ÏµnМI¤uZÈ~ÚúlÞtRºjwZ]z±Ÿ³­×uf’I?³á§^“Õå%ÅåíêA‹oJ žñ»;Ÿ6›úúzÞxã î¼óÎ]÷Ò¥K©­­ÅáèùÏaD", Š¢ôÚ@œ¢ûä|’8¥ãòΚnÑ ÆŒðwY‹ÃŽ%¡½³¶Ò\Äk^ÏËâƒR¹Bjî0" 8ÚÑQ=Jåþ­¬ë‡ïváˆÆ«+óøÇòQq'/«ç¡ïcÒeõ1n]›q#Θ`lî¹ßWpµV°|ýþ]âdœ­”wÖ­çÊ4&gi(N+»×ñÌ[Ëyv\1>ÌIÓI+ZÅsËÖ³¼JÅ«€‰BÊ”¹L®Êç™·Vòì:Óçf؈‘8K7óÒ;Ëynm1ua+™´äVFæ´ `Yx$™æ€ätDŠB8µñéÊ9w®7ÀJC¥úTïîû5]6˜„"¶œˆ³ìì¥Ínš{8vE!½®EÁétòÔSOÑÒÒÒcYÞ---<ÿü󨪊ªª=ÚË»=Ë;‰àr¹¤à'â£ë«èÚ9þGÌ.N±Ö²§óÙ%c0M¯gÍêøÌ¶0i(ÜÄ{·ÞÀ­ÃWÒ9²¿ý\±ç¶Û¦2ÌbÃݸ›ß/+¡?wôÝs(…²ª„œt?W„ûo)¦°$™7×åÒäåÆó¥|©š´´øÑH4BS8€ D£š è&‰£gqï¨0º'K£†×mÁWÝŠ økëhÌk{îdo‰)3ùXŠ ØÐÍ ‚»×³eæå|æН˜w×ÕôÜË¢˜=¹ºã`” `9pé¡ZëJq¤æâÊž@Û÷q×?¶àŸ†ÊW4lÅäÕ`9„¢O™ÀÓ^~’Zë¦Ðl¨<ÛØuW!„=CQl6üà?àW¿úU¬÷§?ý) ±&=É0 B¡PǺ¥èdï-N™@Aɳ¦G¢*‡Ž½¡¥WìâÙ¿ÃÓ¯½ÅŸßxõgd™~v®Ý‡kþFÛÚâxj”¢M˜ÊX—‚:Λ¯¾É“kŽuÙÄ£ÎçàÏÿ˜ÀÊÍC‰êm¯h¨¾ñ©=\9£M‹Í—PaI2]}ÿ–$_âUF\~Y'6ñòªM¬<êZ:‰n; àJ‚÷TŽ[ƒ¯™šC›yñÕ¼°|=/¯9ˆ?ÉÊñ­«yò•7y³y,‹Æ8dm1hX-3Æ·è©©wr´¬ûùk¢ÿ T`qz±'ŸÚÙ+ºFû¯éÇe@K!„ˆ‰å-n„ãc@°§}I4HÜ•BôšöÞתª’ÀæÍ›;ŠÞ—ÚÃàñÇgË–-X,4Më±^ÞíW†B!TU•^ÞqFzzDZ¥ëFà´G=¢€@ÐÂk«Gâk¶_`É®™þ^?—oÝ®q0jvñüÆ™Üqûb®F1PP" lÚXB|%ç]:ÃPX÷~6û‹‡ð‘…G‘ÝŒÕbpó•'¸bJ5«¶ eÏ¡”.‹Ð½¥¬*7×çrË‚ãX´¶‘]RÉß™u‰k4¨9^{Ö5Ü—ÓB}C¾œI ݰÿÜëùd–¦(´˜&uû¶Q¼èZ>— lµÑ´#kÅ’ùS  œŽZ¶„úmÄkʘ:ö¶‚æ¶ýéòÙàüå ™r+®œI„ÊÎ9o…©°ÖP¹^5X  SLNÈ€–Bѧ à[ÕéäZ#œ·7™¦ÂŽVÉBˆ¾ ( V«•„„^}õUÊËËyä‘G.ª¨¬( @€Gy„­[·¢ª*6›­Çzy†ÑÑÃ[UU<O—ƒRŠØé­=·3×ÛÕó(]Ü>ß´®®•nÞo¿¨]ÜÖ:ÝV;Ýï|ÝÕå· ,˜ _ߊÝ+¼î0NG”Ú'Q]v¶/•¢´E\?§ —óƒa®«ê\¬{?‹}‡û¶øí°é¤&·Ò°âkîùÞ+ª;Ñ®&Šª[±æ]ËãŠylå ä+XˆÓ}éÞ†fø‰DUþç™é´†¤×@¦¨£îÿªÕN ¢²¿>ïü TƒçNZžÒ5~•þB!D<È ¶ÅÞääœ}æ–¦ÉöœýY{/mÃ0ˆF£øý~¼^/_øÂ¸í¶ÛPUµc¾ÎÚ Ú†aðæ›oò /PWW‡¢(8Žåݹy$!‰àp8p¹\D£Ñ ¯  ]ÊËËË;¾Ûòóó÷_ôs\Œ.®ÍN÷ÍNÓμÝùB7ïŸïúBÓ8Ï´¯ÈÉž[?ÐØb£±%>NéëÏL¶îMgÏÁ®œQÉüéUج:)„ë¯(gËÞtv¦Ñîý¤Ö°FYUïünšNÆ]9›y­!ì ùk*¤à-ÄrÒý Íh;·eoQмÓÐ žl–wççk/¶‹ø&Eo1èùšm,ß4ŒµÛr˜tY=—O¨aDv3Šv›Îø¼Æç5 Y8VÖEM½ƒšz'õMvB}‡"„èY3'Ö`µ´•.¥—÷ànª"ÒR‹ÕJBÎDjÞ?ÿü-À?tÏk:#“ëTƒU†Ú'mB!„b0ë\¬VÓ4QUõœEç3{`÷ÔÀ•¢ÿ‘¢wœ˜6®ŽŒ”@¬›qNéC‚Ô48ût ÇX9~ÒMU½“Ô¤VR’BxÝ!Ú¿#öèiEðv†¡‰ªè†Òq@ULÊ«¨¬uõékèiɉ!VoJMƒôtƒªšÌz€@ÐÂÞ¢”·Hôµ@yÞ±WcKÊÆâJ&h8ïüÓ5>£éhÀg4]ŠÞB!„Bô¡3‹×*fK±[HÑ;¤ òÑKbÝŒ 7Òë&Ä-U5±Ûº&rôˆFFhìãõ¼ y ,o›÷dtõ…è¯&Žj ÉÓ6xáÖ}éD¢RÀlümEoWöšŠ7wþ Sa™¡r«j0G5˜¨˜˜ò](„B!D_’b¶è.)zÇÆµ>©I­±nŠç¤i&·,8ÎÌ 5,]?‚£e‰±n’—lþô¶^Þº®°u_FŒ[#b!PyL•„n½žŒZ¸ÕÖv°äAK”/E¬½ÝL!NóK”»µ®²ÇÒ½aÅrH!„BÄ)zÇPXãñ¿MÁiƺ)禃 ÚDQ 7»™)cê=¢‡½ëK]Whh²SÓडɆ?hÅ×l#Øj!ÒˆFU ÃTP°ÿþ«) L]Ï W”árFIO ò¹%Ù[”»‡Óì—¢è_†e¶0,³€Ý‡Rå3VoÍ‘Èѯ\=³h«onÜ™ãÖˆX TâL¿ ÍáÁ1d8­u¥\æÏºÆÕ@þ¦ó¨üv‹Øx7ƹò7«FLŸ_!„Bˆó‘=51¨%yB\;»‚iãê°h§ï¼¬u±ë` Ž$S瓃! K׿²½ Å×”2,³»M—Èѯ¤&·v D[|ÜKu½3Æ-±¨( eÚb\9»UôÎ7Töš S“%šÎïuréí-bà«1Ž×ù?šÎÿµÄñYŠB!„bP“¢·”œQ®™UÁœÉUhÚ§³‚¶îKgç4êí1laüª¨NàÉNàò 5,šwB"OD¿rå©,o€M»¥—÷`¬9Š¢Úœ¸²'R¿÷n-÷‡¨…'­,À4Joo!„B!„ˆ+²—&›UgÁŒ“\9ã$6ëyÝõvVlFAq²ÄttƒiÂö‚4 Š“%òDô^w˜ãk€¶ƒ7Å¥ñ˜Œ+ú”i¨<€{Ä œé£P­vŒHè‚‹­1Tš ã“»5?èÕÒÛ[!„B!âFlÃ…èCcs}|ýû¸nNyGÁ»ºÞÉ oæWʾ¢!R¤½Hí‘'|e"'Nº:"O¾zÿ~FmŠq …øÀ•3NvœÙ±îýìÁ06¯èEŠjÁ™1¶[˘´õö°_ÔºôX!„B!DlHÑ[ x Î(÷,*á“‹‹ðºÛ©lö[yue¿{q2Ž$Ǹ…ý_{äÉ¿W$l+µGžÜ³¨OB$Æ-ƒÛaÖ¤jªëœÊÿ½8%P^Ðq;!gb·—[n¨”œêÝýqM'C‘Ã(¢RÓgó­Û/C‚É„B!Ä@"Eo1 M]ÏרËÔ±uè†ÂÚmÙ<öüTvHÅ”Ei<ùõߦ°u_:¦IGäÉߨËüé'QUùƒ‹Ø˜?ý$VKÛ`µë¶gËÿ¾èi©%ÜT€+»ûEoøÝ©ÞÞð5éí-bH˙Ͼ~77eh§¦X™¹ø®õÊlB!„bp’Lo1 Y-·]]Ể5ÓÊ«xmÕHNÖºbز¯=òd{A‹¯)eXfKGäÉÌ 5,]?‚£e‰±n¦Dœö(s&·õò®ó9ØwxHŒ[$âM ¢[b6o&–„!DýõÝZîCå ¦ÂDÅä.Mç/ºÆÉö&ÅiÏý”s¶ËÄw¬žáWÏdÄ¿·RÚé+ő͋f b:­T¾¿ŽõÙÜ}ëd| 4™^ìJ=Š=“…‹f‘g´bÚMo\ÏfuÌÏD8­M¬_±™>y©B!„B|(RôNFJ€ûn.!}Hhë¼ró0òwfJfwj<¹|B ‹æÀåŒvDžì-JáÝÃiöËÉÔ¢÷]5³»­­î†Yò= Î(/ iܵ$äL¢±hC·–3G£ž·FЀoY¢|9"ßkÁë¶p¬›pÑ”æ"^;9ûçeñÔúÚö©¤NžÃØŠ5<ñ~#Jòt¾ºhÇJG‘vx9ÜÙ‚cìL§0dÊ\&W­åw[}2“‡®MYÅHœ¥kxz»%1 ¯Ó—(„B 2²®úßúìUä8ŒæC¼õÄc¼´·IÆ'¢$ÞD (³&Uóåû ; Þ5 þðÒ$Öo—BW,H䉈5·+ÂSÚ¢+šìì:˜ã‰x8yÓh;0âÊžpQËn4TÞ3Ú6§nP ¦ªR±bÒP¸‰÷Êí‹ !¤§· ,šÁâkK¹|Âq&; ÓxsÝ"Q9¶ky"båº9娬mEÈU[rÐu9ø%ÎfD‚´ÖÁ™1WÖxPT0»_¼~4já5[ø%Ê]aÛ—ýÇ£ÑøÙ\¾A5˜v¾+¦Ÿk÷1~ñFGLNbÒÐØÊd7 (‰^’ýMlõG˜”èD¡gr^¥–_35µ›yq·Ss‘æÖ '%s|ëjvD4ræÝÉ­cŠyz_«ô.B!ú€¢Y±´–R𞞈Y}”*Ë(,²K#D·ÄÏV¼—(91ÄÇn=LvZ[Èd8¢ñúš\öJ‰qËÄ™$òDô¥!ÞPG®U“=‡¤—·87ù~œ£Ñì 8Rsi­9Òíe÷™ Ë •›Uƒ©ŠÉͪÁ»†p–*OêñÓ*[1™vyL ¯¿ŸË·n×8‰Iݾ­¸qŸ¹%}ùë(j 0ã¶ø|–ÆB“iÒ°oÅ‹®ås9ÂVMû7²–Q,™?•`ÐÀé¨e{AH ÞB!D1×ñâ†;ùæ÷îá¹¥'Ïmøþü=öF@“·$EoѯÍõñÑEGpÚ£@[œÉ‹o¦¦Þã–‰si<)(Næ†yeÌžTÝy2n¤Õ[sؼ'Câhćvýeh§âsVnŠ)•qŠB˜±h‹8¹˜¢7À/¢®³…±ßµDY¶!ãý‰¾¢—¿ÇoË?¸ßR¼š=Þ~¯‚K+ÎXâ0ÿûá³Ö³ré[gLÙÄSÅ=ØP!„BtŸ¦ø­×8ñ«/ðÅoÚI8ùw¾³·M‘}e!ºCº!‰~IQ`áå|âö¢Ž‚wAñþôÊD)x÷í‘'|e"'Nº:"O¾zÿ~FmŠq E–•`ʘ:ŽWº9p$9Æ-ñ®µîzÈ@BöÄ‹^¾ÌTxòT F¦bòeK´GÛ'„B!%í&~ø?×ðþC·rËÍ×óéׇóíß~‘)ŽX·LˆþAŠÞ¢ßq9¢|jñ!®›]Ž¢€a(,Û8Œ—Þ¹ŒP8~NAÝÓyòïÕ# Û Fí‘'÷,*Á“‰q EtÛÕ¥´w€X¶iXl#úÓ$PY€#-ÕzñPŸÔ5N˜m¼Ïk:yŠœ^ „B!.kÊ<Æì~‰7kܤ§¹i\ûþQ;‹9¹R÷¢;¤è§äd•® ÏjááOìeôˆFZVž{},ù;³$c²k<ùõߦ°u_:¦IGäÉߨËüé'QUy‡E÷L]OnN3&QZá‰q‹D(o+z+ª†+{üE/9ÕÛÛüPz{ !„BˆKÔzâ­0sˆ (8s¯a^vÅåÝp]ˆÁL2½ãˆ\5³‚¹S«HpF©¨qñö†¯tŸ=¯c·Þ<ƒé9QV?û&[“çóÝÅ9ÔT0‡]§hãÞ- ¢ætzìÔòzí~^ZÇèYÜ1#[TGµÚ á ¯¯-¤<ܧ/ý‚®žYÁÂ9åÅÏÒ 7//»Œ¦[Œ['zJ{äÉö‚4_Sʰ̖ŽÈ“™jXº~GËcÝLǬƒ›¯<@TWy{È·Hô'þŠ‚ŽÛ 9“i)ÝyÑëXc¨¬5T®U æ«wi:¯ÆÑ@ˆB!„¢ˆ<Ë÷ßú6ßùà x0P#e¬úÕOXî3±Éæ¥$Eï82wÚInœWÖqh†ŸO->ÄŸ„¯Ù~Ú¼fk)o½Þ‚þÀÜŽizùNþ²´˜ ™ÁC7cûñ]ÔñX;5cÿgŽÂ¿ÿùGB²&]ÎØ4åá¸é9íIˆðÑK5¬-ãÙ4á½Ý™,ß4 ];Ú#O.ŸPây'p9£‘'{‹RxwãpšýÖX7SÄ¡«gVäi;j—¿#“úFû–âQ=¡†2ìÉCIÈ™tÉëùqÔ¶0Nà¿,Q6*'Mù½=ë>MÔÏ/„B tŠUçÈ+ßæÞç"Š‡Ç‹Ç!o!ºCŠÞqdΔ곦9ì:SÆÔ³aGÖE­Ëâ°c‰4ÓÞa[ËžÎg—Œiû¢Ä ¶pï% #rpGCíKE©Ü¿•ÊK =nÚ¸:>²ðšÖV‚÷-ükÅ(ŠJ½1n™èmí‘'ÅÉÜ0¯ŒÙ“ª;"OÆô±zk›÷d`ÈqJJR+ .? €¯ÙÆúíÙ1n‘èüeû°'Å’Œ=y(¡†² /t†2SáѨ…X¢xÿ±DùLÄ7“ÅÀðS‰ÏBˆOÍã“O>É'-/óåÏ?CQ§ãyJâB~ôâ1{ÛXüH>=:Ò}ßüóõìxèç¬k–-q.*6w2©gŸü/„è)zLJ­ë3{÷vj: ÛŠŠ¦×³fõ|&h€^±‹gOëé­>”S#½)öáÜvÛT†Yl¸wóûe%>ô+ºtIž0w\w”1§²»Ž”%ò壤‡ï #‘'¢»î¼î­íÐÞÛF‰Ê°ââùËö2dòÍ$ |IEo€ÿÕ5žŠ8¹R5ø¸¦ó‚Äœ!„q&J8TÌ¡è<®÷WŠ Ú÷½’æ^MféA|¡Hϸíá…Ÿ§Q ÞBÑk¤èGJ+Ó P¾OÞœé£Ðì è¡KûU¬4‰ZxÔÅΗ?s”2”O=÷,÷NÏçñí=ª"„ƒŠ½ãHS‹ß½8™1¹><®eUnʪΚ¯åèfþpôŒ‰å›øYy×ëÕË7ñ“?ãIK¶ñ\ɇjö‡66×Ç sËÈJû P%´ðîÆáì:*¨â,y"Ú)ÀG®?ŠÃÞÖ fù¦aÔù±m”è÷ZÊöâÉ›ŠŠ+gÍG¶^òºþ}*æä&Õ O1ù‰%Ê·£²ù%„BÄ•ÀV–þ×ÏJ`k~W/ ¼â{Ô2‰ÎÝišOcXRHO7©Ù³ýîDl@@)åß¿ƒ G.ÐÒ3I;ºŸR{ ©N¨,n wÂw;5ÖV'áݼ»ºwJ Z)9e^J >ÙBˆK${]q&U)(ëfô:«Å`òèzæN;Iv§bw$ªòÞîL6ìÈ¢5§ïŠø"‘'bΔ*.Þ–ý_|"‘­{3bÜ"1Ê÷ƒi€¢â:åC½¾±2Æ&O1¹KÓ)0þ‡B!Ä ¥„Ù¹|'_½c‰›Ë¸v^Ëÿo#Ê´Îó$1õ£Ÿàî¹¹¸Ð1ÝÃqW~ð¸QM]À‰õTV¨^ZÄñ‘W0;e›‡0}z2‡ß¬8»à €Ÿ®*°«h˜È¹«ƒ›®ë„Ãa¢Ñ(†Ñö©QU‹Å‚ÍfCÓd[Rˆ ‘¢·èSÃ2[˜6¶Žj°Y?ø¹7 …íi¬Ù–#EJqQ$òdðJO ²hþ ZC¯­Ì“ž0¢Gè!?ÁꜣqåLEm+‚_¢fàK+ÿ²…ñß±D9`*¼oÈ`«B!D|PÐ÷¬`ÛÃ÷sõÜrf—/ãEÿé¿Ó äûWñЗ~L¬ó~È;÷ž±Ú«Úfýr~÷Öüñ·¿åΪfªòáW[B`ïj¿äìi²];xƒARRRxðÁ™>}:)))ÔÕÕ±k×.žxâ êëëq:1n©ñMŠÞ¢WY-yC›¸lxãóHN<=É4UÙu •üYÔ7Jn·¸ty2¸X-÷ÝTÒqðìí #hl±Å¸Ub ñ—íÅ™1Íž€3}ÁªÃj}%¦Âÿ‹Xù£5‚xÖá–°2 B³€‡ó‹¯gÓÏž¦U…¶.¬.𝆀c)ž,.™‹GÙú::߱必uüæc±´QA³»ItÛ8×!oÙ"---Üwß}<øàƒX­§wLOOgÑ¢E\wÝu<ñļòÊ+¸ÝîµTˆø'EoÑc4Õ$%¹•Ì”YiF k"3%€¦}ŒºªÎÅŽÂTvH%Ø*CÑs$òdpøÈõGÉHi‹FÚx;¤Æ¸Eb ñ—ï'õò»H:åC½V*¿×5¾ªé8ç­>±R%…o!„"ö(Z¹ßÂD–튠žVž6iXõ /_ó#ž}ås4×aÅ o°ïšó­°™Êºiühõ¾Ö‰k9¸âI}f+u½ûJD? ¹÷Þ{ùú׿€ivÝßßb±ððÃc¯½öšôøâzk/ëÌõ^èü¥ÓººVºy¿ý¢vq[ët[ít¿óuW—ß.X°`*@~ýé½—»#91DNº¿ßÎMt‡iöÛpØ¢X4»M'ÁÅåˆ0Ä“Á룪ç> «Öç °$™ý‡‡P^}öBô4§=zZä @(¬IäI?7úInYp€ê:'úÇÂÉ´=M!ïžG±¸’ÕŸ té{h­ð;k„›Õ¶³JL…û#Vê¥ðWŠímÛvK •oDä@©BÄ£¼`-999g=Öý¼ã͵M¨É)$h`†›¨i0ð¦'aWÀlm *è$#Ùb„hnh$U³àpY ‡,$';QÍV|ÕAéÉ8;S¾ô8÷Uü€oÿ0þŸ>È‹GÌϙ˚„kh¶¦’â’(´ÁB×u<ÿú׿Îêá}.‘H„%K–$ã»Óuý¬iåååßmùùù{€¯ú9.F×f§ûf§igÞî|¡›÷Ïw}¡iœgZ§:IÛ°Ût¼?ûÙìİr¬ÂÑr%ǽÔ48bÝ$1ÈHäÉÀ3rh7]ùAŽ÷ o–‚·è%&þ²}xÇ,À>d(WÑ€¯Ö ߈X±[#\§ŒRLþfð@ÄŠO ßB!D³âIM鸧ØIï4.ºâH&³}7VµãIIÇÓyqWÇŒ$etÚßUì¤g&Pµ¹{J™ XÒ²HRk(ñ™gÌƲ(Ø¼é¤ âQss3¡P¨cpÉž …øùÏަiÝ^·¦i|úÓŸæ{ßûv»ÄÅÆUU±Ûíx<ž Ï,z½cÀ4Á ;¶º®Ð°ÒÐè ¾ÉNÏÎÉZ•µ.š$_WÄ ‰<R’Zùì‡PÓ„,EO¦‰Þã/Û‹wÌ@!aèd‹ò{d½à++OY#,P Æ)&/Y#ܶñáËêp¿´Fzp½çñ¨…#dÛ¨7Ý£é,P{v'ûÃøï¨… yß„âl¦•üSÿë<óå(QSEi=ÁÚGλu&6é³Ñ/5773|ÄH®ºêº9tè ×\sí9#MÎeÖ¬Y8N¼^o¶G\Ã0477Ká;HÑ;Âß¾8™ô!ÁX7¥[œlVƒ†&;­¡¶_ç@«…@«…PX~­Eÿ`š°½ ‚âäÓ"O¦Ž­cÜHŸDžÄ9¯;Ìg—êˆPZ³5‡CÇ’bÜ*1Ð* 1õ(Šf!aè”+zC[áûË+ÏX#ÌV F+&ÿ´…ùlÄÚcƒ[Z #F%ÞýU1¥èÝ 3®ÞÓßǺB·T([Ê÷?þ2SAQLL,8܉¸²Ý_…B!fÍžKSs ¾Æ]wåÉ“¸\΋.z§¤¤`ª*Q8ñ@UU\.—½ã„½c¤Ùo•ž¥BÄ@¬#O wh©I­Ô7:8R–ÈEn×ô8ÛÈ+¸+¡—÷7õ|ˆVð$DøÜG’äiËØÝu •µÛÎÎn¢§‘ÁªC¸²'âÊš€¢Y0õh­?üGÄÊÓ§ ß#“e¶0ŸŽXyßèù—žÝ5ûð¤?Ò‡«÷SÞ7!„èÅš@RªŒe5Ð455c³õ|”ˆi†qÑEYb ‘¢·bPŠE䉦šÜK1ãó:¦ŸHä—Ž!ªŸ^àÒræóÝÅ9ÔT: Ñzí~^ZŒ–h‹š4•OL«æ…u•„ná¥XgoHpFùìIIj`ñ^[52.‹ób`j9±WöDT«gÆX=º~?ð鈕_Z#ܦجZxF×zì³þg]ã±h|mö-V ~ÝOâWâÑ塨dw~\Óù±¥çþ!„ý…ÓédÇö-LŸ1‡£gãM,š…úúÒÒR/j¹ÊÊJE‘âwœh7ééøqiâkïG!úP_GžÌšT}ZÁà²aMÌ›VņYgͯ—ïä/K‹ù $¤‘5ûv06òÔŽ3o¿žÌo³Ò{=_×La-xÒ†Þ»š÷râäD‚˜N+•ï¯c]ÂÕ<8®•êHˆ“z.c3³¹ñDkí ø²wôÍâ¡1Ö«x2Ò0÷®ä™Üuëd<>š".F%æñ¥Å„{ä/r~ Î_øèRO¼MâËGaH‚èCþ²½0ç~ÜæôxÑ <±rÌå+šŽü§%Ê<Õà;Q Uò™B!„ˆ¹ÄÄD}õ¼óÖk=^dƒ,[6›x࢖[¿~=@à¢{ˆ‹ÞÑoâñxÐu=ÖÍô¤è-„ôú*ò$7§¹ËéyC›º,zkÙÓùì’1´mNÔnäõíù.žËÍ–ÃêÞãÙ²J"8ƒe¼»þÏd¾rûÆ$å2¶b O¼ßˆ’<¯.Ëî= Þð žxûÑ\;“CE¬(ñc™pê Mp¶–³<ÿzƾ9;›ì!SI+ZÆŸvùqOº•OzY§$µò©ÅE=¼‹O$òÒ;—¡ëRü}+Ò\C¸ñ$6o& æÂÖÞ9/Â~µ°×+O$ï IDATPyÌ!¸J5Ø` 󓨅—u ÙlB!„ˆ]×ñxªéØz½B!„¢¯(Š‚ËåbÙ²eüô§?% vôî|1M“`0È#<Š+p¹\=Þë\ˆBzz !Dz#òäX…‡­Ìã–+OàŠlµ°bóPKêr~-gŸ¿k\G¯N3\Áž¦¡¤XͲÂ(µ™·°dL ÿZ]ùýú\¼)*Þ_EqYn\Àgn ‚Cc_þ:|‰™ë6|u´ ŸÍG&¬ã­s¶Ø¤ªpþ›¯ç“Y>š¢ÐÒK]L= –,<ÊØ\_Û3›°öýÖlÉ‘^­"æ‚ÕÅèÁ&4g"î3¨Ûsîÿšžb/êï*_Ótî?•õ=A1ùoK”ok:« •7 •m†*Ñ'â¢Ù'ÜÄW¼ÛøÍæzdè+!„"ö, n·›U«V±uëV>õ©O1kÖ,222¨ªªâý÷ßç¯ý+ÍÍ͸Ýn,)ë q.òß!„çÑÓ‘'»¦²û`*N{”Öåœ]½|?ùSWìdË©[Vþ›€}‚I°l¯V¸°bé +x¬ý¶o?O>¿ÿÔeü€N×nç×o€êNgÛêU·bÍ»–1£B=ZQ¸|B w\{¬£}kHãŸ+Fqðhׄès¦IˉÝxÇ\…}Èp¬îT"-µ}òÔ ¦Â¢þ¢k|QÓùÈ©^ÞIŠÉÝšÎÝZ[¹{½¡²ÇT8j¨”˜ 'È9ÀÔH=‹%32±éQT›•Hå^^ÛPBTÏû'Ëæ,œÇ W„VCÃåÐ9¸qkýãøÄ´j^XW)F„Bˆ~Àjµ¢( ­­­üþ÷¿'v š©ª*‹«ÕŠËå’‚· ÿ!Bqí‘'%ÉÜ8·ŒY“ª;"OÆô±zk›÷d`Ý?­,ê_¿¦édÜ•³™×ž`¿¦¢Ç '£G4rÃÜ2rÒýÓŽ–{xue M2‹ˆ/-¥;ñ޹ ÷ˆé4¬ìÓç/3¾µð¸®q§jp¦3Jùà°ÙÕªÁÕÚ…ÿCÕô|ú •7þù:Å­vFͼœ1©Ç¨mÌäæ›g csCÁšU¬¯Ö±_Ä×Ç4RX¯âÉHÃÜ·•šé³ˆ¼óšLœcoà+ÃNrÀ“KV§e7kSx`~&zÐÀimbýŠÍœÝ¦—­gŽ^nS ®¶‡bÝŒÎsL×2'°Ð~_ÿ»˜V@õgnFS'glV67–AxæÌåo°¦ÁÄ~Ùu<4Á^Š=“…‹f‘g´bÚMo\ÏfuR·Þ7!„Bô<‹Å‚¦iØl¶ŽHh‹@QUUU%ÒDˆnèU!„ˆÁV oœŠ<¹½‡"OzB¨°½§vÏ3ý¥¼ñZi­OQ`ÜÈæO?ÉÈœæŽé¡°ÆÊÍCÙ²7£ËÜs!b-Py#Dµ9qŸÑçEïvu¦Â3ºÆ3ºÆ(Åd¡j0O5˜ªxºµ…ԑÈXEIkû´%ÛߣP“­4î^Ç»G›±_Äׯ§’_]&8[ËYž=cßœífM|t´›ü&Œus °Ÿ¾Žw:–M£(4géžÞîCILÃÛÏr4TÀëFtƒ^]ÄfeŸ¾9¢²*JËÊÙ\B Wr]¸ˆÅ•¸]>71…u›?6‘ƒe!F+ )Sæ2¹j-¿Ûꃔ™ß´®®•nÞo¿¨]ÜÖ:ÝV;Ýï|ÝÕå· ,˜ _? !bGQàú+ʸêòJTUÊíê|ŠJ½8’̱rúE ø)D¼É^ø îaÓ0 ƒ#¯|=Ôë&“ØuªÇòŸuÇ¢ñun±jðëSXÞ§=½—ÆqOïËBàК=—/L,ç/+s©[¯×t~l‰pkØÆ!S¾Ó…±‘¬ ''ç¬Ç$YÑ_èúÙgñ•——w|·åççï¾èç¸]\›î›¦y»ó…nÞ?ßõ…¦qži=^D‰¯½!„è§\Ž(7Ì+cÖÄêÓz9[-Cw£ÛåhëÝݰҴlµàk¶ÑÐdçd­‹'ÝøƒòS#Žæ£ïã6 EUq˜Ño{{‹ÁF#÷òë¸5/ȆwO\rÁ[!„BˆþB*Bñ!( ÌœXÃsÛ´„¶¼ï=‡RX¶I´b ñŸØ £ZlxFΖ¢·è'tŽíXÉvĺB!„Bô )z÷!«Å`ÁŒJFm&ÖØs(…}‡‡\Ô:ìnâ+Þmüfs=ÆÙF^Á] …¼¼¿Ir…è9é~_{Œ¡þŽiUu.–®Á±rO [&„è-F$„¿lžÜY¸2Çbqz‰cÝ,!„B!„HÑ»( ¯D÷p6íÊß]œCMuSQqØuŠ6®áÝÒàyŸ#|t /wS®¹†y)*Ž”,RC')k1ÝÆÿî¬9«ˆ~ÖkHšÊ'§UóºJÎNbðè*ʤ5¤±zk[öf`HfµZó‘÷ñäÎEÁ;ßÕ±nÒMRL&)ñuH|’z¡-q>±z?'ÆÙçH!„Bˆ®HÑ»ä m:­àÝnáœr¶ìÉ8k`7½|'YZLP‡Ì࡛Ʊýø.,ܼd>Y‘067¬YÅúj½£ø}³xhL#…õ*žŒ4̽+y¥(€I€½ëÞa/*#®ú(7Ô.ã/…{&×-¾<£Ónrxc>E#näc#Oíˆ0óöëÉܵžÒ‰ã›•Í'šXVâ—ÞäbБ(!€¿|F$ˆjuâÉ›Ý/ŠÞWªWÚ±n†èA¯Ëû)„B!Ä9IÑ»xÝ]ï˜Øm:»~ÞÞ,;–H3k°ZhܽŽwŽ6c¿ˆ¯O%¿ºêƒLp¶–³<ÿzƾ9; KQ ‘.×®2e.“«Öò»­>H™ÉCWç±óõ| ÏåfK„auïñì‰t­’ëÃE¬‚·„$ÊDÑÎÔ#´”î"ñ²y8Óò°ºSˆ´ÔźYB!„B!N‘¢w©ó9ºœhµlÕΚ®eOç³KÆ`(*š^ÏšÕð™`Ã$qô,îF÷$ciT9½Ÿ¸‰¿%ÐA¢ë誆zΖ)${HL™ÉÇRLÀ†nFðàcËž ß_œÀ[OWÎn¥ŸD™!ºÒ|ô}/›(xrgQ¿Y¬›t–Và{Ñþ±©WjÊwiw¼i¨ˆ£¿UUµE!„BˆÎúÇžÐPZéfoQ SÆ|ÐÌ4áí Ã1ºØaÐ+vñì©x“Ó)ز§’µë_| ôôB ze"„¸­5Gû*°%e“8ê j·ÿ ӈƺYB!„"(^&.ù>Û4Òl&Íëå«Ù‹l- Ñ7¤è-„Ô$ÊDña4o"mæGÑìnÜçÒ|lG¬›$„B!bNcÄÝ?àë£ßå¿ø>Õ™DŠÇ&#¥ ÑG¤è-„”$ÊDÑšJ6“:ã.U%ñ²ùRôB!„`ŸÆ7Öðäçޤ’Bzz¬$Äà#Eï^bµX´Á1Ô£ªš†‚n¨„#j¬›#ÄyI”‰¢'éÁ&åûH6Wö$,N/Ñ`c¬›%„B!bH:q ')ùâ¯øóÌ,¢e¬{æ·üïŽúž.BtIŠÞ½`â¨U_e¦IGOY€HT%´àoµÐì·ák¶ÑÐh§¾ÉNU­‹ºFæàøÓˆ8#Q&BˆÞÐxx æ¶õö5—úýËbÝ$!„BCŠ7…Œñ£Ézñ|úgåhþƒ?þæË\ýÅŸ±®Y "Bô)z÷‚ìtÿ )xÃéohëåîõ„ñzÂ8kþPX£²ÖEi…‡£åJ+Ü„#2º¶è=e"„èMþ²½è­ÍhÞ±WKÑ[ôš+Uƒ‰JÿÙÆª¢{$ÊD á¦*üå$äL"aØ4, CˆúëcÝ,1€]¶Åº ç´ÖŽu„BˆØÒ*ùÇýŽÌŸþÿ‚Ý·—¿ÿÇìˆ(Ød—Tˆ>!•D3µ jlÙ›Õb0>¯)cê“ëCSM< n˜[ÆU—W²qg&weJö·8'‰2BÄšïÀr&¡¨*Ic¯¡vçk±n’ÀN˜ñ»ÇÜ È9UBˆÁÅÊ‚ïÿ‹ëÖßÍ7D.â11pY°5mä—Ÿz—ŸDMPm$x½¸¥â-DŸ‘¢·ˆ ‘¨ÊÞ¢ö¥àvE˜=¹šÙ“ªñ$D°Ût^QÎSªYû~6Ûö§Kì‰8D™!â¿|‘¦j¬‰éxÇ\EÝž·0uéñ*„BÄ-5O>ù'îÏl%l(˜¡j¬}?<³Ž²‹ú 7‰„ ‘®òš;=fŸÃ7ÿ|=;ú9ëš%Ûy S,N¼)N¼±nˆƒ”½Åÿgï¾ã›¸ïÇ¿îNÛ’<ämÀ`6ÁŒ°!d $!Òf4iÚ4;MÛtﯻIK3:²Û$Íž$60„= °ñž²eËÚ÷ûÃ`00ÃÈãý|<î¡Óçtç·dY–ÞzßûÓîÔy,Y›ÁòõéŒTÎÅ#‹ˆsˆ±¹ú’<& /áÓ/z°s_|´CQ&­L„튮ãÎYFÒ¨™h;Ž^#©Ý»*ÚQ !„â„Bü{yñ›3yfWSòîûÛS|ÿê{¿˜sž–öoæµßäS# o!„hs’ôíV8¬°vk2v$2fH—Ž,Âf ïôsÛÕ{زÛÅÜå=¨o¶]´2B´W5{Vâ6Õh&~Ð’ôB!:Sl*©©aôp.óàšžIh”ÓmÚc<:s(‰f#šg#¯üöÏÌÏoœˆÐ9t6?zäú¨Ú¿”uáÀ¡$ùI¶‡q×_&³ê–ÿã ÆóÄ¿/§dY„Ù X±è»Þàs–P¶ÐgÆã<2=EK¢wÏXÂU{y÷WòòöP4*!„è0Ôh Ä©„Â*_nLåÉW‡²fKJSk“!ý*yä›[6 2ÊŠó)#¹žïÎÜÎu“ö7%¼K+m¼ðþ@ÞYÐ[ÞBˆ¨Š¼xö¯ÀœÐkjÿ(G$º*Ó€+y|‚KÞì !D«i82/áÖéil]¿‡!Ê7½É/gOeòSxpy&wÝ8´±rÐ:‚{~x ûÿo“¦\ÍÏ50dŒåTÛôA=DHôA×h–?Í÷[ozßfÖp#Jê4¾;£‚¿}s&³f\ÍãsóXúÛ»yz£ôBˆÖ’JoÑaøŸ,Ëä«­IÜpÅ~º¥Ôc³„¸ùÊ\.è]Åû‹zÑà—§tg%­L„EõŽEÄö›($ žJaIN´Cš!—^Êx—ŠÅ•F¢¿„‚º~¯µÑŽM!:-‹ÙsÞá¦H„†òVþïa~·¼Í¢â9¸—ˆÁEr²Nùæ­„orbè;šáeñ`މ¤äDô‚ùxÓmŒ 'ÙvœÀ&æ-®ÆîráÀGîžã]1©$íßFžÙE¢Š÷VÓsP?œ›9¯ŽBt\’!Ni¥½=ˆqÃJ™2á šª3¨w5éÉõ¼ýyoòŠdâÂÎDZ™!:š€»ˆºüÍØ{ #¦[6W&¾Ê¼h‡%ÎÀµj£±ýTÕ] ´ÔÖË–eŸ±•Ì‹ofrÅ|^ØÄ4` Ä S͸\NjÖÍç­Ý^0§2iÊ(²">t³Îž•ËY0‰GúÕ°Ãm&=ÝFIn›“î©:«>YÆ–P û¨ƒ¹mB*á†Vc-ˬf§÷¼?$BqöÂûxåÎY<“FQ˜c8lFPâzó7¹i\Ol„Ñí=°—íhÜÇf'¦º†cãù4Š!ˆ·6rêmÇ©ÇÖ«ÀQÑÐQ€PÞnò{e´ëK¾¬I`øðxö|R$ ï"…BD"¿5UU1 ˜L&4M‹r„Bt ’ôRDWørc*9ûã¸yJ.ÝRê‰s¸ç†],Y›Á²õéè27H‡—‘\ϵ— [J}ÓXi¥—er P¾ÜB´_U[æbï1 €„!Ó)Zú\”#gjšÚQS VÿAæÎ?@ m,Lð{±CÆ‘]º”¿¯uƒk$]Ò‡­;Àæ+âóå‰}=w™òøË²*º_r#Ó Æ»O_ ŠzaÍ[ÂóëÝ(Î$b;êÃ$„€16…””p³±˜‰ðóKvóÐ}¿f{=Çÿ’Ïf5nÓkÜxâ\Ä+P¢J »rÊmÇ;~\¨úœ¿ÏÁssæp]©‡ÒÿÇ“kü`–³[Û»††\.<ðÇÇårPYYÉÆyúé§©ªªÂjµF9R!:?Iz‹­Âmáßï bòø.^Œªê\1®€ÌtoÞ¯Ožâ‘´2Btt¾ŠÔn#&c0öÌá˜ã»á¯.ˆvX¢•j¢À X¡ñ´úV‰à©ñ†©* ñ±18]#¹Õ¥&Âz‡ªSWWO†‚Ô¼è@(AS[Ú§ˆ†MËY3rwÍt ¸÷2oYy[Üe!„ˆ£Í†æ.ÇkIÀåHãòëÇáP¶Ú½Š¯’îçšÁ‹ya«s¯iLj¤òÓ“okù'µÀÔŸi—Wò·[âãÍlÇi7É< í\]]·Ür <ðFcó3’“““™2e “&Mâé§Ÿæ­·ÞÂn·G)R!ºÉŠ/Q˜¿²;û:ùÆU{1ÃôͬáþolçOûPXíE+I+!DgRµåSb2 ÙÓ(þâùh‡$Zi„ßíZôkCˆÙZøÔ7¼ö[/mܪ„¾æ¹Ÿ/æ7¿|‘·-jò–²`I=O±­õ<WãW‹×ðã@˜PC»ü‹?¿¸–Jy¡m—˜5k<òú N=7 <úè£D"Þÿ}©ø¢ IÒ[t»óbùë³¹eê^2Óëˆsø¹÷æ|²,“õÛ“¢ž8ie"„èlJ÷à-ÉÁ–ÚG¯ÑTnú˜@mi´Ã]šNåÖ¯Ø;å2îÎð0š¨Ý¶‚y§½ÏJ–Ò›ë' ¥¡!‚ÕRÁúí~Ix !:žH.Ïß2b“pS_£vðÒ·§ðLTÍ€Åf$ð‰øx+ªb"œó2÷_ý,A]A5X°¨~B–Dâ-'Ùf^ÉÏ'.Ä’…£Ö€ÿ8•/Œ\öýßqÙ†o3ñ{Ûq‡L‰xâ•G™ºh¯~RíM8Æårqÿý÷Ÿ0Ù}¬|%K–àõz¥Ç·mD’Þ¢S©­3ñâû™61ŸqCK1h®¿|?=Òêøxi&¡°œÖÞH+!DgVµy.¶Ôþ ($޼™¢%ÏD;$ÑiEÈûâ-^8t-°k9¼©b=O}thÝ_ÌÂç³ï‘Ûº¿þ„Z/üò=^ ¥}¾äß{ÏaøBF‰'(RÍ8\É4+¿±½ÙABRËÅ9'Þf!.ÅÒÂ:€‚)6—b%95†ÒÕÌ®R0$¥§–“ë–¯£Íãñà÷û›&¨ðûýüîw¿CÓ´fã'£iwÞy'?ûÙÏ0›Ûçfâô©ªŠÙlÆá½ö@’Þ¢Ó Gæ.Ï$¿ØÎ WìÇhˆ0bP9i‰^Þø¬Õµò¥=V&Bˆ®À[¼“†ò\¬I½±wŠÅ•‰¯2/Úa !„¢½ÒÝ,|î? ýɳ¼ø½!]EñdéŸǼJ“GÇã¡Gf/.¾xR³¶$99»¸ôÒËZ]å}بQ£°Z­ÄÆÆžëPE”D"¼^/Gßí€$½E§µe·‹ÒJ·NßCbœôäz¾wËvÞ_Ô‹ûâ£^—&­L„]IÅúwé>퇠($žÅÁyŠvHB!„h·T(ø˜ŸÏ~“ ® (::,v'v‹d¼£Éï÷3jô8j=uT»L{–æ`I IDAT]\R‚Íf=í¤·Ëå"‰ ªrFzg¡ª*6›M’Þí„üeµ1UÕÚ¿’+Ç0:» “ñl&:1ó ©<6.á„¿P5y4_Ó‡®V;[Ziå¹7/`Gnc’Ûf 1{ú¦]”¦µßSÃôrsåøƒ\6ªˆx§ÿ¬Žep%Opµ‹?v›%ÄŒI¸oÖö¦„·Ï¯ñé=xæHÂ[Ñ)5”îÁs`Ö”~Ø3GD9"!„B´gŠ1†¸Ä$’’ILL")1‡EC?F_m­‡p¸y^G×#D"t]?­¥µ­P„gF*½Û¦éÜsÃNz¤Õ5]6ªˆçÞºà¸Ö ZÆ~:3ƒu¯½Ë¼òÆ>5y4?˜Ý‹­¯¿Ãge'1”~'æh¼ñi_&Ž(fò¸TUç¢ KèÕÍÃ[ó{Sé¶œú çѵ—`LvYÓõ‰#Šùï'ýØ\BX#©ßhf OÁ Ñ Dªvóé;)² åöae¼¶¬øŒbPàœNF%­L„]]Åúw±wŠ¢Iyõ›Ñáh‡%„B!ZÉjµ²aý†_8‹åH{ƒf ªªš¤¤ÄÓ:^qq1Š¢Hò»9ÜÞäèö7"z$é݆Æd—5Kx8í¦Œ?È» ³Ž¹µNmIÞCÒ0..$ˆ¾ÙÉøJè€bÉ`Ú´ I0Ùaû’E¬q]Áƒ|”kùêÀ¡Ã¸xúâ7-ä“ÊtnšžMŒ»šZ=³R…bIgÊ” É6 [¯ßŽyB9o/g·s8ݚªæ³NéÏÝ×Xøtk*ßìWÃŽ*GJú–…¼µÛ{N¢çƒ|±!EfMÍ%Îá'#¹žûoÙÎü•ÝY·-¹]ܧŒäúf o³)ÌUóyöÍ ški#¹cT„wßý~飮âŽËt)韖ΕkY‚‚!y7L5ãr9©Y7Ÿ·óœ\6eYºYgÏÊå¬I˜Ôô|Z9o#ûÎÑI ÒÊD! XWAõŽE$dOÃèH"nàTo›í°D¶Á|vg‚µ%ùï.„¢3r:Ô¸«ølîûÍÕ ÌŸ?šÛn»í´Ž·|ùr¼^ïi·Eí×áö&‡ã¸3Äù'Iï6”–Tßâxz²·Åq½|{â‘m-d£Þ“Qöƒ|]…P¬Fj6-cÞ~æSxx`"kKbyúÓ}0h*¨FNÎ&yÛbÞËó“2v8I{>繯ë°ô¿’á\Ùcè_´„§×Õ ÄçÁ)‰¬*‹¥O¢FQr•ûBd¦ؤ¦cÎßLµžŠÕWÈç+NÃ÷G§aØK° ·¶”_lçé7sÃåû¹ OfS˜“pAŸj>\Ò3ê“\f$·üœIMò¢ª:‘Èáš~…”^=ðîøŒ¼¦Ï¼!Š6m§øŽnÔ/)¦2°›¹õh¬þƒÌ€@ÚX™Nrl6Ù¥KùûZ7¸FòÐ%}غãÈóé\|Œ¶YBL_À¨ ÊP…íók,^›Áš-)GÝ!„誶|FlŸ hV'®¡Óñä®&ÔPsê…hLy%„Bœ_áp‡ÃAll,Šräó¬ßïç½÷Þ㦛nÂln]Náð>=zôhõ>¢ý;ܶFÞíƒ$½ÛP½·å– uÞ<캛¯vuãæNòôÞ³’êžIoÂ:ξ£˜Õ;@Ø¡FE!BMM-AÀˆB⋸º>Ÿ×—xÑQqØMÔh@üµ<:ÄÅZ¨>P‡èžZܶ4jóêÞ-žÞ‰:;¿®``ßd2µòv¹‰ÄéÔ×y „ÄU­]ô†>>¿ÆŸõaÔà2®šx“1LŸ5<4{+ WwcõæT¢õEk]CËÏ™ŸÖb’øè´MtH³†7<5Á!U#!6§k$·ºtÀDXâP<ŸÎ†´2Bˆ–E‚ Tlü”ñ·£­$Žº™’/^ˆvX¢Ù®+Ì‹tœwb›;P¬B!Dk„ÃášUUUüå/á§?ýé)+·EáOún·‡ÃA h«p…èÒ$é݆¾Ú–Ìèì2̦#/ˆº+¿N;Á:µ»wâ™1ši¡zÖÍõaè  ’9b,i?ä¥â†]M?—r䀇ö­Þº€ʇr×å½)ž·ºú ±N+ uXããˆU*¨®ñ‘oG¡ÅK|}->|ƒ†08RÆÜòrRG]ÀhC5kË#×vO´­Û–ÌÞüXf\v€¾™5˜Œ¦_œÏ˜!eÌ]žÉž¼ó_Cµû@•n ®8_³ñÕ›R¹¥Né¾|¬“³ÉÚ±š\€´¡ƒHÉßD~$‹“uzw»=”W¬æõMõèš${ˆÚ´Î6Û/­L„âäjö¬$¶ÿ%X\™8³ÆâÉ]K}áÖh‡%:ˆ·Ão‡µh‡!„Bˆ£(Š‚ÍfcþüùèºÎc=†Åb9.ù­( >Ÿ'Ÿ|’ àp8Z.dBœ’ônCU5f^ú`—- 5±ê+¾Nc÷É’©V—cfh{‚0€åùEØG]Ê-uTUWâÎÈæÂÚæ»†ÃajrVði·éÜ2´’·o¦úêÉÜ“æ¦Æ¯P«ëTo]ËÎ+'r×U `ÑØºbU r™P¼…š°›ýÁîÌ ,åípçŸ ³ºÖÌ+õçÂ\51«%Dbœ;gä°¯ÀÉ‚UÝ8Xb?oñ„ Ͽ7éçÑ3Ã߯ñÕ¶dVm<6é á’õ¼ºv43fÌàÊàá‰,søÏ²ƒ4ÄÄR×c47 ZÆ'Ç͉¡Sµõ+öN¹Œ»3¼Œ&j·­`ÞYÄ-­L„¢•ô¥_¾B«†¢j¤\t'>ø‘@C´#B!„gÈ`0`·ÛY´hk×®åŽ;î`Ô¨Q¤¤¤PZZʺuëxõÕWñx<Øív IÉ Ñ–Ú*uìq[ú9J ë'kéRiåõËÚºvÔºzÔõ£/[ZæLœ8q(ÀŠªö;‘h=»-Èåc 9¨UmüFV×á@‘ƒ…«º“W|þ’ß…´2Bˆ3“8ü:†^ @mîjJV¼刄BˆŽ%«¡€ŒŒŒã¶išœ#¢#   ƒ„B¡¦ /UUÅ`0`41’ðMZj—SXXØôÚ¶bÅŠÍÀÃ@øK¤…Ký¨ëúQcÇ®½ÐÊë'»<Õ';ç†å¯LˆCê¼F>ZÒ“•_§2y\ƒûT¡(Ð+Ãý7ï ¬ÒʪÍ)lÝíÂ7QÒÊD!Î\å–¹Äô†9¾ÎÞã¨/܆gßÚh‡%„B!΂Á`@Ó4L&‘H¤©Å‰¢(¨ªŠªªÒÒDˆó¤­2wíµÒûTÕßG_?ú²¥eZfff*@~ƒÌÊÚ™4ø lÛ›@Î8âbý( ÄØB èåfü°R2’ëÑu·ÇL¸‹µî°YB\uq>3.;@¬½qÚKŸ_ãóUÝyq/ªkeæi!„8%=BCénœ}& ¨öîÃñì_KÄ_ê}…BA|È €ÓéíGîÁXt½sÞw!„h aŸ‡H ž˜nC'@J€gßôH(Ú¡ !„íž$½…$½ÛŽ´7âJ+­|°¸óVô »_%ÃTÐ#­®iÂÆ¬nµdukœU4¢+TV[(¯¶PRi£ºÆŒÛc¢¶Î„×gÀëë˜r®83§äJ+!„8ÇÜ»–aMé£×(Ìñ¤N¼‡¢%ÏÒ…Þ‹ !„B!Ä9×13píÐ…+¸xdšÚõ>¤ZÌa‚!•p¸ëTùÖÔ™1˜  †HS\Ut’HJh`PïêS§Áo Á×þûƒÛ¬!,¦Æ3|~Åk3X³%¥ÓVµ !ÄùTòå˘bS1'tÇÞc‰#n bÃ{ÑK!„B!:,IzŸ#㆖’ï‹v¢ƒ±šCXÍç4öM»\Ìÿ²žzc´CBˆNC(Zò,=®þ)šÅABö4"/U[糟áȃ#s¦ø ¥kòöyh(ßGõ¶Ï yOý…´B!„¢ã“¤÷9²hMc‡–¢v±JïX{«%D…ÛL(Ôu>D›MaìÖ6k³±u=Ýut”fg¬+ŠNƒß@Q¹­"={±1AÌæ0óVtgËnW´ÃBˆN)XWAáâ§é6ùQT“•Ä7 úpïZzvVÒ/½{æ…ç&ÐÈèHÂ’”…³÷xŠ–GrÄ‘s .Úaˆ6”ëçÂå XAœ#Ðâm<^#Åå6Ê«¬”VZ©®5S]kÆSo$î:_ !„8}¾ò}-}–ŒÉ ¨’ÇÞŠb0Q½íó3>fÜ€IÍÞ %9è‘®3·-mªl×Ì6Ò.þ6>ü‘ œ'„B!Dg&Io!NBúõt3~x ½»Õ6õî>ÌÛ``çþxö88PèÄí1E%N!„ƒ·xEKŸ#ýÒûP4#I#oÆ`‹£|Ý; GNûx±ý.nZß÷Î ÕWËp;ŒŒ+&¦[6†˜l部Ëû:Ú! !„B!Ú$½…8A½«¹bl)®†fãn‰í{؜㢨,†®ÕÐF!D[«?¸…ÂÅO“>éTƒ‰øA“19S)Yù"a_]«£hÌqijŠ»l ôËWÈšõ$W¦$½…B!„èä$é-Ä1²ºÕråøº§I,Dt…œýq¬ÞœÂ¾'ºdº…B´!oÑ æÿ™ôI÷c°ÅÓ-›ÌkIÉ/à-ÉiÕ1ÍØÔÚÃ[´£-Ãm÷"á#mÉTSL#B!„Bœ’ôâdWW]”OßÌš¦±pXaSN"KÖ¦ãö˜£Bˆ®ÆW±Ÿü¹¿%}ÒýX{b°ÅÓmÊãxöEÙWÿ;­ªïH¨å¹(„B!„¢3’¤·èò4Mç’E\:ªMk,áÖuظ+‘ÅkºIŸn!„QòVspÞp ›AÂà© (8²ÆÓ-÷Î%TmÿœH áÔ­¦Ì(ªvÊÛézD&ÄB!:‘H$‚×ë% E;Ñ l6ªªF;”.O’Þ¢Kë–RÏ Wì'ÅåmÛ{ÐɧË3)«²F12!„¢‘Q±á=ê ¶2âÒQM6†^MÜ ÉÔÜHMÎrÊr[5Ù¥–1ŸÞœÆWÿû€ù¥aÀÈÈk¯Â±üc–Öœyÿ.-c?½6ƒò2ï¡ù."”lYÆG{¼­žÿB‰ÊíÃÊxmY1á“ÝÚlN”ñ·ãÈsÊÛ5”îáà¼?¶QB!„8ß¼^/6›˜˜E‰v8¢Òuºº:¼^/v»=Úáty’ô]’ªê\1¶‰#ŠQ•ÆÍµõ&>Y–ÉŽÜø(G'„B¯¡tyÿŠØ~“0ô ÖXT£gÖXœYc ûëðWâ-ÞI°¶Œ°Ïs‚#é¸TÑã’‘d~°–¼à‘-Š9•ISF‘ñ¡›uö¬\Îòò®½e»ß^Înçpº5…U/ÌgÒŸ»¯±ðÁ;›©<”~Í ïå¨C¢˜S¹ü˜c~Q“Ì´i’ `²Ãö%‹X^ncÈØôOKgº:’¬úü}­RÇðè…eüs?îà£,XËÊyÙo8>ÖÕê`n›J¸!‚ÕXËò«Ùé包ýõh&( ‘@ŠÁˆ¢ÊÛg!„¢3 …B˜Ífä,:qæ, ωއ‹óIÞµ‹.'Þégæ”\z¤é…º~{óVöÀç?õéÌB!D´è‘î]˨ٳ gÖhâ\†Ù• €f¶cKí-µÿ)£xvó~É ¾1>/¯8<ŠkÈ8²K—6&›]#yè’>|ýþnrÊb雨Q”œ@å¾™é6©é˜ó7S}Ò’ë–¹ii5›–1o¿óÀ)<<0‘e¥lÛUÌÝ,-FÖ1óMêºBlà Oº? ‰{ܾõš·„ç×»QœIÄžºðý„Ü;S¶öØ3G=ƒóþ„Áê óºß dž!„¢3’Ö&âlÉs¨ý¤·èR÷©âúË÷c17ž4]SgâÃŽØåÈ„BˆÖÓÃjö¬¤fÏJÌñÄtJL·!X\™(š±5G zÇ—¬š>™é=’€B|l N×Hnu选°Ä¡†Ù ŽKºÅÓ;Qgç× ì›L¦CÞ.7G畵n#¸÷æMíMr×,`_KÇÔ½8ûŽbVïaG<†•SŸD¡¦¦öPyK±Ѱi9kFŽà®™÷^æ-+?­Çõhšâ¦Ë`]9z8@°¾šH A’ÞB!„ç™Ûí&--M*ñE«IÒ[t šªsÕÅùŒRÚ4¶s_<ï/ê…×'B!:.u!þêBª¶|ŠŠÉ™Œ)6ÍOÊØÙ'ÞQ¯çë¥[xíúuJЩv{(¯XÍë›êÑ5Iö  ßC)cny9©£.`´¡šµåÍK©Ãøw³ö& ‰)Ç3‚ã¤ü—vˆv5ý\G§¼ÂMk<ûÊCÌáÍúá²ò–b ˆ‹'íb652Æ_Çô~{y~ë™M6é~=Fg 1é`ŠMEŸpš-ƒ-'„B!„8$Û':=§=À7¦ímjgŽ(Ì[у5›SÚl,!„"*ôš5%¨&ëɓހ^ŸË‡ëzòø5%èTnýнS.ãî /£‰Úm+ø¨&€î+ ×8‘ Å[¨ »ÙìάÀRÞ>Ùl“?¡Åc.Ê/Â>êRnɨ£ªºwF6#]Å|室®Çh¦×짤ûXf^ZE=f|ÇÕ·tÜ•,¥7×OJCC«¥‚õÛýèЊ*òãiæâMnºîì;á Ž"„B!„ˆ†¶šŽöØã¶ôs”ÖO6ÖÒ¥ÒÊ뇵…uí¨uõ¨ëG_¶´Ì™8qâP€Uþîžhzu«å–©¹Øm5gÕµf^ÿ´/Åå¶(G&„B´-Õd¥Ï­OPµuÞ‹rDÑsôcáÞµŒ²5¯ð¶1݇bŽK?å1CõÕÔî[sÎbBqz²ç¤ÈÈÈ8nÛá³…„8n·›øøxtýlËãl}¯âÞ{o`l¯X4EÇ_º…¯>ËkkË9eÍÀÙ°\Ê/Þý1c•PS‘_Ä_ÍuòÏgßc{mÛ”þi}ïâ¹(þ+,,lzm[±bÅfàa |‚%ÒÂ¥~Ôuý¨±c×^håõ“]žjŒ“Œó'§Tz‹NI.º°˜)¢ú$ç@ï,È¢AÚ™!„âên¦þàæh‡!„â|P³¸ý_ÿdvz€à¡tK¤v!¿¹}ëÏh.:…äãˆÛ¹ŠÝÞs¨èP ¹í‰Y˜^¾«ßÏ¥N·Ð}ò<û‹‡(ýî/˜_цçœë‚Á)󙜯¦sñ­WÓð»ÕìöʇÏ.ËœLjB+ÖדœŠߺ¿sï-6這¬«â‘™CˆÕTôе¼òççXVBës'Ï>ÂõqŒ¸ ™”DØøüoxnU%º¥×>ú7 t j uÛßçoýÝÇ>+˜]©¤EŸƒz¤ˆÏ?ßÎw®Má€_7~ñ·yôŽñ¤haü¥kxõ¯/°²$Š“¡·=Á#ÓºªÜÇÊ…ÅŒ¼6Ìsß}ž=ý¾Ã¿òñÛû_%7 †AG®hþœøþõûÏ=dgUA6SãæñýŸ¼OQ䨸ÏÅFÿ›~Â##òÙ•ï'jå6Ñi¨Ñ@ˆs)5ÑËý·loJx7ø ü÷“~,Y+ o!„]ÌQÿø¥­:Úu ÊÑôt©âBÑœ)6•ÔÔCKrcÂÛšu?ýÞ|ó-ÞzåÏÜ71­±jÐ8ž'^þ9wÞñSþø—'ùû¿_`Îc“H7Ä1öÞqóÙÜöÇò?ÝÆ )3ìšê6²d}îýý÷™9i½â-ÌFÂþCs$^Á=ßJäÓïNgÚ”üzû0¾3k8&€€pa$õ|ï[³™ý×<.ºéRÒTˆs ·šÞäö«¦1uÊm<›ßŸ},§ Ç?„›¯LÙ¶mTê ¤_Í#ßëÉ_ÏÔ«®ãá…|çþ+HT@ë{#ß›RÅßgMãº;ž¤dø%ô{ñE@‡üMÕÜÇ^?ì¤÷Ïï%”–cá½LþöÉo«„7€î£rãË|ÿ¡ÿ²³Aoý6ÑiÈKp”ÙmAÒ“¼x} ËbÚMbÖÔk,7ÆìàÍmµM§š¨É£ylLs>ÙK0ªÑµlÔàr®½ìªÒqQY o|Ö‡êZs”#B!οHÐG¨¡ƒ5–øÁS)_ÿmÐ*¯Cˆé>´iÝ_]ÅH„Btæ!Üõóë©ûãl&QÖãþüï'¸!ïQÞ. tf`ùl¾w×~üJ7îxù%f »ß?õgŒúyß¾w*Ì8옺ö÷Î]“RÅ‚ßFÑu·só´¸ùÑô‚ |þÆ ¼¾¢é{êÇklv;-c?™Áº×Þe^yãmÕäÑü`v/¶¾þŸ•ü«1…ÓÿˆØ¿†ÿæ>Ñb1‡¹~Ò~÷­j[¿=‰O–e ËÉ B!º.oÑvœ½ÇÐïŽQµísü•yQŽêü²$eÁ•è‘0Þ’]QŽH!D»¢õáŽç>âÖCšëçp÷{½ãþˆ‡¶*¸’SÐë–òŸÅwóƒñ¼û.ØÄ¼ÅÕØ].øÈÝb¼ËÕƒAQ0Ç%’Ø^*ÚDhØbìühO¼õG‚J¯¸›ÿäÿñ­š{ùÇŽt¦Þs77ŽLáÛÓ0¬?2û_ ˆnT! ª¢BcëkŸæÁ9·qï7~Ê¿~d¡håë<óyì=¶R9´™97}‹× #¨É3˜ó¿™lýdUblvÌ£å?ÿ»ÿÐ*Æð>6ŨX¬V|õ~ „1`¬¯¤út«±ÍY'¿õuMm;£g#Íd†ä´O¶Mt’ôŽ’´D/W_’×T• žäåÚËðú§}¹µNmIÞCÒ0..$ˆ¾ÙÉøJ§Æ˜S™4eYºYgÏÊå¬I˜Äƒ|”kY»?™}jØá6“žn£$·ŒˆÍI÷TUŸ,cK8ƒiÓ.$=Àd‡íK±&q2÷Ç~Åœ­qÜ8=›w5µz,f¥Šö$«[-7\±ŸxgãT  ÆGK3Ù´+1Ê‘ !„ÑW¾îb2²Ñ,PT²§E;¤¨ªÚò)ÁÚ²h‡!„¢= ïmÖÓ[1Ç’>íW8ªwà36Q)3¾ê*©ŽC=bëñ‡µCù2 ]rg¢‰1y0㺹Yýuæ'èaJ¾|‘·Ö_Ç=âˆKùÝÎýßz˜íõ3õIæ]{êã*&#Õ«_ä狟!híÏì?=Ë×lá±· hž—V0'¤Ö!¼’ç?¸9\Ū_/¤Bשq×аêU®|ó­êèº{b"™^f{ 9icB"qjEãaõº¢y®›Ì˜”cŠ+Ä^vªû'-âü2Ø(éÝ£¶YÂû°¾™5-Þ^/ßÞøAd[A±ôd”ý _W7ö¨t Gvé ^œ»—–¹>¡1ºBlà oÍÝÈþ0Ø|E|¾ü >ȵ2À”ÇgË–óYqÙiŠÕHͦe¼8÷s^Ú c&zb($NҞżòù|–çÇÚN^›LÆÓ/Îçîv5%¼‹ÊbxæHÂ[!„8$ìó?÷ÿQ_¸vÓC- Âþ:JWý‡ÊMŸD;!„íÐÑ=½Sâ­PYŽ;!™Ä¦Œ‰†+9ÚŠêCÅ©Ç0îºÿe;]×Ïz Û²™õãpç˜4,èè˜Iñ ®RÆÖmåMf"å…ÔZ\$fŽç¶«¡Z,˜í(’¦ã5Rȼá·üážQ¤»’H´ÔSX\O$9æç~.º®j¾û/Võ™Í7†[Ñõµ_IÎàë˜5,ƒ¤¤dzMüøåudj*rvá¹`:@7¤sÅÔ‘X”C÷«ª’š„n¤[@Ç΋.$þ¨ÇìðÏ4æý;/ËÉ~·çè÷~ô"Ú©ôŽ’p¸åìé"Kj IDATñ‰ÆÑÝ|µ«7t’§÷†œ•T÷ÌÂB|l N×Hnu选°Ä¡F¨©©%Щ««' CAj^t Š ©@XÇÙw³z;â1ÔþæNÁi7Qs ð×z𴃿Ý>=j¸nÒ¦d·®ÃªM©,XÕЉ?!„¢‹ ÖUR¸ðo¨F æøn(S´C:¯Bu•jËt„BˆÖ í^È"ó/¸iôRžYS‰š6‰›/®añ÷ ÑÉNP«©£Ö›Ff73TûÎkÌ¢ýï~‰G~äûßûÿ}‰¦‡ñ–leÁŸ㥜0†’ט7ù ^|å6* 7òÚ¿žeåoâ×·à‘¥':j„}Ÿ¾Æ¶Ÿ<Êóoĉ„©Ýþ6x>ŸÚI¢Q0„7ðò«Å¼r× ÌÝüû*çòÿžìƯ~ó"³L*Ôçðá“s)ÕAÙù?ž\þ[~üïW¹³$‡Åó—Q”Þx$½l¯~>‰ÇæüëÊJغr ¹ƒÕcªiuJŸÉýâÜ“¤w”ìÚÇ•ã 0›71Ú¼Ûu‚=tjwïÄ3c4ÓBõ¬›ëÃгq¼Úí¡¼b5¯oªG×l$ÙCÔ¦¥´²¢K%sÄXÒ~ÈK;Ä »š~®Ãÿ¾u<õAbVê°ÆÇ«”Ÿñ}>[ñN?3& o#Õðn ,îÅBGÔâB!Ú;³Á@Ÿ”8”çSïD;!„¢]SØÇ+?|‡ý$¯=lEñç±è©ŸðN±ŠÙr’õ|æýw Oýâ¿\\¹ˆ¿<ð/6†Î[Ø¢½0šiØô?¼õY¡: ªÁˆ%ƉÃj@©[Ç_gOæ÷Í`Ân70ʇ„­ñ¸,«¸åg²Î}þÈõÀ&þýÀõÌ ê €j´áŒµc::ëì[ÄÇ~Œ)ÉEÌá\¸j¢úƒosÑf\vŒš‘º5ãž… |h²K[l,v“ †:ÖϹ“+ƒÇØ05àïjëæ|“éMÓ0™Uü¯¨Ä&90îþ'7ßqIŒ§qÿ„hK’ôŽ’êZ3ÿû¬3&í'Î@×aËnóVô8ñNV—cfh{‚0Ê­_±wÊeÜá%`4Q»móZI„òü"ì£.å–Œ:ªª+qgds¡§ñØ¥Û7S}õdîIsSãW¨ÕÏ÷¥kˆËF2zpšÖ˜ÈDVnLeÉÚ ‚!éÒ#„BœˆÉ qßãxgíIz !„‡Eryþ–™›„ÃxÔ¸bÄX½Œ?Ü1—_‡# °8bqX \ÉÏ'.Ä’E±ñSù˜ˆË¦â^ö+®ûØ®Y‰u91ËÉÈ]‚fqo9Aqžf!6ÑBìQC–dÛ¡5‰ÉGm0:Ž\WÍ8’8iÉŸb%>Õzܰ!ÆEJÌÑñ9qYœÇïžt-O½y ëð3Þ/03âÊ1h;þJI@ÃâLäèï}‡it”t÷ï|ÐËxç;3‰8ù;?Õ6ÑáµÕËï±Çméç(-¬Ÿl¬¥K¥•×/j ëÚQëêQ×¾li™3qâÄ¡+ªü-ܽÖQ§=@ƒ_#<Ù))]Íâ¢áÅŒZÖ¬">¿ØÎ'ËzRTn;ÉÞB!D×dÐTBáæÓuKˆ£¬ÖC >Á^B!DÇ’ÕÐ8¹^FFÆqÛ4M>[‹Óçv»‰‹‹ëÚ=™Ã:ÉW<Î/ïE‚¦~ÏGüþ7¯³7dŒúô“n·›´´4Ž<³}Q¥é¹ÔáðñïÏ ›^ÛV¬X±x˜Æ¹E[Z"-\êG]×;výè…V^?Ù婯8ÉØ9ÿÓJï(Óš:9©ãhÝRê3¤”ì¾U G>´—UYY°ª;÷ÅG1:!„¢}2jÓ‡ ¤oJ"o®ÙÄÁ*wÓ¶‚£Ö…B!D˺üD„ªNÁÜŸ1óÍ@1XqÆ90«zÔgG‘‰"Åé’¤·hâ~†ö¯dH¿*R\ÞfÛÜ‹×tcã®ÄÖµ)B!º E_0ÈG_oo–ðB!„¢uŒ¶8åÄzÑ HÒ[œšª’•œ@½?@Qu-&c„iút¯¥/7É ÇŸžRX×SÙ¶7p8Ú'Ò!„íÇ Œú¦&²tG.µ >¡0ó·äD92!„B!ν¸¸¸vßÚD´/’ômFQz&Æ2´g"½S0i&òïãJ,$-ÑÛâ> >›s\|½3‘²˜o#„Bte vS‡ôgwIþP(Úá!„BtŠ¢Hû qVEŠ6Û IzŸ ±~Æ+Á uÎΤ„|Âa{LC$‘µZ°/„Ì+¬< ÎÚsÜþµõ&röDZ#7ž}NBRÕ-„Bä´ÓÃÇÆ…D}«ªóòÔ¼/¢™B!Dçb4ñûýX­VI|‹3¢( Æh‡"¤÷yqù˜† ¨ŒvçE8D}á ?[¶fÝGDW¨¬¶PTn#¯ÈÁ¾'åÕ–(D*„B´o™‰ñÜ2våžz¶”àJU·B!D[‰‰‰¡¾¾žªªªh‡":0£ÑˆÍ&MÑÛIzŸ»Ä30ËÙŽv(mÆÔˆDÁ¶%ê'w›%C¬Ï‰Š _0…(…BˆöÉl0c¥¤ÆÓ4v°ÒÍóËÖRU×rK0!„Bqn9ŽSßHˆSˆD"ÑA Iïóbëî¶îNˆvçÕ¤A•ս麮ë|ë¥jÓ†¤ÔíáµU_–!„]\ï×]8˜@(ÄÓ ¿lèº$¼…B!Î#IV ÑyHÒ[´‰¥;sItÄÐ+©1Ù_ä®Å ±½ ”Ú?ñ6k³„·ª( î–J™§Ž·çD‡B!:4MU± ÔûMcåµõÌÛ²‹½¥QŒL!„B!:5ÚˆÎI×u>Ú°ªúÆ µýå=±"ºN^E5›ò‹šÝÞb40®o&w\4’¬¤®U/„¢kÚ#¯œÀM£†4¯mð±£°”@¨ó¶AB!„BˆóI*½E›ñ‡B¼÷ÕVnŸ8‚ýe'ŸÂò¯%k°[Ìͪߦd÷ÇdÐØ”WÄÁ*w[†,„Bœšª¢* Áð‘DvU]Ëvä’SRÅÈ„B!„¢ó“JoѦªê½¼·n+Å5­kYRçó£ëz³±¼ÊjŒšF’3¦Ù¸QÓpZ-ç,V!„â\ß·'^9Ƀû5?XåfS~ ™ÌY!„B!Ú’Tz‹6w°ò쪳w•±«¨ì¸ñQYݙؿÅîZþ³rÃYý !„âL˜ áp³/l=>Ëv䲫øøÿ]B!„B!Úž$½E‡µzoÊ«0›?m&#cz÷ ´¶ŽEeÇUŽ !„çÂõ#Ó'%‘%;ö²aAÓøÖƒ%QŒJ!„B!„$½E‡¥ë:EîÚãÆUU%9ÖÁÐéTxê)«­kÚfPUB‘Èù S!D'ckšœù°‚ª¶”²·´"JQ !„B!„h‰$½E§SçóóÖšM-nûÖ%£± ,ß•Ëæüâó™BˆŽÆi53{ü…8¬þ³r=%î#sT¬Ûw0Š‘ !„B!εÖv P¥#gK’Þ¢Ky{ífz&ÆSzTõ7@WÝ]qì/«j±z\!Dçç°˜‰±‘_YÝ4æ Y½7ƒ•n*ë¼'Ù[!„BÑÖþžZÞz/Á`P0DäžÑ¯j*F“£Éˆ¢*¨ª 4&Ã4ƒ†ÝnÇjµ’ünÏ$é-º··Mù Ç[MF¤%Ó/5‰—¿X×l›É …ÏWˆB!¢`PF × D?À?­"r¨Â#ް)¯(ÊÑ !„Bѵù|”•” Iq¥Ð§W_âbbqÚc1iF8Ãܳ®ë躎Ûë&§0‡†P£FŒbê´©dõ΢WV/öåî#gw~ð!›·l¦Æ]ƒÃé &&äw{$Io!€œârrŠËOvÚ¹ëâQÔx}¼½vóqý\…Bt,1fýÓ’ñ‡Bl/82áä¾²J^ûòkŠÝµM o!„B!DtéºNYquž:d$»ç`Ì& &£ MÑP5å 2Þº®££ Gذ…Õ|ëλùö}÷`0Ÿ.ÍšMöÐlnºù&B¡}ò¯¼úßW©óÔ‘”œ„ªª’øng$é-ÄI”ÕÖñúª¯IrØ©÷šm»d@ªª²í`1åžú(E(„ât\~A_2ãëÇí †(¬®‰RTB!„BˆcE ò °,\;þZœ1±XŒ4UCQ”Æå´«¼u]_ì\Ž+ÉÅÂw{dûIhšÆã?|œoßûmn¼ñFŠŠŠHLLÄ`4H⻑¤·§PPUCAÕñ‰_0D¿´$ê|þfIo«ÉH¼ÍJimásØWJ!Dëî݃ÞÉ lÎ/fGaiÓøÜ;Ðiý5B!„BˆóO×u ò H°'0qÐÅ8bì FTEEUTş݇ùÖ^×uÂá_ì\Îà!ƒyê™§PUõ´?#8c|¾àsî¼ãNÖoXOjJ*¨Òꤽ¤·ghmn>ksóÒ=Kö¦¶ÁÏ?¯ŠBdBÑu¨ŠB|Œõ¸I&ÓãœTx¼”ÔxšKë!„B!Ú¿²’2Ì3^„ÃfǨQõÆV&::ŠÞxyºt]' ³aÿ“yêé§š&«<ªªòò+/3mê4ŠŠŠHNI$ñÝHÒ[ˆslmn>; K±›ÿy9­ffAu½—…Ûv— BqzRbí|cÜpLÏ/]Cuý‘‰Š?ܰ-Š‘ !„B!Δ¯ÁG]mÓGNÇn±£)@¡©~EçŒÞ=B…§‚Bw!óÞš‡¢*g}¨ªª¼ùÖ›\zé¥Ô××c·ÛÏêxâÜ8ó¯2„'ä9¦åIãX€/våRZ[G蘶'öìÆ%²HuœÏ0…¢C°[ÌŒìÕÑYÝ›WÕ50oó.þ¹xu³„·B!DÔÇóã÷É%ÆÓÜ í-!)/-§_·~Ø­ jcA¡®ëIëH䌗p$L8fsþfî¸íbãb›Ž{¶K\\·Þr+§iLD—Tz qžèºÎöÂR¶Õ[ö0MUè™”€¦ªÍNÅ·dÄ;)«­ÃãóŸÏpE'æ´ZÚ#žI 8-f šíÎZ ¢ªÎËÞ²J¶,& G;$q†ŒšF8iÖ†dXt†öHcgQY³ÛÃarŠËÏwˆB!„è,Ô,nÿ×?™ xè­G¤v!¿¹}ëCgxL=@ räx­ÞvÒÿÅí†7ùÞ=/²û¨·¹Šór~õúOýÕ¯¸öÿV<—± %€€?À€ô˜53DŽTuŸIu÷a‡«¼k¼5Ôë¹û¾»ÏUÈMûþc¼ñæø|>¬Vë9?¾8=’ô¢X·ï ëö¼#5I›ó‹Ø°¿€¼Êê(F(„Bˆ®Æ›Jjê1g ÇóÄ¿/§dY„Ù X±è»Þàs–P6ÐsÚc<:s(‰f#šg#¯üöÏÌÏ?ô™-d¡ÿ-¿â›WöÃe °ïÓ9üá?qós-YÓyèû·2Â¥â/]ÃK|–eE-”˜GªY±<”IÙ¼²}#~%‰‰—Ų|É®ë{ø†'‰Ë8ž==”µo¸ñ¾É¤mú³ÿì;ò3”8Æ<ü'îôýƒ¾–È^Î'·ü‰µ!#ãòW¬œÅoVâ‰N¢tÕÿgïÎ㣪ïý¿Ï̙̞Éd’°¯²ˆŠA\[·Új­¢ÖíöÖªUk¯m­Ö¶¶½µÕ¶^´µZmíOëR«E­(âJU‚,²¶l“u2ëùý“… aÂäõ|<Îãœó=ç|Ïg’!ðžo¾ÇШQùòäyUóþŸtï_?Q˜ä ¾¶^#{”i3e¥,¥l)Ö¡Ç)«qz“5;uá©vÙô#gŸy¶Š—wIß80Ù5ÔÈB‰dJUõ ÍÚ,ËÒãï}¬——¬ÔÖŠæ¿:M9Dßš1E§. É‰ÃõˆÀ»‰!éŒc†«~^¦Ké± ÃPß«B¿·Y{ÐëÖ¤¡ýå4[î¾z{©Öí*W"™ju à°²bЇ&kTé,}ûê«tÙE7in¿ÿÒ%’*]úŒîžy¶Î8ý,Ýôî ]ýÕñ{Gz'i|üOºê‹§kú9?ÐÒ‰ßÓ7§4ÿHŽÑºòŽ U÷à¥:mÆ™ºêŸ®½õõn3Û3TóáëZ7ñTëÚÝÒ÷bÎÓ›Ûìi£Û©ËŠ)Qx†.?qµ~vÞMýþ<íù_¦áÔ°KîÔuîÇtóý T•Œ)–Œ¥M—b)K)·¿.…“4lóýú﫯Ô׿v»>ûÝÖ¯8Hñx\¹Î\²)•²d%¥TÒê”%™H©>V¯áÇwÚ\Þ-—QG’$æôî½#TU}ƒVo/Uu¤ù\ßË·ìÐâ[U^W߬=×íÔ×O„W¦?À2•lÜnˆ7hà]VÿaC˜Ò¤›àgeÂõ}ÜÆüà ñ„¶‡«ôzähñàÂ)Ã)×íÒêm»´±Œi²Í¨¾EÊ1ü‡UŒÞy~åú´«º6Ó¥d%Ã0táÄcÔ/˜«÷VoPñæm{Ž}°f£o,Qe]$ƒìGòófsz΀ ƒîÝÁo¢IûîPÙ&»¬Æm#Oã/¾BM,’²|åÛµroŸV­ê»¯3ìŠ×ÕÈëóʦ´¿àõU0ìtÍzúâÝsÛäL¬Ó2—¤š6ê4bZüúbÝtÁ Êýp«N=©R¯ÿO•ŒcÓÏÙO]©]*¯wË‘žj›“uùÕ Y›Šexܲïãîšgx Š¥vwb˜Š××í~}@çH)%+i)e¤:%@n ÐCoIJ&“]6»éȾõRM›R¢É%¯é©ºæ1ó~ë’dØ$¥gr©•úã•?Uê'ëö¯¬Ô÷Ÿß¬„eÉ2ÒG»äóåìÝ7‚ÊÒ®Æ×WØ»`÷ëé0U×P§ +O†­s¹wÔxRN»S›7lV è„j[[÷ù:²“n‚âhéæmzî£b}°vc³v›a(äõhâ­æßýˆÁúˆÁÊ÷zc¥8>WÏžÎÆïrfº„#Fß¼\4|°†÷.hÖîw9ôºUYQ²ÅÈ…?ߤ¥›·)BÀ ²Pë¸ÍÃã‘=\ªzW¾B½Çè §ìE’ÇèìsŽ–× ï(óžZ0•Ò[J¬~So¿¦/«þEE*ê5HÇL©P;C k…æþg ®¾eŠ>}¡š%:¨«Í×S£¨Q¯7~ùÂ_¾M5¥øNm Ñð~ÅØ{MÕ©ãÓ s£/ž3J>C2õÕs{µz}ÀÁr8ªi¨V"™T*euÒ"¥¬Æm—éÒê•«»lNïO—}*‘yw Œô°O»ªkõìGm?uØëÌQ¿`@u 1U¤Í>0ÔÑ} µ=\£å[¶®RÑÓÞ3§6ibÚù|·¥Á…ù zÜZY²SÑDbOû Ã*ßëQæD³ó·T„µå£pËnŽ|öáºêO¯èŠÝ!Uªz®îžù;-Úç–*ç=¦g¦ÿD?{­j*Ökµ|úÞ3’kþ¡Õ}M÷?1Bù®¸ÖþóǺka\FÚ³ kµûÞcºùÇ¿ÑS·ùä0¢ÚúÖCºûÁRísr8CZóÆ› Ÿ–«×–Äek6Žqÿuí«S›Í”«þmýïÓõ×ï^ªE·þEOÿöSÝóã?ê UÕj¨^©Åó·i@Ó%µêú‹uß#rǵú?ÒÆe8™Ç‡Îç÷igÍN Ê,Sf§Í²R²R–9yzû­wôÕ™_í”~[š;o®L“¸µ;誟H-ûmë>FÛíµµµ6:¸ß´ØÚض§mÛÒöÓ×m-L:u¼$ͯhþ A 'TÔ G ”Í0ôÌ‚¥{ÚM»Mg3BÑDR‹7nežßÃèši“Uèﺧ©×ïø\‹Í¡:¹ ù/Ý5—éœc4=ö©ÞÉ9FçõÍLø¾dS‰æ._“‘{g’Ç™£ùyŠ%Z_Z±§=äóèÚi“UÓÕó/SiM]«88C#e’¤~ýúµ:fïð ¸jJËT›0öÎYm¸, È©…wEä* ÊeH’¥XU©j ¹âª©¬R}B²ÙM¹<Å¢¦‚A·lVƒÂå19\IEêãJZ’ÃPžßÙx,­O+QuU–,2]¹ \²·¬±¬Z¶`H^»dŪUZ™R (ONC²*µ3âV¯ KF*Ú~]Í^¤mÉH¥ÊëLC~Ù¢U ×ÄdÙl2lå(ª„»@Aß$ÝöÌéšþ÷õj¸Åë;˜o$ÐB"žÐ¦õ›4cØiò»ý²¶k=8–•R2•ReC¥VU¦·Þ}KöN~öU2‘Ô”“¦ÈãñÈëõÊ0Œý†öÉdë©•JJJöül›?~±¤›%%÷±¤ÚX[iûVZ[ËíôEÜoo½¿6µÓÖéããùè@§ÚTV©Mm< Ó²¤x2©ŸG~—«Yè=yè ï]¨Me•úÏš ‡³\HJ–®Ò£ŸFTàµKVRqgo9®BíüÖš oмª¾:cSžÞÃtòá+-ô æ*äóhî ÕFc{ÚO1XãôÑç;Ë›…ÞåµõúÍ«ï2Ï€òö‘¿Íc.åõr¥íÊ )$IrÊ*j~]Ó¬†Ky×y}-º4š÷i˜nBnµ?³°Cþ‚ÐÞkrrUÔ+½Ë z7uiÛO]Í^Oë6»;¨"÷îW@¡§§](ÓTAÏžE]Ä‘ãPŽ3GëÂët´íh¹®Î™×{÷ô#»GN9õ‡ßþQ7þÏ Pñ^¿úß{•L&åv»÷2º¡7€Ã"™JéO×¶ylkE•<Μ=Çk’çqëS'ª.×+KVjGÕÞǘ»srš¦ª# JÞ"C¹}‡é+#ý²)¥Í+–hQy/é/כ˷«Þ.El…:9¯TïUºäóæjpÝ.­‹ÄÕ?4\ÊGtŸ›_Ñìü/ä¥Ýªׂ¶(pÜhr$µ¶øS•5N'úøÈŽÈu»4¢w¡ CZ¸~Ëžv§iê²)O&õïØ*}¾³lϱ¹Ë×hÞ§kÛü÷Aà  ;²,K½ûöÖÆõÔßÛ_vÃ.»Í~È£½-5†Þ6ÙÔÛÕGÏýë9]vÍ¥ æ;¥îÊòJÍ~ù_ò¸={FxwÖÔ,88„Þ2n[¸ZÛÂÕ­Ú«" šS¼Z¹n—ª# ÍŽ=n¤Fô.ÔÆ²J=›6ŠÓ45¦oÕE£Z»£Œ@ü€%Õ7”cJÅ¥¾ÃGktž´rñ§Ú7”ðõӹýJl«ÐªØ òIµ»sÖVçÇ ©iô‡áѨ¢„ÞÙ×ѽ«´.–¯¼üÐÒÄÁýÕ;ϯÏJv6}TQHÇé¯U5Z¨½¡w4‘Ðoç¼·Ï÷9ïtªøt×Ô7šO“t²gŽy-Ù±X“zO–×á•Í–>£ñÁ±,K²¤\{®¶€¾}Í·õÔ OÉf;´ÉyR©”f^>S©dJ^Ÿ—°»› ôÐmY–¥5;JÛ<öÊ’Ï”çÙ X‹Ñá>WŽŽÒ_§Cá›Åã IDATú%ÚYU»çØÉ#†¨0׫5ÛKµ¢dg³ë<95Ä=4$´T½ýs½XcJ)KÎü¡š4¤ZK¥›×é›jjS*ð™ò{ûþ5Ãh~~ÈÛ|~´Ü>J®(S•£F ”—å¿Øm6庪‹ÆKì}Ÿ.Ìש£Ž’i·é¯ï-jöƒ ‚²d)‘J5ëkɦ-ÙTÒæ}zæ{ÑÖ4)@'³,K½úöÒ¦õ›´¬¼XÇÇÊãðÈf;´ù½›F{Û »z9ziSéFÝòÍ[ôûG~ÐAµeYºúÊ«UZZªüP~cŒòâÉd›à+¯­×#o/hóšªHDy—rZ[¥K¿|©þËÃÊËÏëðT†a¨²¼R—_q¹JKK•È•Ãá ìîF½ôË·ìÐò-;Zµo,«ÔÿY¤»©p}óiT†ækHa¾ü.g³Ð{pAPL£Ú†˜žY°TuiÞ»@>§S›Ê+UQ[ßu/¨K å{ôÁçkô†Ï­€×¦Mqy¼Gí^âë×jIp´†ïãüÍ•qùš=E'GÃzÛôî–<Ú ÿÒ´Û4´0$ÓnÓgÛv5ûeçüãÆh`(OË·îлŸ­ÛÓ^ðë¸ÁýUÓРśJš…Þ/,\Þø‹PÚ‡(Rã3ï¯ÙØå¯Žd–eiðQƒµ£d‡l[ þÁè(‡Í!Ó0eÆAMMÒôPK¯Ã«¾©>*//×—Ïÿ².<ïBÝxÛ²›ö=ç¥k ´“‰¤îýå½zyÎËJ%S æ÷ÞŒòî>ºê»Ð²ß¶îc´±Ý^[[k£ƒûM‹­m{Ú¶-m?}ÝÖòÀÔ©SÇKÒüŠh/@6sš¦†õj H—oÙÑlЉó£ù}ºu‡Þ]µ~Oû°^:ÿ¸Ñjˆ'ôÄüEÍ‚òލ\·Kkw–icÚ\ΦݦÞ¿êcñƒЯ™6Y…~ïA]ÛÙj·®Ô;¦sû¾G½oަז­Þ³þqc4¨ ¨•%;ô抽#°‡æëÂIc‰Åõ·ù‹T›öýÑ»P§C›Ëª¨;R?ÈÈC#–éׯ_«cv»½U€#—ÝnW4Õö­Ûmˆ*è *ä Émxä²»d>¦×²,¥”’•²IDIETk«Q–Шá£4ã´~ô 6X’´îóõZ½j•^ŸûºÖ|¾FÉDRn[n·ûïd‹¿þ•¤’’’=?ÛæÏŸ_,éfIÉ},©6ÖVÚ¾•ÖÖr;}Q÷Û[ï¯Mí´uú¼Œô€ƒM$ZÍ Þä¥Å+Úlß\^©W–|&»ÍP},Þì˜Óa*èu+ÏÝ|~¼£ŠBúòÄcdIúüTÛ°÷C¶+Ož¨|ŸGŸlتù«7ìiï“—«SFQC<Ñ,ìͬ¤¶®[¥5yš6îðÞRãÜÚé–oÙ®¥ÚZÑ|–õ¥ºÿÕwÛìc_s˺V2™”ÃáÐaC‹ÅTUY¥-5[Ç•ˆ'”jñL¤Ñ4šÛ²,%­¤ì6»*«*µpÙBÙì¶=#ɛγ6¹Ýn9NÙíöfsx3»{!ô€Ã$–Hî3<}/mDxºÕÛKõû׿·”¿ñéZÜ®VsGbq•íÞ}rhWÿ£Æè¢ ܹå¼ÙÒFÒº?˲”H$d·ÛUPT Â^…4§‡Þ–e)™L*‘H(™L6Žß¨§Ûv»½UÐMàÝýz@7M$Úlß®Ööpu«öp}Do®XÛÕepX5Ó]ÑoÓºiôv[Z†Ü„ÝÝ×Á?îЃYªÙX¬—·uþ/RÃöUÅz«¢»Œf‰ÒGn7= ³­¥åyè¾½ ‡K…×ë©åÊd|ÝR*¼As7E;ÿIìCËP{_ º?¦7ìQ»i™^ 窿Y«mQ†ø,UW×(Ùo´NŠ~¦—*s5ÀUi­C£C»/ŠVèÝå[Ue·)n iúØ>rnÙw?gç×¶}~U@ý *­–ŠÌ°ÖEãê®ÑŽÊfçŸ2TZði© Ÿ[f}R9Eý’€n†‘Þ€= Iò÷ÒÔÑGé¨h†êô£ƒª*­QJ’áï¥SFÔi5ú¬Æ’d©tófÕô­ó'ŒÑT÷N-*KµÓOµvîã|Ë[¨©£Fè¤@D ~Ÿ úÒ(ŸZõÿŸµÛe£sÇÑ G’Ñà Fzšñ:sd(!ÓîÇiH 6»ŸXís;eÈÇiª!—CRM¤A¥áµú÷NÉJH_¢Ý~öu¾Ïå”!É´Ú};IV«óñ”¼®ÆÏlsÝm?¼_ÐÍz:¬º¾A–<ª$ä2 ’ün·z÷¡/ö²+(bæH[÷ÝÇo´8¿^×­ÒÚ†”H)\c¤7h†ÐÐq5;4oYDe‘\M(¬ÑZ*Ø_îå+õò»I&ެÐ>;0êÀù†Ë£øÖµZ­ -Ο0¤—V.×ì¹­ÙI½@š®zÜhË~󼄮v{mm­î7-¶6¶íiÛ¶´ýôu[ËS§N/Ió+¢m¼<è®™6Y…~ï!öb©fã2½“sŒÎëk—%›J4wùšL—€N44R&Iêׯ_«cvû‘õû*€ž+™L¶j+))Ùó³mþüùÅ’n–”ÜÇ’jcm¥í[im-·Óup¿½õþÚÔN[§gãA–€¬Áô&å"±x'ôbÈ?x¼Î넞·úhg¼~p¤`¤7d¹ŠÚúL—Qu=ûõÐÓz@–[³£4Ó%dL2•Òº]å™.F„Þå6”Vh{¸:ÓedÄâ%ŠÆ™.F„ÞÐÌ)^¥h¢g…¿¥5uzÍÆL—3BoèJkêôÂÂåôPËîoWu­žÿxY ú¡7ô›ËÃúëü…ZQ²S)ËÊt9]"šHèý5õäû‹UiÈt9 ÌL8|ª#Q½²d¥æ}ºFƒ ‚ò»\2mF¦Ë:d±dJµuÚRQ¥d*•ér@z@ÔOhõöÒL—Ðé˜Þ5½YƒÐ5½YƒÐ5ÌLÐYÂáp¦K€ñûý™.!kz€¬Ñ§OŸL—R[[›é²¡7È‘H$Ó%2Œ9½YƒÐ5½YƒÐ5½YƒÐ5½YƒÐ5½YƒÐ5½YƒÐ 0ÓôÃç^ÕswLSÀÈt5s$Ö óÌLpD0<zúºú¢S5n`žìu;ôù'ÿÖã>¯e5V¦«kÅ>`ª.>1®wÿ¹@ÛS’Ý¥ «×ʳ~—¢]®á×Ñç]«k.8Y£ûçÊl¨Ð¦eoëÙ??¡·65tÏšd-Bo€ý²kÀ?Óïn:NžŠ•zgΊ÷«ÉÃó«ïŽi¬CcÎÿ–®¶@Ÿ½Ø +R¬Go˜©¸#WAŽ:oàtކÏü•~{Í(™å+ôî+o©®`‚NýÂ%úÑ1å¼þNÍÙÑ‘¯Ñá¬@6#ôY骫®Ò7¾ñvÏyúé§õÈ#ì¿3×ñºäò òÕ¾¯ŸÍ¼QÿÚeHɸdúåËuÉaòºP7Üp±¾0<_Fx½>šýˆzz‰*çèÞçn–ïå?ë³Áè̱²v,Ñ?îû…ž\V#åµÜ’!ÿ˜¯ê;7^¬)Ge•}¦·ÿú;=4w£¢2”;æ"Ýøí¯jʰ|Ùë¶kå‹è‰è¥ºó‚>2_ÑïßøŠâ‹¯™?Oè×o|OÇ.þµ.þáUY_s³Û{‚¾vÑÑrÕ~ Ÿ^vƒþUjÈHÙô·oþ?=óítÙ£ôÆŸV*™wŽî}îVõž÷Í/ø¢ÎRÃÚ×õÐ/féí¦F~íç][³k˜Î»åV]~òpmuÚµþýã{5{müÞgºæôYiÖ¬Yš5kÖ>?ú裺ï¾û:Ô—9dœÆåŠ|8[ïE‚ æå)*T^®SC2§èæŸß 3Uëýgÿ®yÛŠ4íºŸé‡çõ‘aÅ·õåK5tÍSúý£¨¦ïd]yã—5Ø&i?ÇÀT}ç§×ëÔüÕúÛÏ¡g6öÕ—¾w—.?Ú”‘7M7ßó->¨Výã)ýkÁmÙ²Eåk—jmµ¥TõB=ñ³»uÏ_¨*SÜ’¬xL)bÍé_›AGk¤ÏPtÑ«z?ÚøµÉË÷«ôí7´:iW¯£GªÀhzvõ?ó< *þ›zn…ì£Î×w¯?MA#¥ê.­ÙPÞŒkuÙ#Uûöÿé×=§»ÊT¶“ÀÈFŒôYÉï÷ë‰'ž$ÝtÓMÍŽ=úè£zøá‡•››Û±ÎÜ^ùŒ”ª+je³KÉÝ͆Ñ8á†ç¸éš´ôùïÐÞ ·¨×œ;5qÆIêý^µ$)¹éº÷þç´Î¶P§OÕ÷í£^viãî¾öu|ç„iš’ŸÒê?<¨¿¿µMZÛWÓÿßµ:aÒ@=·õ˜géó‡ ÿyt½”ŠËräËy_kj¯Ö‰îõúðõ×´$•#O¯qÍ^Ò¡Ô¼!•Ö‘Ë#Ÿa©¡*"kO nȌ֪*%Ù¼^yÒ‚ò䪧uß#/ªD+T8õ ]=á8Êy]ï-ìÚšwÕÔ).C¡¡Ãä™÷7ýþ© ŠûrÛ;öpä ôY«­àû€oIV]µj-›ò‚A™Úz72äõçÊa$µ£,¢@ W–*´«A²å°íc·ïRß'¯aW¬Á’l†¬´yBÚ>nÈ—›§ÃÔèžÕüöœ­>rý9Œ„JvÔ(H{=vÇî?ï·ÉáñÈ“P‹ù°;§fI²ª«Uc* å1¤¦gzyAåÙ¤TM•ªÓBòTU½R>¯¼Š©ª2%£Gî›ÌDWÖl©æíßëΡ~ýàëçëÖß«k>û‡~þ£G´(Üçdp(½@VK¾].×Þ’”ܰR+ë¤3&Ÿ¡“C ôfyzPj©º¬\1Ë®>ýz˦õJå÷S—”ª(UiSà›jºÆØæ¶[Û·,«1œ6Œ}ÌmÛI5KJl*Vqõå:wâšÞû]½¼=)É©a§ÍÐ{R%K?U™µ7À¶÷í¯>v©Ú製m²"•ª¨·¤.®Ùfë£Y×é¬ÇÆèÂü¯~ô¥‹ô3_Ñ'Ï•´ñªÉ½@Ök ¾-Ë:àÀ[’Ôð¡þþÜZM¿vºnÿcoMûdƒ"žÞZ´F³nú“–-|EswÌЗܡ»‚‹Õ0ò4ç¨ÓÇsæ«ÌštHµG¾ªye3tÎù×领·µ)áSï!E*y~–æ,¯Oê¦iÊ¥wêîüE*ó¥a•Oé»oUE8%cÀT]~cB+VêŸ/µxIT³[¨'ÿR¬·ž ï<øG¸èsE‚£uÂIJ•ÏÓŸþ¹Vé”}àWô?wúõiÎDÕËPåkÿÑʤ$£ª k6ÔëìÛõíQ•Z¶v‡RVL)%T[Ußá× àÈÁƒ,@à÷û.ð–$›ôù#ßÒõ¿UŸEûiòé§é £ƒ ú©v$%EêþªçWçhÂ9_Ö)E»ô惷èΗÊ[LÑqàŒ†úÍõ?ÑóëB:ãº[të·.Óôq…ë%UÌÑÏnTów5ù‚¯ê‹¼Ú¸¢DIk§æþù)—4áìs4e€³õhæÎªÙ°©ä™›tÍOžÖ‚ò‡Ps«¤'¥x}jêK¤d69œnyý~¹ÍÆ“Àúùswèø¢³oø‡¶GS²åx”›—+×îo[WÖœ­REUDñ”%v9\>9º*ö#™L¶j+))Ùó³mþüùÅ’nVãcÚZRm¬­´}+­­åvú¢î··Þ_›ÚiëôÏž˜Þ Cìrú‚rúÚ>j8< „< ´<`ó(¿'­Á”¯ ötcìç¸$Û¾ú–dwå*ßÕz»Í•«‚íÍïs5·¾›ž€ò=mUØ’)_¨H½Ûˆ¹º´fW@®ŽÔàHÇô&€¬ÁHot9«r¶®÷D³©J +z ëµš~ºª²¡7 kz²¡7 kz²¡7 kz²¡7 kz²†™é€î,•J©¾¾^‰D"Ó¥ 3MSG6ãŒ3ÐhG}}½|>Ÿòòò2] º±p8¬ÚÚZù|¾L—ÒãzíH$òx< ‡Ã™.Ýï‘öÀ~Äb±L—€nŽ÷H÷Aè Ȅހ¬Aè Ȅހ¬Aè p¤qœ¤¾p·¦92]t?„Þ ç± Õ•?¢«²7owž Ûþò#M÷wŸG_ל—gköìÙzé_Ïè‘_Þ¨/ðéî`ÅKÅ·:§LÈ&„Þ J(–ˆ+šhÑ-Ö“?{\ j:+MN(ý\]q’N8á0ýýxŽ¡óq¯.áì¤{Ò™™. Ûp««ï;C|ý½§“ôƒGNÓŽwR56_îÜ€¬U×½¼¥mIÉ5ô}ç¶Ë41dStç=~ïCzg[˽QN ·z÷NJVR[^ÿ¥nõüIÿoæT½ü“y [¦ñ»ºõkãUàtÈ^³DýÅoôÚæ„ä¢/Þ|›.”i7T¿æYýâ§³µA’Nøêšù¥Q*ðJ»þó¨~9ëmOÖ¯t;„ÞM¬„âVB K’bЇ&kTéL}ûê Šýõ¿<®K&Ì×ëÊ;.TÝý—ê´w+UtÁoõÄ­çhÕí³µ£½Aâ†]_u ßÕæ«Çh¨}ž'*]úŒîžý}­ ›sËÓzð«ã5ïwŸÈ>ùR]¦Çôµ3_W•\ê5 PJª1ÑqOÒqæ·tÝ9Ÿ(œsŒnyò}}ÂûúÝ¢øaùR¡ë„B!9R999’¤X,¦Õ«W«¼¼œãp\R³vôLo°/±¥šóf¥|¡ ò´nmB!¯#NÖ”ÚÙzj™TPRüƒ9Z6t¢Æú:6S·=Z«ZG®Ý§×lù\efHEE¹*-^®dn®r$Å·lPí¨ó5ó¬qPäW¢.¢TS'‰bÍþçz9 ŠÔË¿KK–5ÖÖI³‘#ƒ†¾'Е¤œœ >œãx¼e;zFzìS¢Iûî Ù&»¬ÆmPÃN׬§/–µû˜3±NË\’jöß«,P°ºRU)IFžÆ_|….š2X%eùÊ·k¥$)µö1]ÿã tý ¿ÒßÞ¬×þüž\°S I²jTw4Žh4ì{kÃ/•JµÛÆñŽoë\d?FzìSëÙ’dU–«lÅ£ºúKgëì³ÏÖÙgŸ©éÓoÒ‹íÎmÒÄÔàiÓTT¼Hk’’wêºkÚNýñæ«uÍu×é[ÿ÷¾ê›ºqx”\÷/ýê›çéÂ;iä-·è¬ÐÞšŒåuÖã7‘YŸ|ò‰"‘ÈžýH$¢O>ù„ãx¼e;zFz´£­ÑÓ‰Õoê­àºñ‚eúÃû;3Ü*ìçSmI©"í$Ï6O?û:Ýüå:=þß)*S^Göp©ê]ù ùûè´ §Èo|*I² ÖàøVmÌñ*^£õÕ'5+ˆ‘݇eY²¬Ãó±Bmm­fÏž½g”²ÍfS Ëåâø—Ô¬½«®÷öÐôLöáºæÑ9ºj÷nªúuÝuÅ»ºÔ°Vë±ï=¦›ü=u›O#ª­o=¤»,U¤åÉö£tŃ/è’”¤dµ6}òšþïê?k~Ø%¯i©rÞczfúOôø³×ª¦b½æ>9[˧ᄡ×TÝòÃóÕߌ)«Òò§îÑ£»,)§åMM\.W»A-Çí8²_W} ز߶îc´±Ý^[[k£ƒûM‹­m{Ú¶-m?}ÝÖòÀÔ©SÇKÒüŠh/t…¡‘2IR¿~ýZ³Ûíì%®šÒ2Õ&Òšlå:)ÈU”K ïÚ½mH’¥XU©j yl²UWÕ¨!aÉ’!Ó•«`À%{[÷I…a“™ã–×ï“ÛÜa¤¢ª©¬R}B²ÙM¹<Å¢¦‚A·ŒX*ÂõJÈ!›Þ€ò¼Vûµ¡s…Ãa…B!%‰ýŸŒË4M•——+//¯Cç'“ÉVm%%%{~¶ÍŸ?¿XÒÍ’’ûXRm¬­´}+­­åvú¢î··Þ_›Úiëô!òŒô=CþÂ>ò·qÄÙ«i„¨Ky½ÒG‹Ê )Ô´gº¹8ÈûìasÊ*j~Žg÷:ǯPQWí×=ý²#½€ý8œ²Ä‘‰÷G÷ÁHo@Ö ôd Bo@Ö ôöÃ0ŒL—€nŽ÷H÷Áƒ,€v˜¦©H$"·ÛÍà Ñ&Ã0‰DdšÄ­Ýß Gõõõª¯¯Ït)èÆLÓ”ÇãÉt¡7Ð.›Í&ŸÏ—é2tsz²¡7 kz²¡7 kz²¡7 kz²¡7 kz²†™é€î,•J©¾¾^‰D"Ó¥ 3MSG6ãŒ3ÐhG}}½|>Ÿòòò2] º±p8¬ÚÚZù|¾L—ÒãzíH$òx< ‡Ã™.Ýï‘öÀ~Äb±L—€nŽ÷H÷Aè Ȅ޺5Ç#§Ó™é2p„ ôЭåäähÒ¤IêÓ§O¦KÁ€Ð@·–L&eš¦FŽ©Ñ£GË4ÍL—„nŒÐÀ£¨¨H“'OV(Êt)覽@Ïe ¯ÿáeýæ¼B™®@‡åääè˜cŽÑÈ‘#e³q¢9ޠDz9U'5¬’ã”SÔ‡Ô8¢†¡>}úhâĉòûý™.Ý¡7è¡L}Ú‰Úñüoôïè):upZLâ8IßøzMŸ~“f=û’žÿáÉr¶Õ&É=ôKúÞ¬¿é™gžÕ³ý®ŸÚG¦‘¯sýŒn›ähìÏsŠîœýŠ~zš¿qD¹9A·<õkßg¨¾xûƒúÛSOéïÏü]þÙbÏÀ—8‚y½^M˜0AƒÎt)è&˜ñôLÎq:í¸õzýñíZa–ëþSGèÙ «”$+¦DáºüćõÃó~¬Oc~œÜº­×dÝp×…ª½w¦Îx¯Lö_Ñoù¾²éV½÷Ñ.3j ì ×É<æ8õ/Ù"û„1r¾¹@±þ£4¬âcý먯ë=¦¯ùºªäR¯…R2Ó_tG¡PH#GŽTNNN¦Ké–l6›¬üü|­\¹RóÿÀ IDAT ™. ÄHoÐ#y&ž¦1ËçhqÌ®Ès´yò v¤`lÒ‹ÎÖ6W¡zå¹Gh·hs ?I'„gëéå†BE½¨}[{Ó¯“Oê§]Ë–É5êhå¦F?Zëž~ZŸ:^£†òF‘·¸X›·nPí¨ó5ó¬qPäW¢.¢T†¾èÞ†Nàݹ¹¹:þøãÕ«W¯L—‚ b¤7èyŒ\xúÉ:êäÓõú†$K†Q¥ø±kÙÂÝ#DS»T^ï–#}È`Ë6_@þÊ•jØÝ`˜N5TVÈßÛ/cýb­pºFzÖéè±[´àñE2O¿B‡yä:f€V¼µ^ɵźþÇèú~¥'¾½Y¯ýù!=¹`gãhs M*ÅÇ!•J¥Ç3]2ˆ‘Þ Ç1òOÖŒ~Ïëò ã4vìX;NSnýHãNŸ$_úym$'émVy©ÂùE*ØÓfW¨(_Õe•J%Wkñ†asò$«X % uZòQ¥ÆO:Ec‡oÔâUI’ëþ¥_}ó<]xÇ"¼å≚hí“O>Q$ÉtÝ^YY™æÎ«’’’L—‚ b¤7èa õ>e† æ? m}ÔgwÆœZù†–Þþ˜÷Í«m:³­«÷J¬yCóœ?ÖE“ßÖƒ Êeë3CŸR¥7o+‘%›V.mÐ×.ü‚jÿ}‡jdHŸ,Pêž u|ä5Í®“ìƒ58¾Us¼J…×h}õImßgY–,ËÊØýkkk5{öì;â»oß¾š>}ú>§R)­X±BkÖ¬Q Ýn?ì߯L¾?С7èYluê ŸÞûÕ&iömÉåšûÑ÷tÅÉzóµŽueh½þzûŸuóOïד7»eD7iÞoïÐ?¶Ûä4¥Ë–Éÿ͉zsa™ Ù¤‹´Ðü–Î.^¦’rzMÕ-?<_ý͘¢±*-ê=ºËâoóÑŠËå’ËåÊtã÷û÷y,kÁ‚ŠÅbÊÏÏ?ŒU¡»êªÏ[ö»¿F´µµ6:¸ß´ØÚض§mÛÒöÓ×m-L:u¼$ͯˆ¶ñò@W)“$õëׯÕ1»ÝÞª-«”(”?ýÁ•² —ª.'¤|w\á]¹Š‚r5% VCë6IV"¢êªZE“)É0åòäw™2$Y±*•–Çä.hºW\Õ»ÊÔà ©07GŠÕ¨"\¯„ ²Éá (Ïë`°w7‡ …”H0Ûz¦äææjâĉÍÚ,ËÒºuëT\\,¿ß/‡Ã±«Ó4U^^®¼¼¼ŸL&[µ•””ìùÙ6þübI7KJîcIµ±¶Òö­´¶–Ûé‹:¸ßÞzmj§­Ó‡È3Òô0¦|…m´ræÉ)I²+¯W‹Qµ†«u›$Ãt+r·y'#' ¢>é-åõQnÓnŽ_¡¢}`憆-X°@ápXÁ`P†ÁGEØ‹ÐÀcóæÍZ´h‘<@¦ËA7Dè ìG¦dÙÓY–¥x<®Å‹këÖ­ ²ÙlÝê{Òjéé½tkõõõzõÕWe·Û 3]º9BoÝZCCƒ<OV‹žŽÐ@·fšÄ˜è8[¦ º;Ã02]º9Þ#Ý‘í0MS‘HDn·›‡¢M†a(‰0"½›à»´Ããñ¨¾¾^õõõ™.ݘišòx<™."ôÚe³Ùäóù2]€bNo@Ö ôd Bo@Ö ôd Bo@Ö ôd Bo@Ö ôd Bo@Ö ôd Bo@Ö03]Г$“IÅb1% ¥R)I’Íf“išÊÉÉ‘ÝnÏp…À‘Ð8L"‘ˆB¡n¼ñFM˜0A¡PH’T^^®%K–hÖ¬Yª¨¨ÛíÎp¥À‘‹éM€Ã ¶¶V_|±^xáuÖY***’Ýn—ÝnWQQ‘Î:ë,½øâ‹ºè¢‹T[[›ér##½€.‰DtÉ%—è–[n‘$Y–Õæy¦iêÖ[oU*•Ò /¼Àˆoà 0ÒèBÉdR¡PH7Üpƒ,ËêÐrÓM7)//OÉd2ÓåGFzûQSS£h4ºçÁ“"ê—¿ü¥ìv{‡¯·Ûíºêª«tçwÊétð=qxÙl69NùýþL—zíª©©ÑÀACtÊ)3jº‘Õ«WiúôS÷9¥É¾Lš4In·[@à€ï‰Ã+•J©¾¾^555ßÝ¡7ÐŽh4ªI“§¨º¦V•᪾~ûŽòxÜz‡B!¥R)ÙlÌPÜÝÙl6y<Bïn‚ÐØêêåäÜ4#–•R*•:àÐû`¦R@è ´Ëívë“E 4á¸Ér¹|zÓnª¢¢R……tÝöíÛeá÷ iz“ƒ™þÐhGnn®ªÂzõ•*€ŽD"zíµÉºüòËèºwß}Wõõõ™&ãUƒAè zÛP]ùð#ºú({óvç ºí/?Òt'Œ®5òôÅ_½ »§{öÞvÈzäõÇtõ°½÷5ÇÞ 'ÿt¥†¸Û»·¥x,¥XÜ’d¨hâIÑÔ­S,Sœgv{‡CG zðÁ5sæL͘1C3fÌÐÌ™3õàƒª¡¡AGŸb‹Ðô@ ÅqE-š£ÅzògkAM'$ÈVX ?ܤácFìž_ÖPѱãå)wéØãúìelê3úh%~¨ ‘ÞÛÖW§\v®†»™öâHdš¦\.—¼^¯ü~¿rss•››+¿ß/¯×+—ËÅoàñ/ ‰ãX]}ßúàë÷è=¤ÒÊä:}¼t ŽŸà•9dŒFíX¬Oë›ßÖ>YvÍÖó«sTXT ×Ö—ôÒÒ¸$›\~¯LÃ3¯@!Ÿr I‰bÍþçz9 ŠÔË¿KK–5ÖÉ(z"¦7ا:E“öÝá±MvYÛþ  †®YO_,k÷1gb–¹$Õ¤_ÕÊÅ[u͘i£Í?ª¸‘ÔÊ+ô½SƪߺѲ?¤Ò–·õøä­¬RÄÑ8^Ñ0㪯Ní»L«FuqGãèFþ·Nè½ö©utlI²*ËU¶âQý×µOiÛî,Ú²Lù òåi1MsŧKõÿÛ»ó(·êúÿ㯛m2K:ÓÎÒ ùÊZ–²ˆ/PÊŽ–E¨ì²SZÀ  ‚Š( –MÊ"‹È"øE6«È^VeU -mi;v¦³&¹¿?¦··÷&7ÉMn’y>ÎÉɽŸû¹7ŸLÒžÓ×¼û¾ÉÝvÑ®‘åzñ¾.24ðÆóúàèm´gíh½þÐG2m¯d®èPgS³FÒ"S’Q¯DCæÛ°·VÉõ­@• ½ @NQsòݧôב‡è´¶Ð:mmj½ž6ßö+jv*/üx®^oý¦v½¤W– ^Íè}MϯÜY“7}Osß]»*;ùÞsz±u²öÛ‡ë'_Õu<¥‹/œ­{âýZ1ïi=þ×ùZ_’ÌõèíoèW?º];/{R—Ï|%¯·ÕŠÐ ?éuãÔ-teÒ2ªÓ¨Ö=1é ÅÛF*®¿ë‚¡mC’’šû‹½ô·h‹šëbж?­Kù“~œ4eÊP$>B#ã ¯õb½zêìíõ`x”ZGÄVZtÇáÚê¦ZµµÔž3`}½˜RïÞ¢S÷½V¦¡P$®x¨OÉx‹FÆCêxæÇ:ðO}2õjÓÓ®ëä?ù~Šõ?_ì×uzÃa;Ó˜Ó³áqèrØ[¶C–}ë³ÓcÖ¤I“&HÒœv‡_É€¢Ø g©$iüøñk ‡×Žœ ¥R©µÆ,XðùßmsæÌy]Ò’R.´Ã³iÙ7-cömëC÷3=gS†1ßoAÀ¯ûUƒÐP5èé ”RdŒv8üD=e‚Ú¢)­úøY;ìz=»0™ýÜ"3ZöÐE¿=SæÕê§nék4j³ƒ¾§ã÷ÝJ­1SÏ\¦ÓozC¥ÿ)E4vçtö±;k|ÜPºó]=rõåúý+ýïË_Pé ”Q?NãºÖ9î¬oLš¬éÏ®¯SOþ¦šŠu÷=Ï kÕî§ì£Øû ÕÛðZÖzS¤_}M—L›¢=÷œ¬ƒ¯|YA,¥þë:þäuôø©{k·ÝvÓ·þ‰¾9ý`mÌ-Ê¡7PBæòêŽß=§öšв^Ðâ–6 4©3ÔºÇ)ÚÉMºó})èü]5[éÀ=—膟>¬O#ÍjkkSK"ȺŒpT‘Þyš×P[[«bŸýW‹#Eÿ!Á ¡7PJ¡Õ7Ä IRHm¶ÔˆwÞÒ'©à–d´í¡Sö]¬«¯}]©Hð‘axMõÕå‹4æ¤+týM³uóuéÈmGz›+žÑÛB3Ï?D;N˜¤cÏÛW×ß©7);‡Áƒ€a*Ô¶›NžÒïn ¨u‡$mÚó”}´ðªëô–b2‚¯ó–ÑØ¬Ñ›l§±/üDGt€»ð5myæ)Ú%ÀÚŒ~}ðÈýúd£o뤳ÎÔÞÑèÁ7:þÇ„Þ@Œ¦‰:ù©j¿ò|=Ü (j6Ô6ùTí½à*ýæ_R¬\ÒBÃPêµ{uË‹ÝjhmQíÂ?ëá7Öf”¾‘¶Ñº—.¼tW½4}í=ewýàº:gÖIÚ2^ò¥À£HÐ †#±¥Ž»èxÅo™®‹^M©!PÚlŒÒv;o«¶ÜF0»‡¢qEö¿O[<~‘¾ûë—• `Y©E ´¨q´ÆÕ†õqZR´Au‘¤úúÌ’¯¥nË´ñk¿×yKÔÖ*­xúZݳß5Úaý›ôÆ;ö¤«rùÝ 0,u›jÚ…'käÓuÑœžàoI2?Ó½'MÔ6·Óĉ5qâŽ:éžùzꇓô¿ý#°–+æÇOëÉôÞ:r÷ñŠÉPÃ&ûkʸWôÂ¥à{?ùD½›NÒÄQ!I†j×ßU;›¯¤K¾xC¥7P2†š¾y”¦m³±Â[?ª½††S tïÌcuýÛ¥uê5Fu–ýDÔP¸n´ÚûJ¼ë²êž\¥1?½TwP«TǺ낋ôÊ€¡X‰ûÀ$ß¾Yš› |zðÄüøi=™Þ[Gî>^1jØdM÷Š^ø ôÒ€Ïq#KÞ„êž\¥1?½TwP«TǺ낋ôÊ€¡m½Q&¨ôÈ[T“.xHîÍñP©"Š­ü»~yÔdMš4I»0Sw~hx£¬Pé †ŸÐ:ò†ßè;czÕŸ6dö}¦?}‡®ýŒæ÷çr!Sýiõ8õ3¶«ÙAg]¿»^™~‰žé¤÷1*›©Ucs­ƒ^à‚Jo0 %Õß÷fw'í°ÃöÚyêOôÚF§ë¬}Ǫ(«}¯ëŽ‹oÖóÞPtTz€a+Ö8FcƤd¦>Ô_žúHû­ßª°–h)gjæ!ÔRU¸s®nýÙeúËÇII†FL8BçÌØOFzÔþß§õRª_ƒQv†cÑ­tÌå{è¹Ã~¢¿i'ûÛÿÕ¢gÒÚd‹QªÑ(ó»ô‹YÕ§©¸6<àlÍØg¼Œp«þgýF¥Ú?Ð}?>]·¼ÍÀ *½À0Vb½]tø>cõæËï+©¤–¼v·.|?©–æzEÚÆ¨õ¿ok^M³ZZâZøÁr­¿éÆÁ]À3Ú›€á)õÝzô¡ºæÝ”ŒPT5õ %ꢒѤ WS¿¶¾ê”’Ù°®>û×à9u ª_¾B=ÑÁ:B#2 î•éìÇÖ²J}©ðêþá!…eÊ”œ÷ž>þòŽÚ¾ùúÇŠQÚzë‘zÿáOåv ”R©”úûû•L&•N~+C¡"‘ˆb±˜ÂápÀ+z€a+Ú8Z£G§Ö«Ÿtš.Øå=M?ù"½½JŠît¡þïÐÁcæŠu65k¤!-2%õJ4Y­míqS’ÚÓU ëfÍÒ‹;µxÎOtÅó}R •ÞVOOš››uÚi§ië­·Vss³$iÙ²eš;w®®¾újµ··«¶¶6à•´7°0­«S¸c‰ºã£Ôúhþùª©©)ò ËG(RMM ç¿PZ„ÞåÀìÐ×ýN~p­fŸ’TÒ ÉèýDO_v‰]f*FÑl`:;;µîz_ÖÎ;ï6¬Úv¼ûî;Úu×oº¶4q³ÝvÛ©¶¶VEZYùI§ÓêîîVgg'Áw ô( !iþŸtÁwkÀ4d¦LEo¡†8‰wúúú´Ýö_ÓÊÎ.-ïXôrJfá¢Eª««Í9ônnnV:V(*ÒÊÊO(R]]¡w™ ô(F´^M-õA/V®ìT,6|ÚuH’i¦•N§s½‡S ”'Bo ƒÚÚZ½òòóÚz›íŸö&‘pDííËÕÚÚ’Óy .”aÃ*üjo2œÚß”3Bo ƒ#FhEG»þï‘û‡UÛÓÓ£¿üe{M›6-§óž}öYuwwç\!^Ɇڛ$ ¥R© —3ìz¤R)% 566Ê0Œ —S2}}}úãÿ¨©S§ª¦Æ[k—¡sÖ]w]ÏçTÓ4•N§ ¼Ë¡7E*•–f{{».¿ürýð‡?ÌZ¹m†~ùË_ª££C‰DBýýý%Z%°&Bok1 CuuuúË_þ"Ó4uæ™g*¯~†¡ÞÞ^]qÅzüñÇ•H$†UE<Ê¡7G‘HD zòÉ'õ /訣ŽÒvÛm§Ñ£GK’/^¬—^zI·Ýv›:;;ÕÐРH„ÈÁâÀU4ý¼šûšk®Q2™üü†ž¡PH‘HDÑhTuuuÞ( | d‰D‡‹Å”N§?oqb†B¡B¡-MP6½de†Âá°ÂápÐK2 ½üBè ¨„Þ€ªAè ¨„Þ€ªAè ¨„Þ€ªAè ¨„Þ€ªAè ¨‘ )N«»»[Éd2襠‚E"ÕÕÕ)¢Î8h„ÞÖº»»UW2-,m IDATW§úúz†ôrPLÓTWW—º»»ÕÐÐôr†=Bo kÉdR555êéé z)¨`ñx\A/¢§7@kŒïPù ôP¶:::T[[ô2PA½UƒÐP5¸‘%à Cuí­Nø–vür£Â†©¾Åoë‰Û®Õ/,Qª˜/ßU?ºï<íh$e®J÷-×G/=¨ë¯ý£Þ^if<=_áŽÑuß7tÅÉ7ë½¢¾AÀ;*½ÀðÚ@GÞø¸ûó#zä‘ÁÇŸî:Có.4Ô¶íNÚ¸ÎÏE¢âD6Ñ´sUì¡éÚwçohÒ7öÐ1×/Ò׿?]{´Å}m³_sõ«ý&j›m¶Ñ6Ûl£÷™©?×|[çµµjŠõºÉ~%“ýÊåކa¨È? Iµîp¢®º÷F³QØúêªûÊ·ôÃßÜ®ßßu—f_z¼v(ögƒ’£Ò CIõ÷½¯8D×¼³º<5T«‘­ªÉ'ÿ Ó·﫞Kþ©÷º‹SQ‹ PÓ¦1£æiÎË+Uß6F 2ÕûÒU:á°:)iJªÑ{O׌C¶Tc8$sé ºõ²ëô̧I…7¶©¦½»^r¨f<ß­/r…®=uw½ñjçnÕ Ò [±Æ13fõ£m0ð®Ý`o}õït÷ÝÐn½L'O;X5ÝIçÞrŽ>ê‡úÅåWèªßÞ¤Ygî¦q‘&íxÂ9:x³-4í×ë7¿œ¦M)3žºæê¯/o¨~~–Ùm+}yd\‘š¨R}}2%-»ëøc[ôç“öÑ”É袷·Ò‰‡n­˜$õ÷*µîVj{ñ':åØ#tÄ•óô©»jlHªßá0»[Gî=E{Mž¦k?þжÝ0žu9Ñ‘[êàý6×go½¥e¦dŒÛW3NY_;û íµ÷:ã‰ñ:ñÔÝÕbHá¾­S&·ëªC§èÀ£®Ð¢­wѺ©nõ¦%3Ù¯T²ïójnûþŒï¯¯[ɱ[(ñÄ Úã{·ëãbÞ’döjÙÜ[tÖôÛõïž5“ìÈ;jÛ¥êž÷"jݨ®'ïÖ ëCGPí]Mø+`HÍ–:悃Ôõ‹#´Çß–*¼î·tÙoÏÕ·æÍÔ=Ÿök y{m²ärÌÕg¬££n¹Y‡n5M?ÿÕeúêv'jÞ÷NÖ½Kk4bTƒbdhÃÑ®ÇÏ›¦OIý¯éѧ–«¡¹Y õêÃ÷“Ú©9¡ÚD½"†¡š¦µ˜ôH¾Âª«ï׿š¥sÿð £´ÉîÇé¼üTÇ®8A¿ù×8íuüqúöıЦ’2Æ*2ÿåÏokšNøÎuÃ9q}ú÷;uÍoÕ¶*f%_׬©ÇêŽi…ÚЬߢ7~N푘"2T_× šífêw¿?uõ !ESÿÑkõ!ÅkkÕ»ªO‘°”RDÑUË´<×jìš 2¿¿U]ˆ…UÜ;z Çj´vãpC±hL}} iõ2Œ”újòç¶šz€á)õÁ=½šF›òc%–ÿK½««@Hz—·+1&±ºGì*õ¥Â«³´Â2KpC>TŠhÛæúÚ:úç«óUS?B2SZôÙúÃËêÛë6©iô‰š9ámzìz{•T¿×ztÿì×5bQ-ÿçl]ðÔ5¨ýŠŽøåµ:m¿7tæ=óµf.m¨fÔhI™RêïºñišuÚÞzî¢'´Ô4µ¢c…zž»Mý¸º%I¦L3¢†–­×Ý«š†z…5GGµ¨)´tð²fZ¦ú⻫Q̰77ÔøÍlï/è?-¦úzz‹[[ÃÄTëWOo`‹BÐÓ [ÖžÞ£GÖJË–¨cT›Z>OLÂjn¥•K—¯.N];´£>´:˜¦Yð#U·…=ïû:z‡±ŠË”©µmûí¿ågzó­%ŠÆj”^²@+ãÍjYo'MÛwS…âqÅVŸ¿z%Ÿ_o¡õ¾õ3]züv×ܪ–ø*-X¸JédÚöúCßÅÕû¡°ÜwƒžÛð}gëZ™fZ+_ý‡ÞÝü@ºÕxµ¶¶éË“NÑ¥¨õÂi-}÷unö5m“ÌÈ8í¾×DÅÕï«}™VŒZGãâ’©mùm4Òò3zÍXŽï¯$ÛgÛ7ž:Æ­£æ¡uDÆêK£êã…)_^åÐ`µä{Oèɚɚº}³Â’¢cwÓÁ;¯ÐSsè‹ÒAºK+»Çj½ujJ·X”Ô{7kÆùsÔ|ø¥ºýõÀwëêÓ6Õû—©›ßMiÑSwèÑÖ“5ûÖëuÕy»ê“Ù×êïc×EGn‘¡CZÿùózk㙺ñ®;uÇ]7ê”QêÊ?Væî#†"©WtËm µË1ßÒÉXöˆ~zÅ-H§Ô»r¹Vö þ‹Õ„Ô×RckBÑN-éšZŠæòþrü|ÆŽ«ž{K•,Œfíý³‹5òÆéºó¿CΔµ‡þßÅÇiû–¨z?yJ¿þѵz¥'&{¸¿œa|þ]ò"•Z»¹ù‚ >ÿ»mΜ9¯K:Cƒgœi‡gÓ²oZÆìÛÖ‡<îgzÎ6¦ c¾ÿÆÐ›Ð€ŠâKè­u.í[•ˆ®yÄLöhåŠ.õ¥Ò’Q<ѨD<"ÃìUÇg=Š·TÜ$Sý+–¨3Ú¢æºR=j_Ù'3\«Ææª º}1<ó/ô®\Fë>úÙÕ»èåûç×hÛS~¥éÉ+uì ÿ*Å}'3Ê;ôVJ«–µ+=bÍ?çæ@·V¬èR_Ê”‰kDS£â…&Þ"ôÎ2¦ c¾ÿÁ+—ÿYPBQ%ZZ‘Z56×:ˆ«i´õx†bmj^½®mR«Ãi@%0=¢_ßðU]xéïtp(¥Uï?¤‹/~]IE¿ýdþªo^ûϹ­SSK]ëA©z`Øö7" ™šÿÈù:äî~¥5øËŸM Õ„ÌÀoÖÊ"‘+Bo`Ø3­kШ¡ìS MMMyôóÆpFè €aÏ0*·s5Êß¡òA{ kÑhT}}}ª­­¥o4òb†zzzFƒ^ Dè €a®¾¾^«V­R{{{ÐKA‹F£ª«£)z9 ôÀ°—H$‚^ª@:z ¡7@X Tnd ¨„Þ€ªAè ¨„Þ€ªAè ¨„Þ€ªAèíÎ zà‚üÒ¡7 jzª¡7 jzªF5†ÞÅjàNcxA!÷ô¨CoÀ0Eè ¨•z›*¼ü>—ó«®Ô@Ù+e†éGæ¨J½ø\¹„Þ¦í9¨×€Jt¾Z9k¹„Þ,ôʈÓo!¼Ž€2ÐÑÑôÀ“D"áu*¹e޽@Õ;vlÐKOººº‚^BÕª¤ÐÛ”dø0'Ûù^Æ@êéé z PlÅÈ0½œ_19)=½U£T¡w!¿ðã7¹\£b~c`Ø+uötÖ›U%VzçúƒÉçi?'Û>ø­9e)òÕ@UROo?˜.ÛÙæz™Å’K^i:<†J¬ôÎ…—›Ö'Ê™f.Á­šBïR}PUý…PVÈ=sTΡw®íGr=^ˆªù([AfœAæ¯)çÐ»Ü•í‡  â‘?æ‰Ð{P¶¦ïPÈ2³ ô^“7»€b ¿ô Èл\{nóÅPnŠ‘[–kF[j¨ô6åÿДóuÝÆÀo¥Î)«"û¬†ÐÛ«|?¬ŠÿT rÎ,ª1ôöúᙢr@õÈ'ó¬ºl´Co'¦å9Ÿ»ê>x'Ÿ\Óš‡‹œ³ÒBï|>”\£‘i>UáJ)[&™k ]ÌŒµ,TZè=¤Ø?d¯_$(–  t+2-Vè]Èo œÎu»žÓ]K ]‡ý|ª»”¿òÊ|sÕLÙmÙTWj¥·~ÿÀ¾…¼Ó£HÐ È”dézùÜÜ’ÊoÊX*• z à§|³Kû9Ã*0¯–Jo/¼=äÎt·/)— ÓzÌK~ZYh)CïRþÀŠÕÛÛÏk€§<²Ø½¼‹©d¯t¥w)Þh1J÷ ¼[1²ÈJÌdstèlåøùÞ%”0@%*$ßÌ–³V\fZI¡w>!w¦ÿàöEpë‰cJJç°^ðCZ™sK+ûx®­›ý,6D¹…Þ…þö —›Y拊p¥Ph™ËM,‹yý’*·ÐÛ‰×X¶ßVx¹6€Jâ5Óô#?Íe^`*!ôöƒ—ßd˜û^þ»‹×¬ÒKv9,²Íj ½í¶Ûñ\Bìl×?å“IÚûyûqÍŠRÌл˜?0û‡–ËkeûÀ½ÞÜŠ)×›VÚÉåX¦×Ë÷Ü\íÚ•VéO›¯ç§µö¹ö±\ÖùÊ”Kºe™^¯UÕmQJzg+§÷2î×k»µ8ñÒ¥¢>dÉžGziWâ6·Øyk¦ñ’æ©åXéí×ÅKÅw¶'™šÂ€€†!ÓäŸçª‡iš2 c­aÛv¶ÜÒ~^¶ éq,Påz{嵿Œ—ßhxùÉÐxZî_&Pñx\]]]ߪ‚išêêêR,[cXÞ[0{ ÀÝö®•i^Ù‹½€<˜’Öú•‡í¸\æØÏµ~ìó­_*Ãò ¶îºëê£>Rgg'Á7€Šg†b±˜FŽé6Å~g*ÊÍtÃK·ëVU?o©2Cï\XCn§ÀÛ-Ïöa¯Ñ~Ò¨š–r3^]]]jii z!PlÙnN™)Çô»µIÅ(—ö&^>??ˆL¿q³þ%Ó ü4”IfªòöÚÚ¤^²Ú²Ó‹]éíTM­=‰×9ÖyNÏ’s•·}Û©½I¶8iIš3gÎ+–ó Û¶Ó³}ÛmŽW^Ï¡- 0Èk0[ȽTY;=ÛÇÜúygjcbÏ´i-^x™Wò›_–" uz /cÙãl³=„Ú9l‡¶­cáÕÛöçLÛN×1¶3­Õ)Hw{ÿ™¶ÎË6–Ï ˜üY³…Ãnáµ=0vÚ¶VeÛ·©,ÛÖg§ë˜ÛrØÎ²g ¿sùùä3æ›jïém•­¿·ýúq¥¡µ?Ä´eÜ´3İŒ™ú"üNé‹à{hÖ‡umö;Sèoß–Ë8¡7*•¡w.¸[e´Ó{VhÏ ­´Sžé\§×r;'Û{ªzåz;ÑöØ>ÇižõYY®ac½žõö<­ÁÐ:m;×sèm­,Ú·ßöªîlw¦Ö)Vn•á¹ÎɆ0~Ë' Í§ê8[îl;Ís+¬•ÖîÉm¯ÌvÚw;Ç­Z[.c™Ö›é½Ú¯ét ·9*§Ð;WNx!ç…Ù™z{[ƒnûw¨]‰u,dy ͇æ¦,ç8Ux[·Þk®íMò­ðΆÐ~ó#@Í5ôÎ%ØÍ§]öÝ‚íLUßCcÒÚy¥u]i‡±B”Mˆ«J½d«·~PÖ1§\ú"ÄúÒØ÷Âï¡ó¬ûCÞÖõdjg’©²ÛiÌÏjo/ׂâ%Œ-F•·Û1·1{p-¹÷Þv »³í;Ýöõz­ü®A…Þ¹Vi»…ØÙ®çõ<ûo]¬µÛK[¶ ßÖÀ{¨Š5Ô¶ßÌ2Sn—mN©ª½€r’OèK›LA·ä\™m»ª¾­Çe›ëô:ö9^Öîv¼óܦ—"ôÎ5àÎåÜ|®mºú€Û«¿­a¸½—·SU÷ÐÃÞÏÛ~ÓJû:¼öîÎ¥Â;—¾Ý¹þ, ÌP,~¬™o¯ßNcna´Sµ·½bÛ­Ÿ·Sn=O.¯á´žLï/“lçf=/·ö&~äNÏr9fMëqkwȶm¯ð¶·þ&ÇúzÖªnëöÐs¦ö&ö¹ö1û¶]1Ão (ù†Ý™æfkâ.Ûç:UmÛ+½3ÞNâöc¹¬Ý- ·Ÿ—«@*ºÝ”[è‰[Pí×5Úš¸ãöP\Z»ÉÐsHƒ7­ Y®ãÖÂÄ„ËaN¶1¯ûnc@5ÈÖª#Û¾—JoëvÚaŽS•÷Ð\·Ü©¿·Ûú¬ûön~ðR_v‚ ½½×Ùæ9ÏVí-‡ý¡më +Ý*½Ó¶s†Öv&Ca·}-öÇÐÜ¡uKΡ¶Ûx¡Á·—c~žxáw[Ž|oë¶Û|§êî¡}·‡[øíTá©Ò[¶m§Ês/UÞNïË×Ï%°¼+½ ©âÎç\§Šn{ølÂCZóC³W|…ÝÖ*o§žÝN}½sy¶ËÖê„Е¢Ø¡·}ÌíÜlí@ÜZˆ¸ÐöÀÛºm¯ðvª·®+Såy. ¨Ë®¼T¡w!A¶Ûuܶísݪ½Ýz{;…ÙöÀÛZémhí>ÞÖV'†el蜡kærÚâÄ ‚lT?‚ÞlÕÝù„ßö–'™Bíl=¿­×pj’m­¹Vy¤;)I@t¥·×0<—Ð<ÛÜ¡ãÖÞNÕÛÒÚ-O¬síçX«ºesªævëéoØi<—1'„à(7…´ØÈ4æ„ç~ç[ñ=´í‚»]ßZ nÜÝäDòs/™ Co7™‚ëB«½s™c¯úv ¾­ÁøP˜>TÙÒ•à’s‹û³õ¸\æeÚÎv,Ûx¾ó€R)4|ÍTÅœ­ÚÙi~¦Jj§`:Så·S¸}ÛKïôžü®ò4ÜvSÊÐ;—jíBÏÏšKkV{[?{‹+û|{@m¯ìškÊ=ì΂[ŸíÛÊ0^è¼lÃPlù†ª™‚ìBçåRáiÜbÛ+¼ÝƲUKkVyûZp—, /‡Jï|ÂðBª½ÝÆ­Av¦ÀÞÞdh̰<–}{ïî|Bî|*¼ö³ç;(5?«½³íÛ· Áí¡´[•·”½ܾ¦LéNãNïÏiÛ«À«¿Ë!ôvSŒÊp§Ü>Ï­¿·õÒš!÷Ð|Ãá‘r˜#—g§1û:½€àBoû˜—àÙ^Ýmïµ<ÓülëÎtç#ðpÛM¡f.7UÌ4×kk¯UÔ!Ûq·>Ü!˳׹Ö×v˶f/ÇöÝÆ¼ˆ@ÅVH°šk[/•ÑÙe¯a÷ÐØÐ¾[k’tsæe[W¦m·ùns3—4 /—Ð;—q/­>r ÀÝÚŽx ³½sz-§íBÞ“};Ó˜—c@%+$ôÎwÛ­ê;[Ë·jn·cöq§ãùݹ†áv¹ŽE%†ÞÖ±|«½íc™Bh/àÙæ:­ÁzžÓ¹^·Ýxmu’Ë5€r–-\õÞºÍɶ¶e ž³Ui{­èvz-/Uè™¶Ýæ»ÍÍw¼(*!ôv:浯u±‚o§*n/ç9­Ã) Ï´~¯ûnc^Žy9-×;Û±l¡x¦Xr£ÝÎóR©í`—2ðÎvÌŽÐ;‡c~V{»ëT±-‡±Lau¶kdz]·÷c¿†ÛœR¶6!@©˜zÛDz…ºö Ú~Ì~ ·Üná¹}<Ó5òmkâv®ÛÜlãÙŽù.¨ð2èjoë¶[ð©w¦jq·€;Óu½®MösËgP rmY’ËX>¡²—>ÛnUÝ™Ž¹Uxç²6ûv.ÇìÊ¢Ê[ªìÐÛ>–kî¥åˆä^áíX¶<ÛX¦m/ûÙÆsT‚|Co§q¯°×À9—Šp{p¯Çr ¿3Ë¥Ê;Ó±azgzí ƒï¡íL¶Ó52UpûUÑO‹/Ç ™ )—Pµv'¹Ç™Î͵"ÜzÜ˵¼¬#Ûí*"ð–¤p/ºZ>m.¡w¦cùVS›YæÛ¿ ¹´dq’iN._oT3?‚ï\ª¼íûùT€§ÆÜÎuêåí%ðÎį@:`;“r¬ôÎçX!ÕÞÙ¶³Ë§Š»Ðõú1æ†Ð•¦ÐÐ;Ÿ±\Cð|ªÁs­÷ºË<·±BMЧ_ÕÞöñbTç2Vèu½î»eÏuŽç…È'<õ³··ÓX¡-N¬Û¹㥠¼óÏv¬¨‚0KQím߀ÚËy¹\Û˾ÛX¦ñ|ç•ÆkèZŒà;߀Û˶Ÿw¶¹nc…+ªr=«=øÎg^!w¶c¹Ì*Y¡½­s ¾ó­¦&ðöY7²âgèm÷#øv{-?Ãoû~!_ Âl`P±«½ •ý»½^'×µU´r½¥ò ¾3+fàí´oG[À¿ƒïBö ¾ó½V®s³r¬$*=ôv;žk¨\hHîgÀí%ü‹TˆBBï ƒðbT”;í;©èü±œ*~Ë)øÎ¶Ÿo/n¿nV™o%¸—s€jSHe²×0ܯ ÜÏ@;Ÿ<ŸŸ‡×sK¢ÜÐb¶9)å~1ÃíBo?ÏÊQ>Ák±‚o§±|ÂîRìg/äXI•K{“!Ũ`ö#€.¤w±ª¹½¼V±ÎÊ™ßÁw¾7ºt+fõv¾çdÏv¬¬”[è-|û5'×µçzCJÚ–ÙåÐú|;g»yd1Âm¯s2g;æåxIU[èéx©‚o/c¹TvûtŠ`¸Ë%œ-Få·_-Qüœ“i¼"•cè-/ø¶ó»·v¾mJŠÝ»›ÀäWðív<ß›Es¬˜UÜe˜—kè-[ñí6^ì1?ªºý¸ ÌPnüZ½^/—ð8¨°;Óx®ó*.ð–*;ôö2§ÐLºûÑžÄiÜíKBà NtIDAT¬©œ‚ïBû}çzí|úˆ{½†×ãe«ÜCÍr¾K1žï9Ù”ûçø¥ðÖÏ›>–z¼ØwÙ†âå\é=ÄÞÖ¹†Êårc0œùî–[^HàíEÙÞRå£~ÝÔѪïLÇò ³ý¼ie>ó‹u  ˜‚p ©’ö3w:æGØ]ñmO*)Ø,Et.UßÅ:æåx®órUIß oÅ aKûy¬ÐÀ»¢[šXUZ¸YªÖ~†ß~÷:§˜ç•®ÐÐÖ`Øï¼Tý¹+"ð–*£§·•ßÐ~‡ß~÷:Çs|!Ÿ`7¨ ܯ6$f{U©A©ßÁq¾AumJŠù™Uê÷(fx›Ëµ‹ÝÅÏžÛUUá=¤Ò*½‡”ºâ;ÓW ü wý ž‹`snÙ©–p´˜Áráw!çä£Z¾@©[¿ozYÌPzØÞRåöôvR̾Ù~å…„ÌÔ@iûyãÉ|æ—˵K¦ÔR´)fp^ÊϤ?@*m€[Ì>Ùž±f!¯Q–ª5ô,UíR…æÕú9•¦T•ÙŬ.÷ëuÊR5‡©¥–ƒjYRÍŸ!„RÎ~ž›ÏùUxKÕ˜QQí×Ï´XŸMµæ€]±Â]¿®ëÇu¼W.h)n^Yìë”êºUcX^µa÷áœ~ëz•òÚ@‚ {ý~mÂî †cZŽý³‡ãçT£r¬6·DØäÍ+ËñudVª¹Ô7µ¬„©_(§›Xú¥ÜÖ”‹r …ƒ¸™eU"uVM}¼”rèï]Õc½)öωϨš ¹³½üB…qaÊáçWkªI9TS—Ã*•Þ€ªA•pqñóà„Jî"¡ÒP5¨D.o|>@y¢R»LQé ^üÕgagÄ^PIEND®B`‚Minder-1.5.1/elementary-theme.patch000066400000000000000000000011031356632107200172220ustar00rootroot00000000000000--- a/src/Application.vala 2019-06-10 15:43:20.733715669 +0000 +++ b/src/Application.vala 2019-06-10 15:43:21.418703307 +0000 @@ -44,6 +44,9 @@ /* Add the application-specific icons */ weak IconTheme default_theme = IconTheme.get_default(); default_theme.add_resource_path( "/com/github/phase1geo/minder" ); + + Gtk.Settings.get_default().set_property("gtk-theme-name", "elementary"); + Gtk.Settings.get_default().set_property("gtk-icon-theme-name", "elementary"); /* Create the main window */ var appwin = new MainWindow( this, settings ); Minder-1.5.1/install_manifest.txt000066400000000000000000000340501356632107200170400ustar00rootroot00000000000000/usr/share/glib-2.0/schemas/com.github.phase1geo.minder.gschema.xml /usr/bin/com.github.phase1geo.minder /usr/share/applications/com.github.phase1geo.minder.desktop /usr/share/metainfo/com.github.phase1geo.minder.appdata.xml /usr/share/icons/hicolor/16x16/apps/minder-task-none-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-task-todo-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-task-done-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-detach-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-manual-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-vertical-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-horizontal-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-left-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-right-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-up-symbolic.svg /usr/share/icons/hicolor/16x16/apps/minder-layout-down-symbolic.svg /usr/share/icons/hicolor/16x16/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/24x24/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/32x32/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/48x48/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/64x64/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/128x128/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/16x16@2/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/24x24@2/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/32x32@2/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/48x48@2/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/64x64@2/apps/com.github.phase1geo.minder.svg /usr/share/icons/hicolor/128x128@2/apps/com.github.phase1geo.minder.svg /usr/share/locale/st/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kk/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/he/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/xh/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ug/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nb/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ln/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ak/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/en_GB/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/oc/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/qu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/co/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ks/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lt/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/id/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/or/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/la/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bs/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/zh_TW/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/cr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/as/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/iu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ar/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/da/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/gd/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/rm/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/yo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/es/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/hz/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sa/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ay/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ss/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ky/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ae/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fa/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/os/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/si/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/be/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mk/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ro/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/av/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/cv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/gv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tw/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ms/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ml/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/yi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sm/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/pa/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/wa/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/en_CA/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ia/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ik/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ng/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ig/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ko/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/is/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/an/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ty/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ie/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ce/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/zu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/dv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sk/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/vo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ti/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/so/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tk/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/de/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sd/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/gl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ii/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/th/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/et/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/oj/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/za/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tt/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/zh_HK/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ny/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/wo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/zh/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/su/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/eu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sc/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sma/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fr_CA/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/pi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/te/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ja/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ff/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/en_AU/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/am/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/rue/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ee/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ku/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/jv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/li/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/pl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ur/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/rn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ab/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/rw/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kw/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/na/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/gn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bh/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/aa/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/km/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/eo/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bm/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/hu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/lb/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ast/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/cs/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/el/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/cu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/hi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/af/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ga/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kj/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/br/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ve/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/pt_BR/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/bg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ts/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/az/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sl/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ha/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/no/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mt/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mn/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/uz/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/mh/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/hy/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/tr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/uk/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ch/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ta/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ho/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/hr/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/it/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/zh_CN/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/nd/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ka/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fj/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sg/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/kv/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/se/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/dz/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ckb/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ne/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/fy/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/cy/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/gu/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/om/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/my/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sw/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sq/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/to/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/io/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/pt/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ba/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ps/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/vi/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ht/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ca/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ru/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/ki/LC_MESSAGES/com.github.phase1geo.minder.mo /usr/share/locale/sn/LC_MESSAGES/com.github.phase1geo.minder.moMinder-1.5.1/meson.build000066400000000000000000000026641356632107200151130ustar00rootroot00000000000000project('com.github.phase1geo.minder', ['vala', 'c'], version : '1.5.0', license: 'GPL-3.0' ) add_project_arguments([ '-DGETTEXT_PACKAGE="@0@"'.format(meson.project_name()) ], language: 'c', ) gnome = import('gnome') i18n = import('i18n') gresource = gnome.compile_resources( 'minder-resources', 'data/' + meson.project_name() + '.gresource.xml', source_dir: 'data', ) conf = configuration_data() conf.set_quoted('GETTEXT_PACKAGE', meson.project_name()) configure_file(output: 'config.h', configuration: conf) config_h_dir = include_directories('.') c_args = [ '-include', 'config.h', ] sources = files() subdir('data') subdir('po') subdir('src') subdir('tests') gtk_dep = dependency('gtk+-3.0') if gtk_dep.version().version_compare('>=3.22.0') add_project_arguments(['--define=GTK322'], language: 'vala') endif # Add the math library cc = meson.get_compiler('c') math_dep = cc.find_library('m', required: false) dependencies = [ dependency('gobject-2.0'), dependency('glib-2.0'), dependency('cairo'), dependency('gee-0.8'), dependency('granite'), dependency('gtk+-3.0'), dependency('libxml-2.0'), dependency('libarchive'), math_dep ] e = executable('com.github.phase1geo.minder', sources, gresource, c_args: c_args, dependencies: dependencies, install : true ) #test('tests', e, args : ['--run-tests']) meson.add_install_script('meson/post_install.py') Minder-1.5.1/meson/000077500000000000000000000000001356632107200140625ustar00rootroot00000000000000Minder-1.5.1/meson/post_install.py000077500000000000000000000011661356632107200171560ustar00rootroot00000000000000#!/usr/bin/env python3 from os import path, environ import subprocess prefix = environ.get('MESON_INSTALL_PREFIX', '/usr/local') schemadir = path.join(environ['MESON_INSTALL_PREFIX'], 'share', 'glib-2.0', 'schemas') datadir = path.join(prefix, 'share') if not environ.get('DESTDIR'): print('Compiling gsettings schemas…') subprocess.call(['glib-compile-schemas', schemadir]) print('Updating icon cache…') subprocess.call(['gtk-update-icon-cache', '-qtf', path.join(datadir, 'icons', 'hicolor')]) print('Compiling mime types…') subprocess.call(['update-mime-database', path.join(datadir, 'mime')]) Minder-1.5.1/po/000077500000000000000000000000001356632107200133575ustar00rootroot00000000000000Minder-1.5.1/po/LINGUAS000066400000000000000000000000221356632107200143760ustar00rootroot00000000000000cs es fr pl pt_BR Minder-1.5.1/po/POTFILES000066400000000000000000000030251356632107200145270ustar00rootroot00000000000000src/NodeMenu.vala src/EmptyMenu.vala src/ConnectionMenu.vala src/DrawArea.vala src/ImageEditor.vala src/layouts/LayoutManual.vala src/layouts/LayoutRight.vala src/layouts/LayoutLeft.vala src/layouts/LayoutHorizontal.vala src/layouts/LayoutDown.vala src/layouts/LayoutUp.vala src/layouts/LayoutVertical.vala src/MainWindow.vala src/MapInspector.vala src/Node.vala src/NodeImage.vala src/NodeInspector.vala src/StyleInspector.vala src/EmptyInspector.vala src/styles/LinkTypeCurved.vala src/styles/LinkTypeSquared.vala src/styles/LinkTypeStraight.vala src/styles/NodeBorderBracket.vala src/styles/NodeBorderNone.vala src/styles/NodeBorderPill.vala src/styles/NodeBorderRounded.vala src/styles/NodeBorderSquared.vala src/styles/NodeBorderUnderlined.vala src/themes/ThemeSolarizedLight.vala src/themes/ThemeDefault.vala src/themes/ThemeDark.vala src/themes/ThemeSolarizedDark.vala src/undo_actions/UndoNodePaste.vala src/undo_actions/UndoNodeMove.vala src/undo_actions/UndoNodeNote.vala src/undo_actions/UndoNodeReveal.vala src/undo_actions/UndoNodeDelete.vala src/undo_actions/UndoNodeCut.vala src/undo_actions/UndoNodeResize.vala src/undo_actions/UndoNodeInsert.vala src/undo_actions/UndoNodeTask.vala src/undo_actions/UndoNodeAttach.vala src/undo_actions/UndoNodeAttach.vala src/undo_actions/UndoNodeLinkColor.vala src/undo_actions/UndoNodeLayout.vala src/undo_actions/UndoNodeFold.vala src/undo_actions/UndoNodeBalance.vala src/undo_actions/UndoNodeImage.vala src/undo_actions/UndoNodeDetach.vala src/undo_actions/UndoNodeName.vala src/UndoBuffer.vala Minder-1.5.1/po/com.github.phase1geo.minder.pot000066400000000000000000000562451356632107200213060ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\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" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 msgid "Add Node Link" msgstr "" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "" #: src/NodeMenu.vala:105 msgid "Add Parent Node" msgstr "" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 msgid "Select" msgstr "" #: src/NodeMenu.vala:124 msgid "Root Node" msgstr "" #: src/NodeMenu.vala:128 msgid "Next Sibling Node" msgstr "" #: src/NodeMenu.vala:132 msgid "Previous Sibling Node" msgstr "" #: src/NodeMenu.vala:136 msgid "Child Node" msgstr "" #: src/NodeMenu.vala:140 msgid "Parent Node" msgstr "" #: src/NodeMenu.vala:144 msgid "Linked Node" msgstr "" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "" #: src/NodeMenu.vala:156 msgid "Sort Children" msgstr "" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "" #: src/NodeMenu.vala:294 msgid "Remove Node Link" msgstr "" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "" #: src/ConnectionMenu.vala:55 msgid "Start Node" msgstr "" #: src/ConnectionMenu.vala:59 msgid "End Node" msgstr "" #: src/ConnectionMenu.vala:63 msgid "Next Connection" msgstr "" #: src/ConnectionMenu.vala:67 msgid "Previous Connection" msgstr "" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "" #: src/DrawArea.vala:1584 msgid "connection endpoint change" msgstr "" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 msgid "New File" msgstr "" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 msgid "Save File As" msgstr "" #: src/MainWindow.vala:170 msgid "Undo" msgstr "" #: src/MainWindow.vala:177 msgid "Redo" msgstr "" #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "" #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "" #: src/MainWindow.vala:408 msgid "Search" msgstr "" #: src/MainWindow.vala:418 msgid "Search Nodes and Connections" msgstr "" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "" #: src/MainWindow.vala:463 msgid "Nodes" msgstr "" #: src/MainWindow.vala:464 msgid "Connections" msgstr "" #: src/MainWindow.vala:465 msgid "Titles" msgstr "" #: src/MainWindow.vala:466 msgid "Notes" msgstr "" #: src/MainWindow.vala:467 msgid "Folded" msgstr "" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "" #: src/MainWindow.vala:567 msgid "Export…" msgstr "" #: src/MainWindow.vala:571 msgid "Print" msgstr "" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "" #: src/MainWindow.vala:667 msgid "Style" msgstr "" #: src/MainWindow.vala:668 msgid "Map" msgstr "" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "" #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "" #: src/MainWindow.vala:785 msgid "Open" msgstr "" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "" #: src/MainWindow.vala:887 msgid "Save File" msgstr "" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 msgid "Enable animations" msgstr "" #: src/MapInspector.vala:105 msgid "Hide connections" msgstr "" #: src/MapInspector.vala:138 msgid "Node Layouts" msgstr "" #: src/MapInspector.vala:189 msgid "Themes" msgstr "" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 msgid "Node Title" msgstr "" #: src/Node.vala:1467 msgid "Node Note" msgstr "" #: src/NodeInspector.vala:92 msgid "Title" msgstr "" #: src/NodeInspector.vala:119 msgid "Task" msgstr "" #: src/NodeInspector.vala:138 msgid "Fold" msgstr "" #: src/NodeInspector.vala:160 msgid "Link Color" msgstr "" #: src/NodeInspector.vala:182 msgid "Note" msgstr "" #: src/NodeInspector.vala:210 msgid "Image" msgstr "" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "" #: src/StyleInspector.vala:47 msgid "All" msgstr "" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "" #: src/StyleInspector.vala:163 msgid "Changes affect:" msgstr "" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "" #: src/StyleInspector.vala:730 msgid "Connection Options" msgstr "" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "" #: src/EmptyInspector.vala:30 msgid "" "Select a node or connection\n" "to view/edit information" msgstr "" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "" #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 msgid "File" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 msgid "Close File" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 msgid "Undo/Redo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 msgid "Undo Last Change" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 msgid "Zooming" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 msgid "Zoom To Actual Size" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 msgid "Toggle Focus Mode" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 msgid "Search Nodes/Connections" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 msgid "Node Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 msgid "New Sibling Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 msgid "New Child Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 msgid "Clipboard" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 msgid "Copy Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 msgid "Cut Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 msgid "Changing Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 msgid "Edit Title" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 msgid "View Properties" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 msgid "Toggle Node Link" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 msgid "Create Connection" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 msgid "Center In View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 msgid "Sort Child Nodes Alphabetically" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 msgid "Select Root" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 msgid "Select Parent" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 msgid "Select Next Sibling" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 msgid "Select Previous Sibling" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 msgid "Select Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 msgid "Select Node Below" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 msgid "Select Node Above" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 msgid "Select Node To Right" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 msgid "Select Node To Left" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 msgid "Select Linked Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 msgid "Select Attached Connection" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 msgid "Connection Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 msgid "Change Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 msgid "Show Properties" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 msgid "Select Start Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 msgid "Select End Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 msgid "Select Next Connection" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 msgid "Select Previous Connection" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 msgid "Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 msgid "Previous Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 msgid "Next Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 msgid "Previous Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 msgid "Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 msgid "Paste Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 msgid "Selection" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 msgid "Add Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 msgid "Add Previous Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 msgid "Add Next Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 msgid "Add Previous Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" Minder-1.5.1/po/cs.po000066400000000000000000000646201356632107200143340ustar00rootroot00000000000000# Czech translations for com.github.phase1geo.minder package. # Copyright (C) 2019 THE com.github.phase1geo.minder'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # Jan Marek , 2019. # msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\n" "PO-Revision-Date: 2019-03-24 15:24+0100\n" "Last-Translator: Jan Marek \n" "Language-Team: none\n" "Language: cs\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==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "Kopírovat" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "Vyjmout" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "Vložit" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "Smazat" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "Upravit…" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "PÅ™idat úkol" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "PÅ™idat poznámku" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 #, fuzzy msgid "Add Node Link" msgstr "PÅ™idat poznámku" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "Sbalit potomky" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "Odpojit" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "PÅ™idat koÅ™enový uzel" #: src/NodeMenu.vala:105 #, fuzzy msgid "Add Parent Node" msgstr "Hledat uzly" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "PÅ™idat uzel potomka" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "PÅ™idat uzel sourozence" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 #, fuzzy msgid "Select" msgstr "Vybrat uzel" #: src/NodeMenu.vala:124 #, fuzzy msgid "Root Node" msgstr "PÅ™idat koÅ™enový uzel" #: src/NodeMenu.vala:128 #, fuzzy msgid "Next Sibling Node" msgstr "Další sourozenec" #: src/NodeMenu.vala:132 #, fuzzy msgid "Previous Sibling Node" msgstr "PÅ™edchozí sourozenec" #: src/NodeMenu.vala:136 #, fuzzy msgid "Child Node" msgstr "PÅ™idat uzel potomka" #: src/NodeMenu.vala:140 #, fuzzy msgid "Parent Node" msgstr "Hledat uzly" #: src/NodeMenu.vala:144 #, fuzzy msgid "Linked Node" msgstr "PÅ™idat poznámku" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "VystÅ™edit aktuální uzel" #: src/NodeMenu.vala:156 #, fuzzy msgid "Sort Children" msgstr "Sbalit potomky" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "Odstranit úkol" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "Odstranit poznámku" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "" #: src/NodeMenu.vala:294 #, fuzzy msgid "Remove Node Link" msgstr "Odstranit poznámku" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "Rozbalit potomky" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "Vybrat uzel" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "KoÅ™en" #: src/ConnectionMenu.vala:55 #, fuzzy msgid "Start Node" msgstr "Hledat uzly" #: src/ConnectionMenu.vala:59 #, fuzzy msgid "End Node" msgstr "PÅ™idat poznámku" #: src/ConnectionMenu.vala:63 #, fuzzy msgid "Next Connection" msgstr "Hledat uzly" #: src/ConnectionMenu.vala:67 #, fuzzy msgid "Previous Connection" msgstr "PÅ™edchozí sourozenec" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "%0.3g%% hotovo" #: src/DrawArea.vala:1584 #, fuzzy msgid "connection endpoint change" msgstr "zmÄ›na poznámky uzlu" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "Další nápad" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "ZruÅ¡it" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "RuÄní" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "Do prava" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "Do leva" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "Horizontální" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "Dolů" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "Vzhůru" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "Vertikální" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "Minder" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 #, fuzzy msgid "New File" msgstr "Otevřít soubor" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "Otevřít soubor" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 #, fuzzy msgid "Save File As" msgstr "Uložit soubor jako" #: src/MainWindow.vala:170 #, fuzzy msgid "Undo" msgstr "ZpÄ›t" #: src/MainWindow.vala:177 #, fuzzy msgid "Redo" msgstr "Znovu" #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "Nepojmenovaný dokument" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "PÅ™iblížení" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "Procentuální pÅ™iblížení" #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "PÅ™iblížit" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "Oddálit" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "VmÄ›stnat do okna" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "VmÄ›stnat do okna vybraný uzel" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "PÅ™iblížení dle skuteÄných rozmÄ›rů" #: src/MainWindow.vala:408 msgid "Search" msgstr "Hledat" #: src/MainWindow.vala:418 #, fuzzy msgid "Search Nodes and Connections" msgstr "Hledat uzly" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "Kritéria hledání" #: src/MainWindow.vala:463 msgid "Nodes" msgstr "" #: src/MainWindow.vala:464 msgid "Connections" msgstr "" #: src/MainWindow.vala:465 msgid "Titles" msgstr "Názvy" #: src/MainWindow.vala:466 msgid "Notes" msgstr "Poznámky" #: src/MainWindow.vala:467 msgid "Folded" msgstr "Sbalené" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "Rozbalené" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "Úkoly" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "Nejsou úkoly" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "Export" #: src/MainWindow.vala:567 msgid "Export…" msgstr "Export…" #: src/MainWindow.vala:571 msgid "Print" msgstr "Vytisknout" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "Parametry" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "" #: src/MainWindow.vala:667 msgid "Style" msgstr "" #: src/MainWindow.vala:668 msgid "Map" msgstr "" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "Uložit aktuální nepojmenovaný dokument?" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "Pokud soubor neuložíte, provedené zmÄ›ny se navždy ztratí." #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "Zahodit zmÄ›ny" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "Uložit" #: src/MainWindow.vala:785 msgid "Open" msgstr "Otevřít" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "" #: src/MainWindow.vala:887 msgid "Save File" msgstr "Uložit soubor" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "OPML" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "PDF" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 #, fuzzy msgid "Enable animations" msgstr "Povolit animace" #: src/MapInspector.vala:105 #, fuzzy msgid "Hide connections" msgstr "Hledat uzly" #: src/MapInspector.vala:138 #, fuzzy msgid "Node Layouts" msgstr "Rozvržení uzlů" #: src/MapInspector.vala:189 #, fuzzy msgid "Themes" msgstr "Témata" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "Vyvážit uzly" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 #, fuzzy msgid "Node Title" msgstr "Názvy" #: src/Node.vala:1467 #, fuzzy msgid "Node Note" msgstr "PÅ™idat poznámku" #: src/NodeInspector.vala:92 #, fuzzy msgid "Title" msgstr "Názvy" #: src/NodeInspector.vala:119 #, fuzzy msgid "Task" msgstr "Úkoly" #: src/NodeInspector.vala:138 #, fuzzy msgid "Fold" msgstr "Sbalené" #: src/NodeInspector.vala:160 #, fuzzy msgid "Link Color" msgstr "Barva odkazu" #: src/NodeInspector.vala:182 #, fuzzy msgid "Note" msgstr "Poznámky" #: src/NodeInspector.vala:210 msgid "Image" msgstr "" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "Kopírovat uzel do schránky" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "Vyjmout uzel do schránky" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "Odpojit uzel" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "Smazat uzel" #: src/StyleInspector.vala:47 msgid "All" msgstr "" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "" #: src/StyleInspector.vala:163 msgid "Changes affect:" msgstr "" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "" #: src/StyleInspector.vala:730 #, fuzzy msgid "Connection Options" msgstr "Hledat uzly" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "" #: src/EmptyInspector.vala:30 #, fuzzy msgid "" "Select a node or connection\n" "to view/edit information" msgstr "Vyberte uzel pro zobrazení/úpravy informací" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "vložit uzel" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "pÅ™esunout uzel" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "zmÄ›na poznámky uzlu" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "smazat uzel" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "vyjmout uzel" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "vložit uzel" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "zmÄ›na úkolu uzlu" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "pÅ™ipojit uzel" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "zmÄ›na sbalení uzlu" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "vyvážit uzly" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "odpojit uzel" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "pÅ™ejmenovat uzel" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "ZpÄ›t" #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "Znovu" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 #, fuzzy msgid "File" msgstr "Otevřít soubor" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 #, fuzzy msgid "Close File" msgstr "Otevřít soubor" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 #, fuzzy msgid "Undo/Redo" msgstr "ZpÄ›t" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 #, fuzzy msgid "Undo Last Change" msgstr "zmÄ›na úkolu uzlu" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 #, fuzzy msgid "Zooming" msgstr "PÅ™iblížení" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 #, fuzzy msgid "Zoom To Actual Size" msgstr "PÅ™iblížení dle skuteÄných rozmÄ›rů" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 msgid "Toggle Focus Mode" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 #, fuzzy msgid "Search Nodes/Connections" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 msgid "Node Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 #, fuzzy msgid "New Sibling Node" msgstr "Další sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 #, fuzzy msgid "New Child Node" msgstr "PÅ™idat uzel potomka" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 #, fuzzy msgid "Clipboard" msgstr "Vyjmout uzel do schránky" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 #, fuzzy msgid "Copy Node" msgstr "PÅ™idat koÅ™enový uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 #, fuzzy msgid "Cut Node" msgstr "PÅ™idat koÅ™enový uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 msgid "Changing Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 #, fuzzy msgid "Edit Title" msgstr "Názvy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 #, fuzzy msgid "View Properties" msgstr "Parametry" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 #, fuzzy msgid "Toggle Node Link" msgstr "Odstranit poznámku" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 #, fuzzy msgid "Create Connection" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 #, fuzzy msgid "Center In View" msgstr "VystÅ™edit aktuální uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 msgid "Sort Child Nodes Alphabetically" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 #, fuzzy msgid "Select Root" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 #, fuzzy msgid "Select Parent" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 #, fuzzy msgid "Select Next Sibling" msgstr "Další sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 #, fuzzy msgid "Select Previous Sibling" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 #, fuzzy msgid "Select Child" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 #, fuzzy msgid "Select Node Below" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 #, fuzzy msgid "Select Node Above" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 #, fuzzy msgid "Select Node To Right" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 #, fuzzy msgid "Select Node To Left" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 #, fuzzy msgid "Select Linked Node" msgstr "PÅ™idat poznámku" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 #, fuzzy msgid "Select Attached Connection" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 #, fuzzy msgid "Connection Commands" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 #, fuzzy msgid "Change Current" msgstr "VystÅ™edit aktuální uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 #, fuzzy msgid "Show Properties" msgstr "Parametry" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 #, fuzzy msgid "Select Start Node" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 #, fuzzy msgid "Select End Node" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 #, fuzzy msgid "Select Next Connection" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 #, fuzzy msgid "Select Previous Connection" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 #, fuzzy msgid "Previous Character" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 #, fuzzy msgid "Previous Word" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 #, fuzzy msgid "Next Line" msgstr "Další sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 #, fuzzy msgid "Previous Line" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 #, fuzzy msgid "Start Of Text" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 #, fuzzy msgid "Paste Text" msgstr "Vložit" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 #, fuzzy msgid "Selection" msgstr "Vybrat uzel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 #, fuzzy msgid "Add Next Word" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 #, fuzzy msgid "Add Previous Word" msgstr "Hledat uzly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 #, fuzzy msgid "Add Next Line" msgstr "PÅ™idat poznámku" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 #, fuzzy msgid "Add Previous Line" msgstr "PÅ™edchozí sourozenec" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" #, fuzzy #~ msgid "Unnamed" #~ msgstr "Nepojmenovaný dokument" #, fuzzy #~ msgid "Child" #~ msgstr "První potomek" #~ msgid "Parent" #~ msgstr "RodiÄ" Minder-1.5.1/po/es.po000066400000000000000000000665621356632107200143450ustar00rootroot00000000000000# Spanish translations for com.github.phase1geo.minder package. # Copyright (C) 2019 THE com.github.phase1geo.minder'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # Adolfo Jayme Barrientos , 2019. # msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\n" "PO-Revision-Date: 2019-03-24 15:24+0100\n" "Last-Translator: Adolfo Jayme Barrientos \n" "Language-Team: none\n" "Language: es\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" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "Copiar" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "Cortar" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "Pegar" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "Eliminar" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "Editar…" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "Añadir una tarea" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "Añadir una nota" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "Añadir una imagen" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 #, fuzzy msgid "Add Node Link" msgstr "Añadir una nota" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "Plegar hijos" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "Desprender" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "Añadir un nodo raíz" #: src/NodeMenu.vala:105 #, fuzzy msgid "Add Parent Node" msgstr "Buscar en los nodos" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "Añadir un nodo secundario" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "Añadir un nodo del mismo nivel" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 #, fuzzy msgid "Select" msgstr "Seleccionar un nodo" #: src/NodeMenu.vala:124 #, fuzzy msgid "Root Node" msgstr "Añadir un nodo raíz" #: src/NodeMenu.vala:128 #, fuzzy msgid "Next Sibling Node" msgstr "Siguiente del mismo nivel" #: src/NodeMenu.vala:132 #, fuzzy msgid "Previous Sibling Node" msgstr "Anterior del mismo nivel" #: src/NodeMenu.vala:136 #, fuzzy msgid "Child Node" msgstr "Añadir un nodo secundario" #: src/NodeMenu.vala:140 #, fuzzy msgid "Parent Node" msgstr "Buscar en los nodos" #: src/NodeMenu.vala:144 #, fuzzy msgid "Linked Node" msgstr "Nodo" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "Centrar el nodo actual" #: src/NodeMenu.vala:156 #, fuzzy msgid "Sort Children" msgstr "Plegar hijos" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "Quitar la tarea" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "Quitar la nota" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "Quitar la imagen" #: src/NodeMenu.vala:294 #, fuzzy msgid "Remove Node Link" msgstr "Quitar la nota" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "Desplegar secundarios" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "Seleccionar un nodo" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "Raíz" #: src/ConnectionMenu.vala:55 #, fuzzy msgid "Start Node" msgstr "Buscar en los nodos" #: src/ConnectionMenu.vala:59 #, fuzzy msgid "End Node" msgstr "Nodo" #: src/ConnectionMenu.vala:63 #, fuzzy msgid "Next Connection" msgstr "Buscar en los nodos" #: src/ConnectionMenu.vala:67 #, fuzzy msgid "Previous Connection" msgstr "Anterior del mismo nivel" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "Predeterminado" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "Idea principal" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "%0.3g %% completo" #: src/DrawArea.vala:1584 #, fuzzy msgid "connection endpoint change" msgstr "cambio de nota de nodo" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "Otra idea" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "plegar las tareas completadas" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "desplegar todas las tareas" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "Ãrea de recorte: %d,%d %3d×%3d" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "Puntero: %3d,%3d" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "Cancelar" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "Aplicar" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "Cambiar la imagen" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "Manual" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "A la derecha" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "A la izquierda" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "Horizontal" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "Hacia abajo" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "Hacia arriba" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "Vertical" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "Minder" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 #, fuzzy msgid "New File" msgstr "Archivo nuevo" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "Abrir un archivo" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 #, fuzzy msgid "Save File As" msgstr "Guardar el archivo como" #: src/MainWindow.vala:170 #, fuzzy msgid "Undo" msgstr "Deshacer " #: src/MainWindow.vala:177 #, fuzzy msgid "Redo" msgstr "Rehacer " #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "Documento sin nombre" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "Escala" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "Escala a porcentaje" #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "Ampliar" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "Reducir" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "Mejor ajuste" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "Ajustar escala al nodo seleccionado" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "Escala real" #: src/MainWindow.vala:408 msgid "Search" msgstr "Buscar" #: src/MainWindow.vala:418 #, fuzzy msgid "Search Nodes and Connections" msgstr "Buscar en los nodos" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "Criterios de búsqueda" #: src/MainWindow.vala:463 #, fuzzy msgid "Nodes" msgstr "Nodo" #: src/MainWindow.vala:464 msgid "Connections" msgstr "" #: src/MainWindow.vala:465 msgid "Titles" msgstr "Títulos" #: src/MainWindow.vala:466 msgid "Notes" msgstr "Notas" #: src/MainWindow.vala:467 msgid "Folded" msgstr "Plegados" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "Desplegados" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "Tareas" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "No tareas" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "Exportar" #: src/MainWindow.vala:567 msgid "Export…" msgstr "Exportar…" #: src/MainWindow.vala:571 msgid "Print" msgstr "Imprimir" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "Propiedades" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "" #: src/MainWindow.vala:667 msgid "Style" msgstr "" #: src/MainWindow.vala:668 msgid "Map" msgstr "Mapa" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "¿Quiere guardar el documento sin nombre actual?" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "Los cambios se perderán permanentemente si no los guarda." #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "Descartar los cambios" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "Guardar" #: src/MainWindow.vala:785 msgid "Open" msgstr "Abrir" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "Texto sin formato" #: src/MainWindow.vala:887 msgid "Save File" msgstr "Guardar el archivo" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "Exportar como" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "BMP" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "CSV" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "JPEG" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "Markdown" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "OPML" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "PDF" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "PNG (transparente)" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "PNG (opaco)" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "SVG" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 #, fuzzy msgid "Enable animations" msgstr "Activar las animaciones" #: src/MapInspector.vala:105 #, fuzzy msgid "Hide connections" msgstr "Buscar en los nodos" #: src/MapInspector.vala:138 #, fuzzy msgid "Node Layouts" msgstr "Disposiciones de los nodos" #: src/MapInspector.vala:189 msgid "Themes" msgstr "Temas" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "Balancear los nodos" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "Plegar las tareas completadas" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "Desplegar todos los nodos" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 #, fuzzy msgid "Node Title" msgstr "Títulos" #: src/Node.vala:1467 #, fuzzy msgid "Node Note" msgstr "Añadir una nota" #: src/NodeInspector.vala:92 #, fuzzy msgid "Title" msgstr "Títulos" #: src/NodeInspector.vala:119 #, fuzzy msgid "Task" msgstr "Tareas" #: src/NodeInspector.vala:138 #, fuzzy msgid "Fold" msgstr "Plegados" #: src/NodeInspector.vala:160 #, fuzzy msgid "Link Color" msgstr "Color del enlace" #: src/NodeInspector.vala:182 #, fuzzy msgid "Note" msgstr "Notas" #: src/NodeInspector.vala:210 #, fuzzy msgid "Image" msgstr "Añadir una imagen" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "Añadir una imagen…" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "Editar la imagen" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "Copiar el nodo en el portapapeles" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "Cortar el nodo en el portapapeles" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "Desprender el nodo" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "Eliminar el nodo" #: src/StyleInspector.vala:47 msgid "All" msgstr "" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "" #: src/StyleInspector.vala:163 #, fuzzy msgid "Changes affect:" msgstr "Cambiar la imagen" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "" #: src/StyleInspector.vala:730 #, fuzzy msgid "Connection Options" msgstr "Buscar en los nodos" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "" #: src/EmptyInspector.vala:30 #, fuzzy msgid "" "Select a node or connection\n" "to view/edit information" msgstr "Seleccione un nodo para ver o editar su información" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "Solarized claro" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "Oscuro" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "Solarized oscuro" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "pegado de nodo" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "desplazamiento de nodo" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "cambio de nota de nodo" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "revelación de nodo" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "eliminación de nodo" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "corte de nodo" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "redimensionamiento de nodo" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "inserción de nodo" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "cambio de tarea de nodo" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "acoplamiento de un nodo" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "cambio de color de enlace" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "cambio de disposición" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "cambio de plegamiento de nodo" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "balance de nodos" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "cambio de imagen de nodo" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "desprendimiento de nodo" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "cambio de nombre de nodo" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "Deshacer " #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "Rehacer " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 #, fuzzy msgid "File" msgstr "Archivo nuevo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 #, fuzzy msgid "Close File" msgstr "Archivo nuevo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 #, fuzzy msgid "Undo/Redo" msgstr "Deshacer " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 #, fuzzy msgid "Undo Last Change" msgstr "cambio de tarea de nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 #, fuzzy msgid "Zooming" msgstr "Escala" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 #, fuzzy msgid "Zoom To Actual Size" msgstr "Escala real" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 msgid "Toggle Focus Mode" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 #, fuzzy msgid "Search Nodes/Connections" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 msgid "Node Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 #, fuzzy msgid "New Sibling Node" msgstr "Siguiente del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 #, fuzzy msgid "New Child Node" msgstr "Añadir un nodo secundario" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 #, fuzzy msgid "Clipboard" msgstr "Cortar el nodo en el portapapeles" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 #, fuzzy msgid "Copy Node" msgstr "Añadir un nodo raíz" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 #, fuzzy msgid "Cut Node" msgstr "Añadir un nodo raíz" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 msgid "Changing Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 #, fuzzy msgid "Edit Title" msgstr "Títulos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 #, fuzzy msgid "View Properties" msgstr "Propiedades" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 #, fuzzy msgid "Toggle Node Link" msgstr "Quitar la nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 #, fuzzy msgid "Create Connection" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 #, fuzzy msgid "Center In View" msgstr "Centrar el nodo actual" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 msgid "Sort Child Nodes Alphabetically" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 #, fuzzy msgid "Select Root" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 #, fuzzy msgid "Select Parent" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 #, fuzzy msgid "Select Next Sibling" msgstr "Siguiente del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 #, fuzzy msgid "Select Previous Sibling" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 #, fuzzy msgid "Select Child" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 #, fuzzy msgid "Select Node Below" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 #, fuzzy msgid "Select Node Above" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 #, fuzzy msgid "Select Node To Right" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 #, fuzzy msgid "Select Node To Left" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 #, fuzzy msgid "Select Linked Node" msgstr "Nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 #, fuzzy msgid "Select Attached Connection" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 #, fuzzy msgid "Connection Commands" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 #, fuzzy msgid "Change Current" msgstr "Centrar el nodo actual" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 #, fuzzy msgid "Show Properties" msgstr "Propiedades" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 #, fuzzy msgid "Select Start Node" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 #, fuzzy msgid "Select End Node" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 #, fuzzy msgid "Select Next Connection" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 #, fuzzy msgid "Select Previous Connection" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 #, fuzzy msgid "Previous Character" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 #, fuzzy msgid "Previous Word" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 #, fuzzy msgid "Next Line" msgstr "Siguiente del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 #, fuzzy msgid "Previous Line" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 #, fuzzy msgid "Start Of Text" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 #, fuzzy msgid "Paste Text" msgstr "Pegar" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 #, fuzzy msgid "Selection" msgstr "Seleccionar un nodo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 #, fuzzy msgid "Add Next Word" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 #, fuzzy msgid "Add Previous Word" msgstr "Buscar en los nodos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 #, fuzzy msgid "Add Next Line" msgstr "Añadir una nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 #, fuzzy msgid "Add Previous Line" msgstr "Anterior del mismo nivel" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" #, fuzzy #~ msgid "Unnamed" #~ msgstr "Documento sin nombre" #, fuzzy #~ msgid "Child" #~ msgstr "Primer secundario" #~ msgid "Parent" #~ msgstr "Primario" #~ msgid "Title:" #~ msgstr "Título:" #~ msgid "Note:" #~ msgstr "Nota:" Minder-1.5.1/po/extra/000077500000000000000000000000001356632107200145025ustar00rootroot00000000000000Minder-1.5.1/po/extra/LINGUAS000066400000000000000000000000221356632107200155210ustar00rootroot00000000000000cs es fr pl pt_BR Minder-1.5.1/po/extra/POTFILES000066400000000000000000000001331356632107200156470ustar00rootroot00000000000000data/com.github.phase1geo.minder.appdata.xml.in data/com.github.phase1geo.minder.desktop.inMinder-1.5.1/po/extra/cs.po000066400000000000000000000402711356632107200154530ustar00rootroot00000000000000# Czech translations for extra package. # Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Automatically generated, 2019. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\n" "PO-Revision-Date: 2019-03-24 15:37+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: cs\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==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:18 msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "" Minder-1.5.1/po/extra/es.po000066400000000000000000000402401356632107200154510ustar00rootroot00000000000000# Spanish translations for extra package. # Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Automatically generated, 2019. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\n" "PO-Revision-Date: 2019-03-24 15:37+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: es\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" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:18 msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "" Minder-1.5.1/po/extra/extra.pot000066400000000000000000000402011356632107200163460ustar00rootroot00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\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" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:18 msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "" Minder-1.5.1/po/extra/fr.po000066400000000000000000000624111356632107200154550ustar00rootroot00000000000000# French translations for extra package. # Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # NathanBnm, 2019. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\n" "PO-Revision-Date: 2019-03-24 15:37+0100\n" "Last-Translator: NathanBnm\n" "Language-Team: none\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" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "Minder" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "Créez, développez et visualisez vos idées" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "Utilisez le pouvoir des cartes mentales pour donner vie à vos idées." #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" "Créez rapidement des cartes mentales visuelles en utilisant le clavier et la " "mise en forme automatique." #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "Choisissez parmi différents choix de disposition d'arbre" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "Ajoutez des notes, des tâches et des images à vos nÅ“uds." #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" "Ajoutez des connexions nÅ“ud-vers-nÅ“ud avec en option du texte et des notes." #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" "Stylisez les nÅ“uds, liens et connexions pour ajouter plus de sens et " "améliorer la lisibilité." #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" "Recherche rapide de notes et titres de nÅ“uds et connexions, incluant des " "options de filtrage." #: data/com.github.phase1geo.minder.appdata.xml.in:18 #, fuzzy msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" "Zoomez pour vous concentrer sur certaines idées ou dézoomez pour visualiser " "une image plus grande." #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "Possibilité infinie d'annuler/rétablir des modifications." #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "Sauvegarde automatique en arrière-plan." #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "Branches de nÅ“uds colorées." #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "Magnifiques thèmes et animations." #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 #, fuzzy msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" "Exportez aux formats PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Mardown, Texte " "brut et Mermaid." #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "Support des imprimantes." #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "Barre latérale des propriétés des nÅ“uds et connexions" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "Barre latérale des propriétés de style" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "Barre latérale des propriétés de la carte" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "Trevor Williams" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "Nouveau" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "Ajout de la prise en charge du mode concentration." #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "Ajout de la prise en charge de documents multiples avec onglets." #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" "Ajout de la prise en charge du redimensionnement de la barre latérale de l'inspecteur." #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" "Ajout de la prise en charge pour la création d'un nouveau nÅ“ud directement à partir de l'édition d'un nÅ“ud existant " "en appuyant sur Entrée ou Tab." #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" "Ajout de la prise en charge pour ajouter un nouveau nÅ“ud parent à un nÅ“ud existant." #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "Ajout de la prise en charge de l'importation/exportation aux formats FreeMind et Freeplane." #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "Ajout de la prise en charge du tri des enfants alphabétiquement ou aléatoirement." #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" "Ajout de la prise en charge pour la création d'un lien d'un nÅ“ud à un autre dans la même " "carte." #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "Ajout de la prise en charge pour Flatpak." #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "Modifications" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "Suppression des balises des chaînes de caractères traduites." #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "Indications standard pour afficher les informations des raccourcis clavier." #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "Modification de la façon dont les titres de nÅ“ud/connexion sont affichés dans l'inspecteur." #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" "Modification du script du terminal de l'application pour autoriser les arguments en ligne de commande a être passés en " "sous-commandes de débogage." #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "Modification des couleurs de la barre d'en-tête et des widgets pour correspondre à la couleur symbolique de Minder." #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" "Modification de l'icône de recherche dans la barre d'en-tête en icône symbolique pour améliorer la lisibilité." #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" "Lorsque l'indicateur des notes est affiché, le marquage du texte est restitué pour une meilleure lisibilité." #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" "Amélioration du script de l'application pour autoriser les arguments en ligne de commande à être passés en " "sous-commandes de débogage." #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "Corrections de bugs" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" "Correction d'un problème avec le calcul des point de fin de connexion lorsqu'un bout du " "nÅ“ud n'est pas visible." #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "Correction des problèmes de nommage du fichier lors de l'importation d'un fichier." #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" "Correction d'un problème lors de l'affichage des nÅ“uds redimensionnés à l'ouverture ou au démarrage de l'application." #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "Correction des problèmes avec les fonctions d'export." #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "Restons connectés !" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" "Ajout de la prise en charge de la création d'une connexion visuelle entre " "deux nÅ“uds quelconques." #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" "Ajout de la possibilité d'afficher/masquer toutes les connexions dans la " "carte." #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" "Ajout de la prise en charge de la mémorisation du dernier enfant sélectionné " "d'un nÅ“ud lors de la navigation sur la carte à l'aide du clavier." #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" "Lorsque la touche d'échappement est utilisée lors de l'édition de texte, le " "mode d'édition est interrompu sans que le texte ne soit réinitialisé." #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" "Création de menus contextuels uniques en fonction de ce qui est sélectionné " "dans la carte mentale." #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" "Changement de l'onglet NÅ“ud de la barre latérale à Courant qui affiche soit " "le nÅ“ud ou la connexion actuellement sélectionné(e)." #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" "Amélioration du dessin des liens lorsqu'une arborescence de nÅ“uds est " "déplacée." #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "Passage de GtkFileChooserDialog à GtkFileChooserNative." #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" "Ajout du support pour l'insertion d'emojis lors de l'édition de texte dans " "la carte mentale (utilisez la combinaison CTRL + .)." #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "Meilleure lisibilité du nom du thème lorsque le thème est sélectionné." #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" "Correction d'un problème où le changement d'un style global n'était pas " "sauvegardé/appliqué aux nouveaux nÅ“uds." #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" "Amélioration du copier/coller des nÅ“uds pour que les éléments copiés " "puissent être collés dans d'autres cartes mentales." #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" "Ajout de la prise en charge du passage dynamique en thème sombre dans " "l'interface utilisateur si l'option de thème sombre est activée." #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" "Ajout de la possibilité d'afficher/masquer chaque panneau dans l'inspecteur " "de style." #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "Arrêt de la prise en charge pour Loki." #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "Correction d'une omission dans le fichier appdata.xml." #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" "La suppression du style automatique s'applique lorsque l'effet est réglé sur " "certaines valeurs." #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "Ajout des traductions en espagnol." #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" "Ajout de la prise en charge du raccourci CTRL + Entrée/TAB pour ajouter des " "nouvelles lignes/tabulations dans le titre d'un nÅ“ud." #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" "Amélioration de la prise en charge de l'édition du titre des nÅ“uds pour la " "sélection et le déplacement du curseur." #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" "Ajout de la prise en charge de l'ouverture automatique des fichiers Minder à " "partir de Fichiers." #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "Ajout de la possibilité de modifier les styles des nÅ“uds et des liens." #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" "Modification de la disposition pour l'enregistrement par arbre au lieu de " "l'enregistrement par document." #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "Ajout de la prise en charge de l'exportation au format Mermaid." #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" "Ajout de la prise en charge de la désactivation/activation de l'affichage du " "balisage dans le titre du nÅ“ud." #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "Amélioration de l'apparence des indicateurs de pli." #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "Nombreuses corrections de bugs." #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "Ajout des traductions en espagnol (grâce à Adolfo Jayme-Barrientos)." #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" "Ajout du support pour l'insertion de caractères spéciaux avec la touche " "Compose." #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "Mises à jour des traductions en français." #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "Version corrective" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" "Correction de bugs liés à l'édition de caractères unicode dans la zone de la " "carte." #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" "Réduction de la hauteur de la zone de texte du nÅ“ud dans la barre latérale " "pour aider à diminuer les problèmes de dimensionnement de la fenêtre." #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" "Correction d'un problème avec le déplacement d'un nÅ“ud vers une position " "différente au sein d'un nÅ“ud parent." #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" "Correction d'un problème de connexion d'un nÅ“ud racine à un autre nÅ“ud." #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "Les images sont désormais prises en charge !" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "Ajout de la prise en charge des images à l'intérieur des nÅ“uds." #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "Ajout de la prise en charge mimimale de la modification d'image." #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" "Ajout de la prise en charge du glisser-déposer d'images locales ou web." #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" "Ajout de la prise en charge du redimensionnement de la largeur des nÅ“uds." #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "Modification du curseur au survol d'un bouton de tâche." #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" "Modification de l'emplacement des éléments de tâche et de note dans un nÅ“ud." #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" "Ajout de la prise en charge du maintien du défilement de la carte de l'écran." #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" "Ajout de la prise en charge de la molette de la souris avec shift pour le " "défilement horizontal." #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" "Ajout de la prise en charge de la molette de la souris pour effectuer un " "zoom avant/arrière." #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" "Correction d'un problème avec l'arrière-plan du graphique lorsque le facteur " "de zoom était faible." #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" "Les icônes personnalisées sont maintenant stockées en tant que ressource " "gresource plutôt que dans le système de fichiers." #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "Autres corrections de bugs mineures." #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "Prise en charge de plus de types d'exportation et corrections de bugs." #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" "Ajout de la prise en charge pour l'exportation vers les formats SVG, JPEG, " "BMP, Mardown, Texte brut et CSV." #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" "Ajout de la prise en charge pour plier toutes les tâches complétées dans " "l'inspecteur de carte." #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" "Ajout de la prise en charge pour déplier tous les nÅ“uds pliés dans " "l'inspecteur de carte." #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "AJout des thèmes Solarized Dark et Solarized Light." #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "Modification de l'affichage du bouton dans l'inspecteur de carte." #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" "Nettoyage du menu Exporter pour inclure une seule option « Exporter… »." #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" "Correction d'un problème où le titre de nÅ“ud modifié dans l'inspecteur de " "nÅ“ud était perdu lorsque le point focalisé en entrée était modifié." #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" "Correction d'un problème où un arbre entier est attaché à un autre arbre." #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "Ajout des traductions en tchèque (grâce à Jan Marek !)." #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "Ajout des traductions en français (grâce à Yannick A. !)." #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "Ajout des traductions en portugais brésilien (grâce à btd1337 !)" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "Correction de bug au premier démarrage." #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "Amélioration de la recherche et corrections de bugs" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "Ajout de la possibilité de chercher parmi les notes." #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" "Ajout de la possibilité pour optionnellement contrôler les critères de " "recherche dans le volet de recherche." #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "Correction des captures d'écran." #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" "L'icône de la barre supérieure des propriétés a été changée en icône de " "masquage/affichage dans la barre latérale pour plus de clarté." #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "Améliorations mineures diverses de l'interface." #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "Suprresion des éléments GTK dépréciés." #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" "Ajout de la possibilité de double-cliquer sur un nÅ“ud pour le rendre " "éditable." #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "Corrections de bugs." #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "Version initiale" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "Créateur de cartes mentales" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "com.github.phase1geo.minder" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "Mentale;Carte;" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "Nouveau document" Minder-1.5.1/po/extra/meson.build000066400000000000000000000002071356632107200166430ustar00rootroot00000000000000i18n.gettext('extra', args: [ '--directory=' + meson.source_root(), '--from-code=UTF-8' ], install: false )Minder-1.5.1/po/extra/pl.po000066400000000000000000000403341356632107200154610ustar00rootroot00000000000000# Polish translations for extra package. # Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Automatically generated, 2019. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\n" "PO-Revision-Date: 2019-03-24 15:37+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pl\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==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:18 msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "" Minder-1.5.1/po/extra/pt_BR.po000066400000000000000000000402451356632107200160550ustar00rootroot00000000000000# Portuguese translations for extra package. # Copyright (C) 2019 THE extra'S COPYRIGHT HOLDER # This file is distributed under the same license as the extra package. # Automatically generated, 2019. # msgid "" msgstr "" "Project-Id-Version: extra\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-07-05 14:08+0200\n" "PO-Revision-Date: 2019-03-24 15:37+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pt_BR\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" #: data/com.github.phase1geo.minder.appdata.xml.in:7 #: data/com.github.phase1geo.minder.desktop.in:3 msgid "Minder" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:8 #: data/com.github.phase1geo.minder.desktop.in:5 msgid "Create, develop and visualize your ideas" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:10 msgid "Use the power of mind-mapping to make your ideas come to life." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:12 msgid "" "Quickly create visual mind-maps using the keyboard and automatic layout." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:13 msgid "Choose from many tree layout choices" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:14 msgid "Add notes, tasks and images to your nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:15 msgid "Add node-to-node connections with optional text and notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:16 msgid "" "Stylize nodes, links and connections to add more meaning and improve " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:17 msgid "" "Quick search of node and connection titles and notes, including filtering " "options." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:18 msgid "" "Zoom in or enable focus mode to focus on certain ideas or zoom out to see " "the bigger picture." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:19 msgid "Enter focus mode to better view and understand portions of the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:20 msgid "Unlimited undo/redo of any change." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:21 msgid "Automatically saves in the background." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:22 msgid "Colorized node branches." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:23 msgid "Open multiple mindmaps with the use of tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:24 msgid "Gorgeous themes and animations." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:25 msgid "Import from OPML, FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:26 msgid "" "Export to PDF, PNG, JPEG, BMP, SVG, OPML, CSV, Markdown, PlainText, " "FreeMind, Freeplane and Mermaid formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:27 msgid "Printer support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:35 msgid "Node/Connection Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:39 msgid "Style Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:43 msgid "Map Property Sidebar" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:47 msgid "Trevor Williams" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:87 msgid "New" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:89 msgid "Added support for focus mode." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:90 msgid "Added support for multiple documents with tabs." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:91 msgid "Added support for resizing the inspector sidebar." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:92 msgid "" "Added support for creating a new node directly from editing an existing node " "presssing Return or Tab." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:93 msgid "Added support for adding a new parent node to an existing node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:94 msgid "" "Added support for importing/exporting to FreeMind and Freeplane formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:95 msgid "Added support for sorting children either alphabetically or randomly." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:96 msgid "" "Added support for creating a link from one node to another node in the same " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:97 msgid "Added support for building a Flatpak." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:99 msgid "Changes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:101 msgid "Removed markup from translated strings." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:102 msgid "Standardized tooltips that display accelerator information." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:103 msgid "Changed the way that node/connection titles are displayed in inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:104 msgid "" "Changed app terminal script to allow command-line arguments to be passed to " "debug subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:105 msgid "Changed header bar and widget colors to match Minder brand color." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:106 msgid "" "Changed search icon in header bar to a symbolic icon to improve readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:107 msgid "" "When note tooltip is displayed, markup text is rendered for improved " "readability." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:108 msgid "" "Enhanced app script to allow command-line arguments to be passed to debug " "subcommand." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:110 msgid "Bug Fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:112 msgid "" "Fixed an issue with calculating connection endpoints when a portion of the " "node is not visible." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:113 msgid "Fixed file naming issue when a file is imported." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:114 msgid "" "Fixed issue with displaying resized nodes on open or application startup." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:121 msgid "Fixing issue with export functions." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:127 msgid "Let's stay connected!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:129 msgid "Added support for creating a visual connection between any two nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:130 msgid "Added ability to show/hide all connections in the map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:131 msgid "" "Added support for remembering the last selected child of a node when " "navigating the map with the keyboard." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:132 msgid "" "When escape key is used when editing text, editing mode is ended without " "reverting text." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:133 msgid "" "Created unique contextual menus depending on what is selected in the mind " "map." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:134 msgid "" "Changed Node sidebar tab to Current which shows either the currently " "selected node or connection." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:135 msgid "Improved link drawing when a node tree is being moved." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:136 msgid "Switched from using GtkFileChooserDialog to GtkFileChooserNative." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:137 msgid "" "Added support for inserting emoji when editing text in the mind map (use " "Control-period)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:138 msgid "Improved readability of theme name when the theme is selected." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:139 msgid "" "Fixed issue where changing a global style was not saved/applied to new nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:140 msgid "" "Improved copy/paste support of nodes so that copied items can be pasted in " "other mind maps." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:141 msgid "" "Added support for dynamically changing to dark mode in the UI if the prefer-" "dark desktop gsetting is set." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:142 msgid "Added ability to show/hide each panel within the style inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:143 msgid "Removed support for Loki builds." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:150 msgid "Fixing appdata.xml file omission." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:151 msgid "" "Removing automatic style apply when the affects is set to certain values." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:158 msgid "Added Spanish translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:159 msgid "" "Added support for Control-Return/Tab to support adding newlines/tabs in a " "node's title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:160 msgid "Improved node title editing support for selection and cursor movement." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:161 msgid "Added support for automatically opening Minder files from Files." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:162 msgid "Added ability to modify styles of nodes and links." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:163 msgid "" "Changed layouts to be stored on a per tree basis instead of a per document " "basis." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:164 msgid "Added support for exporting to the Mermaid format." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:165 msgid "Added support for disabling/enabling displaying markup in node title." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:166 msgid "Improved the look of the fold indicators." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:167 msgid "Lots of bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:174 msgid "Adding Spanish translation (thanks to Adolfo Jayme-Barrientos)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:175 msgid "Adding support for special character insertion via the Compose key." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:181 msgid "Updating French translation." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:186 msgid "Bug fix release" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:188 msgid "Fixed bugs related to editing unicode characters in map area." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:189 msgid "" "Reduced height of node textbox in sidebar to help alleviate window sizing " "problems." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:190 msgid "" "Fixed issue with moving a node to a different position within a parent node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:191 msgid "Fixed issue connecting a root node to another node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:197 msgid "Images now supported!" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:199 msgid "Added support for images within nodes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:200 msgid "Added basic image editing support." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:201 msgid "Added support for dragging and dropping local and web images." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:202 msgid "Added support for resizing node width." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:203 msgid "Changed cursors when over a task button." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:204 msgid "Changed location of task and note elements in a node." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:205 msgid "Added support for keeping the map from scrolling off screen." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:206 msgid "Added support for shift-mousewheel to scroll horizontally." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:207 msgid "Added support for control-mousewheel to zoom in/out." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:208 msgid "Fixed issue with drawing background when zoom factor was small." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:209 msgid "" "Custom icons are now stored as a gresource rather than in the file system." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:210 msgid "Other minor bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:216 msgid "Support for more export types and bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:218 msgid "" "Added support for exporting to SVG, JPEG, BMP, Markdown, PlainText and CSV " "formats." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:219 msgid "Added support for folding all completed tasks in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:220 msgid "Added support for unfolding all folded nodes in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:221 msgid "Added Solarized Dark and Solarized Light themes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:222 msgid "Changing button display in map inspector." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:223 msgid "Cleaning up Export menu to include a single \"Export…\" option." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:224 msgid "" "Fixing issue where modified node title in node inspector was lost when input " "focus was changed." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:225 msgid "Fixing issue where an entire tree is attached to another tree." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:226 msgid "Added Czech translation (thanks to Jan Marek!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:227 msgid "Added French translation (thanks to Yannick A.!)." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:228 msgid "Added Brazilian Portuguese translation (thanks to btd1337!)" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:234 msgid "Initial startup bug fix." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:239 msgid "Search improvements and bug fixes" msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:241 msgid "Added ability to search within notes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:242 msgid "" "Added ability to optionally control search criteria within search popover." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:243 msgid "Fixed screenshots." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:244 msgid "" "Changed properties header bar icon to a sidebar hide/show icon for clarity." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:245 msgid "Several minor UI improvements." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:246 msgid "Removing deprecated GTK calls." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:247 msgid "Added ability to double-click on a node to make it editable." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:248 msgid "Bug fixes." msgstr "" #: data/com.github.phase1geo.minder.appdata.xml.in:254 msgid "Initial release" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:4 msgid "Mind-mapper" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:8 msgid "com.github.phase1geo.minder" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:14 msgid "Mind;Mapping;" msgstr "" #: data/com.github.phase1geo.minder.desktop.in:18 msgid "New Document" msgstr "" Minder-1.5.1/po/fr.po000066400000000000000000000674241356632107200143430ustar00rootroot00000000000000# French translations for com.github.phase1geo.minder package. # Copyright (C) 2019 THE com.github.phase1geo.minder'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # NathanBnm, 2019. # msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\n" "PO-Revision-Date: 2019-03-24 15:24+0100\n" "Last-Translator: NathanBnm\n" "Language-Team: Français\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" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "Copier" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "Couper" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "Coller" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "Supprimer" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "Modifier…" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "Transformer en tâche" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "Ajouter une note" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "Ajouter une image" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 msgid "Add Node Link" msgstr "Ajouter un lien vers le nÅ“ud" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "Ajouter une connexion" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "Plier les enfants" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "Détacher" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "Ajouter un nÅ“ud racine" #: src/NodeMenu.vala:105 msgid "Add Parent Node" msgstr "Ajouter un nÅ“ud parent" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "Ajouter un nÅ“ud enfant" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "Ajouter un nÅ“ud frère" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 msgid "Select" msgstr "Sélectionner" #: src/NodeMenu.vala:124 msgid "Root Node" msgstr "NÅ“ud racine" #: src/NodeMenu.vala:128 msgid "Next Sibling Node" msgstr "NÅ“ud frère suivant" #: src/NodeMenu.vala:132 msgid "Previous Sibling Node" msgstr "NÅ“ud frère précédent" #: src/NodeMenu.vala:136 msgid "Child Node" msgstr "NÅ“ud enfant" #: src/NodeMenu.vala:140 msgid "Parent Node" msgstr "NÅ“ud parent" #: src/NodeMenu.vala:144 msgid "Linked Node" msgstr "NÅ“ud lié" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "Connexion" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "Centrer sur le nÅ“ud" #: src/NodeMenu.vala:156 msgid "Sort Children" msgstr "Trier les enfants" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "Alphabétiquement" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "Aléatoirement" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "Supprimer la tâche" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "Supprimer la note" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "Supprimer l'image" #: src/NodeMenu.vala:294 msgid "Remove Node Link" msgstr "Supprimer le lien vers le nÅ“ud" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "Déplier les enfants" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "Sélectionner le nÅ“ud" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "Racine" #: src/ConnectionMenu.vala:55 msgid "Start Node" msgstr "Démarrer le nÅ“ud" #: src/ConnectionMenu.vala:59 msgid "End Node" msgstr "Terminer le nÅ“ud" #: src/ConnectionMenu.vala:63 msgid "Next Connection" msgstr "Connexion suivante " #: src/ConnectionMenu.vala:67 msgid "Previous Connection" msgstr "Connexion précédente" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "Défaut" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "Idée principale" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "%0.3g%% complété" #: src/DrawArea.vala:1584 msgid "connection endpoint change" msgstr "modification du point d'extrémité de la connexion" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "déplacement de la connexion" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "Une autre idée" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "plier les tâches terminées" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "déplier toutes les tâches" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "Zone de découpe : %d,%d %3dx%3d" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "Curseur : %3d,%3d" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "Annuler" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "Appliquer" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "Modifier l'image" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "Manuel" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "Vers la droite" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "Vers la gauche" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "Horizontal" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "Vers le bas" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "Vers le haut" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "Vertical" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "Minder" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 msgid "New File" msgstr "Nouveau fichier" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "Ouvrir un fichier" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 msgid "Save File As" msgstr "Enregistrer sous" #: src/MainWindow.vala:170 msgid "Undo" msgstr "Annuler" #: src/MainWindow.vala:177 msgid "Redo" msgstr "Rétablir" #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "Document sans nom" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "Mode concentration" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "Zoom" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "Pourcentage de zoom" #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "Zoomer" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "Dézoomer" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "Voir l'ensemble du document" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "Zoomer sur le nÅ“ud sélectionné" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "Zoom par défaut (100 %)" #: src/MainWindow.vala:408 msgid "Search" msgstr "Rechercher" #: src/MainWindow.vala:418 msgid "Search Nodes and Connections" msgstr "Rechercher des nÅ“uds et des connexions" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "Critères de recherche" #: src/MainWindow.vala:463 msgid "Nodes" msgstr "NÅ“uds" #: src/MainWindow.vala:464 msgid "Connections" msgstr "Connexions" #: src/MainWindow.vala:465 msgid "Titles" msgstr "Titres" #: src/MainWindow.vala:466 msgid "Notes" msgstr "Notes" #: src/MainWindow.vala:467 msgid "Folded" msgstr "Pliés" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "Dépliés" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "Tâches" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "Non-tâches" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "Exporter" #: src/MainWindow.vala:567 msgid "Export…" msgstr "Exporter…" #: src/MainWindow.vala:571 msgid "Print" msgstr "Imprimer" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "Propriétés" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "Courant" #: src/MainWindow.vala:667 msgid "Style" msgstr "Style" #: src/MainWindow.vala:668 msgid "Map" msgstr "Carte" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "Enregistrer le document sans titre actuel ?" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "" "Les modifications seront définitivement perdues si elles ne sont pas " "enregistrées." #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "Ignorer les modifications" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "Enregistrer" #: src/MainWindow.vala:785 msgid "Open" msgstr "Ouvrir" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "Texte brut" #: src/MainWindow.vala:887 msgid "Save File" msgstr "Enregistrer le fichier" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "Exporter sous" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "BMP" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "CSV" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "Freemind" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "Freeplane" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "JPEG" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "Markdown" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "Mermaid" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "OPML" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "PDF" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "PNG (transparent)" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "PNG (opaque)" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "SVG" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 msgid "Enable animations" msgstr "Activer les animations" #: src/MapInspector.vala:105 msgid "Hide connections" msgstr "Masquer les connexions" #: src/MapInspector.vala:138 msgid "Node Layouts" msgstr "Disposition des nÅ“uds" #: src/MapInspector.vala:189 msgid "Themes" msgstr "Thèmes" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "Équilibrer les nÅ“uds" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "Plier les tâches terminées" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "Déplier toutes les tâches" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 msgid "Node Title" msgstr "Titre du nÅ“ud" #: src/Node.vala:1467 msgid "Node Note" msgstr "Note du nÅ“ud" #: src/NodeInspector.vala:92 msgid "Title" msgstr "Titre" #: src/NodeInspector.vala:119 msgid "Task" msgstr "Tâche" #: src/NodeInspector.vala:138 msgid "Fold" msgstr "Plier" #: src/NodeInspector.vala:160 msgid "Link Color" msgstr "Couleur du lien" #: src/NodeInspector.vala:182 msgid "Note" msgstr "Note" #: src/NodeInspector.vala:210 msgid "Image" msgstr "Image" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "Ajouter une image…" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "Modifier l'image" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "Copier le nÅ“ud sur le presse-papier" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "Couper le nÅ“ud sur le presse-papier" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "Détacher le nÅ“ud" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "Supprimer le nÅ“ud" #: src/StyleInspector.vala:47 msgid "All" msgstr "Tout" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "Arbre courant" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "NÅ“ud courant + Descendants" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "NÅ“uds racine" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "NÅ“uds de niveau 1" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "NÅ“uds de niveau 2" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "NÅ“uds de niveau 3" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "NÅ“uds de niveau 4" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "NÅ“uds de niveau 5" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "NÅ“uds de niveau 6" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "NÅ“uds de niveau 7" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "NÅ“uds de niveau 8" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "NÅ“uds de niveau 9" #: src/StyleInspector.vala:163 msgid "Changes affect:" msgstr "Les modifications affectent:" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "Options des branches" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "Style de branche" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "Options des liens" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "Style de ligne" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "Épaisseur de ligne" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "Flèche" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "Options des nÅ“uds" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "Style de bordure" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "Épaisseur de bordure" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "Remplir avec la couleur du lien" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "Marge extérieure" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "Marge intérieure" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "Police" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "Activer le balisage" #: src/StyleInspector.vala:730 msgid "Connection Options" msgstr "Options des connexions" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "Flèches" #: src/EmptyInspector.vala:30 msgid "" "Select a node or connection\n" "to view/edit information" msgstr "" "Sélectionnez un nÅ“ud ou une connexion\n" "pour afficher/modifier des informations" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "Courbe" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "Carré" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "Droit" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "Crochet" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "Aucun" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "En forme de pilule" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "Rectangle arrondi" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "Carré" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "Souligné" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "Solarized Light" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "Sombre" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "Solarized Dark" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "coller le nÅ“ud" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "déplacer le nÅ“ud" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "modification de la note du nÅ“ud" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "révélation du nÅ“ud" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "supprimer le nÅ“ud" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "couper le nÅ“ud" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "redimensionnement du nÅ“ud" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "insérer un nÅ“ud" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "modification de la tâche du nÅ“ud" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "attacher le nÅ“ud" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "modification de la couleur du lien" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "modifier la disposition" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "modification du pli du nÅ“ud" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "équilibrer les nÅ“uds" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "modification de la taille de l'image" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "détacher le nÅ“ud" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "modification du nom du nÅ“ud" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "Annuler " #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "Rétablir " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 #, fuzzy msgid "File" msgstr "Nouveau fichier" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 #, fuzzy msgid "Close File" msgstr "Nouveau fichier" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 #, fuzzy msgid "Undo/Redo" msgstr "Annuler" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 #, fuzzy msgid "Undo Last Change" msgstr "modification de la tâche du nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 #, fuzzy msgid "Zooming" msgstr "Zoom" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 #, fuzzy msgid "Zoom To Actual Size" msgstr "Zoom par défaut (100 %)" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 #, fuzzy msgid "Toggle Focus Mode" msgstr "Mode concentration" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 #, fuzzy msgid "Search Nodes/Connections" msgstr "Rechercher des nÅ“uds et des connexions" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 #, fuzzy msgid "Node Commands" msgstr "Options des nÅ“uds" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 #, fuzzy msgid "New Sibling Node" msgstr "NÅ“ud frère suivant" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 #, fuzzy msgid "New Child Node" msgstr "NÅ“ud enfant" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 #, fuzzy msgid "Clipboard" msgstr "Couper le nÅ“ud sur le presse-papier" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 #, fuzzy msgid "Copy Node" msgstr "NÅ“ud racine" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 #, fuzzy msgid "Cut Node" msgstr "NÅ“ud racine" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 #, fuzzy msgid "Changing Current" msgstr "Courant" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 #, fuzzy msgid "Edit Title" msgstr "Titre du nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 #, fuzzy msgid "View Properties" msgstr "Propriétés" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 #, fuzzy msgid "Toggle Node Link" msgstr "Supprimer le lien vers le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 #, fuzzy msgid "Create Connection" msgstr "Connexion suivante " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 #, fuzzy msgid "Center In View" msgstr "Centrer sur le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 #, fuzzy msgid "Sort Child Nodes Alphabetically" msgstr "Alphabétiquement" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 #, fuzzy msgid "Select Root" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 #, fuzzy msgid "Select Parent" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 #, fuzzy msgid "Select Next Sibling" msgstr "NÅ“ud frère suivant" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 #, fuzzy msgid "Select Previous Sibling" msgstr "NÅ“ud frère précédent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 #, fuzzy msgid "Select Child" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 #, fuzzy msgid "Select Node Below" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 #, fuzzy msgid "Select Node Above" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 #, fuzzy msgid "Select Node To Right" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 #, fuzzy msgid "Select Node To Left" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 #, fuzzy msgid "Select Linked Node" msgstr "NÅ“ud lié" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 #, fuzzy msgid "Select Attached Connection" msgstr "Rechercher des nÅ“uds et des connexions" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 #, fuzzy msgid "Connection Commands" msgstr "Options des connexions" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 #, fuzzy msgid "Change Current" msgstr "Centrer sur le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 #, fuzzy msgid "Show Properties" msgstr "Propriétés" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 #, fuzzy msgid "Select Start Node" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 #, fuzzy msgid "Select End Node" msgstr "Sélectionner le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 #, fuzzy msgid "Select Next Connection" msgstr "Connexion suivante " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 #, fuzzy msgid "Select Previous Connection" msgstr "Connexion précédente" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 #, fuzzy msgid "Previous Character" msgstr "Connexion précédente" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 #, fuzzy msgid "Previous Word" msgstr "NÅ“ud frère précédent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 #, fuzzy msgid "Next Line" msgstr "NÅ“ud frère suivant" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 #, fuzzy msgid "Previous Line" msgstr "NÅ“ud frère précédent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 #, fuzzy msgid "Start Of Text" msgstr "Démarrer le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 #, fuzzy msgid "Paste Text" msgstr "Coller" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 #, fuzzy msgid "Selection" msgstr "Sélectionner" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 #, fuzzy msgid "Add Next Word" msgstr "Ajouter un nÅ“ud parent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 #, fuzzy msgid "Add Previous Word" msgstr "Ajouter un nÅ“ud parent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 #, fuzzy msgid "Add Next Line" msgstr "Ajouter un lien vers le nÅ“ud" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 #, fuzzy msgid "Add Previous Line" msgstr "NÅ“ud frère précédent" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" Minder-1.5.1/po/meson.build000066400000000000000000000003511356632107200155200ustar00rootroot00000000000000i18n.gettext(meson.project_name(), args: [ '--directory='+meson.source_root(), '--from-code=UTF-8', join_paths(meson.source_root(), 'data', meson.project_name()+'.shortcuts.ui'), ] ) subdir('extra') Minder-1.5.1/po/pl.po000066400000000000000000000652461356632107200143470ustar00rootroot00000000000000# Polish translations for com.github.phase1geo.minder package. # Copyright (C) 2019 THE com.github.phase1geo.minder'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # Automatically generated, 2019. # msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\n" "PO-Revision-Date: 2019-03-24 15:24+0100\n" "Last-Translator: Automatically generated\n" "Language-Team: none\n" "Language: pl\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==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "Kopiuj" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "Wytnij" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "Wklej" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "UsuÅ„" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "Edytuj…" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "Dodaj zadanie" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "Dodaj notatkÄ™" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 #, fuzzy msgid "Add Node Link" msgstr "Dodaj notatkÄ™" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "Zwiń wÄ™zeÅ‚ potomny" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "Odczep" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "Dodaj wÄ™zeÅ‚ główny" #: src/NodeMenu.vala:105 #, fuzzy msgid "Add Parent Node" msgstr "Szukaj wÄ™złów" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "Dodaj wÄ™zeÅ‚ potomny" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "Dodaj sÄ…siadujÄ…cy wÄ™zeÅ‚" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 #, fuzzy msgid "Select" msgstr "Wybierz wÄ™zeÅ‚" #: src/NodeMenu.vala:124 #, fuzzy msgid "Root Node" msgstr "Dodaj wÄ™zeÅ‚ główny" #: src/NodeMenu.vala:128 #, fuzzy msgid "Next Sibling Node" msgstr "NastÄ™pny sÄ…siadujÄ…cy" #: src/NodeMenu.vala:132 #, fuzzy msgid "Previous Sibling Node" msgstr "Poprzedni sÄ…siadujÄ…cy" #: src/NodeMenu.vala:136 #, fuzzy msgid "Child Node" msgstr "Dodaj wÄ™zeÅ‚ potomny" #: src/NodeMenu.vala:140 #, fuzzy msgid "Parent Node" msgstr "Szukaj wÄ™złów" #: src/NodeMenu.vala:144 #, fuzzy msgid "Linked Node" msgstr "WÄ™zeÅ‚" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "WyÅ›rodkuj na wężle" #: src/NodeMenu.vala:156 #, fuzzy msgid "Sort Children" msgstr "Zwiń wÄ™zeÅ‚ potomny" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "UsuÅ„ zadanie" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "UsuÅ„ notatkÄ™" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "" #: src/NodeMenu.vala:294 #, fuzzy msgid "Remove Node Link" msgstr "UsuÅ„ notatkÄ™" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "RozwiÅ„ wÄ™zeÅ‚ potomny" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "Wybierz wÄ™zeÅ‚" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "Główny" #: src/ConnectionMenu.vala:55 #, fuzzy msgid "Start Node" msgstr "Szukaj wÄ™złów" #: src/ConnectionMenu.vala:59 #, fuzzy msgid "End Node" msgstr "WÄ™zeÅ‚" #: src/ConnectionMenu.vala:63 #, fuzzy msgid "Next Connection" msgstr "Szukaj wÄ™złów" #: src/ConnectionMenu.vala:67 #, fuzzy msgid "Previous Connection" msgstr "Poprzedni sÄ…siadujÄ…cy" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "Główny pomysÅ‚" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "UkoÅ„czono %0.3g%%" #: src/DrawArea.vala:1584 #, fuzzy msgid "connection endpoint change" msgstr "zmiana notatki wÄ™zÅ‚a" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "Inny pomysÅ‚" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "zwiniÄ™cie ukoÅ„czonych zadaÅ„" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "rozwiniÄ™cie wszystkich zadaÅ„" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "Anuluj" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "RÄ™cznie" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "Do prawej" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "Do lewej" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "Horyzontalny" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "W dół" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "W górÄ™" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "Wertykalny" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "Minder" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 #, fuzzy msgid "New File" msgstr "Nowy Plik" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "Otwórz plik" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 #, fuzzy msgid "Save File As" msgstr "Zapisz jako" #: src/MainWindow.vala:170 #, fuzzy msgid "Undo" msgstr "Cofnij" #: src/MainWindow.vala:177 #, fuzzy msgid "Redo" msgstr "Ponów" #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "Dokument bez nazwy" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "Przybliżenie" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "Przybliżenie " #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "Przybliż" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "Oddal" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "Przybliż do widoku" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "Przybliż do zaznaczonego wÄ™zÅ‚a" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "Naturalna wielkość" #: src/MainWindow.vala:408 msgid "Search" msgstr "Szukaj" #: src/MainWindow.vala:418 #, fuzzy msgid "Search Nodes and Connections" msgstr "Szukaj wÄ™złów" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "Kryteria wyszukiwania" #: src/MainWindow.vala:463 #, fuzzy msgid "Nodes" msgstr "WÄ™zeÅ‚" #: src/MainWindow.vala:464 msgid "Connections" msgstr "" #: src/MainWindow.vala:465 msgid "Titles" msgstr "Tytuly" #: src/MainWindow.vala:466 msgid "Notes" msgstr "Notatki" #: src/MainWindow.vala:467 msgid "Folded" msgstr "ZwiniÄ™te" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "RozwiniÄ™te" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "Zadania" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "Nie zadania" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "Eksport" #: src/MainWindow.vala:567 msgid "Export…" msgstr "Eksport…" #: src/MainWindow.vala:571 msgid "Print" msgstr "Drukuj" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "WÅ‚aÅ›ciwoÅ›ci" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "" #: src/MainWindow.vala:667 msgid "Style" msgstr "" #: src/MainWindow.vala:668 msgid "Map" msgstr "Mapa" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "Zapisać nienazwany dokument?" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "Zmainy zostaną bezpowrotnie utracone jeÅ›li nie zostanÄ… zapisane." #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "Odrzuć zmiany" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "Zapisz" #: src/MainWindow.vala:785 msgid "Open" msgstr "Otwórz" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "Dokument tekstowy" #: src/MainWindow.vala:887 msgid "Save File" msgstr "Zapisz plik" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "Eksportuj jako" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "BMP" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "CSV" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "JPEG" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "Markdown" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "OPML" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "PDF" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "PNG (z przeźroczystoÅ›ciÄ…)" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "PNG" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "SVG" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 #, fuzzy msgid "Enable animations" msgstr "Włącz animacje" #: src/MapInspector.vala:105 #, fuzzy msgid "Hide connections" msgstr "Szukaj wÄ™złów" #: src/MapInspector.vala:138 #, fuzzy msgid "Node Layouts" msgstr "Uklad wÄ™złów" #: src/MapInspector.vala:189 #, fuzzy msgid "Themes" msgstr "Motywy" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "Zbalansuj wężły" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "ZwiÅ„ ukoÅ„czone zadania" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "Rozwiń wszystkie wÄ™zÅ‚y" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 #, fuzzy msgid "Node Title" msgstr "Tytuly" #: src/Node.vala:1467 #, fuzzy msgid "Node Note" msgstr "Dodaj notatkÄ™" #: src/NodeInspector.vala:92 #, fuzzy msgid "Title" msgstr "Tytuly" #: src/NodeInspector.vala:119 #, fuzzy msgid "Task" msgstr "Zadania" #: src/NodeInspector.vala:138 #, fuzzy msgid "Fold" msgstr "ZwiniÄ™te" #: src/NodeInspector.vala:160 #, fuzzy msgid "Link Color" msgstr "Kolor połączenia" #: src/NodeInspector.vala:182 #, fuzzy msgid "Note" msgstr "Notatki" #: src/NodeInspector.vala:210 msgid "Image" msgstr "" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "Skopiuj wÄ™zeÅ‚" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "Wytnij wÄ™zeÅ‚" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "Odczep wÄ™zeÅ‚" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "UsuÅ„ wÄ™zeÅ‚" #: src/StyleInspector.vala:47 msgid "All" msgstr "" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "" #: src/StyleInspector.vala:163 msgid "Changes affect:" msgstr "" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "" #: src/StyleInspector.vala:730 #, fuzzy msgid "Connection Options" msgstr "Szukaj wÄ™złów" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "" #: src/EmptyInspector.vala:30 #, fuzzy msgid "" "Select a node or connection\n" "to view/edit information" msgstr "Wybierz wÄ™zeÅ‚ aby zobaczyć/edytować informacje" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "wklejenie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "przesuniÄ™cie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "zmiana notatki wÄ™zÅ‚a" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "usuniÄ™cie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "wyciÄ™cie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "wstawienie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "zmiana zadania" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "przyczepienie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "zwiniÄ™cie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "zbalansowanie wÄ™złów" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "odczepienie wÄ™zÅ‚a" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "zmiana nazwy wÄ™zÅ‚a" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "Cofnij " #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "Ponów " #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 #, fuzzy msgid "File" msgstr "Nowy Plik" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 #, fuzzy msgid "Close File" msgstr "Nowy Plik" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 #, fuzzy msgid "Undo/Redo" msgstr "Cofnij" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 #, fuzzy msgid "Undo Last Change" msgstr "zmiana zadania" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 #, fuzzy msgid "Zooming" msgstr "Przybliżenie" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 #, fuzzy msgid "Zoom To Actual Size" msgstr "Naturalna wielkość" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 msgid "Toggle Focus Mode" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 #, fuzzy msgid "Search Nodes/Connections" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 msgid "Node Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 #, fuzzy msgid "New Sibling Node" msgstr "NastÄ™pny sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 #, fuzzy msgid "New Child Node" msgstr "Dodaj wÄ™zeÅ‚ potomny" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 #, fuzzy msgid "Clipboard" msgstr "Wytnij wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 #, fuzzy msgid "Copy Node" msgstr "Dodaj wÄ™zeÅ‚ główny" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 #, fuzzy msgid "Cut Node" msgstr "Dodaj wÄ™zeÅ‚ główny" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 msgid "Changing Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 #, fuzzy msgid "Edit Title" msgstr "Tytuly" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 #, fuzzy msgid "View Properties" msgstr "WÅ‚aÅ›ciwoÅ›ci" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 #, fuzzy msgid "Toggle Node Link" msgstr "UsuÅ„ notatkÄ™" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 #, fuzzy msgid "Create Connection" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 #, fuzzy msgid "Center In View" msgstr "WyÅ›rodkuj na wężle" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 msgid "Sort Child Nodes Alphabetically" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 #, fuzzy msgid "Select Root" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 #, fuzzy msgid "Select Parent" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 #, fuzzy msgid "Select Next Sibling" msgstr "NastÄ™pny sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 #, fuzzy msgid "Select Previous Sibling" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 #, fuzzy msgid "Select Child" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 #, fuzzy msgid "Select Node Below" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 #, fuzzy msgid "Select Node Above" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 #, fuzzy msgid "Select Node To Right" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 #, fuzzy msgid "Select Node To Left" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 #, fuzzy msgid "Select Linked Node" msgstr "WÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 #, fuzzy msgid "Select Attached Connection" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 #, fuzzy msgid "Connection Commands" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 #, fuzzy msgid "Change Current" msgstr "WyÅ›rodkuj na wężle" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 #, fuzzy msgid "Show Properties" msgstr "WÅ‚aÅ›ciwoÅ›ci" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 #, fuzzy msgid "Select Start Node" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 #, fuzzy msgid "Select End Node" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 #, fuzzy msgid "Select Next Connection" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 #, fuzzy msgid "Select Previous Connection" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 #, fuzzy msgid "Previous Character" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 #, fuzzy msgid "Previous Word" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 #, fuzzy msgid "Next Line" msgstr "NastÄ™pny sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 #, fuzzy msgid "Previous Line" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 #, fuzzy msgid "Start Of Text" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 #, fuzzy msgid "Paste Text" msgstr "Wklej" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 #, fuzzy msgid "Selection" msgstr "Wybierz wÄ™zeÅ‚" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 #, fuzzy msgid "Add Next Word" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 #, fuzzy msgid "Add Previous Word" msgstr "Szukaj wÄ™złów" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 #, fuzzy msgid "Add Next Line" msgstr "Dodaj notatkÄ™" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 #, fuzzy msgid "Add Previous Line" msgstr "Poprzedni sÄ…siadujÄ…cy" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" #, fuzzy #~ msgid "Unnamed" #~ msgstr "Dokument bez nazwy" #, fuzzy #~ msgid "Child" #~ msgstr "Pierwszy potomny" #~ msgid "Parent" #~ msgstr "NadrzÄ™dny" Minder-1.5.1/po/pt_BR.po000066400000000000000000000635051356632107200147360ustar00rootroot00000000000000# Portuguese translations for com.github.phase1geo.minder package. # Copyright (C) 2019 THE com.github.phase1geo.minder'S COPYRIGHT HOLDER # This file is distributed under the same license as the com.github.phase1geo.minder package. # Helder Bertoldo , 2019. # msgid "" msgstr "" "Project-Id-Version: com.github.phase1geo.minder\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-11-23 15:17-0600\n" "PO-Revision-Date: 2019-03-24 15:24+0100\n" "Last-Translator: Helder Bertoldo \n" "Language-Team: none\n" "Language: pt_BR\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" #: src/NodeMenu.vala:59 msgid "Copy" msgstr "Copiar" #: src/NodeMenu.vala:63 msgid "Cut" msgstr "Recortar" #: src/NodeMenu.vala:67 msgid "Paste" msgstr "Colar" #: src/NodeMenu.vala:71 src/ConnectionMenu.vala:40 msgid "Delete" msgstr "Apagar" #: src/NodeMenu.vala:75 src/ConnectionMenu.vala:44 msgid "Edit…" msgstr "Editar…" #: src/NodeMenu.vala:79 src/NodeMenu.vala:291 msgid "Add Task" msgstr "Adicionar Tarefa" #: src/NodeMenu.vala:82 src/NodeMenu.vala:292 src/ConnectionMenu.vala:48 #: src/ConnectionMenu.vala:104 msgid "Add Note" msgstr "Adicionar Nota" #: src/NodeMenu.vala:85 src/NodeMenu.vala:293 msgid "Add Image" msgstr "" #: src/NodeMenu.vala:88 src/NodeMenu.vala:294 #, fuzzy msgid "Add Node Link" msgstr "Adicionar Nota" #: src/NodeMenu.vala:91 msgid "Add Connection" msgstr "" #: src/NodeMenu.vala:95 src/NodeMenu.vala:295 msgid "Fold Children" msgstr "" #: src/NodeMenu.vala:99 msgid "Detach" msgstr "Desanexar" #: src/NodeMenu.vala:102 src/EmptyMenu.vala:35 msgid "Add Root Node" msgstr "Adicionar Nó Raiz" #: src/NodeMenu.vala:105 #, fuzzy msgid "Add Parent Node" msgstr "Buscar Nós" #: src/NodeMenu.vala:108 msgid "Add Child Node" msgstr "Adicionar Nó Filho" #: src/NodeMenu.vala:112 msgid "Add Sibling Node" msgstr "" #: src/NodeMenu.vala:116 msgid "Add Nodes With Quick Entry" msgstr "" #: src/NodeMenu.vala:120 src/ConnectionMenu.vala:51 #, fuzzy msgid "Select" msgstr "Selecionar Nó" #: src/NodeMenu.vala:124 #, fuzzy msgid "Root Node" msgstr "Adicionar Nó Raiz" #: src/NodeMenu.vala:128 msgid "Next Sibling Node" msgstr "" #: src/NodeMenu.vala:132 msgid "Previous Sibling Node" msgstr "" #: src/NodeMenu.vala:136 #, fuzzy msgid "Child Node" msgstr "Adicionar Nó Filho" #: src/NodeMenu.vala:140 #, fuzzy msgid "Parent Node" msgstr "Buscar Nós" #: src/NodeMenu.vala:144 #, fuzzy msgid "Linked Node" msgstr "Adicionar Nota" #: src/NodeMenu.vala:148 msgid "Connection" msgstr "" #: src/NodeMenu.vala:152 msgid "Center Current Node" msgstr "Centralizar Nó Atual" #: src/NodeMenu.vala:156 #, fuzzy msgid "Sort Children" msgstr "Desdobrar Filhos" #: src/NodeMenu.vala:160 msgid "Alphabetically" msgstr "" #: src/NodeMenu.vala:163 msgid "Randomize" msgstr "" #: src/NodeMenu.vala:291 msgid "Remove Task" msgstr "Remover Tarefa" #: src/NodeMenu.vala:292 src/ConnectionMenu.vala:104 msgid "Remove Note" msgstr "Remover Nota" #: src/NodeMenu.vala:293 src/ImageEditor.vala:363 src/NodeInspector.vala:228 msgid "Remove Image" msgstr "" #: src/NodeMenu.vala:294 #, fuzzy msgid "Remove Node Link" msgstr "Remover Nota" #: src/NodeMenu.vala:295 msgid "Unfold Children" msgstr "Desdobrar Filhos" #: src/EmptyMenu.vala:38 msgid "Select Node" msgstr "Selecionar Nó" #: src/EmptyMenu.vala:42 msgid "Root" msgstr "Raíz" #: src/ConnectionMenu.vala:55 #, fuzzy msgid "Start Node" msgstr "Buscar Nós" #: src/ConnectionMenu.vala:59 #, fuzzy msgid "End Node" msgstr "Adicionar Nota" #: src/ConnectionMenu.vala:63 #, fuzzy msgid "Next Connection" msgstr "Buscar Nós" #: src/ConnectionMenu.vala:67 msgid "Previous Connection" msgstr "" #: src/DrawArea.vala:159 src/themes/ThemeDefault.vala:27 msgid "Default" msgstr "" #: src/DrawArea.vala:581 msgid "Main Idea" msgstr "" #: src/DrawArea.vala:1536 #, c-format msgid "%0.3g%% complete" msgstr "0.3g%% completados" #: src/DrawArea.vala:1584 msgid "connection endpoint change" msgstr "" #: src/DrawArea.vala:1591 msgid "connection drag" msgstr "" #: src/DrawArea.vala:2023 src/DrawArea.vala:3152 msgid "Another Idea" msgstr "Outra Ideia" #: src/DrawArea.vala:2199 msgid "fold completed tasks" msgstr "" #: src/DrawArea.vala:2234 msgid "unfold all tasks" msgstr "" #: src/ImageEditor.vala:179 #, c-format msgid "Crop Area: %d,%d %3dx%3d" msgstr "" #: src/ImageEditor.vala:353 #, c-format msgid "Cursor: %3d,%3d" msgstr "" #: src/ImageEditor.vala:360 src/MainWindow.vala:741 src/MainWindow.vala:785 #: src/MainWindow.vala:887 src/MainWindow.vala:1132 msgid "Cancel" msgstr "Cancelar" #: src/ImageEditor.vala:361 msgid "Apply" msgstr "" #: src/ImageEditor.vala:362 msgid "Change Image" msgstr "" #: src/layouts/LayoutManual.vala:26 src/MapInspector.vala:305 msgid "Manual" msgstr "Manual" #: src/layouts/LayoutRight.vala:26 src/MapInspector.vala:309 msgid "To right" msgstr "Para a direita" #: src/layouts/LayoutLeft.vala:26 src/MapInspector.vala:308 msgid "To left" msgstr "Para a esquerda" #: src/layouts/LayoutHorizontal.vala:26 src/MapInspector.vala:307 msgid "Horizontal" msgstr "Horizontal" #: src/layouts/LayoutDown.vala:26 src/MapInspector.vala:311 msgid "Downwards" msgstr "Para baixo" #: src/layouts/LayoutUp.vala:26 src/MapInspector.vala:310 msgid "Upwards" msgstr "Para cima" #: src/layouts/LayoutVertical.vala:26 src/MapInspector.vala:306 msgid "Vertical" msgstr "Vertical" #: src/MainWindow.vala:119 src/MainWindow.vala:890 msgid "Minder" msgstr "" #: src/MainWindow.vala:152 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:21 #, fuzzy msgid "New File" msgstr "Novo Arquivo" #: src/MainWindow.vala:158 src/MainWindow.vala:785 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:28 msgid "Open File" msgstr "Abrir Arquivo" #: src/MainWindow.vala:164 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:35 #, fuzzy msgid "Save File As" msgstr "Salvar Arquivo Como" #: src/MainWindow.vala:170 #, fuzzy msgid "Undo" msgstr "Desfazer" #: src/MainWindow.vala:177 #, fuzzy msgid "Redo" msgstr "Refazer" #: src/MainWindow.vala:321 msgid "Unnamed Document" msgstr "Documento sem Nome" #: src/MainWindow.vala:325 src/MainWindow.vala:593 msgid "Focus Mode" msgstr "" #: src/MainWindow.vala:347 msgid "Zoom" msgstr "Zoom" #: src/MainWindow.vala:354 msgid "Zoom to Percent" msgstr "Zoom para Porcentagem" #: src/MainWindow.vala:365 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:75 msgid "Zoom In" msgstr "Mais Zoom" #: src/MainWindow.vala:369 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:82 msgid "Zoom Out" msgstr "Reduzir o Zoom" #: src/MainWindow.vala:373 msgid "Zoom to Fit" msgstr "Ajustar Zoom ao Projeto" #: src/MainWindow.vala:377 msgid "Zoom to Fit Selected Node" msgstr "Ajustar Zoom para o nó Selecionado" #: src/MainWindow.vala:381 msgid "Zoom to Actual Size" msgstr "Zoom para o Tamanho Atual" #: src/MainWindow.vala:408 msgid "Search" msgstr "Buscar" #: src/MainWindow.vala:418 #, fuzzy msgid "Search Nodes and Connections" msgstr "Buscar Nós" #: src/MainWindow.vala:441 msgid "Search Criteria" msgstr "Critérios de Busca" #: src/MainWindow.vala:463 msgid "Nodes" msgstr "" #: src/MainWindow.vala:464 msgid "Connections" msgstr "" #: src/MainWindow.vala:465 msgid "Titles" msgstr "Títulos" #: src/MainWindow.vala:466 msgid "Notes" msgstr "Notas" #: src/MainWindow.vala:467 msgid "Folded" msgstr "" #: src/MainWindow.vala:468 msgid "Unfolded" msgstr "" #: src/MainWindow.vala:469 msgid "Tasks" msgstr "Tarefas" #: src/MainWindow.vala:470 msgid "Non-tasks" msgstr "Não-Tarefas" #: src/MainWindow.vala:560 src/MainWindow.vala:1132 msgid "Export" msgstr "Exportar" #: src/MainWindow.vala:567 msgid "Export…" msgstr "Exportar…" #: src/MainWindow.vala:571 msgid "Print" msgstr "Imprimir" #: src/MainWindow.vala:623 msgid "Shortcuts Cheatsheet" msgstr "" #: src/MainWindow.vala:651 msgid "Properties" msgstr "Propriedades" #: src/MainWindow.vala:666 src/StyleInspector.vala:48 msgid "Current" msgstr "" #: src/MainWindow.vala:667 msgid "Style" msgstr "" #: src/MainWindow.vala:668 msgid "Map" msgstr "" #: src/MainWindow.vala:732 msgid "Save current unnamed document?" msgstr "" #: src/MainWindow.vala:733 msgid "Changes will be permanently lost if not saved." msgstr "" #: src/MainWindow.vala:738 msgid "Discard Changes" msgstr "Descartar Mudanças" #: src/MainWindow.vala:744 src/MainWindow.vala:887 msgid "Save" msgstr "Salvar" #: src/MainWindow.vala:785 msgid "Open" msgstr "Abrir" #: src/MainWindow.vala:804 src/MainWindow.vala:1204 msgid "PlainText" msgstr "" #: src/MainWindow.vala:887 msgid "Save File" msgstr "Salvar Arquivo" #: src/MainWindow.vala:1131 msgid "Export As" msgstr "" #: src/MainWindow.vala:1136 msgid "BMP" msgstr "" #: src/MainWindow.vala:1142 msgid "CSV" msgstr "" #: src/MainWindow.vala:1148 msgid "Freemind" msgstr "" #: src/MainWindow.vala:1154 msgid "Freeplane" msgstr "" #: src/MainWindow.vala:1160 msgid "JPEG" msgstr "" #: src/MainWindow.vala:1167 msgid "Markdown" msgstr "" #: src/MainWindow.vala:1174 msgid "Mermaid" msgstr "" #: src/MainWindow.vala:1180 msgid "OPML" msgstr "" #: src/MainWindow.vala:1186 msgid "PDF" msgstr "" #: src/MainWindow.vala:1192 msgid "PNG (Transparent)" msgstr "" #: src/MainWindow.vala:1198 msgid "PNG (Opaque)" msgstr "" #: src/MainWindow.vala:1210 msgid "SVG" msgstr "" #: src/MainWindow.vala:1216 msgid "yEd" msgstr "" #: src/MapInspector.vala:77 #, fuzzy msgid "Enable animations" msgstr "Habilitar Animações" #: src/MapInspector.vala:105 #, fuzzy msgid "Hide connections" msgstr "Buscar Nós" #: src/MapInspector.vala:138 #, fuzzy msgid "Node Layouts" msgstr "Layout dos Nós" #: src/MapInspector.vala:189 #, fuzzy msgid "Themes" msgstr "Temas" #: src/MapInspector.vala:207 msgid "Add Custom Theme" msgstr "" #: src/MapInspector.vala:226 msgid "Balance Nodes" msgstr "Balancear Nós" #: src/MapInspector.vala:232 msgid "Fold Completed Tasks" msgstr "" #: src/MapInspector.vala:238 msgid "Unfold All Nodes" msgstr "" #: src/MapInspector.vala:322 msgid "Unsaved" msgstr "" #: src/Node.vala:1464 #, fuzzy msgid "Node Title" msgstr "Títulos" #: src/Node.vala:1467 #, fuzzy msgid "Node Note" msgstr "Adicionar Nota" #: src/NodeInspector.vala:92 #, fuzzy msgid "Title" msgstr "Títulos" #: src/NodeInspector.vala:119 #, fuzzy msgid "Task" msgstr "Tarefas" #: src/NodeInspector.vala:138 msgid "Fold" msgstr "" #: src/NodeInspector.vala:160 #, fuzzy msgid "Link Color" msgstr "Cor do Link" #: src/NodeInspector.vala:182 #, fuzzy msgid "Note" msgstr "Notas" #: src/NodeInspector.vala:210 msgid "Image" msgstr "" #: src/NodeInspector.vala:215 msgid "Add Image…" msgstr "" #: src/NodeInspector.vala:222 msgid "Edit Image" msgstr "" #: src/NodeInspector.vala:335 msgid "Copy Node To Clipboard" msgstr "Copiar Nó Para a Ãrea de Transferência" #: src/NodeInspector.vala:339 msgid "Cut Node To Clipboard" msgstr "Recortar Nó Para a Ãrea de Transferência" #: src/NodeInspector.vala:344 msgid "Detach Node" msgstr "Desanexar Nó" #: src/NodeInspector.vala:349 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:158 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:165 msgid "Delete Node" msgstr "Deletar Nó" #: src/StyleInspector.vala:47 msgid "All" msgstr "" #: src/StyleInspector.vala:49 msgid "Current Tree" msgstr "" #: src/StyleInspector.vala:50 msgid "Current Node + Descendants" msgstr "" #: src/StyleInspector.vala:51 msgid "Root Nodes" msgstr "" #: src/StyleInspector.vala:52 msgid "Level 1 Nodes" msgstr "" #: src/StyleInspector.vala:53 msgid "Level 2 Nodes" msgstr "" #: src/StyleInspector.vala:54 msgid "Level 3 Nodes" msgstr "" #: src/StyleInspector.vala:55 msgid "Level 4 Nodes" msgstr "" #: src/StyleInspector.vala:56 msgid "Level 5 Nodes" msgstr "" #: src/StyleInspector.vala:57 msgid "Level 6 Nodes" msgstr "" #: src/StyleInspector.vala:58 msgid "Level 7 Nodes" msgstr "" #: src/StyleInspector.vala:59 msgid "Level 8 Nodes" msgstr "" #: src/StyleInspector.vala:60 msgid "Level 9 Nodes" msgstr "" #: src/StyleInspector.vala:163 msgid "Changes affect:" msgstr "" #: src/StyleInspector.vala:209 msgid "Branch Options" msgstr "" #: src/StyleInspector.vala:238 msgid "Branch Style" msgstr "" #: src/StyleInspector.vala:289 msgid "Link Options" msgstr "" #: src/StyleInspector.vala:322 src/StyleInspector.vala:767 msgid "Line Dash" msgstr "" #: src/StyleInspector.vala:361 src/StyleInspector.vala:844 msgid "Line Width" msgstr "" #: src/StyleInspector.vala:407 msgid "Link Arrow" msgstr "" #: src/StyleInspector.vala:437 msgid "Node Options" msgstr "" #: src/StyleInspector.vala:476 msgid "Border Style" msgstr "" #: src/StyleInspector.vala:525 msgid "Border Width" msgstr "" #: src/StyleInspector.vala:570 msgid "Fill With Link Color" msgstr "" #: src/StyleInspector.vala:599 msgid "Margin" msgstr "" #: src/StyleInspector.vala:640 src/StyleInspector.vala:892 msgid "Padding" msgstr "" #: src/StyleInspector.vala:679 src/StyleInspector.vala:931 msgid "Font" msgstr "" #: src/StyleInspector.vala:700 msgid "Enable Markup" msgstr "" #: src/StyleInspector.vala:730 #, fuzzy msgid "Connection Options" msgstr "Buscar Nós" #: src/StyleInspector.vala:806 msgid "Arrows" msgstr "" #: src/EmptyInspector.vala:30 #, fuzzy msgid "" "Select a node or connection\n" "to view/edit information" msgstr "Selecionar um nó para visualizar/editar informação" #: src/styles/LinkTypeCurved.vala:34 msgid "Curved" msgstr "" #: src/styles/LinkTypeSquared.vala:34 msgid "Squared" msgstr "" #: src/styles/LinkTypeStraight.vala:34 msgid "Straight" msgstr "" #: src/styles/NodeBorderBracket.vala:34 msgid "Square Bracket" msgstr "" #: src/styles/NodeBorderNone.vala:34 msgid "None" msgstr "" #: src/styles/NodeBorderPill.vala:34 msgid "Pill-shaped" msgstr "" #: src/styles/NodeBorderRounded.vala:34 msgid "Rounded Rectangle" msgstr "" #: src/styles/NodeBorderSquared.vala:34 msgid "Squared Off" msgstr "" #: src/styles/NodeBorderUnderlined.vala:34 msgid "Underlined" msgstr "" #: src/themes/ThemeSolarizedLight.vala:30 msgid "Solarized Light" msgstr "" #: src/themes/ThemeDark.vala:27 msgid "Dark" msgstr "" #: src/themes/ThemeSolarizedDark.vala:30 msgid "Solarized Dark" msgstr "" #: src/undo_actions/UndoNodePaste.vala:34 msgid "paste node" msgstr "colar nó" #: src/undo_actions/UndoNodeMove.vala:34 msgid "move node" msgstr "mover nó" #: src/undo_actions/UndoNodeNote.vala:32 msgid "node note change" msgstr "" #: src/undo_actions/UndoNodeReveal.vala:32 msgid "node reveal" msgstr "" #: src/undo_actions/UndoNodeDelete.vala:33 msgid "delete node" msgstr "apagar nó" #: src/undo_actions/UndoNodeCut.vala:32 msgid "cut node" msgstr "recortar nó" #: src/undo_actions/UndoNodeResize.vala:32 msgid "node resize" msgstr "" #: src/undo_actions/UndoNodeInsert.vala:33 msgid "insert node" msgstr "inserir nó" #: src/undo_actions/UndoNodeTask.vala:34 msgid "node task change" msgstr "mudar tarefa do nó" #: src/undo_actions/UndoNodeAttach.vala:39 #: src/undo_actions/UndoNodeAttach.vala:54 msgid "attach node" msgstr "anexar nó" #: src/undo_actions/UndoNodeLinkColor.vala:33 msgid "link color change" msgstr "" #: src/undo_actions/UndoNodeLayout.vala:30 msgid "change layout" msgstr "" #: src/undo_actions/UndoNodeFold.vala:32 msgid "node change fold" msgstr "" #: src/undo_actions/UndoNodeBalance.vala:61 msgid "balance nodes" msgstr "balancear nós" #: src/undo_actions/UndoNodeImage.vala:32 msgid "node image change" msgstr "" #: src/undo_actions/UndoNodeDetach.vala:34 msgid "detach node" msgstr "desanexar nó" #: src/undo_actions/UndoNodeName.vala:32 msgid "node name change" msgstr "mudar nome do nó" #: src/UndoBuffer.vala:85 msgid "Undo " msgstr "Desfazer" #: src/UndoBuffer.vala:91 msgid "Redo " msgstr "Refazer" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:6 msgid "Minder Shortcuts" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:12 msgid "General" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:16 #, fuzzy msgid "File" msgstr "Novo Arquivo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:42 #, fuzzy msgid "Close File" msgstr "Novo Arquivo" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:51 #, fuzzy msgid "Undo/Redo" msgstr "Desfazer" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:55 #, fuzzy msgid "Undo Last Change" msgstr "mudar tarefa do nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:62 msgid "Redo Last Undo" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:71 #, fuzzy msgid "Zooming" msgstr "Zoom" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:89 #, fuzzy msgid "Zoom To Actual Size" msgstr "Zoom para o Tamanho Atual" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:98 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:428 msgid "Miscellaneous" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:102 msgid "Toggle Focus Mode" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:110 #, fuzzy msgid "Search Nodes/Connections" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:117 msgid "Quit Application" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:129 msgid "Node Commands" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:133 msgid "Creation/Deletion" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:137 msgid "New Sibling Node" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:144 #, fuzzy msgid "New Child Node" msgstr "Adicionar Nó Filho" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:151 msgid "Quick Entry" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:174 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:510 #, fuzzy msgid "Clipboard" msgstr "Recortar Nó Para a Ãrea de Transferência" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:178 #, fuzzy msgid "Copy Node" msgstr "Adicionar Nó Raiz" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:185 #, fuzzy msgid "Cut Node" msgstr "Adicionar Nó Raiz" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:192 msgid "Paste Node as Child" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:201 msgid "Changing Current" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:205 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:364 #, fuzzy msgid "Edit Title" msgstr "Títulos" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:212 #, fuzzy msgid "View Properties" msgstr "Propriedades" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:219 msgid "Toggle Fold" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:226 msgid "Toggle Task Done" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:233 #, fuzzy msgid "Toggle Node Link" msgstr "Remover Nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:240 #, fuzzy msgid "Create Connection" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:247 #, fuzzy msgid "Center In View" msgstr "Centralizar Nó Atual" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:254 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:378 msgid "Place Into View" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:261 msgid "Sort Child Nodes Alphabetically" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:270 #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:387 msgid "Traversal" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:274 #, fuzzy msgid "Select Root" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:281 #, fuzzy msgid "Select Parent" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:288 #, fuzzy msgid "Select Next Sibling" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:295 msgid "Select Previous Sibling" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:302 #, fuzzy msgid "Select Child" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:309 #, fuzzy msgid "Select Node Below" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:316 #, fuzzy msgid "Select Node Above" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:323 #, fuzzy msgid "Select Node To Right" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:330 #, fuzzy msgid "Select Node To Left" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:337 #, fuzzy msgid "Select Linked Node" msgstr "Adicionar Nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:344 #, fuzzy msgid "Select Attached Connection" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:356 #, fuzzy msgid "Connection Commands" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:360 #, fuzzy msgid "Change Current" msgstr "Centralizar Nó Atual" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:371 #, fuzzy msgid "Show Properties" msgstr "Propriedades" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:391 #, fuzzy msgid "Select Start Node" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:398 #, fuzzy msgid "Select End Node" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:405 #, fuzzy msgid "Select Next Connection" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:412 #, fuzzy msgid "Select Previous Connection" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:424 msgid "Text Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:432 msgid "Show Emoji Picker" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:439 msgid "End Editing" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:448 msgid "Cursor Movement" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:452 msgid "Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:459 msgid "Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:466 msgid "Next Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:473 msgid "Previous Word" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:480 msgid "Next Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:487 msgid "Previous Line" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:494 #, fuzzy msgid "Start Of Text" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:501 msgid "End Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:514 msgid "Copy Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:521 msgid "Cut Selected Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:528 #, fuzzy msgid "Paste Text" msgstr "Colar" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:537 #, fuzzy msgid "Selection" msgstr "Selecionar Nó" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:541 msgid "Add Next Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:548 msgid "Add Previous Character" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:555 #, fuzzy msgid "Add Next Word" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:562 #, fuzzy msgid "Add Previous Word" msgstr "Buscar Nós" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:569 #, fuzzy msgid "Add Next Line" msgstr "Adicionar Nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:576 #, fuzzy msgid "Add Previous Line" msgstr "Adicionar Nota" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:583 msgid "Add Start Of Text" msgstr "" #: /home/trevorw/projects/Minder/data/com.github.phase1geo.minder.shortcuts.ui:590 msgid "Add End Of Text" msgstr "" #, fuzzy #~ msgid "Unnamed" #~ msgstr "Documento sem Nome" #, fuzzy #~ msgid "Child" #~ msgstr "Primeiro Filho" #~ msgid "Parent" #~ msgstr "Pai" Minder-1.5.1/src/000077500000000000000000000000001356632107200135305ustar00rootroot00000000000000Minder-1.5.1/src/Animator.vala000066400000000000000000000067151356632107200161600ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class Animator : Object { private DrawArea _da; // Reference to canvas private Queue _actions; // Queue of animation actions to perform private const int _timeout = 20; // Number of milliseconds between frames (30 fps) private const double _frames = 10; // Number of frames to animate (note: set to 1 to disable animation) private bool _running = false; public bool enable { set; get; default = true; } /* Default constructor */ public Animator( DrawArea da ) { _da = da; _actions = new Queue(); _running = false; } /* Returns true if there is currently an animation in progress */ public bool is_running() { return( _running ); } /* Animates all of the nodes on the canvas */ public void add_nodes( string name ) { if( (_actions.length == 0) || (_actions.peek_tail().type() != AnimationType.NODES) ) { _actions.push_tail( new AnimatorNodes( _da, null, name ) ); } } /* Animates the specified node on the canvas */ public void add_node( Node n, string name ) { if( (_actions.length == 0) || (_actions.peek_tail().type() != AnimationType.NODE) ) { _actions.push_tail( new AnimatorNodes( _da, n, name ) ); } } /* Animates a change to the canvas scale */ public void add_scale( string name ) { if( (_actions.length == 0) || (_actions.peek_tail().type() != AnimationType.SCALE) ) { _actions.push_tail( new AnimatorScale( _da, name ) ); } } /* Animates a change to the canvas pan */ public void add_pan( string name ) { if( (_actions.length == 0) || (_actions.peek_tail().type() != AnimationType.PAN) ) { _actions.push_tail( new AnimatorPan( _da, name ) ); } } /* Animates a change to both the canvas scale and pan */ public void add_pan_scale( string name ) { if( (_actions.length == 0) || (_actions.peek_tail().type() != AnimationType.PANSCALE) ) { _actions.push_tail( new AnimatorPanScale( _da, name ) ); } } /* User method which performs the animation */ public void animate() { if( !enable ) { _da.changed(); _da.queue_draw(); return; } if( !_running ) { _running = true; Timeout.add( _timeout, animate_action ); } _actions.peek_tail().capture( _da ); _actions.peek_tail().adjust( _da ); } /* Perform the animation */ private bool animate_action() { _actions.peek_head().adjust( _da ); if( _actions.peek_head().done() ) { _actions.pop_head(); _da.changed(); } _da.queue_draw(); return( _running = (_actions.length > 0) ); } } Minder-1.5.1/src/Application.vala000066400000000000000000000123421356632107200166420ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using GLib; public class Minder : Granite.Application { private static bool show_version = false; private static string? open_file = null; private static bool new_file = false; private static bool testing = false; public static GLib.Settings settings; public static string version = "1.5.0"; public Minder () { Object( application_id: "com.github.phase1geo.minder", flags: ApplicationFlags.HANDLES_OPEN ); } protected override void activate() { /* Initialize the settings */ settings = new GLib.Settings( "com.github.phase1geo.minder" ); /* Add the application-specific icons */ weak IconTheme default_theme = IconTheme.get_default(); default_theme.add_resource_path( "/com/github/phase1geo/minder" ); /* Create the main window */ var appwin = new MainWindow( this, settings ); /* stdout.printf( "user_cache_dir: %s\n", GLib.Environment.get_user_cache_dir() ); stdout.printf( "user_config_dir: %s\n", GLib.Environment.get_user_config_dir() ); stdout.printf( "user_data_dir: %s\n", GLib.Environment.get_user_data_dir() ); stdout.printf( "user_runtime_dir: %s\n", GLib.Environment.get_user_runtime_dir() ); stdout.printf( "user_special_dir: %s\n", GLib.Environment.get_user_special_dir( UserDirectory.PUBLIC_SHARE ) ); stdout.printf( "current_dir: %s\n", GLib.Environment.get_current_dir() ); stdout.printf( "home_dir: %s\n", GLib.Environment.get_home_dir() ); */ /* If the user specified to open a specific filename from the command-line, attempt to open it. Display an error message and exit immediately if there is an error opening the file. */ if( open_file != null ) { if( !appwin.open_file( open_file ) ) { stdout.printf( "ERROR: Unable to open file '%s'\n", open_file ); Process.exit( 1 ); } /* If the user specified that a new file should be created or the saved tab state was not loadable, create a new map. */ } else if( new_file || !appwin.load_tab_state() ) { appwin.do_new_file(); } /* Handle any changes to the position of the window */ appwin.configure_event.connect(() => { int root_x, root_y; int size_w, size_h; appwin.get_position( out root_x, out root_y ); appwin.get_size( out size_w, out size_h ); settings.set_int( "window-x", root_x ); settings.set_int( "window-y", root_y ); settings.set_int( "window-w", size_w ); settings.set_int( "window-h", size_h ); return( false ); }); /* Run the main loop */ Gtk.main(); } /* Parse the command-line arguments */ private void parse_arguments( ref unowned string[] args ) { var context = new OptionContext( "- Minder Options" ); var options = new OptionEntry[5]; /* Create the command-line options */ options[0] = {"version", 0, 0, OptionArg.NONE, ref show_version, "Display version number", null}; options[1] = {"open", 'o', 0, OptionArg.FILENAME, ref open_file, "Open filename", "FILENAME"}; options[2] = {"new", 'n', 0, OptionArg.NONE, ref new_file, "Starts Minder with a new file", null}; options[3] = {"run-tests", 0, 0, OptionArg.NONE, ref testing, "Run testing", null}; options[4] = {null}; /* Parse the arguments */ try { context.set_help_enabled( true ); context.add_main_entries( options, null ); context.parse( ref args ); } catch( OptionError e ) { stdout.printf( "ERROR: %s\n", e.message ); stdout.printf( "Run '%s --help' to see valid options\n", args[0] ); Process.exit( 1 ); } /* If the version was specified, output it and then exit */ if( show_version ) { stdout.printf( version + "\n" ); Process.exit( 0 ); } /* If we see files on the command-line */ if( args.length >= 2 ) { open_file = args[1]; } } protected override void open( File[] files, string hint ) { activate(); } /* Main routine which gets everything started */ public static int main( string[] args ) { var app = new Minder(); app.parse_arguments( ref args ); if( testing ) { Gtk.init( ref args ); var testing = new App.Tests.Testing( args ); Idle.add(() => { testing.run(); Gtk.main_quit(); return( false ); }); Gtk.main(); return( 0 ); } else { return( app.run( args ) ); } } } Minder-1.5.1/src/Bezier.vala000066400000000000000000000212231356632107200156150ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib.Math; public class Bezier { private class Point { public double x { set; get; default = 0; } public double y { set; get; default = 0; } public Point() {} public Point.with_coordinate( double a, double b ) { x = a; y = b; } public void set_coordinate( double a, double b ) { x = a; y = b; } } private Array _points = new Array(); private Array _apoints = new Array(); private Point _from = new Point(); private Point _to = new Point(); /* Default constructor */ public Bezier() { for( int i=0; i<3; i++ ) { _points.append_val( new Point() ); _apoints.append_val( new Point() ); } } /* Default constructor */ public Bezier.with_endpoints( double x0, double y0, double x1, double y1 ) { for( int i=0; i<3; i++ ) { _points.append_val( new Point() ); _apoints.append_val( new Point() ); } _points.index( 0 ).set_coordinate( x0, y0 ); _points.index( 1 ).set_coordinate( ((x0 + x1) * 0.5), ((y0 + y1) * 0.5) ); _points.index( 2 ).set_coordinate( x1, y1 ); } /* Copies to this curve from the given curve */ public void copy( Bezier b ) { for( int i=0; i<3; i++ ) { _points.index( i ).set_coordinate( b._points.index( i ).x, b._points.index( i ).y ); _apoints.index( i ).set_coordinate( b._apoints.index( i ).x, b._apoints.index( i ).y ); } _from.set_coordinate( b._from.x, b._from.y ); _to.set_coordinate( b._to.x, b._to.y ); } /* Returns the point at the given index */ public void get_point( int pindex, out double x, out double y ) { x = _points.index( pindex ).x; y = _points.index( pindex ).y; } public void get_from_point( out double x, out double y ) { x = _from.x; y = _from.y; } public void get_to_point( out double x, out double y ) { x = _to.x; y = _to.y; } /* Update the given point */ public void set_point( int pindex, double x, double y ) { _points.index( pindex ).set_coordinate( x, y ); } public void update_control_from_drag_handle( double x, double y ) { var cx = x - (((_points.index( 0 ).x + _points.index( 2 ).x) * 0.5) - x); var cy = y - (((_points.index( 0 ).y + _points.index( 2 ).y) * 0.5) - y); set_point( 1, cx, cy ); } /* Returns true if the given t value is within its valid range */ private bool is_t_within_range( double t ) { return( (0 <= t) && (t <= 1) ); } /* Aligns the given point, returning a newly allocated one */ private void align_point( int pindex, double a, double tx, double ty ) { double x = (_points.index( pindex ).x - tx) * cos( a ) - (_points.index( pindex ).y - ty) * sin( a ); double y = (_points.index( pindex ).x - tx) * sin( a ) + (_points.index( pindex ).y - ty) * cos( a ); _apoints.index( pindex ).set_coordinate( x, y ); } /* Rotates the curve with the given line to get them into alignment for easier calculations */ private void align( double lx0, double ly0, double lx1, double ly1 ) { var tx = lx0; var ty = ly0; var a = -atan2( (ly1 - ty), (lx1 - tx) ); for( int i=0; i<3; i++ ) { align_point( i, a, tx, ty ); } } /* Calculates the roots for the given quadratic curve */ private void get_roots( double axis, bool axis_is_x, ref Array roots ) { double lx0 = axis_is_x ? axis : 0; double ly0 = axis_is_x ? 0 : axis; double lx1 = axis_is_x ? axis : 1000000; double ly1 = axis_is_x ? 1000000 : axis; align( lx0, ly0, lx1, ly1 ); double a = _apoints.index( 0 ).y; double b = _apoints.index( 1 ).y; double c = _apoints.index( 2 ).y; double d = a - 2 * b + c; if( d != 0 ) { var m1 = -sqrt( b * b - a * c ); var m2 = -a + b; var v1 = -(m1 + m2) / d; var v2 = -(-m1 + m2) / d; if( is_t_within_range( v1 ) ) roots.append_val( v1 ); if( is_t_within_range( v2 ) ) roots.append_val( v2 ); } else if( b != c ) { var v = ((2 * b) - c) / (2 * (b - c)); if( is_t_within_range( v ) ) roots.append_val( v ); } } private double get_axis( double t, bool axis_is_x ) { double mt = (1 - t); double mt2 = mt * mt; double t2 = t * t; double a = mt2; double b = mt * t * 2; double c = t2; double axis = a * (axis_is_x ? _points.index( 0 ).y : _points.index( 0 ).x) + b * (axis_is_x ? _points.index( 1 ).y : _points.index( 1 ).x) + c * (axis_is_x ? _points.index( 2 ).y : _points.index( 2 ).x); return( axis ); } /* Returns true if the given point is within close proximity to this curve */ public bool within_range( double x, double y ) { Array roots = new Array(); double tolerance = 10; /* Let's start by looking at the X axis */ get_roots( x, true, ref roots ); if( roots.length > 0 ) { for( int i=0; i roots = new Array(); get_roots( axis, axis_is_x, ref roots ); switch( roots.length ) { case 0 : return( null ); case 1 : return( get_axis( roots.index( 0 ), axis_is_x ) ); default : if( from ) { double max = 1000000; for( int i=0; i min ) { min = roots.index( i ); } } return( get_axis( min, axis_is_x ) ); } } } /* Given the bounds of a box, calculate the connection point to the box and store it locally */ public void set_connect_point( bool from, double top, double bottom, double left, double right ) { double? isect; /* Check the top of the node */ isect = get_intersecting_point( top, false, from ); if( (isect != null) && (left <= isect) && (isect <= right) ) { if( from ) { _from.set_coordinate( isect, top ); } else { _to.set_coordinate( isect, top ); } return; } /* Check the bottom of the node */ isect = get_intersecting_point( bottom, false, from ); if( (isect != null) && (left <= isect) && (isect <= right) ) { if( from ) { _from.set_coordinate( isect, bottom ); } else { _to.set_coordinate( isect, bottom ); } return; } /* Check the left side of the node */ isect = get_intersecting_point( left, true, from ); if( (isect != null) && (top <= isect) && (isect <= bottom) ) { if( from ) { _from.set_coordinate( left, isect ); } else { _to.set_coordinate( left, isect ); } return; } /* Check the right side of the node */ isect = get_intersecting_point( right, true, from ); if( (isect != null) && (top <= isect) && (isect <= bottom) ) { if( from ) { _from.set_coordinate( right, isect ); } else { _to.set_coordinate( right, isect ); } return; } if( from ) { _from.set_coordinate( _points.index( 0 ).x, _points.index( 0 ).y ); } else { _to.set_coordinate( _points.index( 2 ).x, _points.index( 2 ).y ); } } } Minder-1.5.1/src/CanvasText.vala000066400000000000000000000407651356632107200164710ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using GLib; using Gdk; using Cairo; using Pango; public class CanvasText : Object { /* Member variables */ private string _text = ""; private bool _markup = true; private bool _edit = false; private int _cursor = 0; /* Location of the cursor when editing */ private int _column = 0; /* Character column to use when moving vertically */ private Pango.Layout _pango_layout = null; private int _selstart = 0; private int _selend = 0; private int _selanchor = 0; private double _max_width = 200; private double _width = 0; private double _height = 0; /* Signals */ public signal void resized(); /* Properties */ public string text { get { return( _text ); } set { if( _text != value ) { _text = value; update_size( true ); } } } public double posx { get; set; default = 0; } public double posy { get; set; default = 0; } public double width { get { return( _width ); } } public double height { get { return( _height ); } } public bool markup { get { return( _markup ); } set { if( _markup != value ) { _markup = value; update_size( true ); } } } public bool edit { get { return( _edit ); } set { if( _edit != value ) { _edit = value; update_size( true ); } } } /* Default constructor */ public CanvasText( DrawArea da, double max_width ) { _max_width = max_width; _pango_layout = da.create_pango_layout( null ); _pango_layout.set_wrap( Pango.WrapMode.WORD_CHAR ); _pango_layout.set_width( (int)_max_width * Pango.SCALE ); update_size( false ); } /* Constructor initializing string */ public CanvasText.with_text( DrawArea da, double max_width, string txt ) { _max_width = max_width; _pango_layout = da.create_pango_layout( txt ); _pango_layout.set_wrap( Pango.WrapMode.WORD_CHAR ); _pango_layout.set_width( (int)_max_width * Pango.SCALE ); _text = txt; update_size( false ); } /* Copies an existing CanvasText to this CanvasText */ public void copy( CanvasText ct ) { posx = ct.posx; posy = ct.posy; _max_width = ct._max_width; _text = ct.text; _pango_layout.set_font_description( ct._pango_layout.get_font_description() ); _pango_layout.set_width( (int)_max_width * Pango.SCALE ); update_size( true ); } /* Returns the maximum width allowed for this node */ public int max_width() { return( (int)_max_width ); } /* Sets the font description to the given value */ public void set_font( FontDescription font ) { _pango_layout.set_font_description( font ); update_size( true ); } /* Returns true if the text is currently wrapped */ public bool is_wrapped() { return( _pango_layout.is_wrapped() ); } /* Returns the string which contains newlines to mimic layout */ public string get_wrapped_text() { unowned SList lines = _pango_layout.get_lines_readonly(); string str = ""; lines.@foreach((item) => { str += (text.substring( item.start_index, item.length ) + "\n"); }); return( str ); } /* Returns true if the given cursor coordinates lies within this node */ public bool is_within( double x, double y ) { return( Utils.is_within_bounds( x, y, posx, posy, _width, _height ) ); } /* Loads the file contents into this instance */ public virtual void load( Xml.Node* n ) { string? x = n->get_prop( "posx" ); if( x != null ) { posx = double.parse( x ); } string? y = n->get_prop( "posy" ); if( y != null ) { posy = double.parse( y ); } string? mw = n->get_prop( "maxwidth" ); if( mw != null ) { _max_width = double.parse( mw ); _pango_layout.set_width( (int)_max_width * Pango.SCALE ); } if( (n->children != null) && (n->children->type == Xml.ElementType.TEXT_NODE) ) { text = n->children->get_content(); } } /* Removes <, > and & characters */ private string unmarkup( string markup ) { return( markup.replace( "&", "&" ).replace( "<", "<" ).replace( ">", ">" ) ); } /* Generates the marked up name that will be displayed in the node */ private string name_markup( Theme? theme ) { if( (_selstart != _selend) && (theme != null) ) { var fg = Utils.color_from_rgba( theme.get_color( "textsel_foreground" ) ); var bg = Utils.color_from_rgba( theme.get_color( "textsel_background" ) ); var spos = text.index_of_nth_char( _selstart ); var epos = text.index_of_nth_char( _selend ); var begtext = unmarkup( text.slice( 0, spos ) ); var endtext = unmarkup( text.slice( epos, text.char_count() ) ); var seltext = "" + unmarkup( text.slice( spos, epos ) ) + ""; return( begtext + seltext + endtext ); } return( (markup || edit) ? text : unmarkup( text ) ); } /* Updates the width and height based on the current text. */ public void update_size( bool call_resized ) { if( _pango_layout != null ) { int text_width, text_height; _pango_layout.set_markup( name_markup( null ), -1 ); _pango_layout.get_size( out text_width, out text_height ); _width = (text_width / Pango.SCALE); _height = (text_height / Pango.SCALE); if( call_resized ) { resized(); } } } /* Resizes the node width by the given amount */ public virtual void resize( double diff ) { _max_width += diff; _pango_layout.set_width( (int)_max_width * Pango.SCALE ); update_size( true ); } /* Updates the column value */ private void update_column() { int line; var cpos = text.index_of_nth_char( _cursor ); _pango_layout.index_to_line_x( cpos, false, out line, out _column ); } /* Sets the cursor from the given mouse coordinates */ public void set_cursor_at_char( double x, double y, bool motion ) { int cursor, trailing; int adjusted_x = (int)(x - posx) * Pango.SCALE; int adjusted_y = (int)(y - posy) * Pango.SCALE; if( _pango_layout.xy_to_index( adjusted_x, adjusted_y, out cursor, out trailing ) ) { var cindex = text.char_count( cursor + trailing ); if( motion ) { if( cindex > _selanchor ) { _selend = cindex; } else if( cindex < _selanchor ) { _selstart = cindex; } else { _selstart = cindex; _selend = cindex; } } else { _selstart = cindex; _selend = cindex; _selanchor = cindex; } _cursor = _selend; update_column(); } } /* Selects the word at the current x/y position in the text */ public void set_cursor_at_word( double x, double y, bool motion ) { int cursor, trailing; int adjusted_x = (int)(x - posx) * Pango.SCALE; int adjusted_y = (int)(y - posy) * Pango.SCALE; if( _pango_layout.xy_to_index( adjusted_x, adjusted_y, out cursor, out trailing ) ) { cursor += trailing; var word_start = text.substring( 0, cursor ).last_index_of( " " ); var word_end = text.index_of( " ", cursor ); if( word_start == -1 ) { _selstart = 0; } else { var windex = text.char_count( word_start ); if( !motion || (windex < _selanchor) ) { _selstart = windex + 1; } } if( word_end == -1 ) { _selend = text.char_count(); } else { var windex = text.char_count( word_end ); if( !motion || (windex > _selanchor) ) { _selend = windex; } } _cursor = _selend; update_column(); } } /* Called after the cursor has been moved, clears the selection */ public void clear_selection() { _selstart = _selend = _cursor; } /* Called after the cursor has been moved, adjusts the selection to include the cursor. */ private void adjust_selection( int last_cursor ) { if( last_cursor == _selstart ) { if( _cursor <= _selend ) { _selstart = _cursor; } else { _selend = _cursor; } } else { if( _cursor >= _selstart ) { _selend = _cursor; } else { _selstart = _cursor; } } } /* Deselects all of the text */ public void set_cursor_none() { clear_selection(); } /* Selects all of the text and places the cursor at the end of the name string */ public void set_cursor_all( bool motion ) { if( !motion ) { _selstart = 0; _selend = text.char_count(); _selanchor = _selend; _cursor = _selend; } } /* Adjusts the cursor by the given amount of characters */ private void cursor_by_char( int dir ) { var last = text.char_count(); _cursor += dir; if( _cursor < 0 ) { _cursor = 0; } else if( _cursor > last ) { _cursor = last; } update_column(); } /* Move the cursor in the given direction */ public void move_cursor( int dir ) { cursor_by_char( dir ); clear_selection(); } /* Adjusts the selection by the given cursor */ public void selection_by_char( int dir ) { var last_cursor = _cursor; cursor_by_char( dir ); adjust_selection( last_cursor ); } /* Moves the cursor up/down the text by a line */ private void cursor_by_line( int dir ) { int line, x; var cpos = text.index_of_nth_char( _cursor ); _pango_layout.index_to_line_x( cpos, false, out line, out x ); line += dir; if( line < 0 ) { _cursor = 0; } else if( line >= _pango_layout.get_line_count() ) { _cursor = text.char_count(); } else { int index, trailing; var line_layout = _pango_layout.get_line( line ); line_layout.x_to_index( _column, out index, out trailing ); _cursor = text.char_count( index + trailing ); } } /* Moves the cursor in the given vertical direction, clearing the selection. */ public void move_cursor_vertically( int dir ) { cursor_by_line( dir ); clear_selection(); } /* Adjusts the selection in the vertical direction */ public void selection_vertically( int dir ) { var last_cursor = _cursor; cursor_by_line( dir ); adjust_selection( last_cursor ); } /* Moves the cursor to the beginning of the name */ public void move_cursor_to_start() { _cursor = 0; clear_selection(); } /* Moves the cursor to the end of the name */ public void move_cursor_to_end() { _cursor = text.char_count(); clear_selection(); } /* Causes the selection to continue from the start of the text */ public void selection_to_start() { if( _selstart == _selend ) { _selstart = 0; _selend = _cursor; _cursor = 0; } else { _selstart = 0; _cursor = 0; } } /* Causes the selection to continue to the end of the text */ public void selection_to_end() { if( _selstart == _selend ) { _selstart = _cursor; _selend = text.char_count(); _cursor = text.char_count(); } else { _selend = text.char_count(); _cursor = text.char_count(); } } /* Finds the next/previous word boundary */ private int find_word( int start, int dir ) { bool alnum_found = false; if( dir == 1 ) { for( int i=start; i=0; i-- ) { int index = text.index_of_nth_char( i ); if( text.get_char( index ).isalnum() ) { alnum_found = true; } else if( alnum_found ) { return( i + 1 ); } } return( 0 ); } } /* Moves the cursor to the next or previous word beginning */ public void move_cursor_by_word( int dir ) { _cursor = find_word( _cursor, dir ); _selend = _selstart; } /* Change the selection by a word in the given direction */ public void selection_by_word( int dir ) { if( _cursor == _selstart ) { _cursor = find_word( _cursor, dir ); if( _cursor <= _selend ) { _selstart = _cursor; } else { _selstart = _selend; _selend = _cursor; } } else { _cursor = find_word( _cursor, dir ); if( _cursor >= _selstart ) { _selend = _cursor; } else { _selend = _selstart; _selstart = _cursor; } } } /* Handles a backspace key event */ public void backspace() { if( _cursor > 0 ) { if( _selstart != _selend ) { var spos = text.index_of_nth_char( _selstart ); var epos = text.index_of_nth_char( _selend ); text = text.splice( spos, epos ); _cursor = _selstart; _selend = _selstart; } else { var spos = text.index_of_nth_char( _cursor - 1 ); var epos = text.index_of_nth_char( _cursor ); text = text.splice( spos, epos ); _cursor--; } } } /* Handles a delete key event */ public void delete() { if( _cursor < text.length ) { if( _selstart != _selend ) { var spos = text.index_of_nth_char( _selstart ); var epos = text.index_of_nth_char( _selend ); text = text.splice( spos, epos ); _cursor = _selstart; _selend = _selstart; } else { var spos = text.index_of_nth_char( _cursor ); var epos = text.index_of_nth_char( _cursor + 1 ); text = text.splice( spos, epos ); } } } /* Inserts the given string at the current cursor position and adjusts cursor */ public void insert( string s ) { var slen = s.char_count(); if( _selstart != _selend ) { var spos = text.index_of_nth_char( _selstart ); var epos = text.index_of_nth_char( _selend ); text = text.splice( spos, epos, s ); _cursor = _selstart + slen; _selend = _selstart; } else { var cpos = text.index_of_nth_char( _cursor ); text = text.splice( cpos, cpos, s ); _cursor += slen; } } /* Returns the currently selected text or, if no text is currently selected, returns null. */ public string? get_selected_text() { if( _selstart != _selend ) { var spos = text.index_of_nth_char( _selstart ); var epos = text.index_of_nth_char( _selend ); return( text.slice( spos, epos ) ); } return( null ); } /* Returns the current cursor position */ public void get_cursor_pos( out int x, out int ytop, out int ybot ) { var index = text.index_of_nth_char( _cursor ); var rect = _pango_layout.index_to_pos( index ); x = (int)(posx + (rect.x / Pango.SCALE)); ytop = (int)(posy + (rect.y / Pango.SCALE)); ybot = ytop + (int)(rect.height / Pango.SCALE); } /* Draws the node font to the screen */ public void draw( Cairo.Context ctx, Theme theme, RGBA fg, double alpha ) { /* Make sure the the size is up-to-date */ _pango_layout.set_markup( name_markup( theme ), -1 ); /* Output the text */ ctx.move_to( posx, posy ); Utils.set_context_color_with_alpha( ctx, fg, alpha ); Pango.cairo_show_layout( ctx, _pango_layout ); ctx.new_path(); /* Draw the insertion cursor if we are in the 'editable' state */ if( edit ) { var cpos = text.index_of_nth_char( _cursor ); var rect = _pango_layout.index_to_pos( cpos ); Utils.set_context_color_with_alpha( ctx, theme.get_color( "text_cursor" ), alpha ); double ix, iy; ix = posx + (rect.x / Pango.SCALE) - 1; iy = posy + (rect.y / Pango.SCALE); ctx.rectangle( ix, iy, 1, (rect.height / Pango.SCALE) ); ctx.fill(); } } } Minder-1.5.1/src/Connection.vala000066400000000000000000000613501356632107200165010ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; using Pango; using Gdk; using GLib.Math; using Gee; /* Connection mode value for the Connection.mode property */ public enum ConnMode { NONE = 0, // Normally drawn mode LINKING, // Indicates that the connection is being used to create a node link CONNECTING, // Indicates that the connection is being made between two nodes SELECTED, // Indicates that the connection is currently selected ADJUSTING, // Indicates that we are moving the drag handle to change the line shape EDITABLE // Indicates that the connection title is in edit mode } public class Connection : Object { private int RADIUS = 6; private ConnMode _mode = ConnMode.NONE; private Node? _from_node = null; private Node? _to_node = null; private double _posx; private double _posy; private double _dragx; private double _dragy; private Style _style = new Style(); private Bezier _curve; private CanvasText? _title = null; private string _note = ""; private double _max_width = 100; public CanvasText? title { get { return( _title ); } } public string note { get { return( _note ); } set { bool was_empty = (_note.length == 0); _note = value; if( was_empty != (_note.length == 0) ) { position_title(); } } } public ConnMode mode { get { return( _mode ); } set { if( _mode != value ) { _mode = value; if( _mode == ConnMode.EDITABLE ) { if( _title != null ) { _title.edit = true; _title.set_cursor_all( false ); } } else { if( _title != null ) { _title.edit = false; _title.clear_selection(); } } } } } public Node? from_node { get { return( _from_node ); } set { _from_node = value; } } public Node? to_node { get { return( _to_node ); } set { _to_node = value; } } public Style style { get { return( _style ); } set { if( _style.copy( value ) && (_title != null) ) { _title.set_font( _style.connection_font ); position_title(); } } } public double alpha { get; set; default=1.0; } public RGBA color { get; set; } /* Default constructor */ public Connection( DrawArea da, Node from_node ) { double x, y, w, h; from_node.bbox( out x, out y, out w, out h ); _posx = x + (w / 2); _posy = y + (h / 2); _from_node = from_node; connect_node( _from_node ); _dragx = _posx; _dragy = _posy; position_title(); _curve = new Bezier.with_endpoints( _posx, _posy, _posx, _posy ); _color = da.get_theme().get_color( "connection" ); style = StyleInspector.styles.get_global_style(); } /* Constructs a connection based on another connection */ public Connection.from_connection( DrawArea da, Connection conn ) { _curve = new Bezier(); copy( da, conn ); } /* Constructor from XML data */ public Connection.from_xml( DrawArea da, Xml.Node* n, Array nodes, HashMap id_map ) { style = StyleInspector.styles.get_global_style(); load( da, n, nodes, id_map ); } /* Copies the given connection to this instance */ public void copy( DrawArea da, Connection conn ) { _from_node = conn._from_node; _to_node = conn._to_node; _dragx = conn._dragx; _dragy = conn._dragy; position_title(); _curve.copy( conn._curve ); if( conn.title == null ) { if( _title != null ) { _title.resized.disconnect( position_title ); } _title = null; } else { if( title == null ) { _title = new CanvasText( da, _max_width ); _title.resized.connect( position_title ); } _title.copy( conn.title ); } mode = conn.mode; style = conn.style; color = conn.color; } /* Returns the canvas box that contains both the from and to nodes */ public void bbox( out double x, out double y, out double w, out double h ) { double fx, fy, fw, fh; double tx, ty, tw, th; if( (_from_node != null) && (_to_node != null) ) { _from_node.bbox( out fx, out fy, out fw, out fh ); _to_node.bbox( out tx, out ty, out tw, out th ); x = (fx < tx) ? fx : tx; y = (fy < ty) ? fy : ty; w = ((fx + fw) > (tx + tw)) ? ((fx + fw) - x) : ((tx + tw) - x); h = ((fy + fh) > (ty + th)) ? ((fy + fh) - y) : ((ty + th) - y); } else if( _from_node != null ) { _from_node.bbox( out x, out y, out w, out h ); } else if( _to_node != null ) { _to_node.bbox( out x, out y, out w, out h ); } else { x = 0; y = 0; w = 0; h = 0; } } /* Makes sure that the title is ready to be edited */ public void edit_title_begin( DrawArea da ) { if( _title != null ) return; _title = new CanvasText.with_text( da, _max_width, "" ); _title.resized.connect( position_title ); _title.set_font( style.connection_font ); position_title(); } /* Called when the title text is done being edited */ public void edit_title_end() { if( (_title == null) || (_title.text != "") ) return; _title.resized.disconnect( position_title ); _title = null; } /* Adds a title */ public void change_title( DrawArea da, string title, bool allow_empty = false ) { if( (title == "") && !allow_empty ) { if( _title != null ) { _title.resized.disconnect( position_title ); } _title = null; } else if( _title == null ) { _title = new CanvasText.with_text( da, _max_width, title ); _title.resized.connect( position_title ); _title.set_font( style.connection_font ); position_title(); } else { _title.text = title; } } /* Positions the given title according to the location of the _dragx and _dragy values */ private void position_title() { if( title != null ) { var width = title.width + ((note.length > 0) ? (style.connection_padding + 11) : 0); var height = (title.height < 11) ? 11 : title.height; _title.posx = _dragx - (width / 2); _title.posy = _dragy - (height / 2); } } /* Connects to the given node */ public void connect_node( Node node ) { node.moved.connect( this.end_moved ); node.resized.connect( this.end_resized ); } /* Disconnects from the given node */ public void disconnect_node( Node node ) { node.moved.disconnect( this.end_moved ); node.resized.disconnect( this.end_resized ); if( node.last_selected_connection == this ) { node.last_selected_connection = null; } } /* Completes the connection */ public void connect_to( Node node ) { double fx, fy, tx, ty; double x, y, w, h; node.bbox( out x, out y, out w, out h ); if( _from_node == null ) { _from_node = node; } else { _to_node = node; } connect_node( node ); _curve.set_point( ((_from_node == node) ? 0 : 2), (x + (w / 2)), (y + (h / 2)) ); _curve.get_point( 0, out fx, out fy ); _curve.get_point( 2, out tx, out ty ); _dragx = (fx + tx) / 2; _dragy = (fy + ty) / 2; position_title(); _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( node ); } /* Called when disconnecting a connection from a node */ public void disconnect_from_node( bool from ) { if( from ) { _curve.get_from_point( out _posx, out _posy ); disconnect_node( _from_node ); _from_node = null; } else { _curve.get_to_point( out _posx, out _posy ); disconnect_node( _to_node ); _to_node = null; } mode = ConnMode.CONNECTING; } /* Draws the connections to the given point */ public void draw_to( double x, double y ) { double nx, ny; Node node = (_from_node != null) ? _from_node : _to_node; _posx = x; _posy = y; _curve.get_point( ((node == _from_node) ? 0 : 2), out nx, out ny ); _dragx = (nx + x) / 2; _dragy = (ny + y) / 2; position_title(); _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( node ); } /* Handles any position changes of either the to or from node */ private void end_moved( Node node, double diffx, double diffy ) { double x, y, w, h; node.bbox( out x, out y, out w, out h ); _curve.set_point( ((_from_node == node) ? 0 : 2), (x + (w / 2)), (y + (h / 2)) ); _dragx += (diffx / 2); _dragy += (diffy / 2); position_title(); _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( _from_node ); if( _to_node != null ) { set_connect_point( _to_node ); } } /* Handles any resizing changes of either the to or from node */ private void end_resized( Node node, double diffw, double diffh ) { double x, y, w, h; node.bbox( out x, out y, out w, out h ); _curve.set_point( ((_from_node == node) ? 0 : 2), (x + (w / 2)), (y + (h / 2)) ); _dragx += (diffw / 2); _dragy += (diffh / 2); position_title(); _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( _from_node ); set_connect_point( _to_node ); } /* Returns true if we are attached to the given node */ public bool attached_to_node( Node node ) { return( (_from_node == node) || (_to_node == node) ); } /* Returns the point to add the connection to based on the node */ private void set_connect_point( Node node ) { double x, y, w, h; double bw = node.style.node_borderwidth; double extra = bw + (style.connection_width / 2); double margin = node.style.node_margin; node.bbox( out x, out y, out w, out h ); /* Remove the node's margin */ x += margin; y += margin; w -= (margin * 2); h -= (margin * 2); _curve.set_connect_point( (node == _from_node), (y - extra), (y + h + extra), (x - extra), (x + w + extra) ); } /* Returns true if the given point is within proximity to the stored curve */ public bool on_curve( double x, double y ) { double fx, fy, tx, ty; _curve.get_from_point( out fx, out fy ); _curve.get_to_point( out tx, out ty ); var curve = new Bezier.with_endpoints( fx, fy, tx, ty ); curve.update_control_from_drag_handle( _dragx, _dragy ); return( curve.within_range( x, y ) ); } /* Returns true if the given x/y point lies within a handle located at hx/hy */ private bool within_handle( double hx, double hy, double x, double y ) { return( ((hx - RADIUS) <= x) && (x <= (hx + RADIUS)) && ((hy - RADIUS) <= y) && (y <= (hy + RADIUS)) ); } /* Returns true if the given point is within the drag handle */ public bool within_drag_handle( double x, double y ) { if( mode == ConnMode.SELECTED ) { if( (title == null) && (note.length == 0) ) { return( within_handle( _dragx, _dragy, x, y ) ); } else { double tx, ty, tw, th; title_bbox( out tx, out ty, out tw, out th ); return( within_handle( _dragx, (_dragy + (th / 2) + _style.connection_padding), x, y ) ); } } return( false ); } /* Returns true if the given point lies within the from connection handle */ public bool within_from_handle( double x, double y ) { return( within_endpoint_handle( true, x, y ) ); } /* Returns true if the given point lies within the from connection handle */ public bool within_to_handle( double x, double y ) { return( within_endpoint_handle( false, x, y ) ); } /* Returns true if the given point lies within the from connection handle */ private bool within_endpoint_handle( bool from, double x, double y ) { if( mode == ConnMode.SELECTED ) { double px, py; if( from ) { _curve.get_from_point( out px, out py ); } else { _curve.get_to_point( out px, out py ); } return( within_handle( px, py, x, y ) ); } return( false ); } /* Returns true if the given coordinates are within the title text area. */ public bool within_title( double x, double y ) { return( (_title != null) && _title.is_within( x, y ) ); } /* Returns true if the given coordinates lies within the connection note */ public bool within_note( double x, double y ) { if( note.length == 0 ) return( false ); double nx, ny, nw, nh; note_bbox( out nx, out ny, out nw, out nh ); return( Utils.is_within_bounds( x, y, nx, ny, nw, nh ) ); } /* Returns the bounding box for the stored title and note icon */ private void title_bbox( out double x, out double y, out double w, out double h ) { var padding = style.connection_padding ?? 0; if( _title != null ) { x = _title.posx - padding; y = _title.posy - padding; w = _title.width + (padding * 2) + ((note.length > 0) ? (padding + 11) : 0); h = ((_title.height < 11) ? 11 : _title.height) + (padding * 2); } else { x = _dragx - (padding + 5); y = _dragy - (padding + 5); w = 11 + (padding * 2); h = 11 + (padding * 2); } } /* Returns the positional information for where the note item is located (if it exists) */ private void note_bbox( out double x, out double y, out double w, out double h ) { double tx, ty, tw, th; var padding = style.connection_padding ?? 0; title_bbox( out tx, out ty, out tw, out th ); x = (tx + tw) - (padding + 11); y = ty + (th / 2) - 5; w = 11; h = 11; } /* Updates the location of the drag handle */ public void move_drag_handle( double x, double y ) { mode = ConnMode.ADJUSTING; position_title(); _dragx = x; _dragy = y; if( title != null ) { double tx, ty, tw, th; title_bbox( out tx, out ty, out tw, out th ); _dragy -= (th / 2); } _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( _from_node ); set_connect_point( _to_node ); } /* Loads the connection information */ private void load( DrawArea da, Xml.Node* node, Array nodes, HashMap id_map ) { string? f = node->get_prop( "from_id" ); if( f != null ) { _from_node = da.get_node( nodes, id_map.get( int.parse( f ) ) ); connect_node( _from_node ); } string? t = node->get_prop( "to_id" ); if( t != null ) { _to_node = da.get_node( nodes, id_map.get( int.parse( t ) ) ); connect_node( _to_node ); } string? x = node->get_prop( "drag_x" ); if( x != null ) { _dragx = double.parse( x ); } string? y = node->get_prop( "drag_y" ); if( y != null ) { _dragy = double.parse( y ); } string? n = node->get_prop( "note" ); if( n != null ) { note = n; } string? c = node->get_prop( "color" ); if( c != null ) { _color.parse( c ); } else { _color = da.get_theme().get_color( "connection" ); } /* Update the stored curve */ double fx, fy, fw, fh; double tx, ty, tw, th; _from_node.bbox( out fx, out fy, out fw, out fh ); _to_node.bbox( out tx, out ty, out tw, out th ); _curve = new Bezier.with_endpoints( (fx + (fw / 2)), (fy + (fh / 2)), (tx + (tw / 2)), (ty + (th / 2)) ); _curve.update_control_from_drag_handle( _dragx, _dragy ); set_connect_point( _from_node ); set_connect_point( _to_node ); /* Load the connection information */ for( Xml.Node* it = node->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "style" : style.load_connection( it ); break; case "title" : if( (it->children != null) && (it->children->type == Xml.ElementType.TEXT_NODE) ) { change_title( da, it->children->get_content() ); } break; case "note" : if( (it->children != null) && (it->children->type == Xml.ElementType.TEXT_NODE) ) { note = it->children->get_content(); } break; } } } } /* Saves the connection information to the given XML node */ public void save( Xml.Node* parent ) { Xml.Node* n = new Xml.Node( null, "connection" ); n->set_prop( "from_id", _from_node.id().to_string() ); n->set_prop( "to_id", _to_node.id().to_string() ); n->set_prop( "drag_x", _dragx.to_string() ); n->set_prop( "drag_y", _dragy.to_string() ); n->set_prop( "color", _color.to_string() ); /* Save the style connection */ style.save_connection( n ); n->new_text_child( null, "title", ((title != null) ? title.text : "") ); n->new_text_child( null, "note", note ); parent->add_child( n ); } /* Populates the given ListStore with all nodes that have names that match the given string pattern. */ public void get_match_items( string pattern, bool[] search_opts, ref Gtk.ListStore matches ) { if( search_opts[2] && (title != null) ) { Utils.match_string( pattern, title.text, "%s:".printf( _( "Connection Title" ) ), null, this, ref matches ); } if( search_opts[3] ) { Utils.match_string( pattern, note, "%s:".printf( _( "Connection Note" ) ), null, this, ref matches ); } } /* Draws the connection to the given context */ public virtual void draw( Cairo.Context ctx, Theme theme ) { /* If either the from or to node is hidden, don't bother to draw ourselves */ if( ((_from_node != null) && !_from_node.is_root() && _from_node.parent.folded) || ((_to_node != null) && !_to_node.is_root() && _to_node.parent.folded) ) { return; } double start_x, start_y; double end_x, end_y; double dragx = _dragx; double dragy = _dragy; RGBA bg = (mode == ConnMode.NONE) ? theme.get_color( "background" ) : theme.get_color( "nodesel_background" ); if( _from_node == null ) { start_x = _posx; start_y = _posy; } else { _curve.get_from_point( out start_x, out start_y ); } if( _to_node == null ) { end_x = _posx; end_y = _posy; } else { _curve.get_to_point( out end_x, out end_y ); } /* The value of t is always 0.5 */ double cx, cy; /* Calclate the control points based on the calculated start/end points */ cx = dragx - (((start_x + end_x) * 0.5) - dragx); cy = dragy - (((start_y + end_y) * 0.5) - dragy); /* Draw the curve */ ctx.save(); style.draw_connection( ctx ); Utils.set_context_color_with_alpha( ctx, color, alpha ); /* Draw the curve as a quadratic curve (saves some additional calculations) */ ctx.move_to( start_x, start_y ); ctx.curve_to( (((2.0 / 3.0) * cx) + ((1.0 / 3.0) * start_x)), (((2.0 / 3.0) * cy) + ((1.0 / 3.0) * start_y)), (((2.0 / 3.0) * cx) + ((1.0 / 3.0) * end_x)), (((2.0 / 3.0) * cy) + ((1.0 / 3.0) * end_y)), end_x, end_y ); ctx.stroke(); ctx.set_dash( {}, 0 ); /* Draw the arrow */ if( mode != ConnMode.SELECTED ) { if( (style.connection_arrow == "fromto") || (style.connection_arrow == "both") ) { draw_arrow( ctx, style.connection_width, end_x, end_y, cx, cy ); } if( (style.connection_arrow == "tofrom") || (style.connection_arrow == "both") ) { draw_arrow( ctx, style.connection_width, start_x, start_y, cx, cy ); } } /* Draw the connection title if it exists */ if( (title != null) || (note.length > 0) ) { draw_title( ctx, theme ); /* Draw the drag circle */ } else if( mode != ConnMode.NONE ) { ctx.set_line_width( 1 ); ctx.set_source_rgba( bg.red, bg.green, bg.blue, alpha ); ctx.arc( dragx, dragy, RADIUS, 0, (2 * Math.PI) ); ctx.fill_preserve(); ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); ctx.stroke(); } /* If we are selected draw the endpoints */ if( mode == ConnMode.SELECTED ) { ctx.set_source_rgba( bg.red, bg.green, bg.blue, alpha ); ctx.arc( start_x, start_y, RADIUS, 0, (2 * Math.PI) ); ctx.fill_preserve(); ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); ctx.stroke(); ctx.set_source_rgba( bg.red, bg.green, bg.blue, alpha ); ctx.arc( end_x, end_y, RADIUS, 0, (2 * Math.PI) ); ctx.fill_preserve(); ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); ctx.stroke(); } ctx.restore(); } /* Draws the connection title if it has been enabled. */ private void draw_title( Cairo.Context ctx, Theme theme ) { var fg = theme.get_color( "background" ); var padding = _style.connection_padding ?? 0; double x, y, w, h; /* Get the bbox for the entire title box */ title_bbox( out x, out y, out w, out h ); /* Draw the box */ ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); Granite.Drawing.Utilities.cairo_rounded_rectangle( ctx, (x - padding), (y - padding), (w + (padding * 2)), (h + (padding * 2)), (padding * 2) ); // ctx.rectangle( (x - padding), (y - padding), (w + (padding * 2)), (h + (padding * 2)) ); ctx.fill(); /* Draw the text */ if( _title != null ) { _title.draw( ctx, theme, fg, alpha ); } /* Draw the note, if necessary */ draw_note( ctx, fg ); /* Draw the drag handle */ if( (mode == ConnMode.SELECTED) || (mode == ConnMode.ADJUSTING) ) { RGBA bg = theme.get_color( "nodesel_background" ); ctx.set_line_width( 1 ); ctx.set_source_rgba( bg.red, bg.green, bg.blue, alpha ); ctx.arc( _dragx, (_dragy + (h / 2) + padding), RADIUS, 0, (2 * Math.PI) ); ctx.fill_preserve(); ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); ctx.stroke(); } } /* Draws the icon indicating that a note is associated with this node */ private void draw_note( Cairo.Context ctx, RGBA color ) { if( note.length > 0 ) { double x, y, w, h; note_bbox( out x, out y, out w, out h ); Utils.set_context_color_with_alpha( ctx, color, alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.move_to( (x + 2), y ); ctx.line_to( (x + 10), y ); ctx.stroke(); ctx.move_to( x, (y + 3) ); ctx.line_to( (x + 10), (y + 3) ); ctx.stroke(); ctx.move_to( x, (y + 6) ); ctx.line_to( (x + 10), (y + 6) ); ctx.stroke(); ctx.move_to( x, (y + 9) ); ctx.line_to( (x + 10), (y + 9) ); ctx.stroke(); } } /* Draws arrow point to the "to" node. The tailx/y values should be the bezier control point closest to the "to" node. */ public static void draw_arrow( Cairo.Context ctx, int line_width, double tipx, double tipy, double tailx, double taily, double arrowLength = 0 ) { double extlen[8] = {12, 13, 14, 15, 16, 17, 18, 18}; if( arrowLength == 0 ) { arrowLength = extlen[line_width-1]; } var dx = tipx - tailx; var dy = tipy - taily; var theta = Math.atan2( dy, dx ); var rad = 35 * (Math.PI / 180); // 35 angle, can be adjusted var x1 = tipx - arrowLength * Math.cos( theta + rad ); var y1 = tipy - arrowLength * Math.sin( theta + rad ); var phi2 = -35 * (Math.PI / 180); // -35 angle, can be adjusted var x2 = tipx - arrowLength * Math.cos( theta + phi2 ); var y2 = tipy - arrowLength * Math.sin( theta + phi2 ); /* Draw the arrow */ ctx.set_line_width( 1 ); ctx.move_to( tipx, tipy ); ctx.line_to( x1, y1 ); ctx.line_to( x2, y2 ); ctx.close_path(); ctx.fill(); } /* Makes an icon for the given dash */ public static Cairo.Surface make_arrow_icon( string type ) { Cairo.ImageSurface surface = new Cairo.ImageSurface( Cairo.Format.ARGB32, 100, 20 ); Cairo.Context ctx = new Cairo.Context( surface ); ctx.set_source_rgba( 0.5, 0.5, 0.5, 1 ); ctx.set_line_width( 4 ); ctx.set_line_cap( LineCap.ROUND ); ctx.move_to( 15, 10 ); ctx.line_to( 85, 10 ); ctx.stroke(); if( (type == "fromto") || (type == "both") ) { draw_arrow( ctx, 4, 90, 10, 10, 10 ); } if( (type == "tofrom") || (type == "both") ) { draw_arrow( ctx, 4, 10, 10, 90, 10 ); } return( surface ); } } Minder-1.5.1/src/ConnectionInspector.vala000066400000000000000000000150501356632107200203640ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Granite.Widgets; public class ConnectionInspector : Box { private const Gtk.TargetEntry[] DRAG_TARGETS = { {"text/uri-list", 0, 0} }; private ScrolledWindow _sw; private TextView _title; private ColorButton _color; private TextView _note; private DrawArea? _da = null; private string _orig_note = ""; private Connection? _connection = null; private bool _ignore_title_change = false; public ConnectionInspector( MainWindow win ) { Object( orientation:Orientation.VERTICAL, spacing:10 ); /* Create the node widgets */ create_title(); create_color(); create_note(); create_buttons(); win.canvas_changed.connect( tab_changed ); show_all(); } /* Called whenever the tab in the main window changes */ private void tab_changed( DrawArea? da ) { if( _da != null ) { _da.current_changed.disconnect( connection_changed ); } if( da != null ) { da.current_changed.connect( connection_changed ); } _da = da; } /* Sets the width of this inspector to the given value */ public void set_width( int width ) { _sw.width_request = width; } /* Creates the name entry */ private void create_title() { Box box = new Box( Orientation.VERTICAL, 10 ); Label lbl = new Label( Utils.make_title( _( "Title" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _title = new TextView(); _title.set_wrap_mode( Gtk.WrapMode.WORD ); _title.buffer.text = ""; _title.buffer.changed.connect( title_changed ); _title.focus_out_event.connect( title_focus_out ); var sw = new ScrolledWindow( null, null ); sw.min_content_width = 300; sw.min_content_height = 20; sw.add( _title ); box.pack_start( lbl, true, false ); box.pack_start( sw, true, false ); pack_start( box, false, true ); } private void create_color() { Box box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Color" ) ) ); box.homogeneous = true; lbl.xalign = (float)0; lbl.use_markup = true; _color = new ColorButton(); _color.color_set.connect(() => { _da.change_current_connection_color( _color.rgba ); }); box.pack_start( lbl, false, true, 0 ); box.pack_end( _color, true, true, 0 ); pack_start( box, false, true ); } /* Creates the note widget */ private void create_note() { Box box = new Box( Orientation.VERTICAL, 10 ); Label lbl = new Label( Utils.make_title( _( "Note" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _note = new TextView(); _note.set_wrap_mode( Gtk.WrapMode.WORD ); _note.buffer.text = ""; _note.buffer.changed.connect( note_changed ); _note.focus_in_event.connect( note_focus_in ); _note.focus_out_event.connect( note_focus_out ); _sw = new ScrolledWindow( null, null ); _sw.min_content_width = 300; _sw.min_content_height = 100; _sw.add( _note ); box.pack_start( lbl, false, false ); box.pack_start( _sw, true, true ); pack_start( box, true, true ); } /* Creates the node editing button grid and adds it to the popover */ private void create_buttons() { var grid = new Grid(); grid.column_homogeneous = true; grid.column_spacing = 5; /* Create the node deletion button */ var del_btn = new Button.from_icon_name( "edit-delete-symbolic", IconSize.SMALL_TOOLBAR ); del_btn.set_tooltip_text( _( "Delete Connection" ) ); del_btn.clicked.connect( connection_delete ); /* Add the buttons to the button grid */ grid.attach( del_btn, 0, 0, 1, 1 ); /* Add the button grid to the popover */ pack_start( grid, false, true ); } /* Called whenever the node name is changed within the inspector. */ private void title_changed() { if( !_ignore_title_change ) { _da.change_current_connection_title( _title.buffer.text ); } _ignore_title_change = false; } /* Called whenever the node title loses input focus. Updates the node title in the canvas. */ private bool title_focus_out( EventFocus e ) { _da.change_current_connection_title( _title.buffer.text ); return( false ); } /* Called whenever the text widget is changed. Updates the current node and redraws the canvas when needed. */ private void note_changed() { _da.change_current_connection_note( _note.buffer.text ); } /* Saves the original version of the node's note so that we can */ private bool note_focus_in( EventFocus e ) { _connection = _da.get_current_connection(); _orig_note = _note.buffer.text; return( false ); } /* When the note buffer loses focus, save the note change to the undo buffer */ private bool note_focus_out( EventFocus e ) { if( (_connection != null) && (_connection.note != _orig_note) ) { _da.undo_buffer.add_item( new UndoConnectionNote( _connection, _orig_note ) ); } return( false ); } /* Deletes the current connection */ private void connection_delete() { _da.delete_connection(); } /* Grabs the input focus on the name entry */ public void grab_title() { _title.grab_focus(); } /* Grabs the focus on the note widget */ public void grab_note() { _note.grab_focus(); } /* Called whenever the user changes the current node in the canvas */ private void connection_changed() { Connection? current = _da.get_current_connection(); if( current != null ) { _ignore_title_change = true; _title.buffer.text = (current.title != null) ? current.title.text : ""; _color.rgba = current.color; _color.alpha = 65535; _note.buffer.text = current.note; } } } Minder-1.5.1/src/ConnectionMenu.vala000066400000000000000000000107421356632107200173250ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class ConnectionMenu : Gtk.Menu { DrawArea _da; Gtk.MenuItem _delete; Gtk.MenuItem _edit; Gtk.MenuItem _note; Gtk.MenuItem _selstart; Gtk.MenuItem _selend; Gtk.MenuItem _selnext; Gtk.MenuItem _selprev; /* Default constructor */ public ConnectionMenu( DrawArea da, AccelGroup accel_group ) { _da = da; _delete = new Gtk.MenuItem.with_label( _( "Delete" ) ); _delete.activate.connect( delete_connection ); Utils.add_accel_label( _delete, 65535, 0 ); _edit = new Gtk.MenuItem.with_label( _( "Edit…" ) ); _edit.activate.connect( edit_title ); Utils.add_accel_label( _edit, 'e', 0 ); _note = new Gtk.MenuItem.with_label( _( "Add Note" ) ); _note.activate.connect( change_note ); var selnode = new Gtk.MenuItem.with_label( _( "Select" ) ); var selmenu = new Gtk.Menu(); selnode.set_submenu( selmenu ); _selstart = new Gtk.MenuItem.with_label( _( "Start Node" ) ); _selstart.activate.connect( select_start_node ); Utils.add_accel_label( _selstart, 'f', 0 ); _selend = new Gtk.MenuItem.with_label( _( "End Node" ) ); _selend.activate.connect( select_end_node ); Utils.add_accel_label( _selend, 't', 0 ); _selnext = new Gtk.MenuItem.with_label( _( "Next Connection" ) ); _selnext.activate.connect( select_next_connection ); Utils.add_accel_label( _selnext, 65363, 0 ); _selprev = new Gtk.MenuItem.with_label( _( "Previous Connection" ) ); _selprev.activate.connect( select_prev_connection ); Utils.add_accel_label( _selprev, 65361, 0 ); /* Add the menu items to the menu */ add( _delete ); add( new SeparatorMenuItem() ); add( _edit ); add( _note ); add( new SeparatorMenuItem() ); add( selnode ); /* Add the items to the selection menu */ selmenu.add( _selstart ); selmenu.add( _selend ); selmenu.add( new SeparatorMenuItem() ); selmenu.add( _selnext ); selmenu.add( _selprev ); /* Make the menu visible */ show_all(); /* Make sure that we handle menu state when we are popped up */ show.connect( on_popup ); } /* Returns true if a note is associated with the currently selected node */ private bool connection_has_note() { Connection? current = _da.get_current_connection(); return( (current != null) && (current.note != "") ); } /* Called when the menu is popped up */ private void on_popup() { /* Set the menu item labels */ _note.label = connection_has_note() ? _( "Remove Note" ) : _( "Add Note" ); } /* Deletes the current node */ private void delete_connection() { _da.delete_connection(); } /* Displays the sidebar to edit the node properties */ private void edit_title() { Connection conn = _da.get_current_connection(); if( conn.title == null ) { conn.change_title( _da, "", true ); } conn.mode = ConnMode.EDITABLE; } /* Changes the note status of the currently selected node */ private void change_note() { if( connection_has_note() ) { _da.change_current_connection_note( "" ); } else { _da.show_properties( "current", true ); } _da.current_changed( _da ); } /* Selects the next sibling node of the current node */ private void select_start_node() { _da.select_connection_node( true ); } /* Selects the previous sibling node of the current node */ private void select_end_node() { _da.select_connection_node( false ); } /* Selects the next connection in the mind map */ private void select_next_connection() { _da.select_connection( 1 ); } /* Selects the previous connection in the mind map */ private void select_prev_connection() { _da.select_connection( -1 ); } } Minder-1.5.1/src/Connections.vala000066400000000000000000000171251356632107200166650ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gee; public class Connections { private Array _connections; public Array connections { get { return( _connections ); } } public bool hide { set; get; default = false; } /* Default constructor */ public Connections() { _connections = new Array(); } /* Removes all connections */ public void clear_all_connections() { _connections.remove_range( 0, _connections.length ); } /* Adds the given connection */ public void add_connection( Connection conn ) { /* Don't add the connection if it has already been added */ for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ) == conn ) { return; } } _connections.append_val( conn ); } /* Removes the given connection */ public bool remove_connection( Connection conn, bool disconnect ) { for( uint i=0; i<_connections.length; i++ ) { if( _connections.index( i ) == conn ) { if( disconnect ) { _connections.index( i ).disconnect_from_node( true ); _connections.index( i ).disconnect_from_node( false ); } _connections.remove_index( i ); return( true ); } } return( false ); } /* Complete the stored connections */ public void complete_connection( int index, Node to_node ) { _connections.index( index ).connect_to( to_node ); } /* Returns the connection that is before or after the given connection */ public Connection? get_connection( Connection conn, int dir ) { if( _connections.length == 1 ) return( null ); for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ) == conn ) { int index = ((i + dir) < 0) ? (int)(_connections.length - 1) : (int)((i + dir) % _connections.length); return( _connections.index( index ) ); } } return( null ); } /* Returns the index'th connection that is attached to the given node; otherwise, returns null if the node does not contain a connection. */ public Connection? get_attached_connection( Node node, int index = 0 ) { int matches = 0; for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).attached_to_node( node ) && (index == matches++) ) { return( _connections.index( i ) ); } } return( null ); } /* Returns the associated connection if the given point is in proximity to the connection's curve. */ public Connection? on_curve( double x, double y ) { for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).on_curve( x, y ) ) { return( _connections.index( i ) ); } } return( null ); } /* Returns the associated connection if the given point is within the connection's title text. */ public Connection? within_title( double x, double y ) { for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).within_title( x, y ) ) { return( _connections.index( i ) ); } } return( null ); } /* Searches the connections for one which is displaying a note at the given coordinates. If a match is found, return the connection; otherwise, return null. */ public Connection? within_note( double x, double y ) { for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).within_note( x, y ) ) { return( _connections.index( i ) ); } } return( null ); } /* Returns the associated connection if the given point is within the drag handle */ public Connection? within_drag_handle( double x, double y ) { for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).within_drag_handle( x, y ) ) { return( _connections.index( i ) ); } } return( null ); } /* Called whenever a node is deleted in the mind map. All attached connections also need to be removed. */ public void node_deleted( Node node, Array conns ) { for( int i=0; i=0; i-- ) { if( _connections.index( i ).attached_to_node( node ) ) { conns.append_val( _connections.index( i ) ); _connections.remove_index( i ); } } } /* Loads the listed connections from the given XML data */ public void load( DrawArea da, Xml.Node* node, Array? conns, Array nodes, HashMap id_map ) { for( Xml.Node* it = node->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "connection" ) { var conn = new Connection.from_xml( da, it, nodes, id_map ); if( conns != null ) { conns.append_val( conn ); } _connections.append_val( conn ); } } } } /* Saves the connection information to the given XML file */ public void save( Xml.Node* parent ) { if( _connections.length > 0 ) { Xml.Node* n = new Xml.Node( null, "connections" ); for( int i=0; i<_connections.length; i++ ) { _connections.index( i ).save( n ); } parent->add_child( n ); } } /* Saves the connection information to the given XML node if the connection is fully within the given node tree */ public void save_if_in_node( Xml.Node* parent, Node node ) { for( int i=0; i<_connections.length; i++ ) { if( _connections.index( i ).from_node.is_descendant_of( node ) && _connections.index( i ).to_node.is_descendant_of( node ) ) { _connections.index( i ).save( parent ); } } } /* Set all of the stored connections to the given style */ public void set_all_connections_to_style( Style style ) { for( int i=0; i<_connections.length; i++ ) { _connections.index( i ).style = style; } } /* Searches the connections for ones that match the given pattern and search options */ public void get_match_items( string pattern, bool[] search_opts, ref Gtk.ListStore matches ) { for( int i=0; i<_connections.length; i++ ) { _connections.index( i ).get_match_items( pattern, search_opts, ref matches ); } } /* Sets the focus mode to the given value and updates the alpha value of the stored connections */ public void update_alpha() { for( int i=0; i<_connections.length; i++ ) { double from_alpha = _connections.index( i ).from_node.alpha; double to_alpha = _connections.index( i ).to_node.alpha; _connections.index( i ).alpha = (from_alpha < to_alpha) ? from_alpha : to_alpha; } } /* Draws all of the connections onto the given context */ public void draw_all( Cairo.Context ctx, Theme theme ) { if( hide ) return; for( int i=0; i<_connections.length; i++ ) { _connections.index( i ).draw( ctx, theme ); } } } Minder-1.5.1/src/CurrentInspector.vala000066400000000000000000000066571356632107200177240ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Granite.Widgets; public class CurrentInspector : Stack { private DrawArea? _da = null; public CurrentInspector( MainWindow win ) { /* Set the transition duration information */ transition_duration = 500; transition_type = StackTransitionType.NONE; var node_box = new NodeInspector( win ); var conn_box = new ConnectionInspector( win ); var empty_box = new EmptyInspector( win ); add_named( node_box, "node" ); add_named( conn_box, "connection" ); add_named( empty_box, "empty" ); win.canvas_changed.connect( tab_changed ); show_all(); } /* Sets the width of this panel to the given value */ public void set_width( int width ) { var ni = get_child_by_name( "node" ) as NodeInspector; var ci = get_child_by_name( "connection" ) as ConnectionInspector; if( ni != null ) { ni.set_width( width ); } if( ci != null ) { ci.set_width( width ); } } /* Resets the width of this inspector to its default width */ public void reset_width() { set_width( 300 ); } /* Connected signal will provide us whenever the current tab changes in the main window */ private void tab_changed( DrawArea? da ) { if( _da != null ) { _da.current_changed.disconnect( current_changed ); } _da = da; if( da != null ) { da.current_changed.connect( current_changed ); current_changed(); } } /* Called whenever the user changes the current node in the canvas */ private void current_changed() { if( _da.get_current_node() != null ) { if( visible_child_name != "node" ) { transition_type = (visible_child_name == "connection") ? StackTransitionType.NONE : StackTransitionType.SLIDE_UP; set_visible_child_name( "node" ); } } else if( _da.get_current_connection() != null ) { if( visible_child_name != "connection" ) { transition_type = (visible_child_name == "node") ? StackTransitionType.NONE : StackTransitionType.SLIDE_UP; set_visible_child_name( "connection" ); } } else { transition_type = StackTransitionType.SLIDE_DOWN; set_visible_child_name( "empty" ); } } /* Gives the node or connection note field keyboard focus */ public void grab_note() { if( _da.get_current_node() != null ) { var ni = get_child_by_name( "node" ) as NodeInspector; if( ni != null ) { ni.grab_note(); } } else if( _da.get_current_connection() != null ) { var ci = get_child_by_name( "connection" ) as ConnectionInspector; if( ci != null ) { ci.grab_note(); } } } } Minder-1.5.1/src/Document.vala000066400000000000000000000067041356632107200161620ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; using Gtk; using GLib; public class Document : Object { private DrawArea _da; private string _filename; private bool _from_user; // Set to true if _filename was set by the user private ImageManager _image_manager; /* Properties */ public string filename { set { if( _filename != value ) { if( !_from_user ) { FileUtils.unlink( _filename ); } _filename = value; _from_user = true; } } get { return( _filename ); } } public string label { owned get { return( GLib.Path.get_basename( _filename ) ); } } public bool save_needed { private set; get; default = false; } /* Default constructor */ public Document( DrawArea da ) { _da = da; /* Create the temporary file */ var dir = GLib.Path.build_filename( Environment.get_user_data_dir(), "minder" ); if( DirUtils.create_with_parents( dir, 0775 ) == 0 ) { int i = 1; do { _filename = GLib.Path.build_filename( dir, "unnamed%d.minder".printf( i++ ) ); } while( GLib.FileUtils.test( _filename, FileTest.EXISTS ) ); _from_user = false; } /* Create the image manager */ _image_manager = new ImageManager(); /* Listen for any changes from the canvas */ _da.changed.connect( canvas_changed ); } /* Called whenever the canvas changes such that a save will be needed */ private void canvas_changed() { save_needed = true; auto_save(); } /* Called when a document filename is loaded from the tab state file */ public void load_filename( string fname, bool saved ) { filename = fname; _from_user = saved; } /* Returns true if the stored filename came from the user */ public bool is_saved() { return( _from_user ); } /* Opens the given filename */ public bool load() { Xml.Doc* doc = Xml.Parser.parse_file( filename ); if( doc == null ) { return( false ); } _da.load( doc->get_root_element() ); delete doc; return( true ); } /* Saves the given node information to the specified file */ public bool save() { Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* root = new Xml.Node( null, "minder" ); doc->set_root_element( root ); _da.save( root ); doc->save_format_file( filename, 1 ); delete doc; save_needed = false; return( true ); } /* Deletes the given unnamed file when called */ public bool remove() { if( !_from_user ) { FileUtils.unlink( _filename ); } return( true ); } /* Auto-saves the document */ public void auto_save() { if( save_needed ) { save(); } } } Minder-1.5.1/src/DrawArea.vala000066400000000000000000003266601356632107200161000ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using GLib; using Gdk; using Cairo; using Gee; public class DrawArea : Gtk.DrawingArea { private const Gtk.TargetEntry[] DRAG_TARGETS = { {"text/uri-list", 0, 0} }; private Document _doc; private GLib.Settings _settings; private double _press_x; private double _press_y; private double _origin_x; private double _origin_y; private double _scale_factor; private double _store_origin_x; private double _store_origin_y; private double _store_scale_factor; private bool _pressed = false; private EventType _press_type = EventType.NOTHING; private bool _resize = false; private bool _motion = false; private Node? _current_node = null; private Node? _last_node = null; private bool _current_new = false; private Connection? _current_connection = null; private Connection? _last_connection = null; private Array _nodes; private Connections _connections; private Theme _theme; private string _orig_name; private NodeSide _orig_side; private Array _orig_info; private int _orig_width; private string _orig_title; private Node? _attach_node = null; private NodeMenu _node_menu; private ConnectionMenu _conn_menu; private EmptyMenu _empty_menu; private uint? _auto_save_id = null; private ImageEditor _editor; private IMContextSimple _im_context; private bool _debug = true; private bool _focus_mode = false; private double _focus_alpha = 0.05; private bool _create_new_from_edit; public MainWindow win { private set; get; } public UndoBuffer undo_buffer { set; get; } public Layouts layouts { set; get; default = new Layouts(); } public Animator animator { set; get; } public Clipboard node_clipboard { set; get; default = Clipboard.get_for_display( Display.get_default(), Atom.intern( "org.github.phase1geo.minder", false ) ); } public ImageManager image_manager { set; get; default = new ImageManager(); } public GLib.Settings settings { get { return( _settings ); } } public double origin_x { set { _store_origin_x = _origin_x = value; } get { return( _origin_x ); } } public double origin_y { set { _store_origin_y = _origin_y = value; } get { return( _origin_y ); } } public double sfactor { set { _store_scale_factor = _scale_factor = value; } get { return( _scale_factor ); } } public signal void changed(); public signal void current_changed( DrawArea da ); public signal void theme_changed( DrawArea da ); public signal void scale_changed( double scale ); public signal void show_properties( string? tab, bool grab_note ); public signal void hide_properties(); public signal void loaded(); /* Default constructor */ public DrawArea( MainWindow w, GLib.Settings settings, AccelGroup accel_group ) { win = w; _doc = new Document( this ); _settings = settings; /* Create the array of root nodes in the map */ _nodes = new Array(); /* Create the connections */ _connections = new Connections(); /* Allocate memory for the animator */ animator = new Animator( this ); /* Allocate memory for the undo buffer */ undo_buffer = new UndoBuffer( this ); /* Allocate the image editor popover */ _editor = new ImageEditor( this ); _editor.changed.connect( current_image_edited ); /* Create the popup menu */ _node_menu = new NodeMenu( this, accel_group ); _conn_menu = new ConnectionMenu( this, accel_group ); _empty_menu = new EmptyMenu( this, accel_group ); /* Create the node information array */ _orig_info = new Array(); /* Get the value of the new node from edit */ update_focus_mode_alpha( settings ); update_create_new_from_edit( settings ); settings.changed.connect(() => { update_focus_mode_alpha( settings ); update_create_new_from_edit( settings ); }); /* Set the theme to the default theme */ set_theme( win.themes.get_theme( _( "Default" ) ), false ); /* Add event listeners */ this.draw.connect( on_draw ); this.button_press_event.connect( on_press ); this.motion_notify_event.connect( on_motion ); this.button_release_event.connect( on_release ); this.key_press_event.connect( on_keypress ); this.scroll_event.connect( on_scroll ); /* Make sure the above events are listened for */ this.add_events( EventMask.BUTTON_PRESS_MASK | EventMask.BUTTON_RELEASE_MASK | EventMask.BUTTON1_MOTION_MASK | EventMask.POINTER_MOTION_MASK | EventMask.KEY_PRESS_MASK | EventMask.SMOOTH_SCROLL_MASK | EventMask.STRUCTURE_MASK ); /* Set ourselves up to be a drag target */ Gtk.drag_dest_set( this, DestDefaults.MOTION | DestDefaults.DROP, DRAG_TARGETS, Gdk.DragAction.COPY ); this.drag_motion.connect( handle_drag_motion ); this.drag_data_received.connect( handle_drag_data_received ); /* Make sure that the images are cleaned up when the user exits the application or we received a terminate signal. */ this.destroy.connect(() => { image_manager.cleanup(); }); /* TBD - This code does not compile Posix.sighandler_t? t = this.handle_sigterm; Posix.@signal( Posix.Signal.TERM, t ); */ /* Make sure the drawing area can receive keyboard focus */ this.can_focus = true; /* Make sure that we add a CSS class name to ourselves so we can color our background with the theme. */ get_style_context().add_class( "canvas" ); /* Make sure that we us the ImContextSimple input method */ _im_context = new IMContextSimple(); _im_context.commit.connect( handle_printable ); } /* Called to handle a sigterm signal to the application */ public void handle_sigterm( int s ) { image_manager.cleanup(); } /* Returns the stored document */ public Document get_doc() { return( _doc ); } /* Returns the name of the currently selected theme */ public string get_theme_name() { return( _theme.name ); } /* Returns the current theme */ public Theme get_theme() { return( _theme ); } /* Sets the theme to the given value */ public void set_theme( Theme theme, bool save ) { Theme? orig_theme = _theme; _theme = theme; _theme.index = (orig_theme != null) ? orig_theme.index : 0; StyleContext.add_provider_for_screen( Screen.get_default(), _theme.get_css_provider(), STYLE_PROVIDER_PRIORITY_APPLICATION ); if( orig_theme != null ) { map_theme_colors( orig_theme ); } theme_changed( this ); queue_draw(); if( save ) { changed(); } } /* Updates all nodes with the new theme colors */ private void map_theme_colors( Theme old_theme ) { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).map_theme_colors( old_theme, _theme ); } } /* Sets the layout to the given value */ public void set_layout( string name, Node? root_node, bool undoable = true ) { var old_layout = (root_node == null) ? _nodes.index( 0 ).layout : root_node.layout; var new_layout = layouts.get_layout( name ); if( undoable ) { undo_buffer.add_item( new UndoNodeLayout( old_layout, new_layout, root_node ) ); } var old_balanceable = old_layout.balanceable; animator.add_nodes( "set layout" ); if( root_node == null ) { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).layout = new_layout; new_layout.initialize( _nodes.index( i ) ); } } else { root_node.layout = new_layout; new_layout.initialize( root_node ); } if( !old_balanceable && new_layout.balanceable ) { balance_nodes( false ); } else { animator.animate(); } } /* Returns the list of nodes */ public Array get_nodes() { return( _nodes ); } /* Returns the connections list */ public Connections get_connections() { return( _connections ); } /* Returns the current focus mode value */ public bool get_focus_mode() { return( _focus_mode ); } /* Searches for and returns the node with the specified ID */ public Node? get_node( Array nodes, int id ) { for( int i=0; iget_prop( "x" ); if( x != null ) { origin_x = double.parse( x ); } string? y = n->get_prop( "y" ); if( y != null ) { origin_y = double.parse( y ); } string? sf = n->get_prop( "scale" ); if( sf != null ) { sfactor = double.parse( sf ); scale_changed( sfactor ); } } /* Loads the given theme from the list of available options */ private void load_theme( Xml.Node* n ) { /* Load the theme */ var theme = new Theme(); theme.temporary = true; theme.load( n ); /* If this theme does not currently exist, add the theme temporarily */ if( !win.themes.exists( theme ) ) { theme.name = win.themes.uniquify_name( theme.name ); win.themes.add_theme( theme ); } /* Get the theme */ _theme = win.themes.get_theme( theme.name ); StyleContext.add_provider_for_screen( Screen.get_default(), _theme.get_css_provider(), STYLE_PROVIDER_PRIORITY_APPLICATION ); theme_changed( this ); } /* We don't store the layout, but if it is found, we need to initialize the layout information for all nodes to this value. */ private void load_layout( Xml.Node* n, ref Layout? layout ) { string? name = n->get_prop( "name" ); if( name != null ) { layout = layouts.get_layout( name ); } } /* Loads the contents of the data input stream */ public void load( Xml.Node* n ) { Layout? use_layout = null; var id_map = new HashMap(); var link_ids = new Array(); /* Disable animations while we are loading */ var animate = animator.enable; animator.enable = false; /* Clear the existing nodes */ _nodes.remove_range( 0, _nodes.length ); /* Load the contents of the file */ for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "theme" : load_theme( it ); break; case "layout" : load_layout( it, ref use_layout ); break; case "styles" : StyleInspector.styles.load( it ); break; case "drawarea" : load_drawarea( it ); break; case "images" : image_manager.load( it ); break; case "connections" : _connections.load( this, it, null, _nodes, id_map ); break; case "nodes" : for( Xml.Node* it2 = it->children; it2 != null; it2 = it2->next ) { if( (it2->type == Xml.ElementType.ELEMENT_NODE) && (it2->name == "node") ) { var node = new Node.with_name( this, "temp", null ); node.load( this, it2, true, id_map, link_ids ); if( use_layout != null ) { node.layout = use_layout; } _nodes.append_val( node ); } } break; } } } /* Handle node links */ for( int i=0; iadd_child( _theme.save() ); StyleInspector.styles.save( parent ); Xml.Node* origin = new Xml.Node( null, "drawarea" ); origin->new_prop( "x", _store_origin_x.to_string() ); origin->new_prop( "y", _store_origin_y.to_string() ); origin->new_prop( "scale", _store_scale_factor.to_string() ); parent->add_child( origin ); Xml.Node* images = new Xml.Node( null, "images" ); image_manager.save( images ); parent->add_child( images ); Xml.Node* nodes = new Xml.Node( null, "nodes" ); for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).save( nodes ); } parent->add_child( nodes ); _connections.save( parent ); return( true ); } /* Imports the OPML data, creating a mind map */ public void import_opml( Xml.Node* n, ref Array? expand_state) { int node_id = 1; /* Clear the existing nodes */ _nodes.remove_range( 0, _nodes.length ); /* Load the contents of the file */ for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "outline") { var root = new Node( this, layouts.get_default() ); root.import_opml( this, it, node_id, ref expand_state, _theme ); _nodes.append_val( root ); } } } } /* Exports all of the nodes in OPML format */ public void export_opml( Xml.Node* parent, out string expand_state ) { Array estate = new Array(); int node_id = 1; for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).export_opml( parent, ref node_id, ref estate ); } expand_state = ""; for( int i=0; i 0 ) { expand_state += ","; } expand_state += estate.index( i ).to_string(); } } /* Initializes the canvas to prepare it for a document that will be loaded */ public void initialize_for_open() { /* Clear the list of existing nodes */ _nodes.remove_range( 0, _nodes.length ); /* Clear the list of connections */ _connections.clear_all_connections(); /* Clear the undo buffer */ undo_buffer.clear(); /* Reset the node ID generator */ Node.reset(); /* Initialize variables */ origin_x = 0.0; origin_y = 0.0; sfactor = 1.0; node_clipboard.clear(); _pressed = false; _press_type = EventType.NOTHING; _motion = false; _attach_node = null; _orig_name = ""; _current_new = false; _current_connection = null; _last_connection = null; set_current_node( null ); queue_draw(); } /* Initialize the empty drawing area with a node */ public void initialize_for_new() { /* Clear the list of existing nodes */ _nodes.remove_range( 0, _nodes.length ); /* Clear the list of connections */ _connections.clear_all_connections(); /* Clear the undo buffer */ undo_buffer.clear(); /* Reset the node ID generator */ Node.reset(); /* Initialize variables */ origin_x = 0.0; origin_y = 0.0; sfactor = 1.0; node_clipboard.clear(); _pressed = false; _press_type = EventType.NOTHING; _motion = false; _attach_node = null; _current_new = false; _current_connection = null; _last_connection = null; /* Create the main idea node */ var n = new Node.with_name( this, _("Main Idea"), layouts.get_default() ); /* Set the node information */ n.posx = (get_allocated_width() / 2) - 30; n.posy = (get_allocated_height() / 2) - 10; n.style = StyleInspector.styles.get_global_style(); _nodes.append_val( n ); _orig_name = ""; /* Make this initial node the current node */ set_current_node( n ); n.mode = NodeMode.EDITABLE; /* Redraw the canvas */ queue_draw(); } /* Returns the current node */ public Node? get_current_node() { return( _current_node ); } /* Returns the current connection */ public Connection? get_current_connection() { return( _current_connection ); } /* Populates the list of matches with any nodes that match the given string pattern. */ public void get_match_items( string pattern, bool[] search_opts, ref Gtk.ListStore matches ) { if( search_opts[0] ) { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).get_match_items( pattern, search_opts, ref matches ); } } if( search_opts[1] ) { _connections.get_match_items( pattern, search_opts, ref matches ); } } /* Sets the current node to the given node */ public void set_current_node( Node? n ) { if( n == null ) { _current_node = n; current_changed( this ); } else if( _current_node == n ) { _current_node.mode = NodeMode.CURRENT; } else { if( _current_connection != null ) { _current_connection.mode = ConnMode.NONE; _current_connection = null; } if( _current_node != null ) { _current_node.mode = NodeMode.NONE; // _current_node.alpha = _focus_mode ? _focus_alpha : 1.0; } if( (n.parent != null) && n.parent.folded ) { var last = n.reveal(); undo_buffer.add_item( new UndoNodeReveal( this, n, last ) ); } _current_node = n; _current_node.mode = NodeMode.CURRENT; // update_focus_mode(); current_changed( this ); } } /* Sets the current connection to the given node */ public void set_current_connection( Connection? c ) { if( _current_node != null ) { _current_node.mode = NodeMode.NONE; _current_node = null; } if( _current_connection != null ) { _current_connection.mode = ConnMode.NONE; } _current_connection = c; if( _current_connection != null ) { _current_connection.mode = ConnMode.SELECTED; } _current_connection.from_node.last_selected_connection = _current_connection; _current_connection.to_node.last_selected_connection = _current_connection; current_changed( this ); } /* Toggles the value of the specified node, if possible */ public void toggle_task( Node n ) { undo_buffer.add_item( new UndoNodeTask( n, true, !n.task_done() ) ); n.toggle_task_done(); queue_draw(); changed(); } /* Toggles the fold for the given node */ public void toggle_fold( Node n ) { bool fold = !n.folded; undo_buffer.add_item( new UndoNodeFold( n, fold ) ); n.folded = fold; n.layout.handle_update_by_fold( n ); queue_draw(); changed(); } /* Changes the current node's name to the given name. Updates the layout, adds the undo item, and redraws the canvas. */ public void change_current_node_name( string name ) { if( (_current_node != null) && (_current_node.name.text != name) ) { string orig_name = _current_node.name.text; _current_node.name.text = name; if( !_current_new ) { undo_buffer.add_item( new UndoNodeName( _current_node, orig_name ) ); } queue_draw(); changed(); } } /* Changes the current connection's title to the given value. */ public void change_current_connection_title( string title ) { if( (_current_connection != null) && (_current_connection.title.text != title) ) { string? orig_title = (_current_connection.title == null) ? null : _current_connection.title.text; _current_connection.change_title( this, title ); if( !_current_new ) { undo_buffer.add_item( new UndoConnectionTitle( _current_connection, orig_title ) ); } queue_draw(); changed(); } } /* Changes the current node's task to the given values. Updates the layout, adds the undo item, and redraws the canvas. */ public void change_current_task( bool enable, bool done ) { if( _current_node != null ) { undo_buffer.add_item( new UndoNodeTask( _current_node, enable, done ) ); _current_node.enable_task( enable ); _current_node.set_task_done( done ); queue_draw(); changed(); } } /* Changes the current node's folded state to the given value. Updates the layout, adds the undo item and redraws the canvas. */ public void change_current_fold( bool folded ) { if( _current_node != null ) { undo_buffer.add_item( new UndoNodeFold( _current_node, folded ) ); _current_node.folded = folded; _current_node.layout.handle_update_by_fold( _current_node ); queue_draw(); changed(); } } /* Changes the current node's note to the given value. Updates the layout, adds the undo item and redraws the canvas. */ public void change_current_node_note( string note ) { if( _current_node != null ) { _current_node.note = note; queue_draw(); auto_save(); } } /* Changes the current connection's note to the given value. */ public void change_current_connection_note( string note ) { if( _current_connection != null ) { _current_connection.note = note; queue_draw(); auto_save(); } } /* Adds an image to the current node by allowing the user to select an image file from the file system and, optionally, editing the image prior to assigning it to a node. Updates the layout, adds the undo item and redraws the canvas. item and redraws the canvas. */ public void add_current_image() { if( _current_node != null ) { if( _current_node.image == null ) { var parent = (Gtk.Window)get_toplevel(); var id = image_manager.choose_image( parent ); if( id != -1 ) { var max_width = _current_node.max_width(); _current_node.set_image( image_manager, new NodeImage( image_manager, id, max_width ) ); if( _current_node.image != null ) { undo_buffer.add_item( new UndoNodeImage( _current_node, null ) ); queue_draw(); current_changed( this ); auto_save(); } } } } } /* Deletes the image from the current node. Updates the layout, adds the undo item and redraws the canvas. */ public void delete_current_image() { if( _current_node != null ) { NodeImage? orig_image = _current_node.image; if( orig_image != null ) { _current_node.set_image( image_manager, null ); undo_buffer.add_item( new UndoNodeImage( _current_node, orig_image ) ); queue_draw(); current_changed( this ); auto_save(); } } } /* Causes the current node's image to be edited. */ public void edit_current_image() { if( _current_node != null ) { if( _current_node.image != null ) { _editor.edit_image( image_manager, _current_node, _current_node.posx, _current_node.posy ); } } } /* Called whenever the current node's image is changed */ private void current_image_edited( NodeImage? orig_image ) { undo_buffer.add_item( new UndoNodeImage( _current_node, orig_image ) ); queue_draw(); current_changed( this ); auto_save(); } /* Called when the linking process has successfully completed */ private void end_link( Node node ) { if( _current_connection == null ) return; _current_connection = null; _last_node.linked_node = node; undo_buffer.add_item( new UndoNodeLink( _last_node, null ) ); _last_connection = null; _last_node = null; _attach_node.mode = NodeMode.NONE; _attach_node = null; changed(); queue_draw(); } /* Delete the current node link */ public void delete_current_link() { if( _current_node != null ) { Node? old_link = _current_node.linked_node; _current_node.linked_node = null; undo_buffer.add_item( new UndoNodeLink( _current_node, old_link ) ); changed(); queue_draw(); } } /* Toggles the node link */ private void toggle_link() { if( _current_node != null ) { if( _current_node.linked_node == null ) { start_connection( true, true ); } else { delete_current_link(); } } } /* Changes the current node's link color and propagates that color to all descendants. */ public void change_current_link_color( RGBA color ) { if( _current_node != null ) { RGBA orig_color = _current_node.link_color; if( orig_color != color ) { _current_node.link_color = color; undo_buffer.add_item( new UndoNodeLinkColor( _current_node, orig_color ) ); queue_draw(); changed(); } } } /* Changes the current connection's color to the specified color. */ public void change_current_connection_color( RGBA color ) { if( _current_connection != null ) { RGBA orig_color = _current_connection.color; if( orig_color != color ) { _current_connection.color = color; undo_buffer.add_item( new UndoConnectionColor( _current_connection, orig_color ) ); queue_draw(); changed(); } } } /* Clears the current connection (if it is set) and updates the UI accordingly */ private void clear_current_connection( bool signal_change ) { if( _current_connection != null ) { _current_connection.mode = ConnMode.NONE; _current_connection = null; _last_connection = null; if( signal_change ) { current_changed( this ); } } } /* Clears the current node (if it is set) and updates the UI accordingly */ private void clear_current_node( bool signal_change ) { if( _current_node != null ) { _current_node.mode = NodeMode.NONE; _current_node.alpha = 1.0; _current_node = null; if( signal_change ) { current_changed( this ); } } } /* Called whenever the user clicks on a valid connection */ private bool set_current_connection_from_position( Connection conn, EventButton e ) { if( conn == _current_connection ) { if( conn.mode == ConnMode.EDITABLE ) { bool shift = (bool)(e.state & ModifierType.SHIFT_MASK); switch( e.type ) { case EventType.BUTTON_PRESS : conn.title.set_cursor_at_char( e.x, e.y, shift ); break; case EventType.DOUBLE_BUTTON_PRESS : conn.title.set_cursor_at_word( e.x, e.y, shift ); break; case EventType.TRIPLE_BUTTON_PRESS : conn.title.set_cursor_all( false ); break; } } else if( e.type == EventType.DOUBLE_BUTTON_PRESS ) { _orig_title = _current_connection.title.text; _current_connection.edit_title_begin( this ); _current_connection.mode = ConnMode.EDITABLE; } return( true ); } else { set_current_connection( conn ); } return( false ); } /* Called whenever the user clicks on node */ private bool set_current_node_from_position( Node node, EventButton e ) { double scaled_x = scale_value( e.x ); double scaled_y = scale_value( e.y ); /* Check to see if the user clicked anywhere within the node which is itself a clickable target */ if( node.is_within_task( scaled_x, scaled_y ) ) { toggle_task( node ); current_changed( this ); return( false ); } else if( node.is_within_linked_node( scaled_x, scaled_y ) ) { select_linked_node( node ); return( false ); } else if( node.is_within_fold( scaled_x, scaled_y ) ) { toggle_fold( node ); current_changed( this ); return( false ); } else if( node.is_within_resizer( scaled_x, scaled_y ) ) { _resize = true; _orig_width = node.max_width(); return( true ); } _orig_side = node.side; _orig_info.remove_range( 0, _orig_info.length ); node.get_node_info( ref _orig_info ); if( node == _current_node ) { if( is_node_editable() ) { bool shift = (bool)(e.state & ModifierType.SHIFT_MASK); switch( e.type ) { case EventType.BUTTON_PRESS : node.name.set_cursor_at_char( e.x, e.y, shift ); break; case EventType.DOUBLE_BUTTON_PRESS : node.name.set_cursor_at_word( e.x, e.y, shift ); break; case EventType.TRIPLE_BUTTON_PRESS : node.name.set_cursor_all( false ); break; } } else if( e.type == EventType.DOUBLE_BUTTON_PRESS ) { if( _current_node.is_within_image( scaled_x, scaled_y ) ) { edit_current_image(); return( false ); } else { _current_node.mode = NodeMode.EDITABLE; } } return( true ); } else { _current_new = false; if( _current_node != null ) { _current_node.mode = NodeMode.NONE; } _current_node = node; if( node.mode == NodeMode.NONE ) { node.mode = NodeMode.CURRENT; if( node.parent != null ) { node.parent.last_selected_child = node; } current_changed( this ); return( true ); } } return( false ); } /* Sets the current node pointer to the node that is within the given coordinates. Returns true if we sucessfully set current_node to a valid node and made it selected. */ private bool set_current_at_position( double x, double y, EventButton e ) { /* If the user clicked on a selected connection endpoint, disconnect that endpoint */ if( (_current_connection != null) && (_current_connection.mode == ConnMode.SELECTED) ) { if( _current_connection.within_from_handle( x, y ) ) { _last_connection = new Connection.from_connection( this, _current_connection ); _current_connection.disconnect_from_node( true ); return( true ); } else if( _current_connection.within_to_handle( x, y ) ) { _last_connection = new Connection.from_connection( this, _current_connection ); _current_connection.disconnect_from_node( false ); return( true ); } else if( _current_connection.within_drag_handle( x, y ) ) { _current_connection.mode = ConnMode.ADJUSTING; return( true ); } } if( (_attach_node == null) || (_current_connection == null) || ((_current_connection.mode != ConnMode.CONNECTING) && (_current_connection.mode != ConnMode.LINKING)) ) { Connection? match_conn = _current_connection; if( _current_connection == null ) { if( (match_conn = _connections.within_title( x, y )) == null ) { match_conn = _connections.on_curve( x, y ); } } else if( !_current_connection.within_drag_handle( x, y ) ) { if( (match_conn = _connections.within_title( x, y )) == null ) { match_conn = _connections.on_curve( x, y ); } } if( match_conn != null ) { clear_current_node( false ); return( set_current_connection_from_position( match_conn, e ) ); } else { for( int i=0; i<_nodes.length; i++ ) { var match_node = _nodes.index( i ).contains( x, y, null ); if( match_node != null ) { clear_current_connection( false ); return( set_current_node_from_position( match_node, e ) ); } } clear_current_node( true ); clear_current_connection( true ); if( _last_node != null ) { _current_node = _last_node; _current_node.mode = NodeMode.CURRENT; } } } return( true ); } /* Returns the supported scale points */ public static double[] get_scale_marks() { double[] marks = {10, 25, 50, 75, 100, 150, 200, 250, 300, 350, 400}; return( marks ); } /* Returns a properly scaled version of the given value */ private double scale_value( double val ) { return( val / sfactor ); } /* Sets the scaling factor for the drawing area, causing the center pixel to remain in the center and forces a redraw. */ public void set_scaling_factor( double sf ) { if( sfactor != sf ) { int width = get_allocated_width() / 2; int height = get_allocated_height() / 2; double diff_x = (width / sfactor) - (width / sf); double diff_y = (height / sfactor) - (height / sf); move_origin( diff_x, diff_y ); sfactor = sf; scale_changed( sfactor ); } } /* Returns the scaling factor based on the given width and height */ private double get_scaling_factor( double width, double height ) { double w = get_allocated_width() / width; double h = get_allocated_height() / height; double sf = (w < h) ? w : h; return( (sf > 4) ? 4 : sf ); } /* Zooms into the image by one scale mark. Returns true if the zoom was successful; otherwise, returns false. */ public bool zoom_in() { var value = sfactor * 100; var marks = get_scale_marks(); if( value < marks[0] ) { value = marks[0]; } foreach (double mark in marks) { if( value < mark ) { animator.add_scale( "zoom in" ); set_scaling_factor( mark / 100 ); animator.animate(); return( true ); } } return( false ); } /* Zooms out of the image by one scale mark. Returns true if the zoom was successful; otherwise, returns false. */ public bool zoom_out() { double value = sfactor * 100; var marks = get_scale_marks(); double last = marks[0]; if( value > marks[marks.length-1] ) { value = marks[marks.length-1]; } foreach (double mark in marks) { if( value <= mark ) { animator.add_scale( "zoom out" ); set_scaling_factor( last / 100 ); animator.animate(); return( true ); } last = mark; } return( false ); } /* Positions the given box in the canvas based on the provided x and y positions (values between 0 and 1). */ private void position_box( double x, double y, double w, double h, double xpos, double ypos ) { double ccx = scale_value( get_allocated_width() * xpos ); double ccy = scale_value( get_allocated_height() * ypos ); double ncx = x + (w * xpos); double ncy = y + (h * ypos); move_origin( (ncx - ccx), (ncy - ccy) ); } /* Returns the scaling factor required to display the currently selected node. If no node is currently selected, returns a value of 0. */ public void zoom_to_selected() { if( _current_node == null ) return; animator.add_pan_scale( "zoom to selected" ); var nb = _current_node.tree_bbox; position_box( nb.x, nb.y, nb.width, nb.height, 0.5, 0.5 ); set_scaling_factor( get_scaling_factor( nb.width, nb.height ) ); animator.animate(); } /* Figures out the boundaries of the document primarily for the purposes of printing */ public void document_rectangle( out double x, out double y, out double width, out double height ) { double x1 = 10000000; double y1 = 10000000; double x2 = -10000000; double y2 = -10000000; /* Calculate the overall size of the map */ for( int i=0; i<_nodes.length; i++ ) { var nb = _nodes.index( i ).tree_bbox; x1 = (x1 < nb.x) ? x1 : nb.x; y1 = (y1 < nb.y) ? y1 : nb.y; x2 = (x2 < (nb.x + nb.width)) ? (nb.x + nb.width) : x2; y2 = (y2 < (nb.y + nb.height)) ? (nb.y + nb.height) : y2; } /* Set the outputs */ x = x1; y = y1; width = (x2 - x1); height = (y2 - y1); } /* Returns the scaling factor required to display all nodes */ public void zoom_to_fit() { animator.add_scale( "zoom to fit" ); /* Get the document rectangle */ double x, y, w, h; document_rectangle( out x, out y, out w, out h ); /* Center the map and scale it to fit */ position_box( x, y, w, h, 0.5, 0.5 ); set_scaling_factor( get_scaling_factor( w, h ) ); /* Animate the scaling */ animator.animate(); } /* Scale to actual size */ public void zoom_actual() { /* Start animation */ animator.add_scale( "action_zoom_actual" ); /* Scale to a full scale */ set_scaling_factor( 1.0 ); /* Animate the scaling */ animator.animate(); } /* Centers the given node within the canvas by adjusting the origin */ public void center_node( Node n ) { double x, y, w, h; n.bbox( out x, out y, out w, out h ); animator.add_pan( "center node" ); position_box( x, y, w, h, 0.5, 0.5 ); animator.animate(); } /* Centers the currently selected node */ public void center_current_node() { if( _current_node != null ) { center_node( _current_node ); } } /* Brings the given node into view in its entirety including the given amount of padding */ public void see( double width_adjust = 0, double pad = 100.0 ) { double x, y, w, h; if( _current_connection != null ) { _current_connection.bbox( out x, out y, out w, out h ); } else if( _current_node != null ) { _current_node.bbox( out x, out y, out w, out h ); } else { return; } double diff_x = 0; double diff_y = 0; double sw = scale_value( get_allocated_width() + width_adjust ); double sh = scale_value( get_allocated_height() ); double sf = get_scaling_factor( (w + (pad * 2)), (h + (pad * 2)) ); if( (x - pad) < 0 ) { diff_x = (x - pad); } else if( (x + w) > sw ) { diff_x = (x + w + pad) - sw; } if( (y - pad) < 0 ) { diff_y = (y - pad); } else if( (y + h) > sh ) { diff_y = (y + h + pad) - sh; } if( (diff_x != 0) || (diff_y != 0) ) { if( sf >= sfactor ) { animator.add_pan( "see" ); move_origin( diff_x, diff_y ); } else { animator.add_pan_scale( "see" ); sfactor = sf; scale_changed( sfactor ); move_origin( diff_x, diff_y ); } animator.animate(); } } /* Returns the attachable node if one is found */ private Node? attachable_node( double x, double y ) { for( int i=0; i<_nodes.length; i++ ) { Node tmp = _nodes.index( i ).contains( x, y, _current_node ); if( (tmp != null) && (tmp != _current_node.parent) && !_current_node.contains_node( tmp ) ) { return( tmp ); } } return( null ); } /* Returns the droppable node if one is found */ private Node? droppable_node( double x, double y ) { for( int i=0; i<_nodes.length; i++ ) { Node tmp = _nodes.index( i ).contains( x, y, null ); if( tmp != null ) { return( tmp ); } } return( null ); } /* Returns the origin */ public void get_origin( out double x, out double y ) { x = origin_x; y = origin_y; } /* Sets the origin to the given x and y coordinates */ public void set_origin( double x, double y ) { move_origin( (x - origin_x), (y - origin_y) ); } /* Checks to see if the boundary of the map never goes out of view */ private bool out_of_bounds( double diff_x, double diff_y ) { double x, y, w, h; double aw = scale_value( get_allocated_width() ); double ah = scale_value( get_allocated_height() ); double s = 40; document_rectangle( out x, out y, out w, out h ); x -= diff_x; y -= diff_y; return( ((x + w) < s) || ((y + h) < s) || ((aw - x) < s) || ((ah - y) < s) ); } /* Adjusts the x and y origins, panning all elements by the given amount. Important Note: When the canvas is panned to the left (causing all nodes to be moved to the left, the origin_x value becomes a positive number. */ public void move_origin( double diff_x, double diff_y ) { if( out_of_bounds( diff_x, diff_y ) ) { return; } origin_x += diff_x; origin_y += diff_y; for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).pan( -diff_x, -diff_y ); } } /* Draw the background from the stylesheet */ public void draw_background( Context ctx ) { get_style_context().render_background( ctx, 0, 0, (get_allocated_width() / _scale_factor), (get_allocated_height() / _scale_factor) ); } /* Draws all of the root node trees */ public void draw_all( Context ctx ) { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).draw_all( ctx, _theme, _current_node, false, false ); } /* Draw the current node on top of all others */ if( (_current_node != null) && ((_current_node.parent == null) || !_current_node.parent.folded) ) { _current_node.draw_all( ctx, _theme, null, true, (!is_node_editable() && _pressed && _motion && !_resize) ); } /* Draw the current connection on top of everything else */ _connections.draw_all( ctx, _theme ); if( _current_connection != null ) { _current_connection.draw( ctx, _theme ); } } /* Draw the available nodes */ public bool on_draw( Context ctx ) { ctx.scale( sfactor, sfactor ); draw_background( ctx ); draw_all( ctx ); return( false ); } /* Displays the contextual menu based on what is currently selected */ private void show_contextual_menu( EventButton event ) { #if GTK322 if( _current_node != null ) { _node_menu.popup_at_pointer( event ); } else if( _current_connection != null ) { _conn_menu.popup_at_pointer( event ); } else { _empty_menu.popup_at_pointer( event ); } #else if( _current_node != null ) { _node_menu.popup( null, null, null, event.button, event.time ); } else if( _current_connection != null ) { _conn_menu.popup( null, null, null, event.button, event.time ); } else { _empty_menu.popup( null, null, null, event.button, event.time ); } #endif } /* Handle button press event */ private bool on_press( EventButton event ) { switch( event.button ) { case Gdk.BUTTON_PRIMARY : grab_focus(); _press_x = scale_value( event.x ); _press_y = scale_value( event.y ); _pressed = set_current_at_position( _press_x, _press_y, event ); _press_type = event.type; _motion = false; queue_draw(); break; case Gdk.BUTTON_SECONDARY : show_contextual_menu( event ); break; } return( false ); } /* Handle mouse motion */ private bool on_motion( EventMotion event ) { /* If the node is attached, clear it */ if( _attach_node != null ) { _attach_node.mode = NodeMode.NONE; _attach_node = null; queue_draw(); } double scaled_x = scale_value( event.x ); double scaled_y = scale_value( event.y ); /* If the mouse button is current pressed, handle it */ if( _pressed ) { /* If we are dealing with a connection, update it based on its mode */ if( _current_connection != null ) { switch( _current_connection.mode ) { case ConnMode.ADJUSTING : _current_connection.move_drag_handle( scaled_x, scaled_y ); queue_draw(); break; case ConnMode.CONNECTING : case ConnMode.LINKING : update_connection( event.x, event.y ); for( int i=0; i<_nodes.length; i++ ) { Node? match = _nodes.index( i ).contains( scaled_x, scaled_y, null ); if( match != null ) { _attach_node = match; _attach_node.mode = NodeMode.ATTACHABLE; break; } } break; } /* If we are dealing with a node, handle it based on its mode */ } else if( _current_node != null ) { double diffx = scaled_x - _press_x; double diffy = scaled_y - _press_y; if( _current_node.mode == NodeMode.CURRENT ) { if( _resize ) { _current_node.resize( diffx ); auto_save(); } else { Node attach_node = attachable_node( scaled_x, scaled_y ); if( attach_node != null ) { attach_node.mode = NodeMode.ATTACHABLE; _attach_node = attach_node; } _current_node.posx += diffx; _current_node.posy += diffy; _current_node.layout.set_side( _current_node ); } } else { switch( _press_type ) { case EventType.BUTTON_PRESS : _current_node.name.set_cursor_at_char( scaled_x, scaled_y, true ); break; case EventType.DOUBLE_BUTTON_PRESS : _current_node.name.set_cursor_at_word( scaled_x, scaled_y, true ); break; } } queue_draw(); /* Otherwise, we are panning the canvas */ } else { double diff_x = _press_x - scaled_x; double diff_y = _press_y - scaled_y; move_origin( diff_x, diff_y ); queue_draw(); auto_save(); } if( !_motion && !_resize && (_current_node != null) ) { _current_node.alpha = 0.3; } _press_x = scaled_x; _press_y = scaled_y; _motion = true; } else { if( _current_connection != null ) { if( (_current_connection.mode == ConnMode.CONNECTING) || (_current_connection.mode == ConnMode.LINKING) ) { update_connection( event.x, event.y ); } if( _current_connection.within_drag_handle( scaled_x, scaled_y ) || _current_connection.within_from_handle( scaled_x, scaled_y ) || _current_connection.within_to_handle( scaled_x, scaled_y ) ) { set_cursor_from_name( "move" ); return( false ); } else if( _current_connection.within_note( scaled_x, scaled_y ) ) { set_tooltip_markup( _current_connection.note ); return( false ); } } else { Connection? match_conn = _connections.within_note( scaled_x, scaled_y ); if( match_conn != null ) { set_tooltip_markup( match_conn.note ); return( false ); } } for( int i=0; i<_nodes.length; i++ ) { Node match = _nodes.index( i ).contains( scaled_x, scaled_y, null ); if( match != null ) { if( (_current_connection != null) && ((_current_connection.mode == ConnMode.CONNECTING) || (_current_connection.mode == ConnMode.LINKING)) ) { _attach_node = match; _attach_node.mode = NodeMode.ATTACHABLE; } else if( match.is_within_task( scaled_x, scaled_y ) ) { set_cursor( CursorType.HAND1 ); set_tooltip_markup( _( "%0.3g%% complete" ).printf( match.task_completion_percentage() ) ); } else if( match.is_within_note( scaled_x, scaled_y ) ) { set_tooltip_markup( match.note ); } else if( match.is_within_linked_node( scaled_x, scaled_y ) ) { set_cursor( CursorType.HAND1 ); } else if( match.is_within_resizer( scaled_x, scaled_y ) ) { set_cursor( CursorType.SB_H_DOUBLE_ARROW ); set_tooltip_markup( null ); } else { set_cursor( null ); set_tooltip_markup( null ); } return( false ); } } set_cursor( null ); set_tooltip_markup( null ); } return( false ); } /* Handle button release event */ private bool on_release( EventButton event ) { _pressed = false; /* Return the cursor to the default cursor */ if( _motion ) { set_cursor( null ); } /* If we were resizing a node, end the resize */ if( _resize ) { _resize = false; undo_buffer.add_item( new UndoNodeResize( _current_node, _orig_width ) ); return( false ); } /* If a connection is selected, deal with the possibilities */ if( _current_connection != null ) { /* If the connection end is released on an attachable node, attach the connection to the node */ if( _attach_node != null ) { if( _current_connection.mode == ConnMode.LINKING ) { end_link( _attach_node ); } else { end_connection( _attach_node ); if( _last_connection != null ) { undo_buffer.add_item( new UndoConnectionChange( _( "connection endpoint change" ), _last_connection, _current_connection ) ); } } _last_connection = null; /* If we were dragging the connection midpoint, change the connection mode to SELECTED */ } else if( _current_connection.mode == ConnMode.ADJUSTING ) { undo_buffer.add_item( new UndoConnectionChange( _( "connection drag" ), _last_connection, _current_connection ) ); _current_connection.mode = ConnMode.SELECTED; auto_save(); /* If we were dragging a connection end and failed to attach it to a node, return the connection to where it was prior to the drag */ } else if( _last_connection != null ) { _current_connection.copy( this, _last_connection ); _last_connection = null; } queue_draw(); /* If a node is selected, deal with the possibilities */ } else if( _current_node != null ) { if( _current_node.mode == NodeMode.CURRENT ) { /* If we are hovering over an attach node, perform the attachment */ if( _attach_node != null ) { attach_current_node(); /* If we are not in motion, set the cursor */ } else if( !_motion ) { _current_node.name.set_cursor_all( false ); _orig_name = _current_node.name.text; _current_node.name.move_cursor_to_end(); /* If we are not a root node, move the node into the appropriate position */ } else if( _current_node.parent != null ) { int orig_index = _current_node.index(); animator.add_nodes( "move to position" ); _current_node.parent.move_to_position( _current_node, _orig_side, scale_value( event.x ), scale_value( event.y ) ); undo_buffer.add_item( new UndoNodeMove( _current_node, _orig_side, orig_index ) ); animator.animate(); /* Otherwise, redraw everything after the move */ } else { queue_draw(); } } } /* If motion is set, clear it and clear the alpha */ if( _motion ) { if( _current_node != null ) { _current_node.alpha = 1.0; } _motion = false; } return( false ); } /* Attaches the current node to the attach node */ private void attach_current_node() { Node? orig_parent = null; int orig_index = -1; bool isroot = _current_node.is_root(); /* Remove the current node from its current location */ if( isroot ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { _nodes.remove_index( i ); orig_index = i; break; } } } else { orig_parent = _current_node.parent; orig_index = _current_node.index(); _current_node.detach( _orig_side ); } /* Attach the node */ _current_node.attach( _attach_node, -1, _theme ); _attach_node.mode = NodeMode.NONE; _attach_node = null; /* Add the attachment information to the undo buffer */ if( isroot ) { undo_buffer.add_item( new UndoNodeAttach.for_root( _current_node, orig_index, _orig_info ) ); } else { undo_buffer.add_item( new UndoNodeAttach( _current_node, orig_parent, _orig_side, orig_index, _orig_info ) ); } queue_draw(); changed(); current_changed( this ); } /* Returns true if we are connecting a connection title */ public bool is_connection_connecting() { return( (_current_connection != null) && (_current_connection.mode == ConnMode.CONNECTING) ); } /* Returns true if we are editing a connection title */ public bool is_connection_editable() { return( (_current_connection != null) && (_current_connection.mode == ConnMode.EDITABLE) ); } /* Returns true if the current connection is in the selected state */ public bool is_connection_selected() { return( (_current_connection != null) && (_current_connection.mode == ConnMode.SELECTED) ); } /* Returns true if we are in node edit mode */ public bool is_node_editable() { return( (_current_node != null) && (_current_node.mode == NodeMode.EDITABLE) ); } /* Returns true if we are in node selected mode */ public bool is_node_selected() { return( (_current_node != null) && (_current_node.mode == NodeMode.CURRENT) ); } /* Returns the next node to select after the current node is removed */ private Node? next_node_to_select() { if( _current_node != null ) { if( _current_node.is_root() ) { if( _nodes.length > 1 ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { if( i == 0 ) { return( _nodes.index( 1 ) ); } else if( (i + 1) == _nodes.length ) { return( _nodes.index( i - 1 ) ); } break; } } } } else { Node? next = _current_node.parent.next_child( _current_node ); if( next == null ) { next = _current_node.parent.prev_child( _current_node ); if( next == null ) { next = _current_node.parent; } } return( next ); } } return( null ); } /* If the specified node is not null, selects the node and makes it the current node */ private bool select_node( Node? n ) { if( n != null ) { if( n != _current_node ) { if( _current_node != null ) { _current_node.mode = NodeMode.NONE; _current_node.alpha = _focus_mode ? _focus_alpha : 1.0; } _current_node = n; _current_new = false; _current_node.mode = NodeMode.CURRENT; update_focus_mode(); if( _current_node.parent != null ) { _current_node.parent.last_selected_child = n; } see(); current_changed( this ); } return( true ); } return( false ); } /* Returns true if there is a root that is available for selection */ public bool root_selectable() { return( (_current_connection == null) && ((_current_node == null) ? (_nodes.length > 0) : (_current_node.get_root() != _current_node)) ); } /* If there is no current node, selects the first root node; otherwise, selects the current node's root node. */ public void select_root_node() { if( _current_connection != null ) return; if( _current_node == null ) { if( _nodes.length > 0 ) { if( select_node( _nodes.index( 0 ) ) ) { queue_draw(); } } } else if( select_node( _current_node.get_root() ) ) { queue_draw(); } } /* Returns true if there is a sibling available for selection */ public bool sibling_selectable() { return( (_current_node != null) && (_current_node.is_root() ? (_nodes.length > 1) : (_current_node.parent.children().length > 1)) ); } /* Returns the sibling node in the given direction of the current node */ public Node? sibling_node( int dir ) { if( _current_node != null ) { if( _current_node.is_root() ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { return( (((i + dir) < 0) || ((i + dir) >= _nodes.length)) ? null : _nodes.index( i + dir ) ); } } } else if( dir == 1 ) { return( _current_node.parent.next_child( _current_node ) ); } else { return( _current_node.parent.prev_child( _current_node ) ); } } return( null ); } /* Selects the next (dir = 1) or previous (dir = -1) sibling */ public void select_sibling_node( int dir ) { if( _current_node != null ) { Array nodes; int index = 0; if( _current_node.is_root() ) { nodes = _nodes; for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { index = i; break; } } } else { nodes = _current_node.parent.children(); index = _current_node.index(); } if( (index + dir) < 0 ) { if( select_node( nodes.index( nodes.length - 1 ) ) ) { queue_draw(); } } else { if( select_node( nodes.index( (index + dir) % nodes.length ) ) ) { queue_draw(); } } } } /* Returns true if there is a child node of the current node */ public bool child_selectable() { return( (_current_node != null) && !_current_node.is_leaf() && !_current_node.folded ); } /* Selects the last selected child node of the current node */ public void select_child_node() { if( (_current_node != null) && !_current_node.is_leaf() && !_current_node.folded ) { if( select_node( _current_node.last_selected_child ?? _current_node.children().index( 0 ) ) ) { queue_draw(); } } } /* Returns true if there is a parent node of the current node */ public bool parent_selectable() { return( (_current_node != null) && !_current_node.is_root() ); } /* Selects the parent node of the current node */ public void select_parent_node() { if( (_current_node != null) && !_current_node.is_root() ) { if( select_node( _current_node.parent ) ) { queue_draw(); } } } /* Selects the node that is linked to this node */ public void select_linked_node( Node? node=null ) { if( node == null ) { node = _current_node; } if( (node != null) && (node.linked_node != null) ) { if( select_node( node.linked_node ) ) { queue_draw(); } } } /* Selects the given connection node */ public void select_connection_node( bool start ) { if( _current_connection != null ) { if( select_node( start ? _current_connection.from_node : _current_connection.to_node ) ) { clear_current_connection( true ); queue_draw(); } } } /* Selects the next connection in the list */ public void select_connection( int dir ) { if( _current_connection == null ) return; Connection? conn = _connections.get_connection( _current_connection, dir ); if( conn != null ) { set_current_connection( conn ); see(); queue_draw(); } } /* Selects the first connection in the list */ public void select_attached_connection() { if( _current_node == null ) return; if( _current_node.last_selected_connection != null ) { set_current_connection( _current_node.last_selected_connection ); see(); queue_draw(); } else { Connection? conn = _connections.get_attached_connection( _current_node ); if( conn != null ) { set_current_connection( conn ); see(); queue_draw(); } } } /* Deletes the given node */ public void delete_node() { if( _current_node == null ) return; Node? next_node = next_node_to_select(); var conns = new Array(); _connections.node_deleted( _current_node, conns ); if( _current_node.is_root() ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { undo_buffer.add_item( new UndoNodeDelete( _current_node, i, conns ) ); _nodes.remove_index( i ); break; } } } else { undo_buffer.add_item( new UndoNodeDelete( _current_node, _current_node.index(), conns ) ); _current_node.delete(); } _current_node.mode = NodeMode.NONE; _current_node = null; current_changed( this ); select_node( next_node ); queue_draw(); changed(); } /* Called whenever the backspace character is entered in the drawing area */ private void handle_backspace() { if( is_connection_editable() ) { _current_connection.title.backspace(); queue_draw(); changed(); } else if( is_connection_selected() ) { delete_connection(); } else if( is_node_editable() ) { _current_node.name.backspace(); queue_draw(); changed(); } else if( is_node_selected() ) { Node? next; if( ((next = sibling_node( 1 )) == null) && ((next = sibling_node( -1 )) == null) && _current_node.is_root() ) { delete_node(); } else { if( next == null ) { next = _current_node.parent; } delete_node(); if( select_node( next ) ) { queue_draw(); } } } } /* Called whenever the delete character is entered in the drawing area */ private void handle_delete() { if( is_connection_editable() ) { _current_connection.title.delete(); queue_draw(); changed(); } else if( is_connection_selected() ) { delete_connection(); } else if( is_node_editable() ) { _current_node.name.delete(); queue_draw(); changed(); } else if( is_node_selected() ) { delete_node(); } } /* Called whenever the escape character is entered in the drawing area */ private void handle_escape() { if( is_connection_editable() ) { _im_context.reset(); _current_connection.edit_title_end(); undo_buffer.add_item( new UndoConnectionTitle( _current_connection, _orig_title ) ); _current_connection.mode = ConnMode.SELECTED; current_changed( this ); queue_draw(); } else if( is_node_editable() ) { _im_context.reset(); if( !_current_new ) { undo_buffer.add_item( new UndoNodeName( _current_node, _orig_name ) ); } _current_node.mode = NodeMode.CURRENT; current_changed( this ); queue_draw(); } else if( is_connection_connecting() ) { _connections.remove_connection( _current_connection, true ); _current_connection = null; if( _attach_node != null ) { _attach_node.mode = NodeMode.NONE; _attach_node = null; } _current_node = _last_node; _current_node.mode = NodeMode.CURRENT; _last_connection = null; queue_draw(); } else if( is_node_selected() ) { hide_properties(); } } /* Adds a new root node to the canvas */ public void add_root_node() { var node = new Node.with_name( this, _( "Another Idea" ), _nodes.index( 0 ).layout ); node.style = StyleInspector.styles.get_global_style(); if (_nodes.length == 0) { node.posx = (get_allocated_width() / 2) - 30; node.posy = (get_allocated_height() / 2) - 10; } else { _nodes.index( _nodes.length - 1 ).layout.position_root( _nodes.index( _nodes.length - 1 ), node ); } _nodes.append_val( node ); if( select_node( node ) ) { node.mode = NodeMode.EDITABLE; _current_new = true; queue_draw(); } see(); changed(); } /* Adds a new sibling node to the current node */ public void add_sibling_node() { var node = new Node( this, layouts.get_default() ); _orig_name = ""; _current_node.mode = NodeMode.NONE; node.side = _current_node.side; node.style = _current_node.style; node.style = StyleInspector.styles.get_style_for_level( _current_node.get_level(), _current_node.style ); node.attach( _current_node.parent, (_current_node.index() + 1), _theme ); undo_buffer.add_item( new UndoNodeInsert( node ) ); set_current_node( node ); node.mode = NodeMode.EDITABLE; _current_new = true; queue_draw(); see(); changed(); } /* Called whenever the return character is entered in the drawing area */ private void handle_return() { if( is_connection_editable() ) { _current_connection.edit_title_end(); undo_buffer.add_item( new UndoConnectionTitle( _current_connection, _orig_title ) ); _current_connection.mode = ConnMode.SELECTED; current_changed( this ); queue_draw(); } else if( is_node_editable() ) { if( !_current_new ) { undo_buffer.add_item( new UndoNodeName( _current_node, _orig_name ) ); } _current_node.mode = NodeMode.CURRENT; if( _create_new_from_edit ) { if( !_current_node.is_root() ) { add_sibling_node(); } else { add_root_node(); } } else { current_changed( this ); queue_draw(); } } else if( is_connection_connecting() && (_attach_node != null) ) { end_connection( _attach_node ); } else if( is_node_selected() ) { if( !_current_node.is_root() ) { add_sibling_node(); } else { add_root_node(); } } } /* Called whenever the user hits a Control-Return key. Causes a newline to be inserted */ private void handle_control_return() { if( is_connection_editable() ) { _current_connection.title.insert( "\n" ); current_changed( this ); queue_draw(); } else if( is_node_editable() ) { _current_node.name.insert( "\n" ); see(); current_changed( this ); queue_draw(); } } /* Returns the index of the given root node */ public int root_index( Node root ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == root ) { return( i ); } } return( -1 ); } /* Adds the given node to the list of root nodes */ public void add_root( Node n, int index ) { if( index == -1 ) { _nodes.append_val( n ); } else { _nodes.insert_val( index, n ); } } /* Removes the node at the given root index from the list of root nodes */ public void remove_root( int index ) { _nodes.remove_index( index ); } /* Returns true if the drawing area has a node that is available for detaching */ public bool detachable() { return( (_current_node != null) && (_current_node.parent != null) ); } /* Detaches the current node from its parent and adds it as a root node */ public void detach() { if( !detachable() ) return; Node parent = _current_node.parent; int index = _current_node.index(); int root_index = (int)_nodes.length; NodeSide side = _current_node.side; _current_node.detach( side ); add_root( _current_node, -1 ); undo_buffer.add_item( new UndoNodeDetach( _current_node, root_index, parent, side, index ) ); queue_draw(); changed(); } /* Balances the existing nodes based on the current layout */ public void balance_nodes( bool undoable = true ) { Node? root_node = (_current_node == null) ? null : _current_node.get_root(); if( undoable ) { undo_buffer.add_item( new UndoNodeBalance( this, root_node ) ); } if( (_current_node == null) || !undoable ) { animator.add_nodes( "balance nodes" ); for( int i=0; i<_nodes.length; i++ ) { var partitioner = new Partitioner(); partitioner.partition_node( _nodes.index( i ) ); } } else { animator.add_node( root_node, "balance tree" ); var partitioner = new Partitioner(); partitioner.partition_node( root_node ); } animator.animate(); grab_focus(); } /* Returns true if there is at least one node that can be folded due to completed tasks */ public bool completed_tasks_foldable() { if( _current_node != null ) { return( _current_node.get_root().completed_tasks_foldable() ); } else { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ).completed_tasks_foldable() ) { return( true ); } } } return( false ); } /* Folds all completed tasks found in any tree */ public void fold_completed_tasks() { var changes = new Array(); if( _current_node == null ) { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).fold_completed_tasks( ref changes ); } } else { _current_node.get_root().fold_completed_tasks( ref changes ); } if( changes.length > 0 ) { for( int i=0; i(); if( _current_node != null ) { _current_node.get_root().set_fold( false, ref changes ); } else { for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).set_fold( false, ref changes ); } } if( changes.length > 0 ) { for( int i=0; i 0 ) { node.style = _current_node.last_child().style; } else { node.style = _current_node.style; } node.style = StyleInspector.styles.get_style_for_level( (_current_node.get_level() + 1), _current_node.style ); node.attach( _current_node, -1, _theme ); undo_buffer.add_item( new UndoNodeInsert( node ) ); _current_node.folded = false; _current_node.layout.handle_update_by_fold( _current_node ); set_current_node( node ); node.mode = NodeMode.EDITABLE; queue_draw(); see(); changed(); } /* Called whenever the tab character is entered in the drawing area */ private void handle_tab() { if( is_node_editable() ) { if( !_current_new ) { undo_buffer.add_item( new UndoNodeName( _current_node, _orig_name ) ); } _current_node.mode = NodeMode.CURRENT; if( _create_new_from_edit ) { add_child_node(); } else { current_changed( this ); queue_draw(); } } else if( is_node_selected() ) { add_child_node(); } } /* Called whenever the Control-Tab key combo is entered. Causes a tabe character to be inserted into the title. */ private void handle_control_tab() { if( is_node_editable() ) { _current_node.name.insert( "\t" ); see(); current_changed( this ); queue_draw(); } } /* Returns the node to the right of the given node */ private Node? get_node_right( Node node ) { if( node.is_root() ) { return( node.last_selected_child ?? node.first_child( NodeSide.RIGHT ) ); } else { switch( node.side ) { case NodeSide.TOP : case NodeSide.BOTTOM : return( node.parent.next_child( node ) ); case NodeSide.LEFT : return( node.parent ); default : return( node.last_selected_child ?? node.first_child( NodeSide.RIGHT ) ); } } } /* Returns the node to the left of the given node */ private Node? get_node_left( Node node ) { if( node.is_root() ) { return( node.last_selected_child ?? node.first_child( NodeSide.LEFT ) ); } else { switch( node.side ) { case NodeSide.TOP : case NodeSide.BOTTOM : return( node.parent.prev_child( node ) ); case NodeSide.LEFT : return( node.last_selected_child ?? node.first_child( NodeSide.LEFT ) ); default : return( node.parent ); } } } /* Returns the node above the given node */ private Node? get_node_up( Node node ) { if( node.is_root() ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == node ) { return( (i > 0) ? _nodes.index( i - 1 ) : null ); } } return( null ); } else { switch( node.side ) { case NodeSide.TOP : return( node.last_selected_child ?? node.first_child( NodeSide.TOP ) ); case NodeSide.BOTTOM : return( node.parent ); default : return( node.parent.prev_child( node ) ); } } } /* Returns the node below the given node */ private Node? get_node_down( Node node ) { if( node.is_root() ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == node ) { return( ((i + 1) < _nodes.length) ? _nodes.index( i + 1 ) : null ); } } return( null ); } else { switch( node.side ) { case NodeSide.TOP : return( node.parent ); case NodeSide.BOTTOM : return( node.last_selected_child ?? node.first_child( NodeSide.BOTTOM ) ); default : return( node.parent.next_child( node ) ); } } } /* Returns the node at the top of the sibling list */ private Node? get_node_pageup( Node node ) { if( node.is_root() ) { return( (_nodes.length > 0) ? _nodes.index( 0 ) : null ); } else { return( node.parent.first_child() ); } } /* Returns the node at the top of the sibling list */ private Node? get_node_pagedn( Node node ) { if( node.is_root() ) { return( (_nodes.length > 0) ? _nodes.index( _nodes.length - 1 ) : null ); } else { return( node.parent.last_child() ); } } /* Called whenever the right key is entered in the drawing area */ private void handle_right( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_by_char( 1 ); } else { _current_connection.title.move_cursor( 1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_by_char( 1 ); } else { _current_node.name.move_cursor( 1 ); } queue_draw(); } else if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_right( _attach_node ) ); } else if( is_connection_selected() ) { select_connection( 1 ); } else if( is_node_selected() ) { if( select_node( get_node_right( _current_node ) ) ) { queue_draw(); } } } /* Called whenever the Control-right key combo is entered. Moves the cursor one word to the right. */ private void handle_control_right( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_by_word( 1 ); } else { _current_connection.title.move_cursor_by_word( 1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_by_word( 1 ); } else { _current_node.name.move_cursor_by_word( 1 ); } queue_draw(); } } /* Called whenever the left key is entered in the drawing area */ private void handle_left( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_by_char( -1 ); } else { _current_connection.title.move_cursor( -1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_by_char( -1 ); } else { _current_node.name.move_cursor( -1 ); } queue_draw(); } else if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_left( _attach_node ) ); } else if( is_connection_selected() ) { select_connection( -1 ); } else if( is_node_selected() ) { if( select_node( get_node_left( _current_node ) ) ) { queue_draw(); } } } /* If Control is used, jumps the cursor to the end of the previous word. If Control-Shift is used, adds the previous word to the selection. */ private void handle_control_left( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_by_word( -1 ); } else { _current_connection.title.move_cursor_by_word( -1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_by_word( -1 ); } else { _current_node.name.move_cursor_by_word( -1 ); } queue_draw(); } } /* Selects all of the text in the current node */ private void handle_control_slash() { if( is_connection_editable() ) { _current_connection.title.set_cursor_all( false ); queue_draw(); } else if( is_node_editable() ) { _current_node.name.set_cursor_all( false ); queue_draw(); } } /* Deselects all of the text in the current node */ private void handle_control_backslash() { if( is_connection_editable() ) { _current_connection.title.clear_selection(); queue_draw(); } else if( is_node_editable() ) { _current_node.name.clear_selection(); queue_draw(); } } /* Handles the emoji insertion process for the given text item */ private void insert_emoji( CanvasText text ) { var overlay = (Overlay)get_parent(); var entry = new Entry(); int x, ytop, ybot; text.get_cursor_pos( out x, out ytop, out ybot ); entry.margin_start = x; entry.margin_top = ytop + ((ybot - ytop) / 2); entry.changed.connect(() => { text.insert( entry.text ); entry.unparent(); grab_focus(); }); overlay.add_overlay( entry ); entry.insert_emoji(); } /* Called whenever the period key is entered with the control key */ private void handle_control_period() { if( is_node_editable() ) { insert_emoji( _current_node.name ); } else if( is_connection_editable() ) { insert_emoji( _current_connection.title ); } } /* Displays the quick entry UI */ public void handle_control_e() { var quick_entry = new QuickEntry( this, _settings ); quick_entry.show_all(); } /* Closes the current tab */ private void handle_control_w() { win.close_current_tab(); } /* Called whenever the home key is entered in the drawing area */ private void handle_home() { if( is_connection_editable() ) { _current_connection.title.move_cursor_to_start(); queue_draw(); } else if( is_node_editable() ) { _current_node.name.move_cursor_to_start(); queue_draw(); } } /* Called whenever the end key is entered in the drawing area */ private void handle_end() { if( is_connection_editable() ) { _current_connection.title.move_cursor_to_end(); queue_draw(); } else if( is_node_editable() ) { _current_node.name.move_cursor_to_end(); queue_draw(); } } /* Called whenever the up key is entered in the drawing area */ private void handle_up( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_vertically( -1 ); } else { _current_connection.title.move_cursor_vertically( -1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_vertically( -1 ); } else { _current_node.name.move_cursor_vertically( -1 ); } queue_draw(); } else if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_up( _attach_node ) ); } else if( is_node_selected() ) { if( select_node( get_node_up( _current_node ) ) ) { queue_draw(); } } } /* If the Control key is used, jumps the cursor to the beginning of the text. If Control-Shift is used, selects everything from the beginnning of the string to the cursor position. */ private void handle_control_up( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_to_start(); } else { _current_connection.title.move_cursor_to_start(); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_to_start(); } else { _current_node.name.move_cursor_to_start(); } queue_draw(); } } /* Called whenever the down key is entered in the drawing area */ private void handle_down( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_vertically( 1 ); } else { _current_connection.title.move_cursor_vertically( 1 ); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_vertically( 1 ); } else { _current_node.name.move_cursor_vertically( 1 ); } queue_draw(); } else if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_down( _attach_node ) ); } else if( is_node_selected() ) { if( select_node( get_node_down( _current_node ) ) ) { queue_draw(); } } } /* If the Control key is used, jumps the cursor to the end of the text. If Control-Shift is used, selects all text from the current cursor position to the end of the string. */ private void handle_control_down( bool shift ) { if( is_connection_editable() ) { if( shift ) { _current_connection.title.selection_to_end(); } else { _current_connection.title.move_cursor_to_end(); } queue_draw(); } else if( is_node_editable() ) { if( shift ) { _current_node.name.selection_to_end(); } else { _current_node.name.move_cursor_to_end(); } queue_draw(); } } /* Called whenever the page up key is entered in the drawing area */ private void handle_pageup() { if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_pageup( _attach_node ) ); } else if( is_node_selected() ) { if( select_node( get_node_pageup( _current_node ) ) ) { queue_draw(); } } } /* Called whenever the page down key is entered in the drawing area */ private void handle_pagedn() { if( is_connection_connecting() && (_attach_node != null) ) { update_connection_by_node( get_node_pagedn( _attach_node ) ); } else if( is_node_selected() ) { if( select_node( get_node_pagedn( _current_node ) ) ) { queue_draw(); } } } /* Called whenever a printable character is entered in the drawing area */ private void handle_printable( string str ) { if( str.get_char( 0 ).isprint() ) { if( is_connection_editable() ) { _current_connection.title.insert( str ); queue_draw(); changed(); } else if( is_node_editable() ) { _current_node.name.insert( str ); see(); queue_draw(); changed(); } else if( is_connection_selected() ) { switch( str ) { case "e" : _current_connection.edit_title_begin( this ); _current_connection.mode = ConnMode.EDITABLE; queue_draw(); break; case "t" : select_connection_node( false ); break; case "f" : select_connection_node( true ); break; case "n" : select_connection( 1 ); break; case "p" : select_connection( -1 ); break; case "i" : show_properties( "current", false ); break; case "u" : // Perform undo if( undo_buffer.undoable() ) { undo_buffer.undo(); } break; case "r" : // Perform redo if( undo_buffer.redoable() ) { undo_buffer.redo(); } break; case "s" : see(); break; case "z" : zoom_out(); break; case "Z" : zoom_in(); break; default : return; } } else if( is_node_selected() ) { switch( str ) { case "e" : _current_node.mode = NodeMode.EDITABLE; queue_draw(); break; case "n" : select_sibling_node( 1 ); break; case "p" : select_sibling_node( -1 ); break; case "a" : select_parent_node(); break; case "f" : toggle_fold( _current_node ); break; case "t" : // Toggle the task done indicator if( _current_node.is_task() ) { toggle_task( _current_node ); } break; case "m" : select_root_node(); break; case "c" : select_child_node(); break; case "C" : center_current_node(); break; case "i" : show_properties( "current", false ); break; case "I" : if( _debug ) { _current_node.display(); } break; case "u" : // Perform undo if( undo_buffer.undoable() ) { undo_buffer.undo(); } break; case "r" : // Perform redo if( undo_buffer.redoable() ) { undo_buffer.redo(); } break; case "s" : see(); break; case "S" : sort_alphabetically(); break; case "z" : zoom_out(); break; case "Z" : zoom_in(); break; case "h" : handle_left( false ); break; case "j" : handle_down( false ); break; case "k" : handle_up( false ); break; case "l" : handle_right( false ); break; case "y" : toggle_link(); break; case "Y" : select_linked_node(); break; case "x" : start_connection( true, false ); break; case "X" : select_attached_connection(); break; default : // This is a key that doesn't have any associated functionality // so just return immediately so that we don't force a redraw return; } } } } /* Handle a key event */ private bool on_keypress( EventKey e ) { /* Figure out which modifiers were used */ var control = (bool)(e.state & ModifierType.CONTROL_MASK); var shift = (bool)(e.state & ModifierType.SHIFT_MASK); var nomod = !(control || shift); /* If there is a current node or connection selected, operate on it */ if( (_current_node != null) || (_current_connection != null) ) { if( control ) { switch( e.keyval ) { case 99 : do_copy(); break; case 120 : do_cut(); break; case 118 : do_paste(); break; case 65293 : handle_control_return(); break; case 65289 : handle_control_tab(); break; case 65363 : handle_control_right( shift ); break; case 65361 : handle_control_left( shift ); break; case 65362 : handle_control_up( shift ); break; case 65364 : handle_control_down( shift ); break; case 47 : handle_control_slash(); break; case 92 : handle_control_backslash(); break; case 46 : handle_control_period(); break; case 101 : handle_control_e(); break; case 119 : handle_control_w(); break; } } else if( nomod || shift ) { if( _im_context.filter_keypress( e ) ) { return( true ); } switch( e.keyval ) { case 65288 : handle_backspace(); break; case 65535 : handle_delete(); break; case 65307 : handle_escape(); break; case 65293 : handle_return(); break; case 65289 : handle_tab(); break; case 65363 : handle_right( shift ); break; case 65361 : handle_left( shift ); break; case 65360 : handle_home(); break; case 65367 : handle_end(); break; case 65362 : handle_up( shift ); break; case 65364 : handle_down( shift ); break; case 65365 : handle_pageup(); break; case 65366 : handle_pagedn(); break; default : //if( !e.str.get_char( 0 ).isprint() ) { // stdout.printf( "In on_keypress, keyval: %s\n", e.keyval.to_string() ); //} handle_printable( e.str ); break; } } /* If there is no current node, allow some of the keyboard shortcuts */ } else if( nomod || shift ) { switch( e.str ) { case "m" : select_root_node(); break; case "u" : if( undo_buffer.undoable() ) undo_buffer.undo(); break; case "r" : if( undo_buffer.redoable() ) undo_buffer.redo(); break; case "z" : zoom_out(); break; case "Z" : zoom_in(); break; } } return( true ); } /* Returns true if we can perform a node copy operation */ public bool node_copyable() { return( _current_node != null ); } /* Returns true if we can perform a node cut operation */ public bool node_cuttable() { return( _current_node != null ); } /* Returns true if we can perform a node paste operation */ public bool node_pasteable() { return( node_clipboard.wait_is_text_available() ); } /* Serializes the current node tree */ public string serialize_for_copy( Node node ) { string str; Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* root = new Xml.Node( null, "minder" ); doc->set_root_element( root ); Xml.Node* nodes = new Xml.Node( null, "nodes" ); node.save( nodes ); root->add_child( nodes ); Xml.Node* conns = new Xml.Node( null, "connections" ); _connections.save_if_in_node( conns, node ); root->add_child( conns ); doc->dump_memory( out str ); delete doc; return( str ); } /* Deserializes the paste string and returns the list of nodes */ public void deserialize_for_paste( string str, Array nodes, Array conns, HashMap id_map, Array link_ids ) { Xml.Doc* doc = Xml.Parser.parse_doc( str ); if( doc == null ) return; for( Xml.Node* it = doc->get_root_element()->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { // case "images" : image_manager.load( it ); break; case "connections" : _connections.load( this, it, conns, nodes, id_map ); break; case "nodes" : for( Xml.Node* it2 = it->children; it2 != null; it2 = it2->next ) { if( (it2->type == Xml.ElementType.ELEMENT_NODE) && (it2->name == "node") ) { var node = new Node.with_name( this, "temp", null ); node.load( this, it2, true, id_map, link_ids ); nodes.append_val( node ); } } break; } } } for( int i=0; i(); _connections.node_deleted( _current_node, conns ); copy_node_to_clipboard(); if( _current_node.is_root() ) { for( int i=0; i<_nodes.length; i++ ) { if( _nodes.index( i ) == _current_node ) { undo_buffer.add_item( new UndoNodeCut( _current_node, i, conns ) ); _nodes.remove_index( i ); break; } } } else { undo_buffer.add_item( new UndoNodeCut( _current_node, _current_node.index(), conns ) ); _current_node.delete(); } _current_node.mode = NodeMode.NONE; _current_node = null; current_changed( this ); select_node( next_node ); queue_draw(); changed(); } /* Cuts the current selected text to the clipboard */ private void cut_selected_text() { copy_selected_text(); if( _current_node != null ) { _current_node.name.insert( "" ); } else if( _current_connection != null ) { _current_connection.title.insert( "" ); } queue_draw(); changed(); } /* Either cuts the current node or cuts the currently selected text */ public void do_cut() { if( _current_node != null ) { switch( _current_node.mode ) { case NodeMode.CURRENT : cut_node_to_clipboard(); break; case NodeMode.EDITABLE : cut_selected_text(); break; } } else if( is_connection_editable() ) { cut_selected_text(); } } /* Pastes the clipboard content as either a root node or to the currently selected node. */ public void paste_node_from_clipboard() { if( !node_clipboard.wait_is_text_available() ) return; var nodes = new Array(); var conns = new Array(); var id_map = new HashMap(); var link_ids = new Array(); deserialize_for_paste( node_clipboard.wait_for_text(), nodes, conns, id_map, link_ids ); if( _current_node == null ) { for( int i=0; i 0 ) { for( int i=0; i 0 ) { zoom_out(); } return( false ); } /* Adjust the origin and redraw */ move_origin( (delta_x * 120), (delta_y * 120) ); queue_draw(); /* When the end of the scroll occurs, save the scroll position to the file */ auto_save(); return( false ); } /* Perform an automatic save for times when changes may be happening rapidly */ private void auto_save() { if( _auto_save_id != null ) { Source.remove( _auto_save_id ); } _auto_save_id = Timeout.add( 200, do_auto_save ); } /* Allows the document to be auto-saved after a scroll event */ private bool do_auto_save() { _auto_save_id = null; changed(); return( false ); } /* Called whenever we drag something over the canvas */ private bool handle_drag_motion( Gdk.DragContext ctx, int x, int y, uint t ) { Node attach_node = droppable_node( scale_value( x ), scale_value( y ) ); if( _attach_node != null ) { _attach_node.mode = NodeMode.NONE; } if( attach_node != null ) { attach_node.mode = NodeMode.DROPPABLE; _attach_node = attach_node; queue_draw(); } else if( _attach_node != null ) { _attach_node = null; queue_draw(); } return( true ); } /* Called when something is dropped on the DrawArea */ private void handle_drag_data_received( Gdk.DragContext ctx, int x, int y, Gtk.SelectionData data, uint info, uint t ) { if( (_attach_node == null) || (_attach_node.mode != NodeMode.DROPPABLE) ) { foreach (var uri in data.get_uris()) { var image = new NodeImage.from_uri( image_manager, uri, 200 ); if( image.valid ) { var node = new Node.with_name( this, _( "Another Idea" ), layouts.get_default() ); node.set_image( image_manager, image ); _nodes.index( _nodes.length - 1 ).layout.position_root( _nodes.index( _nodes.length - 1 ), node ); _nodes.append_val( node ); if( select_node( node ) ) { node.mode = NodeMode.EDITABLE; _current_new = true; queue_draw(); } } } Gtk.drag_finish( ctx, true, false, t ); see(); queue_draw(); current_changed( this ); auto_save(); } else if( (_attach_node.mode == NodeMode.DROPPABLE) && (data.get_uris().length == 1) ) { var image = new NodeImage.from_uri( image_manager, data.get_uris()[0], _attach_node.max_width() ); if( image.valid ) { var orig_image = _attach_node.image; _attach_node.set_image( image_manager, image ); undo_buffer.add_item( new UndoNodeImage( _attach_node, orig_image ) ); _attach_node.mode = NodeMode.NONE; _attach_node = null; Gtk.drag_finish( ctx, true, false, t ); queue_draw(); current_changed( this ); auto_save(); } } } /* Sets the image of the current node to the given filename */ public bool update_current_image( string uri ) { var image = new NodeImage.from_uri( image_manager, uri, _current_node.max_width() ); if( image.valid ) { var orig_image = _current_node.image; _current_node.set_image( image_manager, image ); undo_buffer.add_item( new UndoNodeImage( _current_node, orig_image ) ); queue_draw(); current_changed( this ); auto_save(); return( true ); } return( false ); } /* Starts a connection from the current node */ public void start_connection( bool key, bool link ) { if( _current_node == null ) return; _current_connection = new Connection( this, _current_node ); _current_connection.mode = link ? ConnMode.LINKING : ConnMode.CONNECTING; if( key ) { double x, y, w, h; _current_node.bbox( out x, out y, out w, out h ); _current_connection.draw_to( (x + (w / 2)), (y + (h / 2)) ); if( _attach_node != null ) { _attach_node.mode = NodeMode.NONE; } _attach_node = _current_node; _attach_node.mode = NodeMode.ATTACHABLE; } else { _current_connection.draw_to( _press_x, _press_y ); _current_node.mode = NodeMode.NONE; } _last_node = _current_node; _current_node = null; queue_draw(); } /* Called when a connection is being drawn by moving the mouse */ public void update_connection( double x, double y ) { if( _current_connection == null ) return; _current_connection.draw_to( scale_value( x ), scale_value( y ) ); queue_draw(); } /* Called when the connection is being connected via the keyboard */ public void update_connection_by_node( Node? node ) { if( node == null ) return; double x, y, w, h; node.bbox( out x, out y, out w, out h ); _current_connection.draw_to( (x + (w / 2)), (y + (h / 2)) ); if( _attach_node != null ) { _attach_node.mode = NodeMode.NONE; } _attach_node = node; _attach_node.mode = NodeMode.ATTACHABLE; queue_draw(); } /* Ends a connection at the given node */ public void end_connection( Node n ) { if( _current_connection == null ) return; _current_connection.connect_to( n ); _connections.add_connection( _current_connection ); undo_buffer.add_item( new UndoConnectionAdd( _current_connection ) ); _current_connection.mode = ConnMode.SELECTED; _last_connection = null; _last_node = null; _attach_node.mode = NodeMode.NONE; _attach_node = null; current_changed( this ); changed(); queue_draw(); } /* Deletes the current connection */ public void delete_connection() { if( _current_connection == null ) return; undo_buffer.add_item( new UndoConnectionDelete( _current_connection ) ); _connections.remove_connection( _current_connection, true ); _current_connection = null; _last_connection = null; current_changed( this ); changed(); queue_draw(); } /* Called when the focus button active state changes. Causes all nodes and connections to have the alpha state set to almost transparent (when focus mode is enabled) or fully opaque. */ public void set_focus_mode( bool focus ) { double alpha = focus ? _focus_alpha : 1.0; _focus_mode = focus; for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).alpha = alpha; } if( _current_node != null ) { if( focus ) { update_focus_mode(); } else { // zoom_actual(); } } else if( _current_connection != null ) { _current_connection.alpha = 1.0; } _connections.update_alpha(); queue_draw(); } /* Update the focus mode */ public void update_focus_mode() { _current_node.alpha = 1.0; if( _focus_mode ) { var parent = _current_node.parent; while( parent != null ) { parent.set_alpha_only( 1.0 ); parent = parent.parent; } // zoom_to_selected(); } _connections.update_alpha(); queue_draw(); } /* Updates the create_new_from_edit variable */ private void update_create_new_from_edit( GLib.Settings settings ) { _create_new_from_edit = settings.get_boolean( "new-node-from-edit" ); } /* Updates all alpha values with the given value */ public void update_focus_mode_alpha( GLib.Settings settings ) { var key = "focus-mode-alpha"; var alpha = settings.get_double( key ); if( (alpha < 0) || (alpha >= 1.0) ) { settings.set_double( key, _focus_alpha ); } else if( _focus_alpha != alpha ) { _focus_alpha = alpha; for( int i=0; i<_nodes.length; i++ ) { _nodes.index( i ).update_alpha( alpha ); } _connections.update_alpha(); queue_draw(); } } /* Sorts and re-arranges the children of the given parent using the given array */ private void sort_children( Node parent, CompareFunc sort_fn ) { var children = new SList(); undo_buffer.add_item( new UndoNodeSort( parent ) ); animator.add_nodes( "sort nodes" ); for( int i=0; i { child.detach( child.side ); }); children.sort( sort_fn ); children.@foreach( (child) => { child.attach( parent, -1, null, false ); }); animator.animate(); changed(); } /* Sorts the current node's children alphabetically */ public void sort_alphabetically() { CompareFunc sort_fn = (a, b) => { return( strcmp( a.name.text, b.name.text ) ); }; sort_children( _current_node, sort_fn ); } /* Sorts the current node's children in a random manner */ public void sort_randomly() { CompareFunc sort_fn = (a, b) => { return( (Random.int_range( 0, 2 ) == 0) ? -1 : 1 ); }; sort_children( _current_node, sort_fn ); } /* Moves all trees to avoid overlapping */ public void handle_tree_overlap( NodeBounds prev ) { if( _current_node == null ) return; var root = _current_node.get_root(); var curr = root.tree_bbox; var ldiff = curr.x - prev.x; var rdiff = (curr.x + curr.width) - (prev.x + prev.width); var adiff = curr.y - prev.y; var bdiff = (curr.y + curr.height) - (prev.y + prev.height); for( int i=0; i<_nodes.length; i++ ) { var node = _nodes.index( i ); if( node != root ) { if( node.is_left_of( prev ) ) node.posx += ldiff; if( node.is_right_of( prev ) ) node.posx += rdiff; if( node.is_above( prev ) ) node.posy += adiff; if( node.is_below( prev ) ) node.posy += bdiff; } } } } Minder-1.5.1/src/DynamicNotebook.vala000066400000000000000000001222261356632107200174670ustar00rootroot00000000000000/* * Copyright (C) 2011-2013 Tom Beckmann * * This program or library is free software; you can redistribute it * and/or modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library 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 * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General * Public License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA. */ // a mask to ignore modifiers like num lock or caps lock that are irrelevant to keyboard shortcuts internal const Gdk.ModifierType MODIFIER_MASK = (Gdk.ModifierType.SHIFT_MASK | Gdk.ModifierType.SUPER_MASK | Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.MOD1_MASK); private class TabPageContainer : Gtk.EventBox { private unowned Tab _tab = null; public unowned Tab tab { get { return _tab; } set { _tab = value; } } public TabPageContainer (Tab tab) { Object (tab: tab); } construct { add (new Gtk.Grid ()); } } /** * This is a standard tab which can be used in a notebook to form a tabbed UI. */ public class Tab : Gtk.EventBox { Gtk.Label _label; public string label { get { return _label.label; } set { _label.label = value; } } public string tooltip { owned get { return _label.get_tooltip_text (); } set { _label.set_tooltip_text (value); } } private bool _pinned = false; public bool pinned { get { return _pinned; } set { if (pinnable) { if (value != _pinned) { if (value) { _label.visible = false; _icon.margin_start = 1; _working.margin_start = 1; } else { _label.visible = true; _icon.margin_start = 0; _working.margin_start = 0; } _pinned = value; update_close_button_visibility (); this.pin_switch (); } } } } private bool _pinnable = true; public bool pinnable { get { return _pinnable; } set { if (!value) { pinned = false; } _pinnable = value; } } /** * Data which will be kept once the tab is deleted, and which will be used by * the application to restore the data into the restored tab. Let it empty if * the tab should not be restored. **/ public string restore_data { get; set; default=""; } /** * An optional delegate that is called when the tab is dropped from the set * of restorable tabs in DynamicNotebook. * A tab is dropped either when Clear All is pressed, or when * the tab is the oldest tab in the set of restorable tabs and * the number of restorable tabs has exceeded the upper limit. */ public Granite.WidgetsDroppedDelegate dropped_callback = null; internal TabPageContainer page_container; public Gtk.Widget page { get { return page_container.get_child (); } set { weak Gtk.Widget container_child = page_container.get_child (); if (container_child != null) { page_container.remove (container_child); } weak Gtk.Container? value_parent = value.get_parent (); if (value_parent != null) { value_parent.remove (value); page_container.add (value); } else { page_container.add (value); } page_container.show_all (); } } internal Gtk.Image _icon; public GLib.Icon? icon { owned get { return _icon.gicon; } set { _icon.gicon = value; } } Gtk.Spinner _working; bool __working; public bool working { get { return __working; } set { __working = _working.visible = value; _icon.visible = !value; } } public Pango.EllipsizeMode ellipsize_mode { get { return _label.ellipsize; } set { _label.ellipsize = value; } } bool _fixed; [Version (deprecated = true, deprecated_since = "0.3", replacement = "")] public bool fixed { get { return _fixed; } set { if (value != _fixed) { _fixed = value; _label.visible = value; } } } public Gtk.Menu menu { get; set; } private bool _closable = true; internal bool closable { set { if (value == _closable) return; _closable = value; update_close_button_visibility (); } } //We need to be able to toggle these from the notebook. internal Gtk.MenuItem new_window_m; internal Gtk.MenuItem duplicate_m; internal Gtk.MenuItem pin_m; private bool _is_current_tab = false; internal bool is_current_tab { set { _is_current_tab = value; update_close_button_visibility (); } } private bool cursor_over_tab = false; private bool cursor_over_close_button = false; private Gtk.Revealer close_button_revealer; internal signal void closed (); internal signal void close_others (); internal signal void new_window (); internal signal void duplicate (); internal signal void pin_switch (); /** * With this you can construct a Tab. It is linked to the page that is shown on focus. * A Tab can have a icon on the right side. You can pass null on the constructor to * create a tab without a icon. **/ public Tab (string? label = null, GLib.Icon? icon = null, Gtk.Widget? page = null) { Object (label: label, icon: icon); if (page != null) { this.page = page; } } construct { _label = new Gtk.Label (null); _label.hexpand = true; _label.tooltip_text = label; _label.ellipsize = Pango.EllipsizeMode.END; _icon = new Gtk.Image (); _icon.icon_size = Gtk.IconSize.MENU; _icon.visible = true; _icon.set_size_request (16, 16); _working = new Gtk.Spinner (); _working.set_size_request (16, 16); _working.start(); var close_button = new Gtk.Button.from_icon_name ("window-close-symbolic", Gtk.IconSize.MENU); close_button.tooltip_text = _("Close Tab"); close_button.valign = Gtk.Align.CENTER; close_button.relief = Gtk.ReliefStyle.NONE; close_button_revealer = new Gtk.Revealer (); close_button_revealer.transition_type = Gtk.RevealerTransitionType.CROSSFADE; close_button_revealer.add (close_button); var tab_layout = new Gtk.Grid (); tab_layout.hexpand = false; tab_layout.orientation = Gtk.Orientation.HORIZONTAL; tab_layout.add (close_button_revealer); tab_layout.add (_label); tab_layout.add (_icon); tab_layout.add (_working); visible_window = true; add (tab_layout); show_all (); page_container = new TabPageContainer (this); menu = new Gtk.Menu (); var close_m = new Gtk.MenuItem.with_label (_("Close Tab")); var close_other_m = new Gtk.MenuItem.with_label (""); pin_m = new Gtk.MenuItem.with_label (""); new_window_m = new Gtk.MenuItem.with_label (_("Open in a New Window")); duplicate_m = new Gtk.MenuItem.with_label (_("Duplicate")); menu.append (close_other_m); menu.append (close_m); menu.append (new_window_m); menu.append (duplicate_m); menu.append (pin_m); menu.show_all (); close_m.activate.connect (() => closed () ); close_other_m.activate.connect (() => close_others () ); new_window_m.activate.connect (() => new_window () ); duplicate_m.activate.connect (() => duplicate () ); pin_m.activate.connect (() => pinned = !pinned); this.scroll_event.connect ((e) => { var notebook = (this.get_parent () as Gtk.Notebook); switch (e.direction) { case Gdk.ScrollDirection.UP: case Gdk.ScrollDirection.LEFT: if (notebook.page > 0) { notebook.page--; return true; } break; case Gdk.ScrollDirection.DOWN: case Gdk.ScrollDirection.RIGHT: if (notebook.page < notebook.get_n_pages ()) { notebook.page++; return true; } break; } return false; }); this.button_press_event.connect ((e) => { if (e.button == 2 && close_button_is_visible ()) { e.state &= MODIFIER_MASK; if (e.state == 0) { this.closed (); } else if (e.state == Gdk.ModifierType.SHIFT_MASK) { this.close_others (); } } else if (e.button == 1 && e.type == Gdk.EventType.2BUTTON_PRESS && duplicate_m.visible) { this.duplicate (); } else if (e.button == 3) { menu.popup_at_pointer (e); var cont = (this.get_parent() as Gtk.Container); uint num_tabs = (cont == null) ? 0 : cont.get_children ().length (); close_other_m.label = ngettext (_("Close Other Tab"), _("Close Other Tabs"), num_tabs - 1); close_other_m.sensitive = (num_tabs != 1); new_window_m.sensitive = (num_tabs != 1); pin_m.label = "Pin"; if (this.pinned) { pin_m.label = "Unpin"; } } else { return false; } return true; }); this.enter_notify_event.connect ((e) => { cursor_over_tab = true; update_close_button_visibility (); return false; }); this.leave_notify_event.connect ((e) => { // We don't want to handle leave_notify events without a prior enter_notify // for event parity reasons. if (!cursor_over_tab) return false; cursor_over_tab = false; update_close_button_visibility (); return false; }); // Hovering the close button area causes a leave_notify_event on the tab EventBox. // Because of that we need to watch the events from those widgets independently // to avoid misbehavior. While setting "above_child" to "true" on the tab might // appear to be a more proper solution, that wouldn't let us capture any event // (e.g. button_press) on the button. close_button.enter_notify_event.connect ((e) => { cursor_over_close_button = true; update_close_button_visibility (); return false; }); close_button.leave_notify_event.connect ((e) => { // We don't want to handle leave_notify events without a prior enter_notify // for event parity reasons. if (!cursor_over_close_button) return false; cursor_over_close_button = false; update_close_button_visibility (); return false; }); page_container.button_press_event.connect (() => { return true; }); //dont let clicks pass through close_button.clicked.connect (() => this.closed ()); working = false; update_close_button_visibility (); } public void close () { closed (); } private void update_close_button_visibility () { // If the tab is pinned, we don't want the revealer to keep // the size allocation of the close button. close_button_revealer.no_show_all = _pinned; close_button_revealer.visible = !_pinned; close_button_revealer.reveal_child = _closable && !_pinned && (cursor_over_tab || cursor_over_close_button || _is_current_tab); } private bool close_button_is_visible () { return close_button_revealer.visible && close_button_revealer.child_revealed; } } private class ClosedTabs : GLib.Object { public signal void restored (string label, string restore_data, GLib.Icon? icon); public signal void cleared (); private int _max_restorable_tabs = 10; public int max_restorable_tabs { get { return _max_restorable_tabs; } set { assert (value > 0); _max_restorable_tabs = value; } } internal struct Entry { string label; string restore_data; GLib.Icon? icon; weak Granite.WidgetsDroppedDelegate? dropped_callback; } private Gee.LinkedList closed_tabs; public ClosedTabs () { } construct { closed_tabs = new Gee.LinkedList (); } public bool empty { get { return closed_tabs.size == 0; } } public void push (Tab tab) { foreach (var entry in closed_tabs) if (tab.restore_data == entry.restore_data) return; // Insert the element at the end of the list. Entry e = { tab.label, tab.restore_data, tab.icon, tab.dropped_callback }; closed_tabs.add (e); // If the maximum size is exceeded, remove from the beginning of the list. if (closed_tabs.size > max_restorable_tabs) { var elem = closed_tabs.poll_head (); unowned Granite.WidgetsDroppedDelegate? dropped_callback = elem.dropped_callback; if (dropped_callback != null) dropped_callback (); } } public Entry pop () { assert (closed_tabs.size > 0); return closed_tabs.poll_tail (); } public Entry pick (string search) { Entry picked = {null, null, null}; for (int i = 0; i < closed_tabs.size; i++) { var entry = closed_tabs[i]; if (entry.restore_data == search) { picked = closed_tabs.remove_at (i); break; } } return picked; } public Gtk.Menu menu { owned get { var _menu = new Gtk.Menu (); foreach (var entry in closed_tabs) { var item = new Gtk.MenuItem.with_label (entry.label); _menu.prepend (item); item.activate.connect (() => { var e = pick (entry.restore_data); this.restored (e.label, e.restore_data, e.icon); }); } if (!empty) { var separator = new Gtk.SeparatorMenuItem (); var item = new Gtk.MenuItem.with_label (_("Clear All")); _menu.append (separator); _menu.append (item); item.activate.connect (() => { foreach (var entry in closed_tabs) { if (entry.dropped_callback != null) { entry.dropped_callback (); } } closed_tabs.clear (); cleared (); }); } return _menu; } } } /** * Tab bar widget designed for a variable number of tabs. * Supports showing a "New tab" button, restoring closed tabs, "pinning" tabs, and more. * * {{../doc/images/DynamicNotebook.png}} */ public class DynamicNotebook : Gtk.EventBox { /** * number of pages */ public int n_tabs { get { return notebook.get_n_pages (); } } /** * Hide the tab bar and only show the pages */ public bool show_tabs { get { return notebook.show_tabs; } set { notebook.show_tabs = value; } } /** * Toggle icon display */ bool _show_icons; [Version (deprecated = true, deprecated_since = "0.3.1", replacement = "")] public bool show_icons { get { return _show_icons; } set { _show_icons = value; } } /** * Hide the close buttons and disable closing of tabs */ bool _tabs_closable = true; public bool tabs_closable { get { return _tabs_closable; } set { if (value != _tabs_closable) tabs.foreach ((t) => { t.closable = value; }); _tabs_closable = value; } } /** * Make tabs reorderable */ bool _allow_drag = true; public bool allow_drag { get { return _allow_drag; } set { _allow_drag = value; this.tabs.foreach ((t) => { notebook.set_tab_reorderable (t.page_container, value); }); } } /** * Allow creating new windows by dragging a tab out */ bool _allow_new_window = false; public bool allow_new_window { get { return _allow_new_window; } set { _allow_new_window = value; this.tabs.foreach ((t) => { notebook.set_tab_detachable (t.page_container, value); }); } } /** * Allow duplicating tabs */ bool _allow_duplication = false; public bool allow_duplication { get { return _allow_duplication; } set { _allow_duplication = value; foreach (var tab in tabs) { tab.duplicate_m.visible = value; } } } /** * Allow restoring tabs */ bool _allow_restoring = false; public bool allow_restoring { get { return _allow_restoring; } set { _allow_restoring = value; restore_tab_m.visible = value; restore_button.visible = value; } } /** * Set or get the upper limit of the size of the set * of restorable tabs. */ public int max_restorable_tabs { get { return closed_tabs.max_restorable_tabs; } set { closed_tabs.max_restorable_tabs = value; } } /** * Controls the '+' add button visibility */ bool _add_button_visible = true; public bool add_button_visible { get { return _add_button_visible; } set { if (value != _add_button_visible) { if (_add_button_visible) { notebook.remove (add_button); } else { notebook.set_action_widget (add_button, Gtk.PackType.START); } _add_button_visible = value; new_tab_m.visible = value; } } } bool _allow_pinning = false; public bool allow_pinning { get { return _allow_pinning; } set { _allow_pinning = value; foreach (var tab in tabs) { tab.pinnable = value; } } } bool _force_left = true; public bool force_left { get { return _force_left; } set { _force_left = value; } } /** * The text shown in the add button tooltip */ public string add_button_tooltip { get { _add_button_tooltip = add_button.tooltip_text; return _add_button_tooltip; } set { add_button.tooltip_text = value; } } // Use temporary field to avoid breaking API this can be dropped while preparing for 0.4 string _add_button_tooltip; public Tab current { get { return tabs.nth_data (notebook.get_current_page ()); } set { notebook.set_current_page (tabs.index (value)); } } GLib.List _tabs; public GLib.List tabs { get { _tabs = new GLib.List (); for (var i = 0; i < n_tabs; i++) { _tabs.append (notebook.get_tab_label (notebook.get_nth_page (i)) as Tab); } return _tabs; } } public string group_name { get { return notebook.group_name; } set { notebook.group_name = value; } } public enum TabBarBehavior { ALWAYS = 0, SINGLE = 1, NEVER = 2 } /** * The behavior of the tab bar and its visibility */ public TabBarBehavior tab_bar_behavior { set { _tab_bar_behavior = value; update_tabs_visibility (); } get { return _tab_bar_behavior; } } private TabBarBehavior _tab_bar_behavior; /** * The menu appearing when the notebook is clicked on a blank space */ public Gtk.Menu menu { get; private set; } private ClosedTabs closed_tabs; Gtk.Notebook notebook; private int tab_width = 150; private const int MAX_TAB_WIDTH = 174; private const int TAB_WIDTH_PINNED = 18; public signal void tab_added (Tab tab); public signal void tab_removed (Tab tab); private Tab? old_tab; //stores a reference for tab_switched public signal void tab_switched (Tab? old_tab, Tab new_tab); public signal void tab_reordered (Tab tab, int new_pos); public signal void tab_moved (Tab tab, int x, int y); public signal void tab_duplicated (Tab duplicated_tab); public signal void tab_restored (string label, string data, GLib.Icon? icon); public signal void new_tab_requested (); public signal bool close_tab_requested (Tab tab); private Gtk.MenuItem new_tab_m; private Gtk.MenuItem restore_tab_m; private Gtk.Button add_button; private Gtk.Button restore_button; // should be a Gtk.MenuButton when we have Gtk+ 3.6 private const int ADD_BUTTON_PADDING = 5; // Padding around the new tab button /** * Create a new dynamic notebook */ public DynamicNotebook () { } construct { notebook = new Gtk.Notebook (); notebook.can_focus = false; visible_window = false; get_style_context ().add_class ("dynamic-notebook"); notebook.scrollable = true; notebook.show_border = false; _tab_bar_behavior = TabBarBehavior.ALWAYS; draw.connect ( (ctx) => { get_style_context ().render_activity (ctx, 0, 0, get_allocated_width (), 27); return false; }); add (notebook); menu = new Gtk.Menu (); new_tab_m = new Gtk.MenuItem.with_label (_("New Tab")); restore_tab_m = new Gtk.MenuItem.with_label (_("Undo Close Tab")); restore_tab_m.sensitive = false; menu.append (new_tab_m); menu.append (restore_tab_m); menu.show_all (); new_tab_m.activate.connect (() => { new_tab_requested (); }); restore_tab_m.activate.connect (() => { restore_last_tab (); }); closed_tabs = new ClosedTabs (); closed_tabs.restored.connect ((label, restore_data, icon) => { if (!allow_restoring) return; restore_button.sensitive = !closed_tabs.empty; restore_tab_m.sensitive = !closed_tabs.empty; tab_restored (label, restore_data, icon); }); closed_tabs.cleared.connect (() => { restore_button.sensitive = false; restore_tab_m.sensitive = false; }); add_button = new Gtk.Button.from_icon_name ("list-add-symbolic", Gtk.IconSize.MENU); add_button.relief = Gtk.ReliefStyle.NONE; add_button.tooltip_text = _("New Tab"); //FIXME: Used to prevent an issue with widget overlap in Gtk+ < 3.20 /* var add_button_box = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); add_button_box.add (add_button); add_button_box.show_all (); */ restore_button = new Gtk.Button.from_icon_name ("document-open-recent-symbolic", Gtk.IconSize.MENU); restore_button.margin_end = 3; restore_button.relief = Gtk.ReliefStyle.NONE; restore_button.tooltip_text = _("Closed Tabs"); restore_button.sensitive = false; restore_button.show (); notebook.set_action_widget (add_button, Gtk.PackType.START); notebook.set_action_widget (restore_button, Gtk.PackType.END); add_button.clicked.connect (() => { new_tab_requested (); }); add_button.button_press_event.connect ((e) => { // Consume double-clicks return e.type == Gdk.EventType.2BUTTON_PRESS && e.button == 1; }); restore_button.clicked.connect (() => { var menu = closed_tabs.menu; menu.attach_widget = restore_button; menu.show_all (); menu.popup_at_widget (restore_button, Gdk.Gravity.SOUTH_EAST, Gdk.Gravity.NORTH_EAST, null); }); restore_tab_m.visible = allow_restoring; restore_button.visible = allow_restoring; size_allocate.connect (() => { recalc_size (); }); button_press_event.connect ((e) => { if (e.type == Gdk.EventType.2BUTTON_PRESS && e.button == 1) { new_tab_requested (); } else if (e.button == 2 && allow_restoring) { restore_last_tab (); return true; } else if (e.button == 3 && (allow_restoring || add_button_visible)) { menu.popup_at_pointer (e); } return false; }); key_press_event.connect ((e) => { e.state &= MODIFIER_MASK; switch (e.keyval) { case Gdk.Key.@w: case Gdk.Key.@W: if (e.state == Gdk.ModifierType.CONTROL_MASK) { if (!tabs_closable) { break; } current.close (); return true; } break; case Gdk.Key.@t: case Gdk.Key.@T: if (e.state == Gdk.ModifierType.CONTROL_MASK) { new_tab_requested (); return true; } else if (e.state == (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK) && allow_restoring) { restore_last_tab (); return true; } break; case Gdk.Key.Page_Up: if (e.state == Gdk.ModifierType.CONTROL_MASK) { next_page (); return true; } break; case Gdk.Key.Page_Down: if (e.state == Gdk.ModifierType.CONTROL_MASK) { previous_page (); return true; } break; case Gdk.Key.@1: case Gdk.Key.@2: case Gdk.Key.@3: case Gdk.Key.@4: case Gdk.Key.@5: case Gdk.Key.@6: case Gdk.Key.@7: case Gdk.Key.@8: if ((e.state & Gdk.ModifierType.MOD1_MASK) == Gdk.ModifierType.MOD1_MASK) { var i = e.keyval - 49; var n_pages = notebook.get_n_pages (); notebook.page = (int) ((i >= n_pages) ? n_pages - 1 : i); return true; } break; case Gdk.Key.@9: if ((e.state & Gdk.ModifierType.MOD1_MASK) == Gdk.ModifierType.MOD1_MASK) { notebook.page = notebook.get_n_pages () - 1; return true; } break; } return false; }); destroy.connect (() => { notebook.switch_page.disconnect (on_switch_page); notebook.page_added.disconnect (on_page_added); notebook.page_removed.disconnect (on_page_removed); notebook.page_reordered.disconnect (on_page_reordered); notebook.create_window.disconnect (on_create_window); }); notebook.switch_page.connect (on_switch_page); notebook.page_added.connect (on_page_added); notebook.page_removed.connect (on_page_removed); notebook.page_reordered.connect (on_page_reordered); notebook.create_window.connect (on_create_window); } void on_switch_page (Gtk.Widget page, uint pagenum) { var cont = (page as TabPageContainer); if( cont == null ) return; var new_tab = cont.tab; // update property accordingly for previous selected tab if (old_tab != null) old_tab.is_current_tab = false; // now set the new tab as current new_tab.is_current_tab = true; tab_switched (old_tab, new_tab); old_tab = new_tab; } void on_page_added (Gtk.Widget page, uint pagenum) { var cont = page as TabPageContainer; if( cont == null ) return; var t = cont.tab; insert_callbacks (t); tab_added (t); update_tabs_visibility (); } void on_page_removed (Gtk.Widget page, uint pagenum) { var cont = page as TabPageContainer; if( cont == null ) return; var t = cont.tab; remove_callbacks (t); tab_removed (t); update_tabs_visibility (); } void on_page_reordered (Gtk.Widget page, uint pagenum) { tab_reordered ((page as TabPageContainer).tab, (int) pagenum); recalc_order (); } unowned Gtk.Notebook on_create_window (Gtk.Widget page, int x, int y) { var tab = notebook.get_tab_label (page) as Tab; tab_moved (tab, x, y); recalc_order (); return (Gtk.Notebook) null; } private void recalc_order () { if (n_tabs == 0 || !force_left) return; var pinned_tabs = 0; for (var i = 0; i < this.notebook.get_n_pages (); i++) { var tab = this.notebook.get_tab_label (this.notebook.get_nth_page (i)) as Tab; if ((tab != null) && tab.pinned) { pinned_tabs++; } } for (var p = 0; p < pinned_tabs; p++) { int sel = p; for (var i = p; i < this.notebook.get_n_pages (); i++) { var tab = this.notebook.get_tab_label (this.notebook.get_nth_page (i)) as Tab; if ((tab != null) && tab.pinned) { sel = i; break; } } if (sel != p) { this.notebook.reorder_child (this.notebook.get_nth_page (sel), p); } } } private void recalc_size () { if (n_tabs == 0) return; var pinned_tabs = 0; var unpinned_tabs = 0; for (var i = 0; i < this.notebook.get_n_pages (); i++) { if ((this.notebook.get_tab_label (this.notebook.get_nth_page (i)) as Tab).pinned) { pinned_tabs++; } else { unpinned_tabs++; } } if (unpinned_tabs == 0) { unpinned_tabs = 1; } var offset = 130; this.tab_width = (this.get_allocated_width () - offset - pinned_tabs * TAB_WIDTH_PINNED) / unpinned_tabs; if (tab_width > MAX_TAB_WIDTH) tab_width = MAX_TAB_WIDTH; if (tab_width < 0) tab_width = 0; for (var i = 0; i < this.notebook.get_n_pages (); i++) { this.notebook.get_tab_label (this.notebook.get_nth_page (i)).width_request = tab_width; if ((this.notebook.get_tab_label (this.notebook.get_nth_page (i)) as Tab).pinned) { this.notebook.get_tab_label (this.notebook.get_nth_page (i)).width_request = TAB_WIDTH_PINNED; } } // this.notebook.resize_children (); } private void restore_last_tab () { if (!allow_restoring || closed_tabs.empty) return; var restored = closed_tabs.pop (); restore_button.sensitive = !closed_tabs.empty; restore_tab_m.sensitive = !closed_tabs.empty; this.tab_restored (restored.label, restored.restore_data, restored.icon); } private void switch_pin_tab (Tab tab) { if (!allow_pinning) { return; } recalc_order (); recalc_size (); } public void remove_tab (Tab tab) { var pos = get_tab_position (tab); if (pos != -1) notebook.remove_page (pos); } public void next_page () { this.notebook.page = this.notebook.page + 1 >= this.notebook.get_n_pages () ? this.notebook.page = 0 : this.notebook.page + 1; } public void previous_page () { this.notebook.page = this.notebook.page - 1 < 0 ? this.notebook.page = this.notebook.get_n_pages () - 1 : this.notebook.page - 1; } public override void show () { base.show (); notebook.show (); } public new List get_children () { var list = new List (); foreach (var child in notebook.get_children ()) { var cont = child as Gtk.Container; if( cont != null ) { list.append (cont.get_children ().nth_data (0)); } } return list; } public int get_tab_position (Tab tab) { return this.notebook.page_num (tab.page_container); } public void set_tab_position (Tab tab, int position) { notebook.reorder_child (tab.page_container, position); tab_reordered (tab, position); recalc_order (); } public Tab? get_tab_by_index (int index) { return notebook.get_tab_label (notebook.get_nth_page (index)) as Tab; } public Tab? get_tab_by_widget (Gtk.Widget widget) { return notebook.get_tab_label (widget.get_parent ()) as Tab; } public Gtk.Widget get_nth_page (int index) { return notebook.get_nth_page (index); } public uint insert_tab (Tab tab, int index) { return_val_if_fail (tabs.index (tab) < 0, 0); var i = 0; if (index <= -1) i = this.notebook.insert_page (tab.page_container, tab, this.notebook.get_n_pages ()); else i = this.notebook.insert_page (tab.page_container, tab, index); this.notebook.set_tab_reorderable (tab.page_container, this.allow_drag); this.notebook.set_tab_detachable (tab.page_container, this.allow_new_window); tab.duplicate_m.visible = allow_duplication; tab.new_window_m.visible = allow_new_window; tab.pin_m.visible = allow_pinning; tab.pinnable = allow_pinning; tab.pinned = false; tab.width_request = tab_width; this.recalc_size (); this.recalc_order (); if (!tabs_closable) tab.closable = false; return i; } private void insert_callbacks (Tab tab) { tab.closed.connect (on_tab_closed); tab.close_others.connect (on_close_others); tab.new_window.connect (on_new_window); tab.duplicate.connect (on_duplicate); tab.pin_switch.connect (on_pin_switch); } private void remove_callbacks (Tab tab) { tab.closed.disconnect (on_tab_closed); tab.close_others.disconnect (on_close_others); tab.new_window.disconnect (on_new_window); tab.duplicate.disconnect (on_duplicate); tab.pin_switch.disconnect (on_pin_switch); } private void on_tab_closed (Tab tab) { if (Signal.has_handler_pending (this, Signal.lookup ("close-tab-requested", typeof (DynamicNotebook)), 0, true)) { var sure = close_tab_requested (tab); if (!sure) return; } var pos = get_tab_position (tab); remove_tab (tab); if (pos != -1 && tab.page.get_parent () != null) tab.page.unparent (); if (tab.label != "" && tab.restore_data != "") { closed_tabs.push (tab); restore_button.sensitive = !closed_tabs.empty; restore_tab_m.sensitive = !closed_tabs.empty; } } private void on_close_others (Tab tab) { var num = 0; //save num, in case a tab refused to close so we don't end up in an infinite loop for (var j = 0; j < tabs.length (); j++) { if (tab != tabs.nth_data (j)) { tabs.nth_data (j).closed (); if (num == n_tabs) break; j--; } num = n_tabs; } } private void on_new_window (Tab tab) { notebook.create_window (tab.page_container, 0, 0); } private void on_duplicate (Tab tab) { tab_duplicated (tab); } private void on_pin_switch (Tab tab) { switch_pin_tab (tab); } private void update_tabs_visibility () { if (_tab_bar_behavior == TabBarBehavior.SINGLE) notebook.show_tabs = n_tabs > 1; else if (_tab_bar_behavior == TabBarBehavior.NEVER) notebook.show_tabs = false; else if (_tab_bar_behavior == TabBarBehavior.ALWAYS) notebook.show_tabs = true; } } Minder-1.5.1/src/EmptyInspector.vala000066400000000000000000000024271356632107200173670ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Granite.Widgets; public class EmptyInspector : Box { public EmptyInspector( MainWindow win ) { var empty_lbl = new Label( _( "Select a node or connection\nto view/edit information" ) ); empty_lbl.use_markup = true; empty_lbl.justify = Justification.CENTER; pack_start( empty_lbl, true, true ); show_all(); } /* Returns the width of this window */ public int get_width() { return( 300 ); } } Minder-1.5.1/src/EmptyMenu.vala000066400000000000000000000045201356632107200163210ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class EmptyMenu : Gtk.Menu { DrawArea _da; Gtk.MenuItem _root; Gtk.MenuItem _selroot; /* Default constructor */ public EmptyMenu( DrawArea da, AccelGroup accel_group ) { _da = da; _root = new Gtk.MenuItem.with_label( _( "Add Root Node" ) ); _root.activate.connect( add_root_node ); var selnode = new Gtk.MenuItem.with_label( _( "Select Node" ) ); var selmenu = new Gtk.Menu(); selnode.set_submenu( selmenu ); _selroot = new Gtk.MenuItem.with_label( _( "Root" ) ); _selroot.activate.connect( select_root_node ); Utils.add_accel_label( _selroot, 'm', 0 ); /* Add the menu items to the menu */ add( _root ); add( new SeparatorMenuItem() ); add( selnode ); /* Add the items to the selection menu */ selmenu.add( _selroot ); /* Make the menu visible */ show_all(); /* Make sure that we handle menu state when we are popped up */ show.connect( on_popup ); } /* Returns true if there is a currently selected connection */ private bool connection_selected() { return( _da.get_current_connection() != null ); } /* Called when the menu is popped up */ private void on_popup() { /* Set the menu sensitivity */ _root.set_sensitive( !connection_selected() ); _selroot.set_sensitive( _da.root_selectable() ); } /* Creates a new root node */ private void add_root_node() { _da.add_root_node(); } /* Selects the current root node */ private void select_root_node() { _da.select_root_node(); } } Minder-1.5.1/src/ImageEditor.vala000066400000000000000000000337741356632107200166040ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Cairo; class ImageEditor { private const double MIN_WIDTH = 50; private const int CROP_WIDTH = 8; private const Gtk.TargetEntry[] DRAG_TARGETS = { {"text/uri-list", 0, 0} }; private Popover _popover; private DrawingArea _da; private Node _node; private NodeImage _image; private int _crop_target = -1; private double _last_x; private double _last_y; private Gdk.Rectangle[] _crop_points; private CursorType[] _crop_cursors; private Label _status_cursor; private Label _status_crop; public signal void changed( NodeImage? orig_image ); /* Default constructor */ public ImageEditor( DrawArea da ) { /* Allocate crop points */ _crop_points = new Gdk.Rectangle[9]; _crop_cursors = new CursorType[8]; /* Initialize the crop points */ for( int i=0; i<_crop_points.length; i++ ) { _crop_points[i] = {0, 0, CROP_WIDTH, CROP_WIDTH}; } /* Setup cursor types */ _crop_cursors[0] = CursorType.TOP_LEFT_CORNER; _crop_cursors[1] = CursorType.SB_V_DOUBLE_ARROW; _crop_cursors[2] = CursorType.TOP_RIGHT_CORNER; _crop_cursors[3] = CursorType.SB_H_DOUBLE_ARROW; _crop_cursors[4] = CursorType.SB_H_DOUBLE_ARROW; _crop_cursors[5] = CursorType.TOP_RIGHT_CORNER; _crop_cursors[6] = CursorType.SB_V_DOUBLE_ARROW; _crop_cursors[7] = CursorType.TOP_LEFT_CORNER; /* Create the user interface of the editor window */ create_ui( (Gtk.Window)da.get_toplevel(), da.image_manager ); } /* Handles the display of the image editor popover */ private void show_popover( bool show ) { #if GTK322 if( show ) { _popover.popup(); } else { _popover.popdown(); } #else if( show ) { _popover.show(); } else { _popover.hide(); } #endif } /* Opens an image editor popup containing the image of the specified node */ public void edit_image( ImageManager im, Node node, double x, double y ) { Gdk.Rectangle rect = {(int)x, (int)y, 1, 1}; _popover.pointing_to = rect; /* Set the defaults */ _node = node; _image = new NodeImage( im, node.image.id, _node.max_width() ); if( _image.valid ) { _image.crop_x = node.image.crop_x; _image.crop_y = node.image.crop_y; _image.crop_w = node.image.crop_w; _image.crop_h = node.image.crop_h; /* Load the image and draw it */ _da.width_request = node.image.get_surface().get_width(); _da.height_request = node.image.get_surface().get_height(); _crop_points[8].width = _image.crop_w; _crop_points[8].height = _image.crop_h; set_crop_points(); _da.queue_draw(); /* Display ourselves */ show_popover( true ); } } /* Initializes the image editor with the give image filename */ private bool initialize( NodeImage ni ) { /* Create a new image from the given filename */ _image = ni; /* Load the image and draw it */ if( _image.valid ) { _da.width_request = _image.get_surface().get_width(); _da.height_request = _image.get_surface().get_height(); _crop_points[8].width = _image.crop_w; _crop_points[8].height = _image.crop_h; set_crop_points(); set_cursor_location( 0, 0 ); _da.queue_draw(); } return( _image.valid ); } /* Set the crop point positions to the values on the current crop region */ private void set_crop_points() { var x0 = _image.crop_x; var x1 = (_image.crop_x + (_image.crop_w / 2) - (CROP_WIDTH / 2)); var x2 = ((_image.crop_x + _image.crop_w) - CROP_WIDTH); var y0 = _image.crop_y; var y1 = (_image.crop_y + (_image.crop_h / 2) - (CROP_WIDTH / 2)); var y2 = ((_image.crop_y + _image.crop_h) - CROP_WIDTH); _crop_points[0].x = x0; _crop_points[0].y = y0; _crop_points[1].x = x1; _crop_points[1].y = y0; _crop_points[2].x = x2; _crop_points[2].y = y0; _crop_points[3].x = x0; _crop_points[3].y = y1; _crop_points[4].x = x2; _crop_points[4].y = y1; _crop_points[5].x = x0; _crop_points[5].y = y2; _crop_points[6].x = x1; _crop_points[6].y = y2; _crop_points[7].x = x2; _crop_points[7].y = y2; _crop_points[8].x = x0; _crop_points[8].y = y0; _crop_points[8].width = _image.crop_w; _crop_points[8].height = _image.crop_h; _status_crop.label = _( "Crop Area: %d,%d %3dx%3d" ).printf( _crop_points[8].x, _crop_points[8].y, _crop_points[8].width, _crop_points[8].height ); } /* Set the crop target based on the position of the cursor */ private void set_crop_target( double x, double y ) { Gdk.Rectangle cursor = {(int)x, (int)y, 1, 1}; Gdk.Rectangle tmp; int i = 0; foreach (Gdk.Rectangle crop_point in _crop_points) { if( crop_point.intersect( cursor, out tmp ) ) { _crop_target = i; return; } i++; } _crop_target = -1; } /* Adjusts the crop points by the given cursor difference */ private void adjust_crop_points( int diffx, int diffy ) { if( _crop_target != -1 ) { var x = _image.crop_x; var y = _image.crop_y; var w = _image.crop_w; var h = _image.crop_h; switch( _crop_target ) { case 0 : x += diffx; y += diffy; w -= diffx; h -= diffy; break; case 1 : y += diffy; h -= diffy; break; case 2 : y += diffy; w += diffx; h -= diffy; break; case 3 : x += diffx; w -= diffx; break; case 4 : w += diffx; break; case 5 : x += diffx; w -= diffx; h += diffy; break; case 6 : h += diffy; break; case 7 : w += diffx; h += diffy; break; case 8 : x += diffx; y += diffy; break; } if( (x >= 0) && ((x + w) <= _da.width_request) && (w >= MIN_WIDTH) ) { _image.crop_x = x; _image.crop_w = w; } if( (y >= 0) && ((y + h) <= _da.height_request) && (h >= MIN_WIDTH) ) { _image.crop_y = y; _image.crop_h = h; } set_crop_points(); } } /* Creates the user interface */ public void create_ui( Gtk.Window parent, ImageManager im ) { _popover = new Popover( parent ); _popover.modal = true; var box = new Box( Orientation.VERTICAL, 5 ); box.border_width = 5; _da = create_drawing_area( im ); var status = create_status_area(); var buttons = create_buttons( parent, im ); /* Pack the widgets into the window */ box.pack_start( _da, true, true ); box.pack_start( status, false, false ); box.pack_start( buttons, false, true ); box.show_all(); /* Add the box to the popover */ _popover.add( box ); } /* Create the image editing area */ public DrawingArea create_drawing_area( ImageManager im ) { var da = new DrawingArea(); da.width_request = NodeImage.EDIT_WIDTH; da.height_request = NodeImage.EDIT_HEIGHT; /* Make sure the above events are listened for */ da.add_events( EventMask.BUTTON_PRESS_MASK | EventMask.BUTTON_RELEASE_MASK | EventMask.BUTTON1_MOTION_MASK | EventMask.POINTER_MOTION_MASK ); /* Make sure that we add a CSS class name to ourselves so we can color our background with the theme. */ da.get_style_context().add_class( "canvas" ); /* Add event listeners */ da.draw.connect((ctx) => { draw_image( ctx ); return( false ); }); da.button_press_event.connect((e) => { set_crop_target( e.x, e.y ); if( _crop_target == 8 ) { var win = _da.get_window(); win.set_cursor( new Cursor.from_name( _popover.get_display(), "grabbing" ) ); } _last_x = e.x; _last_y = e.y; return( false ); }); da.motion_notify_event.connect((e) => { if( _crop_target == -1 ) { set_crop_target( e.x, e.y ); if( (_crop_target >= 0) && (_crop_target < 8) ) { set_cursor( _crop_cursors[_crop_target] ); } else { set_cursor( null ); } _crop_target = -1; } else { adjust_crop_points( (int)(e.x - _last_x), (int)(e.y - _last_y) ); da.queue_draw(); } _last_x = e.x; _last_y = e.y; set_cursor_location( (int)e.x, (int)e.y ); return( false ); }); da.button_release_event.connect((e) => { _crop_target = -1; set_cursor( null ); return( false ); }); /* Set ourselves up to be a drag target */ Gtk.drag_dest_set( da, DestDefaults.MOTION | DestDefaults.DROP, DRAG_TARGETS, Gdk.DragAction.COPY ); da.drag_data_received.connect((ctx, x, y, data, info, t) => { if( data.get_uris().length == 1 ) { NodeImage? ni = new NodeImage.from_uri( im, data.get_uris()[0], _node.max_width() ); if( (ni != null) && initialize( ni ) ) { Gtk.drag_finish( ctx, true, false, t ); } } }); return( da ); } /* Creates the status area */ private Box create_status_area() { var box = new Box( Orientation.HORIZONTAL, 10 ); box.homogeneous = true; _status_cursor = new Label( null ); _status_crop = new Label( null ); box.pack_start( _status_cursor, false, false ); box.pack_start( _status_crop, false, false ); return( box ); } /* Updates the cursor location status with the given values */ private void set_cursor_location( int x, int y ) { _status_cursor.label = _( "Cursor: %3d,%3d" ).printf( x, y ); } /* Creates the button bar at the bottom of the window */ private Box create_buttons( Gtk.Window parent, ImageManager im ) { var box = new Box( Orientation.HORIZONTAL, 5 ); var cancel = new Button.with_label( _( "Cancel" ) ); var apply = new Button.with_label( _( "Apply" ) ); var change = new Button.with_label( _( "Change Image" ) ); var remove = new Button.with_label( _( "Remove Image" ) ); cancel.clicked.connect(() => { show_popover( false ); }); apply.clicked.connect(() => { set_image( im ); }); change.clicked.connect(() => { var id = im.choose_image( parent ); if( id != -1 ) { var ni = new NodeImage( im, id, _node.max_width() ); if( ni != null ) { initialize( ni ); } } }); remove.clicked.connect(() => { remove_image( im ); }); box.pack_start( change, false, false ); box.pack_start( remove, false, false ); box.pack_end( apply, false, false ); box.pack_end( cancel, false, false ); return( box ); } /* Sets the cursor of the drawing area */ private void set_cursor( CursorType? type = null ) { var win = _da.get_window(); Cursor? cursor = win.get_cursor(); if( type == null ) { win.set_cursor( null ); } else if( (cursor == null) || (cursor.cursor_type != type) ) { win.set_cursor( new Cursor.for_display( _popover.get_display(), type ) ); } } /* Add the image */ private void draw_image( Context ctx ) { /* Draw the cropped portion of the image */ ctx.set_source_surface( _image.get_surface(), 0, 0 ); ctx.paint(); /* On top of that, draw the crop transparency */ ctx.set_source_rgba( 0, 0, 0, 0.8 ); ctx.rectangle( 0, 0, _da.width_request, _da.height_request ); ctx.fill(); /* Cut out the area for the image */ ctx.set_operator( Operator.CLEAR ); ctx.rectangle( _image.crop_x, _image.crop_y, _image.crop_w, _image.crop_h ); ctx.fill(); /* Finally, draw the portion of the image this not cropped */ ctx.set_operator( Operator.OVER ); ctx.set_source_surface( _image.get_surface(), 0, 0 ); ctx.rectangle( _image.crop_x, _image.crop_y, _image.crop_w, _image.crop_h ); ctx.fill(); /* Draw the crop points */ ctx.set_line_width( 1 ); for( int i=0; i<8; i++ ) { draw_crop_point( ctx, _crop_points[i] ); } } /* Draws a single crop point at the given point with the given width/height */ private void draw_crop_point( Context ctx, Gdk.Rectangle crop ) { ctx.set_source_rgb( 1, 1, 1 ); ctx.rectangle( crop.x, crop.y, crop.width, crop.width ); ctx.fill(); ctx.set_source_rgb( 0, 0, 0 ); ctx.rectangle( crop.x, crop.y, crop.width, crop.width ); ctx.stroke(); } /* Removes the current image for the node */ private void remove_image( ImageManager im ) { /* Create a copy of the current image before changing it */ var orig_image = _node.image; /* Clear the node image */ _node.set_image( im, null ); /* Indicate that the image changed */ changed( orig_image ); /* Hide the popover */ show_popover( false ); } /* Sets the node image to the edited image */ private void set_image( ImageManager im ) { /* Create a copy of the current image before changing it */ var orig_image = _node.image; /* Set the image width to match the node's max width */ _image.set_width( _node.max_width() ); /* Set the node image */ _node.set_image( im, _image ); /* Indicate that the image changed */ changed( orig_image ); /* Close the popover */ show_popover( false ); } } Minder-1.5.1/src/ImageManager.vala000066400000000000000000000172431356632107200167210ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; using Gtk; public class ImageManager { /* Returns the web pathname used to store downloaded images */ private static string get_storage_path() { return( GLib.Path.build_filename( Environment.get_user_data_dir(), "minder", "images" ) ); } /* Private class used by the image manager to store image information */ private class ImageItem { public int id { set; get; default = -1; } public string uri { set; get; default = ""; } public string ext { set; get; default = ""; } public bool valid { set; get; default = false; } /* Default constructor */ public ImageItem( string uri ) { this.id = Minder.settings.get_int( "image-id" ); this.uri = uri; this.ext = get_extension(); this.valid = true; Minder.settings.set_int( "image-id", (this.id + 1) ); } /* Loads the item information from given XML node */ public ImageItem.from_xml( Xml.Node* n ) { string? i = n->get_prop( "id" ); if( i != null ) { id = int.parse( i ); } string? u = n->get_prop( "uri" ); if( u != null ) { uri = u; } string? e = n->get_prop( "ext" ); if( e != null ) { ext = e; } valid = true; } /* Saves the given image item to the specified XML node */ public void save( Xml.Node* parent ) { Xml.Node* n = new Xml.Node( null, "image" ); n->new_prop( "id", id.to_string() ); n->new_prop( "uri", uri ); n->new_prop( "ext", ext ); parent->add_child( n ); } /* Returns true if the file exists */ public bool exists() { return( FileUtils.test( get_path(), FileTest.EXISTS ) ); } /* Returns the extension associated with the filename */ public string get_extension() { var parts = uri.split( "." ); var ext = parts[parts.length - 1].split( "?" )[0]; if( (ext == "bmp") || (ext == "png") || (ext == "jpg") || (ext == "jpeg") || (ext == "svg") ) { return( "." + ext ); } return( "" ); } /* Returns the full pathname to the given fname */ public string get_path() { var basename = "img%06x%s".printf( id, ext ); return( GLib.Path.build_filename( get_storage_path(), basename ) ); } /* Copies the given URI to the given filename in the storage directory */ public bool copy_file() { var rfile = File.new_for_uri( uri ); var lfile = File.new_for_path( get_path() ); try { rfile.copy( lfile, FileCopyFlags.OVERWRITE ); } catch( Error e ) { return( false ); } return( true ); } /* If the current item is no longer valid, remove it from the file system */ public void cleanup() { if( !valid && exists() ) { FileUtils.unlink( get_path() ); } } } private Array _images; private bool _available = true; /* Default constructor */ public ImageManager() { /* Create the images directory if it does not exist */ if( DirUtils.create_with_parents( get_storage_path(), 0775 ) == 0 ) { _available = true; } /* Allocate the images array */ _images = new Array(); } /* Loads the image manager information from the specified XML node */ public void load( Xml.Node* n ) { for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "image" ) { _images.append_val( new ImageItem.from_xml( it ) ); } } } } /* Saves the image manager information to the file */ public void save( Xml.Node* n ) { for( int i=0; i<_images.length; i++ ) { if( _images.index( i ).valid ) { _images.index( i ).save( n ); } } } /* Searches the list of stored image items, returning the array index of the item that matches. If no match is found, a value of -1 is returned. */ private ImageItem? find_match( int id ) { for( int i=0; i<_images.length; i++ ) { if( _images.index( i ).id == id ) { return( _images.index( i ) ); } } return( null ); } /* Finds an image item that matches the given URI and returns the index of the matching item. */ private ImageItem? find_uri_match( string uri ) { for( int i=0; i<_images.length; i++ ) { if( _images.index( i ).uri == uri ) { return( _images.index( i ) ); } } return( null ); } /* Adds the given image information to the stored list. Returns the image ID that the NodeImage class will store to reference the image details. If the image could not be added, returns a value of -1. */ public int add_image( string uri ) { var item = find_uri_match( uri ); if( item == null ) { item = new ImageItem( uri ); if( !item.copy_file() ) return( -1 ); _images.append_val( item ); } else if( !item.exists() ) { if( !item.copy_file() ) return( -1 ); } return( item.id ); } /* Returns the full pathname of the stored file for the given image ID */ public string? get_file( int id ) { var item = find_match( id ); if( item != null ) { return( item.get_path() ); } return( null ); } /* Returns the stored URI for the given imaged ID */ public string get_uri( int id ) { var item = find_match( id ); if( item != null ) { return( item.uri ); } return( "" ); } /* Sets the validity of the given URI to the the specified value. When an image is no longer needed, this method should be called with a value of false. When an image is needed again, this method should be called with a value of true. */ public void set_valid( int id, bool value ) { var item = find_match( id ); if( item != null ) { item.valid = value; } } /* Cleans up the contents of the stored images */ public void cleanup() { for( int i=0; i<_images.length; i++ ) { _images.index( i ).cleanup(); } } /* Allows the user to choose an image file. If the user selects an existing file, adds the image to the manager and returns the image ID to the calling function. If no image was selected, a value of -1 will be returned. */ public int choose_image( Gtk.Window parent ) { int id = -1; FileChooserNative dialog = new FileChooserNative( _( "Select Image" ), parent, FileChooserAction.OPEN, _( "Select" ), _( "Cancel" ) ); /* Allow pixbuf image types */ FileFilter filter = new FileFilter(); filter.set_filter_name( _( "Images" ) ); filter.add_pattern( "*.bmp" ); filter.add_pattern( "*.png" ); filter.add_pattern( "*.jpg" ); filter.add_pattern( "*.jpeg" ); filter.add_pattern( "*.svg" ); dialog.add_filter( filter ); if( dialog.run() == ResponseType.ACCEPT ) { id = add_image( dialog.get_uri() ); } /* Close the dialog */ dialog.destroy(); return( id ); } } Minder-1.5.1/src/Layout.vala000066400000000000000000000265751356632107200156710ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class Layout : Object { protected double _pc_gap = 100; /* Parent/child gap */ protected double _rt_gap = 100; /* Root node gaps */ public string name { protected set; get; default = ""; } public string icon { protected set; get; default = ""; } public bool balanceable { protected set; get; default = false; } /* Default constructor */ public Layout() {} /* Virtual function used to map a node's side to its new side when this layout is applied. */ public virtual NodeSide side_mapping( NodeSide side ) { switch( side ) { case NodeSide.LEFT : return( NodeSide.LEFT ); case NodeSide.RIGHT : return( NodeSide.RIGHT ); case NodeSide.TOP : return( NodeSide.LEFT ); case NodeSide.BOTTOM : return( NodeSide.RIGHT ); } return( NodeSide.RIGHT ); } /* Initializes the given node based on this layout */ public virtual void initialize( Node parent ) { var list = new SList(); for( int i=0; i { item.detach( item.side ); }); list.@foreach((item) => { item.attach_init( parent, -1 ); }); } /* Get the bbox for the given parent to the given depth */ public virtual NodeBounds bbox( Node parent, int side_mask ) { NodeBounds nb = {0, 0, 0, 0}; uint num_children = parent.children().length; parent.bbox( out nb.x, out nb.y, out nb.width, out nb.height ); double x2 = nb.x + nb.width; double y2 = nb.y + nb.height; if( (num_children != 0) && !parent.folded ) { for( int i=0; i (rx + (rw / 2))) ? NodeSide.RIGHT : NodeSide.LEFT ); } else { return( ((ny + (nh / 2)) > (ry + (rh / 2))) ? NodeSide.BOTTOM : NodeSide.TOP ); } } /* Sets the side values of the given node */ public virtual void set_side( Node current ) { if( !current.is_root() ) { NodeSide side = get_side( current ); if( current.side != side ) { current.side = side; propagate_side( current, side ); } } } /* Updates the layout when necessary when a node is edited */ public virtual void handle_update_by_edit( Node n, double diffw, double diffh ) { double adjust = 0 - (get_adjust( n ) / 2); if( (n.side & NodeSide.horizontal()) != 0 ) { if( (n.parent != null) && (diffh != 0) ) { n.adjust_posy_only( 0 - (diffh / 2) ); } if( diffw != 0 ) { if( n.side == NodeSide.LEFT ) { n.posx -= diffw; } else { for( int i=0; i= index) ? (0 - adjust) : adjust; if( (n.side & NodeSide.horizontal()) != 0 ) { n.posy += current_adjust; } else { n.posx += current_adjust; } } } /* Adjust the rest of the tree */ adjust_tree_all( parent, parent.tree_bbox, (0 - (get_adjust( parent ) / 2)), "by_delete" ); } /* Positions the given root node based on the position of the last node */ public virtual void position_root( Node last, Node n ) { var nb = last.tree_bbox; n.posx = last.posx; n.posy = nb.y + nb.height + _rt_gap; } } Minder-1.5.1/src/Layouts.vala000066400000000000000000000047241356632107200160440ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class Layouts : Object { private Array _layouts; /* Default constructor */ public Layouts() { /* Create the list of available layouts */ _layouts = new Array(); /* Create the layouts */ var manual = new LayoutManual(); var vertical = new LayoutVertical(); var horizontal = new LayoutHorizontal(); var left = new LayoutLeft(); var right = new LayoutRight(); var up = new LayoutUp(); var down = new LayoutDown(); /* Add the create layouts to the list */ _layouts.append_val( manual ); _layouts.append_val( vertical ); _layouts.append_val( horizontal ); _layouts.append_val( left ); _layouts.append_val( right ); _layouts.append_val( up ); _layouts.append_val( down ); } /* Populates the given array with a list of layout names */ public void get_names( ref Array names ) { for( int i=0; i<_layouts.length; i++ ) { names.append_val( _layouts.index( i ).name ); } } /* Populates the given array with a list of layout icon filenames */ public void get_icons( ref Array icons ) { for( int i=0; i<_layouts.length; i++ ) { icons.append_val( _layouts.index( i ).icon ); } } /* Display the available layouts */ public Layout get_layout( string name ) { for( int i=0; i<_layouts.length; i++ ) { if( name == _layouts.index( i ).name ) { return( _layouts.index( i ) ); } } return( _layouts.index( 2 ) ); } /* Returns the default layout (we are going to use 'horizontal') */ public Layout get_default() { return( _layouts.index( 2 ) ); } } Minder-1.5.1/src/LinkDash.vala000066400000000000000000000040341356632107200160730ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; public class LinkDash : Object { public string name; public string display_name; public double[] pattern; /* Default constructor */ public LinkDash( string name, string display_name, double[] pattern ) { this.name = name; this.display_name = display_name; this.pattern = pattern; } /* Makes an icon for the given dash */ public Cairo.Surface make_icon() { Cairo.ImageSurface surface = new Cairo.ImageSurface( Cairo.Format.ARGB32, 100, 20 ); Cairo.Context ctx = new Cairo.Context( surface ); ctx.set_source_rgba( 0.5, 0.5, 0.5, 1 ); ctx.set_dash( pattern, 0 ); ctx.set_line_width( 4 ); ctx.set_line_cap( LineCap.ROUND ); ctx.move_to( 10, 10 ); ctx.line_to( 90, 10 ); ctx.stroke(); return( surface ); } /* Sets the given context for the dash information */ public void set_context( Cairo.Context ctx, int line_width ) { double[] adjusted_pattern = {}; int i = 0; foreach( double val in pattern ) { if( i == 0 ) { adjusted_pattern += val; } else { adjusted_pattern += (line_width + val); } i++; } ctx.set_dash( adjusted_pattern, 0 ); } } Minder-1.5.1/src/LinkType.vala000066400000000000000000000032041356632107200161330ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public interface LinkType : Object { /* Returns the name of the link type */ public abstract string name(); /* Returns the display name of the link type (should be a translatable string) */ public abstract string display_name(); /* Returns the name of the link icon */ public abstract string icon_name(); protected double adjust_a( Style style ) { return( style.link_arrow ? ((style.link_width / 2) + ((style.node_borderwidth / 2) + 2)) : 0 ); } protected double adjust_tip( Style style ) { return( (style.link_width / 2) + 1 ); } /* Draw method for the link */ public abstract void draw( Cairo.Context ctx, Node to_node, double from_x, double from_y, double to_x, double to_y, out double fx, out double fy, out double tx, out double ty ); } Minder-1.5.1/src/MainWindow.vala000066400000000000000000001371711356632107200164630ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public enum TabAddReason { NEW, OPEN, IMPORT, LOAD } public class MainWindow : ApplicationWindow { private const string DESKTOP_SCHEMA = "io.elementary.desktop"; private const string DARK_KEY = "prefer-dark"; private GLib.Settings _settings; private HeaderBar? _header = null; private Gtk.AccelGroup? _accel_group = null; private DynamicNotebook? _nb = null; private Revealer? _inspector = null; private Box? _pbox = null; private Paned _pane = null; private Notebook? _inspector_nb = null; private Stack? _stack = null; private Popover? _zoom = null; private Popover? _search = null; private MenuButton? _search_btn = null; private SearchEntry? _search_entry = null; private TreeView _search_list; private Gtk.ListStore _search_items; private ScrolledWindow _search_scroll; private CheckButton _search_nodes; private CheckButton _search_connections; private CheckButton _search_titles; private CheckButton _search_notes; private CheckButton _search_folded; private CheckButton _search_unfolded; private CheckButton _search_tasks; private CheckButton _search_nontasks; private Popover? _export = null; private Scale? _zoom_scale = null; private ModelButton? _zoom_in = null; private ModelButton? _zoom_out = null; private ModelButton? _zoom_sel = null; private Button? _undo_btn = null; private Button? _redo_btn = null; private ToggleButton? _focus_btn = null; private Button? _prop_btn = null; private Image? _prop_show = null; private Image? _prop_hide = null; private bool _prefer_dark = false; private bool _debug = false; private ThemeEditor _themer; private const GLib.ActionEntry[] action_entries = { { "action_save", action_save }, { "action_quit", action_quit }, { "action_zoom_in", action_zoom_in }, { "action_zoom_out", action_zoom_out }, { "action_zoom_fit", action_zoom_fit }, { "action_zoom_selected", action_zoom_selected }, { "action_zoom_actual", action_zoom_actual }, { "action_export", action_export }, { "action_print", action_print }, { "action_shortcuts", action_shortcuts } }; private bool on_elementary = Gtk.Settings.get_default().gtk_icon_theme_name == "elementary"; private IconSize icon_size; private delegate void ChangedFunc(); public Themes themes { set; get; default = new Themes(); } public signal void canvas_changed( DrawArea? da ); /* Create the main window UI */ public MainWindow( Gtk.Application app, GLib.Settings settings ) { Object( application: app ); _settings = settings; icon_size = on_elementary ? IconSize.LARGE_TOOLBAR : IconSize.SMALL_TOOLBAR; /* Handle any changes to the dark mode preference setting */ handle_prefer_dark_changes(); var window_x = settings.get_int( "window-x" ); var window_y = settings.get_int( "window-y" ); var window_w = settings.get_int( "window-w" ); var window_h = settings.get_int( "window-h" ); /* Create the header bar */ _header = new HeaderBar(); _header.set_show_close_button( true ); /* Set the main window data */ title = _( "Minder" ); if( (window_x == -1) && (window_y == -1) ) { set_position( Gtk.WindowPosition.CENTER ); } else { move( window_x, window_y ); } set_default_size( window_w, window_h ); set_titlebar( _header ); set_border_width( 2 ); destroy.connect( Gtk.main_quit ); /* Set the stage for menu actions */ var actions = new SimpleActionGroup (); actions.add_action_entries( action_entries, this ); insert_action_group( "win", actions ); /* Create the accelerator group for the window */ _accel_group = new Gtk.AccelGroup(); this.add_accel_group( _accel_group ); /* Add keyboard shortcuts */ add_keyboard_shortcuts( app ); /* Create the notebook */ _nb = new DynamicNotebook(); _nb.add_button_visible = false; _nb.tab_bar_behavior = DynamicNotebook.TabBarBehavior.SINGLE; _nb.tab_switched.connect( tab_switched ); _nb.tab_reordered.connect( tab_reordered ); _nb.close_tab_requested.connect( close_tab_requested ); /* Create title toolbar */ var new_btn = new Button.from_icon_name( (on_elementary ? "document-new" : "document-new-symbolic"), icon_size ); new_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "New File" ), "Ctrl + N" ) ); new_btn.add_accelerator( "clicked", _accel_group, 'n', Gdk.ModifierType.CONTROL_MASK, AccelFlags.VISIBLE ); new_btn.clicked.connect( do_new_file ); _header.pack_start( new_btn ); var open_btn = new Button.from_icon_name( (on_elementary ? "document-open" : "document-open-symbolic"), icon_size ); open_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Open File" ), "Ctrl + O" ) ); open_btn.add_accelerator( "clicked", _accel_group, 'o', Gdk.ModifierType.CONTROL_MASK, AccelFlags.VISIBLE ); open_btn.clicked.connect( do_open_file ); _header.pack_start( open_btn ); var save_btn = new Button.from_icon_name( (on_elementary ? "document-save-as" : "document-save-as-symbolic"), icon_size ); save_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Save File As" ), "Ctrl + Shift + S" ) ); open_btn.add_accelerator( "clicked", _accel_group, 's', (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK), AccelFlags.VISIBLE ); save_btn.clicked.connect( do_save_as_file ); _header.pack_start( save_btn ); _undo_btn = new Button.from_icon_name( (on_elementary ? "edit-undo" : "edit-undo-symbolic"), icon_size ); _undo_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Undo" ), "Ctrl + Z" ) ); _undo_btn.set_sensitive( false ); _undo_btn.add_accelerator( "clicked", _accel_group, 'z', Gdk.ModifierType.CONTROL_MASK, AccelFlags.VISIBLE ); _undo_btn.clicked.connect( do_undo ); _header.pack_start( _undo_btn ); _redo_btn = new Button.from_icon_name( (on_elementary ? "edit-redo" : "edit-redo-symbolic"), icon_size ); _redo_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Redo" ), "Ctrl + Shift + Z" ) ); _redo_btn.set_sensitive( false ); _redo_btn.add_accelerator( "clicked", _accel_group, 'z', (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK), AccelFlags.VISIBLE ); _redo_btn.clicked.connect( do_redo ); _header.pack_start( _redo_btn ); /* Add the buttons on the right side in the reverse order */ add_property_button(); add_miscellaneous_button(); add_export_button(); add_search_button(); add_zoom_button(); add_focus_button(); /* Create the panel so that we can resize */ _pane = new Paned( Orientation.HORIZONTAL ); _pane.pack1( _nb, true, true ); _pane.move_handle.connect(() => { return( false ); }); /* Create the horizontal box that will contain the notebook and the properties sidebar */ _pbox = new Box( Orientation.HORIZONTAL, 0 ); _pbox.pack_start( _pane, true, true, 0 ); _pbox.pack_start( _inspector, false, true, 0 ); /* Display the UI */ add( _pbox ); show_all(); } /* Called whenever the current tab is switched in the notebook */ private void tab_switched( Tab? old_tab, Tab new_tab ) { tab_changed( new_tab ); } /* This needs to be called whenever the tab is changed */ private void tab_changed( Tab tab ) { var bin = (Gtk.Bin)tab.page; var da = bin.get_child() as DrawArea; do_buffer_changed( da ); on_current_changed( da ); update_title( da ); canvas_changed( da ); save_tab_state( tab ); } /* Called whenever the current tab is moved to a new position */ private void tab_reordered( Tab? tab, int new_pos ) { save_tab_state( tab ); } /* Closes the current tab */ public void close_current_tab() { if( _nb.n_tabs == 1 ) return; _nb.current.close(); } /* Called whenever the user clicks on the close button and the tab is unnamed */ private bool close_tab_requested( Tab tab ) { var bin = (Gtk.Bin)tab.page; var da = bin.get_child() as DrawArea; var ret = da.get_doc().is_saved() || show_save_warning( da ); return( ret ); } /* Adds a new tab to the notebook */ public DrawArea add_tab( string? fname, TabAddReason reason ) { /* Create and pack the canvas */ var da = new DrawArea( this, _settings, _accel_group ); da.current_changed.connect( on_current_changed ); da.scale_changed.connect( change_scale ); da.show_properties.connect( show_properties ); da.hide_properties.connect( hide_properties ); da.map_event.connect( on_canvas_mapped ); da.undo_buffer.buffer_changed.connect( do_buffer_changed ); da.theme_changed.connect( on_theme_changed ); da.animator.enable = _settings.get_boolean( "enable-animations" ); if( fname != null ) { da.get_doc().filename = fname; } /* Create the overlay that will hold the canvas so that we can put an entry box for emoji support */ var overlay = new Overlay(); overlay.add( da ); var tab = new Tab( da.get_doc().label, null, overlay ); tab.pinnable = false; tab.tooltip = fname; /* Add the page to the notebook */ _nb.insert_tab( tab, _nb.n_tabs ); /* Update the titlebar */ update_title( da ); /* Make the drawing area new */ if( reason == TabAddReason.NEW ) { da.initialize_for_new(); } else { da.initialize_for_open(); } /* Indicate that the tab has changed */ if( reason != TabAddReason.LOAD ) { _nb.current = tab; } da.grab_focus(); return( da ); } /* Returns the current drawing area */ public DrawArea? get_current_da( string? caller = null ) { if( _debug && (caller != null) ) { stdout.printf( "get_current_da called from %s\n", caller ); } if( _nb.current == null ) { return( null ); } var bin = (Gtk.Bin)_nb.current.page; return( (DrawArea)bin.get_child() ); } /* Handles any changes to the dark mode preference gsettings for the desktop */ private void handle_prefer_dark_changes() { var lookup = SettingsSchemaSource.get_default().lookup( DESKTOP_SCHEMA, false ); if( lookup != null ) { var desktop_settings = new GLib.Settings( DESKTOP_SCHEMA ); _prefer_dark = desktop_settings.get_boolean( DARK_KEY ); desktop_settings.changed.connect(() => { _prefer_dark = desktop_settings.get_boolean( DARK_KEY ); on_theme_changed( get_current_da( "handle_prefer_dark_changes" ) ); }); } } /* Updates the title */ private void update_title( DrawArea? da ) { var suffix = " \u2014 Minder"; if( (da == null) || !da.get_doc().is_saved() ) { _header.set_title( _( "Unnamed Document" ) + suffix ); } else { _header.set_title( GLib.Path.get_basename( da.get_doc().filename ) + suffix ); } _header.set_subtitle( _focus_btn.active ? _( "Focus Mode" ) : null ); } /* Adds keyboard shortcuts for the menu actions */ private void add_keyboard_shortcuts( Gtk.Application app ) { app.set_accels_for_action( "win.action_save", { "s" } ); app.set_accels_for_action( "win.action_quit", { "q" } ); app.set_accels_for_action( "win.action_zoom_actual", { "0" } ); app.set_accels_for_action( "win.action_zoom_in", { "plus" } ); app.set_accels_for_action( "win.action_zoom_out", { "minus" } ); app.set_accels_for_action( "win.action_print", { "p" } ); app.set_accels_for_action( "win.action_shortcuts", { "F1" } ); } /* Adds the zoom functionality */ private void add_zoom_button() { /* Create the menu button */ var menu_btn = new MenuButton(); menu_btn.set_image( new Image.from_icon_name( (on_elementary ? "zoom-fit-best" : "zoom-fit-best-symbolic"), icon_size ) ); menu_btn.set_tooltip_text( _( "Zoom" ) ); _header.pack_end( menu_btn ); /* Create zoom menu popover */ Box box = new Box( Orientation.VERTICAL, 5 ); var marks = DrawArea.get_scale_marks(); var scale_lbl = new Label( _( "Zoom to Percent" ) ); _zoom_scale = new Scale.with_range( Orientation.HORIZONTAL, marks[0], marks[marks.length-1], 25 ); foreach (double mark in marks) { _zoom_scale.add_mark( mark, PositionType.BOTTOM, null ); } _zoom_scale.has_origin = false; _zoom_scale.set_value( 100 ); _zoom_scale.change_value.connect( adjust_zoom ); _zoom_scale.format_value.connect( set_zoom_value ); _zoom_in = new ModelButton(); _zoom_in.text = _( "Zoom In" ); _zoom_in.action_name = "win.action_zoom_in"; _zoom_out = new ModelButton(); _zoom_out.text = _( "Zoom Out" ); _zoom_out.action_name = "win.action_zoom_out"; var fit = new ModelButton(); fit.text = _( "Zoom to Fit" ); fit.action_name = "win.action_zoom_fit"; _zoom_sel = new ModelButton(); _zoom_sel.text = _( "Zoom to Fit Selected Node" ); _zoom_sel.action_name = "win.action_zoom_selected"; var actual = new ModelButton(); actual.text = _( "Zoom to Actual Size" ); actual.action_name = "win.action_zoom_actual"; box.margin = 5; box.pack_start( scale_lbl, false, true ); box.pack_start( _zoom_scale, false, true ); box.pack_start( new Separator( Orientation.HORIZONTAL ), false, true ); box.pack_start( _zoom_in, false, true ); box.pack_start( _zoom_out, false, true ); box.pack_start( new Separator( Orientation.HORIZONTAL ), false, true ); box.pack_start( fit, false, true ); box.pack_start( _zoom_sel, false, true ); box.pack_start( actual, false, true ); box.show_all(); _zoom = new Popover( null ); _zoom.add( box ); menu_btn.popover = _zoom; } /* Adds the search functionality */ private void add_search_button() { /* Create the menu button */ _search_btn = new MenuButton(); _search_btn.set_image( new Image.from_icon_name( "minder-search", icon_size ) ); _search_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Search" ), "Ctrl + F" ) ); _search_btn.add_accelerator( "clicked", _accel_group, 'f', Gdk.ModifierType.CONTROL_MASK, AccelFlags.VISIBLE ); _search_btn.clicked.connect( on_search_change ); _header.pack_end( _search_btn ); /* Create search popover */ var box = new Box( Orientation.VERTICAL, 5 ); /* Create the search entry field */ _search_entry = new SearchEntry(); _search_entry.placeholder_text = _( "Search Nodes and Connections" ); _search_entry.width_chars = 60; _search_entry.search_changed.connect( on_search_change ); _search_items = new Gtk.ListStore( 4, typeof(string), typeof(string), typeof(Node), typeof(Connection) ); /* Create the treeview */ _search_list = new TreeView.with_model( _search_items ); var type_cell = new CellRendererText(); type_cell.xalign = 1; _search_list.insert_column_with_attributes( -1, null, type_cell, "markup", 0, null ); _search_list.insert_column_with_attributes( -1, null, new CellRendererText(), "markup", 1, null ); _search_list.headers_visible = false; _search_list.activate_on_single_click = true; _search_list.enable_search = false; _search_list.row_activated.connect( on_search_clicked ); /* Create the scrolled window for the treeview */ _search_scroll = new ScrolledWindow( null, null ); _search_scroll.height_request = 200; _search_scroll.hscrollbar_policy = PolicyType.EXTERNAL; _search_scroll.add( _search_list ); var search_opts = new Expander( _( "Search Criteria" ) ); search_opts.add( create_search_options_box() ); box.margin = 5; box.pack_start( _search_entry, false, true ); box.pack_start( _search_scroll, true, true ); box.pack_start( new Separator( Orientation.HORIZONTAL ) ); box.pack_start( search_opts, false, true, 5 ); box.show_all(); /* Create the popover and associate it with the menu button */ _search = new Popover( null ); _search.add( box ); _search_btn.popover = _search; } /* Creates the UI for the search criteria box */ private Grid create_search_options_box() { var grid = new Grid(); _search_nodes = new CheckButton.with_label( _( "Nodes" ) ); _search_connections = new CheckButton.with_label( _( "Connections" ) ); _search_titles = new CheckButton.with_label( _( "Titles" ) ); _search_notes = new CheckButton.with_label( _( "Notes" ) ); _search_folded = new CheckButton.with_label( _( "Folded" ) ); _search_unfolded = new CheckButton.with_label( _( "Unfolded" ) ); _search_tasks = new CheckButton.with_label( _( "Tasks" ) ); _search_nontasks = new CheckButton.with_label( _( "Non-tasks" ) ); /* Set the active values from the settings */ _search_nodes.active = _settings.get_boolean( "search-opt-nodes" ); _search_connections.active = _settings.get_boolean( "search-opt-connections" ); _search_titles.active = _settings.get_boolean( "search-opt-titles" ); _search_notes.active = _settings.get_boolean( "search-opt-notes" ); _search_folded.active = _settings.get_boolean( "search-opt-folded" ); _search_unfolded.active = _settings.get_boolean( "search-opt-unfolded" ); _search_tasks.active = _settings.get_boolean( "search-opt-tasks" ); _search_nontasks.active = _settings.get_boolean( "search-opt-nontasks" ); /* Set the checkbutton sensitivity */ _search_nodes.set_sensitive( _search_connections.active ); _search_connections.set_sensitive( _search_nodes.active ); _search_titles.set_sensitive( _search_notes.active ); _search_notes.set_sensitive( _search_titles.active ); _search_folded.set_sensitive( _search_nodes.active && _search_unfolded.active ); _search_unfolded.set_sensitive( _search_nodes.active && _search_folded.active ); _search_tasks.set_sensitive( _search_nodes.active && _search_nontasks.active ); _search_nontasks.set_sensitive( _search_nodes.active && _search_tasks.active ); _search_nodes.toggled.connect(() => { bool nodes = _search_nodes.active; _settings.set_boolean( "search-opt-nodes", _search_nodes.active ); _search_connections.set_sensitive( nodes ); _search_folded.set_sensitive( nodes ); _search_unfolded.set_sensitive( nodes ); _search_tasks.set_sensitive( nodes ); _search_nontasks.set_sensitive( nodes ); on_search_change(); }); _search_connections.toggled.connect(() => { _settings.set_boolean( "search-opt-connections", _search_connections.active ); _search_nodes.set_sensitive( _search_connections.active ); on_search_change(); }); _search_titles.toggled.connect(() => { _settings.set_boolean( "search-opt-titles", _search_titles.active ); _search_notes.set_sensitive( _search_titles.active ); on_search_change(); }); _search_notes.toggled.connect(() => { _settings.set_boolean( "search-opt-notes", _search_notes.active ); _search_titles.set_sensitive( _search_notes.active ); on_search_change(); }); _search_folded.toggled.connect(() => { _settings.set_boolean( "search-opt-folded", _search_folded.active ); _search_unfolded.set_sensitive( _search_folded.active ); on_search_change(); }); _search_unfolded.toggled.connect(() => { _settings.set_boolean( "search-opt-unfolded", _search_unfolded.active ); _search_folded.set_sensitive( _search_unfolded.active ); on_search_change(); }); _search_tasks.toggled.connect(() => { _settings.set_boolean( "search-opt-tasks", _search_tasks.active ); _search_nontasks.set_sensitive( _search_tasks.active ); on_search_change(); }); _search_nontasks.clicked.connect(() => { _settings.set_boolean( "search-opt-nontasks", _search_nontasks.active ); _search_tasks.set_sensitive( _search_nontasks.active ); on_search_change(); }); grid.margin_top = 10; grid.column_homogeneous = true; grid.column_spacing = 10; grid.attach( _search_nodes, 0, 0, 1, 1 ); grid.attach( _search_connections, 0, 1, 1, 1 ); grid.attach( _search_titles, 1, 0, 1, 1 ); grid.attach( _search_notes, 1, 1, 1, 1 ); grid.attach( _search_folded, 2, 0, 1, 1 ); grid.attach( _search_unfolded, 2, 1, 1, 1 ); grid.attach( _search_tasks, 3, 0, 1, 1 ); grid.attach( _search_nontasks, 3, 1, 1, 1 ); return( grid ); } /* Adds the export functionality */ private void add_export_button() { /* Create the menu button */ var menu_btn = new MenuButton(); menu_btn.set_image( new Image.from_icon_name( (on_elementary ? "document-export" : "document-send-symbolic"), icon_size ) ); menu_btn.set_tooltip_text( _( "Export" ) ); _header.pack_end( menu_btn ); /* Create export menu */ var box = new Box( Orientation.VERTICAL, 5 ); var export = new ModelButton(); export.text = _( "Export…" ); export.action_name = "win.action_export"; var print = new ModelButton(); print.text = _( "Print" ); print.action_name = "win.action_print"; box.margin = 5; box.pack_start( export, false, true ); box.pack_start( new Separator( Orientation.HORIZONTAL ), false, true ); box.pack_start( print, false, true ); box.show_all(); /* Create the popover and associate it with clicking on the menu button */ _export = new Popover( null ); _export.add( box ); menu_btn.popover = _export; } /* Adds the focus mode button to the headerbar */ private void add_focus_button() { _focus_btn = new ToggleButton(); _focus_btn.image = new Image.from_icon_name( "minder-focus", icon_size ); _focus_btn.draw_indicator = true; _focus_btn.set_tooltip_markup( Utils.tooltip_with_accel( _( "Focus Mode" ), "Ctrl + Shift + F" ) ); _focus_btn.add_accelerator( "clicked", _accel_group, 'f', (Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK), AccelFlags.VISIBLE ); _focus_btn.clicked.connect((e) => { var da = get_current_da(); update_title( da ); da.set_focus_mode( _focus_btn.active ); da.grab_focus(); }); _header.pack_end( _focus_btn ); } /* Adds the miscellaneous functionality */ private void add_miscellaneous_button() { /* Create the menu button */ var misc_btn = new MenuButton(); misc_btn.set_image( new Image.from_icon_name( (on_elementary ? "open-menu" : "open-menu-symbolic"), icon_size ) ); /* Create export menu */ var box = new Box( Orientation.VERTICAL, 5 ); /* var prefs = new ModelButton(); prefs.text = _( "Preferences" ); prefs.action_name = "win.action_prefs"; */ var shortcuts = new ModelButton(); shortcuts.text = _( "Shortcuts Cheatsheet" ); shortcuts.action_name = "win.action_shortcuts"; box.margin = 5; /* box.pack_start( export, false, true ); box.pack_start( new Separator( Orientation.HORIZONTAL ), false, true ); */ box.pack_start( shortcuts, false, true ); box.show_all(); /* Create the popover and associate it with clicking on the menu button */ var misc_pop = new Popover( null ); misc_pop.add( box ); misc_btn.popover = misc_pop; _header.pack_end( misc_btn ); } /* Adds the property functionality */ private void add_property_button() { /* Add the menubutton */ _prop_show = new Image.from_icon_name( "minder-sidebar-open", icon_size ); _prop_hide = new Image.from_icon_name( "minder-sidebar-close", icon_size ); _prop_btn = new Button(); _prop_btn.image = _prop_show; _prop_btn.set_tooltip_text( _( "Properties" ) ); _prop_btn.add_accelerator( "clicked", _accel_group, '|', Gdk.ModifierType.CONTROL_MASK, AccelFlags.VISIBLE ); _prop_btn.clicked.connect( inspector_clicked ); _header.pack_end( _prop_btn ); /* Create the inspector sidebar */ _inspector_nb = new Notebook(); _inspector_nb.show_tabs = false; var box = new Box( Orientation.VERTICAL, 20 ); var sb = new StackSwitcher(); _stack = new Stack(); _stack.set_transition_type( StackTransitionType.SLIDE_LEFT_RIGHT ); _stack.set_transition_duration( 500 ); _stack.add_titled( new CurrentInspector( this ), "current", _("Current") ); _stack.add_titled( new StyleInspector( this, _settings ), "style", _("Style") ); _stack.add_titled( new MapInspector( this, _settings ), "map", _("Map") ); _stack.add_events( EventMask.KEY_PRESS_MASK ); _stack.key_press_event.connect( stack_keypress ); /* If the stack switcher is clicked, save off which tab is in view */ _stack.notify.connect((ps) => { if( ps.name == "visible-child" ) { _settings.set_boolean( "current-properties-shown", (_stack.visible_child_name == "current") ); _settings.set_boolean( "map-properties-shown", (_stack.visible_child_name == "map") ); _settings.set_boolean( "style-properties-shown", (_stack.visible_child_name == "style" ) ); } }); sb.homogeneous = true; sb.set_stack( _stack ); box.margin = 5; box.pack_start( sb, false, true, 0 ); box.pack_start( _stack, true, true, 0 ); box.show_all(); _themer = new ThemeEditor( this ); _inspector_nb.append_page( box ); _inspector_nb.append_page( _themer ); _inspector = new Revealer(); _inspector.set_transition_type( RevealerTransitionType.SLIDE_LEFT ); _inspector.set_transition_duration( 500 ); _inspector.child = _inspector_nb; /* If the settings says to display the properties, do it now */ if( _settings.get_boolean( "current-properties-shown" ) ) { show_properties( "current", false ); } else if( _settings.get_boolean( "map-properties-shown" ) ) { show_properties( "map", false ); } else if( _settings.get_boolean( "style-properties-shown" ) ) { show_properties( "style", false ); } } private bool stack_keypress( EventKey e ) { if( e.keyval == 65307 ) { /* Escape key pressed */ hide_properties(); return( false ); } return( true ); } /* Show or hides the inspector sidebar */ private void inspector_clicked() { if( _inspector.child_revealed ) { hide_properties(); } else { show_properties( null, false ); } } /* Displays the save warning dialog window */ public bool show_save_warning( DrawArea da ) { var dialog = new Granite.MessageDialog.with_image_from_icon_name( _( "Save current unnamed document?" ), _( "Changes will be permanently lost if not saved." ), "dialog-warning", ButtonsType.NONE ); var dont = new Button.with_label( _( "Discard Changes" ) ); dialog.add_action_widget( dont, ResponseType.CLOSE ); var cancel = new Button.with_label( _( "Cancel" ) ); dialog.add_action_widget( cancel, ResponseType.CANCEL ); var save = new Button.with_label( _( "Save" ) ); save.get_style_context().add_class( STYLE_CLASS_SUGGESTED_ACTION ); dialog.add_action_widget( save, ResponseType.ACCEPT ); dialog.set_transient_for( this ); dialog.set_default_response( ResponseType.ACCEPT ); dialog.set_title( "" ); dialog.show_all(); var res = dialog.run(); dialog.destroy(); switch( res ) { case ResponseType.ACCEPT : return( save_file( da ) ); case ResponseType.CLOSE : return( da.get_doc().remove() ); } return( false ); } /* Creates a new file */ public void do_new_file() { var da = add_tab( null, TabAddReason.NEW ); /* Set the title to indicate that we have an unnamed document */ update_title( da ); } /* Allows the user to select a file to open and opens it in the same window. */ public void do_open_file() { /* Get the file to open from the user */ FileChooserNative dialog = new FileChooserNative( _( "Open File" ), this, FileChooserAction.OPEN, _( "Open" ), _( "Cancel" ) ); /* Create file filters */ var filter = new FileFilter(); filter.set_filter_name( "Minder" ); filter.add_pattern( "*.minder" ); dialog.add_filter( filter ); filter = new FileFilter(); filter.set_filter_name( "Freemind / Freeplane" ); filter.add_pattern( "*.mm" ); dialog.add_filter( filter ); filter = new FileFilter(); filter.set_filter_name( "OPML" ); filter.add_pattern( "*.opml" ); dialog.add_filter( filter ); filter = new FileFilter(); filter.set_filter_name( _( "PlainText" ) ); filter.add_pattern( "*.txt" ); dialog.add_filter( filter ); if( dialog.run() == ResponseType.ACCEPT ) { open_file( dialog.get_filename() ); } get_current_da( "do_open_file" ).grab_focus(); } /* Opens the file and display it in the canvas */ public bool open_file( string fname ) { if( !FileUtils.test( fname, FileTest.IS_REGULAR ) ) { return( false ); } if( fname.has_suffix( ".minder" ) ) { var da = add_tab( fname, TabAddReason.OPEN ); update_title( da ); da.get_doc().load(); return( true ); } else if( fname.has_suffix( ".opml" ) ) { var new_fname = fname.substring( 0, (fname.length - 5) ) + ".minder"; var da = add_tab( new_fname, TabAddReason.IMPORT ); update_title( da ); ExportOPML.import( fname, da ); return( true ); } else if( fname.has_suffix( ".mm" ) ) { var new_fname = fname.substring( 0, (fname.length - 3) ) + ".minder"; var da = add_tab( new_fname, TabAddReason.IMPORT ); update_title( da ); ExportFreeplane.import( fname, da ); return( true ); } else if( fname.has_suffix( ".txt" ) ) { var new_fname = fname.substring( 0, (fname.length - 4) ) + ".minder"; var da = add_tab( new_fname, TabAddReason.IMPORT ); update_title( da ); ExportText.import( fname, da ); } return( false ); } /* Perform an undo action */ public void do_undo() { var da = get_current_da( "do_undo" ); da.undo_buffer.undo(); da.grab_focus(); } /* Perform a redo action */ public void do_redo() { var da = get_current_da( "do_redo" ); da.undo_buffer.redo(); da.grab_focus(); } private bool on_canvas_mapped( Gdk.EventAny e ) { get_current_da( "on_canvas_mapped" ).queue_draw(); return( false ); } /* Called whenever the theme is changed */ private void on_theme_changed( DrawArea da ) { Gtk.Settings? settings = Gtk.Settings.get_default(); if( settings != null ) { settings.gtk_application_prefer_dark_theme = _prefer_dark || da.get_theme().prefer_dark; } } /* Called whenever the undo buffer changes state. Updates the state of the undo and redo buffer buttons. */ public void do_buffer_changed( DrawArea da ) { _undo_btn.set_sensitive( da.undo_buffer.undoable() ); _undo_btn.set_tooltip_text( da.undo_buffer.undo_tooltip() ); _redo_btn.set_sensitive( da.undo_buffer.redoable() ); _redo_btn.set_tooltip_text( da.undo_buffer.redo_tooltip() ); } /* Allow the user to select a filename to save the document as */ public bool save_file( DrawArea da ) { FileChooserNative dialog = new FileChooserNative( _( "Save File" ), this, FileChooserAction.SAVE, _( "Save" ), _( "Cancel" ) ); FileFilter filter = new FileFilter(); bool retval = false; filter.set_filter_name( _( "Minder" ) ); filter.add_pattern( "*.minder" ); dialog.add_filter( filter ); if( dialog.run() == ResponseType.ACCEPT ) { var fname = dialog.get_filename(); if( fname.substring( -7, -1 ) != ".minder" ) { fname += ".minder"; } da.get_doc().filename = fname; da.get_doc().save(); _nb.current.label = da.get_doc().label; update_title( da ); retval = true; } da.grab_focus(); return( retval ); } /* Called when the save as button is clicked */ public void do_save_as_file() { var da = get_current_da( "do_save_as_file" ); save_file( da ); } /* Called whenever the node selection changes in the canvas */ private void on_current_changed( DrawArea da ) { _zoom_sel.set_sensitive( da.get_current_node() != null ); if( da.get_focus_mode() ) { _focus_btn.active = true; _focus_btn.set_sensitive( true ); } else { _focus_btn.active = false; _focus_btn.set_sensitive( da.get_current_node() != null ); } } /* Called if the canvas changes the scale factor value. Adjusts the UI to match. */ private void change_scale( double scale_factor ) { var marks = DrawArea.get_scale_marks(); var scale_value = scale_factor * 100; _zoom_scale.set_value( scale_value ); _zoom_in.set_sensitive( scale_value < marks[marks.length-1] ); _zoom_out.set_sensitive( scale_value > marks[0] ); } /* Displays the node properties panel for the current node */ private void show_properties( string? tab, bool grab_note ) { if( !_inspector.reveal_child || ((tab != null) && (_stack.visible_child_name != tab)) ) { _prop_btn.image = _prop_hide; if( tab != null ) { _stack.visible_child_name = tab; } if( !_inspector.reveal_child ) { Timeout.add( 501, move_inspector_to_pane ); _inspector.reveal_child = true; if( get_current_da( "show_properties 1" ) != null ) { get_current_da( "show_properties 2" ).see( -300 ); } } _settings.set_boolean( (_stack.visible_child_name + "-properties-shown"), true ); } if( grab_note && (tab != null) && (tab == "current") ) { var ci = _stack.get_child_by_name( tab ) as CurrentInspector; if( ci != null ) { ci.grab_note(); } } } /* Displays the theme editor pane */ public void show_theme_editor( bool edit ) { _themer.initialize( get_current_da().get_theme(), edit ); _inspector_nb.page = 1; } /* Hides the theme editor pane */ public void hide_theme_editor() { _inspector_nb.page = 0; } private bool move_inspector_to_pane() { var ci = _stack.get_child_by_name( "current" ) as CurrentInspector; if( ci != null ) { ci.reset_width(); } _pbox.remove( _inspector ); _pane.pack2( _inspector, false, false ); return( false ); } /* Hides the node properties panel */ private void hide_properties() { if( !_inspector.reveal_child ) return; var prop_width = (_pane.get_allocated_width() - _pane.position) - 11; var ci = _stack.get_child_by_name( "current" ) as CurrentInspector; if( ci != null ) { ci.set_width( prop_width ); } _prop_btn.image = _prop_show; _pane.remove( _inspector ); _pbox.pack_start( _inspector, false, true, 0 ); _inspector.reveal_child = false; get_current_da( "hide_properties" ).grab_focus(); _settings.set_boolean( "current-properties-shown", false ); _settings.set_boolean( "map-properties-shown", false ); _settings.set_boolean( "style-properties-shown", false ); _settings.set_int( "properties-width", prop_width ); } /* Converts the given value from the scale to the zoom value to use */ private double zoom_to_value( double value ) { double last = -1; foreach (double mark in DrawArea.get_scale_marks()) { if( last != -1 ) { if( value < ((mark + last) / 2) ) { return( last ); } } last = mark; } return( last ); } /* Sets the scale factor for the level of zoom to perform */ private bool adjust_zoom( ScrollType scroll, double new_value ) { var value = zoom_to_value( new_value ); var scale_factor = value / 100; var da = get_current_da( "adjust_zoom" ); da.set_scaling_factor( scale_factor ); da.queue_draw(); return( false ); } /* Returns the value to display in the zoom control */ private string set_zoom_value( double val ) { return( zoom_to_value( val ).to_string() ); } /* Called when the user uses the Control-s keyboard shortcut */ private void action_save() { var da = get_current_da( "action_save" ); if( da.get_doc().is_saved() ) { da.get_doc().save(); } else { save_file( da ); } } /* Called when the user uses the Control-q keyboard shortcut */ private void action_quit() { destroy(); } /* Zooms into the image (makes things larger) */ private void action_zoom_in() { var da = get_current_da( "action_zoom_in" ); da.zoom_in(); da.grab_focus(); } /* Zooms out of the image (makes things smaller) */ private void action_zoom_out() { var da = get_current_da( "action_zoom_out" ); da.zoom_out(); da.grab_focus(); } /* Zooms to make all nodes visible within the viewer */ private void action_zoom_fit() { var da = get_current_da( "action_zoom_fit" ); da.zoom_to_fit(); da.grab_focus(); } /* Zooms to make the currently selected node and its tree put into view */ private void action_zoom_selected() { var da = get_current_da( "action_zoom_selected" ); da.zoom_to_selected(); da.grab_focus(); } /* Sets the zoom to 100% */ private void action_zoom_actual() { var da = get_current_da( "action_zoom_actual" ); da.zoom_actual(); da.grab_focus(); } /* Display matched items to the search within the search popover */ private void on_search_change() { bool[] search_opts = { _search_nodes.active, // 0 _search_connections.active, // 1 _search_titles.active, // 2 _search_notes.active, // 3 _search_folded.active, // 4 _search_unfolded.active, // 5 _search_tasks.active, // 6 _search_nontasks.active // 7 }; _search_items.clear(); if( _search_entry.get_text() != "" ) { get_current_da( "on_search_change" ).get_match_items( _search_entry.get_text().casefold(), search_opts, ref _search_items ); } } /* Called when the user selects an item in the search list. The current node will be set to the node associated with the selection. */ private void on_search_clicked( TreePath path, TreeViewColumn col ) { TreeIter it; Node? node = null; Connection? conn = null; var da = get_current_da( "on_search_clicked" ); _search_items.get_iter( out it, path ); _search_items.get( it, 2, &node, 3, &conn, -1 ); if( node != null ) { da.set_current_connection( null ); da.set_current_node( node ); da.see(); } else if( conn != null ) { da.set_current_node( null ); da.set_current_connection( conn ); da.see(); } _search.closed(); da.grab_focus(); } /* Exports the model to various formats */ private void action_export() { // FileChooserNative dialog = new FileChooserNative( _( "Export As" ), this, FileChooserAction.SAVE, _( "Export" ), _( "Cancel" ) ); FileChooserDialog dialog = new FileChooserDialog( _( "Export As" ), this, FileChooserAction.SAVE, _( "Cancel" ), ResponseType.CANCEL, _( "Export" ), ResponseType.ACCEPT ); /* BMP */ FileFilter bmp_filter = new FileFilter(); bmp_filter.set_filter_name( _( "BMP" ) ); bmp_filter.add_pattern( "*.bmp" ); dialog.add_filter( bmp_filter ); /* CSV */ FileFilter csv_filter = new FileFilter(); csv_filter.set_filter_name( _( "CSV" ) ); csv_filter.add_pattern( "*.csv" ); dialog.add_filter( csv_filter ); /* FreeMind */ FileFilter fm_filter = new FileFilter(); fm_filter.set_filter_name( _( "Freemind" ) ); fm_filter.add_pattern( "*.mm" ); dialog.add_filter( fm_filter ); /* Freeplane */ FileFilter fp_filter = new FileFilter(); fp_filter.set_filter_name( _( "Freeplane" ) ); fp_filter.add_pattern( "*.mm" ); dialog.add_filter( fp_filter ); /* JPEG */ FileFilter jpeg_filter = new FileFilter(); jpeg_filter.set_filter_name( _( "JPEG" ) ); jpeg_filter.add_pattern( "*.jpeg" ); jpeg_filter.add_pattern( "*.jpg" ); dialog.add_filter( jpeg_filter ); /* Markdown */ FileFilter md_filter = new FileFilter(); md_filter.set_filter_name( _( "Markdown" ) ); md_filter.add_pattern( "*.md" ); md_filter.add_pattern( "*.markdown" ); dialog.add_filter( md_filter ); /* Mermaid */ FileFilter mmd_filter = new FileFilter(); mmd_filter.set_filter_name( _( "Mermaid" ) ); mmd_filter.add_pattern( "*.mmd" ); dialog.add_filter( mmd_filter ); /* OPML */ FileFilter opml_filter = new FileFilter(); opml_filter.set_filter_name( _( "OPML" ) ); opml_filter.add_pattern( "*.opml" ); dialog.add_filter( opml_filter ); /* PDF */ FileFilter pdf_filter = new FileFilter(); pdf_filter.set_filter_name( _( "PDF" ) ); pdf_filter.add_pattern( "*.pdf" ); dialog.add_filter( pdf_filter ); /* PNG (transparent) */ FileFilter pngt_filter = new FileFilter(); pngt_filter.set_filter_name( _( "PNG (Transparent)" ) ); pngt_filter.add_pattern( "*.png" ); dialog.add_filter( pngt_filter ); /* PNG (opaque) */ FileFilter pngo_filter = new FileFilter(); pngo_filter.set_filter_name( _( "PNG (Opaque)" ) ); pngo_filter.add_pattern( "*.png" ); dialog.add_filter( pngo_filter ); /* PlainText */ FileFilter txt_filter = new FileFilter(); txt_filter.set_filter_name( _( "PlainText" ) ); txt_filter.add_pattern( "*.txt" ); dialog.add_filter( txt_filter ); /* SVG */ FileFilter svg_filter = new FileFilter(); svg_filter.set_filter_name( _( "SVG" ) ); svg_filter.add_pattern( "*.svg" ); dialog.add_filter( svg_filter ); /* yEd */ FileFilter yed_filter = new FileFilter(); yed_filter.set_filter_name( _( "yEd" ) ); yed_filter.add_pattern( "*.graphml" ); dialog.add_filter( yed_filter ); if( dialog.run() == ResponseType.ACCEPT ) { var fname = dialog.get_filename(); var filter = dialog.get_filter(); var da = get_current_da( "action_export" ); if( bmp_filter == filter ) { ExportImage.export( repair_filename( fname, {".bmp"} ), "bmp", da ); } else if( csv_filter == filter ) { ExportCSV.export( repair_filename( fname, {".csv"} ), da ); } else if( fm_filter == filter ) { ExportFreemind.export( repair_filename( fname, {".mm"} ), da ); } else if( fp_filter == filter ) { ExportFreeplane.export( repair_filename( fname, {".mm"} ), da ); } else if( jpeg_filter == filter ) { ExportImage.export( repair_filename( fname, {".jpeg", ".jpg"} ), "jpeg", da ); } else if( md_filter == filter ) { ExportMarkdown.export( repair_filename( fname, {".md", ".markdown"} ), da ); } else if( mmd_filter == filter ) { ExportMermaid.export( repair_filename( fname, {".mmd"} ), da ); } else if( opml_filter == filter ) { ExportOPML.export( repair_filename( fname, {".opml"} ), da ); } else if( pdf_filter == filter ) { ExportPDF.export( repair_filename( fname, {".pdf"} ), da ); } else if( pngt_filter == filter ) { ExportPNG.export( repair_filename( fname, {".png"} ), da, true ); } else if( pngo_filter == filter ) { ExportPNG.export( repair_filename( fname, {".png"} ), da, false ); } else if( txt_filter == filter ) { ExportText.export( repair_filename( fname, {".txt"} ), da ); } else if( svg_filter == filter ) { ExportSVG.export( repair_filename( fname, {".svg"} ), da ); } else if( yed_filter == filter ) { ExportYed.export( repair_filename( fname, {".graphml"} ), da ); } } dialog.close(); } /* Checks the given filename to see if it contains any of the given suffixes. If a valid suffix is found, return the filename without modification; otherwise, returns the filename with the extension added. */ private string repair_filename( string fname, string[] extensions ) { foreach (string ext in extensions) { if( fname.has_suffix( ext ) ) { return( fname ); } } return( fname + extensions[0] ); } /* Exports the model to the printer */ private void action_print() { var print = new ExportPrint(); print.print( get_current_da( "action_print" ), this ); } /* Displays the shortcuts cheatsheet */ private void action_shortcuts() { var builder = new Builder.from_resource( "/com/github/phase1geo/minder/shortcuts.ui" ); var win = builder.get_object( "shortcuts" ) as ShortcutsWindow; var da = get_current_da(); win.transient_for = this; win.view_name = null; /* Display the most relevant information based on the current state */ if( da.is_node_editable() || da.is_connection_editable() ) { win.section_name = "text-editing"; } else if( da.is_node_selected() ) { win.section_name = "node"; } else if( da.is_connection_selected() ) { win.section_name = "connection"; } else { win.section_name = "general"; } win.show(); } /* Save the current tab state */ private void save_tab_state( Tab current_tab ) { var dir = GLib.Path.build_filename( Environment.get_user_data_dir(), "minder" ); if( DirUtils.create_with_parents( dir, 0775 ) != 0 ) { return; } var fname = GLib.Path.build_filename( dir, "tab_state.xml" ); var selected_tab = -1; var i = 0; Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* root = new Xml.Node( null, "tabs" ); doc->set_root_element( root ); _nb.tabs.foreach((tab) => { var bin = (Gtk.Bin)tab.page; var da = (DrawArea)bin.get_child(); Xml.Node* node = new Xml.Node( null, "tab" ); node->new_prop( "path", da.get_doc().filename ); node->new_prop( "saved", da.get_doc().is_saved().to_string() ); root->add_child( node ); if( tab == current_tab ) { selected_tab = i; } i++; }); if( selected_tab > -1 ) { root->new_prop( "selected", selected_tab.to_string() ); } /* Save the file */ doc->save_format_file( fname, 1 ); delete doc; } /* Loads the tab state */ public bool load_tab_state() { var tab_state = GLib.Path.build_filename( Environment.get_user_data_dir(), "minder", "tab_state.xml" ); Xml.Doc* doc = Xml.Parser.parse_file( tab_state ); if( doc == null ) { return( false ); } var root = doc->get_root_element(); for( Xml.Node* it = root->children; it != null; it = it->next ) { if( (it->type == Xml.ElementType.ELEMENT_NODE) && (it->name == "tab") ) { var fname = it->get_prop( "path" ); var saved = it->get_prop( "saved" ); var da = add_tab( fname, TabAddReason.LOAD ); da.get_doc().load_filename( fname, bool.parse( saved ) ); da.get_doc().load(); } } var s = root->get_prop( "selected" ); if( s != null ) { _nb.current = _nb.get_tab_by_index( int.parse( s ) ); tab_changed( _nb.current ); } delete doc; return( _nb.n_tabs > 0 ); } } Minder-1.5.1/src/MapInspector.vala000066400000000000000000000316051356632107200170060ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class MapInspector : Box { private MainWindow _win; private DrawArea? _da = null; private GLib.Settings _settings; private Granite.Widgets.ModeButton? _layouts = null; private Box? _theme_box = null; private Button? _balance = null; private Button? _fold_completed = null; private Button? _unfold_all = null; private bool _init = true; public MapInspector( MainWindow win, GLib.Settings settings ) { Object( orientation:Orientation.VERTICAL, spacing:10 ); _win = win; _settings = settings; /* Create the interface */ add_animation_ui(); add_connection_ui(); add_layout_ui(); add_theme_ui(); add_button_ui(); /* Listen for changes to the current tab */ win.canvas_changed.connect( tab_changed ); win.themes.themes_changed.connect( update_themes ); } /* Listen for any changes to the current tab in the main window */ private void tab_changed( DrawArea? da ) { if( _da != null ) { _da.loaded.disconnect( update_theme_layout ); _da.current_changed.disconnect( current_changed ); } if( da != null ) { da.loaded.connect( update_theme_layout ); da.current_changed.connect( current_changed ); } _da = da; _da.animator.enable = _settings.get_boolean( "enable-animations" ); _da.get_connections().hide = _settings.get_boolean( "hide-connections" ); _da.set_theme( _da.get_theme(), false ); update_theme_layout(); } /* Add the animation enable UI */ private void add_animation_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Enable animations" ) ) ); var animate = _settings.get_boolean( "enable-animations" ); lbl.xalign = (float)0; lbl.use_markup = true; var enable = new Switch(); enable.set_active( animate ); enable.button_release_event.connect( animation_changed ); box.pack_start( lbl, false, true, 0 ); box.pack_end( enable, false, true, 0 ); pack_start( box, false, true ); } /* Called whenever the animation switch is changed within the inspector */ private bool animation_changed( Gdk.EventButton e ) { _da.animator.enable = !_da.animator.enable; _settings.set_boolean( "enable-animations", _da.animator.enable ); return( false ); } /* Add the connection show/hide UI */ private void add_connection_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Hide connections" ) ) ); var hide_conn = _settings.get_boolean( "hide-connections" ); lbl.xalign = (float)0; lbl.use_markup = true; var hide_connections = new Switch(); hide_connections.set_active( hide_conn ); hide_connections.button_release_event.connect( hide_connections_changed ); box.pack_start( lbl, false, true, 0 ); box.pack_end( hide_connections, false, true, 0 ); pack_start( box, false, true ); } /* Called whenever the hide connections switch is changed within the inspector */ private bool hide_connections_changed( Gdk.EventButton e ) { _da.get_connections().hide = !_da.get_connections().hide; _settings.set_boolean( "hide-connections", _da.get_connections().hide ); _da.queue_draw(); return( false ); } /* Adds the layout UI */ private void add_layout_ui() { var icons = new Array(); var layouts = new Layouts(); layouts.get_icons( ref icons ); /* Create the modebutton to select the current layout */ var lbl = new Label( Utils.make_title( _( "Node Layouts" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; /* Create the layouts mode button */ _layouts = new Granite.Widgets.ModeButton(); _layouts.has_tooltip = true; for( int i=0; i(); _da.layouts.get_names( ref names ); if( _layouts.selected < names.length ) { var name = names.index( _layouts.selected ); var layout = _da.layouts.get_layout( name ); Node? node = _da.get_current_node(); _da.set_layout( name, ((node == null) ? null : node.get_root()) ); _balance.set_sensitive( layout.balanceable ); } return( false ); } /* Called whenever the tooltip needs to be displayed for the layout selector */ private bool layout_show_tooltip( int x, int y, bool keyboard, Tooltip tooltip ) { if( keyboard ) { return( false ); } var names = new Array(); _da.layouts.get_names( ref names ); int button_width = (int)(_layouts.get_allocated_width() / names.length); if( (x / button_width) < names.length ) { tooltip.set_text( names.index( x / button_width ) ); return( true ); } return( false ); } /* Adds the themes UI */ private void add_theme_ui() { /* Create the UI */ var lbl = new Label( Utils.make_title( _( "Themes" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; var sw = new ScrolledWindow( null, null ); var vp = new Viewport( null, null ); var tb = new Box( Orientation.VERTICAL, 0 ); _theme_box = new Box( Orientation.VERTICAL, 20 ); tb.pack_start( _theme_box, true, true ); vp.set_size_request( 200, 600 ); vp.add( tb ); sw.add( vp ); /* Add the themes to the theme box */ update_themes(); var add = new Button.from_icon_name( "list-add-symbolic", IconSize.LARGE_TOOLBAR ); add.relief = ReliefStyle.NONE; add.set_tooltip_text( _( "Add Custom Theme" ) ); add.clicked.connect( create_custom_theme ); tb.pack_start( add, false, true ); /* Pack the panel */ pack_start( lbl, false, true ); pack_start( sw, true, true ); } /* Adds the bottom button frame */ private void add_button_ui() { var grid = new Grid(); grid.column_homogeneous = true; grid.column_spacing = 5; grid.row_spacing = 5; _balance = new Button.from_icon_name( "minder-balance-symbolic", IconSize.SMALL_TOOLBAR ); _balance.set_tooltip_text( _( "Balance Nodes" ) ); _balance.clicked.connect(() => { _da.balance_nodes(); }); _fold_completed = new Button.from_icon_name( "minder-fold-completed-symbolic", IconSize.SMALL_TOOLBAR ); _fold_completed.set_tooltip_text( _( "Fold Completed Tasks" ) ); _fold_completed.clicked.connect(() => { _da.fold_completed_tasks(); }); _unfold_all = new Button.from_icon_name( "minder-unfold-symbolic", IconSize.SMALL_TOOLBAR ); _unfold_all.set_tooltip_text( _( "Unfold All Nodes" ) ); _unfold_all.clicked.connect(() => { _da.unfold_all_nodes(); }); grid.attach( _balance, 0, 0 ); grid.attach( _fold_completed, 1, 0 ); grid.attach( _unfold_all, 2, 0 ); pack_start( grid, false, true ); } /* Updates the theme box widget with the current list of themes */ private void update_themes() { /* Clear the contents of the theme box */ _theme_box.get_children().foreach((entry) => { _theme_box.remove( entry ); }); if( !_init ) { // return; } /* Get the theme information to display */ var names = new Array(); var icons = new Array(); _win.themes.names( ref names ); _win.themes.icons( ref icons ); /* Add the themes */ for( int i=0; i { var theme = _win.themes.get_theme( name ); select_theme( name ); _da.set_theme( theme, true ); if( theme.custom && (e.type == Gdk.EventType.DOUBLE_BUTTON_PRESS) ) { edit_current_theme(); } return( false ); }); ebox.add( item ); _theme_box.pack_start( ebox, false, true ); } _theme_box.show_all(); /* Make sure that the current theme is selected */ if( _da != null ) { select_theme( _da.get_theme_name() ); } _init = false; } /* Sets the map inspector UI to match the given layout name */ private void select_layout( string name ) { /* Set the layout button to the matching value */ if( name == _( "Manual" ) ) { _layouts.selected = 0; } else if( name == _( "Vertical" ) ) { _layouts.selected = 1; } else if( name == _( "Horizontal" ) ) { _layouts.selected = 2; } else if( name == _( "To left" ) ) { _layouts.selected = 3; } else if( name == _( "To right" ) ) { _layouts.selected = 4; } else if( name == _( "Upwards" ) ) { _layouts.selected = 5; } else if( name == _( "Downwards" ) ) { _layouts.selected = 6; } /* Set the sensitivity of the Balance Nodes button */ _balance.set_sensitive( _da.layouts.get_layout( name ).balanceable ); } /* Returns the label to use for the given theme by name */ private string theme_label( string name ) { var theme = _win.themes.get_theme( name ); if( theme.temporary ) { return( name + " (" + _( "Unsaved" ) + ")" ); } return( name ); } /* Makes sure that only the given theme is selected in the UI */ private void select_theme( string name ) { int index = 0; var names = new Array(); _win.themes.names( ref names ); /* Deselect all themes */ _theme_box.get_children().foreach((entry) => { var e = (EventBox)entry; var b = (Box)e.get_children().nth_data( 0 ); var l = (Label)b.get_children().nth_data( 1 ); e.get_style_context().remove_class( "theme-selected" ); l.set_markup( theme_label( names.index( index ) ) ); index++; }); /* Select the matching theme */ index = 0; _theme_box.get_children().foreach((entry) => { if( names.index( index ) == name ) { var e = (EventBox)entry; var b = (Box)e.get_children().nth_data( 0 ); var l = (Label)b.get_children().nth_data( 1 ); e.get_style_context().add_class( "theme-selected" ); l.set_markup( "%s".printf( theme_label( names.index( index ) ) ) ); } index++; }); } private void update_theme_layout() { /* Make sure the current theme is selected */ select_theme( _da.get_theme_name() ); /* Initialize the button states */ current_changed(); } /* Displays the current theme editor */ private void create_custom_theme() { _win.show_theme_editor( false ); } /* Displays the current theme editor */ private void edit_current_theme() { _win.show_theme_editor( true ); } /* Called whenever the current item is changed */ private void current_changed() { Node? current = _da.get_current_node(); var foldable = _da.completed_tasks_foldable(); var unfoldable = _da.unfoldable(); bool layout_selected = false; /* Select the layout that corresponds with the current tree */ if( current != null ) { if( layout_selected = (current.layout != null) ) { select_layout( current.layout.name ); } } else if( _da.get_nodes().length > 0 ) { if( layout_selected = (_da.get_nodes().index( 0 ).layout != null) ) { select_layout( _da.get_nodes().index( 0 ).layout.name ); } } if( !layout_selected ) { select_layout( _da.layouts.get_default().name ); } /* Update the sensitivity of the buttons */ _fold_completed.set_sensitive( foldable ); _unfold_all.set_sensitive( unfoldable ); } } Minder-1.5.1/src/Node.vala000066400000000000000000001654041356632107200152740ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using GLib; using Gdk; using Cairo; using Gee; /* Enumeration describing the different modes a node can be in */ public enum NodeMode { NONE = 0, // Specifies that this node is not the current node CURRENT, // Specifies that this node is the current node and is not being edited EDITABLE, // Specifies that this node's text has been and currently is actively being edited ATTACHABLE, // Specifies that this node is the currently attachable node (affects display) DROPPABLE // Specifies that this node can receive a dropped item } public enum NodeSide { LEFT = 1, // Specifies that this node is to the left of the root node TOP = 2, // Specifies that this node is above the root node RIGHT = 4, // Specifies that this node is to the right of the root node BOTTOM = 8; // Specifies that this node is below the root node /* Displays the string value of this NodeSide */ public string to_string() { switch( this ) { case LEFT : return( "left" ); case TOP : return( "top" ); case RIGHT : return( "right" ); case BOTTOM : return( "bottom" ); default : assert_not_reached(); } } /* Translates a string from to_string() to a NodeSide value */ public static NodeSide parse( string val ) { switch( val ) { case "left" : return( LEFT ); case "top" : return( TOP ); case "right" : return( RIGHT ); case "bottom" : return( BOTTOM ); default : assert_not_reached(); } } /* Generates the value of the ANY mask value */ public static int any() { return( LEFT + RIGHT + TOP + BOTTOM ); } /* Generates the value of the VERTICAL mask value */ public static int vertical() { return( TOP + BOTTOM ); } /* Generates the value of the HORIZONTAL mask value */ public static int horizontal() { return( LEFT + RIGHT ); } } public struct NodeBounds { double x; double y; double width; double height; } public struct NodeInfo { double posx; double posy; NodeSide side; RGBA color; public NodeInfo( double x, double y, NodeSide s, RGBA c ) { posx = x; posy = y; side = s; color = c; } } public struct NodeLinkInfo { string id_str; Node node; public NodeLinkInfo( string id, Node n ) { id_str = id; node = n; } } public class Node : Object { private static int _next_id = 0; /* Member variables */ private DrawArea _da; protected int _id; private CanvasText _name; private string _note = ""; protected double _width = 0; protected double _height = 0; protected double _ipadx = 6; protected double _ipady = 3; protected double _task_radius = 5; protected double _alpha = 1.0; protected Array _children; private NodeMode _mode = NodeMode.NONE; private int _task_count = 0; private int _task_done = 0; private bool _folded = false; private double _posx = 0; private double _posy = 0; private RGBA _link_color; private double _min_width = 50; private NodeImage? _image = null; private Layout? _layout = null; private Style _style = new Style(); private double _max_width = 200; private bool _loaded = true; private Node _linked_node = null; /* Node signals */ public signal void moved( double diffx, double diffy ); public signal void resized( double diffw, double diffh ); /* Properties */ public DrawArea da { get { return( _da ); } } public CanvasText name { get { return( _name ); } set { _name = value; } } public double posx { get { return( _posx ); } set { double diff = (value - _posx); _posx = value; update_tree_bbox( diff, 0 ); position_name(); if( diff != 0 ) { moved( diff, 0 ); } } } public double posy { get { return( _posy ); } set { double diff = (value - _posy); _posy = value; update_tree_bbox( 0, diff ); position_name(); if( diff != 0 ) { moved( 0, diff ); } } } public string note { get { return( _note ); } set { if( _note != value ) { _note = value; update_size(); } } } public NodeMode mode { get { return( _mode ); } set { if( _mode != value ) { _mode = value; if( _mode == NodeMode.EDITABLE ) { name.edit = true; name.set_cursor_all( false ); } else { name.edit = false; name.clear_selection(); } } } } public Node? parent { get; protected set; default = null; } public NodeSide side { get; set; default = NodeSide.RIGHT; } public bool folded { get { return( _folded ); } set { _folded = value; for( int i=0; i<_children.length; i++ ) { _children.index( i ).folded = value; } } } public double tree_size { get; set; default = 0; } public RGBA link_color { get { return( _link_color ); } set { if( !is_root() ) { _link_color = value; for( int i=0; i<_children.length; i++ ) { _children.index( i ).link_color = value; } } } } public bool attached { get; set; default = false; } public Style style { get { return( _style ); } set { if( _style.copy( value ) ) { name.set_font( _style.node_font ); position_name(); } } } public Layout? layout { get { return( _layout ); } set { _layout = value; for( int i=0; i<_children.length; i++ ) { _children.index( i ).layout = value; } } } public Node? last_selected_child { get; set; default = null; } public Connection? last_selected_connection { get; set; default = null; } public double width { get { return( _width ); } } public double height { get { return( _height ); } } public NodeImage? image { get { return( _image ); } } public double alpha { get { return( _alpha ); } set { _alpha = value; for( int i=0; i<_children.length; i++ ) { _children.index( i ).alpha = value; } } } public Node? linked_node { get { return( _linked_node ); } set { _linked_node = value; update_size(); } } public NodeBounds tree_bbox { get; set; default = NodeBounds(); } /* Default constructor */ public Node( DrawArea da, Layout? layout ) { _da = da; _id = _next_id++; _children = new Array(); _layout = layout; _name = new CanvasText( da, _max_width ); _name.resized.connect( update_size ); } /* Constructor initializing string */ public Node.with_name( DrawArea da, string n, Layout? layout ) { _da = da; _id = _next_id++; _children = new Array(); _layout = layout; _name = new CanvasText.with_text( da, _max_width, n ); _name.resized.connect( update_size ); } /* Copies an existing node to this node */ public Node.copy( DrawArea da, Node n, ImageManager im ) { _da = da; _id = _next_id++; _name = new CanvasText( da, _max_width ); copy_variables( n, im ); _name.resized.connect( update_size ); mode = NodeMode.NONE; _children = n._children; for( int i=0; i<_children.length; i++ ) { _children.index( i ).parent = this; } } /* Copies an existing node tree to this node */ public Node.copy_tree( DrawArea da, Node n, ImageManager im, HashMap id_map ) { _da = da; _id = _next_id++; _name = new CanvasText( da, _max_width ); _children = new Array(); copy_variables( n, im ); _name.resized.connect( update_size ); mode = NodeMode.NONE; tree_size = n.tree_size; id_map.set( n._id, _id ); for( int i=0; i 0) && is_leaf() ); } /* Returns true if this task node is complete */ public bool is_task_done() { return( _task_count == _task_done ); } /* Returns true if this node is a descendant of the given node */ public bool is_descendant_of( Node node ) { Node p = parent; while( (p != null) && (p != node) ) { p = p.parent; } return( p == node ); } /* Returns true if this tree bounds of this node is left of the given bounds */ public bool is_left_of( NodeBounds nb ) { return( (tree_bbox.x + tree_bbox.width) < nb.x ); } /* Returns true if this tree bounds of this node is right of the given bounds */ public bool is_right_of( NodeBounds nb ) { return( tree_bbox.x > (nb.x + nb.width) ); } /* Returns true if this tree bounds of this node is above the given bounds */ public bool is_above( NodeBounds nb ) { return( (tree_bbox.y + tree_bbox.height) < nb.y ); } /* Returns true if this tree bounds of this node is below the given bounds */ public bool is_below( NodeBounds nb ) { return( tree_bbox.y > (nb.y + nb.height) ); } /* Returns the maximum width allowed for this node */ public int max_width() { return( (int)_max_width ); } /* Returns the task completion percentage value */ public double task_completion_percentage() { return( (_task_done / (_task_count * 1.0)) * 100 ); } /* Returns true if the resizer should be in the upper left */ private bool resizer_on_left() { return( !is_root() && (side == NodeSide.LEFT) ); } /* Returns true if the given cursor coordinates lies within this node */ public virtual bool is_within( double x, double y ) { double margin = style.node_margin ?? 0; double cx, cy, cw, ch; bbox( out cx, out cy, out cw, out ch ); cx += margin; cy += margin; cw -= margin * 2; ch -= margin * 2; return( Utils.is_within_bounds( x, y, cx, cy, cw, ch ) ); } /* Returns the positional information for where the task item is located (if it exists) */ protected virtual void task_bbox( out double x, out double y, out double w, out double h ) { int margin = style.node_margin ?? 0; int padding = style.node_padding ?? 0; double img_height = (_image == null) ? 0 : (_image.height + padding); x = posx + margin + padding; y = posy + margin + padding + img_height + (((_height - (img_height + (padding * 2) + (margin * 2))) / 2) - _task_radius); w = _task_radius * 2; h = _task_radius * 2; } protected virtual void linked_node_bbox( out double x, out double y, out double w, out double h ) { int margin = style.node_margin ?? 0; int padding = style.node_padding ?? 0; double img_height = (_image == null) ? 0 : (_image.height + padding); x = posx + (_width - (linked_node_width() + padding + margin)) + _ipadx; y = posy + padding + margin + img_height + ((_height - (img_height + (padding * 2) + (margin * 2))) / 2) - 5; w = 11; h = 11; } /* Returns the positional information for where the note item is located (if it exists) */ protected virtual void note_bbox( out double x, out double y, out double w, out double h ) { int margin = style.node_margin ?? 0; int padding = style.node_padding ?? 0; double img_height = (_image == null) ? 0 : (_image.height + padding); x = posx + (_width - (note_width() + linked_node_width() + padding + margin)) + _ipadx; y = posy + padding + margin + img_height + ((_height - (img_height + (padding * 2) + (margin * 2))) / 2) - 5; w = 11; h = 11; } /* Returns the positional information of the stored image (if no image exists, the behavior of this method is undefined) */ protected virtual void image_bbox( out double x, out double y, out double w, out double h ) { int margin = style.node_margin ?? 0; int padding = style.node_padding ?? 0; x = posx + padding + margin; y = posy + padding + margin; w = (_image == null) ? 0 : _image.width; h = (_image == null) ? 0 : _image.height; } /* Returns the positional information for where the resizer box is located (if it exists) */ protected virtual void resizer_bbox( out double x, out double y, out double w, out double h ) { int margin = style.node_margin ?? 0; x = resizer_on_left() ? (posx + margin) : (posx + _width - margin - 8); y = posy + margin; w = 8; h = 8; } /* Returns true if the given cursor coordinates lies within the task checkbutton area. */ public virtual bool is_within_task( double x, double y ) { if( _task_count > 0 ) { double tx, ty, tw, th; task_bbox( out tx, out ty, out tw, out th ); return( Utils.is_within_bounds( x, y, tx, ty, tw, th ) ); } else { return( false ); } } /* Returns true if the given cursor coordinates lies within the note icon area. */ public virtual bool is_within_note( double x, double y ) { if( note.length > 0 ) { double nx, ny, nw, nh; note_bbox( out nx, out ny, out nw, out nh ); return( Utils.is_within_bounds( x, y, nx, ny, nw, nh ) ); } else { return( false ); } } public virtual bool is_within_linked_node( double x, double y ) { if( linked_node != null ) { double lx, ly, lw, lh; linked_node_bbox( out lx, out ly, out lw, out lh ); return( Utils.is_within_bounds( x, y, lx, ly, lw, lh ) ); } else { return( false ); } } /* Returns true if the given cursor coordinates lie within the fold indicator area */ public virtual bool is_within_fold( double x, double y ) { if( folded && (_children.length > 0) ) { double fx, fy, fw, fh; fold_bbox( out fx, out fy, out fw, out fh ); return( Utils.is_within_bounds( x, y, fx, fy, fw, fh ) ); } else { return( false ); } } /* Returns true if the given cursor coordinates lie within the image area */ public virtual bool is_within_image( double x, double y ) { if( _image != null ) { double ix, iy, iw, ih; image_bbox( out ix, out iy, out iw, out ih ); return( Utils.is_within_bounds( x, y, ix, iy, iw, ih ) ); } else { return( false ); } } /* Returns true if the given cursor coordinates lie within the resizer area */ public virtual bool is_within_resizer( double x, double y ) { if( mode == NodeMode.CURRENT ) { double rx, ry, rw, rh; resizer_bbox( out rx, out ry, out rw, out rh ); return( Utils.is_within_bounds( x, y, rx, ry, rw, rh ) ); } return( false ); } /* Finds the node which contains the given pixel coordinates */ public virtual Node? contains( double x, double y, Node? n ) { if( (this != n) && (is_within( x, y ) || is_within_fold( x, y )) ) { return( this ); } else { for( int i=0; i<_children.length; i++ ) { Node tmp = _children.index( i ).contains( x, y, n ); if( tmp != null ) { return( tmp ); } } return( null ); } } /* Returns true if this node contains the given node */ public virtual bool contains_node( Node node ) { if( node == this ) { return( true ); } else { for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).contains_node( node ) ) { return( true ); } } return( false ); } } /* Returns the children nodes of this node */ public Array children() { return( _children ); } /* Returns the root node for this node */ public Node get_root() { Node n = this; Node p = parent; while( p != null ) { n = p; p = p.parent; } return( n ); } /* Returns the child index of this node within its parent */ public virtual int index() { if( !is_root() ) { for( int i=0; ichildren != null) && (n->children->type == Xml.ElementType.TEXT_NODE) ) { name.text = n->children->get_content(); } } /* Loads the note value from the given XML node */ private void load_note( Xml.Node* n ) { if( (n->children != null) && (n->children->type == Xml.ElementType.TEXT_NODE) ) { note = n->children->get_content(); } } /* Loads the image information from the given XML node */ private void load_image( ImageManager im, Xml.Node* n ) { _image = new NodeImage.from_xml( im, n, (int)_max_width ); if( !_image.valid ) { _image = null; update_size(); } } /* Loads the style information from the given XML node */ private void load_style( Xml.Node* n ) { _style.load_node( n ); _name.set_font( _style.node_font ); } /* Loads the file contents into this instance */ public virtual void load( DrawArea da, Xml.Node* n, bool isroot, HashMap id_map, Array link_ids ) { _loaded = false; string? i = n->get_prop( "id" ); if( i != null ) { _id = _next_id++; id_map.set( int.parse( i ), _id ); } string? x = n->get_prop( "posx" ); if( x != null ) { posx = double.parse( x ); } string? y = n->get_prop( "posy" ); if( y != null ) { posy = double.parse( y ); } string? mw = n->get_prop( "maxwidth" ); if( mw != null ) { _max_width = double.parse( mw ); _name.resize( _max_width - 200 ); } string? w = n->get_prop( "width" ); if( w != null ) { _width = double.parse( w ); } string? h = n->get_prop( "height" ); if( h != null ) { _height = double.parse( h ); } string? tc = n->get_prop( "task" ); if( tc != null ) { _task_count = 1; _task_done = int.parse( tc ); } string? ln = n->get_prop( "link" ); if( ln != null ) { link_ids.append_val( NodeLinkInfo( ln, this ) ); } string? s = n->get_prop( "side" ); if( s != null ) { side = NodeSide.parse( s ); } string? f = n->get_prop( "fold" ); if( f != null ) { _folded = bool.parse( f ); } string? ts = n->get_prop( "treesize" ); if( ts != null ) { tree_size = double.parse( ts ); } string? c = n->get_prop( "color" ); if( c != null ) { _link_color.parse( c ); } /* Make sure the style has a default value */ style.copy( StyleInspector.styles.get_style_for_level( (isroot ? 0 : 1), null ) ); for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "nodename" : load_name( it ); break; case "nodenote" : load_note( it ); break; case "nodeimage" : load_image( da.image_manager, it ); break; case "style" : load_style( it ); break; case "nodes" : for( Xml.Node* it2 = it->children; it2 != null; it2 = it2->next ) { if( (it2->type == Xml.ElementType.ELEMENT_NODE) && (it2->name == "node") ) { var child = new Node( da, _layout ); child.load( da, it2, false, id_map, link_ids ); child.attach( this, -1, null ); } } break; } } } /* Apply the stored layout */ string? l = n->get_prop( "layout" ); if( l != null ) { layout = da.layouts.get_layout( l ); } /* Get the tree bbox */ tree_bbox = layout.bbox( this, -1 ); if( ts == null ) { tree_size = ((side & NodeSide.horizontal()) != 0) ? tree_bbox.height : tree_bbox.width; } /* Make sure that the name is positioned properly */ position_name(); _loaded = true; } /* Saves the current node */ public virtual void save( Xml.Node* parent ) { parent->add_child( save_node() ); } /* Saves the node contents to the given data output stream */ protected Xml.Node* save_node() { Xml.Node* node = new Xml.Node( null, "node" ); node->new_prop( "id", _id.to_string() ); node->new_prop( "posx", posx.to_string() ); node->new_prop( "posy", posy.to_string() ); node->new_prop( "maxwidth", _max_width.to_string() ); node->new_prop( "width", _width.to_string() ); node->new_prop( "height", _height.to_string() ); if( (_task_count > 0) && is_leaf() ) { node->new_prop( "task", _task_done.to_string() ); } if( _linked_node != null ) { node->new_prop( "link", _linked_node.id().to_string() ); } node->new_prop( "side", side.to_string() ); node->new_prop( "fold", _folded.to_string() ); node->new_prop( "treesize", tree_size.to_string() ); if( !is_root() ) { node->new_prop( "color", Utils.color_from_rgba( _link_color ) ); } node->new_prop( "layout", _layout.name ); if( _image != null ) { _image.save( node ); } style.save_node( node ); node->new_text_child( null, "nodename", name.text ); node->new_text_child( null, "nodenote", note ); if( _children.length > 0 ) { Xml.Node* nodes = new Xml.Node( null, "nodes" ); for( int i=0; i<_children.length; i++ ) { _children.index( i ).save( nodes ); } node->add_child( nodes ); } return( node ); } /* Main method for importing an OPML into a node */ public void import_opml( DrawArea da, Xml.Node* parent, int node_id, ref Array? expand_state, Theme theme ) { /* Get the node name */ string? n = parent->get_prop( "text" ); if( n != null ) { name.text = n; } /* Get the task information */ string? t = parent->get_prop( "checked" ); if( t != null ) { _task_count = 1; _task_done = bool.parse( t ) ? 1 : 0; propagate_task_info_up( _task_count, _task_done ); } /* Get the note information */ string? o = parent->get_prop( "node" ); if( o != null ) { note = o; } /* Load the style */ style.copy( StyleInspector.styles.get_global_style() ); /* Figure out if this node is folded */ if( expand_state != null ) { _folded = true; for( int i=0; ichildren; it2 != null; it2 = it2->next ) { if( (it2->type == Xml.ElementType.ELEMENT_NODE) && (it2->name == "outline") ) { var child = new Node( da, layout ); child.import_opml( da, it2, node_id, ref expand_state, theme ); child.attach( this, -1, theme ); } } } /* Main method to export a node tree as OPML */ public void export_opml( Xml.Node* parent, ref int node_id, ref Array expand_state ) { parent->add_child( export_opml_node( ref node_id, ref expand_state ) ); } /* Traverses the node tree exporting XML nodes in OPML format */ private Xml.Node* export_opml_node( ref int node_id, ref Array expand_state ) { Xml.Node* node = new Xml.Node( null, "outline" ); node->new_prop( "text", name.text ); if( is_leaf() && (_task_count > 0) ) { bool checked = _task_done > 0; node->new_prop( "checked", checked.to_string() ); } if( note != "" ) { node->new_prop( "note", note ); } if( (_children.length > 1) && !folded ) { expand_state.append_val( node_id ); } node_id++; for( int i=0; i<_children.length; i++ ) { node->add_child( _children.index( i ).export_opml_node( ref node_id, ref expand_state ) ); } return( node ); } /* Resizes the node width by the given amount */ public virtual void resize( double diff ) { diff = resizer_on_left() ? (0 - diff) : diff; if( _image == null ) { if( (diff < 0) ? ((_max_width + diff) <= _min_width) : !_name.is_wrapped() ) return; _max_width += diff; } else { if( (_max_width + diff) < _min_width ) return; _max_width += diff; _image.set_width( (int)_max_width ); } _name.resize( diff ); } /* Returns the bounding box for this node */ public virtual void bbox( out double x, out double y, out double w, out double h ) { if( is_root() || ((side & NodeSide.vertical()) != 0) ) { x = posx; y = posy; w = _width; h = _height; } else { x = posx; y = posy; w = _width; h = _height; } } /* Returns the bounding box for the fold indicator for this node */ private void fold_bbox( out double x, out double y, out double w, out double h ) { double bw, bh; bbox( out x, out y, out bw, out bh ); w = 16; h = 10; switch( side ) { case NodeSide.RIGHT : x += bw + style.node_padding; y += (bh / 2) - 5; break; case NodeSide.LEFT : x -= style.node_padding + w; y += (bh / 2) - 5; break; case NodeSide.TOP : x += (bw / 2) - 8; y -= style.node_padding + bh; break; case NodeSide.BOTTOM : x += (bw / 2) - 8; y += bh + style.node_padding; break; } } /* Sets the fold for this node to the given value. Appends this node to the changed list if the folded value changed. */ public void set_fold( bool value, ref Array changed ) { if( _folded != value ) { changed.append_val( this ); folded = value; } else if( !_folded ) { for( int i=0; i<_children.length; i++ ) { _children.index( i ).set_fold( value, ref changed ); } } } /* Returns true if there is at least one node that is foldable due to its tasks being completed. */ public bool completed_tasks_foldable() { if( !_folded && (_task_count > 0) ) { if( _task_count == _task_done ) { for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).is_leaf() && (_children.index( i )._task_done == 1) ) { return( true ); } } } for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).completed_tasks_foldable() ) { return( true ); } } } return( false ); } /* Returns true if any node is found to be unfoldable */ public bool unfoldable() { if( _folded ) { return( true ); } else { for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).unfoldable() ) { return( true ); } } } return( false ); } /* Recursively spans node tree folding any nodes which contain fully completed tasks */ public void fold_completed_tasks( ref Array changed ) { if( !_folded && (_task_count > 0) ) { if( _task_count == _task_done ) { for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).is_leaf() && (_children.index( i )._task_done == 1) ) { set_fold( true, ref changed ); return; } } } for( int i=0; i<_children.length; i++ ) { _children.index( i ).fold_completed_tasks( ref changed ); } } } /* Returns the amount of internal width to draw the task checkbutton */ public double task_width() { return( (_task_count > 0) ? ((_task_radius * 2) + _ipadx) : 0 ); } /* Returns the width of the note indicator */ public double note_width() { return( (note.length > 0) ? (10 + _ipadx) : 0 ); } /* Returns the width of the linked node indicator */ public double linked_node_width() { return( (linked_node != null) ? (10 + _ipadx) : 0 ); } /* Moves this node into the proper position within the parent node */ public void move_to_position( Node child, NodeSide side, double x, double y ) { int idx = child.index(); Node? last_selected = last_selected_child; for( int i=0; i<_children.length; i++ ) { if( _children.index( i ).side == child.side ) { switch( child.side ) { case NodeSide.LEFT : case NodeSide.RIGHT : if( y < _children.index( i ).posy ) { child.detach( side ); child.attached = true; child.attach( this, (i - ((idx < i) ? 1 : 0)), null, false ); last_selected_child = last_selected; return; } break; case NodeSide.TOP : case NodeSide.BOTTOM : if( x < _children.index( i ).posx ) { child.detach( side ); child.attached = true; child.attach( this, (i - ((idx < i) ? 1 : 0)), null, false ); last_selected_child = last_selected; return; } break; } } else if( _children.index( i ).side > child.side ) { child.detach( side ); child.attached = true; child.attach( this, (i - ((idx < i) ? 1 : 0)), null, false ); last_selected_child = last_selected; return; } } child.detach( side ); child.attached = true; child.attach( this, -1, null, false ); last_selected_child = last_selected; } /* Adjusts the position of the text object */ private void position_name() { int margin = (style.node_margin == null) ? 0 : style.node_margin; int padding = (style.node_padding == null) ? 0 : style.node_padding; double img_height = (_image != null) ? (_image.height + padding) : 0; name.posx = posx + margin + padding + task_width(); name.posy = posy + margin + padding + img_height; } /* If the parent node is moved, we will move ourselves the same amount */ private void parent_moved( Node parent, double diffx, double diffy ) { _posx += diffx; _posy += diffy; update_tree_bbox( diffx, diffy ); position_name(); moved( diffx, diffy ); } /* Detaches this node from its parent node */ public virtual void detach( NodeSide side ) { if( parent != null ) { int idx = index(); propagate_task_info_up( (0 - _task_count), (0 - _task_done) ); parent.children().remove_index( idx ); parent.moved.disconnect( this.parent_moved ); if( parent.last_selected_child == this ) { parent.last_selected_child = null; } if( layout != null ) { layout.handle_update_by_delete( parent, idx, side, tree_size ); } parent = null; attached = false; } } /* Removes this node from the node tree along with all descendents */ public virtual void delete() { detach( side ); } /* Attaches this node as a child of the given node */ public virtual void attach( Node parent, int index, Theme? theme, bool set_side = true ) { this.parent = parent; layout = parent.layout; if( layout != null ) { if( set_side ) { if( parent.is_root() ) { if( parent.children().length == 0 ) { side = layout.side_mapping( side ); } else { side = parent.children().index( parent.children().length - 1 ).side; } } else { side = parent.side; } layout.propagate_side( this, side ); } layout.initialize( this ); } attach_common( index, theme ); } public virtual void attach_init( Node parent, int index ) { this.parent = parent; layout = parent.layout; attach_common( index, null ); } protected virtual void attach_common( int index, Theme? theme ) { if( (parent._children.length == 0) && (parent._task_count == 1) ) { parent.propagate_task_info_up( (0 - parent._task_count), (0 - parent._task_done) ); parent._task_count = 0; parent._task_done = 0; _task_count = 1; _task_done = 0; } if( index == -1 ) { index = (int)this.parent.children().length; parent.children().append_val( this ); } else { parent.children().insert_val( index, this ); } propagate_task_info_up( _task_count, _task_done ); parent.moved.connect( this.parent_moved ); if( layout != null ) { layout.handle_update_by_insert( parent, this, index ); } if( theme != null ) { link_color = main_branch() ? theme.next_color() : parent.link_color; } attached = true; } /* Returns a reference to the first child of this node */ public virtual Node? first_child( NodeSide? side = null ) { if( !folded ) { for( int i=0; i<(int)_children.length; i++ ) { if( (side == null) || (_children.index( i ).side == side) ) { return( _children.index( i ) ); } } } return( null ); } /* Returns a reference to the last child of this node */ public virtual Node? last_child( NodeSide? side = null ) { if( !folded ) { for( int i=((int)_children.length - 1); i>=0; i-- ) { if( (side == null) || (_children.index( i ).side == side) ) { return( _children.index( i ) ); } } } return( null ); } /* Returns a reference to the next child after the specified child of this node */ public virtual Node? next_child( Node n ) { int idx = n.index(); if( (idx != -1) && ((idx + 1) < _children.length) ) { return( _children.index( idx + 1 ) ); } return( null ); } /* Returns a reference to the next child after the specified child of this node */ public virtual Node? prev_child( Node n ) { int idx = n.index(); if( (idx != -1) && (idx > 0) ) { return( _children.index( idx - 1 ) ); } return( null ); } /* Propagates task information toward the leaf nodes */ private void propagate_task_info_down( bool? enable, bool? done ) { if( is_leaf() ) { if( enable != null ) { _task_count = enable ? 1 : 0; } if( _task_count == 1 ) { if( done == null ) { _task_done = ((_task_count == 0) || (_task_done == 0)) ? 0 : 1; } else { _task_done = done ? 1 : 0; } } else { _task_done = 0; } } else { _task_count = 0; _task_done = 0; for( int i=0; i 0 ); } /* Returns true if this node's task indicator indicates that it is currently done */ public bool task_done() { return( _task_count == _task_done ); } /* Sets the task enable to the given value */ public void enable_task( bool task ) { propagate_task_info( task, null ); } /* Sets the task done indicator to the given value (0 or 1) and propagates the change to all parent nodes. */ public void set_task_done( bool done ) { propagate_task_info( null, done ); } /* Toggles the current value of task done and propagates the change to all parent nodes. */ public void toggle_task_done() { set_task_done( _task_done == 0 ); } /* Set all ancestor nodes fold indicators to false. Returns the last node that is last node that is folded. */ public Node reveal() { var tmp = parent; while( tmp != null ) { if( !tmp._folded ) { return( tmp ); } tmp._folded = false; layout.handle_update_by_fold( tmp ); tmp = tmp.parent; } return( tmp ); } /* Populates the given ListStore with all nodes that have names that match the given string pattern. */ public void get_match_items( string pattern, bool[] search_opts, ref Gtk.ListStore matches ) { if( ((((_task_count == 0) || !is_leaf()) && search_opts[7]) || ((_task_count != 0) && is_leaf() && search_opts[6])) && (((parent != null) && parent.folded && search_opts[4]) || (((parent == null) || !parent.folded) && search_opts[5])) ) { if( search_opts[2] ) { Utils.match_string( pattern, name.text, "%s:".printf( _( "Node Title" ) ), this, null, ref matches ); } if( search_opts[3] ) { Utils.match_string( pattern, note, "%s:".printf( _( "Node Note" ) ), this, null, ref matches ); } } for( int i=0; i<_children.length; i++ ) { _children.index( i ).get_match_items( pattern, search_opts, ref matches ); } } /* Adjusts the posx and posy values */ public virtual void pan( double diffx, double diffy ) { _posx += diffx; _posy += diffy; update_tree_bbox( diffx, diffy ); position_name(); moved( diffx, diffy ); } /* Called when the theme is changed by the user. Looks up this node's link color in the old theme to see if it is a themed color. If it is, map it to the new theme's color palette. If the current color is not a theme link color, keep the current color as it was custom set by the user. Performs this mapping recursively for all descendants. */ public void map_theme_colors( Theme old_theme, Theme new_theme ) { int old_index = old_theme.get_color_index( _link_color ); if( old_index != -1 ) { _link_color = new_theme.link_color( old_index ); } for( int i=0; i<_children.length; i++ ) { _children.index( i ).map_theme_colors( old_theme, new_theme ); } } /* Gathers the information from all stored nodes for positional and link color information. This information is used by the undo/redo functions. */ public void get_node_info( ref Array info ) { info.append_val( NodeInfo( _posx, _posy, side, _link_color ) ); for( int i=0; i<_children.length; i++ ) { _children.index( i ).get_node_info( ref info ); } } /* Restores the give information in the node info array to the node and subnodes. */ public void set_node_info( Array info, ref int index ) { var diffx = info.index( index ).posx - _posx; var diffy = info.index( index ).posy - _posy; _posx = info.index( index ).posx; _posy = info.index( index ).posy; side = info.index( index ).side; _link_color = info.index( index ).color; update_tree_bbox( diffx, diffy ); position_name(); for( int i=0; i<_children.length; i++ ) { index++; _children.index( i ).set_node_info( info, ref index ); } } /* Returns the link point for this node */ protected virtual void link_point( out double x, out double y ) { if( is_root() ) { x = posx + (_width / 2); y = posy + (_height / 2); } else { int margin = style.node_margin ?? 0; double height = (style.node_border.name() == "underlined") ? (_height - margin) : (_height / 2); switch( side ) { case NodeSide.LEFT : x = posx + margin; y = posy + height; break; case NodeSide.TOP : x = posx + (_width / 2); y = posy + margin; break; case NodeSide.RIGHT : x = posx + _width - margin; y = posy + height; break; default : x = posx + (_width / 2); y = posy + _height - margin; break; } } } /* Draws the border around the node */ protected void draw_shape( Context ctx, Theme theme, RGBA border_color ) { double x = posx + style.node_margin; double y = posy + style.node_margin; double w = _width - (style.node_margin * 2); double h = _height - (style.node_margin * 2); /* Set the fill color */ if( mode == NodeMode.CURRENT ) { Utils.set_context_color_with_alpha( ctx, theme.get_color( "nodesel_background" ), _alpha ); } else if( is_root() || style.is_fillable() ) { Utils.set_context_color_with_alpha( ctx, border_color, _alpha ); } else { Utils.set_context_color_with_alpha( ctx, theme.get_color( "background" ), _alpha ); } /* Draw the fill */ style.draw_node_fill( ctx, x, y, w, h, side ); if( !is_root() || style.is_fillable() ) { /* Draw the border */ Utils.set_context_color_with_alpha( ctx, border_color, _alpha ); ctx.set_line_width( style.node_borderwidth ); /* If we are in a vertical orientation and the border type is underlined, draw nothing */ style.draw_node_border( ctx, x, y, w, h, side ); } } /* Draws the node image above the note */ protected virtual void draw_image( Cairo.Context ctx, Theme theme ) { if( _image != null ) { double x, y, w, h; image_bbox( out x, out y, out w, out h ); _image.draw( ctx, x, y, _alpha ); } } /* Draws the node font to the screen */ protected virtual void draw_name( Cairo.Context ctx, Theme theme ) { int hmargin = 3; int vmargin = 3; /* Draw the selection box around the text if the node is in the 'selected' state */ if( mode == NodeMode.CURRENT ) { Utils.set_context_color_with_alpha( ctx, theme.get_color( "nodesel_background" ), _alpha ); ctx.rectangle( ((posx + style.node_padding + style.node_margin) - hmargin), ((posy + style.node_padding + style.node_margin) - vmargin), ((_width - (style.node_padding * 2) - (style.node_margin * 2)) + (hmargin * 2)), ((_height - (style.node_padding * 2) - (style.node_margin * 2)) + (vmargin * 2)) ); ctx.fill(); } /* Draw the text */ if( mode == NodeMode.CURRENT ) { name.draw( ctx, theme, theme.get_color( "nodesel_foreground" ), _alpha ); } else if( parent == null ) { name.draw( ctx, theme, theme.get_color( "root_foreground" ), _alpha ); } else if( style.is_fillable() ) { name.draw( ctx, theme, theme.get_color( "background" ), _alpha ); } else { name.draw( ctx, theme, theme.get_color( "foreground" ), _alpha ); } } /* Draws the task checkbutton for leaf nodes */ protected virtual void draw_leaf_task( Context ctx, RGBA color ) { if( _task_count > 0 ) { double x, y, w, h; task_bbox( out x, out y, out w, out h ); Utils.set_context_color_with_alpha( ctx, color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.arc( (x + _task_radius), (y + _task_radius), _task_radius, 0, (2 * Math.PI) ); if( _task_done == 0 ) { ctx.stroke(); } else { ctx.fill(); } } } /* Draws the task checkbutton for non-leaf nodes */ protected virtual void draw_acc_task( Context ctx, RGBA color ) { if( _task_count > 0 ) { double x, y, w, h; double complete = _task_done / (_task_count * 1.0); double angle = ((complete * 360) + 270) * (Math.PI / 180.0); task_bbox( out x, out y, out w, out h ); x += _task_radius; y += _task_radius; /* Draw circle outline */ if( complete < 1 ) { Utils.set_context_color_with_alpha( ctx, color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.arc( x, y, _task_radius, 0, (2 * Math.PI) ); ctx.stroke(); } /* Draw completeness pie */ if( _task_done > 0 ) { Utils.set_context_color_with_alpha( ctx, color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.arc( x, y, _task_radius, (1.5 * Math.PI), angle ); ctx.line_to( x, y ); ctx.arc( x, y, _task_radius, (1.5 * Math.PI), (1.5 * Math.PI) ); ctx.line_to( x, y ); ctx.fill(); } } } /* Draws the icon indicating that a note is associated with this node */ protected virtual void draw_common_note( Context ctx, RGBA reg_color, RGBA sel_color, RGBA bg_color ) { if( note.length > 0 ) { double x, y, w, h; RGBA color = (mode == NodeMode.CURRENT) ? sel_color : style.is_fillable() ? bg_color : reg_color; note_bbox( out x, out y, out w, out h ); Utils.set_context_color_with_alpha( ctx, color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.move_to( (x + 2), y ); ctx.line_to( (x + 10), y ); ctx.stroke(); ctx.move_to( x, (y + 3) ); ctx.line_to( (x + 10), (y + 3) ); ctx.stroke(); ctx.move_to( x, (y + 6) ); ctx.line_to( (x + 10), (y + 6) ); ctx.stroke(); ctx.move_to( x, (y + 9) ); ctx.line_to( (x + 10), (y + 9) ); ctx.stroke(); } } protected virtual void draw_link_node( Context ctx, RGBA reg_color, RGBA sel_color, RGBA bg_color ) { if( linked_node != null ) { double x, y, w, h; RGBA color = (mode == NodeMode.CURRENT) ? sel_color : style.is_fillable() ? bg_color : reg_color; linked_node_bbox( out x, out y, out w, out h ); Utils.set_context_color_with_alpha( ctx, color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.move_to( x, (y + 3) ); ctx.line_to( (x + 5), (y + 3) ); ctx.line_to( (x + 5), (y + 1) ); ctx.line_to( (x + 6), (y + 1) ); ctx.line_to( (x + 10), (y + 4) ); ctx.line_to( (x + 10), (y + 5) ); ctx.line_to( (x + 6), (y + 8) ); ctx.line_to( (x + 5), (y + 8) ); ctx.line_to( (x + 5), (y + 6) ); ctx.line_to( x, (y + 6) ); ctx.close_path(); ctx.fill(); } } /* Draw the fold indicator */ protected virtual void draw_common_fold( Context ctx, RGBA bg_color, RGBA fg_color ) { if( folded && (_children.length > 0) ) { double fx, fy, fw, fh; fold_bbox( out fx, out fy, out fw, out fh ); /* Draw the fold rectangle */ Utils.set_context_color_with_alpha( ctx, bg_color, _alpha ); ctx.new_path(); ctx.set_line_width( 1 ); ctx.rectangle( fx, fy, fw, fh ); ctx.fill(); /* Draw circles */ Utils.set_context_color_with_alpha( ctx, fg_color, _alpha ); ctx.new_path(); ctx.arc( (fx + 5), (fy + 5), 2, 0, (2 * Math.PI) ); ctx.fill(); ctx.new_path(); ctx.arc( (fx + 10), (fy + 5), 2, 0, (2 * Math.PI) ); ctx.fill(); } } /* Draws the attachable highlight border to indicate when a node is attachable */ protected virtual void draw_attachable( Context ctx, Theme theme, RGBA? frost_background ) { if( (mode == NodeMode.ATTACHABLE) || (mode == NodeMode.DROPPABLE) ) { double x, y, w, h; bbox( out x, out y, out w, out h ); /* Draw highlight border */ Utils.set_context_color_with_alpha( ctx, theme.get_color( "attachable" ), _alpha ); ctx.set_line_width( 4 ); ctx.rectangle( x, y, w, h ); ctx.stroke(); } } /* Draw the link from this node to the parent node */ protected virtual void draw_link( Context ctx, Theme theme ) { double parent_x; double parent_y; double height = (style.node_border.name() == "underlined") ? (_height - style.node_margin) : (_height / 2); double tailx = 0, taily = 0, tipx = 0, tipy = 0; double child_x = 0; double child_y = 0; /* Get the parent's link point */ parent.link_point( out parent_x, out parent_y ); Utils.set_context_color_with_alpha( ctx, _link_color, ((_parent.alpha != 1.0) ? _parent.alpha : _alpha) ); ctx.set_line_cap( LineCap.ROUND ); switch( side ) { case NodeSide.LEFT : child_x = (posx + _width - style.node_margin); child_y = (posy + height); break; case NodeSide.RIGHT : child_x = (posx + style.node_margin); child_y = (posy + height); break; case NodeSide.TOP : child_x = (posx + (_width / 2)); child_y = (posy + _height - style.node_margin); break; case NodeSide.BOTTOM : child_x = (posx + (_width / 2)); child_y = (posy + style.node_margin); break; } style.draw_link( ctx, parent.style, this, parent_x, parent_y, child_x, child_y, out tailx, out taily, out tipx, out tipy ); /* Draw the arrow */ if( style.link_arrow ) { draw_link_arrow( ctx, theme, tailx, taily, tipx, tipy ); } } /* Draws arrow point to the "to" node */ protected virtual void draw_link_arrow( Context ctx, Theme theme, double tailx, double taily, double tipx, double tipy ) { double extlen[7] = {12, 12, 13, 14, 15, 16, 16}; var arrowLength = extlen[style.link_width - 2]; // can be adjusted var dx = tipx - tailx; var dy = tipy - taily; var theta = Math.atan2( dy, dx ); var rad = 35 * (Math.PI / 180); // 35 angle, can be adjusted var x1 = tipx - arrowLength * Math.cos( theta + rad ); var y1 = tipy - arrowLength * Math.sin( theta + rad ); var phi2 = -35 * (Math.PI / 180); // -35 angle, can be adjusted var x2 = tipx - arrowLength * Math.cos( theta + phi2 ); var y2 = tipy - arrowLength * Math.sin( theta + phi2 ); /* Draw the arrow */ Utils.set_context_color_with_alpha( ctx, _link_color, _alpha ); ctx.set_line_width( 1 ); ctx.move_to( tipx, tipy ); ctx.line_to( x1, y1 ); ctx.line_to( x2, y2 ); ctx.close_path(); ctx.fill_preserve(); Utils.set_context_color_with_alpha( ctx, theme.get_color( "background" ), _alpha ); ctx.set_line_width( 2 ); ctx.stroke(); } /* Draw the node resizer area */ protected virtual void draw_resizer( Context ctx, Theme theme ) { /* Only draw the resizer if we are selected */ if( mode != NodeMode.CURRENT ) { return; } double x, y, w, h; resizer_bbox( out x, out y, out w, out h ); Utils.set_context_color( ctx, theme.get_color( "background" ) ); ctx.set_line_width( 1 ); ctx.rectangle( x, y, w, h ); ctx.fill_preserve(); Utils.set_context_color_with_alpha( ctx, theme.get_color( "foreground" ), _alpha ); ctx.stroke(); } /* Draws the node on the screen */ public virtual void draw( Context ctx, Theme theme, bool motion ) { var nodesel_foreground = theme.get_color( "nodesel_foreground" ); /* If this is a root node, draw specifically for a root node */ if( is_root() ) { var background = theme.get_color( "root_background" ); var foreground = theme.get_color( "root_foreground" ); draw_shape( ctx, theme, background ); draw_name( ctx, theme ); draw_image( ctx, theme ); if( is_leaf() ) { draw_leaf_task( ctx, foreground ); } else { draw_acc_task( ctx, foreground ); } draw_common_note( ctx, foreground, nodesel_foreground, foreground ); draw_link_node( ctx, foreground, nodesel_foreground, foreground ); draw_common_fold( ctx, background, foreground ); draw_attachable( ctx, theme, background ); draw_resizer( ctx, theme ); /* Otherwise, draw the node as a non-root node */ } else { var background = theme.get_color( "background" ); var foreground = theme.get_color( "foreground" ); draw_shape( ctx, theme, _link_color ); draw_name( ctx, theme ); draw_image( ctx, theme ); if( is_leaf() ) { draw_leaf_task( ctx, (style.is_fillable() ? background : _link_color) ); } else { draw_acc_task( ctx, (style.is_fillable() ? background : _link_color) ); } draw_common_note( ctx, foreground, nodesel_foreground, background ); draw_link_node( ctx, foreground, nodesel_foreground, foreground ); draw_common_fold( ctx, _link_color, background ); draw_attachable( ctx, theme, background ); draw_resizer( ctx, theme ); } } /* Draw this node and all child nodes */ public void draw_all( Context ctx, Theme theme, Node? current, bool draw_current, bool motion ) { if( !is_root() && !draw_current ) { draw_link( ctx, theme ); } if( this != current ) { if( !folded ) { for( int i=0; i<_children.length; i++ ) { _children.index( i ).draw_all( ctx, theme, current, false, motion ); } } draw( ctx, theme, motion ); } } /* Outputs the node's information to standard output */ public void display( bool recursive = false, string prefix = "" ) { stdout.printf( "%sNode, name: %s, posx: %g, posy: %g, side: %s, layout: %s\n", prefix, name.text, posx, posy, side.to_string(), ((layout == null) ? "Unknown" : layout.name) ); if( recursive ) { for( int i=0; i<_children.length; i++ ) { _children.index( i ).display( recursive, prefix + " " ); } } } } Minder-1.5.1/src/NodeBorder.vala000066400000000000000000000027561356632107200164320ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public interface NodeBorder : Object { /* Returns the search name of the node border */ public abstract string name(); /* Returns the name of the node border */ public abstract string display_name(); /* Returns the name of the node border icon */ public abstract string icon_name(); /* Returns true if this node border is fillable */ public abstract bool is_fillable(); /* Draw method for the node border */ public abstract void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ); /* Draw method for the node fill */ public abstract void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ); } Minder-1.5.1/src/NodeImage.vala000066400000000000000000000134551356632107200162350ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using GLib; using Gdk; using Cairo; public class NodeImage { public const int EDIT_WIDTH = 600; public const int EDIT_HEIGHT = 600; private ImageSurface _surface; private Pixbuf _buf; public int id { get; set; default = -1; } public bool valid { get; private set; default = false; } public int crop_x { get; set; default = 0; } public int crop_y { get; set; default = 0; } public int crop_w { get; set; default = 0; } public int crop_h { get; set; default = 0; } public int width { get { return( _buf.width ); } } public int height { get { return( _buf.height ); } } /* Default constructor */ public NodeImage( ImageManager im, int id, int width ) { if( load( im, id, true ) ) { set_width( width ); } } /* Constructor from a URI */ public NodeImage.from_uri( ImageManager im, string uri, int width ) { int id = im.add_image( uri ); if( id != -1 ) { if( load( im, id, true ) ) { set_width( width ); } else { im.set_valid( id, false ); } } } /* Constructor from another node image */ public NodeImage.from_node_image( ImageManager im, NodeImage ni, int width ) { string uri = im.get_uri( ni.id ); if( uri != "" ) { int id = im.add_image( uri ); if( id != -1 ) { crop_x = ni.crop_x; crop_y = ni.crop_y; crop_w = ni.crop_w; crop_h = ni.crop_h; if( load( im, id, false ) ) { set_width( width ); } else { im.set_valid( id, false ); } } } } /* Constructor from XML file */ public NodeImage.from_xml( ImageManager im, Xml.Node* n, int width ) { string? i = n->get_prop( "id" ); if( i != null ) { id = int.parse( i ); } string? x = n->get_prop( "x" ); if( x != null ) { crop_x = int.parse( x ); } string? y = n->get_prop( "y" ); if( y != null ) { crop_y = int.parse( y ); } string? w = n->get_prop( "w" ); if( w != null ) { crop_w = int.parse( w ); } string? h = n->get_prop( "h" ); if( h != null ) { crop_h = int.parse( h ); } /* Allocate the image */ if( id != -1 ) { if( load( im, id, false ) ) { set_width( width ); } } } /* Loads the current file into this structure */ private bool load( ImageManager im, int id, bool init ) { this.id = id; this.valid = true; /* Get the file into the stored pixbuf */ try { /* Get the name of the file to read from the ImageManager */ var fname = im.get_file( id ); if( fname == null ) { this.valid = false; return( false ); } /* Read in the file into the given buffer */ var buf = new Pixbuf.from_file_at_size( fname, EDIT_WIDTH, EDIT_HEIGHT ); _surface = (ImageSurface)cairo_surface_create_from_pixbuf( buf, 1, null ); /* Initialize the variables */ if( init ) { crop_x = 0; crop_y = 0; crop_w = _surface.get_width(); crop_h = _surface.get_height(); } } catch( Error e ) { this.valid = false; } return( this.valid ); } /* Sets the width of the buffer based to the given value. We will always generate the buffer from the stored surface so that we don't lose resolution when scaling up. */ public void set_width( int width ) { var scale = (width * 1.0) / crop_w; var buf = pixbuf_get_from_surface( _surface, crop_x, crop_y, crop_w, crop_h ); _buf = buf.scale_simple( width, (int)(crop_h * scale), InterpType.BILINEAR ); } /* Returns the original pixbuf */ public ImageSurface? get_surface() { return( _surface ); } /* Returns a pixbuf */ public Pixbuf? get_pixbuf() { return( _buf ); } /* Draws the image to the given context */ public void draw( Context ctx, double x, double y, double opacity ) { cairo_set_source_pixbuf( ctx, _buf, x, y ); ctx.paint_with_alpha( opacity ); } /* Sets the given image widget to the stored pixbuf */ public void set_image( Image img ) { var scale_width = 300.0 / _buf.width; var scale_height = 300.0 / _buf.height; var w = 300; var h = 300; /* Calculate the width and height of the required image */ if( scale_width < scale_height ) { h = (int)(scale_width * _buf.height); } else { w = (int)(scale_height * _buf.width); } /* Create the pixbuf thumbnail and set it in the given image widget */ var buf = _buf.scale_simple( w, h, InterpType.BILINEAR ); img.set_from_pixbuf( buf ); } /* Saves the given node image in the given XML node */ public virtual void save( Xml.Node* parent ) { Xml.Node* n = new Xml.Node( null, "nodeimage" ); n->new_prop( "id", id.to_string() ); n->new_prop( "x", crop_x.to_string() ); n->new_prop( "y", crop_y.to_string() ); n->new_prop( "w", crop_w.to_string() ); n->new_prop( "h", crop_h.to_string() ); parent->add_child( n ); } } Minder-1.5.1/src/NodeInspector.vala000066400000000000000000000346131356632107200171600ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Granite.Widgets; public class NodeInspector : Box { private const Gtk.TargetEntry[] DRAG_TARGETS = { {"text/uri-list", 0, 0} }; private ScrolledWindow _sw; private TextView _name; private Switch _task; private Switch _fold; private Box _link_box; private ColorButton _link_color; private TextView _note; private DrawArea? _da = null; private Button _detach_btn; private string _orig_note = ""; private Node? _node = null; private EventBox _image_area; private Image _image; private Button _image_btn; private Label _image_loc; private bool _ignore_name_change = false; public NodeInspector( MainWindow win ) { Object( orientation:Orientation.VERTICAL, spacing:10 ); /* Create the node widgets */ create_title(); create_task(); create_fold(); create_link(); create_note(); create_image(); create_buttons(); show_all(); win.canvas_changed.connect( tab_changed ); } /* Called whenever the user clicks on a tab in the tab bar */ private void tab_changed( DrawArea? da ) { if( _da != null ) { _da.current_changed.disconnect( node_changed ); _da.theme_changed.disconnect( theme_changed ); } _da = da; if( da != null ) { da.current_changed.connect( node_changed ); da.theme_changed.connect( theme_changed ); node_changed(); } } /* Sets the width of this inspector to the given value */ public void set_width( int width ) { _sw.width_request = width; } /* Creates the name entry */ private void create_title() { Box box = new Box( Orientation.VERTICAL, 10 ); Label lbl = new Label( Utils.make_title( _( "Title" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _name = new TextView(); _name.set_wrap_mode( Gtk.WrapMode.WORD ); _name.buffer.text = ""; _name.buffer.changed.connect( name_changed ); _name.focus_out_event.connect( name_focus_out ); var sw = new ScrolledWindow( null, null ); sw.min_content_width = 300; sw.min_content_height = 60; sw.add( _name ); box.pack_start( lbl, true, false ); box.pack_start( sw, true, false ); pack_start( box, false, true ); } /* Creates the task UI elements */ private void create_task() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Task" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _task = new Switch(); _task.button_release_event.connect( task_changed ); box.pack_start( lbl, false, true, 0 ); box.pack_end( _task, false, true, 0 ); pack_start( box, false, true ); } /* Creates the fold UI elements */ private void create_fold() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Fold" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _fold = new Switch(); _fold.button_release_event.connect( fold_changed ); box.pack_start( lbl, false, true, 0 ); box.pack_end( _fold, false, true, 0 ); pack_start( box, false, true ); } /* Allows the user to select a different color for the current link and tree. */ private void create_link() { _link_box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( Utils.make_title( _( "Link Color" ) ) ); _link_box.homogeneous = true; lbl.xalign = (float)0; lbl.use_markup = true; _link_color = new ColorButton(); _link_color.color_set.connect(() => { _da.change_current_link_color( _link_color.rgba ); }); _link_box.pack_start( lbl, false, true, 0 ); _link_box.pack_end( _link_color, true, true, 0 ); pack_start( _link_box, false, true ); } /* Creates the note widget */ private void create_note() { Box box = new Box( Orientation.VERTICAL, 10 ); Label lbl = new Label( Utils.make_title( _( "Note" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _note = new TextView(); _note.set_wrap_mode( Gtk.WrapMode.WORD ); _note.buffer.text = ""; _note.buffer.changed.connect( note_changed ); _note.focus_in_event.connect( note_focus_in ); _note.focus_out_event.connect( note_focus_out ); _sw = new ScrolledWindow( null, null ); _sw.min_content_width = 300; _sw.min_content_height = 100; _sw.add( _note ); box.pack_start( lbl, false, false ); box.pack_start( _sw, true, true ); pack_start( box, true, true ); } /* Creates the image widget */ private void create_image() { var box = new Box( Orientation.VERTICAL, 10 ); var lbl = new Label( Utils.make_title( _( "Image" ) ) ); lbl.xalign = (float)0; lbl.use_markup = true; _image_btn = new Button.with_label( _( "Add Image…" ) ); _image_btn.visible = true; _image_btn.clicked.connect( image_button_clicked ); _image = new Image(); var btn_edit = new Button.from_icon_name( "document-edit-symbolic" ); btn_edit.set_tooltip_text( _( "Edit Image" ) ); btn_edit.clicked.connect(() => { _da.edit_current_image(); }); var btn_del = new Button.from_icon_name( "edit-delete-symbolic" ); btn_del.set_tooltip_text( _( "Remove Image" ) ); btn_del.clicked.connect(() => { _da.delete_current_image(); }); var btn_box = new Box( Orientation.HORIZONTAL, 20 ); btn_box.halign = Align.END; btn_box.valign = Align.START; btn_box.border_width = 5; btn_box.pack_start( btn_edit, false, false ); btn_box.pack_start( btn_del, false, false ); var reveal_box = new Revealer(); reveal_box.transition_duration = 500; reveal_box.transition_type = RevealerTransitionType.CROSSFADE; reveal_box.add( btn_box ); var img_overlay = new Overlay(); img_overlay.add_overlay( reveal_box ); img_overlay.add( _image ); _image_area = new EventBox(); _image_area.visible = false; _image_area.add_events( EventMask.ENTER_NOTIFY_MASK | EventMask.LEAVE_NOTIFY_MASK ); _image_area.enter_notify_event.connect((e) => { reveal_box.reveal_child = true; return( false ); }); _image_area.leave_notify_event.connect((e) => { reveal_box.reveal_child = false; return( false ); }); _image_area.add( img_overlay ); _image_loc = new Label( "" ); _image_loc.visible = false; _image_loc.use_markup = true; _image_loc.wrap = true; _image_loc.max_width_chars = 40; _image_loc.activate_link.connect( image_link_clicked ); box.pack_start( lbl, false, false ); box.pack_start( _image_btn, false, false ); box.pack_start( _image_area, true, true ); box.pack_start( _image_loc, false, true ); pack_start( box, false, true ); /* Set ourselves up to be a drag target */ Gtk.drag_dest_set( _image, DestDefaults.MOTION | DestDefaults.DROP, DRAG_TARGETS, Gdk.DragAction.COPY ); _image.drag_data_received.connect((ctx, x, y, data, info, t) => { if( data.get_uris().length == 1 ) { if( _da.update_current_image( data.get_uris()[0] ) ) { Gtk.drag_finish( ctx, true, false, t ); } } }); } /* Called when the user clicks on the image button */ private void image_button_clicked() { _da.add_current_image(); } /* Sets the visibility of the image widget to the given value */ private void set_image_visible( bool show ) { _image_btn.visible = !show; _image_area.visible = show; _image_loc.visible = show; } /* Called if the user clicks on the image URI */ private bool image_link_clicked( string uri ) { File file = File.new_for_uri( uri ); /* If the URI is a file on the local filesystem, view it with the Files app */ if( file.get_uri_scheme() == "file" ) { var files = AppInfo.get_default_for_type( "inode/directory", true ); var list = new List(); list.append( file ); try { files.launch( list, null ); } catch( Error e ) { return( false ); } return( true ); } return( false ); } /* Creates the node editing button grid and adds it to the popover */ private void create_buttons() { var grid = new Grid(); grid.column_homogeneous = true; grid.column_spacing = 5; var copy_btn = new Button.from_icon_name( "edit-copy-symbolic", IconSize.SMALL_TOOLBAR ); copy_btn.set_tooltip_text( _( "Copy Node To Clipboard" ) ); copy_btn.clicked.connect( node_copy ); var cut_btn = new Button.from_icon_name( "edit-cut-symbolic", IconSize.SMALL_TOOLBAR ); cut_btn.set_tooltip_text( _( "Cut Node To Clipboard" ) ); cut_btn.clicked.connect( node_cut ); /* Create the detach button */ _detach_btn = new Button.from_icon_name( "minder-detach-symbolic", IconSize.SMALL_TOOLBAR ); _detach_btn.set_tooltip_text( _( "Detach Node" ) ); _detach_btn.clicked.connect( node_detach ); /* Create the node deletion button */ var del_btn = new Button.from_icon_name( "edit-delete-symbolic", IconSize.SMALL_TOOLBAR ); del_btn.set_tooltip_text( _( "Delete Node" ) ); del_btn.clicked.connect( node_delete ); /* Add the buttons to the button grid */ grid.attach( copy_btn, 0, 0, 1, 1 ); grid.attach( cut_btn, 1, 0, 1, 1 ); grid.attach( _detach_btn, 2, 0, 1, 1 ); grid.attach( del_btn, 3, 0, 1, 1 ); /* Add the button grid to the popover */ pack_start( grid, false, true ); } /* Called whenever the node name is changed within the inspector. */ private void name_changed() { if( !_ignore_name_change ) { _da.change_current_node_name( _name.buffer.text ); } _ignore_name_change = false; } /* Called whenever the node title loses input focus. Updates the node title in the canvas. */ private bool name_focus_out( EventFocus e ) { _da.change_current_node_name( _name.buffer.text ); return( false ); } /* Called whenever the task enable switch is changed within the inspector */ private bool task_changed( Gdk.EventButton e ) { Node? current = _da.get_current_node(); if( current != null ) { _da.change_current_task( !current.task_enabled(), false ); } return( false ); } /* Called whenever the fold switch is changed within the inspector */ private bool fold_changed( Gdk.EventButton e ) { Node? current = _da.get_current_node(); if( current != null ) { _da.change_current_fold( !current.folded ); } return( false ); } /* Called whenever the text widget is changed. Updates the current node and redraws the canvas when needed. */ private void note_changed() { _da.change_current_node_note( _note.buffer.text ); } /* Saves the original version of the node's note so that we can */ private bool note_focus_in( EventFocus e ) { _node = _da.get_current_node(); _orig_note = _note.buffer.text; return( false ); } /* When the note buffer loses focus, save the note change to the undo buffer */ private bool note_focus_out( EventFocus e ) { if( (_node != null) && (_node.note != _orig_note) ) { _da.undo_buffer.add_item( new UndoNodeNote( _node, _orig_note ) ); } return( false ); } /* Copies the current node to the clipboard */ private void node_copy() { _da.copy_node_to_clipboard(); } /* Cuts the current node to the clipboard */ private void node_cut() { _da.cut_node_to_clipboard(); } /* Detaches the current node and makes it a parent node */ private void node_detach() { _da.detach(); _detach_btn.set_sensitive( false ); } /* Deletes the current node */ private void node_delete() { _da.delete_node(); } /* Grabs the input focus on the name entry */ public void grab_name() { _name.grab_focus(); } /* Grabs the focus on the note widget */ public void grab_note() { _note.grab_focus(); } /* Called whenever the theme is changed */ private void theme_changed( DrawArea da ) { int num_colors = Theme.num_link_colors(); RGBA[] colors = new RGBA[num_colors]; /* Gather the theme colors into an RGBA array */ for( int i=0; i" + url + ""; current.image.set_image( _image ); _image_loc.label = str; set_image_visible( true ); } else { set_image_visible( false ); } } } } Minder-1.5.1/src/NodeMenu.vala000066400000000000000000000335371356632107200161220ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class NodeMenu : Gtk.Menu { DrawArea _da; Gtk.MenuItem _copy; Gtk.MenuItem _cut; Gtk.MenuItem _paste; Gtk.MenuItem _delete; Gtk.MenuItem _edit; Gtk.MenuItem _task; Gtk.MenuItem _note; Gtk.MenuItem _image; Gtk.MenuItem _link; Gtk.MenuItem _conn; Gtk.MenuItem _fold; Gtk.MenuItem _detach; Gtk.MenuItem _root; Gtk.MenuItem _parent; Gtk.MenuItem _child; Gtk.MenuItem _sibling; Gtk.MenuItem _quick; Gtk.MenuItem _sortby; Gtk.MenuItem _selroot; Gtk.MenuItem _selnext; Gtk.MenuItem _selprev; Gtk.MenuItem _selchild; Gtk.MenuItem _selparent; Gtk.MenuItem _selconn; Gtk.MenuItem _sellink; Gtk.MenuItem _center; /* Default constructor */ public NodeMenu( DrawArea da, AccelGroup accel_group ) { _da = da; _copy = new Gtk.MenuItem.with_label( _( "Copy" ) ); _copy.activate.connect( copy ); Utils.add_accel_label( _copy, 'c', Gdk.ModifierType.CONTROL_MASK ); _cut = new Gtk.MenuItem.with_label( _( "Cut" ) ); _cut.activate.connect( cut ); Utils.add_accel_label( _cut, 'x', Gdk.ModifierType.CONTROL_MASK ); _paste = new Gtk.MenuItem.with_label( _( "Paste" ) ); _paste.activate.connect( paste ); Utils.add_accel_label( _paste, 'v', Gdk.ModifierType.CONTROL_MASK ); _delete = new Gtk.MenuItem.with_label( _( "Delete" ) ); _delete.activate.connect( delete_node ); Utils.add_accel_label( _delete, 65535, 0 ); _edit = new Gtk.MenuItem.with_label( _( "Edit…" ) ); _edit.activate.connect( edit_node ); Utils.add_accel_label( _edit, 'e', 0 ); _task = new Gtk.MenuItem.with_label( _( "Add Task" ) ); _task.activate.connect( change_task ); _note = new Gtk.MenuItem.with_label( _( "Add Note" ) ); _note.activate.connect( change_note ); _image = new Gtk.MenuItem.with_label( _( "Add Image" ) ); _image.activate.connect( change_image ); _link = new Gtk.MenuItem.with_label( _( "Add Node Link" ) ); _link.activate.connect( change_link ); _conn = new Gtk.MenuItem.with_label( _( "Add Connection" ) ); _conn.activate.connect( add_connection ); Utils.add_accel_label( _conn, 'x', 0 ); _fold = new Gtk.MenuItem.with_label( _( "Fold Children" ) ); _fold.activate.connect( fold_node ); Utils.add_accel_label( _fold, 'f', 0 ); _detach = new Gtk.MenuItem.with_label( _( "Detach" ) ); _detach.activate.connect( detach_node ); _root = new Gtk.MenuItem.with_label( _( "Add Root Node" ) ); _root.activate.connect( add_root_node ); _parent = new Gtk.MenuItem.with_label( _( "Add Parent Node" ) ); _parent.activate.connect( add_parent_node ); _child = new Gtk.MenuItem.with_label( _( "Add Child Node" ) ); _child.activate.connect( add_child_node ); Utils.add_accel_label( _child, 65289, 0 ); _sibling = new Gtk.MenuItem.with_label( _( "Add Sibling Node" ) ); _sibling.activate.connect( add_sibling_node ); Utils.add_accel_label( _sibling, 65293, 0 ); _quick = new Gtk.MenuItem.with_label( _( "Add Nodes With Quick Entry" ) ); _quick.activate.connect( add_quick_entry ); Utils.add_accel_label( _quick, 'e', Gdk.ModifierType.CONTROL_MASK ); var selnode = new Gtk.MenuItem.with_label( _( "Select" ) ); var selmenu = new Gtk.Menu(); selnode.set_submenu( selmenu ); _selroot = new Gtk.MenuItem.with_label( _( "Root Node" ) ); _selroot.activate.connect( select_root_node ); Utils.add_accel_label( _selroot, 'm', 0 ); _selnext = new Gtk.MenuItem.with_label( _( "Next Sibling Node" ) ); _selnext.activate.connect( select_next_sibling_node ); Utils.add_accel_label( _selnext, 'n', 0 ); _selprev = new Gtk.MenuItem.with_label( _( "Previous Sibling Node" ) ); _selprev.activate.connect( select_previous_sibling_node ); Utils.add_accel_label( _selprev, 'p', 0 ); _selchild = new Gtk.MenuItem.with_label( _( "Child Node" ) ); _selchild.activate.connect( select_child_node ); Utils.add_accel_label( _selchild, 'c', 0 ); _selparent = new Gtk.MenuItem.with_label( _( "Parent Node" ) ); _selparent.activate.connect( select_parent_node ); Utils.add_accel_label( _selparent, 'a', 0 ); _sellink = new Gtk.MenuItem.with_label( _( "Linked Node" ) ); _sellink.activate.connect( select_linked_node ); Utils.add_accel_label( _sellink, 'Y', Gdk.ModifierType.SHIFT_MASK ); _selconn = new Gtk.MenuItem.with_label( _( "Connection" ) ); _selconn.activate.connect( select_connection ); Utils.add_accel_label( _selconn, 'X', Gdk.ModifierType.SHIFT_MASK ); _center = new Gtk.MenuItem.with_label( _( "Center Current Node" ) ); _center.activate.connect( center_current_node ); Utils.add_accel_label( _center, 'C', Gdk.ModifierType.SHIFT_MASK ); _sortby = new Gtk.MenuItem.with_label( _( "Sort Children" ) ); var sortmenu = new Gtk.Menu(); _sortby.set_submenu( sortmenu ); var sort_alpha = new Gtk.MenuItem.with_label( _( "Alphabetically" ) ); sort_alpha.activate.connect( sort_alphabetically ); var sort_rand = new Gtk.MenuItem.with_label( _( "Randomize" ) ); sort_rand.activate.connect( sort_randomly ); /* Add the menu items to the menu */ add( _copy ); add( _cut ); add( _paste ); add( _delete ); add( new SeparatorMenuItem() ); add( _edit ); add( _task ); add( _note ); add( _image ); add( _link ); add( _conn ); add( _fold ); add( new SeparatorMenuItem() ); add( _root ); add( _parent ); add( _child ); add( _sibling ); add( _quick ); add( new SeparatorMenuItem() ); add( selnode ); add( _center ); add( new SeparatorMenuItem() ); add( _sortby ); add( new SeparatorMenuItem() ); add( _detach ); /* Add the items to the sort menu */ sortmenu.add( sort_alpha ); sortmenu.add( sort_rand ); /* Add the items to the selection menu */ selmenu.add( _selroot ); selmenu.add( _selnext ); selmenu.add( _selprev ); selmenu.add( _selchild ); selmenu.add( _selparent ); selmenu.add( _sellink ); selmenu.add( new SeparatorMenuItem() ); selmenu.add( _selconn ); /* Make the menu visible */ show_all(); /* Make sure that we handle menu state when we are popped up */ show.connect( on_popup ); } /* Returns true if the currently selected node is a task */ private bool node_is_task() { Node? current = _da.get_current_node(); return( (current != null) && current.task_enabled() ); } /* Returns true if a note is associated with the currently selected node */ private bool node_has_note() { Node? current = _da.get_current_node(); return( (current != null) && (current.note != "") ); } /* Returns true if an image is associated with the currently selected node */ private bool node_has_image() { Node? current = _da.get_current_node(); return( (current != null) && (current.image != null) ); } /* Returns true if an node link is associated with the currently selected node */ private bool node_has_link() { Node? current = _da.get_current_node(); return( (current != null) && (current.linked_node != null) ); } /* Returns true if there is a currently selected node that is foldable */ private bool node_foldable() { Node? current = _da.get_current_node(); return( (current != null) && !current.is_leaf() ); } /* Returns true if there are two or more nodes in the map and one is selected */ private bool node_linkable() { Node? current = _da.get_current_node(); return( (current != null) && (!current.is_root() || (_da.get_nodes().length > 1)) ); } /* Returns true if the currently selected node can have a parent node added */ private bool node_parentable() { Node? current = _da.get_current_node(); return( (current != null) && !current.is_root() ); } /* Returns true if the currently selected node has more than one child node */ private bool node_sortable() { Node? current = _da.get_current_node(); return( (current != null) && (current.children().length > 1) ); } /* Returns true if there is a currently selected node that is currently folded. */ private bool node_is_folded() { Node? current = _da.get_current_node(); return( (current != null) && current.folded ); } /* Called when the menu is popped up */ private void on_popup() { /* Set the menu sensitivity */ _paste.set_sensitive( _da.node_pasteable() ); _conn.set_sensitive( !_da.get_connections().hide ); _parent.set_sensitive( node_parentable() ); _fold.set_sensitive( node_foldable() ); _link.set_sensitive( node_linkable() ); _detach.set_sensitive( _da.detachable() ); _sortby.set_sensitive( node_sortable() ); _selroot.set_sensitive( _da.root_selectable() ); _selnext.set_sensitive( _da.sibling_selectable() ); _selprev.set_sensitive( _da.sibling_selectable() ); _selchild.set_sensitive( _da.child_selectable() ); _selparent.set_sensitive( _da.parent_selectable() ); _sellink.set_sensitive( node_has_link() ); /* Set the menu item labels */ _task.label = node_is_task() ? _( "Remove Task" ) : _( "Add Task" ); _note.label = node_has_note() ? _( "Remove Note" ) : _( "Add Note" ); _image.label = node_has_image() ? _( "Remove Image" ) : _( "Add Image" ); _link.label = node_has_link() ? _( "Remove Node Link" ) : _( "Add Node Link" ); _fold.label = node_is_folded() ? _( "Unfold Children" ) : _( "Fold Children" ); } /* Copies the current node to the clipboard */ private void copy() { _da.do_copy(); } /* Cuts the current node to the clipboard */ private void cut() { _da.do_cut(); } /* Pastes the node stored in the clipboard as either a root node (if no node is currently selected) or attaches it to the currently selected node. */ private void paste() { _da.do_paste(); } /* Deletes the current node */ private void delete_node() { _da.delete_node(); } /* Displays the sidebar to edit the node properties */ private void edit_node() { _da.show_properties( "current", false ); } /* Changes the task status of the currently selected node */ private void change_task() { if( node_is_task() ) { _da.change_current_task( false, false ); } else { _da.change_current_task( true, false ); } _da.current_changed( _da ); } /* Changes the note status of the currently selected node */ private void change_note() { if( node_has_note() ) { _da.change_current_node_note( "" ); } else { _da.show_properties( "current", true ); } _da.current_changed( _da ); } /* Changes the image of the currently selected node */ private void change_image() { if( node_has_image() ) { _da.delete_current_image(); } else { _da.add_current_image(); } _da.current_changed( _da ); } /* Changes the node link of the currently selected node */ private void change_link() { if( node_has_link() ) { _da.delete_current_link(); } else { _da.start_connection( false, true ); } } /* Changes the connection of the currently selected node */ private void add_connection() { _da.start_connection( false, false ); } /* Fold the currently selected node */ private void fold_node() { _da.change_current_fold( !node_is_folded() ); _da.current_changed( _da ); } /* Creates a new root node */ private void add_root_node() { _da.add_root_node(); } /* Creates a new parent node for the current node */ private void add_parent_node() { _da.add_parent_node(); } /* Creates a new child node from the current node */ private void add_child_node() { _da.add_child_node(); } /* Creates a sibling node of the current node */ private void add_sibling_node() { _da.add_sibling_node(); } /* Show the quick entry window */ private void add_quick_entry() { _da.handle_control_e(); } /* Detaches the currently selected node and make it a root node */ private void detach_node() { _da.detach(); } /* Selects the current root node */ private void select_root_node() { _da.select_root_node(); } /* Selects the next sibling node of the current node */ private void select_next_sibling_node() { _da.select_sibling_node( 1 ); } /* Selects the previous sibling node of the current node */ private void select_previous_sibling_node() { _da.select_sibling_node( -1 ); } /* Selects the first child node of the current node */ private void select_child_node() { _da.select_child_node(); } /* Selects the parent node of the current node */ private void select_parent_node() { _da.select_parent_node(); } /* Selects the node the current node is linked to */ private void select_linked_node() { _da.select_linked_node(); } /* Selects the one of the connections attached to the current node */ private void select_connection() { _da.select_attached_connection(); } /* Centers the current node */ private void center_current_node() { _da.center_current_node(); } private void sort_alphabetically() { _da.sort_alphabetically(); } private void sort_randomly() { _da.sort_randomly(); } } Minder-1.5.1/src/Partitioner.vala000066400000000000000000000072071356632107200167030ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ /* This class stores a pointer to a node to partition as well as its pixel size that is used for balancing purposes. */ public class PartNode : Object { private Node? _node = null; private double _size; /* Creates a single partitioner node */ public PartNode( Node n ) { var nb = n.tree_bbox; if( (n.side == NodeSide.LEFT) || (n.side == NodeSide.RIGHT) ) { _size = nb.height; } else { _size = nb.width; } _node = n; } /* Returns the size required by this node */ public double size() { return( _size ); } /* Returns the stored node */ public Node? node() { return( _node ); } /* Updates the node based on the given information */ public void update_node( Node root, int index, int side ) { NodeSide orig_side = _node.side; if( (_node.side == NodeSide.LEFT) || (_node.side == NodeSide.RIGHT) ) { _node.side = (side == 0) ? NodeSide.LEFT : NodeSide.RIGHT; } else { _node.side = (side == 0) ? NodeSide.TOP : NodeSide.BOTTOM; } if( orig_side != _node.side ) { _node.layout.propagate_side( _node, _node.side ); } _node.attach_init( root, index ); } } /* Main class used for root node balancing. This class uses a greedy partioning algorithm to provide node balancing. */ public class Partitioner : Object { /* Default constructor */ public Partitioner() {} /* Partitions the given root node */ public void partition_node( Node root ) { if( root.children().length > 2 ) { var data = new SList(); for( int i=0; i pn_cmp1 = (a, b) => { return( (a.node().id() < b.node().id()) ? 1 : -1 ); }; CompareFunc pn_cmp2 = (a, b) => { return( (a.size() < b.size()) ? 1 : ((a.size() == b.size()) ? 0 : -1) ); }; data.sort( pn_cmp1 ); data.sort( pn_cmp2 ); partition( root, data ); } } /* Performs a greedy algorithm for node balancing. This is not an optimal algorithm (unlike the KK number partioning algorithm), but it is simple to implement and I'm not sure that it really matters that we are completely optimal anyways. */ protected virtual void partition( Node root, SList data ) { double sum0 = 0; double sum1 = 0; int size0 = 0; /* Detach all of the nodes */ data.@foreach((item) => { item.node().detach( item.node().side ); }); /* Attach the nodes according to the side */ data.@foreach((item) => { if( sum0 < sum1 ) { sum0 += item.size(); item.update_node( root, size0, 0 ); size0++; } else { sum1 += item.size(); item.update_node( root, -1, 1 ); } }); } } Minder-1.5.1/src/QuickEntry.vala000066400000000000000000000177511356632107200165060ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public class QuickEntry : Gtk.Window { private TextView _entry; public QuickEntry( DrawArea da, GLib.Settings settings ) { /* Configure the window */ default_width = 500; default_height = 500; modal = true; deletable = false; title = _( "Quick Entry" ); transient_for = da.win; window_position = WindowPosition.CENTER_ON_PARENT; /* Add window elements */ var box = new Box( Orientation.VERTICAL, 0 ); /* Create the text entry area */ _entry = new TextView(); _entry.border_width = 5; _entry.set_wrap_mode( Gtk.WrapMode.WORD ); _entry.key_press_event.connect( on_keypress ); /* Create the scrolled window for the text entry area */ var sw = new ScrolledWindow( null, null ); sw.add( _entry ); var helprev = new Revealer(); var helpgrid = new Grid(); helpgrid.border_width = 5; var help_title = make_help_label( _( "Help for inputting node information:" ) + "\n" ); var help_line = make_help_label( " - " + _( "Each line of text describes either the title of a node or note information for a node." ) ); var help_tab0 = make_help_label( " - " + _( "Tab" ) + ":" ); var help_tab1 = make_help_label( " " + _( "Creates a child node of the previous node." ) ); var help_hdr0 = make_help_label( " - #:" ); var help_hdr1 = make_help_label( " " + _( "If this character is the first non-whitespace character, makes a new root node from the title that follows." ) ); var help_node0 = make_help_label( " - *, - or +:" ); var help_node1 = make_help_label( " " + _( "If this character is the first non-whitespace character, make a new node from the title that follows." ) ); var help_note0 = make_help_label( " - >:" ); var help_note1 = make_help_label( " " + _( "If this character is the first non-whitespace character, the following line is appended to the previous node's note." ) ); var help_utsk0 = make_help_label( " - [ ]:" ); var help_utsk1 = make_help_label( " " + _( "If this follows *, + or -, the node is made an uncompleted task." ) ); var help_ctsk0 = make_help_label( " - [x] or [X]:" ); var help_ctsk1 = make_help_label( " " + _( "If this follows *, + or -, the node is made a completed task." ) ); helpgrid.attach( help_title, 0, 0, 2 ); helpgrid.attach( help_line, 0, 1, 2 ); helpgrid.attach( help_tab0, 0, 2 ); helpgrid.attach( help_tab1, 1, 2 ); helpgrid.attach( help_hdr0, 0, 3 ); helpgrid.attach( help_hdr1, 1, 3 ); helpgrid.attach( help_node0, 0, 4 ); helpgrid.attach( help_node1, 1, 4 ); helpgrid.attach( help_note0, 0, 5 ); helpgrid.attach( help_note1, 1, 5 ); helpgrid.attach( help_utsk0, 0, 6 ); helpgrid.attach( help_utsk1, 1, 6 ); helpgrid.attach( help_ctsk0, 0, 7 ); helpgrid.attach( help_ctsk1, 1, 7 ); helprev.reveal_child = false; helprev.add( helpgrid ); var bbox = new Box( Orientation.HORIZONTAL, 5 ); bbox.border_width = 5; var info = new Button.from_icon_name( "dialog-information-symbolic", IconSize.BUTTON ); info.relief = ReliefStyle.NONE; info.clicked.connect(() => { helprev.reveal_child = !helprev.reveal_child; }); var cancel = new Button.with_label( _( "Cancel" ) ); cancel.clicked.connect(() => { close(); }); var ins = new Button.with_label( _( "Insert" ) ); ins.get_style_context().add_class( STYLE_CLASS_SUGGESTED_ACTION ); ins.clicked.connect(() => { ExportText.import_text( _entry.buffer.text, settings.get_int( "quick-entry-spaces-per-tab" ), da, false ); close(); }); bbox.pack_start( info, false, false ); bbox.pack_end( ins, false, false ); bbox.pack_end( cancel, false, false ); box.pack_start( sw, true, true ); box.pack_end( bbox, false, true ); box.pack_end( helprev, false, true ); add( box ); show_all(); } private Label make_help_label( string str ) { var lbl = new Label( str ); lbl.use_markup = true; lbl.xalign = (float)0; lbl.get_style_context().add_class( "greyed-label" ); return( lbl ); } private bool on_keypress( EventKey e ) { switch( e.keyval ) { case 32 : return( handle_space() ); case 65293 : return( handle_return() ); case 65289 : return( handle_tab() ); } return( false ); } /* Returns the text from the start of the current line to the current insertion cursor */ private string get_line_text( int adjust ) { TextIter current; TextIter startline; TextIter endline; var buf = _entry.buffer; buf.get_iter_at_mark( out current, buf.get_insert() ); /* Adjust the line */ if( adjust < 0 ) { current.backward_lines( 0 - adjust ); } else if( adjust > 0 ) { current.backward_lines( adjust ); } buf.get_iter_at_line( out startline, current.get_line() ); buf.get_iter_at_line( out endline, current.get_line() + 1 ); return( buf.get_text( startline, endline, true ) ); } /* Returns the text from the start of the current line to the current insertion cursor */ private string get_start_to_current_text() { TextIter startline; TextIter endline; var buf = _entry.buffer; /* Get the text on the current line */ buf.get_iter_at_mark( out endline, buf.get_insert() ); buf.get_iter_at_line( out startline, endline.get_line() ); return( buf.get_text( startline, endline, true ) ); } /* Returns the whitespace at the beginning of the current line */ private bool get_whitespace( string line, out string wspace ) { wspace = ""; try { MatchInfo match_info; var re = new Regex( "^([ \\t]*)" ); if( re.match( line, 0, out match_info ) ) { wspace = match_info.fetch( 1 ); return( true ); } } catch( RegexError err ) { return( false ); } return( false ); } /* Converts the given whitespace to all spaces */ private string tabs_to_spaces( string wspace ) { var tspace = string.nfill( 8, ' ' ); return( wspace.replace( "\t", tspace ) ); } /* If the user attempts to hit the space bar when adding front-end whitespace, don't insert it */ private bool handle_space() { return( get_start_to_current_text().strip() == "" ); } /* If the return key is pressed, we will automatically indent the next line */ private bool handle_return() { string wspace; if( get_whitespace( get_line_text( 0 ), out wspace ) ) { var ins = "\n" + wspace; _entry.buffer.insert_at_cursor( ins, ins.length ); return( true ); } return( false ); } /* If the Tab key is pressed, only allow it if it is valid to do so */ private bool handle_tab() { TextIter current; var prev = ""; var curr = ""; _entry.buffer.get_iter_at_mark( out current, _entry.buffer.get_insert() ); if( current.get_line() == 0 ) { return( true ); } else if( get_whitespace( get_line_text( 0 ), out curr ) && get_whitespace( get_line_text( -1 ), out prev ) ) { return( tabs_to_spaces( curr ).length > tabs_to_spaces( prev ).length ); } return( false ); } } Minder-1.5.1/src/Style.vala000066400000000000000000000330161356632107200155000ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Pango; public class Style { private bool _template; public LinkType? link_type { get; set; default = null; } public int? link_width { get; set; default = null; } public bool? link_arrow { get; set; default = null; } public LinkDash? link_dash { get; set; default = null; } public NodeBorder? node_border { get; set; default = null; } public int? node_width { get; set; default = null; } public int? node_borderwidth { get; set; default = null; } public bool? node_fill { get; set; default = null; } public int? node_margin { get; set; default = null; } public int? node_padding { get; set; default = null; } public FontDescription? node_font { get; set; default = null; } public bool? node_markup { get; set; default = null; } public LinkDash? connection_dash { get; set; default = null; } public int? connection_width { get; set; default = null; } public string? connection_arrow { get; set; default = null; } public int? connection_padding { get; set; default = null; } public FontDescription? connection_font { get; set; default = null; } /* Default constructor */ public Style() { _template = false; node_font = new FontDescription(); node_font.set_family( "Sans" ); node_font.set_size( 11 * Pango.SCALE ); connection_font = new FontDescription(); connection_font.set_family( "Sans" ); connection_font.set_size( 10 * Pango.SCALE ); } /* Constructor used for style templating */ public Style.templated() { _template = true; } /* Returns true if the node assigned with this style can be filled with a color */ public bool is_fillable() { return( node_fill && node_border.is_fillable() ); } /* Clears this style template options */ public void clear_template() { if( _template ) { link_type = null; link_width = null; link_arrow = null; link_dash = null; node_border = null; node_width = null; node_borderwidth = null; node_fill = null; node_margin = null; node_padding = null; node_font = null; node_markup = null; connection_dash = null; connection_width = null; connection_arrow = null; connection_padding = null; connection_font = null; } } /* Copies the given style to this style. Returns true if the style changed; otherwise, returns false. */ public bool copy( Style s ) { bool changed = false; if( ((s.link_type != null) || !s._template) && (link_type != s.link_type) ) { changed = true; link_type = s.link_type; } if( ((s.link_width != null) || !s._template) && (link_width != s.link_width) ) { changed = true; link_width = s.link_width; } if( ((s.link_arrow != null) || !s._template) && (link_arrow != s.link_arrow) ) { changed = true; link_arrow = s.link_arrow; } if( ((s.link_dash != null) || !s._template) && (link_dash != s.link_dash) ) { changed = true; link_dash = s.link_dash; } if( ((s.node_border != null) || !s._template) && (node_border != s.node_border) ) { changed = true; node_border = s.node_border; } if( ((s.node_width != null) || !s._template) && (node_width != s.node_width) ) { changed = true; node_width = s.node_width; } if( ((s.node_borderwidth != null) || !s._template) && (node_borderwidth != s.node_borderwidth) ) { changed = true; node_borderwidth = s.node_borderwidth; } if( ((s.node_fill != null) || !s._template) && (node_fill != s.node_fill) ) { changed = true; node_fill = s.node_fill; } if( ((s.node_margin != null) || !s._template) && (node_margin != s.node_margin) ) { changed = true; node_margin = s.node_margin; } if( ((s.node_padding != null) || !s._template) && (node_padding != s.node_padding) ) { changed = true; node_padding = s.node_padding; } if( ((s.node_font != null) || !s._template) ) { changed = true; node_font = s.node_font.copy(); } if( ((s.node_markup != null) || !s._template) && (node_markup != s.node_markup) ) { changed = true; node_markup = s.node_markup; } if( ((s.connection_dash != null) || !s._template) && (connection_dash != s.connection_dash) ) { changed = true; connection_dash = s.connection_dash; } if( ((s.connection_width != null) || !s._template) && (connection_width != s.connection_width) ) { changed = true; connection_width = s.connection_width; } if( ((s.connection_arrow != null) || !s._template) && (connection_arrow != s.connection_arrow) ) { changed = true; connection_arrow = s.connection_arrow; } if( ((s.connection_padding != null) || !s._template) && (connection_padding != s.connection_padding) ) { changed = true; connection_padding = s.connection_padding; } if( ((s.connection_font != null) || !s._template) ) { changed = true; connection_font = s.connection_font.copy(); } return( changed ); } public string to_string() { string[] arr = {}; if( link_type != null ) arr += "ltype[%s]".printf( link_type.name() ); if( link_width != null ) arr += "lwidth[%d]".printf( link_width ); if( link_arrow != null ) arr += "larrow[%s]".printf( link_arrow.to_string() ); if( link_dash != null ) arr += "ldash[%s]".printf( link_dash.name ); if( node_border != null ) arr += "nborder[%s]".printf( node_border.name() ); if( node_width != null ) arr += "nwidth[%d]".printf( node_width ); if( node_borderwidth != null ) arr += "nbwidth[%d]".printf( node_borderwidth ); if( node_fill != null ) arr += "nfill[%s]".printf( node_fill.to_string() ); if( node_margin != null ) arr += "nmargin[%d]".printf( node_margin ); if( node_padding != null ) arr += "npad[%d]".printf( node_padding ); if( node_font != null ) arr += "nfont"; if( node_markup != null ) arr += "nmarkup[%s]".printf( node_markup.to_string() ); if( connection_dash != null ) arr += "cdash[%s]".printf( connection_dash.name ); if( connection_width != null ) arr += "cwidth[%d]".printf( connection_width ); if( connection_arrow != null ) arr += "carrow[%s]".printf( connection_arrow ); if( connection_padding != null ) arr += "cpad[%d]".printf( connection_padding ); if( connection_font != null ) arr += "cfont"; return( string.joinv( "+", arr ) ); } /* Loads the style information in the given XML node */ public void load_node( Xml.Node* node ) { string? lt = node->get_prop( "linktype" ); if( lt != null ) { link_type = StyleInspector.styles.get_link_type( lt ); } string? lw = node->get_prop( "linkwidth" ); if( lw != null ) { link_width = int.parse( lw ); } string? la = node->get_prop( "linkarrow" ); if( la != null ) { link_arrow = bool.parse( la ); } string? ld = node->get_prop( "linkdash" ); if( ld != null ) { link_dash = StyleInspector.styles.get_link_dash( ld ); } string? nb = node->get_prop( "nodeborder" ); if( nb != null ) { node_border = StyleInspector.styles.get_node_border( nb ); } string? nw = node->get_prop( "nodewidth" ); if( nw != null ) { node_width = int.parse( nw ); } string? nbw = node->get_prop( "nodeborderwidth" ); if( nbw != null ) { node_borderwidth = int.parse( nbw ); } string? nlf = node->get_prop( "nodefill" ); if( nlf != null ) { node_fill = bool.parse( nlf ); } string? nm = node->get_prop( "nodemargin" ); if( nm != null ) { node_margin = int.parse( nm ); } string? np = node->get_prop( "nodepadding" ); if( np != null ) { node_padding = int.parse( np ); } string? nf = node->get_prop( "nodefont" ); if( nf != null ) { node_font = FontDescription.from_string( nf ); } string? nmu = node->get_prop( "nodemarkup" ); if( nmu != null ) { node_markup = bool.parse( nmu ); } } /* Loads the style information in the given XML node */ public void load_connection( Xml.Node* node ) { string? d = node->get_prop( "connectiondash" ); if( d != null ) { connection_dash = StyleInspector.styles.get_link_dash( d ); } string? w = node->get_prop( "connectionwidth" ); if( w != null ) { connection_width = int.parse( w ); } string? a = node->get_prop( "connectionarrow" ); if( a != null ) { connection_arrow = a; } string? p = node->get_prop( "connectionpadding" ); if( p != null ) { connection_padding = int.parse( p ); } string? f = node->get_prop( "connectionfont" ); if( f != null ) { connection_font = FontDescription.from_string( f ); } } public void save_node_in_node( Xml.Node* n ) { if( link_type != null ) { n->set_prop( "linktype", link_type.name() ); } if( link_width != null ) { n->set_prop( "linkwidth", link_width.to_string() ); } if( link_arrow != null ) { n->set_prop( "linkarrow", link_arrow.to_string() ); } if( link_dash != null ) { n->set_prop( "linkdash", link_dash.name ); } if( node_border != null ) { n->set_prop( "nodeborder", node_border.name() ); } if( node_width != null ) { n->set_prop( "nodewidth", node_width.to_string() ); } if( node_borderwidth != null ) { n->set_prop( "nodeborderwidth", node_borderwidth.to_string() ); } if( node_fill != null ) { n->set_prop( "nodefill", node_fill.to_string() ); } if( node_margin != null ) { n->set_prop( "nodemargin", node_margin.to_string() ); } if( node_padding != null ) { n->set_prop( "nodepadding", node_padding.to_string() ); } if( node_font != null ) { n->set_prop( "nodefont", node_font.to_string() ); } if( node_markup != null ) { n->set_prop( "nodemarkup", node_markup.to_string() ); } } /* Stores this style in XML format */ public void save_node( Xml.Node* parent ) { Xml.Node* n = new Xml.Node( null, "style" ); save_node_in_node( n ); parent->add_child( n ); } public void save_connection_in_node( Xml.Node* n ) { if( connection_dash != null ) { n->set_prop( "connectiondash", connection_dash.name ); } if( connection_width != null ) { n->set_prop( "connectionwidth", connection_width.to_string() ); } if( connection_arrow != null ) { n->set_prop( "connectionarrow", connection_arrow ); } if( connection_padding != null ) { n->set_prop( "connectionpadding", connection_padding.to_string() ); } if( connection_font != null ) { n->set_prop( "connectionfont", connection_font.to_string() ); } } /* Stores this style in XML format */ public void save_connection( Xml.Node* parent ) { Xml.Node* n = new Xml.Node( null, "style" ); save_connection_in_node( n ); parent->add_child( n ); } /* Draws the link with the given information, applying the stored styling */ public void draw_link( Cairo.Context ctx, Style parent_style, Node to_node, double from_x, double from_y, double to_x, double to_y, out double tailx, out double taily, out double tipx, out double tipy ) { ctx.save(); ctx.set_line_width( link_width ); link_dash.set_context( ctx, link_width ); parent_style.link_type.draw( ctx, to_node, from_x, from_y, to_x, to_y, out tailx, out taily, out tipx, out tipy ); ctx.restore(); } /* Draws the shape behind a node with the given dimensions and stored styling */ public void draw_node_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.save(); ctx.set_line_width( node_borderwidth ); node_border.draw_border( ctx, x, y, w, h, s ); ctx.restore(); } /* Draws the node fill */ public void draw_node_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { node_border.draw_fill( ctx, x, y, w, h, s ); } /* Sets up the given context to draw the stylized connection */ public void draw_connection( Cairo.Context ctx ) { ctx.set_line_width( connection_width ); connection_dash.set_context( ctx, connection_width ); } } Minder-1.5.1/src/StyleInspector.vala000066400000000000000000001120551356632107200173700ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public enum StyleAffects { ALL = 0, // Applies changes to all nodes and connections SEP0, // Indicates a separator (not a value) CURRENT, // Applies changes to the current node/connection CURRTREE, // Applies changes to the current tree CURRSUBTREE, // Applies changes to the current nodes and all descendants SEP1, // Indicates a separator (not a value) LEVEL0, // Applies changes to all root nodes LEVEL1, // Applies changes to all level-1 nodes LEVEL2, // Applies changes to all level-2 nodes LEVEL3, // Applies changes to all level-2 nodes LEVEL4, // Applies changes to all level-2 nodes LEVEL5, // Applies changes to all level-2 nodes LEVEL6, // Applies changes to all level-2 nodes LEVEL7, // Applies changes to all level-2 nodes LEVEL8, // Applies changes to all level-2 nodes LEVEL9; // Applies changes to all level-2 nodes /* Displays the label to display for this enumerated value */ public string label() { switch( this ) { case ALL : return( _( "All" ) ); case CURRENT : return( _( "Current" ) ); case CURRTREE : return( _( "Current Tree" ) ); case CURRSUBTREE : return( _( "Current Node + Descendants" ) ); case LEVEL0 : return( _( "Root Nodes" ) ); case LEVEL1 : return( _( "Level 1 Nodes" ) ); case LEVEL2 : return( _( "Level 2 Nodes" ) ); case LEVEL3 : return( _( "Level 3 Nodes" ) ); case LEVEL4 : return( _( "Level 4 Nodes" ) ); case LEVEL5 : return( _( "Level 5 Nodes" ) ); case LEVEL6 : return( _( "Level 6 Nodes" ) ); case LEVEL7 : return( _( "Level 7 Nodes" ) ); case LEVEL8 : return( _( "Level 8 Nodes" ) ); case LEVEL9 : return( _( "Level 9 Nodes" ) ); } return( "Unknown" ); } /* Returns true if this is a separator */ public bool is_separator() { return( (this == SEP0) || (this == SEP1) ); } /* Returns the level associated with this value */ public uint level() { return( (uint)this - (uint)LEVEL0 ); } } public class StyleInspector : Box { private DrawArea? _da = null; private GLib.Settings _settings; private Granite.Widgets.ModeButton _link_types; private Scale _link_width; private Switch _link_arrow; private Image _link_dash; private Granite.Widgets.ModeButton _node_borders; private Scale _node_borderwidth; private Switch _node_fill; private Scale _node_margin; private Scale _node_padding; private FontButton _node_font; private Switch _node_markup; private Image _conn_dash; private Image _conn_arrow; private Scale _conn_width; private Scale _conn_padding; private FontButton _conn_font; private StyleAffects _affects; private Array _affect_items; private Label _affects_label; private Box _branch_group; private Box _link_group; private Box _node_group; private Box _conn_group; private Expander _conn_exp; private bool _change_add = true; public static Styles styles = new Styles(); public StyleInspector( MainWindow win, GLib.Settings settings ) { Object( orientation:Orientation.VERTICAL, spacing:20 ); _settings = settings; /* Initialize the affects */ _affects = StyleAffects.ALL; /* Create the UI for nodes */ var affect = create_affect_ui(); var box = new Box( Orientation.VERTICAL, 0 ); var sw = new ScrolledWindow( null, null ); var vp = new Viewport( null, null ); vp.set_size_request( 200, 600 ); vp.add( box ); sw.add( vp ); _branch_group = create_branch_ui(); _link_group = create_link_ui(); _node_group = create_node_ui(); _conn_group = create_connection_ui(); /* Pack the scrollwindow */ box.pack_start( _branch_group, false, true ); box.pack_start( _link_group, false, true ); box.pack_start( _node_group, false, true ); box.pack_start( _conn_group, false, true ); /* Pack the elements into this widget */ pack_start( affect, false, true ); pack_start( sw, true, true, 10 ); /* Listen for changes to the current tab in the main window */ win.canvas_changed.connect( tab_changed ); } /* Listen for any changes to the current tab in the main window */ private void tab_changed( DrawArea? da ) { if( _da != null ) { _da.current_changed.disconnect( handle_current_changed ); } if( da != null ) { da.current_changed.connect( handle_current_changed ); } _da = da; handle_ui_changed(); } /* Creates the menubutton that changes the affect */ private Box create_affect_ui() { var box = new Box( Orientation.HORIZONTAL, 10 ); var lbl = new Label( Utils.make_title( _( "Changes affect:" ) ) ); var mb = new MenuButton(); var menu = new Gtk.Menu(); _affects_label = new Label( "" ); lbl.use_markup = true; mb.add( _affects_label ); mb.popup = menu; /* Allocate memory for menu items */ _affect_items = new Array(); /* Add all of the enumerations */ EnumClass eclass = (EnumClass)typeof( StyleAffects ).class_ref(); for( int i=0; i { set_affects( affect ); }); _affect_items.append_val( mi ); } } menu.show_all(); /* Pack the menubutton box */ box.pack_start( lbl, false, false ); box.pack_start( mb, true, true ); return( box ); } /* Adds the options to manipulate line options */ private Box create_branch_ui() { var box = new Box( Orientation.VERTICAL, 0 ); var sep = new Separator( Orientation.HORIZONTAL ); /* Create expander */ var exp = new Expander( " " + Utils.make_title( _( "Branch Options" ) ) ); exp.use_markup = true; exp.expanded = _settings.get_boolean( "style-branch-options-expanded" ); exp.activate.connect(() => { _settings.set_boolean( "style-branch-options-expanded", !exp.expanded ); }); var cbox = new Box( Orientation.VERTICAL, 10 ); cbox.border_width = 10; var branch_type = create_branch_type_ui(); cbox.pack_start( branch_type, false, true ); exp.add( cbox ); box.pack_start( exp, false, true ); box.pack_start( sep, false, true, 10 ); return( box ); } /* Create the branch type UI */ private Box create_branch_type_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Branch Style" ) ); lbl.xalign = (float)0; /* Create the line types mode button */ _link_types = new Granite.Widgets.ModeButton(); _link_types.has_tooltip = true; _link_types.button_release_event.connect( branch_type_changed ); _link_types.query_tooltip.connect( branch_type_show_tooltip ); var link_types = styles.get_link_types(); for( int i=0; i { _settings.set_boolean( "style-link-options-expanded", !exp.expanded ); }); var cbox = new Box( Orientation.VERTICAL, 10 ); cbox.border_width = 10; var link_dash = create_link_dash_ui(); var link_width = create_link_width_ui(); var link_arrow = create_link_arrow_ui(); cbox.pack_start( link_dash, false, true ); cbox.pack_start( link_width, false, true ); cbox.pack_start( link_arrow, false, true ); exp.add( cbox ); box.pack_start( exp, false, true ); box.pack_start( sep, false, true, 10 ); return( box ); } /* Create the link dash widget */ private Box create_link_dash_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Line Dash" ) ); lbl.xalign = (float)0; var menu = new Gtk.Menu(); var dashes = styles.get_link_dashes(); _link_dash = new Image.from_surface( dashes.index( 0 ).make_icon() ); for( int i=0; i { _da.undo_buffer.add_item( new UndoStyleLinkDash( _affects, dash, _da ) ); _link_dash.surface = img.surface; }); mi.add( img ); menu.add( mi ); } menu.show_all(); var mb = new MenuButton(); mb.add( _link_dash ); mb.popup = menu; box.pack_start( lbl, false, true ); box.pack_end( mb, false, true ); return( box ); } /* Create widget for handling the width of a link */ private Box create_link_width_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Line Width" ) ); lbl.xalign = (float)0; _link_width = new Scale.with_range( Orientation.HORIZONTAL, 2, 8, 1 ); _link_width.draw_value = false; for( int i=2; i<=8; i++ ) { if( (i % 2) == 0 ) { _link_width.add_mark( i, PositionType.BOTTOM, "%d".printf( i ) ); } else { _link_width.add_mark( i, PositionType.BOTTOM, null ); } } _link_width.change_value.connect( link_width_changed ); _link_width.button_release_event.connect( link_width_released ); box.pack_start( lbl, false, true ); box.pack_end( _link_width, false, true ); return( box ); } /* Called whenever the user changes the link width value */ private bool link_width_changed( ScrollType scroll, double value ) { if( value > 8 ) value = 8; var link_width = new UndoStyleLinkWidth( _affects, (int)value, _da ); if( _change_add ) { _da.undo_buffer.add_item( link_width ); _change_add = false; } else { _da.undo_buffer.replace_item( link_width ); } return( false ); } private bool link_width_released( EventButton e ) { _change_add = true; return( false ); } /* Creates the link arrow UI element */ private Box create_link_arrow_ui() { var box = new Box( Orientation.HORIZONTAL, 5 ); var lbl = new Label( _( "Link Arrow" ) ); _link_arrow = new Switch(); _link_arrow.set_active( false ); /* TBD */ _link_arrow.button_release_event.connect( link_arrow_changed ); box.pack_start( lbl, false, false ); box.pack_end( _link_arrow, false, false ); return( box ); } /* Called when the user clicks on the link arrow switch */ private bool link_arrow_changed( Gdk.EventButton e ) { bool val = !_link_arrow.get_active(); Idle.add(() => { _da.undo_buffer.add_item( new UndoStyleLinkArrow( _affects, val, _da ) ); return( Source.REMOVE ); }); return( false ); } /* Creates the options to manipulate node options */ private Box create_node_ui() { var box = new Box( Orientation.VERTICAL, 5 ); var sep = new Separator( Orientation.HORIZONTAL ); /* Create expander */ var exp = new Expander( " " + Utils.make_title( _( "Node Options" ) ) ); exp.use_markup = true; exp.expanded = _settings.get_boolean( "style-node-options-expanded" ); exp.activate.connect(() => { _settings.set_boolean( "style-node-options-expanded", !exp.expanded ); }); var cbox = new Box( Orientation.VERTICAL, 10 ); cbox.border_width = 10; var node_border = create_node_border_ui(); var node_borderwidth = create_node_borderwidth_ui(); var node_fill = create_node_fill_ui(); var node_margin = create_node_margin_ui(); var node_padding = create_node_padding_ui(); var node_font = create_node_font_ui(); var node_markup = create_node_markup_ui(); cbox.pack_start( node_border, false, true ); cbox.pack_start( node_borderwidth, false, true ); cbox.pack_start( node_fill, false, true ); cbox.pack_start( node_margin, false, true ); cbox.pack_start( node_padding, false, true ); cbox.pack_start( node_font, false, true ); cbox.pack_start( node_markup, false, true ); exp.add( cbox ); box.pack_start( exp, false, true ); box.pack_start( sep, false, true, 10 ); return( box ); } /* Creates the node border panel */ private Box create_node_border_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( _( "Border Style" ) ); /* Create the line types mode button */ _node_borders = new Granite.Widgets.ModeButton(); _node_borders.has_tooltip = true; _node_borders.button_release_event.connect( node_border_changed ); _node_borders.query_tooltip.connect( node_border_show_tooltip ); var node_borders = styles.get_node_borders(); for( int i=0; i { _da.undo_buffer.add_item( new UndoStyleNodeFill( _affects, val, _da ) ); return( Source.REMOVE ); }); return( false ); } /* Allows the user to change the node margin */ private Box create_node_margin_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Margin" ) ); lbl.xalign = (float)0; _node_margin = new Scale.with_range( Orientation.HORIZONTAL, 5, 20, 1 ); _node_margin.draw_value = true; _node_margin.change_value.connect( node_margin_changed ); _node_margin.button_release_event.connect( node_margin_released ); box.pack_start( lbl, false, true ); box.pack_end( _node_margin, false, true ); return( box ); } /* Called whenever the node margin value is changed */ private bool node_margin_changed( ScrollType scroll, double value ) { if( (int)value > 20 ) { return( false ); } var margin = new UndoStyleNodeMargin( _affects, (int)value, _da ); if( _change_add ) { _da.undo_buffer.add_item( margin ); _change_add = false; } else { _da.undo_buffer.replace_item( margin ); } return( false ); } private bool node_margin_released( EventButton e ) { _change_add = true; return( false ); } /* Allows the user to change the node padding */ private Box create_node_padding_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Padding" ) ); lbl.xalign = (float)0; _node_padding = new Scale.with_range( Orientation.HORIZONTAL, 5, 20, 2 ); _node_padding.draw_value = true; _node_padding.change_value.connect( node_padding_changed ); _node_padding.button_release_event.connect( node_padding_released ); box.pack_start( lbl, false, true ); box.pack_end( _node_padding, false, true ); return( box ); } /* Called whenever the node margin value is changed */ private bool node_padding_changed( ScrollType scroll, double value ) { if( (int) value > 20 ) { return( false ); } var padding = new UndoStyleNodePadding( _affects, (int)value, _da ); if( _change_add ) { _da.undo_buffer.add_item( padding ); _change_add = false; } else { _da.undo_buffer.replace_item( padding ); } return( false ); } private bool node_padding_released( EventButton e ) { _change_add = true; return( false ); } /* Creates the node font selector */ private Box create_node_font_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( _( "Font" ) ); lbl.xalign = (float)0; _node_font = new FontButton(); _node_font.use_font = true; _node_font.font_set.connect(() => { var family = _node_font.get_font_family().get_name(); var size = _node_font.get_font_size(); _da.undo_buffer.add_item( new UndoStyleNodeFont( _affects, family, size, _da ) ); }); box.pack_start( lbl, false, true ); box.pack_end( _node_font, false, true ); return( box ); } private Box create_node_markup_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( _( "Enable Markup" ) ); lbl.xalign = (float)0; _node_markup = new Switch(); _node_markup.button_release_event.connect( node_markup_changed ); box.pack_start( lbl, false, true ); box.pack_end( _node_markup, false, true ); return( box ); } /* Called whenever the node fill status changes */ private bool node_markup_changed( Gdk.EventButton e ) { bool val = !_node_markup.get_active(); Idle.add(() => { _da.undo_buffer.add_item( new UndoStyleNodeMarkup( _affects, val, _da ) ); return( Source.REMOVE ); }); return( false ); } /* Creates the connection style UI */ private Box create_connection_ui() { var box = new Box( Orientation.VERTICAL, 0 ); var sep = new Separator( Orientation.HORIZONTAL ); /* Create expander */ _conn_exp = new Expander( " " + Utils.make_title( _( "Connection Options" ) ) ); _conn_exp.use_markup = true; _conn_exp.expanded = _settings.get_boolean( "style-connection-options-expanded" ); _conn_exp.activate.connect(() => { _settings.set_boolean( "style-connection-options-expanded", !_conn_exp.expanded ); }); var cbox = new Box( Orientation.VERTICAL, 10 ); cbox.border_width = 10; var conn_dash = create_connection_dash_ui(); var conn_arrow = create_connection_arrow_ui(); var conn_width = create_connection_width_ui(); var conn_padding = create_connection_padding_ui(); var conn_font = create_connection_font_ui(); cbox.pack_start( conn_dash, false, true ); cbox.pack_start( conn_arrow, false, true ); cbox.pack_start( conn_width, false, true ); cbox.pack_start( conn_padding, false, true ); cbox.pack_start( conn_font, false, true ); _conn_exp.add( cbox ); box.pack_start( _conn_exp, false, true ); box.pack_start( sep, false, true, 10 ); return( box ); } /* Create the connection dash widget */ private Box create_connection_dash_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Line Dash" ) ); lbl.xalign = (float)0; var menu = new Gtk.Menu(); var dashes = styles.get_link_dashes(); _conn_dash = new Image.from_surface( dashes.index( 0 ).make_icon() ); for( int i=0; i { _da.undo_buffer.add_item( new UndoStyleConnectionDash( _affects, dash, _da ) ); _conn_dash.surface = img.surface; }); mi.add( img ); menu.add( mi ); } menu.show_all(); var mb = new MenuButton(); mb.add( _conn_dash ); mb.popup = menu; box.pack_start( lbl, false, true ); box.pack_end( mb, false, true ); return( box ); } /* Creates the connection arrow position UI */ private Box create_connection_arrow_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Arrows" ) ); lbl.xalign = (float)0; var menu = new Gtk.Menu(); string arrows[4] = {"none", "fromto", "tofrom", "both"}; _conn_arrow = new Image.from_surface( Connection.make_arrow_icon( "fromto" ) ); foreach (string arrow in arrows) { var img = new Image.from_surface( Connection.make_arrow_icon( arrow ) ); var mi = new Gtk.MenuItem(); mi.activate.connect(() => { _da.undo_buffer.add_item( new UndoStyleConnectionArrow( _affects, arrow, _da ) ); _conn_arrow.surface = img.surface; }); mi.add( img ); menu.add( mi ); } menu.show_all(); var mb = new MenuButton(); mb.add( _conn_arrow ); mb.popup = menu; box.pack_start( lbl, false, true ); box.pack_end( mb, false, true ); return( box ); } /* Create widget for handling the width of a connection */ private Box create_connection_width_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Line Width" ) ); lbl.xalign = (float)0; _conn_width = new Scale.with_range( Orientation.HORIZONTAL, 1, 8, 1 ); _conn_width.draw_value = false; for( int i=2; i<=8; i++ ) { if( (i % 2) == 0 ) { _conn_width.add_mark( i, PositionType.BOTTOM, "%d".printf( i ) ); } else { _conn_width.add_mark( i, PositionType.BOTTOM, null ); } } _conn_width.change_value.connect( connection_width_changed ); _conn_width.button_release_event.connect( connection_width_released ); box.pack_start( lbl, false, true ); box.pack_end( _conn_width, false, true ); return( box ); } /* Called whenever the user changes the link width value */ private bool connection_width_changed( ScrollType scroll, double value ) { if( value > 8 ) value = 8; var width = new UndoStyleConnectionWidth( _affects, (int)value, _da ); if( _change_add ) { _da.undo_buffer.add_item( width ); _change_add = false; } else { _da.undo_buffer.replace_item( width ); } return( false ); } private bool connection_width_released( EventButton e ) { _change_add = true; return( false ); } /* Allows the user to change the node padding */ private Box create_connection_padding_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); box.homogeneous = true; var lbl = new Label( _( "Padding" ) ); lbl.xalign = (float)0; _conn_padding = new Scale.with_range( Orientation.HORIZONTAL, 2, 10, 2 ); _conn_padding.draw_value = true; _conn_padding.change_value.connect( connection_padding_changed ); _conn_padding.button_release_event.connect( connection_padding_released ); box.pack_start( lbl, false, true ); box.pack_end( _conn_padding, false, true ); return( box ); } /* Called whenever the node margin value is changed */ private bool connection_padding_changed( ScrollType scroll, double value ) { if( (int) value > 20 ) { return( false ); } var padding = new UndoStyleConnectionPadding( _affects, (int)value, _da ); if( _change_add ) { _da.undo_buffer.add_item( padding ); _change_add = false; } else { _da.undo_buffer.replace_item( padding ); } return( false ); } private bool connection_padding_released( EventButton e ) { _change_add = true; return( false ); } /* Creates the node font selector */ private Box create_connection_font_ui() { var box = new Box( Orientation.HORIZONTAL, 0 ); var lbl = new Label( _( "Font" ) ); lbl.xalign = (float)0; _conn_font = new FontButton(); _conn_font.use_font = true; _conn_font.font_set.connect(() => { var family = _conn_font.get_font_family().get_name(); var size = _conn_font.get_font_size(); _da.undo_buffer.add_item( new UndoStyleConnectionFont( _affects, family, size, _da ) ); }); box.pack_start( lbl, false, true ); box.pack_end( _conn_font, false, true ); return( box ); } /* Sets the affects value and save the change to the settings */ private void set_affects( StyleAffects affects ) { _affects = affects; _affects_label.label = affects.label(); switch( _affects ) { case StyleAffects.ALL : update_ui_with_style( styles.get_global_style() ); _branch_group.visible = true; _link_group.visible = true; _node_group.visible = true; _conn_group.visible = true; _conn_exp.expanded = _settings.get_boolean( "style-connection-options-expanded" ); break; case StyleAffects.LEVEL0 : case StyleAffects.LEVEL1 : case StyleAffects.LEVEL2 : case StyleAffects.LEVEL3 : case StyleAffects.LEVEL4 : case StyleAffects.LEVEL5 : case StyleAffects.LEVEL6 : case StyleAffects.LEVEL7 : case StyleAffects.LEVEL8 : case StyleAffects.LEVEL9 : update_ui_with_style( styles.get_style_for_level( _affects.level(), null ) ); _branch_group.visible = true; _link_group.visible = (_affects != StyleAffects.LEVEL0); _node_group.visible = true; _conn_group.visible = false; break; case StyleAffects.CURRENT : var node = _da.get_current_node(); var conn = _da.get_current_connection(); if( node != null ) { update_ui_with_style( node.style ); _branch_group.visible = true; _link_group.visible = true; _node_group.visible = true; _conn_group.visible = false; } else if( conn != null ) { update_ui_with_style( conn.style ); _branch_group.visible = false; _link_group.visible = false; _node_group.visible = false; _conn_group.visible = true; _conn_exp.expanded = true; } break; case StyleAffects.CURRTREE : update_ui_with_style( _da.get_current_node().get_root().style ); _branch_group.visible = true; _link_group.visible = true; _node_group.visible = true; _conn_group.visible = false; break; case StyleAffects.CURRSUBTREE : update_ui_with_style( _da.get_current_node().style ); _branch_group.visible = true; _link_group.visible = true; _node_group.visible = true; _conn_group.visible = false; break; } } /* Checks the nodes in the given tree at the specified level to see if there are any non-leaf nodes */ private bool check_level_for_branches( Node node, int levels, int level ) { if( (levels & (1 << level)) != 0 ) { return( !node.is_leaf() ); } else { for( int i=0; i */ using Gtk; public class Styles { private class StyleLevel { public Style style { set; get; default = new Style(); } public bool isset { set; get; default = false; } } private static Array _link_types; private static Array _link_dashes; private static Array _node_borders; private Array _styles; /* Default constructor */ public Styles() { /* Create the link types */ var lt_straight = new LinkTypeStraight(); var lt_squared = new LinkTypeSquared(); var lt_curved = new LinkTypeCurved(); /* Add the link types to the list */ _link_types = new Array(); _link_types.append_val( lt_straight ); _link_types.append_val( lt_squared ); _link_types.append_val( lt_curved ); /* Create the link dashes */ var ld_solid = new LinkDash( "solid", _( "Solid" ), {} ); var ld_dotted = new LinkDash( "dotted", _( "Dotted" ), {2, 6} ); var ld_sdash = new LinkDash( "shortdash", _( "Short Dash" ), {6, 6} ); var ld_ldash = new LinkDash( "longdash", _( "Long Dash" ), {20, 6} ); /* Add the link dashes to the list */ _link_dashes = new Array(); _link_dashes.append_val( ld_solid ); _link_dashes.append_val( ld_dotted ); _link_dashes.append_val( ld_sdash ); _link_dashes.append_val( ld_ldash ); /* Create the node borders */ var nb_none = new NodeBorderNone(); var nb_underlined = new NodeBorderUnderlined(); var nb_bracketed = new NodeBorderBracket(); var nb_squared = new NodeBorderSquared(); var nb_rounded = new NodeBorderRounded(); var nb_pilled = new NodeBorderPill(); /* Add the node borders to the list */ _node_borders = new Array(); _node_borders.append_val( nb_none ); _node_borders.append_val( nb_underlined ); _node_borders.append_val( nb_bracketed ); _node_borders.append_val( nb_squared ); _node_borders.append_val( nb_rounded ); _node_borders.append_val( nb_pilled ); /* Allocate styles for each level */ _styles = new Array(); for( int i=0; i<=10; i++ ) { var level = new StyleLevel(); level.style.link_type = lt_straight; level.style.link_width = 4; level.style.link_arrow = false; level.style.link_dash = ld_solid; if( i == 0 ) { level.style.node_border = nb_rounded; } else { level.style.node_border = nb_underlined; } level.style.node_width = 200; level.style.node_borderwidth = 4; level.style.node_fill = false; level.style.node_margin = 8; level.style.node_padding = 6; level.style.node_markup = true; level.style.connection_dash = ld_dotted; level.style.connection_width = 2; level.style.connection_arrow = "fromto"; level.style.connection_padding = 3; _styles.append_val( level ); } } /* Loads the contents of the style templates */ public void load( Xml.Node* n ) { for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "style" ) { string? l = it->get_prop( "level" ); string? s = it->get_prop( "isset" ); if( l != null ) { int level = int.parse( l ); _styles.index( level ).style.load_node( it ); _styles.index( level ).style.load_connection( it ); _styles.index( level ).isset = (s != null) ? bool.parse( s ) : false; } } } } } /* Saves the style template information */ public void save( Xml.Node* parent ) { Xml.Node* node = new Xml.Node( null, "styles" ); for( int i=0; i<_styles.length; i++ ) { Xml.Node* n = new Xml.Node( null, "style" ); n->set_prop( "level", i.to_string() ); n->set_prop( "isset", _styles.index( i ).isset.to_string() ); _styles.index( i ).style.save_node_in_node( n ); _styles.index( i ).style.save_connection_in_node( n ); node->add_child( n ); } parent->add_child( node ); } /* Sets all nodes in the mind-map to the given link style */ public void set_all_to_style( Style style ) { for( int i=0; i<=10; i++ ) { _styles.index( i ).style.copy( style ); _styles.index( i ).isset = true; } } /* Sets all nodes at the specified levels to the given link style */ public void set_levels_to_style( int levels, Style style ) { for( int i=0; i<10; i++ ) { if( (levels & (1 << i)) != 0 ) { _styles.index( i ).style.copy( style ); _styles.index( i ).isset = true; } } } /* Returns the link type with the given name */ public LinkType? get_link_type( string name ) { for( int i=0; i<_link_types.length; i++ ) { var link_type = _link_types.index( i ); if( link_type.name() == name ) { return( link_type ); } } return( null ); } /* Returns the list of available link types */ public Array get_link_types() { return( _link_types ); } /* Returns the link dash with the given name */ public LinkDash? get_link_dash( string name ) { for( int i=0; i<_link_dashes.length; i++ ) { var link_dash = _link_dashes.index( i ); if( link_dash.name == name ) { return( link_dash ); } } return( null ); } /* Returns the list of available link dashes */ public Array get_link_dashes() { return( _link_dashes ); } /* Returns the node border with the given name */ public NodeBorder? get_node_border( string name ) { for( int i=0; i<_node_borders.length; i++ ) { var node_border = _node_borders.index( i ); if( node_border.name() == name ) { return( node_border ); } } return( null ); } /* Return the list of available node borders */ public Array get_node_borders() { return( _node_borders ); } /* Returns the style for the given level */ public Style get_style_for_level( uint level, Style? alternative ) { var slevel = _styles.index( (level > 9) ? 9 : level ); return( (slevel.isset || (alternative == null)) ? slevel.style : alternative ); } /* Returns the global style */ public Style get_global_style() { return( _styles.index( 10 ).style ); } } Minder-1.5.1/src/Theme.vala000066400000000000000000000305701356632107200154440ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Gee; public class Theme : Object { private HashMap _colors; public string name { set; get; } public int index { set; get; default = 0; } public bool prefer_dark { set; get; default = false; } public bool custom { protected set; get; default = true; } public bool temporary { set; get; default = false; } /* Default constructor */ public Theme() { _colors = new HashMap(); _colors.set( "background", null ); _colors.set( "foreground", null ); _colors.set( "root_background", null ); _colors.set( "root_foreground", null ); _colors.set( "nodesel_background", null ); _colors.set( "nodesel_foreground", null ); _colors.set( "textsel_background", null ); _colors.set( "textsel_foreground", null ); _colors.set( "text_cursor", null ); _colors.set( "attachable", null ); _colors.set( "connection", null ); _colors.set( "link_color0", null ); _colors.set( "link_color1", null ); _colors.set( "link_color2", null ); _colors.set( "link_color3", null ); _colors.set( "link_color4", null ); _colors.set( "link_color5", null ); _colors.set( "link_color6", null ); _colors.set( "link_color7", null ); } /* Copy constructor */ public Theme.from_theme( Theme theme ) { copy( theme ); } /* Copies the given theme to this theme */ public void copy( Theme theme ) { name = theme.name; index = theme.index; prefer_dark = theme.prefer_dark; custom = theme.custom; temporary = theme.temporary; _colors = new HashMap(); var it = theme._colors.map_iterator(); while( it.next() ) { _colors.set( (string)it.get_key(), (RGBA)it.get_value() ); } } /* Returns the list of stored theme names */ public Array colors() { var cs = new Array(); var it = _colors.map_iterator(); while( it.next() ) { var name = (string)it.get_key(); cs.append_val( name ); } return( cs ); } /* Returns true if the given theme matches the current theme */ public bool matches( Theme theme ) { if( name == theme.name ) { if( custom ) { var it = _colors.map_iterator(); while( it.next() ) { var key = it.get_key(); if( !_colors.get( key ).equal( theme._colors.get( key ) ) ) { return( false ); } } return( prefer_dark == theme.prefer_dark ); } return( true ); } return( false ); } /* Adds the given color to the list of link colors */ public bool set_color( string name, RGBA color ) { if( _colors.has_key( name ) ) { _colors.set( name, color ); return( true ); } return( false ); } /* Returns the given color */ public RGBA? get_color( string name ) { if( _colors.has_key( name ) ) { return( _colors.get( name ) ); } return( null ); } /* Returns the next available link color index */ public RGBA? next_color() { return( link_color( index++ % 8 ) ); } /* Returns the number of link colors */ public static int num_link_colors() { return( 8 ); } /* Returns the color associated with the given index */ public RGBA link_color( int index ) { return( _colors.get( "link_color%d".printf( index % 8 ) ) ); } /* Searches the stored link colors for one that matches the given color. If a match is found, returns the index of the stored color. If no match was found, returns -1. */ public int get_color_index( RGBA color ) { string color_str = color.to_string(); for( int i=0; i<8; i++ ) { RGBA? lc = link_color( i ); if( (lc != null) && (lc.to_string() == color_str) ) { return( i ); } } return( -1 ); } /* Returns the RGBA color for the given color value */ protected RGBA color_from_string( string value ) { RGBA c = {1.0, 1.0, 1.0, 1.0}; c.parse( value ); return( c ); } /* Returns the CSS provider for this theme */ public CssProvider get_css_provider() { CssProvider provider = new CssProvider(); try { var css_data = "@define-color colorPrimary #603461; " + "@define-color textColorPrimary @SILVER_100; " + "@define-color colorAccent #603461; " + ".theme-selected { background: #087DFF; } " + ".canvas { background: " + get_color( "background" ).to_string() + "; }"; provider.load_from_data( css_data ); } catch( GLib.Error e ) { stdout.printf( "Unable to load background color: %s", e.message ); } return( provider ); } /* Sets the context color based on the theme RGBA color */ private void set_context_color( Cairo.Context ctx, RGBA color ) { ctx.set_source_rgba( color.red, color.green, color.blue, color.alpha ); } /* Parses the specified XML node for theme coloring information */ public void load( Xml.Node* n ) { string? nn = n->get_prop( "name" ); if( nn != null ) { name = nn; } string? idx = n->get_prop( "index" ); if( idx != null ) { index = int.parse( idx ); } var cs = colors(); for( int i=0; iget_prop( name ); if( s != null ) { set_color( name, color_from_string( s ) ); } } string? d = n->get_prop( "prefer_dark" ); if( d != null ) { prefer_dark = bool.parse( d ); } } /* Returns an XML node containing the contents of this theme color scheme */ public Xml.Node* save() { Xml.Node* n = new Xml.Node( null, "theme" ); n->new_prop( "name", name ); n->new_prop( "index", index.to_string() ); if( custom ) { var cs = colors(); for( int i=0; inew_prop( name, Utils.color_from_rgba( get_color( name ) ) ); } n->new_prop( "prefer_dark", prefer_dark.to_string() ); } return( n ); } /* Creates the icon representation based on the theme's colors */ public Cairo.Surface make_icon() { Cairo.ImageSurface surface = new Cairo.ImageSurface( Cairo.Format.ARGB32, 200, 100 ); Cairo.Context ctx = new Cairo.Context( surface ); int width, height; var font_desc = new Pango.FontDescription(); font_desc.set_family( "Sans" ); font_desc.set_size( 10 * Pango.SCALE ); /* Draw the background */ set_context_color( ctx, get_color( "background" ) ); ctx.rectangle( 0, 0, 200, 100 ); ctx.fill(); /* Draw subnode lines */ set_context_color( ctx, link_color( 0 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 50, 25 ); ctx.stroke(); set_context_color( ctx, link_color( 0 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 50, 25 ); ctx.line_to( 10, 25 ); ctx.stroke(); set_context_color( ctx, link_color( 1 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 10, 50 ); ctx.stroke(); set_context_color( ctx, link_color( 2 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 50, 75 ); ctx.stroke(); set_context_color( ctx, link_color( 2 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 50, 75 ); ctx.line_to( 10, 75 ); ctx.stroke(); set_context_color( ctx, link_color( 3 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 150, 25 ); ctx.stroke(); set_context_color( ctx, link_color( 3 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 150, 25 ); ctx.line_to( 190, 25 ); ctx.stroke(); set_context_color( ctx, link_color( 4 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 190, 50 ); ctx.stroke(); set_context_color( ctx, link_color( 5 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 100, 50 ); ctx.line_to( 150, 75 ); ctx.stroke(); set_context_color( ctx, link_color( 5 ) ); ctx.set_line_cap( Cairo.LineCap.ROUND ); ctx.set_line_width( 4 ); ctx.move_to( 150, 75 ); ctx.line_to( 190, 75 ); ctx.stroke(); /* Create root node text */ var root_text = Pango.cairo_create_layout( ctx ); root_text.set_font_description( font_desc ); root_text.set_width( 70 * Pango.SCALE ); root_text.set_wrap( Pango.WrapMode.WORD_CHAR ); root_text.set_text( name, -1 ); root_text.get_pixel_size( out width, out height ); height += 4; /* Draw root node */ double r = 4; double x = 65; double y = (100 - height) / 2; double w = 70; double h = height; set_context_color( ctx, get_color( "root_background" ) ); ctx.set_line_width( 1 ); ctx.move_to(x+r,y); ctx.line_to(x+w-r,y); ctx.curve_to(x+w,y,x+w,y,x+w,y+r); ctx.line_to(x+w,y+h-r); ctx.curve_to(x+w,y+h,x+w,y+h,x+w-r,y+h); ctx.line_to(x+r,y+h); ctx.curve_to(x,y+h,x,y+h,x,y+h-r); ctx.line_to(x,y+r); ctx.curve_to(x,y,x,y,x+r,y); ctx.fill(); /* Create non-root node text */ var node_text = Pango.cairo_create_layout( ctx ); node_text.set_font_description( font_desc ); node_text.set_width( 40 * Pango.SCALE ); node_text.set_wrap( Pango.WrapMode.WORD_CHAR ); node_text.set_text( "Node", -1 ); /* Add the text */ set_context_color( ctx, get_color( "root_foreground" ) ); ctx.move_to( (100 - (width / 2)), (50 - (height / 2)) ); Pango.cairo_show_layout( ctx, root_text ); node_text.get_size( out width, out height ); width /= Pango.SCALE; height /= Pango.SCALE; set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (30 - (width / 2)), (25 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (30 - (width / 2)), (50 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (30 - (width / 2)), (75 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (170 - (width / 2)), (25 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (170 - (width / 2)), (50 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); set_context_color( ctx, get_color( "foreground" ) ); ctx.move_to( (170 - (width / 2)), (75 - (height + 2)) ); Pango.cairo_show_layout( ctx, node_text ); /* Draw connection */ set_context_color( ctx, get_color( "connection" ) ); double p[6] = {60, 15, 100, 5, 140, 15}; ctx.set_line_width( 2 ); ctx.set_dash( {3, 5}, 0 ); ctx.move_to( p[0], p[1] ); ctx.curve_to( (((2.0 / 3.0) * p[2]) + ((1.0 / 3.0) * p[0])), (((2.0 / 3.0) * p[3]) + ((1.0 / 3.0) * p[1])), (((2.0 / 3.0) * p[2]) + ((1.0 / 3.0) * p[4])), (((2.0 / 3.0) * p[3]) + ((1.0 / 3.0) * p[5])), p[4], p[5] ); ctx.stroke(); Connection.draw_arrow( ctx, 2, p[0], p[1], p[2], p[3], 7 ); Connection.draw_arrow( ctx, 2, p[4], p[5], p[2], p[3], 7 ); return( surface ); } } Minder-1.5.1/src/ThemeEditor.vala000066400000000000000000000200621356632107200166060ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Gee; public class ThemeEditor : Gtk.Box { private MainWindow _win; private Theme _theme; private Theme _orig_theme; private bool _edit; private Entry _name; private HashMap _btns; private Switch _prefer_dark; private Revealer _delrev; public ThemeEditor( MainWindow win ) { Object( orientation:Orientation.VERTICAL, spacing:10 ); _win = win; _btns = new HashMap(); /* Add title */ var title = new Label( Utils.make_title( _( "Customize Theme" ) + "\n" ) ); title.use_markup = true; pack_start( title, false, true ); /* Add name label */ var nbox = new Box( Orientation.HORIZONTAL, 10 ); var nlbl = new Label( Utils.make_title( _( "Name" ) + ":" ) ); nlbl.xalign = (float)0; nlbl.use_markup = true; _name = new Entry(); _name.focus_out_event.connect((e) => { if( !_edit || (_name.text != _orig_theme.name) ) { _name.text = _win.themes.uniquify_name( _name.text ); } return( false ); }); nbox.pack_start( nlbl, false, false ); nbox.pack_start( _name, true, true ); pack_start( nbox, false, true ); /* Create scrollable options grid */ var sw = new ScrolledWindow( null, null ); var vp = new Viewport( null, null ); vp.set_size_request( 180, 600 ); sw.add( vp ); pack_start( sw, true, true ); /* Add theme options to grid */ var grid = new Grid(); grid.row_spacing = 5; grid.column_spacing = 30; grid.border_width = 5; vp.add( grid ); var color_lbl = new Label( Utils.make_title( _( "Base Colors" ) + "\n" ) ); color_lbl.xalign = (float)0; color_lbl.use_markup = true; grid.attach( color_lbl, 0, 0, 2 ); add_color( _( "Background" ), "background", grid, 1 ); add_color( _( "Foreground" ), "foreground", grid, 2 ); add_color( _( "Root Node Background" ), "root_background", grid, 3 ); add_color( _( "Root Node Foreground" ), "root_foreground", grid, 4 ); add_color( _( "Node Select Background" ), "nodesel_background", grid, 5 ); add_color( _( "Node Select Foreground" ), "nodesel_foreground", grid, 6 ); add_color( _( "Text Select Background" ), "textsel_background", grid, 7 ); add_color( _( "Text Select Foreground" ), "textsel_foreground", grid, 8 ); add_color( _( "Text Cursor" ), "text_cursor", grid, 9 ); add_color( _( "Attachable Highlight" ), "attachable", grid, 10 ); add_color( _( "Connection Color" ), "connection", grid, 11 ); grid.attach( new Label( "" ), 0, 12 ); var dark_lbl = new Label( Utils.make_title( _( "Prefer Dark Mode" ) ) ); dark_lbl.xalign = (float)0; dark_lbl.use_markup = true; _prefer_dark = new Switch(); _prefer_dark.button_release_event.connect((e) => { _theme.prefer_dark = !_theme.prefer_dark; _win.get_current_da().set_theme( _theme, true ); return( false ); }); grid.attach( dark_lbl, 0, 13 ); grid.attach( _prefer_dark, 1, 13 ); grid.attach( new Label( "" ), 0, 14 ); var link_lbl = new Label( Utils.make_title( _( "Link Colors" ) + "\n" ) ); link_lbl.xalign = (float)0; link_lbl.use_markup = true; grid.attach( link_lbl, 0, 15, 2 ); /* Add link colors */ for( int i=0; i { _theme.set_color( name, btn.rgba ); _win.get_current_da().set_theme( _theme, true ); }); _btns.set( name, btn ); grid.attach( lbl, 0, row ); grid.attach( btn, 1, row, 2 ); } /* This should be called prior to editing a theme */ public void initialize( Theme theme, bool edit ) { /* Initialize class variables */ _orig_theme = theme; _edit = edit; _theme = new Theme.from_theme( theme ); /* Figure out a unique name for the new theme */ if( !edit ) { _theme.name = _win.themes.uniquify_name( _( "Custom" ) + " #1" ); } /* Initialize the UI */ var colors = _theme.colors(); for( int i=0; i */ using Gtk; using GLib; using Gee; public class Themes : Object { private Array _themes; public virtual signal void themes_changed() { save_custom(); } /* Default constructor */ public Themes() { /* Allocate memory for the themes array */ _themes = new Array(); /* Create the themes */ var default_theme = new ThemeDefault(); var dark_theme = new ThemeDark(); var solarized_light_theme = new ThemeSolarizedLight(); var solarized_dark_theme = new ThemeSolarizedDark(); /* Add the themes to the list */ _themes.append_val( default_theme ); _themes.append_val( dark_theme ); _themes.append_val( solarized_light_theme ); _themes.append_val( solarized_dark_theme ); /* Load the customized themes */ load_custom(); } /* Returns a list of theme names */ public void names( ref Array names ) { for( int i=0; i<_themes.length; i++ ) { names.append_val( _themes.index( i ).name ); } } /* Returns a HashMap containing the list of stored names */ public void names_hash( ref HashMap names ) { for( int i=0; i<_themes.length; i++ ) { names.set( _themes.index( i ).name, 1 ); } } /* Returns a list of icons associated with each of the loaded themes */ public void icons( ref Array icons ) { for( int i=0; i<_themes.length; i++ ) { icons.append_val( new Image.from_surface( _themes.index( i ).make_icon() ) ); } } /* Returns true if the given theme currently exists */ public bool exists( Theme theme ) { for( int i=0; i<_themes.length; i++ ) { if( _themes.index( i ).matches( theme ) ) { return( true ); } } return( false ); } /* Returns the theme associated with the given name */ public Theme get_theme( string name ) { for( int i=0; i<_themes.length; i++ ) { if( name == _themes.index( i ).name ) { return( _themes.index( i ) ); } } return( _themes.index( 0 ) ); } /* Adds the given theme */ public void add_theme( Theme theme ) { _themes.append_val( theme ); themes_changed(); } /* Deletes the given theme */ public void delete_theme( string name ) { for( int i=0; i<_themes.length; i++ ) { if( _themes.index( i ).name == name ) { _themes.remove_index( i ); themes_changed(); return; } } } #if SKIP /* Output the current list of themes to standard output */ private void display_themes( string msg ) { stdout.printf( "%s\n", msg ); for( int i=0; i<_themes.length; i++ ) { stdout.printf( " %s\n", _themes.index( i ).name ); } } #endif /* Loads the custom themes from XML */ private void load_custom() { var themes = GLib.Path.build_filename( Environment.get_user_data_dir(), "minder", "custom_themes.xml" ); Xml.Doc* doc = Xml.Parser.parse_file( themes ); if( doc == null ) return; for( Xml.Node* it = doc->get_root_element()->children; it != null; it = it->next ) { if( (it->type == Xml.ElementType.ELEMENT_NODE) && (it->name == "theme") ) { var theme = new Theme(); theme.load( it ); _themes.append_val( theme ); } } delete doc; } /* Saves the custom themes to XML */ public void save_custom() { var dir = GLib.Path.build_filename( Environment.get_user_data_dir(), "minder" ); if( DirUtils.create_with_parents( dir, 0775 ) != 0 ) { return; } var fname = GLib.Path.build_filename( dir, "custom_themes.xml" ); Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* root = new Xml.Node( null, "themes" ); doc->set_root_element( root ); for( uint i=0; i<_themes.length; i++ ) { if( _themes.index( i ).custom && !_themes.index( i ).temporary ) { root->add_child( _themes.index( i ).save() ); } } /* Save the file */ doc->save_format_file( fname, 1 ); delete doc; } /* Returns a uniquified version of the given name */ public string uniquify_name( string name ) { var names = new HashMap(); var check = name; var index = 2; names_hash( ref names ); if( names.has_key( check ) ) { MatchInfo match_info; string n = name; try { var re = new Regex( "(.*)(\\d+)" ); if( re.match( name, 0, out match_info ) ) { index = int.parse( match_info.fetch( 2 ) ) + 1; n = match_info.fetch( 1 ); } else { n += " #"; } } catch( RegexError e ) { stdout.printf( "Error parsing regular expression\n" ); return ""; } do { check = n + "%d".printf( index++ ); } while( names.has_key( check ) ); } return( check ); } } Minder-1.5.1/src/UndoBuffer.vala000066400000000000000000000103451356632107200164370ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class UndoBuffer : Object { private DrawArea _da; private Array _undo_buffer; private Array _redo_buffer; private bool _debug = false; private static int _current_id = 0; public signal void buffer_changed( DrawArea da ); /* Default constructor */ public UndoBuffer( DrawArea da ) { _da = da; _undo_buffer = new Array(); _redo_buffer = new Array(); } /* Clear the undo/redo buffers */ public void clear() { _undo_buffer.remove_range( 0, _undo_buffer.length ); _redo_buffer.remove_range( 0, _redo_buffer.length ); buffer_changed( _da ); } /* Returns true if we can perform an undo action */ public bool undoable() { return( _undo_buffer.length > 0 ); } /* Returns true if we can perform a redo action */ public bool redoable() { return( _redo_buffer.length > 0 ); } /* Performs the next undo action in the buffer */ public void undo() { if( undoable() ) { UndoItem item = _undo_buffer.index( _undo_buffer.length - 1 ); item.undo( _da ); _undo_buffer.remove_index( _undo_buffer.length - 1 ); _redo_buffer.append_val( item ); buffer_changed( _da ); } output( "AFTER UNDO" ); } /* Performs the next redo action in the buffer */ public void redo() { if( redoable() ) { UndoItem item = _redo_buffer.index( _redo_buffer.length - 1 ); item.redo( _da ); _redo_buffer.remove_index( _redo_buffer.length - 1 ); _undo_buffer.append_val( item ); buffer_changed( _da ); } output( "AFTER REDO" ); } /* Returns the undo tooltip */ public string undo_tooltip() { if( _undo_buffer.length == 0 ) return( "" ); return( _( "Undo " ) + _undo_buffer.index( _undo_buffer.length - 1 ).name ); } /* Returns the undo tooltip */ public string redo_tooltip() { if( _redo_buffer.length == 0 ) return( "" ); return( _( "Redo " ) + _redo_buffer.index( _redo_buffer.length - 1 ).name ); } /* Adds a new undo item to the undo buffer. Clears the redo buffer. */ public void add_item( UndoItem item ) { item.id = _current_id++; _undo_buffer.append_val( item ); _redo_buffer.remove_range( 0, _redo_buffer.length ); buffer_changed( _da ); output( "ITEM ADDED" ); } /* Attempts to replace the last item in the undo buffer with the given item if both items are the same type; otherwise, the new item will just be added like any other item. */ public void replace_item( UndoItem item ) { item.id = _current_id++; if( _undo_buffer.length > 0 ) { UndoItem last = _undo_buffer.index( _undo_buffer.length - 1 ); if( (last.get_type() == item.get_type()) && last.matches( item ) ) { last.replace_with_item( item ); buffer_changed( _da ); output( "ITEM REPLACED" ); return; } } add_item( item ); } /* Outputs the state of the undo and redo buffers to standard output */ public void output( string msg = "BUFFER STATE" ) { if( _debug ) { stdout.printf( "%s\n Undo Buffer\n-----------\n", msg ); for( int i=0; i<_undo_buffer.length; i++ ) { stdout.printf( " %s\n", _undo_buffer.index( i ).to_string() ); } stdout.printf( " Redo Buffer\n-----------\n" ); for( int i=0; i<_redo_buffer.length; i++ ) { stdout.printf( " %s\n", _redo_buffer.index( i ).to_string() ); } } } } Minder-1.5.1/src/UndoItem.vala000066400000000000000000000031241356632107200161210ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class UndoItem : GLib.Object { public string name { set; get; default = ""; } public int id { set; get; default = -1; } /* Default constructor */ public UndoItem( string name ) { this.name = name; } /* Causes the stored item to be put into the before state */ public virtual void undo( DrawArea da ) {} /* Causes the stored item to be put into the after state */ public virtual void redo( DrawArea da ) {} /* Checks to see if the given undo item is "mergeable" with this one */ public virtual bool matches( UndoItem item ) { return( false ); } public virtual void replace_with_item( UndoItem item ) { /* Do nothing by default */ } public virtual string to_string() { return( "%s [%d]".printf( name, id ) ); } } Minder-1.5.1/src/Utils.vala000066400000000000000000000071151356632107200155010ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; using Cairo; public class Utils { /* Helper function for converting an RGBA color value to a stringified color that can be used by a markup parser. */ public static string color_from_rgba( RGBA rgba ) { return( "#%02x%02x%02x".printf( (int)(rgba.red * 255), (int)(rgba.green * 255), (int)(rgba.blue * 255) ) ); } /* Sets the context source color to the given color value */ public static void set_context_color( Context ctx, RGBA color ) { ctx.set_source_rgba( color.red, color.green, color.blue, color.alpha ); } /* Sets the context source color to the given color value overriding the alpha value with the given value. */ public static void set_context_color_with_alpha( Context ctx, RGBA color, double alpha ) { ctx.set_source_rgba( color.red, color.green, color.blue, alpha ); } /* Adds the given accelerator label to the given menu item. */ public static void add_accel_label( Gtk.MenuItem item, uint key, Gdk.ModifierType mods ) { /* Convert the menu item to an accelerator label */ AccelLabel? label = item.get_child() as AccelLabel; if( label == null ) return; /* Add the accelerator to the label */ label.set_accel( key, mods ); label.refetch(); } /* Checks the given string to see if it is a match to the given pattern. If it is, the matching portion of the string appended to the list of matches. */ public static void match_string( string pattern, string value, string type, Node? node, Connection? conn, ref Gtk.ListStore matches ) { int index = value.casefold().index_of( pattern ); if( index != -1 ) { TreeIter it; int start_index = (index > 20) ? (index - 20) : 0; string prefix = (index > 20) ? "…" : ""; string str = prefix + value.substring( start_index, (index - start_index) ) + "" + value.substring( index, pattern.length ) + "" + value.substring( (index + pattern.length), -1 ); matches.append( out it ); matches.set( it, 0, type, 1, str, 2, node, 3, conn, -1 ); } } /* Returns true if the given coordinates are within the specified bounds */ public static bool is_within_bounds( double x, double y, double bx, double by, double bw, double bh ) { return( (bx < x) && (x < (bx + bw)) && (by < y) && (y < (by + bh)) ); } /* Returns a string that is suitable to use as an inspector title */ public static string make_title( string str ) { return( "" + str + "" ); } /* Returns a string that is used to display a tooltip with displayed accelerator */ public static string tooltip_with_accel( string tooltip, string accel ) { return( "%s (%s)".printf( tooltip, accel ) ); } } Minder-1.5.1/src/animator/000077500000000000000000000000001356632107200153425ustar00rootroot00000000000000Minder-1.5.1/src/animator/AnimatorAction.vala000066400000000000000000000036771356632107200211340ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public enum AnimationType { UNKNOWN = 0, NODES, NODE, PAN, SCALE, PANSCALE } /* Base class that allows multiple animation objects to be stored in the animator class. */ public class AnimatorAction : Object { protected string _name; protected int _id; protected static int _next_id = 0; protected int index { set; get; default = 0; } protected double frames { private set; get; default = 10; } /* Default constructor */ public AnimatorAction( string name ) { _name = name; _id = _next_id++; } /* Returns the name of this action for debug purposes */ public string name() { return( _name + "-" + _id.to_string() ); } /* Returns true if this animation action is complete */ public bool done() { return( index > frames ); } /* Returns the animation type */ public virtual AnimationType type() { return( AnimationType.UNKNOWN ); } /* Captures the end state */ public virtual void capture( DrawArea da ) {} /* Adjusts the animation by one frame. Returns true if the action is complete. */ public virtual void adjust( DrawArea da ) {} } Minder-1.5.1/src/animator/AnimatorNodes.vala000066400000000000000000000037211356632107200207550ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class AnimatorNodes : AnimatorAction { private Node? _node = null; private AnimatorPositions? _pos = null; /* Default constructor */ public AnimatorNodes( DrawArea da, Node? n = null, string name = "unnamed" ) { base( name ); _node = n; _pos = new AnimatorPositions( da, n ); } /* Returns the NODES types */ public override AnimationType type() { return( (_node == null) ? AnimationType.NODES : AnimationType.NODE ); } /* Captures the end state */ public override void capture( DrawArea da ) { _pos.gather_new_positions(); } /* Adjusts all of the node positions for the given frame */ public override void adjust( DrawArea da ) { double divisor = index / frames; index++; for( int i=0; i<_pos.length(); i++ ) { double dx = _pos.new_x( i ) - _pos.old_x( i ); double dy = _pos.new_y( i ) - _pos.old_y( i ); double x = _pos.old_x( i ) + (dx * divisor); double y = _pos.old_y( i ) + (dy * divisor); _pos.node( i ).posx = x; _pos.node( i ).posy = y; _pos.node( i ).side = _pos.node( i ).layout.get_side( _pos.node( i ) ); } } } Minder-1.5.1/src/animator/AnimatorPan.vala000066400000000000000000000034161356632107200204240ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class AnimatorPan : AnimatorAction { private double? _sox = null; // Starting x-origin private double? _soy = null; // Starting y-origin private double? _eox = null; // Ending x-origin private double? _eoy = null; // Ending y-origin /* Constructor for a pan change */ public AnimatorPan( DrawArea da, string name ) { base( name ); da.get_origin( out _sox, out _soy ); } /* Returns the NODES types */ public override AnimationType type() { return( AnimationType.PAN ); } /* User method which performs the animation */ public override void capture( DrawArea da ) { da.get_origin( out _eox, out _eoy ); } /* Adjusts the origin for the given frame */ public override void adjust( DrawArea da ) { double divisor = index / frames; index++; double origin_x = _sox + ((_eox - _sox) * divisor); double origin_y = _soy + ((_eoy - _soy) * divisor); da.set_origin( origin_x, origin_y ); } } Minder-1.5.1/src/animator/AnimatorPanScale.vala000066400000000000000000000040551356632107200213740ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class AnimatorPanScale : AnimatorAction { private double? _sox = null; // Starting x-origin private double? _soy = null; // Starting y-origin private double? _eox = null; // Ending x-origin private double? _eoy = null; // Ending y-origin private double? _sscale = null; // Starting scaling factor private double? _escale = null; // Ending scaling factor /* Constructor for a pan change */ public AnimatorPanScale( DrawArea da, string name ) { base( name ); da.get_origin( out _sox, out _soy ); _sscale = da.sfactor; } /* Returns the NODES types */ public override AnimationType type() { return( AnimationType.PANSCALE ); } /* User method which performs the animation */ public override void capture( DrawArea da ) { da.get_origin( out _eox, out _eoy ); _escale = da.sfactor; } /* Adjusts the origin for the given frame */ public override void adjust( DrawArea da ) { double divisor = index / frames; index++; double origin_x = _sox + ((_eox - _sox) * divisor); double origin_y = _soy + ((_eoy - _soy) * divisor); double sf = _sscale + ((_escale - _sscale) * divisor); da.sfactor = sf; da.set_origin( origin_x, origin_y ); } } Minder-1.5.1/src/animator/AnimatorPositions.vala000066400000000000000000000056461356632107200217040ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; /* Helper class to the Animator class. This class should not be accessed outside of this file. */ public class AnimatorPositions : Object { private Array _old_x; private Array _old_y; private Array _new_x; private Array _new_y; private Array _node; /* Default constructor */ public AnimatorPositions( DrawArea da, Node? n ) { _old_x = new Array(); _old_y = new Array(); _new_x = new Array(); _new_y = new Array(); _node = new Array(); if( n == null ) { for( int i=0; i */ using GLib; public class AnimatorScale : AnimatorAction { private double? _sscale = null; // Starting scaling factor private double? _escale = null; // Ending scaling factor /* Constructor for a scale change */ public AnimatorScale( DrawArea da, string name ) { base( name ); _sscale = da.sfactor; } /* Returns the NODES types */ public override AnimationType type() { return( AnimationType.SCALE ); } /* User method which performs the animation */ public override void capture( DrawArea da ) { _escale = da.sfactor; } /* Adjusts scaling factor for the given frame */ public override void adjust( DrawArea da ) { double divisor = index / frames; index++; double sf = _sscale + ((_escale - _sscale) * divisor); da.set_scaling_factor( sf ); } } Minder-1.5.1/src/exports/000077500000000000000000000000001356632107200152345ustar00rootroot00000000000000Minder-1.5.1/src/exports/ExportCSV.vala000066400000000000000000000100411356632107200177320ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class ExportCSV : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { var file = File.new_for_path( fname ); bool retval = true; try { var os = file.create( FileCreateFlags.PRIVATE ); int levels = levels( da ); export_levels( os, levels ); export_top_nodes( os, da, levels ); } catch( Error e ) { retval = false; } return( retval ); } private static void export_levels( FileOutputStream os, int levels ) { try { string str = "level0"; for( int i=1; i max_levels ) { max_levels = levels; } } return( max_levels ); } private static int child_levels( Node node ) { var children = node.children(); int max_levels = 0; for( int i=0; i max_levels ) { max_levels = levels; } } return( max_levels + 1 ); } /* Convert the given string to one that is valid for CSV files */ private static string stringify( string val ) { /* Strip and double-quotes found */ string newval = val.replace( "\"", "" ); /* If the value contains any comma characters, quote the entire string */ if( newval.index_of( "," ) != -1 ) { return( "\"" + newval + "\"" ); } return( newval ); } /* Draws each of the top-level nodes */ private static void export_top_nodes( FileOutputStream os, DrawArea da, int levels ) { try { var nodes = da.get_nodes(); for( int i=0; i */ using GLib; using Gdk; using Gee; public class ExportFreemind : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { Xml.Doc* doc = new Xml.Doc( "1.0" ); doc->set_root_element( export_map( da ) ); doc->save_format_file( fname, 1 ); delete doc; return( false ); } /* Generates the header for the document */ private static Xml.Node* export_map( DrawArea da ) { Xml.Node* map = new Xml.Node( null, "map" ); map->new_prop( "version", "1.0.1" ); map->add_child( new Xml.Node.comment( _( "Generated by Minder" ) + " " + Minder.version ) ); var nodes = da.get_nodes(); for( int i=0; iadd_child( export_node( nodes.index( i ), da ) ); } return( map ); } /* Exports the given node information */ private static Xml.Node* export_node( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "node" ); n->new_prop( "ID", "id_" + node.id().to_string() ); n->new_prop( "TEXT", node.name.text ); if( node.linked_node != null ) { n->new_prop( "LINK", "#id_" + node.linked_node.id().to_string() ); } n->new_prop( "FOLDED", node.folded.to_string() ); n->new_prop( "COLOR", Utils.color_from_rgba( node.link_color ) ); n->new_prop( "POSITION", ((node.side == NodeSide.LEFT) ? "left" : "right") ); n->add_child( export_edge( node, da ) ); n->add_child( export_font( node, da ) ); /* Add arrowlinks */ int index = 0; Connection? conn = null; while( (conn = da.get_connections().get_attached_connection( node, index++ )) != null ) { if( conn.from_node == node ) { n->add_child( export_arrowlink( conn, da ) ); } } /* Add nodes */ for( int i=0; iadd_child( export_node( node.children().index( i ), da ) ); } return( n ); } /* Exports the given node link as an edge */ private static Xml.Node* export_edge( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "edge" ); n->new_prop( "STYLE", (node.style.link_type.name() == "curved") ? "bezier" : "linear" ); n->new_prop( "COLOR", Utils.color_from_rgba( node.link_color ) ); n->new_prop( "WIDTH", node.style.link_width.to_string() ); return( n ); } /* Exports the given node font */ private static Xml.Node* export_font( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "font" ); n->new_prop( "NAME", node.style.node_font.get_family() ); n->new_prop( "SIZE", (node.style.node_font.get_size() / Pango.SCALE).to_string() ); n->new_prop( "BOLD", ((node.name.text.substring( 0, 3 ) == "") || (node.name.text.substring( 0, 6 ) == "")).to_string() ); n->new_prop( "ITALIC", ((node.name.text.substring( 0, 3 ) == "") || (node.name.text.substring( 0, 6 ) == "")).to_string() ); return( n ); } /* Exports the given connection as an arrowlink */ private static Xml.Node* export_arrowlink( Connection conn, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "arrowlink" ); n->new_prop( "COLOR", Utils.color_from_rgba( conn.color ) ); n->new_prop( "DESTINATION", "id_" + conn.to_node.id().to_string() ); n->new_prop( "STARTARROW", ((conn.style.connection_arrow == "none") || (conn.style.connection_arrow == "fromto")) ? "None" : "Default" ); n->new_prop( "ENDARROW", ((conn.style.connection_arrow == "none") || (conn.style.connection_arrow == "tofrom")) ? "None" : "Default" ); return( n ); } /* Reads the contents of an OPML file and creates a new document based on the stored information. */ public static bool import( string fname, DrawArea da ) { /* Read in the contents of the Freemind file */ var doc = Xml.Parser.parse_file( fname ); if( doc == null ) { return( false ); } /* Load the contents of the file */ import_map( da, doc->get_root_element() ); /* Update the drawing area */ da.queue_draw(); /* Delete the OPML document */ delete doc; return( true ); } /* Parses the OPML head block for information that we will use */ private static void import_map( DrawArea da, Xml.Node* n ) { var color_map = new HashMap(); var id_map = new HashMap(); var link_ids = new Array(); var to_nodes = new Array(); /* Not sure what to do with the version information */ string? v = n->get_prop( "version" ); if( v != null ) { /* Not sure what to do with this value */ } for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "node" ) { var root = import_node( it, da, null, color_map, id_map, link_ids, to_nodes ); da.get_nodes().append_val( root ); } } } /* Connect linked nodes */ for( int i=0; i color_map, HashMap id_map, Array link_ids, Array to_nodes ) { var node = new Node( da, da.layouts.get_default() ); /* Make sure the style has a default value */ node.style = StyleInspector.styles.get_style_for_level( ((parent == null) ? 0 : 1), null ); string? i = n->get_prop( "ID" ); if( i != null ) { id_map.set( i, node.id() ); } string? t = n->get_prop( "TEXT" ); if( t != null ) { node.name.text = t; } string? l = n->get_prop( "LINK" ); if( l != null ) { link_ids.append_val( NodeLinkInfo( l.substring( 1 ), node ) ); } string? f = n->get_prop( "FOLDED" ); if( f != null ) { node.folded = bool.parse( f ); } string? c = n->get_prop( "COLOR" ); if( c != null ) { if( color_map.has_key( c ) ) { node.link_color = color_map.get( c ); } else { node.link_color = da.get_theme().next_color(); color_map.set( c, node.link_color ); } } string? p = n->get_prop( "POSITION" ); if( p != null ) { node.side = (p == "left") ? NodeSide.LEFT : NodeSide.RIGHT; } /* Parse the child nodes */ for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "node" : import_node( it, da, node, color_map, id_map, link_ids, to_nodes ); break; case "edge" : import_edge( it, node ); break; case "font" : import_font( it, node ); break; case "icon" : break; // Not implemented case "cloud" : break; // Not implemented case "arrowlink" : import_arrowlink( it, da, node, to_nodes ); break; } } } /* Attach the new node to its parent */ if( parent != null ) { node.attach( parent, -1, da.get_theme() ); } return( node ); } private static void import_edge( Xml.Node* n, Node node ) { string? s = n->get_prop( "STYLE" ); if( s != null ) { switch( s ) { case "bezier" : node.style.link_type = new LinkTypeCurved(); break; case "linear" : node.style.link_type = new LinkTypeStraight(); break; } } string? c = n->get_prop( "COLOR" ); if( c != null ) { /* Not implemented - link color and node color must be the same */ } string? w = n->get_prop( "WIDTH" ); if( w != null ) { node.style.link_width = int.parse( w ); } } private static void import_font( Xml.Node* n, Node node ) { string? f = n->get_prop( "NAME" ); if( f != null ) { node.style.node_font.set_family( f ); } string? s = n->get_prop( "SIZE" ); if( s != null ) { node.style.node_font.set_size( int.parse( s ) * Pango.SCALE ); } string? b = n->get_prop( "BOLD" ); if( b != null ) { if( bool.parse( b ) ) { node.name.text = "" + node.name.text + ""; } } string? i = n->get_prop( "ITALIC" ); if( i != null ) { if( bool.parse( i ) ) { node.name.text = "" + node.name.text + ""; } } } private static void import_arrowlink( Xml.Node* n, DrawArea da, Node from_node, Array to_nodes ) { var conn = new Connection( da, from_node ); var start_arrow = "None"; var end_arrow = "None"; string? c = n->get_prop( "COLOR" ); if( c != null ) { /* Not implemented */ } string? d = n->get_prop( "DESTINATION" ); if( d != null ) { to_nodes.append_val( d ); } string? sa = n->get_prop( "STARTARROW" ); if( sa != null ) { start_arrow = sa; } string? ea = n->get_prop( "ENDARROW" ); if( ea != null ) { end_arrow = ea; } /* Stylize the arrow */ switch( start_arrow + end_arrow ) { case "NoneNone" : conn.style.connection_arrow = "none"; break; case "NoneDefault" : conn.style.connection_arrow = "fromto"; break; case "DefaultNone" : conn.style.connection_arrow = "tofrom"; break; case "DefaultDefault" : conn.style.connection_arrow = "both"; break; } /* Add the connection to the connections list */ da.get_connections().add_connection( conn ); } } Minder-1.5.1/src/exports/ExportFreeplane.vala000066400000000000000000000407461356632107200212170ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; using Gdk; using Gee; using Xml; public class ExportFreeplane : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { Xml.Doc* doc = new Xml.Doc( "1.0" ); doc->set_root_element( export_map( da ) ); doc->save_format_file( fname, 1 ); delete doc; return( false ); } /* Generates the header for the document */ private static Xml.Node* export_map( DrawArea da ) { Xml.Node* map = new Xml.Node( null, "map" ); map->new_prop( "version", "1.0.1" ); map->add_child( new Xml.Node.comment( _( "Generated by Minder" ) + " " + Minder.version ) ); var nodes = da.get_nodes(); for( int i=0; iadd_child( export_node( nodes.index( i ), da ) ); } return( map ); } /* Returns true if the given node contains any markup that should be output as richcontent */ private static bool node_contains_markup( Node node, bool note ) { if( node.name.markup ) { string str = note ? node.note : node.name.text; return( Regex.match_simple( """<(span.*|b|big|i|s|sub|sup|small|tt|u)>""", str ) || Regex.match_simple( """^\s*$""", str, RegexCompileFlags.MULTILINE ) ); } return( false ); } /* Exports the given node information */ private static Xml.Node* export_node( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "node" ); bool markup = node_contains_markup( node, false ); n->new_prop( "ID", "id_" + node.id().to_string() ); if( node.linked_node != null ) { n->new_prop( "LINK", "#id_" + node.linked_node.id().to_string() ); } n->new_prop( "FOLDED", node.folded.to_string() ); n->new_prop( "POSITION", ((node.side == NodeSide.LEFT) ? "left" : "right") ); if( !markup ) { n->new_prop( "TEXT", node.name.text ); } else { n->add_child( export_richcontent( node, da, false ) ); } if( node.style.node_fill ) { n->new_prop( "BACKGROUND_COLOR", Utils.color_from_rgba( node.link_color ) ); } n->add_child( export_edge( node, da ) ); n->add_child( export_font( node, da ) ); if( node.note != "" ) { n->add_child( export_richcontent( node, da, true ) ); } /* Add arrowlinks */ int index = 0; Connection? conn = null; while( (conn = da.get_connections().get_attached_connection( node, index++ )) != null ) { if( conn.from_node == node ) { n->add_child( export_arrowlink( conn, da ) ); } } /* Add hook if we have an image */ if( node.image != null ) { n->add_child( export_hook( node, da ) ); } /* Add nodes */ for( int i=0; iadd_child( export_node( node.children().index( i ), da ) ); } return( n ); } /* Exports the given node link as an edge */ private static Xml.Node* export_edge( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "edge" ); n->new_prop( "STYLE", (node.style.link_type.name() == "curved") ? "bezier" : "linear" ); n->new_prop( "COLOR", Utils.color_from_rgba( node.link_color ) ); n->new_prop( "WIDTH", node.style.link_width.to_string() ); return( n ); } /* Exports the given node font */ private static Xml.Node* export_font( Node node, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "font" ); n->new_prop( "NAME", node.style.node_font.get_family() ); n->new_prop( "SIZE", (node.style.node_font.get_size() / Pango.SCALE).to_string() ); n->new_prop( "BOLD", ((node.name.text.substring( 0, 3 ) == "") || (node.name.text.substring( 0, 6 ) == "")).to_string() ); n->new_prop( "ITALIC", ((node.name.text.substring( 0, 3 ) == "") || (node.name.text.substring( 0, 6 ) == "")).to_string() ); return( n ); } /* Exports the given connection as an arrowlink */ private static Xml.Node* export_arrowlink( Connection conn, DrawArea da ) { Xml.Node* n = new Xml.Node( null, "arrowlink" ); n->new_prop( "COLOR", Utils.color_from_rgba( conn.color ) ); n->new_prop( "DESTINATION", "id_" + conn.to_node.id().to_string() ); n->new_prop( "STARTARROW", ((conn.style.connection_arrow == "none") || (conn.style.connection_arrow == "fromto")) ? "None" : "Default" ); n->new_prop( "ENDARROW", ((conn.style.connection_arrow == "none") || (conn.style.connection_arrow == "tofrom")) ? "None" : "Default" ); return( n ); } private static Xml.Node* export_richcontent( Node node, DrawArea da, bool note ) { string text = note ? node.note : node.name.text; Xml.Node* rc = new Xml.Node( null, "richcontent" ); rc->new_prop( "TYPE", (note ? "NOTE" : "NODE") ); Xml.Node* html = new Xml.Node( null, "html" ); Xml.Node* head = new Xml.Node( null, "head" ); Xml.Node* body = new Xml.Node( null, "body" ); var str = ""; foreach( string line in text.split( "\n" ) ) { if( Regex.match_simple( """^\s*$""", line ) ) { body->new_text_child( null, "p", str ); str = ""; } else if( Regex.match_simple( """^\s+""", line ) ) { var i = 0; while( line.get_char( i ) == ' ' ) { str += " "; i++; } str += line.substring( i ); } else { str += line; } } body->new_text_child( null, "p", str ); html->add_child( head ); html->add_child( body ); rc->add_child( html ); return( rc ); } /* Used to output a node image */ private static Xml.Node* export_hook( Node node, DrawArea da ) { Xml.Node* hook = new Xml.Node( null, "hook" ); var uri = da.image_manager.get_uri( node.image.id ); var scale = (node.image.width * 1.0) / node.image.crop_w; hook->new_prop( "URI", uri ); hook->new_prop( "SIZE", scale.to_string() ); hook->new_prop( "NAME", "ExternalObject" ); return( hook ); } /* Reads the contents of an OPML file and creates a new document based on the stored information. */ public static bool import( string fname, DrawArea da ) { var ifile = File.new_for_path( Path.get_dirname( fname ) ); /* Read in the contents of the Freemind file */ var doc = Xml.Parser.parse_file( fname ); if( doc == null ) { return( false ); } /* Load the contents of the file */ import_map( da, doc->get_root_element(), ifile ); /* Update the drawing area */ da.queue_draw(); /* Delete the OPML document */ delete doc; return( true ); } /* Parses the OPML head block for information that we will use */ private static void import_map( DrawArea da, Xml.Node* n, File ifile ) { var color_map = new HashMap(); var id_map = new HashMap(); var link_ids = new Array(); var to_nodes = new Array(); /* Not sure what to do with the version information */ string? v = n->get_prop( "version" ); if( v != null ) { /* Not sure what to do with this value */ } for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { if( it->name == "node" ) { var root = import_node( it, da, null, color_map, id_map, link_ids, to_nodes, ifile ); da.get_nodes().append_val( root ); } } } /* Complete node linking */ for( int i=0; i color_map, HashMap id_map, Array link_ids, Array to_nodes, File ifile ) { var node = new Node( da, da.layouts.get_default() ); /* Make sure the style has a default value */ node.style = StyleInspector.styles.get_style_for_level( ((parent == null) ? 0 : 1), null ); string? i = n->get_prop( "ID" ); if( i != null ) { id_map.set( i, node.id() ); } string? t = n->get_prop( "TEXT" ); if( t != null ) { node.name.text = t; } string? l = n->get_prop( "LINK" ); if( l != null ) { link_ids.append_val( NodeLinkInfo( l.substring( 1 ), node ) ); } string? f = n->get_prop( "FOLDED" ); if( f != null ) { node.folded = bool.parse( f ); } string? bc = n->get_prop( "BACKGROUND_COLOR" ); if( bc != null ) { node.style.node_fill = true; } string? c = n->get_prop( "COLOR" ); if( c != null ) { if( color_map.has_key( c ) ) { node.link_color = color_map.get( c ); } else { node.link_color = da.get_theme().next_color(); color_map.set( c, node.link_color ); } } string? p = n->get_prop( "POSITION" ); if( p != null ) { node.side = (p == "left") ? NodeSide.LEFT : NodeSide.RIGHT; } /* Parse the child nodes */ for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "node" : import_node( it, da, node, color_map, id_map, link_ids, to_nodes, ifile ); break; case "edge" : import_edge( it, node ); break; case "font" : import_font( it, node ); break; case "icon" : break; // Not implemented case "cloud" : break; // Not implemented case "arrowlink" : import_arrowlink( it, da, node, to_nodes ); break; case "richcontent" : import_richcontent( it, node ); break; case "hook" : import_hook( it, da, node, ifile ); break; } } } /* Attach the new node to its parent */ if( parent != null ) { node.attach( parent, -1, da.get_theme() ); } return( node ); } private static void import_edge( Xml.Node* n, Node node ) { string? s = n->get_prop( "STYLE" ); if( s != null ) { switch( s ) { case "bezier" : node.style.link_type = new LinkTypeCurved(); break; case "linear" : node.style.link_type = new LinkTypeStraight(); break; } } string? c = n->get_prop( "COLOR" ); if( c != null ) { /* Not implemented - link color and node color must be the same */ } string? w = n->get_prop( "WIDTH" ); if( w != null ) { node.style.link_width = int.parse( w ); } } private static void import_font( Xml.Node* n, Node node ) { string? f = n->get_prop( "NAME" ); if( f != null ) { node.style.node_font.set_family( f ); } string? s = n->get_prop( "SIZE" ); if( s != null ) { node.style.node_font.set_size( int.parse( s ) * Pango.SCALE ); } string? b = n->get_prop( "BOLD" ); if( b != null ) { if( bool.parse( b ) ) { node.name.text = "" + node.name.text + ""; } } string? i = n->get_prop( "ITALIC" ); if( i != null ) { if( bool.parse( i ) ) { node.name.text = "" + node.name.text + ""; } } } private static void import_arrowlink( Xml.Node* n, DrawArea da, Node from_node, Array to_nodes ) { var conn = new Connection( da, from_node ); var start_arrow = "None"; var end_arrow = "None"; string? c = n->get_prop( "COLOR" ); if( c != null ) { /* Not implemented */ } string? d = n->get_prop( "DESTINATION" ); if( d != null ) { to_nodes.append_val( d ); } string? sa = n->get_prop( "STARTARROW" ); if( sa != null ) { start_arrow = sa; } string? ea = n->get_prop( "ENDARROW" ); if( ea != null ) { end_arrow = ea; } /* Stylize the arrow */ switch( start_arrow + end_arrow ) { case "NoneNone" : conn.style.connection_arrow = "none"; break; case "NoneDefault" : conn.style.connection_arrow = "fromto"; break; case "DefaultNone" : conn.style.connection_arrow = "tofrom"; break; case "DefaultDefault" : conn.style.connection_arrow = "both"; break; } /* Add the connection to the connections list */ da.get_connections().add_connection( conn ); } /* Import the richcontent section */ private static void import_richcontent( Xml.Node* n, Node node ) { string type = n->get_prop( "TYPE" ) ?? "NOTE"; string content = parse_richcontent( n ).chug(); if( type == "NODE" ) { node.name.text = content; } else { node.note = content; } } /* Parses the given richcontent block and turns it into the equivalent Pango markup */ private static string parse_richcontent( Xml.Node* n, int level=0, int number=0 ) { var str = ""; string[] bullets = {"-", "*", "+"}; int num = 1; bool ul = n->name.down() == "ul"; bool ol = n->name.down() == "ol"; for( Xml.Node* it=n->children; it!=null; it=it->next ) { switch( it->type ) { case Xml.ElementType.TEXT_NODE : str += it->content.strip().replace( "&", "&" ).replace( "<", "<" ).replace( ">", ">" ); break; case Xml.ElementType.CDATA_SECTION_NODE : str += it->content.strip(); break; case Xml.ElementType.ELEMENT_NODE : if( it->name.down() != "head" ) { // Skip anything within the header section str += parse_richcontent( it, (level + ((ol || ul) ? 1 : 0)), (ol ? num++ : 0) ); } break; } } var name = n->name.down(); var span = "" + str + ""; break; case "span" : for( Xml.Attr* it=n->properties; it!=null; it=it->next ) { span += " " + it->name + "=\"" + n->get_prop( it->name ) + "\""; } str = span + ">" + str + ""; break; case "p" : str = "\n" + str; break; case "br" : str += "\n"; break; case "li" : str = "\n" + string.nfill( ((level - 1) * 4), ' ' ) + ((number == 0) ? bullets[(level - 1) % 3] : (number.to_string() + ".")) + " " + str; break; } return( str ); } /* Imports in an image hook */ private static void import_hook( Xml.Node* n, DrawArea da, Node node, File ifile ) { string? name = n->get_prop( "NAME" ); if( (name != null) && (name == "ExternalObject") ) { int id = -1; double scale = 1; string? u = n->get_prop( "URI" ); if( u != null ) { var uri = URI.parse( u ); if( uri != null ) { string uri_str = u; if( uri.scheme == null ) { if( !GLib.Path.is_absolute( uri.path ) ) { var rfile = ifile.resolve_relative_path( uri.path ); uri_str = rfile.get_uri(); } else { var rfile = File.new_for_path( uri.path ); uri_str = rfile.get_uri(); } } id = da.image_manager.add_image( uri_str ); } } string? size = n->get_prop( "SIZE" ); if( size != null ) { scale = double.parse( size ); } if( id != -1 ) { node.set_image( da.image_manager, new NodeImage( da.image_manager, id, node.max_width() ) ); } } } } Minder-1.5.1/src/exports/ExportImage.vala000066400000000000000000000033571356632107200203350ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; using Gdk; using Gtk; public class ExportImage : Object { /* Default constructor */ public static void export( string fname, string type, DrawArea da ) { /* Get the rectangle holding the entire document */ double x, y, w, h; da.document_rectangle( out x, out y, out w, out h ); /* Create the drawing surface */ var surface = new ImageSurface( Format.RGB24, ((int)w + 20), ((int)h + 20) ); var context = new Context( surface ); /* Recreate the image */ da.get_style_context().render_background( context, 0, 0, ((int)w + 20), ((int)h + 20) ); context.translate( (10 - x), (10 - y) ); da.draw_all( context ); /* Write the pixbuf to the file */ var pixbuf = pixbuf_get_from_surface( surface, 0, 0, ((int)w + 20), ((int)h + 20) ); try { pixbuf.save( fname, type ); } catch( Error e ) { stdout.printf( "Error writing %s: %s\n", type, e.message ); } } } Minder-1.5.1/src/exports/ExportMarkdown.vala000066400000000000000000000050641356632107200210720ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class ExportMarkdown : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { var file = File.new_for_path( fname ); bool retval = true; try { var os = file.create( FileCreateFlags.PRIVATE ); export_top_nodes( os, da ); } catch( Error e ) { retval = false; } return( retval ); } /* Draws each of the top-level nodes */ private static void export_top_nodes( FileOutputStream os, DrawArea da ) { try { var nodes = da.get_nodes(); for( int i=0; i */ using GLib; public class ExportMermaid : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { var file = File.new_for_path( fname ); bool retval = true; try { var os = file.create( FileCreateFlags.PRIVATE ); export_top_nodes( os, da ); } catch( Error e ) { retval = false; } return( retval ); } private static string map_layout_to_direction( Node n ) { string lname = n.layout.name; if( (lname == _( "Vertical" )) || (lname == _( "Downwards" )) ) { return( "TB" ); } else if( lname == _( "To left" ) ) { return( "RL" ); } else if( lname == _( "Upwards" ) ) { return( "BT" ); } return( "LR" ); } /* Draws each of the top-level nodes */ private static void export_top_nodes( FileOutputStream os, DrawArea da ) { try { var nodes = da.get_nodes(); int link_id = 0; if( nodes.length == 0 ) { return; } string title = "graph " + map_layout_to_direction( nodes.index( 0 ) ) + "\n"; os.write( title.data ); for( int i=0; i" : "-.->" ); } else { return( solid ? "---" : "-.-" ); } } private static string make_link_color( Node n ) { var rgba = n.link_color; return( "#%02x%02x%02x".printf( (int)(rgba.red * 255), (int)(rgba.green * 255), (int)(rgba.blue * 255) ) ); } private static string make_node_style( Node n ) { string color = make_link_color( n ); string fill = n.style.node_fill ? ("fill:" + color + ",") : ""; string width = n.style.node_borderwidth.to_string(); return( "style " + make_id( n ) + " " + fill + "stroke:" + color + ",stroke-width:" + width + "px" ); } private static string make_link_style( Node n, ref int link_id ) { string color = make_link_color( n ); string width = n.style.link_width.to_string(); int lid = link_id++; var pattern = n.style.link_dash.pattern; string pattern_str = ""; if( pattern.length > 0 ) { pattern_str = ",stroke-dasharray:"; for( int i=0; i */ using GLib; public class ExportOPML : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* opml = new Xml.Node( null, "opml" ); string expand_state; Xml.Node* body = export_body( da, out expand_state ); opml->new_prop( "version", "2.0" ); opml->add_child( new Xml.Node.comment( _( "Generated by Minder" ) + " " + Minder.version ) ); opml->add_child( export_head( Path.get_basename( fname ), expand_state ) ); opml->add_child( body ); doc->set_root_element( opml ); doc->save_format_file( fname, 1 ); delete doc; return( true ); } /* Generates the header for the document */ private static Xml.Node* export_head( string? title, string expand_state ) { Xml.Node* head = new Xml.Node( null, "head" ); var now = new DateTime.now_local(); head->new_text_child( null, "title", (title ?? "Mind Map") ); head->new_text_child( null, "dateCreated", now.to_string() ); if( expand_state != "" ) { head->new_text_child( null, "expansionState", expand_state ); } return( head ); } /* Generates the body for the document */ private static Xml.Node* export_body( DrawArea da, out string expand_state ) { Xml.Node* body = new Xml.Node( null, "body" ); da.export_opml( body, out expand_state ); return( body ); } /* Reads the contents of an OPML file and creates a new document based on the stored information. */ public static bool import( string fname, DrawArea da ) { /* Read in the contents of the OPML file */ var doc = Xml.Parser.parse_file( fname ); if( doc == null ) { return( false ); } /* Load the contents of the file */ for( Xml.Node* it = doc->get_root_element()->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { Array? expand_state = null; switch( it->name ) { case "head" : import_header( it, ref expand_state ); break; case "body" : da.import_opml( it, ref expand_state ); break; } } } /* Delete the OPML document */ delete doc; return( true ); } /* Parses the OPML head block for information that we will use */ private static void import_header( Xml.Node* n, ref Array? expand_state ) { for( Xml.Node* it = n->children; it != null; it = it->next ) { if( it->type == Xml.ElementType.ELEMENT_NODE ) { switch( it->name ) { case "expansionState" : if( (it->children != null) && (it->children->type == Xml.ElementType.TEXT_NODE) ) { expand_state = new Array(); string[] values = n->children->get_content().split( "," ); foreach (string val in values) { int intval = int.parse( val ); expand_state.append_val( intval ); } } break; } } } } } Minder-1.5.1/src/exports/ExportPDF.vala000066400000000000000000000035641356632107200177240ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; public class ExportPDF : Object { /* Default constructor */ public static void export( string fname, DrawArea da ) { /* Get the width and height of the page */ double page_width = 8.5 * 72; double page_height = 11 * 72; double margin = 0.5 * 72; /* Create the drawing surface */ var surface = new PdfSurface( fname, page_width, page_height ); var context = new Context( surface ); /* Get the rectangle holding the entire document */ double x, y, w, h; da.document_rectangle( out x, out y, out w, out h ); /* Calculate the required scaling factor to get the document to fit */ double width = (page_width - (2 * margin)) / w; double height = (page_height - (2 * margin)) / h; double sf = (width < height) ? width : height; /* Scale and translate the image */ context.scale( sf, sf ); context.translate( ((0 - x) + margin), ((0 - y) + margin) ); /* Recreate the image */ da.draw_all( context ); /* Draw the page to the PDF file */ context.show_page(); } } Minder-1.5.1/src/exports/ExportPNG.vala000066400000000000000000000031731356632107200177330ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; public class ExportPNG : Object { /* Default constructor */ public static void export( string fname, DrawArea da, bool transparent ) { /* Get the rectangle holding the entire document */ double x, y, w, h; da.document_rectangle( out x, out y, out w, out h ); /* Create the drawing surface */ var surface = new ImageSurface( (transparent ? Format.ARGB32 : Format.RGB24), ((int)w + 20), ((int)h + 20) ); var context = new Context( surface ); /* Recreate the image */ if( !transparent ) { da.get_style_context().render_background( context, 0, 0, ((int)w + 20), ((int)h + 20) ); } /* Translate the image */ context.translate( (10 - x), (10 - y) ); da.draw_all( context ); /* Write the image to the PNG file */ surface.write_to_png( fname ); } } Minder-1.5.1/src/exports/ExportPrint.vala000066400000000000000000000054021356632107200204000ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class ExportPrint : Object { private DrawArea _da; /* Default constructor */ public ExportPrint() {} /* Perform print operation */ public void print( DrawArea da, MainWindow main ) { _da = da; var op = new PrintOperation(); // var settings = new PrintSettings().from_file( fname ); var settings = new PrintSettings(); op.set_print_settings( settings ); op.set_n_pages( 1 ); op.set_unit( Unit.MM ); /* Connect to the draw_page signal */ op.draw_page.connect( draw_page ); try { var res = op.run( PrintOperationAction.PRINT_DIALOG, main ); switch( res ) { case PrintOperationResult.APPLY : settings = op.get_print_settings(); // Save the settings to a file - settings.to_file( fname ); break; case PrintOperationResult.ERROR : /* TBD - Display the print error */ break; case PrintOperationResult.IN_PROGRESS : /* TBD */ break; } } catch( GLib.Error e ) { /* TBD */ } } /* Draws the page */ public void draw_page( PrintOperation op, PrintContext context, int page_nr ) { var ctx = context.get_cairo_context(); var page_width = context.get_width(); var page_height = context.get_height(); var margin_x = 0.5 * context.get_dpi_x(); var margin_y = 0.5 * context.get_dpi_y(); /* Get the rectangle holding the entire document */ double x, y, w, h; _da.document_rectangle( out x, out y, out w, out h ); /* Calculate the required scaling factor to get the document to fit */ double width = (page_width - (2 * margin_x)) / w; double height = (page_height - (2 * margin_y)) / h; double sf = (width < height) ? width : height; /* Scale and translate the image */ ctx.scale( sf, sf ); ctx.translate( ((0 - x) + margin_x), ((0 - y) + margin_y) ); /* Draw the map */ _da.draw_all( ctx ); } } Minder-1.5.1/src/exports/ExportSVG.vala000066400000000000000000000027621356632107200177510ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Cairo; public class ExportSVG : Object { /* Default constructor */ public static void export( string fname, DrawArea da ) { /* Get the rectangle holding the entire document */ double x, y, w, h; da.document_rectangle( out x, out y, out w, out h ); /* Create the drawing surface */ var surface = new SvgSurface( fname, ((int)w + 20), ((int)h + 20) ); var context = new Context( surface ); surface.restrict_to_version( SvgVersion.VERSION_1_1 ); /* Translate the image */ context.translate( (10 - x), (10 - y) ); /* Recreate the image */ da.draw_all( context ); /* Draw the page to the PDF file */ context.show_page(); } } Minder-1.5.1/src/exports/ExportText.vala000066400000000000000000000155541356632107200202410ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; using Gee; public class ExportText : Object { struct Hier { public int spaces; public Node node; } /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { var file = File.new_for_path( fname ); bool retval = true; try { var os = file.create( FileCreateFlags.PRIVATE ); export_top_nodes( os, da ); } catch( Error e ) { retval = false; } return( retval ); } /* Draws each of the top-level nodes */ private static void export_top_nodes( FileOutputStream os, DrawArea da ) { try { var nodes = da.get_nodes(); for( int i=0; i(); var tops = new Array(); var lines = txt.split( "\n" ); var re = new Regex( "^(\\s*)((\\-|\\+|\\*|#|>)\\s*)?(\\[([ xX])\\]\\s*)?(.*)$" ); var tspace = string.nfill( ((tab_spaces <= 0) ? 1 : tab_spaces), ' ' ); foreach( string line in lines ) { MatchInfo match_info; /* If we found some useful text, include it here */ if( re.match( line, 0, out match_info ) ) { var spaces = match_info.fetch( 1 ).replace( "\t", tspace ).length; var bullet = match_info.fetch( 3 ); var task = match_info.fetch( 5 ); var str = match_info.fetch( 6 ); /* Add root node */ if( bullet == "#" ) { var node = make_node( da, null, task, str ); da.add_root( node, -1 ); stack.offer_head( {spaces, node} ); tops.append_val( node ); /* If we are the first found node in the text input */ } else if( stack.is_empty ) { Node node; if( !imported && (da.get_current_node() != null) ) { node = make_node( da, da.get_current_node(), task, str ); } else { node = make_node( da, null, task, str ); da.add_root( node, -1 ); } stack.offer_head( {spaces, node} ); tops.append_val( node ); /* Add note */ } else if( bullet == ">" ) { stack.peek_head().node.note += str; /* Add sibling node */ } else if( spaces == stack.peek_head().spaces ) { var node = make_node( da, stack.peek_head().node.parent, task, str ); stack.poll_head(); stack.offer_head( {spaces, node} ); /* Add child node */ } else if( spaces > stack.peek_head().spaces ) { var node = make_node( da, stack.peek_head().node, task, str ); stack.offer_head( {spaces, node} ); /* Add ancestor node */ } else { while( !stack.is_empty && (spaces < stack.peek_head().spaces) ) { stack.poll_head(); } if( spaces == stack.peek_head().spaces ) { var node = make_node( da, stack.peek_head().node.parent, task, str ); stack.poll_head(); stack.offer_head( {spaces, node} ); } else { var node = make_node( da, stack.peek_head().node, task, str ); stack.offer_head( {spaces, node} ); } } } } if( !imported ) { da.undo_buffer.add_item( new UndoNodesInsert( da, tops ) ); } da.changed(); da.queue_draw(); } catch( GLib.RegexError err ) { /* TBD */ } } } Minder-1.5.1/src/exports/ExportYed.vala000066400000000000000000000340111356632107200200230ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using GLib; public class ExportYed : Object { /* Exports the given drawing area to the file of the given name */ public static bool export( string fname, DrawArea da ) { Xml.Doc* doc = new Xml.Doc( "1.0" ); Xml.Node* root = new Xml.Node( null, "graphml" ); root->new_prop( "xmlns", "http://graphml.graphdrawing.org/xmlns" ); root->new_ns( "http://www.yworks.com/xml/yfiles-common/1.0/java", "java" ); root->new_ns( "http://www.yworks.com/xml/yfiles-common/markup/primitives/2.0", "sys" ); root->new_ns( "http://www.yworks.com/xml/yfiles-common/markup/2.0", "x" ); root->new_ns( "http://www.w3.org/2001/XMLSchema-instance", "xsi" ); root->new_ns( "http://www.yworks.com/xml/yed/3", "yed" ); Xml.Ns* yns = root->new_ns( "http://www.yworks.com/xml/graphml", "y" ); root->add_child( new Xml.Node.comment( _( "Generated by Minder" ) + " " + Minder.version ) ); export_keys( root ); export_graphs( root, yns, da ); doc->set_root_element( root ); doc->save_format_file( fname, 1 ); delete doc; return( true ); } /* Returns a single key populated with the specified information */ private static Xml.Node* export_key_attr( string id, string for_item, string attr_name, string attr_type ) { Xml.Node* n = new Xml.Node( null, "key" ); n->new_prop( "id", id ); n->new_prop( "for", for_item ); n->new_prop( "attr.name", attr_name ); n->new_prop( "attr.type", attr_type ); return( n ); } /* Returns a single key populated with the specified information */ private static Xml.Node* export_key_yfiles( string id, string for_item, string yfiles_type ) { Xml.Node* n = new Xml.Node( null, "key" ); n->new_prop( "id", id ); n->new_prop( "for", for_item ); n->new_prop( "yfiles.type", yfiles_type ); return( n ); } /* Adds all of the keys to the root node */ private static void export_keys( Xml.Node* root ) { root->add_child( export_key_attr( "d5", "node", "description", "string" ) ); root->add_child( export_key_yfiles( "d6", "node", "nodegraphics" ) ); root->add_child( export_key_yfiles( "d7", "graphml", "resources" ) ); root->add_child( export_key_attr( "d9", "edge", "description", "string" ) ); root->add_child( export_key_yfiles( "d10", "edge", "edgegraphics" ) ); } /* Exports each tree as a separate graph */ private static void export_graphs( Xml.Node* root, Xml.Ns* yns, DrawArea da ) { Xml.Node* graph = new Xml.Node( null, "graph" ); graph->new_prop( "edgedefault", "directed" ); graph->new_prop( "id", "G0" ); root->add_child( graph ); /* Add nodes */ for( int i=0; inew_prop( "key", "d7" ); Xml.Node* res = new Xml.Node( yns, "Resources" ); d7->add_child( res ); graph->add_child( d7 ); } private static Xml.Node* export_node_shape( Node node, Theme theme, Xml.Ns* yns ) { Xml.Node* shape = new Xml.Node( yns, "ShapeNode" ); Xml.Node* geometry = new Xml.Node( yns, "Geometry" ); geometry->new_prop( "height", (node.height - (node.style.node_margin * 2)).to_string() ); geometry->new_prop( "width", (node.width - (node.style.node_margin * 2)).to_string() ); geometry->new_prop( "x", (node.posx + node.style.node_margin).to_string() ); geometry->new_prop( "y", (node.posy + node.style.node_margin).to_string() ); shape->add_child( geometry ); Xml.Node* fill = new Xml.Node( yns, "Fill" ); fill->new_prop( "color", Utils.color_from_rgba( node.is_root() ? theme.get_color( "root_background" ) : (node.style.node_fill ? node.link_color : theme.get_color( "background" )) ) ); fill->new_prop( "transparent", "false" ); shape->add_child( fill ); Xml.Node* bs = new Xml.Node( yns, "BorderStyle" ); bs->new_prop( "color", Utils.color_from_rgba( node.link_color ) ); bs->new_prop( "type", "line" ); // TBD bs->new_prop( "width", node.style.node_borderwidth.to_string() ); shape->add_child( bs ); Xml.Node* lbl = new Xml.Node( yns, "NodeLabel" ); lbl->new_prop( "alignment", "left" ); lbl->new_prop( "autoSizePolicy", "content" ); lbl->new_prop( "fontFamily", node.style.node_font.get_family() ); lbl->new_prop( "fontSize", (node.style.node_font.get_size() / Pango.SCALE).to_string() ); lbl->new_prop( "fontStyle", "plain" ); lbl->new_prop( "hasBackgroundColor", "false" ); lbl->new_prop( "hasLineColor", "false" ); lbl->new_prop( "height", node.name.height.to_string() ); lbl->new_prop( "horizontalTextPosition", "left" ); lbl->new_prop( "iconTextGap", "4" ); lbl->new_prop( "modelName", "custom" ); lbl->new_prop( "textColor", Utils.color_from_rgba( node.is_root() ? theme.get_color( "root_foreground" ) : (node.style.node_fill ? theme.get_color( "background" ) : theme.get_color( "foreground" )) ) ); lbl->new_prop( "verticalTextPosition", "top" ); lbl->new_prop( "visible", node.folded ? "false" : "true" ); lbl->new_prop( "width", node.name.width.to_string() ); lbl->new_prop( "x", node.style.node_padding.to_string() ); lbl->new_prop( "xml:space", "preserve" ); lbl->new_prop( "y", node.style.node_padding.to_string() ); lbl->add_content( node.name.get_wrapped_text() ); shape->add_child( lbl ); Xml.Node* model = new Xml.Node( yns, "LabelModel" ); Xml.Node* smodel = new Xml.Node( yns, "SmartNodeLabelModel" ); smodel->new_prop( "distance", "4.0" ); model->add_child( smodel ); lbl->add_child( model ); Xml.Node* param = new Xml.Node( yns, "ModelParameter" ); Xml.Node* sparam = new Xml.Node( yns, "SmartNodeLabelModelParameter" ); sparam->new_prop( "labelRatioX", "0.0" ); sparam->new_prop( "labelRatioY", "0.0" ); sparam->new_prop( "nodeRatioX", "0.0" ); sparam->new_prop( "nodeRatioY", "0.0" ); sparam->new_prop( "offsetX", "0.0" ); sparam->new_prop( "offsetY", "0.0" ); sparam->new_prop( "upX", "0.0" ); sparam->new_prop( "upY", "-1.0" ); param->add_child( sparam ); lbl->add_child( param ); Xml.Node* s = new Xml.Node( yns, "Shape" ); switch( node.style.node_border.name() ) { case "rounded" : s->new_prop( "type", "roundrectangle" ); break; case "squared" : s->new_prop( "type", "rectangle" ); break; default : s->new_prop( "type", "rectangle" ); break; } shape->add_child( s ); return( shape ); } private static Xml.Node* export_node( Node node, Theme theme, Xml.Ns* yns ) { Xml.Node* n = new Xml.Node( null, "node" ); Xml.Node* d5 = new Xml.Node( null, "data" ); Xml.Node* d6 = new Xml.Node( null, "data" ); n->new_prop( "id", ("n" + node.id().to_string()) ); d5->new_prop( "key", "d5" ); if( node.note != "" ) { d5->new_prop( "xml:space", "preserve" ); d5->add_content( node.note ); } n->add_child( d5 ); d6->new_prop( "key", "d6" ); d6->add_child( export_node_shape( node, theme, yns ) ); n->add_child( d6 ); return( n ); } private static Xml.Node* export_node_bezieredge( Node node, Xml.Ns* yns ) { Xml.Node* be = new Xml.Node( yns, "BezierEdge" ); Xml.Node* path = new Xml.Node( yns, "Path" ); path->new_prop( "sx", "0.0" ); path->new_prop( "sy", "0.0" ); path->new_prop( "tx", "0.0" ); path->new_prop( "ty", "0.0" ); be->add_child( path ); Xml.Node* ls = new Xml.Node( yns, "LineStyle" ); ls->new_prop( "color", Utils.color_from_rgba( node.link_color ) ); ls->new_prop( "type", "line" ); ls->new_prop( "width", node.style.link_width.to_string() ); be->add_child( ls ); Xml.Node* arrow = new Xml.Node( yns, "Arrows" ); arrow->new_prop( "source", "none" ); arrow->new_prop( "target", "none" ); be->add_child( arrow ); return( be ); } /* Adds the node link as an edge */ private static Xml.Node* export_link( Node node, Xml.Ns* yns ) { if( node.is_root() ) return( null ); Xml.Node* e = new Xml.Node( null, "edge" ); e->new_prop( "id", ("e" + node.id().to_string()) ); e->new_prop( "source", ("n" + node.parent.id().to_string()) ); e->new_prop( "target", ("n" + node.id().to_string()) ); Xml.Node* d9 = new Xml.Node( null, "data" ); d9->new_prop( "key", "d9" ); e->add_child( d9 ); Xml.Node* d10 = new Xml.Node( null, "data" ); d10->new_prop( "key", "d10" ); d10->add_child( export_node_bezieredge( node, yns ) ); e->add_child( d10 ); return( e ); } /* Adds a node along with its edge */ private static void export_node_edge( Xml.Node* graph, Xml.Ns* yns, Node node, Theme theme ) { graph->add_child( export_node( node, theme, yns ) ); if( !node.is_root() ) { graph->add_child( export_link( node, yns ) ); } for( int i=0; i conns, Theme theme ) { for( int i=0; inew_prop( "id", ("c" + i.to_string()) ); e->new_prop( "source", ("n" + conn.from_node.id().to_string()) ); e->new_prop( "target", ("n" + conn.to_node.id().to_string()) ); Xml.Node* d9 = new Xml.Node( null, "data" ); d9->new_prop( "key", "d9" ); e->add_child( d9 ); Xml.Node* d10 = new Xml.Node( null, "data" ); d10->new_prop( "key", "d10" ); Xml.Node* be = new Xml.Node( yns, "BezierEdge" ); Xml.Node* path = new Xml.Node( yns, "Path" ); path->new_prop( "sx", "0.0" ); path->new_prop( "sy", "0.0" ); path->new_prop( "tx", "0.0" ); path->new_prop( "ty", "0.0" ); be->add_child( path ); Xml.Node* ls = new Xml.Node( yns, "LineStyle" ); ls->new_prop( "color", Utils.color_from_rgba( theme.get_color( "connection" ) ) ); ls->new_prop( "type", (conn.style.connection_dash.name == "solid") ? "line" : "dashed" ); ls->new_prop( "width", conn.style.connection_width.to_string() ); be->add_child( ls ); Xml.Node* arrow = new Xml.Node( yns, "Arrows" ); var atype = conn.style.connection_arrow; arrow->new_prop( "source", ((atype == "tofrom") || (atype == "both")) ? "standard" : "none" ); arrow->new_prop( "target", ((atype == "fromto") || (atype == "both")) ? "standard" : "none" ); be->add_child( arrow ); if( conn.title != null ) { Xml.Node* el = new Xml.Node( yns, "EdgeLabel" ); el->new_prop( "alignment", "center" ); el->new_prop( "fontFamily", conn.style.connection_font.get_family() ); el->new_prop( "fontSize", (conn.style.connection_font.get_size() / Pango.SCALE).to_string() ); el->new_prop( "hasBackgroundColor", "false" ); el->new_prop( "hasLineColor", "true" ); el->new_prop( "height", conn.title.height.to_string() ); el->new_prop( "horizontalTextPosition", "center" ); el->new_prop( "modelName", "custom" ); el->new_prop( "preferredPlacement", "anywhere" ); el->new_prop( "ratio", "0.5" ); el->new_prop( "textColor", Utils.color_from_rgba( theme.get_color( "foreground" ) ) ); el->new_prop( "verticalTextPosition", "top" ); el->new_prop( "visible", "true" ); el->new_prop( "width", conn.title.width.to_string() ); el->new_prop( "x", conn.title.posx.to_string() ); el->new_prop( "xml:space", "preserve" ); el->new_prop( "y", conn.title.posy.to_string() ); el->add_content( conn.title.get_wrapped_text() ); Xml.Node* lm = new Xml.Node( yns, "LabelModel" ); Xml.Node* slm = new Xml.Node( yns, "SmartEdgeLabelModel" ); slm->new_prop( "autoRotationEnabled", "false" ); slm->new_prop( "defaultAngle", "0.0" ); slm->new_prop( "defaultDistance", "10.0" ); lm->add_child( slm ); el->add_child( lm ); Xml.Node* mp = new Xml.Node( yns, "ModelParameter" ); Xml.Node* smp = new Xml.Node( yns, "SmartEdgeLabelModelParameter" ); smp->new_prop( "angle", "0.0" ); smp->new_prop( "distance", "30.0" ); smp->new_prop( "distanceToCenter", "true" ); smp->new_prop( "position", "left" ); smp->new_prop( "ratio", "0.5" ); smp->new_prop( "segment", "1" ); mp->add_child( smp ); el->add_child( mp ); Xml.Node* ppd = new Xml.Node( yns, "PreferredPlacementDescriptor" ); ppd->new_prop( "angle", "0.0" ); ppd->new_prop( "angleOffsetOnRightSide", "0" ); ppd->new_prop( "angleReference", "absolute" ); ppd->new_prop( "angleRotationOnRightSide", "co" ); ppd->new_prop( "distance", "-1.0" ); ppd->new_prop( "frozen", "true" ); ppd->new_prop( "placement", "anywhere" ); ppd->new_prop( "side", "anywhere" ); ppd->new_prop( "sideReference", "relative_to_edge_flow" ); el->add_child( ppd ); be->add_child( el ); } d10->add_child( be ); e->add_child( d10 ); graph->add_child( e ); } } } Minder-1.5.1/src/layouts/000077500000000000000000000000001356632107200152305ustar00rootroot00000000000000Minder-1.5.1/src/layouts/.tkesort000066400000000000000000000002171356632107200167240ustar00rootroot00000000000000{items} {LayoutDown.vala LayoutHorizontal.vala LayoutLeft.vala LayoutManual.vala LayoutRight.vala LayoutUp.vala LayoutVertical.vala} {use} {1} Minder-1.5.1/src/layouts/LayoutDown.vala000066400000000000000000000024211356632107200202010ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutDown : Layout { /* Default constructor */ public LayoutDown() { name = _( "Downwards" ); icon = "minder-layout-down-symbolic"; balanceable = false; } /* Maps the given side to the new side */ public override NodeSide side_mapping( NodeSide side ) { return( NodeSide.BOTTOM ); } /* The side should always be set to bottom */ public override void set_side( Node current ) { current.side = NodeSide.BOTTOM; } } Minder-1.5.1/src/layouts/LayoutHorizontal.vala000066400000000000000000000026201356632107200214240ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutHorizontal : Layout { /* Default constructor */ public LayoutHorizontal() { name = _( "Horizontal" ); icon = "minder-layout-horizontal-symbolic"; balanceable = true; } /* Maps the given side to the new side */ public override NodeSide side_mapping( NodeSide side ) { switch( side ) { case NodeSide.LEFT : return( NodeSide.LEFT ); case NodeSide.RIGHT : return( NodeSide.RIGHT ); case NodeSide.TOP : return( NodeSide.LEFT ); case NodeSide.BOTTOM : return( NodeSide.RIGHT ); } return( NodeSide.RIGHT ); } } Minder-1.5.1/src/layouts/LayoutLeft.vala000066400000000000000000000024451356632107200201720ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutLeft : Layout { /* Default constructor */ public LayoutLeft() { name = _( "To left" ); icon = "minder-layout-left-symbolic"; balanceable = false; } /* Maps the given side to the appropriate side for this layout */ public override NodeSide side_mapping( NodeSide side ) { return( NodeSide.LEFT ); } /* The side should always be set to the left */ public override void set_side( Node current ) { current.side = NodeSide.LEFT; } } Minder-1.5.1/src/layouts/LayoutManual.vala000066400000000000000000000036431356632107200205160ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutManual : Layout { /* Default constructor */ public LayoutManual() { name = _( "Manual" ); icon = "minder-layout-manual-symbolic"; balanceable = false; } /* Initializes this layout */ public override void initialize( Node parent ) {} /* Maps the given side to the appropriate side for this layout */ public override NodeSide side_mapping( NodeSide side ) { return( side ); } /* Updates the layout when necessary when a node is edited */ public override void handle_update_by_edit( Node n, double diffw, double diffh ) {} /* Called when a node's fold indicator changes */ public override void handle_update_by_fold( Node n ) {} /* Called when we are inserting a node within a parent */ public override void handle_update_by_insert( Node parent, Node child, int pos ) { if( !child.attached ) { base.handle_update_by_insert( parent, child, pos ); } } /* Called to layout the leftover children of a parent node when a node is deleted */ public override void handle_update_by_delete( Node parent, int index, NodeSide side, double size ) {} } Minder-1.5.1/src/layouts/LayoutRight.vala000066400000000000000000000024541356632107200203550ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutRight : Layout { /* Default constructor */ public LayoutRight() { name = _( "To right" ); icon = "minder-layout-right-symbolic"; balanceable = false; } /* Maps the given side to the appropriate side for this layout */ public override NodeSide side_mapping( NodeSide side ) { return( NodeSide.RIGHT ); } /* The side should always be set to the right */ public override void set_side( Node current ) { current.side = NodeSide.RIGHT; } } Minder-1.5.1/src/layouts/LayoutUp.vala000066400000000000000000000024521356632107200176620ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutUp : Layout { /* Default constructor */ public LayoutUp() { name = _( "Upwards" ); icon = "minder-layout-up-symbolic"; balanceable = false; } /* Maps the given side to the appropriate side for this layout */ public override NodeSide side_mapping( NodeSide side ) { return( NodeSide.TOP ); } /* Provides the default position for a newly created node */ public override void set_side( Node current ) { current.side = NodeSide.TOP; } } Minder-1.5.1/src/layouts/LayoutVertical.vala000066400000000000000000000026411356632107200210470ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LayoutVertical : Layout { /* Default constructor */ public LayoutVertical() { name = _( "Vertical" ); icon = "minder-layout-vertical-symbolic"; balanceable = true; } /* Maps the given side to the appropriate side for this layout */ public override NodeSide side_mapping( NodeSide side ) { switch( side ) { case NodeSide.LEFT : return( NodeSide.TOP ); case NodeSide.RIGHT : return( NodeSide.BOTTOM ); case NodeSide.TOP : return( NodeSide.TOP ); case NodeSide.BOTTOM : return( NodeSide.BOTTOM ); } return( NodeSide.BOTTOM ); } } Minder-1.5.1/src/meson.build000066400000000000000000000101251356632107200156710ustar00rootroot00000000000000sources += files( 'animator/AnimatorAction.vala', 'animator/AnimatorNodes.vala', 'animator/AnimatorPan.vala', 'animator/AnimatorPanScale.vala', 'animator/AnimatorPositions.vala', 'animator/AnimatorScale.vala', 'exports/ExportCSV.vala', 'exports/ExportFreemind.vala', 'exports/ExportFreeplane.vala', 'exports/ExportImage.vala', 'exports/ExportMarkdown.vala', 'exports/ExportMermaid.vala', 'exports/ExportOPML.vala', 'exports/ExportPDF.vala', 'exports/ExportPNG.vala', 'exports/ExportPrint.vala', 'exports/ExportSVG.vala', 'exports/ExportText.vala', 'exports/ExportYed.vala', 'layouts/LayoutDown.vala', 'layouts/LayoutHorizontal.vala', 'layouts/LayoutLeft.vala', 'layouts/LayoutManual.vala', 'layouts/LayoutRight.vala', 'layouts/LayoutUp.vala', 'layouts/LayoutVertical.vala', 'styles/LinkTypeCurved.vala', 'styles/LinkTypeSquared.vala', 'styles/LinkTypeStraight.vala', 'styles/NodeBorderBracket.vala', 'styles/NodeBorderNone.vala', 'styles/NodeBorderPill.vala', 'styles/NodeBorderRounded.vala', 'styles/NodeBorderSquared.vala', 'styles/NodeBorderUnderlined.vala', 'themes/ThemeDark.vala', 'themes/ThemeDefault.vala', 'themes/ThemeSolarizedDark.vala', 'themes/ThemeSolarizedLight.vala', 'undo_actions/UndoConnectionAdd.vala', 'undo_actions/UndoConnectionChange.vala', 'undo_actions/UndoConnectionColor.vala', 'undo_actions/UndoConnectionDelete.vala', 'undo_actions/UndoConnectionNote.vala', 'undo_actions/UndoConnectionTitle.vala', 'undo_actions/UndoNodeAddParent.vala', 'undo_actions/UndoNodeAttach.vala', 'undo_actions/UndoNodeBalance.vala', 'undo_actions/UndoNodeCut.vala', 'undo_actions/UndoNodeDelete.vala', 'undo_actions/UndoNodeDetach.vala', 'undo_actions/UndoNodeFold.vala', 'undo_actions/UndoNodeFoldChanges.vala', 'undo_actions/UndoNodeImage.vala', 'undo_actions/UndoNodeInsert.vala', 'undo_actions/UndoNodeLayout.vala', 'undo_actions/UndoNodeLink.vala', 'undo_actions/UndoNodeLinkColor.vala', 'undo_actions/UndoNodeMove.vala', 'undo_actions/UndoNodeName.vala', 'undo_actions/UndoNodeNote.vala', 'undo_actions/UndoNodePaste.vala', 'undo_actions/UndoNodeResize.vala', 'undo_actions/UndoNodeReveal.vala', 'undo_actions/UndoNodeSort.vala', 'undo_actions/UndoNodeTask.vala', 'undo_actions/UndoNodesInsert.vala', 'undo_actions/UndoStyleAffectChange.vala', 'undo_actions/UndoStyleChange.vala', 'undo_actions/UndoStyleConnectionArrow.vala', 'undo_actions/UndoStyleConnectionDash.vala', 'undo_actions/UndoStyleConnectionFont.vala', 'undo_actions/UndoStyleConnectionPadding.vala', 'undo_actions/UndoStyleConnectionWidth.vala', 'undo_actions/UndoStyleLinkArrow.vala', 'undo_actions/UndoStyleLinkDash.vala', 'undo_actions/UndoStyleLinkType.vala', 'undo_actions/UndoStyleLinkWidth.vala', 'undo_actions/UndoStyleNodeBorder.vala', 'undo_actions/UndoStyleNodeBorderwidth.vala', 'undo_actions/UndoStyleNodeFill.vala', 'undo_actions/UndoStyleNodeFont.vala', 'undo_actions/UndoStyleNodeMargin.vala', 'undo_actions/UndoStyleNodeMarkup.vala', 'undo_actions/UndoStyleNodePadding.vala', 'Animator.vala', 'Application.vala', 'Bezier.vala', 'CanvasText.vala', 'Connection.vala', 'ConnectionInspector.vala', 'ConnectionMenu.vala', 'Connections.vala', 'CurrentInspector.vala', 'Document.vala', 'DrawArea.vala', 'DynamicNotebook.vala', 'EmptyInspector.vala', 'EmptyMenu.vala', 'ImageEditor.vala', 'ImageManager.vala', 'Layout.vala', 'Layouts.vala', 'LinkDash.vala', 'LinkType.vala', 'MainWindow.vala', 'MapInspector.vala', 'Node.vala', 'NodeBorder.vala', 'NodeImage.vala', 'NodeInspector.vala', 'NodeMenu.vala', 'Partitioner.vala', 'QuickEntry.vala', 'Style.vala', 'StyleInspector.vala', 'Styles.vala', 'Theme.vala', 'ThemeEditor.vala', 'Themes.vala', 'UndoBuffer.vala', 'UndoItem.vala', 'Utils.vala' ) Minder-1.5.1/src/styles/000077500000000000000000000000001356632107200150535ustar00rootroot00000000000000Minder-1.5.1/src/styles/LinkTypeCurved.vala000066400000000000000000000051111356632107200206260ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LinkTypeCurved : Object, LinkType { /* Default constructor */ public LinkTypeCurved() {} /* Returns the search name */ public string name() { return( "curved" ); } /* Returns the name of the link type */ public string display_name() { return( _( "Curved" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-link-curved-symbolic" ); } /* Draw method for the link */ public void draw( Cairo.Context ctx, Node to_node, double from_x, double from_y, double to_x, double to_y, out double tailx, out double taily, out double tipx, out double tipy ) { var side = to_node.side; var style = to_node.style; tipx = tipy = 0; switch( side ) { case NodeSide.LEFT : to_x += adjust_a( style ); tipx = to_x - adjust_tip( style ); tipy = to_y; break; case NodeSide.RIGHT : to_x -= adjust_a( style ); tipx = to_x + adjust_tip( style ); tipy = to_y; break; case NodeSide.TOP : to_y += adjust_a( style ); tipx = to_x; tipy = to_y - adjust_tip( style ); break; case NodeSide.BOTTOM : to_y -= adjust_a( style ); tipx = to_x; tipy = to_y + adjust_tip( style ); break; } ctx.move_to( from_x, from_y ); if( (side & NodeSide.horizontal()) != 0 ) { var x_adjust = (to_x - from_x) * 0.5; tailx = from_x + x_adjust; taily = from_y + ((to_y - from_y) * 0.95); ctx.curve_to( (to_x - x_adjust), from_y, (from_x + x_adjust), to_y, to_x, to_y ); } else { var y_adjust = (to_y - from_y) * 0.5; tailx = from_x + ((to_x - from_x) * 0.95); taily = from_y + y_adjust; ctx.curve_to( from_x, (to_y - y_adjust), to_x, (from_y + y_adjust), to_x, to_y ); } ctx.stroke(); } } Minder-1.5.1/src/styles/LinkTypeSquared.vala000066400000000000000000000050251356632107200210060ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LinkTypeSquared : Object, LinkType { /* Default constructor */ public LinkTypeSquared() {} /* Returns the search name */ public string name() { return( "squared" ); } /* Returns the name of the link type */ public string display_name() { return( _( "Squared" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-link-squared-symbolic" ); } /* Draw method for the link */ public void draw( Cairo.Context ctx, Node to_node, double from_x, double from_y, double to_x, double to_y, out double tailx, out double taily, out double tipx, out double tipy ) { var side = to_node.side; var style = to_node.style; tipx = tipy = 0; switch( side ) { case NodeSide.LEFT : to_x += adjust_a( style ); tipx = to_x - adjust_tip( style ); tipy = to_y; break; case NodeSide.RIGHT : to_x -= adjust_a( style ); tipx = to_x + adjust_tip( style ); tipy = to_y; break; case NodeSide.TOP : to_y += adjust_a( style ); tipy = to_y - adjust_tip( style ); tipx = to_x; break; case NodeSide.BOTTOM : to_y -= adjust_a( style ); tipy = to_y + adjust_tip( style ); tipx = to_x; break; } ctx.move_to( from_x, from_y ); if( (side & NodeSide.horizontal()) != 0 ) { var mid_x = (from_x + to_x) / 2; tailx = mid_x; taily = to_y; ctx.line_to( mid_x, from_y ); ctx.line_to( mid_x, to_y ); ctx.line_to( to_x, to_y ); } else { var mid_y = (from_y + to_y) / 2; tailx = to_x; taily = mid_y; ctx.line_to( from_x, mid_y ); ctx.line_to( to_x, mid_y ); ctx.line_to( to_x, to_y ); } ctx.stroke(); } } Minder-1.5.1/src/styles/LinkTypeStraight.vala000066400000000000000000000103711356632107200211670ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class LinkTypeStraight : Object, LinkType { /* Default constructor */ public LinkTypeStraight() {} /* Returns the search name */ public string name() { return( "straight" ); } /* Returns the name of the link type */ public string display_name() { return( _( "Straight" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-link-straight-symbolic" ); } private double adjust_b( NodeSide side, double adjust, double x, double y ) { switch( side ) { case NodeSide.LEFT : return( (adjust * y) / x ); case NodeSide.RIGHT : return( (adjust * y) / x ); case NodeSide.TOP : return( (adjust * x) / y ); case NodeSide.BOTTOM : return( (adjust * x) / y ); } return( 0 ); } private double calc_to_x( Node to_node, bool from_lt_to, double adjusted, double adjustA, ref bool force ) { var left = to_node.posx - adjustA; var right = to_node.posx + to_node.width + adjustA; if( (adjusted < left) || (adjusted > right) || force ) { force = true; return( from_lt_to ? left : right ); } return( adjusted ); } private double calc_to_y( Node to_node, bool from_lt_to, double adjusted, double adjustA, ref bool force ) { var top = to_node.posy - adjustA; var bottom = to_node.posy + to_node.height + adjustA; if( (adjusted < top) || (adjusted > bottom) || force ) { force = true; return( from_lt_to ? top : bottom ); } return( adjusted ); } /* Draw method for the link */ public void draw( Cairo.Context ctx, Node to_node, double from_x, double from_y, double to_x, double to_y, out double tailx, out double taily, out double tipx, out double tipy ) { var style = to_node.style; var side = to_node.side; var x = (to_x - from_x); var y = (to_y - from_y); var adjustA = adjust_a( style ); var adjustB = style.link_arrow ? adjust_b( side, adjustA, x, y ) : 0; var adjustT = adjust_tip( style ); var force = false; tipx = tipy = 0; tailx = from_x; taily = from_y; switch( side ) { case NodeSide.LEFT : to_x += adjustA; to_y = calc_to_y( to_node, (from_y < to_y), (to_y + adjustB), adjustA, ref force ); tipx = to_x - adjustT; tipy = calc_to_y( to_node, (from_y < to_y), (to_y - adjust_b( side, adjustT, x, y )), adjustT, ref force ); break; case NodeSide.RIGHT : to_x -= adjustA; to_y = calc_to_y( to_node, (from_y < to_y), (to_y - adjustB), adjustA, ref force ); tipx = to_x + adjustT; tipy = calc_to_y( to_node, (from_y < to_y), (to_y + adjust_b( side, adjustT, x, y )), adjustT, ref force ); break; case NodeSide.TOP : to_y += adjustA; to_x = calc_to_x( to_node, (from_x < to_x), (to_x + adjustB), adjustA, ref force ); tipy = to_y - adjustT; tipx = calc_to_x( to_node, (from_x < to_x), (to_x - adjust_b( side, adjustT, x, y )), adjustT, ref force ); break; case NodeSide.BOTTOM : to_y -= adjustA; to_x = calc_to_x( to_node, (from_x < to_x), (to_x - adjustB), adjustA, ref force ); tipy = to_y + adjustT; tipx = calc_to_x( to_node, (from_x < to_x), (to_x + adjust_b( side, adjustT, x, y )), adjustT, ref force ); break; } ctx.move_to( from_x, from_y ); ctx.line_to( to_x, to_y ); ctx.stroke(); } } Minder-1.5.1/src/styles/NodeBorderBracket.vala000066400000000000000000000050651356632107200212450ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderBracket : Object, NodeBorder { /* Default constructor */ public NodeBorderBracket() {} /* Returns the searchable name of the node border */ public string name() { return( "bracket" ); } /* Returns the name of the node border to display (should be translatable) */ public string display_name() { return( _( "Square Bracket" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-bracket-symbolic" ); } /* Indicate that this border type is not fillable */ public bool is_fillable() { return( false ); } /* Draw method for the node border */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { var d = 10; switch( s ) { case NodeSide.LEFT : ctx.move_to( (x + w - d), y ); ctx.line_to( (x + w), y ); ctx.line_to( (x + w), (y + h) ); ctx.line_to( (x + w - d), (y + h) ); break; case NodeSide.TOP : ctx.move_to( x, (y + h - d) ); ctx.line_to( x, (y + h) ); ctx.line_to( (x + w), (y + h) ); ctx.line_to( (x + w), (y + h - d) ); break; case NodeSide.RIGHT : ctx.move_to( (x + d), y ); ctx.line_to( x, y ); ctx.line_to( x, (y + h) ); ctx.line_to( (x + d), (y + h) ); break; case NodeSide.BOTTOM : ctx.move_to( x, (y + d) ); ctx.line_to( x, y ); ctx.line_to( (x + w), y ); ctx.line_to( (x + w), (y + d) ); break; } ctx.stroke(); } /* Draw method for the node fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.rectangle( x, y, w, h ); ctx.fill(); } } Minder-1.5.1/src/styles/NodeBorderNone.vala000066400000000000000000000033311356632107200205630ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderNone : Object, NodeBorder { /* Default constructor */ public NodeBorderNone() {} /* Returns the searchable name of the node border */ public string name() { return( "none" ); } /* Returns the name of the node border to display (should be translatable) */ public string display_name() { return( _( "None" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-none-symbolic" ); } /* Indicate that this node is not fillable */ public bool is_fillable() { return( false ); } /* Draw method for the node border */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) {} /* Draw method for the node fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.rectangle( x, y, w, h ); ctx.fill(); } } Minder-1.5.1/src/styles/NodeBorderPill.vala000066400000000000000000000042161356632107200205670ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderPill : Object, NodeBorder { /* Default constructor */ public NodeBorderPill() {} /* Returns the searchable name of the node border */ public string name() { return( "pilled" ); } /* Returns the name of the node border to display (should be translatable) */ public string display_name() { return( _( "Pill-shaped" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-pill-symbolic" ); } /* Indicate that this node is fillable */ public bool is_fillable() { return( true ); } private void draw_common( Cairo.Context ctx, double x, double y, double w, double h ) { var d = 5; ctx.move_to( (x + d), y ); ctx.line_to( (x + w - d), y ); ctx.curve_to( (x + w - d), y, (x + w + d), (y + (h / 2)), (x + w - d), (y + h) ); ctx.line_to( (x + d), (y + h) ); ctx.curve_to( (x + d), (y + h), (x - d), (y + (h / 2)), (x + d), y ); } /* Draw method for the node border */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { draw_common( ctx, x, y, w, h ); ctx.stroke(); } /* Draw method for the node fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { draw_common( ctx, x, y, w, h ); ctx.fill(); } } Minder-1.5.1/src/styles/NodeBorderRounded.vala000066400000000000000000000035731356632107200212740ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderRounded : Object, NodeBorder { /* Default constructor */ public NodeBorderRounded() {} /* Returns the searchable name of the node border */ public string name() { return( "rounded" ); } /* Returns the name of the node border to display (should be translatable) */ public string display_name() { return( _( "Rounded Rectangle" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-rounded-symbolic" ); } /* Indicate that this node is fillable */ public bool is_fillable() { return( true ); } /* Draw method for the node border */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { Granite.Drawing.Utilities.cairo_rounded_rectangle( ctx, x, y, w, h, 5 ); ctx.stroke(); } /* Draw method for the node fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { Granite.Drawing.Utilities.cairo_rounded_rectangle( ctx, x, y, w, h, 5 ); ctx.fill(); } } Minder-1.5.1/src/styles/NodeBorderSquared.vala000066400000000000000000000034351356632107200212750ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderSquared : Object, NodeBorder { /* Default constructor */ public NodeBorderSquared() {} /* Returns the searchable name of the node border */ public string name() { return( "squared" ); } /* Returns the name of the node border to display (should be translatable) */ public string display_name() { return( _( "Squared Off" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-squared-symbolic" ); } /* Indicate that this node is fillable */ public bool is_fillable() { return( true ); } /* Draw method for the node border */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.rectangle( x, y, w, h ); ctx.stroke(); } /* Draw method for the node fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.rectangle( x, y, w, h ); ctx.fill(); } } Minder-1.5.1/src/styles/NodeBorderUnderlined.vala000066400000000000000000000034161356632107200217610ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class NodeBorderUnderlined : Object, NodeBorder { /* Default constructor */ public NodeBorderUnderlined() {} /* Search name of this instance */ public string name() { return( "underlined" ); } /* Returns the name of the link type */ public string display_name() { return( _( "Underlined" ) ); } /* Returns the name of the icon */ public string icon_name() { return( "minder-node-border-underlined-symbolic" ); } /* Indicate that this border is not fillable */ public bool is_fillable() { return( false ); } /* Draw method for the link */ public void draw_border( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.move_to( x, (y + h) ); ctx.line_to( (x + w), (y + h) ); ctx.stroke(); } /* Draw method for the fill */ public void draw_fill( Cairo.Context ctx, double x, double y, double w, double h, NodeSide s ) { ctx.rectangle( x, y, w, h ); ctx.fill(); } } Minder-1.5.1/src/themes/000077500000000000000000000000001356632107200150155ustar00rootroot00000000000000Minder-1.5.1/src/themes/ThemeDark.vala000066400000000000000000000044641356632107200175360ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class ThemeDark : Theme { /* Create the theme colors */ public ThemeDark() { name = _( "Dark" ); custom = false; /* Generate the non-link colors */ set_color( "background", color_from_string( "#000000" ) ); set_color( "foreground", color_from_string( "White" ) ); set_color( "root_background", color_from_string( "#d4d4d4" ) ); set_color( "root_foreground", color_from_string( "Black" ) ); set_color( "nodesel_background", color_from_string( "#64baff" ) ); set_color( "nodesel_foreground", color_from_string( "Black" ) ); set_color( "textsel_background", color_from_string( "#0d52bf" ) ); set_color( "textsel_foreground", color_from_string( "White" ) ); set_color( "text_cursor", color_from_string( "White" ) ); set_color( "attachable", color_from_string( "#9bdb4d" ) ); set_color( "connection", color_from_string( "#404040" ) ); /* Generate the link colors */ set_color( "link_color0", color_from_string( "#c6262e" ) ); set_color( "link_color1", color_from_string( "#f37329" ) ); set_color( "link_color2", color_from_string( "#f9c440" ) ); set_color( "link_color3", color_from_string( "#68b723" ) ); set_color( "link_color4", color_from_string( "#3689e6" ) ); set_color( "link_color5", color_from_string( "#7a36b1" ) ); set_color( "link_color6", color_from_string( "#715344" ) ); set_color( "link_color7", color_from_string( "#bbbbbb" ) ); prefer_dark = true; } } Minder-1.5.1/src/themes/ThemeDefault.vala000066400000000000000000000044331356632107200202350ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class ThemeDefault : Theme { /* Create the theme colors */ public ThemeDefault() { name = _( "Default" ); custom = false; /* Generate the non-link colors */ set_color( "background", color_from_string( "#ffffff" ) ); set_color( "foreground", color_from_string( "Black" ) ); set_color( "root_background", color_from_string( "#d4d4d4" ) ); set_color( "root_foreground", color_from_string( "Black" ) ); set_color( "nodesel_background", color_from_string( "#64baff" ) ); set_color( "nodesel_foreground", color_from_string( "Black" ) ); set_color( "textsel_background", color_from_string( "#0d52bf" ) ); set_color( "textsel_foreground", color_from_string( "White" ) ); set_color( "text_cursor", color_from_string( "Black" ) ); set_color( "attachable", color_from_string( "#9bdb4d" ) ); set_color( "connection", color_from_string( "#777777" ) ); set_color( "link_color0", color_from_string( "#c6262e" ) ); set_color( "link_color1", color_from_string( "#f37329" ) ); set_color( "link_color2", color_from_string( "#f9c440" ) ); set_color( "link_color3", color_from_string( "#68b723" ) ); set_color( "link_color4", color_from_string( "#3689e6" ) ); set_color( "link_color5", color_from_string( "#7a36b1" ) ); set_color( "link_color6", color_from_string( "#715344" ) ); set_color( "link_color7", color_from_string( "#333333" ) ); prefer_dark = false; } } Minder-1.5.1/src/themes/ThemeSolarizedDark.vala000066400000000000000000000045171356632107200214120ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gdk; using Gtk; public class ThemeSolarizedDark : Theme { /* Create the theme colors */ public ThemeSolarizedDark() { name = _( "Solarized Dark" ); custom = false; /* Generate the non-link colors */ set_color( "background", color_from_string( "#002B36" ) ); set_color( "foreground", color_from_string( "#93A1A1" ) ); set_color( "root_background", color_from_string( "#d4d4d4" ) ); set_color( "root_foreground", color_from_string( "#000000" ) ); set_color( "nodesel_background", color_from_string( "#586E75" ) ); set_color( "nodesel_foreground", color_from_string( "#ffffff" ) ); set_color( "textsel_background", color_from_string( "#657B83" ) ); set_color( "textsel_foreground", color_from_string( "#002B36" ) ); set_color( "text_cursor", color_from_string( "#93A1A1" ) ); set_color( "attachable", color_from_string( "#9bdb4d" ) ); set_color( "connection", color_from_string( "#606060" ) ); set_color( "link_color0", color_from_string( "#DC322F" ) ); set_color( "link_color1", color_from_string( "#CB4B16" ) ); set_color( "link_color2", color_from_string( "#B58900" ) ); set_color( "link_color3", color_from_string( "#859900" ) ); set_color( "link_color4", color_from_string( "#268BD2" ) ); set_color( "link_color5", color_from_string( "#6C71C4" ) ); set_color( "link_color6", color_from_string( "#D33682" ) ); set_color( "link_color7", color_from_string( "#2AA198" ) ); prefer_dark = true; } } Minder-1.5.1/src/themes/ThemeSolarizedLight.vala000066400000000000000000000045231356632107200215750ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gdk; using Gtk; public class ThemeSolarizedLight : Theme { /* Create the theme colors */ public ThemeSolarizedLight() { name = _( "Solarized Light" ); custom = false; /* Generate the non-link colors */ set_color( "background", color_from_string( "#FDF6E3" ) ); set_color( "foreground", color_from_string( "#586E75" ) ); set_color( "root_background", color_from_string( "#839496" ) ); set_color( "root_foreground", color_from_string( "#FDF6E3" ) ); set_color( "nodesel_background", color_from_string( "#586E75" ) ); set_color( "nodesel_foreground", color_from_string( "#ffffff" ) ); set_color( "textsel_background", color_from_string( "#93A1A1" ) ); set_color( "textsel_foreground", color_from_string( "#002B36" ) ); set_color( "text_cursor", color_from_string( "#586E75" ) ); set_color( "attachable", color_from_string( "#9bdb4d" ) ); set_color( "connection", color_from_string( "#606060" ) ); set_color( "link_color0", color_from_string( "#DC322F" ) ); set_color( "link_color1", color_from_string( "#CB4B16" ) ); set_color( "link_color2", color_from_string( "#B58900" ) ); set_color( "link_color3", color_from_string( "#859900" ) ); set_color( "link_color4", color_from_string( "#268BD2" ) ); set_color( "link_color5", color_from_string( "#6C71C4" ) ); set_color( "link_color6", color_from_string( "#D33682" ) ); set_color( "link_color7", color_from_string( "#2AA198" ) ); prefer_dark = false; } } Minder-1.5.1/src/undo_actions/000077500000000000000000000000001356632107200162155ustar00rootroot00000000000000Minder-1.5.1/src/undo_actions/UndoConnectionAdd.vala000066400000000000000000000030011356632107200224120ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoConnectionAdd : UndoItem { Connection _connection; /* Constructor for adding a connection */ public UndoConnectionAdd( Connection connection ) { base( _( "add connection" ) ); _connection = connection; } /* Undoes a connection change */ public override void undo( DrawArea da ) { da.get_connections().remove_connection( _connection, false ); da.set_current_connection( null ); da.queue_draw(); da.changed(); } /* Redoes a connection change */ public override void redo( DrawArea da ) { da.get_connections().add_connection( _connection ); da.set_current_connection( _connection ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoConnectionChange.vala000066400000000000000000000033771356632107200231270ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoConnectionChange : UndoItem { Connection? _old_connection; Connection? _new_connection; /* Constructor for adding/removing/changing a connection */ public UndoConnectionChange( string name, Connection? old_connection, Connection? new_connection ) { base( name ); _old_connection = old_connection; _new_connection = new_connection; } /* Undoes a connection change */ public override void undo( DrawArea da ) { if( _old_connection == null ) { da.get_connections().remove_connection( _new_connection, true ); } da.set_current_connection( _old_connection ); da.queue_draw(); da.changed(); } /* Redoes a connection change */ public override void redo( DrawArea da ) { if( _new_connection == null ) { da.get_connections().remove_connection( _old_connection, true ); } da.set_current_connection( _new_connection ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoConnectionColor.vala000066400000000000000000000030361356632107200230100ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public class UndoConnectionColor : UndoItem { Connection _conn; RGBA _old_color; RGBA _new_color; /* Constructor for a node name change */ public UndoConnectionColor( Connection c, RGBA old_color ) { base( _( "connection color change" ) ); _conn = c; _old_color = old_color; _new_color = c.color; } /* Undoes a node name change */ public override void undo( DrawArea da ) { _conn.color = _old_color; da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _conn.color = _new_color; da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoConnectionDelete.vala000066400000000000000000000030141356632107200231300ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoConnectionDelete : UndoItem { Connection _connection; /* Constructor for deleting a connection */ public UndoConnectionDelete( Connection connection ) { base( _( "delete connection" ) ); _connection = connection; } /* Undoes a connection change */ public override void undo( DrawArea da ) { da.get_connections().add_connection( _connection ); da.set_current_connection( _connection ); da.queue_draw(); da.changed(); } /* Redoes a connection change */ public override void redo( DrawArea da ) { da.get_connections().remove_connection( _connection, false ); da.set_current_connection( null ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoConnectionNote.vala000066400000000000000000000030061356632107200226340ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoConnectionNote : UndoItem { Connection _conn; string _old_note; string _new_note; /* Constructor for a node name change */ public UndoConnectionNote( Connection c, string old_note ) { base( _( "connection note change" ) ); _conn = c; _old_note = old_note; _new_note = c.note; } /* Undoes a node name change */ public override void undo( DrawArea da ) { _conn.note = _old_note; da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _conn.note = _new_note; da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoConnectionTitle.vala000066400000000000000000000031461356632107200230150ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoConnectionTitle : UndoItem { Connection _conn; string? _old_title; string? _new_title; /* Constructor for a connection title change */ public UndoConnectionTitle( Connection c, string? old_title ) { base( _( "connection title change" ) ); _conn = c; _old_title = old_title; _new_title = (c.title == null) ? null : c.title.text; } private void change( DrawArea da, string? title ) { _conn.change_title( da, title ); da.queue_draw(); da.current_changed( da ); da.changed(); } /* Undoes a connection title change */ public override void undo( DrawArea da ) { change( da, _old_title ); } /* Redoes a connection title change */ public override void redo( DrawArea da ) { change( da, _new_title ); } } Minder-1.5.1/src/undo_actions/UndoNodeAddParent.vala000066400000000000000000000034171356632107200223650ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public class UndoNodeAddParent : UndoItem { private Node _parent; private Node _child; /* Default constructor */ public UndoNodeAddParent( Node parent, Node child ) { base( _( "add parent node" ) ); _parent = parent; _child = child; } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { var parent = _parent.parent; var index = _parent.index(); _child.detach( _child.side ); _parent.detach( _parent.side ); _child.attach( parent, index, null ); da.set_current_node( _child ); da.queue_draw(); da.changed(); } /* Performs a redo operation */ public override void redo( DrawArea da ) { var parent = _child.parent; var index = _child.index(); _child.detach( _child.side ); _parent.attach( parent, index, null ); _child.attach( _parent, -1, null ); da.set_current_node( _parent ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeAttach.vala000066400000000000000000000064611356632107200217310ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public class UndoNodeAttach : UndoItem { private Node _n; private Node? _old_parent; private NodeSide _old_side; private int _old_index; private Array _old_info; private Node _new_parent; private NodeSide _new_side; private int _new_index; private Array _new_info; /* Default constructor */ public UndoNodeAttach( Node n, Node? old_parent, NodeSide old_side, int old_index, Array old_info ) { base( _( "attach node" ) ); _n = n; _old_parent = old_parent; _old_side = old_side; _old_index = old_index; _old_info = old_info; _new_parent = n.parent; _new_side = n.side; _new_index = n.index(); _new_info = new Array(); _n.get_node_info( ref _new_info ); } /* Constructor for root nodes */ public UndoNodeAttach.for_root( Node n, int old_index, Array old_info ) { base( _( "attach node" ) ); _n = n; _old_parent = null; _old_index = old_index; _old_info = old_info; _new_parent = n.parent; _new_side = n.side; _new_index = n.index(); _new_info = new Array(); _n.get_node_info( ref _new_info ); } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { int index = 0; da.animator.add_nodes( "undo attach" ); _n.detach( _new_side ); if( _old_parent == null ) { da.add_root( _n, _old_index ); _n.set_node_info( _old_info, ref index ); } else { _n.set_node_info( _old_info, ref index ); _n.side = _old_side; _n.layout.propagate_side( _n, _old_side ); _n.attach_init( _old_parent, _old_index ); } da.set_current_node( _n ); da.animator.animate(); da.changed(); } /* Performs a redo operation */ public override void redo( DrawArea da ) { int index = 0; da.animator.add_nodes( "redo attach" ); if( _old_parent == null ) { da.remove_root( _old_index ); } else { _n.detach( _old_side ); } _n.side = _new_side; _n.layout.propagate_side( _n, _new_side ); if( _old_parent == null ) { _n.attach( _new_parent, -1, da.get_theme() ); _n.set_node_info( _new_info, ref index ); } else { _n.set_node_info( _new_info, ref index ); _n.attach_init( _new_parent, _new_index ); } da.set_current_node( _n ); da.animator.animate(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeBalance.vala000066400000000000000000000060631356632107200220500ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class UndoNodeBalance : UndoItem { private class BalanceNodes { private Array _nodes; private Array _sides; /* Stores the given node into this class */ public BalanceNodes( Node n ) { _nodes = new Array(); _sides = new Array(); for( int i=0; i _old; private Array? _new = null; private Node? _root = null; /* Default constructor */ public UndoNodeBalance( DrawArea da, Node? root_node ) { base( _( "balance nodes" ) ); _root = root_node; _old = new Array(); if( root_node == null ) { for( int i=0; i nodes ) { da.animator.add_nodes( "undo balance nodes" ); if( _root == null ) { for( int i=0; i(); for( int i=0; i */ using Gtk; public class UndoNodeCut : UndoItem { Node _node; Node? _parent; int _index; Array _conns; /* Default constructor */ public UndoNodeCut( Node n, int index, Array conns ) { base( _( "cut node" ) ); _node = n; _parent = n.parent; _index = index; _conns = conns; } /* Undoes a node deletion */ public override void undo( DrawArea da ) { da.node_clipboard.clear(); if( _parent == null ) { da.add_root( _node, _index ); } else { _node.attach_init( _parent, _index ); } da.set_current_node( _node ); for( int i=0; i<_conns.length; i++ ) { da.get_connections().add_connection( _conns.index( i ) ); } da.queue_draw(); da.changed(); } /* Redoes a node deletion */ public override void redo( DrawArea da ) { da.node_clipboard.set_text( da.serialize_for_copy( _node ), -1 ); da.node_clipboard.store(); if( _parent == null ) { da.remove_root( _index ); } else { _node.detach( _node.side ); } da.set_current_node( null ); for( int i=0; i<_conns.length; i++ ) { da.get_connections().remove_connection( _conns.index( i ), false ); } da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeDelete.vala000066400000000000000000000037551356632107200217320ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeDelete : UndoItem { Node _node; Node? _parent; int _index; Array _conns; /* Default constructor */ public UndoNodeDelete( Node n, int index, Array conns ) { base( _( "delete node" ) ); _node = n; _parent = n.parent; _index = index; _conns = conns; } /* Undoes a node deletion */ public override void undo( DrawArea da ) { if( _parent == null ) { da.add_root( _node, _index ); } else { _node.attached = true; _node.attach_init( _parent, _index ); } da.set_current_node( _node ); for( int i=0; i<_conns.length; i++ ) { da.get_connections().add_connection( _conns.index( i ) ); } da.queue_draw(); da.changed(); } /* Redoes a node deletion */ public override void redo( DrawArea da ) { if( _parent == null ) { da.remove_root( _index ); } else { _node.detach( _node.side ); } da.set_current_node( null ); for( int i=0; i<_conns.length; i++ ) { da.get_connections().remove_connection( _conns.index( i ), false ); } da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeDetach.vala000066400000000000000000000037111356632107200217100ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeDetach : UndoItem { private Node _n; private Node _old_parent; private NodeSide _old_side; private int _old_index; private int _root_index; /* Default constructor */ public UndoNodeDetach( Node n, int root_index, Node old_parent, NodeSide old_side, int old_index ) { base( _( "detach node" ) ); _n = n; _root_index = root_index; _old_parent = old_parent; _old_side = old_side; _old_index = old_index; } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { da.animator.add_nodes( "undo detach" ); da.remove_root( _root_index ); _old_parent.layout.propagate_side( _n, _old_side ); _n.attach( _old_parent, _old_index, null, false ); da.set_current_node( _n ); da.animator.animate(); da.queue_draw(); da.changed(); } /* Performs a redo operation */ public override void redo( DrawArea da ) { da.animator.add_nodes( "redo detach" ); _n.detach( _old_side ); da.add_root( _n, _root_index ); da.set_current_node( _n ); da.animator.animate(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeFold.vala000066400000000000000000000030711356632107200214030ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeFold : UndoItem { Node _node; bool _old_fold; bool _new_fold; /* Default constructor */ public UndoNodeFold( Node n, bool new_fold ) { base( _( "node change fold" ) ); _node = n; _old_fold = n.folded; _new_fold = new_fold; } /* Undoes a node fold operation */ public override void undo( DrawArea da ) { _node.folded = _old_fold; _node.layout.handle_update_by_fold( _node ); da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node fold operation */ public override void redo( DrawArea da ) { _node.folded = _new_fold; _node.layout.handle_update_by_fold( _node ); da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeFoldChanges.vala000066400000000000000000000032721356632107200226770ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeFoldChanges : UndoItem { private Array _changes; private bool _folded; /* Default constructor */ public UndoNodeFoldChanges( string msg, Array changes, bool folded ) { base( msg ); _changes = changes; _folded = folded; } /* Change the fold states of the changed list of nodes to the given value */ private void change_folds( DrawArea da, bool value ) { for( int i=0; i<_changes.length; i++ ) { _changes.index( i ).folded = value; _changes.index( i ).layout.handle_update_by_fold( _changes.index( i ) ); } da.queue_draw(); da.changed(); } /* Undoes a node fold operation */ public override void undo( DrawArea da ) { change_folds( da, !_folded ); } /* Redoes a node fold operation */ public override void redo( DrawArea da ) { change_folds( da, _folded ); } } Minder-1.5.1/src/undo_actions/UndoNodeImage.vala000066400000000000000000000031561356632107200215450ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeImage : UndoItem { Node _node; NodeImage? _old_image; NodeImage? _new_image; /* Constructor for a node name change */ public UndoNodeImage( Node n, NodeImage? old_image ) { base( _( "node image change" ) ); _node = n; _old_image = old_image; _new_image = n.image; } /* Changes the node image, adjusts the layout and updates the UI */ private void change( DrawArea da, NodeImage? img ) { _node.set_image( da.image_manager, img ); da.queue_draw(); da.current_changed( da ); da.changed(); } /* Undoes a node image change */ public override void undo( DrawArea da ) { change( da, _old_image ); } /* Redoes a node image change */ public override void redo( DrawArea da ) { change( da, _new_image ); } } Minder-1.5.1/src/undo_actions/UndoNodeInsert.vala000066400000000000000000000033251356632107200217650ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeInsert : UndoItem { private Node? _parent; private Node _n; private int _index; private bool _parent_folded; /* Default constructor */ public UndoNodeInsert( Node n ) { base( _( "insert node" ) ); _n = n; _index = n.index(); _parent = n.parent; _parent_folded = _parent.folded; } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { if( _parent_folded ) { _parent.folded = true; } _n.detach( _n.side ); if( da.get_current_node() == _n ) { da.set_current_node( null ); } da.queue_draw(); da.changed(); } /* Performs a redo operation */ public override void redo( DrawArea da ) { _parent.folded = _parent_folded; _n.attach( _parent, _index, null ); da.set_current_node( _n ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeLayout.vala000066400000000000000000000027571356632107200220060ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class UndoNodeLayout : UndoItem { private string _old_layout; private string _new_layout; private Node? _root; /* Default constructor */ public UndoNodeLayout( Layout old_layout, Layout new_layout, Node? root_node ) { base( _( "change layout" ) ); _old_layout = old_layout.name; _new_layout = new_layout.name; _root = root_node; } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { da.set_layout( _old_layout, _root, false ); da.loaded(); } /* Performs a redo operation */ public override void redo( DrawArea da ) { da.set_layout( _new_layout, _root, false ); da.loaded(); } } Minder-1.5.1/src/undo_actions/UndoNodeLink.vala000066400000000000000000000026751356632107200214250ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeLink : UndoItem { Node _node; Node? _old_link; Node? _new_link; /* Constructor for a node name change */ public UndoNodeLink( Node n, Node? old_link ) { base( _( "node link change" ) ); _node = n; _old_link = old_link; _new_link = _node.linked_node; } /* Undoes a node image change */ public override void undo( DrawArea da ) { _node.linked_node = _old_link; da.queue_draw(); da.changed(); } /* Redoes a node image change */ public override void redo( DrawArea da ) { _node.linked_node = _new_link; da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeLinkColor.vala000066400000000000000000000030131356632107200224070ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gdk; public class UndoNodeLinkColor : UndoItem { Node _node; RGBA _old_color; RGBA _new_color; /* Constructor for a node name change */ public UndoNodeLinkColor( Node n, RGBA old_color ) { base( _( "link color change" ) ); _node = n; _old_color = old_color; _new_color = n.link_color; } /* Undoes a node name change */ public override void undo( DrawArea da ) { _node.link_color = _old_color; da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _node.link_color = _new_color; da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeMove.vala000066400000000000000000000036371356632107200214350ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeMove : UndoItem { private Node _n; private NodeSide _old_side; private int _old_index; private NodeSide _new_side; private int _new_index; /* Default constructor */ public UndoNodeMove( Node n, NodeSide old_side, int old_index ) { base( _( "move node" ) ); _n = n; _old_side = old_side; _old_index = old_index; _new_side = n.side; _new_index = n.index(); } /* Perform the node move change */ public void change( DrawArea da, NodeSide old_side, NodeSide new_side, int new_index ) { Node parent = _n.parent; da.animator.add_nodes( "undo move" ); _n.detach( old_side ); _n.side = new_side; _n.layout.propagate_side( _n, new_side ); _n.attach( parent, new_index, null, false ); da.animator.animate(); } /* Performs an undo operation for this data */ public override void undo( DrawArea da ) { change( da, _new_side, _old_side, _old_index ); } /* Performs a redo operation */ public override void redo( DrawArea da ) { change( da, _old_side, _new_side, _new_index ); } } Minder-1.5.1/src/undo_actions/UndoNodeName.vala000066400000000000000000000027611356632107200214040ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeName : UndoItem { Node _node; string _old_name; string _new_name; /* Constructor for a node name change */ public UndoNodeName( Node n, string old_name ) { base( _( "node name change" ) ); _node = n; _old_name = old_name; _new_name = n.name.text; } /* Undoes a node name change */ public override void undo( DrawArea da ) { _node.name.text = _old_name; da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _node.name.text = _new_name; da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeNote.vala000066400000000000000000000027421356632107200214300ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeNote : UndoItem { Node _node; string _old_note; string _new_note; /* Constructor for a node name change */ public UndoNodeNote( Node n, string old_note ) { base( _( "node note change" ) ); _node = n; _old_note = old_note; _new_note = n.note; } /* Undoes a node name change */ public override void undo( DrawArea da ) { _node.note = _old_note; da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _node.note = _new_note; da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodePaste.vala000066400000000000000000000043561356632107200216020ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; using Gee; public class UndoNodePaste : UndoItem { private Array _parents; private Array _nodes; private Array _indices; private Array _conns; /* Default constructor */ public UndoNodePaste( Array nodes, Array conns ) { base( _( "paste node" ) ); _nodes = nodes; _conns = conns; _indices = new Array(); _parents = new Array(); for( int i=0; i */ using Gtk; public class UndoNodeResize : UndoItem { Node _node; int _old_width; int _new_width; /* Constructor for a node name change */ public UndoNodeResize( Node n, int old_width ) { base( _( "node resize" ) ); _node = n; _old_width = old_width; _new_width = n.max_width(); } /* Undoes a node name change */ public override void undo( DrawArea da ) { _node.resize( _old_width - _new_width ); da.queue_draw(); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { _node.resize( _new_width - _old_width ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeReveal.vala000066400000000000000000000033631356632107200217410ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodeReveal : UndoItem { Node _current; Node _node; Node _last; /* Default constructor */ public UndoNodeReveal( DrawArea da, Node n, Node last ) { base( _( "node reveal" ) ); _current = da.get_current_node(); _node = n; _last = last; } /* Performs the reveal/unreveal operation */ private void set_folds( DrawArea da, bool value ) { var tmp = _node.parent; while( tmp != _last ) { tmp.folded = value; tmp.layout.handle_update_by_fold( tmp ); tmp = tmp.parent; } } /* Undoes a node reveal operation */ public override void undo( DrawArea da ) { set_folds( da, true ); da.set_current_node( _current ); da.queue_draw(); da.changed(); } /* Redoes a node reveal operation */ public override void redo( DrawArea da ) { set_folds( da, false ); da.set_current_node( _node ); da.queue_draw(); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodeSort.vala000066400000000000000000000043411356632107200214470ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ public class UndoNodeSort : UndoItem { private class SortNodes { private Array _nodes; /* Stores the given node into this class */ public SortNodes( Node n ) { _nodes = new Array(); for( int i=0; i */ using Gtk; public class UndoNodeTask : UndoItem { Node _node; bool _old_enable; bool _old_done; bool _new_enable; bool _new_done; /* Constructor for a node name change */ public UndoNodeTask( Node n, bool new_enable, bool new_done ) { base( _( "node task change" ) ); _node = n; _old_enable = n.task_enabled(); _old_done = n.task_done(); _new_enable = new_enable; _new_done = new_done; } /* Undoes a node name change */ public override void undo( DrawArea da ) { if( _old_enable != _new_enable ) { _node.enable_task( _old_enable ); } else { _node.set_task_done( _old_done ); } da.queue_draw(); da.current_changed( da ); da.changed(); } /* Redoes a node name change */ public override void redo( DrawArea da ) { if( _old_enable != _new_enable ) { _node.enable_task( _new_enable ); } else { _node.set_task_done( _new_done ); } da.queue_draw(); da.current_changed( da ); da.changed(); } } Minder-1.5.1/src/undo_actions/UndoNodesInsert.vala000066400000000000000000000044531356632107200221530ustar00rootroot00000000000000/* * Copyright (c) 2018 (https://github.com/phase1geo/Minder) * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program; if not, write to the * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301 USA * * Authored by: Trevor Williams */ using Gtk; public class UndoNodesInsert : UndoItem { struct InsertedNode { Node? parent; Node n; int index; bool parent_folded; } private Array _nodes; /* Default constructor */ public UndoNodesInsert( DrawArea da, Array nodes ) { base( _( "insert nodes" ) ); _nodes = new Array(); for( int i=0; i */ using Gtk; public class UndoStyleAffectChange : UndoStyleChange { private GenericArray