pax_global_header00006660000000000000000000000064151632122660014516gustar00rootroot0000000000000052 comment=8f6f485ed4722f10a0f400cdaa251238fc70474b icingaweb2-module-graphite-1.3.0/000077500000000000000000000000001516321226600166155ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/LICENSE.md000066400000000000000000001045131516321226600202250ustar00rootroot00000000000000 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 . icingaweb2-module-graphite-1.3.0/README.md000066400000000000000000000017321516321226600200770ustar00rootroot00000000000000# Icinga Web Graphite Integration ![Icinga Logo](https://icinga.com/wp-content/uploads/2014/06/icinga_logo.png) This module integrates an existing [Graphite](https://graphite.readthedocs.io/en/latest/) installation in your [Icinga Web 2](https://icinga.com/products/infrastructure-monitoring/) frontend. ![Service List](doc/img/service-list.png) ![Detail View](doc/img/service-detail-view.png) It provides a new menu section with two general overviews for hosts and services as well as an extension to the host and service detail view of the monitoring module. ## Documentation * [Installation](https://icinga.com/docs/icinga-web-graphite-integration/latest/doc/02-Installation/) * [Configuration](https://icinga.com/docs/icinga-web-graphite-integration/latest/doc/03-Configuration/) * [Templates](https://icinga.com/docs/icinga-web-graphite-integration/latest/doc/04-Templates/) * [Development](https://icinga.com/docs/icinga-web-graphite-integration/latest/doc/06-Development/) icingaweb2-module-graphite-1.3.0/application/000077500000000000000000000000001516321226600211205ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/clicommands/000077500000000000000000000000001516321226600234115ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/clicommands/Icinga2Command.php000066400000000000000000000142401516321226600266760ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Clicommands; use Icinga\Cli\Command; use Icinga\Module\Graphite\Graphing\GraphingTrait; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Util\MacroTemplate; use Icinga\Module\Graphite\Web\Widget\Graphs; class Icinga2Command extends Command { use GraphingTrait; /** * Generate Icinga 2 host and service config based on the present graph templates * * The generated (fictive) monitored objects' checks yield random perfdata to be * written to Graphite as expected by the present graph templates of this module. * The generated Icinga 2 config can be used to simulate graphs generated based * on the graph templates. * * icingacli graphite icinga2 config */ public function configAction() { $icinga2CfgObjPrefix = 'IW2_graphite_demo'; $obscuredCheckCommandCustomVar = Graphs::getObscuredCheckCommandCustomVar(); $result = [ << max in macro("\$$icinga2CfgObjPrefix\$")) { res += " '" + label + "'=" + (random() % max) + ";" + (max * 0.8) + ";" + (max * 0.9) + ";0;" + max } res }} } } EOT , <<getAllTemplates() as $checkCommand => $templates) { $perfdata = []; foreach ($templates as $templateName => $template) { /** @var Template $template */ $urlParams = $template->getUrlParams(); switch (isset($urlParams['yUnitSystem']) ? $urlParams['yUnitSystem']->resolve([]) : 'none') { case 'si': case 'binary': $max = 42000000; break; case 'sec': case 'msec': $max = 82800; break; default: $max = 100; } foreach ($template->getCurves() as $curveName => $curve) { /** @var MacroTemplate $metricFilter */ $metricFilter = $curve[0]; $macros = array_flip($metricFilter->getMacros()); $service = isset($macros['service_name_template']); foreach ($macros as & $macro) { $macro = ['dummy1', 'dummy2', 'dummy3', 'dummy4']; } $macros['host_name_template'] = ['']; $macros['service_name_template'] = ['']; foreach ($this->cartesianProduct($macros) as $macroValues) { if ( preg_match( '/\A\.[^.]+\.(.+)\.[^.]+\z/', $metricFilter->resolve($macroValues), $match ) ) { $perfdata[$match[1]] = $max; } } } } assert(isset($service), '$service not initialized in the loop'); $monObj = $service ? [ "apply Service \"{$icinga2CfgObjPrefix}_{$checkCommand}\" {", " assign where host.vars.$icinga2CfgObjPrefix" ] : ["object Host \"{$icinga2CfgObjPrefix}_{$checkCommand}\" {"]; $monObj[] = " check_command = \"$icinga2CfgObjPrefix\""; $monObj[] = ' check_interval = 30s'; $monObj[] = " vars.$obscuredCheckCommandCustomVar = \"$checkCommand\""; $monObj[] = " vars.$icinga2CfgObjPrefix = {"; foreach ($perfdata as $label => $max) { $monObj[] = " \"$label\" = $max"; } $monObj[] = ' }'; $monObj[] = '}'; $result[] = implode("\n", $monObj); } echo implode("\n\n", $result) . "\n"; } /** * Generate the cartesian product of the given array * * [ * 'a' => ['b', 'c'], * 'd' => ['e', 'f'] * ] * * [ * ['a' => 'b', 'd' => 'e'], * ['a' => 'b', 'd' => 'f'], * ['a' => 'c', 'd' => 'e'], * ['a' => 'c', 'd' => 'f'] * ] * * @param array[] $input * * @return array[] */ protected function cartesianProduct(array &$input) { $results = [[]]; foreach ($input as $key => & $values) { $nextStep = []; foreach ($results as & $result) { foreach ($values as $value) { $nextStep[] = array_merge($result, [$key => $value]); } } unset($result); $results = & $nextStep; unset($nextStep); } unset($values); return $results; } } icingaweb2-module-graphite-1.3.0/application/controllers/000077500000000000000000000000001516321226600234665ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/controllers/ConfigController.php000066400000000000000000000017031516321226600274510ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use Icinga\Module\Graphite\Forms\Config\AdvancedForm; use Icinga\Module\Graphite\Forms\Config\BackendForm; use Icinga\Web\Controller; class ConfigController extends Controller { public function init() { $this->assertPermission('config/modules'); parent::init(); } public function backendAction() { $this->view->form = $form = new BackendForm(); $form->setIniConfig($this->Config())->handleRequest(); $this->view->tabs = $this->Module()->getConfigTabs()->activate('backend'); } public function advancedAction() { $this->view->form = $form = new AdvancedForm(); $form->setIniConfig($this->Config())->handleRequest(); $this->view->tabs = $this->Module()->getConfigTabs()->activate('advanced'); } } icingaweb2-module-graphite-1.3.0/application/controllers/GraphController.php000066400000000000000000000133031516321226600273040ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use Icinga\Exception\Http\HttpBadRequestException; use Icinga\Exception\Http\HttpNotFoundException; use Icinga\Module\Graphite\Graphing\GraphingTrait; use Icinga\Module\Graphite\Util\IcingadbUtils; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Icingadb\Model\Host; use Icinga\Module\Icingadb\Model\Service; use Icinga\Web\Controller; use Icinga\Web\UrlParams; use ipl\Orm\Model; use ipl\Stdlib\Filter; class GraphController extends Controller { use GraphingTrait; /** * The URL parameters for the graph * * @var string[] */ protected $graphParamsNames = [ 'start', 'end', 'width', 'height', 'legend', 'template', 'default_template', 'bgcolor', 'fgcolor', 'majorGridLineColor', 'minorGridLineColor' ]; /** * The URL parameters for metrics filtering * * @var UrlParams */ protected $filterParams; /** * The URL parameters for the graph * * @var string[] */ protected $graphParams = []; public function init() { parent::init(); $this->filterParams = clone $this->getRequest()->getUrl()->getParams(); foreach ($this->graphParamsNames as $paramName) { $this->graphParams[$paramName] = $this->filterParams->shift($paramName); } } public function serviceAction() { $hostName = $this->filterParams->getRequired('host.name'); $serviceName = $this->filterParams->getRequired('service.name'); $icingadbUtils = IcingadbUtils::getInstance(); $query = Service::on($icingadbUtils->getDb()) ->with('state') ->with('host'); $query->filter(Filter::all( Filter::equal('service.name', $serviceName), Filter::equal('service.host.name', $hostName) )); $icingadbUtils->applyRestrictions($query); /** @var Service $service */ $service = $query->first(); if ($service === null) { throw new HttpNotFoundException($this->translate('No such service')); } $checkCommandColumn = $service->vars[Graphs::getObscuredCheckCommandCustomVar()] ?? null; $this->supplyImage( $service, $service->checkcommand_name, $checkCommandColumn ); } public function hostAction() { $hostName = $this->filterParams->getRequired('host.name'); $icingadbUtils = IcingadbUtils::getInstance(); $query = Host::on($icingadbUtils->getDb())->with('state'); $query->filter(Filter::equal('host.name', $hostName)); $icingadbUtils->applyRestrictions($query); /** @var Host $host */ $host = $query->first(); if ($host === null) { throw new HttpNotFoundException($this->translate('No such host')); } $checkCommandColumn = $host->vars[Graphs::getObscuredCheckCommandCustomVar()] ?? null; $this->supplyImage( $host, $host->checkcommand_name, $checkCommandColumn ); } /** * Do all monitored object type independent actions * * @param Model $object The object to render the graphs for * @param string $checkCommand The check command of the object we supply an image for * @param string|null $obscuredCheckCommand The "real" check command (if any) of the object we * display graphs for */ protected function supplyImage($object, $checkCommand, $obscuredCheckCommand) { if (isset($this->graphParams['default_template'])) { $urlParam = 'default_template'; $templates = $this->getAllTemplates()->getDefaultTemplates(); } else { $urlParam = 'template'; $templates = $this->getAllTemplates()->getTemplates( $obscuredCheckCommand === null ? $checkCommand : $obscuredCheckCommand ); } if (! isset($templates[$this->graphParams[$urlParam]])) { throw new HttpNotFoundException($this->translate('No such template')); } $charts = $templates[$this->graphParams[$urlParam]]->getCharts( static::getMetricsDataSource(), $object, array_map('rawurldecode', $this->filterParams->toArray(false)) ); switch (count($charts)) { case 0: throw new HttpNotFoundException($this->translate('No such graph')); case 1: $charts[0] ->setFrom($this->graphParams['start']) ->setUntil($this->graphParams['end']) ->setWidth((int) $this->graphParams['width']) ->setHeight((int) $this->graphParams['height']) ->setBackgroundColor($this->graphParams['bgcolor']) ->setForegroundColor($this->graphParams['fgcolor']) ->setMajorGridLineColor($this->graphParams['majorGridLineColor']) ->setMinorGridLineColor($this->graphParams['minorGridLineColor']) ->setShowLegend((bool) $this->graphParams['legend']) ->serveImage($this->getResponse()); // not falling through, serveImage exits default: throw new HttpBadRequestException('%s', $this->translate( 'Graphite Web yields more than one metric for the given filter.' . ' Please specify a more precise filter.' )); } } } icingaweb2-module-graphite-1.3.0/application/controllers/HostsController.php000066400000000000000000000074271516321226600273550ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use GuzzleHttp\Psr7\ServerRequest; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Web\Controller\IcingadbGraphiteController; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Graphite\Web\Widget\IcingadbGraphs; use Icinga\Module\Icingadb\Model\Host; use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; use Icinga\Web\Url; use ipl\Html\HtmlString; use ipl\Stdlib\Filter; use ipl\Web\Control\LimitControl; use ipl\Web\Control\SortControl; class HostsController extends IcingadbGraphiteController { use TimeRangePickerTrait; public function indexAction() { if (! $this->useIcingadbAsBackend) { $params = urldecode($this->params->get('legacyParams')); $this->redirectNow(Url::fromPath('graphite/list/hosts')->setQueryString($params)); } // shift graph params to avoid exception $graphDebug = $this->params->shift('graph_debug'); $graphRange = $this->params->shift('graph_range'); if ($graphDebug) { IPT::enable(); } $baseFilter = $graphRange ? Filter::equal('graph_range', $graphRange) : null; foreach ($this->preservedParams as $param) { $this->params->shift($param); } $this->addTitleTab(t('Hosts')); $db = $this->getDb(); $hosts = Host::on($db)->with('state'); $hosts->filter(Filter::like('state.performance_data', '*')); $this->applyRestrictions($hosts); $limitControl = $this->createLimitControl(); $paginationControl = $this->createPaginationControl($hosts); $sortControl = $this->createSortControl($hosts, ['host.display_name' => t('Hostname')]); $searchBar = $this->createSearchBar( $hosts, array_merge( [$limitControl->getLimitParam(), $sortControl->getSortParam()], $this->preservedParams ) ); if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { if ($searchBar->hasBeenSubmitted()) { $filter = $this->getFilter(); } else { $this->addControl($searchBar); $this->sendMultipartUpdate(); return; } } else { $filter = $searchBar->getFilter(); } $hosts->filter($filter); $this->addControl($paginationControl); $this->addControl($sortControl); $this->addControl($limitControl); $this->addControl($searchBar); $this->handleTimeRangePickerRequest(); $this->addControl(HtmlString::create($this->renderTimeRangePicker($this->view))); $this->addContent( (new IcingadbGraphs($hosts->execute())) ->setBaseFilter($baseFilter) ); if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { $this->sendMultipartUpdate(); } $this->setAutorefreshInterval(30); } public function completeAction() { $suggestions = new ObjectSuggestions(); $suggestions->setModel(Host::class); $suggestions->forRequest(ServerRequest::fromGlobals()); $this->getDocument()->add($suggestions); } public function searchEditorAction() { $editor = $this->createSearchEditor( Host::on($this->getDb()), array_merge( [LimitControl::DEFAULT_LIMIT_PARAM, SortControl::DEFAULT_SORT_PARAM], $this->preservedParams ) ); $this->getDocument()->add($editor); $this->setTitle(t('Adjust Filter')); } } icingaweb2-module-graphite-1.3.0/application/controllers/ListController.php000066400000000000000000000145171516321226600271660ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use Icinga\Data\Filter\Filter; use Icinga\Module\Graphite\Util\TimeRangePickerTools; use Icinga\Module\Graphite\Web\Controller\MonitoringAwareController; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Icingadb\Compat\UrlMigrator; use Icinga\Module\Monitoring\DataView\DataView; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\Service; use Icinga\Web\Url; use Icinga\Web\Widget\Tabextension\DashboardAction; use Icinga\Web\Widget\Tabextension\MenuAction; use Icinga\Web\Widget\Tabextension\OutputFormat; use ipl\Web\Filter\QueryString; class ListController extends MonitoringAwareController { use TimeRangePickerTrait; public function init() { parent::init(); $this->getTabs() ->extend(new OutputFormat([OutputFormat::TYPE_CSV, OutputFormat::TYPE_JSON])) ->extend(new DashboardAction()) ->extend(new MenuAction()); } public function hostsAction() { if ($this->useIcingadbAsBackend) { $legacyParams = urlencode($this->params->toString()); $params = QueryString::render( UrlMigrator::transformFilter( QueryString::parse($this->params->toString()) ) ); $url = Url::fromPath('graphite/hosts') ->setQueryString($params); if ($legacyParams) { $url->setParam('legacyParams', $legacyParams); } $this->redirectNow($url); } $this->addTitleTab( 'hosts', mt('monitoring', 'Hosts'), mt('monitoring', 'List hosts') ); $hostsQuery = $this->applyMonitoringRestriction( $this->backend->select()->from('hoststatus', ['host_name']) ); $hostsQuery->applyFilter(Filter::expression('host_perfdata', '!=', '')); $this->view->baseUrl = $baseUrl = Url::fromPath('monitoring/host/show'); TimeRangePickerTools::copyAllRangeParameters( $baseUrl->getParams(), $this->getRequest()->getUrl()->getParams() ); $this->filterQuery($hostsQuery); $this->setupPaginationControl($hostsQuery); $this->setupLimitControl(); $this->setupSortControl(['host_display_name' => mt('monitoring', 'Hostname')], $hostsQuery); $hosts = []; foreach ($hostsQuery->peekAhead($this->view->compact) as $host) { $host = new Host($this->backend, $host->host_name); $host->fetch(); $hosts[] = $host; } $this->handleTimeRangePickerRequest(); $this->view->timeRangePicker = $this->renderTimeRangePicker($this->view); $this->view->hosts = $hosts; $this->view->hasMoreHosts = ! $this->view->compact && $hostsQuery->hasMore(); $this->setAutorefreshInterval(30); } public function servicesAction() { if ($this->useIcingadbAsBackend) { $legacyParams = urlencode($this->params->toString()); $params = QueryString::render( UrlMigrator::transformFilter( QueryString::parse($this->params->toString()) ) ); $url = Url::fromPath('graphite/services') ->setQueryString($params); if ($legacyParams) { $url->setParam('legacyParams', $legacyParams); } $this->redirectNow($url); } $this->addTitleTab( 'services', mt('monitoring', 'Services'), mt('monitoring', 'List services') ); $servicesQuery = $this->applyMonitoringRestriction( $this->backend->select()->from('servicestatus', ['host_name', 'service_description']) ); $servicesQuery->applyFilter(Filter::expression('service_perfdata', '!=', '')); $this->view->hostBaseUrl = $hostBaseUrl = Url::fromPath('monitoring/host/show'); TimeRangePickerTools::copyAllRangeParameters( $hostBaseUrl->getParams(), $this->getRequest()->getUrl()->getParams() ); $this->view->serviceBaseUrl = $serviceBaseUrl = Url::fromPath('monitoring/service/show'); TimeRangePickerTools::copyAllRangeParameters( $serviceBaseUrl->getParams(), $this->getRequest()->getUrl()->getParams() ); $this->filterQuery($servicesQuery); $this->setupPaginationControl($servicesQuery); $this->setupLimitControl(); $this->setupSortControl([ 'service_display_name' => mt('monitoring', 'Service Name'), 'host_display_name' => mt('monitoring', 'Hostname') ], $servicesQuery); $services = []; foreach ($servicesQuery->peekAhead($this->view->compact) as $service) { $service = new Service($this->backend, $service->host_name, $service->service_description); $service->fetch(); $services[] = $service; } $this->handleTimeRangePickerRequest(); $this->view->timeRangePicker = $this->renderTimeRangePicker($this->view); $this->view->services = $services; $this->view->hasMoreServices = ! $this->view->compact && $servicesQuery->hasMore(); $this->setAutorefreshInterval(30); } /** * Apply filters on a DataView * * @param DataView $dataView The DataView to apply filters on */ protected function filterQuery(DataView $dataView) { $this->setupFilterControl( $dataView, null, null, array_merge( ['format', 'stateType', 'addColumns', 'problems', 'graphs_limit'], TimeRangePickerTools::getAllRangeParameters() ) ); $this->handleFormatRequest($dataView); } /** * Add title tab * * @param string $action * @param string $title * @param string $tip */ protected function addTitleTab($action, $title, $tip) { $this->getTabs()->add($action, [ 'title' => $tip, 'label' => $title, 'url' => Url::fromRequest(), 'active' => true ]); } } icingaweb2-module-graphite-1.3.0/application/controllers/MonitoringGraphController.php000066400000000000000000000132611516321226600313550ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use Icinga\Exception\Http\HttpBadRequestException; use Icinga\Exception\Http\HttpNotFoundException; use Icinga\Module\Graphite\Graphing\GraphingTrait; use Icinga\Module\Graphite\Web\Controller\MonitoringAwareController; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\MonitoredObject; use Icinga\Module\Monitoring\Object\Service; use Icinga\Web\UrlParams; class MonitoringGraphController extends MonitoringAwareController { use GraphingTrait; /** * The URL parameters for the graph * * @var string[] */ protected $graphParamsNames = [ 'start', 'end', 'width', 'height', 'legend', 'template', 'default_template', 'bgcolor', 'fgcolor', 'majorGridLineColor', 'minorGridLineColor' ]; /** * The URL parameters for metrics filtering * * @var UrlParams */ protected $filterParams; /** * The URL parameters for the graph * * @var string[] */ protected $graphParams = []; public function init() { parent::init(); $this->filterParams = clone $this->getRequest()->getUrl()->getParams(); foreach ($this->graphParamsNames as $paramName) { $this->graphParams[$paramName] = $this->filterParams->shift($paramName); } } public function hostAction() { $hostName = $this->filterParams->getRequired('host.name'); $checkCommandColumn = '_host_' . Graphs::getObscuredCheckCommandCustomVar(); $host = $this->applyMonitoringRestriction( $this->backend->select()->from('hoststatus', ['host_check_command', $checkCommandColumn]) ) ->where('host_name', $hostName) ->limit(1) // just to be sure to save a few CPU cycles ->fetchRow(); if ($host === false) { throw new HttpNotFoundException($this->translate('No such host')); } $this->supplyImage(new Host($this->backend, $hostName), $host->host_check_command, $host->$checkCommandColumn); } public function serviceAction() { $hostName = $this->filterParams->getRequired('host.name'); $serviceName = $this->filterParams->getRequired('service.name'); $checkCommandColumn = '_service_' . Graphs::getObscuredCheckCommandCustomVar(); $service = $this->applyMonitoringRestriction( $this->backend->select()->from('servicestatus', ['service_check_command', $checkCommandColumn]) ) ->where('host_name', $hostName) ->where('service_description', $serviceName) ->limit(1) // just to be sure to save a few CPU cycles ->fetchRow(); if ($service === false) { throw new HttpNotFoundException($this->translate('No such service')); } $this->supplyImage( new Service($this->backend, $hostName, $serviceName), $service->service_check_command, $service->$checkCommandColumn ); } /** * Do all monitored object type independend actions * * @param MonitoredObject $object The object to render the graphs for * @param string $checkCommand The check command of the object we supply an image for * @param string|null $obscuredCheckCommand The "real" check command (if any) of the object we * display graphs for */ protected function supplyImage($object, $checkCommand, $obscuredCheckCommand) { if (isset($this->graphParams['default_template'])) { $urlParam = 'default_template'; $templates = $this->getAllTemplates()->getDefaultTemplates(); } else { $urlParam = 'template'; $templates = $this->getAllTemplates()->getTemplates( $obscuredCheckCommand === null ? $checkCommand : $obscuredCheckCommand ); } if (! isset($templates[$this->graphParams[$urlParam]])) { throw new HttpNotFoundException($this->translate('No such template')); } $charts = $templates[$this->graphParams[$urlParam]]->getCharts( static::getMetricsDataSource(), $object, array_map('rawurldecode', $this->filterParams->toArray(false)) ); switch (count($charts)) { case 0: throw new HttpNotFoundException($this->translate('No such graph')); case 1: $charts[0] ->setFrom($this->graphParams['start']) ->setUntil($this->graphParams['end']) ->setWidth((int) $this->graphParams['width']) ->setHeight((int) $this->graphParams['height']) ->setBackgroundColor($this->graphParams['bgcolor']) ->setForegroundColor($this->graphParams['fgcolor']) ->setMajorGridLineColor($this->graphParams['majorGridLineColor']) ->setMinorGridLineColor($this->graphParams['minorGridLineColor']) ->setShowLegend((bool) $this->graphParams['legend']) ->serveImage($this->getResponse()); // not falling through, serveImage exits default: throw new HttpBadRequestException($this->translate( 'Graphite Web yields more than one metric for the given filter.' . ' Please specify a more precise filter.' )); } } } icingaweb2-module-graphite-1.3.0/application/controllers/ServicesController.php000066400000000000000000000076721516321226600300420ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Controllers; use GuzzleHttp\Psr7\ServerRequest; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Web\Controller\IcingadbGraphiteController; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Graphite\Web\Widget\IcingadbGraphs; use Icinga\Module\Icingadb\Model\Service; use Icinga\Module\Icingadb\Web\Control\SearchBar\ObjectSuggestions; use Icinga\Web\Url; use ipl\Html\HtmlString; use ipl\Stdlib\Filter; use ipl\Web\Control\LimitControl; use ipl\Web\Control\SortControl; class ServicesController extends IcingadbGraphiteController { use TimeRangePickerTrait; public function indexAction() { if (! $this->useIcingadbAsBackend) { $params = urldecode($this->params->get('legacyParams')); $this->redirectNow(Url::fromPath('graphite/list/services')->setQueryString($params)); } // shift graph params to avoid exception $graphDebug = $this->params->shift('graph_debug'); $graphRange = $this->params->shift('graph_range'); if ($graphDebug) { IPT::enable(); } $baseFilter = $graphRange ? Filter::equal('graph_range', $graphRange) : null; foreach ($this->preservedParams as $param) { $this->params->shift($param); } $this->addTitleTab(t('Services')); $db = $this->getDb(); $services = Service::on($db) ->with('state') ->with('host'); $services->filter(Filter::like('state.performance_data', '*')); $this->applyRestrictions($services); $limitControl = $this->createLimitControl(); $paginationControl = $this->createPaginationControl($services); $sortControl = $this->createSortControl($services, [ 'service.display_name' => t('Servicename'), 'host.display_name' => t('Hostname') ]); $searchBar = $this->createSearchBar( $services, array_merge( [$limitControl->getLimitParam(), $sortControl->getSortParam()], $this->preservedParams ) ); if ($searchBar->hasBeenSent() && ! $searchBar->isValid()) { if ($searchBar->hasBeenSubmitted()) { $filter = $this->getFilter(); } else { $this->addControl($searchBar); $this->sendMultipartUpdate(); return; } } else { $filter = $searchBar->getFilter(); } $services->filter($filter); $this->addControl($paginationControl); $this->addControl($sortControl); $this->addControl($limitControl); $this->addControl($searchBar); $this->handleTimeRangePickerRequest(); $this->addControl(HtmlString::create($this->renderTimeRangePicker($this->view))); $this->addContent( (new IcingadbGraphs($services->execute())) ->setBaseFilter($baseFilter) ); if (! $searchBar->hasBeenSubmitted() && $searchBar->hasBeenSent()) { $this->sendMultipartUpdate(); } $this->setAutorefreshInterval(30); } public function completeAction() { $suggestions = new ObjectSuggestions(); $suggestions->setModel(Service::class); $suggestions->forRequest(ServerRequest::fromGlobals()); $this->getDocument()->add($suggestions); } public function searchEditorAction() { $editor = $this->createSearchEditor( Service::on($this->getDb()), array_merge( [LimitControl::DEFAULT_LIMIT_PARAM, SortControl::DEFAULT_SORT_PARAM], $this->preservedParams ) ); $this->getDocument()->add($editor); $this->setTitle(t('Adjust Filter')); } } icingaweb2-module-graphite-1.3.0/application/forms/000077500000000000000000000000001516321226600222465ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/forms/Config/000077500000000000000000000000001516321226600234535ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/forms/Config/AdvancedForm.php000066400000000000000000000074031516321226600265210ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Forms\Config; use Icinga\Forms\ConfigForm; use Icinga\Module\Graphite\Web\Form\Validator\MacroTemplateValidator; use Zend_Validate_Regex; class AdvancedForm extends ConfigForm { public function init() { $this->setName('form_config_graphite_advanced'); $this->setSubmitLabel($this->translate('Save Changes')); } public function createElements(array $formData) { $this->addElements([ [ 'number', 'ui_default_time_range', [ 'label' => $this->translate('Default time range'), 'description' => $this->translate('The default time range for graphs'), 'min' => 0, 'value' => 1 ] ], [ 'select', 'ui_default_time_range_unit', [ 'label' => $this->translate('Default time range unit'), 'description' => $this->translate('The above range\'s unit'), 'multiOptions' => [ 'minutes' => $this->translate('Minutes'), 'hours' => $this->translate('Hours'), 'days' => $this->translate('Days'), 'weeks' => $this->translate('Weeks'), 'months' => $this->translate('Months'), 'years' => $this->translate('Years') ], 'value' => 'hours' ] ], [ 'checkbox', 'ui_disable_no_graphs_found', [ 'label' => $this->translate('Disable "no graphs found"'), 'description' => $this->translate( 'If no graphs were found for a monitored object, just display nothing at all' ), ] ], [ 'text', 'icinga_graphite_writer_host_name_template', [ 'label' => $this->translate('Host name template'), 'description' => $this->translate( 'The value of your Icinga 2 GraphiteWriter\'s' . ' attribute host_name_template (if specified)' ), 'validators' => [new MacroTemplateValidator()] ] ], [ 'text', 'icinga_graphite_writer_service_name_template', [ 'label' => $this->translate('Service name template'), 'description' => $this->translate( 'The value of your Icinga 2 GraphiteWriter\'s' . ' attribute service_name_template (if specified)' ), 'validators' => [new MacroTemplateValidator()] ] ], [ 'text', 'icinga_customvar_obscured_check_command', [ 'label' => $this->translate('Obscured check command custom variable'), 'description' => $this->translate( 'The Icinga custom variable with the "actual" check command obscured' . ' by e.g. check_by_ssh (defaults to check_command)' ), 'validators' => [new Zend_Validate_Regex('/\A\w*\z/')] ] ] ]); } } icingaweb2-module-graphite-1.3.0/application/forms/Config/BackendForm.php000066400000000000000000000046371516321226600263510ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Forms\Config; use Icinga\Forms\ConfigForm; use Icinga\Module\Graphite\Web\Form\Validator\HttpUserValidator; class BackendForm extends ConfigForm { public function init() { $this->setName('form_config_graphite_backend'); $this->setSubmitLabel($this->translate('Save Changes')); } public function createElements(array $formData) { $this->addElements([ [ 'text', 'graphite_url', [ 'required' => true, 'label' => $this->translate('Graphite Web URL'), 'description' => $this->translate('URL to your Graphite Web'), 'validators' => ['UrlValidator'] ] ], [ 'text', 'graphite_user', [ 'label' => $this->translate('Graphite Web user'), 'description' => $this->translate( 'A user with access to your Graphite Web via HTTP basic authentication' ), 'validators' => [new HttpUserValidator()] ] ], [ 'password', 'graphite_password', [ 'renderPassword' => true, 'label' => $this->translate('Graphite Web password'), 'description' => $this->translate('The above user\'s password') ] ], [ 'checkbox', 'graphite_insecure', [ 'label' => $this->translate('Connect insecurely'), 'description' => $this->translate('Check this to not verify the remote\'s TLS certificate') ] ], [ 'number', 'graphite_timeout', [ 'label' => $this->translate('Request timeout'), 'description' => $this->translate('The timeout for HTTP requests to Graphite Web'), 'min' => 0, 'placeholder' => 10 ] ] ]); } } icingaweb2-module-graphite-1.3.0/application/forms/TimeRangePicker/000077500000000000000000000000001516321226600252575ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/forms/TimeRangePicker/CommonForm.php000066400000000000000000000143101516321226600300430ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Forms\TimeRangePicker; use Icinga\Module\Graphite\Util\TimeRangePickerTools; use Icinga\Web\Form; use Zend_Form_Element_Select; class CommonForm extends Form { /** * The selectable units with themselves in seconds * * One month equals 30 days and one year equals 365.25 days. This should cover enough cases. * * @var int[] */ protected $rangeFactors = [ 'minutes' => 60, 'hours' => 3600, 'days' => 86400, 'weeks' => 604800, 'months' => 2592000, 'years' => 31557600 ]; /** * The elements' default values * * @var string[]|null */ protected $defaultFormData; public function init() { $this->setName('form_timerangepickercommon_graphite'); $this->setAttrib('data-base-target', '_self'); $this->setAttrib('class', 'icinga-form icinga-controls inline'); } public function createElements(array $formData) { $this->addElements([ $this->createSelect( 'minutes', $this->translate('Minutes'), $this->translate('Show the last … minutes'), [5, 10, 15, 30, 45], $this->translate('%d minute'), $this->translate('%d minutes') ), $this->createSelect( 'hours', $this->translate('Hours'), $this->translate('Show the last … hours'), [1, 2, 3, 6, 12, 18], $this->translate('%d hour'), $this->translate('%d hours') ), $this->createSelect( 'days', $this->translate('Days'), $this->translate('Show the last … days'), range(1, 6), $this->translate('%d day'), $this->translate('%d days') ), $this->createSelect( 'weeks', $this->translate('Weeks'), $this->translate('Show the last … weeks'), range(1, 4), $this->translate('%d week'), $this->translate('%d weeks') ), $this->createSelect( 'months', $this->translate('Months'), $this->translate('Show the last … months'), [1, 2, 3, 6, 9], $this->translate('%d month'), $this->translate('%d months') ), $this->createSelect( 'years', $this->translate('Years'), $this->translate('Show the last … years'), range(1, 3), $this->translate('%d year'), $this->translate('%d years') ) ]); $this->urlToForm(); $this->defaultFormData = $this->getValues(); } public function onSuccess() { $this->formToUrl(); $this->getRedirectUrl()->remove(array_values(TimeRangePickerTools::getAbsoluteRangeParameters())); } /** * Create a common range picker for a specific time unit * * @param string $name * @param string $label * @param string $description * @param int[] $options * @param string $singular * @param string $plural * * @return Zend_Form_Element_Select */ protected function createSelect($name, $label, $description, array $options, $singular, $plural) { $multiOptions = ['' => $label]; foreach ($options as $option) { $multiOptions[$option] = sprintf($option === 1 ? $singular : $plural, $option); } $element = $this->createElement('select', $name, [ 'label' => $label, 'description' => $description, 'multiOptions' => $multiOptions, 'title' => $description, 'autosubmit' => true ]); $decorators = $element->getDecorators(); $element->setDecorators([ 'Zend_Form_Decorator_ViewHelper' => $decorators['Zend_Form_Decorator_ViewHelper'] ]); return $element; } /** * Set this form's elements' default values based on the redirect URL's parameters */ protected function urlToForm() { $params = $this->getRedirectUrl()->getParams(); $seconds = TimeRangePickerTools::getRelativeSeconds($params); if ( $seconds === null && count(array_intersect_key( $params->toArray(false), array_keys(TimeRangePickerTools::getAllRangeParameters()) )) === 0 ) { $seconds = TimeRangePickerTools::getDefaultRelativeTimeRange(); } if ($seconds !== null) { if ($seconds !== false) { foreach ($this->rangeFactors as $unit => $factor) { /** @var Zend_Form_Element_Select $element */ $element = $this->getElement($unit); $options = $element->getMultiOptions(); unset($options['']); foreach ($options as $option => $_) { if ($seconds === (int) $option * $factor) { $element->setValue((string) $option); return; } } } } $params->remove(TimeRangePickerTools::getRelativeRangeParameter()); } } /** * Change the redirect URL's parameters based on this form's elements' values */ protected function formToUrl() { $formData = $this->getValues(); foreach ($this->rangeFactors as $unit => $factor) { if ($formData[$unit] !== '' && $formData[$unit] !== $this->defaultFormData[$unit]) { $this->getRedirectUrl()->setParam( TimeRangePickerTools::getRelativeRangeParameter(), (string) ((int) $formData[$unit] * $factor) ); return; } } } } icingaweb2-module-graphite-1.3.0/application/forms/TimeRangePicker/CustomForm.php000066400000000000000000000174441516321226600301000ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Forms\TimeRangePicker; use DateInterval; use DateTime; use DateTimeZone; use Icinga\Module\Graphite\Util\TimeRangePickerTools; use Icinga\Module\Graphite\Web\Form\Decorator\Proxy; use Icinga\Web\Form; class CustomForm extends Form { /** * @var string */ protected $dateTimeFormat = 'Y-m-d\TH:i'; /** * @var string */ protected $timestamp = '/^(?:0|-?[1-9]\d*)$/'; /** * Right now * * @var DateTime */ protected $now; public function init() { $this->setName('form_timerangepickercustom_graphite'); $this->setAttrib('data-base-target', '_self'); } public function createElements(array $formData) { $this->addElements([ [ 'date', 'start_date', [ 'placeholder' => 'YYYY-MM-DD', 'label' => $this->translate('Start'), 'description' => $this->translate('Start of the date/time range') ] ], [ 'time', 'start_time', [ 'placeholder' => 'HH:MM', 'label' => $this->translate('Start'), 'description' => $this->translate('Start of the date/time range') ] ], [ 'date', 'end_date', [ 'placeholder' => 'YYYY-MM-DD', 'label' => $this->translate('End'), 'description' => $this->translate('End of the date/time range') ] ], [ 'time', 'end_time', [ 'placeholder' => 'HH:MM', 'label' => $this->translate('End'), 'description' => $this->translate('End of the date/time range') ] ] ]); $this->groupDateTime('start'); $this->groupDateTime('end'); $this->setSubmitLabel($this->translate('Update')); $this->urlToForm('start', $this->getRelativeTimestamp()); $this->urlToForm('end'); } public function addSubmitButton() { $result = parent::addSubmitButton(); $this->getElement('btn_submit')->class = 'flyover-toggle'; return $result; } public function onSuccess() { $start = $this->formToUrl('start', '00:00'); $end = $this->formToUrl('end', '23:59', 'PT59S'); if ($start > $end) { $absoluteRangeParameters = TimeRangePickerTools::getAbsoluteRangeParameters(); $this->getRedirectUrl()->getParams() ->set($absoluteRangeParameters['start'], (string) $end) ->set($absoluteRangeParameters['end'], (string) $start); } $this->getRedirectUrl()->remove(TimeRangePickerTools::getRelativeRangeParameter()); } /** * Add display group for a date and a time input belonging together * * @param string $part Either 'start' or 'end' */ protected function groupDateTime($part) { $this->addDisplayGroup(["{$part}_date", "{$part}_time"], $part); $group = $this->getDisplayGroup($part); foreach ($group->getElements() as $element) { /** @var \Zend_Form_Element $element */ $elementDecorators = $element->getDecorators(); $element->setDecorators([ 'Zend_Form_Decorator_ViewHelper' => $elementDecorators['Zend_Form_Decorator_ViewHelper'] ]); } assert(isset($elementDecorators), '$elementDecorators not initialized in the loop'); assert(isset($element), '$element not initialized in the loop'); $decorators = []; foreach ($elementDecorators as $key => $decorator) { if ($key === 'Zend_Form_Decorator_ViewHelper') { $decorators['Zend_Form_Decorator_FormElements'] = $group->getDecorators()['Zend_Form_Decorator_FormElements']; } else { $decorators[$key] = (new Proxy())->setActualDecorator($decorator->setElement($element)); } } $group->setDecorators($decorators); } /** * Set this form's elements' default values based on the redirect URL's parameters * * @param string $part Either 'start' or 'end' * @param int $defaultTimestamp Fallback */ protected function urlToForm($part, $defaultTimestamp = null) { $params = $this->getRedirectUrl()->getParams(); $absoluteRangeParameters = TimeRangePickerTools::getAbsoluteRangeParameters(); $timestamp = $params->get($absoluteRangeParameters[$part], $defaultTimestamp); if ($timestamp !== null) { if (preg_match($this->timestamp, $timestamp)) { list($date, $time) = explode( 'T', DateTime::createFromFormat('U', $timestamp) ->setTimezone(new DateTimeZone(date_default_timezone_get())) ->format($this->dateTimeFormat) ); $this->getElement("{$part}_date")->setValue($date); $this->getElement("{$part}_time")->setValue($time); } else { $params->remove($absoluteRangeParameters[$part]); } } } /** * Get the relative range start (if any) set by {@link CommonForm} * * @return int|null */ protected function getRelativeTimestamp() { $seconds = TimeRangePickerTools::getRelativeSeconds($this->getRedirectUrl()->getParams()); return is_int($seconds) ? $this->getNow()->getTimestamp() - $seconds : null; } /** * Change the redirect URL's parameters based on this form's elements' values * * @param string $part Either 'start' or 'end' * @param string $defaultTime Default if no time given * @param string $addInterval Add this interval to the result * * @return int|null The updated timestamp (if any) */ protected function formToUrl($part, $defaultTime, $addInterval = null) { $date = $this->getValue("{$part}_date"); $time = $this->getValue("{$part}_time"); $params = $this->getRedirectUrl()->getParams(); $absoluteRangeParameters = TimeRangePickerTools::getAbsoluteRangeParameters(); if ($date === '' && $time === '') { $params->remove($absoluteRangeParameters[$part]); } else { $dateTime = DateTime::createFromFormat( $this->dateTimeFormat, ($date === '' ? $this->getNow()->format('Y-m-d') : $date) . 'T' . ($time === '' ? $defaultTime : $time) ); if ($dateTime === false) { $params->remove($absoluteRangeParameters[$part]); } else { if ($addInterval !== null) { $dateTime->add(new DateInterval($addInterval)); } $params->set($absoluteRangeParameters[$part], $dateTime->format('U')); return $dateTime->getTimestamp(); } } } /** * Get {@link now} * * @return DateTime */ public function getNow() { if ($this->now === null) { $this->now = new DateTime(); } return $this->now; } /** * Set {@link now} * * @param DateTime $now * * @return $this */ public function setNow($now) { $this->now = $now; return $this; } } icingaweb2-module-graphite-1.3.0/application/views/000077500000000000000000000000001516321226600222555ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/views/scripts/000077500000000000000000000000001516321226600237445ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/views/scripts/config/000077500000000000000000000000001516321226600252115ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/views/scripts/config/advanced.phtml000066400000000000000000000003141516321226600300220ustar00rootroot00000000000000
icingaweb2-module-graphite-1.3.0/application/views/scripts/config/backend.phtml000066400000000000000000000003131516321226600276430ustar00rootroot00000000000000
icingaweb2-module-graphite-1.3.0/application/views/scripts/list/000077500000000000000000000000001516321226600247175ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/views/scripts/list/hosts.phtml000066400000000000000000000037041516321226600271310ustar00rootroot00000000000000
'; echo '
'; foreach ($hosts as $host) { $hostGraphs = (string) (new Host($host))->setPreloadDummy()->handleRequest(); if ($hostGraphs !== '') { echo '
' . '

' . $this->qlink( $host->host_name === $host->host_display_name ? $host->host_display_name : $host->host_display_name . ' (' . $this->escape($host->host_name) . ')', $baseUrl->with(['host' => $host->host_name]), null, ['data-base-target' => '_next'] ) . '

' . $hostGraphs . '
'; } } if ($hasMoreHosts) { echo ''; } echo '
'; } else { echo '

' . $this->escape(mt('monitoring', 'No hosts found matching the filter.')) . '

'; } ?> icingaweb2-module-graphite-1.3.0/application/views/scripts/list/services.phtml000066400000000000000000000051631516321226600276150ustar00rootroot00000000000000
'; echo '
'; foreach ($services as $service) { echo '
' . '

' . $this->qlink( $service->host_name === $service->host_display_name ? $service->host_display_name : $service->host_display_name . ' (' . $this->escape($service->host_name) . ')', $hostBaseUrl->with(['host' => $service->host_name]), null, ['data-base-target' => '_next'] ) . ': ' . $this->qlink( $service->service_description === $service->service_display_name ? $service->service_display_name : $service->service_display_name . ' (' . $this->escape($service->service_description) . ')', $serviceBaseUrl->with([ 'host' => $service->host_name, 'service' => $service->service_description ]), null, ['data-base-target' => '_next'] ) . '

'; echo (new Service($service))->setPreloadDummy()->handleRequest(); echo '
'; } if ($hasMoreServices) { echo ''; } echo '
'; } else { echo '

' . $this->escape(mt('monitoring', 'No services found matching the filter.')) . '

'; } ?> icingaweb2-module-graphite-1.3.0/application/views/scripts/test/000077500000000000000000000000001516321226600247235ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/application/views/scripts/test/apache.phtml000066400000000000000000000004301516321226600272070ustar00rootroot00000000000000
tabs ?>
images as $base => $img): ?>

escape($base) ?>

icingaweb2-module-graphite-1.3.0/application/views/scripts/test/cpu.phtml000066400000000000000000000012321516321226600265560ustar00rootroot00000000000000images as $base => $cpus) { $maxCnt = max($maxCnt, count($cpus)); } ?>
tabs ?>

CPUs

images as $base => $cpus): ?>
  CPUs
escape($base) ?> $img): ?>
icingaweb2-module-graphite-1.3.0/configuration.php000066400000000000000000000022771516321226600222050ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later /** @var \Icinga\Application\Modules\Module $this */ /** @var \Icinga\Application\Modules\MenuItemContainer $section */ use Icinga\Module\Graphite\ProvidedHook\Icingadb\IcingadbSupport; $section = $this->menuSection(N_('Graphite'), ['icon' => 'chart-area']); if ($this::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend()) { $section->add(N_('Hosts'), ['url' => 'graphite/hosts']); $section->add(N_('Services'), ['url' => 'graphite/services']); } else { $section->add(N_('Hosts'), ['url' => 'graphite/list/hosts']); $section->add(N_('Services'), ['url' => 'graphite/list/services']); } $this->provideConfigTab('backend', array( 'title' => $this->translate('Configure the Graphite Web backend'), 'label' => $this->translate('Backend'), 'url' => 'config/backend' )); $this->provideConfigTab('advanced', array( 'title' => $this->translate('Advanced configuration'), 'label' => $this->translate('Advanced'), 'url' => 'config/advanced' )); $this->providePermission('graphite/debug', $this->translate('Allow debugging directly via the web UI')); icingaweb2-module-graphite-1.3.0/doc/000077500000000000000000000000001516321226600173625ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/doc/01-About.md000066400000000000000000000013331516321226600211740ustar00rootroot00000000000000# Icinga Web Graphite Integration This module integrates an existing [Graphite](https://graphite.readthedocs.io/en/latest/) installation in your [Icinga Web](https://icinga.com/products/infrastructure-monitoring/) frontend. ![Service List](img/service-list.png) | ![Detail View](img/service-detail-view.png) --------------------------------------|-------------------------------------------- It provides a new menu section with two general overviews for hosts and services as well as an extension to the host and service detail view of the monitoring module. ## Documentation * [Installation](02-Installation.md) * [Configuration](03-Configuration.md) * [Templates](04-Templates.md) * [Troubleshooting](05-Troubleshooting.md) icingaweb2-module-graphite-1.3.0/doc/02-Installation.md000066400000000000000000000027701516321226600225720ustar00rootroot00000000000000 # Installing Icinga Web Graphite Integration It is recommended to use prebuilt packages for all supported platforms from our official release repository. Of course [Icinga Web](https://icinga.com/docs/icinga-web) itself is required to run its Graphite integration. The latter uses Graphite Web, so that is required as well. If they are not already set up, it is best to do this first. The following steps will guide you through installing and setting up Icinga Web Graphite Integration. ## Installing the Package If the [repository](https://packages.icinga.com) is not configured yet, please add it first. Then use your distribution's package manager to install the `icinga-graphite` package or install [from source](02-Installation.md.d/From-Source.md). ## Prepare Icinga 2 Enable the graphite feature: ``` # icinga2 feature enable graphite ``` Adjust its configuration in `/etc/icinga2/features-enabled/graphite.conf`: ``` object GraphiteWriter "graphite" { host = "192.0.2.42" port = 2003 enable_send_thresholds = true } ``` And then restart Icinga2. Enabling thresholds is not a hard requirement. However, some templates look better if they are able to render a max value or similar. ## Configuring the Icinga Web Graphite Integration For required additional steps see the [Configuration](03-Configuration.md) chapter. icingaweb2-module-graphite-1.3.0/doc/02-Installation.md.d/000077500000000000000000000000001516321226600230635ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/doc/02-Installation.md.d/From-Source.md000066400000000000000000000012551516321226600255510ustar00rootroot00000000000000# Installing Icinga Web Graphite Integration from Source Please see the Icinga Web documentation on [how to install modules](https://icinga.com/docs/icinga-web-2/latest/doc/08-Modules/#installation) from source. Make sure you use `graphite` as the module name. The following requirements must also be met. ## Requirements * PHP ≥ 8.2 * [Icinga Web](https://github.com/Icinga/icingaweb2) ≥ 2.12.5 * [Icinga DB Web](https://github.com/Icinga/icingadb-web) ≥ 1.0 * [Icinga PHP Library (ipl)](https://github.com/Icinga/icinga-php-library) ≥ 0.19.0 * [Icinga PHP Thirdparty](https://github.com/Icinga/icinga-php-thirdparty) ≥ 0.15.0 icingaweb2-module-graphite-1.3.0/doc/03-Configuration.md000066400000000000000000000042701516321226600227360ustar00rootroot00000000000000# Configuration ## Basics Open up the Icinga Web frontend and navigate to: `Configuration > Modules > graphite > Backend` Enter the Graphite Web URL. (e.g. `https://192.0.2.42:8003/`) The HTTP basic authentication credentials are only required if your Graphite Web is protected by such a mechanism. ## Advanced Open up the Icinga Web frontend and navigate to: `Configuration > Modules > graphite > Advanced` ### UI The settings *Default time range* and *Default time range unit* set the default time range for displayed graphs both in the graphs lists and in monitored objects' detail views. If you'd like to suppress the *No graphs found* messages, check *Disable "no graphs found"*. (This may cause unexpected blank pages in the graphs lists.) ### Icinga 2 (Core) The settings *Host name template* and *Service name template* both are only required if you are using a different naming schema than the default Icinga 2 is using. (As outlined [here](https://www.icinga.com/docs/icinga2/latest/doc/14-features/#current-graphite-schema)) The setting *Obscured check command custom variable* is only required if there are wrapped check commands (see below) and the "actual" check command is stored in another custom variable than `check_command`. ## Wrapped check commands If a monitored object is checked remotely and not via an Icinga 2 agent, but e.g. by check_by_ssh or check_nrpe, the monitored object's effective check command becomes by_ssh or nrpe respectively. This breaks the respective monitored objects' graphs as graph templates are applied to monitored objects via their check commands. (They fall back to the default template.) To make the respective graphs working as expected you have to tell the monitored object's "actual" check command by setting its custom variable `check_command`, e.g.: ``` apply Service "by_ssh-disk" { import "generic-service" check_command = "by_ssh" vars.by_ssh_address = "192.0.2.1" vars.by_ssh_command = "/usr/lib64/nagios/plugins/check_disk -w 20 -c 10" vars.check_command = "disk" // <= HERE assign where host.name == NodeName } ``` ## Further reading * [Templates](04-Templates.md) * [Troubleshooting](05-Troubleshooting.md) icingaweb2-module-graphite-1.3.0/doc/04-Templates.md000066400000000000000000000173021516321226600220660ustar00rootroot00000000000000# Templates A template defines what kind of data a graph visualizes, which kind of graph to use and its style. Essentially the Icinga Web Graphite Integration is using templates to tell Graphite how to render which graphs. * [Location](04-Templates.md#templates-location) * [Structure](04-Templates.md#templates-structure) * [graph](04-Templates.md#templates-structure-graph) * [metric_filters](04-Templates.md#templates-structure-metric-filters) * [urlparams](04-Templates.md#templates-structure-urlparams) * [functions](04-Templates.md#templates-structure-functions) * [Example](04-Templates.md#templates-example) * [Default Template Settings](04-Templates.md#templates-default-settings) ## Template Location There are a bunch of templates already included, located in the installation path. (e.g. `/usr/share/icingaweb2/modules/graphite`) To add additional/customized templates, place them in its configuration path. (e.g. `/etc/icingaweb2/modules/graphite/templates`) These will either extend the available templates or override some of them. Subfolders placed here will also be included in the same way, while additionally extending or overriding templates of its parent folders. > **Note:** > > Hidden files and directories (with a leading dot) are ignored. ## Template Structure Templates are organized within simple INI files. However, it is perfectly valid to define multiple templates in a single file. The name of a section consists of two parts separated by a dot: [hostalive-rta.graph] The first part is the name of the template and the second part the name of one of the following configuration topics: > **Note:** > > Template file will be ignored if the [graph] or [metric_filters] section is missing. ### Template Structure: graph Supports a single option called `check_command` and should be set to the name of a Icinga 2 [check-command](https://www.icinga.com/docs/icinga2/latest/doc/03-monitoring-basics/#check-commands). To get multiple graphs for hosts and services with this check-command, multiple templates can reference the same check-command. If multiple check commands do effectively the same thing and yield the same perfdata, all of them may be specified separated by comma. E.g.: ```ini [ping-rta.graph] check_command = "ping, ping4, ping6" ``` ### Template Structure: metric_filters Define what metric to use and how many curves to display in the resulting graph. Each option's key represents the name of a curve. Its value the path to the metric in Icinga 2's [graphite naming schema](https://www.icinga.com/docs/icinga2/latest/doc/14-features/#current-graphite-schema). Curve names are used to map Graphite functions to metrics. (More on this below) However, they are fully arbitrary and have no further meaning outside template configurations. A curve's metric path must begin with either the macro `$host_name_template$` or `$service_name_template$` and is substituted with Icinga 2's prefix label. The rest of the path is arbitrary, but to get meaningful results use a valid path to one of the performance data metrics: .perfdata.. An example path which points to the metric `value` of the `rta` perfdata-label looks as follows: $host_name_template$.perfdata.rta.value To dynamically render a graph for each performance data label found, define a macro in place for the actual perfdata-label: $host_name_template$.perfdata.$perfdata_label$.value You can also use wildcards. To define a wildcard, please use the following syntax: $macro:wildcard syntax here$ Some Examples: $perfdata_label:{abc,def}$ $perfdata_label:{a*c,de*}$ $perfdata_label:{a[vbn]c,def}$ > **Note:** > > The name of the macro for the perfdata-label is also arbitrary. You may as > well use a more descriptive name such as `$disk$` for the disk check. `$disk$` > is the same as `$disk:*$`. ### Template Structure: urlparams Allows to define additional URL parameters to be passed to Graphite's render API. Each option represents a single parameter's name and value. A list of all supported parameters can be found [here](https://graphite.readthedocs.io/en/latest/render_api.html#graph-parameters). If you have used a macro for the curve's perfdata-label you may utilize it here as well: title = "Disk usage on $disk$" You may also define URL parameters once for all templates (including the shipped ones) in the `default_url_params` section in `/etc/icingaweb2/modules/graphite/config.ini`: [default_url_params] yUnitSystem = "none" These may be overridden in the template itself: yUnitSystem = "binary" ### Template Structure: functions Allows to define Graphite functions which are applied to the metric of a specific curve on the graph. Each option's key must match a curve's name in order to apply the function to the curve's metric. A list of all supported functions can be found [here](https://graphite.readthedocs.io/en/latest/functions.html#functions). The metric in question can be referenced in the function call using the macro `$metric$` as shown in the following example: alias(color(scale($metric$, 1000), '#1a7dd7'), 'Round trip time (ms)') In addition you may utilize all other macros here as well: alias(color(scale(divideSeries($metric$, $service_name_template$.perfdata.$disk$.max), 100), '#1a7dd7'), 'Used (%)') ## Template Example The configuration examples used in this document are borrowed from the template for the `hostalive` check-command: ```ini [hostalive-rta.graph] check_command = "hostalive" [hostalive-rta.metrics_filters] rta.value = "$host_name_template$.perfdata.rta.value" [hostalive-rta.urlparams] areaAlpha = "0.5" areaMode = "all" min = "0" yUnitSystem = "none" [hostalive-rta.functions] rta.value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Round trip time (ms)')" [hostalive-pl.graph] check_command = "hostalive" [hostalive-pl.metrics_filters] pl.value = "$host_name_template$.perfdata.pl.value" [hostalive-pl.urlparams] areaAlpha = "0.5" areaMode = "all" min = "0" yUnitSystem = "none" [hostalive-pl.functions] pl.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" ``` ## Default Template Settings Next to maintaining templates for specific commands, you can specify the default template settings in the [default.ini](https://github.com/Icinga/icingaweb2-module-graphite/blob/main/templates/default.ini) configuration file. The following example adjusts the background and foreground colors to setup the "dark mode" for graphs. First, copy the package provided configuration into the configuration path. Then add the `bgcolor` and `fgcolor` settings into the [urlparams](04-Templates.md#templates-structure-urlparams) sections for `default-host` and `default-service`. ``` cp /usr/share/icingaweb2/modules/graphite/templates/default.ini /etc/icingaweb2/modules/graphite/templates/default.ini vim /etc/icingaweb2/modules/graphite/templates/default.ini [default-host.urlparams] bgcolor = "black" fgcolor = "white" [default-service.urlparams] bgcolor = "black" fgcolor = "white" ``` The settings make use the `urlparams` section which adds the parameters to the render API. > **Note** > > Instead of modifying the color settings in the default template, > you can also change the Graphite configuration explained in > [this community topic](https://community.icinga.com/t/how-to-adjust-the-graphite-background-color/3172/3). ## Further reading * [Troubleshooting](05-Troubleshooting.md) icingaweb2-module-graphite-1.3.0/doc/05-Troubleshooting.md000066400000000000000000000056371516321226600233300ustar00rootroot00000000000000# Troubleshooting ## Graphs missing or not shown as expected If too less or too many graphs are shown for a host/service or the graphs don't look as expected, debugging becomes harder if there's no obvious error message like "Could not resolve host: example.com". In such cases the "graphs assembling debugger" may help: 1. Navigate to the respective host/service as usual 2. Add `&graph_debug=1` to the URL 3. Inspect the log displayed under "Graphs assembling process record" ### Example Example debug log for the host "icinga.com": ``` + Icinga check command: 'hostalive' + Obscured check command: NULL + Applying templates for check command 'hostalive' ++ Applying template 'hostalive-rta' +++ Fetched 1 metric(s) from 'https://example.com/metrics/expand?query=icinga2.icinga_com.host.hostalive.perfdata.rta.value' +++ Excluded 0 metric(s) +++ Combined 1 metric(s) to 1 chart(s) ++ Applying template 'hostalive-pl' +++ Fetched 1 metric(s) from 'https://example.com/metrics/expand?query=icinga2.icinga_com.host.hostalive.perfdata.pl.value' +++ Excluded 0 metric(s) +++ Combined 1 metric(s) to 1 chart(s) + Applying default templates, excluding previously used metrics ++ Applying template 'default-host' +++ Fetched 2 metric(s) from 'https://example.com/metrics/expand?query=icinga2.icinga_com.host.hostalive.perfdata.%2A.value' +++ Excluded 2 metric(s) +++ Combined 0 metric(s) to 0 chart(s) ++ Not applying template 'default-service' ``` The log describes how the Icinga Web Graphite Integration assembled the displayed graphs (or why no graphs could be assembled). The plus signs indent the performed actions to visualize their hierarchy, e.g. all actions below `Applying templates for check command 'hostalive'` indented with more than one plus sign (until `Applying default templates, (...)`) are sub-actions of the above one. #### Details At first the host's check command is being determined. Then all templates made for that check command are applied. Finally, the default template is applied. For each template the available Graphite metrics are fetched and combined to graphs if possible. (See also [Templates](04-Templates.md).) The actual metrics are not shown not to make the log too large. But they can be viewed at the shown URLs. Example result of the first URL: ``` {"results": ["icinga2.icinga_com.host.hostalive.perfdata.rta.value"]} ``` ## Special chars in host or service name Graphite cannot work with special characters. The host and service name should therefore only contain Latin characters. If you want to use special characters in host and service names, please set a `display_name` for the object. ### Example ``` object Host "Only latin chars here" { display_name = "Special chars are welcome" ... } object Service "Only latin chars here" { display_name = "Special chars are welcome" ... } apply Service "Only latin chars here" { display_name = "Special chars are welcome" ... } ``` icingaweb2-module-graphite-1.3.0/doc/06-Development.md000066400000000000000000000007531516321226600224160ustar00rootroot00000000000000# Development There is a CLI command for demonstrating graph templates (useful for developing them): ```bash icingacli graphite icinga2 config ``` It generates Icinga 2 config based on the present graph templates. With this config Icinga will (also) "monitor" dummy services yielding random perfdata as expected by the graph templates. I. e.: If that Icinga is also writing to the Graphite that is read by your Icinga Web Graphite Integration, you'll get dummy graphs for all templates. icingaweb2-module-graphite-1.3.0/doc/img/000077500000000000000000000000001516321226600201365ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/doc/img/service-detail-view.png000066400000000000000000002734231516321226600245270ustar00rootroot00000000000000‰PNG  IHDRÀ<ÿQ”í pHYs%%IR$ð IDATxÚìÝy|eþðïdr4iÓ¤7½hi m)´PÊÜ—€ŠÊ‚ ‚ø[]ÀU×]ÑÕUP<ðVPXWAE„U¹–[9ÊQÚB9J¡-½ïôHšû˜ßƒ1¦'ÐBS>ï×¾ö•Lž™Lf2±óáy¾C«4M€CÐ<(-@€Ð(-@€ÐaÙYAJ":¥ªÏ1ZpV C¹óÊÓ¾oŠ‘K®ïÉ7EËÆ‰€Žãáy:ÂwÕÄ^öô„ˆæÆ‡l‹ÇP^ÕpáуåRœè îäžI¾ò ¹[£/ÍŽ 8q:§§ãàž‰ƒÐ®˜Õ¿à tXw²J êÅ€+¸“Ê ¾ÞÔx†²;W…sÄ®²âXNÃ…‡òT»«487ÐAÜáå­Ë¥ßf9.I)­}ò`&N tÂ;¾ÿ»V5-6𽓹F³í\U=úž@Gs甿ö_w®ðµóÅ8Ð1Ýá!<³‚•±¾ž+™€« ”¥1ÅsÏôfBè®û×þá[/—å`>cèÀn5@™ä+_1::Hî$w{ihä¬`eë׬ì¤üüï@‡vËJ„ãÓ!7 üµøö¬ò=Ntd· ìÎU9>íâîÖÊ'ùÊû)ß9wsï)Î RâüÀmpËJ•æÛŒë%`ͯžé»eLLS'ùÊ#%×çýy2!䦻Ÿ¬•½`؆©}Ô †}Ú¿Î"´«6˜Æxî±ì¹Ç²ùÇ“|å_ÞÛëôÔ>Ús/ )Î |(: Ú×þJrQõï!ßžº‰·ûl@øÜøþ±\"\Ô?,S¥Y[…s í¤§1Þ]¥¹gs 1täá¤I¾òYÁÊ#'½44Ò1=!¢!!ÞDôñ˜h{‡”Ö›Û;ÄiÉC18‘Ð~m¾Å£eÀÖ³)%u?Më»á>Aò&«¢ôRîz Ïf(òíå'Ú ¶ûÎé<ޏ›Eûzl¼·W‹Í"%§ºù®uùᤆ¯^®¬Ç‰€ö#l§í¾qO”TتŽ!ýƒ”Kcߺ\ê´|°\ÚÇ×}P°r`2Ú×£Tc<]R»>£¸Roúp\¬‡øúžgUÕ¿ž’‡ ­Çq\VV–Íf‹eäö[3¨[°\úCféwE587íѯ™±Zãüä €öÖ.Ê`¹tt¸OëÛ?Ì(ƒåÒáÁŠÁÊAÊ ¹›=4ù¥¸Öq¾žÃßž|6!$D.=U\»ùZ%_­öŽx,ÔkzL )¨^™Uæôê?bº õ6ÛlÿË©Z›‡2·×]»víøñãEEED$—Ë“’’ú÷ï/nÛìٳ端¾"¢™3gNŸ>ýn;þ+ûv½7Ò/ÀÃM@dá¸b~ãÅÒ†ßÞöóõÐÈy ¡D4"Ì;ó‡”Ôz#.Š›ø= ±‹õ‘ЉHá&zèÐe@hѬ`å=!^±~±>rÑrYUŸ©ªßrµòæfĸ۴K€22XyCí£}=¶Œ‰q M>KÉw Må-‹Nçu„Ã7%ÊJw"’ Ù†7<LJðÕs=Å¢¶ PÂEì÷÷ör³+ëgýzÅU¾mæÍ7ßÌÎÎv\xøða¡PøÆoDEEÝžÝÐjµüƒªª»+ÕŠ—ŠwLëÛU!u\èï.îÛE1³g`¿­é·g7ìÝÇÜ„¬—XH„åf~O<…¬„½;*$¢ÎýÓ·.B,|XÔÔ˜.Ž×~¤·lrwÿ§û…½w"wù…b @³Ú%@ ö”Üð=•HøæñìôJ­ký;˜ÉjãXm¶†¯š9®™WoŃá>ƒ•†ñ•Š]åXq÷î»ïÚÓ“   ¹\ž••ED‹åå—_^µj•¯¯ïmØ“{î¹çÊ•+6›í¾û®ö SzÛÓ««7Yä¡€aˆ(1PqàÞÞc÷œ¿ »±;§rhˆ·L$H/¯;P­Å¯ðÍýždèM'‹kû*ŒVîûKÅø§nÝ$_ù—÷ö ”K8¢ÿeW¦•Õ]ªªWH„=}å£Ã}zúy¼:¼ûøHßvž¯°Úp¸š"ì û±î|Ñ÷ŵ8­t^uý¶Ó`q™?vËËË333‰H$½ýöÛaaaDd4?ÿüócÇŽY­ÖŸþyþüù·aOºtéòòË/ßmß™iŠŸë³‰ÿ’_=jW…‹Ø-÷Å÷í¢ ¢¡¡^#•²_juí½'_Týí \Å·nÜž wÃOÜ"Vð鏨@¹¤DcxáàåïKþS{­Jr&ï>¡‹ú‡ özopÄÜcÙ8bMé(Ê5õ]ÔÃðî÷FúyþÖë¾PmX›VàTF÷ç±±÷tõ–‹…Dd¶qEjý‡§óVçV†‹Øí$„xHùŽݼd…³™l¶‡wœëàµ$Ôj5ÿ`ñâÅ|zBD‰dáÂ…§N2›ÍƱ}vvö7ß|“——GD2™ìÞ{ï½ï¾ûì¥RŠ‹‹×­['“É{ì±½{÷9r¤¦¦æå—_ÎÏÏ¿råŠÕj}úé§ÝÝÝùÆÇmذ¡¼¼ÜÓÓsþüùeee_}õ•X,ž={vHHˆ½MrròÖ­[+**ˆÈÛÛ{Ò¤IcÇŽu,ηùá‡êêêˆÈÇÇgæÌ™t‰o]¨\"`ˆˆÊê|zBDyfë¼=Ïà! Œ\ô{áçõ þ¿¾]ýݯ÷S(©7~‘š¿"óú·ôÏÕzº±ìŽ«åÝ}d‰]”¡àªJk°X»x¸ fÅñ«^­à‡‹Øõ“K„&‹íñ=ç+ôæÓúzˆ„•ûžð׍(þ;oã¸"ñÃÓ×>Í®pºv¦t÷w]o“U­]¼?Ó1ôᇨÄxº±"2Ymç*Ô‹^Vv¤4Û¸—~½üU~uó¿5?‡'Ç÷RðëZ8.³ªþÙƒ—í‡÷‹Ýîh¶Ñ¿Ó 骊YÁÎ+åa )Òß=‘ã8òèÜC‰]<Ü8Žì»×‘Iæ>¡G‹j®T7ßò>?ùˆPï—Ó Œçß“wu‹ð’©ô¦ñ?¦]Ô›œ^5rÜ éyuúÏ&Æ=r0_µ¾¥nc€’\\û—¤h_o²Ü=ì.<Ü/ÎWî¸$\)}sttb çŒÃY×ã¤YÕ¿ª`L”·û§zvMÎýþJyw/wéo7º QˆÂÍbã\¨–DrròàÁƒíÓ߸»»÷ÝwNm¶nݺaÃûSN÷í·ßîÝ»÷Ýwßõðð "­V›žžNDÇ·73›Íjµ:99™ˆÆŒ“˜˜È/×h4»ví2›Í¡¡¡ ÃhµÚsçÎѸqãøÅb±¼ùæ›çÏŸw|ǵk×nܸñÓO?åß‘ã¸7Þxƒ_ÑÞfåÊ•ƒ zþùç]h6_™øÙîþöt#CozpKº§Hh¶ÙvTjìwæ“¢üþ¿xº½1*:ÎÏcö‘«DîéÖÅC"`˜ÇBìmÜ„Ãð™ËÄ?û[ÌŠòïæ%0ŒÞlµØ¸QÁÊO7ÃD8|ɳéßÃÇý÷ï<1Ý”ÒOÆ÷êe¿.œ®–˜^~òÿ=’ôÊ/WøûöažÒý3û» ϼ¤vP°×/3û?¸%½ó ŠTJ½e"ލ›§Œ¨ºù_¡77óÓÑÏCràá$¥›Èñðö ð<0³ÿkG®¾q©„ˆ¼¥b/©˜ˆ^ö{¹" +°þ¤ßß=À <¨èå/0Œãj ÖŽŸžü46vrwÿ?›,í8¿¥¼®©–Óëïëí!ÆúzLÛ©ãg(C<¥sãCˆè•_®4LOìVåVŽÌ,ø÷A‘ë Ïào#€FµËÔ'ß×–jnàf~ëå2W?Žžá£!^Ïv÷·ÿoZ€ÂCäœOíg¿,«7¦”Ôê-VþffZL—§#üˆè“¤0>=±Ú¸3¥µ»³+Tz fN|°Úb½¬ª¯Ð^ÿ;˜#ºV«Ï­ÑÕ˜:zù?™LÆ?8yòä¼yóöïß_VVÆq±¿á\¼x‘OO†™6mÚ‚ ‚ƒƒ‰¨¢¢bÕªU׿¸œµ'111!!ÁÛÛ{ôèÑüÇ`åÒ¥Kf³™ˆ¦N*ÎøóÝwßñé ÿ޳gωD|ò²eË¾ÍÆùôD(Î;×ÞæäÉ“ìø_ÑRíõ{=¡€y\ÏË'­5-@ADªµ[ÊëìéÉK±#}íßÒô²:þÈÍŒ z$HAD:ón‰ëM–*¹LkÜ“SÉ/‰ð´¿:.‡ïõp¶\ýK­Î¾®ýÞs×ø8{z¿#]Ñä(ÿ‘Jmk¿v²«uö6Vð÷Á‘üò·Gtçã½Ùz(OõK~•Ùj#"±ðÅï÷Ä^ÅÂq-~üæ:6MI°§'YUõåjm ˜wëç!!"ó+³¨ô¦Zƒ¹´Þ¸/÷úIósÿ- ™Ó…?éÙÕºfòˆbÃÈèÉÝýùcµþ¾ÞüuÑLzBD“¢ü6ŒŒîøß¥rÃ\ª¬ÿüZ 5³?J+ ¢h÷`!‹¿Õ^CxÖg½84²5-ëM–ÏÏ»úqâ5(Ä«ù6ñRñð®×Û$UýùzŠ“à!0ÌSýº®Î­”K®Ÿ”ƒ×ª&ì½È¯¸gz¢»ˆ­Ñ›óÌÖÄ-é#•²ƒê/`˜k5ºÈ§]â…„„Lš4i÷îÝD¤Õj׬Yɉ‰&L°÷á8nýúõ|ªòÁðÑÉĉW¬X‘žžž––VYYéç÷{ç¹\¾råJ{õYŽã"""rssOž<ùç?ÿY$qwìØ1>ø°¿‹#µZ½wï^§wœ4iÒ“O>©Õj÷îÝ;kÖ,½^Ïﹿ¿ÿ'Ÿ|" ‰hìØ±‹-Òjµ[·n5j”=ê˜6—Ö=U¨æËG!ѾѾŇԛ,™ªú¿¾b©1·w0ëkÿ–Ñ…éýâüå†Y˜ÐuSÉjÍîήœ¼ï¢ýKþxB°‡Xèï.~$H±©¤.\ÄÆùÉù;öW*š¿.ލFì<Ï_gè#KEìCݪ/éæÃodmjþŸO]ãWüef’—Tì#­LìúBZTÈòm–Îú8»‚ˆ–ƾ0¸›€aŒ.U³5¿' 5ÿñ›ùéx)6°›—Ôéð.Žòÿ`l¬PÀxJDÏ÷ sœ²ÇjãÞ;™ûâÙÂßOzŸP±Pá&šáÇwBéx}.¶}¹.0×U ü÷’º|†B ú¡8¦' ×ê°zúzÑ¥*M‹-×éUz“T<ÔÏcsiÀm P–ž+áÓ?°åùŒW˹KÆïŒ VÊD,éÍÖ—\/Ô—g¶®Ï(zaHCä%‘Ã$¯cºù’ðkêËÌÒàoO:nªûos©°®3r„ˆæÏŸùÅ_ðýAø¼#55555566öŸÿü§D"Ñét%%%DäííÍWqssKHHHOO·Z­………ŽÊÂ… çîafܸqkÖ¬1999111F£‘ï9/—ËîUii)¿?>ø Ÿž‘D"Y¶lYII‰T*eY¶¤¤Ä`0Ñ!C¬V+?²››[xxøÅ‹«ªªÔjµ——WGÿax÷±"Vàx»Ø?PyðOýצqó—ýabµcEÕöô„?é+5ƒ½ 36ÜgeVÙ0Oiˆ\ÂÿÖýtµ¼ãº9ÿ»´õ¾x{·©†JÃô$£\=ç—:þGã/ØœêæŠC?ÞÕ{R¤qCD/ ê6£V¥Z÷ò¹Bü‘p;"°õì¶1±D4Óæ¥CYãö¦ N¥Z+tb±Ù+ÿà¶\(­7:–½R±¿»xZ€bPqD;´åZJÂÉkÏ êæ˜žœ+WOs‘ô„ˆ.TÖ?òÛ@ž¦ÔÙ¸?í¹°gjß?"Ò-svdœ®7à/$€Û ¬{¾R=`ëÙ§#|{úzÄúÊ5FK‘F¿;Wµ»Jsùá¤õï½*ˆHÂ6RŽW(øÃm‡ì·òŠrÉŠe Tð«×ÌüD!ë kÖo8.bÿÖ7´O€gB€'ÿç{¼¿çXowL$++ëÊ•+"‘hüøñö2®b±ø‘G9sæL^^^uuµN§c†¯,;f̘§žzŠã8†a¬Vkë+Œ0 3~üø´´´úúúÜÜÜ””"1bDþ*<{jSTTÿû=¹Õj0„B¡D"±·yî¹ç† r{uÇ­ìÛu|¤/q´éR©}6â<³uÄÎóWgˆò–1D±¾DÄß-[lÜ´ŸÒ4fëö È3[ÓËÔc»ù²æ‰ÞÁ]ÜÅDTª1®Ík¼†ýºP¸ ÃElžCyÚÅQþ¢³+ìmŠÕ†ïNòͽ–œÉ_r&V°rb7ßøÏž¾"VÀ ÷!× PZó{ÒT†r_ôÛõàñ‡¢½ä|ï¡b¡Å“~ª¸nR”Ÿ€aæÄòá¯ÆhþKu0ä3”-÷Å'8d(¯ïîØÆµÒ"ʨª'¢>-ü·#Ïl¹+c÷C‰~2ñŸ÷\ØW]?nk€òVBèÀ`EŸoOÑêÜ*jPJpÙñì ôùárùîVÔ·ë 5FG†|e’5ƒ"þïd.¿ü±øþ.…ËðõÐÈ„OŽ£×Že/:GDñRñ™¹ƒD¬@Ì2}ýä® p÷ÓO?¥¥¥Q@@@ß¾}í/étºÊÊJ"òöö–Éd6›M, †#GŽ<úè£|Õ–eËÊÊNœ8ADãÇwwwoþízõê%•JõzýòåËu:Ç4ÕØÓóúÍÒ?þ8nÜ8~nŽã–-[vñâE‰D²nÝ:û;nß¾}РA|IJì¹sçrrrd2™c*Ô1÷‰÷÷äï í ÿíò‘ ‰ˆ#ʬª'"ƒ…ó”PÀ,L±÷ƒx,Ôëoƒ"Äœ(®y"9§ù÷Ú|©tt¸€a¦Ç²†ˆŽV7s]Xmœ€e¼¥â¥ýÂì×Åùýzùɉ¨—ŸÇž\íÊ%/DwáË”¨Ö~’6:—ˆþ“^øáÕŠ]ããüd"“Õöèÿ.~_\KDÏõxl,yKE#•2—NrÓnúã—ýÖ× o€bZ€‚/ü.bGvõæ—«ôæßý§¬Ò‰‘¾†™ÜÝ_È ˆ(½\g¶ºÖ1Ì5Y¦þ|nÛý uö9W®žúó9×úP»+Ô§Kj)?3àÇ4­Édçt¦Ù;2zz»_R‹¿nk€2X.ýKRØ?]Î16ù/uß×>œUþÚ°ÈÝ®?,¥5¶”×e”« ÑÂÄ®=|dYUÚ‘a>Ѿüí뮫åD4,Ô;ÊÛˆþ3¹××g‹³jêgÇów¡&+—R®&‡´ïª”’U]ßâ=íÅ0Ì!CøeÅŠ3fÌ>|¸››Û•+W>ýôS¾FIß¾}ù9†§OŸÎ1Y²dÉÒ¥K._¾üÑG™Íf–eGŽÙb€âææ6pàÀ_~ù…OO EDD“³Ø$&&¦¥¥©ÕêgžyæÙgŸussÛ¾}ûÅ‹‰¨OŸ>B¡0(((..îâÅ‹999o½õÖ‚ Äbñ±cǾùæ~ ãÆëà_¿ãEµühš/YùcCæU]ª¬ïåç11Òña´Ø~-®É3[wg—ÏK%¢)=ŽIEÿË©êåçq©ˆ%¢"uË%Ÿÿ¯z½Þ(—ðß[‹Ûp©´™ëâ|…Æñº8[V?1—M`ã¸ùª-åu*5}< óÖ¨è¤@Åù ͨpŸ‘aކሼÝÄá"vT˜7¿“;ì³þ\±˜efÅ]¯ \¡5uîô¤•¿ÑŸŽÎÍêì# ÌwÄï¸R¡5YèÑÅK*âOßÚ³-ý*¿ú51ÔÓ¯~bã¸]W]r„fžÙ:õçs[ïOp0u¶\ý «¥'Dd!ZrðòÁ™ýã|åÛ'Ä-:œ•epŽÃBEl¡ÙJD¿Ôê:÷eÐA”¯ï;”§ZÝÒ–Ï»zvΠ¥1wÉLOî¿ôËÌþb!C42Ì—/ÐÈ»P¡áK|w¡äÕ{¢ ã'“ü}ÈnûÏ”ÔñÝ.®5ZmR!Ë ëê5(DùÃå²Þ3eĈÌÌÌä8nóæÍ›7ov|•eÙ©S§òÇèС¼¼cÂ|šÿÎÏ Vöï¢ j®Í?bºtq—peªêÿ}÷ý»z+?~£?‹"ý‚=Ü,6Îhµ5ó³Ó¨—b—ì!`ÇÍÚ~vSI«ÉPûDt—¯³Ê\:=qü8Ë„öŠôvçk›­¶¬jíç©ù-v€[ Pf+WŽŽ ’ÿ~÷»ëjEo÷“Å5­Ÿ[çà¤Þ£Ã}ˆèÛŒ¢Î1#O§Ô† 4~)ÞÆ mý«Wð€ ¥½ËU•¶Ç¦–Ë› övט­§êôFŽÃh¥›5³4&pÅèh§…“»ûÛ8îÞmé­ßΓ3ßÖ]m4¿ž’‡óàrþÔ3/¯CD6Ž{ïÔ5“ެÚjÛU©Áq¸Q7 $ºK–lô%Ãl¼·×€VO¬“c´Ü=#w:óo½ªuæÕiùkó0:¡› PæÄt‘7]óµ2A&>§3áøtz½ÿ›ŠƒÞMÎÂé%k¾A”§.t‚vÚ®+ÀÁ€Îá&cÉÒ|ƒZ“:‡› PŽÕ6ój½É’R­ÅÁ€Îá&”Õ¹•YUõM½º>£¨ÂjÃÁ€Îáæ+•LÞ~¶Ñ e{Vù¢Óy8²ÐiozÍ£eòö³ÏÄ‡Ž ÷‰öq¯7YRJë¾>Wô}I-+t&Â[Y9ÇhY’rR®á8@'†É†Z€ PZ€ PZ€ PZ ¼›?<÷ôH|ßFhz ´ @  ´€>|¸ó"†é°»Ëq\SKøöÿoø aã””| EBǸ¤#G'ö=tÊP.±ã8ŽÿDüûÿã¬À ¹ tüèÄΞ‰4ÕÀž›Ø›!7€[ázJ3»œ8~¨†1 "h½N 8qŒHì‰ ¢¸Q. 8Ö7¡}O›ádÀÍù½ˆ¬ e(ŽUN]ØT\‚î'p„NIDÇQœ‚’†ÝOšâ”žtÊQKЄäjQB£éI£}Rœ ‚,Üœ?ô@q‰$Å)qüœNh®ÚÅqJÇvø6S  ¹d rˆQŸ¸5%QZI`Ä0ŒKtEit'[¿àF]P\´Ž,ÿA ´«j t„l¢Ñ‘8­¬‹â²pë„.íP}:Pî,AÃEvDL‹;Öš2.ï7Jàr³ð8AbíMàZ»ë˜†4ý 1€¶õ‡Ñ@CB‚[1æÀ‹-¶98öm(—&À!h^»÷@‘Ëå]»v0`@RRR@@€L&#¢šššÂ“'O^¸p!;;§:²v PA```hhhxx¸\.///¯¬¬´¿j6›ƒ‚‚8Ž“ÉdEEE555Çá|@Ô^Š@ ‹Å111 aaa•••¹¹¹EEEõõõÇùûû‡„„DEE…„„„……>|¸¾¾Þl6#C€¨½”ÀÀÀ˜˜˜øøx±X¼ÿþ²²2•J¥Óé, Çqeee999‘‘‘111ƒ R*•©©©:§:šv Päryhhhß¾}…BaqqñÙ³g«ªª ƒc†aD"‘ÑhT*•B¡0??¿¢¢Â©À×.³ðtíÚ5222**êÂ… ¨¨¨0Nm8Ž3›ÍYYY[·nU«ÕÁÁÁQQQÞÞÞ8%ÐÑ´K€2hÐ ÿ²²²ÒÒR•JÕTqŽã Cuuu~~~mmmDD„¿¿?N t4í  0@©T^½zµººÚd25S–ã8‹Å’ŸŸ_VVêëë‹SM»(¾¾¾Ç·¦(,ÇqUUU555îîînnn8%ÐÑ´K€"•J‰H£ÑX,–s§×ë ƒH$ …8%àŠÌfsfffmmm»®wJ{ÜoZß'\Çq+W®LKK“H$ëׯoMx«´‡šššäææQ—.]FŠ ÐP»Ü¶©Õj@Àבm±1Ã0J¥ÒÓÓS¯×›L&œpE|G‹Å¢×ëåry;­Ò¶>¼jÕ*Ç%;vì˜:uêìÙ³†Á9pÔ.Jaa¡Åb ÍÉÉa¦ùÞ% Ãøùùy{{×ÖÖÖ××㔀ËafÁ‚Ljˆher«´­ììl>= …?þ8}÷Ýwz½~Û¶m]ºt;v,N+€£v P’““CBBbbb222X–µZ­Íd( ,,Ìßß?77·¢¢§\Qtttttt{¯ÒV8ŽÛ¼y3ùûûøá‡‰„ˆÆŒóâ‹/æååmݺuÔ¨Q,Ëâ´صK€rþüyŽãBCC£¢¢ŒFã•+W ƒÍfkØÒ××7,,,""B&“•––¢ &¸¨¬¬¬C‡%&&8оÐh4îØ±#99Ùf³¹¹¹ 2dâĉb±¸ÑU²²²<8räH//¯Í›7—•• †ØØØ™3gzzz:¾WUUÕÆsrr¤RiDDÄÔ©Su:Ý®]»د_?{³Ë—/ïÝ»·  ÀjµúûûOž<9!!Áþ*VΞ=›OOˆH(.\¸ðå—_‰DÂà¤]”ììlww÷ðððØØX//¯ªªªªª*³Ùl/Ë0Œ@ `&,,lôèÑ‘‘‘555jµZ¯×·8ä :þüÁƒÅb±=@ÉÏÏñÅÍf³ãu±aÆwÞy'<<¼á*çÏŸ?tèСC‡7[XXxðàÁU«VùúúòKΞ=ûÆoØ\½zuß¾}ü%#ø…ã¸O>ùäèÑ£öfEEEiii#FŒX´hÃ0 Ãüõ¯­««sêSZZJDü¥Šs ਽æþ(,,þøãŠŠ –egÍš…3ऽŽãÌfsjjj~~~DDD·nݺuëÏÿ#¹N§«®®ÎÉÉ)//×h4ãÇïÝ»·\.ïÛ·¯R©Üµk—Á`¨¯¯Ç8pEÇ%''Qß¾}ùô„ûî»ïZ,??¿¦Ö ³?½çž{vîÜIDüж'NQRR’cÿ‘ÄÄĸ¸¸‹/Ú—DFF>ûì³ö§V«Õf³yyy53­ø÷ßòäI"zú駃ƒƒqœÛoÓÇétºŠŠ ‹ÅRSS“ŸŸ/“É„B!ÆúúúŠŠ ¾îIrr²N§KLL”Édݺu:t¨L&KOO×ëõŽ%$\…Á` ¢8.d&""¢ùCCC ¸:eˆ€ˆ† â´ÙÄÄDÇ…ˆòòò~üñÇœœœÊÊÊ÷vçÎ[·n%¢I“&1§ !a{¿Á`()))))iªÃ0iiiZ­V¡PDFFz{{0@,WTT”——«ÕjŒå—Ã' …âFWlÍ·½á9N%KRSSõÈd2¾üPCG]·n >üñÇǹhüFïŽïÇqƒ!??÷îÝiiijµZ,wïÞýþûïof°@‡ÅOÚššÚ›MIIqº‚Î;çøtÛ¶mDäçç÷Ö[oýðÃÿýïׯ_×pƒéééü1õíÛwñâŘ½ )‚ްV«µ¶¶6+++=====]¥RyxxÄÅÅ%%%9Vèø†IHH ¢_ýÕ±h«V«3gÎ#<ÒL-’æ7›””DDÉÉÉEEEöåéééö§&“©  €ˆ.\ؽ{w¡PÈ0ŒÉdÊËËsÚ`VVÖ›o¾ID={ö\ºt)Ò€f:È~X­VNwöìÙ;wfee //¯!C†<üðÃ8Iàr† FDf³ùÅ_¬¨¨ ¢êêê÷ß_¯× ‚›ÚÃ5j”H$²Z­Ï?ÿü¡C‡²²²¶mÛ¶|ùrÇ6b±8 €ˆ¶oß®Ñhˆ¨²²ò_ÿú—V«ulVTTôꫯ˲ ,¨ªª*//¯¨¨¨¨¨())Aýf'ÂŽ³+üXžŠŠŠ“'OZ,–{î¹Çl6›L&œ$p9]ºtyôÑG¿ûî»âââ§Ÿ~Úñ¥3fH¥Ò›Û¬§§çßþö··ÞzËjµ®^½š_È0Œ\.W«Õö§C‡ÍÍͽxñbS5M8Žûì³Ï¬V+ñqŒã«,Ë~ñÅ^^^8vµ7‹E£Ñdeeñ¥dM&“ã¸#ôzýÞ½{ÝÜÜ&L˜à4AÌÁƒÕjõĉe2¿äèÑ£µµµ|3†a<==ÃÂÂçåí¬<==‰ˆŸdŠ7uêÔ°°°÷ߟŸ‘‡ˆÜÝÝÿüç?<¸ÑUø§ü<ßv"‘Èia¿~ý¾øâ‹7æä丹¹EFFΘ1#%%eÍš5ö6÷ß¿@ X¿~=ÿ”a˜'žx‚ã¸/¿üÒ~ù·kÃ0Îà|¯4qâDÇ§Ž¿ÇŽƒ øÇÇ9>à8Îf³qŸ:¶?}úô-î̘/¶ØæàØ·]ú+’••õòË/+еk×:Îö¢ÕjŸxâ ›Ífï­ÀqÜÒ¥K³³³¶àïïÿÆox{{ß×XMM Çq,ËÞôÈ;“É”-‘H"##—¿ÿþû'Nœ¸÷Þ{,X`_hµZùa;r¹À-â@óøÐÄÍÍÍé&œeY¡Ph2™—K$" 6l˜V«ÍÈÈÈÏϯ¨¨xá…Ö¬YãØAãîцca ùÂ%óæÍ›øàƒàà`Ç–þþþD$"˜kŽN§38.„™8qâïO¦ãï±cÉRþ1ÇqŽ8޳ÙlœǧŽíOŸ>}‹;3æÀ‹-¶98öíNóu©¬¬´Ùl‹ÅÃÃC¡Pàú¹Q‹eóæÍW®\Ï=÷œ‡‡Ž €K@O¸~~~87­  à›o¾á+ìrg6›qL\€ÛáÌ™3;wî$"©Tª×ëÉE:|5PÚ†^¯wš¿Y£ÑØGœ•——Q\\Üßÿþ÷.ׂ(m 33sÓ¦M`É’%J¥’ˆvíÚ•’’¢P(–,Y²l=9Ž3™L8b® @¸zõ*Ùl¶‚‚¥RÉqÜ•+WˆH­V«Õj//¯îÝ»Ûcð€ËÁ€60pà@??¿ÐÐО={Ã0£FR*•}úôá;¤€KC€6ð—¿üÅqIŸ>}úôéƒ#Ð9  @  ´ @ P¥sÒëõ›6mÊÊÊb楗^òððhó·0™Lf³ÙÝݽùf‡:qâÄ3Ï<ÓÔ>èt:Žã.—Édül5'NœØ¿ÿ¬Y³¢¢¢:ì/++[·n»»û“O>)‘HˆèÌ™3»v튉‰yøá‡1퀫C€Ò q÷ü£¤¤„ˆX–m4ž¸E{öìùÏþCDË–-ãçijOöíÛwíÚ5³ÙÜTƒeË–egg;-gYö‹/¾ðòò"¢ŠŠŠŒŒŒ)S¦täc~úôiƒÁ`0²²²âãã9Ž;zô(Çq—/_®­­å?¸.(J¥*//gYö•W^éÞ½;ß!¢­ètº•+Wž?žj0šoÏ¿{S]0¬VkEEÉd2Çå&“ɵzmÄÆÆ¦¥¥±,ÆÞ¸¸¸äädooo…BѰ=ú¤¸(V«µZ­¡¡¡½zõjÛ-WUU-^¼Øl63 #¬Vk‹«Øl¶f^5&“)$$äƒ>\¸"O÷îÝ_{í5Ç%ãÇ?~|Ö Ã<õÔSø–¸( ÇqÛ¶m㻇¨TªU«Vy{{?òÈ#|6a±X¶mÛvøða›Í&‘HF5eÊ–eùuOž<ù믿N™2%33óرc&“iÅŠJ¥Òqû*•Êl6GDD,_¾üÈ‘#kÖ¬qÚF³nݺK—.‰Åâ=züéO’J¥-îvS|‰D¢”””mÛ¶UWWK$’3f :gn(ÍþýûùA1:îðáÃD4aÂooïššš%K–èõz{Ëo¿ývûöíŸ|ò _Þµ¨¨(%%%%%…•eY{¶b0o޼ɓ'3 £Óéœ^-++{öÙgíiHqq1¿ ·cWZZj0ÆÏqÜ¥K—´Z­\.ïÑ£GÃÞ(¯¿þºãÓ?ü°¬¬ì¡‡Â€ÛJ§Â0ÌÛo¿••õÎ;ïˆD¢?þ˜a///Žã>úè#½^/ —.]}éÒ¥•+WªÕêÏ?ÿü…^ "‘HÄodøðá÷ß¿X,–ËåNÛW*•MsåßÂl6óo~áÂ…?ü°Å&¢Ÿþù矶/dYöÕW_‹‹sj<|øðY³f ‚ÿûß)))ÿýïÇßp'Úœ‡ “ñôôôöö&¢€€___???†a .^¼È²ì{ï½—àææ–˜˜¸|ùr"JMMÕh4öÕÇŒ³dÉ’ððð   zß‚‚‚ììl>ÁIHHP(C‡]ºtiókUVVò†7nܤI“X–µZ­¯½öZQQ‘cËž={.^¼Ø×××ÛÛû¹çžswwç8Îb±àŒÀm€¥âç-v,,Â?îÖ­[pp°}adddxx¸Åb)++³/¼éÂ"ü[DFFòÓÐðúöíëïïßÌZ………Däïï¿nݺÿû¿ÿ›?þ×_íïïÏqÜúõë'`>|¸}æ¡PN˜Ën(w‘ž={:%îîîDäØåût8½Ã0~~~Í´Ÿ6mÚúõëW­ZÅï Éd²¿üå/DTRRâ8ƒOóA @»B€r)//wZÂ'B¡°ýÞ±lmC:Îb±8M‡ìããCD"‘È1‹Áh¸ƒ ÜEÒÒÒãŒÚÚÚììl–eCCCÛé-ÊËËsss›jÌqÜ{ï½·`Á‚}ûö9./..&"³Ùì8„àB€rWW*•f³ùƒ>0™LD¤ÓéÞ}÷]³Ù¨P(Úä-<==ßB­V/[¶¬™U†8p }ûí·|hBDeee}ôõîÝ»™ùn'LcÜ™Ù{p…ÂÅ‹/_¾<==}öìÙ999üK‹-Ú G … .|ÿý÷ù·ˆŠŠºzõjÃ=q2f̘M›6iµÚgžy&..ŽeÙŒŒ "‰D3gÎlf]Çò(í =P:!¾tHPPc2’ðöÛo{{{sǧ'AAA|ðATT߀/ãz£óÚ8¶1è8ÚlŸŸ_¿~ýÄb±ãÂâââ³gÏòs¬Èd²þýû;u¨««KIIÑétDIJlŸ>}‚ƒƒ˜L¦ÔÔÔÊÊJœª¶ÒN¹‰˲^^^7º–——×M¬ÕY­VƒÁ “ÉœÂ#¾W-Ø_ÒétM q …‰¤™·«­­ÍÉÉá8N"‘ÄÅŵr4Vqqqii))•ÊÈÈÈVæ\M}4€»AÛ(b±øù矗Éd _òññáçX™7o^LLLÃqqq«W¯&¢1cÆL™2¥aƒ‘#G¾úê«|]R€Ž,33óÇ´Z­ýúõ»ï¾ûìËóóó¿ýö[Ç™˜ÃÂÂæÌ™# 9Ž[³fM]]]£Œ‰‰±×‚ièØ±c°?ݶmÛ‚ ‚‚‚šÙCŽã~øá‡¬¬,Ç+ôÉ'Ÿl>¦iæ£Ü%Ú¦Jhhh£é È?ˆŽŽn´Att4ÿÚÆ+D$“ÉÚpž]€öÀqÜÖ­[7mÚÄ÷·2 ö—ªªªÖ­[g±XD"Qbb"ßÇ*??ÿ믿¶Ùl ÃDDD0 #r •Jùu›™‡èÌ™3|zâãã3pà@¡PhµZ¿üòËÚÚÚfösÓ¦M|zÙ§O"R©T«W¯æwûF?ÀÝ£mz 4Ó¥Ÿ‰a˜¦ÚØ—·¸€ŽÉb±|öÙg|r!‹zK¥¦¦r§P(/^ÌÓ½|ùò?üPRRRWWçååõÀ<ðÀŽ«˜ÍæwÞyÇb±4;Úl¶ýû÷QTTÔìÙ³†1bÄG}d2™öïß?cÆŒF×*//¿|ù2M˜0aðàÁD”°~ýúººº‹/ÆÇÇßèG¸{`€[e45@ ˜?þ¼yó_â8îÒ¥KD4yòdûTDÑÑÑr¹œã¸ÂÂÂF7xôèQ‹Å¢P(øù‰ÊÉÉ1,ËNŸ>e2Ù´iÓˆèòåËf³¹ÑµRSS‰( `РAü’nݺ%&&Òo)Ï }4€»JÛô@iæß¥F#i4­³`4ù;7¾ånË›Íæ IDATàŽ“ÉdIII£G–H$¹¹¹Ž/1 3gγÙh_h±XŒF#Ã0Ö+1ÉÉÉD4~üø¦ŠÂ^½z•ˆÂÃÃÝÜÜì »uëÆäÑjµöI íìÓW÷éÓDZKWŸ>}ÒÒÒT*Çq »z5óÑî*mÓ¥   Ñ›+³Ù|üøqþñ‘#Gþ7ÇqGŽá?~ܱʦ]nnnAANtX ÃÜ{ï½MÕaõõõuLOˆhß¾}&“I 8MJÅûõ×_ùî'±±±M½#ß™Å)%‹Å>>>Ç•——7³–Ó›úûû …B½^ÏO†uC àîÑfÓôÑGÁÁÁN7ZåååZ­–¼cÇŽäää†Ó«T*þñùóç_yåÇé]‰Èh4ã}šší~bÞèòf:s5ÕíÅf³55ð¨ "j1éP©Tö¸¤QZ­Ã ËÎÎÞºu+õëׯwïÞ ;v¬Åî'vV-€öÐfŠORR’X,v\X\\|îÜ9~öS©TÚ¿ÿ†=PRRRôz=±,›ÀOòjg2™Îœ9Ó|ìàJJJ6lØ@DáááS¦LiØ@«ÕòSZÓý„ˆrrr:DZ0ŠŽãŠ‹‹VH »Ã€]Û("‘è…^Éd _Ú±c?ßê¼yóýGõ¸¸¸Ï?ÿœˆF}ß}÷5l0räÈW_}ã À¥©Tª¯¾úŠã¸   ¹sç6:3wkªŸðø¾'üìÂvF£Q¥R1 ãïïßÌZÕÕÕŽ KJJ,‹‡‡G£×/ðÚ¦ˆl×®]›ºû²ß ÆÄÄ4ÚÀ¾¼©›Fww÷®]»âTëÒjµkÖ¬±X,>>> ,h´w‰F£á§ž0aB‹ÝOzôèADEEEõõõö…YYY‹E,{xx4\…a˜èèh":{ö¬Íf³/OKK#¢€€€Öôy¸kµÍ-S£ÿœîøÃ0Mµ±¿ÔâF\‘Ñh\½zµÉdbYvîܹV«ÕøÇi§>lµZ Eè‘㸭[·¾þúë'Ožä—„……¹¹¹Y­Ö7òiˆJ¥Ú±cÅÄÄð³í4\‹ŸÀX¥RíÛ·_ráÂ… .Qbb¢}o?ûì³+V”””àÜØ qÚÕÁƒù¹¨¬Vë‡~èøRLLÌÌ™3‰¨¶¶öܹsD4iÒ¤†=At:Ý… 8Ž;vìØ€@ xà6mÚT\\üÖ[oyzzVWWsDzì¸qãšZ‹/T”’’ròäÉ‹/J$’ªª*" ²÷ÿ*((à?~|ÆŒ8}¼¶éb2™šz‰ŸQ•㸦ژL&¾4C3s¯6³}€ˆïÒð±{É䬬,«Õн{÷†Íd2_Ö$&&Æ¯ÄÆÆNŸ>a³Ù¬R©8Žsww_²d‰}üN£kMš4iРAD¤Ñhø $<<ÜqTQ—.]øŽ‹‹kñ£Ü=˜‰'þþäfGÊ0 óÌ3ÏDDD8-7›ÍëׯÏÈÈ ¢ûï¿̘1NoÁqÜÁƒþùg"Šì±ÇN’››ûñÇÛgluœº•ÌqœãŽãl6çÀñ©cûÓ§OßâásàÅÛû6¾gÐNL&Sqq±D"±Z­!!!­¼„ÕjuuuµP(‹ÅMUœGm ð¦1®¬¬Ôétö§^^^žžžN7r555ö§2™ÌÏÏÏéþ°´´Ôq ¸ÍÚ²7¾SÒÑPMMc\ÒN§ËÏÏÇY€¥Í??¿¾}û:õ@)))9wîœÕj%"™L–””Ô°Ê™3gø^*,Ë&$$960™Lééé•••8Up§´M€"‹Ÿþy™LÖð¥]»víÝ»—ˆüñèèè† z÷î½jÕ*"úöî;<ª*ýø{§d2é½7ÒH¡÷HSÚª€ º"þVqÅ «îRÅ Xé`¡KèH ‘„ô„ôBz&™™L½¿? ×tRòý<ûì3¹sæ–sî9ïœóž±cÇNž<¹qÈÈÈwÞyydàïÒ9«ðx{{7=!"SФÉè ³Ü+Ͱ°°ðööFSÀߥs(-dŸeoµZ en?ª e@i!A‰F£!"žç›+£Õj٢¬ä­î «uN%///++«ñv­V{öìYöúĉ,P"Äóü‰'Øë³gÏ6(ÉÊÊÊËËCSÀß…›0aÂÍ?:–jÄÃãÁ2Æ¥¥¥l‰bÆÁÁ¡ñ2Æ•••¦?-,,\\\„´ZmQQ‘p‹0 Ã^ó¸«I:q_ "UVV Ã%©Tªœœ´ ÜQD  ´B‚*èä7¸` @+0¥C° Àý#PZ @+@h(­@  ´€V €Ð PZ @+@h(­   -233O:•‘‘¡V«íììzöìiooß XRRRZZš……Åøñã9Žc5ÍÁƒÅb1Çq“'O6m¸[ €­àyþã?>sæŒiKAAÁ•+W¶nÝúüóÏ3FX899yûöí¶¶¶ãÆ‹Åìã+V¬HKK#¢¥K—"zw#P %<ÏoذEOf̘áää”’’òÓO?étº7ÚØØ 8ÐTÞÌÌŒˆÌÍÍY „çùO>ù„EOÞxã¾}û¢Jàn„ ´$//ïäÉ“D4vìØÿû¿ÿca‘€€€ÈÈÈ (Š7öíÛW"ix#ñ‰š€»F @KØ´½^ßä[ÁÁÁ-ÜÒÒu÷P Yƒå‚mNmmmË{øí·ßbccQ“p·Cš%—Ëíì쨙(<ϳõ‰Y\]]¿ÿþ{6üdíÚµMNó¸‹ €Íâ8ÎÞÞžˆöîÝÛ8JR[[›››KDîîî?knn¾bÅ "2 K–,Ñh4¨ÏÛ@¡P¤§§ëtº»âÐãÙÜ*$‘…fq™’’’‘‘qåÊ•ž={ ßݽ{·N§‹ÅC‡müYžç}}}-ZôñÇ+Š÷ßÿ?ÿùp!ä{Ïó/^¼xñbMM Çq¾¾¾^^^·çè:îÅ_T«Õ|ýõ×ogm·ãÐãÙ´F @K"""ØLœ+Vœ:uŠCÑh4ß|óÍþýû‰hÔ¨Ql”J¬?ø`@@€iWz½~çÎJ¥rÆŒÇOMMœ™™9hÐ Sƒ 1•/((HLLüé§Ÿ>üðCssshøâ‹/¢¢¢„eŽ?¾xñbSzà?ÿüó¿ÿý¯D"Y¿~½››[ãËçyþVÝø#‰‰‰,®$Üs~~~TTÔgŸ}fšæÃNÆT ##ãÈ‘#lL™H$bFóâ‹/VWW ÷süøñ… Ž9·+´’Èt‚   "ÒétóçÏß¹sgIII“™wxž_¿~=‹žLŸ>}ùòåÏ<ó éõúwÞy‡R‹ÅÉõȦ»»û¿þõ¯çŸÞÊÊjÚ´iD§V«M;<{ö,y{{ûúúÆbâ‘››ËB‰äå—_^¹r% ”––îØ±ƒ•9xð ‹žôíÛwÙ²e¯¾úª\.'¢õë×—••±2,å^¯ÏËËk®Úqè1Íí‹ÅóçÏ_³fÍøñã‰È`0lÞ¼™Õ§B¡X³f ûÔüùó×®]ûüÃTÕfffìÅîÝ»YôdÆŒ«W¯~ë­·ˆè‹/¾¨««Ãí í€( W¯^#FŒ8}ú4ÏóÛ·oß¾};ÇqC‡1bÄ€L1‚k×®±=K—.eieÃÃûwïþÆoÔÔÔ¤§§‡††šöÙ·oß%K–˜>Û§O¹\®V«SRRØD!£ÑÈÆkLž|øð£Gž>}šPòóó«««%É€Ÿ’V«½|ù2Í›7…0˜iÓ¦õéÓÇÜÜ\,çåå) ŽãØðvJ–––ãÇß³gÏùóç}ôQ‘H4zôèAƒqgaaÑ–ÚhË¡›ûl¯^½ØhfĈûöícÂó|tt4 0€EO˜~ýú…‡‡ “GFFFFFšþ4 "‘H*•êtº{f­1¸Í@è48p R©¼zõêŸþyàÀN§T*_}õU6ƒ Ðh4¦áB,‘ #‰„¡S\àèÑ£çÏŸî¹çär9›¿Ó«W/[[ÛÆ{c«Mq"ÜnffÌ^³óáy~áÂ…÷ ÕjM£Z,--Û^m9ts‹‹{{{ c б¥† &ÜÈq\¿~ý„"Šß½{waaamm­ic €–! @'³´´ìÙ³çœ9s~üñÇ)S¦‘N§KOOoá#ldG«ã;íììt:]JJŠiþ΄ šUÁqœH$º¥ØÃÒ XYYµ{¼F»-Œ"µ°ó[DF6oÞü¿ÿý/55•EO8ŽCè:#P:A|||]]]xx¸0KˆX,ž={ö‘#GêëëÙ6âÃÕÕõÓO?eƒ)n‰H$š0a¶mÛbbbÜÝÝ«««Ùl &  žç CFFÆ Aƒš,c4Ùy~ùå—ÂŃ:¨-‡nv±±±ÂA(<ϳCL}}=K‹;dȧžzÊÁÁA,ëtºþóŸH€í†(¥ÓéÖ¯_ÿñÇÿðà ު««vÚYŠ“òòr–'ÅäÊ•+ÑÑÑ•••­+""‚ˆ¢££·oßNDcÆŒ1-^Ó€………‡‡íÛ·O8&99ù‘GY´h‘^¯wss“J¥ƒA€ ¢‚‚‚èèh¶ø£R©4M+¤-‡nG=sDz½œ;w®  À´=!!!>>Þôçµk×êëëÅbñsÏ=çììÌÆž™ÂXípû("‘ÈÕÕ5444""bÒ¤I¡¡¡...Èéw;©TÚ»wo":}úôO?ýdJº‘““³dɃÁ ‘Hüýý‰¨{÷î666ƒáí·ßfK †ƒ.[¶lݺu @s\]]•Jå™3gˆhôèÑ-„~øa¶Ø°a dgg³klmmÅb±µµuÿþý‰hÆ ÑÑÑ,Ø‘˜˜¸xñâuëÖ;wŽíêôéÓsçÎ;wnvvv#­º}U=zôhñY¼xñ±cÇÒÒÒ~ùå—÷Þ{OXÆÉÉÉÜÜœU,‹Ô¤¦¦.]º7*tÄí˜Âcee5lذˆˆˆ&çTTTœ9sæüùóJ¥íw©ùóçÇÅÅÕ××ïÝ»wïÞ½NNNUUU¦uv&MšÄn~‰D²hÑ¢÷Þ{¯¶¶ö•W^a˳2aaal2›ÿBͤYå8nòäÉü1¹ººúøøße3\L"""N:òäÉ“'O ßzüñÇYìòÙgŸýóÏ?ëëë×­[Ç—°Ó–J¥3fÌ`…¯]»ÆN¬¬¬¬[·nMÖÀ­šçùi ›W_}uÕªUƒáóÏ?7Õ‰µµµB¡`ZXX$%%íܹ“­¦ Ðq];E$=üðÃ+V¬x衇šË°àèè8uêÔ+VL™2¥Y!îOz½~Á‚3gÎÌÊʺÎÇ`0(•ÊöÍË舂‚‚óçÏGGGgee5này>###:::66677·ëÎÄÚÚzãÆ£Fb–——›–^¼xñܹsM%{÷î½víZwww"bѱXÄqÜ¢E‹î“¹pápa0¢££'MšÔÕGÌÈÈ())‘H$ëׯwss#¢Y³f½ôÒKjµ:!!aРA<ÏoÙ²… =X»v­££#Íœ9óå—_V*•¿ÿþ»)»Ü]üýýýýý¯^½ºeË–ï¾ûÎÃ㤤„M;²µµíÕ«ªºH—P}ôQooï&»ý•DÕju“ãê]]]gÏž½eË4Obbâ/¿üRTTdff|˜çùÂÂBº‘X÷ñÇïÄ™G]@ 2dH“o±9;¦¥IÄbq i2ãââîç¶Ùµk×¶mÛL?~|ÅŠaaaD—=uêT{{{½^þüùúúzaù={öœ={ö“O>a‘‚êêê… šÖ|!¢Í›7ÿüóÏ_~ù%Ëš””ôî»ïšÞ-++KHHxöÙg…Yr+**ÊÉɱµµ}â‰'Î;WZZšŸŸ/œX“™™9nÜ8Óv¶ñññ=ôX,æyþ‹/¾ˆŠŠ2÷£>b¯š  L˜0aÈ!^^^¦-<ϳi_,A©J¥***’H$ÂúúúŠÅ⺺:…Bq¦AWËåóçÏæ™g***ÌÌÌ´Z­ƒƒB'ÐÕ:Õ›&{¼&Â~NËy(xàû¹a4ͯ¿þJDÏ>ûìO?ý´iÓ¦ÑöíÛY\™LF7òþšBQÖÖÖ+W®üî»ïX*Ík×®%%%±øÂG}¤V«ÅbñÛo¿ýÝwß½ñÆR©T£ÑìÛ·nõêÕDÔ·oß7nÚ´‰ÅM6oÞ\VVÖÂy²j‡.“É"##yž?uê”°;O!v¶¦¼žÉÉÉ,z2iҤ͛7þùçlEj>«±µµµ···ðÝ”””óçÏsdž>YXXxxxèõúŒŒ ásssYüÄîvb±ØÅÅÅÎÎÎÅÅѸ :9€âááÑò²;®NËÝžàà`WW×û¼y¤RéÈ‘#e2™ÍË/¿üúë¯ÏŸ?¿¹°‚X,^µjUpp°¥¥åĉÇŽK7f²&%%q·fÍšÞ½{[ZZ8ðÍ7ß$¢ÔÔTõP«ÕK–,qvv¶±±yöÙg‡j0LcCÓëõG¥Ñ.¶pìáÇYJ”¶àyžÅ‰FŽùÌ3ÏX[[»¸¸¼ùæ›·”·¼¼ü½÷Þ#¢©S§² ÇqlvÏ|Àj€ˆJJJÖ¯_ODƒ!//?´]'ÿr;tèÐVŽ×æ  4è÷ß¿?F$‰D"N÷ôÓOO:µo߾ݺukyÅbwwwá½,[Jnn.±Ô3¾¾¾¦½{÷Þµk{­R©ˆH­V_¼x‘Mó‘ËåÙÙÙ¦·š”žž®P(\]]»uëFD>>>nnn%%%)))mOçÉ×`9íÙ³g¯Zµª-W*•‹/Öét³gÏ6mŸ;w.Ënû /„…… †´´4Óþ;q]¸trÅÙÙ¹åÂi;­.%+ Üo¤Ré’%K–-[¦ÓéöìÙ³gÏ"êß¿ÿ¢E‹ni­Yáp•°°°æF¯0………kÖ¬i°±…ÙM*ט IDAT.lpJiié‚ ˆH&“•””ÑáÇÛ@‰D‰Ä”–qrrjËg5Ík¯½¦T*mll–/_.Ì ëää´nݺ+VTVV²´¸b±xÁ‚‡ÊÌÌÄà&¸%@i51ç-@1­ŸrêÞ½û?þ˜‘‘‘páÂ…ÜÜÜK—.­Y³fÙ²eíÛaAAÏó-ÄP¼¼¼þõ¯5ˆ˜xzz6YX©T^¸pˆxžo'åÒ¥KµµµÖÖÖM~°Á F½^_RR",_^^Þêåð<¿téÒÒÒR©TúÉ'Ÿ˜››7¾œ¯¾úª¸¸X¡P˜››{{{×ÕÕmذˆôz=~h»;:€r?ϳ0 uuuæææ!!!!!!=ö[%'==]©TZZZ¶cŸ uuu¦8EyyùîÝ»{ôèÁr—‘§§'[ÅÆtJ¥²¹8H\\\}}½——תU«ŒF£©M—.]š““séÒ¥Q£FQSXÊËË…‹±ÀÇ¡C‡LK&ó<¿uëÖ–¯…çù•+WæääH¥Ò 6°…„„ï~ñÅiii3gÎ:t(›ÍDDÇŽ3 ¶¶¶xø í:9‰¬i‰âæ§í´@aËÍÜŸ233çÍ›÷ôÓOWWW³-,H!‰¯kÓ*;;;½^ÿßÿþ—å4Ñh47nüã?Nœ8ÁóüàÁƒ‰èÂ… ‡bQ( .|æ™gØ:;›æÈ‘#D)—Ë-oÉd>ø :tˆva™íÛ·³HŠB¡øðɈ%šå8nÚ´iDtòäÉM›6ÕÖÖ–––®^½:''§åã‹/¾ˆç8î½÷Þ³³³Ó°Ýz{{|üñÇ………ìS±±±?þø#Mœ8Q$áံëä(eee-ޏ¥(•••÷mÃøùùÉårµZýì³ÏöèÑ£¶¶–¥ƒ?~¼T*åyÞ4胈 CsÁ&¶]$½òÊ+ï¼óNVVÖSO=åééYPPÀ <þøãlÍšéÓ§ïÝ»÷›o¾Ù³g••[§F*•2¤ñnËËËÓÓÓÅbqã´ÁüöÛo³³³ ½¼¼† ²oß¾¬¬¬'Ÿ|Rx\vD6f̘¨¨¨8p€½kaaÑBòÚ¬¬,–~…çy¶–‰­­íW_}%‹G½mÛ¶úúúE‹…‡‡kµZ¶¤qXX؈#ðäÀ-éäßáäÂh,((È<&¢ŠŠŠû¶ad2ÙêÕ«ÃÃÉèÊ•+¹¹¹b±xΜ9sæÌa„vÍÌÌÌÌÌšÜiÙ°°°µk×:88ð<Ï¢^^^+W®d èÑO<ñüóÏ‹ÅâÊÊJ–‚¤_¿~Ÿ}öYãÜ"D”ššj0ºwïÞ8Û«Ý€ CVV…„„<ÿüóDÄŽ+‹-ZäââÂqK†ÂqÜóÏ?¿téR???//¯ž={¾öÚkÿûßÿÚWo!!!lt‰¥¥åúõë‰())‰EOÆ·lÙ2 ?€[Å5X>¶ƒ»;vì”)S:ëä>¼ÿþ…C-Økžç…/Øè ^@ø§°|LLLÏpÌÑ7[-5vuG¡V«µZ-ÇqÖÖÖo "R(z½^&“59Vˆå=177çy¾s…šc0jjj$Iã«P«Õ—.]rsscÁæÀ›6mš8qâ¼yó:xèòòrƒÁ R©ìììZÍÑФNžÂûÐCµð RRRvv6{íçç×£GæJò<ßñÇ=@.—ËåòNÜ¡M ïŠÅâ– ´X,n.%ðÕ«Wׯ_ÏqÜ+¯¼Ò·o_ƒÁ½iÓ&"jáöh»6®ˆ ЂN ÔÔÔ$&&öîÝ»¹Ge3;ˆ(((¨…rjjj«‚àæçç—““³nÝ:áv//¯ ~àN éô=ž>}º…JÛ5¹ø Ü{8ŽûàƒÎ;wðàA¥RÉ&+Mœ8qðàÁ2e  ã:?€’žž~îܹaÆud'.\HNNFóÜ'8Ž>|øðáÃQpgê’åHvïÞ]XXØä[ŽŽŽ¢ìììš,SXX¸cÇ´ Ü!$]±SN·yóæ 4‘<ùä“O>ùd Ÿ­ªªÚ´i“N§CÛÀBÔEû---]³fMjjê-}*%%åý÷ßGîX¸£ˆºn×J¥rãÆû÷ﯯ¯oµp}}ý¾}û¾øâ ¥R‰V€;ФK÷ÎóüáÇOœ81`À€#Fxxx4.SRRrêÔ©ØØXFƒö€;ä6C£Ñœ={öìÙ³666ŽŽŽŽŽŽ666µµµååå …Íw2Éí<˜B¡P(ÙÙÙ¨w¸‹ˆP-C TAGD]J¸ça @+@h(­@  ´€V €Ð PZ @+@h(­@  ´€V €Ð Pà¾P]¯{v_ÂÎäbTÅýæDnåœß.oM*BU@G €ÒùÔzCjY]TvEV¥ÊÈó¨€;Á¾ŒÒoó*×Çå)4º;ðôj5ú_RK²*U ¶ë ÆâZMu½Ž}•äV«O¿V§Õÿ§twÙŸQ:á@âU Îdªõ†{ø¿7Ú àN&At¢¨ìŠb²£*êLO‰x¸³ÕK|‡{;‘‘ç¿»\0ÚÏÉÏNÞÂ~ö¦•lK.®ÔèEDÎréƒÝœžèá)q¦‡²Ê&N’q\Öƒ=mÌ»ô¢jêuÁßE—Œ»#Cf„¸¡•;®Õö…NÄ}w9ã嘺z":§P»o>7ÓËþ݈ ßC&º *«JÕÇͦ‡³uãwOä–ÖjFù8vð1䉦RZˆ¸²yR1ÛþÑùì·âó4›µ6ýÚçzÃóüš‹VLÞw¶F-ÜøSaõkÑW·Oè1ÊסAy•®ËPUë¬ûqgþnÛyþJií‰ÜʫժR•¶R£wI\,Ìüí,Fù:ôp±q­÷goµ}ïIñ%5¿¦—ö°›è|Zmááäϯ–=ççôæ`¿ Ëjµ>©LñÑå‚È]—¶Nê1ÈîåNéü?R’ÔZÇå?5ÄÙBÖàÝÇÒ“ÔÚ/‡èŸëçÛö³ª©×}›ëbi6¿Ÿé¦©Òê‰ÈÀS¹Jëc+gÑ™WârMßÔ¶æRE½^iä‰(G©ÑŒR±¨K¥ñ)Ýùê´úR¥ÖßÞ¢Aôd¢£ÕgãÃ[þl…Z;ýdMSÃûYÊ><ÒÇñN~ˆîÆö@å¾SS¯{â÷„Õ7N÷°0æb£Ðœ©VªŒ<}Vòmfi¥ÁHDÆæ÷ò}t‰ÞHD.bÑãþNŽ‹*¨ŽWiJ Æ =Üs˜×_úØmé´wT̉9Žèþ‹¤3·&}—wY¥µq#ì-],¤ÁöÕ]j•êë«eª‹9½-Ì^éç3;Ü£…>m;Ú÷ž´9¡ðÓÌÒÇ*ênCeËŸŸ_-Û>ªûcaî¦>ö†zÌÙ—ðü)'g´2kékÐ^*&5ixþ©ß÷Ïl8能kv‹ŒSy•o'xJÄÿìíÅnŽhÙPÿ]©%=œ­M]ßýeìV‰~l‹Ѫ¾>q¥Š™¡î=i²Qš<¥;?z2÷÷Ëi5õ{§öɨT £'?Oímg.mu–"NcàÄ"÷wE’ZKDqJͨ}‰ïöð\ö@ÐùÝí€ÊýØ»žw Ñ=YÓÇgFˆk ƒ%ûS¥3|“³,¡@Ãó,zÒ‚E$³Þõ\/ûMõ2Íéø!¡`þÙ, Ï?÷GjüÜ!Ûq‚–¥•×={(éŒB=×Ë~ÍÁýìô·ë´úè‚ê —òž:“ùuBá7»;Y¡}[`k&!"+³.Ÿb`äùes^ pFO éÇcCB·ÅnO.ž×Ç»-{;XQ·îüÕW‡øwüĬeR"²“Š…Їƒ]v3—ˆ‰h¼‡­)zBDÿÒí¶5JãSº“éüÓûö^«%¢I¿Äh MFOx¢ ±¹[SK^èãõdOÏÆû‘q\ü¬¦„Æ`üè|ö[—ó‰hù•ÂÞ®ÖÓ»»Ý™ÑÝÕ^ Ü~K/Ý]¢`¯¿‹œÛËKø®…Tüú0ÿäʺò«ZÞOq­æ—ÂjöÏý-Sz èžÓË+§¦þÄ‚4µöÏRÅ@÷›“Ôû'ÓçUÖévfâûxÏ÷h°çÉÅÿÌ/Óè‰(ÄÖüˆÀ^.6Ë|q¹ ´^GD~V²õñ~(È¥…³ÝR²7½Dgä— èíjÓ¸Àê³Yñ¥ŠåAKj¾M,¬Ôè‰h¼ÃÿF7ÄWt!'¡JEDVÑ?]^ÜŒ<ÿêÑ”Â:ÍâÁÝLS-Ø¡½¬ÍWE†°ZRë ‹¦Ôê +îf×™?½Æ—Ô<²/ÑN*¾0­Oss=¬Ì$ãü"ý¿‰Ï[r1wÒ/îz¨g_7ÛŽ·o©R»òlæñÂj‘˜(ÒËnùA62©):ðêÑ…F¿rtȪs™Ñ%Š:½±·½ÅÊQÝ}í䇲Ê>½”W Ôˆ&ýµÚYÓ,p:¯ò§”k ½ÁS.}}°ÿ˜nŽÊ•粫”õÞ´«µê\VºBCDf’Eý|þê&x®ýx¥ð±Pw_;ùÏ^-Tiì'¹¬îýóY'KDt¢XñÂÁ+£ñÃ1¡¶mÐY•ª|a|@Ówr ƒåv^S´}‡ÿ‰ÏŸèîdÝr±niv¯¦T©ˆ(³^÷ìþD=Ï/à;ÈÃî÷ôk?&öqøWߤòÚ÷Ï]=uMADg¯Õ¾pðJÞðɸ0;séšsYq×/ô÷N'ÑÎL<3ÈeÁ nÂ{¬T©]{þê©¢j‘'¢Á.Öo `1‚ExJm¹º·ågsØW“•Dôt˜»p']aý…lÓWq–æz“ÆÑ“e'ÓW$‘&.¯É iô7ƒÝ2±èÍácüGürYÃóÿ=ŸýP ‹éiâ‰ÖF_ÝYZ§7Q/{‹7‡ù›¾`?»˜s2¯r¢¿ó?oé2+•ÿ9•n&}:.ÌtÛ¿w:óJy휞¹tä!jÐ^ñ%5«£¯öt¶~"Üã?'Ó¯T©$"nŒ—ýÿFKÄ¢ ±¹»2®UhôæbîÙp­Ã­:›õÛÕ2v]¸Ù¬ݽ‹žSPî#ß_¹¾4æ¦a ¢'쟡oD¥¶=!¢CY¥5F^BôŸáþ§å¼4Ð7µ¢NÏó6Ò›M¦áùž;/Ý,¤¦³'ÓÏT}zcª?O4koüŽâS‘$µv÷®¸Ov[0з…2ûÿHžž¿sz¿&3›îJ)~ôx…ËÍüš+ÎíÌ,Sjvì¼(ÜžVr ¯2vÎ`S*Ç5g³Þ¼œ/,s!>ï»Ô’3³²>Ïüª´z]÷ŒRSübSbáòZÇ-Òå¤È¬RmÌ.—½¦ÕuZE¥3Ì;”ìk)Û6¥·‹¥YË…Å"îÿúûFú9=w8iÞ¡ä3O jÄñVÛ÷xNÅăW„é2J7f–šÔ“¥J¹V§ý<³LÃóß~wNØvG·Ç>áïüQƵ›ÓJäU²±-7›fWœðS']Yâ¶.µÄtÄ$µv÷Ö˜¤™,šn,µöôñÔ9™×¾{øz<èXNÅÎÅÎ’¿„$Ø~.=Ú/ÜÉ:³JùÝgáªV¿1»œˆ^¯ÓtQǬ°NMDÁ7†ƒ5ÖÃÑ2[Qß–]½âöuFi¥Á8wÿ•óOna”PË·tu½~SN«d Ïoɯ$¢ážvƒ<ì¢r*vט‰Eÿêï›U©ú¾ aE-­ÓØšKwd”Æ)5*U¦ÊGç³M©R®\Ì]ŸPûø` )È­œp Qx/Åek6åT°)c-4Šð”ÚøÀ6y[Ñ… ÙÑ…ÕßMéÝEßÃWÊjߊÏk¼ýˆ€&£'D4»ùÁ§Ft·{-Ôý¿ÉEI*mj…²§‹5 K ÝsU°"R’Z»uWÜÚ~¾‹‡t#¢K%Š%ŠŠzýÓ}¼Ùw§–l/ª!¢YÕ“‰Hoä¿H-.Ò†{Úwð!jÐ^ŠúÅ5;ŠkÞN(¸Ùôi%±×2éžk7¿ó/]ÈŽ+Q|5¹§)ÜÖðº²Ë7åTœ˜Òkˆ§=þ£÷3Léô åoe "êmaÖä™…5õkÓ¯5ØhßTwñri-ùÊ$Â&&¶æÒŸ¦õÙ>½oãé!“œ¬÷ Û8¸›­ˆ#¢¯¯–'–Ö^ï<œHg‘‘Ñö–;Fuÿlp7±ˆˆ^½˜Ó¸L_ Ù¶‘Á?>ÔÏRFD{¯Õþ|¥°…èÉPkyüÜ!Íu}-nô0ýÍ$›‡ü664ÂFÎzžÏfoÉ*c1±èóA~G&ô˜ájËÊücO¿#í[]¯{äp’†ç%DKBÝOîñZw7vÕ“&²%lÍ$œåðÖ WÛ_Æ„Îóq ¢Rƒñ£Œk2Žû¨¿ßocCYk&©µ»RK4M˜¹tÛÈà÷zzÉ8NÃó+SŠ5<¿ ÀùðøðÇ=íØáVFg²Â'rËYcù›I¶Dþø@kÐò«6Ä^ï½›RÈ8nyOá~^‹J㉆xÚÿ0"èAK"f#ß>ªû#‚„óS:WU½^BäÕüú8~¶lÔU«ºÛ½?¸Å)5ïžÌh®X«·´›µì»‚º°ZúfXÀ·C&º˜jÕ «¨ÁÖæ¦ŠúfX[è‡5Ÿ©ƒoJ4+ã¸õü~:ÝÕšu­_;žBDFž_p,UÃó2Ž{¯§×ñÉ=L-¾0*Í`ä[há)µåêÜ–‘v{#C6 `_;?T+¨ì¢¶>œUÞäÂÎONN+¯k=y­»Û+·8ê…þ¾¶"NÃó—Š«Ùÿ±7žEs·=<>üã~ìKøÕ¸Üc9D4=Ø•ˆÎ+ÔJ­ž}äÜë5p ³”½H)¯«Ðe7Yp´ï!jÐ^Â0ß+Á®;GwcoID'ªU{®Õt7—þ<2xãÿ(|ŸWY¨¨g'ùøo—Ùu=çç¸st÷ÿ„y°xdÿ•{{h€VaJ‡:X\=ˆˆìÌ%Mþ(íek^2w˜J°.¦ˆãš\<•ýÛ×\tk!­Φñ&#|úïŒÓðüùªž.Ö*á›ô"zÁßé³ =®÷´»»õþéB©Áøe\Þ† á¦2£í-?ÖŸ]ÂìpߟSj6'ÏŒ©±6“þž~EO†ÙÈOÌØj¶7‰èòÜ!,iÈä —~ßE_ViS+•ìŸé_Êc±”9CÙOåãü–O[™R|ªZu<§"ÒÏq\7§ÒJ.Ô¨”Z½•™ä\~UéT2û³JÙ²Ê'ó*‰h˜‹uçf9–Wù˜—]“‹×¶ ÜÉúIoûcy•‹ùµ»}¿ŒË«4%DûLJ?àLD£|FxÛO9š¢2òïG_]12ØTxº«õîô%¢©Ý]û6çUÊ8.zz6hb ‹÷7§KôFÍ_{>þf’Ø9CØ0™nöò'OeÑý|XŽœëvÅýVªÐ®[øàB.õ³”™Æ_<ÞÃsìÏ1ǪU[’‹^èïc¬$㸃{Œösdû‘íKØœW™^W¯7],Ížìé™V¡¶7#}û™žë!na›Ï¥ÕëüÍ$ñs‡°‘€}Ül†þz™n¬é_\U¥$ÁŒÔGBÝGxÛ?œT¨7Î,›†Åìà>†(«>ŽëfoÑÍÞÂ^Þì W+3V†ýÏ·Å$ávò¶Gd÷’`9ä0'ëÖæD$qDSTU¢7JˆžîåEDj½A­7¸Yɦû8˜þù~6ÿz™÷"LÇqÜŽ‡{ÿ66ôÃÈîÂÃ}¥èѨT"Šh[ô„ˆæww3¥\q܃Þ¦{®¦^w¾JID/…{°Î³$"ÐE,Òå+ÔD4ÌÛÞE,Òù˜¢"ú#»œõÍdw²D¡3õFþb…’ˆ&tò’.ñUÊžNÖíø`wG«ø*e»Û—':’SADã­\ÔCÁ®“œ¬‰(÷¯« ?ÛÛÇô:ÒבˆÍ¥¦¸XÄþuñ]æ‘nN¦IFC<ìe'ã¸éÁ7»F=nÎ|©¾ÑX³‚]¥b»—8¢çûzQ’J›S}ó”†ÙYŒt¤g†5LÊ£1‰Èšé:éUªî-.Gâcg^¤3×jZÝÏóÑ·“z8ˆEz¢9‡’ÿ߯[šˆêõ"ª7|K•ÐjE™ŽøvOO=aþ7*ø÷qa&õKÅ"ŽûzrÏßíoº—4£s£ï«¶«Õ«#" ÑK|Mñ‰ËÖæ]ÚÖEJmso¥ÕëïºÔÁè Y›Iœóòöe–‘…ˆ{}èͼÂnV²…áD”£Òè F[si_¹žèDnΫ¬4‡ÙÈ»›K3ëuì©añßQî¶Âo†N|ˆd÷L/oÓ—ðH7"Šp±6Í£ q´bƒPXìM»Æ®ë‘PwÁ¨Ö4ãX§îæR"ú=«ÿÝ€ûF ÜY.U*ÙÏ’mà4÷V½ž'"=Ñ _þlâ]£‘ˆ ›yaÚ¨kW—Fs‹¹ ÄMõ9%‚^ôÖÅ*¨©?U­bÉ>›ãliÖ×Bv<·¢í»}$Ôý)o{"ú¾ ê@FiƒùAm¼¥;‘˜ãÄ×܉HoäÃ6Ÿ[‘T” Ö²è‰Ã‡ýV' ÞÒÕénïmàeÕz¢"Ç=ÓË«}Ñ"Ê­V×óDD6‚„³¼Ùx›ó ¿“Œã¢kT*átqŒãƸŒós"¢ÃÙ•¥Jm®Vo!âð±ï¢8E[©mÿGƒEÜî7øÇP‡\*©9V­nega!m¢[STýùÕ2"ë`ÙdRR–ìCeä·&ÍïëÓàÝR¥öŸûõFþ£1!aÎmJ•ª3YŸA¸J“e ´†œju£eË;|ÁßY&æ>Ê(=^¥|5*å£qa©:7ð¼†çˆå IDATÏV Íó|™VODÞ×{ãeq¹© õ¶¤" Ït³‘ŠE“œ¿Ì.Ê­´2Q¤×Ùû\_Ÿõi×^JYÿ`˜\"nËGŒ<¿ìTF¹ÞðB£[ÛÞ¾¡ÎV¬÷t<·òéÞÞÂbåj- wîäl/ml,"ÚøT£¥¦îL_ÿ™7ÜV>½{KCK8¢¥ƒ»Í=™öú»µ¬{þfr¯?¾=S¤3Ì=–*¶Óö[º}ñ‹¢ã¹åÍ=¿Q9iõ:"úwë¿ws²Ê%âã9‘»èý[Ì÷ü®µÅÎ4<ÿß/ÿ:­O ƒe;ñΙL–‹w„=i F":[VÛ`L¶æe&ö³“Q/_3I®Vÿó•Â,µ6Ð\êi-“‰ímEÜŸUÊíÉEžŸè`uç&ØuÈ$)O»Íß3w>üó¨3²³Ø>µOƒÝD”T^;÷P{ýT¸G“Ÿíçè!ÑÂóÙEµ —V}çTúòÚ“UJžkë/“½\lØZ{ÓK„Û£ ª>»˜s(«Œˆ¸Û±u%6 —A%zéH2÷ù‰™{ã…ð¶_7.Œ­ã°>£ô릦r´‹¥Y€ÜŒˆ¾K*^Ò‘«å¬¿gêQ„:ZùÉ$Wµú…±ÙD49À…ˆXvÆÅ5›r+eÇí\þö¿<¶+¿jÖ/—›U$¤ÖJú$«líàn~2Ý´½}9¢^N–D´«¨ºN0e B­ýµ°šˆ$bî6ߨ¦ÆÚžò—{©PQÿÙÅœ Ûñsy}WŽ´ÊªTmH-y{h@«=Àé!®#í-?¼pµí;—ˆ¸]{Q¥Á(\¸í·ôõèðЀ›GL. Û•RÌ}~"|ÓY•ÎSXÍúÃk"»{Û˜³Pà™üª&O …F¹Õ«»ÍÆusìmÑú ”z#ß–OÚè[r,mY-=êiÇVOg£\þ´ pÃ}y¹€Ñ1±ˆîj­áùùÑWkŒüHw[©Xäf-ëo#¿ªÕÿûR.Eú¶3±nWD¤áyÿ/ü~cñ㌠å¿þùev9w¶osZS;ùG+"z+.ﳋ9¬Ï³=©hôï brv¥‘»µlŒ³ }”QºìT†ÁÈk ÆOc²?Í,%"?›¿DXÞÐ_éç&±@@|IMûï<Ž{,È…ˆŽW)Ÿþí2‹ìM+™v$™ˆ<%bSE‰8n”»-{múù×Ö\:ÄþúÏÈ^fâ'«®hÐ ·¦ôºR­š°ë♼fßVê ?$ úéÂ×Ùå?Œúgï¶ïÓ½<‰HeäGne‹°&–ÖŽÚ~±Ò`”qÜ‚FÃ[ºükâFc¬¨{n"¸[TýÀŽ‹ brÞ‹ÉÑßJGŽýÄýk‰"¾¤¦+&¬©u†—ަŒu±ïïÔ–K{{xÀÚôk¿¦]kû!†zÙ/m´úIÛoiV¹ý¶¤¢ŽÔ€ˆã愸Ñ9…úѽq•*EeWüß© "²3“ÈÄ¢>®ÖìXß%ðDƒqåÙ¬w nµQÚ~u‹oÿÌ¿ÜZÆ¢™ä—)½Û²®V|‰"¡Tñç5ÅåkŠ-—óûl9·*µ˜}ÿ¬u=µö¤@7‰HO4éàö8×ÔëfígKó<îa Þ ó[³µŠ9¢Ñ>¦ï´ñþ·ÿíº‡ˆ]—†ç§ï¿r2¯‚}ó¿{2ý±i br.uà;à€)<éœB=ü·„Ç=íúºÚøÚÈJk£ò«¢k¯/Náo&ÙöP¯~§}¡¿oJy݆¬2 ÏO9šâp<ˆLIe÷adˆ°FMÞID‰óÑ'cCÏ1ò br^ŽÉsûÁ\Æq¦up?rb[l¥Á¸üJáò+…¦Ë8Ž-Äkš¾ÁXJÅLï;`Wœ†ç'ýv9eîP;ó&’´e ÿkCý÷f•]¨­ÿ¾ êûoÎßútdpÖ ›°CDÃmåN2vuã|”×Ñpgë6N±i‡îv»îÕww\|Iu„½Æ`Üv¥È\"²Šk4úr•öbI;âš#ÿ¤—ýöɽZ˜`ÕööâiÿR€ó'YeqJMÈŽ‹Â¼äÂÖ'6µ‹±µ“ Ú¢…¦iaW¯¹ÞX_çV|ýå)±Ètæ«#ni¨ÿw[Ê,Õð|¿=ñ2ŽK|O‹kåܪù”×®éãs ³¬lm>óXê +³!žöm¼“WŒ >˜[§Ô´ã–u²b£ÃæžÉœ{&óç‘Á³›˜Öjk¾4È÷÷¬ÒcÕª½×j÷n9û—&è+q=ìXc;:?ú/m„sˆÚÒ(m¹ºænË.͈òu|Þs7.Mvã[®®¶ëÇ…zÛ˜·V½¼†ç§E¥4~ËßLr`ZÏ{°Š?‰zìD{œéèÍ ³‘?ßÿæ4½á^¶"®ÆÈ sLt~;¡€Xü×ñ–§uâCÔ É,¤âµÃž<•Qj0ŽÚ—(|Ò‡ÙÈ íÚ¥Ç@¹÷²³xe€ïòóW/ÕiˆèçÂêŸ «ÿã{뤭νÿt|ø „‚…ç²jŒ¼éŸ­¢gü?bJ^èf-“qý5y'YHDD$»ÑO p°HŸ3ô‰ß/­Tê‰ô4`ò_åRaû^ï¥K¸}õ'zzÆ•(>ʸfê¿un{õp²–V¿ñç­M1ë%7ó°j¢wÍž)ÛFQBÇm¸×€kŒ¼©2ÛxK:X~>Äÿ…óWYWŸ%ôeµ'œŸÕd}²æ3µ¦ˆãŽ>>hé±46DÂtÄ÷ÓÍ‘ˆÜ¬dG§ö~öp²)ÖÓÏR¶æ 'Ž$ wÛd£48¥¶\]“·e㯦.ŠžÌñ¶ÿt\Ø¡¬²o c«U5FÞM"šèa7ÖÏqf˜‡XÔÊÜ71ÇÉ8ލá ÙÏRöt¨Û‚AÝ|þÑ0÷s6æÏIN®×™žåww[5º»ðXlÂαjÕx盹Nz¹Øˤé]¤Û_0îÈCÔ ½lej”jÇLÌ‘L"عHÆqõüÍ&{¢‡§»•ù ÇRÓêu•7riý+Àùƒ1!­Ö!À½›0aÂÍ?¸»àßFÂÙkžç…/xž7¼€ðOaù˜˜˜žÌ©¼Š/ãò?æbi¦Ô>ˆ¾ú¿+… Vm±qo†{.èÛäH¦¯‘è\~e¥Zgc.áyn‡mã¼*·¤T©­Rk9Žó²1onW¬ ëqÙšKog›j ÆÜjµL,2u³“ßQ÷›Jg»í¢…DÔßÅúý´’~–²O"»ww´Öè ¶æ’öå}¸¥öͨPZ™Ijµú GË;áù¬ÕèY™´í‰W›TS¯3‹äÒÎïT—©4*íÍy ¹ ÕÛg²ìÌ$¿•^þÓÇá݈ áG<¬e˜2³·´B£ãyê”ÇMc0æT©Zh—Üjµ™XDD-·Z[åÎy`DO¾šØS¸.’ZopÜmÈ„ÊêV¡ÑùØÊ»â~þ["v]õzƒ™XägoÀ (1~z5õº¤òÚ¤²ºœjµ·y€½egëö3áïbäùç&}•SND2Ž{)Øõ?Âq"pW0ùÈm±#ˆžÜK=€Û£ G ôìÙsìØ±Â-—/_>vì˜pKdddïÞ½…[Ž=š˜˜ØÂnïð(p/ÑŒ*á6Oh‚®S¡ÖÚ˜Inܸ=rªÕDäÙ©Ó¯šÓ…#P¼½½»uë&Ü¢T*P”ñöön9€pÛHÅ"[tÌî!ŽrŒ!º§øÝa)“àÞ†Î!@+@hENá)//OMMn)((hP¦  @"‘4øZî(]’DV.—[XX4Þ^UUeee%•^OÉ©Óéêêêìíí—T©TjµºÉ#‰,Üf?E$-Y²ÄÖÖ¶ñ[Ë—/Ÿ5kV÷îÝÙŸiiiÛ¶m{÷Ýw—¬©©y÷ÝwF#ZþvŸÅÏϯÉèÉ-±µµõóóCóÀ ó(¡¡¡wÔ~:€VtrÅÚÚÚÛÛ»Svåíímmm€¿]'PBCC;k)Žã0î@¹c÷Ð>@‰D!!!¸Ã‘H„F€¿Wg†'|}}---;q‡–––¾¾¾h$ø{I:q_]1ã&444;;»K«€çyöÿ&F£Qø§© ÜKX"WN@$ ÿ4•éÌJXXX§_IXXغº²xž7å¾e$Œž(÷¢ÑaÐD=¡N  tâÆBÞÞÞVVVuuu]]_Ši {è ü?{wUõÿü^î 3€¬²È&( ¢’û–KîKš%•»¦©i®Z*ÖÜÒÜJ-­4[´Ü w3AEÜAd™†a–ûûãü>çs¿30\†±^Ï?|Ì\®3gÎ=÷Üsß÷,ðO%Œ¡Tú/a±Ê‹/¾(fã={öØØØ×*•JÌÏhÙ²åÅ‹ë!¿h Å8ž‚ À?A(àk…ðO  T;ŠV«-++3𨨨hµZ‰Dbú“ë!€B³†ÄJLä üƒU°²ÔGW@Y¿~½q—•Jµ~ýzÓÿQdß f“pÔüãU °LÓ ó<Ÿžž^éŸÒÓÓ ÆËhÔ¨‘OVVÖ3É>”!°L™LV§©¬ëÏ0Á Y`(Õ@  T€j €P Pªa™ŠF£©ÍµüïuJb‘OyðàABB‚··w¥åy>%%ÅÄÿé§ŸÚ¶m˲l¥}øðáƒp¨àYaûõë÷¿7U„0žç ^óÓ|éÒ¥•+W’× [·nµ±±©ë\:{öìÍ›7õz½ƒƒÃƒš6mÚ¥K—¶mÛZY¡4t Ô ÏóŸþyvv¶‰}ÂÂÂ&Nœèææ&ÜhmmM_kµÚzNö½{÷èk½^_^^^w¥R¹jÕª«W¯lÏÊÊ:wîÇq³fÍêСƒ¥¾N§Ó=}ú”¼vpp¨ÿ®= 0%P{ Ô–£££éJJJÊ”)SfϞݱcÇ’æàà`úÚÊʪî¢'iiiŸ~ú©N§«jN׫W¯É“'×>ÄÀóü§Ÿ~š––Æ0 Çq7ntvv~&9ÜpRJ=Y¹råÊ•+Èl#ÁÁÁË–-ËÈÈÐét:u’Ëåuñ-·nÝŠ‰‰1ØHzâ £* OŸ>3gŽe»i4œNè~ð¼CÅb8Ž[±bEãÆyžç8®¨¨èçŸ>wîù+Ïó[¶lY²dI¹— ª»Ï×jµŸþ¹pKXXØÔ©SIG žçOŸ>ýå—_Ò¿^¸páòåËaaa–=" §làx®!€bIÎÎÎäu£FfÍšÕ¢E‹mÛ¶‘-·nÝ*..61”C«Õžþ|ïÞ½'Mšdº^¯§a#†aÇŒc¼›ŸŸßŒ3âââÈÛ¬¬¬ôôôæÍ››‘™™™‹-~¸N§Û°ay=wîÜ—_~™çùß~û-##ƒaèèháH¢«W¯îÞ½{îܹtãíÛ·iO™^½zP’““éjJnnnááábR‚óใdë–D"¡]6t:pùcÇI$ÿ?¤%—Ë ‚‚ðOZ­vöìÙÑâÂ… ÂYHè‡ ?AøE¯ذaƒ0zBýùçŸ ¦µJ¥"Ñâ7Þ¨*àòòË/Ó>; ÃܼyÓ¼¬¨j%iƒN§ËÍÎÎ^´h‘ñì¶dY¥ÄÄÄJ¿K&“ì/\M‰™x¾ €R·xžøð!½ÕwuuµøW>|877WPèÓ§O¿~ý,2«ëˆ#^xááÆüÑtWšœœ@qpp0èµñÊŸ•Õ€èÛüü|óÒ)•JýüüZµj%Üêççgkk[Õô÷÷1bÙD¬]»Öt¤.R ž‡×­äää¼¼<,pqq±ìçëõú½{÷Ò·îîî±±±ŽŽŽ ÃDFF~òÉ'•ö")22òµ×^cfôèÑû÷ï§£fž>}ªT*EÎåáèèH¦5©ŠT*­}>øùùÅÇÇó<¿xñb²x°D"‰ŽŽ6°˜2eJ¯^½ÈÜ»wïÎ;ÉvFsñâÅN:Õ[J C”º¢V«>¼bÅ ºÅÓÓÓ`‚ÒÚËÈÈ(..&¯9Ž‹ŽŽ&цalmmcbbÌO >œ¾8p »»;}+~-¡üü|žçMìB__½zU¯××&Cèçy^­V›ØsÈ!$zB :´C‡ôí¥K—jyhħ>ô@±N7}útY(++3ØaܸquºœmëÖ­=<<„[úöí{àÀ3>-$$Ä JâææF{ÓˆG:U¡3ì’×r™gaoÅq\ß¾}…[X–íß¿RRy{óæMNW›ã%2%ð\@Å’T*UUŠŒŒ41ˆÙ„Ñ___ãu³ ™žåD}úôöíÛ³fÍÊÍÍ5þ/R©tðàÁômZZÚØ±c9rüøñ &œ={öYý–æÍ› ×'ÎÎÎŽŠŠ:sæŒR©T«Õ<ˆÝ¾};Ý㸷ß~»6YAÐP…N§Û°aCNNNQQQ¥{æååMœ8ñöíÛ………©©©S¦L¡Á–e;wîL^7iÒ„Ž!Òh4~øáíÛ·KJJÎ;7}út®ªMJ áÞ„eÙ®]»ÒUit:]|||µÿkðàÁT(ämiié–-[Âo™3gÎÔ©SiTB§Ó­Y³¦ªý'Nœ(Œ˜˜— ÇP¥¤¤LŸ>a˜ØØØæÍ›ï¬T*.\h¼ý¥—^òöö&¯ííí[´h‘––FÞæççWú_j™hàÐ¥¶„£3j?íè€*ýS×®]+FD&“­[·ÎÏϯÒÿòæ›oo©ê·˜&æ—ÚÛÛoÚ´©Úx˲ ,èÕ«Wí³‚eÙÈÈHãíJ¥Òxc¥ŸÀ0ŒÏœ9sè<µ,ËN˜0¡ª”÷éÓ§ª?‰O 4|õ@qwwïÑ£ÇÀ{ôèîééù¼ç ««+½g¿: Çq›múZ*•nذ¡Gwão¾ùæÔ©SéžÉÿé:dkk¿páÂöíÛ·hÑ"44´oß¾Ÿ}öÙŒ3¬­­¿]"‘Ð׸±µµ¥Û ¾âÿ++5HØòå˧OŸn¼’ѽ{÷o¾ù¦mÛ¶Æ2/+üüüâââ„9lœZ‰D²zõêÈÈHán à >|åÊ•2™L¸ÑÇÇgݺuþþþ?mþüù¬ô8ŠO <Ø~ýúUuh777áj& ÃØÛÛ÷ìÙ³M›6Â5w©üüü+W®;vLät§Â¾ä5ÏóÂ<Ïëõz^@øV¸ÿ_ýÕ`ŒR©ÌÏÏç8N"‘xxx˜¸ñ.++#“¡Êårƒ;†a~øá‡_ý•¼^¸p¡Áº3õ†çùÌÌÌ{÷îéõz–e5»»{‹-è ¸ÉŠjÓ°xñb2‡ã¸7:;;ó<_TT¤R©X–mܸ±q J¥R¹\îææVûóž~>nÜ8//¯ýû÷=z”a‰DÒ¯_¿îÝ»›¸/ussëÝ»w»vívíÚuýúuÂÞÞ^¸ ±‰ ÀÂ… ³³³ÉÛ?ü°S§Nô¯÷ïßß·oyͲl¥¬úÁ²l³fÍš5kVwYaF’È¿..."ÿ‹³³³³³3 'À¿…(^^^ à 4ˆa˜‹/Ž;¶Ò¹9Œ999Mž<9))é×_-//Ljˆˆ ”•+Wž?¾S§NR©411ñôéÓtOwwwrt ¦êjF†AƒõéÓ§ªŽ'<ÏW:ü¡C‡AAAëÖ­ËÏÏDZiøðáG---%o“’’’’’ öá8î“O>1˜ïã_Ȳ3þÀ¿GNii=Q©T‰‰‰YYYÙÙÙîîîM›6õóó .øêìì¹víZÜߊdkk»aÆ7ž?¾ÒÂÃÃ'Ož,~ Ê?Ø /¼póæM›ŠŠ Ì`âYxÙµk×VºýÊ•+?ÿüsII‰ñŸßxãV­Z 7þòË/§Nªô£þ%“ȚȉKø IDAT¡¸¸øòåË·nÝòõõ-..... jÓ¦ ]'ÌS‹ª^¹rå›o¾©ê¯%%%›7o~ùå—###­¬þÿ²ÊƒNKK+((ÀÏÉÉ©Gëþ@íYÕÃw´iÓ¦oß¾Â-þþþï¾ûnçÎé–¿þú+!!¾µ¶¶=z44Võó5dNYú¶yóæááááááÂ}:”““#ÜÇÃÃGž9 P4MU8p ‰ÿ«Õjþùgá–ÐÐP!xæ,<Êž={Ú¶m[éd´ÉÉÉ*•ÊôÏÈÈÐjµÉÿOU‹-þüóO$x¶,@IJJJJJ2û¿ëtºœœ___òÖÉÉ Gž9«†– ¬¬,úh\…®d Ð@Hêí›æÌ™ãàà@^Ëåòªvóññ¡¯KJJp„à™«¿Š··7ÇqÂ-<ϦF"ñôô¤o‹ŠŠp„à™«¿Ê† 5j$Ü’››k°O`` 0ÈrëÖ-!xæê/€rûömÓ;H¥Ò‘#G ·\½zGž¹º±µW¯^;w¹óàÁƒÝÝÝéÛ7näççãÀ3W‡=Pøê«¯2 ãëë»gÏNWÕž,ËvéÒ¥{÷îtKyyù®]»px !¨«JÿþýIô„a˜N:yxxlݺU©TïÙ¸qãÑ£G·hÑB¸qïÞ½ÏÅ ²¦éììŒðPW”ððpáÛ€€€… ¦¤¤\¹r¥   ´´´I“&~~~M›6mݺµL&î|ëÖ­óçÏãØ@Áöë×ïoXÖRŸëää4mÚ4áœ&"ååå}õÕW………Uí \ü˜¼æy^ø‚çy½^Ï ß ÷ÿ믿jù3Ñàß ®&‘-..^»vmVV–øÿÂóüÉ“'¿øâ Ñ€úW‡“È*Šøøø®]»8P.—›Þ¹  àûï¿OOOÇ!€†FR§Ÿ®×ëO:•œœÞ´iSã}²³³/_¾|òäÉŠŠ h€$õðJ¥òøñãÇwqqqsssrrjÔ¨QYYYIIINNÎs±Úü›IêóË 1¿ üðCFC+K}2=ÝxžŽj½^§P( F]ÓŠ^¯ÇyM¤§§¯[·Îx{£FÚ·oOß?~|ÇŽÆ»mÞ¼ÙÅÅ¥NSXo—EžççÍ›WQQÿo¸Ã^j͸ìž={võêÕômIII¥_1sæÌÜÜ\ºeÇŽ{÷î]·nÝ¿ö¤«eÎ×^AAÁ¦M›h!oÚ´éèÑ£†Ù½{÷½{÷HóU£ÑDEEYðZóÏh4´–syyy\\\¥ýè³²²¦L™RÓ’9oÞ}úôùé§ŸÈE¼¦Š‹‹† xøðaUã ÿþûïÜÜ\ŽãfΜq÷îÝeË–)•ÊüqüøñÿÚÓ­–9_{Ož<¡œ†¹víÚo¼¡×ë8 ¼#ÍÍÍ}¶”Øä8îwÞéСÃ7Ö®]«V«ùå—¨¨(aäˆDOFÕ­[·5kÖܹsç³Ï>Û¼y³ð6JØ)£OŸ>C‡µ··—H$5}vbÙÄ3‚Þd“&MrwwgÆ8È¢×ë>Ì0̰aÆ ¦×ë $I¥‘ 3™L¶uëV…B1uêT©TjÞ/=vì)‡Ó§O·³³{òä‰J¥jÞ¼ù¿§6F¥¾®Zµª¢¢B.—>|øÐ¡C‘‘‘NNNÑžçsrrT*•\.oܸ±\./++³±±ž:Žçùˆˆˆˆˆˆªê5†a¬¬¬X–U*•ùùùÇy{{K$•ýŠŠ žçIå¢Óé´Z­D"1H˜B¡())©¨¨J¥¾¾¾fT”ÖÖÖÖÖÖ...111äÃçÎ;~üøòòò;w‡×èÓH¥C*‚G©T*''§ªºç‰I¼J¥ÊÏÏ×jµvvv7V*•,ËÖ´ÅoÐgˆªd:îáÇ*•J*•zxxTõM¥Råääh4¹\n|5 Ïóä{‹ŠŠ år¹———yW2FC.«$Í´46nܘd){,ËÒE~£^¯VÊd7ryÖh4999Z­Öø7ŠO<)–M›6­ª‰Ve^dãF§ÓùúúvíÚ•eY™LVé3vN÷øñcò ÀÝÝ<'¯Q΋°{÷nŽã233gÏžm‘JL­V“k0SõLO………ÅÅÅ<Ï“‚jðóI±¡Çˆl×jµäuÝ=Ã/**Úµk—­­m£FH÷Z3>„QR–òóó …ñož°<Ïsg\˜Õjµ°¤Ñœf‹ð´’H$d;)ՉĠÓét999jµš\2xžW*•nnnuኈˆ0hVjÈ!¡¡¡µù"£‘J¥ùùùEEEnnnÎÎÎÅÅÅyyyr¹¼iÓ¦ÆeÌÄeQLm#²~#E‚eYrÊWûCrrr …D"1q‘ÊËËS*•R©ÔÅÅE.—ççç7iÒļƒ¨R© ËËËY–õòò2¨mÌ«*Éï5®¸ÄG!û÷ïÏqWi…a˜vìØ‘a˜_|qæÌ™±±±)))ä®ÏŒ|sM7}…¥È‰/•J5^¯78ú¦ëùºÈy ›ª-]º4&&F§Ó;¶C‡Çq·víÚ¼¼<òDzÊ”)/¿ü²ø2O²B«ÕÒ $Ùkggg0{‘˜ú­Úæðr T*†‘ËåäöµîZSbô5-Þ´%Àó<)l9ÛÚÚ¾û¾¾ÁÁÁôŽãèÑ£!!!5M¿L&#= õzý;ï¼S›¬°³³ûòË/5jDÊyçÎ333ýõWƒ.Wþù'¹ýõ×Y–]°`ÁÔ©SKJJ222„·ñׯ_'Ñ“)S¦ôêÕËRM ŽãÈ!團â¯P(6oÞÌ0LïÞ½'Mšd¢Pétºòòr‰Dòú믓ÄÁÁÁ솙0ñ÷’±0•JÅó¼³³s¥Xžçóóó†yóÍ7ÝÜܘtŸ/P___ò‚ôt ¤[„.^¼¸råJá“=+++N7dÈÚ`5¸)ŠŠŠ2dˆðC„;„……ÑGÇ}úé§AAAÂSSS7mÚD:ÍÚÙÙ qâDaƒL­VoÙ²E˜0–eßzë­¡C‡’ßH£Ç§¦¦’ÝÜÝÝcccŧ™çùÅ‹§¥¥‘·_|ñE^^ÞªU«h §OŸ4cÆ Ò–Ý´i“““SFFÆÜ¹siæ“. jµzüøñäÙTË–-ïÞ½K‹ô„ ^}õUòZ|â…H.ŸK–,e‹—y1Ž=züøñ§OŸ2 “••µ`ÁrÓjµsæÌ¡éçyÞ¸7fŸ>}Þ}÷]r¬Åä|M{ê’ÓŠf»Ùxž?~üøÎ;I£ÓÖÖö­·Þ2îÿ™°yófaavss[ºt)i7«Õê‰'–––’?ùøøZN¸QXÅYÖ¶mÛ4ÍÌ™3OŸ>]i_YñÒÒÒ–/_Nf_bÆÛÛ{ùò嘠R©üúë¯Ï;'<QQQ `YV«Õ~ðÁyyy Ã,\¸0<<\X°éc4ái2þüÕ«W_ºt‰lqppؼy³D"áyþÀ;vìæ<ùÒ7Öu·aRd»³F6nÜHšËÁA2 T˜Ó¦M#õ@µ—E1µMnn®˜úM©T^¾|¹¤¤„¸#Gޏºº’x±ƒƒC›6m„USJJJ||¼°ÏE@@ÀŒ3„ãö¯]»¶bÅ ã~¤Ô(Ó E||<­Lˆ1cÆ 6ÌŒªòæÍ›_}õÕ£GÈ¥gèСµBRm¥DBT‡fÇkD^Ó«½ÂÙÙÙÿùÏ>|H·ØÛÛ+•JR•ÑÛ]Óõ¼ÅsÞ‚ÅFL ¥M›6ÉÉÉ …‚Þ\9;;“ž}=zô 9Vm™ß¿ÿöíÛÉëwÞy§]»v111´×µk×>ø€eY‘õ[µÍâþýû«V­D;;»?üN–TÓÖTqqñÎ;Ÿ³gÏ&¡ ¥R9aÂZKˆl˜iµÚï¿ÿþàÁƒä òññ1b„ñŠ+ß|ó éðBuìØqæÌ™´Œ)•J2ìˆ\Y–,YBpååå=zô0(Q @ݪ´"ÚçêêZRR¢ÑhhœÞàúA¯(•¶TÈ))),Ëz{{gggëtºÅ‹÷ÝwôIÚ¶mÛFÿWii)½üsG‚‹äì"//////ò8hÙ²efÌ"iðïÎ;¥¥¥ÇUNãøñã$»ÔjµR©LHHhÞ¼yïÞ½…UCµ‰ß½{÷É“'Y–íÝ»·««ëÉ“'srrH#ɼT>}ÚàÉÕòåˇúöÛo“T-_¾œ´Ÿ\\\"""233oÞ¼yêÔ©””R{’Ã1uêTr‡мyó¤¤$r;ÿþŒ3X–¥ù©ÓéRSS9ŽkÒ¤ÉÇóòòÖ­[·páÂ=9iÔ¨}Mo„Aý6mÚX[[ /–«øµk×èsB©TJv»qã¹ÕÌÍÍÕét[¶liÑ¢™ü¬F‰§È0Ì“'OŒ‡ÚZ°Ì‹,§>¾~ôèiŽǺ¸¸´iÓ&###33óرc'OžÜ²e Éójs¾¦‹ày>..îÂ… tKYYÙ–-[˜ÿöÅ í×mÛ¶‘̰³³»zõj~~þÒ¥KéDeƒE$ChE˜tûöíóçÏ{xxDDD|øÕW_}ôÑG´*ž>}:i94mÚôÒ¥K …bÛ¶m.\X¼x1Çqžžž$€BÑf÷Ó§Oé`Ò>&Yš––Fê a˜†ÜÆ\½z•܇„………††¦¦¦Ò»²:`õÇ$&&’‡Qîîî3gÎlÑ¢…ñn_|ñ…D"!-¼ððð÷ß¿FmtáC0ú,—ÂÂÂÓ§O>ÜÇÇGÌeQLm#—ËÅÔoüñ‡pô¨pn–e7oÞLoíhmÃq\×®]U*Õ… ÒÓÓgÍšOR^\\¼lÙ2FãííýÊ+¯G$×wñõ[µÍƒK—.ÅÆÆ’×ááá666III¥¥¥Ÿ}öÙ[o½5|øðš6Hxž_µj9×RSS{ôèQ›Æ0¹,<ù§¦Å[ΔñÊ+¯Ôæ’aÙ¤………ÉÉÉäz-œjº¬¬¬¸¸˜ã8º‘ôCÞ"‘Á•,˺¹¹mß¾=77×ÓÓsÀ€´áQ›&Ð;wîܹCkã±0U%žçyòè%44ô÷ß¿yó¦L&ëß¿ÿ‹/¾h¥sʘ>*55•PD6Ì„õ ¯Y³Æ Á$z²ìK/½TXX˜™™™˜˜èææFŸi=~üøÚµkô¿„þ®¾}ûþ{½B¥!¢CûüýýçÌ™Cúž9sƸ¸ûùùíÞ½›a˜ŸþÙàqÝaëÖ­“&M*//ˆ‰‰±µµ}øðá¼yóÊËËoܸAREEEß}÷Ã0íÛ·?~¼ƒƒÃõë×—/_NB¤k×®%u"Ë²ãÆ»qãF‡H•>O¾sçNU¥Å(**Z¾|9Ã0­[·6{ "–eçÎÁóüÖ­[:táÂ…^½z‘óYLâyž'uÁG}Dú Ž1‚}š6mJšw x÷Ýw­¬¬È$U©©©%%%â#\,Ë’[AÈ#“–·nÝúáÇÿýw§Nœœœ¾ûî» Ü»w¶Ÿþ™41éX™LöÍ7ß,X°àîÝ»R©tÅŠ~~~jµzñâÅwîÜ9sæ i(‹O<½)lËÔ×–-ó"³+&&F¡P\»vmÆ öööË–-#¥E*•Ò¾Áûöí#­êñãÇ¿úê«$Ù)))+V¬Ðh46løè£Ääü3©”NžùDXoËd²o¿ý¶´´tÒ¤I†–jRÉ—––Nž<™ÜtëÖí½÷Þ³µµ={ö,Ã0ä´äz÷î=yòd†a† BO:šE•´IW^[[Û²²²¼¼¼… .Z´H8íÙ¤œì–œœ>ž„?~¬ÑhW­ZEö3fÌŒ3 …Ý=^yå†aÚ´iCêXÚÔ¾xñ"©EV•ÙÙÙä6888øƒ>puuÍÎÎ^¶l‰šÕ‘>}ú\¼x1%%eöìÙ¤Ø0 ãààYÓ_Ì5]ÌV­VþùçäÎdÉ’%äæþýûüqyy9-bêyËæ¼e‹!!! …"%%…äjiiéÙ³g9Ž£µ·È2Ofu¹}ûöÂ… É|÷Ýw PZZzêÔ)r!Y¿UÛ<(--]µj‰ö.]º”)ÔjõêÕ«/^¼øÃ?tèÐÁÓÓ³6­©›7oÖ4€Ò¥K—Ö­[“šòäÉä±ßرc»uë6þ|©TºyóæJŸáY¤åLs&))I"‘4œ5ËöíÛG' oÕª•0W9Ž#GV& i…/rrrH÷ a`nÿþýÑÑÑ5í5éÒ%Òzë­·ú÷ïϲìñãÇ¿ùæRBÆŽ+>ñjµšô~v«ÑëõÑÑÑdØ˲t$1 3žç7lØPZZJ¦çëÔ©“N§;rä9=…Ýýýý£¢¢|}}_zé%’½¤¼páÂ[o½EÎÄÀÀÀ¯¾úJ¯×üñÇÅÅÅQQQ:t Ò¸qãÕ’á 4D¤{¶ƒƒÃ²eËhP³k×®………;vì ãÜL° âÁd÷œ9sÈCu//¯àààäädzqMLLÔét³gÏ&×¹ÐÐÐeË–Í;×`.¨€€FóóÏ?gffÊd2WWWÔ¬MÔY­VÏž=›4Aè£3tëÖÄAX–íѣǡC‡=z$|þ >ñÇŽcYÖÝÝ]*•öèÑÃÙÙY*•š÷%ɪU«ÈåÖÙÙyîܹüñ­[·Z¶lIÚ8::¾üòËôq´O‹-ÒÒÒHµ¥ÕjÉ@€nݺ5iÒ„ì&‘H"""vìØQ^^NÄ$…ŽŽŽï¼ó9ŽíÚµ³±±!ìÍ‹I‘ý >>>ô1¯Áã#áóƒ¾Ùd·iÓ¦‘aÉ2™¬k×®wîÜ6ïjšx‡Ã²e^ Rœ›4ibЉ—¬lG®µýúõ£ÛÃÂÂ&Ož¼~ýúK—.)•JÚHª6çëÏó¤ öêÕ‹®Ý¶téÒyóæìüòË/'%%‘Át¤ƒyV/ÌÒQ£F?~\­VŸ={–t¨9uêTii©‡‡‡p úóÏ?sssÛ·oÊó<9:U­,(†££#]4-""B.—k42_•R©$]æÌ™C‡—³,ûÚk¯Ý»w/11qïÞ½]»vµ²²2®· 2ʸ´GFF¾öÚkäµq_¤Ë—/Ÿ:uÊÇÇG.—ûøø,]º433³ª!ÓµäååÕ´iÓ:ôïߟtɉ‰ÉÏÏ‹‹Û¾};ýi­[·vqq‰ŒŒìÒ¥‹D"IMM]ºt©V«Ý²eËœ9sÄŸh$h`N"‘èõúÎ;³,Û®]»7nW¦/‹bj›jë7OOÏAƒi4šýû÷k4š#FTÚsíܹsä,4héOJ*¾}ûîܹ“†ÉÎOŸ>=xð`óæÍ5jdgg·lÙ² .<œƒôi?qâÄ×_Í󼫫ëÕ«W n)ÅT•¤¥‡‡vÁÇÇgÕªU&L¨£•, 2ŸDOHÊÍÈcâš®V«Å\a³²² ÇqqL‹“Æ IDATqq´*nÖ¬ÙâÅ‹çÏŸOÂ1âëy‹ç¼¥ŠÈVÍ€víÚµÿþˆˆ–eIø8$$„NqR£2O;'Ò!Õöööƒ 2»~«ªypÿþýòòr2TŠvñÉd³gÏž8q¢B¡8vìyj%¾A²¬pb—Î;›‘¥}ûö=pàÀ^yå+++ÚÛhàÀ•FO,Õr&RSSËË˃ƒƒk3~Ç4…BQUÔ•eÙ^xÁà'øøøxxx<~ü˜a˜k×®%$$˜†CŠÓ£Gè$kBd—¸¸8•Jµ|ùò­[·’qÖ&++«ª²··7y(rôèQ§ }”†éß¿¿^¯v3#ñݺuëÛ·ï®]»®]»öã?¶iÓ&00–aOOOkk늊ŠfÍš‘ ³§OŸ’›ÊY³f‘ø¦D"2dˆ••=GBÏž=OŸ>½ÿþ²²2òl€\I…ùéîîÎó¼··wqqq³fÍŒçBž žçIã»Gí¿!C†™f¦ŸÆ²lHH½O›ƒááỾfÍš999 ï„ËÊʦM›FFºZŠZ­ž5ki—ÄÆÆÖ¦÷~Û¶mék777©T*<íÅ$ž ½{÷nJJŠpªy[[Û &˜ý$Mø°‚eÙQ£F}öÙg7oÞÔétäIxIIÉ{ï½güI윮Fvüøq2LÉ€A´ÂÞÞžþj‰DÒ¬Y³Û·o׿â:}út‹,™!œ×ªÒ~þO|íË|£Yé']I†!s" uìØñ›o¾Ñjµ£»-˜óµDß¿ávÿÀÀ@úˆža˜ôôô… ÿã†Nÿþý÷ïßÿÝwßuéÒ…¬2È0Ì;ï¼S3ȪÕjò°å¥—^"M%rtôèQ¹\.¼Ï¯]»v4©2™ÌËË‹NzŸ››«Ñh¤R©ñÝËàÁƒ+ SŠáááA'°0СC‡]»v|ùå—ÂO6lX=’J¥+W®6ªbbb¦M›¦ÕjKJJèuÊÇLJ̖G„††N›6mÍš5÷ïß7cKƒ'êÕ–4Ó,UÛdð<_QQabèŸN§›1c†‰ÏiÖ¬y°oЮ ïÙ³gM]»oß¾mFUÉó<z9pà@áÁ’ËåC‡­´ƒE:t())‰ã¸iÓ¦EDDܹsgùòå%%%«W¯ž;w®øc$æš.ò ›••EBfÂ9k† \½z5 ”––Ö´ž¯}Î[°Øˆ×½{÷={öܺuëñãÇäöÒ`¾1e^èÕW_­ª_€¥ê7Ò“å…^0˜ËV"‘ :tÇŽO>DVÓ§OïÙ³gQQ‘ŸŸŸÙËõïßÿÀÙÙÙ–œ_Taa¡éóºÒÄÓ…)[µjEËU¿~ý¶oßnFôªÚ†™˜ÂOÚ!$òöÛo{zzêtºû÷ïÇÆÆš½Ô1(PßÈð¶'NŒ=ZXpÕj5™ÕâKm“1Ò'NœèÑ£iOð<¿mÛ¶òòrZñ|˜&5??Ë–-o¼ñƬY³ôz½­­-éj¸bÅŠëׯ ï»–/_>räHÚ‡|£Á¯61®DLë“ÖìåŠÖà ÃìÛ·|õýû÷ãââŒÓ@®Â42)|0%>ñ$ÂýëºÌ‹Ì+ú„&‰þ–eÉÐè„„„ß~ûn?þ<àбcGáÝBµ9_£Ú†çya†×ôÓ¬¬¬ºtéB ꯿þJ>êæÍ›ÑÑѼ¥_G»Êß½{7::Úøèƒ¦YíááQÕr›™™™töxófª–H$111+V¬ Ïc—/_Hz>›±êžñÓTƒ‚jkkKžw­Y³æòåËô€îرƒÜ·o˲}úôþUd™'WxM¯eýfºyàççgcc£ÓéæÎKc"ïâÅ‹Ið—Nö)¾ABV­¦·'N˜¥þþþæý÷ßW©T-[¶4èÜT£–sVVݸgÏžªf,âyž ëïˆ,6Æ—*ƒæ¢···{e<<<èWÿðÃ3fÌHJJ"9¯V«É¤ìVVV´§'˲¤oÚO?ýDÖY;{öì£G8Ž{饗„Q×-Zо± Ã\¿~œ¼´CÇq^^^Æ©òòò¢; Dž?~Û¶mß}÷]TT”p•œ%žÌ‡²cÇò·¸¸˜Äï N[NGŸ©”——ëþ«F 3WWWR¿]¼x‘—„„òÅ „9°u:Ý… bbbŒ÷! ÅÉ"mÔç+\÷\LŸk°8#¿Êÿ—^¯ç„o…ûÓ¶ŽÙ úÿ¨´srvvöìÙ³+-j¾¾¾t¥OáÚunnn‰—æÍ›Gî"*]—‡"ñfòh‚nŒ‰‰ ?~<½………‘%ÙŠŠŠæÍ›WXXhð9>>>+W®$©"sד¢bcccÐ#ÃÄTáÆ_¢Ã†V¬XqòäÉõë×ÓÊ‘,˜'&ñ5Z¼x1éÝDzlÛ¶míííÏž=KÔX·nÈÅÏxž_·nÝ©S§HxØx‡^½z‘Õ@xž'sÊ’«‹¿¿~~>M688xÉ’%,Ë*Š©S§’rsssqqÉÈÈ Wñ¨¨¨!C†=z”Î5@¥W*•³fÍ¢…íwÞ£ëVëÆWTTc-“É6mÚÔ¨Q#ñ9/Ò‰'è¹ D„øÏ®c€¬Ç9|øpº&7™lÏàHÄÆÆ 3ö‡~ «Àš8ëúé§Ÿ~úÉ †4ûòANL³óAXq‘‚ªP(„ƒüÉrZÅÅÅÓ¦M#'¬«««\.'+e‹i¬E%ŒëyrÄCCCW®\i2˜šW©TN™2…$/&&¦¦ëœœ2e i¹899]¾|™îY³fÑiKKKÇŽ«ÓéÈüVVV¤AÏqÜš5kh·Že»T*]µjÕ¼yóȲk×®MII!9r¤··wµ—EñUeµõí±}ûöýû÷“Ã]TTD?Š®©A‹1˲͛7///ðàA-q÷îÝùóç“^^^­ZµzðàÁÍ›7Áú#"¥§§Óyé*6B111bªJ†aèyMn<èE¼¦×)‘%gíÚµgΜ1]ÅѦ Çq¯¼òJjj*)Ìt.ñUÌ5]ÌÖ W ôСCÉãbêy‘ 3‘9Ÿžž.¾Ø”——?ž~Žy—ŠûJ/šÕ–y™L6iÒ¤J»ÔÌbê71Í–e¯\¹òÙgŸ‘ÞÞÞ,Ëfgg赦HLÌ]È0Ì!CLt(®–p•åO?ý”NCnFËYXŸ_Qiûœ”FŽã6nÜXÕ˜Êj‹MU·65½j 3“eY;v쀄±¤É“'“Ō۷oO&o6Î|zÎÚÙÙ qSDŒ´´´O?ýÔø7ÒŽ±âO×eY6,,ìÊ•+:ÎàUÕxcféÒ¥¤ß´˜†Ùk¯½&¬¸* °ìgŸ}ö /Œ?^¸^žÁn#GŽ|óÍ7M´QM÷rúçA”úfb ¢££#m‚ 8pñâŤqFmíÚµûòË/k³Z°q¤Fa7mÚ´hÑ¢ÈÈÈÈÈÈyóæm߾ݠûÖÀIÀó<9» ôþûŒªªi–ek߯»ÒÚDdâÉCK[[[žçÿþûï'Nh4WWט˜ñKdz,Kî™ËËË]]]…“os7uêÔ)S¦ÐÅ•—.]J–fT©Tiii¤¥8kÖ,Ú*uppؼy3¹-ÉÏÏ¿uëYè´]»vË—/'—|ƒpg0_øŽâcÉíÛ·ýõ×™ÿ®fJÆDÓ`\þiO º›AËÛtâM\óªúSmʼHUÍ[$—Ëi&cMæIU©TÙÙÙäX÷éÓgÛ¶m¤ÀÔ[ßôˆèJàW_}E‡ì’’˲óçÏ'Õ;Ïó$AšÍ+‘Hâââìììt:‰žôêÕ‹ž†ÂšpÉ’%R©´´´”\€cbb̨µBBB¾ûî»iÓ¦EFFFEEÅÆÆ’ðº‰—Éd«W¯vssãy>99Y§ÓI¥ÒÏ?ÿ\xŒªjœ'=Ó0#™'<¾®®®£G^d2ÙÒ¥KÉ)F.®®® , ÓÇÐ¥²ª½õo›*=PjÅŒ(5UXX¨R©¤R©££cMÝT•‡Θ1ÃÃÃŒ¤Û•J¥B¡J¥...µ¹ýx&ªM|ii©F£qrrª¨¨ ¯e2Yí×u#ŸÆ²¬0LfÐ~züø1Ïó666vvvUk•JUXXHVstpph ù¯R©T*ÇqÏõ:ðU•yËÒétOž666ÎÎÎ&ʃZ­&O<-ZTÕÔ …bÒ¤IÆÇÇ'>>¾ÁNcâ7>yò„çy‰Dâîî^Õ¹_XXHN³ÏhFSTTäææ¦×ëŸ>}ªV«%IUù/¦ãHùùù …B«ÕÚØØøúúš¨ÜT*•V«%‹|?_Q|ýVQQñôéS™Lfkk[Õžyyyd‘&;;;ƒÀ+ Ó3K¡P›äÚ\g5 Ì‘¥mkŸ………‰ÄÑÑÑìå„kÚÞ»ÿ~EE…D"iÚ´©y ô]ÓE^aICB"‘˜ÈX Öó¦sÞŒbCf`­}‘ e^£Ñ˜þ(e¾.ê·µI\†NÚe6²Œ½pÕžÚ$,++Ë××Wd‡îjË¿D"1Qüt:]II‰‰fg]1™ŸŸ¯Ñhär¹··wU…™çù{÷î‘©…¼½½MüÆŒŒ ½^oooo°ŠVm;vlÓ¦MÆS³‰O|vv6iP¯âlñ†¹^WTT˜h›‘ÊD«ÕÚÙÙÕ݂֠ €R”z–——'‘Hrrr–/_žŸŸïëë»råÊçú®e¾Ú»wïÎ;Mç6ínM‡.Bí¯¡}ôÑýû÷ë:PðA¢¢2™L.—_¿~ý‹/¾Ðh4dl 2çß«ðÀÿLRcÇŽÅ$ Ìƒ¥îÞ¿üòË3gÎÐyˆ²²²bbbbbb*½“'3Ô8::Ö²£PZ­–ä*e€ ¨Öo¿ý¶k×.á©T*ìˆÿ ÀÿÈår²ú&Ã0d﨨(2Re,‚ iNQ–žž®Õj+½™ïÙ³ghhhC^ãù¹C¦o|ôè‘ÁúPáÕÇuíÚ5**ªöó6ÂóCxjåŸ7„‡ùïŒkÖÖÖxÿ(óõI§ÓL¼ÊqÜs7›ü;0Ï×ìu`qh³‚!T €2uÇÄ,îhÀ@C†eŒª @5@¨(Õ@  T€jHjùÿƒ‚‚‚‚‚ Ο?Ü€¤Úö@ñ÷÷ïÝ»wXX²þ©êcL&cYy Ï©: °,ûÞ{ï31xNIêú úõëL^ïܹ“çyd:<_ê¶Jppp¿~ýÈ눈ôC€çQP\\\Þ~ûmaÄ1xÕUE*•Ž7ÎÎÎÎ`»˜ ˲ݺuñ€¢®æ@yýõ×}}}+ýSDDSõ|(r¹üwÞ ¹víZaa!ŽüðúNkbbbbb"ŽÔ3ËPäry³fÍê:­7oÞÄ€úWÛÊíÛ·ëbâØJ¥§§ã€@ý«m%==q øgÃ$²Õ@ d0 S\\\RR²,ÇqÞÞÞÈ!P,‰çùk×®;w.33“eY™Lfmmܾ}û&Mš4ä”;vl÷îÝäuLLLhh(Ž&…ŠÅܺuë?ÿùOqq±ÁöK—.íØ±£eË–S§Nõôôl˜‰·¶¶¦¯5 Ž&€æ@±Œ½{÷.Z´È8zBݸqcúô鉉‰È+€ç(°wïÞ;w ·°,èîîn°g||üÝ»w‘cÏ á©­ÜÜ\ƒèÉ»ï¾Û¯_?‰DÂ0ŒB¡øìÝw|uþ?ðÏìlß”M% HB„ X(ÒA@QtèPN‡Ã:0Å\9 IDAT$P®Ë¥K—’’’¤?þx³¹‰¡C‡nÙ²¥  €}Ê­\¹²ÙUÎ;÷—¿üeíڵͶ$Z·n]³kíØ±£k×®cÇŽe)¥Ë—/o¡K—ÿ÷ÿþŸ¯¯ï Aƒpœ€»C'²×åÂ… Òô!CœZÓÈÅÅÅÅÆÆÆÅÅiµÚ¶Éq\XXÇqz½žrðàAyöäÎ;ïœ7oÞŒ3T*•4sÓ¦MR§Ù Ž;vôèÑò™¥¥¥»víjágøûûO˜0ÁiÜåÏ>ûÌjµ²éüü|){ÂqÜÔ©Sß~ûí×^{MÞìè¿ÿý/k×àÖP¥Ýx{{_ÿFfΜ9nÜ8y3™ÒÒRiúÕW_0`›3fÌܹs!uuu555>>>M7úÆo BÈÃ?üâ‹/Ö×׳¯¶lÙ2~üøf+¡È›ýôÓOR› ‡Ãa6›YÛŸ´´4iùY³f3†M÷ë×ïùçŸ/++#„”””Ô××·Wp H ´–2X­Öyóæ) y6„1ÿüç? çê?³gÏ–Ò’|ðÁ$„PJÙÈ>Œ§§gLLÌÉ“'ÙǦ…¢T*—-[Ʋ'„ÿ7Þxcþüùìc]]]eee@@€ÓZ±±±R÷+„I“&íܹ³¤¤Dúw5ýC©©©#GŽd¹…B±~ýz©F Æ€N ”vc4åYe ‹ÅÒtI…BA)ušÉóüwÜÑta)!BUUU]]]CCCCCƒÙlÎÍÍmù'Ýu×]N¿*$$$222;;›mðâÅ‹M(“&MrJÇ³Š EEEAAA„°°0i}ûöíß¿ÿž{îéׯ_=‚‚‚ä¹w‡§Üv£V«·g•Êfk…BBBBšV?!„\©“K—.mܸñðáÃWû“ºvíê4‡ã¸¸¸8–@¹â1ñûÜÇq}ûö=uê”Ób111!!!EEEì#¥tïÞ½{÷îeøä“O:u¡à¦@¹.RëBÈùóç)¥RÒD£Ñ¼ûî»eee<Ï+•ÊC‡Iƒì8¥ZZvîܹ¿ÿýï×öóBCC›Îl—¾Z!ǽõÖ[ëׯ?xð`Óo?~üøñ^xaøðá8NÀÝ!r]ÂÃå鬬¬ÂÂByÃ6íp8¤ŠŸŸß•*§8EñÝwß•>r7f̘ððp½^o4ßxã »ÝÞÂêçÎsjD)=sæL{ýó5ÍÂ… üñ³gÏ?~üĉN¿gýúõ @'²àî@¹.ÁÁÁ:Ž …C)ݸqã+¯¼Ò49B)ýôÓO¥RV¥UÅÅÅ&“‰M{yy­_¿^>r¿~ý¤Nd›uæÌAäݸ:ùè9-¨ÜFþþþ#FŒ1b!¤ººzß¾}›6m’þ\FFÆm·Ý†CÜš»àz †)S¦HO:õá‡:uK)ýúë¯333¥9ýû÷oãöëêê¤é¨¨(y¾£¤¤$%%¥åÕ ¤NI˜­[·JëTª¦¤´]JJÊæÍ›¿ÿþûo¾ùFšÇÛÛûþûï¿çž{¤Å®Ô± €A ”ëuï½÷nݺUmç—_~9þü3Ï<Ó£GA2226mÚTXX(-ÇwÈþ´ÌÏÏçy–ƒ8yòdRRÒСC9ŽKIIù׿þÕrûæý÷ß¿téÒØ±cÇ?þ¸sçNé«Ûn»íš×PJ?ùä“‚‚ö±¤¤dΜ9*•ŠrñâÅcÇŽ±ùÇ¡Yè@¹^ƒáå—_–÷óZTT´|ùòæw·R9sæÌ¶oÜ×××`0ÔÔÔ°kÖ¬Y³fÍÕþÂo¿ýöÛo¿m:ÿᇾæ5Çq“&MúðÃÙÇýû÷'%%õèÑ£¦¦¦¬¬LZ,,,,$$ ¸;4ái±±±o½õV«ý‰¬]»Öh4ÊgŠ¢ØRxŠ¿üå/Í~Å󼼎S»¡V½ð m¯Ó¬1cÆÈ{¨¥”fffʳ'<Ï/Z´¨Ù›Ü nÛGDDÄ'Ÿ|rß}÷5û-ÏóO=õÔúõë¾’æ\i\ž¾}û¾ýöÛNÉŽèèèµk×Nœ8±1Š …RÙLe¢?üák×®ˆˆÏô÷÷ÿ׿þå4º°¼£Ù¦¿D¾qé[Žã/^ü׿þµi#žç}ôÑÏ?ÿ¼Ùq”Ü7a„žœ]¼ª›¦”Ê'(¥¢(RùGùòRWíÈf³¥¥¥±¤ƒR© ‹ŒŒ¼þ}[UUE)u8ƒÁ`0\i±ÌÌÌ%K–°é‰'þéO"„˜Í溺:»Ý®Óé|}}Ûý_][[k2™DQä8N«Õ¸Å±ÐF襩Õê~ýúõëׯݷìããsÍëêõz½^ãþÕžžž×Ü-€ëC€V ÒÙ´Ü+-\4áél¼¼¼T*•J¥²Z­jµ;àú!ÒÙ}õÕWØíMxZ @+@h(­@ H ´ €V¸PÅÇǧGÒǨ¨(___D:œÒE~ǽ÷Þ;zôhŽãÖ¬Y“ŸŸ6{ölŽãvìØ8@r•J\\œZ­&„üùÏ>~üøÀÙÇþýû#ËUšð>|˜MøøøŒ;ÖÇLJ}**ŠM×ÖÖ]iÉââb6A)--- ršÐQnlåž{îyàØ´Õj}饗(¥ò èQ£#""!ï¿ÿ~YYY``àœ9süüüþøÇ?æä䔕•%$$˜Íf n¾öoÂ"M‡††JÓFj˜c0ŒF#!$((hìØ±qqq^^^„ýû÷—••BÊÊÊöïßOñòòŠ‹‹;v¬T'à&kÏ( …â±ÇþøãÈÈÈ   èèhŸªªª>ú¨°°0$$dæÌ™~~~UUUÅÅÅ´X,„ùyŠMSJå”Rv:kö£|ùcǎံ¡¾¾^„ùë<Ï žç€ŽÒn ”»îºkúôéW»V~~þÛo¿M‰ŽŽž7o›YQQáççǦß{ï½ôôtù*H ÀÍWSSÓQÙ†çyÖõtˆvëåüùóµµµW»ÖñãÇÙDXX˜4SÊžBºvíŠ @DzX,›=!„‚Àjå@‡h·>Pª««?ûì³çž{NÞ‰ÃáHKK+**òôôìÑ£‡S‹žäää½{÷²é»îº‹M”——¢¸#î­²Ùl®ðÏ´Ùlè  ÃÎ3íÕ„‡¢Óé–/_®ÑhØÇâââ7± …b„ ò?·sçÎ;v°éÑ£G?^¡P¼ûî»………¡¡¡ .¤”þüóÏ»wï–ÿ—m“’’‚±–Ý‹^¯ïׯßõ\b÷[3úˆ;â8ÛJ=tîRß”Édr… Çql>>7€»&PÆ7yòd§™ Û¶mkº°V«]µj•¼™!Än·¿øâ‹m?3ºZEº¾0 ""G•ÉÉÉ9uêÔuÞW!î·TôwÄqÇÙPê¡s—ú+AÚ¡ÙfGÒ’*’8±X,åååmÙ‚»ÈÎÎf××!C†àúêv"""† BÉÈÈÈÎÎFÜ}ÄqGÜwDÑGÜoåRÐÅÚ®âŠ[îdUSRR! èÒ¥ Ž'wÔ¥K—H¡DÜ}ÄqGÜwD¥q¿eK=@ Ú!ÒlÔÝ»wova½^ï4!Äáp¸éîËÎÎ6›Í¾¾¾x;áÖ"""|}}ÍfsÛ_L!î·`ôwÄû g{@©‡Î]êÛKâÅê?ïÎúóî¬Ä‹ÕN_í½XýÌ/™Ïü’Ùô+p}í@Ù³gÏÊ•+7lØpôèQiæ!C›.üàƒJ5Pjjjþïÿþï“O>Y¹r%!Ä××7::ZZ2::ÚÏÏÏÅw_aa!¹r¶¨}QJ³³³¥Q Ž9räÈ‘VcAdu©¸ƒëDqGÜg{@©‡Î]êÛE­M˜{8_$¢HŇókm‚ì+ÇìÃù¥¥sç×Xˆ#€{Q^ÿ&DQ,.....>þ|¿~ýôz=!D­VÏš5ëóÏ?ÏÍÍe‹©TªÉ“'ßqÇÒŠIII»víbÓ'N=z4ÇqkÖ¬ÉËË 5k–B¡HLLüé§Ÿ\v÷±þ½›Ö©i™ÍfËÎÎv8Ý»w÷ôô¼Rº$##CooïBHbb↠8Žû׿þŠc·-ÇæÍ› !T*[:ÚYY@oPÜåÎ;·wï^‹Å¢V«{ôè1lذ+ LBB† zôèñú믷Ð>nhô¯'îYYYòÊz¬Ú]hh¨¯¯/"ÕYã.BFF¥´W¯^òbK)MOO·ÛíM/yyy555!!!íøþ ??ÿå—_V©Tï½÷ž‡‡â~sÎö&“©¸¸˜â}§›v„´p3о²³³_{íµÎw0¸H©gEÞáp„……5b–Rš––v¥oÁuJ}»Èªn(Äùñ!„m¿dfU7Ä4–¸t“¥L_ˆ ¦„lKÈʬ¶ÜèhÜZ Ihh¨F£‘Ÿ­,X““SXXèééátÁèÙ³çîÝ»EQ$„ôïß_¥RBž~úécÇŽ >>÷Þ{¯t?wîÜöíÛYÃÑ=zL:Õ©Upmmíÿþ÷¿sçÎ544Æ¡C‡:´Ãûéhú:‚½¬˜8qbþªƒB¼¼¼ž~úiiûùù=ýôÓÇ÷÷÷§”¶pkåááQSSóÓO?edd444tíÚõᇠ’/C)=pà@bbb}}=Çq½zõºï¾û¤µå`Åyß¾}C‡U©TÛ·o/..6l«/&¾}û’’’êëëõz}||üèÑ£oNë}w>Û{ò|ʈ#z÷î½dÉ»Ýþå—_Ê;¸)--ýùçŸ333 ðaÃFŒÁ¾5›Í[¶l¡”>ðÀ,õ)•Ä­[·RJyäVs­°°ðÇÌËË£”†„„Œ3&66¶_Ï\0îñññ;wîÌÊʲX,,Cm³Ù¤(‚ dffJ•ùÏœ9C‰•7†mhhؾ}ûÉ“'EQÔétcÆŒ:t¨ÓY¢-Ë8Ù»wonn.ÇqÓ§OgØ®y&wëò.užxâ §™ÒËó¦JJJvìØÁŽƒÁ0jÔ(y@Ûrõÿå—_²³³ÙÄÆ C¿~ýX:¥öAøùçŸÙºF£ñþûïïÛ·¯ë_Ù]?úÇÍ™3gáÂ…v»}óæÍÏ<ó !äÂ… ,m:cÆ §w%%%?üðCNN!ÄÇÇçÁìÝ»·Ó¡räÈ‘}ûöUUUB"##'Mš$ϱîÝ»733sÊ”)ééé UUU³gÏfmÝ·P»{©—<êŠ#?Ì;…A!nù Ëp7zôè}ûömݺU„^x!**JZ`Æ ©©©ÝºuûÓŸþ¤T*ßÿ}­V;~üxi°ÖŒåååû÷ïðÁ½¼¼ú÷ïß¿ÿÔÔÔ›<üØÍQVV–““#ßKòj½rÕÕÕ{öìñòòš4iÏó ?üðƒÝnwº KOO?~¼t¯–”””••/ZNKKÛ»w/Çq111gÏžýå—_Øü .\¸p…çyÖ´gÏž=ÒŠ………û÷ïᅤ΀ÓÓÓY_-ÒçÎûôÓOYp;j¯–——7û.â믿4hÐõtþz=ÇáÇ !÷ÝwÏóuuuì~ÈËËëž{î¹çž{ZÝBvvösÏ='ßÛGŽyå•W¤§b³ÙüÊ+¯°BÄ$$$Ì™3gèСm<$Èå>nåÕ JJJØÝØ‚ äÙ½ŒŒŒï¾ûîÿøGxx¸‹”)׌þ•MŸ>}Ó¦M¹¹¹•••þþþ„}ûö±žäåúÇ|ë­·X_Q¬â°°°Q£Fɯ;wîT©TÓ¦M#„üôÓO¬Æ¸t$;vlàÀ ,è”ï?]3îÝ»wW©Tv»½°°çóóó-‹ŸŸ_¯^½:ô믿² ¥ôüùó„JÊÏÏ_ºt©¼÷œÌÌÌ]»v-]ºTªVЖeœ|ÿý÷¬{ŽÉ“'³#Ê5Ï䦼'&&>üðÃò:žÕÕÕ§Njváf‹ÿöíÛW¬XÁ2k­^ýY†¥¢¢Bº³bgo)âp8^xá§pO:õ¡‡rå+»»DßÏÏoÚ´i_}õÕž={FþÞ{ïB¥·ŒÍƺ°°ðìÙ³ãÇüñÇÙIÀf³-\¸Ðd2ÉÏäû÷ï—®é”ÒÄÄĬ¬,ù­Zmm­[êNPê§yúi•„‹uVBHWÆœxbIí¨ ÆNò¯.Yì›KêðP à.Ú9½mÛ¶åË—oÙ²…½he]v9ÏÏÏ_µjÕo¼Ñ´Çy^¼ÓWqŒˆˆ`×?§^rsrrJKK•J¥Ó5«¶£ÕjÙžQ(R½•¸¸¸¥K—.Z´ˆ]þùgiß²h§öÕ쎙}5|øð_|‘u¯5iÒ¤%K–üõ¯e[þùçŸÙ%9..îÕW_?>ÛþþóŸK—.±+7»öûùù-^¼øí·ßž>}:»äïÛ·¯÷íæÍ››í!Oê°½CØl6‹ÅÂq\PPÐ{ï½7kÖ¬%K–,Y²dîܹo¾ùfÛ+XM:uåÊ•?þ8ûøñdzâF)}çwXödäÈ‘+V¬xþùçYÈÞÿý¼¼¼6ÒGfüøñsæÌ>|8+à‹…çù?ýéOï¼ó΂ ´Z-¥ô‹/¾pÞm]3ú-6l˜V«¡  €RSSóé§ŸB‚ƒƒ.\¸bÅ ÖQNyyùÿýßÿBôzý]wÝÅÒ(ò†!,á5jÔ(­Vk2™¾ûî;BH||üòåËW­Z5lØ0BÈñãÇ¥#¡“q͸{zzvëÖå(Ùœ³gÏBú÷ï?iÒ$BÈ™3gØÏ®¬¬¼téÏóR/WV«uÙ²e¬ÚÿÌ™3_{íµ &°k늲Ë\){2uêÔéÓ§³úŒ®y&ïå}äÈ‘aaav»ýĉòù°Ûí‘‘‘,g-ÉÎÎf±0 óçÏÿÇ?þÁJnaaáš5kXyoõêÏqÜ‚ æÌ™Ãn¥žyæ™E‹=ðÀN¿mðàÁË–-c§qvzwñ+»Eâĉ¬¦É† ¶nÝÊ2 óçÏ—W7ÎÏÏgûÙßßñâÅK–,ae×®]R÷Òº÷ßÿòåË-ZÄzú—·’.Ü<ÏOŸ>ýÙgŸ wëBÝ ®ò³úvY~W·åwu›å?-ÊŸM/¿«[/4ýH´ÿ£Ñ_ÍD÷±n¥ýû-c`FÞ¾×b±H_Io°‹ŠŠ¶oßÞ¥K—¨¨(__ßaÆ]¸páâÅ‹aaaì­²²’µfÃvªÜ•B1~üøœÉÆŒŒ´Ùl R£FÚ³g«´ÂÆ»­®®fcƳ3g}}½ÝnW*•óçÏg·×³fÍÒëõEEEul׌;ÇqƒÎÊÊ:yò$«[ΤãããCCCµZmmmmIIIXXX^^ž ^^^¬!äÈ‘#‹E¥RýûßÿfˆÞ½{|þùçIII>ú¨‡‡G[–‘~‰Z­þé§Ÿ¤ì‰TÝÀeÏä ¼ÆqãÆmذaË–-wÝu+쇃]èï|¸‡‡ÇìÙ³Ÿ{î9v+,¥Ô©Ù|xx¸ÑhròäIAY2‹EÇáplذ¡´´”õ­óÄO,Y²„Uˆ€›†½UÎÊÊr8ÕÕÕ<ÏGEE)•ÊÞ½{SJÏ;Gaÿ¿ýöÛÙ£ƒ–ÇbÍŽ„»ï¾[¥R9ŽÜÜܶ,#ý A6mÚÄZuÉžÙW8“ß v»}È!*•Š5×e3SSSkjjT*Õ Aƒäum6+Ñ>ú¨üÜ>zôhƒÁ@)e­>Ûxõ—j&6}WÏóoÞ<){"‚B¡W•ȳ¥"À ¥¼¡[·Ûím¬..¿§—?KtëÖõoÚù°§Ù)S¦|ðÁ?ýôÓøñã•J%«ÖËF9=}út«áy^ò¹}±Ë-¥ôÅ_lú­Íf£”jµÚI“&mÙ²%;;ûïÿ;!$**êî»ï>|x'Ч}yyy½üòˬ Ïó=ôÉdJLL¿™BCC C}}}iié¥K—Xà ///Žã† rúôé_ýuܸqÉÉÉ„©CYr¹ªæñãÇg̘q¥òÞ–e¤+NRR!D«Õ²¤­gòz¤Õjï¸ãŽìÚµ+**JêælܸqJ¥R^ÀÙ]Ïó,ñÛšRÉj‰æååÅÇÇßè«?އö2mÚ4vS÷ç?ÿÙ©Ûé}Æ|ðÁ4{È$''oݺµ¨¨Hj³CšÔ[$„8 bÇúç‰Bo•‚RÚ B~Ènìèx•åÙ„L6]f![²*!Õ6; À¸J]nÖ¤ŸréÒ¥íÛ·KŸ <¸s`РAZ­¶¦¦æÜ¹s¢(²j½÷ßr(¥Í>_Ý8ì&ÀÃÃý©S§þå/‘ò_™™™›6mš5kV~~>J—©Ö°aÜrì=kŒÓò½x«¥é-5»kZã·UM—ïÓ§ÏÊ•+ãââØÇâââmÛ¶-X° é¨ÛÐvÕÕÕ,²¬pUTTÌ›7/!!¡¬¬Œ•n½^ßì9“çùÜÜÜêêjÖ~‡çy©wgŽãV¬X1cÆ 6L¥ôôéÓëÖ­[¸p!«œ7Z­fÍî²²²RRRØiŸ5¤êÕ«ÏóYYY/^¬ªªR*•òJþÍ6¶â8Ž=;±tj[–qb±XšŽ˜Ž3ù Å:Ë?vìXmmmYYYjjªT¤Ù^)ÓÍj%Ü„«?އö*û¬$¶½ÕŒÔÉ»IøüóÏß|óÍôôt–=‘Šv³wƒ¢ëxõöÐFG}4:jvlàìØ@6ýÑè¨>ZizvlàœË_-¹=; À(]äw>|x„ Ç}üñÇEEEçÏŸ_¸p¡T?¹Ójµ#GŽüßÿþ— ÑhXµ^ùKÈö óï×YÅΖ±;3žç×®]ëÔ|ÀÉí·ß~ûí·Ûl¶üüüÇïܹS„õëׯ\¹²£Þu¯[·îÈ‘#Í~uçwvTÓYN×¥K—¼¼¼+%2®sw±‡ðS§Nýñ”ß”³†Ð~~~ò{¸k8$˜nݺ½ôÒK‚ Ÿ={vóæÍv»ýÓO?8p`Óföˆ~[|óÍ7‚ ¨T*Ö»ÁáÇYŸ Ï?ÿ<«OÄóüŽ;œZxùùù…‡‡gee±ŽoAèÝ»7ëE:œ&Nœ8qâÄÚÚÚÜÜÜ;wž>}º¼¼|ûöíøÃ:ß¹ÔeãÎqÜm·ÝvìØ±_~ù¥²²’Õb_ùúú²qLÙ°Jòq©YÊuÒ¤I=öØ•™Z]Fþ3æÍ›·oß¾äää/¿ü²{÷îNcZ»à™¼Ó”÷ˆˆˆàààâââ_ý•%A¢££ªøI!77Wªi°žDoæ0änq<¸ËÙ¾ivCz¡²xñb§XK, {91xðà3føøøðú¨S‚@ʰA:ê9ŠÝ'íÙ³Çéîg×®]ìiêzzwcÅ•——_¼xQ~߯ª‹«ÕjvÃtU‡„Ó-à… Nž;;Ûd2yzzJ=|³V<”ÒcÇŽ±Ç$)õÉq+ÑIIIN-qŽ?~ìØ1›ÍÖ–eäÇ^¿~ýæÏŸÏj7¼ùæ›RMO—=“»{Üå¥uÊ”)„O>ù„ Õl=SNÌ µü‘;''‡±Ù0ÆWëjOÎnt<¸Eô›%ÅÚ©þf]]ÝÑ£GÏœ9C)-++cÃÞ=ýôÓþþþìòQ\\,ÃÐ9‚xKÅ@igµµµòŠ…999Ò›¼gP§®ÝÚ!À !ä‹/¾ÈÈÈ`;yýúõì]–Óµ–=Ë544°û6OOÏB>øàƒ£G²™çÎ{ùå—×®]{øðaBHAAÁ[o½µjÕª;v°jkkYuOOÏì# à‘Gi:ÿ‘GéØÞ:Xwq6›mÙ²eìðáÛo¿=pà!dРA-t€Òªèèh///JéÒ¥KÙó¶ÍfûøãÙù<À"ÒÆC¢)«ÕºjÕªÕ«WÿûßÿfŒ ìÁã¸fïf}'ÅÅÅåååeeeååå§OŸ~å•WX½•JÅnm9Žc=A:tˆe“m6ÛÆýõצ[‹×jµééé©©©*•Jª×ÀnÊW¯^½téRÖ5)!$??Ÿ=ƒ]U?8nÄ•ã åFo¿ývya‘GM>MaãÜ×ÔÔ¬ZµŠ5î3›Íëׯ÷Ýwß{ï=VÛ²Œ”U±Ùl†uˆàp8V¬XÁ­]öLîîq—cÍuÙ´——W³uI8Žc/T’““?ÿüs–gOKK[¾|9[ËiÌã–IõYöíÛwU97:Ü%ú-Äú×_ݼy3 VIIÉßþö·µk×~öÙg”R6ÂýîÝ»YÓÒÒ–-[ÖÉ‚Ø)ã¾#·jÓù²MçËöÖì+¬aӛΗå×Û¥é}…5{/µ#×DÀ}(± :»ª±wSì)·Ùj½-ܵ<Ÿã¸‡zèÿø‡Ãáxýõ×[¸÷ìÙ3+++--í™gž [¹r¥B¡xòÉ'Ïœ9c±XÖ®]ËqœB¡`ízT*{™&uTùßÿþ÷«¯¾òóó“Fªž6mZÇV8qâñãÇÓÒÒ¤9½zõbÈv £ÑøØc}þùç999sæÌ‘ååå% }¥C…4Wø·Â¬TΛ7ïŸÿü§ÃápºÇêÝ»7룇D³´Zíĉ·mÛ–œœÌ^ˆIá?~¼‹´ßqåè ‚Ðì½o@@ÀßÿþwiÆÅÅ}÷Ýwuuu‹/nyƒz½~àÀ,ûvÇwÈ»5jÔÖ­[ívûo¼¡Õj•J%kB¯T*Û7EëR\3îäòÐÔ;wî$¿ï&–ÒµkWÖŬJ¥ “2uêÔï¿ÿ>55uöìÙz½^ª=ôÐC±¦-Ë8 ?þš5kÊËËß{ï½ùóç»ò™Ü­ãîtþdÍu !“'O–’hN—òáÇïÝ»7==}×®]¬f¢dÁ‚,ÃÞ–«?!D§Óùøøÿý÷ßÿ=kçu¥nSäëº×ñàÊÑo¹¢‡ëíÛ·oß¾]^xgÍš¥P(t:]DDDjj*‹àUýw/Ôî^êÃ=5‘F-!Äd!½}¯Î^*^š®± Üå¯x:wp' ì‚ÈZ)•DÖ+!$&&¦GJ¥rêÔ©ÒLö¢ØÛÛ›}duw¥NU*•Ô(Ã鞉Èz¸ˆ‰‰™;w®¼^ÃäÉ“Ÿxâ òûž)§M›vÛm·±i饥Ñh\·n«‡"õW7tèÐwß}—Ý—s·téÒqãÆ±Øå944ôµ×^ëÛ·o‡ïg§;¯¸ù&L˜0gΧš&Æ [³fM ƒì°¾-|}}å/ŽXròc OŸ>o¾ùfHHˆ|™éÓ§ÿío“VlË!ÁÞ–«Õj§ŸñðÃ?õÔSìw²pëõúgŸ}vúôé®VÊ\*úWêù/22rÞ¼yï¾û®|è±ÈÈÈ—^zIÞŽoäÈ‘¬©TÓj>ÒÓ¸4Î¥”[½z5k2f±XXö$>>~õêÕ-wiäî\³Ô³ÏÎÛNcͪT*vŽoÚ@㡇š7o+qìáÊÇÇç¹çž»ÿþûÛ¾ Û¬Ô-%!dðàÁl ž_ýõܹs.~&wÓ¸³ˆÈ¯³cÇŽõòòòòò2dˆ4“]â¥ì'‹…Ó·‘‘‘o¿ýv¯^½®êêÏqÜâÅ‹¥öb¬ ƒ§§§J¥’ M×u»ãÁeK=ëÁJ_§ëÂÒ¥Kxàö‘Þ¨¨¨eË–±Xs÷ÒK/Ic,°ÛÂW_}uàÀòè³CÈ)  P»oÜ !}üôƒƒ<yF{k£½µlzp§Q­¦£ŒÚ(cãW}|14€;ilE/p]ÿËßÀ³iJ©|‚õ«Geäå˳Ö×cóæÍ”Ò|ÐÅw ¬ÁˆÁ`húT,_Œ £ëô°g6›ÙÈžžžÍ¶Ô¡¶¶–5µu©_~ùåŽ;!'Nlv˜Où±ôÃ?p×–´×wÖ «B¡0›ÍAAAí^}£¦¦†µj!dm9$ZØ>;Tä}^ºšvþM.ï555J¥R©T¶ ]»vmÚ´ÉËËkݺuÍÚf³±^„¯-ÐîÈÝãÞìאַ®¦”¶PâÚ²L[ÎK®y&wë³ýõ\µÙµø:O³ìÊ®R©®öŸàFǃ[—z»ÝÎrܦÙ1×DQÁÓÓ³ÑuJ}˪ªªZøötyݨ_²öމê` „ü/§ŠroDã;’g2?ݘCß™[Å2>܇rª¬ntBÖîÑ=n¼Š»Aù«¸™Ð„çºèt:³Ù\__ïRíšây¾-çÙ¦©F¯×7{Q—¯èš¯µyäÖyD«¯&ØCf³¯‰nDÜY'¬7îÎn¸[¸[jã!Ñòö]\»Gÿ&—÷–w²ÍfËÉÉùꫯ!&L¸R4jµúÉ›tš¸7Åq\«'ض,Ó–ó’ûVPrÙ³ý ½j·qS×Ö»–n]êU*U˱nã±Úù uG•ú늦BAùµ´®¼ÁAI©0BÔ|càK!!¿q0ò³—Ì„¥BAÉ®¶BÔhȀʭÀ×××l6———»xåÖ=¾/wÉÞj§ååå, ˆ;¢ïúq·X,Ï=÷‹A¥R?á¾â8ÛJ=ÜèR=b|u÷úê§”ünnÆ%irïÁÜf¿šä«õÓ#¦îqòÁ.¸¡¡¡yyyl|PpAwÞyg[ËËËcEÜ}·ˆ;{«Ü³gÏY³fµãÀçˆ;Ê;âŽè#úˆû­\ꯇ‚ã¾]Xg¯Üå3cì¡F4Ü(×%222%%¥²²2''WY÷•““SYY©×ë###wDßõã®Õj?úè#ÄîV‹;àl(õp£Kýõ E6 SÃ(<׫_¿~„S§N•––bo¸£ÒÒÒS§NI¡DÜ}ÄqGÜwD¥q¿eK=@ xùŠ`dx†þ¾â½B=º™3g^ÿßòññ±Z­•••/^ÔjµèÛ½äää°Á˜¢££cccwDqGÜwÄÑGô÷[¹Ô·€JÙá8ŽCë]€Ž‚J; aWÙ’’’ÒÒRJ©J¥º†!á¦õõõ………ÉÉÉ999ìÊ:pà@ÄÑGÜwÄqGô}Ä¥þJl6½šþMnÔóÏk4„ Cp&Lp¯Šü´Å¦)¥ò J©(ŠTFþQ¾âޏÎö€R»Ô7e±X:üŸ¦ÓéP £ Òβ³³ +++\!E Íô§Óé|}}CCCÛ벊¸ßšÑGÜwÄg{@©‡Î]êÔÔÔ‚ÐÿFžç½¼¼k€;Ï Ð*Aêëë;*‡Âó¼Á`àyè(Æ u¬ˆÅb±ÙlìíMø£Ç) µZ–; €¶ÒjµÈeÜšØ-C H ´ €V Ð $PZ @+@h(­@ H ´ €V(± :ÉdÊÍÍ5™LÒ£Ñn4¥9v»Ýl6×ÖÖšL&³Ùl·Û !jµÚ`0øúúzxxhµZ…B!B}}ý¥K—jjj¬V+!D£Ñxyyùûû{xxð<ÏqœÓ_EñÖb¿™"ýNAìv{MMMYY™ÃáðöööôôôôôÔh41tH t¤ÜÜÜ7ž>}Zšÿä“OÆÇÇKsÌfóÅ‹ÓÒÒNŸ>——WSSC1=zô8p`Ïž=»té¢Ñhrss“’’RSSËÊÊ!111Æ ëÑ£‡N§S*c-Â5¬Å~3!Dúv»Ýd2¥¦¦&&&ÖÕÕÅÆÆÆÄÄôêÕ è4@qRÍŽ)S¦Èç×××çäädff^ºtÉl6Ûl6Q+** Ïóv»]§Óyxx°$KFFFAA«¥RPP R©ºté¢R©ºvíêåååô®a-“ÉÄ2>S¦Lq8‹¥¬¬,+++55µ¨¨H¡P8D:$P:Rxxø“O>É2&§OŸf5;œÔÕÕ¥§§WVVöë×/ À`0444äç矷Ýv[155•Õj0`@Ó-×ÖÖ^ÃZŒÍf«¬¬ÌËËKOOOOO¯¯¯7111}ûöíÒ¥‹‡‡¥”R*Š"¢ í…»ìæÿi$P\]``àèÑ£‡Ñh4 *•Šìáá¡T* ECCCQQQ]]]dddß¾}ýýý !}ûöµX,çÎ+**²X,M·|mk1uuuYYY555§NEqРA={ö ÷÷÷×jµRöÄáp ‡í…çy•J… 4Ã`0DDD°i6nŽÙl.//7›Íþþþ:®®®®ªªÊn·ûûû‡„„ BHHHˆ¿¿CCƒ 6›­é–ívû5¬ÅTWW§¤¤øûûWTT„††öîÝ;66ÖÓÓS­V“Ëãò8J)"xµ(¥‚ °óB‡œàÖ9ÒX~S¡PàHœÍÀ}3¦ßFÎfír*“>âlÖê¬B¡ „°Ê7y_!âNظ9ùùù ¥¥¥111¾¾¾ÕÕÕV«UµZ­Óéxž'„èt:µZm·ÛYÚ¥Ù­]ÃZLeeåÑ£GYÕ•¸¸¸ÐÐPOOOiȇÃQWWçp84MÓq| Õ(KCJcïÁ ½dIRFÊ?ÎfàŽ·Ñ‚ ˆ¢Èq\G½œÍ®ÿl&½{fC…àlv%¢(²ÁO(¥jµZ­VßäûXœÜéÄ]QQ‘ŸŸŸššZRR¢R©¢££cbbZîçõQ(Z­V£Ñˆ¢h±Xjkkëëë «"Š"-H«ÕâÁìN ò³'vÜ ë´ôÎGàlî{*cGšts‚# p6wÄqK³º'<ϳЙ_An~‹$P܃Õj½téÒÙ³gY«™^½zÅÆÆ†……±Ê#Æn·Ûl¶††VÞl6›J¥ºRZîÚÖb‚‚‚Æçí휜\VVÆÞfGFF²ŠTòU*•F£Aø®Š4´F£a]Þ܈ B¡`×iµZ# p67}¬çy‡ÃÁÎf¨8›;b·dìÿ<Ï+•J¤ê®„çyöìÙQ•tp™qu6›­¶¶¶¸¸8333--­¼¼\«ÕFGGÇÆÆ†††²ê'*•ÊÇǧ¦¦æÒ¥KEEE!!!„¢¢¢K—.ét:///–×prmk1ÞÞÞýúõóõõ-)))//¿pá{$ëÞ½;À˜Ð<Ï£ð_Ãí ÛiØ{pã°zfl(Ž4ÀÙ Ü”t÷ÌêÓáHœÍÀ­3vZc Ô@iá&–åP:ê âêØ`ÃÉÉÉGµZ­}úô‰‰‰‰‰‰ fݾBt:]HHˆ(ŠÙÙÙZ­–%>Ξ=›““c0BBB´ZmÓ-_ÛZŒZ­ö÷÷ïÓ§J¥JII9qâDqq±ÕjµX,½zõòðð@à 3éø Ïó¡¡¡]»v5 ååå¹¹¹UUU·ÈÞ7™L¹¹¹&“‰rúôii‚}k4ÃÃÃM&ÓéÓ§i³Ù>œ””d2™ E]]Ý´Z-Ûiýúõ›1cFddä€4Í¡C‡Îœ9sâÄ BˆJ¥ ïÛ·oß¾}FcNNÎÆ !O>ùd||Ü„ ~ûp³z²Õh4K–,ñóósšo·ÛwïÞm³Ù®´®¼Ã6Íã$²9Ù`cÍ~”/ìØ±ŽÝûò&:ÞCÅñmiün €[—H‰]¤6‡h¶Q›ƒJõAJE‘c½Šˆ—+}ÐßÕ¡”ñrÅ‘áröÄ!Rûå܇¬µ‹Ä!PA¤JJD‘ ±‰¢Cä‘:~ÛBcêÄ.°Ì DŽÍd šÆt %¢H픊âošp\ãP)l‚kDxŽSpD© Žã,“Ò˜ò`?‰RÂÑ6í1ŽG´*…·ž·‰Ä¨ãõ ”[(·.»Hë­by_e«ªwXÄÆ²µ:‘²‡Ð˜!‘Š"uP"²‡ Š”£”^ΧQ6Ͳaù 6AˆT„#„á(GqnÃÂ…‚ O4|cÞƒ#„ã8!´1KB8Ž(8ÂqÏÅåt‰BÁ).'Jc¿ÈêŸâoà»ú(ýôʶt€ÂVå9N­$F-/ˆÄW¯ðÐp*$PnH t¤úúúòòòúúziŽÁ`0 NKZ­Öºº:³ÙlµZ !F¯×{xxh4š«Z¦©«]‹ýfBˆüwRJL&“ÍfS*•Ç ‚ V«b¸ÉûõhìËã·™¿¯Óñ»Æ&õ8ŽÓ(9ƒF¡áoÆ3¹C 5¡¨ÚžVb-ª±[j¨H›ÛØ+Œpâo-q¨ 6Öa]±²¯¡RD^„Ê*€ð§T…‚c)Ž#ŠËߊUÊqDA8– Q("áxŽã8¢PÈ’#ÇÉ>Jß²UxÙ|©¦É•øè•^Z…NEm®‚Âq„Wpj%§Sq•BÓ¶á{ ¸vååå{÷îÍËË“ætïÞ}ĈN JimmmzzúÅ‹Yò"00°k×®ÑÑÑjµšÚ²Lsgö«^‹ýfBˆô;)¥¢(VTTœ>^¾ŒÕj­®®ÎÍÍMII)((°X,„¶$Ïó¢(z{{BZ]¦i’¶l¹éZ&“)99™ÏR'µµµ%%%ÙÙÙiii¬Š‚ ›Åø]sÖ[GcW\“ñbdõA~†PJmv{}ƒƒR¢5[yžŠlIyW ²iéï:DjXÞ„uüA_ë-ÕA‚q°nAûõ "%GT<á§ñRùÞ” ‘йÜ8…ãèå: ž# ®±ÈåÎDˆBÁ)„'¹Æ\ U4æVX –Ci¬lÒ $Pnaz½><<œ5uÉÍÍ=wîœZ­6›Íòeª««Ï;—’’röìY«ÕÚ½{wBH^^^II‰Õj­¯¯%„´ºL`` Ó_oË–›®e6›sssÙ„(ŠV«5???11177—㸮]»FEE………‰"ñ€L \îÄT䤆] v%5‡n¹<Ú ±‰T{0e‰‡@µØ «C¤ ^IƒM ¶Ë‹ ›jìD Ë€HCäJ½«ÊZèH&¨Ô™‡SJQñÏqBéÍÙWJñÒ*ºx©ÂýƒZ!µx‘ê€(~ûØX§ƒû­¶ÈocÜ\n°ÓØ~u@ hOƒ!<<Üh4Bl6«b³ÙäËÔÖÖ¦¦¦fff ‚àïïA©¯¯7™LJ¥²[·n„V—iš iË–›®e³ÙL&“(Šuuu.\ÈÏÏ·X,ݺu‹ˆˆ óóó«®®F|þ?{÷ÒÇuÞ ü9çt÷ÜÁ”@€ÁHB"Í(qìJòÒò¥ìTRY¤*‹¸\Z$»,²É"Ÿ ùq*®Ê"Ël¢T*–#Å‘m:¡,‰¤x ’ ¸ .sé>·wqº{zCB"9ÿ¿¤äá »1@3<çy^éck•G<¨%¹Çµ‰{…èÌ–Éfd2õ ÖZmYÜF„ÚÝC,Å¥"”41ñs’Éb—•È$@Ñ–)c­!eãŽq›“Ô†’†Üø˜HéH*e,1£,SÚª¸`„”±ÆZeâaºnŒµV["²i+÷_wCã¼ÝÎC0Æy»—GÜ.ÄZiÏ)@áœ/çø@AhcñÔ@€Ò»Š”’ˆjµZ±XÜ¾ÍÆÆÆ7VVVÞzë­'N¸:‘ÑÑÑ+W®\¸páÆßüæ7­µ]·ÙÝ‘õÈ•R›››7oÞüéOº°°0<<|êÔ©“'O^Q @„ïû®ü„ˆªÕêŽckZ­ÖÂÂB³Ù;yò¤ëÌZ*•666>øà­u«Õ²ÖvÝfwG~Ô#_[[»téÒÂÂÂýû÷…333GtGvíQ¤”œsœè§"¥tUH¾ï·ÇÙ|•/g­{¦¹ôVgàj/#cŒÖZk­”r¼Á â# KDÉÌ—´!H\BÆÆ5iíF»¯GzgÒÚÃ-Naéd™¤ì#-I?W|(7Æ%®æh¯ 1ÒqŠWÐh(ÊÆq‰Ô¤\æßC:Þ×uf¥´`Ä%ÝCŒqËg¬¶ÖÚv·Q—M¸¬Ä‹k@:{ræ¾°øbÌrÆ8#ËÈ0Fgç‚›ìl—$(‰“d’n<Æ›p÷Ù“ ºâÌ‚=k´ê¬MV"i¤ÔR*©µÖúüIQФdR’”6bÝ¿ÆZ¥­Š”QJkcIE‘dQ´›ž5Zk)¥Öš1æ^˜á=Ô£Ï”Š¢È#„x!J¯ÓZ×ëu)e©Têïï÷}ŸˆúûûK¥R†îE=É6»;òŽ|xjjjzzzfff||¼\.§oÏ\zÒh4¢çsÕß[o9šÍ¦{]èN À³ÈP”R.$ÕZ{~®fðR^ʲŠ”òE½žîñEÛ¸.C&“•&Úº "N"¤&e¬²®µs…!2þ'iCÆ0e­Ò6Ô¤´Û’ŒµÊ0T—¸{’¡¶¤l\’¬©I—êØv­…u¡†uÑFöwüOò¦•2­B‘ÏÉçĘ­dïgŒˆqê˜n›ˆáŒXg ˆ[5ÓfæïÆ]>Œ±JiÆÈó„–‘Í–®¤ÍAÚ5-n7KŒˆi²Œ™äk1OVPÂYNͦª×õÆsy#ÝT¶Þ4ͦ CE¯b€rÞlªF 67OPøc,ic Ý eÚ–à͆¨oJ_ï¦hȽuJÏó <æÝq«ÕbŒ …òê/š{1F)å^}ær9÷Ê —Ëù¾ïâa÷Ç–'ÙfwGÞQE+++àœ—Ëår¹Œ÷`;¤i+›6µI•ël B:™êbì–9/í".É 1iÃŒvIˆ5DÙ8CÅÃtãZCÊ’6,¦k¬²îm!)뚃0åj: kµ¥¸‡ˆIk­²ÌR™{Œ‰¿ ׄˆÒV Ô^ä/øæŒ<"ÎÈuI‡¼0F"‹kÓu1œqG!,s§«õ`"ikšÉJgV$ #– Ù}Ú7lVJND¾ÏÒ¼âðŽ·×¥u\®NÕ…ZkW¶$„pI÷“l³»#隷¯ozzzppðúõëQŽŽ–J%· ‰1Æ9÷}¿X,n„ —®{*•Jø›-<“×ñÉ÷Sÿ¢ò{ÀÕ àKÚ²„'—Ëõæßr\º|Ѥ3M=´±R3i¬ÒF¦ AÜÈm¥6ný‹2V–Ì‹1‘&¥Òíö"RY¥mœƒX«]œáú€›.ÕÑí¾í—ƒD”4ï`I †+Ò ¤(„¹ ·1×C„ n£ ~Q®#‰HÚA‹GÛg$x»]'ÚÞ$½‘ΦIÊ:ÒºË3_Û¶Kº}: Æá»ãêˆÈ÷ýç pF`…‚_*å+•çñ¬ÒH® Rår2xtú–ˉBÁ/½rÙ+Ý«?Üž¢R…\«eM>/ E¯T*ů` ïû¨@y¥”çyXÂ>CžW,[­V½^___w=SÖ××Fù|Þ½Vx’mvwäG(333Õjõ7¿ùÍòòò¥K—c‡r¯’Óþ»Àã#3×™"¼å€g—¡0ÆÜïi<ÓW3xÙι»š=>@iWpd @’;™éC:¹ml¶ÍG<&Óqgg7¤“ˆ+ÑÉ”×5j(䒑̤˜8qÍVUÒiU[“Ü•ñÈÄ0w§ eÒêc¬´.=¡xåË#j@Ü"Ï ‚!,™H›ô=Œ1×\•¥M=:º‡¸ôÄõí0…qFœ[/NRX»¯jRcòr=ÙˆÈý‰ñù(B0Ïó‚À‚çqýTÌøRû>ó…âUìZåyžï{¾ïû¾Ýϲ±–këŒ{JÍ=Ï÷üÀždß”ô…”.?œ»…/ì©‚sÐã|ßX]]]ZZšŸŸwóóóKKKù|~`` km×mvwäG=ªjµzúôéñññ|>óæÍ?üðöíÛ?øÁfffúûûqÖ §¸LDê¤Ù‡Ii+Uzg\âÆßº`¢½ÂES¤ã#éêþi¤¢ä€dLÜ5mk­5IcI[ë*A(ið‘‰,âS¦P¢3°Ž·µŒˆçD9A9áÖ¾¸ƒ°´7Gºž% JDœkÄ£a()ÊØÚ¿#~X÷S{pŒ[˜ã>‹Û¤ýøYú%%aMº~‡2Û¼Œ ¼HõzýáÇõzˆfggÓ—/_&¢R©422âF3ÆîÞ½kŒY[[#¢ëׯÏÍÍ Ÿß¿ÿ±cÇ\Pº¼¼L<ó%S₸v! ñ.†t<׺y·‘nwý0–¤a*sO²±ë¨jµŽwWvk ˆÔFi#µÕ†iËŒuz­±qÚÒYbÓq0™ùµ®úƒ‰LS7Õ%©ãH—ÃØ´åG’}¸.!L0Îã!2q wóex£0ƘMŽìvqCré«ès€,Ê+ X,NNNºV#Q:uÊÝéî-‹ù|þõ×_÷}hh(]ïãV÷LLL çóy"êºû\îøî³?á‘·ùÿïÿ¹isøðáR©444Ôh4úûû[­Ò€= %iqC.7ôzË4¥ÑÆ-x!•Œ’QÆJW¢]gS+ ÓÆc]ýˆÒ6ŠgÄìÜ$›tbÄ8⊠K™­™ëŒÊ˜5nÙàp7ÝŤuí¤ Äe%Ë[XÜ4¤Ýs$®Géœ ³½<$S’T°¤_FÜ=${{”o2âÆ~5é @y5¸jŽG­”©V«¥RÉó¼r¹œËå666VWW‰h`` R©‹Åt®A×m²•#ñ¹²#oTgΜq7Ü=A æóùR©´±±EÑskQðÒIG·$>’¶ qAëþ’íÒî Ò5†¹Šc;úŒ$ëS¨˜ûÊ^9ŸT=<]€bîÕäÝÕh©®ë¡1Ö5aûƒ¨ötÞ¸ëªëbLRâRMÊXk­éìâ @citÒ-ãÙ> 6I@Òx‚ #έ%²‚1Ïc‚sÎyZâ1"ÎQÚ:$³-=y!P7€ž:@I×Ôláû~v!\eJ¥Rq™…çy[BŠÇo³=@yò#oÌÛ“ËåFFFªÕª+†!Î/ÀŠû*c•aÒÍyÑFÆ£^H'½?ââ·V%é¢âœ"^¢¢´ UÒÄØxêmÒ%Äk‰ åÞ>V>²/Wð­÷” J=ÒwVäåá²Ùl Dí~ñý< C"í’Úžk놿dû€¸¦ƒc¶ÎpÙ©uÔ€˜$yÒŒ1OÎyv¯-“e2³i⃡ ¼4|ßïÚ¨5~EÂ9çÜ÷ýÇ,yü6ú\Orä'9Ž bÜíV«¥µÆù€^N1²#]:«<˜é¬1™v™æ£í& ÚZc™Í ‘1íJ A’Ù1I7×øC×ÕhCÊ(–âÑ0iOï%Õn^LšÂ¸~"q=ˆk¡ÚÐëÙÎÖC­MÜ õi¿QICV+‡¿0+’$"“ti·GŒ1Ng>'ÁÝÚ™vïKÏ‚±–Yk1ÆpƘœó§ËCPP ÄÃ_Ò¹¶Éð©]úЮIóˆ¤T$n_ê֪ĆrAâA¹îNm¬ÔwqmUÆhÃÜb–8‰o[k³SSâžé»üL‡KÄ™%KÖµq›0âœYÎÉãíê' –DÞÛeLQøª*3Pàui;漸ÿd‚ðöGÛmDÜ’t$i÷Á,xé @€“b¤Ý:LG ³d¶t´…$÷l)ôÐÖZ7&© é¬!Ê ˆÑ6™ó¢ÉÉ´« %µ¤Úm>Ú‹n2m>ÒB’t¦ ¹‘1iæbܪœt µÆÄó`ÚQ¥ƒlã¾®!ˆ—Ó.ôà$\n)3Fd»d«?8cDT-ˆ¼Ï³»Q|Î*y6T†¨©†:FÀ$saŒ±Ú°ìªœLõGZâ¾úö–'Âxœ\è Òõ'ɘ7†»»“¹0n>nREBI,’Ö‰ÄY ç6Ó+$¹Ÿ3zf Móý> À.Ó“8•Pšâ¡-6n>i+5¥D^¸ÛA\ŇTñîJ§´‘ÔP*m™‰x…$¡‰±ÖšŽ8®„’ñ.餕´HZO‘þ¯Mow¶aD9A9ÑîOšéÁ·äè¨þxÄD˜-3\Ò‡Ñ1&3—×2ˉl&”é,ioϳó_XÇr@€;®ˆ#m)JqA‡{§í1æ Æ3ÅRÛÍЄʺ’Š­£d25 &ÓCdËÔ“쥓±¸J[eÈ+­ÕqO&MZÓAÊÆÕ"IUˆ5†¹^!R›´µªj¯Á1‘ÔZ»BÒÉ"WbãN ”]´BDÙ& n\KRñÁ’† L0"FÂqãiy%­@x»èƒ%“_’Æe îs‰Ìýì-sAyx|€71‡¿$Ó^ˆÈã¬àóJŽ^ûýõfhn-G‹›º%MèÚ|RÚfš†P²ªÅ(Mn(LÚñ´ÝĸE:ñ\ÞÌÈ^×n•1WŒ‘,uÙ±d§$ÀmÏ=NÜ#æ»á²®(# /Úe ñjÏ…#¿M·¡öÀ—öhw#Iê?’-]sV"â,~Ô15†uÔŒ¤Ù &Â@Ï(Œ±}ûö /..Þ½{wyyç^p„‘i¢·”oų]’ö:í’)ý0™âޏHf—´ $- ¡´ÕYO¡x†‹‰§çrÆòß_ñŽ 'ÒGÛˆÌyk9ÚŒt(IÛxíŒ+!I#O„±é’™L HÜÄTI—“d–¢Ä]9D¶ÑiÇP.Ta6Óã#žã&Â0Ë­±œ3ßBð¤T„<žÄ(Œ1f“#·‡È|E­@…ÀK  þùŸÿù±cDzw^½zõ_þå_VVVp&à…(6náá" WÁ)#ã6”,i±I§’™¶2©òˆ§ÞjOÆÕnê-ÅÃq“ ´NÚš«m<Fg–ظ¹09ŸW‹â×óƒ>PÌ(ÒÜ[•×ÃÍH+m·}5í»[¹× IDATQ+'ÆY¶%‡«á÷içœu,oaí> qÁ:»tÖ€dÊC2e Æ­¬eøBpžva,Û7$éýáz”d;ƒ¼šÊñãÇÿâ/þ"ŸÏo¹zzúoÿöoÿéŸþé³Ï>ÃÉxu#Œ´R#®òHFÃÄe¬cøKfL:AÆÕƒ¸Bm­1,ÛòÃf–¨dÇʤã`â¤#má¡m¤ÖVYfÚ_HÆÄ›ëÆè¶;ƒ¤9‹2$ÛKf:gèÒÖR2†Èf{ˆ¦e …@0ÆÒ(ÓQLÁâù»Ö5NåÉ,˜ÌŠ˜tæ çírJk@8g‚âí9Ok@¶¦'_’Ö$9#"ßgB<éñP7¯t€R*•~ô£mOOœ|>ÿ£ýèïÿþï×××q>^ÑŦá…Ué Z©1¤t¼¶E¶×ª$i…¦ŽúmBe“¢« K6³IWTr+YâD#Ž$:Zhë*)âhÃÕqXÖ9&u¤ÌºjÁHb‚l\‘„™¶©ñª¶GÛ^-ˆ##¹r®#UÈl¬êGÚ4"#Mæ±l«ÉÖz¤•#[&ˤ_`Rb‚€ üéŸþi__ßã–?û³?û‡øœ€›b¤ufK•‘±,mbÒr¤*Äl›ó¢­MwÙR?’nFÉ^ÚÚ$a*î b•6®¯ªvÅniL2Uרø¶4Vk¦UI ã¢WâJHLÚÄXeÜ]R&n B´uúl@ðLu†ˆK6Ú}@â±/ÌŠ$ƒH*A¸`$8cŒ‹´„³lHZ*"Ò2$=qŸ(çó¾( ßëP<Î*y>Pôr¾Ùi Ï—…€ œ GÒ“H[·Þ$îKª­2ñÙ…-JÛH“Êt6U®xĘH“Jâz‚$}@”N;€Äónݰ[c]sÓ­ã`LR âÆ·¤Ý4ˆÚ7Üÿp"ËÌö/ÊuØ8<$˜µÆ0ÆÈ"‰?â¹¶¢#׈Gư¤r„2}:èQ}=2}Xm·V éöÙõ;Ĉg{Ÿìù…ˆÞ}÷Ý¿ú«¿z|1ô»ï¾‹“탲õíê ë»tV|èÌ–[jCÒ \åˆq[fê>²·)9¬rëeLm$]T]üA®Ä«m¼MR bMÜB•¤±Ò—žhݸRÚõþpKf⎭î÷H(Ó ¤cð-c‚Ç5 iã¤!̺µ'¢cÌ–ZÎãV©DdÖ‚Qà{¾à¼½½MÊL(™ ƒÕ,Ï%@¹~ýú‡~ø{¿÷{Úà—¿üågŸ}†“íÅÕ€$ãiÝB•H×k´# W%9…ûÿ(32FëZ‡¸^!Q²™IkI´•ÆCÆuEµÉíLL£ã¡»iÁ„eíŽ Ù!, –ÎãÌ’%ëÆ¹xœNŒ8c&­×ˆÃޤ:Ã…#œ3/I@ÒÎ Ýk@(3&3†’¡¼”Á#µáD¾Ç„à” kâ2Ô€<ç%—Ëýë¿þk½^ÿîw¿Ë9Ï~ÈóÞ{ïýÇüG.— Ãç ‡"ŒÌ8˜´ÇG¦¬ƒeFÃ$U›Åõ i×tÙR-b⢑´áYk+âhg"íE¦¬µ†ÒV 2I@´±ÆZéFÆè8aÑIÎâZ«º‚cHr…$I Hû !²i޹‹;çÉTÞN:Ò²Ž8qEÉ¢WÂY¼o¼%çœw“eân©”d%q ˆû(§ö¡¾BÆ”Œˆ|ŸsŽŒà…(ßøÆ7¾ñoŒ?xðàŸÿùŸ/_¾üõ¯ýÀ###>¼ÿþùóçÃ0üë¿þëÑÑÑ{÷îýò—¿üå/‰³ÐŠM+8âe&ÊØHi¬1íª¸S©Ž×­è8ªpCd( W$²Ò0íFÛ&dŒ!“I4Ü8ݹ*GÛxLº¨Äå™Ñ,”LŒÉÔƒ´‹Aˆ÷¸õ“¼€¹²Š'ˤ HÒ-5î~êz‚ðÌd–Ž2ÎÚ6ó…2­@v¬aµ!ivö•€= |ï{ßû£?ú#w{llìoþæoÞÿý?þøßþíß677ËåòØØØ›o¾yîÜ9Ïóˆhrrrrr²\.ÿçþ'N ek@âFI·êh²c H\ÙAí]´µÆì\²u‚LR’Ž€q“t¥¶‘6Z“¶L›x^ŒL#—Џ»ig•‰Z¤v›1WwÑVkmÜÄM„!ÚÚy”’E(<“6áœ1nÓ‰-‚c–ÇÃqYÒ„ F‚3ÁxZë!Ú=DÚÍS]u‰ëŸ’ –¶(_©©©4=‰?“ç}ç;ßùÎw¾CDÍf³P(ì¸ãÿñß¼yóöíÛ87Ö¦á…U†Enôl²2ŵ‰+;’lgd^LR?¢M¨’cu:7ib ¹•,ÊZ­ã-ã`´µÙztrJ¶H\%’ýJX¦*„qN– òs]6âj‹øhñ?9#/^³u´m¶»jæ¡ì8†2•)Äv¬É”“tþ“:Ô€ @yÞ~ûíÇ|ôQéIºïücœè#­ã0[ª<ˆŒëëamÒs4c“![¡¤»l©qŸEJÕjIk)—k1!“@„¥>’…´!mÉ5@Mgè(2i¿ª’ÆE-R»-YR3Ò®±&þ]í‰KBÒ•2i¦àj@G´´‹8x»ã)c$˜Ä³é=<íÂxR'·ùœqŠï!΄ÛÝõ!–´A ì­¥R©¼ñÆ»Þý7Þ(—Ë›››8=Р鉱í"ŽP[6ž_›ŒzQiŠ¡™4Vj“t¡dw«´”•&N1Œ±ÒT.¿ˆ»¥*eB©±Ä†¸µ¤Ûsym2†²ÓQÚíE“* ŠÿEŒ˜eDdȺ² W,‘Ǚ—ìï*>’†©í·R†1&(^ãVµd»«>¶$‰;2ã`¶/Ìaå$éÿeËLâ{žÀž P<øeþLÌ9Ÿ˜˜¸|ù2NÄ)%•Æ’¡vɆ±ÖZf:[xèvŽâÓþ(Û2Æ}ˆ¨£ZÄ™¤ÓGÒ$­õp}=Òˆ$ŽT\ÿ­)2F%V•ig.Q2:W¹ª.‚1Ö$uÊX­1d’ $*(S’Ty°öRNi•GÒõÃuô°q #ιhoCI%HG9IZ™õ#N‚XÚWUpÔ€”¯Èøøø—<Ȧ'Ö’qÍJu:&_KRgª?âf¥”ÎvIït#le2F'Ç‘ÆJEZS<ׯMO]ÀaL»ˆ _Ü@_JþË’*5 —pbDn>o³DäBœ°9·ßpÕÖZ­5cxBpž¦$é ÎYº’…·GÀ°;€d⎤µ‡ÍT´÷zT HšÝPf ”¯Àààà—<ÂÐÐÎÍËNi»Þ2›J»œÂfJH¬e†LZ9b¶LÉvIÑc•¦(™Ø’vK•i'Tkµ›áb¬2qª¢5i×Ķè¶§í« K§ÀhO1Æj›(IÿSÖYâ–º¤ã`’¥.é —¸<Ä0Ëãq0í"Ž´‡«HÈ5q»XcŒ&Æ)ïûžç6N¢“øk¯Ù€—7@y|Ø'ÎÍË®!íÃ5¹¡ìzË4¥Qš”1‘&©­N—±h%u%J[c¬²d’˜ÃE!ÆZkÚ]ZMg¶B®Æ‚¥…;€¤,Ùt Å­?(àp–äÄ\—dÎK²&p›Ö€°¸jƒñÌ ÊÎvÙZ Òî‰ì¶V é.Æ’Œ>BP&»q5 „V ÏÝ3 Pr¹Ü ?¼pMiæ›òAÝ<ÜTõиº©r=At{àndHi›VÄJRâªQ(³œ$‰!â/"©aíÖq}‡`–Q:Ær–Laí‚Á8oƒÄwzñJ™ähÉD‘YPóŒV³hm¥eDä &’€žðL”/?@g}}çæe×’æ~MÞ¬©‡j34DíF ig7ÎÅãpbÄ3IÇ$¼Hª3’A¶ÌcíY¹Ùmè15 É­ÎÂ׈$Ù«sÖy:˜5 ¯¦g ÌÍͽõÖ[_æ÷ïßǹÙXÒÜ„1ë17à%ˆëŠAÜX\—‰pÎ9#žôûðx»Öƒ'5 ñG)ý¾ÇðÌ=“å¿øÅw¾ór¹¼»Ý777ñ‹_àܼìò>½Ï'Áûò¬ÙL=ÇÖV ;VŽ<ª¤½1Ê@àyy&J«ÕúÇüÇ¿üË¿,‹O»o½^ÿñ†!ÎÍËÎ笒g¡åÚzyßà//ï÷æÍ›÷w7===00ðä{­¬¬\»v P §xÏîÐëëë¿þõ¯ñ-þJh­¥”RJ¥yžçû¾ïûnÌ­cŒÑZ+¥¢("¢ <ÏBpÎsä§ÝKJY¯×‰¨T*ù¾ŸÞ¯” ÃP)e­M'ØÀáá[ðRR®®®®­­¹ Går¹¿¿``  h­ÆÆÆÆêê* T*•b±øøåi÷ª×ë³³³D499Y­VÓûÃ0|øðáææ¦”RQ(ˆqâ`o@€ÒëšÍæòòòâââýû÷kµZZ'R­V8°oß¾¡¡!ß÷[­Öòòò;w\ŠADårydddbbbhh(ŸÏ{ÞÖs­”ÚÅ^µZíã?&¢jµê”0 ×××nß¾ÝjµªÕj.—#޳{”^·¼¼ü«_ýêâÅ‹·nÝj4ýýýÖÚõõõb±xøðá7Þxãë_ÿzµZ]XX¸xñâ{ï½wÿþ}7ÿhssóÀßþö·ß|óÍýû÷oŠÔjµv±×Ç?øà":uêÔää$­¯¯öÙg—/_¾xñb±Xùä“{÷î8qbllìèÑ£DtãÆ¹¹¹{÷î1Æ&&&^{íµ-G®Õj»ØË±ÖZk———ÿ÷ÿ÷êÕ«÷ïß/•JßúÖ·Ž;666–Ïçëõ:)‹Ó{”—ä>®µ~ýõ×ß|óÍ©©©}ûöù¾ïÞŒc”RaH­ #I¼ yº ¨{ø¢® °ç¥?¤î6~I÷&¦YH¬ÙTõz´aÛ稾iš-†:’Võp:«YïCU¯ëM!Áž2?¡Í¦i6T«¥{ð·ù–E«ì«gd95›ª^×ÏåYÝT¶Þ4ͦ CE¯b€rÞlªF 67~÷ ¥±¤m4t3”Qh[‚7¢¾)}ÍvñÙ1ÙÅó<\ÍóóØjµc…B!­'@€m…Balll}}}~~~iiieeÅZ{ïÞ=)åàààØØX±X\]]m4J©b±Ø××çžI}}}Åb1Š"­µ{›´…Rj{Å/§67oܸá—‰‰‰C‡MMM1ÆÜßö(½.—ËŒŒôõõݽ{wssÓ-«Y\\,—ËÃÃÃAXkµÖÆιÂ¥îï0®oÇŠÖÝíå¸ä¯^¯—J¥0 ·Tú1Æ8çžçår¹¼á9m4Þ'å²g"ò}³…gÇýì»gþÊÑ›|åò¼PJ¥ Rn_ ê¤ ka.”š[ÞÛKxp5ë™×^©”/—½àé—ðH® Í0©ümŽ Ø«W3Î(¬PðK¥|¥ò<Þ¯ i$שr9¨WqD.' ¿XôÊe¯t¿’¸%÷|-„ÆXêé’¸šõÏó|ßJ µïÏ£ümî–ÀÕ öÌÕŒ3‚%×ÿç±HA1ãKíûÌFˆWqé½çy¾ïù¾ïû^t?ËÆZ®­0î)!4÷<ßó?x’}w PcPžè§ƒót:ØÁÊÊÊùóçWWW¿ýíoOOOW*kíÆÆÆµk×Þ{ï½õõõÓ§O !J¥R³Ù¬×ëkkkžçÑÚÚZ½^Ïår…BÁݳí¥ùnöröïßÿ½ï}ohhèþçnß¾†á_|ñð“““øi€½J¯ Ãpiii}}Ýó¼jµšNáB¬®®j­Ã0,‹¯½öÚâââÜÜ\¥R™˜˜ ¢;wîÌÍÍ•Ëå‘‘‘|>/¥¬×ëDT*•\»“|>ßu¯G=ªr¹|ôèÑñññ¥¥¥«W¯~ñÅD400 µ~íµ×\a ÎìPzïû}}}«««/^l6›éžÏ?ÿÜÓßßïû~¹\>räˆRêÓO?½wïÞÌÌ ]ºt©V« 9r¤\.×ëõÙÙY"šœœt)Ì“ìõ¨GÅ9÷}ÿÀßýîw8ðóŸÿüÁƒï½÷Þƒ¾õ­oŽŽ"@€½J¯«T*ÓÓÓBˆV«uçÎWEòðáÃ0 §¦¦Ž=Ú×××××7==­”ºtéÒÒÒÒíÛ·‰hii)—Ë9rÄ-üI”‘‘ <É^ÛOn÷|>ß××W*•„ËËËŒ±åååÙÙÙ{÷îAÀ# pú`o@€ÒëöíÛ÷öÛoONNÞºukyyyaaˆ<Ï›œœœšššššÚ·o_¡P˜™™)—Ëù|þÞ½{Fƒ1vðàÁ±±±¯}ík}}}÷îÝsÊ©S§Ü‘ûúúºîµýñ‹ÅÉÉIwÃu9zíµ×¾õ­o_¸p¡ÙlÞ¹sÇ3::*Šƒ8}°7 @éu•J娱c}}}ù|~~~ÞU ”ËåÑÑÑãÇ¿þúë…BÁ÷ý\.'„ÐZ÷÷÷/--ÑÈÈÈøøøÔÔÔÐÐcÌ÷}W9â Q>Ÿïº×öÇS­VOŸ>ínc¬\.—J¥|>EÑÒÒR©Tâœï¸/ÀK J¯B‹ÅÑÑÑJ¥Òl6ÝÄ&Ïó …B¥RÉçónšc¬R©?~|||< C"ÊårÅb±\.»,cddäܹsîFzð®{m·ý8nË¡¡¡·Þz+ CÏóÜ®ºÂÙ€=J¯ãœ»Ž­;v$ÉÊår¹\nhhhÇ–J¥R©ô´{=áqc…B¡P(¸¶Z­Z­VW§öÈÛs|  @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€.<| zŸµ6 ÃõõõõõõÍÍÍf³©”2ÆXk«Õêääd__ŸÖº^¯/--­¯¯‡aHD¹\®¯¯oxx¸\. !c[kŒÙÅ^µZmvv–ˆ&''«Õ*i­¥”ëëë‹‹‹J©þþ~ß÷µÖxvÀž·¸½ÎZk­­ÕjŸ}öÙ•+W®_¿>??¿¹¹†¡µöÌ™3ï¼óΩS§šÍæìììÏþó+W®,..Ѿ}ûNœ8ñû¿ÿû‡. ž·õ\k­w±×ìììO~ò"zçwΜ9CDRÊZ­våÊ•Ÿýìg›››§N:tèÐþýûya§ö(½. õµµ[·n}üñÇ7nÜXYYi4J)kmºM³Ù¼wïÞµk×nܸ177'¥$¢¹¹9ß÷÷ïßïûþøøx__ß–#ïn¯Z­öñÇÑŸüÉŸ(¥Z­ÖâââçŸ~åÊ•ùùyιR g ö(½nccãÊ•+üñÿýßÿi­Ïž=ëÖìäóyƘ[³ººzáÂ…ëׯÑ›o¾9==MDW¯^ÝØØ¸xñb†åry{²»½²Z­Öƒ.]ºôÁlll=zôèѣǎÐZפÀ^¥×mll¸"‘0 _ýõ™™™7Þxchh¨P(0Æ\’¹¹¹ëׯÏÍÍMLLœê7šŠ¢Èãû> cŽ,--ÍÌÌxžwïÞ½ååeÎy©T¬T*…BAJ¹ºº*¥-•JD4:::<<Ül6µÖQm?òîörÖÖÖ.^¼8<<¼¼¼|àÀéééS§NU*• Ü‘) é•iÿ¡žüµ »‚ð¬^˜Y›>ÓÒ?¬AϽ˜³ÆÒ†´æÙ $­èñ‹+®f=öö/®@yÊÒÚh£UO>ál†û2ñ–öÆÕÌkÓÚ<·4ÃUŸhcŒÑ¯æ«‚¤ÌÎhMOòÇ  èvÍ´Ö»ûÆÖÚMYuÖÂÿ½ÒZ¿À—¯PzRjsssyyy~~¾ÑhÜ¿¿Ñhär¹‰‰‰ßùß9qâÄ´Öaj­ƒ ( ®â«P(A ¥LSóíO¾]ì嬬¬œ?Þ•®œ>}úÀ•JeûÈ€½ïx{µ6]åå"É(ŠZ­Ö½{÷r¹œ1¦R©<ÿGÅ9Ïçóî´Z­z½^*•\Šã*Ð<Î9'ư„ç)¾·îhœsüÍž÷ÔrÏ4½÷,Á8ãBpO!DûïêBîRaYÿ… W³ž:B0!„xú%\ñ|zaÅЂ[Îcö•<ËÌè-¿syý±DÌ a9çŒç‚‹'ÝwÇ«™{Óç.eBÔÓ=æÝ±=Pà1/\D>Ÿïïï=uêÔÛo¿EÑÂÂÂ;w®\¹âfß!r¹œ”2Š¢f³é~ÞšÍfE¾ïA°ã•ww{9¯½öÚ÷¾÷½þþþO>ùdqqÑýÀOMM¹Å½Ž\Oxžð„/hžîå ;A¸tÂ3}¦¹ÒG<Óz÷ÅœÇ={¾A.×¾ ¡ò=ã Æ²½üÃÕ¬Gxžçû¹ `â)”@iß·žG½ùÛœe! ÀÞ¸š Î<Á<Ï?—{47Ҿτ°B¼ŠŠžïûAàÈþÎ}c­ÒÖ÷¹/´'Œç Ûïë§øþkÍsÿBxž‡&²ywœ†MP`§.A000`Œšš²Öº®KKKÖÚF£áûþÀÀ€»g~~~tt”ˆæçç—–– …B___¶0$µ»½œþþþ7ÞxcpppaaááÇW¯^uïÄ&&&\ELú· Î9㯜Ÿœµ6í¿·ð¬_RækÐ{'ˆSü×0ž}!%„å‚3÷'/ÛÓSxp5ëÙ ”§ PÒŠ§ümî:d“<Ó`o\Í£´áyU 0.ˆ óʾ*à‰'üž3k-Y& ŗǤe·çË…ti€‚«Ùc~]†ò¢”^—ÏçGGGs¹\>ŸßòDI ï …Âèè¨1æÖ­[ù|Þ—.]º}ûv©TÍçóÛ¼»½ÒXgxxøäÉ“¾ï_¼xñÂ… <ðÕj?~¼\.ãÄÀ^‚¥×U*•cÇŽ¹xâóÏ?_]]5Æ,..Öjµ‘‘‘±±±b±è¶!¢ÕÕÕ‹/º!8W¯^]__;zôh¥R©Õj³³³D499Y­VÓ#?~¯G>o<¯X,¾öÚkù|žs>??ÿàÁƒëׯ‘bttÔZ‹gìx‹Ûë~ë·~ëÚµk}ôѯ~õ«õõõ(Š8çCCC'Ož|ã7†‡‡ËåòÙ³gƒ øÅ/~ñé§Ÿ^¸pˆ|ߟœœœ™™™™™©V«·oßþÉO~BDï¼óΙ3gˆ¨Z­vÝëñÍ÷ýjµ:==íûþ§Ÿ~úë_ÿúÃ?lµZÓÓÓããã^i§ö(½®X,ŽK)çççWWW[­•J¥ñññ3gÎLOO÷õõåóùƒJ)¥”>$¢‘‘‘#GŽ?~üàÁƒ…BaÇ#ïb¯jµšæ/n™ßþýû‹Å¢âáǵZ-—Ëá¬Àƒ¥× ! …ÂÄÄD©Túæ7¿ÙjµŒ1žç•J¥ÁÁÁJ¥R(8ç…BáСCårù÷~ï÷Â0$¢\.W©TFFF …‚brròwÞ!¢ÉÉÉì‘¿×ödzý8žçU*•'N H)+•JÖÚºÂÙ€=J¯cŒyžW­V¿ †sþømÒÊ‘ì.]÷zÂ㸞²ÃÃÃîžV«U«ÕêJãôÀÞ€ñH] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð€. t  (] @è @Pº@€Ð…‡oÁKD)ÕjµêõúÆÆ†çy###¥R)ýh†›››F# C"ÊårÅb±\.çr¹Çói÷ª×ë>$¢ìg·Ö6›ÍZ­E‘çyŒ1­5‘À)€½ÊˤÕj=xð`vvöÚµkårùܹsÙcccãúõë÷îÝsǾ}ûÆÇÇ=clÇîb¯‡¾ÿþûD”~vk­1fyyù£>ZYYéëëÜ·oËWqÊ`o@€òrp!ÅÊÊÊ¥K—>ýôÓË—/8pàÌ™3î£a®­­ÍÎÎ^¼xqnn®ÕjÑââb­VBcúûû·W”ìn¯Z­öÉ'ŸÑ™3gÜ£ÚØØXXX¸uëÖµk×\ÊÀÀNì%P^Ƙ0 çççÿû¿ÿûüùó RÊF£á>º¶¶vùòå‹/^ºt) ɉ "ºsçÎÂÂB†õzýÔ©SûöíÛrÌÝíÕh4fggÝ ÷¨îÞ½û³Ÿýlvv–16>>~äÈ‘±±1cL]á¼ÀååÐh4îß¿ÿùçŸ/..®®®.--¹†#î£W®\¹yó¦ÖzxxøÐ¡CDT¯×kµÚ7<Ï;xðàö(dw{EQT«ÕŒ1›››ËËËsssW¯^½{÷n«Õ:xðà¡C‡ÆÆÆ†††ÖÖÖêÊàÄÀÞ€åå°¼¼|þüùk×® 9rdmm-ûÑ7n¬¬¬¼õÖ['Nœpµ$£££W®\¹páÂ7¾ùÍon?æîör”R›››7oÞüéOº°°0<<|êÔ©“'O\,oܸ‘ݦÕj-,,4›Í±±±“'O Q©TÚØØøàƒ´Ö®¿É»ÛËY[[»téÒÂÂÂýû÷…333GtGvíQ´ÒJY­ŒÖ¨FyRZk­5qŽ)ãð cÒgšµß^¼0cWŠG¢öU4’JI¥µÒÚjÝ»çW³Þ¡“RF‘%Áº¿pD‘–R*¥zð·¹µÖ½Þ0Ƹ¿Üàj{ãjfibJ©(’Qô<žÕ‘4Rj)•L¾ØWï:IR2)IJ±îßc­ÒVEÊ(¥µ1Ф¢H²(»{ŽI)µÖŒ1!„µ¿:}¦TEÆ!^ÌÈW(½®^¯ÏÎÎÞºu«V«‹Å7ß|siiéƒ>Øò#W¯×¥”¥R©¿¿ß÷}"êïï/•Jaj­•R;þ îb/çÁƒï¾ûîáǧ¦¦¦§§gffÆÇÇËårú‚Æ£” CjµXÙHâÍÓ]@Ý·ñE]`ÏKHÝmü’îML³X³©êõhöÏQ}Ó4[2 u$m/¯•ÄÕ¬w„¡ª×õ¦`O™ŸÐfÓ4ªÕÒ=øÛ|K€"„ÀÕ öÆÕŒ3²œšMU¯ëçò¬n*[ošfÓ„¡Ž¢W1@ 9o6U#›Œ¿û…ÒXÒÆ6ºÊ(´-Á› Qß”¾ÞM¾1& xž‡«Ùc~[­c¬P(¸7°ÏÙó>1XÙñ´\­ÇÅ‹———£(j6›­VËã‚•ÙÙÙz½îÞc|ßÏårB!D.—ó}ßå Æ˜Pw±—EÑÊÊÊÊÊJ†œór¹\.—=yìMÏãïÁƒß~ûíÓ§O•J%|ÓŸÊÊÊʯ~õ«O?ý4—Ë)¥Þÿý•••‡‘«C9wî\Zëåjò]¡µv¥MBˆs«ÝíåôõõMOO^¿~=Š¢ÑÑÑÁÁÁR©;2çÜó¼\.—7<§fXÂó¤\öLD¾ïão¶ðìcÜ7|ßÇ_9z“ï±\ž A©TÊí«ATa-Ì…RsË{{ ®f="—óJ¥|¹ìO¿„Gr]h†ùHõàosT À^½šqF`…‚_*å+•çñ~MH#¹.H•ËÉ@½Š£4s9Q(øÅ¢W.{¥ û•Ä-á)*UȵZÖäó¢PôJå Rü –ðàµÙc(¥<ÏÛËKx~øÃþð‡?Ä™þ’‚ ,—ËFcmmÍ•ÖjµZ­&¥ô<¯X,¶Z­z½¾¾¾^­V‰h}}½ÑhAÏçw¬ ÙÝ^i€233S­Vó›ß,//_ºt‰1vøðá¡¡!WIå2á ÏÂÓ òèéÞÙ‘‹±ðÝ€g„1–>ÓðKº7 Á¹Ç=Ï ?ÚäÀ瞯…°ÂK=½@W³áyžïûAàï"@ ¤ö}ãyÔƒ¿Í]€Â¸šÁž¹šqFB°äúÿ<)(f|©}ŸùÂñ*.½÷<Ï÷=ß÷}ß ‚îgÙX˵õÆ=%„æžç{~àO²ïŽ c Êýtpž®C߃ Ò“/oppðw÷wÇÇǃ pËá …ÂåË—‰hrrrrr²X,®¯¯ ¸ñÆóóó¹\Žˆæçç—––òùüÀÀ€+ ÙÂ÷ý]ìåT«ÕÓ§Oçóù›7o~øá‡·oßþÁ~033Óßß³{Ì3 P<ˆôäËëï™Kïqm_‰hbbbrr²T*•J¥ÉÉIÆØÝ»w1nÈñõë×çææ†††ùÄsìØ±¾¾¾W³}7ìUÏ0@yûí·ñýýò\ÌáÖì8n%(¥RÉÕƒc>úè£ .¸´enn®T*={öôéÓÕjõáÇï¿ÿ>;wÎ(O²×ã[¥R9qâD¡PÈår×®];þüììì÷¿ÿýcÇŽ !ˆœ>Øža€rúôi|¿<ß÷·8v옻á>T.—9Òl6ïß¿ÿþýF£ADAìÛ·ïøñã‡.—˵ZˆÒ,æIöÚþx\ ãnär¹\.Ç9wCÝjµZ†ëëë¥R‰€ÿßÞÝë´­? ˜|[4U‘€ª*ˆ²ñ]ú}´Nô5:tîÔ‰°T"E¨RUu€BÈG}ssÓðqS”ý~2&Ž-›é¯ãs€91Å€2üÖ Ôh4^¿~md{¢(Z[[+—Ë«««ß¿ÿõëW¡Z­6çÏŸ?yò$Š¢J¥’…Á‹9ã5ÎÙkµÚË—/«ÕêêêêùùùÊÊJ»Ý^^^f `^L+  +OIÇ{{{ÙÆÕS,•jµÚÒÒR’$§§§?þ !$IR¯×+•J¶,ÎðÈ‘ñçìÙ AQU«ÕÓÓÓN§“MQnábæÆ´Jš¦nî”\O!™………J¥²¸¸X¯×CÙª=ƒµÖîwÔøg_ZZj4qgËJ]^^v/=+æDÉ-xt®ÏŠ’)‹Åb±\.///Oê¨ñ¿' 1Ùv»Ýî÷ûáÒB<̉¢[p·¼”4M/..†wv:V«ÕïÈÌR^J«Õ:99i6›Ã åðððÛ·o‡‡‡ 0Cy (q …n·;ÜP’$ !œi(À å% ¬¬¬loo4”õõõµµµ ¡3•£Idã8¾ÞP6664`¶òµ OÇ[[[YC988ÐP€<ÈÝ2ÆI’d ¥×뜟Ÿ‡666ž={4`Š9¼¦á†Òl6³†²¹¹©¡3QÌçe4”v»®5”4M=?às{eQ-,,„úý~·ÛÍvV«Õl£ÓéüþýÛó@NÊÅÅE³Ùìõz…Bakk«^¯‡~üøñåË—Ââââ«W¯²¼0my (Y=év»Y=I’$ü[OÒ4ÍêIEð0þ(y˜UD=ò&_#PÔ ‡Š#£Nf8E=òé†(3i(wדr¹¬ž³Rºqï ¡ …‡¹Ž“““‘zBhµZY=ÙÝÝUO€Y)…Ò4½-”Ü{4Êß–—ÍÍÍ^¯÷ôéÓA= !looýúõÅ‹ê 0CW#Pîh(÷“¦éÙÙY­Vóóårygggdg­VÛÝÝõ€Ùúo”4M';ûÉññ±û ÌVᙔϟ?»¿À(†¡h2Ù¯þðáƒû Ì?F ¤utt´¿¿ïÝÕ*<ƒß';•ìû÷ïCoß¾u£€Ç«4¨'Y:™ø‹<ûûû?~|óæÍÞÞÞúúúøëòäÄU@) O'GGGï޽˶'u¢Á—dƒŸƒÉ\n{±høÃŸ>}òü¯ÒôºÉ&uº‘©[ŸË0ߨMî§ôHãÂåÆh22b`|sPÂ-ãPn;`¥áú0Ù%x¦äzû (áÎtð·J×Çeä9£ÜVOÂ-ãPnü+À_ùýGðÖóæ#IEND®B`‚icingaweb2-module-graphite-1.3.0/doc/img/service-list.png000066400000000000000000005350771516321226600232760ustar00rootroot00000000000000‰PNG  IHDRÀ<ÿQ”í pHYs%%IR$ð IDATxÚìÝg|Õâ7ð3[’ì†Mï…´%…„„H t¤D@¥¨4Á‚"^Áò€×‹AA®í¢(¨p-ˆ  º! „’BzïuÓ¶—y^ÿsç¦ $ðû¾à³™œ=svÈüö†lM Ð1ª sPº€  Pº€  ¢>r Ýl!ëZò´œèSî~€ò7_‡N ”™ÿu$?\-}òl.N ôwyÏß|¶Æ„pé !dI¨Ç‚pb ï¸ËÊ›£åm7>àâná™î s“Y´û«EAÎç/öö°›€p×1ÛN¡ »›=P˜/úƒ» œoV·èÚÏPŽå×áÜ@q—ç@yÿl^Ûñ…uÇj›qn ¸Ëʦ̊]WKù[’*–ÅeàÄ@ß!ºëGðŸ‚Ú9A®_È×êMiµ-è{}ÍÝP^áý}Zɺke8Ð7Ýå!< Ým‚lN+Å™€>«”5®e‹G–-¹1ÌófŸûÊïØÌÊ<¬g }Øí(ÓdïO p“Y¸É,Þí·ÐݦûÏ]èn3ÂÍæË4 Þ€>í¶_{þÑ7 ¼2Âû`VÕùf5Nôe· ˯ãÿèbiÑÍ'Nwp³ùàRá­½®Ÿ¹h¡› ÎÜ· Ô6ïºú×°§‹ê§ù9üö@`G…§;ÈüÌÿZ÷gY˜Ç-w?Ù9Fž»tÌîYC›–Žù|„Î"ôªXÆxÉÙÜ%gséãé²?riÖп_§SÃú™‹ž tàà0€{Jbi}´‡]ô®‹·ðr_Dz/ õ eæ¢#¼2êš·å×â\@/éáeŒÕ6Ý—DræñáÓd ÝmÎ<>üÑ~üô„íaGùì®CJ÷-âÑjËÜ@WœHè=‚ßcžÖ{%©¼qÿœðÝ u“u8+Ê7›£ ½Ù EÖ¦¼Ì\ˆ ½GÐKûýàR!KØ.‹8 øéÁ.‹ù™‹^ðqØ9Fžùøð¶¿Í¬iÁ‰€Þ#ê¥ýn+—ˆºÕ1d„›Íš@×M™­¶’I†:XŽt·‰r³ pPѬ½TÞ°ójYZ·yJг¿Ž<«¶e}R!N¤N§ËÈȰ±±ñòòBmô¬^ PFÉ$“¼í»_þÉPw Œ’Iƹ[G¹ÛD¹Ù¸É,¸ÐäTY½ž„]^ óðI.–5ì+¨¡³ÕÞE,Ë^¹råâÅ‹ „GGÇÑ£GÞÉøøãSSS !ï½÷^PPZöýÆß\¼hS°£,Èa€‹¥yŽ¢%³V™\ÙøU^µpÛz%@™ànsSåüö@ ?4ù"©¨Uh—§5¬¸TØGj0//oݺujõÿêï¿ÿîîîþî»ïZ[[ߙà٠!¤¹¹Íú~óô@»N t²4ã¶DIm£ÜmŸ óX\Þðj|Vb“µp;z%@q·2¿Ù§ ‹6žË½\£ì(4é›”Jå;ï¼£Ñhèr¹\«Õ–””BÊÊÊÞxã-[¶…½>Ç-Ã0?þøÑ£G­¬¬ÂÂÂЬï+»Æzbˆ;!¤´Qó{~uzMK…Rhg9ÄIöˆ¿s¤›ÍÉyÃWÇen˯A]Ü2Q9Žï¯•î)kèwÕwéÒ%šžøùù½õÖ[2™ŒR[[ûöÛo×ÔÔTUU¥¥¥ 6ìÉðáÇŽ}¿ù{€ËCÜYB~º^ö÷Äü2ƒñ¯_T4’tòÀ•ÒO&„9[}0) ¥¦ùb³5pkúJ€RФíÕרØH …«W¯¦é !ÄÁÁaÅŠï¼ó!„?´‡eÙÄÄÄŸþ™>ËÞÞ~þüùQQQ\äää“'OzyyM™2eçÎׯ_'„¬[·nß¾}&“)22râĉ\á²²²o¿ýV,?ôÐCÁÁÁiii¿ÿþ»……Å /¼`nþW £ÑxàÀ¸¸¸––Bˆ»»ûüùó[uQ1 øý÷ßõz=!Ä××÷É'Ÿôññá—©¨¨øõ×_SSSF£T* ™;w®««k9MÓdÚ¾u¹DËv¶2”9Ãl x¦Dq¨¦©_¼¯ˆæo•B¾H*z)© m8…r|ìås v}19pÌ´Îk:Ò+JbYË7Ó¢Egè_#w8 ÃBŒFcJJJLL ·=88xïÞ½&“I$ú«†Y–ݰaCZZWF¥R}ôÑG#GŽ\µjÝOaaarrrrròþýûi¡PÈ0Ljjª^¯/..?~¼@ð×ÊÓ§OŸ¦{›>}:!$'''99Y(>ùä“4@©­­}õÕWù NNNÎ{ï½¾fͺ…BñÒK/ñË\¿~ýµ×^{öÙg¹·“œœüÏþ“اN:uêÔ[o½5tèоŽæ8[ï|hÈ3Ñ`‡sNdt” ˜3ÌoSO—;>?Ìó©#W÷Wöƒ åÍ(Ÿf¢ôêæ¤vT¦ÑÄ®ø#ãØcÃ]mžô²ß^X‹«À-ôÆN÷”5T4ßD’ØÌÊ~Z}VVVôÁ¿ÿýï·ÞzëâÅ‹õõõt‹P(‹Å4!„üôÓO4ï‰DK–,Y´h‘X,&„\¸p!..Ž–¡[¸§GGG‡††:991‚R[[[]]Mk2™âããé <˜ÿ\úŠ,˾ûî»4±´´|úé§g̘A \¾|™ömaYöwÞ¡eüüü–.]J³BÈ7ß|SZZJ1 Û¶m£»3gÎúõëgΜIË|þùçF£±Ÿ Év–4=!„L—;ý6%ÈüÿΗžB˜‰¾Ÿ:Ùβï7¿¡NV„-ÉE*SgýJN5¨NÔB"\d¸äÜšÞ³ójé?Fûu§d‹ÎðeZY?­¾±cÇîß¿¿²²’’™™™™™I‘J¥£Gž>}º§§'-ÖÜÜ|ìØ1Bˆ““Ó–-[h·”É“'¯X±B©TÆÆÆNœ8‘?×lxxø?þñnË´iÓFcjj*Í8***è²;&Là:¹ðݸq£¼¼œâááññÇÓ2'N\½z5!äøñã¡¡¡´ÌäÉ“Ÿþyš¼Œ=úÍ7ßdYöÈ‘#Ë—/74%‰‰‰Y¸p!!$88ØÑÑ199™ ú2{ ‘Tüߊ.wúVýPøé % í-D}ü­¹‹„^6BHrM×ë.]®lzÈß9ÔÙ —<€[Ó[w‰kÒJðµáÚõzÆïŸÍë§ãw!"‘è³Ï>Û½{÷¡C‡¸*•êĉ'Nœ˜={öÂ… †)//§sÍFGGF¥RI±°°ðööNOO¯­­mjj²µµ¥O …Ë–-ãç)þþþ–––J¥òÌ™3>ø Ã0ÉÉÉ„†aø³¢ðeddÐK—.åooïwÞy§¥¥ÅÑÑ‘rãÆ º=**J­Vëõz†a\\\$‰Z­¾víšÑh4 4@ùã?ìììFåàà0cÆ ®?K··¼ÑídæÇ“ÿ×ñ¤U†Ò6=1±ìê“™{Ëûø[f+0L‹Îªì°·—“PðáH_K3¡£¥!$ÌÉê—‰,K¶¤ŸÅÂÆ7•ôÞ®#c¯x è‘çNʼŸµ)³¢_× P(\²dÉ‚ ÓÓÓ“““i?BHll¬Ott4—†8pàÀmwÂüï¸þXúãĉ9RPPÐÐÐ`ccsîÜ9Bˆ“““››[»GE÷ ‰¼½½ùÛ‡ ÒöU6nÜØîN†¡½iâââŒFãîÝ»wïÞÍ0ÌàÁƒg̘Ù/NÐæœ*BH» !¤Ýô„>¥+jÑB˜‰|ÍDù:C»eª¦SÅõ;f  BˆD,|4ÈõËäB¤'7KЫ{_u6Gc0é ¦vní”:•Þ¸¯ æÞ¨G±X”ߦµIO2úEzB¹ªÖU+u„‘:)ö}Iý YÜ;ߟQù·K…¸ðܬÞèáëIA×jš"c¯üÍ×a°Ã€ Y³ÖPÚ¬>–_w¬¶9óñáïŒð^r6·ŸÖ˲gÏžmhhpqq¡ó¼R¶¶¶«V­zöÙgõz}NN˲&Ó_Òÿûÿ/::šeY†aŒFc—ñgàÀ...•••tð}n'}@h´a4in»N§Óëõæææ"‘ˆ– …_|ñÔCŸØ*Ða&&&&&&F¡PäççŸ;wîÌ™3„sçÎ-^¼˜yÔÇmΩ&„|<9ˆß…_àÿÒ“ê~Ô3êš,íçvÝSÞÐI±²*-ÍWô9]\·ät®z· ”MažQîÖCw] „l˯%ù­×O}÷\îîG†þœYu¬¶¹?ÖÁ`ؾ}»Z­ …_ý5?§¨¬¬Ôëõ„†a,-ÿZÒåàÁƒ#GޤK …´´´¼¼<©T:uêTn}âv1 3eÊ”]»v={6%%…`ooßQyú+–eùå—Õ«WÓLD£Ñ<÷Üsjµ:<<üÍ7ß´¶¶&„Ƹ¸¸ùóçsÏ‹‹kllôððˆŒŒlnn>þ3Okè¨Ìž²†ƒYUëÆøõÓº‹Åááá4ƒxùå—jkkëëë=úúë¯Ó2tÎ77·àà`BH^^Þ¦M›*++ëëë:ôÞ{ïíÙ³çðáÃÝ CçRaYV¥RBbbb:û3räHšÚ\¼xñ“O>©¨¨¸qãÆš5kè¢ÅQQQt‡‰„ò믿îÞ½»¡¡¡¢¢â‹/¾øòË/÷ìÙsíÚ5BHyyùöíÛ·oß¾víÚ‚‚­V[PP@'y …Ü2Cýŧ9Õ«þw,é·é !dwYÃîke„MVø9¶-`Î0.¢¿>ão_--3qɸ5½Õ廃ã ë:ÿVœ²êlΕÅ#׺öÓ©dŸ{î¹ÔÔTF£T*·nÝÚê·ÎÎÎÆ #„0 ³råÊ•+WêõúË—/¯X±‚_låÊ•­Æò´›§888øûûÓIUÄb1:ضϋů¾úê† !.\¸páW@,3†bnnþÊ+¯lÚ´‰Ë/3oÞÚÕúåáÞµjíô#×ê&\ìnG¯ô@ù"ÒÛÊ\¼êlN—%ó´†_nT¼;ÁÿÔÌ!~æ¢~W}2™lÇŽm×fæ‰'žøüóϹdÄÁÁaûöíübƒ úðÃéVVV„@À-<ÜjŸS§N¥Û†mŸ;tèÐO>ùÄÝÝ_lâĉß|ó……ý1""âƒ>puuå—?~ü¶mÛ @_tãÆ>ø ¿€P(|æ™g^zé¥~Úè?Ë­þ'2Œ&¶¿§'„2ƒq¯©{®—±„ÌäôÝC¡×ŸŽÖxàr÷÷³,.ã“1ƒš´úõI…8·)U©MUjQ=ë”a–ækF·¿zŽ€a~z0$òÀ•nî*Ok¸Ã#wnÊ-N"»8ÐEÖñœ¯#Ül¤f¨\¸7Üb€âg+í¼€ÜÊ• ÷A/í×B(@åÀ½ácŽf¡ó :#*î · œ+íl•â!©^‰Ê€{Ã-(Ûòk²j[:úíΫ¥ÕF*î ·>SÉŒƒWÚÍPfU­¸Tˆš€{†è–Ÿ™§5Ì8xååPϼíì-[t†¤ŠÆïÒJ÷”7 Zà^"º'çi /%¤Ô#ÜðØ0@ t @ t @ t @D¨¸»Ø¿M@%@‡(]@€Ð(]`Æ×zÃôÙÃeY¶£-ô÷oÛm '%%¡@—Dü¸¤/G'ܶÊPÚná°,Kß}Àý‹³7寥ïG'.騗›pÅ›ÀíèJ'ø]NøoªmŒ‚Hºïž PZáG$\b‚ènV¿Pøó›6}OøÅp²àÖüwÙ~”¡ðg9iwcGq ºŸÀ-µJ"ú~ŒÒ*(iÛý¤#­Ò“{rÔôéoQB»éI»}RZÁ ²pkþ§J¿HRZå üq: 7ô×(ü%uø+ìÐ2S õË9P/Fiw}âîL‰ÐMîÃ0ý¢+J»Ùý7믥ŸÎ#K (€^ÕÅ(}!›hw$N7gÅä²pûDíníS}:05,Ü]‚¶›ú수.¬;Ó¸`¼Ü,A¿[…§$&ÐÛýëpùiHGÑèYÿ  zhK€*è€.ˆzûd2ÙÀ###‡îìì,•J ! …¢¤¤äÂ… ׯ_ÏÍÍÅi  ÊÊÊêêêÔj5˲÷ð;eF"‘ØÛÛ»»»ûøøàÔ£µÀ}¨]˜˜˜þ¡÷஫««§§§···“““@ðß/z½^¡P”••”––*Šn~àùÅèc–eùX–5™L,ÿG~ùK—.¡½@ß¹¾zõªJ¥ºß»T* EŒ‚Ö÷³¾è­(ÀÌÌ,000,,ÌËË«¦¦&??¿´´´¥¥…eY'''¹\îáááåå•ÐÒÒ¢×ëšÀý)%%%;;›bggçåååèèhiiyo/òÀ²¬R©¬©©)**ª¯¯¿páB}}}DDZ Ü?ú×u ·z ¸»»†††š››_¿~½²²²®®N¥R –e%‰¥¥¥­­­ŸŸ_```IIIfffJJJwTô@€{õ~8<<üþì…QPPpùòeBˆ¿¿?2´¸?õýë@¯ô@‘Édžžžááá"‘¨¬¬ìÊ•+µµµ†_†a±X¬Õjmll\]]E"QQQQuuu«b÷ü=½=z´³³óýY >>>R©ôܹsÙÙÙvvvÈÐZ×>xè•Uxèçç'—˯_¿~òäÉêêj­VÛª ˲z½>+++66¶©©ÉÝÝ].—ÛÙÙ¡ÑÀ}åêÕ«„ðððûü~ØÙÙ9<<œ«@k\úš^ PFŽéääTYYYQQQWW×Ñä&,Ëj4šúúú¢¢¢††___'''´¸¨T*ô¹ |||ìììT*UAAj­pè¤Xn½ò=—&î¹ôö©ìv œ.®›¸çÒS‡ÓzðØz%@‰ŒŒ´±±ÉÉÉ©¯¯×étL ˲¬Á`(**ª¬¬ôôôtpp@s€ûGYY!ÄËËëž§.\¸páB—ÅhUÐj{¯µTUU`ñûV^Z}|ƒêTƒ*¯¡ý©T˨ÌiÑî,QäÔ){êø{e‡ŠŠŠ²²²nN [[[«P(,---,,ФàþQWWGqtt¼µ§744ÄÇDz,ëââ2~üxVlggg›L¦¶Ïurr²··¿3oÓ`0üüóÏ„áÇ‹D݃Ъ Õ=ÛZ!jµúüùóÆÜÜ|РAÑÑÑ2™ìÎqqñš5k!Ï>ûìĉ{ï…X–ÍÉÉÑjµr¹\"‘´û[£Ñ Юî˜;yPêûŠê^vÿèzÙÑÜêWì{¦ÓV¯(´677 †î4nµZ­ÑhÄbqç•Зét:@@ÿ¦5Z­V*•vyCK±´´¼…—;}úôöíÛù[Ž;öÐCÍ›7[^³®®îÝwßm÷é&Lxî¹çîLÍìÝ»·¦¦†>X´hQ'%iUÐjé>ÚÛ_­V …Bggg77·;ó¾X–=räHuuõ¼yó ÐÛ/w;­…rêÔ©;vð·œ?þ‡~xê©§¦L™rª‹[0¤¢¢¢·+êý÷ß×ëõo½õV«Õféo Ã_|accƒ ×ÓÛ×¾ø‚ÚJƒiv€sA£ú—œêW¢úp€Bx+ w¿0Úô_ƒáã?–H$/¿ü²@ ˆ‹‹KLL|æ™gØù_„V7xÝ‘ŸŸOÓ‘H´xñbBÈO?ý¤Ñh>ìììÌ}½¯P(è777þ«èt:OOÏ;S3YYYÇŽ£;6|øð€€€Ž ÓƒìþÝ0RRRøe2ÙÂ… ]]]oÿ¦¦¨¨H*•v2Wcaaa}}½^¯¿5yË­…6.=;vl@@@~~~|||øpjjªÉd’H$“'O3fL7C+£ÑøÉ'ŸlÚ´‰†‰Q«Õqqq)))ƒa˜!C†ÄÄÄp³Ã°,{èС–––9sæ?~<--M¥R<úè£VVVùùù´X–vâ[ IDAT;vìôéÓ[EQéé釮¯¯'„øùùÍ™3çv&²ézõ:ÐÖñüZ•‰=49ÈËZBÙ˜˜÷kNõ?¢}·töJ€’˜˜èááxõêU¡Ph4;¹ ///''§üüüêêjü× ýˆÁ`HMM‹ÅtIiiiJJ í[-•JSRRD"ÑСC{¶‡Ã0/¾øbSSÓ AƒZ…8„½^ÏýùÍZ¢P(ÔjµX,vpp¸3=&jjjZ}íLíÝ»wĈ·YQQa0„Bá¤I“¸ööö“&M:qâ„ÿ4ýñÇ7nÜ0™Lb±888øàªªŽ= ‹ÏŸ?OǘdddЩ:òóó÷ìÙ#—Ë###;: Ü={6%%…N|3qâÄàà`zã}ôèѺºº¨¨(~‘››{æÌ™ŽöÙ •’‘‘a4ùQBttttt4¿d«¹uÊÊÊ®_¿>mÚ´Å‹Óf“žž~êÔ©S§Nñ—€€€„„†aFíââÂå¿þúkFFFuuõ¤I“Ôjõo¿ýf2™yä ¨Tª÷Þ{¯¸¸˜ÛUiiéÉ“'ù³Ì¯]»–ß’sss?¾víZ33³ÎîuE¢ ìÚµ«¬¬,66öÑGí¨dqqñ[o½e4¹-yyy‡Þ´i“»»;Wbccõz=7…êÅ‹g̘Áoä?ýôÓŸþùþûïÓJfYö›o¾IHHà×ç™3g^z饨¨¨ûä"ÙÛ×V5úß²+[ˆÇ ´³¶MìÄvû.$Ö÷² nëÒ×+ʵk×X–õôô”ËåZ­6;;[£Ñ´;ÆÌÁÁÁËËË××W*•VTT444àÿ`èGZZZø÷Téééééé\`qôèQ‘HÖãEÛµlõz=×ãååÅÝ!Óe1óòò^|ñEîmKKËW_}5((¨·+ççŸnwY ºÇÊ•+osÿvvvôûÚôôôðððŽB…B±uëVþ‘$&&¦¤¤¬\¹’ÎüÚÜÜ\\\Ì¿7 ™™™4‡jnnnnnÎÏψˆh·ƒÉdÚºu+w‡¯R©~ùå—òòò)S¦0 # h‡nf‡³gÏ;88Ü™VÊ0Œ¿¿^^^~~þ /¼ðÄO„……µÛ/©¸¸˜¦'O?ý´P(9hРœœœ;wƯ¿þzýúõô$ÒIUè¡Nš4)))騱c---{÷î …Ë—/wppøñÇóòòJKK322BBB!üñMOÂÂÂfΜÙÒÒòõ×_k4š­[·úùùݱpwõöu •Õq™{Ë !ëÿÌý×” ¢Fõ  !“¿žöè°P§ÛêØ+Jnn®¥¥¥··wPP­­mmmmmm- ¹yÃ0^^^“&MòóóS(MMMjµºË!?}Ã03gÎÔjµ'NœJ¥111b±øÐ¡Cf̘1öööVVVw`©T–e·mÛVSS# üqn#„ŽsaF"‘¨T*¥R¹aÆ•+WÒûáÞ³råÊ¿;â0`€D"iii9xðàŸþàèèÈ«X–¥÷o`îܹ~~~ÙÙÙÔjµ¿üòËÓO?Moìia++«™3gJ¥R777¹\åÊggç'žx‚vuéèHôz½ŸŸßôéÓM&Ó¡C‡JJJéÔQQQIII555J¥’æ5*•ª´´”a˜;ÙáñÇONN¦‡ñõ×_B¤Ré¸qãF%—˹b±±±„__ßuëÖÑ÷òÑG¥¥¥;v,**Š«[†aÖ¯_Ï$|ðÁŸ~úéôéÓ>ø ­Òëׯëõz33³v§ ­¨¨¸rå !dÑ¢Et(‡ŸŸ_XXØK/½¤×ëSSS'Mštáº`ë§Ÿ~JWÌ tttܵkןþ9þüN?bYV§Ó-^¼8))©©©éã?Þ²e ?ýᄇ‡{zzΘ1Ã××—2pà@™LöÙgŸ577›L&þy3fÌòåË !þþþ,ËþþûïB¡ð£>¢s¬¬[·Žv £yÁ`8pàÍ{ì1º‡W^yE©Tž>}zîܹ÷ÃE²·¯­lð†Þ@±4B<­,òüÕÏËÍÊâ6wÞ[—ò’’’øøø¢¢";;»Ù³gÇÄÄ :ÔÓÓÓÁÁÁÁÁÁÏÏ/**jîܹӦM ²±±qvv¦ed23€þÂÚÚzøðáÁÁÁ Ãøøø„††9;;3 3jÔ¨¡C‡Ò[²Þ¶oß¾K—.B–-[Öv_¡P¸zõê]»víØ±cíÚµtR¯¾úŠ[V¶ŸO?ý4ÇQ__·mÛ¶wß}÷·ß~ã@-))©ªªbféÒ¥ÁÁÁ¡¡¡t Õ’’þ$Œ–––/½ô’¿¿¿‡‡‡@ °²²¢ÃL\\\d2™­­m'GâîîþÄOØÛÛ;::>óÌ3vvv,Ëž?žbggçèèh2™nܸA çææ ºýŽÕ•™™ÙæÍ›-ZÄ%*•ê?ÿùÏ;ï¼óÞ{ïiµZBˆV«½zõ*!dêÔ©´kÑhd桇"„566r;>|x«£F …•••t¾:¹ !dÊ”)íÆôµÌÌÌø«äXYYmܸqݺu‘‘‘,Ë^¼x‘fccC‡eÙèèh±Xl0 »|ãb±øµ×^#„455íܹ“ÒjlÃ0 ,X¹r%÷Q5\-µê;Æ?Ô°°0Ú<¸óÈ0 òC•——7551 3vìXº[£Ñ(•J'OžL¹téVê ÎÌ|l¥>¶R'K3BˆX( ?úØJÍ…·€ôVT¡P(ZZZ¬­­‹‹‹X,–Édõõõ†eYkkk[[['''©TªP(Äb±D" Õjµjµº  @¡P´ÛÉ *++cY–~Ín2™***lmm%Éyõÿüç?‡"„L›6m̘1ü;Ãx 00022’ëeðæ›o¾ýöÛt‘סC‡öëš···_³fÍõë×ÓÓÓsrrè öÕ«W¯_¿¾|ùr'''z[aggÇ_ÕØÇÇÇÖÖV¡PTUUq·Êr¹¼Ý¯r»scÍïš1~üx:eý1""â÷ßOKK1b!äòåË4€¸]“Z%Ó§OŸ>}zCCCvvvJJÊÙ³g !™™™~øá[o½Å øê«¯¾úê«VOo5P íÒÎvvvr¹<+++99yÆŒÍÍÍééétV”v‡VlXXX«jç2–eiÆ—œœL3¯[85„__ß¹sçîß¿?!!aĈƒnûÖNœ8_WWGG½µó,ñWó±´´$ÿ;ÍP»‡Ç²ìªU«ÚþV§ÓaìE¿Ó[ ˲z½>%%¥¨¨È×××ÇLJæñ4V©TõõõyyyUUUÍÍÍS§N2dˆL&£ãÜŽ=ªÑhZZZО /cYöÈ‘#ÍÍÍt¶Ñ„„„¬¬,ƒÁ ÓéêêêöìÙcee5cÆŒ^½O>wîÜ®]»!cÆŒY¼xq«ßŽ?¾íS|||\]]é1ßèš)C† !„(Š„„„«W¯šL¦ýû÷Óфک„ÿ,zc¢T*oön¼-@0pà@þºúRQQY#$$äĉJ¥R$•–– zÀw…Mdddddä¢E‹>ÿüó7näää466v´ÞfA 𓎶ÕÅ0ÌäÉ“³²²è(žÌÌL½^ïäääááÑÉÁØÙÙu2CP»Ÿ:#„Ñhl·cK»fÏž˜˜XQQ±yóæ?ü›Ð„b2™þþ÷¿ó?4¸iµ–eùÍÞ2ºÿôýÕ¯û©Í bójZmücÞp Q_íB›—J¥ª®®6 …¢¨¨H*•ÒœV«mii©®®¦óž$&&ªTªaÆI¥RŸÑ£GK¥ÒË—/«ÕêNò<€»Ë`0¤¥¥qw’ …B¡Pp¿ÍÉÉ …Ü|½!--mÛ¶m„°°°åË—·º3‰‰‰füøñ­Ö+éÎÒ¼·ïóÏ?¿páB»¿9räíO‹`45¹¹9wcokk;gÎggç'N(•JnˆDÛÕ*è—µ/mÛý…BÁ-yKŒâââB÷O'ˆÌÍÍÍÎζ´´4 ^^^LÞÑãŒF#]xذaüPÀÊÊjÁ‚o¿ý6%Я½öÚ­uM:t¨……Eeee]]Ý™3g!111U2=—/_^´hQGeè!͘1cáÂ…·S üöÚk¯½öš^¯ÿàƒ”J%÷Š………4=™7oÞ¤I“$‰P(,..^³fÍíW;mc[¶l¡¸ÜŸzû:ÐV­Z§4Ÿ q#„T*u믗=ä(3ö@\Õë³h4šòòòòòòNšrjjªR©´¶¶öóó³³³‹ŒŒ433«®®®ªªâ&àèkÄbñË/¿ÜØØøïÿÛÚÚzÉ’%b±xß¾}eeesæÌ¡_¼÷ÞÙÙÙ~ø!!$00põêÕm¿ÍÖjµ;vì0tª´´´  àÔÏüùó“““Ûþ=/‰æÏŸûû‹‹KLLtwwî¹çøÛùã,¸·¬V«¹AUuuu ô/¦[¦®Î ˲iiiüN(tæsssnKTTTnnnZZÍ/îØêÅTUUÕ§Ÿ~Ji;s0Z‰DâêêZPPpêÔ)~€ÒÒÒ’žž.‘H† Òy§ ©T:|øð³gÏ&„lܸ‘¶ON÷믿feeÑC"„ÐÜ¡©©éŸÿügss3=}Û¶mÛ¼yó_|AOh÷7ŽÎüÊçééI©©©¹rå ¤“ðí·ßöÈÅ®®ýÕW_]¼x‘Ö^zzúš5k¶lÙBç¾ôöu ­•‘>ÿš2˜òí•’½åòõ³“öÈžûÄz7F£±¡¡A£ÑH¥R±X`eel4íííéjö}Sii)!ÄÛÛ›ÞÖÕÕ 0€ßû Ç±,ûõ×_ÓF£±ÕXnÈÃ0Ë–-[³fÁ`ذaƒ………L&£+¤BV¬XqòLŸ>=99™ÞStÍÚÛzîܹêêê„„„S§N9;;«ÕjÚ¥‚a˜qãÆBD"ÑÌ™3ýõײ²²M›6ÙÙÙÕÕÕѧ?òÈ#®’Ë剉‰eeeï¾ûnHHÈܹsÛö¿ wÅ,Ë|øðáÃR©”›TõùçŸïÎ`4¹\neeÕÔÔD‰‰‰á×X«J ¼üòËëׯ74 äøùùÑ%~ÜÜÜæÌ™óÛo¿edd,_¾œÿhÐEv::rþ'‘¿V·ÅÆÆæóÏ?§ýP¸9hÇŒ³yóæ;9 N_Ѓ×s% 3þH)é¯qˆq åŒ?Òß8›£6üwŠ_­ÑôÒÉ ‘ð£‰A=8U/Óî¥ö®‰D ·pj†éí…lz)—áÚÆÈ¡ú¸¼¼íG¡JÛôäB©âí´’Eî6¾Ö’Ìš–ôÚ–µ×J»Ýk !Äh4ÖÕÕ9räÈ‘#øîmööö*•ª¦¦æÞîÏÏ-·Ñåwït8LDzì7ß|C‡Y[[w²* Z ÜÛzö:@3”Ÿ²«Z¥'„ÝéåBv—5ìþ%¹‡ßÎ"ÀÝâîî^RRRTTÄŸ‚ážÔjõÜŽÑj¹—Þû!C …͸q㺄ָtó:ðz´ßŠÞ–âÖŸ©µcå«¢Z/í.뉽 Ü5>>>W¯^­¯¯/((À]qAAA}}½T*½—ª‚a˜ & µôÆu mzBq”š;öÎx)NÀ]J¹|ùrUUÕý\UUU—/_æ*ÐZ×¾ ÀÝäãããïïO9wî\AAÁýY çÎ#„øûû£oZ à:Ð7¯B¹\Îýp×—1î)ü¥ŽÛþÈyî¹çÐFà®sssÓétuuu•••UUU,ËŠÅb±X|Ïü}ÞÑíJ¥²¬¬,--fþþþhh-pÿè_×Ìp÷EDDØÙÙÑ.êëëï··/•JCCCÑ÷­îg}ÿ:€ Oðñññññ)(((++«««S«Õõ¤¾70 #‘HìííÝÝÝ µÀý©] ô¹cÔ µô5˜D  Pº€  Pº€  Pº€  Pº€  Pº€  Pº€  Pº€  Pº€  Pº€  Pº€à¾VYY™ŸŸÏ²lŸ=B½^Ÿ‘‘ÑÐÐÐý§455eggëõzœ_è)"TAª¯¯ONNÚ½{ÏéMMMR©ÔÏÏïñÇç?ÞÙÙù–w[SSSSS£Óé!@*•z{{‹D}èÜ•–––——B¬­­Ñú‹¢¢¢U«VB–/_>yòä>x„,Ë~ôÑG©©©æææ;wîìN³×ëõ/¾ø¢Z­1bÄßÿþw†ap¢àö!@é1þùçµk×\\œƒƒ[XHt:m]]ÝéÓ§**ÊÇ&Ü\—“É”žž®V«ù5M}}½«««§§g_«£ÑxŸœîãÇ=z´ûåg̘1mÚ´¾ö.4 }@󯾉ö=1 jµZ&“uY^§Ó BHII ˲P G @é ñ¡¡¡r¹ÜÅÅE"‘hµÚšššüüüŒŒñññ:.22ê¦v›••Å¥'–––"‘H¥RÑ ‰ÄÁÁ•W˜™™ÝTè ‹ûà»Ëå ,P*•<òH߬g†a–.]zîÜ9__ßî¤'ô“ò·¿ý-;;{ìØ±7Ytx{ÿWéûGÌŸ¬>fY–ÿ€eY“ÉÄòðä—¿téRR}}ý¾}ûrss òŸ7ož••wÛÆ²¬V«=tèÐ… çŸþy[[ÛnÞÔiµÚ«W¯²,+‰BBBÌÌÌèvn¼ŒT* é '…;$¹\nggwŸ|x:ôÃ?t§äâÅ‹ûlBÝ(= ))éòåÔaÆ-\¸°Õ—ä ÃXXXÌ;W­V={6)éÒ„ -,,º³[:é !ÄÞÞžKO!õõõÜà NUUUee%¼ ìííÈ/À²l^^^ss³Éd"„ˆÅbGGGWWWú[“É”™™É²¬»»{yy¹F£aYV.—Ó9MX–ÍÍÍmnn¦Ù“™™™««kÛþ/&“)++K©T²,+lmm½½½ïÕóþðÃBºÌPº“ž\¾|ùÈ‘#õõõæææ~~~111­Æg©ÕêØØØääd“É$‘H¦M›6~üx.ñ¬¬¬Œ•Ëåaaa±±±YYYîîîÏ?ÿü/¿ü²ì¼yó,--¹])Š}ûöY[[?öØcàÀõõõ ,J¥\™k×®:t¨¦¦†2pàÀ™3gúûû·jKññññññJ¥’a˜ÈÈÈ9s昛›÷F=geeÅÇÇ6,*꿸***:”‘‘A±µµ·¶¶¶¨¨ˆa˜‰'¶=ƒÁð믿BÂÃÃ׬YC'ë }ýõ×óóó;^UU•ššJyóÍ7ÃÃà !ÁÁÁ¯¿þzcccvv6×HZùóÏ?¹<¢­×^{?B§#,ËþòË/´•îØ±ƒþþþÎÎÎûöí;~üøÂ… ;Jp„Bá|@Ç”ùùù‰Åâ#GŽšL&¡PxöìYšRqe¼½½ýýý7mÚÄ߉‹‹ËèÑ£CBB¦L™B·¼ÿþû/¾ø¢Édâw(ЉD¢Óé¸)KÚ¥Õj5ÍÍNáææfiiY\\Ì­Åc4éX›ÊÊÊ   ¡PÈ­Ë#“ÉÄb1= 333;;»ªª*ƒÁÐØØhgg×j¬N§\—>WWWþ-(ý¾an£ÍÀõz}«1ÜŒ*„{{ûââbƒÁp?¬#ûðÃ_ºt)33“þÐÍYc›šš!¥¥¥GŽ?~¼L&“J¥«V­âò‚ÄÄDBȰaÃlllh¤"ÆŽûã?êõzºð-leeÅŸšâëëkccÓÐЖ–F˜$%%FvÇÚ7551 ³dÉnªc†aÞx㪪*ÁÐôÄÜÜ|È!\w*___77·òòò¤¤¤ŽŸˆˆˆvǯµ´´xxxt§ºt:]ZZ!déÒ¥üî³fÍ:t¨……EGé M‚¼¼¼¸ÇŽ{äÈúY–=þß{ˆ¿ü%fΜùã?ÆÅÅ7ŽBÇïL:µÝ¥ èìÂ2™¬Õɵ±±¡é !„¦uZ­vþüùO+#GŽ9rämV2]B‹a˜ÀÀÀV–‹;jÞžžžüg«b´B¢££ù†6l?@!„\¾|yÿþýeeeÍÍÍÜÆ›ý\@¿#@ܾ… ÕÕÕçååuÒ‡?//·¤¤xìØ±·¶R Ã0ÎÎÎÆ sww§÷J¥²;£è­Ýõë×kjj C÷ÇµÚ ¾`ï VVV_~ùåÔ©SéiR©T o¿ýöçŸÎÍGÓn{ å¹Ù=¸h£•Ñ£G …¬¬¬–––ººº¢¢"¡P8jÔ¨NI"‘ts¥m>:-)Ÿ^Â0Œ@ à¯+ÔM„;ü·ûñá|÷Ýw7nÌÌ̤é w"àž×c=P#""Zu^(++»rå íç/•JGŒA×Äå466&%%©T*z£2tèÐV# t:]JJ ]NµÏ?~|iiizúõß~ûmΜ9b±¸ÕmXBB©S§´Zm@@ ÿŽ·s …¢®®N$yyyñwèîîÞÔÔÔÜÜÌ0 Ã0´×=üQ6|J¥’233sww·¶¶633Óh4×®]ëfž¢Õjõz}÷ºO&“-[¶lÙ²e555YYY{÷î­¨¨8}úô<ôÿÙ»ó¸(êÿàŸÙÙ]–Vn•K@TÔ T(WW׎;&%%%%%•——s×½{w¡:‰ú]ùùù%%%NNNU.CÓ4­[·þì³Ï(ÏràÀ;vT÷îŠ+ºtéRãJhý)Žãnݺջwo FþíqqqâJ(<ÏÓC”F£¡=ìöíÛ÷™gžqvvfYV§ÓÍš5   R+r¹üõ×_¯ò᳋‹ËÑ£G !3gÎ4ªuOuíÚõ‹/¾ „ :TÜÿ¥`ðàÁË–-3ßÃHÓjݺuXØàãÇ_¸£ÕVvêèáá¡TÚj4•999))É'OF%$ÄÛÙÙŸ={¦U«V®®®µi⑟Ÿ_XXH±³³3ê„•>K§Íìììh‡£ÅÅÅâeŠ‹‹óóóY–m×®]qq1M”øúú 7Ït”œ†½½}ii©Á`ÈÊÊ¢ƒÂÒ»Í+W®èõz''': r-•––²,+ÞU4V«÷¥Âó¼Ðéi‹—–––——ççççêêêæææææBoÈ5 Ã0;wNJJŠŠŠzê©§„݆çùØØXžç{ôèa”µ4Â0̈#’’’~ûí7ZˆFŒQ]e"OOO:4ÏÉ“''L˜ Ìß·oßž={† 6gÎÚ¶(??ÿÞ½{âŽKþúë¯ÒÒÒN:Ê$úñ©m©T#¥Réáá‘’’ràÀ^½z ȵk×–-[æéé¹nݺ:T a&$$$))éܹs'Nþ.aŒ$*''G£ÑÐá„=öÞ½{t&N'H ÔÌÛÛ»ºªû4" þb¤S§N´Ç*Ó+ô–ÉÛÛ;99Ùš·cPP°N§;qâDLÌ…{÷îyxx(•J¦2''ûÎ;ÚÎÎ.??oïÞ½¶¶ÊÐÐжmÛÖ˜CiÕªM ¤§§«ÕjÚƒCEEEZZ½U(´JˆJ¥*,,ÔjµýõW`` T*ÍÉɹsçŽÁ`H$^^^öööt#gffÚÚÚÚØØdddäääÔæOóððÈÎÎæy>;;›âããSQQ‘ššJ“8æÇ2rûöm:茗——‡‡!$777--âèèHû°¨¬¬¼zõªÁ`ËåAAAͨÝP~*Ïóëׯ¿sçŽÍ'Ÿ|âîîN¹té­Î@û[4hÐþýûKJJV®\¹hÑ"‡òòò¯¾úêÌ™3,ËnݺÕ|…Ò£G…BA;¸•Édݺu«nI;;»>}úDGGÿðÃJ¥2<<Ü`0ÄÄÄìÙ³‡î ´ÀªTª’’’wß}7""ÂÇLJ㸣G~ýõׄeË–U—@?~üˆ#ªÛtⱄÌoäqãÆ­_¿þÚµk7n|þùç Ejj*+§U«VuNd„……íÞ½[§Ó½þúë/¾ø¢§§gRRÒ÷ß/^ÆÕÕ•&˜:4qâD©Tzýúõ÷ß'$P,pëHߢM̶ƕX3‰DÒ»wŸöí.^¼xæÌéãÇWTT(¶žžC† íСÃùóç~üñÇ;wîlÚôDÖÍÍÍ| ww÷üüü²²2ƒÁ-‘H„; -!Äßß?>>^¯×WTT\ºtI<¶Ž»»»T*µ··gYV¯×———‹›$ˆ‰×,Ʋl›6m²²²!ôgüÿÞ#•ÒawjÙH¨F$T7¨¬¬4CצÓéôz}3j4Ô¯_¿«W¯ ™‘Zœ™3g®\¹²²²rîܹ®®®´—_Bˆ··7M)zzzNš4iß¾}‰‰‰³fÍR*•´É!dÊ”)µÉ;išŽƒcÚ£ðÌ™3cccÕjõÖ­[·nÝ*Ì—Édtô©T:þü•+W–––¾öÚk¶¶¶BÕ’.]º˜ÉÎÈåòs=µzêÔ©Ë—/GGGÓ?JðÔSOÑ¿ºÙ •JµhÑ¢U«VqGëÄ ™:R!D©T¶oß>11qß¾}t4exx YKrrr4hТE‹?ùäÓÍ›·¬_¿~éҥÇ7îñgŸíææVXX¸}û¶ßÿ]¸+3£K—.®®®BþH¸-´±±éر£ð¨Ÿv#t«Io‰¥R©‡‡mt#‘HÅý×Ò^iÅ7´fRÞÞÞ¾¾¾FÏöííí}ôQ:SXÑ24C$ü~áõ•„ ,„ ý”\.¯ýX6Ö`øðáO?ýôƒ~*((hùòå4•ŸŸÏqÃ0&LøðÃ…üÚ”)S^{í5 š=qvv^°`Á“O>I 93鉡C‡Ò@sL“⥃ƒÃÖ­[û÷ïo”Ú²e‹0lpPPÐG}D3Íž°,;uêÔ÷Þ{¯!r´±Œ°3Ða•Ÿyæñ2íÛ·_»v­P‹¶ÿ~ ]ƒÑö¡ÛS<³gÏž›7o4h——W@@@xxøW_}5mÚ4q©yë­·ÄÇÎÎnùòå}úôAË-Þ¿n¨ê|àãã³hÑ¢*ߺvíÚæÍ› !k×®­ršÊÊÊÅ‹BæÌ™S]/’}ôQFF†8; ž¦]ôù3/"~)^Þü ¿–Åq\NNιsç¶oß–““ãçç7|øðQ£F{{{׿ã999´úÃ0NNNÕ A¢ÑhÊËËéÍ¡¸W­Ïb0ZµjU‡pÑ;üú´•hÙ~ýõ×ï¾û®k×®ôÁÒÒRÚrÇÉÉ©ÊÐð<_TTÄó¼T*­2¸–¥V«irÄÎήº¡£JJJôz½D"©ÛîTÿ2Eûý±±±©Ã ÞºuëÚ,¦P(Ä 4L •êæ!騵>ƯR©ê਱1Í5Úbkk[c7Ç1_¦ªëo¥îܹ³lÙ2BÈÌ™3ÇŒÃ0 Çq‡:þ>ž>ŵµµíÕ«—i ”¸¸8¡Ê   OOOñZ­öâÅ‹â´K³®VŽã¸‚‚¹\®Õj‘:Ê2÷2™lñâÅÂÐ*b‘‘‘üñ!dæÌ™;w6] k×®›6m"„ 2dܸq¦ >>UfO!BÒDaÔˆ0¿Êô !ÄÎÎŽŽÅ Ð$,“@1Óö‡¾Å0LuËoÕ¸€&!Á&0Ï2 ­V[Ý[•••„žç«[F«ÕÒ.]é’º~€†f™Ndïܹ“’’âïïo4_§Ó;wŽNŸ:ujèСFqxž?uê>wî\‡d2™ÑJRRRîܹc›ãø<œz÷îðP±Ø0Æ„¶mÛ cœ——WQQ!¼trrR©TâJJJ …—J¥ÒÍÍM¼€V«ÍÊÊϱªaŒ‘@y8!ð°±d¥qXU*F«Õr×hßȲ¬\.W(ØøMKj©¹¹¹uïÞݨʽ{÷âããéÁE©T†„„˜Ö@¹xñ"­¥Â²lPP‡‡‡x­V{ùòå¼¼<„ šÁ`(++kÌÔ ÅqœZ­Öjµööö †h2–I Èåò×_]©Tš¾õûï¿9r„2kÖ¬N:™.Э[·Ï?ÿœ2lذ1cƘ.0dÈeË–¡YhBM’=pWVVfô@“eò—ÞÞÞUfO!BÒ¤Êì !¤cÇŽ´éPu (•Jooo„ šŠF£iÂì ÅqœF£A,šŠej ˜é<…¾Uãµ\Æú¥¦¦fff¨Õjqw-`=†±µµuqqñôôôóóCÜ}ÄqGÜwDÑGÜ÷YIx­V‹ÎPšŠ›ÀRRSSÄ£uây¾¢¢¢¢¢âÎ; >úh}N±ˆûÃ}Äqí¥Zv©7ÕäÕO¬êg<œ,“@1“Ž­¬¬¤‡3­VkÔŬðYšË§K>èú­ÄŸþyóæMBˆ³³s»víÜÜÜìììšQÅ™‡íäZ^^ž———žž~ÿþý˜˜˜û÷ï÷ìÙqGôwÄqGÜ}DqG©¨ ¼¨ó)¡¸¸¸cÇŽÎÎΦ‰ÈÈÈÜÜ\Bˆ\.÷÷÷7ú žçOœ8AON•••ݺucYÖh%ÉÉÉG}У§™—‚çŸÞ²Ù“îÝ»wïÞÝÉÉI.—ãüjµ†‘ËåNNN¾¾¾ …";;»  @«Õ…¸#úˆ;⎸ãhè£Ô#îa©¯Žõt>bkk‹p4ÍqfäÈ‘õO PFuLrssÅ•M‡1¾ÿ¾ðR©Tº»»¥`îÝ»W]6„Nó⎸#îˆ;¢R¸?´¥Þ Ô@ 6A}¤¦¦VTT8;;7DGßÐhüüüœ+**RSSwDqGÜwÄÑG©GÜÎRo)'îÏþ#yöÉ'î½u§ø¹c·Ÿ;vÛô-°~H ÔKff&!¤]»vð]<ϧ¤¤5h‚ÅÄÄÐZ¸æÑ Ò€ZUÜÁz¢¸#= ÔCË.õQªåæžÏ0ƒæžÏ(Õr¢·ôsÎgp<ÏñüÜó%•zÄ yÁ0ÆõRPP@qss{ OiµÚ””½^ß®];‡*—áyþÖ­[ǵjÕŠv|uâĉmÛ¶1 óá‡zzzbã׆^¯ß½{7!$$$D*5··Ó Ò€6PÜÅ£¢¢4\.oß¾ý€ªÛ¨ãÇoÛ¶­}ûöË—/—H÷lšè×'îÉÉÉâÑÄôz=!ÄÓÓÓ´ïmh1qç8îÖ­[<ÏwêÔI\lyž¿yó¦N§3=¤§§—””xxx¸¸¸Xjƒddd,]ºT&“mܸÑÞÞqoœ£}QQQVV!Ä(úFt1s1`Y)))ï¾ûnËÛ¬¤ÔÓ"¯×ë½¼¼M¯ënܸQÝ»`=¥Þ"’‹Õ¹œa~°!ä×c·“‹ÕÁn—¸›Eš\ÎðjP[ž_'ß.Öôp·G4@yXÐ>\ìììèSiii+W®$„ >|æÌ™U.“••A¡(ÿ^xÁÛÛñjyqÏÏϧ‡úeË–uêÔI˜Ÿ››»bÅ BȘ1cžzê)a¾Á`X½zuII‰ÑüúßcÐ•Ó Ä½qŽö'Nœøé§Ÿ! . ©r™óçÏùå—æ—©3žç/\¸ ÑhúõëgÔÁËÛ¬¤ÔWVV®^½Z§Óyyy­ZµÊ(qvôèÑo¿ý¶Â£½K}=}ýWöÁŒâA11122òþýû„öíÛO˜0Á¨Upiié¡C‡Õjµ££chhhhhh“÷Óaú8‚>¬=ztþª³gÏBT*Õ¬Y³„-ìââ2kÖ¬‹/ºººòù¤ÑP»<ÏÇÄÄDGGBüýýÇŒ#αFEEݾ}{üøñ7oÞ<~üxaaáœ9sh›Áæ[¨›{©¼r¹Ú‘æ]Æ H @äææ¦¦¦ˆO–Bµ^±âââ“'OªTª1cư,«V«þùgNg‰¾‹ IDATtvóæÍððpáZíôéÓÉÉÉÁÁÁâ»å7nDEE1 Ó¹sç¿þúëØ±ctþõëׯ_¿®P(ÂÃÃY–¥M{Nž<)|033óÔ©S¯¾újŸ>}„¯£}µ $&&nß¾}Ó¦M …¢©¶j^^^•Ï"öìÙÓ«W¯útþZz½þüùó„qãÆ±,[VVF¯‡T*Õ Aƒ TãRRR^~ùeñÖŽ‰‰yë­·„»âŠŠŠ·Þz‹6 ¦îÞ½{üøñ—^z)44´–»ù§[q5¨ììlz5¶`ÁqvïÖ­[?þøãûï¿ïëëk%eÊ:£_6mÚL›6íÛo¿MKK»ÿ¾««+!$::šöŒ .׿ýöÛÚµke2½bÖh4^^^C† '^>,“É&OžL9pà­1.ì ±±±!!! ,h‘Ï?­3îíÚµ“Éd:.33“ç3224‹‹K§NÎ;G(<Ï_»v"(##cÙ²eâÞsnß¾}äÈ‘eË– Õ j³Œ‘ýû÷Óî9ÆŽK÷(ë<’·˜ò~âĉI“&‰ëx_¾|¹Ê…«,þ‘‘‘+W®¤™µÏþ4Ã"ô—yæÌzô(z½þÕW_5 ÷„ &NœhÍgöæ}—É“'ïÚµëäÉ“C† ñõõݸq#!ÄÝÝ}ذafb™™ù×_…‡‡?ýôÓô  Õj.\XTT$>’Ÿ:uJ8§ó<âĉäädñ¥Ziii³.Ô- ÔOkãà¢Bî”UB¼íÿΉŸÈ.ÒæïNâ·ò5ºÝÙe¸'h.Є§ÉøùùÑóßÄóSSSsrr¤R©Ñ5m#­P(èiU"‘õV‚‚‚–-[¶hÑ"zRš6m=åGGG7á¶Ý½{w•=ä ¶7 ­V«Ñh†iÓ¦ÍÆ_|ñÅ%K–,Y²dîܹkÖ¬©}3õ &¬Zµêé§Ÿ¦/·nÝJë5ð<ÿñÇÓìIXXØÊ•+_yå²M›6¥§§×r—^Rááá/½ôÒÀ !¿þú«F£aYöÙgŸýøã,X P(xžÿþûï­§w[댾 P(Çݽ{—RRR²}ûvBHÛ¶m.\¸råJÚQN^^Þï¿ÿNQ*•=öM£ˆ†Ð„×!C EQQÑ?þH ^±bÅêÕ« @¹xñ¢°'´0ÖwBˆð°ô¯¿þ"„<úè£cÆŒ!„$$$П}ÿþýüü|–e…^®*++#""hµÿçŸþÝwß9r$=GЮ(k¹LuÙ“ &L›6Ög´Î#y (ïaaa^^^:îÏ?ÿÏ?sæŒN§ó÷÷§9kAJJ …Ýüùóßÿ}Zr333ׯ_OË{g†a,XðÒK/B†yî¹ç-ZôÄOý¶Þ½{GDDÐÃ8=¼[ù™½EôèÑ´¦É¶mÛ~ùåš™?¾¸ºqFFÝή®®‹/^²d -ûG޹pá]Føìã?¾bÅŠE‹ÑžþÅ탄7˲ӦM{á…|}}›u¡ngùi½â1ŸùLpàJ§W<æÓEe#LOéà:µÃßo=îcšÔ@iºÜ•D~æÌ™K—. µ:é=RXX˜§§gmÎs¡¡¡sæÌ¡Y•uëÖ-X°@§ÓåååÕr¤žÖ­[»»»ûøø$%% uôzý/¿üByâ‰'&MšDg>òÈ# ,(//ŽŽž8q¢^¯§]Î;—V:;v¬ƒƒÃ¹sçš¶MǼyóæÍ›g…§×¦ëÖ­£s\]] 9Ž‹Ÿ;wî¦M›jì†F¨oâãããìì¼~ýú‚‚‚ÒÒRGGǬ¬¬¤¤$BÈÌ™3‡Nñ÷÷ ¢!Û»wï¢E‹è3 Ѿ}{á>Ò5jÔСCéÎãââ²wï^«DÆ:£o†Q >‰DÒ·o_Žãžyæ:Ψ¿¿¿V«=~ü¸Ð_Æ!CNžh%‘!{BÑŠÁ'OžŒ­¬¬¤K–,™>}:zÅ«3¹\.>ÜÞÞ~Μ9/¿ü2½æ8Žçy£fó¾¾¾ŽŽŽÇÑ B.]ºÄqœ»»;MfÑèèõúmÛ¶åääоuf̘±dÉZ! }ªœœœ¬×ë‹‹‹ï޽˲l@@€T* äy>11‘BÿïÙ³'½•¢cÐB‚‚‚h¬éžÐ¯_?™L¦×ëÓÒÒj³Œð38ŽûöÛoi«.ñÍ3} Gò¢Óéú÷ï/“Éhs]:3))©¤¤D&“õêÕK\÷P«ÕÒ=uêTñ±}èСvvv<ÏÓVŸµ<û 5MŸÕ³,K“à”³³sÇŽÉ?É\ìÑ¡Cá\,—ËiËJAee%õˆ#X–¥…—aÚ×Xzzzqq1ÝìóæÍ²'ÇI$qQ8[Š 4(Ô@i2ônvüøñ›7o>pà@xx¸T*¥Õzé(§W®\©q%,Ë:;;7ÄÏ£§[žç_ýuÓwµZ-Ïó …b̘1?ýôSJJÊ{ï½G èׯßÀ[Ø€>–¥R©–.]JѰ,;qâÄ¢¢¢'N$&&rgTA¬ÊË&£5Ïñóó#„VTTжZµäîî.~É0Ì„ >øàƒòòòõë×BÚ¶mÛ»wï°°0këX¤y©¬¬ßÑDÕ¾}û®^½ZPP îwV ‘HF޹{÷î“'O<˜BÛï 6Œî?~~~~~~©©©§OŸ>}ú4Ã0AAA  O5±Í“§§§]yyyNNN~~>m¸¡R©†éß¿ÿ•+WâââFŒO:”%„ÐΆ.^¼8}úôêÊ{m–Î8§OŸ&„( š´àHÞ  …BѧOŸ3gÎ9r$ @èælĈR©T\ÀéU˲4ñÿjR)­%šžžÜÐgì–2yòdzQ7{öl£nG„ç›7oÞ¼ys•ׇT||ü/¿ürïÞ=¡Í1©·H1ÚĦõÁŸ™­dBHŽš#„üœòw‡D 5/¿M§s5!ä§äBH±Ö€ÐŒ JëÕ«—B¡())ILL4 ´Zïã?^Ë›žç«¼¿j8ô"ÀÞÞžþ &¼öÚkÂ3íÛ·oûí·/¾øbFF‚kÄ`øû9`À£}NE㘿¯ñ[L/©é¥˜iß™.ߥK—U«VÑ—YYY¿þúë‚ LG݆Ú+..¦‘¥…«  `Þ¼yÇÏÍÍ¥¥[©Tš~Š6HKK+..¦íwX–zwffåʕӧO§Ãôð<åÊ•Ï>ûláÂ…´r 4¹\N›Ý%''_½z•öiCªN:±,›œœ|çÎÂÂB©T*®ä_ec+†aè½M§Öf#ÆtÄtÉTxx8!$66¶´´4777))I¨Re«ËtÓZ pöÇþ`©²OKbí[ÍÜÑ‹„ï¾ûnÍš57oÞ¤Ù¡hWy5ˆ Z·{z~94àË¡sººÏéêN§¿â¤¦çtu韷–ôôÀFhFP¥‰)а°°C‡?~ÜÆÆ†Vë?„´L˜ÿ}»N+všG¯ÌX–ݰaƒQó#={öìÙ³§V«ÍÈÈ8þüáÇ9Žûâ‹/V­ZÕTϺ?û쳘˜˜*ßêÛ·oS5µµµmݺuzzzu‰Œzn.z~ùòåÿþ÷¿â‹rÚÚÅÅE| W‡]‚òññyã78ŽËÊÊú믿vïÞ­Óé¶oßbÚÌѯ½{÷r'“ÉhïçÏŸ§}‚¾òÊ+´>˲4jáåâââë뛜œL;¾á8.00ö‡"ìN£G=ztiiiZZÚáǯ\¹’——ùŸÿü§åK­6î ÃôèÑ#66öرc÷ïß§µè[ÎÎÎîîîtS:¬’x\jšr3fÌSO=UÝ-SˈƼyó¢££ãããwîÜÙ®];£1­­ðHÞbÊ»ŸŸ_Û¶m³²²âââh¤C‡FUü„ˆs—––&Ô4¡hO¢9 y³ØšËÑÞ4»!œèÝ»÷ôéÓœœX–ÕétsæÌ©ÍÓ”æ[¨[ÞYZÔ@iz´¿Ï?ÿüsåÊ•„#FXp„9z’ÎÊÊÏ9~üx• ‹oì[·n-“É8Ž£cF233/\¸’’Bﺯ\¹rõêUžçåry@@ÀÓO?M›ÖWVV ×oêÔ©F !k@;iªû(ztòäI£«Ÿ#GŽÐ»©úôîF;ŠËËË»sçŽøºV—Ëåô‚év £KÀëׯ_ºtI«Õ²,ëåå5räÈwÞy‡TÓÌÑ7eúððàÁƒôB0,,ÌÖÖ–çyš:thïÞ½mllè€â7oÞ4Ýèx+G¥á>|¸pM\TTtéÒ%ZNºuë¶hÑ"Ú˜«öã=5/Ö÷Ž;²,›’’RTTäàà ôðM[ñð<Ko“„Ô'Ã0´DŸ>}Ú¨%ÎÅ‹cccµZmm–ï{ݺu›?>­Ý°fÍa˜[«=’7÷¸‹Këøñã !_ý5«Êz¦¶¶¶mÛ¶¥…Z|ËššJØtãõ çf´?4‹èWIˆµQýͲ²² .$$$ð<Ÿ››K‡½›5k–««+=}deeц{-&ˆUÜ ° qÏ F]»Y À !äûï¿¿uë!¤´´ô‹/¾ Ï²ŒÎµô^N­VÓë6‡îÝ»B6oÞ|áÂ:311qéÒ¥6l8þýôSºÃpGoü†©òjÑ7’•••———›››——wåÊ•·Þz‹Ö+‘ÉdôÒ–aÚä¹sçîÝ»GƒøÍ7ßÄÅÅ™®-88X¡Pܼy3))I&“ õèEùºuë–-[F»&%„dddÐ{°ê§±æ¸»¹¹ ¹Ñž={Š ‹8jâiB群¤dõêÕ´q_EEÅ_|ñÉ'Ÿlܸ‘–ÁÚ,#dU´Z­ íA¯×¯\¹’ÞZ[푼¹Ç]Œ6×¥Ó*•ªÊº$ ÃÐ*ñññß}÷ͳ߸qcÅŠôSFc›'Ôg‰ŽŽ~ J3ÚšKôÍÄ:..n÷îÝ4XÙÙÙï¼óΆ vìØÁ󼫫+áþ?þ ¼qãFDDD b‹ŒûÁ´Âo¯å~{-7:³$:³„N{-7£\'LGg–DýóÖÁ´"Íšð4%zV£Ï¦è]n•ÕzÍ\™ŸÏ0Ìĉßÿ}½^¿|ùr3'òŽ;&''߸qã¹çžóòòZµj•D"yæ™g4͆ †‘H$´]L&£Ó„Ž*øá‡]»v¹¸¸äççÓuNž<¹i+ˆŽ=úâÅ‹7nÜætêÔ‰#Ú„Ÿzê©ï¾û.55õ¥—^¿¥R©„᢫ÛUHU5ÿ¿0K¥óæÍûàƒôz½Ñ5V`` í£–»D• ÅèÑ£ýõ×øøxú@Lwxx¸•´ß±æèsW嵯››Û{ï½'lÀ   ü±¬¬lñâÅæW¨T*CBBhö­OŸ>⮇ òË/¿ètºÿýï …B*•Ò&ôR©Ô²)Z«bq'ÿ M}øðaòïnb !ÞÞÞ´‹Y™Læåå%~ËÃÃc„ û÷ïOJJš3gŽR©jMœ8‘î0µYƈ§§çüùóׯ_Ÿ——·qãÆùóç[ó‘¼YÇÝèøI›ëBÆŽ+$ÑŒNåŒŠŠºyóæ‘#GhÍDÁ‚ h†½6gBˆ­­­““SVVÖþýû÷ïßOÛyU×mŠø³Ík°æè›¯è!Ä:22222R\x_|ñE‰Dbkkëçç—””D#ø@ßÒÜ us/õ¾6þŽ BH‘–#„:ÿ}vVÉXaºDË1ÿ¼ÅJй;@s‚(M‘µ’J‰¨VBHçÎÛ·o/•J'L˜ ̤Š[µjE_Òº»B§€2™Lh”atÍDD=\tîÜyîܹâz cÇŽ1cùwÏ”“'OîÑ£Z:::~öÙg´ŠÐ_]hhè'Ÿ|B¯Ë†Y¶lÙˆ#èôôìééùî»ï>òÈ#M¾PTù¼¢ñ9ò¥—^2ªi2`À€õë×›d‡ömáìì,~pDû“ï]ºtY³f‡‡‡x™iÓ¦½óÎ;Âk³KЧår¹ÜègLš4iæÌ™ôwÒp+•Ê^xaÚ´iÖVʬ*úÕõüçïï?oÞ¼O>ùD<Œ±¿¿ÿo¼!nÇF›J™VóîÆ…q.…|ܺuëh“1FC³'ÁÁÁëÖ­3ߥQsg¥žn|zÜ6kV&“Ñclpp°i‰'Λ7–8zsåääôòË/?þøãµ_†®Vè–’Ò»wo:O\\\bb¢•É›iÜiDÄçÙáÇ«T*•JÕ¿a&=Å ÙO £!oýýý?úè£N:=ÐÙŸa˜Å‹ íÅh™L&ÞL?Ûìö«-õ´+q|Î Ë–-{â‰'èKZx"""h¬†yã7{ì1á#vvvo¿ývHHˆ8út2 h (ÔÍ7î„..ÊÞmz·qèÐJÑ¡•‚N÷nãà(—ÓŽŠÇ¿ßê⌡‘š“¿[Ñ \ëÿÅâ'ðtšçyñíW¿/O[ÔÇîÝ»yžòÉ'­|ÓqGŒØÙÙ™Þ‹£ÃèÝìUTTБ;ªl©Áq\ii)mjkU vîÜyðàABÈèÑ£«æS¼/ýüóÏ ÃÔ¦mýãN;a•H$mÚ´±xõ’’ÚVÈLÈj³K˜Y?ÝUÄ}^Z‹G¿‘Ë{II‰T*•J¥ftäÈ‘o¿ýV¥R}öÙgUZ«ÕÒ^„ëèæ¨¹Ç½ÊßY\\Ìó¼™W›ejs\²Î#y³>Ú×ç¬MÏÅõ<ÌÒ3»L&{Ð?¡íͺÔët:šã¶±±©rÌ5µZm08ŽspphÁA´žRo^aa¡™w¯ä• 9–5,àQ7;BÈ¡ÔBBÈ(¿¿Ÿ‘¼püö—CÿΡN+d ÷u"„\Î-z<ù¡í{º?ÀÕ øÑ 4&4á©[[ÛŠŠŠòòr«j¿`ŠeÙÚgMS'”R©¬ò¤.þ u>Öž2e í<¢ÆGô&³ÊÇD wÚ kÃýáô‚ÛÌÕR-w óë·r~#—wóY«Õ¦¦¦îÚµ‹2räÈêú ‘ËåIÞ¤ÅÄÝÃ05`k³LmŽKÍ·‚’Õíô¬]ËUÕ­w­f´?4ëR/“ÉÌǺ–ûjË+ÔMUêëM‰„—S–§ÖB®TBäìßU€ó5ÜñŒ¿#ÿ+¿‚"•H!)ÅBˆ y@y¸¸¸TTTäååYyåáÝ¿ÿé’½Æ.NóòòÈ?-ewDßÊã®Ñh^~ùe:ƒL& G¸†¸Žö€R ]ê룳³í(gåâ«Ùÿš{+_˜Œ:›Vå[cœ•]]”ˆ)@ó8ø`Ô‡§§ç;wÒÓÓéø `…úöí[›ÅÒÓÓi@wD¿YÄ>UîØ±ã‹/¾hÁÏw”wÄÑGô÷‡¹Ôׇ„av†wÈ,Óªïò¿Š›1†ik/G4š $PêÅÏÏ/!!áþýû©©©8Ë6_©©©÷ïßW*•µ "âþpFßzâ®P(¾üòKÄîa‹;àh(õÐÐ¥¾þ<‘ hÑ0 O}=ú裄˗/çää`k4G999—/_B‰¸#úˆ;⎸#îˆ>J=âþЖz3XñŠ-`dxŠÿwÅ9¾šztÏ?ÿ|ý¿ËÉÉI«ÕܹsG¡P Oìæ%55•ÆÔ±cÇ.]º îˆ>⎸#îˆ;¢è#îs©7ƒö>f ¡O\¨(àááAϲÙÙÙ999<ÏËd²: ¶{”——gffÆÇǧ¦¦Ò3kÏž=wDqGÜwÄÑGôw”úêèt:þAú7i¨û7–µ±±A¸š3räÈæ•@¶è4Ïóâ žç /"~)^ž¦¥-%555!!¡¢¢{U3¢T*}ôÑú4‹EÜÎè#îˆ;àh(õвK½)F£V«›üO³µµEÿñM  KMMÍÌÌ,((P«ÕÖ¢†*vz†±µµuqqñôô´Ôiq8£¸#îˆ;Žö€R-»Ô)))á8® ÿF–eU*b ÐdÇ$Pjd0ÊÊÊš*‡Â²¬½½½D‚a@š †1¨™D"Q©TF«Õ6f…eY¹\Ž–;M €ÚR(Èe<œP  H Ô € P$Pj€ @ @¨(5@ H Ô@Úhß$‘HÜÜÜœ]\\T*UIIIAAAAAA^^ÏóˆX­ÆH ØÛÛ÷ë×/44ÔÑÑÑôÝ‚‚‚3gÎÄÄÄ”——#`…˜‘#Gþÿ †±ìÚ%ɘ1c¤Ò25:.::úÀƒÁü’âê*tšçyñÏóƒ¿/‹=jÔ€5PìììfÍšÕ±cÇÚ,,“Ɇ æçç·}ûö’’¬GCu"ëìì¼xñbÓì Çqºpgônûöíßxã¶mÛ"0`=¤ŠL&›={¶³³³Ñ|Žã–.]ªÑhèK[[ÛU«VI$ÿJâ¨TªgŸ}ö£>ª¬¬DxÀ4H ”I“&y{{›ÎgFÈžBÔju•½®´nÝzÚ´iˆ X Ë'PºvíÚ·oߪ¿L"aYVxɲluÝÖöèÑãÑGExÀX>fæ]ñp<2™ÌÌ’DxÀX8âááa~ØqÅüØÆ;vlݺ5"MΠ”Ç{ÌüµO Bz÷î@“³ð(ûŒNGEE}ñÅuë€ö‡~8rä¾zõêòåË-Øpƒ*++;wî\bbbII‰Á`P©T<òHß¾}[µjUÏ5ó<ÿÎ;ïÐn}ÏŸ?_^^þÄOÔa=EEEÇBN:Ѿ}{)rRl‚Æ”––&L †ÊÊÊ:$Pxž¿yó¦ð²´´Ô`0°,kå;Ïó‡Þ¹s§ÑüË—/÷Ýw&LxòÉ'ë“R«Õ´[fª   nëÉËË£Ùª¨¨û-H° S§NþÓK$ …¢+a¦GÂË6mÚÔ¹­J£áy~Ó¦M¦ÙÁþýû׬Y#£úAÙÚÚ¶mÛVxéíí]·õxzzÊd2ᥫ«+ö[`FŽ)¾3·þ_,¾Ç¦Ó<Ï‹'xž7 ¼ˆø¥xùØØØzþÚ`äj‘ܺu+--ã¸>}úÔykžç/\¸ V«9Ž4hø†ß:ÅÅÅ­_¿^xɲìˆ#ÔjuTT”x±9s愆†Öù[´ZmTT”D"qttìÙ³g÷çüüü‹/2 €ö;MŽ68¨óM´E R/uH <„xž_¶l™Ð÷M¯^½^yåÚæ¨¬¬ìÝwßÍËË£oyzz®ZµÊú+Ô@c²† ú@il7nÜÈÈÈ`ÆÖÖ¶_¿~FI«¢¢¢“'O&$$ BˆMPPPhh¨Q«´JYYÏó]»v5]yÿþýsrrþøãäädº¶Þ½{>\.—Wùî]»UTTdccÓ¦M›¾}û¶oßžã¸sçÎq§Ñh‚ƒƒÛ´i#þˆV«ýóÏ?/]º”››Kçxxx 4(00ÐhGÏÊÊ¢Ó2™lîܹB-öööK–,yã7h·#:®>­x´Zí™3g$I•¿–çùøøø¨¨¨¬¬,ÚxÊÃÃ#44´K—.FQ ›Q&“éõúÒ-¦V«ãââ´Z­^¯ïÙ³§««kLLÌéÓ§ËËË5——רQ£ªüa¥¥¥Ç¿ví!ÄÁÁá‘Gyì±Ç EjjêíÛ·«ÛîÞ½{îܹ۷oWVVjµZ‡   bÐ%$PZ8F³víZFCQ©T}ûöR <ÏGFFîÝ»×4¯±k×®)S¦Œ;V¸ÁNMMݸq#|¸™q‘õzýöíÛ…—NNNS§N3gNpp°0³¤¤äÏ?ÿ^Êÿa”=1 âDO¿~ý„ï5–811Q<ºpí †5kÖˆç͘1£W¯^â¿hË–-ÚzÈÅÅeüøñ¾¾¾â™ûöíÓëõtº²²R¨´Byxx˜~ÄHLLŒ8{Ò«W¯9sæL™2EÜUð?üP·­uƒ(MçyqË??¿wß}—Ö+yòÉ'?ýôSš‰àyþôéÓÓ¦M«åjííí?øàBÈäÉ“ß|óÍ’’úVrr2­¿`0"##…¸¹¹EDD¨T*BȤI“Þÿ}q+V«ÕjµtÚÓÓóÿûÍz„††8p`÷îÝô­ëׯ÷éÓÇü¾yófá+d2™¸eŠ\.'q|||ÌätÌHLL,..^Λ7þª#FܼysÅŠtþµk×ÊÊÊjß½ÈäÉ“üqº¡>üý÷ßÓùåååeeeŽŽŽ„?ÿüS¨\C™9sæ°aÃèGΞ=»iÓ¦*×,t(CY¼xqPPËŒ¤¤¤>øeÀª òP·ë÷]*¨²×•óçÏ‹³'~~~}ûöµ³³sqq¹zõêÁƒÍ|ã±cÇ„þV !¡¡¡“=i| Ã8;; #©Õja˜dJ«ÕšŽ¤c06nÜ(^IXX˜­­­““ÓÚµk9Å(Ö%&&æ©§ž’Jÿ?.<ÏÇÄÄÐú ­[·¶à׉+e\ºt©´´T< N§;zô¨éGÄ#.?óÌ3Ç^º¸¸˜I DGGïØ±CxÙ»wï_|±¡³'BÕŽã®^½J‡dddddd0 £P(zôèaÙ#þê£GΘ1CüîùóçM³!ÙÙÙB·¾*•êã?eݵk×+W® ˜4>ŒÂÓô<<<„›ä’’’Ó§O‹ßÿüóÏ7mÚ´iÓ¦]»vYö«½½½íìì„›ü 6u"xžÿòË/«lãSPP@'†éܹ³ø­Ã‡W÷]gÏžýꫯ„—aaa¯¾úªù„Çq§OŸþí·ßâããëÖ‡a˜^½z /øáq΂çùµk×nÞ¼yÓ¦MŸ~úi~~¾·-Ã0ýû÷^þñÇ ÂË”””~øÁôSâ*?þþþâìINNNbb"Ê @“@ ”¦§P(ÂÂÂ:D_~ýõ×eeeÇ—H$±±±â¤ƒé85õ$“ÉFõã?Ò—IIIsçÎ4i’L&Û»w¯PÂ(/àã㓜œL[¶lyýõ×+**vîÜ]åÅÆÆnÚ´I<ÇÇÇ'::Ú(-¢Ñh‚ƒƒÛ´iCW¾zõꤤ$úÖäÉ“«÷×¼¾}ûîÚµ‹&†JJJ/^¼hÑ¢¶mÛæååíܹ³°°PØFãÕ_ß¾}øáš„ây~Íš5¡¡¡Ý»wOLL®,æìì̲,ýµW®\9{öl¿~ý†¹víÚÇŒö;M «0nܸcÇŽ ·Ç{öìw³J©TªXü«G}ôèQa0òòrq+›*uîÜùäÉ“t:55õ•W^1¿¼F£ùòË/f~óÍ7U.ìææF(jµ:55U˜îܹ±cÇÖ~ g££ã˜1c~ûí7ú2??É’%¦‹=ýôÓâ–S¡T*g̘!þÛÏœ9sæÌ3qrr²³³ÂAk¡€494áiTÕ Å¢R©"""d2YudYöwÞ©ñ¿öC½ärùG}äããcúV¿~ýþóŸÿ˜Îì±Çüüüª\›ŸŸŸé¨Àô«„­ÇÞ޾ΔLš4IÜQ‹©°°°Áƒ›ÿÁ¦¾VG\­fàÀ/½ôR•æ¼yó„öSÿ_ %’êR,ËzyyUù-ÐÐ@iT,Ë y£t‰Ï–-[† fô†aF޹yófa¦8“"^›››ð)3?C©T½üßÿþ·hÑ¢:téÒeèСï¾ûîܹsår¹édžY±b…Qn…eÙ©S§¾ýöÛB·ŽŽŽtÂÖÖ¶ö}ß ¿ÜÆÆf̘1ÂüqãÆÕ˜@÷"^˜a˜gžyæ­·Þ2‡âáá±dÉ£‘€lmmMWbggW]ìþU¢$£h×®x%íÛ·_»víˆ#ªûhPÌÈ‘#«¼ç´ZâïtšçyñÏóƒ¿/[ÏC{Ðî·-B§Óåääèt:†aär¹»»{ƒÞ*WTTèõzš°°±±1zwïÞ½Bã—E‹‹ßå8îþýûôç9::6ÄþSTTÄó¼\.7­¬QçI¥R½^ïììlšR± Žãh§°,Ë*•J£íSRR2þ|ÚnËÝÝ}íÚµF•nèß®×ëíììŒr^µZM±xÏ•±­ŽL&·ÔhP<ÏGDDdffÒ—óæÍëÓ§ðnFFÆï¿ÿN§†quu5ú8˲B—"Tc±''§F+r)))tÚ(EÂóü÷ß/ôzÓ®];Óî],þ·@!òPc¦GBå³Ï>‹‰‰éÛ·¯T*={ö¬°¤››[Û¶m±ÅHëÖ­e2Í’äææÎ;wôèÑ~~~¹¹¹?ÿü³x£Aƒ5‹ú_-$PvãÆ;qâmiB‰‹‹‹‹‹3Z†eÙ7ß|Ó´wX0O¥RMŸ>]Õ¨¼¼|ß¾}¦‹………µkƒNdvJ¥ò“O>·Ü1üé§ŸÖ¾X6lؼyóªët–eÙ^xaöìÙØPVÈÖKCt"ÛTŠ‹‹nݺåééY\\\\\Ü¡C‡nݺ¹¸¸ œÔ§MIIILLÌÍÍ LHHpwwïÒ¥KçÎÑr FÖЉ,(õÒ’(ÖÉ(hÂP$Pj€ @ @¨(5@ H Ô € P)6Aý©Õjl€ 5Pj€(àää„Ð@ ›ü74`¥[·nÆ ω?qâ„xÎ!C‚‚‚ÄsŽ;võêUì`=0âíííçç'žS^^n”@ 0ZÆÛÛ °*è H Ô ›ðäçç_¿~]<çîÝ»FËܽ{W*•} Q«Ò [[[¥R™œœœœœ,ž_XX¨R©d2}©Óé>l:„‹‹KEE…Z­FxÀX>"‘HÞzë­V­Z™¾1uêÔN:Ñ—7nÜØ½{÷{ï½gºdqqñ{ï½g0!hr–ïÅ××·ÊìÉiÕª•¯¯/ÂÖÀò ”Î;[Õzê €X8âàààíím‘Uy{{;88 BÐä,œ@éܹ3Ã0YÃ0¨„ÖÀò «]@ÝX2"‘H-¸ÂÀÀ@‰D‚ @Ó²dz¢]»vvvv\¡]»ví$hZ–L 4D‹´â€&gÉJ—.],þûbÄb  `,æíímoo8@’ZjEµÀxß¾}¶¶¶tZ­V׸<Ì8..¡€¦b±J•èõúŠŠ £¤‰­­­^¯—J¥æ×Œ 4!Ë4á¡õDÌ/óù矛V9Q«ÕŸþ¹ùÖ²n @±LÅËËËüÆ<Ï'''WùVrr2Ïóf>kooïåå…P@S±L›ý• ½þ¦UTT”––VTT$Ìqü?öÎì7’ë<ûï9µô¾pß÷}ÈY4/²$K‚lG†dè&@`ûBHr‘\$w¹Êÿ'A€ à #Fl `$Îk,Amö,rf¸ ÷!9d7{ïêª:Ëwqª‹-r†Cq4+߃îâ©êê:½T=ý¼Ï›Lööö&“I‰ëºår¹P(d³Ùr¹ìº.˜¦‰Dêëë£Ñh0¤”rÎK¥R*•Êçó¶m«CǣѨ¦i½ÝÔÔ‰D,ËZ___]]½råÊîînOO뺗/_ž››€3gÎŒŽŽÀÌÌL¡P˜šš²m;”B2™Ì1Öª¥R©lnnNOOðÁ…Bahhhhhhxx¸­­-‹áü"‚ ‚ ‚ Ï( Ÿ¿zõªâë_ÿúððpoooccc0ôÕÆj(‚ O3𦆠‚ ‚ È! €òl‰DúúúÔmÕ7§\.ïìì”ËåæææÆÆÆP(T,3™Œëºíííª±t{{{cc£eYœsÇqnÙuÝc¬¥ÈårSSSétº££cttt||<‹™¦ Õ¾<Œ±ÃÛT#‰”’s®®ðâçÁù=Æ>!(¥ äx|¥!‚ ‚ÜPž=TßœÕÕÕ÷Þ{ïîÝ»}}}cccõõõ¹\ζmιiš¡PHÓ4…B¦iº®«d—{ník)vww?ûì3e]9{ölGGG,ó[ö0ÆŠÅ"c,ìãƒ|…¯¿ù4gœ_ç÷Ë"„PñáRJÓ4MÓT_‚ ‚ È>¾šÓ5uîuì®ë*ϱ·¢NµÓéôêêê­[·¶¶¶ Ã;<çõA) ƒ@@Q©T …B©TŠD"j6…ª[P0ÄÓñGzñ£<>ª%œ_ç÷K¡v@Éåœsô "ÈsƒßÛ±··7™Lâž ‚<<_€¢Ü÷;9»zõê!«ÿû¿ÿû×¾öµûy†ïܹ³ººŠS¶m§R©ééé‹/ªª™‘‘‘ñññÎÎNe ®ë:ŽcY–òc[–å8Ža÷ûQñxk)Z[[¿ÿýï'‰ÉÉÉíímåEïïïWŠÊ#Tuõ@§ïá7*ÁùEp~ަiêÓ+wä9cyyYõv|÷Ýwkûœä=AyH¾EJyÏÞ1GäóÏ?ÿüóÏq2ÁqœB¡°¹¹¹°°0;;»³³ ‡††ÆÇÇ;::”ýÄ0Œººº|>ŸJ¥666ÚÛÛ`cc#•J…B¡x<~O›ÏñÖR$‰Ó§O×××ommíììÌĮ̀Ÿ.{zzTcu:®iþrþèB¨Ã‹ÇçÁù=Þ7¸ÒPp:瘣8 §KâaËu]˲ …B&“)•J*lÎ0Œp8œL&c±˜ßm ›Í^»v Þyç'~üŸ’=Ay*äQ£š ONN~öÙg¶mŸ:ujlllll¬­­Mž@(jooB,..ƒA%|LOO/--E"‘ööö`0xpËÇ[Kašfccã©S§ Øššº|ùòææ¦mÛ•Jedd$âÄ!‚ òÄ9Šâqº$æ±,ËZ__Ÿ½|ùòòòr>Ÿ—RÆãñîîî³gÏŽŽŽb™ ‚ È£”'ú"›ÍÀµk×üê¯Éd²··W)÷—.]ºzõj hiiÉf³‹‹‹ÛÛÛH$zzzÂáðÐÐd2™©©)333“Ïç;;;‡††b±ØÁ_ùä“?ü0›ÍRJ‹ÅâG} U׆ӧOÿä'?éïïá…ÀÇ|ýúõË—/€a½½½Édriiiß/Édòüùó¦i²ÖáûoF2™5 ãúõëŸþù¥K—*•ÊèèhWWWss3N1‚ ‚ ÈCbÛööööÍ›7/^¼˜ÉdFGG_z饯ÆFÓ4ÇI§ÓËËË+++ãããx¬A( <]$“É{:9MÓlhhèïï?dÝp8ÜÝÝÍ9ßÞÞv]wggšššGFFº»»C¡ÐýÖr]÷K­åïg2™T¥û---ápXÓ´l6‹ÆAAžu¤”–eíîîæóùr¹ì8Ž:+ ‡Ãñx¼¾¾> ùÌŒ±Út×u¥”ʮ맓”Ëååååû9ŽÿÕªT*---ݾ};“ɃÁááá³g϶µµR©´¶¶¦ZîK¤v'“ɬ¬¬är9˲c„Ã0b±XCCC,3 ÃÏ`’RÚ¶Ífóù|±X´m[¡žB"‘¨¯¯‡ÃªK€?¾R©¨ñ¥Rɶm)e0L&“ñx<‹Ýï„Pu–Ì6ûëß IDATçóÛÛÛŒ±D"Çãñ¸¦i<†‡÷îDAå9§··÷Ýwß½Ÿ‡S}¡À!cT O 0M³¯¯/¾üò˶m@ ˆÅbMMMªMz,õ j]MÓB¡ÐákÝoŸk·£ëz,«««s]7‹™¦‰©„‚ ‚<»ê ç|ggçøÃÍ›7ý‚kunvêÔ© .ttthš¦˲677gggÿð‡?,--år9!D4íîî>sæÌèèhÿÊÊÊÏ~ö³÷ßÿžŽãÃóPr¹ÜÔÔÔúúzooï™3gz{{ƒÁ ê¨ ›››)¥MMMµk‹ÅÛ·o—J¥©©©µµµb±¨iZ]]ÝÐÐÐK/½444TWW§Nö¤”RÊL&sýúõ›7o.,,ììì8Ž£žÂøøø7¿ùÍ®®.Ã0Ôó•R !Òéôäää­[·nß¾N§9ç---gÏž½Ÿ€bÛv:¾yóæ{ï½W*•&&&ÆÇÇÇÆÆ‚Áà! (‚ €r¢¹ŸëdGÌK&“‡ü|qð±(¥”ÒÃ×:âvT¦lcc£Z¢~‘ÀùEAäY¤R©¤Óé………7n,,,‹Eå@Éd2Ê¡|¸ Ê®›Ïçoܸ1==­ÒI\×%„ض½»»»´´ …Z[[fÊåòêêj&“¹páÂÄÄDgg§òfF(jhh8¸–ò­”J¥L&cÛ¶ R©T*„ÕÆQÉJÔÈårKKKêùf2™J¥Â+ +++º®×××kšÖÜܬ:T*•L&³¸¸8==}ûöí\.W©T¤”ù|~uuUý¼wpT!•šwãÆµµ5MÓTßa]]¾8AAAAž²Ùìõë×§¦¦VVVÂáðK/½ÔÖÖ&¥ÜÜܼzõêòòr °mû…^PJ*•úðÃ××ׇ‡‡_|ñÅ–––@ P©TR©ÔòòòúúúéÓ§•‡·§§ç`&ï꽎ãìîîV*•æææÎÎÎ{Y¤\.¯¬¬Äãñ_|±©©É0ŒL&377·½½}íÚµb±ØÜܬL+ù|þæÍ›J=!„¼úê«mmmº®§R©éééÝÝÝ«W¯Z–õÍo~S (ù|~zzzzzzaaRªÆkš–ÏçWVVTÀíÁý±,kmmmrròw¿û].—˜˜èêêŠÇã333<†øÊDAAy´‚ˆŸ9r•KRkÈ- 333KKKªDúüùó}}}RÊ¥¥¥l6»´´´¸¸hÆàà`[[›’*ÖÖÖ¶··Ïœ9ÓÝÝ=22’H$,˺sçŽêKhš¦òðf³Y¿rçµ×^;âþ+3ˆëº*~刕,ªÈº½½}bb¢¯¯/ îîîÆb±+W®|úé§RÊb±Xû|5Mëìì<{öìÀÀ€iš›››Œ±ùùù••BÈ©S§Ôø|>ïïîî>wî\¿®ëÛÛÛš¦†±¯~ǶíT*uûöíééé™™™\.ÇÇÇÇÏž=ÛÕÕ•H$Žx ñ•Œ  (‚ ‚ òQ}•rqÕ ±¶B¹T*-..f³Ù—_~ùܹs±X :;;_|ñÅp8üñÇ/..–J%Bç¼T*åóù|>‡£ÑèÀÀ@ccãÁt’/ çܲ,ιa*úä(k544¼øâ‹¯¼òJ{{{,Ó4­¾¾þôéÓ…Bá£>J§Ó¾O¤P(ÌÍÍ¥Óé_|Q¬$ JiKKË7¾ñ ]×ó›ß¬¬¬øÏ·X,.,,ìîîªñ===Éd’bšf4¥”î+)RÍÖÖÖgŸ}æºî /¼0>>>22ÒÚÚ‡Ï1DyHP@AAAýT*•íííJ¥ÒÞÞ>00PWW§,uuuƒƒƒ;;;¥RIQ©TÔøh4ÚßßO)µm{yy¹\.744Äãñd2Y__Ç÷õÇyòùü­[·¢Ñèææfkkëèèè¹sçkÕ“§ó"‚ø €‚ ‚ ‚<ÿ¨ü‘û¥ò_»vMå’øpÎËå2c,Çb1]÷N›UQL$QQ²œsµ¼©©éõ×_Ÿ™™Y^^¾zõj>Ÿ—RF£ÑÞÞÞo|ãcccsý¯iZ8vÇuÝJ¥¢iÚQL(ªßbm_EBˆ®ëš¦ !„~ÏD¥§(J$ñÛ !8ç…Bass3ûÏ—1V.—]×UÇçOMͶ¶677Ÿ:uª···±±q_™Ï£>†‚  (‚ ‚ ÈóÊ9$sä~Õ=G$Ÿ:u*+©Eõ£Éçókkk¦i !âñø=­G=k×õX,V,óùüîî®aG ¡”êº^+:*J:ñ”Ú¿RJU¯b¨vl¬¯¯ohh8uêÔ±Ÿ‚a‰D"™L!D±XT=•ke G} APAAd?ÊñQ©TÊår¡PÐu]]Õ«0×R©¤šû×ÿ@@µ4nkk{饗Êåòîîî;w–——oݺU,‡††:;;kBJ)¥ô¥ŠÃ1M³®®Ž1¶½½½¾¾Ç£ÑèWû|#‘ÈÈÈÈw¿ûÝ‘‘‘h4ºO !„$“I¿9±®ëápز¬}Çç~´¶¶¾ù曉DâÃ?¼~ýz(r]wbb¢¹¹ÙsŒcˆ ò8AAAAö ›››S©ÔÆÆÆíÛ·êëë “É,,,lll„Ãᦦ&üÕÌÎy2™T €3™L<Ïår;;;`Y–©\!œóJ¥bYV 8J1N8îééᜯ¯¯ëºžH$ü4YUM“ËåT̪j3üeQ²E0ljjjooïéé©««Óu]Jé8N¹\Îf³µf–`0ØÚÚº³³³±±1???88ØÐÐ@±m;›ÍªÙÚ^˱Xlll¬¹¹ùÎ;«««‹‹‹„`0(¥L$ê0ý"‚<P@AAAý¨øU×uoܸQ.—€RÖÖÖ>ùä“¥¥¥d2Ù××ç«ÛÛÛ/^´,ëìÙ³===‰DBJI«Ôn™R -ËÊår»»»û„†û‘H$&&&ÇùôÓO766¢Ñ(!¤µµ5”J¥µµµÉÉÉ`0øê«¯O@‰Åb£££óóóSSSétú¥—^ˆF£BˆL&³¼¼|ýúõp8üÆoôõõ@4äœß¸q£P(¨ÌÕÆxrrÒ0Œo}ë[µn]×#‘HÿÛo¿}ýúõK—.ýáB”ËåÓ§O+åèÇA䉀 ‚ ‚ ‚Ü[P`ŒÍÎÎ...&‰ )åÖÖÖââ¢ëº###£££ª·1¸®›Ëå¶··5M»{÷®J™M¥RÅb±¥¥¥££Ão7 …:::677oß¾ Éd²µµµ··7™L²?JÐÉår³³³™Lf~~޶톆Ó4ÇI§ÓkkkMMM®ë>ÌóBܼys}}}jj*•JƒA!D©TRuC---þöýãsãÆ•••k׮ݽ{W×õ|>¿¼¼ÜÐÐà÷ëQPJ ÃðÕ¢õõõ•••ÅÅEu@ ‘Hý"‚<P@AAAý$‰3gÎJ¥rûöíßüæ7Žã€išÊ|qáÂ…‘‘‘D"¡Æ«…ŽãLNNîììX–%¥ §OŸollô·<11Áûä“O~ûÛßÀ¹sç餪M¥R™™™Qš…ã8„ULÔÓÓÓÓÓsl‰!ŽŽ*'ÈíÛ·?ýôÓ|>oÛ6!$‰466öôô ûÁ+ñx|||Ü4MÛ¶~÷»ß)Å$‘H¨òŸ{fܪd™þþþ·ÞzKùP®\¹¢4š³gÏý"‚<P@AAAžgTÿuãècTÆç<›ÍB–——³Ù¬ÐÛÛ{êÔ©ÁÁÁÖÖV?¾D9DÇ)‹¥R‰1FI$]]]çÎö¥% ¨ö7J—yðY»®ëºÞÖÖvöìYe áœçr9‡Ã ½½½~ýÎáÏúà_@SST*J©ÂqÎ9¥4777 Õ–,ƒÁ––!D¡P ”...îîîªF9ÝÝÝ~]Rícù=}Tþîööv:ösdŽ~ AžäÍ7ßÜ»s´ ð'Km¯5¿ûZí )¥êiÏ»µã?ÿüó‡Ü™L&uuuøJ:H¥RñÏ3üïEä+ÇuÝR©¤Î9j›"8¿ÎïQ`ŒU*Ƙº< ƒ‡÷Ñ@g‘l6»¼¼ ‡”É£Î-ËÊd2ù|¾T*©êÃ0"‘H<¯«« …Bªï¯zG«~4Ùl¶\.×®¯¯Åbþû˶í|>ŸËå²Ù¬eYBˆD"ñÀÿsò¬B¡ÉdüGQ q’Éd,ó?OÖ÷û«Ú·B¡P(,Ë✀išjûÑh4ûŸWRJu¾—Ïç‹Å¢R‚@2™ŒÇã±X,Üó±”úS(îÞ½kÛ¶:ž‰DBÓ´#CAN OÃÕ7 (O~ Õ tmÁªúž8x2­¾lc¾ƒT×uMÓjSµŽ2æ _v­ûô3ÆlÛfŒI)]×µm[×uPðÁù}z¿S¤)¥À¥„ ꮨ](¥ð……‚o¼·ºÐ(t Òdˆtʸ¬0Yv¥Ò NQ@AAyvøüýÌçó7oÞ¼qãÆÔÔT8~íµ×"‘úÀù*©Ô ér°™t¸  6€j‡)(™²¸¼f-ìØ;EV¬Æ¥Ë%ã’ ¯‡W¥) RÅI Ö=B€H@ ê2h ­.¬EMªS”‘*°¹»v"¨ûÎ ‚ ‚  (ÈCaF2™lnnVbÊÆÆ†išª*Þ§X,.,,ÌÌÌܽ{×qÕ nwww{{{vv6«DôŽ9(…eË×òKxJ¥R¹\Îd2ËËË7nÜXYYáœG£ÑD"‹Å„À 9±bÇ2D¤±/CDVÇ¡º»AâÇŽH € Ï¢Êml.L$CZsÌèLÆ¡ŠÍÄfž-¤Í<+XœyžÉ%éé#ÄûŸh”P :%Zõ¶F@R „h(J@§”RB Ñ)P Ê hõ!- %€ YvDªÄU‰¾*AAP@AЦ¦¦×^{M)&¿ÿýïoܸqpL6›œœ\[[ëìì€ùùùõõõµµ5BHOOp¦= Ðxð°„ S4¢!€F€B h(%”½ª¨–JL!*`e<ñ–PI”¨"«‚ˆIëÃZ4@ ª†Bˆ”(ž ‚ ‚ €‚<<‘HDùG`ggÇ¿]K©TZZZÊf³çÏŸ?þ|__$ JéÜÜœ¢\.K)8æx[¾ßž—J¥ÅÅEÇqæççÓét4íëë;{öl¿aª™çÜuÝÃ#l‘‡Áu]Õ;É0ŒÚUÎï‘” ÁóƒpÏB<Ó‡úÊ¢þäÙF¸)Iu¹·ºÜ#]!]¾\ârépð"E¸dÞo¡Jqªr‰Ã…ÀyÕ:^¡ ^5å3Q†ëê±,Z±mÇ9ìøpî„GuÁÀ4¢Qå!ÙKQQê‰V?f5|ÁggRiA%cÌA˜Ë8gB.ÔTjOáûWõ_Bhš†ï8AAPž‡‹¨L&S©TÛÛÛC¡´··¯®®V*•L&£NÁ2æx[¾'ÛÛÛ¿ûÝﺺº8çmmmgΜéïïonn6 ƒRªH+å ÿÚ°, „Øæç÷Š”À…t¸œ(ÕÃKQå^œª#ªK¨»U‡¸\:‚8\ºB2ŒÒÀ„*ÌñÜ"Jšª•@ñt¹'IÊé!@Ð4iU÷U;£ „P :X´Ç¡1àH ûgêX"@ܸÁAGyF(©„¨à„ ‚<Äwª$Ze­TtuXwl‡sΘ(—­BÁ} ß¿œóJ¥B …Bø‚ ‚ ‚Ê3c¬\.3ÆÂáp<Wç¸ñx<;Ž:;gp”1ÇÛò=)‹óóóJ|ééééëëëïïW–uœ2yÈǯ…x†O°µ®•0ÂÕ!F$—À…ä.Õ†qépâ É<5\uƒW€£ÚÖp`JRà éà¸õpL€¤Jž¯(†’ZÇh”O Èj5 ¡Ô»¡Q¨ÞVU6  DRJt”%$n’æ(‡4]{ÀÇ¥ÒIÄ$LR>&¯Pá³R–ñ ‚ ‚ €‚<ž«&É9BPJ5MS …¦i”RιGs¼-ßõ»e©TŠD"¶m«ñ{W„PJ Ã‡ÃØÏøÑáWHE"üõøùž_M7¸×[\®‚B„ÃÁáÒöîÂ^#^•3‰ÄÍÀfBÝp¹t˜ô{ÐTƒE$—Ä«ÙÙ{{Q ªâ6â/‘¾doÌž—„TÝ+'×-ò(Pmƒª/3R?îAAA9ž€²±±Ê²±±¡ªåÛÛÛ›ššâñøèè(clzz:•J---@*• ƒƒƒ£££±X 8ÆPššš”€rÄ-ïÃ4Mµz0ŒÇã‘HDÓ´t:MI§ÓËËËkkk¦iª¾˜8ÅÈW¦tT#E¤gÙëA£RE¤·Ð÷‰xñ"¼:Æ·øÛ‘˜.5Št80¡âE„ã‹ÕzÆñbGö‚E\LHeTQ×ÌE›sih*ÄDˆ²#3Û.±}Ù"šçQ-fHµ;/ÑUð*!šF@ @ M]שF¥N”g„¨U¼./ÈÓGU¥"„ ôŸ ‚ ‚ €‚<åryyyy~~^Ýnjj€Ukã8ÎøøxWW×ÄÄD4 ƒkkkår™ÒÝÝÝÙÙù /ôôôÄãqxà˜µµ5% Œ«GÇãGÙò>Âápoo¯º¡’b[[[_ýõ®®®Ë—/[–µ²²"„hooGùjÕ.¤ÍÀåÊ "m.\¶JaÒõ­"\姪î3ÒV-i˜tT.—LÉžyDzW¿{ hà€)CYE€54ijÄoN2¨^u$‚´#iL´…"©fŽìËQN/ZE¼1RÆ0L¢iT÷½$Õ“§[Añ»º«W¯@ AAäø†‘L&›››Õ]%Lø$“IÃ0‚Á` Ð4sžH$R©455uuuõ÷÷744¨“ôŽQ¥Tmÿˆ[ÞG2™<{ö¬º¡®ó¢Ñ¨Êjq'•JE"J)Öïœh½£&XDPpWøi#ðÅ´¢„ ?'Õ³“àR2O@ñC\..—ŽðÓCT—_p¹t¹p¹¬x¦¯é¯Êa\.…LH)½ž¸´&X„ª|ê%ŒTÓUA#(Ñh”j^h¥dOa‰©¡Q „¡„tÒæ˜NèqÜ"œKÑ4rà yº%”šzÀ¥ÔpÞAAP@AŽMSSÓk¯½¦ü&‰D"Ê“B‰Åb###]]]¶m+¹$G£Q_§xàõXêFÍ)þƒ·|Ï}®ÝŽÙÐÐpáÂÛ¶u]'„pÎq~O¬z"¤Ê@Æ%“ *®ÌYl»È ¶Pn§;¢"E&e-aÀöÊd”ê!¹P¥:žÚ"«/?ªÑLÕÈDI$ @)€FHH‡°Njã?4¾8¢«:J(%~OßÁ"Ý"¤öš¸>¬uB÷¬+„V,è9YêIÕƒB¨"À*AAPŽDsssgg§ŠÌ(•Jù|~sssssó„ÏA$‰D"G@CCñÇÜﱎ²ånG%žø5;•JE%ã"O»ØQãá¾é£š$RÛ˜Fî[(î,Â%p!› Æ%—h = “¢#îØbÊÙ-1¯­/—ŽðиÌ3•8Xnâre"U21…½äTÍk1UÏè*¹“J€R ”*qD'”úÉ#DýO4ª\$RÛëMóPÞ©A4ê]$Ó½ ‰êÉ D…ÈJD—DÅ #÷ÃuÝr¹\(²Ùl¹\VÍéLÓŒD"õõõªÔT×÷Ÿ·!8ç¥R)•Jåóyÿg€x<ÞØØF5M“R>p Z&AyÜJSSS}}ýììlíÂX,öú믟={¶Öõà³³³399ùÿ÷–eá| ÈP$p!«²…PŽ›Í…«ë2épï®*Ÿ±™t¹¨0i3o¡Z‹ Oòà\2?XDJ)¡»Îx±?Ò׊¶ãºoÚ IDAT\ϸ×7¬»Nü64ÂS„²t˜”˜”€éõˆQ&€>´ššBˆV)©m"SãQ•(ñ\*°¯é ÝkŽƒ—QÈWƒ¯ñí9P@JôŸÜŸr¹¼¶¶6;;{íÚµ•••|>Édr``àÂ… ÃÃÃ---ÃqÎ-ËZ^^þðÃoݺµ½½ ÍÍÍccc¯¼òÊÀÀ@(’R>pÌAiAAäÑ (þçÞÞÞþë_ÿúÿý¿ÿº®¿ù曯¾új 8Dsùîw¿{áÂ…_üâ7oÞÄ)AÃÅ?XDCl‡—l)$Ø„k­ZHªá#·øÁ"{j”UDå€0*{Õf{Á"nµÝŒ2â2âpɸÚªl#Ƥ+$àI'BJ)…Ÿx 6IÉI¦1.]!]&&Tˆr‘hTj(¥^“šjÃBkêk(ht ª j[ó%õ¼|E«†â;”Õ 9„R©´´´´°°J¥Êå²ã8Bˆt:M)Õ4ÍuÝP(tP@±,KÉ.óóóëëëÊ·²¾¾nFKK‹a]]]ðÀ1÷LLGAy„J{{;¼ýöÛðûßÿþÏþìÏzzz޲b2™üË¿üËO?ýô?þã?*• N ‚ÜG@ñ­"ž~QªˆB‘Û\jEGîî9G¤Í¥ÍÀeªa°™t8\ºLº^S^é ઠðÜ"¼zG¤/OèDã-&’ étªÅ Õh†ªJt #¡w$ô¦¨c„¨¸¢!ª×‹ÔFÔ‹Ô„(o=`A§W@©¾D%¨ò7‚Ê!‹Å¹¹¹ÝÝÝÓ§O755E"˲Ö××WWW¯\¹²»»ÛÓÓ£N3jÉd2—/_ž››€3gÎŒŽŽÀÌÌL¡P˜šš²m[i.ƒ ‚ ‚ [@ñyûí·¿÷½ïÝÏx¢R .ÿÖ·¾522òÿð;;;87ȳ/vÌ!ûƒE„ïQ ÷ÂGdÕ?²çàBº ß„å°rÅe\‚.9ÐÛxΑ=ŸˆÜ,¢Ü"\zmhªÂh„hÔkC£¢zÐPßúA$¥@ Ñ)¡„z}jÑ)hÕJ‰F¥WeÐ3âA-jCÓ*L4D4ŠÚò\Ch~„°/A¹?†a$ Ã0&&&zzz’ɤ’T,˺rå ¥´\.\«P(ÌÍÍ­¯¯÷ôôœ:uêüùójS·nÝZ^^€^xŽ2æAé8S‚ Ï+¤  äq (°O=±,ë“O>Y[[[__O¥RÍÍÍÝÝÝ===çÏŸ‡Ãþ°ºººÿøÇ?ýéOñyÖÕ.UVHõ.\Õ¦3Õ»L‰BÅŽ8Ì“ElÕ}†yå3.—œKWHåQVÕÖWH)…$4Mó:G“/”©H¯A¯$ *XD«4¨xJ=ÑDõåÕ õí÷lCã%;H?X¤ºA€½7jŒÚïJ‚omäd|½7…÷VìÁsÍÍÍo¼ñc,™LF"Ã0 ­­­­­-êºNé=²˜-ËÚØØ(‹ýýý011Q©Tnܸ±±±Q©T¤”ó@õD¥Õ !„8Y‚ Ï%𦆠òd”Z&''õ«_år9‰ê¿óÙgŸýïÿþïŸüÉŸLLLøøÎw¾óÁàô MìàùAx5DHâ»B ZÞ⋨lTá‘ÂûÓ‚E¤ä\Ú|ˆ,¢Ì ¬/âpPÙ«îSE&®.WÁ"ª·ÏÔ! PJ MhÑ4Ï ¢¬"P ñ«iüÖ3~'¯ºí­ _ò›ãÁƒUz«Äï#äÄ@UPª¡ô>@ð¸ÜŸH$Ò××§n+µ¢\.ïìì”ËåæææÆÆF¿Ë[-®ëf2×uÛÛÛU‡¸öööÆÆF˲8çŽãÀQÆ‚¶mÆžU?ƯfÉ9W×3xØŸ„ÆeÙ•¹Š "4lPœwäðWªô·~¨=QJ½’ìñˆ<1errò_þå_î÷×\.÷ÏÿüÏßøÆ7~üãû?.ýð‡?¼qãF*•ÂB‡z"%ÒæÕˆ.l&8\ª`Ç“BÔ0a3i3á0é2p¼àUɸt¸Br.T1Žß†FÕཥýx¢®µ@‚" Ô Jk J Z/C4 ”)#„ºN5Jö[EȃE¼ÇÝ,{r ‹ ÈWÆžé?£먨Þ:«««ï½÷ÞÝ»wûúúÆÆÆêëëï9Ò¶mιiš¡PHÓ4…B¦iº®«„8ʘC`Œ‹EÎù=[)#è5à7œÆcþ¬À¸ÌÙb-˦7Y@‡o÷ÂIŠóŽ‚’§À0 õáü¤d !„Š—Rš¦iš¦ÚyÊÙ³g¿ÿý﫾<Šþþþï|ç;óóó—.]RK>ÿüó–––ï}ï{ê®iš?úÑþþïÿgù‚ØQÓ†Fz-rU1‹ïQþ/=d_°ˆ—6"¸E„dB¹?d5cU:ÂS\.jwÞ½`.mæ‹0Ov‘ª0çPu‹H¯f¥ªM(oˆ*fñRBªå3”¥’ª64tB(¥Ê'¢Ш®4‚Z®Q¢"w]†AñƒAž&õdO0²úÙ…UÚ€ Õª>iW­"j‰ËÁf*dD-ñ‚El.\&lµÁ"Œ{Aª^UŽ”\]çÔ:5ÀO÷ðu*X„R a ` ^W]ß-â‹TëeT&ˆwM¤61Äš64û2GHMÙ¨Ò¼C§XA¡DúaÉØÆøˆØ¶J¥¦§§/^¼˜N§;::FFFÆÇÇ;;;ïY£iZ p]×q˲”•Õ²,Çq ÃðB<ʘÃ&“eç6 ã~ùÈW ¥”1¦æNâ ÏÀûW NÜ2c;Ei%'šiöE³á¼#ûf\yMÓ|²…3𦩠2<½F«€âºîý>ìÞzë­>úȲ¬û­ËûÕ¯~õ×ý×þ’Ó§O£€òHLH‡ ¶²—!"ï,"¥üB3šj ’ p9TSW…[Íù¢OÄKQù¬NÕZâpárp¸*UI'BJ)E6Aˆj=£l D÷ìžOD#TVûÔ¨N4{ñ"š×­f/XÄFŸO¥RªÏñÆÆF*• …BñxÜ4M)åÇuêÔØØØØØX[[›Š}½'¡P¨½½]±¸¸ •2==½´´‰DÚÛÛƒÁ e ‚<$WlæÙv¥J<ÐN·‚±“% ¨P9.¤j;¦~ Ó¾”AäD (Ÿ~úé§Ÿ~zü‹mÎ777»ººÔÝd2‰3ô¬Svä¶Ãr.ä,^v¸Ë‰S5‰TSWE5mDå³ ÇÓM@ÙI\å+’sÿ DB$ Êâ :%žüA¡Ú††"UàˆNhµïŒWP£Q¢Sß!"UªˆVíACqòy8ýD9ÚTÅŸêö…å²Ùìµk×.]ºtõêÕ@ ÐÒÒ’Íf··· ‘HôôôÀÊÊ !¤··W$Äb±ááaÈd2SSS*pff&ŸÏwvv Åb18ÊyH™2_˺«»n}Dïk0šNØ\J&ýþ†R ê'‚ €òÈX[[Cåy"Sf×v¬…]ØÌ9E[Öx7¾`ñ»ÛR𣤠D‰ Q¶ŽjÒ*hÕºm°©I ½F7{mh¨w-CjòjžˆÚ‚’fAN>ß§&$H‰ Ê¡¤ÓéO>ùäÃ?Ìf³”Òb±øÑGù]oNŸ>ý“Ÿü~þóŸkšöî»ïž;wN*œ?Þ4Í?þøúõë—/_Ã0z{{'&&&&&Ô¹ÄQÆ ÈC„,9r·$Ös®ËeÅ=qïx) àB  $á4ÌÎF”G‡ßÉ©E%BW*•B¡`Y–Š×Òu= Åb±`0¨iš:t¶m‹År¹ì7 ‡ÃÑhôðл/»V©TÚÙÙ€¦¦&ßY-¥´,+›Í:Ž£Š9猓¢-v-¹[›kU—‡î)  ÒF4^€H5D«Æ‹¨1Ú^ó©¢I4e¨0‘·DXLœ¸7¼ðJx¤¬–.J<·B”ãð7ó7~Ü!ÅÆþí\.‡3¤àœ[–µµµ533³±±Q, ¶··ŽŽ¶¶¶†B!J©”RÕ¯­­©Äæææ®®®¡¡!Ó4ï'4c­÷ß^{í5% H)…étúÊ•+»»»ñx¼¾¾¾¹¹9d&ºë Í mq½ì•95-fv¢¡’È=WHM°ˆïÁ`AžrjÚ{1بŸNooï»ï¾ûÎ;ïÜó¯~ ÏŸþ韪µ\Ó´P(Ô××F_~ùeÿg€X,ÖÔÔ y]T2A Þï:\J!à¾á¥. %ž R¢z‚  (Ç ££cß ÊÁ<=]×ý6ÆÉdp†ÅbñöíÛ‹‹‹‹‹‹étÚw d³ÙJ¥Òßß?00‡s¹ÜòòòÔÔÔúúz¥R€íííl6«iš"‘Ht”ض}Œµ²Ùìää$œ;wNI'…BakkkqqqvvV9PêêêÀÔH]ˆ2BuX®@‚ 'GA¡Ô“…9ª'$™LªªœÃ©¯¯ÿÂ%+¥”Òd2yxÎQÆ ÈÃÊ„PJ(àâ$æFK)¹LHQ½‹áÙ‚åŸþ韢Ñhí’­­­}ckE–ÙÙYœ!ÅÝ»wß{ï½ùùyÃ0b±X[[›”rgggyyyaaahh(Ö××߸qcjjjzzÚ¶m?lokk˶íR©4>>ÞÜܼo˹\îk•ËåååeuCaÛöêêêÅ‹——— !]]]ƒƒƒBˆ"¯0XADÕlçµã5y®¡:‘©©ž¼# ¸WÂÒëƒíÛy®x|ÊÜÜÜá Ãøã?þãÚ%ׯ_ÇR …™™™ÕÕÕÓ§OwwwwttH)C¡ÐÂÂÂüü¼2€†qëÖ­……Îyccc__”J¥l6;??¯ëzww÷A)¤P(c-Çq²Ù¬¢X,¦Óéõõuµ{•J¥»»»¯¯¯³³³¡¡!—Ë&ˆJ@ÿ&‚ 'ò‚Ê»®ðRdñJAž[  Ä u ìe @µ ‚ ÈóÄ£PÞxãJ¥réÒ¥£ þáX{¡~ëÖ-•Çc¬P(èº~æÌ™¯}íkÊ„Ü×ׇggg …‚0??¿»»{áÂ…±±1å%ioo¿uëÖåË—ççç¿ýíoÜòñÖò÷ªX,.,,üö·¿ÝÚÚjll?uêTwww]]!„`B ‚ 'ûjJ D heG“ð–§4B¤$âd:P$pL (‚<‡ V*•­­-˲:;;O:ÕÐБH¤P(|ðÁª‰ÏÁ-o-E.—›žžÞÚÚºs玦i===CCCª@½R©¨xÎ8c’3Á9þ ñÕÃ9Wo®§¼ƒgàºÌu…Ë$scüÏ„g—×uGj”¸L¸®p]Æû|Ÿ•ù}r¯É8Œ8.8Îa9 ÌáÌeŒ3ÎçòÑí`à2p\¢ö‡1¦úP0Ƈَ0ÉÞ~º®ë8†ñ¤ôƘã8B RE‡P4J(!R‚8‘ÊÉ¥är¯„‡K)û#‚ʃøÁ~ Ôøö·¿ÝÒÒò¯ÿú¯…BáàȆ††ýèGÃÃõ ÿó?ÿdkill|ùå—•+äóÏ?O$RÊ\.§ëúÐÐÐØØXccãêêj©Tr]7‰$ Ã0 ‘HD"Û¶9ç*zöàåÙ1ÖRlnnþ÷ÿ÷ÀÀ@ÿèèèÄÄDWW—Ÿt£ÔƘmC¥BlG:.þñH×uÕš¯*:-—¹!‰ÃÁ²¸m Çy>5»ÂKeQÔ5€Ëe±"Ëe^±Ùñžï³2¿Oìh± Z.»ESרa'è…²°,fWxÅ‘{TŸEº$Ze­Tt N Rv%çBH«âK¢H5p V@±, „êã÷‰|†T*BH(zRû€ ω€B%„„8¡&$ ¾ð¸”OýAå(œ?¾öîÀÀÀßþíß^½zurr2•J•J¥ÖÖÖžžžîîî3gÎìkò2;;ûñÇãÜ|ažt=‹†‘J¥òù|cc#ìììÄãñÎÎÎX,¦ëºR+ÔYx P×Z@À0 õ ¶¸WêñÖR8޳»»[WW×ÑÑA)F£ÑhT×uœ/A½K*ïºBeàAç÷Ý^p¾’ŸÔÒ)@I$¿ƒ;‚ Èósaþˆ¶ûÿøõWU›i‰D^~ùå—_~ùð···ÿíßþ 'f¥RiqqñÎ;¡P¨®®®«« Âáp¥RY__O$ÃÃÄMÓ¼ªΕÁ9WÆlMÓî™Hr¼µñx|tt´¾¾~nnÎqœöööúúúH$bš¦Ú2¥T×õ@ 4À'XÂóÕÃ9WsdÆÓìP´p8 Sɲ`23ÅóYÂê‘p(ÕU ÓE˜±`À6Žç÷‰í µp؈FXè°ãc*ÚÇ JôQΛ& µPXDÍXX€p¸¢ë¶ÆE …‚‘¨ îUc¹®«Š³"‘È“r0Æ”/0yX…€N%*þã$ÊÕYˆ!¥@ùAPŽB6›ýéOúñêRÿhŸ¹òƒ>øõ¯­ ‘}ÊÊÊJ*•êëëó»ð$“ÉÕÕÕ••••••R©¤ëº’TJ¥R>ŸWA³ù|¾\.›¦ ïé 9ÞZ¾€211‘L&¯^½šN§§§§ ! êJ@i(š®éº¦é\XûHP.!%x=µ;©éša膡 "ut]>¯k†¦†aš†F ¡ÂàÂ0@ÓÙ±Ÿï31¿Oìu¥Q]×MÝ0 Ó4;>ºÉtƒëšÔ4¡Iñèö‡êºQ³?†Á©F ªéša¦aš´ær‹¨-Ó4Ÿ”€B)UVD|9!ÈWñ†J@J8™) Â… € ±};‚ ( ‘|>ÿw÷w¯¼òÊ[o½ œJ¥~þóŸß¾}§äžX–µ¾¾^*•FGGk»ð\¹råæÍ›ëëë–e†QWW—ÉdR©ÔÆÆ†*ŒÚØØH¥RÁ`°®®NCö_ìk-E2™<{ölWWW0\XX¸téÒÒÒÒ~ðƒ‰‰‰D"³† !~c<òü¾Ù‰Ô¡„€”Bx5,'ª!¡É…dBV( ðsAç‹GW!„øàƒ®\¹òõ¯ýüùóÝÝÝǬ¯¯_»víý÷ßGãÉ¡_É^¡M±XL§Óª­C.—+•J ë:!$‰ôööBVWW…¹\æææÖ×׺»»Ãáp©TRÍ¡›šš"‘e­ûíU0liiVUétzcccrrR1<<ÇŸ×6+‚ _æÜ»®@';‚<ïïuªS®S *J¿ú¦?9Š”À¤äBJ ¤òd†é"òó8ò> …ÂÅ‹/^¼X__ßÔÔ”L&£Ñh¹\Îår›››Ømç(D£Ñ˲ÞÿýÏ?ÿ¼©© ¶··-Ë ‡ÃƒƒƒÑhTùA„W®\¹|ùrgg'¬¯¯G"‘óçÏŸ={6™Lîìì¼ÿþûðÚk¯)å(k¾o±Xlll, ÙÙÙÏ>ûlyyùÍ7ßÖ4 ÀÄéCäd_S©«)À YyÎßìDj4 „!¥ää((€W»ðHP+¸y~x¬ Svwwwwwñ ƒD"qæÌBÈââb¹\Îf³`YV$8}út"‘ˆF£ƒƒƒ–eݹsçÎ;årLÓlnnˆF£…BA­«ªîà(kÜå[Q7@  ”ª6«ÙlÖ¶í|>_("‘h(  r’/¨€ RJŽmxäù~¿PB(QU{žÿ‚j'ËÂp!UÅ"—À¥˜á… Èsvœ}6hhhøÖ·¾Õ××·±±‘Éd”ü¡âK:::š››Unk[[›a ;;;ªº'‰455õôô466ƒÁp8¬„¿0' >p­ƒûÓÔÔôꫯªj‰òÈD"‘†††r¹œH$*•J(ÂoLANú5!„ìuôDäù}³ƒFA£„H B—R“prrP¤”œ{(U Á=Až'P@y6…B mmmù|¾X,@4Çãuuu¡PH ‹F£@ ®®®P(¨Ú¨ºººX,‡U‡Zçˆ÷ Ðõ®ud2yîÜ9uC-1M³¾¾> F"‘B¡à8Žj‚‹9áPïºâÿ³÷&?v]×ýïZ{ŸsÛºÕÅ*²$Š%ŠI‰¢?@°/A&1A™pžAdfd”A‚ “ü„ð Ào’øççØpì0¦ES¤(‰=«XímO³›µÖì[¥›ªÅb«ö6|}yö­svsÎ^ß³š¨žD"{DP 5BÐL½±ˆÞG,$èX<£à‰Dö"Q@y•¨T*AÚõ&“$I’ä±*9ZëF£Q©TZ­Vh’$ÉZõÓ'”­´z’gýNµZ inBQLcŒ3qÜ"‘È>6¨A€£„‰ìi V¨â0˜EHp_-{ †µ*<"³gG"‘=FP^%´ÖkÎ&Ï|x+¥”JÓô©G¦iúÔ¤°·Úúï!&|.Ë’ˆÀÄB<‘Hd³.J´#"‘=¾Ü’  kÐÈ~*Â3”<‹ˆð0nÌü‰Dö*vA$‰D"ÛhQ¬z Ä²‘ÈÞßX+T¡r¹1ø}»'"ž…X8$‘÷½H$²‡ˆ(‘H$‰l¨0ä@‰vÄcºÝnY–kßÔjµ±±±jµúµZ=«m, @u•$‰{¡È ZíE+Dð¤„}ä„"$d#‘ð?qfD"‘=DÜ4D"‘H$²mU¨d Àíˆ év»W¯^]XXXûfjjêüùóSSS_«Õ³Úcæçç—––`rròСCÓÓÓQ@‰¼Àõ®& À 0³ì3ðŒž%Ô Ž ´#‘ÈÞ"n"‘H$Ù^› pX…'&Û€¢(æææîÞ½ eYv»ÝcÇŽ=ztc¥Óé\¹råîÝ»cccµZmí{"zóÍ7Ãgkm–esss7nÜxôèQžçÐh4Ž9òöÛo9r¤Ùl>–‘=yžÅލ”Vá!Úg¹£†9P8xŸPô¼‹D"{‹( D"‘H$²ÝF3 `´$ž 3cŠ¢€………«W¯.--}ç;ßÙ¸U»Ý¾|ùòíÛ·Ÿô7a VY–ݾ}ûã?þéOÚn·> =:pà@¯×;þü‰'¢€ùæ!jYdŸ9 €ˆ ‘„ˆE‰ÕÇ"‘È# (‘H$‰l£E…«%E$fØ€jµ:55EDP–åÊÊJ­V zÊ¿•¹¹¹S§N)¥ I’Z­6::š¦i8f0ܼyóæÍ›ý~¿Z­:tÚív¯×ûôÓOÃ7q"/`½¯æ=b Þgõ·†KC±8†ïD"‘½GP"‘H$Ùn«J‰€Ʈ؀‰‰‰>ø ¤ƒmµZÿõ_ÿõ5v3IÒh4Z­ŒŒŒ>|ø7Þh6›á_»Ýîµk׿ççß{s'Ož}ëÖ­Ï?ÿüÚµkçÎ;2…‚« IDATzôh‚È7^é QD<ï/·3ð!„'Ô!àXÁ=‰ì-¢€‰D"‘È6T!‰lH ‰ ¨×ëõz=|¾wïÞÚç©ÕjSSSƘPp‡™ƒ÷Jš¦Õj•ˆZ­VQ÷ïßï÷ûo¼ñÆûï¿äÈóÞ_¾|™™7õsfç\ðs‰l7Î9k-¤iúj™àÞ{akÉXkMb‘öɨYëœ'Ï"""ì¼/­³VÙTïùq<÷JwΉ"2³R wjåZk™YkÇ%²Q@‰D"‘HdA@ˆ®ìÛÆØØØùóçGFFÒ4ív»Î¹^¯7???::ú[¿õ[ï½÷Þ™3g—ÖÚ±±±ÉÉÉ µLNNŽ•eÉÌιÿŠˆxï½÷Y–ë.ò̪ l1óZ4Ö+A™;f’¢4ý÷•·_¼Ï²Ü[ë<³0xæÒØ,—ÁÀUXíùq<·lQ–e§“$AÄPˆ¨,KD¬×ëqîE6 (‘H$‰l#ˆ€(1ýɶ066öÞ{ï…ô±A Y\\ìt:ý~ÿÚµkI’ÌÌÌ„m13W«ÕF£Þ.6jµê½Þ%±'#/nÉ£B@!Þg©3xÂap¬>¶+JÀ³ Ï÷ ¦[ÉH õŽi‘È«DP"‘H$Ù>Sj-‰¬ÄTÛÁúÌ)¡»Ýîìììõë×ñ‹_|üñÇßþö·_ˆIœ$‰ÖºÙl–Èv³-Õl6_­·ÁF™¦VyJ+ÕZ½ÚlVZõýöUï”J[',J©$M«µz³Ymè=?î¯Øú"É,?ê˜ÿüb€€ÿï™Êøx¥ž¨DãË_éI’ˆHµZM’dgCx’$‰!<‘M‰J$‰D"Ûˆ è…²ÛºÌ),Ë<8 ~ô£ÍÏÏ—e©µ®V«ÖZcLžç###ç¹1&I’J¥²iZD Ǥi ¿1„VU*•WËNSÒZ)% 5&iš¦•Ê~±Ç’”TŠQ)­‡=ìùqµ`Ïì¹ký§K¢þ§QWtEU^º€‚ˆ¡øZñ áQJ1³÷>NÈ&7ºØ‘H$‰l‚ ¢ÊËÝŽ?¶O’dttt0t»Ý¥¥¥`•---u»ÝZ­Öjµ¢yÁ–X°QxŸ…ðˆ€q, ˆ,Àñ®·+aÏb‰KbèHܰ`RŒá‰D6! (¯Ð3IŒ1½^¯×ë ƒ¢(¼÷¡(ÀøøøñãÇGGG‰(˲¥¥¥^¯gŒ€jµ::::99922¢µ~RÓeæçhÕétîܹÇ" Yú¼÷cccišQœc‘H$šRÃÛxì‹ 1Æt»ÝŒ³°°°öáÞ½{P«ÕÆÆÆ ÛíÀØØX¥Yß*¤zíõz³³³<¨×뇪V«ÕjõèÑ£³³³wïÞM’$ü­[·îÝ»766633³ÅŠ?‘ÈVµ·À‹Ð>Ë\í„CÞ'Æ(ïV³ˆÅ“ 8¢8T‘HPö–z""Nç“O>¹~ýúÍ›7gggƒ1FD.\¸péÒ¥³gÏEqçΟüä'ׯ__XX€©©©3gÎ|÷»ßýÖ·¾U¯×“äñ'¢çhuçÎ>ú.]ºtáÂpÎu:ëׯÿçþç`08{öì‰'¦§§U}"_$Ùߦb¬Â³ºÝîÕ«WÃcè“O> 2ÇÕ«Wƒw÷ÔÔÔùóçÃ7pþüù8v}+ç\žçóóóŸ}öYQ<{öìØØX¥Ryçw¼÷üñµk×N:7oÞ$¢'N¼óÎ;£££±ÿ#/pÙ“È2x–ý–BUDÖŠZ±H ]Ü¥ÃàˆAÀ³xŽ©H$ ({ˆð†íÖ­[W®\ùì³ÏVVVò<µÖŽ)ŠâþýûŸ~úégŸ}öàÁƒAúàÁƒ4M§§§Ó4=zôè“{ÄçkÕét®\¹ßÿþ÷Cù±………/¾øâúõë³³³J©@‰D"k °@ âÙ˜¢(æææîÞ½ +++áѳ²²rëÖ- ¢7ß|æææ |~¬•÷ÞZÛétŠ¢9{öìÙ³gGGGÓ4}ûí·1ËËËív{qq101) b&ffx¾ë}UÆwÇæ?#sHåâ<ž}$ ç]˜€Ûz>´î|˜8Œ"±xbODôeÁ—µãˆhÓB0Û5c‰ˆˆ™wªðÁÕjujjêY955’ž„ȵZÂë[%IR¯×ÇÇǧ§§:tðàÁF£«T*•J¥^¯ÏÌÌ,//ÀÁƒ§¦¦¦§§£zyÑòÉ0 ³ì— — =N%8Žc Ïn/bpŒž%fD¢€²·”………·ß~ûܹso¾ùæääd¥RY_h (ŠåäÉ“çΛœœ€sçΕeyíÚµÙÙÙcï1ž¯U`0|ñŽ^ïW¿ú3ÿöoÿö©S§Ž?>99Y«Õœs"BLäÉ{ñÄDÑüÛa‚ƒå ”ÚͯˆÀ94‰r^œ#O~{÷•Å{tÖYÃZ¡!q–óDîù®÷UßëmïÅ9°ŒÞH€°–½óÞmç½hõ|ÄZ4‰ç3 sÈ´m­6æË¿îœ³Ö˧²öÂÌ;^‰fbbâƒ>xÖC§V«MLLÀ|~²"j­+•Ju•Çšééé±±±cÇŽI¥V«=vL$ò"ô“µ$²°òJˆˆg!@ J#HðL‰sb7޽N‘XB>”H$”=Bˆñ^ZZ:wî\’$÷ïß_^^VJ5›Í´Z­z½îœk·ÛιÉÉÉ™™™ðJmfffrr²( " ÛôÇx¾Vºorrryyùµ×^;}úôÙ³g[­V¥R ¿ «¯Í=C(‡r;”`wí†È›œ'±C°'÷ê|’‡'A"¡U”ç»ÞWe|w®·…˜ièò±Q1…‘ØÎ¹¼[˜pí|˜ DP„IVÏsýYí”ÝŸ¥^¯o¥ÎcÇl±$I’$Iô7‰¼‚ ðªƾ0È!äÈ%­A!H(cw»Q@ ^ÁÇÕ‹PܧG"Q@ÙKxïƒÁòòòììlžç>Ìó¼Z­;vìÛßþö™3g^{í5"2ÆQðRÖZ‡e¥Rqέ½Ç~rëü­+++ÿýßÿ\WÞ{ï½×^{­Õj=Y²'‰Dö71@$²?<"(fð²äC‰ý‰DeÏ µåfffΞ=ûû¿ÿûÖÚGݽ{÷úõë¡öÖºZ­†ˆú¢(‚ÑU…µ6MÓJ¥òÔÝùóµ >|øÿðÇÆÆ~ýë_/,,•çäÉ“A@ ZVZ':It¢IëøÈÜŽ]†­õN…lm§išVS%(iЉ†²·ÿ®š$i%­TS­½ÌiŠZËó]ï«2¾;ÖÛZ'‰7«ju£.®8JRNÑ5ã6ŸO²v>• h­ÔPWKÒJ¥ZM× @âïÕju§Rh­ÃÝ; (‘È‹y.hDB‚¡L,‹X’Ür» ñP+iVöÚr F8ˆ€(P ADøàƒO?ýôÿ÷þóŸ÷z=k­RêàÁƒï¼óÎùóç'''GFF.^¼X©T~ö³Ÿ}üñÇ—/_€4M?~îܹsçÎß¾}û£>€K—.]¸pÆÇÇ7mµñ¹¥i:>>~úôé4M?þøã_üâ?ýéO˲<}úôÑ£G“æÁ8|‘Hd?£qXΣ†‰ì ‚l*âEB¸„xbab  {*ï„D¤Áexu$B$–Àzp$ï»d¼< %x£ì’'”%é– cµ˜1'²‰Ê«A£Ñ8zô¨snvv¶Ýn—e ÍfóèÑ£.\8}úôèèh­V{ã7œs ιÅÅE8tèЛo¾ùöÛo¿ñÆõzý©¿ü­ÆÇÇ×ô—º?==Ýh4´Ö‹‹‹N§Z­ÆQ‹D"‘/ù‡<ÑzˆDöü²GDT~­ €gp,ÁMÃ8Ô°—BYVCBÖ´!`Çâ ,=ÅÇ!dØ…1õŒ×º2Ƹ{Bx¬‡å@=Q[̘#°útEˆó(²ÝDåÕ@k]¯×;Öl6?üðò,™9I’f³yàÀV«U¯×•Rõzýĉ###ßùÎwŒ1P­V[­Ö¡C‡êõºÖúøñã—.]€ãǯÿå[=y>OþN’$­VëÌ™3ιV«U©TD$óqô"‘HD rDö¸Âë!÷ý,""APHÕž ãAbà  à0÷‰xÍâY<‰§ÇMt)½@-”—9^¡Ât¡˜²;έp<Ûsp°©Gkj+×"«3k˜u?p$ (DL’d|||ã€¥ÔÆÇ¬yެo²i«-þNÈ);99¾)˲ÓédžâðE"‘ýlK! “ÈFÿ“HdŸlÛˆÖ¼N‹¡AJØ[± Á ' 9P‚? ‹1Š'q$þ‰B¹–¤W2¨ºª«hö¾Äñð²ê²n®îŒãG]§&+[»±«Ña B¢£„Ù^¢€‰D"‘ÈK°.D¢‚‰ìÂKs!·šc‚E<‹c!ÁtoäÁ‹`X‚'|É,‡)6ø ÝzXxh¤•z'ÎË|$1¬Uáq,ŽwK¦óÂãž¶1”N,‰FL56T,ôÙN¢€‰D"‘È6Ò Èj=ŽH$²–<€!"Cq†îË`–½”EV˜…D‚÷ "(ð àXˆŸˆd´ž‡[¼ª;E^Îp±øÕЗǪð Í÷¼go¨‘ªª%¨·Ù?HDHD±h…ÖñbŸ¤°D,›æÇñ,¹ãY#ÔSUIT¡D¶“( D"‘H$²í¦”Dý$Ù'Ë^¡ b(¸4x’µ$²ŽØ1³ì)½@BÒ\ ÔjY"@GbW}pÖ—p.½, ”¾'ÎK/b R(à(x  Nç{þÿ|2È¿´ñæ¡ôÐHÒ¬l¯$ÁÖ ×Rt^Ú¹g–̰%©èMòãcé8³¬r“£Ù^¢€‰D"‘ȶC»¥¾AdEkmè;奃J!°³€ HÈ1İ$vÏÝV¯QA#hDA ' ,ÄÂ,,²VéÀz^Ê Å,Û/w¼@V“È2ÉZÉívÆŸÌ•CS­ôPKOÔ·õL€J/Â’Š(%–¥°lûìÁƒÎ9xðàAš¦ÓÓÓiš=z6=ftttÓ³bG²< ks†X¦ jë¹W²¨§ªš@E£úšæÄ7—K™áNAÄ º8çvF?î1ãšh24DAHÄ“x‚µ¼ëÇ=ˆtCËi…Æ¿2#Tb@= ]T,ÂÀàWC™…ü/âIºw _:ö¬< ËÓÄ=3²8pJ¡Ý}}âHz……Z¡z%rm¬‰zJP³8!‘Üqæ8¤­±nÊQß<ÜÌ‘´ ig4ZgKâˆÃª)‰—rßθpL, ±p¼œ‘#iTT£¢)†{/1äV†À8^óf Þ^}Ë}R ^÷ÃÈ+" LLLüË¿üË?ÿó?ÿÛ¿ý[ìîH$‰ì;kêË*<s lÀñãÇ/]º“+W®|ôÑG[iÕn·/_¾|óæMx÷ÝwOŸ> 7nÜè÷ûW¯^5ÆŒŒŒÀ¦ÇlI@a(=t žm[K²,ï¿ÿ>lå˜MíCGÌ–%· 2^º9e%Ùº¢ “»ës¦gÈø*‚TU’â×rã¸S²ŒÖT-Qøõ-=ë|¿tÌ9–FÆ‘Ú>Ý$ä µ$ˆP}ÑõbˆˆˆÂ¥Ô®š«2ü/“×Ìì@˜Å{b§Àx¶$$@"ÖSé¼÷ @fyq@0ÙLÊÀp7wK™«'Xºa'ì~<‘óìˆE$Üô@„X8äÚ`f±žŒóž t´œû•Ü/žÙ8.¯jä'ÆÝ8îä~e@Õ”Jûœ}B,Á£§ú5ëøl*»Ö/eÞ’4S©(ÁÊj˜Ý<^ž<1‘(ð,–„ˆœƒAÉ™eÏB"%±±dœ”`<@³‚麫ˌŸë:8ÐÀ‘4yŽuTZjçÜÎ)³T:*ržH„… ©Ür;óÜ×T'w7™…÷Ä©†ƒul¦œ§Ìø~A ’r~8C Ëœ~%óŠ2Î{¯VîS4Üs˜9Vë‰ì¤€òñßþö·£†‰D"‘}¨ „B<ˆò¢)Šbvvv0œM6ÔTcÒJ5”Æõ ß-¼ ,Ìp†d¥,tÝ|ǵ3'¤ £‘àÔ¥ŸvwõÞ[k™9Mc®”È (¿ó;¿séÒ¥/÷QCyQm"²Öc±Ùl®_ç¡A¸@¥RI’Dk½ñÛ›¯ÛÊ9—e<ö×½÷Æh8ç¼÷QÄD"û\BnÁC5ŽÈ‹Å9×n·s“““333Íffff&''‹¢KØÊ1[xøJé©´À,ž¥°”ïœò¬tó=÷h@ }ÕS¥Eªê¯e~ç†çûαÔTªA5RH¿ú[Öͨ§EÎ ßνõ2QÃÒñúwõëk…„§  ®? º–>ã%í—=O’;è•´œsEcM%Ü/(ž$w  ©FýÕœB„"À DLÄÅyö^D€D±õä=9IJ4ðŸ>*àµ*PYɽ­dÞ{µ­>Dß\*újŸó¡b‹(AÁP‡ÈQH +"â<[ÇÞ£±Ôɨu%ciP:çPØYã…?wë$+}·ðÝÜ ý¾Òá[ ÌÉ ?ìx¨ê¤²…E,†Ä2‹V¸Aºhã|'§¾¥ñ*ޤÐLô³ÖBøM€ï±õõç09b'FÖ³8ÏäÉ9ÎŒÏ,ypžKKã ‹¿™µž —é™±d¼®›Ð sãz²’|óë¹n„Þè—40’Y6VJG¥CKÌ ªJ*"²”¹ùž:XƒÒÑ ¤vN+™ëh­ ·7ë(·Ô/ sKnõ¾WX^øÅïæTQâçÖ÷J€Ñ*Ö’ÇÏ6ÜsâËŽÈŽ (o¼ñÆßþíß>61·¨¡ŒŽŽ~÷»ßý÷ÿ÷8<ÏÚREÑétæçç“$y¬Ä#åyÞï÷Ûí6LLL´Z­F£±ñæãë¶Ê²,¸=?ö×1‹‹‹ƒÁÀ9§µ®×ë qÈ"‘È~VO£0”/›²íx&cˆ¨R©Ôëu­5ÔëõJ¥âœ ¯ÂãiÓc6%$‘u,Â¥ëa­8«#!ËRz°žyê"_ ë6Jž¥_òÀÉhÅWµN•Z/ ¬™²ðlSÖ3fV:%#ôÕ˜bÉ@#D(ˆ@-‘D¯NSM…‚FÐðL‹È1ô /ç¼0àF Ó#zÿ¼2)I3!–±:6+PK Y×M‚CcžäËä©«eŒE‰§á4È,øÖ²€ök4ZÃÜqf [0J¨,»“ùež5WŸ®0²øµ(ˆÃ` ÏÀ«•z‚“Šgé•Ô-Ù²°€!î20³òÒ¨`cuò’Háx`¸_J‚b¼ÈÚÌü2/lr†…“û]GFõD}ók7$KŒX’FªŽŒê–~–=Â;M:`•gõ¬µ`hÕ ¦®êéNFŠ­æ@A@æPûH pP8w6GRz)d†õÀÌ÷é“…äíCéÅ£ÕcI3ç¡1”î+ã²BÚNIÆóª§8b€4‘‘T)R–s*} ŽÑxÎ-NÖno,R:é[I5Z/kIdI§äåŒ:†GªH…•»m'Ǥ½ùœ‰D^ž€R«Õþñÿ1¤m{|+¹™†rüøñú§ÒZGåY ƒ;«Œ¯Þû²,———ïÞ½T 9tèбcǘ9ü ÖúÅþò 87Á®q¹'  *‰Z)КµRJ! ÒJ)dA'BÃtHH€J)ËúQßÝëУW,,–¤J’ÂCa¥ªÅzP…jU, Ð/«Î yéYffEUHWÏäI”Å‚€¨Ô𠄘P€A*ǘ;8&ð€¥Çžá¼”²”VU0…É«Z!‚aÌ”^ %)˺žB˜±Žd`ZUµAAq(‰æz€†_›ü„— dn-»vN•DMµp¾2Ê_é%à‘•BzK@ý¬#½ÅÅœ™¥š¨4ýrd_>J±Š€R¸t…ˆJ­‡Ò3‚c° –ÕÀÒ\Ÿ?]v‹%{ƒ­¤UKª‰fà¾G’9X?.[ZG^õ­ë°$@‚^ "V4ÖST Nú¬(AfË’9)ýðÞ  ÊNòD,!àðŽÁ ÝR–sé•\6eE-dâ¼´jRMÕcsFD´Ö1Jdg”¿ù›¿yóÍ77Ø‚(/Ç>‘¯<Dò“Ÿüò—¿¼uëÖ[o½uöìÙãÇ@Y–=ºzõêüÇ<|ø0tã`0xíµ×þàþàÝwßžž~RÕz¾V‹‹‹?þñ`í¯÷z½O>ùäÚµkW¯^m4¿û»¿Ûl6“$¡8f‘H$*(ÑeÛÐZW«Õ/£(Šà8Y…µ6MÓJ¥vÒ[9fcõD)¥”Ô‚€â t’¤:ÕLL ƒ}è=$I’V«•§þÚÀÓÃ~ #õ´º.Ì5ä;%¬”xÐ)Ôiµš[ŽYzž¬F¬UÓ‘g)-¥Ç~)¥çÒ£ÒiµZ]ûcülß+„ÉÑ4јy—; JÕjºš*ð–‹Â¯”<0Ô¬`³–¶žõ·<̃˅*PϼÞç5ð”÷>ŒÝËII $˜ü Æ÷µsoY¡V#•õãXM1IR€1IÒ$AFÅ‚ À€0IÒ´dütÉ\_ð’&›‰mE[/ècÉÚCZO°’(ð$ÖÉðO¼”4¥9Ñ|n­—C#x@'µÕ3y’4ETN¢R€z¸p$äÔe@`T‚Z0!ëÑ8ñÁÇu)ºkà^[¾XÑ*¨šªÕ“jE«D{`Ë6¸'„Ft#ÎØ² ¥Â@£öÌu¼T¼È|…! ëbU+OZBañ ]k~5ëþÄde¬©×ÖãSî2‡ÝR2 Ž•<óH*ÝBæ—цjÖÓj‚ÕdgÞ4& *(À"*MS­••Òxð€À +š dN–s¹ßåÉ84šè,aá¤ïTÉ_ŽËVè;ê9ît H ”¨D)…‰R‰VJ)OhHjFÏPx°„˜¤i¥Â,¨Ù Z/…ËJ'Ãñ…][,Ü7` u’ R«:%ô¥RQÍ­uÈ“”ÈËPþìÏþìÿø7݈<©¡üùŸÿù_ýÕ_­ÅŒ|øá‡Q@yüymL¿ß¿wïÞÍ›7?ùä“[·n¥ir‘ÕãóÏ?¿qãÆüü¼µ¶ÑhÀÊÊʧŸ~Úh4šÍæ“RÈóµZ áɲ,Ïóv»}çÎk׮ݽ{—ˆFFFÆÆÆZ­3‡”Ý‘H$²¿õäU”Mš¦½^oiiivvvfffgg—––êõúèèh¥R‘MÙ|‘½€2ƒõ` ¢ö –‘™Åxq koA‡&ܺL %ѽ‰Àkãp`D­y0襜Už6àaøžÜyéY^ðÃ×|íÀÓ}[@@Y/=ËÆ‹ñâ•Fd–’¥[â\ŸS ޱªg¥[HéÆÃwæ 8p´8ù>×áµñgú•0Jîp¥…kT^žßO䩹]^¾Š')H¢$ÑXѨž•ɸgda ËZË_rÈ)TJ¡B¤ÕÈÏ` )ãåÖ²»µìz–4À2–KÆ£g°$+™ƒfm8:…§•œ Mª_§O€HJÏ€XK0Ù²€YÊ¥[PæÑ0WÓJý¾ÕJ2ÞH&›InYN5ƒÈ:dAÇ*÷˜{° "’ð(Kªgi1‡/V¤¢i|ÄjœM´4JB/à2‡ã0ìÃò°Ï0=öLŸ/bñ^r+k€’€AéUïëx¥$f­éZS…ñâÀß^¡ÏÝJA­zšyT¨ôZ@ÓÐ'h¨Î`n¥WJÏBN°Þóëñ9Æ´˜ñÀðÁ–Œ6 YKôÕëQJ $ IÀ{jŠ*=^@!+ËèIbð.Aã¡SH»ÏŠ-If¥o s8Ïô¾yÚ:’n ír˜†¼àšJ¢°ª•BU”! Š cÉ„€J)eY+ÏhXJ/ž×X#/U@y÷Ýwÿú¯ÿzKÊuJš¦?øÁþäOþdý~øá¿þë¿ÆZO¿ß¿qãÆ7:3?¶Â;ίýëû÷ïŸ9sæõ×_ë­·à³Ï>{ðàÁýû÷ñرc‡~ì7Ÿ¯ÕÚFD–——ùË_Þ¸qãáÇÍfó÷~ï÷N:õúë¯×jµ,ËÀÇÛP$ÙÏòÉ0ÄüË‘J½^Ÿ™™aæ[·nÕjµ …üæ7¿¹}ûv³Ùœ™™©Õj°•c6ßî‹ØëD„rÇ…cf` Â,nõ{ÿÕñ^ŸK"·rwÅy·§iª¥k© 4ìºÄz~ºz"àJ'¹cÇâ¼äVJǵTY’vîõÝ|ß7+Ê’¤$Ý‚TK r¸Å¡ò¬'éô°ë¾X²‡šúì‘ÚrC¯ä¥Œõ\E¡óÏY(g+¹]^¥‡ù³^ê)4«z´¦jϨ¥b‰;9Íö\ÈSS:þê‚ZuüŽ>‰gЀàXrË+9õ º»ìîw]æ…JϹãÜréÙ‹X’NÁÝ‚'V³É Œ|¾ä YÕ#Õ¯ÕÃ’;YxAœn%#•- ($Ýœîu܃®ë• =Vºyܬ¨ã*¡ŒñÜÀ‡éÔÏÂ,„ "ž$wÜÉ©WgIjD¥Ð“Ž '¥C²ùÿûYÖ/e´¦Zu=0RXö,a~v šš0™å»ËÞžzf8–¾å^ɹa80œ;i¤ 4@ßðÍëHNL§FRUNAW–—ï{.¬Êb!–©Û†um¼d–º†úåFèÙ J/‹}ZÎýäHr ®44À΄§ ³ˆHPÓŒ3€±–K' Eô"ÆKéÙ‡jåõS †¤pbˆ‰÷P8n¾[Ò4} ÓÒz^Êh1óe¨¦Ì’IyDHhˆ`=ç–s†„E„£¥0oµZ§N€v»}õêUçܸq£×ë…·­V ¶rÌæÏbG`‰IÀóÐÞó"$h<'^€YJ¥cæaÆŠÜJ§ ãY#Ö+j¼®Œ“Å>å–çºnº¥'›¨+(–$3¼’S%Q휬Ú9ƒ’>_4Ÿ/šž…hŸ6Csë¹$¶XÐ’ä–2+‰ë%( } ¡= Sx.ô]¢0Uªô•Ui@z%Ï÷ÝÝc\ÚɽqIˆ VáÚ»wOÒ-yyà—3«úÂ1±¨gçæa¥ã^É€8^W^ ´Ò+ 4U#ÝÉñ¼Ø÷’ë)L6¤ª+µäé^œ‡vNs] ZU,<±Å ÅË¿ügðRVbÈ9:ß÷ÝœÚe^BÖUC’Y.,—ži( P» b%™¡/–,¼9™Š$[Œ3 –ÒñJN·W|¢`¬ªG*OÎm ó*U_©c‰;=è¸Â²÷òÎtõp+ÑOËÜQMñÈhR¸ÊrF™“¾P"CH@üªx„Ý’ š†¾BÇPz)[¥À|Þ¶cõdi@Ð-)sì I· NÉ–e( ~Ðq›gÎ@O’•Ô/©ô¬{%õKJµN²H'ç›ó¦ôÜH±–*½’ÑGæÆ‚Öú††Kfå^ÛÀ±•±:"³”r'¥“Òr×ÐÀ°ãgÎãx%óúþQÏMÞØÁ·Œ",BUÀÃ)ºšD–K/J¡ÖÀ ÖséÅ‘ Bª±– RhõŸ*•Ê|ðÓŸþ4RØd÷z½|üñÇyžï{ß;qâÄc!N¡”cY–¡Lc½^€™™™{÷î•eÙn·ŸZ¦ñùZ~ô£=z”ˆŽ9òî»ïžú((&AL€>úè‡?ü!\¸páÒ¥Ká¸téRxõ2>>~ñâÅJ¥ò³Ÿýìã?¾|ùr¤Ž?~îܹsçÎe+ÇlÁâKâ<ˆˆgɔމ‘9x 0³€ql0«‡<ìø_=,:9×Õëé;Ó5b) /ftgÅMŽèfE×R 祰Ü))QØÎÉÑÐDì–üé¼ùdÞT8ØTO}A,¥“܉§¡Òá†3CÍ /Ëšëú…× ‰%è¼Ð'h¤Ú®ÆÛaei@ó}¯–Ô.¸UÕJI雕á»wKÐ+|;÷Ý‚2£ +¥—Zúf=‹/ }í‘Q ß›©hêÂÉ\×ߘ7©Æßz£ÞÛI¥ô<ß÷{>AÌÆä`3­©§Vxq$œçzDä5´q_©•ƒ!,%d>‚aÅ ˆ¥_ðݶË-âxUy†D¡õ’Y¸àÍvÕÛ‘ó»_Êí% ý²!"°µ"ÖK;ç{mw}¾l¦úØD:9òøÓÄ’tKÑšª­Ó w•5߯('úIÆjI=õ¹E ª óÐ9ßÉÏ}C¨°ž*ËR8 ‰›«b×€'é—¤4ôJÊ-{KÒ)yµO$hŽK}'ƒ’,IE?ez†^ÉÝ’ƒ ÐɹSP«¦«ZJ/+™¿1oJË3céX]Ë|¾X2÷:ÔSjyÂnáõ°DÑš­¥€èXz†z¥·$†dPòÀ<ýu ¯žm§ðK?ß÷+™·´cc`†ÿŸ½7ë•ä¸ÎE×Z‘S {êÝÝš¤dÊ’t`2`Xléö}8~ððïñOñ£ßî‹/Î…ë бÆ)‘ìq÷j×”S k­ûµ›Ǿ‚‹ª$P]¨Ü••‘™UñÅ7¨ªAÊZ¡Lx©OêYÁ‚0‰I}Ô €Æ`ν£v£´AÆ("šX׃lFNÿ>QLrÝñ²KA´Œ¢!i``D°„–@C’!ˆ’(Ì;ÆJTY Ú‡]ÅU`†Ä:&õI·^†$cRÌÜw@è¼\ì£Ü˜ëŽ[/Ó’ »gPöø-(¿r|ó›ßÜ(mÛ¾ýöÛ?ýéO‹EÓ4ÇÇÇ96/„°Z­V«Õd2I)õ}ŸRjšf>ŸçßÁóù¼iš3ç0¶©üR[}p¯2ùòúë¯á _øâ¿ø¼»n=öØc09÷,ò âððð£ÒÔEÓ4¯½öZŒñââ"Æxyy §§§o¾ùæ—¿üå×^{-/ ¼Èk>"“VQ`…1ÊUr k”1‰¨²ètH’çØï.Âýgþ?màW%xíÈΊ€ôà:Ü™{‡ÅAEc„>èµ b0mIB”.èù&=\†«pT™ÎëÇ(I´ ÜQBp`dëõx‚!ñeÏ6iÑñ¬ Àj®¾hSb8ª¬¿1à–õÀ‹>mG¾6øxç Õ…±ˆQtZÒËÆ»Òe^ÜE£nFÞŽbkúh‹ŽIWŸ­Ó»Wþ‡g~RàéÄÀz”wá{‡Êâí©©NË_h&‚—D`M¢"hH+G/’â‘DÇ¢J¨Ö #$ú´(>êù–ß½ ¢À¬_¹SõQ³è¼2u¥A"TÕ˜´ùªO‘uÙ§Í(}”çMFˆ`hWš`tG¨¡AL¢ÛÀ—-ú¤ŠÐY‰ °öAº c”¨ ¬Ë—ƒdרe9ðù&"Âf”át•~à(±€*iiÐ"b`]téÑ2þü2Vfë«*5ú aLzgæN3¯vSÊȺä¢å«>VæÑ2ÝÇWœûB„µÃIA•Gh³uQs»Êû³ItŒ’®GA„Òad@„Ä꓎A‹3Ú8“ è6¨oGé‚få×jàõ ‰5íø^­—!(àt7 »Ï˜6^¶#'VE]iÕóÝ™çÛôp/c`]t|=pXöiÙIäÖÔVކí¨‰uËðîe¬ožºÃÆL Š ›Q6£dsßÖKç5}œ #ж£¬î¼®F¾ØÆEWøO¶ãÁ/¶ýê ”,9Q0(¸k¡EDŸ4‰69ƒ¢ê“ŒIX BGˆ¨c”­—Ög»"xÖÕÈëAâ‹(ª ªcÒÍÀkÏj‰’h`Èg;#E„”²ÜObÒœ“’•&‘5dÑVV°ˆù솠[Ï›‘óíZU£È˜4ª´;ÏcÔÕ gëôl›^5nO ìñù!P¾ñoìG(ãêêê»ßýîýû÷ëº>==Ýl6çççã8Qî3~ã7rp´ˆ‘É®A€d–ÉðÕ‡ÿr[í~1ãØuÝd2ñþÔ{î,°Ö–eY •,Œ{ ϯÏÓÂsÿ• Uiš¦œ4d“ö’Ê>òù´ð”•4õtj³…'YiRªJ_$þïoíh—TW¦iÜtêfõ§\·¾ ±RúuñEAUeêÆN¦Å¬10ñ¡,Á95,ƹ¦if³÷Õó1ÆlΚL&¿-õGJÉZû_ÁÂóÆoüÝßýÝßüÍß|¥’-%ÖȰ ÒöI7£<^Å÷áºãvìƒ|lÂBí¼vAX¡4PZD„>ÈÆs\¶|¶‰Ë>Ý™˜Ô€¬{¹Ø¦1é© i§¡ÈŠƒÕÀ£@äí+¿’X á¤0÷ŽÝ¼ªfež”êvÔõ(Õ']ô|ÝsSPù‘yLzÕ¦ûçáÿy§¿>^µéÕCûÆqX¯:~ûÂÿäÙXº=sÖàÜ*Žš_ßÕa5rçÕ'©¾4·ŸÔ·ò ïáÙ6ú¨µƒ&gš ~JÒʘô|Þ¹ >‰Cè<_wðï‡>Ê›·ŠWÝñÄTuLÒé‚0ktÑ¥eÏÇÓÜÐ:„ˆˆªšÓ£UUDÀA£t^’(¢òÚSHÒì¼q÷úe/«>…!骗ë.õAñzHë©15½ŸÄÑ]ö©*ª¥Ã“ÆL rƤ-?^Æ‹ØOeûqJUŸ¾÷x¸êÒkGÅÜ*¾|»:±&SÛQ6£Dçû~^Ó¼¢YõZ!Ýe¬*«&ѤªHÀ‚CÍÈkÏŠPYÊý<™U¢VPt*KˆØ¥õÈCHëAÖC >ÁeË—m¢8Âmgã ˆª!¨oÒ…¢èŽæU€å ËAkõ'ÏüÎüUŸ ÂíÈ«^CëE&Ž+SXØŒÚyIEôbWž~UÔöÞ‘ãl)8±FÑÎKøc¯Ðà¢ãóŽÇ(c’«–¯;ŽéãÉ…l„qôk\‘ÔɉAzî2SMIUµ4` &Ö˜tŒ’9)g 0d}Ò.H祙³ÐU/ë>~Áw×È:Fi½ŒQJ‹¥EQÈ uK` ªjõ|ÔxÿEC`¢t‡¨è£@R£¬=/:^Âùy³?£B IDAT‚aïÕ'€>ÊϯÃñÌ6f^í]Ò{|^”W_}õµ×^{øðá~œ†a8;;»¸¸¸sç<{öìÉ“'YøýàÁƒ÷Þ{ïôô4³ªcôÞçåÞû£1ÆZû± ¿ÜV“Éäõ×_¿sçNŒq±X¼óÎ;EQܾ}{2™ä[~æPŒ5ÖcÙÈžßýµ@Dà7ØSðËÁXãœuΪu`­~^Ùg¬s®(œ!DÇâ›~éÏû;1¾¿µóʵ¶°®pEQ|Úñ±E²Ž­QcĨüúö‡¬uØçÔZK”‘riî‰ælÑ*Šâ·E Q¶[þÖGóU'z Ñááá§Ûp^ä5/ò£?°„›XÐËYâÓn½=$‚t^Ö ÷Ÿù^Œ%Á ÙµçÍÀ[Ï9äµ òtŸ­]7òÍz­WV ÐpŒÐz¹hùþ…ÿÙUØÕá&:ñýÂÝ:€Û ]P(-V–± ²õ’XCÒìÊÙz£v^bÂÕÀ×=I·Cê‡$Î`dÝŒ²ñb‚è;×ñl›Æ¨ÎÐQC úG·‹üñkç¹ ’ç{×}ºîÒí©ý8"CŸ®ÓÏ.ýžo_ùÈZ9z¸Œ]Ò«6=X„Ë6!ÀŸD@éÈ5%‘ªô^/úpíÓe›6#‡·§¶qÔæùg—ôîzU’¶^žnÒ[ç~3påð 6§3{{joMM]ä¿ ÏE»|– ‹–Ÿn˜ô¤1O7i=òÿ~2nÞ2ýo/•TS´õê“2+D‘E—®Zž–¦q»dE¹‰ÛŤªªd’¨°%, ¡*øÜ{“""«®ÇÚ"0\÷¼è¹b¯{^2-Mi5°®9_§‹–¯ûÔUÕÊâQcîÌí½#×{9߯'ëxÙFƒp±åëžoȬ‹ŽvÞ]úË-‡¨'m 4ˆ>JïųL*À» \Ó—NËÛ35Ÿ"8Î0¬UYT-)!²èd=Jç… ‹¬ˆ‰ÅGÈîž<”…$裌¬ÛQƤ–6#¯‰¬>éU›.[’€¥ÎëzØU,,)-Þ;**Ìò–íÈω•®ûtÝñØ3¼uîz6^æ%m¼®z,ÛóYhZ"Œ‰[Ï­—$ºäY›~vásÜ¢%‰ªB%Sœ­×«6¶a—Ò:)°úd¯ÚäE£èõÀË>ù$¢€1iNZÙŽ2DM¬“’^9t³³î&2â¤@÷«kí B¼a%Æšé›Â`aÐ'õ Æy2` ADõI:Ïmà!jÎY¼å-Kd5ðõÀ"°èøþùh ïŸ]z²Ž›!NMiݪOë1Ek±q„ˆ—m:ߦ»s ¹¡w!²ªŠ¢DkÎ@Aí£’"ª#“DÁ6H`u…aãw(>ÉUÇW]Y êu—]º3µÁÂzûçþ½Õ¿}9ŽQ³‡‚áÝ-ÿÇ×f–ðÙ:oReëùÁ2Ü=°µ¥ÚDÖå —[~¶‰ï\Å‹ Ã'å¼6ް ê“Z‚ÛS[|ºNGU¸nÓpdŸë;>‘BQ`UeeUTÍ­ÐIÀ'mƒôQ±0!ŠjŽºHàaa² fë%²æR¤6ÈvàÄê“\´|ѲOjI»ÀË!ùDË^~t6NJú?ÎÊ‚`G ®G¢I`Ùóe—CÙ{þù¥gƤ%vA®L]œ~RZJ¢!éf”Eó½ù'þ°1_¾]6nFÙŽ"Ф0$£F†‹müŸow?_fUôú±+--:¾ì2ׇmÍÈ>)‹­—·.Æ·.Â[þr›¢À›'åÿùÕéNܘ´ ²ì¹²ôúqqXÿj`UU°ˆ ŠQ´ œo&¡´TXÔQs:u¾Ú¡5  7 ÍP`]¼^”@y?ßG $¬–9'aó®Æ(ŸÃªD}Ò!*!X¢$L }”­×­—1‰1X;Œ‚™ÎÞŽ»[«%œ„*Iàzì* žLLiñé:ÝžÄ>쿘÷ø|(ßüæ7ÿáþa?NÓéôK_úÒ×-½÷y¹2/©9窪º{÷îÅÅÅãÇg³Ù믿&Ð>hb-,*µóXÆ(‹6^·“&„«Ž¯Zn80þìÂÿçãñO‡«XÈ9/uíYþûËUYГuºê8 ŒI.ãKóøÊ;žè£>YÇG«¸õ:D?^§·/|aàxbó»—OC‹žÏ[~°Œ§s÷òÌ>ÁH…7½E» p„(ª>bïÅ'(¡¥¬@ÁÄ0F IŠœBº 9{5 V¤ Ë{/>Iè|›Î·qˆRl½¬zé­žmÒŸÅ{‡®vt<1Q`3òvTUTÕå g›ôxÇ —-wQJƒÖ`dÙsbé‚àNÉ…>ˆ¶^η #kåñ:<\ÚeŸ’˜EÇ[/„àù$à kùý§ãžˆ0¯Ìe›GcÒåÀ„8)¨õ<h½ôA›ZÏ?»Œÿùdxë2œ·)$탾~bÇ(Û ›ž¯:žWÆ"ºÆýò:Ýýªz£@Õ]úÖ3°¨%,-ZÚIêÆ¨Ö@fl ƒÁ³öA»ç‚8ÁßXEô3ã“àÖkëUUÁÒ !•›žø$€Ñ$Ñ,÷ëƒd¾¸´Ä*ªÐGÝzÞÝÇ ‹6!ø…×åŒ!H Ë^XudujC„OWñªM]ÈjöM<{|n”¯ýëEQ|JÌï NOO¿ýíogî#ãßþíß~ô£À_þå_~ûÛß>==M)½ùæ›)¥ïÿû=úÚ×¾?üáW«ÕÑÑÑ›o¾9N»®ûPät:ýÌ­>i¯ˆÈ9÷Ê+¯üÕ_ýÕ+¯¼òÏÿüÏgggÿôOÿtvvöï|çå—_Þ({ì±Çï9èÆd±S ìÈï2X5$ Æ`A8ä@YXŒÁÊà´O²˜ ±TY"„1òfäÍ(‘•'ÅŽCy²ŽIu3ÊÖ+"T9Ö!éŸyQ}¶¨pkb’êzàÄ2D=ÛÄï?=Û·Ü+‡îÖÄ$ÑÞs K…Ch½,ºtÙÅõ c,,FÑ'›$]$­E᪓gÛXÙ]­A8m A¡—f–ž¬ãfäõ ëA’hç9Š–„5•WCºnSŽÂ=Û¤g›p±MÓÊüÉ«µg]ö²Ä65–Ç([Y<&9¬Ìí™fãe úpÏÛô“óñ‹‡ôßïàvómò¬¯YUx¸LC’Ç«8­¨)èºãÿýxx°ë+K¯¸ƒÚ"ÂUÇoûõÀ“ʜ̌%죜oøáÒŸokÏú‡.ÈkÇî 'Å—NKƒx٦˖“@S`SƒþäÜg¥Ï´0¬zÕñ>®:.-nFF‚iA•AħëTÛðÊ›x:³˜££ordE@PDU@-†$"’Š£ÚjA(‚0FÉÖ†ÈÐ8²¤}HC”q±åË.I‰àªãómºîÅGù¿ßê~üÌ·I^:°wgfR"®{þÙ"DÖG«ˆ–q902ÀÃe¼3 üÊ.8¹õòÖ…gà°1!ˆ|ïɰñüÕ»ÕjV˜8sÒC¸èÄ'ýÉ…oJš–õì““hh7OÖ(*€†”B’!hˆRUT0EY +hÀ, óÒGiƒ°jS\õiˆ:D1#Ÿm³mê“ND[/ËE›.6‰Eÿß«~ý^X·ƒl½ƒ°ùñ*ýäÜ‹hW4qTØG¾î!ˆñQwV8U!€.ÈÓUÂ(*ëA®¶éb“ú¨—mÜz.,N ,}”‹m$ÂgëtÝóAM­ç1–“Ó”–=/‡d킾»ð–If¥HÚÀß{âß¾Œ×}Zõi5ÊËsgôÞQqðK(ºó”íè`@U‹*Y²DÀfî|‹c’P,¡5˜=;CÐÎ3(’Ž c%²:óQ,Úzé² é&}9ÉŽ¡fE¸Q 0íÈÖ‹³¨ˆ¥Au;êÖóœÁÒ!xÖíÈ—-/‡Dµ£1©(\÷)‰zÖÂâAMðDuÒzé£6ö ÊŸ¥,˯ýëÿò/ÿò{>N“Éd2™|ð™õzýÊ+¯Àþáæ,½ù|þ•¯|%¥ôÃþðêêêÝw߀«««²,ß|óͯ|å+³Ùì9rzzš ”Ùê£ûSEÞ¼ªªù|>™LŒ1‹Å‹Å{ï½÷èÑ£¢( Ø_f{ì±Çï3p·Ü·gP~§!Šž5‰æ €>J®Ìô Æ ž5ËË}ReÑsa@*‡¥PÒÎGO‹Ú‘3¨Vqë9)l½ ÂÄa0˜D.cT“–æ°1‰ÕŒ¢Cä‹î_øÕÀë¾Xò•»Åu5JŸ³,–µõ¼èøb›z¯I´°PXL O×1{ˆ*CµCDXöül“f%õ£¨%œ–TfŒÀªwffˆzÕ¦1Âu—ηIQ[/¬ZX<¨¨4¸åá2Þ6žoíãU<[‡³MzùÀ¾~TôA–}j=ŸL̼2µÃ5@Órd°„•9š˜IIëA®;^|Þ¦uG*Ĭ+¯–ðxb-Âf”¤ðp“€3xÝ¥ÿ|:<^'¥²¸ 2-"!ôQ.:vÇ 5ƼîÒù&]¶üãg¾´øï†Ö˳mê½ÎJS;|ºN—mR…YIóÚ°èÓM€—箲䓰è[—aÑññÄôA`ZмD@]õòh~za낚’vE€ ŠI,!ˆÀ˜D, 5TZ`QVõI|‚.ˆ*8²à#´£ð³mZô’œ–=?Y§‡ËÐyyû"œmâéÌžÎÍÝ™¤ˆ…ÁEÏIô½EH¬—m ¢·SX¼ìÓ»‹ðÞu¨À{×ñ§çáÁ*Áí©Í¢ƒËè“VŽ"«(T›‚œ¥ã†Ú ï.|iðöÔ„MI¥Eó‹…1xC‹@dU‡hoˆD ‡Å"‚!Ì…J™P“$VB, 2€(¬GÉ3íÒà¤@0>ɪ—!èņ¯NªØEY lW÷Q6^~ü,ÔŽ^>pceÏ}”Ê’%í¢<ÛÄŸž£³(€µ©Z‚!(KŠ¢¹»º4PXL‚D8Fy¼Ž–0)”–˜uëõ½ëXüt¶AÅYI[]”'눈ë‘3‚g}Ü1ˆ‡½t`KkÚQDa9È¢ãia:/ç^té¸1ÓÇH¢ðî"DÑíÈC” Êß2†¤Wm:i,–æ•™ô¼ê3(`Ñ!Š(:|ó1‰ æÒhpa®:öªcÜ}uGDtH²ñ;NÐYì“fáLuJøéNþ•­Rå®Y£h` ªŠ€ÁÒÍé±ñ\2)¨3˜qØ)PxÈ÷=ƒ¥AD“è—mZRZ˜8"ªêuŸ¢h­ fÕ[®¾ÚŒ¼ÙSì”=> |ãߨ(EÓ4™7iš&?3ŸÏ¿öµ¯M§Óªª=zÔ÷="¾öÚk¯¾úêŸüÉŸ¼þúëóùüÑ£G™@ùêW¿úâ[}ú»#¢1æîÝ»ßùÎwîÝ»÷ÿñÃ0Y‚ÒâËs3¯Ìqcê1$3¯Mëå»?ïUá²Ožåb›¼—ÛS3õe¸è æµ9™O°èÞ™™ƒÚĤ/gët¶N·g†X´)è°2Qt!|ÑòžŽ¥Å{G6 Žr“±è.”„ÀZÄ,ebÖÒ ¡†¢AIšÙ“!ª3P[da]öÒy¶Ž×C2 Âjä÷®}å€Yû¤³Ê¼tànO©t»zbkpRáª×·/Ce9påðî܃ëøà:þëƒîÙ&ÁÙ:ýàl\|{f+* mFþy¯âQc!SDXY¸5µÒ¦³MJiœWÆ'øâ‰»55•#óÅB.0VT%@"È ”(:FM¢„è I}5qn{AA"\÷¼yŒÒXS;DÄÒOútˆ ç";Bkpˆº„P·aw¥²"8‹†˜w!SyÝÁ :ˆ@At3JåTœAD„! yXÒEA€Â 3 >ª|Ýr;Êdn uÀ¬÷‰ªPZ*-©jiIVƒ,zž•¦pûo¹=~ãJ.Äý•ïâŸýÙŸíÇé£8<<üã?þãü ?SUUY–Æf>88¸ºº€ÓÓÓ{÷î}ñ‹_<99ADç\~ýóº‡Ùê3ß§Óéd2©ª*„puu5™Lˆ~õk{ì±Ç¿+ì f ì‹Üב3P˜sÂ%ZÄ¤à“ ú 1©#¬,ñ˜ô²åÊ¡ªf=H. í‚,z.- hãð¨&U8oSd–¦¶H„9p$‰„¤ñ°2ÇS;ŒŒÎ *´^ûÈ×]:ÛÄl ;Ú¦¤'Ë´jKµEŸ¤r!ðÞ""«NJ*YôzH‘Á TMK2‹>•kº5á\àZXr9Œ6ÿX@“NKR…óm2„G åÈÛÚѬ4,’^zîYJƒ*0$Ùz¹Ø¦GË«Q’¨³ØT;ðŽ*G“’jG™Ö) ‚ÁÊ‚Êj/[Þ~°N¥Á£ÆÕ”µµ‰"—mjƒŒIK§3sÒ˜yEIà SÑL YÇÍ(ž¥)Èš8-INjõ¢ à“fsb¶0 äÎTEGHˆÊ’zÑ™¨%p Ƙ(3q>ŠC* "â´ (úîÒÀÙ&ù¨µÉÕOסÔtX›¦|?ÀߘW¦õzÖÆÍ( pìÌQc À…ã>Ê;Wẗ^³êf%7¶0 ª°ùÁu(,&Õ©#B°jò‘ž­!Û¬œÁi‰MIÖüb„Ä.ú)×AnÀµ´ó‰„$}0Ö ¥J*C1íØk}„6ðzä4‡_XƒÓ’¢À;W!‰.:fiEÎâeÙ'è¼XKÕ!ÊeËo]xQ¸ê+Ì … Œ« QÜšÒAeDt3òeH…Gâ%°Î +\ö\;™tX!$À§ë4DY\;*f»êeÏúh,¡(LJ:¨Œ5xê%$II¡±X8š”¤×½œmÒaE«>Q `ZÐQC¬  g˜a^Ò¼6GµaÖ§ë´my㥴X8jƒOÌñÄ7/tóI/¶œDKCI17—gbÎBâ -a.Ꭼ]"“Ϸ #$€1éõ 5+"ÔŽBR…]'Ñaý{’D[/mP(M[Ñ$“Ƥùhš°„³ÊÌF~ªTgšÒ4ŽJ‹/ÏíÚëzÔÀ MI³Òœ46³i•ÓiI]”GëXV•6wÊbãè 2ÇÙŒòp•ç_;v·g2)>ìØ Ý­Oo£!—û$c„´ ]È…! }’>ªg)P ¡ 4ˆ†$²ú(h­Á‰£“‰¹îåûgÃu9pmñ 4•£>J`eU¨-š‰#*èOÎýuѧL÷@mÈ¢€%8,Íam†(}Ÿ4Ë@ ‚¦0ÎæAÄ ŒAPñ 2Í+ã“>¼NW÷‘-AAH„•ÅÕ¨gë˜ ˆÊTîÌ,ˆA C•£ÊQ] O°èÓ“6®{fÕÒRa©t„ ¡‚;3{XëñÄT¦.HD§å[ Hî9UyQuãõl“"ëQcXTv×zÖeŸJKPZrsÕWíKd ZƒŽ<ëªçjƒÑ"l¼¬F¾+Ÿ±?Q`ã¥ó¢Ö !UÍN.   „`ÍÎù[/,Ê Æ€€!gnG£LK* Z£‰á¢K9iÛ!ÔK·«ÚzaÕÒ‘5˜×6 G€°dÙsL û”=~óÊ¿I|4%£,˲,ONN~…[½àßAĺ®ëzG;ã¸Z­ºÄûÁÚc=öÊ¾Æø™v IDATsU Ì`--a®‡À›®¦€Â1ØY,óÚ–JCɨA I­ °êÔÒ´0ÁHm¶A‚Ah (³Î ªÍ+3)Ðf¿ƒ^õœº DxÒgð²KC˜•4+©¶T;©#Ϻò<šUTZ"PfѤš…÷óÒÑ1Æ‹­>¸„DKKy˜ÞŸë¬¤À|Ùs4±*€¨–Ž*‹…ÁãÆ”oMèÖÔÞšÚ!è¢ç1êϯ=3vQ&ŽœEg­YI– v4¯Œû€x Ç“l"‚ƒ畱 ¤¤¦ 0ˆ‡•9™˜£ÆÌªò¢ùäÔµÂ༦˜ìvD¸33MA³’¯{¾Üòv” zPšÊâ¼2u•Âí©U„ÚaÖ°4MLåÙFBRg°.({¯šrÌAm ƒQ”² WÆ àU™QU À,, `LÒE IsZJ]Э‰¹îåé6nFé‚ܪÍAµÓ t³C|injó!Ç„%˜8œ&‡YTN ,-6ÞšÙÂÉ$± €³Ð83¯Ì¤ÄÒbž<Ï*ZtÕ'ƒðrAΑBapRÒí™-,éïiø¢ç|Š%Ð1ê4™9CL2è¼DVg•¬‹XDÍç*d1Håàdj“¤§ë¸ö ˆ7"&£0fåÜ–1ÂÓMÚŒ¼ r§±#B(–ŒÁÆQSP] Â$ÚE‰¢•E‹¶0ˆ„à,ZÂNÄ g¥9jìdRðr‰€ …Ek°r£¬=× O§¶qdáAE)Ùõ † vä,L bÑë^D"ø¤I¡r»“O§–UkÓè ‚båpˆÚG‰IY`RfeÖ/&Ð|2|’Ë6IïYŸ$«¢,„Žõº—Æ”AØEC}gpV¢%²2©E׳褤Â`éPDÏ7éáu¼ÕØÊB6+}ìž$†Ös„ –0±Š@b¬ùÌɇA0ªºõÌJµ#Gˆª;Š@ëÕGW@Ö`½Ú²OâYªÒ–J—qѳ²hSì¸/?Øãw¢rÅ&’1` `ˆ *}ÐÀ:C*,„0qˆÇ)-:‹6¡1.»4K4/©0h Òacº ±‹ˆà,TE>aàh¢…¥Ú¡%ÌžkpLr¶‰¡O:-èµC[8´k¸h³2 jí0O3^:´Í@žµ0xPQiQCR"@…Ò`ãp^™1 \÷ü£3_dÕãÆ~H‚j Î+ÓE9ߤ‹”ºQœÅ¤zX 5XZüƒ[ER•T;,,1ˤÄ>Êãeò¬ÌPÖ˜ ,ÙÉrPÑÄaí¨*v.›çx>áÜ G7Tš‚¦¥±_=´wf¶v@/0v†pâH§¨pÜØÊÁ´ÀyiŽ*¾xÙKiß§« ­©É3ÉüJ §Ss-`í ²»„Ë‚ógJ¢c’ü ÛX”T‰° , xƒ„’A’îÒU'¥) ¦UÏ!©#¬ šVJCQÁyif%º_< „XY¨ j e7.™°8nh^š$ϵ!H´«’½kU4«h5Ýd?8)¾4·'+ª¯ÌÝéÔÔŽ } küÁSè¹U¤ ÒzaVr¸óƒ€>H$Š"îö ED$¤’À$ÄÒÑí):Q(z ź@¢l½DÖiA%ÍJ"ÄõÀ—[^Ì Æ 3h GÓÊÔjt Aa¡0˜ƒTU€YÒ""ª#, ‚%¬-dâ̾zh‰à½k5KC.()ªVŽjGD@ˆ…ƒšîYD¬Á¼2cLWñb ÛQ¬QïÉÒâéÔ(@މÉ|Tp5ª€ܚأÆNŠOä)>„À°ì¹ ¼ê‹ÞKÍ)ÎpcáYô - ,,8€HQ´ Z•` D"4„ª°Œ“’J‹IpdýÙeP…iIÆÀKsûI=M,Úyé‚:ƒ‘!A ••ðgND*‹ÏoC”˜´ ’ót ‹…6êùCR¨Z‹vÇÓ‚CÌIADZ[j…—}ºîv›ì±ÇoŽ@¹}ûöíÛ·Ýûú)}º{ì±Ç{ìñ_‘=È{ùÉçªXYœ‚Æ$Apˆ9sà DŸ„UÁÒ¢%µn7dD8¨ÈY$RGxÔØ!èÚ³A,-M‚A5.»ðù’ÀÅ–kWf^›Y‰,ª !íf}¥ÅÒBiñ¶ÚI!}ƒ8«ÈÖ!ˆA´¥Åº <û=¨Lå²K6«Z,|hFf›ç…)-o?ëRíð 2yÆX9|N7dG€50)hmä¬K!iSPiÉÜd£YƒÓÒˆjióœ?ô^â¼’Ó)À¤ÄâfÊd›‚N§&)ÝžÚƒŠÜ‹M3ý4-À ¸Ñ•X¨¬–ëÂ4.âAµ[Ò'„æS93 54æ 4ª0)¨t`ñãß‹ˆE¡ ,»ÓvKëJˆÑXƒ…"`Õ(;ÒÕV*K!™IAm¬Õ»ðKl °DMu‘K—ðCû`KƒÓ¨ÂAiê‚,!¬ ÁÁ§,¶;Âye+>'̉›•Åç‡Ùºr÷Æ&?𠏻õ='tì ±xC”€ÙùA‡¨ùyƒ˜U&ë• ©#* ‚#t‚‚OZYá¤À@ÛŽD BG8)La‘EQ5÷ò¢%°KG¢Ó¬²`s6ªA œ®š­U”(FKƒY Q;ª:ƒ`ðh ¬:k V™Ÿ²Pà. ê‚ íÆ¢vt<…ç”Ü´ÄÎ#l=GÖÜ£\ï_ ùŠûÐ!5ˆ†Þ»i¹ÛÄRO$ÖÍ(˯ºÔù]R¶)!+tž¡)M¾0óeÇ‚c”Ñœmk.e¯"šÀºñ|ÑÆ‹­»;··&Ÿ8ÍÌʤlvç"°‚ˆ&Öxs™ä‹Á"â„’æ}@½îÒ´9ób¥Ag@T·ž#ä¤Ê‘£<è´Sè !`0+zp5ʲ—â{üú ”üÇü×ý×ß̾>yòÿ±÷¦?r\×ùÿ9ç.UÕËôìC7s•(R¢eë'Ç‹l#ŽÙq8/ã €aÎŽ’!/òÆ€áI8Hò"/ã8¾°å]6$›v,‰–8Z¸ˆœ!9äìÓݵÜ{~/nuÏÂáq43œóaU7«jªk»÷>÷9ç\• &‚ ì8%LzKã/ pîB•ÔV#!¤Ž¹àVV$4‚Ud ÁjÃ0D´#‚ŘY+ ã°¿ªÚ…Ÿ˜'E„ét„H‘U!l‡–IPø²$-…ùUÂÄÐH6DAF©X2:T‡…¾„ê…D!mšó‚Æ ÄDšbƒFC¤q_Ÿ&‚KÓ™÷lÆ ®¸[5"jT`_¯!ÂkóEš³® Ñ¤ 1Òå8¹;Ì®YU5ž°Õ-„kÂjÌHj­øDˆ5ÕÊ|–Ëÿ)1¸¿Ï0— ÝOºzE˜ Ýoª†¬âžÈ2r¬É¨µã!‚§£Q_¢<@5R±Æ;kEB¶„`!õÌœyãP È*Ð ÃÙSª +#F…åPŸ‚`Dˆ­ÜÇšgL,…‚Ð= …wÊX§ÖbTJõÄ´ÜÝp—±ÂžˆbkÌÄ:x1î[;îTç ç|1÷‹™/˜‰Ð„xhå¾™{ç¡LÝÚÕ"u(Ö³ìgZƒ#u݈U+÷ƒ"p¡ÊUîc‘јXŠ5¤¹ªEj1g,Øò^õ@Õ›(­°ÌË£Fˆ€ÂÒ£1$þ”Ø`lP! bÅÐ@U{D¬XÌ*¯£A¨šÒõ³üNëÞ{UC½‰¨éŒy¡ís#1•{¾FÃyn¥n¦é&Š4/% w "zl±OZ¥cCZA¨ÁžSÀÂ{DÖXFքа܇wKЕ s¼±&È n徸s&ç¹™ùvÎ Ë’aà=™íJµ±#´•§…‰Ð(`¦Vá'gŠ…¶ŸÏü@E)£ÑcðÈ‘)sÐ ¢¡ 3•BžQedPbhŽÜbÛÏ6]^ˆITx¯”çž{NN¢ ‚ Üi¡š)‹‚²Ãñ¥¥4ƒ„¬íÜž[;b4JK…bP‘ÂΰµB£ ¡ðjX¿j¡«ÞD@d(RV`€Ò³™XXÈ\î!„äÿBM)fhÚy®G*R¥×@­tg8ÏL"ˆ!D¬É(¢þ*8dzm•œXŠôja bÅÒ`M;.³T Å¥<«<аj©¡&Ј±¦Ø,¼„lw; j`µËÃ*ìM((÷[ë/øPnÿF+LÌÝ·UˆUƒµÒ¢ÕzG@„Zaîa!õ޹peYd&D¶Š´ A"` ¡ cÔà^!‚2ë‡Rn¾ƒŠ™cõ˜ê62êŽÇlôÆ*6\³T1¤îÍ­£É@ÕªŠ¡\AÕR¬é¾„*DXµz¸å0wÜv¡O·—^†ÂsîÂy þP„†Ø(´ £`Téþ.Bm1ÖœXÌøŽ‘áA«0Ö`Æë1¥9£ 4q5¢Øpo¢ª…‚2€  ¬Bm<„¤°ºô)°Uê¶hB«(äñ "b0Aæ+|)Œ†ázl0Ö¨pí{O«ÒK•;^L3ä2óæ ( à·2?Ûr“ ®pœ9î¨'@Lì £Ã›¡|´=xf…aT„JÀŠ 6iòží{2ˆj-%’9$“âvΩóŠ Òè\é@qž3Ç‘÷?(‚î«C!tüV´žû5XQ5[ó*pˆUCÕ®H¡!ÔyçyGdBŠ5F ³‚g[~rÁM5I1+)"*l®€"‚ Âõ (SZÈìÖŽP Ï9‡ÙKTy1÷yiî³FSåD€aæSc¤@uçl;fu£À¨â’ÐH-„–!2˜ÒÇÞXw¢]8RhtÙÑ'€ÄÐhC3s(õºæp—MÈõ@¨"±Ænu•¾ŠÞ×í‚{bŠ ­é8âöž3çëq‡Öê_T¢2‰©va|µÚÕ²Ág Ã3µ5ƒœÈОº€Ä ÞÑ€RŠDFaîy>óÎù³B´ˆ>˜ÊûA†/DP@¦ãF¡Î9ïK(ÒX1NZ™ÃØ¢¨¬‘>v¥€‚= U=XM‘xïgØj¬Çª`¨ZiP÷­U1"p'X ÃØ›ЃѨÃsÑ©XÔU|B¼Fÿ N«©[j…žEwâÚB“pÚC´Np'Y˜ ¯Z¹7ªÌÛWQÌЇФîó…VcÅ`îÊÑá°KX“Õ¤.—Ò„µ¨\Pè Q¤È(2Š"½†¹œXãPÍx³MõHU¬Ò›# „2p¹çVîg[îæBáRǦSF!*ÄY!Ä*ˆ³¥u±Lxvåúå) é16T·¨ˆzê­è‘ºjwÏ 玳Âçƒçˆ Ò˜1 32çsO!`ª+\šND˜"Œ4ÆšjbƒÞsb¨Q_… ‘Æò9B¨X Ylƒw/È Øj¦-MŒ4!ÃtÛ½y3­E¼§ê–•d“D@A„­•QÃØAD” xïÙyf9PÐjôn.¸,÷Í܇D°™•t[Îv"Ñ$tîµBKˆPÎ~'ª b eD ªN|˜ñaË\'Ýá™Uhˆ<”z Þ!7‡GˆM‘.'ü­Âj„ƒu9Ž: Öbãˆ×¹c£16Dk¯‰‘*ç¥ ï«†MDfX²…óư'îø_îvJ!~!uyÁ…‡Xƒ"$@UêJCSÙ)B‚¥ÐÄ "ÖerdàzDC¤Ly{Ç^>BÅ (}?†D°z+äK÷*Õ}ïQy/„H¥ðúãp5u†î 9è CÌÅ2ÉO‘ÕÞ(TŠWBZw#JˆP#kF‘þ­°‘(f˜ÅÓ a=¢ _¨UåŸTéÑ»‡öØ@d(Ò¨W^øå^*D´ŠBʘH— Î:§MÖ-ä=\÷ÌЫÈÀƒzFV‹¿Ì™ã´à´€…ÌO6„{2œÀð{ ˜J…¢Ì\.œ^ºKƒOª VB… U°ÚQHïR¨jÉ$Z£½s ­NÌ#”¹f€UÆœœ9ˆté1Càà@é>)VQÅRÐ!1+´ [kžPˆƒeHTpüQùj-_ÑX&÷4j…ÍÌÝHÍñª(D%ž Š ‚ l•z‚À$¾z' ( γóàËŠ±Æ…Œ/Må!/f#"ER„­´l&œ5…<a …V-Íê[ýU·åûX1Ü*·BDЀ±¦D“^6DéÖp½»CÒÃe5©eL… @·ºí:{è¬ ësŸT"2škQ zŒñ÷(%”ÞÅÔ· .<FpЙ·/gÅË3òžh£@©Õ§¹ÓAV,@ÈR±þ¡âFí:F•^›HÝ÷>hÉ~ @!ƒÇ0 #  &$F@*¥eÙgÁ(Œ5]®¿æß L a¤)2´\æù\ÈsppÐï$6ŠYöǂܙhJ,Å ÖI¦Ž61T±œÜ[ƙڶ¯Bá„oÞó’¶.f>÷Üv<ÛrDà=wÝ3¡8±Öl–¡‚ÐM²ÍO¸g5é® ÊÀ™{’r,¤~1ãP¡Y«ÎÍ€Ž9Í93 QiA"&B.(åFá6ž!´ ,A¤°¢)Ò¤9äŸ"TÊ·h¸Àˆ¨)Btžc–™AAAØZõ± ¨–ž, sÌe6‡ŠE«´BœiúƒUEBœNõ•Þ“0ŒìøGˆPuêz,Þuø†Ð!k†Œ5&÷_:•YÀh\Cs¹÷áò]WÔ êzÕHÅônJ,†sÈ0Ÿù4gÇ\Æ›@(F‹F-åõèvAåкç¶SÍgS5ÜÉ©qOÏ –yB”Òâ»Ýžàq)6”ꌥ;÷¼VlZE†ÖË¡2•Äš:ÏÝÒU ÀXC)ÖI]¬ŒÂHµô(« 2Xµh×É#Cˆ!mm-ÂH£º7CçncÊbÆ‹©wž‹æÀ¡ê…°¬’ŽQˆ$辈ÀæÎcÇnÖõn¨ŽE•)±ñ^$õÍÌ#”rp0d…t*ÎA»à¬(%Eèy•8äSx‡:Y!å°Õd4†¢<¡$¼)]'¨€­*Ý(ŠÅC}v´‡™a_{eˆI²È " ‚ ÂV¢Bÿ”¼œ QEÚ¢Z¯Ý‡IÓtvv¶Ýn¯ú>ŽãF£EÑöì˜3Ï™‡P—S!DŠ* =±Zȼש*‚Án5Yµ¢‡Uh4ÙN¸¾Ï°4†€ˆ±¡È ¾ÿ޾QЫ°@›|í a=VÀ[0 qW K0I°]p;÷Ý4a°Je´¨e‚‹&4ŠìÊ0–5Š›,tGmôzQ©##°F"¢RAÙ‚qÇzªLÀQæ@¡å²ˆÂHC¬À®_óA+Œ5&­\™Ü„Té™Z1)£«heõœØPb)ØÇÖ•` 6TqlÕ½>›ïERç°™úÅÌž fW FˆLÇPƒ!Õ hF«‰¨”}qEøL7SpYø¹/£î9ö(÷°ñbæËÌ5ˆA= >'fl»2= • kBEKÇ ×ükAj‰t¨D]–GTªLÒL€F¡¥¥7³Uh“òC_#$≠Š ‚ l©„Ø)‚ gc¤izýúõÉÉÉ›7oÀàààÐÐÐÈÈÈ”ÙÙÙW^y寫¾~üñLJ‡‡7°çNûîŒ+!!T#ÜÛPŒìf¸,º‰*GT…ÝžÑi°µÂû4…™ð®‡%Ño(-«&lÄl›ŠUØŸupw•~¢ÃÎ9N='šBÒbVˆaüÊ©v²p瘲Πîô®Ôb–QÁBe:RÐ¥¥¬ê½\X %„#íW=Mk¾f a¬1ÒdÑJ¯JÈ» ëÆ¸©àa1¤Í²ŠQT†ö@Å®Âc&ßEjyï)D@A„í=’I »/\¸ðòË/¿ð ÓÓÓ{öì€k×®õ÷÷ÏÍÍ=þøã‡¾]@™žž>{öì… n÷›xï7¶gÏ;,@ge§«8¯[+«!Tv€B£ÑL+Óa†ÚÃjCóŸ„æWMˆ’¡l`fÔaC¹-6 ú„aÌ.¯„ 2ºÆER8FcMU ìKTYf5ˆMˆ…£Hc¢×Ë÷±S~~Y¥;È"D¨@¯ "b¨å’mw¬ |óLÝ2ÏëÈZ±5˜˜`wÚØs‰”V~Wï&;†òXTÖ£Aµý(­ˆ02¹‡nm¦ò7¢BˆôŠ’ÕØÉmL´â½§*û*ˆ¨BÉž{?çy!ä@A0TxêT¤©‡}P —Þ!Ý|+AL¡;ˆhZA¤©f)¤¹]ñOòÎnüÍ)" ì0˜Ù{ßn·ççç[­Vžç`­M’¤^¯GQÔ­––¦éÂÂB³ÙìFtW*•Z­¶<êûvîw«ÅÅÅÉÉIªV«ÝƒlµZ333Y–i­Ñ9 µÔAý<ˆ‚rß,,,ŒÍÏÏGQ444ô‘¹¹¹óçχoúúúVmÕjµ&&&&&&Nœ8lÜZë8Ž{zzŒ1Û33æžG¤Îl9t»V#ªj° ™AX…ŽÙ. ÐÞøXS¤IÓFÊm„«0±H€öt¼›Üûs»“²,.!*.³¥B¤a°ªrOUC‰Yš'· zio«é\ó;£b(;Fð„²¦3$A1ÁÏB{-å· £ÑCYdg<ˆlz†Š¡Hã”Râ4ˆåVü«B¤{Hõ®ÎÈ]Aç¹™r+÷JaÍ÷ì;¾ÐJõÊjŒ4-‰wˆ`L'kY±j@E at?£ÉÜóBæ3Ë+‘q'£°ïÔö –%dPT– ï@u‡7 Ù©4V#…·bW„ñnuà " ìR¼÷išNNN¾þúëW¯^››€ÞÞÞýû÷Ÿ8qbxxØZ«”bæùùù±±±wÞy'ÃÃÃ8~ü¸µöN/Œ l599ù½ï}>ùÉO%H<·nÝúùÏ>55ÕÓÓÓßß?<<Œq¯\>ADCA)Á’“¨ IDATsÿÌÎΞ;wîúõëgΜ9räÈ‘#GàÑG}ûí·ß|óÍsçÎ>}úÀk÷o´®T*õzjµÚž={<ØUüïwÏž¡psw¦tÅß² »5>2ÇZ¡ÑèŒ^žD¶œ ñë‡Ôõè.¡Â6B½…À´¤`öW3(ZVÕ%6¸§® fêTZÝé/½ „”é3‰Py.U†2©'2‚‚Õ¢¬ðMÁ™RŠPhvjåÂ:§D!Eœ´z#¥Bˆ4BV´†?ë~ªSm»k—{˜Ï|3÷VAa»ÀÜ ayMvYf¥P1ŠíÊòÒ!4Ïh®G´¼Àö½I9°ºÅÜ…¢9ˆÜ÷RˆŠØ»%õ:Ùm41.åCY[H 9b­†z¨2¶ò& ‚Š)A”]ÁÜÜÜ… .]ºtùòå[·n5›Mïýõë×§¦¦Z­ÖáÇ<ÇñìììÅ‹_yå•+W®„7nܘ™™QJyïWU„j÷»ÕÌÌÌ/ùKxÿûߤ“ùùùk×®½ýöÛçÏŸ”ÛgAv¡vº}¤Ï}ÓjµÞyçùùùƒ>ùä“{÷î€F£QÅÙ³g½÷­Vëö­â8NÓ44^Á¿955eŒ‰¢È9W¯×ïwÏž9u>/‚ï¼÷ιJè”3{ÏÄ^#±`ïÊÁ‚Dà­bFïœÛˆ¤FàËalp;ç\8É´F<±( (ò4'ï¹( ï‚ÓXü€½÷À»%Ü0Ë®a¼Ô+g`^y‹mÏkyžggHžò,/Š¢pÎ{öì»#[öÝ,P Á³wìØ°çPcE°÷ì‘GVÀŒL Ðy¾“ …½WÈ ØktìÑÝg¥"f@f…¬‰Ñ{v°Ý5¬¢À"ϳœ³LéuÓ¼´Ó|¾™7S§Ð'5BÁ ¹¼'=![ò‘=„w‹÷À)ä`»ãeï=0¡óª{Õ9(Š"Ï9Ï|†j#i»fê­ ¼wœsž=+€ÌȽ÷@£¯hèÐj´èÙ;¿ŽDÅ`ˆÀ³_ñ±3º\¸Ó“UçPdHÈ‚(;Ÿ‰‰‰ÿýßÿ½páB___OOÏÈÈHš¦ãããׯ_ã7Nž<ùÙÏ~¶Ñhœ;wî•W^yõÕWÓ4=tè\ºtéÚµkiš...ž:ujy4x ÌÂÝïVÍfóâÅ‹a!¸c._¾üï|çâÅ‹ˆxàÀcÇŽíß¿ß{¿XÈÕa7ë'@€ŒÌ^<(÷IžçsssY–5ÁÁÁ ˆ 6v»í½­«h4?þx­V3ÆÌÎΆ\¿~½§§ç©§ž:sæÌÉ“'ïwÏÞs;wiá˜ó¢È²µûà…c'b, Ÿu†aÀ;¡«eÙFtï8×gÙÃlBqÎ…«ÀÌJm÷p`t˜¶[zq1÷ÒV^dœGvA5@fð.Ϫ«ÖnS³éµâ ŒBfX\tí4/2Wx( ÏìÃogöì 瘙 ¡y^>®ðÀ¬<;.rŸ!23bÇÄAÑçÑㆾa·€ì¼ÃuÖ\_CñÌÄ#oû •*×l‹†¬'gÖ;ܹy7³Îµ …l "È Á»"Ï}A ™‹3FÈsöÎ3ûâÎï½GEÔjåM£ø¶·ÜüB1·˜.¤EŒà9/|Æ\…+¼Fðà½wE9!hàËû¨y¾ÞLD˜«€aù±ºÂ[ðà ¾Ó¯H7›Ü6dU"í¯ ÊÃ3GQ422²gÏžF£ÑjµˆèÂ… o½õ3ìc#¢×^{íÍ7ßtÎ >|gffÞxã ­õÁƒo—Bæçç7°U–e333Þû………[·n]¹råõ×_¿|ùr»Ý>xðàáÇ÷ïß?000;;»XÈ„« »šPÝ–ËN9÷7„rFÈÌFÑ•J%Š¢¢(‚ÿqMåÌ™3¡å RÈäääÌÌÌüüü¹sç´Ö£££÷»gà<8…èq½©^„©„°]™ë„ŒÂŠ}W%„a%*äÙæ~¨UL:#´«RWvóuòYb§ÔwHº”¨U!Æ ¦X“QŒè—H€ŒÀwN‚¢ `hÜxz ÈÕ»Ôs3õiæk1ÆSæd-ÃdÊ2F`5Æz)TªV£R¨À‘@+÷iî)QV­¨G¦:¦Biäò@A-F­®piÝá¹Xó.Ñ„‰}Ê· " Û‚={ö|æ3ŸiµZaV-MÓ'Nœ={öòåËÓÓÓY–ÍÏÏ¿ñÆSSSO=õÔÉ“'ƒ—dttôµ×^;{öìo¼ñ‘|äö=ol«@Q o¾ùæ·¿ýík×® ž:uê±Ç;xð`__¢TYa·ƒ!ˆGÞ…ï!}}}üàCD*33óìììøøøk¯½öÒK/½üòËO?ýôF®$*"¥5*kµk«(虉C¬Qi\Þ_GÅL‰³¡$†!2A@yÈGãιðäc¶¿Åh´‘Š]­FÞs”´ãváÐ'­B)§Q‘ÖÚ˜;Þ9;‘8V•J\­êZDšª.£–µ…f0¦ ,™ˆ´ÖÖj&OT(ÆØè$2Öb(àE¾–€Ö¾'QµMVc¸îÝÒï¼®p©¬aKevQ¤+‰©Vu­¢*ëÞWñlšs–yiM©óáí¨”2ÆÕìj‰©%¤:uÖóʰÖèQѽݽQ¤’ÄTªªVÓµhéÉe0QÛsÛ³‹Œ®Ä:²dˆÑ§µ7ä2…hµŽ­²†‚³Éľ,´Á÷žâˆí“¶DT*Ç´ý_8‚(ÂÝéééyôÑG I­u>², UxªÕªÖºÝn_»v­Õjíß¿ÿ±Ç€jµ:??ÿýï?̶ݾçm˜}õÕW¯]»võêU¥Ô¡C‡NŸ>}üøñþþþ°ç0‰ç Wì Q6¥‹¹#¢Ä]y^ä¹Ï .ò¢(œÛþáÝ"wbÂa^ø<÷y^¸þÞ•`+î. È ÌrȲõz ¥ÔöÏ(…Z“Ö&2¦`ֺКG£}¨8£‰4‘RJ©‡çe®T„Œµ¤2ƒ±¨u®#ƒ",' QZ­Œ¢‘º)<4X²š”BH, ÕTÛQo¢ª ‚Rx_×]° jw‘\­µÒÆXc¬Uw’6‚ù”Ë=æŒ"k°Y`Á.w@DJ‘"Œ´ò±QÖbY'ØhˆªZ´ŽKFßÓÝ«” Z¡±ÚÚ¥+è ÇŒyáÉ1M‘ÑZ£BöÞ+š˜•"­•Òô ¬vK ¨Ux§}jÆ Ö2,ˆ€ò4Q*tC[ÂÌÓÓÓ¿øÅ/Þzë­‘‘‘Ôëõ[·n-..æy^­VF(ÖØh4ªÕjš¦Î¹¢(Öžm`«ÀÄÄÄsÏ=wôèÑ#GŽ<ú裡fAè†B§.OQi í6¦g¹˜×7E@ÙQâmMͦ3Œ™ƒVË¥©Ï²‡SPKÛn±é´R¹ã…67›®û½;+ ÀœmÀ–¡f3_°Zëõx曾Õ*Ò¶kgœ›õ.ÒŒmE­¦Z\ÈCh.úvšçyî¼/Š¢ÙlÎÏçË”¬Ô{ß­°ûÞ¿CÚí6"&I²UÇpçáîééYXX˜½yóf8¼›7oÎÎÎÆq\¯×ïñ€±Ã†÷œ8Ø@pÊDv&£uLà„¨U«u{7<øäßå0Oúö;DTˆJ¡Q¨pdÕx0p§°Kç<0!(‚ª¥“{bf¨XŒôÒ8614ÚÐŽÑ*@ðà6X£Jn¹5®ƒóœ;NA¤)Ñ\8ò¾Lƪ#¾ôw`W#Ñ„5«<ƒsXð]öAœçfέœsÏ`ÍÊÊJá-M¡¦2®8’w!1‡ä>D@Ù=m°Ö:X‘nÞ¼966666677wäÈ‘Gy¤ÑhLNNEzáQ…±VEƘ0ƒ½f¬xÐ8îw«@–eSSS}}}ûöí#¢Z­V«Õ‚AFA(_àÝw2¡HÿíÞ¨T*¿té’ÖzvvÞ~ûíË—/7ÑÑÑ$IB-9èÖŒ ßtCxŠ¢˜››¿råJ’$CCCQEQt×=/?KЈ`°Šsž°­Ú9;ÏwR74tër®¾Ö$úÇ.ƒl0"Ñ.à‡¬O€Èˆ!¥…BF„ØP¼–æ©Ö;£sç8¿òƒÃ3§…oçœ;ff£0Öl;L;3¤Š06†Vhš°‘!ôÌVã» >+<7s·˜yç´ ¥‘1$}%ÂROéæÍy #)PòîD@Ù…„Žàµk×~ô£?~jjjxx8èííED¥T5ã\2œsÁ˜­”Z³éÞØVXÔßß?66–eÙèèhµZµÖ†=‡¨×(ŠbO‘ó¥I|ðì”(ñ8R•JT­.¸é‹¨YXÿp†ðD±®V’ZM‡žBûJQÄQj ÷_ß-;Û%±ªTL­fêÉzç'E—,¤Q–Çì6Ëb-űJ*ºZ³õŠ€y_$IÛP˜“ÒqœÔj1uœ yž‡P‘jµºUî¢(´ÖÛ3„§§§ç±Ç+Šâå—_>wî܉'`llÌ9wøðáÇ{¬§§gvvö•W^€Ç<$Ž ßܸq#œáf³*Ö…ó™Ó§O7 yºABç“¡“ÌXæÕîjµzäÈ‘8ŽÆÄÄDÈsòäɽ{÷>úè£{÷î­V«333išÂ²€Sï}š¦ae¥T¥R…9²gÏžF£ˆwݳœáÝcôĤ(T°V»­„*w³É+oë ÄÄÐpÂÄ&Œ D9†€$ÂXÐfÞŸÎóbæÓÜ#¡ÕH·åˆ zJwvA‰—OضŠœ‚Áììì¹sç~úÓŸþä'?™™™9|øðþýû`qq±ÙlV«ÕÁÁÁ$I:„ˆ—/_öÞ‡ˆî±±±+W® Â7µZíèÑ£Õju`` Ùl6v»$ HÖKAv»„ˆ ] 0Ë\¬ »aô^& ˆx¼m%MëPygÛ£ÂC3ã+3ù o5ߺ•Ucôs¬n“lQøBQO„íŒ(;ƒF£qúôé_³æ¿Öjµ`Q™_ççç§§§ ¯¯¯^¯W*• ¸,wŽ”w€ÖµZ-Š¢u¶ºÞÞÞ÷¿ÿýa!|c­íïïã¸Z­ÎÏÏgYІHábA„.! \ááÝaé+ ”Ù´m‡BH ……Í#$ÁÉ ž˜ÏßšÎzcªXÒ Ím²MiV"$B%S ÂöF”A>ºq7«0ÆT*• ÖÚP‚ÑZ«µîV?½]@)_£ënu§ã¹}?Q õöö†¢˜išæ©\=Av/¡SˆÀžÁ3І"ÂC-O%ž‚ívuS.lâ8Sa=¢Þ õ%Ê(œm¹vÁC5cªÛI„HÈš€H ðÛPvƘ»&sí¼‰ˆŒ1kF€ßi?ëouïû BLXn·ÛÎ9H¥ »@ˆŒ eYA„]hèTá¶UÄéÍw  XU«ÝcéZê¼B°jµFIE(ꉰý9XA6±•E@ê4·ÌÀ¢ ‚°KèØO0Œ…íÓ6!Z…V!mþu1û+4PU‘FD´jí*>ñÄ" ‚ ;FDDì>=ƒg‘PAAv Û%„ç'?ùIXèëëûô§?Ý××>¾øâ‹r‘A„ÛÊ@(,€]Š ‚ ‚°ãØ\ŠRêØ±cay~~~||üNkNLL„f¾~ýúž={V}/l9Þ{çÜâââÍ›7çææÒ4€(ŠzzzkµšR×(‚°€Nafpï­z Ìœ/ŽK 3zf¬0ìÑ10ìª÷·´h‚ ‚ l€ÍP>ñ‰OüîïþnXNÓôoÿöoyå¼[µZýõ_ÿõáááÇÀ­[·þñÿñÆÃÃÃò'200ðð.\¸qãÆóÏ?ßl6å‚m!ιV«uñâÅþð‡¯½öÚ7`xxøäÉ“Ï<óÌÑ£G“$ÑZê: ‚ ÜyÜïi3xæÂqê u>/8sœ;N/xæDqä+š v‘^ -š ‚ àÁwFGG»N“}ûöu¿¢¨¯¯ojj ªÕª1ffffÏž=Ÿþô§»ëüà?˜7nüà?øüç?ßÓÓsæÌ8wîÜÛo¿-l iµZï¼óÎùóçßxã+W®äyW®\1ÆŒŒŒc8ÐÓÓ#'Ja¡’1”yd×Ö)J«ˆcÜ"ì¹\Œ$ž=Ê/}i'ñ¾Ü—6p Îsá u>+8s>wœ9ÈdŽgf¬ÀÉ!Œª€JZ4iÑAAX) Ñïÿþï?ýôÓ/½ôÒý×E144´|…ÑÑÑ©©©Gyäÿðñ«_ýêí{XÖÝëìöbzzúìÙ³cccðÄO<úè£ðúë¯ÏÏÏ¿òÊ+išÖj5én ‚ ¬ € 4·¯ÀÌ™ãÜqî +8w> ËŽ³‚SçóRÇyáSÇyp‘œ;ß.8-|^pZ@î8s\8ÎŽãÂw‚w<{¿²%€ãj06}±"ÚEÍ®´h‚ ‚ l€&  bPOàé§Ÿ>pà€Öz•€ò¥/}éí·ß>zôhJþüÏÿü_þå_¾ñoìÙ³çøñã}}}ÿøÇ_ýõ«W¯ŽŽŽ>óÌ3¡‹óÆoLLL¬“?Exo˜ŸŸ»råÊ¡C‡{ì±|à`Œyíµ×.^¼O>ùäíãföÞ{á?r8á$‡…í|†½WÎ{và]¸øa½{çs αóÞyï=lì÷î”ë»e÷¿GïC: çܺkºò¾ 7à¦[v<Î9W¾ý¸óµÙì­Išk¹Ä3dyÞjåÌEmP*ÈyÁ¹ëºE0wœûîÇðOP8ÎÊ•}æ8-Ý%Vpœã³÷à˜˜A¢&TˆÐÌ8+Èy¼“5FZ´îØeùì\vsÞ§™+¼¤ÞìVÃçEF›ålÛ“XS^Ñ=ªÚ@çy~vþÖT³™¹Â=Ì÷‰-¢…^N“$"L Ðn·§gfnÞlí’ë¾µPÍ%µfœÔ­uj½1]–¥³ó SSͩż™¹Í}r«¶ßTú¢JÇN¤i6;;wkª5ßʳÂß~Å]Qx£má ºÍt«žIdHÉÝ%¼ʯýÚ¯õ$°wïÞÛ×QJ?~¼û±V«ýÞïýÞ?üÃ?ÀñãÇÿâ/þ¢¯¯ïïþîïnݺ500ÖùÏÿüÏ0A$l9­Vk|||aaáÈ‘#§OŸ€Ó§O·ÛísçηÛíÛ~Î;W¸¢àÂyçdø·)]Ì0P#"ÞÆµ=œƒ<ÇTS^pž»ÂwïîXŠó,ÏR¯SÇyæó¼p.ߨïÝ)×wËζã¢à<‡,ƒTѺÝG_äEQ8·™ï¢Îñp–aª)üÝ<ÏsÌ<Õò¿¸Òº<“' + -\šÎS“½·}.xÙ™,»”Øù?\ýÀ(° :Z ""*@ˆŠ@!* ñDH}î«cE3x¼‹Æ*hѼ÷‹‹‹ï¼3õÖõÅv–…“ps[¡#¾ð IDAT fïÃÛO©mïJެiÔb•öïGçý¥w®œgªÙÎîû¤=Ò³¿z /ê7q¤ÙÃìÌìå‹Ï¿3µK®ûÖ2Û_¯ãpMõ×tA³Þšó W®^{çÖÍÙf«mêQ öVu6Xþ¨7VÌÍÍ]ºrõü;Só‹í,+V­ÏÌ…÷¡Ÿ¼­jŠÒáÚûj£ƒ•†U‰Ü]Â{! üêW¿šŸŸ¯×ë÷µÕÏ~ö³°°ÿþî—]õ8 Ê6!Ïóééé<ÏGGG«Õ*ŒŽŽ¶Z-ç\–­x#‘µ6‰°T(Ä4–™„ÍP°(´ÞÖüFL –×-ŒT°¢Îûa !MÁp€àYW4 VÈ?Ä×w«H4õÆkpnÝ™^®[¬`Ecæ6ëÞ‹4õÄP5€àÃñ sÍÀh±·š®‘!fï=ƒsì=# ";ïCzO€`:ò!ùˆˆ@¡B…H ‘ˆ» h"ЈD¶ÒŠÂ®JJ—Þ{¶Z­wOé™ ´hƘjd*´XÃ4Cç¤EÛäÖ Ê`7DÜþŽ­Åj{,8nD0RÅÔPx?¬ V(VŒì½w®@fVèû­Ó.¹î[|þ«P5`г/Ö#ûªå j‡©ÙÜwW_{,bæÂ9 |åá Öòœn»âÀLЙ. ­<Ÿ*1 ˆ´RRˆMx/”ÙÙÙ¯ýëög¶ÜnWÅùóçÇÇÇëõúÑ£GWEôüò—¿üÞ÷¾–?üᇅÉÉÉ^xácûX˜úЇ>ôüóÏËuÚ8çÒ4uÎYk“$QJ@’$ÖÚ<Ï»óäK÷–ÖµZMÛ¢šù=…Ïx™?ß, …`›®ÂŠ!¥€™1 WÕÃj€·šêbˆ•¨ZФ1æN?Ä×w«P„V¡Õ뻜ŸŠ½z¸FÎo⻈-¡Õ˜˜¥¿»¯¡14™cMˆ¡‘\ª( Ìà°LP²tlÈÁ*‚Ò¨,R:߬ø§¥/‘ ÃêàUÒI÷Ù¬N¬Š¢Èh½K<ókÑÞ·OÕjµ…væ½4hïå9îú®¶3D¨µªÆf {€Þÿä±aWV h‰#ÝWk±5:˜EpOõ7>x¤ÙÊwÉußâþ†U=•¸›Jt—F=úÿŽï9y ?/ ¿ÉaeƨZl+‰©ÅeC8Ðää¾'9çýZOwZª-¾ŸûëQO5Iâȉ 6_@€Ç>Š¢ðqbbâßþíߺ¹KˆèÙgŸ}öÙg»ëOLLt—_|ñÅßüÍß$¢ý×½zõêùóçÿú¯ÿš™úÓŸÊEÚ¡ŠÖ:¶…änvéðÀÄr.¶üZ(ˆíÖüÝÈB_l÷ó£Œô×mÑ¢(ÒZ7êUiÑ„»ÒS‰wçï­%½5 ØvTUM¢­ú뵊ªíœ'BZCá®<%Š¢cÇŽ…D°]õ$MÓú§ºuëVw5ïýsÏ=W«Õ>ö±…o>úѦi:99911ñüóÏ¿øâ‹W¯^€«W¯~õ«_ššš››“‹´}^(QåyžeY«Õ o–V«•e™1ÆZf𺄉O±À ‚ lqW½«7Т…ø|IE$‚ ­¡°›yÊ'>ñ‰Ï}îs«¾üÑ~´\=éòo|ã#ùHè©Ôëõßù߀<Ïÿæoþfaaaaa¡»fHƒ/lŒ1}}}sss7oÞ€ñññ›7o&IÒÓÓc­½ýú©röA„Þ¢I¯ZAv9@@Ysx|éÒ¥5Wn·Û“““###w݃°ÝH’dttÔ{ÿöÛoÇq:—¯¾úê… ªÕêèèhÇr–AiÑAAx(Ñ›´ßu"Çdg‡R¯×Oœ8ÓÓÓ¯¼òJžçðúë¯ÏÍÍíß¿ÿøñã÷[ƒIA¤EAa§ð”U¥þ‡úùÏ~û÷•JeU-(ŠB®Äö§··÷ø€µöÇ?þñË/¿|öìY0Ƽï}ï;}úôéÓ§{{{å, ‚ Ò¢ ‚ ‚ðPò”ï~÷»¿úÕ¯FFFN:õ¡}(|ùÑ~ô…^¸qãÆª•?ÿùÏw(sss?üá¯]»våÊèïïxã7¿?~|jjjÍD*–P©T<˜çù7ò<Ÿœœ€¡¡¡cÇŽ=òÈ#LÉ».‚ H‹&‚ ÂÃÉP¼÷¿úÕ¯üñJ¥ÖÚ/ùËÿþïÿÞÍkŒùÜç>×UXà‡?üáÿûÿ/,ö³ŸýÔ§>…ˆ_ùÊW.]º´oß¾/ùËDôï|ç›ßü¦\§í€R*I’LJRJiš@Eõz}hh(IÉe#‚ H‹&‚ ÂÃʃ̲oß¾ncú«¿ú« .\½zµ^¯>|x•!öĉßúÖ·¼÷ðÄOcà‹_üâK/½ôôÓO‡Œn§Ne›@DDÔÛÛ+ÆfAAZ4AAv]âAí¨V«}ñ‹_\5cCDGýøÇ?þä“OÞÞG9~üøoÿöo‡åÿøÇa¡¿¿ÿÙgŸíïï_|ñE¹H‚ ‚ ‚ ‚ l-L@ÝÀ4ÎO<®_¿˜y||œ™W}/‚ ‚ ‚ ‚°U<°ž±±±oûÛ¿ñ¿>^¾|8°|4MCž­5,,,üÇüÇoýÖoíÝ»÷ðáÃpëÖ­¯}ík“““CCCú§:00ð…/|áâÅ‹ßýîw›Í¦\0AAAAÞ{Ô±cǺºõq6Æùóç­µGŽùþ÷¿ÿõ¯ýG?úÑñãÇ»Á8ðÏÿüÏßúÖ·^{íµG}4Ïó¯}íkƘ/|á ###!yÊ·¾õ­W_}šÍ&ëƒýòZÀ@íA“ic»¨ÝØ±ÓØ»În¼»º­D]I‰¤x¿9C9ó{p`~õ“´¤dk½·÷ëÁBKGs†sÎ|æœÏ€3÷(Ü}kèÖeYÞÝÝ=IÉþþþöÏHÿ¡ À×LóˆìÇåË—ÉÙlöÝwß%ÙR(Šºté* ®G%€òÙgŸI’T¯×ßxã>øà7Þh4õzýæÍ›¨$x¸´È~|ôÑGþóŸívûþþ>EQñxüŸÿùŸs¹\¹\F%ÀÃ¥}tv¥R©T*•öÃá0ªžHÍfS’¤b±˜L&A (J«ÕF›ÍÖÓÓò,)¦ªj½^/—Ëår¹R©H’¤( Ã0ƒã8§Óɲ,Ã0ÿno¿^¯W*•\.'B«ÕÒjµ‹Åjµ:“ÉDÓôIÊ ¦¾Šb±‰DŠÅbû›Í688h³ÙŽ-ON Âh4v(©(J«ÕªV«™L¦R©ÔëuŠ¢ Ïó.—‹œªªv-ƒ*þ*AH&“ÅbQ’¤f³IQ˲>ŸÏf³ ­öÿµ­²,‹¢X©TŠÅbµZm4­V‹¢(‹ÅrlyòÝE‘÷ÜsÉd2•JE"‘µµµC7QÙl6•J•J%«Õ:99i³Ùt:]6›]YY)•JwïÞE‘çùCUU3™Ì'Ÿ|F.^¼èv»‹ÅâÍ›7ãñøúúº^¯é\Æ`0ŒŒŒ €ò¥Ñ4=88ø³ŸýŒLáYXXxë­·îW˜<™ ‡ÃËËËg2«P(ܾ}{ss“¦ésçÎMLLPµ¶¶&Âòòr½^·X,ªªv-ƒÊWÑÓÓóꫯ^¾|Y’¤P(ôÞ{ïÑ4m4ÖìÚÚÚ|Ëåfff®\¹B†©k4ŽãÚSx…c¶··C¡P<gYö¥—^²Ùl™Lfii©P(øý~­VÛµŒ×ëE¯Š@ ð“Ÿüä•W^Qeiié׿þµÑh<4X²R©llld2™‰‰‰+W®°,+Ër:‡Ã‹‹‹Ùl6 öööºù)•JKKK¡PHÅáááÙÙY½^¿½½Ïç———kµšÍf3™L]ËØívTÓ2™L>ŸÏd2ƒÁD"‘H$vwwÉÛc•ËåÕÕÕÅÅŽ½½b±xtèÁÁ. éÕüñŒÅbÃÃ×/_v:ù|þOúÓÞÞé± u.c4ƒÁ (gËét^¹rezzºR©loo_¿~]’$Žã–iµZµZ-ÿÏÿüO<ƒSSS}}}dB˲í)<‡ZÏT*µ³³³ºº*Šâ‹/¾ØÓÓC†s.,,”J¥¡¡!Žã …Bç2===:Z€Çÿ[§Õ²,˲l__› Õj£ÑèÑ›p£Ñèñx´ZíÄÄ„×ë5 Ñh´\.ollär¹x<žÍfM&S±XÔjµ===&“I–åB¡‡+•Ê /¼páŸÏÇ£Ñh2™Üßß'ùS:—±Ùl~¿ßáp ²¾4›ÍFæàg,o¿ýöýº†¥R) mmm)ŠBæç,Cr©PÕΊ"ÂÆÆF,šœœ¼páɰ¶¶FÞž?ž¢¨“”/eY2ÛŽ¢(‹Å²´´T*•Õ+‡Óé´V«~öÙgûúú¬Vk;{‘ ‘H¤Ùl’¤Á`¨Õj»»»ûûûÆçó?Þçó%‰Û·o/,,4›ÍB¡`2™Âápç2dÀr=À×Ïjµ¶GÎ3 óá‡ʲ|èT$í Ï盚š ‡C–åh4Z¯×ÿøÇ?*ŠR«ÕJ¥R<§(Êï÷“o [[[Ñh”eÙÑÑÑK—.™L&«Õº´´tçÎY–ŸþùV«Õµ êèÌ{5ÇqÈ=­V«M&“GK¶Z-Y–3™Ì½{÷vvvôz½ËåjÏÕ"co«Õ*¹œz½^2Ê ŸÏG"AúûûŸ}öYÇ‹ÅvwwS©Ôþþ>y’Ô¹ŒÃáèééAàìl™Íf³ÙH0%™L&‰CQ*2µjoooooO’¤@ páÂ…ááaRïä²P«ÕR©T£Ñ0 &“‰ã8I’’Éd2™”$ÉjµÎÌÌŒU«U½^ëÖ­d2™Ífm6[×2•J…çyP€§‚Á`ðx<¤;BV“'xÇy<žb±¨ªj³ÙL§Óù|þîÝ»,˾òÊ+@€$c–eÙl6 ƒA£ÑX¯×§¦¦ôz}©TÚÛÛëïïï\f_EÔƒFR½¦R©O?ý4‘HLMM¹ÝîƒÃ˜I.2z¥EÅýý}A‚Áàìì,yv733S¯×WWW÷÷÷%IRUµkÿ„ºö÷÷}>_ooïôôôàà Éd:˜Á—äRá™gžõz½¤~+•ÊÀÀÀÈȈËår8f³9—Ë‘{ A2™ÌÞÞ^ç2‚ `È:<²Ün÷Õ«W[­Ïó&“I¯×˲ÜÓÓC2©kµZ†ab±ØüÇ4›Íï~÷»333F£±}õ›žžv:f³yvv¶Z­~òÉ'‰DBE𦻖QUã³ Y–‹Åb4]^^Îd2“““†Lq¥¾È¥²½½½¼¼ÌqÜË/¿ÜÛÛ[*•*• I‘300088h0$Išœœ4 •JeooÏçóu.ƒVï!¶ƒ;;;ûûû,˹¹¹ÉÉI–eu:]û;Hr©äóy·ÛFGGÉ7½T*ùý~¿ßïñxH^ؾ¾>¿ßOBl{{{d†{‡2étÚ`0`<5 €ðt|3µZ²Aû2#T„r¹Ül6=É%IÒ[d¨$™j2™ìv;yÞBôåóy’oϽ_™B¡pp³ð€ˆ¢˜Édvww³Ù,Ã0ãããçúõëßÕh4H¹\.¿ßO&ìôööîîî’õ&H–®epü¿†úM$$¨a43™ Š‘å>¥?tƒQ(DQt8>ŸÏb±˜L&òU5™LµZMEF“Íf;—©Õjä¾ ‹ÅÒnàHâäJ¥’N§Ap»Ý6›Íb±qo‡$IN§“\ÙL&“Á`p:­V‹¬î¡Ñhòù|ç2Š¢ 3Â×OUU2ukggGUUÇ3<<¬(J6›½ß[šÍfµZ%=²B‰Iz,Åb1›Íf2rÍìP† ÊC|ýÈdœ|>¯×ë C±XÜÙÙ9´òãÑd(¤Ÿ#Š"Yž’d<¡(ÊjµÚív2BT}ç2år½Y@à©n„Òé4ÉaÞl6¯]»6==íõzI*Y2…‡$­”eY¯×Æö¨E†aŒF#yÄW­VkµZç2’$‘•Vá"ÙLvvv\.—×ëF£óh\*¯¿þ:EQƒƒƒäEEQêõ:Y˜“ gPUµ]wdÝP’4±sÿ­Ùl’LŠ4MG"‘ÕÕU’)ÓårMOOÏÌÌÌÌÌ\*§ðtþ7›MY–kµZ‡o1)C"e¨xô‘kZ4ýðãÑhÿØØ˜Ãá°Ûí?ùÉOTUõûýäÉ$Õl6É·@«ÕF£ÑHFáݯ ò+ý$IJ¥R{{{Ñht}}=šL&EQDQ,•Jd*q.—{ùå—Y–=ÔÞµ¯‡íQuŠ¢ G¯‡Ç–A¯æa!ßY’’Æív?óÌ3n·[’¤p8üÙgŸE"‘žç{{{PÚ£‡¾z;ˆzPž®ìZ­–Ïç÷ööVVVvvv$Iòz½ÓÓÓÓÓÓv»ýhv†aÌf3é;Š¢X( …‚Ñh$Xòù¼Édr¹\6›ô)ïWÆn·ãQÀ×Àd2õööƒÁöà“äîÕëõv»½\.g2™x<î÷û)Š"K2Fžçõz½ªª]Ëàø?h¤¦‡Édr8SSS$4‰jÕëõJ¥BÒ1|—N§³Ûí‚ äóùD"Ñßßϲ¬$IdB89m¬V«ËåjµZÊ˜ÍæCV€G*tR­VÉJ¥¡PhŸa˜¡¡¡©©©þþþû­–B¾Š¢uèÈíS¡PÈår$ M&q8Ž\.ס  |ýhš¦išã¸ÑÑQ½"3,ºÜ¥hµ$‹¢(ÕjµP(‹EƒÁp°Çâv»ÉYÑ¡ŒÍfC¯æ¡ ßY»ÝN¦íŒŽŽ×ëu†anÞ¼Y, …B¥Ri6›‡ZO›Í–ÉdHb¾J¥"Šb³Ù,•J¤™3›Í.—‹ÄË:”áyõ ÿüóSSSCCCÇFO¨K jµÚJ¥²»»ër¹zzz²Ùìêêj2™ìíííïïw»ÝF£CŸÏGrqÁíM’ü&¥R©@YXX kîüìg?»zõj;ïÉ¡°‹ßïW…œäL ' ˲$YEQ')©©z½N‚¤–ÉÚÕ]ßE8o4ÃÃÃ:.‘HD"Q9ŽcY–,U@<¾_™£Kb<:ªÕj$YZZúä“OA™˜˜˜žžîëëã8®ëw*3 c·ÛÍfóêêêöö¶Åb!«Þž¤ ¢'_?£ÑHºCCCd¦j¥Ri¯¹c·Û_{íµ .x½ÞC·ßV«•ã8FÓî±x<žL&³¶¶–J¥ûûû½^/É|¿2~¿½š‡Ø–J¥|>ß¡;tôlñûý©TjeeE„óçÏÛl¶jµ‹Åâñ¸V«µZ­ýýý:NÅeÜn7–àPž$Ë]±X$+اR©­­­d2)ÂçŸ.‚Ñh´X,<ÏÇãñÛ·oß¾};N“t ¹\N’$£Ñh0X–µÛí4M‹E’D–eH“⃠IDATYFc·Û‡††¢ÑèÞÞ^³Ùt»Ý…BaŸÜTÚíöZ­Ö¡L¿ÙlFM}Åb1‰‹E!?,..’ߛ߄ÜW¿ýöÛEÍÍÍ‘_‘íPEÊSÅ²ìØØEQ…Baii‰d˜_[[«T*}}}cccÇ‘<Ë Ž¾ A’É$YÐ* Åãñjµ …šÍf4õz½>ŸOQ¿ßßl6wwwóùüÊÊJ$©V«ñxÜb±Øl6žçÆöö6Ã0í$²f³¹¿¿¿X,Æãñx<~÷îÝp8œN§÷÷÷ív{ °Ùl6›mhh¨R©t(£×ëq—E©TŠF£ÅbQQ”¥¥¥\.×l6———E1N§3”J¥åååÏ>ûìÖ­[ä’X(öööÈ¥’¬EJÓt"‘ iÚï÷[­V†aX–‘e9‹­¯¯ ½^¿½½Ïçûúú†‡‡ÉJ]Ë ŽÎ¼W#Šb±X$9MHX$‘H^M¥R!c@¼^o_____yW¡PØÙÙÑjµÙlÖn· ˆ¢˜L&K¥I"k±X ƒÝnˆÅb»»»ÍfÓét’ÁwÆï÷ Q{ÊôjÎ\­VËårÅb±R©loo“oY½^'sjúúúœN§^¯w8½½½±X¬Ñhlllär¹F£±»»«ªªÃáp8 Ã$‰B¡ÐN"KÒ '“IƒÁP*•VVVÈÂsÑhT¯×{<§Óév»µZ-y×ýÊð< € À“€Ì^XXxÿý÷C¡$I‚ ÈîînOO×ë™››Ëd2‹‹‹ËËË$ñd*•"£K, ™+~ñâE†aî޽˲ì+¯¼222BÓ´ÛíþÖ·¾µ´´´¶¶vçÎUUÉ[ÆÇÇ'&&‚Á y‚ݹ̱óÏá„TUD"o¾ù&‰˜´ƒ o¾ù& ‚ÌÏÏ›ßäØí1)íòv»ýÂ… ƒáúõëKKK·oߦiZ§Ó ’…]ìv»ªª]Ë š¾Šd2ùÞ{ï-,,¤R)rÏÐjµvwwY–5¯¾úêäädoo¯F£ÙßßßØØ¸uë–(ŠªªšÍfÇ333Ó××'‡~X«Õžyæ™ÑÑQ¯×KÖ&h4ñx|}}ýwÞi6›ÆívÏÎÎÎÎκÝî“”Aô–h4ú«_ýjqqQ’¤\.FUUýå/iµZ5͹sç~ü㫪zýúõ7nìïï“u:nÞ¼i6›ÉxûÉÉÉþð‡Z­ö¿ÿû¿5Íw¿ûÝ™™£ÑhµZggg5M.—ÛÞÞ^[[SU•a˜@ péÒ¥™™‡Ã¡×ë»–A-²dûÂÂÂï~÷»v¯¦T*étºžž¿ß???(¿Éý¶CƤp÷òË/Såñx^xá…•••P(tûömEQt:˲ãããCCC,Ëv-ƒ^Í™Ëårׯ__XXØÜÜŒÅbÙl¶ÑhÇÇ ?ÿüó³³³ýýý½½½^¯wmmíÝwß¡Ùlêt:Žã‚Áàðð°Á`¸{÷n¹\&ƒ+GGG­V«×ë ƒSSS«««}ôQ½^§iÚjµŽŽŽÎÌÌø|>²øŽ Ê Û €ð$~µZ2ؾs¾M£ÑX,–@ P¯×OµMžç'''išA–eQ-ËÐÐÐôôt¿ÃáÐh4')ƒÚ9+'_I§]’ÄYŽEF(ȲœN§›Íf&“!ýËÑÑÑñññ@ @*Ÿ¤ œ 2¯ûèëäÉMÓdz¶,Ë Ãx½Þ™™™ééi—ËU*•}×ôz½Ó阚š"´jµJ*}nnn||œçyƒÁе ê÷[IG§ÓÙl¶¯×{(ýAíé9Éd²Ùl’ív{0œœœ$†éZõòàèt:roìóùºöH±ññq2ñðØbä–xzzša˜jµJVó!÷ÞÓÓÓ@€\f;—!ÃuQ;i€Ž¾Nróéõú`0(Š¢(Š’$‘±Ò###333~¿¿Õj'¢ÕjµZ­Ï盥i:  ­Vë÷ûçææ¦¦¦ÉMÛ¹ 2ÈÂB¿òÊ+/Rþœ=~hJ¹ú²bÖ±ÿ=Xž ý* …EQx– §rp ™ |¨Ù0,ËÚl6Òù;Z†d5?v Ù>ÉO™Íf«Õ*i™Èœ §ÓI¦Ÿ¤ jê«88…çØ@I{JÎÑwQ&ì}EQ”V«U­V3™L¥R!ñ5ƒÁÀó¼Ëå"+"SÕµ bd_ÅÁ)Rq:¤iS¥T*•Ëår¹\¯×UUÕëõ,ËZ­V2f–ÌëiOá!‰ÛHW¹T*‘ík4’‘çùöhµ“”'Ì£p÷ (´Gáî1x€.@è€.@è€.@è€.@è€.@è€.@è€.@è€.@è€.´8)Qóù¼(Š_¾îµZÓt:) 5Ä!Å9ƒsîÛà<¦òùü­[·âñø—ÞÇq½_@óh ÑâœÁ9 €ò¸E1¯mGE פõ§z¯FmiÕº×.1:#ÏóÍfóQø‹ŠÅb$¡(jppÐf³¡Šà)i Ñ>„sf}S¨Sõ–zª÷2ZÏP=n‡†Ñ=:=(œ]_PóN€†‹éÆ‹ŒóTï2¨"×ÊE¦ Î߉DÞzë-Š¢^ýõùùyT.<%­!ZÀ¯ŸP§¶s­¬xºŠIG9L=«6NyÁÙðd@åñÖ¤õEÆcü§z¯V(µ)ÑR‹f:—ìüÔâË=ÓÀ“x¼ZCB–eQ‹Åb:VUÕëõÚl¶SeÁx¸- ¢(²,—ËåT*¥ÑhúúúxžjÏ™zKÍŠj¼¢œîœÑÓZ­ÉTK¥OR×Åb‘¢(š¦)ŠbF«ÕZ,‡ÃÁqÜ–?g<%@N:?µørÏ4î÷®ÁÁÁ×_ü€#Qc±Øâââ‡~¨ªêK/½4??N~üp[@Y–K¥Òêêê|`0~øÃNMM¡Zhjaa¢(š¦5Á`ày~hhèâÅ‹_[þœ]gèáP†éíí ‹%“ÉD"‘B¡€ŠyD‹EÒö¿öÚk§ýíi·i³Ù0²YÕj5///¯¬¬¨ªêñx8޳Ûí'Òþp[Àz½žËå¢Ñèææ&ÏóµZ uú {P d´‘ªªd€F,Óét­V‹ã¸¯gŒÎ.€3ô0( üòÊ+/½ô’VûÿvCQ”åååßüæ7dÐ#À£ R©„B¡½½=»ÝNQÔÞÞžÓé\ö_’¤d2Y,­V«Çã1¨ÓŒþ˜ŸŸWUU„T*µ»»»¶¶V.—GFFúúúž˜¿g<%ZÅçóýõ_ÿuooï¡×5Íàà ÉdBåqDfüJ’d·Ûiš.—ËFƒa–e].—¢(ûûû ¤rÉS8Š¢l6VÚžN~no§R©4 UUM&“Ãá0 FCE²}š¦M&“ÓéäyÞb±0 #˲ ¹\®R©ÔëuUUµZ-ÙŽã Ã0¨,8!EQšÍf©TŠÅb¢(Ž«ªFc±X©Tª×ë:N£ÑPÕjµdY®T*¤ j4d¡UUIÃסT¥··—¦éd2ÙÎ"AÒg¨ªJ/(ŠÒÓÓò,MÓµZíT-]½^O¥RÅbÑf³y½^ƒÁpìmp©T*•JårY’¤V«Eöœì'Ïó][XŠ¢Ž=V«õ)Ì}FF\½zUQ”\.·¹¹Y*•2™Œ¢(¢(íA‘ÓC£Ñèt:‹ÅBú6&“‰œ~÷«£ÑØá·8»ûŠÁ`øÛ¿ý[§óp¶|Y–?úè£>ø Ñh nGdÆo2™<þ<Ã0«««ÅbÑd2 ¿ð ’$½ûî»·nÝ"’·Þzëí·ß¦(j~~žÌÎmÏ '?“íètºõõõl6KÚþK—.¹\®b±FC¡P.—Óh4@à¹çž›žž&Ñ·r¹¼µµuãÆ òÆV«Å²ìÈÈÈ•+W&&&\.—ÙlFeÀ 5›ÍJ¥R,K¥’Édºrå EQï¼óN¹\. •JåàÝ]¡PØØØ¸qãÆÆÆF.—«ÕjŠ¢ÅvÙc[@I’¾÷½ïétº÷ß_¯×ÿà?˜žž&wª­V+‰üæ7¿i4¯¼òÊÈÈMÓÑhôT-]{Œ€Ãáèéé9vŒ@©TZ\\\YYY[[K$ä.·½Ÿ“““][XFs옛›{šWQUUUU°èЃ"‘5½^ÏqÜððð7¾ñ©©)¿ß_«Õ:Ô‹Ïçëð[œ]}å{ßûÞÑèÉÂÂÂoûÛ|>Zy|‘¿{{{Ç9NI’DQA£Ñ À‚ t~/õÅÌðövÜn·$IF£V«µZ-†aìv»F£)—Ë¢(6F£‹ÅŒF#MÓ‡£Õjmmm­®®îííåóùz½®(J¹\ŽÇã+++EÍÍÍ!€''Šb"‘Èf³&“ÉëõŽQÊår.—Ûßß ”J¥²±±±¼¼‡3™ >I¢'][OI’^|ñE³Ù‡UUÝÝÝõz½dºP¡PØÝÝ …B4MW«UA’ÉäÎÎΩZ:I’R©T©Tòz½÷»Å]^^¾}ûv2™¬V«:Ža˜öm¿ ][XFó%ŽÀ“Ý/¢(JQ”jµšN§‹Å¢Ëåêíí5™LÇÆYHŽÕååeš¦Y–­V«ê¥s­áìx¼(>ŸïùçŸ?ôâ/~ñ‹ÍÍMÔÇ“A£ÑÆ‘‘‘Ë—/7p8œH$VVVÇw¾ó‹/Zƒ€ Ýlg>¸½^?44DN˜D"±¹¹IŠÍÏÏŽŽ¾ð 4M§R©H$ …ÆÔÔ”(ŠŸ~úi4u8ããã~¿Ÿa˜l6»¿¿Of÷ööz½^TœP¥RY__O¥RÁ`°··×ápÛ¹x<žL&u:Ãá°Z­Ee³Ùëׯ‡Ãažç¯^½:44D‚þä.qaa¡C ¨Óé¬V«Ífóûýù|~ww×n·ONNRµ¹¹¹»»K決ÝnY–oݺÇOÕÒ‘1•JÅf³u#°²²‹ÅFGG‡‡‡ƒÁ ÓédÆáp ¦R©®-¬F£9öØíö§p•=2®äí·ßÖh4dc§Ó9111;;{èQ"É–òñªªV«ÕL&‹Å¶¶¶DQ–$©C½lnnvø-Î.€Ç;€rìnkk •ñ¢išaEQEiµZí. ªªäE²2ß¡!©ƒÁívŒŒŒŽŽªªêt:oß¾½¾¾ÞjµFFF|>_{Üòµk×:|ºÁ`ðz½£££cccƒ!™L6›Í?þ¸^¯s7>>Þ~¦éÏ>û¬ÙlV«Õf³¹±±±³³322b6›eYVUUÅL&³¾¾^«Õ:Œ‚8ˆ<ß.—Ëëëëäž“a˜;wîP•L&3™L>ŸE‘̳ iZ„L&3::záÂ…ÉÉI·Û}ð1{‡aƒÁàt:‡‡‡)ŠŠF£z½Þï÷SµººJn,‡‡‡Ng±XÜÚÚ:yK§(Š,ËÕjµ\.˲Ìó¼ÃáÐëõGÿ^òèÂd2™L&£Ñ¨ÓéÌf³Ãá°ÛíF£‘Œ¯éü¹dŒ@‡#ðtö¦hšÖét<Ï÷õõÍÏÏOLLˆEQõz½R©”ËeÒó!GµÑh …­­­z½Nkt¨—决 àñ M ,’ÆŒ¤Ä«×ëí´aŠ¢ÔëuY–µZ-Ã0$s^™°:::J¦íŒe³Ùf³Y,O•݆DI&''9Ž#Ë]ûý~ƒÁ Õj½îõzE!s|F.—[__ßÛÛûÓŸþd±Xhš–$I„b±Èqœ,˨Y8a¥Õj•J¥Ï?ÿœ¢(r×GQT­V# J½^/•Jd’i£Ñ(‹Ífsppp||ÜjµžöîŽçù™™Y–oÞ¼Y«ÕΟ?OQÔòòr6›}î¹çfffxžO§Ó§jéHÞM’t“ÜÆó<¯ÓéŽ~ºÓé¼|ù2ÇqÉdòøC«Õr¹\ÓÓÓçΛŸŸ?I KÓôW<O2®„T"b±XÈÒ×í)àhæèëí­Óé ƒ‡C«Õ’©F6›m``5 'Q­VÃáðþþ¾Ùl¾xñâ‹/¾xðN/üñÇ­V+‘H„ÃáÑÑQ½^o·ÛeYŽD".—krrR¯×·’Ó4ݵ4 Ççó9Žp8üÿ÷E ‚044äóù<Á`8mK×^!Åf³¹\®cóS´o°ƒÁ ¹!'ÏNVWWoÞ¼yïÞ½k×®äs777;8ªP(ܹs'‹;wn``Àn··Z­t:}ïÞ½?þ˜,áÔ¹^†††:ügÀã@‰ÅbG_üû¿ÿû•••·ß~;•J;wîûßÿ>ÉЇQIÏó¦X,.//˲ìr¹(ŠÊf³ëëëÅb±¿¿ttôгI’Òéôææf©Tj'‘íéébYVQ·ÛN§766(Šâ8ÎãñtHýu¿Fñ~¯“‰?f³ÙétZ­V£ÑØnY‘ªN…¬ ²¿¿ïp8úûûŸþùñññöo}>_.—ÛÛÛÛßßgYÖçó±,;::ªÕjS©ÔíÛ·óùüÁ$—ddeçP«ÕjµZ—Ë500ÍfÉã%ò_—ËEœ¶¥«×ëd…«Õz¿ŸD­VÛÝÝ-‹äg’þŒÜÁÒ4}’Ïí|N> ùéA¦‰É²LÒ2 c2™´Zm.—k×Tçzéü[œ]qÅjµîììH’tôò:33399ÇûûûÛ/Þ¸q•ô9Žo|ã<Ïß¹s' -..6›MÒÆ@ páÂ…©©©C™äE‘$ikkë£>*‹­VËëõž?þܹsN§SUÕ‰‰ I’>þøãÿýßÿ¥(êüùó¯¿þúYí³Ëåúæ7¿ …VWW×××A$©Ùl’Ù=óóóíµ:+—Ë¡Phlllbb‚çùƒ¿%Z­ÖÆÆ†¢(óóó^¯÷Ê•+<Ï/..†B¡ßýîw­VKUUÒúpwÂÐjµÎÌÌ”J¥½½=Š¢FFFfffÚS„NÛÒ#p¿%f ²jÌÁuñÌfsOOϹsç¬V«Óéìú¹½½½ŽÚßcëzzzº^¯/--}þùç‹Åív  …væ¸ÎõÒù·ÕjgÀc@ñûý÷w÷ë_ÿú·¿ýíO~ò“£†9= …Bä <,,˃A²¬€ªª©TŠÌ>eY¶§§gllljjjhhˆ¤ÓkÓëõ.—Ëét¦Ói£Ñh6›‡††fffÆÆÆ8Žk6›d×úúz&“!ê‹yÂÔYrþÜv¨Ì±¯s7::Ê0Œ ¢(6›ÍF£±ð%)9$yy0<”!‚LIh6›’$q§×ë9Ž#‘Y–óù|­Vkçç²Ùl'i©/ž´W«Õ|>OÚÄÑÑQ’ð‹¢¨Ó¶tí[ܾ¾¾ÎcõÊŒF£Ï盞ž&7Ø'ùÜÎGàéq¿˱”ÙÙYŠ¢îÝ»—ÍfµZ­Éd²Ûí,Ë^¼x±§§çÐŽÖK­Vëü[œ]_…DOX–ýË¿üËŸÿüççΛššêP>“Éüû¿ÿ;jèábÆb± ñ<ÿo|£^¯ÂqœÃá0›Ídižƒ†¹¹¹óçÏ_½zµÑhœó.—‹çyÒ½xñâèèh¥R©×몪Z­V2€™<…;úsÉfßùu­VËqÜðð°Ýn¿rå Y-ˆL!&ûÖaºÀA>Ÿï;ßùŽ,Ë$@ß^9…0™L}}}V«uttT§Óù|>Ng·Û§¦¦< Fƒ´›¤¥3 'i)Š2›Í@€Lj (ÊãñØl¶öãŠÓ¶t’$µ'Yx½Þû¥k·§¯½öEQ4M“»\«ÕÊó¼Õj=Éçv>OÏ™s¿˱”¹¹¹ÁÁÁo}ë[$d`08ŽSåêÕ«F£±}†Ü¯^ C×ßâìxœ(íè EQ<ÏÿèG?ú·û·W_}õÚµkÇ®ÀÇÿå_þ¥T*¡†:Ó¨-ƒ*òjåTï2)‚^•´”LS]bödnªÍf;Õ´R’Y–<"8æÓM&“Éä÷ûþêàØËcÇa¶Ÿçt~]¯×;’FÐ~éÖã¸k·ét:²B\oooûEr[èv»ï×vmÉ–­V«Õj=6ñ¹F£9UKg6›ûûû%Iêïïw¹\nqï×Ξª…í|Œ†6é(^ºªf=mÔÑ:†¢é.)ÕºɃ½&Òqê\¬ÃÖŒFã©~‹³ à‘ ŒžçÏŸw»Ý¿üå/—––¾ýío“§7E)Š’L&ÿûßß¾}ãñNTjke)µyªwéU‰SŠ•fT3Ž! 5|²O__ßøC’’ŒçyN‡sFÏP“FCŸ.µ¼QGóFÚ¤£Ì ÆÙOg—ãAÀÑèIûjûÿðÿõ_ÿõ¯ÿú¯E‘a±¹\®Õj¡VNTsZ-Çq^»d`‰–NYë²A¥{x=g1 †c}9'Ÿñ 𤶆žç;Ï›~ Ï™·CϪ5ùtïÕ1”IGû\v+Ç>Ùç Î.€ût¤ûEOAB¡ù¹R©T*ÔÇÉ™L¦ÞÞ^Fg”iC‹fNõ^šRÕÌYŒ~“ã¸3|Vpò¿Ojkþ9£at–ÚRO7’„¦U†¦¬ëëñâœx =ÀJçèI©TúÅ/~‘N§Q_¥ù?´žâ©e<Ïkµgvœ|Æ/À“ÚÎx"=¨ë>¢'_Oóß^ñKÐh4:N«Õâù  5Dkˆsç tö@(ˆž| Hæ@kˆã8gàkpö¹¯=€'ÌP=€'ÏYPœNg;zòÇ?þñŸþéŸvvvÚ¿EôSg@¹víZ{ìI>Ÿ¯T*‚ ÿ"z¯³L"ÛÓÓÓþù»ßýîµk×l6…è <æÎrʧŸ~z𿈞À“á,(‹‹‹|ðÁÁW=€'€öl7÷î»ïRõâ‹/jµÚd2ùÆo z;í™oñÝwßýè£<O8Æñ€'€æAl´Z­"zO @g t @ t @ t @ t @ t @ t @ t @ t @ t @ t @ ¾ˆªõ IDATt @ t @ t @ t @ZxÊ‹ÅH$BQÔàà ÍfÞÀQO»H$òÖ[o½õÖ[$x=€£0àq¢(J«ÕªÕj…B¡R©H’$˲¢( Ãèõz‹ÅbµZY–5™LZíÃùv?:c(dYE±R© …jµÚl6UUÕétf³Ùf³qg±Xt:Ùç……Š¢^{íµ‡[¿Îž<©NÒN}mÙƒþ¬ÓöÎv0²ž0 Ÿï¡ìáààà믿N~xXG©^¯§ÓéÕÕÕ>ú¨P(LLL\¹rÅåréõúF£‘Ëå"‘Èîîîôô4Î(@Ïááö# ŸÁ`¨V«ÑhTQ£Ñxð(QÕh4 …Âîîn©TE±ÙlÒ4­Óé8Žs:䨶ÿ®ÓîçÉÀ!­V«^¯—Ëåt:Ýl6­V+Ïó<Ï3 s0Ë,˪ª’hgx!àL¨ª*Šb>Ÿ/—˵Z­ÑhP¥×ëÍf3Ïó‡Ãd2µ/ûÍf³ëUºV«E"‘………b±HQ©AQ”ÍfkO2=Év:_íOÞs }€Îû£(Š,ËÕjµP(‚p°“`4yžw:‹…a˜R©ÔukgÕî €Ç c+ÆÄÄÄ3Ï<ãr¹HÇB§Óéõz›Í u:×ëm÷KTU- KKK«««[[[™L¦Ñh°,Ûßß?==ýÜsÏNGº&d®r:¾té’Á`X__ßß߯T*EY,–¹¹¹ïÿû“““û1ªªÆb±ÿüÏÿEñÅ_l4ï¼óŽÉdjÏvVUUQ”\.·¸¸¸¶¶¶½½ËåZ­–×ë›››žžž˜˜ áƒÓîíý”J¥åååX, Ï;788h4†1 F£Ñãñh4·Û}ð]‚ looW«Õåååh4*Ã0v»}ttôÊ•+£££v»PN»Ÿ'?ÇÖx.—[]]ýýï_­Vgff¦§§'''Fc"‘X__ÿüóÏÃáp©TR…ìÀ¹sç&&&‚Á (g=iµZ™LæóÏ?_]]D"$.@ÂSSSÏ>ûloo/Ã0äÊ/Šb׫ôîîî[o½õ‡?ü¤Y}ë­·Þ~ûmŠ¢æççÛmèI¶ÓùjòžÃÖÖV×ý‘e™DFîܹ³¹¹™H$*•Šªª,Ëú|¾©©©Ë—/  ң輵³j÷žÌ MÓ§¯¯Ïår‘ƒ¹\upª¹'ÿ¶Z-EQt:V«5 <Ï[¯×K¥R8¾wïÞÖÖV¡P$©ÙlV*•ÝÝ]­VKÆñz<‹ÅB}1W9‰èt:·Û],Éâ5‚ ÄãqNwùòå@ ÐÎÕOžŒ%‰ÕÕUY–/^¼X«ÕL&S{¶³$I…Bagggeee{{»T*I’¤ªj¹\ÞÛÛ³Z­_noï§V«ííí …gŸ}vff¦¯¯¯ý¤K§Ó™L&§Óyô]dÜ yªV¯×I"I’hš&ƒnHØâKìçÉÀAd¡D"±±±qïÞ½h4Ê0 yÐGQT¹\¾wïÞÊÊ Éð"Ë2MÓõz=ŸÏ‡Ãa“ÉÔÓÓc·Ûñ•8’$år¹­­-råŒ@) dTˆÍfcÆétšL¦^¥Oò¹_ýjÚžCg•Je}}}ss3—J%Ò\’~B,ÓétN§S«ÕöööždkgÕî<‡ÃñWõWccc_ …B¿úÕ¯òù÷$Û9«žÃIö'NÿáH&“ÃÃÓ““d ªªª™LfmmM„ÅÅEQÍfóI¶vVí>À“@ÿ›¿ùòðö ‰‰‰üÇ|óÍ7WWWQ]ñ¦ÓésçÎõ÷÷[­VQãñ¸ªªGÃXp( ÒÎÊqÉÜqp¥6rå‡Ãz½~hhè™gžRU5‹Åp8¼³³£ÓéÈzÀ'¼JÛl¶ùùùb±ØžÛríÚµC{òÕ¯ö'ï9œdÈdX‡Ã GGG=Ùl¦(j_«Õ®­­E£QUUçççI{×ykgÕîŸ'û000`³ÙhšÖëõ,Ëj4šö„š/··GµZ-Q[­–N§#©ONrlNçåË—_xá¿ßÏqÃ0‡cvv¶R©|úé§¹\®=Nä´ûyò#p°C™L&oÞ¼)Ëòùóç§§§ÇÇÇ{zzH?• iºÕjU«Õr¹\.—Íf3˲ÃÃÃ.—ëh†8ˆdè ÷ödžW"‘1AT«Õb±øÍo~s~~¾¯¯>NÓ´ªª¨€†1™L½½½dMœÚÒé4YÛåúõëétšã8Ò "wþäñŽÅbi/ÄKú:•J%‘H˜ÍæV«õÿ».hµ‹…eY’)–‚Á`:.‹µZ­X,’ÇAÅbqoo¯Ñhø|¾`0xìåf³Y«ÕdY6›Í‡–X>äËíí±GÉl6“^$I Üd 9¶&“©]˜¦i­VË0Œ¢($ýÞ—ÛÏ“våÞ½{===gjjjppÐåršæãv»_|ñÅP(‰DîÞ½[.—É"ƒƒƒ—.]šœœìëëC à~H†ŽƒcLZXX ™;¶PµZ­Ùl’+y»}$Ó?- I%Û¾òŸÕUú«oç´=‡ÎÈÚp[[[·oßÞÞÞÎçó•J¥Ñh4›MEQÊår"‘8þ|×–úlÛ}€''€BæUv-f0l6[¡P@•t@néyžo\h6›’$Åb1£Ñ¸¸¸¸¸¸Øl6_xá…Cï¢iZ£Ñ´WÔh4Æáp8Ω©©Cã 4^¯?¸j IAçr¹ŒF#y F)Š"+#F—ËE2ÈžÉßxª½=溦Õr'B¹\Îçód¥Æ®Ÿ«Ñh´ZíÁn(ý:9áýêûy?$Íf3 Š¢‚@ÖT>"sÚÍf3éÄ“5}Êår4ÕëõŠ¢ç9gÏþà?8{ö¬ïû÷„0ÆÕjõÓèöcŠ®Lå\\\ìv»ív»xÔétªÕêôôtñ´ÿÀáÓº®»®›¦i’$aêº~øâîþ¿å©·ö(Ó4kµç¼Ûíîîî–ËåŽ-z–}þDÛùø{ 033óÃþ°R©¼ûî»W¯^u‡1vñâÅéééÃeŠ–ã8³³³ßúÖ·’$‡{{{›››Å<§OŸžŸŸ‡ ž×ßuÝ,ËeËã86 ãhãSÜ¥‹ù†6¾/èn|Ïáøíéõz¿üå/wvvÏ;×l6‡åy~åÊ•û·+>ø8k{^í>|y(Œ±Gæ(rÎ;ŽEQ§ÓaŒU*ÏóŠâmE7åžNI¡èrÙ¶Ýl6çææ–––jµš®ëJ)Ji1çž´‹ÂkšV.—WVV¤”ív»Ýn¿j4+++årùaÃdlÛž™™éõzív{mmíÔ©Sõzcœçùx<.J¨‘Öçµµ®ë.-- !vwwu]¯T*‡Õd‹Ñ4“ɤ(¼÷tÓ">év>þ(”J¥óçÏOOOïíímoo¯¯¯cŒmÛVJU*•¢~J‘$„¨V«Å¤£Ñ¨\.O&“^¯‡zÌ~‡mÛÓÓÓý~¿Ýnß¹sguuujj !4nß¾Ýn·]×m6›‡s&<þ]ºÈBdY–¦éaYÖ']Ïóê9¿=qollt:sçέ®®ž:uªÙl꺞$ÉÁÁÁæææ=môñk{^í>|y(RÊ•••ã;|¡ 8F§ÓùÉO~†á¥K—ŠÒŽãH);εk×nÞ¼©ëúÑ¡4¥Réܹskkk×®] ßúÖ·ŠR¯RÊÑh´¹¹yõêU×u¿ÿýïŸÚßßGÍÎÎ^¾|¹˜çøO !>ýôÓ0 ‹ÎÅ$¾ü±aþç^¼={^[[©T.^¼H)}ÿý÷Ûí¶ïûã™™˲â8ÞÙÙùøãmÛþÎw¾ót”'ÝÎÇߟݗu½(:ó£ýèêÕ«¿þõ¯ÿïÿþOJ™$É¥K—ŠÞy·ÛýùÏž¦éo¼±´´T©T”Rä.¸Ràù* 3Æ>ýôÓ$I,Ë*žówvvÞ{ï½jµzòäÉÃfåñïÒ„Û¶Ó4L&Ãáðžú³ßퟴçpüö(¥Šr'º®[–eYÆ8Žã­­­>øà½÷Þë÷ûGGÜ¿¶çÛK€/C!ôŸÿùŸÿ÷ÿÀ ÷Ñeà`ðHœó(Š Ã‡¥R©Hv‡·oßF‹‹‹§N*æV<ìšH)‹É ¯]»Öï÷mÛ–RÆq\ŒpiµZÅ”:Tdv$I²··W„*Z­ÖÒÒÒ1¥ŽŠmàœúé§[[[W®\ét:º®A°¹¹Y¯×Ó†Ÿ×ÖÝÜÉdróæÍÑh´¶¶–çy½^7M“R: vvvšÍæcþÕû‹;v7 Ã8ìeîîînmm­¯¯£»ƒ"+• cl2™t»]MÓ:NQ¿°ßïGQÔjµŠù§áz€çåðN~óæÍõõõJ¥Òn·•Rëë댱³gÏž;wî°ý}ü»tQáuÿÎ;¡jµ:33³¼¼\­VŸh=Ï«çpüö¿-J±Ü¾}; CÛ¶ó<ïv»ÛÛÛ£Ñèž¶õøµ=ß^ |I(·nÝúõ¯ýÿþßÿ{Øï½÷Þþð8Ç{Òí|ü=pT1Þ~eeå¯þꯊ<”>ú¨èS¾ñÆEV ¥ôã?îõziš*¥,Ëj4—.]ºpáÂá9๴¿¯¿þºeYY–ݹsç¿þ뿊™zMÓ,nÈ_ÿú×Ïž=[©TŠåÿ.]dMrÎß{⦅þô§¡7ß|óp† g¿Û?iÏáøíi4ßúÖ·®]»¶¾¾þûßÿ^QTT©V«­VëþþÀñk{¾½ø’P,Ëú÷ÿ÷8Žÿâ/þâžlC)åÏ~ö³Ÿüä'–eÁï<’çy«««¡b‚Þ¢÷¦ëºïûÓÓÓgΜ¹xñâÑb˲šÍ&B(Ë2BHQ_Aq]wzzúôéÓG—/f%(~¸ÿÛ ÃÐu}nnîÒ¥KEñ¼óçÏÏÍÍ•J¥Ã³û×`Ûv«Õ’R†aHY__‡ÅÄ‹‹‹óóó‡Ù¼Oºµ½¯éº®ë³³³o¼ñFñ"K1™LB®ëÖëõÕÕÕåååÇü«ïÿí“nçãï£ßu8AQ•°ÛíƒÃŽi‘eC)¢(ŽcÎ9ƸR©,,,¼ùæ›gΜ9ìÄ8þ®þ8˯„ãñc¼¹¹9‹–——_{íµS§NÍÌÌøxü»tb(Š’´Ûí¢e?Úî?ãÝþI{ÇoOñJ@Ó4Ƙ"Š¢¢Y¬Õj+++sssyž7›ÍÃývüÚžW»ŸüÃþðÿsì(›§ðÍo~ó›ßüæÂÂÂþþþ?ÿó?›¦ùo|ãĉÍf³×ëíííýö·¿ÍóüïþîïæææŠA¤ï½÷ÞñëpÍRJ!DÇý~?‚bn#˲Êår£Ñð}_Ó4Œ1/Ýx<¾§¥»¿»™û—|º¶ZL<P^¾$IvvvnÞ¼yåÊ•­­­b¢jµºººúõ¯ýÌ™3­VkssówÞ¹råÊ=Ÿ}óÍ7ß~ûí7ß|ókB¤iº¹¹ùî»ï^¿~½Ûí"„¦§§ÏŸ?ÿío{uuÕq]‡sÀËwKw÷8­áÓµ}Ðbà‘ +ðòÅq¼±±qûöí~¿Ÿ$ ¥TJ9 !š¦1ÆÇÇW®\¹råÊ1ù&÷KÓ´ͬ­­íîî¹-»»»†a´Z-Ã0Êå2¯”"Ó!ô7ó7÷üû#[çkû ÅÀ#Aåå‹¢èÖ­[ÃáðÒ¥KÍfÓó¼4Mwww···?úè£áp¸´´T,¹¼¼|Ï»¸"iùakF~øá­[·B¯¿þú¹sçB7nÜÃðÚµkyžû¾ÝA¯‚¢+"&W®\yçwŽ_òa­áÓµ}Ðbà‘ €òò†Q©T øxñâÒÒRµZ-B*iš~ôÑG„$IŠ%1Æš¦éºŽ1ÖuݶíR©„bŒišFȽ%Ã0¼uëÖîîîÒÒÒk¯½vùòåâë®_¿^¼Ù{ë­·îùˆº Ž |uà»^â6T«Õ£1‘ÿøÇÇlí1­áS´}ÐbxEZCðŠƒÊË7==ýýïŸs^­V=Ï3 !4;;;;;ëû¾®ë‡‘‘íííý×ýïÿþoŒ±ïû333gÏžýÆ7¾±¼¼ìyÞý”4MÛívE+++/^l4¡‹/fYöé§Ÿ¶Ûí,Ëîé Uô¤”RJ84ð¡iša_”.ãñ­á“¶}ÏÒb6šp ´†à«(/Ÿçy'Ož,~.ºbI’ôz½$I¦§§†ã8–e½ù曚¦™¦©”B„aÈ9Ç»®+„XYY©Õj÷¬™16cFcnnÎó<„ÐÜÜ\£ÑHÓTA)=º¼”2Ïóbµp\>OÅ1-îÚ°ó¿RǽPtxãWýËÚ)e‚/Bö¯òyXd©ß>iÛ÷,-fqÁçs–"x9 wHGZCpT1 ÀöööÏ~ö³N§sòäÉóçÏ“¿ýöÛ“É„"„Èó¼Ó鬭­ ‡Ã÷ß0”Ëåû(Å’BÓ4ÇÑ4 !ä8ŽišŒ±"XstyÎyEBÛ¶a®Ïù¸N™ {þŽŸÐ IDAT+Õ]`Œ”¢h44ÕpÕþ¤”EÁT¥”iš¦iÅ«©¨~r|kø¤mßS·˜q !à¾ýùœ¥ÅõbFqhàn wHð%‹ž¼ô#þÅj PÀgMÅ`0ØÞÞ¾~ýúÁÁa§OŸ>þ|¹\.—ˇ#Ã9çY–íííÙ¶ýñÇ_½zUñíoûyÝ8¤”Åðr8(Ÿç-»E_~‹Y¼r€ûöçs–^/„wHð%»Àï¹Æ¡5¯2 ¼*ò<ï÷ûŸ|òÉÏþóÁ`pâĉ³gÏ^¸pa~~Þqœ£KjšfÛv«Õº|ù2¥ôÃ?ì÷ûLHÖ4Ͳ,Æ¥4MÓâÙ,MSJ©a÷V‹§8Œ±a–eÁAùÜB8ç!˲Š"8à« x¡-¥Ô4­¨ˆ ¸ê?š¦oÿ¾pO¤k Ÿ´í{ê³xÙ-æçs½7LÓ4!µîàK=9z¿Ä#þÅm P¾r(¥aîïïß¾}ûæÍ›½^϶íÓ§O_¸páĉœ4ñ0ÒQ\á›À0ŒZ­A¿ßo·Ûsss¡v»Ýï÷Ç)—˦iÞ¿æ¢GñþÏSñ]Ü»aÏ¥¯Rµ» €WýKé¼½Æ/ân|`køm´˜_ ë¥˜} žpà ¾L1”Wሡ[C”¯–bêÄ?þø·¿ýmžç¯½öÚùóçÏŸ??;;[±»¿QaŒõz½«W¯Þ¼yS×õz½þÀ×_ŽãÌÍÍI)×××mÛ.:Ÿ|òÉÆÆ†çysss¶mÃþð}Äz`khYÖS´}Ðbà‘ €òòÇã+W®üú׿þýïoYV«ÕÇëëëÝn!T©T–––B[[[“ÉÝ›×ëõвy §N*•Jãñxss!´¼¼\­VB¥RéÌ™3¡ÑhtíÚµ¢0Ò7‚ ˜ŸŸ?}út©T‚ýài 777Çã1BèÊ•+‡?¿­V«ËËË¡ÃeÖZ–õȶZL< ¼|ƒÁà½÷Þ{÷ÝwÇã1!$Š¢_ýêW‡óà\ºtéoÿöoBÿò/ÿríÚ5„!D×õbÐõüüü×¾öµ×^{­Ñhlnn¾óÎ;¡·ß~»¨±W­V/_¾lšæo~ó›«W¯~øá‡!Ã0–——/^¼xñâÅ¢×¼tE+VDLï¼óÎüc„Лo¾ùöÛoÿR,ó°ÖPÓ´G¶}ÐbàIAåå3M³^¯¯¬¬<æòňkß÷›ÍæéÓ§/^¼¸²²âûþýKº®»¸¸Èëv»Ež3B¨Ùlž:uêìÙ³‹‹‹÷”§^GgÛyÒÖcüm´˜¼P )„FX!%‹º¡cµl_0ø‡?üáѾÈàþ{¤´Oñóa UuW1ùÙÿ÷èò|ðÁ3nÌh4BÕjµgYÉѤåûÝ?„§¨™W¼s+•JSSS¾ïëºÁ= ÉEzsǽ^/ ÃÃùÕK¥R³Ùô<•Y–›Q­Va°÷ç‰1Ç1BÈó<¨6ÿÕQL^³ðÀUÿr¯úb2àb ]×ó?Ç·†÷áyXkX\\Ç·}Ðb~á®—4MÑÝ: ˆì1zRô½1ÆR©\0„¥&Ð/J©ÃkÜuÝ—uÄ_Ö¼è§ïg§ÅË÷8ïÙBSSSOºB!¤Z­Bâ1€WœçyËËËEñ‘‚a÷?>½ùæ›EùXÎy±°a†a† ‹G/ÆØ=Íßѵ=¬Å,—ËžçqÎ)¥è0CψI‘ò!äéW2à±RªŒ<[3óPŠ ‹TJ(É—J“}õ(¤Rš^e@ÀËÇñ=(EÖÉýïcaA0™L0Æ•J¥\.—J¥bêœû×süÚŽB$I†áá;®R©äº.PxúGb¥rN÷Ó!ÂhÎi(%{éD(‰0&›ÄÐîNCΔ`‚g’ Ʊ’&†ç”¯Ø©‚”TJ*E0‚ xeÁ /_øh·Û!Ji’$sss÷d‘$IÒëõúý~¯×›L&iš*¥Ç©Õj³³³Íf³V«sÛµÛm×u‹Jann®Ùl>,€R$oƒ­­­^¯EB¨(°²´´T¯×!€§ •¤‚OX| ÖV!4b1ÔÔ khA1)BžF ž:È4ô)=ku!©d&BÈÖ kp8Žq¤¸ïK‹¡¤<ïÐÀ0Œ“þŒeB¼¢ €€—Ï0Œjµ:==J’¤Ýn›¦Y’<ÄFÅÈÏó*•JQñd2™\»v c¼²²Rd²looÏÎÎêº^LÖcšf©T:&…$Š¢Û·o߸q£ÓéPJ]×E ‡Ãn·{óæM×u=Ï{¾u÷õ8•#d>¼ æÓ= !9ðà壒ò¨“ »Ù¸bxL «ˆ§CŒ-b4­J±d&Y7í%ÃDd5Ýkâçp¹¥‚î§*˜g8¾á–t§Ö½ ‚ëä³#³ !äÎÑÜ¡$ =ï{Ôý¤’O·ÓŽa-§ZE°¯( àåk6›ßýîw‹ˆÉï~÷»O?ýôþelÛž››ó}~~¾Z­†‘çy¿ßÿÃþð‹_üâúõëßûÞ÷Š%}ß?sæÌ¹sç0ÆŽãÔëõV«U¯×öíãñøã?ÞÙÙ9þüüüüéÓ§Bkkk»»»;;;㥥¥™™™çø÷*¥¸’©È',Òž2ËŽn=Ÿ5ßñAð²a‘v2桎‰Ba•°lD#¥”oØT}V7:y'o&*¨495[Ïþí]­w³IÍ*Íyõ³åÅ&)ŽåQ‡“{~å‡÷(¤Ržo']Œð’×2Í?>!RÁ4@ÕŸß=ê~R)&E@ãÍpß4Í Õ%(% €ðPžçyžWüÜëõ¾g™¥¥%¥Ôêêj­VÃGQÔétŠš¯iš !LÓ¬V«Y–†¡”BdYišE^‰ã8÷O“ÇñÆÆÆx<¾|ùòåË—Ož<‰ªT*„[·nI)“$¹'ü!¥,fß|Ò³R)®D*è˜Gc Yèùªn”ñÝIž•<9UL!e"ÃÓíg¯"ñ¸BI®¤†±EôÇR!” ’3Î%åaŒ±”’¨gñ…gq'î¥ý~¸š™Ñœ`Òx˜Tð’î$Yšã\!dq'î%.™­´(O2#×u]*©âJp%B1ÆŸMŠ|øß‘@@ñïRI*E7Ý ÷·Ó~Íôk’$NÍÔ „P.™TŠ`âËÓl‹|uŸ‰¤RÉA6Ù Â5ÍuÑï·ã.BÈð4Í|ÖëN)%‘:Lý!w]BÓav³Q;zÒ³813}®Wz1ÿš”RÓ`´€ ¾A–ÕÕU¥”ïûEÇšR:ã8®T*SSS–eaŒ‹é÷ööúý~žçI’Äq<77÷ï|çÒ¥K ÷PŠÁAY–5¹¹9ÇqBsssÛÛÛY–F£bbã£BˆbÑ=¿z$¦DÂó6ÞŒwÛù áÙŒY5ÆŽ4°Nž!€2ÑfÒŸˆ#\Ó¼Egº¢»¯È±cJÄW )!%WR*‰1¶ˆþDgW"æÙEý< ’¥f–rŠ1Nx:aI„ó–YÎÍD2aQ*r*™B*—<äi$SW¹‚«> h8 «[®o „Æ,¤RXD·‰åëöá9ò8ãô³€ ‹ò¡P²¢ÛUÓ7‰>¦qÌòA:QHxÂ3°YIYslbšGÎó/e¡âhRÉ3A1ÂŽn™D's%R‘XÔËF&ÖBšä3ˆ†1R†,ÝOû¡³Î\®— ¢“g_r%3™Å,‹xf}Úª¹ºÊíÒÑA>Šyîév*²TR “'  ä‚Mx‚ªèî=õn€ ¼|£D~¸“îŒø@qO5“!D×õ¢¦IžçEY“<Ïcš¦éº~O¡Œqñ/†aI1ÅC“<“9“B*i½¤{J‘Hd!OsÁL¢×4?Y›&2;ížpu{£TÐE¬$–%ÝÍ%SéD«þœÞ$DR0%„âÖ‹Ê& )®¤"4äÉn6ØL»=غ!°ò4Iª'ÊÖ <îó@Q€6l£zÙØ$†n´,ͺ'¥X’J‘ J’›Øð G"4Ìà rɪʯ»UÃ0„’9t¼K‡H8W[igÀƒ KsÉ%RÆ=RÂë^Å'“b$£­¼·™wº,t°¹ÏF%î{Ø·5›`¥b !\<èj˜R·M*¥”Âa„+ËÝæ\2&œK&”"„X¤Ø·–A4 “'Ê»yÊØÍÝr¿O]û¦øKsACžPÁ1ƶf”tï©qBBŠDP*ó\ð„§£<Šxš Z1|ÇrlÍ–H!„H‘!…ÌâRd‚†*ˆp$B”At®8C2”™D(Wœ#IáH昅*ïó`"RÛ°›¨*•tˆ• ¼'{±Ì¶óÞfÞ Xjêz SÎÕ^ÖïÑÐ#'¼¥Õˆ®q%c”íåý;i'áYÆi*YY·—Üé“¥ÙÓåcK3}Ãéåc¥TÝ,%œæ’åˆÐI‰-ÓDXËÍ%e’[šQ3Êæc‡ŸíL@G΄%cé wóÞVÚEQÂO8´a׸®Òœ§ŠåŠqEF" eZÕ|B´T²He‰¤J©XåaeÃ3õ§ß'æœË‰Jvò¾© tƱ\›âc•2XaB(–Kbh¦a tî©T‘©wx9k=6ÙH;:Ö–+³H'O#„H)Ÿ:Ù@À£I‰3®¢\J…ÂL2 »€ü¤¡Ôh4úýïÿÉ'ŸÜ¸qÃ4Í?û³?»páB=yàDÅÅÉårYJ™ç¹”¸P5MóJ%SNš ò —òs#Yêôòñ„Å™â&14¢e‚¥<wïÕJ)Q„KÁ»‹ †¶5£8c–mD7&[·‚Ý’a÷³¥†Uõ ÛÄð´ €ò¥ÃK’$ Ãñxœ$ c !T¼@›ššò}ß¶í"…8Žã~¿Ažç!˲Êår£Ñð}ÿ0ßøOíäS| ð$]D…ʘdB%T ©`ŸðÔ­aÇE#8‹Ê¬ãñ¸×ëAÏóò<ït:7nÜxÿý÷×××£(ZXXhµZÍf³˜(§˜gç°1-†ðDQÔív{½žaE‘”â»BžçåNlÛž™™év»»»»¥Riii !´µµµ»»ëû~³Ù´mûøíO9m§ƒ½´¿ŸF4JXÞ´+UÓ'oíõ¸3¡‰KŒ„gRI‰PÓ*Ï:õy¯U·J©½d‰Œ`‚1¶‰–K1fñNÚ¯‡í> "–FNxîiÖ)oF#ÚV|K6e•ëf©j•"–ôÒá†;q7æé0;é(—|Ê,͸u)äVÔÙL{Nhxh½aUV˳ÒÛI?á¹I4[3ÝÂgðå˜â)>x¢°*(£*c|± x,qonnŽÇc„Ðææf1Ðfss³([­V———‡ÃáOúÓßýîwkkk„×^{mee%Ïó­­-MÓjµÚaàc2™í cìàààúõë¾ï‰*Åw!„–——‹õû¾êÔ)ÎùÕ«Wwvv.^¼ˆúä“OÆãq­V;uê”ïûÇoÄ㛓í;Ñ~È“˜e!O#žTM!t+ØÛMúT “|Ý.™ÎœÛô ÇÓ,“èÒ¼ÎÏ–|Ãv5ËÓì‹þ0Þîf“ëÁ“<”I!²5c+îé˜å6¹”c‚ÉŒ3u¡º¸ìÍ4­jŸónc/vó‰Ÿ8ón¡×`RLx2È&ûé@'ÚŠ?› úÑàÖzt0b‰Rªn•u¢Ý ÷¸’UÓ«˜.Ÿe=dƒz×7ãN*X"hʳž1VJ%7âƒN6’U 'Èckw¢ýݤ¯}ÙŸ¹\?]2ÜŤ)”œuêUÓ³ˆy3NòÑhÿV¸7ÎCƒhsNcÁk.xÓ4ÞNz¿Þ15ÝÒôÓ¥¹)«dý“­í¨+p‰5íN)¥ö“þ˜¹`¼¨{ªeÃkZ•Y¯!•Ú úù$”`R6½i»Z2f‘B!KBžlÇÝ[Á®P²j¸ ~ëTùÄSgs<²íPJhøÑpM*õÖÔ)Óm˜ÄÐŽdÊ „L¢}–; ¬üñ(¤ƒ÷ºŸlĪ$<4f‰r?kL[Õ†]®›ϰ3¯!æÙí¨}'lßwc–UL¿i•ÏW¸à›q'`ÉÕѺR*TÃØÓÝÖljŽnæø|˜C"U4dQ7q)WüYhãˆeý<àJbL*¦WÑ]ƒh›q7tL£NmÆ®´œz$2)ÅšÌ{4¨!1ï5ÏWu¢oEN6Úˆ2‘ ¤Ê†#‘Šýd´u;hOx’ jëÖIöÚjÙtûùÄ"æ ¯îê–þ 9³=Ã>UžÕ‰F݉»ר`¹\q‰”¯™Ï•R¬"$”,ªÕ‚ ¢»'Šž%Ç,Zö·ãn;í×Mÿϧ/ZZëžãþÀÏRɹL ç!àŸ5m§ƒí¸ÛÍÆ¶füYý,Fø£áš@jÄb¦ä0Š‹B"ÔÉFÓY%9B¨Ÿ}äR„Æ,çQqf>p{zùøÆdgLcG·ZvítéÄ”uïG"‘ʸlmEª„Rª›Oé¸jøEÔŒJ1áB¨¢ûö‘Lºˆ¥·‚ÝN6JD^&öª=3¥—t5PP^ù.ãÆÆÆíÛ·ûý~’$Å äƒÁ ¨cÇsÇ÷ý"Ȳ¶¶¶»»[¼XÛÝÝ5 £Õj†±°°pÿœiš>ŧOÔ –RQ.S&3&!€g  ´Ûm„P»Ý.CÚívQadnn®Ùlˬ¯¯‡Ãjµj†RªÓéôû}„Ðììl½^/Â’é\£ IDAT.ûûû¡b@ûh4:88ÀŸ={öâÅ‹•Jå0€Òl6‹J¹\>wîçü“O>é÷û¡~¿oYÖ©S§Î;W*•îyfJd‚&)w”]6ü˜¥;q·ʆã6S’ ¶p)ºù„)Y1=¥DŸ†R©“þì¼×ðt['šŽ´ºUeÅ¥ðtÛÕO·†,B˜ñöÍ`wDCƒh®fy†M xÂ¥DHé˜ØšáéNÉð–üé3åùY§nƒ#9ï63Áö³á~2(2óßQ %™ä\J¡dÈ¢ÝdÐNú{éÀÀZ&ò\°›áî„&u«\rG3cžo'½;Ñ^Ã*%<3‰¡JD¾wïDC5̲£c„˜äëñW2TÇW"áùnÚ°ðv°7áIÕ*­x­Eºj–\ÃFH5¬ª¯Ûch'ó1 D;ŒiD¥˜wë‹~ëly¾åLòÉž×# qÄc‘ïgcƒè;I×@ÚzØÞˆ{Æ®n"CMh˜ FÂ)…„’TŠTÒgɃdÀ¤¨š~Ý,ÕíJÝ*UÍF8`Q?’áˆ1ÏbžoF¡¤K,¥TÙpmÍ8|ŠVŸ=1²ˆgIW³1"TòLfK¹’&Ñ]ݪþÑ⻇¥I ÂLòX¤;QïV°«šµk¾áT _ÓLôÙŒEc‰TÍ(y†­c #$”Œy>f!—Ü$ºDˆ ¶w7â΀ƋnòÆLŠn>Ix>²Â^^ª›åªé• ×Ñm“!&C\*)‹ %¹ä! ëÃ<¸9ÙÚIT0ßpgœÚ ·yÂmp)ÝÞŠ¶“^À“èá ËÆS¶O%÷ §¤»‡:Ö˺[·Ê-§†”Z𚦓|‡BIG·+†Ó0ËLò­¤Ÿˆ¬¬ÙÓVµe×fœ©˜§Kk†'¥œq§Vü™Óåyƒè¦¦K%ÛI?âù¢×,®B’+ÙÍÇ\I¡dÙpÝÖjyvµr¢¢»M§†ªèîÃÊ0[šÑ ©T̤Ôv|À$«™.“ü ŸLX²$á™­}63ÔQ¹`Ý|”pªâvݬ<~yÝB&è;q-ØÛŒ;ûi¿iWNxMO·êfÅÖM¥T.XÄ“DP.¹Tò° —<æŒ)Q6¼E¿U5ýGvWL¢7¬Š«™gÊ ©Ý¤ß§AÄ’Œ³! sI+¦§a-àÉ(†y`«“Æ,±4CÃ8d阆ìA”\° ¶“îZОð¤a–mÍ,†§Ý£¸?0%|ÝÆŘ;¤\bNi%]3r$¤†Š!Á-xÓ'œzË© %w¢n.yÃ*W-¿jø®nDst«bø&1Æ.1O¸Í%›Q»‡F!3AmÍÔ±¦¢’Y³,ì í_®o§ýT0„Ðh!œI6k×¾V?=ï4 Æ»Io@'»É aW*¦WÖ=‚q"ó˜g© Knórý”«9;Iw;în„™¤ «<íTc–)„¯Ov„’ûÙ b¸§üÙ“¥9OwlÍhÙ5„EŒâÐÓUŽrº÷rÁêVeÑ^ñgæÜ†­™D¢¯UOuOè†Þοê}:¦ÉõñRh;îQ‘Ϲ K3Ç,¶ˆ¾è¶vyÊô-bp$"žõ³`@ƒÝ¤›JîcÙk]š:yÂiØšijfQ"+–Kž ³, ÉnÒýd²¹îI%žœ¯,NÛU‚?›RZ)Å•±èv¸'•\r[&1G4l'½µ`7YÕ,ô[—j+¶6uäœ Ï‹êÂ7Ãî`{/è„ì¥ÃªUrˆU\–^ŸlSÉO•NÌ¢)ßpÂ)ÏÛiÿêèΘFeÓ7°F¥ç!—rÑm|³y¾aV&4>Ȇw¢ƒn>îdC ƒè5³´àMÏÚõ†]A ò äI&(œJžñt¤¯»™ ›qÇ$Úk•Å¥ÒÌŒ=Uµ|‡ØB‰ŠéVL—!Yáþ’ÛH­GÞï]¿îp‹ÞL‘„ruû¤?S5½ywZ(^5K!Ë"žiÈ%gJÖ5cÊ,5¬jÌS¥:ÑÏW^«.µœZÕð\Í¢œõ¨ÃO×Nøªá ¥B Ën»áSþì¬[ÇòàF°+¤˜¶k‹ÞôÙòüœ[/éŽA´boãá€0“šYºT=Ù²k[q“ ^³üA¼Ûý$—¼Oƒ> ¦­êý”H$wÂv7 LMo9U»b>i%àñõñÖZÐÞφ#K„2Ánm kVÕ°4ƒJ> “µ`o/Œò —\#DGšN4*؈©È…R§üYß°+¦wLž”­3Δ¥éU£¤mÚŠY2e•3ÉbN¹JF4"͹õ\°;Á^Äò½d€1i§ýLäM»¢a2aɘE  Ä"½¶o{lˆÖ-Í"¦ö Í‘JfœJ¥Ê–?ï6çÝFÉt‰BºÒ Ižïòá€Ei1„GJ*Ø€íl°Ÿ˜ÛQg¢v2ÜK†±ÈSžÿ¶Ý ºTÒÒÍâ¾1¡Š‡4ê¥ã\°Lн´'l_­D“Já²V3=©TŸNvâîz¸×§Ñ ·áj–F4„0‚Ù¸P^q†aT*Ã0.^¼¸´´T­V‹Jš¦}ô!$IMÓnݺµ»»»´´ôÚk¯]¾|¹øàõë׋.à[o½uÿšÃ0|ÒO)¥Š©‹YÁçãp‡ !î™è¼â¸LHÆUÊTÆ%å‚sñ˜3aÇýpØOQ v)\õ/eK¤”/}ÔwQêuzzºøßåå壿-òM ÃXYYyØ“ÕjµHW9\!Ä4Ír¹<===??¿ºº:55…1.¾«øÒÏ0lÛ²,MÓ„•J¥Hii6› +++õzýþý£”ŠY¶žh¹æjV.hÀR“h'Ü©Y·Ù°*Övâ^*ؼ×8éÏœ//1ÅB–X?á6f¥È@iXsõ?ù£,bL[ÕÜ£¥-–,–Z'œÆ´]aJ¸šÃ%«ÛÕ)«\1<û¾ ¦f4œJ3+XK9íå“©|\5|ŒpÀã1y±4lOÚùˆJ^5…ԘƄèÓvyÅŸ=åÏ͹M„”NÈ~Ò'Å"Ó8“!”ðÜ ÚŒU;Už;S^ð4§d8áýd€Zt§}òp”‡Ù8¹†qÍ,Í»YwÊÖL kÞŸþ½¶f¶ìÚØ k¦§”:åÏž*ÏM;SeÃEaÍš³êÊT–m¹©}'Ú߈»ÛqO*‘ Z1½“~Ë×A˜D_ò[³N}Ê*YÄäH†4î˜ãvÚ'SɦÌòIæLy¾eO=°nEQÁ1¬‹Úéà *…4Bbžù†ca“`œ+Òh/íߘì )bšZÄа›÷Ò¾RJ#F.øaH½¨53fq;îÇ<3‰ðx=ìì$ÝXdŽ2»é¸iWZvU*‡I1¢áF¸‹Ì Z±‘Rɽ¤¿µï„û#¹º¥aIN0®˜þª?³êÏ5íZÄÒ²éI„ÍLEñ,áy/ŸH„šö²ÂhLãXä\J¡W",å™BjÂ2¦8•lÊò–J3gÊó5³ì|6­¯tu #ñ,|Ùoq) b쥃bt•¯»©ÌøÝŠ&ÑMÓwu»b”8ÒÚ¤–y®n#„°RžfÕÌRÓ©x̪[% k§Ê'Nús÷uÃTzÃ,/¹-‚ðji¾î”1ÆLrŒªc»>cW©âË¥™E¯…1fA1éOË­Ï»Ó ~³f”uLÆGkC±5ÓÖLWwÝæJN™ÞnÜ¿îNh4Ì£ƒdd`M!¤cMÇ„`¢âJŒi¼u¶’ž®i¹ óN£j”Y‹ä³[BJ©ˆe›Qg7éiDkZe ‰Ô~6— /y²ƒl¸´»Ù$¹Pã¢Ü JPA…’:"ÚcÌe­d8&Ñ]ÝÅUtWüöެɎã:]kåPã{÷î 4‚ )H¢x|®ã8¬¸tøèÕ~àoÓ“Ÿýtã:Â>RȶìˆC‹IS"HÄÐzܽ§rXç!w7›˜ Yß :6²²ªrª\_~k-o;Q~PO'¶›Ù¡™wT2Ð JnÍvK¶;å¡D: q\Ï&f^Ú:(ÚÀ±·ìœ÷;åø«ÉíÛž"ÕSÙjÒ]Šr…êJájç]&ãÕ´¡½±wˆœ÷•Ý3ãi]O}uhf…--»ÂÕ·çû7g;õÔx{m~7­âír4³E_eV&¥3Î;-ä’n]Ì×»QnÙo£íbÿvy°5Û›šò«éí/'·¾šÜNd´šlg*I„²ìoNwn̶ç®J…^‹û«I?•a¥AC ¼ò‡û·k­ív»ÇÑìÖÖÖÖÖÖò<©‹¢ØÚÚšN§çÏŸ¿|ùò`0€Ë—/—eùé§Ÿnmm•eyÍO{U¶ç½7Æ4‹Ç‹„1&„K ùç›yPׯXW9_Z_WV¦¬Ÿ˜@ .{Á_¯¡ÏšYÿrH@kÃ8<¦^–——ßÿý 7¹Y–Mʣ˄/ÝßüÍß„2!Ù°R*Š¢4M³,CDD ÷ 7ýÆ”BlµZ—.]:}úôqØõ4Mó<¿ÿ›(5I˜Ùbd ‚‘ gVtÚÕùZÒïE™÷îÊä¦"q©uêbgãt¾Œ¼¸Ñ0íÅR?ÂòADDÝÿgù-ë]®’T$±P8nGœ&­I鮇³÷~ÔîÇÝj|«Ø$O%K•3Ÿ~}c¾sXOKg ä%y#_£½ÎÌŸoÀ…öú™te)ê„ʇqÿ /_ìlÔÓI]Ì]Uºzîê®Ê/µNmäË=ÝR$7p¹öæÖl·fûV÷tGå»ÕøÚäÎnqÛowÎläîÊèO!Qä*&Ýóùú©¤~»söL¾Ü–ÉqBb`BJU|:Nmuk¾]y×Ó­7Zk?í]XIº!o*“˜t$$!1sFQWå§³Á;3ž}"£L¦!ƒÏ—êð$Ù¿šn}vxãËéíýz²w7ó…øÿÐL¿œlÝœïn—£Ê›«“-Dœ»:z˜öWâþjÜ]K–R±xþkæëÉÿ³ûÇ[Å®®¼™Â²H'2>0ÓbTµŒñnjнrt»ØÛ¯§%0(…­~»óÉõÙŽ`€½jRººrf=é]îl¾Õ9ÓR™"‘«ä4 {Q^ºÚx7©ç[åþÝâ`§1¹Y»´Ô‘Йˆ)M²£²TDŽÝ¨ž[¶Ëq{#l¤Ë=Ý>î)DÔ$‡q÷/–ÞôìS‘8°KQ¾SŽ·Š}Ç®µ–T;úvº‰"W13#bé«¶JsK$ ÈUÚZËQ×*;µe$ä¹|m%î?)BÈd¼ :سE¦âAÒ9ÛZgög²•õt€€Ëº³–ö=ûXèDÄ©Œ%>KРŠbfE²¥fèk™ªéuÚFÄÊ»\%E±PxjÊýr|«Øùrz›ÐÛí3è÷ÀœD P˜-»Â–aüü¤}z%íI;åèwûWþ4¾)Qd2Ù)Gc3/\‰èL¶’ÊȲ3Þv1éAÔj«$"Ý‹òAÜ{ô¾#´j$!!€"¡Hue–Éèny°[g¶L…JeB Ý)önÍw¶«ñÔVg³Á…Ö9Ù*l=3åÌV™Œ`f«¹«æ¶¸9Û¾:½]¸ú'ÝóZ§ÖÓ~O·²Ir,ûÒU•·]’™JÚ*iÉ<Ø’¼™S“®]äZsW^›Ýùz¶]9[³ýzº-Fõ´§³uÏö£vak…¢e}ÝîÇm…bnkïsîfµýÑþ’äõÙÝzlÁ'€[Å^K%Ëq§öæÊøÆù^G·O%K?é_‹û€`ÀFÒ !P^qdYvîܹ/ë½sn>ŸïììÌçóáp8 ’$™N§ƘÁ`°¾¾že¬¯¯ƒ¢(‚öÀ úÓ^8”Fò‚Ñ(P^ë¾³Îçgc¡2¶4G;”'ëwïýq¶…FÒÌú—õ$A~ø ~ƒgë=?VU5Nçóù=4G-öëyžŸ,ÃG-TrOµO DT(4É•qãëómD¤®Ê3™´T’s.µ0"¦2>%†NÔÃïÍ«JH‘ ¶ÎV“¥ÊÛÝê°´Õ¸žZ゙mÔ˜I-HtT¾š,mf+ç[«  „òÌgóÕe݉… ¹*r™Ä™ÄÝQ=9¬çS3+\]zÛÑùù|u)êH„¨´XMúov6,ûÍl5Wi®RÏþn¹ÇÌo¶7.´Öº?äá Q£ìéö…Ö)Ï|®µÖZ÷Ø¢ÁÙ'ÉFº<ª§×gwûµ´¡µ¾‘ Bþãû •©¸Ç­EšX¤ã^xä“ä ¥ QØúëùöÔuakoÛj¤INíüëùöÔ”¹ŒÖs[×l “ñÙlu3[éé¼£óX(Ǿræ ߘí|9¹½UîíÕEŠ©–PKQGõd§:,\=wÕír«Ø›â ž]Ÿï’"Q9s}¶3¶å…l5–zd¦“zvhŠžÎϤÃõd ú=ª£³°£›Ø¢[´::Kg;Û$Gõ::oÉ4Wi"´ ‘ Ë̳߫­w‰Œ†QwIwN³Ðb©ŒÓ£,6ž}.Óv”·uV9“ʨ}_ʕВ z‚¢–L[2Ö$ÈcKÄ=õ¢\"€&9Œ{™Šo§IúL“ĵu£Ö…Ö: “N[%*éC+\õ]fôIUT*ãaÒ›ØêÀL§®œ»r»<èÊ´µIwÊÑíb/ø˜Xðãz~·ØïE­ìÏkvÞWÞ @DJœ˜ï&ÕÓ‰ ¤õléBk]¢HE|c¶}·mW‡Xª âöjÜßÈ–s™ïj0µ³‰Ôkq¿«3MQDR=AžrˆâH•£Ptt–ɤvõa=/}幓«x%îо‹3¡{ºµ÷=»TèÊÛ‘í×cëÓšÍíùþA5žÚòv±wXÏÚ*ÝÈçZk=œéµ·…­ ªrvf+ã2q,U$3bB$Å$·S[ÌLY:³5Û=¨gƒ¸í½?´ó¹­+o—£ö™l¸‘­ÔÎH’=ç2 r¼™­vÊ‘"1±ÕµùN"”e×SY*#DU“k“;Ý®Ù^ŸïÎmñVçÌÅöÆé|Ø¡¤ô¥µ¶Ù¢4h”×lK]Åõë×ÿùŸÿùîÝ»çÎ{ûí·ûýþááaUUÎ9­u’$A½œ$‰ÖÚ(Öö W5hÐàÉÁÖ³õ!œ>Wj B15® ž;;;¿úÕ¯¾þúëã_677ßÿý{˜fª7nÜއÃáéÓ§/^¼¨µÆ£$&-ó€éü4W! !¦2^I—¦•Ù.ö`÷–â®ÑFººõ“ÞyËþTºÔÓ­H(\ÒmÐO–%Ð1ïóTHd|:_.]ùùøæµúö“[™ˆ•^loœ?RRDÁyAÄ™ŠàΘ‹8"yœé%ˆTD:]ÕrÞYðž"•Ë8¤È ÒÕ­ŸöÏ3sGå’DL*gà­öéµd)~õ“«äÍö3/"§>è­¡Oeƒ±™þ÷èë˜ÝùlõL¾š‰ä ZRâYÚA=q&f2Ú,V®NïÜ)nÌwj·Ü(Å™tù­ÎéH¨›³½™-‰aÜ}£½1Œºš¤$¡H”ÎìT£«Ó­ßï}¹SÆ2¹œ, ã®&UºZ µuzPMþOypPÎ]´-_϶0"n—£Ê™ÂU‚¤G<›ÿçÒ¥AÒ™™ò ß.Z*YIû¹Jî7¡1ÑZÒïDy ò*[@$£H(‰"äÌ( f®yÅ3 ¢õ1—ñˆöÔ$;2ÓȳD Å#Fµ ÊTœ©D¢²¹Š;*ïè4IK'‚Å= †:Bdüfgr™÷ãŸ]/‘^{ÕøÆôÎv5¾:ÝÊDœËøT:x§·©P}5¹s§ÜÓBo¤ÃN’¸6ÛVBe* MwœÖw§!àrÔMOèbjWß-¶ËC˾%ã%ÝF½ð¿?í]¸1Û94óÒ×™J–£Î»›ëÙr&“ÐM™™RLJ‘H„Ïâs¢H¶uÖR±a7³…c/s-'mÁ"W±gî«ö^=YŠÚm†¸Âu=Ý«&·f»³(ۯǿ۽r}¶m¼c„ˆÔ©t°÷{:;I¥1ðÜV×çÛÎû•¤;·åÌ•µ7šT,4};ßDÊ¤Ž„2ÞŽÍl¿âN5"àwÏó‡û_Ôs‰¢¥Ò~Ô^KúÌŒHú(zd2j«¤¥³¨:,\ÕVÉ[Óý¨EHÛÅ裃/¾˜Ü`Ü©{:;—¯œk­d"jBÇ6h”×:©ªjooïúõë!Û¢RêâÅ‹o¿ýö‹ŒóÔÎBˆ‡y˜7xðÞ‡oZþµ’cFï<ƒõhS$!žh7#„89éýQ3ë_ È,„xb cF£Ñöö6ÌçóíííÑhôî»ïž,SUÕáááµk×>þøã›7oGÔP2¼E§Ó€Ç–9ÖªòޱP«qÿˆîAMŠ¡gÛVã~®’Ç>³&yÞÓ{ËÙ£Öj²t::ð§³á0ê>–zÚ– z©³LŹJ©TÄwæ»S[0C$TGeùò[ÝÍXDÕšÙJ“ìêl-Y¼i0¡'vvmzçËñÖNuˆH›éòF¾<ŒºJ¨ÚH¤¾NwÒa=¿=ßݯÆ_L¶öªñrÔjÉøv±¿_Ojö}-Eí ùúÙÖÊJÜ/]}hfý¨«ˆŽ¸¹íòIä”ä@Ô qX@‘ ü®ßš I‰ÅOFœ\Å’¼Ìe’«40wÇONF¤´n?Òä[wjw†U/•QdDJšê™ÄÓõbÏy»u£DYo ovªC9¥õt)Z ÕΚé^5¾[ì#â8YĶÊb¡ qîë;åÞNu¨…êéVK%Aá¹}¾u*“évµ?³¡XMºÚ§†qïagÏn’hË´% èØ &‘ˆ¸-3MR’´m×RÉn9në4WIIb9êTÎÞ-JWµT:5óÛå~áªLÆ=ÝÄÝó­µ¥ø*³Â•7gÛ…3Ì|h¦33·ÞÅ$C[}kS„”È(–šÙÖÅõé]A²v¦«Ò³­U¼6Û™Ú*‘Q?j·UB/Ý?ØÚ:=.‡Ñ¾wßjŸYJ:̬P|:ºz·}5½“ɨ£’Ít¸ž úº-Qøæ\¹AC ¼^¨ªjww÷“O>ù—ù—½½½S§N]ºtéG?úÑÆÆFDQ|æ‹¢VVQu]+¥´ÖÜ?íUÁ Ñõîß\6x~ ¢ Œ¢è¥‡!hðTP’Éxh€•.oæCfþjzw»<øïñõÊü–ôϵVW¢žñîV±ó_{Ÿß˜Õ7æCA¤IT“ϯ]ŸíìWc´š.äkït6W“¾²påÖ|o¿žvt¾š.År!p ¹rz:?뇖=ÆBµ¯ç;õR*£–L"¡4IBÔBǤÂÊÉh#ö£ÖÔ’D[et*[ž¸òÖlçóq©Id*îëö:çÎç+Kq':•IGe÷÷W᪳푙K¤ÒV‡¦P$"¡î%H¤B&R#â^=ûøðë\¦‘Œ6Òaél¤"‘Êh-íÇ2zX³´döNçì¹|­¥â–J;*„€IŸ§BÔ IDAT=ëéÖvy86óLF?éž¿Ø>=ˆ:Ó»5hÐ(¯(꺞L&·oßþâ‹/þô§?íììÄq|ñâÅýèG§N ò¥T¯×Ç»»»[[[ëëë°µµµ»»›$I»Ý;Î{M»§¿*D×kt/åu6ƒzèÁ3Ô =a?Š8BC 4³þÅ#(P^…(Y–={6$Ç©ë:Rî‰Õ5™L>ûì³/¾øÂ97 B±Ùl6®\¹"¥›­´T¶‘Îf«g²•ÇJ<¾+‡òÍß!ËŸy«6*m•Ë× «[ŒJûgz@\diýÐv‹®ÂH±Ðƒ¨}._ÛÌÖNgî¾×%-WIWµv«én96äjÜ;Ÿ¯ ûÕØx7ª'm•œJ«ÉR°-% I"ýT]óMD”HˆX )˜s§"‘ôŠnxQ†ñrÒ»ØÞðìÏdËŽ}"£ö,Þšï—®ÔBŸN‡g³Õå¤ç½G„¯&[#3ýzzwjʘäÄ×f;ûÕ˜™=øÛžc{åa$õNupc¾=µÕ…|u-^ŠÒ™K9‰\Å/à IFR§2i©‘R+ZD>’$::Í9îê4)ëÝél¹ö¦²µñ®òuÅf¶r±}ú\¾Ú‹òG}ï˜+gëÙb¿²õÔ}•… ¿âÛÔ§@ФJ)’(殾1ß[ý…|õlkµµàL¾’©$‘z÷z(u˜ÈèT¾Œ ¹Šs¥@[§kIoæ*ÏîT2x£uj3[ÉTܸ]7h”× Áãú÷¿ÿýþçVUõÎ;ï¼ýöÛo¿ýöÚÚÚ±ãw’$ëëëÞû¯¾ú*Žã@||òÉ'W¯^Ͳl}}=ްÚ>ÛU 4x ãØ{öž‚c. †½o¾Ä <#bŒ€Ñh”¦é¿˜W®\Ùßßÿ‹¿ø‹·ß~;èDÖ××?ûì³?üðÊ•+õWÅÌ-ól5?È<¹JzÜZŽºüjÒïŸÈ]òÒˆ]Ýþiÿ¢qv)nuTþ$~4¯b¡†q/üñj>aˆ²’,ýõðdž]Gg¹ÌÒûÔ"ˆ¨…$Ý‘›×ÎÆ¤/´ÖÎç«ké œo­Iûõtµ—ãvþÜ´6Ïß\Çó"Úg*I¥–øŠž„œ5™¾ÙÙωŒ8“ѹ|­t•ó^%2îª<𙫴ÿVçÌ—ÓÛצwþ{ô5FBå:»Ø:µž.リÜÞ)Fw‹}¨…¬½Ý­ÆËqw%î­¥ý„ôË¢ŠdK¥KQ3™ˆoSZ¡×™ŒN§Ã\&+qïny°[æ*½Ü=»ž 1G’hëlßÌ÷ëÉØÌK[ ÝJ(JŽc Ü1Z ¥3ŠèBkíBëT.cfÞ̆ƒ¨£I¶Tòˆ˜JÇê?IOèw2o¶Ö:Q+Q_·7²AöÚΩ òƒÆh4úè£þíßþíw¿û]E+++£Ñ諯¾ ~àNgss3MÓ‹/ÀÁÁÁÇö—üãÇãñÆÆÆÅ‹[­Öh4ºvíŸàµZ­7ß|óÑW5íß Áw"P¼ÇÀœ‡ÊøÊx×$ÓiÐàé¡” /èv»TV–eyç΢(666Þy祥¥À¼L&“_ÿú×ι²,™ù±ež­æoÏ})´Ðq j=ê3CåÁyëñUñ¥WWe$ä"V(Áúê×nlcŒ1!!nHýŽˆ œw^ÝÈ‹5½,:z`û+k²Ç±Ÿ™"Ñ©dy-êg ½ç¡êb‘µucÖ[ð¯ï'©H˜Y{ë š‡¹`'zWJ½,}´ ð€ÊÚ:]Ä=v=r ħ£å²ªvg£Y](”éÙ>“¬žNµ·¶6hý^=šÚ %R²Sª7íb°¾æ—4+­Ï0êÈœ™5JoœÖ3L°‰VÉ6¥=ʵPÑÎP?~U±>Ã(1ª&ûõ¤ôÈZ¶Þ8°ßêq©Ày 2Q„¢+³lw1EËÀÜÆ4•‘Ò ÁúÚ×è>pΞ\„¥¡ìt)Meœ‹$æoÍ)km]×ÇúÐ åÕÅÞÞÞoûÛßüæ7£Ñˆˆ¦Óé¿þë¿Æq,¥€ÿøÇÿ÷þüùŸýìgQýû¿ÿûþð‡?ü0|TΞ={ùòåË—/w»Ý«W¯þò—¿€>ø DÝëv»ï½÷žÖúW5íß Áw„c° à}P xï¥Aƒç3Ýœ›ÍfƘ,Ë:NÓétBncç\ˆ,ó$ež­æ“ŠsÎ3›ÍyS@V0ó³îä`fÏ ôåk+S·ÖjÌ#¥DÄ×(`g€úìü)ÑYŠy‰”P[eŠŠZVKìôBòšÂNêÉk=MY·!ô¶23œ=š2+м÷¯~l8ö®çÓÓriÏ–E«§òê ãN[æ©Õä;ñƆèÌtêÊÂÕŠä’j-éV2_š—87«ªŠX´!²à•£ª('~ò˜ÁÌ.÷Ja‡˜|iždLÖu­)‡ãj¾ofŽyt•)gE}”7ÍZ{ÜãU] ƾ̗T¾.{Ú’)*‡50ø†½E78÷ð ›OLXOŒ¶ÄùɉˆrDL’¤‰HØ !P^ih­—––Ο?ÿˆ2išž9sÆ9·½½mŒ é———ßxãK—.9s&I’‡]eŒyª«4hð4Æ xfÇ &¥0¾4`}Ó0 <[Ô{km°©¢( ç„!ïqTæ`o?¶Ì³Õü@ÄB¯%K‘z¥Ø8J ÓŒœ—ˆÇ†Wˆ„ŠÄƒ´Ú:M9vìA½þý µw”ù^YS$::C¾ö¶«²ŽÌÚ"9öæk«tȽ™­ _Î]%QôU+‘‘|¹+†"ÑÖYÁÖx—žîqƒ9$äz´ӋöAÑQy®R;·¥«5)-´$ñ°©!I´dºžÀ™dy3Yn«lká;®f驞¼Aƒ†@yEqöìÙ>øà¿øÅÿ7¸ðDQ¤µ>wî\žçý×]UUØØµZ­ååå¦'Ô*\,B$Iò諚öoÐà;™sÞ3#’(- OƒÏ“!o½÷ι ÕtÎg³ „')ól5ßSžˆ²,ÓZ{ð@@M*‡ç ä:ÕR?ºÇCä¾Ðã¯ÅÛiÐ9¤¯Wdè—¸CBÌ]‹8VɃO}×o±À%â^ÝÒBJ”©Ð‰Œ"­ïÂÏñ¶ÈOç+žýFky ;_aJDAŠØLÕ Ò AƒÏË>÷ޤD (­/ 7 ”W¦ƒØ8% 1·¾PJõz½ƒƒƒÝÝÝ­­­À\lmmíîîÆqÜëõ´ÖÌüØ2ÏVsÓþ |'ŠAȾn…?šÖx%ì@RdJ-¤z>‰¥%‰\Åm™ÆBi’‰Œ¡éá9˜2•\h¯3øŽÌ^{Ò ÁS é¦ 4hð]„@ˆÞq sHÁÃÌÌÄB!––Ë&ˆì+ƒÊñÁÜy†V, R 5Û°W³Ùlggg6›Àµk׎ÿøôÓO ˲åååê¯_¿î½?<<€Ï?ÿüæÍ›KKKgΜ É[&Ü Bp”Dù±57hÐà™!P$‚Fû•±Id2"@EB ”χ@!ĈT"£T&™ŠsÇ"zDëˆä@·€ö¤Á«9qš&hРÁ3Ã1Æ@¢HþÀ>r à˜33€ˆ¥å°õÍ÷þ•@QóS9^mËA*óˆ´lºæÕÅÎÎί~õ«¯¿þ®]»Ž_ÿú×á—ÍÍÍ÷ß¿Ûíþô§?õÞÿ×ýׇ~¸±±7oÞ̲ì½÷ÞûéO\o[&Ü Þÿý@ J‚ˆ ÑÖàÕEC 4hÐà™èÏ<šû«{µó¼Þ•½T$Šä戟™­gçÙ#B$+ÃEí]£@y5P9Þ›»ÃÂ5mÞìë—E x†0*5*˜‡Â3¶·· ®ëõõõðGø¥ÓécƒÁo¼QÅ­[·nݺ5ŸÏ@k=/]ºtáÂ…<Ïà±e&“Éh4 7 wÏóüIjnРAƒï P ’Àà¼óü ”$[*íEíŽLÑ#óé4ÔIƒW Ò Aƒg3¹v|ã þÿ?ÎŒû_çÓ·V£µ¶lE?”Ðå à<[Ì "¡²\nø“W¥˜­çÝ™»q`v¦º—ˆnB/åIœçiÅG@¢Ù>išž={6„©ëúG?úQø1ü²¾¾ž¦iÇkkkJ©¥¥¥cŸàݳ¹¹9 â8€Ç– ÷ õ‡»?aÍ 4hð=åz®)É®Î+g3•$B?Â…§AƒW Ò AƒgGiüÖ¸¾3q©FˆÆ’~(gì žÑ{F‰ Ai|e¸Q ¼*]Ä`Œ ÷õ¾™TüÖŠ´D$P¼ð:)ý;uix)Ý”:1I`h¨”“QHæ)Óív³,“RæyEQ¯×›L&ÐëõZ­Vš¦ÇÙ:[&Ü+ü±Ø=YÍ 4hðýà Ȧ,I¶uf¼‹„ŠE²˜5hð:¢!P4hð, D- ‹ÕŽÜ›ûßoUe ýT¶cù9c ÇàQ ’ˆÆùÊ61d_­>šU¼52Æø­Ãxµ-û™H_8²3u¿¾2Û›S]õƲ¾¼ öžEãÏsÔ8ö©¹J©c²C”)­V ´ÖRJ!¾%{t™û ”'¯¹Aƒ <-4ÊŽÊ<°DJ¤Ð( ^W4Jƒ žˆ 3M«mukd¿Ú«¯ìÖ·JBØì«~&ôË8ç¡Æ9ƒepž™™´DAh—Æ×Ö[Ï?ÀÌD¯f•Æ–Î9¾²]õSË8}áb‚yí¯îÕŸlW·'æ`îÊÚ¯æ(Á¶cZEßμH?øá¢”zl ÖÑhtíÚµ¾äÛ+ !ºÝîéÓ§™ùeºÝî±Âåþ{yïs³Ùlwww<WUQµÛíÁ`ç¹¢™Ò 4hðŒ+<‰®Î‰™ž¯5¥AƒÏŽHáJKžêÊý ÷«+³;cûÿ¾™½µ¢{©H¾×ŠvžgˆJ‚@pŽ ãçÆ—–c ²1·^**!Ḭ̈[Øßß*Ekm9È_´ €™çqéjëw§î³;e7Æ^ çú°9G¢“PÜdz\»ví—¿üåG}tÏïBˆ8Žß}÷Ý¿û»¿³Ö>°Ì»ï¾ûÁ¼ûÙ9Wŵk×~ó›ß|öÙg!ríp8|ûí·þóŸ_¸p!I)›]Sƒ < É®ÎÉÚÙX(j”¯-š­@ƒ ž‚0D?•+¹«¹35¸“¼µ¢UŽ‚¾·G¶Ìà<[†D6•DB`i`ëÐnšTHÝWµØzð’`\óÕ³”Õ?9e¹J5ªèhÆ ÞsíY1ÆÏ*·;ƒ\ãÔŠrRÁf_/ç"H5!fŸÖÚªª¬µÞû•••²,§ÓéG}ôÑG="¢Êý(ŠâÆúÓŸ®\¹róæÍàItóæM¥ÔÊÊŠRêôéÓív»ið 4x›“D*Á¢†J€” Oƒ×w07MРAƒï„DÑzW$˜ÿïWçãÂgóH¤ ä÷Ô dçÁyö’0Ó$æŽ?¹]E’RE òÒû(¤I4EÆOK¿uh¯ì˜V"Îöt'yq#ÓX‰ÀÓÕŽjë'•»1²w'Ó?Þ©ÿb3}g=º°¤{i3f…³gÏ~ðÁ¿øÅ/Ž™ÏçÛÛÛwïÞÝÚÚ:uêT«ÕšN§Ç%OêM‚ ÏÃj>88øðÃ?ÿüsøÉO~òÖ[oÀÿøÇÉdòñÇWU•çyC 4hРÁ³#Uì™EE½Ák‹†@yù¸ß£û¤ŸöÃÊ<¬ä·¶ìGwƒ³ŽÈcZrÂx¾3±w§VnW›}I:ÝSÝ„èû ä¤{(©¦~*¦_Ý«…]ÙŠÄ V:4¸¯"I‰¢Úò´òº[¥ [šR­^LÆ(T3´cæ’KãòþÜíÍlíXJð̉$) Q$›à²A·Û½Çg{{û“O>‘RöûýápØjµnß¾ GQQ¤”ˆ(¥Œã8Ä…5Æ!îO1™L>ÿüó›7onnn¾óÎ;ï½÷(¥>ûì³k×®ÀÏ~ö³{{–™™sι¦kž+ŽÙ9‡ˆDÔì^~8=Þ¤kùž|‘Cc…1TB9ݾ"=žÁ{ß,/ åUÇýÝ÷ûi?Ìë»ñènðŠ"…«-)åQéþíÚlR»¿¹˜ÇJÇÄ÷îkÄÌÖ³÷L5Dˆ.·$‚½=¶Ê;N5éévÜ|‹_Võì=+­XHBüôNå<¯wd/}£ŽÙö€ ˆ & SE ‰NŒã ¦5üñnUTœG¤D²ÖF»ôä8<<üøãÇãñ»ï¾ûæ›o–®_¿þÿðÿôOÿ„ˆyž¯®®^ºté/ÿò/Ïž=›eÙýô¢(¶¶¶¦Óéùóç/_¾< àòåËeY~úé§[[[eY>=1Æ43üyÃZ[×uXlƒyÓ´ù÷ƘÐãRJ>´ ^÷bmp2òbgA+Cì¿ÙPÍq!ÄËêñð Þû&o}ƒ†@y”&pRŸ~ÿÁzt{çÙxv1VМ;šP„"ž‡i&öçþæÈ@7–óÚ/墉H(KÄp|øZw$3:–"*‰Ý„j#îŽíÞÜÿ÷íÒ{8˜ùõŽì¦"‹0d&bïÙx¶ÖÇÄLÄÇ¿g¾Ÿ@ú¾Û Ìà˜™Á€?Kôœ@rY H4ucª _Ù/wëßß,KÃí˜"I @R K‚ˆ@jI‘„ïªRað Þ30!HÁZŠ”Ä8’bæ wãÐ||«tžG…^mÉ<‘BAà*ÞA bM(é;kg˜¹³PQ½¦FuUUûûûwîÜa楥¥ÕÕÕ8ŽƒJE¡µÇd2±Ö"bš¦Î¹óçÏ÷z½û ¶ƒƒcÌ`0X__é××׃AQι°¹ ‡Ò(Pž7B#3sPÎ6ʤǡQ |Ÿ”ª¢ñg0Cû,a%O(a•~é ”°°7ýÕ !P^iœôèþè£~ùË_>ºäÍ£ÛyžÕ<­Ü´b-`ØR™†fãôj‚…ëI{ëo˜ÿï¿'ŸÞV—V£3=½”ŠNBYD©¢H‚¯3‡ÂžÙ3 €DLuXíÈQá?¾]^Ý­‡-ùÆPÿÓɹî§"&dæÊñ¸ôµqä½"&±X‹=síØ{¶âÂö&‚×KÅöOõ¼Ž¹0Þ:`Iøg‰žãœgÏLÀZb?ÆÁaé÷ ûOœþöê,üÝ(¾Ú«ÞXÖ–£7ÑJ[fÕ–ïNle9U”jjÇ”iŠàwà˜]e=xÏÎq ®^»uµªªíííÝÝ]fNÓ4Ïó4M…á[yxxHD骪îÞ½{åÊ•ýýýÿøÿØÛÛk·Û÷(¡¤sNk$‰’$ÑZc‚Kl³È7hРÁ3(ÆâdŠãHb"°°¨AC 4xVÜãÑýÿø]z^ˆG·u<.ÌÜ ÀE˜LËìyᣈ€„Àà¼gÏàŽŽ @”„’j»HòŠG>aƒ~’ØE硲lÝÂ…£òá ¾´<­| P…]ÛM…ìŒ`¡ˆÞCí¸¨Ùz„‚@ „DÀ µcÏHÈ’P 6xXHëA $DÏÌ Ì`™‡ÚraØ1‚ ÔB€ ºZd´ë¸r\`UA$QŠðâ(`¡¦ç´DIˆµ1“™e†Ä¥ø¤éR½Ç.XžÌÌì@¢` dÞ™º»•Û+í´vÞÃîÔ-ç"Qd=–'…«¬ì´€ôx3¿¾7 fš8™²VLjèz6ˆ>BT—Øãaib 4h”ï^€G·÷~Zºíª´àÑx(Œ/,/¨¨$ DÇl=W–kË•ƒÚríXä‘hGØŠÈ{Þ»y½8Ø„J,¼oÜ‘8.8&5ïÌì¤äÒ°uD -Ci¸4¾²l[æT‹S±”Q+&f8(3w"ÑŠ©“$,-ïÏýÍ;­}¬0°P¦)–`ìÞ8Ð2Mݘb…`JËÈ dõÒkÇÆ³[Ð7¼7÷·íÜ@$!UÔŽ)0ÕKRÙy( OJ·?ów&Þ8nÇØOÅ0§<&I F™yVìöÓÚ+ÂAN©"D¨k{8+­±ßÌJÇì<Ìj?šûʱ)ÌJñÀuJËã’Cª°›ÐrF‰&p ÖqíÙ:fFB&BñmŽàËÖx® Ìj_;à#Å{0ž!‘¸Ú—† <[k³H9æ}ÉÑŽpoæ Ë×öêë{50".x  ”ÄDS'„º)¥$X†H`;ÆH g0­cÏŒˆÞsíØ1€@ "ë8xa¢¤…ѨgŠ¡g.-l‚@Dà¬IiZÎè\_ub€ªöeekc˜™€½÷á|Z t"ˆ„è%4®ÜAÉw'æî~«¨‘"°*Ç¥aë=1+±ÂXQ¤È1LJ_YÆO²üÄ bIQ Å”ÀLA¬)YÒè<×–™90†@¸`=ăc¨[ÇÆ3± ”‘ÀTS¦±Q¢@V¶§ö둽²m§µï&b)£aNyD8©ý‰›Õ^ $Šz Æ`RòÖØŽ ®wqa ¹”„‚C ”ˆ `Œõµcë1¤ÛwuÏÌ=3wÚ\’õ4E!r "(Á™¦nBÃŒ2ýx‰o]ÛºvÆzöŒÌÞÛTÒZ[tbœ×TZ6žiU 7.ý‚äe@„ˆ0ÑKTrAX(©†<¢v$¤`ëÐzö Ë9ýdU¯¶Ä=§õ<7PÔµõþx™už‘Š"HˆR*å´ösËŸoW_nׄ(BsqÐ:!H„£ù‹Gf<#./3Ö/A¨%j‰±BD0–+Ë…aãB“03lvñç›xqYuR½VßÄÑhô»ßýnooïÒ¥Ko¾ùæ•Bˆ8ŽWVVÞ{コ®?üðÃÝÝÝûqBÉ(ŠBä…¢(Â'µ(Šº®•RZë{öôÇì‰R*Š¢f‹ò|M/¢0_´ÖRÊ&ˆì¡Ç­µEQâûD¢„ɌӜc!!Šà˜ñ?šã/±Ç…Á+³Y^4Ê÷/Ò£{RÚ/'ÕAe™Ñz.-WÖÇ–²ˆˆá踲P;®C hÊ4e½çQÁsëáèô^*FJ¡¡¤ IDATp~a¬"€@( ïÎí¤âÚ.}DŽ…kõgäŹºvTPa;&—žZ¶"jGDˆ•…ƒÂoÝÜøDb¦¡S¬)hJoI4œ P±ù7”A0´ÀúEXŠð<Ƴ hi¬Œ:Õ‚DbˆXîý7q@ P„š&¥ŸÖ\Ô¾´l{žÁ#Måµcì&"SxLâ(ÂVZ` 8ŒgJprá@€"ãŽôAâH‚¢¦3T–Ç•·Ì‘@ ,^ b<ž”P PP df ­§$tc*{j@®XëuÆùÀ/;Í@,fv¬¤@»7çƒÂîÌ@ @»h*“ˆˆP ” 2ì1Qߘjt¤¼ϯR…±ÄXaÚxµõÌ ÄB˜CˆZ IZ$ïÁx0ŽÍ‚rBI µ€DRª1°’ ´¼3u[‡î‹};3Üi)¥A&R 8¯ùîì˜@Á^,´D˜UþîÄŽJ6:–²Ÿ’A«A f¿g0Î5ViyVóÞÜݹIé=@+¦Imú‡"×Da¡O…½„NuD&t,ï¢l«wŽ™14¸ niHæÕJË–¼‡°ÖUÎα<·Þy„B€¨Q ˆdšZz±VxŽùl_nc/a-¾Ä:® ×ÖE· G€½¢-ï½KZP\áÁÜJ>¬\e98pE¢÷`B{øfÄÆðØ3ˆ™ÝB7…’@*‰±D0jË•eëj¢i%­#æ×æ˜7èJvwwoܸaŒ‡›››á÷ ]û"i e|x »Rª×ëÇãÝÝÝ­­­õõuØÚÚÚÝÝM’¤Ýnk­ï¯¹Q ¼œÔ#ncáüpz¼™_Ïá£Äè9:s2Ãl£qØßœP ¼ =(M” ò=Á‹ôè>,ù[õà:†…xþHž|"ºÁ±§@p@†ý™ã…>, ðGœc¢ ‹ð¸„_ر¤‚¥áýÂ~^³" B8,xT,nêP èIǰ_8ž{x|ûà p·ÇîÄ&xñ^|ˆBÌÎí?|Y¢…á¸o›·ÀÇ ˆZ¢è<ïÎÜÞÌŸX–aá…r¤ð÷~q/fïQCøt}c(œƒ·`ö¸Ðy| ûÃ#ÜïÂã¿y¥#ï‘o÷ò1´€BS?ñµãDâÃ@K¤Ô(™ÁÊ8v<³ñl=žyZì²áí—óQtöîß¾Á‰oÿƒ÷Àþ›áŠ´èèãËZï­âD3ø£a+8L(ST[>.å}ÐÅ„ ²÷¾¾Ì4+ÝDÌj_Z®8Ï &ÙXoWœHˆ‘DE N>‚õP;w>"_À8¨+þö¤ðZü Æ9vä¹'H /Æÿâÿ‚Áx»©V„Ž¿Ï àèÒÒð~Áǽæc…13|±k €¾7-O8…ñÌÀû© wŸÖ0.Ý=‘†3Ã\xÏgºr ¯@ pÖ/Ö0:º©D Z@¢ð„k;žÙ1ƒs\X6Žë}˜D ~އ…;,¾qoC„^ì+Ë~1Çðä3Xöh( €‡ùIDPÐ#Ì4­X®,׎­çà1' ƒLÆxpŽ?Zgʾ#½oÍ_K†P8S@H’B§,¼ Ï´±€¯S ”²,ïÞ½{ç΢(â8î÷ûKKK÷Á 3ÆìììüáøÓŸþ$¥\ZZz `$I’õõuïýW_}Çq¨í“O>¹zõj–eëëëq7»‘ |ÏØfFçÐàHãó#/¬…ñF‡ Ê\¥AC 4xžx‘Ý h–e¤¡¿€2‡—0$U@dfk1hR!–!Œˆ#ó˜ŽÐ›_"Ƶ$%¢90»TêÅÙ,2À¬f@;­”€ JâcÁ-ŒvjǨ½¶X{¶b$X ZÏÆ‡sã…1'Á3×JËÞ/<\-Îç1× EÖ68øü_öÞkIŽ+½Ú~öNŸ•Y¾ÚAp§øÏ¤"t C]‚®m.A …"t øæû¨áhÈ¡ißeº|¥ßû?ÈìF: @F­ Ý•Ùivšwíõ®Uˆ¢²2(…‰X†pLJQI)•OóR:Ò¢Õ›RXC ¥I”. }]ðC”LÍ­çZ9o/¥cPº-”rŒ—“ãCPÚsT;žë\éj%UÕ*¾¹ÚTT䑘R˜U3Hõ+I%Ç,ÓI Ë0 C†’RK‰øZìœeTÛóŒÔÓ”Òž\ë¼ -Êf•ä:ËE®´¾fˆrMÙ^QÒRP&Õh!n³…FS™kh]M˗ǧ4¯)95ÃÀ׎Z—n†¸¶ƒ©¸²îF*(ÐB—»ŒÚÒÒ0¤aVs#RŠ’²+å!òùÑ’1¥pL|MèÊäZï`€màÛB ³¼Hr’‚LQha·„m`Tæ-•ÕK¦(ù—kû]ªrrÅu„Š.£nSnׯ\JW¾´ChI¥VP ´(Û”*²@i­µ!°¤¨Ù¢éKËy¡ÓB'9Y¡K‘‹o•¶Õ–(%ÃÄ5…%«n‘Y¬ÓâYsT¡Kõ®Žjy•I !J—ܺkÞ\ÔÓXEJU´Q)C+4 0¤üV3TR*¥E™_cJq#ûù:ÿâVR”—|y±‹R»”º¼´…Æ5]hÒ,/Š[܎Щ²¼óI) YêÌžýs³U6Â6ð«–¢Š.1J¿$ñì ÊUušÊ`ŸòUJW|_Éèñ¬­*ZkCËÀ1*Õ’HA¯&W[¦”?e±X|ùå—ÇÇÇe{N³Ùô<ïæ·ežÝd2) ”¢(ƒA9å°¿¿ïÞ½0 o2ïn²íÂ0¼ÿ>0?ùä“2·î³Ï>›Íf{{{|ðÁM@òk¬ñ}Ëu­Õ›W:¬ñíOˆRd™N2Ç¥o‚@)›Ã“„ÅŠéÇ&ŽQ¯¶åVŠ,°,ÖLk¬ ”5~8ÞhG·”2t»¶ë—®¥Çä5ãÁµÆ­b ¸mš¨4Z£”F ŵã,Õ<í+ ¤ÔÆó_¾¶žEŠJ~X&®-‹âº’ZB¡ÅhYÖZRH¡«„Îò·å_•£ÜÈ›êô–«h©¯Êf*GR!%¥‰ÃMÁYÍØóœ:¤Ü_)‘• «¸1ßÕ·¦üKÏNMUújJåE.¡lí¾}hžùïòÌëôUêÂ|LÔõúåõq~ÍîÖ))ù¼¥üh›Ôlc·e…¾cÂ4µe`…¡_ÿ2d\Ó4ÜdÖjr­•ºuHÅ3EÀM2ˆ¸=L¿¶Ùâ¹§ôõ`Ó×'ºê©"n4×»ùê£qK¥áZ4þøãÓÓÓ¼à~òäÉ“ßÿþ÷üqÉO™¦YÚ”ìííýíßþí/~ñ‹n·[~¸É¶k6›¿ûÝïlÛþ¯ÿú¯?þñøÃ˲îܹóðáÇ–<Ëk¬ñËu@[–X7æ¼EÎrÅ2bãXx./“òýP(M–'¬"V+IòM ”,c:h„¬¦ÖX(kü8÷»7ÙÑm[²í…”ùµÓÄ»ËÀµ~†TtQY¦Ëú ôúZ†l#tMÛ2…@†”…”BÊïPš‹°ŠA¸nbú!pMÙðdÝ3ìës$ ­…ÔˆJ"å7—þB)%ôu–“”oݱ$¶J…‹¸•ÝóVðR7 ß–ÝšÑð ×2¿Ej„¦¹T‡ùÛoÃw3 ×p-i›†!Åm)‡,J>PhQi”‰>ú&¬úå׎|Ýô#^Ñf©Iù ½»˜fé¤þàÁƒ{÷îAð KÃ0‚ èõz|ðÁÇïÞ½ûÒïû¾ppeY¿ß/»~€^¯wïÞ½?üðààà¶Èe5Öø>¯¯y®g @4B~~ÊíÉ„ŸÊ 5/X,™Î‰"üí7CEE¤1IB%¨W(qÊåU€ )0͵e5²Æ+rÖÝk¬ñ-ßÕ^P¯üØoJEQõ-ý<ì %¨RépÝQò3x›-Ji-„|K/´Z—‘^è뎰ҥ¦X_Ÿ?[[[ÿüÏÿœeY½^‚À÷ýÛ¿-]Ãþå_þ…k~ªT „aØn·ƒ 0M³üNùår)Ã0<Ï{ï½÷‚ ø»¿û»$I€r©^¯wã#¶Æk|Ä©\8ÎÏPY 5Y`™?™'h–3[p5¡T²çoæÑ”çÌ̤9…"JHbŠWÿ­UÄÑ IŠ4‚zðFt1k¬±&P~º¸Ý­ýñÇß|(Ûl6Ë×»uG÷k¼{ŹΕ.ûœ~ÍÜ¥ƒÆÏçA®t®Ÿ5录m(TeT’8ëy´ô¶ŸeËå2˲F£Qþ$MÓ²/µV«•á—¥kXù¬Ìó¼lq-ãoo¦n;‹Uƒ_J)e½^¯Õj¯Zê›Êƒ8pÌõ›Õßec‹R 0ä³ùv¥) TA¡ËúÉ«6Ò”Á`£ó3{!ÐJ‰Å’Áˆ$Ãw©ù5íØBÊŠXISV1iJQ %Žƒë໘o•mÉræsÆSò Ó È¿íƒív_úëÏ{ÎtÁlAê¥Ä)¹z¡ûùqrÅt†c!4–õŒ@Ñ·ÚÍÅ÷9S?=•Ðke¯ãv·ö òûßÿþßþí߀ßüæ7å,Ùº£{5Þµâ¼ÐZ•–´ëÇð;úN‹RÜØE‹·³ ¢PºÐUäÍš=ùX.—7Ó ·QN6Ü~¨E±Z­æóùx<Z­V†¾ï3òý–"N¸èlm¬ß¬Öø®ElÆdFšVuõÍ|{ÙøÇÄ –I»ù“'P’”á¨úðszÖ(Ešr9àÿ|ÌpL«ÉÎ&¼G¯£m[äÓ9Ã+ÎÎMXE86]¶{ìlëzð6-uóœÙ‚ñ”¢Às¿IòÂõü¦ñíòÛòŒùŒù!0 ²Œ4¡(´Öâ¥þæËç½£„Ëã EíÐnÐjÒl ã1Wf ×ÅqÂÏ­IS®Æq‚Rïº à¶ZACQgÄ)JcH,Ç.)-Åô‡<9æè”Ñ„é‚8Fk1†d9ƒ!ýÃ1ó9i†a°XÇØ¶ßÃzKYÙ\3£5õà›ZxÊ£‘¤,–¬"¢Ç¢ÝÒÿz¨¤i¢Ï£0“åä©(r ƒfJv&йš°XáÚÜ= YÇq@‹("+´4DyüÍïølO3&SÒ ËÄq |l‹5ÖX(?9ÜîÖ~)¥R¶ð¬;º×XãÝz³‚B¡¾‹ˆu¿þ9*ÿKõÇÛñ@A—¹ÝB!ÖZ¥ŠÁ`ðÿñŸþù z“4MùË_–Ÿã8¾¸¸øä“Oþýßÿýôô´œ`X,»»»ÿôOÿô«_ýjssóë³ßo©*–u¾à«'¨‚ç]jäY¬xrD^°³I³ã|ç’ã-nËw™ÒšeÄñª`g‹Føò~UÄÓ=e:A»Á{üæo°LŽÏ99ãjL§ÍFO7‚Ÿæó¦ÌwKSfs”fµ"˰¬w@¹ÑYŠUÌlÆpDšázÔzmí{h-&3þ÷3“xZs9¢?¢æ³Ñ¥Pœ'5<ŸzHšp1`±Âu1LLãm(³WS¤ ½ú&ŠÖdWc¾|ÂÙ%ã1­&û+amkÇyM¦Ré´’¤4˜&qB‘“¤$)®óœAl©1É2’„ù¹¢rÞ§^g£ƒVôG¬baY>Öw¾›-W<>b<Á0é´¸{‡vcý`]cM üôðmT'Àk¿óªŽîf³¹nÕYc7òf¥É•oOݰÆkO’Re*³â­“\Uië޲…çèèh{{Û4ÍR’iÛv†7òÅbñå—_~öÙg———iš–³WWWý~ÿ/ù‹ïûµZíëTÈ÷[м‹Wc.ÃÝ-ã PJ_†ù‚'',–,–lo°¹ñWmxsŽIÂÕ ÕÀuÞøîhMž“¤Õ}éTb•Úè: QÜÞÓ²‡pqvÁ*"ŠØèÑnøÏ4Jåñ‰".úœ÷Q ­™/P°µíptÊ“c=™Š$e0ú3µÂOËÍAk‘åÄ «¸jMФ|Go‹%u²X1¼"Ë |Š‚ñ„ñ”Ñ„4Ųè´ÐZÔC”¢?àè”ÉŒ^ ÏGâˆÁW“Êiá:ô:´›øÓ“Ë—CÂ:µ[NØ¥÷.=ê%†Á›x€UŠ’ŒÅ‚Ù !X®È‹Ê—¤ümž“f㦠¯89ãñ1çLfÌ´äJ4B<ÛÄ2±¬—œÓ¢`±$Ëé¶ñC$ qò¢Dk‘e¤)I†VØJqÞ'¨øh8»d:Ãqèv¨Õð^‘†‘f,V–‰m=3£Y®8>çô)ØÜÀuøXkÊke5ÖXãM¿_A®´ª:xõZXðnž#¥´R•‰ì[ò@!WºPº¬qÖ ”AÜ¿ÿÁƒBÏó:Îææf§SÙRN&“ÿùŸÿ9>>þè£JÇtà‹/¾8999>>Bnmm½°Îï·i"f úC–K Å`D·ƒïsr÷öÚL´R"I˜LxzÌÙ%G§Ü=ào%ëõ3Æ?n! ?~[ÓtÁŸ?ÍÃÚé¾Ùä°r/–Ã+Vl‹z@ͧæaE%G”â9r$/X®Œ8»àñSv¶øõCö·+³á’aÉ Vã)Zóá=„à«§Œ§<=Á£#.ú¤)®Ëñ¾ÏÞVðfí›@EšDä9yÎrEáÚïháZÄ §üácfs¶6Î.˜/+éSšÑm‘çtZäçÆ3<›°»ƒe°XrzÎYŸþCòÑìl²½A` †Ä ýÓ)ý!û»_;V1y`šøÒ|#£:/Hc–³9RGdyåKRß.–\M’­‹%Ÿ}ÁãÆâ×!ÍùßÏ9°½A·M#¤^÷Ú||\­ÈsšuòkÖ#NuSóÄóû.rE”Pxû;Ô|.ûX{ÛÁé9ç}j5Š‚íWîÝbÅ£',#š Z Ñmá:ÕU|ÑçÉ1Z3#iÆ{û´Ö:”5ÖÊk¬±Æ_¡.Ðäšò]cÝÃóΞ£Ò§ÎxK>5e«WÕj°6ËùÁ°m»ÙlÆqlY–Öº(Š8Žg³™mÛ¥fÄó¼årùøñãÉdò»ßýîw¿ûÝ{ï½4 )å矮”Z­V__ów]Jk­”b©þHŸÄ*A+#Õ¨vSy ²L.#4Êw0-]æ0ýÕ(•8–ã™q9“™O‰a¢§ÔƒÂu‘B†¶M SJúµ¡ßÏ‚0žß¥DžÚ4B(%V±1(Zu幯'µ.Ãáõó™,˲,ÓZ !Tž…2ãÑ­µî´ ÛÂuôPýˆ¢I*W±\,˜LŽYÅŽ…ïÑu·£MS¬"²!”ïªf]¹.­´Ès¡®-¤”WS‘ç"¬G–Y\kÃW±Š´eÛ=mÙr<‘³…8>#Ï]©4Ãu´@ž_j×Vž­•i&’TD‘6Í¢ÝЮû VŠ<y&Òж©MÃÐ¥RàzAQê_!ô®QŠc1››³…ÈR ¥ 5iÇBk”F ŸW£dYV&a•Wú­1¦…*-ߌ.ãöµsvÎãc®&,"mŒ'Zkue!“˜ÉL2‹Î77‹f¨lKù¾ª*ðµck!D–Õv~wšC¤©1_EXÃ0DšYý¡ûÙ#„ˆ~ùA¶ÑÕ¯K¾E!Òж­oÕ0¥Å¯Ö:Ë2«Pæ|i:g—¢(Òn+Ó:ﵕÿãûâË(6†WÖÙ¥ýôÄMÈs­u¹aR)UòÃ]e˜æåHÆ‘²LµÙM>¼—õ:Ú ÐJ¸¶øà®øÖÉÌøã§|þH¶L‘fʵ‹N‹åÒÊså:IÍ+‚ÀÜÝ2Õ™uÞ—Ë¥RJ5ëùVW›†}9 KßÍgss2•WSs4VA-~øa¶Ùý&%IÙBÎfætäP…ªùÚ²×\‰Ö"ËDQ 5Òж¥ÔR®"c8²ÇS;Í´RÙxš †…ah?i¦…ÐÞsX–eQJ)ë–JEä…H@;Ž~cn>Ælažž[}3ËD¡ôxª†a&Ο?·NÎÅ|I–aHÕë¤ÞMw¶‹F¨»zùÐ?‚ûšHc2·‡WvšJ!„Ö*‰“ñ8 µm™WçÏ_ç}‘¤ùf7n7D’zWc‘eÉÁN¾ÕSa(WKKW9‰ÁHÔîfl™©Ð/ÞSüòCŠB‡Õ8®#VQ>_æW“Üu”RZë<Ï£(’Q,W±žÏ­U­ovA¸ŽŒáUñçÏ…Â8¿£‰ž-TÍ‹‡Ã4ôµa>G¥iÐÚ¹ºrONͧg˜†Ãb«W´Êuådf&©n7Ò»Há<=_>J›AªuÖrCÆq\ ­uSÏke5ÖXãG¯Œo"råº4~GO…Fù–Ô…Öy©@ë´¦Ífó׿þõí´`2™\^^~òÉ'¦i6<ÏW«Užç¾ï×ëõò=¸^¯û¾Ÿ¦iQyž}Íßy)­Ež³\Šáˆù‚FˆÐ,—újL’ˆ¼ÐJ1‰ÇÇ:Í(”P:ÀtŽ@7ê¸Î닜¢ N4`[¼P'¼nô‹(§— ¯¨ù¢Y' ( FWz<Ó…âjŒe ×¥^ÍÍ:BÈÉ !T³®Ãš¸Ötˆ<×qB”È$ÑY&ŠBdE®]G4:ð±--¥PJÎâøD+-··”ã°Zqz¡¿zŒÒ³…RtZÚ{µVBk¢Hœ] ¥T§£ÃöKüDœÐpÑg6#Íõñ¶-|ËYŽ|½ø/û¢X(…ciÓÂ4^Ce™˜/Åp,Nϸ2“Ô\aÛX¦HR¦sÆ]ôt©“ÐË•0M±\ ÏÕ¾§_û¾ö<í:B!ŽÏôù%Ó…^®´†E¤mCÇ ”aЬ«F]7ú #˸ìë(¡ÓbwƒÃ}™ç,VújÆã#éºz:g<Õ£‰n7éµ…ëèš_y£(E–‹"×E!ãŒ(ó%㉘-XE€ð=QódÍò´”˜†¶, -㈢@J†z³KÍñL• G€i­I½ŠÅ*B)l ×ÕaíU-9:/XFz‘¢P,#f Â@ıO„aªí ]FÕÞ>k_!«Hœ_-ÔV°¦… P”äf™‰ó£P“I*#±ûG IDAT=ži×¶j²êfH¯£÷w´”f-Ðøóçzp…ÖbË[=±¿£¿WÚ41Mj5}-y–E§Éd*¤ÐËH_MDɰ\xt¤úCõЂ8QúJ›¦œ-t»©=·|ª •kijסä:[w‘çÌzµÂ4ñ²\kÁ*ã YAÈ“}Ù'ËA1ž¡r–+@ô:îë°Æ*B!ꈦ3.ZÀÞ¾GÜ67Ñž§÷®»—+jžÈs‘å"ID©Ï|v#.Ä*&Nµaø¢ÓÑRŠvÓHŸk¥Œ4Ç´D–éÅ’áX8J#–…c뚇”"É™-˜Ìõ2@ä¹>¿Ôî­•Ö¦ÉFGß»#ó\\YFœ^bÛÂÜ¡¶']cM ¬±Æk¼Ñâ\é\ƒbmúNž EéÉø6ýG4å8)(kú䇢×ëýã?þãr¹äº‰f<?}úôÑ£G_|ñE–e÷ïß/µ!J))¥aåa7 CJYE¹àËÌw[ÊPÚNsâĘ. w÷AŠ/«ÈD*Ë"IeËËó¥rlí84:+Ä“„àa¨KKÚoËW3”¢íâyÚ4„úf8½jY¥Q…BŽ'¬"qç@ìn±µÖœžÓŠÑXǺtÐ0¥nÖõÁžPZ‹•œ.Œ?áœõÙè°»¥Ã0-\×CÑëˆ?; ÇÚ±tœŠUlÌ–Ær‰ëÊfComÖšMÕm ß3t!žœ€wvÅÝCùÞˆSÅúøÌýâ‰J2T!óB¤9®#cÝlR¯†eЬNæb•ˆÕŠÑ„“s#f ©ŠÊœ"Itžc„¡¥–­k±X¢µö=y¸§Ú-UûÚ™JSæKÏ#ËÏ8½IÝi³·Eµ¿/CšK´Èr©µÖÊÊ33Ëtœeâ‹'¸Žê¶ñÜ3î8Žý­ZÉ”a`,cÙõtîNÎù@Ò¸šˆ(–Í:¿þµý‘1ºÇçêɱn„ØY!Š\玣»Ú±D¯­ƒ€ øN;.²B¹(´¬ù¢Õd–å ¬ÙBœ÷Å`$W…&Šäb%KÐFš Çqºs{Ǧ¥d³)ãDäG§ü÷ÿQ"†»Ñ¢Ñxq$\ß?ea¨“ÌÂB{ž ‚ò7 Cd…ÇÜFHÏõ@6¸Ž<Üin^\Ь­&mÁdfháŽ&ö*Ó9ÝÙìr°‡k‘EF’J¥E§Åo‰e™_>–ýHR|OìnóÞ{°/ò\Æœ]ÚÃ+ËuØßMƒÀ´¬u Ïke5ÖXãÍÆ•ew=Ñš2‚Gk¡ß֖䥴ȵNé£V«ÕjµÛ?™Íf½^/Ïóÿþïÿ.ŠbµZI)Ëb;˲$I¤”@’$å ºišòe҃4@ !lÛh5D§Åûâè”$3£Ó9ó%Ã+¦Kf3yv‰íà{¤OO0-öè´¾)TX)²œÅŠÓs’”UD«ïƒf¹B)lÛ®b/,Óä¦õ&ˈ–+æ+€Í.wÙì ¡æQ¤ï1™’å,WŒgdW”¶‘Ã1B`Û5ËFJ+N.8½`±$ŠIR’Œ8FJŽÏ‘&–…ë2›q1à|@ÓhΙÎO±,”6®&œ÷9˜Ð¬Ô^ŒÞ(·9N˜Î8»d¶Ä÷°mj5!¤R:ÏI2;+¬ÉT\X¬h·DQÈÕJ\ Œ£Sf ¦3 ƒå’z½R¯”‘¨QÄdÊé%YÆdN·Íö&Í:¶Uå W™#Eÿ‘e\8:§?DC»É}Þ;`kƒ †,–„¡p‘gÄ);[XÓ…˜/ärÅrEeÛ…íèZM˜&iJ»)¤«Ï¡?4.h8Ü›j¾QóqæloÖ¸s öÅæiÆb!âÉ±Ì |)Q ǶFW>í&®Mœ2›Ó0%Ì ÇD ¶…Ðfó* §¤–ò‚’€(YÆ*ÆqŒáˆ0 Ê„#­i&fKNÏÉ3ZMrU™¤¯‚0DirMv 5iÊâz¬¦QBœ ´(´',VÌ—¬"N/p,v· ÚM,‹¢YÆh‚RŽ0LÃĶPš8c:ç¼Ožs¸ï#%³§çó9v•hcYßzf£L½‰cæ òÛb2åjB’rgŸ;{¼wH«Q®Î(©×‹%]§X&ÛltÍfã»q7í&[¢PædÊr‰d®ÃF‡{ïÑlÒˆÀy.'3Òœ¬(_;È Œ§$ –m¡Á¶¿é¯YF’‘¤’°†D I†ïS( Ó2¢ÄHRŽÏYEÔC‡³œ81û#„@)|WÖ†U6P¢µVZ§âìÂ1 L‰ÒUBÖ p]|_8 rÅ2b2+7[j¥ŠBd¹™¤R)‡ZÍð\½æKy~ šÍ.ž‡?If¯Ð°Œ‚ÅŠ,GJ|(a±Â4i„Ü=ÀsE–EÁyÃ`sƒý=£Ó&Ϲ³GQON89§×‘…Ò—}3µºÆke5ÖXã{Æ…Ò…ÒšukÆ;Ioi]T)Ÿú-Æß” ”âÆõb=N~lX–Õl6ëõºR*I’rò°V«EQ´\.§Óio¨H"çÉ1Ïùa@¯ù Ñx–3szΟ>ãjB»I¯C·Cžóô˜8¥Õ¢]§Q¯Â/€zX•ëIÊ`HD–á¹ltØhWêƒÍõ:{dY¿úç/9½àäiP¯Uùd[$–ÉÅ%Ÿ~ÎdÆf—Þ._XL¦<9a<¥(ð]N/9>e6'ËxüËba›ìm£5—#Æ3žœ`î¿„@I.UFépŸ ²œFƒ°†e‰4•ƒ+=™ ­ÄÅ“ TÁGñÉ_8¿$Ž1MâË Q§Ù ÙÀ±ª0ÚÑóQB¡° 6»|tŸÃ½g¡Â%{R&R&ŒÇ\ 8:Á0xpÃ=¶7ŸËKv¶zø]”¢QÇ0XÅL&MÓ¨æ Ý&4B>¼WåÂF£+¾zÊ*B º:m\!0 €»‡d9wØè๸÷ïÑj±Ñ!J|„`1srJšÒnE Fœ÷9:e¾À0p‚{ÛloÐjỈc’”,#ËH3â”UŒÖø.ó_û{4ë罉” Aç}>û‚ÕŠv“éœË>ŽC«ÁÆ­ýªÎ¦RÔ¸³Ob™ô:øµïü˜ñ=öÉ žž0ž 5­wyÿv›FˆçÒn²³ÉdÊbIš#$RbJ’Œéœ$&‰‰Tñš¿•eUsˆçpÿ}òœÙ’8Æó° Jמñ„$år@PãÁ]„D\M8:¥”ö”nJ·[¥„‚ï¢_=áì‚óKîßå·¿zIPŽ!ñlm™d‰èHR\°,#ðt–‹ùB$Žçaø.»ÛÌ|ñˆ,ç`‡fƒÀçì’ó ’Œ0À´™/‰b.xŽK‘SóØèÒjÒnáytÛ|ò)¦Áá.[x.Jqx@’qtÆÓS&q¸/~û½íuªñke5ÖXãM(:W:WUa¼®‹ß5¥œ[ÕTî­R¼­u¡´RZm¬ÇÉF–eËå2Ë2®[x‹E¿ß –e…ahš¦mÛ[[[ý~ÿää$ ÃÃÃCàéÓ§'''Aôz=×uËõµZ­´;q]÷µK½PDiÓ ªFÏ¥Ù Ïi5I2.ú\öMª”Ó0d0d8®BgW†äb@£NXÃ÷К8f2'Ë0 C²Š¸ptÊxÊdJ3[Ta·ƒ1yA–±Z2ã{øíÛ[´x.QÂEŸÑÛ¢Õ Y×¾_µü˜&5ÿY•¤9–Y…­înS<:bñô”ÙÛb2c¶À4Ùè±·M#ÉbÎÉ«/™”´ˆä¼ÏrE³A‘³\§d›=v¶ql,W\^âX´›’ù¥ñ=\ËbqrÎÅÓÂsX¬¸ìsrŠcQå|aêÁH ôl.’„fƒƒ]¤äb@šÅv)™Y’eĦM‘§,–¨ßG++FŸÅtš5\ IÊbÎhÂdÆtÁr‰a°Ñáî!‡ûÔkϵü˜&‰ëVšÇA ²œIÏ'Žp=!έ2L€cã´¯ £”0Di.hÅVv Ë®ž(5Ÿƒ]´¦Û%¬aH„À±ñ\‡,Ó5Ëî)ƒó%ONp GLD1¦EÍ£Ùd£Íö{»´•IJQè¼ ËDš‘eD1³%ZÖ˜NI3úCúCÒœ,¥×!¨‰$ábÀñƒóåuhËŠFMöwhµh„Õö—tØpÌñ)yD–’Ähψ“JÇŒg È2¤Dçœ^âzlmbD‘¸Gg,VB¤û;h8>åb@–§œž3›ƒ&NH"òœ« pmc±KÍc#%õÛyùÍ·ÔyMç\\rtÊã#–+W¤ ˈZFH£þ’rZ|½ZM ‹°†ï~çۙ粷Mž­È3–žËî6{»„5\סæS¯³X2™‘f¦i% †,—äíæ³#ÿ*(M–3›ñäË æShF#V[!F­ºBÇS+¢¤RiÙ'gU˜q©[ ëØö‹fLBPóØÝ&M™LOQš4G«—l‰”¸Ž0L&Sò)WW˜–!רyh-+òËÁw1 ,‹VƒÍ v·( v¶h5±,´fyòd2™EQdYvqqñé§Ÿ^\\Ap÷îÝZ­æ8ν{÷ò<ÿãÿx||üðáCàOúÓd2iµZ÷îÝ ‚ \pçÎÒ’6‚×.õbÍPÖ´µ®[µ±lmTM7‹iÆV_ÜGJþø)g—\MªÖ×ãrHÍgw»"ŒÆüñÏ\M+6ÄuY­xzÂlNÙÓŬV,–ø>Û=\—,%ÍŒHR’„f÷¸sÈî&qÌù%Wšu¶7q½—¦A=äÁìn1!­QD=ääŒãS>ÿÓÂq¨‡ìnñÑ}¶z•x$ë§çœž³XÅ´[<ü­ùäSf ´ÆwØÝ¤Õ¶9>ãìNØÛfóÙä»lnÐl°Xòô”Ñ›]zíªâó¯X®¸³/–+ë/_é‹>¾e†ìlÑíb›Ü= æaZ„›] ´ü KQ9RTE~³N·M‘s|ÎeŸÓ3¾z‚mâ¹U;ÃrE’V$—iÒ¬sÿ=v·ÙÛ¡^ã¥Æ†¬t=e·ˆeÒ q, …!±-íØ¯¼è-“zÀοø­ÙݦQ¯J…Ë”ƨ·L=‡ZSz44BŒ'ðùWD1EA³É/î³³I½NàcÛ¸¾‡eVë1 ¤¦‰ë õv –A %ùì+>ÿ’§G„ÝÀpD’RhÖ+Ö£×b{‹>`sÛªZÉJÌ–üå+¾xÄÑYu¥&WcÒœ0 ÈIR¦3 …kÓë§z:—Î/)qÄðJD±¾šð§O¹š`[œõ0LŒ‚Ë!Cдê¼ÿŽËdÊ*âÉ1Ë)ñ\N/°m| {¶xièo–3[p|Âÿý„óAÉ.qvAš!$õ Äsy©#†ë°Ù#/Ëä{ô}”gÓuè4é)‡÷á½ö³‘cø¶EPCi„ÀA^°Õ£ÈÑÛ¦¾FÿbHí:*Ò¤¤„N/‘¢’))Eœp9`ãÚ´!®M·ÃÕ„Ó ” ¨Ñ¨¿ôZÐŽ-zmLƒšÇ*±i6ª[Ä‹[bP¦n&Ìf86¾‡ç sižç …aây4ýêÈ—±ÝGk¶6«-)ª¤ç> Ý"/89ãÿ#ŽÎ˜/i7ØÙ¢Ó®:›L“N‹_ÿ Vׂˢ×åÿû÷ïfÚsŠnÓÔríl·Æš@Yc5Öøñ cQ(Šk7Ç·e±±Æ+i E¡ªù¯’C‘osKÖod?rvv(¥ò<ÇBˆ?üðáÇFöíäyþ§?ýi8>~ü‡%±òàÁƒ0 o”^¯W(õzýµK}€Ðe1PŠS<—½] …iàÌЊÝ-î`Œ§ŠÅÛf³ ‚þˆË>Ó9õ€(æü’ÇGz8:µŽMÓa¼·ë2[°\²ŠªæŽÀg¹b±b¹d:c˜U„¼ ÏY.8»`±³ÉÖFU®¼¢„Ó=[´D1Rà¹Ä †Y5¤,—Ìæ´$Ûwxÿ;›´ÏÑY†cqtŠel÷xÿ¥¸ì“$hh5h·èu+‡ãS.‡Ëzöwé´¸špvÉ—O8>Ås°LNÎ C:máyø†Ò9iŠÛb±âôŒ'§\É2v71MÆS’Ëd£Kàó*SXÓ$¨=wö¿sf`ú86aM·[¢ÕÀ4é¶ñ½gë’ib™xîºu†ð\|Ïa2çä¬âZuZMêEÁtV^k4{t:Ô<›N›æ€³ €0 ¾´½E”Dià:•‰m½SÕš÷ˆSòB¡µ)µ”ëÉŽ5ÖÊk¬±Æ*ŒµR0ÖÛwíìTú ´.3ŒBè·¡BÑk­´.l×Z¥ˆÕjõäÉ“/¾ø‚kÛWÛ¶ïÞ½»½½ýÑG¶Ûm)åǃ p]÷øøxµZ !ööö~ûÛßÖëõããã’@ùå/Y®¹^¯¿v©×l\àóÞ>>ºÇ*"Ið<¶6( îàû¬V86;›Lç\N]aŒÆŸ1ž‰$£(Hb–KŠÏ¡×åÁ=ºâ”4%M°-Úm‡"'/(r¦ .œ]ptÊ`ÄàŠ<ãì’ F¯Ãö&Þ«Í ÊyyÓÀ÷T®;›¸“3žžøÜ»Ãáþ‹Ÿ¾ÇÁ÷ßg¹"Šñ\v¶ˆbÞ;Äõ(r¶7ñ<|—Í.³¾Ëñ9ø#¦E–£ ¦3>“XiÎ|Åî&»›ìlíqtÊÇÿËÙ%ƒ¶]86wöÄ/î³¹!L×¥"w(Ó‹-³*Øl‹í ò‚ÒAºì°-G³¿C§Åý»ÌÌ,–Ì—¦I=`³K=Ä0pœªÚ4ß䫲밽Y}ø~w‡Àçî:-vXE•nbo›°öJâo* Lê5îÐn1•QÍ\ ™L6:|x—í-ŠkÙ…ã¼<ù5¬qÿ.­:—CÎúœž3Å´êtZè‚‹>«IB= ÛªÙK¦sf òLåyÑÙÚ‘¤|ù„þ8e{ƒïV¶5ƒ–Íf—­Û[löð\.úô\ü¿OЊ(e³ÇÉžËV©ÛÊX,¹£ Õ`:åÓ/8»Äs9ÜãP¯3›±X²ŠiÔñ¾1×öG¹¡—]§UåF¿¡$]ÃÀsé¶yÿ.äŠN“Ã}v6ð<²ŒÁ†k³Ùe³[ÑííŽÒ4ë4ÏtF/?áµRFŠ—+w¤ãâ:˜͇8Ü%¹ìËáXõ‡DŽ‹iÞÖþT —òƒ”ÚqD§U…m•¾Î†A³Á/>ÀD ¾K·E«ùûùÒóU’à¶]†—‘eB)Öê5ÖÊ;ŽÉdr#H.Ñl6oDÅ%”REQ,—Ëáp8›Í’$Ç©×ëÝn7‚›ÌÅÛø~K­±Æß®0ÖyO+¤`düÎÑ[¹¦(SxDer÷ö(âÆ+gˆÒ2vcc£$PlÛ®×ë{{{ï¿ÿ~»ÝB!Ç1 £(ŠF£1^¯·¿¿÷îÝN§#„(×S®°ªd]÷µK½vãJÊBg™ˆ„ ðÉò*a$I°-ºú}êµ*=d2e–m²Ñ¥×ŵ1MZŠ†ÐšfføMC«?¯óÏ¡°ÑÁ²¸{Àáö]!õÓIBžbÛ¸Þ X)\®µWÂ0ðŒ˜ï±³M–3žbZtÚÔ<^H\™y.”bm€²Æš@y÷ñäÉ“ßÿþ÷üñÍO~ó›ßüë¿þëo~󛛟EEÑ“'Oþó?ÿóÓO?í÷ûÀÆÆÆG}ô÷ÿ÷ï¿ÿþKc¾ßRk¬±Æ·.Œµ^Æï$ú&#©¤NÞ^ Ε.”¦ÜŒõ¹ùaèõzÿøÿXú¿ !¤”–e9Žãû~­V×uµ" Ã?üpÿfòÀ÷ý Ê/”ë)?Üz‘~ÍRß¶P)› ³”?h)E·E=D)¤ÄµISv·ÉOøüIFšT9{Ûìlâû(UU#ŽM=(M+´im/”Ú±E·…!qmóù#Kj>a€ã|‡<×çÈ‘Ç®Š«F(ä+²¬ÊD˪¶ªJÍØ¢Ó$ûÿÛ;³Þ8²ëŽŸ{kïªê…½lî)JšžGžIìxF yÈ|ÃÖ—ÈK>A^ò äAp€<ÛHbÀ†myfì±å¡DI\$Q\›[“½±»º«êÞ›‡ÛjsH‰Ú¸4©óÃ@èiÞ*ïRuϿ΀®CÄlÅŒXè¿ ˆ:pãCH§ áJÁ² ‡thªP’JÂõ«àÚð`T…ñ~ͶŽA %@€M#1"&t%@ tµåðþ¶óÏßüËió¾'/8§® º ‰X«f“V^§dÞ ÇªÀn ,Î@W!‘BÀ4Ò–½u ÕÕò½ZZ…õ-™.n÷‹L’§S4ÁÀó!ƒ­mHuA4 ®—† ; Ž] éƒ@(…¨ W.A&٠ΪT[5˜ÔëÀ9<[†bÀAQ äà5 ¯F[‘qÒP74p ¤•ãæÂ± ¿âQêA ê€mƒmA€iåÑ4èNA& †”B" ‰˜fK@‘ DÞ…¶‚t&.a@¶GÄ£ Pa[,Ù] Ø.PJ!"“ÈÒ7›±Ž }½ÀP‰ø·ª! (éŸþùþï=Ï[YY™››{üøñêêª,@°ººªiZww·¦i‡½‹ßî(A^[@!!• B(Æft ¼¶ÊËž³/ž_‰àDZ‘8OÞmÿ‰ 4jµêy^Œ±0 åÎ9¥´^¯oooK‘¥M³ÙdŒI7°m۶퓺JBˆ,¦Ó²Ö, ¬} ‹ëÀÈp‹«Pª@Ó‡Xò‘]Ö IDATz30:Ü gxá9_öۤɧ(­µZ«xGo7Øö[ÚÒÒÏÅ0 }¿öý½ w ‹@È! iRÓË„l/×…¨—†!„ € „¥`­?Aæ pmèïªBȖ퉨8®ò¢ˆBAÑ_á®r^x7ÿosN ºÖJ*ÚÅØ_SF$@4P(¸.Øt\(…ˆ – Š*3Έ¨C8‡Ý"ÏBîD o #ƒ`[ГÕU„ël/„˜XVkÛµ`’ Y«ªôê:Ì-Àn M J`l „€z +½ÝÐÛ ÉDËÞ–9G.$2u±d¢•Bõ¹ë™°#$ê@ÔMk•WU DX&‰¹Ð.À¶n5ï$ (± ÓCƒDœ˜†B˜&OwA:A+UPÕç3DyãUœ`2”‹Êððð­[·¤b255uûöíÃmŠÅâÝ»wçççà£>ºrå ÌÎÎV«Õéééf³é8Îa)äíŽBäµ cÎB¢ÌÚJ+‰,m•1qŠÐö@AýäÝáœ7›ÍíííÙÙÙµµµJ¥ñx¼¿¿ÿòåË™LF×õíííßüæ7KKKŽúáx„n"„¨V«óóó+++ÛÛÛÉdÆÇÇu]§ˆ×Ǻ6Œ‚ë@Ô…ÕuØ)A:=ÝJU·åÕ¦‘ ƒý °WÎÁuO6(àýˆÒV†]Ò²LèÍ@Ô¡¾V¸“¦ª€!ZÉJ¨ûý\l úzÀµ1aé‚âûä³ã-z^*k– ‰$°WÓCª‚×ÓhEŸéZËÓÁ2AÓqÐ5u¸Ìä¢jI‚kCo7( ¸èšH%ç Ðo‰w2‘ÔGš!Ä£2˜[€"ÔëJÂ¥aèÉ@2 ° M R ˆÅÞoB@ºŒؿֈ,zNƒBÁ¶¤zÒZË‘d{e ç¿Örz{ÓSÇÓ€x¬å"ïí†Î2I²“ùMP0-ˆXByós2ü€ ( \TâñøþhŸÿüç‡ÛÈ-ÝêêêÐÐеk×nܸš¦ÍÌÌH•?þøXŽB.„àœ.çx:&–BÈ\znw²C(oÁ(gŒsÁù9¸òw à8ç‚qÆ„ŒŒ3&€¾åЉçH³ŽzÇŒœÎ8cr^JÈx„Aȸ‚´:›´"®Nh†ð³€QßJ0æ‡<`‚@„`ržtΪçœÈÿÞõ½â©P©Tž={¶´´´¼¼¼³³S¯×9ç›››»»»žçŒŒ –J¥{÷îÍÏÏg2™H$Ò>6‹IOÌÒl6Ëåòâââôôôêêj£Ñ€­­­R©¤( ç<‹ÇåϯëÔA×€(à8°SlE1쯾ñ¦ÈxŸx tšMüSÊàð2#íðíL¾ý¶#Àõsdn"âU…kó0ÞÏŸ­N˜:tÅ!l•yÒõV1ïxl b.è*Q ´Uä%…0Ç‘ˆÐu!#’ÔX&ÄÜ–µO)XÊ‹çLÛÇä1¡X®ìíiB¦ Fap’1…b«ÚNÄÛz´9ét¸ßb.ôu¥­2UíÆ2ðì¼{}_Y G×t¸04–HT—u[ù›5ímªç„7‚ €rñžqÆBƘ`P@9-¦e“SJEÇ'¯¢Àƒ†!ø>¡a,dŒ3v¡*ÂP„ñ}¿Ù¤àû2Æ„Pçœ0öfc'„`Œ !dâù—ѲˆCàû¤©µ¯jú¼ÞdÍ l‰œ‹WH.ï|m! ý h N¿•jÓ÷ƒ¦!cB€ÎZÒ9«>d†”Ÿ‡jRëëëÿû¿ÿûìÙ³D"F»»»›Íf>ŸßÜÜ|üøñÕ«WÿéŸþIVêÙÞÞþàƒ†‡‡ÛÇf³ÙýzÊÊåòǧ§§ø@&¯=6,ú{ ™ßUm‡ïˆLAbêÀy+Eg™m P Bi¥±|½£Z@È9E×!Ý{5à¼ÒP¢î_“Ë"ÐéÔ"™ýyÚýóÞ$ŒHS!î¶Š %ãIAOFú¼’J´Ò)´³VÊY­Mס p0Š0bÁ@_ëÃqýºÃ;"UåQ›vÅ!Õ†¦…LPw"‚b±A*•Êf³Ò9›Í¦R)Ïóc¾ÌØÿÎGI.8çDp‰¨OM@‘¯ 9çoBs.m?Î2ïç|ºÈ!j¹>0òCøÜ©á¹?Á»ÔMÎ…vÖ £~{^zÏ …r©ŸPòÃóæ×Öò‹ù¶JrŸ±€ òÜßD^Hç¬zÎ…TÌÏËüB†ÑÝÝÝÓÓ‹Å<Ï£”>{öìéÓ§BˆÏ>ûÌ÷ýR©T.—c2Qºªª¦iÆb1íåfRµZ™™yòä c,•JŒŒ@­V+•J?VUuppð˜U××y³ìGC ÐÞÚò–‘ ÈùÅС« ê h4!b?P,HÄ ƒXÔç«Ò0 Æ Ñ1Wð#xÓÉ#Û;6 õCàCW¢.8©•c”.‚€"³I¶†l?º]q8ÙÔ0” ]ç±d{ÁÐ bbä`ŒÉxº®[–¥( X–¥ëzí7™Çr‚ ¯gÅ‚µüG°?:lt\æU ä Sü ©9 AB˜å]èééùÇüGÏó’ɤã8š¦5›ÍË—/ß½{wyy¹X,¶_ HLUU !Žãôôô´ƒæ^¸b«ÕêãÇwww?ùä“«W¯J”l6;33s÷îÝÇÿÝßýÝ Ê rQÑuHuAàCe¯UW¡±€sH& ý¹1bêÐUš×Ê(üîD,Èç`è ©ç"PñìŒBÜe‘¾<§p§"DØ1:º/÷DP΂B(¡„RJ8‚!<§¥”R*?t¾-N)¡”* U…( §TP äBç@‘c¤PEQäß ”2!@ @(!ôÍuéuÒá!¨Ä¼F©ß…—¡PÀBˆBˆrò}K©¼,Uùv¥œ `B&ãûë•tΪ§”( (ô|¼ì‹F£2!ºeYÒ»¤Z­ú¾oY–뺶m«ªªªêðð0c̶m(····¾¾N1M3‚d2iY_>7 Ïóúûû¯]»–L&À¶íjµúÛßþ–1ö W!D”bé“%‚ äÝRÖZ»åyApF \‡tE…B᜺B¸¶0u"8HÝS‰Ä´…ø„ïkšö®þƒíL@B@∼šÓí%9¾Aø¾ Q»¢\Ó€x‘sý ÿÝ¡ïûœs…6” €¢(†aÈ›‹tWÏó|ß×4M×õ.õ7=JÆ(TQTEQA!( œrG(‡¬ó7âŠB5•ªª¦ë:PU¡) (LäB¯AªªTÕT]× CU@¨„Rª)Š¢Ð7ÍßÎ!*¥4 ^ýÄR¨ª*òö%GáehŒ)*PÊ(%”©÷쵩ªªkš¡i”Ð}㨪D@)µ¥ýÐŽZõªB4¨*9*€¢(Rû*„(‹ß|óÍÓ§O»»»\×5Mó?øÁåË—ÇQ¥Ùl …¹¹¹'Ožäóù?üðÓO?íëë;pfÆX­V ‚À¶ív°O,³m[úr†ß6*¤4A­VóO}£ÿþta£Ñr•ô*»åùQPA(И „pSE!¦Î4•A¼†+ˆs ‚˜PrV |¨ ιöž'(y/æˆÃÐó<àœkºJ4<ð›§|R('„X–…³AåÜ£iZ"‘¨T*…B!ŸÏg³YÈçó…BÁ²¬h4ª¿(ãô[%=P¤)G`üá©=9ž§É;6Œô@‘„U”çfêE~«ÖßMž›â”R.ˆ@‰üÙ÷@;ù…wP^ ù¶#ÐQ³TNo)S§±²BUªhŠ¢|[@!Tá‚2At Ïí¨Uÿ|öž¹GQUUºnííí …ùùùùùùJ¥2:::11‹Å,Ëšœœ”écÃ0l6›®ëzž·µµ5;;K™˜˜8, pÎÃ0”Öšar‚†¡iZ;ï/®Ay‹E „€iˆV MP1W€cƒaü5Ä’R0 ¡éÄä" ‰u—Þ?d51¬@Œ €‚¼;–ee³YÎù‚išRøxðàÁ³gÏlÛÎf³¦i×Q‚¼Bç‚_òGäFGÈ­ûrÁ¸JÐ'øøzU„a¸±±ñûßÿ~nnnww7“É\¿~ýêÕ«ñx\†ðÈŠÅ2YoµZ½råʽ{÷þïÿþïÉ“'{{{/²òˆ¢(­jtϳÏÊ$ÙR°; oÊö”RÛ¶­¼1ò¤ã‰Ì¬ª*ÊÍçΉë€ ”Al„¦ …¼A ‚À'ž¶m£/À…¿ŸË5.eëH$rV#†¡ªªƒ €r(•J‹‹‹¥R ¦¦¦ÚäOãñøðð°ëº—/_€b±8==-÷…³³³•J¥¿¿||Üu]yŽÇãð:Gaÿ#È[Äô#JPCé° r…3ÌÛ*@0.8oU9ÀiòÎVð\.çóùùùù¹¹¹b±˜L&ÇÆÆFGG{{{ep‡|¶‰ÇãŽã¬¯¯û¾_.—åÓðà~HU#‘H£Ñ¨Õj•JEž¡R©Ôëu]×MÓT¿ýR´í:$cÊphNBˆôÒu]Ó4 á9÷Èx/D¢Ð`߈c‡]x åÀ?“Ë ”ÊG Ž‚J§³¸¸xûöm©˜´EÛ·oÿüç?€ÉÉÉ[·nŒŒÜ¸qC×õ/¿üòþýûwïÞ•›¶ááá\.—Ëåâñø³gÏnß¾ ·nÝšœœ”[ÆW…ý oû¼™”¢JGŽNÀÈËBã"äB¢ ‚ò΄aX­Vçççýë_///kš644ôÉ'ŸŒ§Óé—ÙÕaV*•Z­FÑuý…1S2èµX,Ê WéT"ƒ^MÓL$¨’ ȱOMAÎ-( tñx\jˆD"ƒƒƒAlmmA°½½ étzlllbbbppðpA·> A×pB!  oAÇŽ`dΊ3u@‘!<² ÅYò®”Ëå‡þéOúꫯJ¥ÒÈÈH?Ôjµz½nÛv*•€B¡P«Õày­œr¹¼¼¼¼¼¼dz٬eYµZ­ýL´mlÛ&„,//ËC`~~~uu5™LF°¬&‚ ‚¼÷ €rö ߺuëóÏ?áOe¬;022â8ÎgŸ}Öl6À0 ×uÓé´eYŠ¢ÈóÈÊc_ç(ìy;ˆ&ð]Zç!ý>¤¢«¸B*³rãTy7òùüÿüÏÿ|õÕW[[[º®—ËåÅÅÅr¹,ß ݼyîܹ³¼¼ ÏËR–J¥µµ5MÓ._¾<99™H$¶··ó›ßÀøC) ÄãñëׯsÎÿò—¿Ü½{Wê2«««¶m߸qãúõë賉 ‚  (gÏ˼N@)ÇãGlàŸG–{8ú(AÞÎ>ç „üy…ÔP:m€BRÞ:Ûl“B€ô…Á(ÇcÌó<Îy2™t]·««KÓ´½½=™6‹ÉŠÂ¥Rikk žçLñÇqÆÆÆ<Ï[[[[[[«×ë ëz&“™˜˜¸té’ã8Øÿ‚ òžƒ ‚ È›ÄBÎABå“N#ÁEG„ð€à² €‚úÉ;“L&¿÷½ïe³YPUÕ4Íýé{{{¥Ì1<<,“˜PJUU5 Ãqœd2Ù××—L&mÛ®ÕjÒ[³˜cšfoo¯¦iÉdr{{[FÙ¶N§‡††R©Ö­CAA·ÁÒh_\õ9ŠJÑ¥³B„B0!d⑳õ@áÏs  Ê»‹År¹œŒ¯yáOÛJ"‘EQt]w§««ËuÝv1™ñD~hí‡TÕqÃ0‰DµZ-‹H$\×=òš‚ ‚t(  ‚¼„I:ÊwG"½qÕg‚ Y+éçÀ9ÈPÃ0™*s ¼3RøxabÐ4Mz”ŒŒŒÈ6²Ø°ªªº®«ªÚÎüuX@‘(ЉDt]w]… ‚ È{ (‚ oeÈt8©S ë•p¯ÉP?é(ÚŃá¬% !þšD”wGÓ´×ÉêõʒÇÏÃ9gŒÕjµB¡P©TÚi×£Ñh*•rGQ‚ëAAÞoP@Ayc…C%¦FJЬê4„€€K¿3œá!œ   |ÒÁÈô´‹‹‹wîÜ™™™‘9h3™ÌÕ«WoÞ¼yéÒ%˲dø‚ ‚ ï-¸@y€B‰BQ<éDkÉ„’3 ã ó ÑJ6 ǦSñúèÊ•+0;;[­V§§§›Í¦ã8(  ‚ È{ (‚ ÈECˆVà œ]ÔŒÀ80.¸B!@ˆ ÄÓ©T«ÕùùùÕÕÕ¡¡¡k׮ݸq4M›™™Y\\€?þøÐ‹FC4!Ÿ {ñ¤XØl2"„ªSM@I'/%J@Uˆe×%B@©Â½†pagˆBASˆe‚ã]'àû¢V^üP0þ6ç ðÞ`1UÅ¥u–I1b™G­ÁqÑh@yO4š'ÛŸ„€BÀ2i4JL DïžÏCöÂÇ¥ÃÐk2 `žÝˆ« 3µPÓ¸¢à“9rª` ‚  À„BÂÏ,~Gˆ Æ Ï÷”èÒ±xž—Ïç÷ööFGGs¹\*•€\.×h4>|˜ÏçÆñB‹áòr}»x¡8šy'炱PPFè†å½†B¢ÍöÐËW”ÁÔt˜ßdu‚X*IDh¶‡^W»ºJEñì)ÏoðB×}þV#΃€¦rJ1öñ(²=ʧ©Ùî£z‰…à7`m“ߟ6 üD¯G£ÄRI_rí%“"P­ˆõU‘ßäk;¬âñÃlÀ8g!šÊÎjÄS qe˜e3Ä´Ñ@FŽç‚ rÑ(òÍçY•¾‘yXBN„AˆÌ5Œv@ÇA±X ‚ •Je³YYÞ8›Í¦R)Ïóc¾ïïoO)Õ4MÕ@0ÆŒ¡€rr«IVÎ9g_]ëh‰ Æ€1²0 9çâ¢NFHÈx*Œ Æ(„L0Æc,ä,o7ârˆ9¿¸ÊÓqõŒ‘£ï?LÎÆP„!cáÉ (T!rJÈ kýö³P°ývÑzj ©Šžáˆsyi”(Š‚e×#@A¹pæ– ŒAÈ=«*Ý€Xì ~³¢€aBüœô“¢(š¦¡z‚¹˜óÀâââíÛ·§¦¦|?99yëÖ­ÉÉÉÅó, xž—Ïç÷ööFGGs¹\*•€\.×h4>|˜ÏçÆsŽsÎ8c!cL0( œ–Ó²É)¥ãF! Cð}BÂ0 XÈgìB (T„¡âû~³IÀ÷Eà‡a†¯´æ_. 0Æ„2@~Àåp”,ÂDŠ ß'Mõ(·ßü€…L¨DN8£o7Fopm! ý h N‰¢ÉÄv•=Ý—v}Ïç‚€¼¿v઄!åÊ{=ýâñø7t]ÿòË/ïß¿÷î]Ð4mxx8—Ëår¹×ŸEA”7fppÕ“cÜØMNN*Š¢ëº4ºªÕj†„H$ÂM$Ž ‚ X,AJ¥²Ù¬ŒŸÊf³©TÊó<Ƙïû‡-:Áœs"8æ«9=E¾‚æœw¾ ͹´ý8cL0Æäõ_ìé"‡¨åúÀ0&Ù;üíí~“y(q½½N…ß…—‹,`œ1¡(DJUBГ¾¶–’&H3%/ù a'Ø ¸¡òÜå¤ÓV=çB*æïùü‹D"ƒƒƒAlmmA°½½ étzlllbbbppв"‚ ‚ÊÉúG?úöïq!³Ÿ”ËeJ)c¬Ùlnnn>~üxww÷øÃÎÎN4=, È–Œ1]×-Ë’,ËÒu=‚öûOA †p"!âtŠf›{üi!œ^÷ï„UŸwÛŠ@ï¢ÎFQ˲FFFÇùì³ÏšÍ&†áºn:n?CAyŸ9AåúõëØ¿Ç…ô@‘ŸÃ0l4kkk¦iÞ»wïþýûŒ±›7oË/"„J(¡”„`Ï©@)•X²(fÇ_-¡”* U…( §TP äBç@‘c¤PEQäß Š"*RJÉ[y‘^'í¬èñ:=¦~{^Þ’ ìy­Y…œøÊ¢T^–ªP¢ªBUZ  ìs!d ão]Cç¬zJ‰¢€Bß÷·rDâñ8†ê ‚ ò2NP@éïïÇþ= E1M³»»ûƾïß½{·P(Æ‘- ÂÀ÷}ÏóäfÝó<ß÷5MÓuýÀû´–¥AEUED‚Êi@‘Îü/LÜy3j*UUM×u  ªBS@QØÅ~î(TU©ª©º®†¾àšªª"ÞîÍt;‡¨”NÎ…|vÆO,…ªª"o_r^ÚR"PJ´–âr²}«ªªªkš¡i”U QµÜ ½ÁFyMA)! ÝËíœU¯*DÓˆª’οù ‚ ‚œñvôä B¬X|¢ö¶´µ¤¹%¾ZßFÓ´D"Q©T …B>ŸÏf³Ïç …‚eYÑhT–i>žËåFGGÇ9Ü2‰ A°µµ%£~ NMLL îïmA CD§ƒ]¬•‚ªÏÎ$Á ºJ£T€†IFAAÎ9" ,//onnnoo_¹r¥mÕÏÍÍyž···711ñžk(ÃÃ÷nÝúüóÏáyÆAéâºnWW—ã8ªªÊ6²±D"‘T*ÇÇÑu8çaÖëõb±X©T<ÏcŒBdÎûh4ÇMÓ|áùF©TªT*•JÅ÷}Ji$I$Ñh4‰hšöšmã¢T*---•J%!„ü& ÅãqBÈ G°\.—J¥b±hšæ-…Œ±½½½B¡P©TF°m[QBÈ+ÛPJq˜Žß÷kµZ©TÚÞÞ®×ë ëºmÛñx¸~ýzOOÏ êR©tïÞ½ÌÎÎîîîjš600ðé§Ÿ^»vm`` ‹½fä¸XZZº}ûöÔÔT[@¹~ýúOúSYåàð –Ëå{÷îMMM}óÍ7ÝÝÝG´dŒ5¥¥¥;wî11‘Ëå>þøcyOx68RÈ{! ÖP®]»fšæ åêÕ«¸*AA:Ÿz½^(|ß›:h4ËËËëëëÅb±Ñhø¾†áööv³ÙdŒ¥R)Û¶-ËÚï-†a³Ù\__Ÿžž~ôè‘´ÇF>Ÿ¿wïcÌq˲|ß?ºã8”RÜOž¥RiqqQ~8üSƘïû÷ïßÿâ‹/þüç?ÿó?ÿóóguuu~~þñãÇ«««A€ïûš¦e2©‹B^Ù%³“@z£Ôj5ÆX"‘øÎw¾³ÿ§{{{ =zôèÑÊÊJ£Ñ‚ -±F!„(‹<˜žžÎçóÕjUÁ9ôètwwÛ¶mšæÑmäM@UU ä½PÀ4MEQÂ0dŒA ½°lÛn/TÎ9:¡ ‚ ‚t&Édòûßÿþ|P­VŸ>}úÅ_xžç8ÎãêñãÇkkk]]]Ùl¶««KÓ´F£±¸¸øõ×_?xð ¿¿ß¶í¾¾¾ýJ³ÙÜÜÜ”VY£ÑøÑ~ÔÓÓS¯×WVV¦¦¦J¥Òðð°ëº»»»G·éééÑ4 ÷“ÇÅÐÐЭ[·>ÿüs!Ľ{÷nß¾My¡>åûþÎÎÎâââýû÷çææªÕêÑ2V±XüË_þ2??/„Èårò5êÜÜ\¥R™žžn6›ŽãB^Ù”ã¶íÑÑÑ®®®?üpmmmaaAº–VC677õ«_ÍÎÎrί]»ÖÓÓc†eY힇„a¸±±qçÎ>úh``ÀqœÍÍÍ/¿ürvvvxxضít:}t×u{{{]×ÅÁBÞ Åó¼ÙÙÙ0 !cccrêïìì,,,€®ëW®\Á§‚ ‚ HljDd&;)¦¬¯¯ollÈÔ'm(¥º®ÇãñX,–N§ûûû-˪×ë†aüéO*•J2É‚ïûòs$qÇó¼õõõõõõF£‹År¹Üøøx­VÓuýë¯¿ÞØØØÙÙÙÚÚze›jµFqKy\Äãñx<.?B~ñ‹_v4þåryvvöÉ“'Œ±H$rÀM@æR‘ŠL,#„ìííÍÏϯ¬¬ \¹råÓO?%„èº>33³°° „¸qã¥ô•mpŒŽ ]×u]O$###›››®ëêº.Sµ‘žb›››>\[[Ëår¹\î“O>lû”Iï•b±èyžŒÝSUuooogg'ŸÏû¾?::úï|'>yòdvv¶X,®¯¯' BÈÑmº»»‰ (È{! Hõ$©ž$‰¶z"„ê ¦BA¹&÷ä䤌³0 #‰(ŠbF2™ŒÇã”RÓ4Ëåò£Gc™Lfppp||\FâT*•l6Û××—Édººº¢Ñhooo½^/—Ë++++++G·ÙÞÞ6 Ã0 ˆSC¦ƒÝÜÜüýïŸÏç¯^½šJ¥jµÚ~_™K~ò“Ÿ\¿~]Zù|~ooottôÃ?L&“”Ò?ü°ÙlÞ¿?ŸÏ7 BÈ+Û`ÿŸ&¾ïïîînnnîììèºþÉ'Ÿ|÷»ßM¥R–eµUK™Keiiimm-‘Hܼy³«««P(”Ëe˲‰ÄÀÀ@__Ÿªª™LfbbbuuµR©<{öŒrt›|>?22‚£€œ¬€"„8ó(PTOAAÞLÓìéé9°,‹årYUÕX,&ß!«ªÊÛo˜‹Åz½ÇÛÉ@¶BÈ”+[[[G·©T*2Srj4íííååå­­-JéÄÄDww÷W_}õJS¼X,ú¾ŸJ¥²Ù¬ ØÉf³©TªÑhÈŒ*„W¶Áþ?M‚ (—Ëår9Ji†RO¡”†FS©T†œóýG…a( r†!}Ó¤‰ã8==={{{•Je{{;‹ݦX,âêFN\@9sP=AAyo‘É#ïÞ½ûàÁƒF£‘Éd²ÙìèèèÐÐc¬³³³#SQF£Ñýo³E‘¡AÔjµz½~t›F£qÀxCNšb±øÍ7ß<}ú4™Lf2™ñññÕÕU©mµ‘¹Täé™Â9—I…u]—£Ii#cŒsNyeìÿÓ$ ý½½f³iÛv©Túýïÿõ×_omm@ww·¬Ž4000<<œÍfÛ!<õz½ÙlA ëºÌ‰Ù^¹¦i꺾uÑFªf8 Èñ (¼NÎÐ Õ“cGÖ]¯Õj…B¡R©4›Mh+¾ŽãÈG v‚ ‚ g«›!jµÚöööÓ§O>|X(zzzÆÇÇ»»»Óéô4“Èù¥\.ß¿ÿñãǦiʬ%ëëëÕj¦¦¦b±ØÈÈH<—‘;È0F@QEQ8ç²<ˆçyFCQ”l6kYVooïþ^¯×±ßNF}á3ìôê£ÕMÓP=y äjqqñÎ;333RñÍd2Rñ½té÷BAäÌBAÏçïܹ3??_,Óéô÷¾÷½+W®¤R©Ãíå{fMÓ|ß÷<¯ýžYî|‚ Ð4ͶíH$"„8¢´á±ÿO“J¥233óÇ?þ‘bšæ/ùKYt nß¾½¸¸xëÖ­ÉÉIØoÈ ß÷åhªªJi£¦i²õ+Û`ÿŸ&rÔ4McŒ¹®ûÝï~÷Ò¥Kœóõõõ{÷îIëbÛöþT¯2 ’\Ýû½Hc²ÌùÕý²6û=Sädù“NMIÉçóÔX^^–êÉÕ«WQ=y <Ï[YY™››{üøñêꪌ\]]Õ4­»»[Ó´h4Š… ‚ È™À9‚ T*åóù¹¹¹ÙÙÙR©ÔÕÕ566våÊ•áááš@²üG¡P)ªÕªçya–ËeYÎ#‰¤R)Ïó677hF÷WGFN˲dXç\Z¯“ÛUŽx¹\. ù|¾¯¯Rº¾¾^(LÓ”%`!¯lƒýšhšF]וÖÀÀÀ|`šæ³gÏVWW—––d¢"é#ÿWëTUeØ]£Ñ(•Jår¹Z­ÊÒ<¥RIÖ0N&“œó#Ú$ \ÝÈI (G¸œ®=öš¼©ò288†a&“i«'0>>¾²²222‚êÉÛ!£ˆçççà£>ºrå ÌÎÎV«Õéééf³é8 (‚ ‚œAT*•¹¹¹_ýêWKKK†aŒŒŒ|òÉ'ããã™Læe±Æ¦if³ÙÍÍÍìííMNNÆãñ½½½•••|>/ °UU=Ï;¢M:Æ<§ÌÐÐÐOúÓR©Ô64îÝ»×®¹óƒü`dddEžý² claaA¦½ „LOO/,,8Ž“Íf¥3Ñ+Û`ÿŸ&º®§R©L&㺮´7›–‡¸,ÂF=Ï«T*+++™L&nmmÍÍÍ‹ÅO?ýtxx¸¿¿¿ÙlѦ··÷@n96N lG±··ç8Îk¶×4mbbâÀ—Žã\½zé­©V«óóó«««CCC×®]»qã†ìê™™é*ùñǸÀ*åF¡ÊC&øÛ*hÈÁ9Â4õø—j mŠK#Í!„”+•®Wñ?¼È¹Ù,†-ªXÍe?ku¯\©ïîÖ‹µ·Ió.8gœƒ@%„PŠ9‰ŽÆÖâëQÕjÆ(3õ#M2æy~uÏÛÝ­*§QvÁf£›ø!Ñ)åBø>«{R©TØmtøª×|ÕsíÀÒ4Š®ÎÈ1S¯×wvvJ¥RµZ}úôéÂÂÂî°h4ýýý©TJ±µµ5==ý‡?üa}}]æDØÞÞÖu}yyÙ²¬®®.—!u™DVÖîééé‘EŽÏSe{{{wwWUÕt:ÇëõúÚÚZ;‰¬išŽãÈRJ››› A8Ž#½É ÃèééH¥Rårùˆ6(™!'+ Às ø·ï«««Òå9+<ÏËçó{{{£££¹\NFçr¹F£ñðáÃ|>ÀgRÁ9ßÛÛ[^)<Ù¬…!¦+?%˜œ3 TQ:Þ„Ö4Å1 Å뺒"„’¥•üìÊnµæù~xÇÈ4´„kª~òRMZ{µÆF¡¸¸²ûdy§P~›„gç—$„`pöÑD,=“°Õ k0Fb†s¤Ùæï–êùõÝ'OóùÂÞi\\_b'C2áªÂ¸¨yA¡°ûlaééz©ÃW}3ã;½©HÂPð=û,•JMNN>zôèüãööv£ÑåAäúíëëÛÙÙ™ŸŸ_[[K$7oÞÔ4­§§çæÍ›ÓÓÓsssøÃ8ç†aÄb±‰‰‰K—.õõõI•äˆ6肜”€r¸ ÏqúÞ½{( œ-AÈèRĵm²Ù¬Œ fŒÉ÷9m(¥š¦Ù¦Þe+=.á!Eýätà „ r?A¡ÓU¥¦A¢†P€ QCdlp ‚‹¼ÕuêF¨£"x+Wçå1Ò6Ñù[þíB zò2–I»,jk@Û£ð²5Å9QE&BÁ=®íŠPÁ8#À¹‚ OFˆ÷’ßÞ9«>eSK#*%ª¢`i6ääˆD"ƒƒƒ‡¿—i&Óéôµk×zzz^ûI¤:ŽÓÛÛ›Ëå`nnnwwWÓ´l6;99yõêUé·bÆÑm0ÇäÉÇ¥Vò:-¥JÇ_ÖÆ²¬ ¶¶¶Â0”…ÒéôØØØÄÄÄàà`$€×iƒœÀI—Ij|O¡”F£Ññññ0 e²’0 å¼|ùòØØ˜”P%ÓÙär9EQ|ßÃÐ÷ýx<>11‘Ëå²Ù¬t8:ºã8øDCNòÿðûçë1žzppð?þã?.v÷I×ÄŽÕ³ïܹóoÿöoŒ±ù—¹yó¦L¤Á;wþýßÿ]Q”ý×½yóf»=c¬Ùl–k^¡äÕ¾#xN‹VO“ö?|× D¡Ô1µTÌ€jcÏóãmgŠ ¥DUÇÔ»\Ó2TðC¶ç…µ†_køAÀÞyèñÿj…jšâ˜zÂ1Lý(¯ûqÏgõFP®5š§âe›Z*±M"@0&öþNÅóA‡¯zÓP»\3j›–ièÏ+YàdCŽ…ý!<ÞÙHI%•JéºÞh4<Ï{a›—…ðÈl ûóGú¾O)•í£Ñh$‘Ûž×iƒûCx^(”Èž7yì Ø9ü çœ1V«Õ …B¥R‘iG Ãp]7•J9Ž#µ°W¶A‡£ãbÏáÂú®Û¶ÇÓé´®ë2SÉîîn­VcŒQJMÓŒF£òà=G†ðH+‚öQõzs®išëº±X,K×’×iƒ õ}ì|ËåxÍ奥¥Ÿýìg?ùÉOp¤Ï‰H ÃHªjµ1xyMœÈ{_j)ŠeèiÀ×Y)µ(†®Å3›:›ˆwMÓÐR1ûõÆ2 ÇN$‰D"'tþv&”wlƒñxü/’×?êð7”RJé+Ïÿ:mc¡íu222òÊÆ®ëº®Û××÷â Õ‹”Y¸'ö÷÷¿ôQûmäØiUáiÿÿñ¾wú¯ÿú/@ å,MÂÀ÷}ÏóäÎØó>îº.®AAAy%ê9ŽP^(šðXyOˆÇã7nÜÐuýË/¿¼ÿþÝ»w@Ó´ááá\.—Ëå0É‚ ‚ ‚ ‚¼J@—ø¡¼ì O$ ‚`kk+‚íímH§ÓcccƒƒƒXß AAAA^u¿úp.²‡Ö>(p¤tò^¡(ŠeY###Žã|öÙgÍf Ãp]7N[–u  ‚ ‚ ‚ ‚ /D=ì—ÑÉ2ÊËÔx‰Ê úþ@)¥”Æãq ÕAAAAwáÿã ¬ÂTÐ?PIEND®B`‚icingaweb2-module-graphite-1.3.0/library/000077500000000000000000000000001516321226600202615ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/000077500000000000000000000000001516321226600220245ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/000077500000000000000000000000001516321226600235635ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/Chart.php000066400000000000000000000163651516321226600253500ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Module\Graphite\Util\MacroTemplate; use Icinga\Module\Graphite\Web\Widget\GraphImage; use Icinga\Web\Response; class Chart { /** * Used to render the chart * * @var GraphiteWebClient */ protected $graphiteWebClient; /** @var ?string This chart's background color */ protected $bgcolor; /** @var ?string This chart's foreground color */ protected $fgcolor; /** @var ?string This chart's major grid line color */ protected $majorGridLineColor; /** @var ?string This chart's minor grid line color */ protected $minorGridLineColor; /** * This chart's base * * @var Template */ protected $template; /** * Target metrics by curve name * * @var string[] */ protected $metrics; /** * The chart's begin * * @var string */ protected $from = '-14400'; /** * The chart's end * * @var string */ protected $until; /** * The chart's width * * @var int */ protected $width = 350; /** * The chart's height * * @var int */ protected $height = 200; /** * Whether to show the chart's legend * * @var bool */ protected $showLegend = true; /** * Constructor * * @param GraphiteWebClient $graphiteWebClient Used to render the chart * @param Template $template This chart's base * @param string[] $metrics Target metrics by curve name */ public function __construct(GraphiteWebClient $graphiteWebClient, Template $template, array $metrics) { $this->graphiteWebClient = $graphiteWebClient; $this->template = $template; $this->metrics = $metrics; } /** * Let Graphite Web render this chart and serve the result immediately to the user agent (via the given response) * * Does not return. * * @param Response $response */ public function serveImage(Response $response) { $image = new GraphImage($this); // Errors should occur now or not at all $image->render(); $response ->setHeader('Content-Type', 'image/png', true) ->setHeader('Content-Disposition', 'inline; filename="graph.png"', true) ->setHeader('Cache-Control', '', true) ->setHeader('Expires', '', true) ->setHeader('Pragma', '', true) ->setBody($image) ->sendResponse(); exit; } /** * Extract the values of the template's metrics filters' variables from the target metrics * * @return string[] */ public function getMetricVariables() { /** @var MacroTemplate[][] $curves */ $curves = $this->template->getFullCurves(); $variables = []; foreach ($this->metrics as $curveName => $metric) { $vars = $curves[$curveName][0]->reverseResolve($metric); if ($vars !== false) { $variables = array_merge($variables, $vars); } } return $variables; } /** * Get Graphite Web client * * @return GraphiteWebClient */ public function getGraphiteWebClient() { return $this->graphiteWebClient; } /** * Get this chart's background color * * @return string|null */ public function getBackgroundColor(): ?string { return $this->bgcolor; } /** * Set this chart's background color * * @param string|null $color * * @return $this */ public function setBackgroundColor(?string $color): self { $this->bgcolor = $color; return $this; } /** * Get this chart's foreground color * * @return string|null */ public function getForegroundColor(): ?string { return $this->fgcolor; } /** * Set this chart's foreground color * * @param string|null $color * * @return $this */ public function setForegroundColor(?string $color): self { $this->fgcolor = $color; return $this; } /** * Get this graph's major grid line color * * @return string|null */ public function getMajorGridLineColor(): ?string { return $this->majorGridLineColor; } /** * Set this graph's major grid line color * * @param string|null $color * * @return $this */ public function setMajorGridLineColor(?string $color): self { $this->majorGridLineColor = $color; return $this; } /** * Get this graph's minor grid line color * * @return string|null */ public function getMinorGridLineColor(): ?string { return $this->minorGridLineColor; } /** * Set this graph's minor grid line color * * @param string|null $color * * @return $this */ public function setMinorGridLineColor(?string $color): self { $this->minorGridLineColor = $color; return $this; } /** * Get template * * @return Template */ public function getTemplate() { return $this->template; } /** * Get metrics * * @return string[] */ public function getMetrics() { return $this->metrics; } /** * Get begin * * @return string */ public function getFrom() { return $this->from; } /** * Set begin * * @param string $from * * @return $this */ public function setFrom($from) { $this->from = $from; return $this; } /** * Get end * * @return string */ public function getUntil() { return $this->until; } /** * Set end * * @param string $until * * @return $this */ public function setUntil($until) { $this->until = $until; return $this; } /** * Get width * * @return int */ public function getWidth() { return $this->width; } /** * Set width * * @param int $width * * @return $this */ public function setWidth($width) { $this->width = $width; return $this; } /** * Get height * * @return int */ public function getHeight() { return $this->height; } /** * Set height * * @param int $height * * @return $this */ public function setHeight($height) { $this->height = $height; return $this; } /** * Get whether to show the chart's legend * * @return bool */ public function getShowLegend() { return $this->showLegend; } /** * Set whether to show the chart's legend * * @param bool $showLegend * * @return $this */ public function setShowLegend($showLegend) { $this->showLegend = $showLegend; return $this; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/GraphingTrait.php000066400000000000000000000045361516321226600270470ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Application\Config; use Icinga\Application\Icinga; use Icinga\Data\ConfigObject; use Icinga\Exception\ConfigurationError; use Icinga\Module\Graphite\Web\FakeSchemeRequest; use Icinga\Web\Url; trait GraphingTrait { /** * All loaded templates * * @var Templates */ protected static $allTemplates; /** * Metrics data source * * @var MetricsDataSource */ protected static $metricsDataSource; /** * Load and get all templates * * @return Templates */ protected static function getAllTemplates() { if (static::$allTemplates === null) { $allTemplates = (new Templates())->loadDir( Icinga::app() ->getModuleManager() ->getModule('graphite') ->getBaseDir() . DIRECTORY_SEPARATOR . 'templates' ); $path = Config::resolvePath('modules/graphite/templates'); if (file_exists($path)) { $allTemplates->loadDir($path); } static::$allTemplates = $allTemplates; } return static::$allTemplates; } /** * Get metrics data source * * @return MetricsDataSource * * @throws ConfigurationError */ public static function getMetricsDataSource() { if (static::$metricsDataSource === null) { $config = Config::module('graphite'); /** @var ConfigObject $graphite */ $graphite = $config->getSection('graphite'); if (! isset($graphite->url)) { throw new ConfigurationError('Missing "graphite.url" in "%s"', $config->getConfigFile()); } static::$metricsDataSource = new MetricsDataSource( (new GraphiteWebClient(Url::fromPath($graphite->url, [], new FakeSchemeRequest()))) ->setUser($graphite->user) ->setPassword($graphite->password) ->setInsecure((bool) $graphite->insecure) ->setTimeout(isset($graphite->timeout) ? intval($graphite->timeout) : 10) ); } return static::$metricsDataSource; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/GraphiteWebClient.php000066400000000000000000000113521516321226600276360ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use GuzzleHttp\Client; use GuzzleHttp\ClientInterface; use GuzzleHttp\Psr7\Request; use Icinga\Web\Url; /** * HTTP interface to Graphite Web */ class GraphiteWebClient { /** * Base URL of every Graphite Web HTTP request * * @var Url */ protected $baseUrl; /** * HTTP basic auth user for every Graphite Web HTTP request * * @var string|null */ protected $user; /** * The above user's password * * @var string|null */ protected $password; /** * Don't verify the remote's TLS certificate * * @var bool */ protected $insecure = false; /** * Timeout for every Graphite Web HTTP request * * @var ?int */ protected $timeout; /** * HTTP client * * @var ClientInterface */ protected $httpClient; /** * Constructor * * @param Url $baseUrl Base URL of every Graphite Web HTTP request */ public function __construct(Url $baseUrl) { $this->httpClient = new Client(); $this->setBaseUrl($baseUrl); } /** * Send an HTTP request to the configured Graphite Web and return the response's body * * @param Url $url * @param string $method * @param string[] $headers * @param string $body * * @return string */ public function request(Url $url, $method = 'GET', array $headers = [], $body = null) { $headers['User-Agent'] = 'icingaweb2-module-graphite'; if ($this->user !== null) { $headers['Authorization'] = 'Basic ' . base64_encode("{$this->user}:{$this->password}"); } // TODO(ak): keep connections alive (TCP handshakes are a bit expensive and TLS handshakes are very expensive) return (string) $this->httpClient->send( new Request($method, $this->completeUrl($url)->getAbsoluteUrl(), $headers, $body), [ 'curl' => [ CURLOPT_SSL_VERIFYPEER => ! $this->insecure ], 'timeout' => $this->timeout ?? 10 ] )->getBody(); } /** * Complete the given relative URL according to the base URL * * @param Url $url * * @return Url */ public function completeUrl(Url $url) { $completeUrl = clone $this->baseUrl; return $completeUrl ->setPath(ltrim(rtrim($completeUrl->getPath(), '/') . '/' . ltrim($url->getPath(), '/'), '/')) ->setParams($url->getParams()); } /** * Get the base URL of every Graphite Web HTTP request * * @return Url */ public function getBaseUrl() { return $this->baseUrl; } /** * Set the base URL of every Graphite Web HTTP request * * @param Url $baseUrl * * @return $this */ public function setBaseUrl(Url $baseUrl) { $this->baseUrl = $baseUrl; return $this; } /** * Get the HTTP basic auth user * * @return null|string */ public function getUser() { return $this->user; } /** * Set the HTTP basic auth user * * @param null|string $user * * @return $this */ public function setUser($user) { $this->user = $user; return $this; } /** * Get the HTTP basic auth password * * @return null|string */ public function getPassword() { return $this->password; } /** * Set the HTTP basic auth password * * @param null|string $password * * @return $this */ public function setPassword($password) { $this->password = $password; return $this; } /** * Get whether not to verify the remote's TLS certificate * * @return bool */ public function getInsecure() { return $this->insecure; } /** * Set whether not to verify the remote's TLS certificate * * @param bool $insecure * * @return $this */ public function setInsecure($insecure = true) { $this->insecure = $insecure; return $this; } /** * Get the HTTP request timeout * * @return ?int */ public function getTimeout(): ?int { return $this->timeout; } /** * Set the HTTP request timeout * * @param ?int $timeout * * @return $this */ public function setTimeout(?int $timeout): self { $this->timeout = $timeout; return $this; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/MetricsDataSource.php000066400000000000000000000017231516321226600276600ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Data\Selectable; /** * Provides an interface to Graphite Web's metrics list */ class MetricsDataSource implements Selectable { /** * HTTP interface to Graphite Web * * @var GraphiteWebClient */ private $client; /** * Constructor * * @param GraphiteWebClient $client HTTP interface to Graphite Web */ public function __construct(GraphiteWebClient $client) { $this->client = $client; } /** * Initiate a new query * * @return MetricsQuery */ public function select() { return new MetricsQuery($this); } /** * Get the client passed to the constructor * * @return GraphiteWebClient */ public function getClient() { return $this->client; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/MetricsQuery.php000066400000000000000000000133101516321226600267260ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Data\Fetchable; use Icinga\Data\Filter\Filter; use Icinga\Data\Filterable; use Icinga\Data\Queryable; use Icinga\Exception\NotImplementedError; use Icinga\Module\Graphite\GraphiteUtil; use Icinga\Module\Graphite\Util\IcingadbUtils; use Icinga\Module\Graphite\Util\MacroTemplate; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Icingadb\Compat\UrlMigrator; use Icinga\Module\Icingadb\Model\Host; use Icinga\Module\Monitoring\Object\Macro; use Icinga\Module\Monitoring\Object\MonitoredObject; use Icinga\Util\Json; use Icinga\Web\Url; use InvalidArgumentException; use ipl\Orm\Model; use ipl\Stdlib\Filter as IplFilter; /** * Queries a {@link MetricsDataSource} */ class MetricsQuery implements Queryable, Filterable, Fetchable { /** * @var MetricsDataSource */ protected $dataSource; /** * The base metrics pattern * * @var MacroTemplate */ protected $base; /** * Extension of {@link base} * * @var string[] */ protected $filter = []; /** * The object to render the graphs for * * @var MonitoredObject|Model */ protected $object; /** * Constructor * * @param MetricsDataSource $dataSource */ public function __construct(MetricsDataSource $dataSource) { $this->dataSource = $dataSource; } public function from($target, ?array $fields = null) { if ($fields !== null) { throw new InvalidArgumentException('Fields are not applicable to this kind of query'); } try { $this->base = $target instanceof MacroTemplate ? $target : new MacroTemplate((string) $target); } catch (InvalidArgumentException $e) { throw new InvalidArgumentException('Bad target', $e->getCode(), $e); } return $this; } public function applyFilter(Filter $filter) { throw new NotImplementedError(__METHOD__); } public function setFilter(Filter $filter) { throw new NotImplementedError(__METHOD__); } public function getFilter() { throw new NotImplementedError(__METHOD__); } public function addFilter(Filter $filter) { throw new NotImplementedError(__METHOD__); } public function where($condition, $value = null) { $this->filter[$condition] = $this->escapeMetricStep($value); return $this; } public function fetchAll() { $result = []; foreach ($this->fetchColumn() as $metric) { $result[] = (object) ['metric' => $metric]; } return $result; } public function fetchRow() { $result = $this->fetchColumn(); return empty($result) ? false : (object) ['metric' => $result[0]]; } public function fetchColumn() { $filter = []; foreach ($this->base->getMacros() as $macro) { if (isset($this->filter[$macro])) { $filter[$macro] = $this->filter[$macro]; continue; } if (strpos($macro, '.') === false) { continue; } $workaroundMacro = str_replace('.', '_', $macro); if ($this->object instanceof Model) { // icingadb macro $tranformFilter = UrlMigrator::transformFilter( IplFilter::equal($workaroundMacro, ''), $this->object instanceof Host ? 'hosts' : 'services' ); if ($tranformFilter === false) { continue; } $migratedMacro = $tranformFilter->getColumn(); if ($migratedMacro === $workaroundMacro) { $workaroundMacro = $macro; } else { $workaroundMacro = $migratedMacro; } $icingadbMacros = IcingadbUtils::getInstance(); $result = $icingadbMacros->resolveMacro($workaroundMacro, $this->object); } else { if ($workaroundMacro === 'service_name') { $workaroundMacro = 'service_description'; } $result = Macro::resolveMacro($workaroundMacro, $this->object); } if ($result !== $workaroundMacro) { $filter[$macro] = $this->escapeMetricStep($result); } } $client = $this->dataSource->getClient(); $url = Url::fromPath('metrics/expand', [ 'query' => $this->base->resolve($filter, '*') ]); $res = Json::decode($client->request($url)); natsort($res->results); IPT::recordf('Fetched %s metric(s) from %s', count($res->results), (string) $client->completeUrl($url)); return array_values($res->results); } public function fetchOne() { $result = $this->fetchColumn(); return empty($result) ? false : $result[0]; } public function fetchPairs() { throw new NotImplementedError(__METHOD__); } /** * Set the object to render the graphs for * * @param MonitoredObject|Model $object * * @return $this */ public function setObject($object) { $this->object = $object; return $this; } /** * Escapes a string for usage in a Graphite metric path between two dots * * @param string $step * * @return string */ protected function escapeMetricStep($step) { return preg_replace('/[^a-zA-Z0-9\*\-:^[\]$#%\']/', '_', $step); } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/Template.php000066400000000000000000000272731516321226600260620ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Application\Config; use Icinga\Exception\ConfigurationError; use Icinga\Module\Graphite\Util\MacroTemplate; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Monitoring\Object\MonitoredObject; use InvalidArgumentException; use ipl\Orm\Model; class Template { /** * The configured icinga.graphite_writer_host_name_template * * @var MacroTemplate */ protected static $hostNameTemplate; /** * The configured icinga.graphite_writer_service_name_template * * @var MacroTemplate */ protected static $serviceNameTemplate; /** * All curves to show in a chart by name with Graphite Web metric filters and Graphite functions * * [$curve => [$metricFilter, $function], ...] * * @var MacroTemplate[][] */ protected $curves = []; /** * All curves to show in a chart by name with full Graphite Web metric filters and Graphite functions * * [$curve => [$metricFilter, $function], ...] * * @var MacroTemplate[][] */ protected $fullCurves; /** * Additional URL parameters for rendering via Graphite Web * * [$key => $value, ...] * * @var MacroTemplate[] */ protected $urlParams = []; /** * Constructor */ public function __construct() { } /** * Get all charts based on this template and applicable to the metrics * from the given data source restricted by the given filter * * @param MetricsDataSource $dataSource * @param MonitoredObject|Model $object The object to render the graphs for * @param string[] $filter * @param MacroTemplate[] $excludeMetrics * * @return Chart[] */ public function getCharts( MetricsDataSource $dataSource, $object, array $filter, array &$excludeMetrics = [] ) { $metrics = []; $metricsUsed = 0; $metricsExcluded = 0; foreach ($this->getFullCurves() as $curveName => $curve) { $fullMetricTemplate = $curve[0]; $query = $dataSource->select()->setObject($object)->from($fullMetricTemplate); foreach ($filter as $key => $value) { $query->where($key, $value); } foreach ($query->fetchColumn() as $metric) { foreach ($excludeMetrics as $excludeMetric) { if ($excludeMetric->reverseResolve($metric) !== false) { ++$metricsExcluded; continue 2; } } $vars = $curve[0]->reverseResolve($metric); if ($vars !== false) { $metrics[$curveName][$metric] = $vars; ++$metricsUsed; } } } switch (count($metrics)) { case 0: $metricsCombinations = []; break; case 1: $metricsCombinations = []; foreach ($metrics as $curveName => & $curveMetrics) { foreach ($curveMetrics as $metric => & $_) { $metricsCombinations[] = [$curveName => $metric]; } unset($_); } unset($curveMetrics); break; default: $possibleCombinations = []; $handledCurves = []; foreach ($metrics as $curveName1 => & $metrics1) { $handledCurves[$curveName1] = true; foreach ($metrics as $curveName2 => & $metrics2) { if (! isset($handledCurves[$curveName2])) { foreach ($metrics1 as $metric1 => & $vars1) { foreach ($metrics2 as $metric2 => & $vars2) { if ( count(array_intersect_assoc($vars1, $vars2)) === count(array_intersect_key($vars1, $vars2)) ) { $possibleCombinations[$curveName1][$curveName2][$metric1][$metric2] = true; } } unset($vars2); } unset($vars1); } } unset($metrics2); } unset($metrics1); $metricsCombinations = []; $this->combineMetrics($metrics, $possibleCombinations, $metricsCombinations); } $charts = []; foreach ($metricsCombinations as $metricsCombination) { $charts[] = new Chart($dataSource->getClient(), $this, $metricsCombination); } IPT::recordf('Excluded %s metric(s)', $metricsExcluded); IPT::recordf('Combined %s metric(s) to %s chart(s)', $metricsUsed, count($charts)); return $charts; } /** * Fill the given metrics combinations from the given metrics as restricted by the given possible combinations * * @param string[][][] $metrics * @param bool[][][][] $possibleCombinations * @param string[][] $metricsCombinations * @param string[] $currentCombination */ protected function combineMetrics( array &$metrics, array &$possibleCombinations, array &$metricsCombinations, array $currentCombination = [] ) { if (empty($currentCombination)) { foreach ($metrics as $curveName => & $curveMetrics) { foreach ($curveMetrics as $metric => & $_) { $this->combineMetrics( $metrics, $possibleCombinations, $metricsCombinations, [$curveName => $metric] ); } unset($_); break; } unset($curveMetrics); } elseif (count($currentCombination) === count($metrics)) { $metricsCombinations[] = $currentCombination; } else { foreach ($metrics as $nextCurveName => & $_) { if (! isset($currentCombination[$nextCurveName])) { break; } } unset($_); assert(isset($nextCurveName), 'loop did not initialize variable $nextCurveName'); $allowedNextCurveMetricsPerCurrentCurveName = []; foreach ($currentCombination as $currentCurveName => $currentCurveMetric) { if (isset($possibleCombinations[$currentCurveName][$nextCurveName][$currentCurveMetric])) { $allowedNextCurveMetricsPerCurrentCurveName[$currentCurveName] = $possibleCombinations[$currentCurveName][$nextCurveName][$currentCurveMetric]; } else { $metricsCombinations[] = $currentCombination; return; } } $allowedNextCurveMetrics = $allowedNextCurveMetricsPerCurrentCurveName[$currentCurveName]; unset($allowedNextCurveMetricsPerCurrentCurveName[$currentCurveName]); foreach ($allowedNextCurveMetricsPerCurrentCurveName as & $allowedMetrics) { $allowedNextCurveMetrics = array_intersect_key($allowedNextCurveMetrics, $allowedMetrics); } unset($allowedMetrics); foreach ($allowedNextCurveMetrics as $allowedNextCurveMetric => $_) { $nextCombination = $currentCombination; $nextCombination[$nextCurveName] = $allowedNextCurveMetric; $this->combineMetrics($metrics, $possibleCombinations, $metricsCombinations, $nextCombination); } } } /** * Get curves to show in a chart by name with Graphite Web metric filters and Graphite functions * * @return MacroTemplate[][] */ public function getCurves() { return $this->curves; } /** * Get curves to show in a chart by name with full Graphite Web metric filters and Graphite functions * * @return MacroTemplate[][] */ public function getFullCurves() { if ($this->fullCurves === null) { $curves = $this->curves; foreach ($curves as &$curve) { $curve[0] = new MacroTemplate($curve[0]->resolve([ 'host_name_template' => static::getHostNameTemplate(), 'service_name_template' => static::getServiceNameTemplate(), '' => '$$' ])); } unset($curve); $this->fullCurves = $curves; } return $this->fullCurves; } /** * Set curves to show in a chart by name with Graphite Web metric filters and Graphite functions * * @param MacroTemplate[][] $curves * * @return $this */ public function setCurves(array $curves) { $this->curves = $curves; return $this; } /** * Get additional URL parameters for Graphite Web * * @return MacroTemplate[] */ public function getUrlParams() { return $this->urlParams; } /** * Set additional URL parameters for Graphite Web * * @param MacroTemplate[] $urlParams * * @return $this */ public function setUrlParams(array $urlParams) { $this->urlParams = $urlParams; return $this; } /** * Get {@link hostNameTemplate} * * @return MacroTemplate * * @throws ConfigurationError If the configuration is invalid */ protected static function getHostNameTemplate() { if (static::$hostNameTemplate === null) { $config = Config::module('graphite'); $template = $config->get( 'icinga', 'graphite_writer_host_name_template', 'icinga2.$host.name$.host.$host.check_command$' ); try { static::$hostNameTemplate = new MacroTemplate($template); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Bad icinga.graphite_writer_host_name_template in "%s": %s', $config->getConfigFile(), $e->getMessage() ); } } return static::$hostNameTemplate; } /** * Get {@link serviceNameTemplate} * * @return MacroTemplate * * @throws ConfigurationError If the configuration is invalid */ protected static function getServiceNameTemplate() { if (static::$serviceNameTemplate === null) { $config = Config::module('graphite'); $template = $config->get( 'icinga', 'graphite_writer_service_name_template', 'icinga2.$host.name$.services.$service.name$.$service.check_command$' ); try { static::$serviceNameTemplate = new MacroTemplate($template); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Bad icinga.graphite_writer_service_name_template in "%s": %s', $config->getConfigFile(), $e->getMessage() ); } } return static::$serviceNameTemplate; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Graphing/Templates.php000066400000000000000000000254521516321226600262420ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Graphing; use Icinga\Application\Config; use Icinga\Data\ConfigObject; use Icinga\Exception\ConfigurationError; use Icinga\Module\Graphite\Util\MacroTemplate; use Icinga\Web\UrlParams; use InvalidArgumentException; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SplFileInfo; /** * Templates collection */ class Templates { /** * All templates by their check command and name * * @var Template[][] */ protected $templates = []; /** * All default templates by their name * * @var Template[] */ protected $defaultTemplates = []; /** * Default URL params for all templates * * @var string[] */ protected $defaultUrlParams = []; /** * Constructor */ public function __construct() { $config = Config::module('graphite'); foreach ($config->getSection('default_url_params') as $param => $value) { try { $this->defaultUrlParams[$param] = new MacroTemplate($value); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Invalid URL parameter "%s" ("%s") in file "%s"', $param, $value, $config->getConfigFile(), $e ); } } } /** * Load templates as configured inside the given directory * * @param string $path * * @return $this * * @throws ConfigurationError If the configuration is invalid */ public function loadDir($path) { foreach ( new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $path, RecursiveDirectoryIterator::KEY_AS_PATHNAME | RecursiveDirectoryIterator::CURRENT_AS_FILEINFO | RecursiveDirectoryIterator::SKIP_DOTS | RecursiveDirectoryIterator::FOLLOW_SYMLINKS ), RecursiveIteratorIterator::LEAVES_ONLY ) as $filepath => $fileinfo ) { /** @var SplFileInfo $fileinfo */ if ($fileinfo->isFile() && preg_match('/\A[^.].*\.ini\z/si', $fileinfo->getFilename())) { $this->loadIni($filepath); } } return $this; } /** * Load templates as configured in the given INI file * * @param string $path * * @return $this * * @throws ConfigurationError If the configuration is invalid */ public function loadIni($path) { /** @var string[][][] $templates */ $templates = []; foreach (Config::fromIni($path) as $section => $options) { /** @var ConfigObject $options */ $matches = []; if (! preg_match('/\A(.+)\.(graph|metrics_filters|urlparams|functions)\z/', $section, $matches)) { throw new ConfigurationError('Bad section name "%s" in file "%s"', $section, $path); } $templates[$matches[1]][$matches[2]] = $options->toArray(); } $checkCommands = []; foreach ($templates as $templateName => $template) { $checkCommands[$templateName] = isset($template['graph']['check_command']) ? array_unique(preg_split('/\s*,\s*/', $template['graph']['check_command'], -1, PREG_SPLIT_NO_EMPTY)) : []; unset($template['graph']['check_command']); if (isset($template['graph'])) { switch (count($template['graph'])) { case 0: break; case 1: throw new ConfigurationError( 'Bad option for template "%s" in file "%s": "graph.%s"', $templateName, $path, array_keys($template['graph'])[0] ); default: $standalone = array_keys($template['graph']); sort($standalone); throw new ConfigurationError( 'Bad options for template "%s" in file "%s": %s', $templateName, $path, implode(', ', array_map( function ($option) { return "\"graph.$option\""; }, $standalone )) ); } } /** @var MacroTemplate[][] $curves */ $curves = []; if (isset($template['metrics_filters'])) { foreach ($template['metrics_filters'] as $curve => $metricsFilter) { try { $curves[$curve][0] = new MacroTemplate($metricsFilter); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Bad metrics filter "%s" for curve "%s" of template "%s" in file "%s": %s', $metricsFilter, $curve, $templateName, $path, $e->getMessage() ); } if ( count(array_intersect( $curves[$curve][0]->getMacros(), ['host_name_template', 'service_name_template'] )) !== 1 ) { throw new ConfigurationError( 'Bad metrics filter "%s" for curve "%s" of template "%s" in file "%s": must include' . ' either the macro $host_name_template$ or $service_name_template$, but not both', $metricsFilter, $curve, $templateName, $path ); } if (isset($template['functions'][$curve])) { try { $curves[$curve][1] = new MacroTemplate($template['functions'][$curve]); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Bad function "%s" for curve "%s" of template "%s" in file "%s": %s', $template['functions'][$curve], $curve, $templateName, $path, $e->getMessage() ); } unset($template['functions'][$curve]); } else { $curves[$curve][1] = new MacroTemplate('$metric$'); } } } if (isset($template['functions'])) { switch (count($template['functions'])) { case 0: break; case 1: throw new ConfigurationError( 'Metrics filter for curve "%s" of template "%s" in file "%s" missing', array_keys($template['functions'])[0], $templateName, $path ); default: $standalone = array_keys($template['functions']); sort($standalone); throw new ConfigurationError( 'Metrics filter for curves of template "%s" in file "%s" missing: "%s"', $templateName, $path, implode('", "', $standalone) ); } } $urlParams = $this->defaultUrlParams; if (isset($template['urlparams'])) { foreach ($template['urlparams'] as $key => $value) { try { $urlParams[$key] = new MacroTemplate($value); } catch (InvalidArgumentException $e) { throw new ConfigurationError( 'Invalid URL parameter "%s" ("%s") for template "%s" in file "%s": %s', $key, $value, $templateName, $path, $e->getMessage() ); } } } $templates[$templateName] = empty($curves) ? null : (new Template()) ->setCurves($curves) ->setUrlParams($urlParams); } foreach ($templates as $templateName => $template) { if ($template === null) { if (empty($checkCommands[$templateName])) { unset($this->defaultTemplates[$templateName]); } else { foreach ($checkCommands[$templateName] as $checkCommand) { unset($this->templates[$checkCommand][$templateName]); if (empty($this->templates[$checkCommand])) { unset($this->templates[$checkCommand]); } } } } else { if (empty($checkCommands[$templateName])) { $this->defaultTemplates[$templateName] = $template; } else { foreach ($checkCommands[$templateName] as $checkCommand) { $this->templates[$checkCommand][$templateName] = $template; } } } } return $this; } /** * Get all loaded templates for the given check command by their names * * @param string $checkCommand * * @return Template[] */ public function getTemplates($checkCommand) { return isset($this->templates[$checkCommand]) ? $this->templates[$checkCommand] : []; } /** * Get all loaded templates for all check commands * * @return Template[][] */ public function getAllTemplates() { return $this->templates; } /** * Get all loaded default templates by their names * * @return Template[] */ public function getDefaultTemplates() { return $this->defaultTemplates; } } icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/000077500000000000000000000000001516321226600244215ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Icingadb/000077500000000000000000000000001516321226600261215ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Icingadb/HostDetailExtension.php000066400000000000000000000031601516321226600325670ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\ProvidedHook\Icingadb; use Icinga\Application\Icinga; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Icingadb\Hook\HostDetailExtensionHook; use Icinga\Module\Icingadb\Model\Host; use ipl\Html\Html; use ipl\Html\HtmlString; use ipl\Html\ValidHtml; class HostDetailExtension extends HostDetailExtensionHook { use TimeRangePickerTrait; public function getHtmlForObject(Host $host): ValidHtml { if (Icinga::app()->getRequest()->getUrl()->getParam('graph_debug')) { IPT::enable(); } $graphs = (string) Graphs::forIcingadbObject($host) ->setWidth('440') ->setHeight('220') ->setClasses(['object-detail-view']) ->setPreloadDummy() ->setShowNoGraphsFound(false) ->handleRequest(); if (! empty($graphs)) { $this->handleTimeRangePickerRequest(); $header = Html::tag('h2', [], 'Graphs'); $timepicker = HtmlString::create($this->renderTimeRangePicker(Icinga::app()->getViewRenderer()->view)); $graphColorRegistry = Html::tag('div', ['class' => 'graphite-graph-color-registry']); $graphs = HtmlString::create($graphs); return HtmlString::create($header . $timepicker . $graphColorRegistry . $graphs); } return HtmlString::create(''); } } icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Icingadb/IcingadbSupport.php000066400000000000000000000004331516321226600317270ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\ProvidedHook\Icingadb; use Icinga\Module\Icingadb\Hook\IcingadbSupportHook; class IcingadbSupport extends IcingadbSupportHook { } icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Icingadb/ServiceDetailExtension.php000066400000000000000000000032051516321226600332520ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\ProvidedHook\Icingadb; use Icinga\Application\Icinga; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Icingadb\Hook\ServiceDetailExtensionHook; use Icinga\Module\Icingadb\Model\Service; use ipl\Html\Html; use ipl\Html\HtmlString; use ipl\Html\ValidHtml; class ServiceDetailExtension extends ServiceDetailExtensionHook { use TimeRangePickerTrait; public function getHtmlForObject(Service $service): ValidHtml { if (Icinga::app()->getRequest()->getUrl()->getParam('graph_debug')) { IPT::enable(); } $graphs = (string) Graphs::forIcingadbObject($service) ->setWidth('440') ->setHeight('220') ->setClasses(['object-detail-view']) ->setPreloadDummy() ->setShowNoGraphsFound(false) ->handleRequest(); if (! empty($graphs)) { $this->handleTimeRangePickerRequest(); $header = Html::tag('h2', [], 'Graphs'); $timepicker = HtmlString::create($this->renderTimeRangePicker(Icinga::app()->getViewRenderer()->view)); $graphColorRegistry = Html::tag('div', ['class' => 'graphite-graph-color-registry']); $graphs = HtmlString::create($graphs); return HtmlString::create($header . $timepicker . $graphColorRegistry . $graphs); } return HtmlString::create(''); } } icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Monitoring/000077500000000000000000000000001516321226600265465ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/ProvidedHook/Monitoring/DetailviewExtension.php000066400000000000000000000025601516321226600332540ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\ProvidedHook\Monitoring; use Icinga\Application\Icinga; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Web\Controller\TimeRangePickerTrait; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Monitoring\Hook\DetailviewExtensionHook; use Icinga\Module\Monitoring\Object\MonitoredObject; class DetailviewExtension extends DetailviewExtensionHook { use TimeRangePickerTrait; public function getHtmlForObject(MonitoredObject $object) { if (Icinga::app()->getRequest()->getUrl()->getParam('graph_debug')) { IPT::enable(); } $graphs = (string) Graphs::forMonitoredObject($object) ->setWidth('440') ->setHeight('220') ->setClasses(['object-detail-view']) ->setPreloadDummy() ->setShowNoGraphsFound(false) ->handleRequest(); if ($graphs !== '') { $this->handleTimeRangePickerRequest(); return '

' . mt('graphite', 'Graphs') . '

' . $this->renderTimeRangePicker($this->getView()) . '
' . $graphs; } return ''; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Util/000077500000000000000000000000001516321226600227415ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Util/IcingadbUtils.php000066400000000000000000000017051516321226600261760ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Util; use Icinga\Module\Icingadb\Common\Auth; use Icinga\Module\Icingadb\Common\Database; use Icinga\Module\Icingadb\Common\Macros; /** * Class for initialising icingadb utils */ class IcingadbUtils { use Macros; use Database; use Auth; protected static $instance; /** * @see getInstance() */ private function __construct() { } /** * Get the IcingadbUtils instance * * @return IcingadbUtils */ public static function getInstance(): IcingadbUtils { if (self::$instance === null) { self::$instance = new self(); } return static::$instance; } /** * Prevent the instance from being cloned (which would create a second instance of it) */ private function __clone() { } } icingaweb2-module-graphite-1.3.0/library/Graphite/Util/InternalProcessTracker.php000066400000000000000000000051201516321226600300770ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Util; use Icinga\Authentication\Auth; use Icinga\Security\SecurityException; /** * A record about what happened during a specific action */ class InternalProcessTracker { /** * Whether to record anything * * @var bool */ private static $enabled = false; /** * How many '+'es to prepend to each new record * * @var int */ private static $indentation = 1; /** * The recorded happenings * * @var string[] */ private static $records = []; /** * Get whether recording is enabled * * @return bool */ public static function enabled() { return self::$enabled; } /** * Enable recording * * @throws SecurityException */ public static function enable() { if (! Auth::getInstance()->hasPermission('graphite/debug')) { throw new SecurityException('No permission for graphite/debug'); } self::$enabled = true; } /** * Introduce a "sub-process" */ public static function indent() { if (self::$enabled) { ++self::$indentation; } } /** * Record a happening * * Behaves like {@link sprintf()} if additional arguments given, but {@link var_export()}s the arguments first * (so always use %s instead of e.g. %d). * * @param string $format */ public static function recordf($format) { if (self::$enabled) { if (func_num_args() > 1) { $args = []; foreach (array_slice(func_get_args(), 1) as $arg) { $args[] = var_export($arg, true); } $format = vsprintf($format, $args); } self::$records[] = str_repeat('+', self::$indentation) . " $format"; } } /** * Terminate a "sub-process" */ public static function unindent() { if (self::$enabled) { --self::$indentation; } } /** * Dump everything recorded as plain text * * @return string */ public static function dump() { return implode("\n", self::$records); } /** * Reset records */ public static function clear() { if (self::$enabled) { self::$indentation = 1; self::$records = []; } } final private function __construct() { } } icingaweb2-module-graphite-1.3.0/library/Graphite/Util/MacroTemplate.php000066400000000000000000000142251516321226600262130ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Util; use InvalidArgumentException; /** * A macro-based template for strings */ class MacroTemplate { /** * Macros' start and end character * * @var string */ protected $macroCharacter; /** * The parsed template * * @var string[] */ protected $template; /** * Regex for reverse resolving patterns * * @var string */ protected $reverseResolvePattern; /** * Wildcards * * @var string[] */ protected $wildCards; /** * The original raw template * * @var string */ protected $orgTemplate; /** * Constructor * * @param string $template The raw template * @param string $macroCharacter Macros' start and end character */ public function __construct($template, $macroCharacter = '$') { $this->orgTemplate = $template; $this->macroCharacter = $macroCharacter; $this->template = explode($macroCharacter, $template); foreach ($this->template as $key => $value) { if (preg_match('/([^:]+):(.+)/', $value, $match)) { $wildCardKey = $match[1]; $this->template[$key] = $wildCardKey; $this->wildCards[$wildCardKey] = $match[2]; } } if (! (count($this->template) % 2)) { throw new InvalidArgumentException( 'template contains odd number of ' . var_export($macroCharacter, true) . 's: ' . var_export($template, true) ); } } /** * Return a string based on this template with the macros resolved from the given variables * * @param string[] $variables * @param string $default The default value for missing variables. * By default the macro just isn't replaced. * * @return string */ public function resolve(array $variables, $default = null) { $macro = false; $result = []; // kind of string builder foreach ($this->template as $part) { if ($macro) { if (isset($variables[$part])) { $result[] = $variables[$part]; } elseif ($part === '') { $result[] = $this->macroCharacter; } elseif ($default === null) { $result[] = $this->macroCharacter; $result[] = $part; // add wildcards to result before they are // overwritten from Template::getFullCurves() if (isset($this->wildCards[$part])) { $result[] = ':' . $this->wildCards[$part]; } $result[] = $this->macroCharacter; } else { if (isset($this->wildCards[$part])) { $result[] = $this->wildCards[$part]; } else { $result[] = $default; } } } else { $result[] = $part; } $macro = ! $macro; } return implode($result); } /** * Try to reverse-resolve the given string * * @param string $resolved A result of {@link resolve()} * * @return string[]|false Variables as passed to {@link resolve()} if successful */ public function reverseResolve($resolved) { $matches = []; if (! preg_match($this->getReverseResolvePattern(), $resolved, $matches)) { return false; } $macro = false; $macros = []; $currentCapturedSubPatternIndex = 0; foreach ($this->template as $part) { if ($macro && ! isset($macros[$part])) { $macros[$part] = ++$currentCapturedSubPatternIndex; } $macro = ! $macro; } $macros = array_flip($macros); $result = []; foreach ($matches as $index => $match) { if ($index > 0) { $result[$macros[$index]] = $match; } } return $result; } /** * Return the raw template string this instance was constructed from * * @return string */ public function __toString() { return $this->orgTemplate; } /** * Return the macros of this template * * @return string[] */ public function getMacros() { $macro = false; $macros = []; foreach ($this->template as $part) { if ($macro) { $macros[$part] = null; } $macro = ! $macro; } unset($macros['']); return array_keys($macros); } /** * Get macros' start and end character * * @return string */ public function getMacroCharacter() { return $this->macroCharacter; } /** * Get {@link reverseResolvePattern} * * @return string */ protected function getReverseResolvePattern() { if ($this->reverseResolvePattern === null) { $result = ['/\A']; // kind of string builder $macro = false; $macros = []; $currentCapturedSubPatternIndex = 0; foreach ($this->template as $part) { if ($macro) { if (isset($macros[$part])) { $result[] = '\g{'; $result[] = $macros[$part]; $result[] = '}'; } else { $macros[$part] = ++$currentCapturedSubPatternIndex; $result[] = '(.*)'; } } else { $result[] = preg_quote($part, '/'); } $macro = ! $macro; } $result[] = '\z/s'; $this->reverseResolvePattern = implode($result); } return $this->reverseResolvePattern; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Util/TimeRangePickerTools.php000066400000000000000000000060231516321226600275050ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Util; use Icinga\Application\Config; use Icinga\Exception\ConfigurationError; use Icinga\Web\Url; use Icinga\Web\UrlParams; final class TimeRangePickerTools { /** * @return string */ public static function getRelativeRangeParameter() { return 'graph_range'; } /** * @return string[] */ public static function getAbsoluteRangeParameters() { return ['start' => 'graph_start', 'end' => 'graph_end']; } /** * @return string[] */ public static function getAllRangeParameters() { return array_values(array_merge([static::getRelativeRangeParameter()], static::getAbsoluteRangeParameters())); } /** * Copy {@link getAllRangeParameters()} from one {@link UrlParams} instance to another * * @param UrlParams|null $copy Defaults to a new instance * @param UrlParams|null $origin Defaults to the current request's params * * @return UrlParams The copy */ public static function copyAllRangeParameters(?UrlParams $copy = null, ?UrlParams $origin = null) { if ($origin === null) { $origin = Url::fromRequest()->getParams(); } if ($copy === null) { $copy = new UrlParams(); } foreach (self::getAllRangeParameters() as $param) { $value = $origin->get($param); if ($value !== null) { $copy->set($param, $value); } } return $copy; } /** * Extract the relative time range (if any) from the given URL parameters * * @param UrlParams $params * * @return bool|int|null */ public static function getRelativeSeconds(UrlParams $params) { $seconds = $params->get(self::getRelativeRangeParameter()); if ($seconds === null) { return null; } return preg_match('/^(?:0|[1-9]\d*)$/', $seconds) ? (int) $seconds : false; } /** * Get the default relative time range for graphs * * @return int * * @throws ConfigurationError */ public static function getDefaultRelativeTimeRange() { $rangeFactors = [ 'minutes' => 60, 'hours' => 3600, 'days' => 86400, 'weeks' => 604800, 'months' => 2592000, 'years' => 31557600 ]; $config = Config::module('graphite'); $unit = $config->get('ui', 'default_time_range_unit', 'hours'); if (! isset($rangeFactors[$unit])) { throw new ConfigurationError( 'Bad ui.default_time_range_unit %s in file %s', var_export($unit, true), var_export($config->getConfigFile(), true) ); } return (int) $config->get('ui', 'default_time_range', 1) * $rangeFactors[$unit]; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/000077500000000000000000000000001516321226600225415ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Controller/000077500000000000000000000000001516321226600246645ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Controller/IcingadbGraphiteController.php000066400000000000000000000031361516321226600326300ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Controller; use Icinga\Application\Modules\Module; use Icinga\Module\Graphite\ProvidedHook\Icingadb\IcingadbSupport; use Icinga\Module\Icingadb\Common\Auth; use Icinga\Module\Icingadb\Common\Database; use Icinga\Module\Icingadb\Common\SearchControls; use ipl\Orm\Query; use ipl\Stdlib\Contract\Paginatable; use ipl\Web\Compat\CompatController; use ipl\Web\Control\LimitControl; use ipl\Web\Control\PaginationControl; use ipl\Web\Control\SortControl; use ipl\Web\Filter\QueryString; use ipl\Stdlib\Filter; use ipl\Web\Url; class IcingadbGraphiteController extends CompatController { use Auth; use Database; use SearchControls; /** @var bool Whether to use icingadb as the backend */ protected $useIcingadbAsBackend; /** @var string[] Preserved graph parameters */ protected $preservedParams = ['graphs_limit', 'graph_range', 'graph_start', 'graph_end', 'legacyParams', 'format']; /** @var Filter\Rule Filter from query string parameters */ private $filter; protected function moduleInit() { $this->useIcingadbAsBackend = Module::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend(); } /** * Get the filter created from query string parameters * * @return Filter\Rule */ public function getFilter(): Filter\Rule { if ($this->filter === null) { $this->filter = QueryString::parse((string) $this->params); } return $this->filter; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Controller/MonitoringAwareController.php000066400000000000000000000140201516321226600325430ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Controller; use ArrayIterator; use Icinga\Application\Modules\Module; use Icinga\Data\Filter\Filter; use Icinga\Data\Filterable; use Icinga\Exception\ConfigurationError; use Icinga\Exception\QueryException; use Icinga\Module\Graphite\ProvidedHook\Icingadb\IcingadbSupport; use Icinga\Module\Monitoring\Backend\MonitoringBackend; use Icinga\Module\Monitoring\Data\CustomvarProtectionIterator; use Icinga\Module\Monitoring\DataView\DataView; use Icinga\Util\Json; use Icinga\File\Csv; use Icinga\Web\Controller; use Icinga\Web\Url; abstract class MonitoringAwareController extends Controller { /** @var bool Whether to use icingadb as the backend */ protected $useIcingadbAsBackend = false; /** @var MonitoringBackend */ protected $backend; /** * Restrict the given monitored object query for the currently authenticated user * * @param DataView $dataView * * @return DataView The given data view */ protected function applyMonitoringRestriction(DataView $dataView) { $this->applyRestriction('monitoring/filter/objects', $dataView); return $dataView; } protected function moduleInit() { if (Module::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend()) { $this->useIcingadbAsBackend = true; return; } $this->backend = MonitoringBackend::instance($this->_getParam('backend')); $this->view->url = Url::fromRequest(); } protected function handleFormatRequest($query) { $desiredContentType = $this->getRequest()->getHeader('Accept'); if ($desiredContentType === 'application/json') { $desiredFormat = 'json'; } elseif ($desiredContentType === 'text/csv') { $desiredFormat = 'csv'; } else { $desiredFormat = strtolower($this->params->get('format', 'html')); } if ($desiredFormat !== 'html' && ! $this->params->has('limit')) { $query->limit(); // Resets any default limit and offset } switch ($desiredFormat) { case 'sql': echo '
'
                    . htmlspecialchars(wordwrap($query->dump()))
                    . '
'; exit; case 'json': $response = $this->getResponse(); $response ->setHeader('Content-Type', 'application/json') ->setHeader('Cache-Control', 'no-store') ->setHeader( 'Content-Disposition', 'inline; filename=' . $this->getRequest()->getActionName() . '.json' ) ->appendBody( Json::sanitize( iterator_to_array( new CustomvarProtectionIterator( new ArrayIterator($query->fetchAll()) ) ) ) ) ->sendResponse(); exit; case 'csv': $response = $this->getResponse(); $response ->setHeader('Content-Type', 'text/csv') ->setHeader('Cache-Control', 'no-store') ->setHeader( 'Content-Disposition', 'attachment; filename=' . $this->getRequest()->getActionName() . '.csv' ) ->appendBody((string) Csv::fromQuery(new CustomvarProtectionIterator($query))) ->sendResponse(); exit; } } /** * Apply a restriction of the authenticated on the given filterable * * @param string $name Name of the restriction * @param Filterable $filterable Filterable to restrict * * @return Filterable The filterable having the restriction applied */ protected function applyRestriction($name, Filterable $filterable) { $filterable->applyFilter($this->getRestriction($name)); return $filterable; } /** * Get a restriction of the authenticated * * @param string $name Name of the restriction * * @return Filter Filter object * @throws ConfigurationError If the restriction contains invalid filter columns */ protected function getRestriction($name) { $restriction = Filter::matchAny(); $restriction->setAllowedFilterColumns(array( 'host_name', 'hostgroup_name', 'instance_name', 'service_description', 'servicegroup_name', function ($c) { return preg_match('/^_(?:host|service)_/i', $c); } )); foreach ($this->getRestrictions($name) as $filter) { if ($filter === '*') { return Filter::matchAll(); } try { $restriction->addFilter(Filter::fromQueryString($filter)); } catch (QueryException $e) { throw new ConfigurationError( $this->translate( 'Cannot apply restriction %s using the filter %s. You can only use the following columns: %s' ), $name, $filter, implode(', ', array( 'instance_name', 'host_name', 'hostgroup_name', 'service_description', 'servicegroup_name', '_(host|service)_' )), $e ); } } if ($restriction->isEmpty()) { return Filter::matchAll(); } return $restriction; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Controller/TimeRangePickerTrait.php000066400000000000000000000063101516321226600314120ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Controller; use Icinga\Module\Graphite\Forms\TimeRangePicker\CommonForm; use Icinga\Module\Graphite\Forms\TimeRangePicker\CustomForm; use Icinga\Web\Request; use Icinga\Web\Url; use Icinga\Web\View; trait TimeRangePickerTrait { /** * @var CommonForm */ protected $timeRangePickerCommonForm; /** * @var CustomForm */ protected $timeRangePickerCustomForm; /** * Process the given request using the forms * * @param ?Request $request The request to be processed * * @return Request The request supposed to be processed */ protected function handleTimeRangePickerRequest(?Request $request = null) { $this->getTimeRangePickerCommonForm()->handleRequest($request); return $this->getTimeRangePickerCustomForm()->handleRequest($request); } /** * Render all needed forms and links * * @param View $view * * @return string */ protected function renderTimeRangePicker(View $view) { $url = Url::fromRequest()->getAbsoluteUrl(); return '
' . $this->getTimeRangePickerCommonForm() . '
' . $view->qlink(null, '#', null, [ 'title' => $view->translate('Specify custom time range'), 'class' => 'button-link flyover-toggle', 'icon' => 'service' ]) . '
' . $this->getTimeRangePickerCustomForm() . '
' . '
' . '
'; } /** * Get {@link timeRangePickerCommonForm} * * @return CommonForm */ public function getTimeRangePickerCommonForm() { if ($this->timeRangePickerCommonForm === null) { $this->timeRangePickerCommonForm = new CommonForm(); } return $this->timeRangePickerCommonForm; } /** * Set {@link timeRangePickerCommonForm} * * @param CommonForm $timeRangePickerCommonForm * * @return $this */ public function setTimeRangePickerCommonForm(CommonForm $timeRangePickerCommonForm) { $this->timeRangePickerCommonForm = $timeRangePickerCommonForm; return $this; } /** * Get {@link timeRangePickerCustomForm} * * @return CustomForm */ public function getTimeRangePickerCustomForm() { if ($this->timeRangePickerCustomForm === null) { $this->timeRangePickerCustomForm = new CustomForm(); } return $this->timeRangePickerCustomForm; } /** * Set {@link timeRangePickerCustomForm} * * @param CustomForm $timeRangePickerCustomForm * * @return $this */ public function setTimeRangePickerCustomForm(CustomForm $timeRangePickerCustomForm) { $this->timeRangePickerCustomForm = $timeRangePickerCustomForm; return $this; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/FakeSchemeRequest.php000066400000000000000000000007321516321226600266200ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web; use Icinga\Web\Request; /** * Rationale: * * {@link Url::fromPath()} doesn't preserve URLs which seem to be internal as they are. */ class FakeSchemeRequest extends Request { public function getScheme() { return 'a random url scheme which always differs from the current request\'s one'; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/000077500000000000000000000000001516321226600234445ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Decorator/000077500000000000000000000000001516321226600253665ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Decorator/Proxy.php000066400000000000000000000020751516321226600272240ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Form\Decorator; use Zend_Form_Decorator_Abstract; use Zend_Form_Decorator_Interface; /** * Wrap a decorator and use it only for rendering */ class Proxy extends Zend_Form_Decorator_Abstract { /** * The actual decorator being proxied * * @var Zend_Form_Decorator_Interface */ protected $actualDecorator; public function render($content) { return $this->actualDecorator->render($content); } /** * Get {@link actualDecorator} * * @return Zend_Form_Decorator_Interface */ public function getActualDecorator() { return $this->actualDecorator; } /** * Set {@link actualDecorator} * * @param Zend_Form_Decorator_Interface $actualDecorator * * @return $this */ public function setActualDecorator($actualDecorator) { $this->actualDecorator = $actualDecorator; return $this; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Validator/000077500000000000000000000000001516321226600253715ustar00rootroot00000000000000CustomErrorMessagesValidator.php000066400000000000000000000020271516321226600336460ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Validator // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Form\Validator; use Zend_Validate_Abstract; /** * Provides an easy way to implement validators with custom error messages * * TODO(ak): move to framework(?) */ abstract class CustomErrorMessagesValidator extends Zend_Validate_Abstract { /** * Constructor */ public function __construct() { $this->_messageTemplates = ['CUSTOM_ERROR' => '']; } public function isValid($value) { $errorMessage = $this->validate($value); if ($errorMessage === null) { return true; } $this->setMessage($errorMessage, 'CUSTOM_ERROR'); $this->_error('CUSTOM_ERROR'); return false; } /** * Validate the given value and return an error message if it's invalid * * @param string $value * * @return string|null */ abstract protected function validate($value); } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Validator/HttpUserValidator.php000066400000000000000000000013431516321226600315270ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Form\Validator; use Zend_Validate_Abstract; /** * Validates http basic authn user names * * TODO(ak): move to Icinga Web 2 */ class HttpUserValidator extends Zend_Validate_Abstract { /** * Constructor */ public function __construct() { $this->_messageTemplates = ['HAS_COLON' => mt('graphite', 'The username must not contain colons.')]; } public function isValid($value) { $hasColon = false !== strpos($value, ':'); if ($hasColon) { $this->_error('HAS_COLON'); } return ! $hasColon; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Form/Validator/MacroTemplateValidator.php000066400000000000000000000010721516321226600325050ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Form\Validator; use Icinga\Module\Graphite\Util\MacroTemplate; use InvalidArgumentException; /** * Validates Icinga-style macro templates */ class MacroTemplateValidator extends CustomErrorMessagesValidator { protected function validate($value) { try { new MacroTemplate($value); } catch (InvalidArgumentException $e) { return $e->getMessage(); } } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/000077500000000000000000000000001516321226600237645ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/GraphImage.php000066400000000000000000000113011516321226600264750ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget; use Icinga\Module\Graphite\Graphing\Chart; use Icinga\Web\Url; use Icinga\Web\UrlParams; use Icinga\Web\Widget\AbstractWidget; use RuntimeException; class GraphImage extends AbstractWidget { /** * The chart to be rendered * * @var Chart */ protected $chart; /** * The rendered PNG image * * @var string|null */ protected $rendered; /** * Constructor * * @param Chart $chart The chart to be rendered */ public function __construct(Chart $chart) { $this->chart = $chart; } /** * Render the graph lazily * * @return string */ public function render() { if ($this->rendered === null) { $now = time(); $from = (int) $this->chart->getFrom(); if ($from < 0) { $from += $now; } $until = (string) $this->chart->getUntil(); if ($until === '') { $until = $now; } else { $until = (int) $until; if ($until < 0) { $until += $now; } } $variables = $this->chart->getMetricVariables(); $template = $this->chart->getTemplate(); $graphiteWebClient = $this->chart->getGraphiteWebClient(); $params = (new UrlParams())->addValues([ 'from' => $from, 'until' => $until, 'bgcolor' => $this->chart->getBackgroundColor() ?? 'black', 'fgcolor' => $this->chart->getForegroundColor() ?? 'white', 'majorGridLineColor' => $this->chart->getMajorGridLineColor() ?? '0000003F', 'minorGridLineColor' => $this->chart->getMinorGridLineColor() ?? 'black', 'width' => $this->chart->getWidth(), 'height' => $this->chart->getHeight(), 'hideLegend' => (string) ! $this->chart->getShowLegend(), 'tz' => date_default_timezone_get(), '_salt' => "$now.000", 'vTitle' => 'Percent', 'lineMode' => 'connected', 'drawNullAsZero' => 'false', 'graphType' => 'line', '_ext' => 'whatever.svg' ]); foreach ($template->getUrlParams() as $key => $value) { $params->set($key, $value->resolve($variables)); } $metrics = $this->chart->getMetrics(); $allVars = []; foreach ($template->getCurves() as $curveName => $curve) { if (! isset($metrics[$curveName])) { continue; } $vars = $curve[0]->reverseResolve($metrics[$curveName]); if ($vars !== false) { $allVars = array_merge($allVars, $vars); } } foreach ($metrics as $curveName => $metric) { $allVars['metric'] = $metric; $params->add('target', $template->getCurves()[$curveName][1]->resolve($allVars)); } $url = Url::fromPath('/render')->setParams($params); $headers = [ 'Accept-language' => 'en', 'Content-type' => 'application/x-www-form-urlencoded' ]; for (;;) { try { $this->rendered = $graphiteWebClient->request($url, 'GET', $headers); } catch (RuntimeException $e) { if (preg_match('/\b500\b/', $e->getMessage())) { // A 500 Internal Server Error, probably because of // a division by zero because of a too low time range to render. $until = (int) $url->getParam('until'); $diff = $until - (int) $url->getParam('from'); // Try to render a higher time range, but give up // once our default (1h) has been reached (non successfully). if ($diff < 3600) { $url->setParam('from', sprintf('%F', ($until - $diff * 2))); continue; } } throw $e; } break; } } return $this->rendered; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs.php000066400000000000000000000502631516321226600257270ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget; use Icinga\Application\Config; use Icinga\Application\Icinga; use Icinga\Authentication\Auth; use Icinga\Exception\ConfigurationError; use Icinga\Module\Graphite\Graphing\Chart; use Icinga\Module\Graphite\Graphing\GraphingTrait; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Util\InternalProcessTracker as IPT; use Icinga\Module\Graphite\Util\TimeRangePickerTools; use Icinga\Module\Graphite\Web\Widget\Graphs\Host as HostGraphs; use Icinga\Module\Graphite\Web\Widget\Graphs\Service as ServiceGraphs; use Icinga\Module\Monitoring\Object\Host; use Icinga\Module\Monitoring\Object\MonitoredObject; use Icinga\Module\Monitoring\Object\Service; use Icinga\Web\Request; use Icinga\Web\Url; use Icinga\Web\View; use Icinga\Web\Widget\AbstractWidget; use ipl\Orm\Model; use Icinga\Module\Icingadb\Model\Host as IcingadbHost; use Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb\IcingadbHost as IcingadbHostGraphs; use Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb\IcingadbService as IcingadbServiceGraphs; abstract class Graphs extends AbstractWidget { use GraphingTrait; /** * The Icinga custom variable with the "real" check command (if any) of objects we display graphs for * * @var string */ protected static $obscuredCheckCommandCustomVar; /** * The type of the object to render the graphs for * * @var string */ protected $objectType; /** * The object to render the graphs for * * @var MonitoredObject|Model */ protected $object; /** * Graph image width * * @var string */ protected $width = '350'; /** * Graph image height * * @var string */ protected $height = '200'; /** * Graph range start * * @var string */ protected $start; /** * Graph range end * * @var string */ protected $end; /** * Whether to render as compact as possible * * @var bool */ protected $compact = false; /** * The check command of the monitored object we display graphs for * * @var string */ protected $checkCommand; /** * The "real" check command (if any) of the monitored object we display graphs for * * E.g. the command executed remotely via check_by_ssh * * @var string|null */ protected $obscuredCheckCommand; /** * Additional CSS classes for the
s around the images * * @var string[] */ protected $classes = []; /** * Whether to serve a transparent dummy image first and let the JS code load the actual graph * * @var bool */ protected $preloadDummy = false; /** * Whether to render the graphs inline * * @var bool */ protected $renderInline; /** * Whether to explicitly display that no graphs were found * * @var bool|null */ protected $showNoGraphsFound; /** * Factory, based on the given monitoring object * * @param MonitoredObject $object * * @return ?static */ public static function forMonitoredObject(MonitoredObject $object) { switch ($object->getType()) { case 'host': /** @var Host $object */ return new HostGraphs($object); case 'service': /** @var Service $object */ return new ServiceGraphs($object); } } /** * Factory, based on the given icingadb object * * @param Model $object * * @return static */ public static function forIcingadbObject(Model $object) { if ($object instanceof IcingadbHost) { return new IcingadbHostGraphs($object); } return new IcingadbServiceGraphs($object); } /** * Get the Icinga custom variable with the "real" check command (if any) of monitored objects we display graphs for * * @return string */ public static function getObscuredCheckCommandCustomVar() { if (static::$obscuredCheckCommandCustomVar === null) { static::$obscuredCheckCommandCustomVar = Config::module('graphite') ->get('icinga', 'customvar_obscured_check_command', 'check_command'); } return static::$obscuredCheckCommandCustomVar; } /** * Constructor * * @param MonitoredObject|Model $object The object to render the graphs for */ public function __construct($object) { $this->object = $object; $this->renderInline = Url::fromRequest()->getParam('format') === 'pdf'; if ($object instanceof Model) { $this->checkCommand = $object->checkcommand_name; $this->obscuredCheckCommand = $object->vars[Graphs::getObscuredCheckCommandCustomVar()] ?? null; } else { $this->checkCommand = $object->{"{$this->objectType}_check_command"}; $this->obscuredCheckCommand = $object->{ "_{$this->objectType}_" . Graphs::getObscuredCheckCommandCustomVar() }; } } /** * Process the given request using this widget * * @param ?Request $request The request to be processed * * @return $this */ public function handleRequest(?Request $request = null) { if ($request === null) { $request = Icinga::app()->getRequest(); } $params = $request->getUrl()->getParams(); list($this->start, $this->end) = $this->getRangeFromTimeRangePicker($request); $this->width = $params->shift('width', $this->width); $this->height = $params->shift('height', $this->height); return $this; } /** * Render the graphs list * * @return string */ protected function getGraphsList() { $result = []; // kind of string builder $imageBaseUrl = $this->getImageBaseUrl(); $allTemplates = $this->getAllTemplates(); $actualCheckCommand = $this->obscuredCheckCommand === null ? $this->checkCommand : $this->obscuredCheckCommand; $concreteTemplates = $allTemplates->getTemplates($actualCheckCommand); $excludedMetrics = []; foreach ($concreteTemplates as $concreteTemplate) { foreach ($concreteTemplate->getCurves() as $curve) { $excludedMetrics[] = $curve[0]; } } IPT::recordf("Icinga check command: %s", $this->checkCommand); IPT::recordf("Obscured check command: %s", $this->obscuredCheckCommand); foreach ( [ ['template', $concreteTemplates, []], ['default_template', $allTemplates->getDefaultTemplates(), $excludedMetrics], ] as $templateSet ) { list($urlParam, $templates, $excludeMetrics) = $templateSet; if ($urlParam === 'template') { IPT::recordf('Applying templates for check command %s', $actualCheckCommand); } else { IPT::recordf('Applying default templates, excluding previously used metrics'); } IPT::indent(); foreach ($templates as $templateName => $template) { if ($this->designedForObjectType($template)) { IPT::recordf('Applying template %s', $templateName); IPT::indent(); $charts = $template->getCharts( static::getMetricsDataSource(), $this->object, [], $excludeMetrics ); if (! empty($charts)) { $currentGraphs = []; foreach ($charts as $chart) { /** @var Chart $chart */ $metricVariables = $chart->getMetricVariables(); $bestIntersect = -1; $bestPos = count($result); foreach ($result as $graphPos => & $graph) { $currentIntersect = count(array_intersect_assoc($graph[1], $metricVariables)); if ($currentIntersect >= $bestIntersect) { $bestIntersect = $currentIntersect; $bestPos = $graphPos + 1; } } unset($graph); $urlParams = $template->getUrlParams(); if (array_key_exists("height", $urlParams)) { $actheight = $urlParams["height"]->resolve(['height']); if ($actheight < $this->height) { $actheight = $this->height; } } else { $actheight = $this->height; } $actwidth = $this->width; $explicitWidth = false; if (array_key_exists("width", $urlParams)) { $actwidth = $urlParams["width"]->resolve(['width']); $explicitWidth = $actwidth; } if ($this->renderInline) { $chart->setFrom($this->start) ->setUntil($this->end) ->setWidth((int) $actwidth) ->setHeight((int) $actheight) ->setBackgroundColor('white') ->setForegroundColor('black') ->setMajorGridLineColor('grey') ->setMinorGridLineColor('white') ->setShowLegend(! $this->compact); $img = new InlineGraphImage($chart); } else { $imageUrl = $this->filterImageUrl($imageBaseUrl->with($metricVariables)) ->setParam($urlParam, $templateName) ->setParam('start', $this->start) ->setParam('end', $this->end) ->setParam('width', $actwidth) ->setParam('height', $actheight); if (! $this->compact) { $imageUrl->setParam('legend', '1'); } if ($this->preloadDummy) { $src = 'data:image/png;base64,' // 1x1 dummy . 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRS' . 'TlMAQObYZgAAAApJREFUeAFjZAAAAAQAAhq+CAMAAAAASUVORK5CYII='; } else { $src = $imageUrl; } $img = '\"\"getRequest()->getUrl(); $limit = (int) $currentUrl->getParam('graphs_limit', 2); $total = count($result); if ($limit < 1) { $limit = -1; } if ($limit !== -1 && $total > $limit) { $result = array_slice($result, 0, $limit); if (! $this->compact) { /** @var View $view */ $view = $this->view(); $url = $this->getGraphsListBaseUrl(); TimeRangePickerTools::copyAllRangeParameters($url->getParams(), $currentUrl->getParams()); $result[] = "

{$view->qlink( sprintf($view->translate('Load all %d graphs'), $total), $url->setParam('graphs_limit', '-1'), null, ['class' => 'action-link'] )}

"; } } $classes = $this->classes; $classes[] = 'images'; array_unshift($result, '
'); $result[] = '
'; } if ($this->renderInline) { foreach ($result as $html) { if ($html instanceof InlineGraphImage) { // Errors should occur now or not at all $html->render(); } } } return implode($result); } public function render() { IPT::clear(); try { $result = $this->getGraphsList(); } catch (ConfigurationError $e) { $view = $this->view(); return "

{$view->escape($e->getMessage())}

" . '

' . vsprintf( $view->escape($view->translate('Please %scorrect%s the configuration of the Graphite module.')), Auth::getInstance()->hasPermission('config/modules') ? explode( '$LINK_TEXT$', $view->qlink('$LINK_TEXT$', 'graphite/config/backend', null, ['class' => 'action-link']) ) : ['', ''] ) . '

'; } $view = $this->view(); if ($result === '' && $this->getShowNoGraphsFound()) { $result = "

{$view->escape($view->translate('No graphs found'))}

"; } if (IPT::enabled()) { $result .= "

{$view->escape($view->translate('Graphs assembling process record'))}

" . "
{$view->escape(IPT::dump())}
"; } return $result; } /** * Get time range parameters for Graphite from the URL * * @param Request $request The request to be used * * @return string[] */ protected function getRangeFromTimeRangePicker(Request $request) { $params = $request->getUrl()->getParams(); $relative = $params->get(TimeRangePickerTools::getRelativeRangeParameter()); if ($relative !== null) { return ["-$relative", null]; } $absolute = TimeRangePickerTools::getAbsoluteRangeParameters(); $start = $params->get($absolute['start']); return [ $start === null ? -TimeRangePickerTools::getDefaultRelativeTimeRange() : $start, $params->get($absolute['end']) ]; } /** * Return a identifier specifying the monitored object we display graphs for * * @return string */ abstract protected function getMonitoredObjectIdentifier(); /** * Get the base URL to a graph specifying just the monitored object kind * * @return Url */ abstract protected function getImageBaseUrl(); /** * Get the base URL to the monitored object's graphs list * * @return Url */ abstract protected function getGraphsListBaseUrl(); /** * Extend the {@link getImageBaseUrl()}'s result's parameters with the concrete monitored object * * @param Url $url The URL to extend * * @return Url The given URL */ abstract protected function filterImageUrl(Url $url); /** * Return whether the given template is designed for the type of the object we display graphs for * * @param Template $template * * @return bool */ abstract protected function designedForObjectType(Template $template); /** * Get {@link compact} * * @return bool */ public function getCompact() { return $this->compact; } /** * Set {@link compact} * * @param bool $compact * * @return $this */ public function setCompact($compact = true) { $this->compact = $compact; return $this; } /** * Get the graph image width * * @return string */ public function getWidth() { return $this->width; } /** * Set the graph image width * * @param string $width * * @return $this */ public function setWidth($width) { $this->width = $width; return $this; } /** * Get the graph image height * * @return string */ public function getHeight() { return $this->height; } /** * Set the graph image height * * @param string $height * * @return $this */ public function setHeight($height) { $this->height = $height; return $this; } /** * Get additional CSS classes for the
s around the images * * @return string[] */ public function getClasses() { return $this->classes; } /** * Set additional CSS classes for the
s around the images * * @param string[] $classes * * @return $this */ public function setClasses($classes) { $this->classes = $classes; return $this; } /** * Get whether to serve a transparent dummy image first and let the JS code load the actual graph * * @return bool */ public function getPreloadDummy() { return $this->preloadDummy; } /** * Set whether to serve a transparent dummy image first and let the JS code load the actual graph * * @param bool $preloadDummy * * @return $this */ public function setPreloadDummy($preloadDummy = true) { $this->preloadDummy = $preloadDummy; return $this; } /** * Get whether to render the graphs inline * * @return bool */ public function getRenderInline() { return $this->renderInline; } /** * Set whether to render the graphs inline * * @param bool $renderInline * * @return $this */ public function setRenderInline($renderInline = true) { $this->renderInline = $renderInline; return $this; } /** * Get whether to explicitly display that no graphs were found * * @return bool */ public function getShowNoGraphsFound() { if ($this->showNoGraphsFound === null) { $this->showNoGraphsFound = ! Config::module('graphite')->get('ui', 'disable_no_graphs_found'); } return $this->showNoGraphsFound; } /** * Set whether to explicitly display that no graphs were found * * @param bool $showNoGraphsFound * * @return $this */ public function setShowNoGraphsFound($showNoGraphsFound = true) { $this->showNoGraphsFound = $showNoGraphsFound; return $this; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/000077500000000000000000000000001516321226600252105ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/Host.php000066400000000000000000000024231516321226600266370ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Monitoring\Object\Host as MonitoredHost; use Icinga\Web\Url; class Host extends Graphs { protected $objectType = 'host'; /** * The host to render the graphs of * * @var MonitoredHost */ protected $object; protected function getImageBaseUrl() { return Url::fromPath('graphite/graph/host'); } protected function getGraphsListBaseUrl() { return Url::fromPath('graphite/list/hosts', ['host' => $this->object->getName()]); } protected function filterImageUrl(Url $url) { return $url->setParam('host.name', $this->object->getName()); } protected function getMonitoredObjectIdentifier() { return $this->object->getName(); } protected function designedForObjectType(Template $template) { foreach ($template->getCurves() as $curve) { if (in_array('host_name_template', $curve[0]->getMacros())) { return true; } } return false; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/Icingadb/000077500000000000000000000000001516321226600267105ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbHost.php000066400000000000000000000026541516321226600317660ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Web\Url; use Icinga\Module\Icingadb\Model\Host; class IcingadbHost extends Graphs { protected $objectType = 'host'; /** * The Icingadb host to render the graphs for * * @var Host */ protected $object; protected function getGraphsListBaseUrl() { return Url::fromPath('graphite/hosts', ['host.name' => $this->object->name]); } protected function filterImageUrl(Url $url) { return $url->setParam('host.name', $this->object->name); } public function createHostTitle() { return $this->object->name; } public function getObjectType() { return $this->objectType; } protected function getMonitoredObjectIdentifier() { return $this->object->name; } protected function getImageBaseUrl() { return Url::fromPath('graphite/graph/host'); } protected function designedForObjectType(Template $template) { foreach ($template->getCurves() as $curve) { if (in_array('host_name_template', $curve[0]->getMacros())) { return true; } } return false; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php000066400000000000000000000033541516321226600324470ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Web\Url; use Icinga\Module\Icingadb\Model\Service; class IcingadbService extends Graphs { protected $objectType = 'service'; /** * The icingadb service to render the graphs for * * @var Service */ protected $object; protected function getGraphsListBaseUrl() { return Url::fromPath( 'graphite/services', ['service.name' => $this->object->name, 'host.name' => $this->object->host->name] ); } protected function filterImageUrl(Url $url) { return $url ->setParam('host.name', $this->object->host->name) ->setParam('service.name', $this->object->name); } public function createHostTitle() { return $this->object->host->name; } public function createServiceTitle() { return ' : ' . $this->object->name; } public function getObjectType() { return $this->objectType; } protected function getMonitoredObjectIdentifier() { return $this->object->host->name . ':' . $this->object->name; } protected function getImageBaseUrl() { return Url::fromPath('graphite/graph/service'); } protected function designedforObjectType(Template $template) { foreach ($template->getCurves() as $curve) { if (in_array('service_name_template', $curve[0]->getMacros())) { return true; } } return false; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/Graphs/Service.php000066400000000000000000000030101516321226600273130ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Graphite\Graphing\Template; use Icinga\Module\Graphite\Web\Widget\Graphs; use Icinga\Module\Monitoring\Object\Service as MonitoredService; use Icinga\Web\Url; class Service extends Graphs { protected $objectType = 'service'; /** * The service to render the graphs for * * @var MonitoredService */ protected $object; protected function getImageBaseUrl() { return Url::fromPath('graphite/graph/service'); } protected function getGraphsListBaseUrl() { return Url::fromPath( 'graphite/list/services', ['host' => $this->object->getHost()->getName(), 'service' => $this->object->getName()] ); } protected function filterImageUrl(Url $url) { return $url ->setParam('host.name', $this->object->getHost()->getName()) ->setParam('service.name', $this->object->getName()); } protected function getMonitoredObjectIdentifier() { return $this->object->getHost()->getName() . ':' . $this->object->getName(); } protected function designedForObjectType(Template $template) { foreach ($template->getCurves() as $curve) { if (in_array('service_name_template', $curve[0]->getMacros())) { return true; } } return false; } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/IcingadbGraphs.php000066400000000000000000000054271516321226600273520ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget; use Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb\IcingadbHost; use Icinga\Module\Graphite\Web\Widget\Graphs\Icingadb\IcingadbService; use Icinga\Module\Icingadb\Common\Links; use Icinga\Module\Icingadb\Model\Host; use ipl\Html\BaseHtmlElement; use ipl\Html\Html; use ipl\Html\HtmlDocument; use ipl\Html\HtmlString; use ipl\Orm\ResultSet; use ipl\Stdlib\BaseFilter; use ipl\Web\Widget\EmptyState; use ipl\Web\Widget\Link; /** * Class for creating graphs of icingadb objects */ class IcingadbGraphs extends BaseHtmlElement { use BaseFilter; protected $defaultAttributes = ['class' => 'grid']; /** @var Iterable */ protected $objects; protected $tag = 'div'; /** * Create a new Graph item * * @param ResultSet $objects */ public function __construct(ResultSet $objects) { $this->objects = $objects; } protected function assemble() { if (! $this->objects->hasResult()) { $this->add(new EmptyState(t('No items found.'))); } foreach ($this->objects as $object) { $this->add($this->createGridItem($object)); } $document = new HtmlDocument(); $document->addHtml(Html::tag('div', ['class' => 'graphite-graph-color-registry']), $this); $this->prependWrapper($document); } protected function createGridItem($object) { if ($object instanceof Host) { $graph = new IcingadbHost($object); $hostObj = $object; } else { $graph = new IcingadbService($object); $hostObj = $object->host; } $hostUrl = Links::host($hostObj); $baseFilter = $this->getBaseFilter(); if ($baseFilter !== null) { $hostUrl->setFilter($baseFilter); } $hostLink = new Link( $graph->createHostTitle(), $hostUrl, ['data-base-target' => '_next'] ); $serviceLink = null; if ($graph->getObjectType() === 'service') { $serviceUrl = Links::service($object, $hostObj); if ($baseFilter !== null) { $serviceUrl->setFilter($baseFilter); } $serviceLink = new Link( $graph->createServiceTitle(), $serviceUrl, ['data-base-target' => '_next'] ); } $gridItem = Html::tag('div', ['class' => 'grid-item']); $header = Html::tag('h2'); $header->add([$hostLink, $serviceLink]); $gridItem->add($header); return $gridItem->add(HtmlString::create($graph->setPreloadDummy()->handleRequest())); } } icingaweb2-module-graphite-1.3.0/library/Graphite/Web/Widget/InlineGraphImage.php000066400000000000000000000020641516321226600276420ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later namespace Icinga\Module\Graphite\Web\Widget; use Icinga\Module\Graphite\Graphing\Chart; use Icinga\Web\Widget\AbstractWidget; class InlineGraphImage extends AbstractWidget { /** * The image to be rendered * * @var GraphImage */ protected $image; /** * The rendered * * @var string|null */ protected $rendered; /** * Constructor * * @param Chart $chart The chart to be rendered */ public function __construct(Chart $chart) { $this->image = new GraphImage($chart); } /** * Render the graph lazily * * @return string */ public function render() { if ($this->rendered === null) { $this->rendered = 'image->render()), 76)) . '">'; } return $this->rendered; } } icingaweb2-module-graphite-1.3.0/module.info000066400000000000000000000004611516321226600207600ustar00rootroot00000000000000Module: graphite Version: 1.3.0 Requires: Libraries: icinga-php-library (>=0.19.0), icinga-php-thirdparty (>=0.15.0) Modules: monitoring (>=2.12.5), icingadb (>=1.0.0) Description: Icinga Web Graphite Integration This module integrates an existing Graphite installation in your Icinga Web frontend. icingaweb2-module-graphite-1.3.0/phpstan-baseline-7x.neon000066400000000000000000000024531516321226600232730ustar00rootroot00000000000000parameters: ignoreErrors: - message: "#^Parameter \\#1 \\$str of function urldecode expects string, mixed given\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Parameter \\#1 \\$str of function urldecode expects string, mixed given\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Argument of an invalid type array\\\\|false supplied for foreach, only iterables are supported\\.$#" count: 1 path: library/Graphite/Util/MacroTemplate.php - message: "#^Cannot access offset int on non\\-empty\\-array\\\\|false\\.$#" count: 1 path: library/Graphite/Util/MacroTemplate.php - message: "#^Parameter \\#1 \\$var of function count expects array\\|Countable, array\\\\|false given\\.$#" count: 1 path: library/Graphite/Util/MacroTemplate.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Util\\\\MacroTemplate\\:\\:\\$template \\(array\\\\) does not accept array\\\\|false\\.$#" count: 1 path: library/Graphite/Util/MacroTemplate.php - message: "#^Parameter \\#1 \\$str of function strtolower expects string, mixed given\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php icingaweb2-module-graphite-1.3.0/phpstan-baseline-8x.neon000066400000000000000000000013241516321226600232700ustar00rootroot00000000000000parameters: ignoreErrors: - message: "#^Parameter \\#1 \\$string of function urldecode expects string, mixed given\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Parameter \\#1 \\$string of function urldecode expects string, mixed given\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Parameter \\#1 \\$separator of function explode expects non\\-empty\\-string, string given\\.$#" count: 1 path: library/Graphite/Util/MacroTemplate.php - message: "#^Parameter \\#1 \\$string of function strtolower expects string, mixed given\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php icingaweb2-module-graphite-1.3.0/phpstan-baseline-by-php-version.php000066400000000000000000000005121516321226600254410ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later $includes = []; if (PHP_VERSION_ID < 80000) { $includes[] = __DIR__ . '/phpstan-baseline-7x.neon'; } else { $includes[] = __DIR__ . '/phpstan-baseline-8x.neon'; } return [ 'includes' => $includes ]; icingaweb2-module-graphite-1.3.0/phpstan-baseline-standard.neon000066400000000000000000001001661516321226600245350ustar00rootroot00000000000000parameters: ignoreErrors: - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Clicommands\\\\Icinga2Command\\:\\:cartesianProduct\\(\\) has parameter \\$input with no value type specified in iterable type array\\.$#" count: 1 path: application/clicommands/Icinga2Command.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Clicommands\\\\Icinga2Command\\:\\:cartesianProduct\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: application/clicommands/Icinga2Command.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Clicommands\\\\Icinga2Command\\:\\:configAction\\(\\) has no return type specified\\.$#" count: 1 path: application/clicommands/Icinga2Command.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ConfigController\\:\\:advancedAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ConfigController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ConfigController\\:\\:backendAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ConfigController.php - message: "#^Cannot access offset string on mixed\\.$#" count: 2 path: application/controllers/GraphController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\GraphController\\:\\:hostAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/GraphController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\GraphController\\:\\:serviceAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/GraphController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\GraphController\\:\\:supplyImage\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/GraphController.php - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" count: 3 path: application/controllers/GraphController.php - message: "#^Parameter \\#3 \\$obscuredCheckCommand of method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\GraphController\\:\\:supplyImage\\(\\) expects string\\|null, mixed given\\.$#" count: 2 path: application/controllers/GraphController.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\GraphController\\:\\:\\$graphParams \\(array\\\\) does not accept array\\.$#" count: 1 path: application/controllers/GraphController.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\HostsController\\:\\:completeAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\HostsController\\:\\:indexAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\HostsController\\:\\:searchEditorAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" count: 1 path: application/controllers/HostsController.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Cannot access property \\$host_name on mixed\\.$#" count: 2 path: application/controllers/ListController.php - message: "#^Cannot access property \\$service_description on mixed\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ListController\\:\\:addTitleTab\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ListController\\:\\:filterQuery\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ListController\\:\\:hostsAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ListController\\:\\:servicesAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ListController.php - message: "#^Parameter \\#1 \\$rule of static method ipl\\\\Web\\\\Filter\\\\QueryString\\:\\:render\\(\\) expects ipl\\\\Stdlib\\\\Filter\\\\Rule, ipl\\\\Stdlib\\\\Filter\\\\Rule\\|false given\\.$#" count: 2 path: application/controllers/ListController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\MonitoringGraphController\\:\\:hostAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\MonitoringGraphController\\:\\:serviceAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\MonitoringGraphController\\:\\:supplyImage\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Parameter \\#2 \\$host of class Icinga\\\\Module\\\\Monitoring\\\\Object\\\\Host constructor expects string, mixed given\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Parameter \\#2 \\$host of class Icinga\\\\Module\\\\Monitoring\\\\Object\\\\Service constructor expects string, mixed given\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Parameter \\#3 \\$service of class Icinga\\\\Module\\\\Monitoring\\\\Object\\\\Service constructor expects string, mixed given\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\MonitoringGraphController\\:\\:\\$graphParams \\(array\\\\) does not accept array\\.$#" count: 1 path: application/controllers/MonitoringGraphController.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ServicesController\\:\\:completeAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ServicesController\\:\\:indexAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Controllers\\\\ServicesController\\:\\:searchEditorAction\\(\\) has no return type specified\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Parameter \\#2 \\$value of static method ipl\\\\Stdlib\\\\Filter\\:\\:equal\\(\\) expects array\\|bool\\|float\\|int\\|string, mixed given\\.$#" count: 1 path: application/controllers/ServicesController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\Config\\\\AdvancedForm\\:\\:createElements\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/Config/AdvancedForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\Config\\\\AdvancedForm\\:\\:createElements\\(\\) has parameter \\$formData with no value type specified in iterable type array\\.$#" count: 1 path: application/forms/Config/AdvancedForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\Config\\\\BackendForm\\:\\:createElements\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/Config/BackendForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\Config\\\\BackendForm\\:\\:createElements\\(\\) has parameter \\$formData with no value type specified in iterable type array\\.$#" count: 1 path: application/forms/Config/BackendForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CommonForm\\:\\:createElements\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CommonForm\\:\\:createElements\\(\\) has parameter \\$formData with no value type specified in iterable type array\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CommonForm\\:\\:createSelect\\(\\) should return Zend_Form_Element_Select but returns Zend_Form_Element\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CommonForm\\:\\:formToUrl\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CommonForm\\:\\:urlToForm\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Offset \\(int\\|string\\) does not exist on array\\\\|null\\.$#" count: 1 path: application/forms/TimeRangePicker/CommonForm.php - message: "#^Cannot access property \\$class on Zend_Form_Element\\|null\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Cannot call method getDecorators\\(\\) on Zend_Form_DisplayGroup\\|null\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Cannot call method getElements\\(\\) on Zend_Form_DisplayGroup\\|null\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Cannot call method setDecorators\\(\\) on Zend_Form_DisplayGroup\\|null\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Cannot call method setTimezone\\(\\) on DateTime\\|false\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Cannot call method setValue\\(\\) on Zend_Form_Element\\|null\\.$#" count: 2 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CustomForm\\:\\:createElements\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CustomForm\\:\\:createElements\\(\\) has parameter \\$formData with no value type specified in iterable type array\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CustomForm\\:\\:groupDateTime\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Forms\\\\TimeRangePicker\\\\CustomForm\\:\\:urlToForm\\(\\) has no return type specified\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Parameter \\#2 \\$datetime of static method DateTime\\:\\:createFromFormat\\(\\) expects string, mixed given\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" count: 1 path: application/forms/TimeRangePicker/CustomForm.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Chart\\:\\:serveImage\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/Chart.php - message: "#^Call to an undefined method ipl\\\\Stdlib\\\\Filter\\\\Rule\\:\\:getColumn\\(\\)\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Cannot access property \\$results on mixed\\.$#" count: 3 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:addFilter\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:applyFilter\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:escapeMetricStep\\(\\) should return string but returns string\\|null\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:fetchAll\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:fetchColumn\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:fetchPairs\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:from\\(\\) has parameter \\$fields with no value type specified in iterable type array\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:getFilter\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:setFilter\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:where\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:where\\(\\) has parameter \\$condition with no type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\MetricsQuery\\:\\:where\\(\\) has parameter \\$value with no type specified\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Parameter \\#2 \\$object of method Icinga\\\\Module\\\\Graphite\\\\Util\\\\IcingadbUtils\\:\\:resolveMacro\\(\\) expects Icinga\\\\Module\\\\Icingadb\\\\Compat\\\\CompatHost\\|Icinga\\\\Module\\\\Icingadb\\\\Compat\\\\CompatService\\|Icinga\\\\Module\\\\Icingadb\\\\Model\\\\Host\\|Icinga\\\\Module\\\\Icingadb\\\\Model\\\\Service, ipl\\\\Orm\\\\Model given\\.$#" count: 1 path: library/Graphite/Graphing/MetricsQuery.php - message: "#^Call to an undefined method Icinga\\\\Data\\\\Fetchable\\:\\:where\\(\\)\\.$#" count: 1 path: library/Graphite/Graphing/Template.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Template\\:\\:combineMetrics\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Graphing/Template.php - message: "#^Parameter \\#1 \\$template of class Icinga\\\\Module\\\\Graphite\\\\Util\\\\MacroTemplate constructor expects string, mixed given\\.$#" count: 2 path: library/Graphite/Graphing/Template.php - message: "#^PHPDoc tag @var for variable \\$options contains generic class Icinga\\\\Data\\\\ConfigObject but does not specify its types\\: TValue$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Parameter \\#1 \\$array of function array_unique expects array, array\\\\|false given\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Parameter \\#1 \\$path of method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Templates\\:\\:loadIni\\(\\) expects string, mixed given\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Parameter \\#1 \\$template of class Icinga\\\\Module\\\\Graphite\\\\Util\\\\MacroTemplate constructor expects string, mixed given\\.$#" count: 4 path: library/Graphite/Graphing/Templates.php - message: "#^Parameter \\#1 \\$urlParams of method Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Template\\:\\:setUrlParams\\(\\) expects array\\, array\\ given\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Parameter \\#2 \\$subject of function preg_split expects string, mixed given\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Templates\\:\\:\\$defaultTemplates \\(array\\\\) does not accept array\\\\|Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Template\\>\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Templates\\:\\:\\$templates \\(array\\\\>\\) does not accept array\\\\|Icinga\\\\Module\\\\Graphite\\\\Graphing\\\\Template\\>\\>\\.$#" count: 1 path: library/Graphite/Graphing/Templates.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/HostDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getViewRenderer\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/HostDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/HostDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/ServiceDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getViewRenderer\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/ServiceDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Icingadb/ServiceDetailExtension.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Monitoring/DetailviewExtension.php - message: "#^Call to an undefined method Icinga\\\\Web\\\\View\\:\\:protectId\\(\\)\\.$#" count: 1 path: library/Graphite/ProvidedHook/Monitoring/DetailviewExtension.php - message: "#^Cannot call method setWidth\\(\\) on Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\|null\\.$#" count: 1 path: library/Graphite/ProvidedHook/Monitoring/DetailviewExtension.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Util\\\\IcingadbUtils\\:\\:\\$instance has no type specified\\.$#" count: 1 path: library/Graphite/Util/IcingadbUtils.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:clear\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Util/InternalProcessTracker.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:enable\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Util/InternalProcessTracker.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:indent\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Util/InternalProcessTracker.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:recordf\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Util/InternalProcessTracker.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:unindent\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Util/InternalProcessTracker.php - message: "#^Cannot cast mixed to int\\.$#" count: 2 path: library/Graphite/Util/TimeRangePickerTools.php - message: "#^Parameter \\#2 \\$subject of function preg_match expects string, mixed given\\.$#" count: 1 path: library/Graphite/Util/TimeRangePickerTools.php - message: "#^Parameter \\#2 \\$value of method Icinga\\\\Web\\\\UrlParams\\:\\:set\\(\\) expects string, mixed given\\.$#" count: 1 path: library/Graphite/Util/TimeRangePickerTools.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Controller\\\\IcingadbGraphiteController\\:\\:moduleInit\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Controller/IcingadbGraphiteController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Controller\\\\MonitoringAwareController\\:\\:handleFormatRequest\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Controller\\\\MonitoringAwareController\\:\\:handleFormatRequest\\(\\) has parameter \\$query with no type specified\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Controller\\\\MonitoringAwareController\\:\\:moduleInit\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php - message: "#^Parameter \\#1 \\$name of static method Icinga\\\\Module\\\\Monitoring\\\\Backend\\\\MonitoringBackend\\:\\:instance\\(\\) expects string\\|null, mixed given\\.$#" count: 1 path: library/Graphite/Web/Controller/MonitoringAwareController.php - message: "#^Parameter \\#1 \\$value of method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Form\\\\Validator\\\\CustomErrorMessagesValidator\\:\\:validate\\(\\) expects string, mixed given\\.$#" count: 1 path: library/Graphite/Web/Form/Validator/CustomErrorMessagesValidator.php - message: "#^Parameter \\#1 \\$haystack of function strpos expects string, mixed given\\.$#" count: 1 path: library/Graphite/Web/Form/Validator/HttpUserValidator.php - message: "#^Cannot cast mixed to int\\.$#" count: 2 path: library/Graphite/Web/Widget/GraphImage.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\GraphImage\\:\\:render\\(\\) should return string but returns string\\|null\\.$#" count: 1 path: library/Graphite/Web/Widget/GraphImage.php - message: "#^Call to an undefined method Icinga\\\\Application\\\\ApplicationBootstrap\\:\\:getRequest\\(\\)\\.$#" count: 2 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Call to an undefined method Zend_View_Abstract\\:\\:qlink\\(\\)\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Call to an undefined method Zend_View_Abstract\\:\\:translate\\(\\)\\.$#" count: 3 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Cannot access offset string on mixed\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Comparison operation \"\\>\\=\" between int\\<0, max\\> and \\-1 is always true\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:forIcingadbObject\\(\\) should return static\\(Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\) but returns Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbHost\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:forIcingadbObject\\(\\) should return static\\(Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\) but returns Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:forMonitoredObject\\(\\) should return static\\(Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\)\\|null but returns Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Host\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:forMonitoredObject\\(\\) should return static\\(Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\)\\|null but returns Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Service\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:getObscuredCheckCommandCustomVar\\(\\) should return string but returns mixed\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:getRangeFromTimeRangePicker\\(\\) should return array\\ but returns array\\\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:getRangeFromTimeRangePicker\\(\\) should return array\\ but returns array\\\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:render\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Parameter \\#1 \\$array of function implode expects array\\, array\\\\|Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\InlineGraphImage\\|string\\>\\|string\\> given\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Parameter \\#1 \\$format of function vsprintf expects string, mixed given\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Part \\$relative \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Part \\$view\\-\\>escape\\(\\$e\\-\\>getMessage\\(\\)\\) \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Part \\$view\\-\\>escape\\(\\$view\\-\\>translate\\('Graphs assembling process record'\\)\\) \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Part \\$view\\-\\>escape\\(\\$view\\-\\>translate\\('No graphs found'\\)\\) \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Part \\$view\\-\\>escape\\(\\\\Icinga\\\\Module\\\\Graphite\\\\Util\\\\InternalProcessTracker\\:\\:dump\\(\\)\\) \\(mixed\\) of encapsed string cannot be cast to string\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:\\$checkCommand \\(string\\) does not accept mixed\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:\\$obscuredCheckCommand \\(string\\|null\\) does not accept mixed\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Static property Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\:\\:\\$obscuredCheckCommandCustomVar \\(string\\) does not accept mixed\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbHost\\:\\:createHostTitle\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbHost.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbHost\\:\\:getObjectType\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbHost.php - message: "#^Cannot access property \\$name on mixed\\.$#" count: 4 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\:\\:createHostTitle\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\:\\:createServiceTitle\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\:\\:designedforObjectType\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\:\\:getObjectType\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/Graphs/Icingadb/IcingadbService.php - message: "#^Call to an undefined method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbHost\\|Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\Graphs\\\\Icingadb\\\\IcingadbService\\:\\:createServiceTitle\\(\\)\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php - message: "#^Cannot call method hasResult\\(\\) on iterable\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\IcingadbGraphs\\:\\:assemble\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\IcingadbGraphs\\:\\:createGridItem\\(\\) has no return type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php - message: "#^Method Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\IcingadbGraphs\\:\\:createGridItem\\(\\) has parameter \\$object with no type specified\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php - message: "#^Property Icinga\\\\Module\\\\Graphite\\\\Web\\\\Widget\\\\IcingadbGraphs\\:\\:\\$objects type has no value type specified in iterable type iterable\\.$#" count: 1 path: library/Graphite/Web/Widget/IcingadbGraphs.php icingaweb2-module-graphite-1.3.0/phpstan.neon000066400000000000000000000013461516321226600211570ustar00rootroot00000000000000includes: - phpstan-baseline-standard.neon - phpstan-baseline-by-php-version.php parameters: level: max checkFunctionNameCase: true checkInternalClassCaseSensitivity: true treatPhpDocTypesAsCertain: false paths: - application - library scanDirectories: - /icingaweb2 - /usr/share/icinga-php - /usr/share/icingaweb2-modules ignoreErrors: - messages: - '#Unsafe usage of new static\(\)#' - '#. but return statement is missing#' reportUnmatched: false universalObjectCratesClasses: # to ignore magic property errors - ipl\Orm\Model - Icinga\Web\View - Icinga\Data\ConfigObject icingaweb2-module-graphite-1.3.0/public/000077500000000000000000000000001516321226600200735ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/public/css/000077500000000000000000000000001516321226600206635ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/public/css/module.less000066400000000000000000000065701516321226600230500ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2018 Icinga GmbH // SPDX-License-Identifier: GPL-3.0-or-later .images.object-detail-view > img { width: 100%; } .timerangepicker-container { display: flex; padding: .25em 0; .button-link { line-height: 1.75; width: 2.25em; i { display: inline-block; width: 100%; text-align: center; } i:before { margin-right: 0; } } } form[name=form_timerangepickercommon_graphite] { display: inline-flex; flex: 1 1 auto; width: 0; max-width: 43.25em; &:not(:last-child) { margin-right: .25em; } select { min-width: 3.5em; max-width: 7em; flex: 1 1 auto; width: auto; &:not(:last-of-type) { margin-right: .25em; } } } form[name=form_timerangepickercustom_graphite] { min-width: 21em; .control-label-group { text-align: left; } input[type=date] { min-width: 11em; } input[type=time] { min-width: 5em; } } .flyover[id^="graphite-customrange-"] { display: inline-block; } .grid { margin-right: -1em; margin-bottom: -1em; .empty-state { .rounded-corners(); background-color: @gray-lightest; margin-right: 1em; padding: 1em; text-align: center; } } .grid-item { display: inline-block; border-radius: .25em; border: 1px solid @gray-lighter; min-width: 302px; vertical-align: top; margin-right: 1em; margin-bottom: 1em; } .grid-item h2 { margin-top: 0; background: @gray-lightest; border-bottom: 1px solid @gray-lighter; padding:.25em .5em; max-width: 100%; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .grid-item > .images:not(:last-child) { margin-right: 1em; display: inline-block; } .grid-item .graphiteImg { margin-right: 1px; } .grid-item > p { padding: .5em; margin-bottom: 0; } p.load-more { margin-right: 1em; text-align: right; } // TODO: Remove once ipl-web v0.7.0 is required .controls:not(.default-layout) { .box-shadow(0, 0, 0, 1px, @gray-lighter); .pagination-control { float: left; } .sort-control, .limit-control { float: right; margin-left: .5em; } .sort-control { display: flex; justify-content: flex-end; :not(.form-element) > label { margin-right: 0; } .control-button { margin: 0; } } > :not(:only-child) { margin-bottom: 0.5em; } .search-suggestions { margin-bottom: 2.5em; } .search-controls, .filter { clear: both; display: flex; min-width: 100%; .search-bar { flex: 1 1 auto; & ~ .control-button:last-child { margin-right: -.5em; } & ~ .control-button { margin-left: .5em; } } } } /* Graph colors */ @graphite-graph-bg-color: @body-bg-color; @graphite-graph-fg-color: @text-color; @graphite-graph-major-grid-color: @gray-light; @graphite-graph-minor-grid-color: @graphite-graph-bg-color; @light-mode: { --graphite-graph-bg-color: var(--body-bg-color); --graphite-graph-fg-color: var(--text-color); --graphite-graph-major-grid-color: var(--gray-light); --graphite-graph-minor-grid-color: var(--graphite-graph-bg-color); }; .graphite-graph-color-registry { display: none; background-color: @graphite-graph-bg-color; color: @graphite-graph-fg-color; border-top-color: @graphite-graph-major-grid-color; border-bottom-color: @graphite-graph-minor-grid-color; } icingaweb2-module-graphite-1.3.0/public/js/000077500000000000000000000000001516321226600205075ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/public/js/module.js000066400000000000000000000107751516321226600223440ustar00rootroot00000000000000// SPDX-FileCopyrightText: 2018 Icinga GmbH // SPDX-License-Identifier: GPL-3.0-or-later (function(Icinga) { "use strict"; class Graphite extends Icinga.EventListener { constructor(icinga) { super(icinga); this._colorParams = null; this._resizeTimer = null; this._onResizeBound = this.onResize.bind(this); this._onModeChangeBound = this.onModeChange.bind(this); this._mediaQueryList = window.matchMedia('(prefers-color-scheme: light)'); this.on('css-reloaded', 'head', this.onCssReloaded, this); this.on('rendered', '#main > .container', this.onRendered, this); window.addEventListener('resize', this._onResizeBound, { passive: true }); this._mediaQueryList.addEventListener('change', this._onModeChangeBound, { passive: true }); } get colorParams() { if (this._colorParams === null) { let colorRegistry = document.querySelector('.graphite-graph-color-registry'); let registryStyle = window.getComputedStyle(colorRegistry); this._colorParams = { bgcolor: this.rgbToHex(registryStyle.backgroundColor, 'black'), fgcolor: this.rgbToHex(registryStyle.color, 'white'), majorGridLineColor: this.rgbToHex(registryStyle.borderTopColor, '0000003F'), minorGridLineColor: this.rgbToHex(registryStyle.borderBottomColor, 'black') }; } return this._colorParams; } unbind(emitter) { super.unbind(emitter); window.removeEventListener('resize', this._onResizeBound); this._mediaQueryList.removeEventListener('change', this._onModeChangeBound); this._onResizeBound = null; this._onModeChangeBound = null; this._mediaQueryList = null; } onCssReloaded(event) { let _this = event.data.self; _this._colorParams = null; _this.updateImages(document); } onRendered(event, autorefresh, scripted, autosubmit) { let _this = event.data.self; let container = event.target; _this.updateImages(container); } onResize() { // Images are not updated instantly, the user might not yet be finished resizing the window if (this._resizeTimer !== null) { clearTimeout(this._resizeTimer); } this._resizeTimer = setTimeout(() => this.updateImages(document), 200); } onModeChange() { this._colorParams = null; this.updateImages(document); } updateImages(container) { container.querySelectorAll('img.graphiteImg[data-actualimageurl]').forEach(img => { let params = { ...this.colorParams }; // Theming ftw! params.r = (new Date()).getTime(); // To bypass the browser cache params.width = img.scrollWidth; if ('width' in img.dataset) { // If the width is defined in the data attributes, it has been explicitly defined in a template and // therefore must be handled specially. In detail areas the image must not be scaled to 100% and // in the other views it must not exceed the width of the parent container. // Note the `+str` which will convert str to number. params.width = Math.min(+img.dataset.width, img.parentElement.clientWidth); img.style.width = params.width + 'px'; } img.src = this.icinga.utils.addUrlParams(img.dataset.actualimageurl, params); }); } rgbToHex(rgb, def) { if (! rgb) { return def; } let match = rgb.match(/rgba?\((\d+), (\d+), (\d+)(?:, ([\d.]+))?\)/); if (match === null) { return def; } let alpha = ''; if (typeof match[4] !== 'undefined') { alpha = Math.round(parseFloat(match[4]) * 255).toString(16); } return parseInt(match[1], 10).toString(16).padStart(2, '0') + parseInt(match[2], 10).toString(16).padStart(2, '0') + parseInt(match[3], 10).toString(16).padStart(2, '0') + alpha; } } Icinga.Behaviors.Graphite = Graphite; })(Icinga); icingaweb2-module-graphite-1.3.0/run.php000066400000000000000000000021121516321226600201260ustar00rootroot00000000000000 // SPDX-License-Identifier: GPL-3.0-or-later /** @var \Icinga\Application\Modules\Module $this */ use Icinga\Module\Graphite\ProvidedHook\Icingadb\IcingadbSupport; $this->provideHook('monitoring/DetailviewExtension'); $this->provideHook('icingadb/IcingadbSupport'); $this->provideHook('icingadb/HostDetailExtension'); $this->provideHook('icingadb/ServiceDetailExtension'); if (! $this->exists('icingadb') || ! IcingadbSupport::useIcingaDbAsBackend()) { $this->addRoute('graphite/monitoring-graph/host', new Zend_Controller_Router_Route( 'graphite/graph/host', [ 'controller' => 'monitoring-graph', 'action' => 'host', 'module' => 'graphite' ] )); $this->addRoute('graphite/monitoring-graph/service', new Zend_Controller_Router_Route( 'graphite/graph/service', [ 'controller' => 'monitoring-graph', 'action' => 'service', 'module' => 'graphite' ] )); } icingaweb2-module-graphite-1.3.0/templates/000077500000000000000000000000001516321226600206135ustar00rootroot00000000000000icingaweb2-module-graphite-1.3.0/templates/cpu_windows_powershell_framework.ini000066400000000000000000000024631516321226600302030ustar00rootroot00000000000000[load-windows.graph] check_command = "Invoke-IcingaCheckCPU" [load-windows.metrics_filters] load.value = "$service_name_template$.perfdata.$load$.value" crit.value = "$service_name_template$.perfdata.$load$.crit" warn.value = "$service_name_template$.perfdata.$load$.warn" [load-windows.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" title = "CPU $load$ %" yUnitSystem = "none" [load-windows.functions] load.value = "alias(color($metric$, '#1a7dd7'), 'CPU usage(%)')" crit.value = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn.value = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" [load-windows-multi.graph] check_command = "Invoke-IcingaCheckCPU" [load-windows-multi.metrics_filters] load.value = "$service_name_template$.perfdata.$index$.$template$.$label_name$.value" crit.value = "$service_name_template$.perfdata.$index$.$template$.$label_name$.crit" warn.value = "$service_name_template$.perfdata.$index$.$template$.$label_name$.warn" [load-windows-multi.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" title = "CPU ($index$::$template$::$label_name$) %" yUnitSystem = "none" [load-windows-multi.functions] load.value = "alias(color($metric$, '#1a7dd7'), 'CPU usage(%)')" crit.value = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn.value = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" icingaweb2-module-graphite-1.3.0/templates/default.ini000066400000000000000000000011121516321226600227330ustar00rootroot00000000000000[default-host.metrics_filters] value = "$host_name_template$.perfdata.$perfdata$.value" [default-host.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$perfdata$" yUnitSystem = "none" [default-host.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" [default-service.metrics_filters] value = "$service_name_template$.perfdata.$perfdata$.value" [default-service.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$perfdata$" yUnitSystem = "none" [default-service.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" icingaweb2-module-graphite-1.3.0/templates/disk.ini000066400000000000000000000012361516321226600222500ustar00rootroot00000000000000[disk.graph] check_command = "disk, disk-windows" [disk.metrics_filters] value = "$service_name_template$.perfdata.$disk$.value" max = "$service_name_template$.perfdata.$disk$.max" crit = "$service_name_template$.perfdata.$disk$.crit" warn = "$service_name_template$.perfdata.$disk$.warn" [disk.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$" yUnitSystem = "binary" [disk.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" icingaweb2-module-graphite-1.3.0/templates/disk_windows_powershell_framework.ini000066400000000000000000000041411516321226600303410ustar00rootroot00000000000000[disk.graph] check_command = "Invoke-IcingaCheckUsedPartitionSpace" [disk.metrics_filters] value = "$service_name_template$.perfdata.used_space_$disk$.value" max = "$service_name_template$.perfdata.used_space_$disk$.max" crit = "$service_name_template$.perfdata.used_space_$disk$.crit" warn = "$service_name_template$.perfdata.used_space_$disk$.warn" [disk.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$" yUnitSystem = "binary" [disk.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" [disk-multi.graph] check_command = "Invoke-IcingaCheckUsedPartitionSpace" [disk-multi.metrics_filters] value = "$service_name_template$.perfdata.$index$.$template$.$label_name$.value" max = "$service_name_template$.perfdata.$index$.$template$.$label_name$.max" crit = "$service_name_template$.perfdata.$index$.$template$.$label_name$.crit" warn = "$service_name_template$.perfdata.$index$.$template$.$label_name$.warn" [disk-multi.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $index$::$template$::$label_name$" yUnitSystem = "binary" [disk-multi.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" [disk-percent.graph] check_command = "Invoke-IcingaCheckUsedPartitionSpace" [disk-percent.metrics_filters] value = "$service_name_template$.perfdata.$disk$.value" crit = "$service_name_template$.perfdata.$disk$.crit" warn = "$service_name_template$.perfdata.$disk$.warn" [disk-percent.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$" [disk-percent.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (%)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" icingaweb2-module-graphite-1.3.0/templates/ethMon.ini000066400000000000000000000012621516321226600225470ustar00rootroot00000000000000[ethMon-inb.graph] check_command = "ethMon" [ethMon-inb.metrics_filters] in.value = "$service_name_template$.perfdata.rx.value" [ethMon-inb.urlparams] areaAlpha = "0.3" areaMode = "all" lineWidth = "1" min = "0" title = "Inbound" yUnitSystem = "binary" [ethMon-inb.functions] in.value = "alias(color($metric$, '#7CE52D'), 'In (bytes/s)')" [ethMon-out.graph] check_command = "ethMon" [ethMon-out.metrics_filters] out.value = "$service_name_template$.perfdata.tx.value" [ethMon-out.urlparams] areaAlpha = "0.3" areaMode = "all" lineWidth = "1" min = "0" title = "Outbound" yUnitSystem = "binary" [ethMon-out.functions] out.value = "alias(color($metric$, '#ff5566'), 'Out (bytes/s)')" icingaweb2-module-graphite-1.3.0/templates/file_age.ini000066400000000000000000000012331516321226600230460ustar00rootroot00000000000000[file_age-age.graph] check_command = "file_age" [file_age-age.metrics_filters] value = "$service_name_template$.perfdata.age.value" [file_age-age.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [file_age-age.functions] value = "alias(color($metric$, '#1a7dd7'), 'File age (s)')" [file_age-size.graph] check_command = "file_age" [file_age-size.metrics_filters] value = "$service_name_template$.perfdata.size.value" [file_age-size.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [file_age-size.functions] value = "alias(color($metric$, '#1a7dd7'), 'File size (bytes)')" icingaweb2-module-graphite-1.3.0/templates/fping.ini000066400000000000000000000013011516321226600224120ustar00rootroot00000000000000[fping-rta.graph] check_command = "fping, fping4, fping6" [fping-rta.metrics_filters] rta.value = "$service_name_template$.perfdata.rta.value" [fping-rta.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [fping-rta.functions] rta.value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Round trip time (ms)')" [fping-loss.graph] check_command = "fping, fping4, fping6" [fping-loss.metrics_filters] loss.value = "$service_name_template$.perfdata.loss.value" [fping-loss.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [fping-loss.functions] loss.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" icingaweb2-module-graphite-1.3.0/templates/graphite-template memory-linux-local.ini000066400000000000000000000017531516321226600305140ustar00rootroot00000000000000[memory.graph] check_command = "mem" [memory.metrics_filters] value = "$service_name_template$.perfdata.USED.value" max = "$service_name_template$.perfdata.USED.max" crit = "$service_name_template$.perfdata.USED.crit" warn = "$service_name_template$.perfdata.USED.warn" caches = "$service_name_template$.perfdata.CACHES.value" free = "$service_name_template$.perfdata.FREE.value" total = "$service_name_template$.perfdata.TOTAL.value" [memory.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Memory USED" yUnitSystem = "binary" [memory.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" free = "alias(color($metric$, '#41D2A2'), 'Free (bytes)')" total = "alias(color($metric$, '#8000FF'), 'Total (bytes)')" caches = "alias(color($metric$, '#ABABAB'), 'Caches (bytes)')" icingaweb2-module-graphite-1.3.0/templates/hostalive.ini000066400000000000000000000012651516321226600233160ustar00rootroot00000000000000[hostalive-rta.graph] check_command = "hostalive" [hostalive-rta.metrics_filters] rta.value = "$host_name_template$.perfdata.rta.value" [hostalive-rta.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "msec" [hostalive-rta.functions] rta.value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Round trip time (ms)')" [hostalive-pl.graph] check_command = "hostalive" [hostalive-pl.metrics_filters] pl.value = "$host_name_template$.perfdata.pl.value" [hostalive-pl.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [hostalive-pl.functions] pl.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" icingaweb2-module-graphite-1.3.0/templates/icinga.ini000066400000000000000000000243531516321226600225550ustar00rootroot00000000000000[icinga-uptime.graph] check_command = "icinga" [icinga-uptime.metrics_filters] uptime.value = "$service_name_template$.perfdata.uptime.value" [icinga-uptime.urlparams] title = "Uptime" areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [icinga-uptime.functions] uptime.value = "alias(color($metric$, '#1a7dd7'), 'Uptime (s)')" [icinga-host-checks.graph] check_command = "icinga" [icinga-host-checks.metrics_filters] active_host_checks.value = "$service_name_template$.perfdata.active_host_checks.value" passive_host_checks.value = "$service_name_template$.perfdata.passive_host_checks.value" [icinga-host-checks.urlparams] title = "Host Checks" areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-host-checks.functions] active_host_checks.value = "alias(color($metric$, '#1a7dd7'), 'Active/s')" passive_host_checks.value = "alias(color($metric$, '#0b3c68'), 'Passive/s')" [icinga-service-checks.graph] check_command = "icinga" [icinga-service-checks.metrics_filters] active_service_checks.value = "$service_name_template$.perfdata.active_service_checks.value" passive_service_checks.value = "$service_name_template$.perfdata.passive_service_checks.value" [icinga-service-checks.urlparams] title = "Service Checks" areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-service-checks.functions] active_service_checks.value = "alias(color($metric$, '#1a7dd7'), 'Active/s')" passive_service_checks.value = "alias(color($metric$, '#0b3c68'), 'Passive/s')" [icinga-hosts-state.graph] check_command = "icinga" [icinga-hosts-state.metrics_filters] num_hosts_up.value = "$service_name_template$.perfdata.num_hosts_up.value" num_hosts_down.value = "$service_name_template$.perfdata.num_hosts_down.value" num_hosts_unreachable.value = "$service_name_template$.perfdata.num_hosts_unreachable.value" num_hosts_pending.value = "$service_name_template$.perfdata.num_hosts_pending.value" [icinga-hosts-state.urlparams] title = "Host States" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-hosts-state.functions] num_hosts_up.value = "alias(color($metric$, '#44bb77'), 'Up')" num_hosts_down.value = "alias(color($metric$, '#ff5566'), 'Down')" num_hosts_unreachable.value = "alias(color($metric$, '#c70fff'), 'Unreachable')" num_hosts_pending.value = "alias(color($metric$, '#1a7dd7'), 'Pending')" [icinga-hosts-condition.graph] check_command = "icinga" [icinga-hosts-condition.metrics_filters] num_hosts_flapping.value = "$service_name_template$.perfdata.num_hosts_flapping.value" num_hosts_in_downtime.value = "$service_name_template$.perfdata.num_hosts_in_downtime.value" num_hosts_acknowledged.value = "$service_name_template$.perfdata.num_hosts_acknowledged.value" [icinga-hosts-condition.urlparams] title = "Host Conditions" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-hosts-condition.functions] num_hosts_flapping.value = "alias(color($metric$, '#c70fff'), 'Flapping')" num_hosts_in_downtime.value = "alias(color($metric$, '#1a7dd7'), 'In Downtime')" num_hosts_acknowledged.value = "alias(color($metric$, '#0b3c68'), 'Acknowledged')" [icinga-services-state.graph] check_command = "icinga" [icinga-services-state.metrics_filters] num_services_ok.value = "$service_name_template$.perfdata.num_services_ok.value" num_services_warning.value = "$service_name_template$.perfdata.num_services_warning.value" num_services_critical.value = "$service_name_template$.perfdata.num_services_critical.value" num_services_unknown.value = "$service_name_template$.perfdata.num_services_unknown.value" num_services_pending.value = "$service_name_template$.perfdata.num_services_pending.value" num_services_unreachable.value = "$service_name_template$.perfdata.num_services_unreachable.value" [icinga-services-state.urlparams] title = "Service States" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-services-state.functions] num_services_ok.value = "alias(color($metric$, '#44bb77'), 'Ok')" num_services_warning.value = "alias(color($metric$, '#ffaa44'), 'Warning')" num_services_critical.value = "alias(color($metric$, '#ff5566'), 'Critical')" num_services_unknown.value = "alias(color($metric$, '#595959'), 'Unknown')" num_services_pending.value = "alias(color($metric$, '#1a7dd7'), 'Pending')" num_services_unreachable.value = "alias(color($metric$, '#c70fff'), 'Unreachable')" [icinga-services-condition.graph] check_command = "icinga" [icinga-services-condition.metrics_filters] num_services_flapping.value = "$service_name_template$.perfdata.num_services_flapping.value" num_services_in_downtime.value = "$service_name_template$.perfdata.num_services_in_downtime.value" num_services_acknowledged.value = "$service_name_template$.perfdata.num_services_acknowledged.value" [icinga-services-condition.urlparams] title = "Service Conditions" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-services-condition.functions] num_services_flapping.value = "alias(color($metric$, '#c70fff'), 'Flapping')" num_services_in_downtime.value = "alias(color($metric$, '#1a7dd7'), 'In Downtime')" num_services_acknowledged.value = "alias(color($metric$, '#0b3c68'), 'Acknowledged')" [icinga-latency.graph] check_command = "icinga" [icinga-latency.metrics_filters] min_latency.value = "$service_name_template$.perfdata.min_latency.value" avg_latency.value = "$service_name_template$.perfdata.avg_latency.value" max_latency.value = "$service_name_template$.perfdata.max_latency.value" [icinga-latency.urlparams] title = "Check Latency" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [icinga-latency.functions] min_latency.value = "alias(color($metric$, '#61aaed'), 'Min (s)')" avg_latency.value = "alias(color($metric$, '#1a7dd7'), 'Avg (s)')" max_latency.value = "alias(color($metric$, '#0b3c68'), 'Max (s)')" [icinga-execution-time.graph] check_command = "icinga" [icinga-execution-time.metrics_filters] min_execution_time.value = "$service_name_template$.perfdata.min_execution_time.value" avg_execution_time.value = "$service_name_template$.perfdata.avg_execution_time.value" max_execution_time.value = "$service_name_template$.perfdata.max_execution_time.value" [icinga-execution-time.urlparams] title = "Check Execution Time" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [icinga-execution-time.functions] min_execution_time.value = "alias(color($metric$, '#61aaed'), 'Min (s)')" avg_execution_time.value = "alias(color($metric$, '#1a7dd7'), 'Avg (s)')" max_execution_time.value = "alias(color($metric$, '#0b3c68'), 'Max (s)')" [icinga-api-endpoints.graph] check_command = "icinga" [icinga-api-endpoints.metrics_filters] api_num_endpoints.value = "$service_name_template$.perfdata.api_num_endpoints.value" api_num_conn_endpoints.value = "$service_name_template$.perfdata.api_num_conn_endpoints.value" api_num_not_conn_endpoints.value = "$service_name_template$.perfdata.api_num_not_conn_endpoints.value" [icinga-api-endpoints.urlparams] title = "API Endpoints" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-api-endpoints.functions] api_num_endpoints.value = "alias(color($metric$, '#61aaed'), 'All')" api_num_conn_endpoints.value = "alias(color($metric$, '#1a7dd7'), 'Connected')" api_num_not_conn_endpoints.value = "alias(color($metric$, '#0b3c68'), 'Not Connected')" [icinga-api-http-clients.graph] check_command = "icinga" [icinga-api-http-clients.metrics_filters] api_num_http_clients.value = "$service_name_template$.perfdata.api_num_http_clients.value" [icinga-api-http-clients.urlparams] title = "API" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-api-http-clients.functions] api_num_http_clients.value = "alias(color($metric$, '#1a7dd7'), 'HTTP Clients')" [icinga-checker.graph] check_command = "icinga" [icinga-checker.metrics_filters] checkercomponent_checker_idle.value = "$service_name_template$.perfdata.checkercomponent_checker_idle.value" checkercomponent_checker_pending.value = "$service_name_template$.perfdata.checkercomponent_checker_pending.value" [icinga-checker.urlparams] title = "Checker" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-checker.functions] checkercomponent_checker_idle.value = "alias(color($metric$, '#61aaed'), 'Idle')" checkercomponent_checker_pending.value = "alias(color($metric$, '#1a7dd7'), 'Pending')" [icinga-ido-mysql-queries.graph] check_command = "icinga" [icinga-ido-mysql-queries.metrics_filters] idomysqlconnection_ido-mysql_queries_rate.value = "$service_name_template$.perfdata.idomysqlconnection_ido-mysql_queries_rate.value" [icinga-ido-mysql-queries.urlparams] title = "IDO MySQL" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-ido-mysql-queries.functions] idomysqlconnection_ido-mysql_queries_rate.value = "alias(color($metric$, '#1a7dd7'), 'Queries/s')" [icinga-ido-mysql-queue.graph] check_command = "icinga" [icinga-ido-mysql-queue.metrics_filters] idomysqlconnection_ido-mysql_query_queue_items.value = "$service_name_template$.perfdata.idomysqlconnection_ido-mysql_query_queue_items.value" idomysqlconnection_ido-mysql_query_queue_item_rate.value = "$service_name_template$.perfdata.idomysqlconnection_ido-mysql_query_queue_item_rate.value" [icinga-ido-mysql-queue.urlparams] title = "IDO MySQL Queue" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-ido-mysql-queue.functions] idomysqlconnection_ido-mysql_query_queue_items.value = "alias(color($metric$, '#1a7dd7'), 'Items')" idomysqlconnection_ido-mysql_query_queue_item_rate.value = "alias(color($metric$, '#0b3c68'), 'Items/s')" [icinga-graphite-queue.graph] check_command = "icinga" [icinga-graphite-queue.metrics_filters] graphitewriter_graphite_work_queue_items.value = "$service_name_template$.perfdata.graphitewriter_graphite_work_queue_items.value" graphitewriter_graphite_work_queue_item_rate.value = "$service_name_template$.perfdata.graphitewriter_graphite_work_queue_item_rate.value" [icinga-graphite-queue.urlparams] title = "Graphite Queue" areaMode = "none" lineWidth = "2" min = "0" yUnitSystem = "none" [icinga-graphite-queue.functions] graphitewriter_graphite_work_queue_items.value = "alias(color($metric$, '#1a7dd7'), 'Items')" graphitewriter_graphite_work_queue_item_rate.value = "alias(color($metric$, '#0b3c68'), 'Items/s')" icingaweb2-module-graphite-1.3.0/templates/icmp-hosts.ini000066400000000000000000000016741516321226600234120ustar00rootroot00000000000000[icmp-rt.graph] check_command = "icmp-host" [icmp-rt.metrics_filters] rtmin.value = "$host_name_template$.perfdata.rtmin.value" rta.value = "$host_name_template$.perfdata.rta.value" rtmax.value = "$host_name_template$.perfdata.rtmax.value" [icmp-rt.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [icmp-rt.functions] rtmin.value = "alias(color(scale($metric$, 1000), '#44bb77'), 'Min. round trip time (ms)')" rta.value = "alias(color(scale($metric$, 1000), '#ffaa44'), 'Avg. round trip time (ms)')" rtmax.value = "alias(color(scale($metric$, 1000), '#ff5566'), 'Max. round trip time (ms)')" [icmp-pl.graph] check_command = "icmp-host" [icmp-pl.metrics_filters] pl.value = "$host_name_template$.perfdata.pl.value" [icmp-pl.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [icmp-pl.functions] pl.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" icingaweb2-module-graphite-1.3.0/templates/icmp.ini000066400000000000000000000016741516321226600222540ustar00rootroot00000000000000[icmp-rt.graph] check_command = "icmp" [icmp-rt.metrics_filters] rtmin.value = "$service_name_template$.perfdata.rtmin.value" rta.value = "$service_name_template$.perfdata.rta.value" rtmax.value = "$service_name_template$.perfdata.rtmax.value" [icmp-rt.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "msec" [icmp-rt.functions] rtmin.value = "alias(color(scale($metric$, 1000), '#44bb77'), 'Min. round trip time (ms)')" rta.value = "alias(color(scale($metric$, 1000), '#ffaa44'), 'Avg. round trip time (ms)')" rtmax.value = "alias(color(scale($metric$, 1000), '#ff5566'), 'Max. round trip time (ms)')" [icmp-pl.graph] check_command = "icmp" [icmp-pl.metrics_filters] pl.value = "$service_name_template$.perfdata.pl.value" [icmp-pl.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [icmp-pl.functions] pl.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" icingaweb2-module-graphite-1.3.0/templates/interfacetable.ini000066400000000000000000000034031516321226600242640ustar00rootroot00000000000000[interfacetable-traffic.graph] check_command = "interfacetable" [interfacetable-traffic.metrics_filters] bpsin = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.BpsIn.value" bpsout = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.BpsOut.value" [interfacetable-traffic.urlparams] min = "0" title = "Interface $interface$" lineWidth = "2" yUnitSystem = "si" [interfacetable-traffic.functions] bpsin = "alias(color($metric$, '#1a7dd7'), 'Traffic in (B/s)')" bpsout = "alias(color($metric$, '#0b3c68'), 'Traffic out (B/s)')" [interfacetable-discard.graph] check_command = "interfacetable" [interfacetable-discard.metrics_filters] ppsindiscard = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.PpsInDiscard.value" ppsoutdiscard = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.PpsOutDiscard.value" [interfacetable-discard.urlparams] min = "0" title = "Interface $interface$" lineWidth = "2" yUnitSystem = "si" [interfacetable-discard.functions] ppsindiscard = "alias(color($metric$, '#edb017'), 'Discard in (B/s)')" ppsoutdiscard = "alias(color($metric$, '#ad7d05'), 'Discard out (B/s)')" [interfacetable-error.graph] check_command = "interfacetable" [interfacetable-error.metrics_filters] ppsinerr = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.PpsInErr.value" ppsouterr = "$service_name_template$.perfdata.If_$interface$.check_interface_table_port.PpsOutErr.value" [interfacetable-error.urlparams] min = "0" title = "Interface $interface$" lineWidth = "2" yUnitSystem = "si" [interfacetable-error.functions] ppsinerr = "alias(color($metric$, '#ff5566'), 'Error in (B/s)')" ppsouterr = "alias(color($metric$, '#a80000'), 'Error out (B/s)')" icingaweb2-module-graphite-1.3.0/templates/load.ini000066400000000000000000000015321516321226600222340ustar00rootroot00000000000000[load.graph] check_command = "load" [load.metrics_filters] load15.value = "$service_name_template$.perfdata.load15.value" load5.value = "$service_name_template$.perfdata.load5.value" load1.value = "$service_name_template$.perfdata.load1.value" [load.urlparams] areaAlpha = "0.5" min = "0" yUnitSystem = "none" lineWidth = "2" [load.functions] load15.value = "alias(color($metric$, '#ff5566'), 'Load 15')" load5.value = "alias(color($metric$, '#ffaa44'), 'Load 5')" load1.value = "alias(color($metric$, '#44bb77'), 'Load 1')" [load-windows.graph] check_command = "load-windows" [load-windows.metrics_filters] value = "$service_name_template$.perfdata.load.value" [load-windows.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [load-windows.functions] value = "alias(color($metric$, '#1a7dd7'), 'Load (%)')" icingaweb2-module-graphite-1.3.0/templates/mailq.ini000066400000000000000000000004551516321226600224230ustar00rootroot00000000000000[mailq.graph] check_command = "mailq" [mailq.metrics_filters] unsent = "$service_name_template$.perfdata.unsent.value" [mailq.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mailq.functions] unsent = "alias(color($metric$, '#1a7dd7'), 'Unsent mails')" icingaweb2-module-graphite-1.3.0/templates/memory.ini000066400000000000000000000006501516321226600226250ustar00rootroot00000000000000[memory.graph] check_command = "memory-windows" [memory.metrics_filters] value = "$service_name_template$.perfdata.memory.value" max = "$service_name_template$.perfdata.memory.max" [memory.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [memory.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" icingaweb2-module-graphite-1.3.0/templates/memory_windows_powershell_framework.ini000066400000000000000000000041401516321226600307160ustar00rootroot00000000000000[memory.graph] check_command = "Invoke-IcingaCheckMemory" [memory.metrics_filters] value = "$service_name_template$.perfdata.used_bytes.value" max = "$service_name_template$.perfdata.used_bytes.max" crit = "$service_name_template$.perfdata.used_bytes.crit" warn = "$service_name_template$.perfdata.used_bytes.warn" [memory.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Memory used" yUnitSystem = "binary" [memory.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" [memory-multi.graph] check_command = "Invoke-IcingaCheckMemory" [memory-multi.metrics_filters] value = "$service_name_template$.perfdata.$index$.$template$.$label_name$.value" max = "$service_name_template$.perfdata.$index$.$template$.$label_name$.max" crit = "$service_name_template$.perfdata.$index$.$template$.$label_name$.crit" warn = "$service_name_template$.perfdata.$index$.$template$.$label_name$.warn" [memory-multi.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "Memory used ($index$::$template$::$label_name$)" yUnitSystem = "none" [memory-multi.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" [memory-percent.graph] check_command = "Invoke-IcingaCheckMemory" [memory-percent.metrics_filters] value = "$service_name_template$.perfdata.memory_percent_used.value" crit = "$service_name_template$.perfdata.memory_percent_used.crit" warn = "$service_name_template$.perfdata.memory_percent_used.warn" [memory-percent.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Memory % used" [memory-percent.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (%)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" icingaweb2-module-graphite-1.3.0/templates/multi.ini000066400000000000000000000023541516321226600224520ustar00rootroot00000000000000[multi2-host.metrics_filters] value = "$host_name_template$.perfdata.$multi1$.$multi2$.value" [multi2-host.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$multi1$::$multi2$" yUnitSystem = "none" [multi2-host.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" [multi2-service.metrics_filters] value = "$service_name_template$.perfdata.$multi1$.$multi2$.value" [multi2-service.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$multi1$::$multi2$" yUnitSystem = "none" [multi2-service.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" [multi3-host.metrics_filters] value = "$host_name_template$.perfdata.$multi1$.$multi2$.$multi3$.value" [multi3-host.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$multi1$::$multi2$::$multi3$" yUnitSystem = "none" [multi3-host.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" [multi3-service.metrics_filters] value = "$service_name_template$.perfdata.$multi1$.$multi2$.$multi3$.value" [multi3-service.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" title = "$multi1$::$multi2$::$multi3$" yUnitSystem = "none" [multi3-service.functions] value = "alias(color($metric$, '#1a7dd7'), 'value')" icingaweb2-module-graphite-1.3.0/templates/mysql.ini000066400000000000000000000145341516321226600224700ustar00rootroot00000000000000[mysql-Connections.graph] check_command = "mysql" [mysql-Connections.metrics_filters] value = "$service_name_template$.perfdata.Connections.value" [mysql-Connections.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Connections.functions] value = "alias(color(nonNegativeDerivative($metric$), '#1a7dd7'), 'Connections')" [mysql-Open_files.graph] check_command = "mysql" [mysql-Open_files.metrics_filters] value = "$service_name_template$.perfdata.Open_files.value" [mysql-Open_files.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Open_files.functions] value = "alias(color($metric$, '#1a7dd7'), 'Open files')" [mysql-Open_tables.graph] check_command = "mysql" [mysql-Open_tables.metrics_filters] value = "$service_name_template$.perfdata.Open_tables.value" [mysql-Open_tables.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Open_tables.functions] value = "alias(color($metric$, '#1a7dd7'), 'Open tables')" [mysql-Qcache_free_memory.graph] check_command = "mysql" [mysql-Qcache_free_memory.metrics_filters] value = "$service_name_template$.perfdata.Qcache_free_memory.value" [mysql-Qcache_free_memory.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [mysql-Qcache_free_memory.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache free memory (Bytes)')" [mysql-Qcache_hits.graph] check_command = "mysql" [mysql-Qcache_hits.metrics_filters] value = "$service_name_template$.perfdata.Qcache_hits.value" [mysql-Qcache_hits.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Qcache_hits.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache hits')" [mysql-Qcache_inserts.graph] check_command = "mysql" [mysql-Qcache_inserts.metrics_filters] value = "$service_name_template$.perfdata.Qcache_inserts.value" [mysql-Qcache_inserts.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Qcache_inserts.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache inserts')" [mysql-Qcache_lowmem_prunes.graph] check_command = "mysql" [mysql-Qcache_lowmem_prunes.metrics_filters] value = "$service_name_template$.perfdata.Qcache_lowmem_prunes.value" [mysql-Qcache_lowmem_prunes.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Qcache_lowmem_prunes.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache lowmem prunes')" [mysql-Qcache_not_cached.graph] check_command = "mysql" [mysql-Qcache_not_cached.metrics_filters] value = "$service_name_template$.perfdata.Qcache_not_cached.value" [mysql-Qcache_not_cached.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Qcache_not_cached.functions] value = "alias(color(nonNegativeDerivative($metric$), '#1a7dd7'), 'Not cached queries')" [mysql-Qcache_queries_in_cache.graph] check_command = "mysql" [mysql-Qcache_queries_in_cache.metrics_filters] value = "$service_name_template$.perfdata.Qcache_queries_in_cache.value" [mysql-Qcache_queries_in_cache.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Qcache_queries_in_cache.functions] value = "alias(color($metric$, '#1a7dd7'), 'Queries in cache')" [mysql-Queries.graph] check_command = "mysql" [mysql-Queries.metrics_filters] value = "$service_name_template$.perfdata.Queries.value" [mysql-Queries.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Queries.functions] value = "alias(color(nonNegativeDerivative($metric$), '#1a7dd7'), 'Queries')" [mysql-Questions.graph] check_command = "mysql" [mysql-Questions.metrics_filters] value = "$service_name_template$.perfdata.Questions.value" [mysql-Questions.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Questions.functions] value = "alias(color(nonNegativeDerivative($metric$), '#1a7dd7'), 'Questions')" [mysql-Table_locks_waited.graph] check_command = "mysql" [mysql-Table_locks_waited.metrics_filters] value = "$service_name_template$.perfdata.Table_locks_waited.value" [mysql-Table_locks_waited.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Table_locks_waited.functions] value = "alias(color($metric$, '#1a7dd7'), 'Table locks waited for')" [mysql-Threads_connected.graph] check_command = "mysql" [mysql-Threads_connected.metrics_filters] value = "$service_name_template$.perfdata.Threads_connected.value" [mysql-Threads_connected.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Threads_connected.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads connected')" [mysql-Threads_running.graph] check_command = "mysql" [mysql-Threads_running.metrics_filters] value = "$service_name_template$.perfdata.Threads_running.value" [mysql-Threads_running.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql-Threads_running.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads running')" [mysql-Uptime.graph] check_command = "mysql" [mysql-Uptime.metrics_filters] value = "$service_name_template$.perfdata.Uptime.value" [mysql-Uptime.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [mysql-Uptime.functions] value = "alias(color($metric$, '#1a7dd7'), 'Uptime (s)')" [mysql-seconds_behind_master.graph] check_command = "mysql" [mysql-seconds_behind_master.metrics_filters] value = "$service_name_template$.perfdata.seconds_behind_master.value" [mysql-seconds_behind_master.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [mysql-seconds_behind_master.functions] value = "alias(color($metric$, '#1a7dd7'), 'Seconds behind master')" [mysql-seconds_behind_source.graph] check_command = "mysql" [mysql-seconds_behind_source.metrics_filters] value = "$service_name_template$.perfdata.seconds_behind_source.value" [mysql-seconds_behind_source.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [mysql-seconds_behind_source.functions] value = "alias(color($metric$, '#1a7dd7'), 'Seconds behind source')" icingaweb2-module-graphite-1.3.0/templates/mysql_health.ini000066400000000000000000000305711516321226600240140ustar00rootroot00000000000000[mysql_health-bufferpool_hitrate.graph] check_command = "mysql_health" [mysql_health-bufferpool_hitrate.metrics_filters] value = "$service_name_template$.perfdata.bufferpool_hitrate.value" now.value = "$service_name_template$.perfdata.bufferpool_hitrate_now.value" [mysql_health-bufferpool_hitrate.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-bufferpool_hitrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'InnoDB buffer pool hitrate (%)')" now.value = "alias(color($metric$, '#ff5566'), 'InnoDB buffer pool hitrate (now, %)')" [mysql_health-bufferpool_wait_free.graph] check_command = "mysql_health" [mysql_health-bufferpool_wait_free.metrics_filters] value = "$service_name_template$.perfdata.bufferpool_free_waits_rate.value" [mysql_health-bufferpool_wait_free.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-bufferpool_wait_free.functions] value = "alias(color($metric$, '#1a7dd7'), 'InnoDB buffer pool waits/s')" [mysql_health-clients_aborted.graph] check_command = "mysql_health" [mysql_health-clients_aborted.metrics_filters] value = "$service_name_template$.perfdata.clients_aborted_per_sec.value" [mysql_health-clients_aborted.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-clients_aborted.functions] value = "alias(color($metric$, '#1a7dd7'), 'Clients aborted/s')" [mysql_health-cluster_ndbd_running.graph] check_command = "mysql_health" [mysql_health-cluster_ndbd_running.metrics_filters] ndbd_nodes.value = "$service_name_template$.perfdata.ndbd_nodes.value" ndb_mgmd_nodes.value = "$service_name_template$.perfdata.ndb_mgmd_nodes.value" [mysql_health-cluster_ndbd_running.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-cluster_ndbd_running.functions] ndbd_nodes.value = "alias(color($metric$, '#1a7dd7'), 'Ndbd nodes')" ndb_mgmd_nodes.value = "alias(color($metric$, '#ff5566'), 'Ndb_mgmd nodes')" [mysql_health-mysqld_nodes.graph] check_command = "mysql_health" [mysql_health-mysqld_nodes.metrics_filters] value = "$service_name_template$.perfdata.mysqld_nodes.value" [mysql_health-mysqld_nodes.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-mysqld_nodes.functions] value = "alias(color($metric$, '#1a7dd7'), 'MySQLd nodes')" [mysql_health-connection_time.graph] check_command = "mysql_health" [mysql_health-connection_time.metrics_filters] value = "$service_name_template$.perfdata.connection_time.value" [mysql_health-connection_time.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-connection_time.functions] value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Connection time (ms)')" [mysql_health-connects_aborted.graph] check_command = "mysql_health" [mysql_health-connects_aborted.metrics_filters] value = "$service_name_template$.perfdata.connects_aborted_per_sec.value" [mysql_health-connects_aborted.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-connects_aborted.functions] value = "alias(color($metric$, '#1a7dd7'), 'Connects aborted/s')" [mysql_health-index_usage.graph] check_command = "mysql_health" [mysql_health-index_usage.metrics_filters] value = "$service_name_template$.perfdata.index_usage.value" now.value = "$service_name_template$.perfdata.index_usage_now.value" [mysql_health-index_usage.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-index_usage.functions] value = "alias(color($metric$, '#1a7dd7'), 'Index usage (%)')" now.value = "alias(color($metric$, '#ff5566'), 'Index usage (now, %)')" [mysql_health-keycache_hitrate.graph] check_command = "mysql_health" [mysql_health-keycache_hitrate.metrics_filters] value = "$service_name_template$.perfdata.keycache_hitrate.value" now.value = "$service_name_template$.perfdata.keycache_hitrate_now.value" [mysql_health-keycache_hitrate.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-keycache_hitrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'MyISAM keycache hitrate (%)')" now.value = "alias(color($metric$, '#ff5566'), 'MyISAM keycache hitrate (now, %)')" [mysql_health-log_waits.graph] check_command = "mysql_health" [mysql_health-log_waits.metrics_filters] value = "$service_name_template$.perfdata.innodb_log_waits_rate.value" [mysql_health-log_waits.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-log_waits.functions] value = "alias(color($metric$, '#1a7dd7'), 'InnoDB log waits/s')" [mysql_health-long_running_procs.graph] check_command = "mysql_health" [mysql_health-long_running_procs.metrics_filters] value = "$service_name_template$.perfdata.long_running_procs.value" [mysql_health-long_running_procs.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-long_running_procs.functions] value = "alias(color($metric$, '#1a7dd7'), 'Long running processes')" [mysql_health-open_files.graph] check_command = "mysql_health" [mysql_health-open_files.metrics_filters] value = "$service_name_template$.perfdata.open_files.value" [mysql_health-open_files.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-open_files.functions] value = "alias(color($metric$, '#1a7dd7'), 'Open files')" [mysql_health-qcache_hitrate.graph] check_command = "mysql_health" [mysql_health-qcache_hitrate.metrics_filters] value = "$service_name_template$.perfdata.qcache_hitrate.value" now.value = "$service_name_template$.perfdata.qcache_hitrate_now.value" [mysql_health-qcache_hitrate.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-qcache_hitrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache hitrate (%)')" now.value = "alias(color($metric$, '#ff5566'), 'Query cache hitrate (now, %)')" [mysql_health-selects_per_sec.graph] check_command = "mysql_health" [mysql_health-selects_per_sec.metrics_filters] value = "$service_name_template$.perfdata.selects_per_sec.value" [mysql_health-selects_per_sec.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-selects_per_sec.functions] value = "alias(color($metric$, '#1a7dd7'), 'Selects/s')" [mysql_health-qcache_lowmem_prunes.graph] check_command = "mysql_health" [mysql_health-qcache_lowmem_prunes.metrics_filters] value = "$service_name_template$.perfdata.qcache_lowmem_prunes_rate.value" [mysql_health-qcache_lowmem_prunes.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-qcache_lowmem_prunes.functions] value = "alias(color($metric$, '#1a7dd7'), 'Query cache lowmem prunes/s')" [mysql_health-slave_lag.graph] check_command = "mysql_health" [mysql_health-slave_lag.metrics_filters] value = "$service_name_template$.perfdata.slave_lag.value" [mysql_health-slave_lag.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [mysql_health-slave_lag.functions] value = "alias(color($metric$, '#1a7dd7'), 'Seconds slave is behind master')" [mysql_health-replica_lag.graph] check_command = "mysql_health" [mysql_health-replica_lag.metrics_filters] value = "$service_name_template$.perfdata.replica_lag.value" [mysql_health-replica_lag.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [mysql_health-replica_lag.functions] value = "alias(color($metric$, '#1a7dd7'), 'Seconds replica is behind source')" [mysql_health-slow_queries.graph] check_command = "mysql_health" [mysql_health-slow_queries.metrics_filters] value = "$service_name_template$.perfdata.slow_queries_rate.value" [mysql_health-slow_queries.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-slow_queries.functions] value = "alias(color($metric$, '#1a7dd7'), 'Slow queries/s')" [mysql_health-table_lock_contention.graph] check_command = "mysql_health" [mysql_health-table_lock_contention.metrics_filters] value = "$service_name_template$.perfdata.tablelock_contention.value" now.value = "$service_name_template$.perfdata.tablelock_contention_now.value" [mysql_health-table_lock_contention.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-table_lock_contention.functions] value = "alias(color($metric$, '#1a7dd7'), 'Table lock contention (%)')" now.value = "alias(color($metric$, '#ff5566'), 'Table lock contention (now, %)')" [mysql_health-tablecache_hitrate.graph] check_command = "mysql_health" [mysql_health-tablecache_hitrate.metrics_filters] value = "$service_name_template$.perfdata.tablecache_hitrate.value" [mysql_health-tablecache_hitrate.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-tablecache_hitrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'Table cache hitrate (%)')" [mysql_health-tablecache_fillrate.graph] check_command = "mysql_health" [mysql_health-tablecache_fillrate.metrics_filters] value = "$service_name_template$.perfdata.tablecache_fillrate.value" [mysql_health-tablecache_fillrate.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-tablecache_fillrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'Table cache fillrate (%)')" [mysql_health-threadcache_hitrate.graph] check_command = "mysql_health" [mysql_health-threadcache_hitrate.metrics_filters] value = "$service_name_template$.perfdata.thread_cache_hitrate.value" now.value = "$service_name_template$.perfdata.thread_cache_hitrate_now.value" [mysql_health-threadcache_hitrate.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-threadcache_hitrate.functions] value = "alias(color($metric$, '#1a7dd7'), 'Thread cache hitrate (%)')" now.value = "alias(color($metric$, '#ff5566'), 'Thread cache hitrate (now, %)')" [mysql_health-threads_cached.graph] check_command = "mysql_health" [mysql_health-threads_cached.metrics_filters] value = "$service_name_template$.perfdata.threads_cached.value" [mysql_health-threads_cached.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-threads_cached.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads cached')" [mysql_health-threads_connected.graph] check_command = "mysql_health" [mysql_health-threads_connected.metrics_filters] value = "$service_name_template$.perfdata.threads_connected.value" [mysql_health-threads_connected.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-threads_connected.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads connected')" [mysql_health-threads_created.graph] check_command = "mysql_health" [mysql_health-threads_created.metrics_filters] value = "$service_name_template$.perfdata.threads_created_per_sec.value" [mysql_health-threads_created.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-threads_created.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads created/s')" [mysql_health-threads_running.graph] check_command = "mysql_health" [mysql_health-threads_running.metrics_filters] value = "$service_name_template$.perfdata.threads_running.value" [mysql_health-threads_running.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-threads_running.functions] value = "alias(color($metric$, '#1a7dd7'), 'Threads running')" [mysql_health-tmp_disk_tables.graph] check_command = "mysql_health" [mysql_health-tmp_disk_tables.metrics_filters] value = "$service_name_template$.perfdata.pct_tmp_table_on_disk.value" now.value = "$service_name_template$.perfdata.pct_tmp_table_on_disk_now.value" [mysql_health-tmp_disk_tables.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" yUnitSystem = "none" [mysql_health-tmp_disk_tables.functions] value = "alias(color($metric$, '#1a7dd7'), 'Temp tables created on disk (%)')" now.value = "alias(color($metric$, '#ff5566'), 'Temp tables created on disk (now, %)')" icingaweb2-module-graphite-1.3.0/templates/netapp_cdot_aggregates.ini000066400000000000000000000012431516321226600260050ustar00rootroot00000000000000[disk.graph] check_command = "netapp_cdot_aggr_status" [disk.metrics_filters] value = "$service_name_template$.perfdata.$disk$.value" max = "$service_name_template$.perfdata.$disk$.max" crit = "$service_name_template$.perfdata.$disk$.crit" warn = "$service_name_template$.perfdata.$disk$.warn" [disk.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$" yUnitSystem = "binary" [disk.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" icingaweb2-module-graphite-1.3.0/templates/netapp_cdot_volumes.ini000066400000000000000000000032061516321226600253670ustar00rootroot00000000000000[vol-space.graph] check_command = "netapp_cdot_volume_status" [vol-space.metrics_filters] value = "$service_name_template$.perfdata.$vol$.check_cdot_volume_usage.space_used.value" max = "$service_name_template$.perfdata.$vol$.check_cdot_volume_usage.space_used.max" crit = "$service_name_template$.perfdata.$vol$.check_cdot_volume_usage.space_used.crit" warn = "$service_name_template$.perfdata.$vol$.check_cdot_volume_usage.space_used.warn" [vol-space.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $vol$ Space used" yUnitSystem = "binary" [vol-space.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" [disk-inode.graph] check_command = "netapp_cdot_volume_status" [disk-inode.metrics_filters] value = "$service_name_template$.perfdata.$disk$.check_cdot_volume_usage.inode_used.value" max = "$service_name_template$.perfdata.$disk$.check_cdot_volume_usage.inode_used.max" crit = "$service_name_template$.perfdata.$disk$.check_cdot_volume_usage.inode_used.crit" warn = "$service_name_template$.perfdata.$disk$.check_cdot_volume_usage.inode_used.warn" [disk-inode.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$ Inodes used" [disk-inode.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used Inodes')" max = "alias(color($metric$, '#cfd7e6'), 'Max Inodes')" crit = "alias(color($metric$, '#ff0000'), 'Crit Inodes')" warn = "alias(color($metric$, '#ff8d00'), 'Warn Inodes')" icingaweb2-module-graphite-1.3.0/templates/network.ini000066400000000000000000000016011516321226600230030ustar00rootroot00000000000000[network-windows-total.graph] check_command = "network-windows" [network-windows-total.metrics_filters] value = "$service_name_template$.perfdata.network.value" [network-windows-total.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" title = "Total" yUnitSystem = "binary" [network-windows-total.functions] value = "alias(color($metric$, '#1a7dd7'), 'I/O (bytes/s)')" [network-windows-nic.graph] check_command = "network-windows" [network-windows-nic.metrics_filters] in.value = "$service_name_template$.perfdata.$nic$_in.value" out.value = "$service_name_template$.perfdata.$nic$_out.value" [network-windows-nic.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" title = "$nic$" yUnitSystem = "binary" [network-windows-nic.functions] in.value = "alias(color($metric$, '#1a7dd7'), 'In (bytes/s)')" out.value = "alias(color($metric$, '#ff5566'), 'Out (bytes/s)')" icingaweb2-module-graphite-1.3.0/templates/ntp.ini000066400000000000000000000025721516321226600221230ustar00rootroot00000000000000[ntp-offset.graph] check_command = "ntp_time, ntp_peer" [ntp-offset.metrics_filters] value = "$service_name_template$.perfdata.offset.value" [ntp-offset.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" yUnitSystem = "none" [ntp-offset.functions] value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Offset (ms)')" [ntp_peer-jitter.graph] check_command = "ntp_peer" [ntp_peer-jitter.metrics_filters] value = "$service_name_template$.perfdata.jitter.value" [ntp_peer-jitter.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [ntp_peer-jitter.functions] value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Jitter (ms)')" [ntp_peer-stratum.graph] check_command = "ntp_peer" [ntp_peer-stratum.metrics_filters] value = "$service_name_template$.perfdata.stratum.value" [ntp_peer-stratum.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [ntp_peer-stratum.functions] value = "alias(color($metric$, '#1a7dd7'), 'Stratum')" [ntp_peer-truechimers.graph] check_command = "ntp_peer" [ntp_peer-truechimers.metrics_filters] value = "$service_name_template$.perfdata.truechimers.value" [ntp_peer-truechimers.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [ntp_peer-truechimers.functions] value = "alias(color($metric$, '#1a7dd7'), 'Truechimers')" icingaweb2-module-graphite-1.3.0/templates/nwc-interface-usage.ini000066400000000000000000000047021516321226600251460ustar00rootroot00000000000000[interface-traffic.graph] check_command = "interface-usage" [interface-traffic.metrics_filters] bpsin = "$service_name_template$.perfdata.$interface$_traffic_in.value" bpsmaxin = "$service_name_template$.perfdata.$interface$_traffic_in.max" bpscritin = "$service_name_template$.perfdata.$interface$_traffic_in.crit" bpswarnin = "$service_name_template$.perfdata.$interface$_traffic_in.warn" bpsout = "$service_name_template$.perfdata.$interface$_traffic_out.value" bpsmaxout = "$service_name_template$.perfdata.$interface$_traffic_out.max" bpscritout = "$service_name_template$.perfdata.$interface$_traffic_out.crit" bpswarnout = "$service_name_template$.perfdata.$interface$_traffic_out.warn" [interface-traffic.urlparams] min = "0" title = "$interface$ traffic" lineWidth = "2" yUnitSystem = "si" [interface-traffic.functions] bpsin = "alias(color($metric$, '#1a7dd7'), 'Traffic in (B/s)')" bpsmaxin = "alias(color($metric$, '#7d7f81'), 'Traffic in max (B/s)')" bpswarnin = "alias(color($metric$, '#ff8d00'), 'Traffic in warn (B/s)')" bpscritin = "alias(color($metric$, '#ff0000'), 'Traffic in crit (B/s)')" bpsout = "alias(color($metric$, '#0b3c68'), 'Traffic out (B/s)')" bpsmaxout = "alias(color($metric$, '#45008d'), 'Traffic out max (B/s)')" bpswarnout = "alias(color($metric$, '#ff8d00'), 'Traffic out warn (B/s)')" bpscritout = "alias(color($metric$, '#ff0000'), 'Traffic out crit (B/s)')" [interface-usage.graph] check_command = "interface-usage" [interface-usage.metrics_filters] usagein = "$service_name_template$.perfdata.$interface$_usage_in.value" usagecritin = "$service_name_template$.perfdata.$interface$_usage_in.crit" usagewarnin = "$service_name_template$.perfdata.$interface$_usage_in.warn" usageout = "$service_name_template$.perfdata.$interface$_usage_out.value" usagecritout = "$service_name_template$.perfdata.$interface$_usage_out.crit" usagewarnout = "$service_name_template$.perfdata.$interface$_usage_out.warn" [interface-usage.urlparams] min = "0" title = "$interface$ usage" lineWidth = "2" yUnitSystem = "none" [interface-usage.functions] usagein = "alias(color($metric$, '#1a7dd7'), 'Usage in (%)')" usagewarnin = "alias(color($metric$, '#ff8d00'), 'Usage in warn (%)')" usagecritin = "alias(color($metric$, '#ff0000'), 'Usage in crit (%)')" usageout = "alias(color($metric$, '#0b3c68'), 'Usage out (%)')" usagewarnout = "alias(color($metric$, '#ff8d00'), 'Usage out warn (%)')" usagecritout = "alias(color($metric$, '#ff0000'), 'Usage out crit (%)')" icingaweb2-module-graphite-1.3.0/templates/nwc-load.ini000066400000000000000000000010501516321226600230140ustar00rootroot00000000000000[load.graph] check_command = "nwc-load" [load.metrics_filters] value = "$service_name_template$.nwc_health.perfdata.$load$.value" crit = "$service_name_template$.nwc_health.perfdata.$load$.crit" warn = "$service_name_template$.nwc_health.perfdata.$load$.warn" [load.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" title = "$load$ %" yUnitSystem = "none" [load.functions] value = "alias(color($metric$, '#1a7dd7'), 'CPU usage (%)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" icingaweb2-module-graphite-1.3.0/templates/ping.ini000066400000000000000000000012631516321226600222530ustar00rootroot00000000000000[ping-rta.graph] check_command = "ping, ping4, ping6, ping-windows" [ping-rta.metrics_filters] rta.value = "$service_name_template$.perfdata.rta.value" [ping-rta.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "msec" [ping-rta.functions] rta.value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Round trip time (ms)')" [ping-pl.graph] check_command = "ping, ping4, ping6" [ping-pl.metrics_filters] pl.value = "$service_name_template$.perfdata.pl.value" [ping-pl.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [ping-pl.functions] pl.value = "alias(color($metric$, '#1a7dd7'), 'Packet loss (%)')" icingaweb2-module-graphite-1.3.0/templates/procs.ini000066400000000000000000000004721516321226600224450ustar00rootroot00000000000000[procs.graph] check_command = "procs, procs-windows" [procs.metrics_filters] value = "$service_name_template$.perfdata.procs.value" [procs.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [procs.functions] value = "alias(color($metric$, '#1a7dd7'), 'Process count')" icingaweb2-module-graphite-1.3.0/templates/response-size-hosts.ini000066400000000000000000000005261516321226600252630ustar00rootroot00000000000000[response-size.graph] check_command = "http-host" [response-size.metrics_filters] value = "$host_name_template$.perfdata.size.value" [response-size.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [response-size.functions] value = "alias(color($metric$, '#1a7dd7'), 'Response size (bytes)')" icingaweb2-module-graphite-1.3.0/templates/response-size.ini000066400000000000000000000005231516321226600241220ustar00rootroot00000000000000[response-size.graph] check_command = "http" [response-size.metrics_filters] value = "$service_name_template$.perfdata.size.value" [response-size.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [response-size.functions] value = "alias(color($metric$, '#1a7dd7'), 'Response size (bytes)')" icingaweb2-module-graphite-1.3.0/templates/response-time-hosts.ini000066400000000000000000000007071516321226600252500ustar00rootroot00000000000000[response-time.graph] check_command = "dig-host, dns-host, ftp-host, http-host, imap-host, ldap-host, pgsql-host, smtp-host, ssh-host, tcp-host, udp-host" [response-time.metrics_filters] value = "$host_name_template$.perfdata.time.value" [response-time.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [response-time.functions] value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Response time (ms)')" icingaweb2-module-graphite-1.3.0/templates/response-time.ini000066400000000000000000000006221516321226600241060ustar00rootroot00000000000000[response-time.graph] check_command = "dig, dns, ftp, http, imap, ldap, pgsql, smtp, ssh, tcp, udp" [response-time.metrics_filters] value = "$service_name_template$.perfdata.time.value" [response-time.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [response-time.functions] value = "alias(color(scale($metric$, 1000), '#1a7dd7'), 'Response time (ms)')" icingaweb2-module-graphite-1.3.0/templates/snmp-int.ini000066400000000000000000000031471516321226600230660ustar00rootroot00000000000000[interfacetable-traffic.graph] check_command = "snmp-interface" [interfacetable-traffic.metrics_filters] bpsin = "$service_name_template$.perfdata.$interface$_in_bps.value" bpsout = "$service_name_template$.perfdata.$interface$_out_bps.value" [interfacetable-traffic.urlparams] min = "0" title = "Interface $interface$ Traffic" lineWidth = "2" yUnitSystem = "si" [interfacetable-traffic.functions] bpsin = "alias(color($metric$, '#1a7dd7'), 'Traffic in (B/s)')" bpsout = "alias(color($metric$, '#0b3c68'), 'Traffic out (B/s)')" [interfacetable-discard.graph] check_command = "snmp-interface" [interfacetable-discard.metrics_filters] ppsindiscard = "$service_name_template$.perfdata.$interface$_in_discard.value" ppsoutdiscard = "$service_name_template$.perfdata.$interface$_out_discard.value" [interfacetable-discard.urlparams] min = "0" title = "Interface $interface$ Discards" lineWidth = "2" yUnitSystem = "si" [interfacetable-discard.functions] ppsindiscard = "alias(color($metric$, '#edb017'), 'Discard in (B/s)')" ppsoutdiscard = "alias(color($metric$, '#ad7d05'), 'Discard out (B/s)')" [interfacetable-error.graph] check_command = "snmp-interface" [interfacetable-error.metrics_filters] ppsinerr = "$service_name_template$.perfdata.$interface$_in_error.value" ppsouterr = "$service_name_template$.perfdata.$interface$_out_error.value" [interfacetable-error.urlparams] min = "0" title = "Interface $interface$ Errors" lineWidth = "2" yUnitSystem = "si" [interfacetable-error.functions] ppsinerr = "alias(color($metric$, '#ff5566'), 'Error in (B/s)')" ppsouterr = "alias(color($metric$, '#a80000'), 'Error out (B/s)')" icingaweb2-module-graphite-1.3.0/templates/snmp-load-netsl.ini000066400000000000000000000010711516321226600243300ustar00rootroot00000000000000[load-snmp.graph] check_command = "snmp-load" [load-snmp.metrics_filters] load15.value = "$service_name_template$.perfdata.load_15_min.value" load5.value = "$service_name_template$.perfdata.load_5_min.value" load1.value = "$service_name_template$.perfdata.load_1_min.value" [load-snmp.urlparams] areaAlpha = "0.5" min = "0" yUnitSystem = "none" lineWidth = "2" [load-snmp.functions] load15.value = "alias(color($metric$, '#ff5566'), 'Load 15')" load5.value = "alias(color($metric$, '#ffaa44'), 'Load 5')" load1.value = "alias(color($metric$, '#44bb77'), 'Load 1')" icingaweb2-module-graphite-1.3.0/templates/snmp-load-stand.ini000066400000000000000000000011201516321226600243070ustar00rootroot00000000000000[load-windows.graph] check_command = "load-windows" [load-windows.metrics_filters] load.value = "$service_name_template$.perfdata.cpu_prct_used.value" crit.value = "$service_name_template$.perfdata.cpu_prct_used.crit" warn.value = "$service_name_template$.perfdata.cpu_prct_used.warn" [load-windows.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" yUnitSystem = "none" [load-windows.functions] load.value = "alias(color($metric$, '#1a7dd7'), 'CPU usage(%)')" crit.value = "alias(color($metric$, '#ff0000'), 'Crit (%)')" warn.value = "alias(color($metric$, '#ff8d00'), 'Warn (%)')" icingaweb2-module-graphite-1.3.0/templates/snmp-memory.ini000066400000000000000000000012131516321226600235740ustar00rootroot00000000000000[memory.graph] check_command = "snmp-memory" [memory.metrics_filters] value = "$service_name_template$.perfdata.$mem$.value" max = "$service_name_template$.perfdata.$mem$.max" crit = "$service_name_template$.perfdata.$mem$.crit" warn = "$service_name_template$.perfdata.$mem$.warn" [memory.urlparams] areaAlpha = "0.5" lineWidth = "2" min = "0" title = "Memory $mem$" yUnitSystem = "binary" [memory.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" icingaweb2-module-graphite-1.3.0/templates/snmp-storage.ini000066400000000000000000000012271516321226600237350ustar00rootroot00000000000000[disk.graph] check_command = "snmp-storage" [disk.metrics_filters] value = "$service_name_template$.perfdata.$disk$.value" max = "$service_name_template$.perfdata.$disk$.max" crit = "$service_name_template$.perfdata.$disk$.crit" warn = "$service_name_template$.perfdata.$disk$.warn" [disk.urlparams] areaAlpha = "0.5" areaMode = "first" lineWidth = "2" min = "0" title = "Disk $disk$" yUnitSystem = "binary" [disk.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" crit = "alias(color($metric$, '#ff0000'), 'Crit (bytes)')" warn = "alias(color($metric$, '#ff8d00'), 'Warn (bytes)')" icingaweb2-module-graphite-1.3.0/templates/swap.ini000066400000000000000000000006401516321226600222660ustar00rootroot00000000000000[swap.graph] check_command = "swap, swap-windows" [swap.metrics_filters] value = "$service_name_template$.perfdata.swap.value" max = "$service_name_template$.perfdata.swap.max" [swap.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "binary" [swap.functions] value = "alias(color($metric$, '#1a7dd7'), 'Used (bytes)')" max = "alias(color($metric$, '#cfd7e6'), 'Size (bytes)')" icingaweb2-module-graphite-1.3.0/templates/update.ini000066400000000000000000000015341516321226600226010ustar00rootroot00000000000000[apt.graph] check_command = "apt" [apt.metrics_filters] critical_updates.value = "$service_name_template$.perfdata.critical_updates.value" available_upgrades.value = "$service_name_template$.perfdata.available_upgrades.value" [apt.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [apt.functions] critical_updates.value = "alias(color($metric$, '#ff5566'), 'Critical Updates')" available_upgrades.value = "alias(color($metric$, '#ffaa44'), 'Available Upgrades')" [update-windows.graph] check_command = "update-windows" [update-windows.metrics_filters] value = "$service_name_template$.perfdata.update.value" [update-windows.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [update-windows.functions] value = "alias(color($metric$, '#1a7dd7'), 'Available Updates')" icingaweb2-module-graphite-1.3.0/templates/uptime.ini000066400000000000000000000012311516321226600226140ustar00rootroot00000000000000[uptime.graph] check_command = "mysql_health, uptime-windows" [uptime.metrics_filters] value = "$service_name_template$.perfdata.uptime.value" [uptime.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [uptime.functions] value = "alias(color($metric$, '#1a7dd7'), 'Uptime (s)')" [uptime-snmp.graph] check_command = "snmp-uptime" [uptime-snmp.metrics_filters] value = "$service_name_template$.perfdata.uptime.value" [uptime-snmp.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "sec" [uptime-snmp.functions] value = "alias(color(scale($metric$, 86400), '#1a7dd7'), 'Uptime (s)')" icingaweb2-module-graphite-1.3.0/templates/users.ini000066400000000000000000000004741516321226600224620ustar00rootroot00000000000000[users.graph] check_command = "users, users-windows" [users.metrics_filters] users = "$service_name_template$.perfdata.users.value" [users.urlparams] areaAlpha = "0.5" areaMode = "all" lineWidth = "2" min = "0" yUnitSystem = "none" [users.functions] users = "alias(color($metric$, '#1a7dd7'), 'Logged in Users')"